diff --git a/DEPS b/DEPS
index ed2aca53..7f2fc89d 100644
--- a/DEPS
+++ b/DEPS
@@ -105,11 +105,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '607be37e3d4ddbe2163c200d6e13bcee981f6bf7',
+  'skia_revision': '01d9a344b575b95d982edcad52787e2bd62e6beb',
   # 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': '12c704263429f9823b68ae06ed0484bacc663942',
+  'v8_revision': '973f34ce78a25a64567f0e12348d4114429c7342',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -117,7 +117,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'a6d34af67286abac36ab142c5a5b55b59a231158',
+  'angle_revision': '6ba9754f4a5668936976ca7d8f5ec69de30f9aee',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -129,7 +129,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '2958a8faf500b9c01ca968ee46fe89795eafe2a7',
+  'pdfium_revision': 'f3a3393a2f96bb8c4cc275ee67921e2b7bddf540',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -153,7 +153,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling NaCl
   # and whatever else without interference from each other.
-  'nacl_revision': '64cb8d9d67fbe924ff2c48d1fd9c73437d735344',
+  'nacl_revision': '821833667ccccf83b96b4fdaf2074c6e71f87544',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling freetype
   # and whatever else without interference from each other.
@@ -165,7 +165,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'd30f10814bd09c01a756225499b652ca335d6785',
+  'catapult_revision': '3cb00fbd56816b13ff51170a811a5a2938b32750',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -552,7 +552,7 @@
 
   # Build tools for Chrome OS. Note: This depends on third_party/pyelftools.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '3387250e88bcab66560b91684c78c10b137d3f98',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '06a50f7eab7c303fc962adbadc4e99a9208b83ae',
       'condition': 'checkout_linux',
   },
 
@@ -577,7 +577,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '82bb756217cd542205ee89d87bc0f17e2bce52b0',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '2ebf9fdade33fa727490ed8593c3175bf60ab915',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -925,7 +925,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '64f2b4dce29f43d396f7be0f53245ba2a14d8881',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '1ec93d0df7d1fc69c1901a7a417e50501df28105',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1047,7 +1047,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '21dbf06b5aa6c7dc8cf56314d4a3f96f57956c53',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '8bf477cb2a8dd0bc70095dffad6ed7bcf37b2a4e',
+    Var('webrtc_git') + '/src.git' + '@' + 'eb73a7bd16c725477ca2da6dc0e6fea236616d44',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1081,7 +1081,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ca942e227a7a3d74782c2384ed55969dd368aa1e',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@3cd5de0de3a14991f1133ff77e280b7faa688ea3',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 15b2b01..78bb258f4 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -451,7 +451,7 @@
       (
         'Use the new API in base/threading/thread_restrictions.h.',
       ),
-      True,
+      False,
       (),
     ),
     (
@@ -638,9 +638,48 @@
 
 
 _ANDROID_SPECIFIC_PYDEPS_FILES = [
+    'base/android/jni_generator/jni_generator.pydeps',
+    'base/android/jni_generator/jni_registration_generator.pydeps',
+    'build/android/gyp/aar.pydeps',
+    'build/android/gyp/aidl.pydeps',
+    'build/android/gyp/apkbuilder.pydeps',
+    'build/android/gyp/app_bundle_to_apks.pydeps',
+    'build/android/gyp/bytecode_processor.pydeps',
+    'build/android/gyp/compile_resources.pydeps',
+    'build/android/gyp/create_bundle_wrapper_script.pydeps',
+    'build/android/gyp/copy_ex.pydeps',
+    'build/android/gyp/create_app_bundle.pydeps',
+    'build/android/gyp/create_apk_operations_script.pydeps',
+    'build/android/gyp/create_dist_jar.pydeps',
+    'build/android/gyp/create_java_binary_script.pydeps',
+    'build/android/gyp/create_stack_script.pydeps',
+    'build/android/gyp/create_test_runner_script.pydeps',
+    'build/android/gyp/create_tool_wrapper.pydeps',
+    'build/android/gyp/desugar.pydeps',
+    'build/android/gyp/dex.pydeps',
+    'build/android/gyp/dist_aar.pydeps',
+    'build/android/gyp/emma_instr.pydeps',
+    'build/android/gyp/filter_zip.pydeps',
+    'build/android/gyp/gcc_preprocess.pydeps',
+    'build/android/gyp/generate_proguarded_module_jar.pydeps',
+    'build/android/gyp/ijar.pydeps',
+    'build/android/gyp/java_cpp_enum.pydeps',
+    'build/android/gyp/javac.pydeps',
+    'build/android/gyp/jinja_template.pydeps',
+    'build/android/gyp/lint.pydeps',
+    'build/android/gyp/main_dex_list.pydeps',
+    'build/android/gyp/merge_jar_info_files.pydeps',
+    'build/android/gyp/merge_manifest.pydeps',
+    'build/android/gyp/prepare_resources.pydeps',
+    'build/android/gyp/proguard.pydeps',
+    'build/android/gyp/write_build_config.pydeps',
+    'build/android/gyp/write_ordered_libraries.pydeps',
+    'build/android/incremental_install/generate_android_manifest.pydeps',
+    'build/android/incremental_install/write_installer_json.pydeps',
     'build/android/resource_sizes.pydeps',
     'build/android/test_runner.pydeps',
     'build/android/test_wrapper/logdog_wrapper.pydeps',
+    'build/protoc_java.pydeps',
     'build/secondary/third_party/android_platform/'
         'development/scripts/stack.pydeps',
     'net/tools/testserver/testserver.pydeps',
diff --git a/WATCHLISTS b/WATCHLISTS
index 15ffa6c..30dfcaf 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1996,7 +1996,6 @@
                                  'martijn+crwatch@martijnc.be',
                                  'rsleevi+watch@chromium.org'],
     'chrome_cleaner': ['csharp+watch@chromium.org',
-                       'ftirelo+watch@chromium.org',
                        'joenotcharles+watch@chromium.org'],
     'chrome_elf': ['caitkp+watch@chromium.org'],
     'chrome_grc': ['chrome-grc-reviews@chromium.org'],
@@ -2216,7 +2215,7 @@
     'netinfo': ['jkarlin+watch@chromium.org'],
     'network_service': ['network-service-reviews@chromium.org'],
     'nfc': ['mattreynolds+watch@chromium.org'],
-    'notifications': ['awdf+watch@chromium.org', 'peter@chromium.org'],
+    'notifications': ['peter@chromium.org'],
     'nqe': ['tbansal+watch-nqe@chromium.org'],
     'ntp_snippets': ['ntp-dev+reviews@chromium.org',
                      'noyau+watch@chromium.org'],
@@ -2276,8 +2275,7 @@
                   'tburkard+watch@chromium.org'],
     'presentation': ['mfoltz+watch@chromium.org'],
     'print_preview': ['rbpotter@chromium.org'],
-    'push_messaging': ['awdf+watch@chromium.org',
-                       'peter@chromium.org'],
+    'push_messaging': ['peter@chromium.org'],
     'reading_list': ['stkhapugin@chromium.org'],
     'remoting': ['chromoting-reviews@chromium.org'],
     'rlz_id': ['gab+watch@chromium.org',
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc
index 15d5284..929bc18 100644
--- a/android_webview/browser/aw_autofill_client.cc
+++ b/android_webview/browser/aw_autofill_client.cc
@@ -247,7 +247,7 @@
   }
 }
 
-void AwAutofillClient::ShowAutofillSettings() {
+void AwAutofillClient::ShowAutofillSettings(bool show_credit_card_settings) {
   NOTIMPLEMENTED();
 }
 
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h
index c3f79fb..1416cdc 100644
--- a/android_webview/browser/aw_autofill_client.h
+++ b/android_webview/browser/aw_autofill_client.h
@@ -68,7 +68,7 @@
   ukm::SourceId GetUkmSourceId() override;
   autofill::AddressNormalizer* GetAddressNormalizer() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  void ShowAutofillSettings() override;
+  void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(
       const autofill::CreditCard& card,
       UnmaskCardReason reason,
diff --git a/android_webview/browser/aw_browser_context.cc b/android_webview/browser/aw_browser_context.cc
index 05a6199..04298f7c 100644
--- a/android_webview/browser/aw_browser_context.cc
+++ b/android_webview/browser/aw_browser_context.cc
@@ -22,7 +22,7 @@
 #include "base/bind.h"
 #include "base/path_service.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/metrics/metrics_service.h"
 #include "components/policy/core/browser/browser_policy_connector_base.h"
diff --git a/android_webview/browser/aw_browser_terminator.cc b/android_webview/browser/aw_browser_terminator.cc
index cd66f31..d8373e83 100644
--- a/android_webview/browser/aw_browser_terminator.cc
+++ b/android_webview/browser/aw_browser_terminator.cc
@@ -14,7 +14,7 @@
 #include "base/logging.h"
 #include "base/stl_util.h"
 #include "base/sync_socket.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_data.h"
 #include "content/public/browser/child_process_launcher_utils.h"
diff --git a/android_webview/browser/aw_contents_io_thread_client.h b/android_webview/browser/aw_contents_io_thread_client.h
index 21e87f2c..b994655 100644
--- a/android_webview/browser/aw_contents_io_thread_client.h
+++ b/android_webview/browser/aw_contents_io_thread_client.h
@@ -14,7 +14,7 @@
 #include "base/callback_forward.h"
 #include "base/compiler_specific.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace content {
 class WebContents;
diff --git a/android_webview/browser/aw_form_database_service.cc b/android_webview/browser/aw_form_database_service.cc
index 170e829..bf5fb76c 100644
--- a/android_webview/browser/aw_form_database_service.cc
+++ b/android_webview/browser/aw_form_database_service.cc
@@ -7,7 +7,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
diff --git a/android_webview/browser/aw_metrics_service_client.cc b/android_webview/browser/aw_metrics_service_client.cc
index 8c9f651..8156599 100644
--- a/android_webview/browser/aw_metrics_service_client.cc
+++ b/android_webview/browser/aw_metrics_service_client.cc
@@ -23,7 +23,7 @@
 #include "base/lazy_instance.h"
 #include "base/path_service.h"
 #include "base/strings/string16.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/metrics/call_stack_profile_metrics_provider.h"
 #include "components/metrics/enabled_state_provider.h"
 #include "components/metrics/gpu/gpu_metrics_provider.h"
diff --git a/android_webview/browser/net/android_stream_reader_url_request_job.cc b/android_webview/browser/net/android_stream_reader_url_request_job.cc
index 319fa28..cfd4fdd 100644
--- a/android_webview/browser/net/android_stream_reader_url_request_job.cc
+++ b/android_webview/browser/net/android_stream_reader_url_request_job.cc
@@ -17,7 +17,7 @@
 #include "base/lazy_instance.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/io_buffer.h"
diff --git a/android_webview/browser/net/aw_url_request_context_getter.cc b/android_webview/browser/net/aw_url_request_context_getter.cc
index 4a1de56..0b25146 100644
--- a/android_webview/browser/net/aw_url_request_context_getter.cc
+++ b/android_webview/browser/net/aw_url_request_context_getter.cc
@@ -25,7 +25,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "components/prefs/pref_registry_simple.h"
diff --git a/android_webview/browser/tracing/aw_tracing_controller.cc b/android_webview/browser/tracing/aw_tracing_controller.cc
index aed9db1..87d10e3 100644
--- a/android_webview/browser/tracing/aw_tracing_controller.cc
+++ b/android_webview/browser/tracing/aw_tracing_controller.cc
@@ -9,7 +9,7 @@
 #include "base/android/jni_string.h"
 #include "base/bind.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/tracing_controller.h"
diff --git a/apps/launcher.cc b/apps/launcher.cc
index 06b0317..79c1ee1 100644
--- a/apps/launcher.cc
+++ b/apps/launcher.cc
@@ -15,8 +15,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 8795e4027..6c91b45 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -86,8 +86,10 @@
     "assistant/ui/dialog_plate/action_view.h",
     "assistant/ui/dialog_plate/dialog_plate.h",
     "assistant/ui/logo_view/base_logo_view.h",
+    "assistant/ui/main_stage/assistant_footer_view.h",
     "assistant/ui/main_stage/assistant_header_view.h",
     "assistant/ui/main_stage/assistant_main_stage.h",
+    "assistant/ui/main_stage/assistant_opt_in_view.h",
     "assistant/ui/main_stage/assistant_progress_indicator.h",
     "assistant/ui/main_stage/assistant_query_view.h",
     "assistant/ui/main_stage/assistant_text_element_view.h",
@@ -200,6 +202,7 @@
     "login/ui/animated_rounded_image_view.h",
     "login/ui/animation_frame.h",
     "login/ui/arrow_button_view.h",
+    "login/ui/horizontal_image_sequence_animation_decoder.h",
     "login/ui/hover_notifier.h",
     "login/ui/image_parser.h",
     "login/ui/lock_contents_view.h",
@@ -233,6 +236,7 @@
     "magnifier/partial_magnification_controller.h",
     "media_controller.h",
     "message_center/arc_notification_manager_delegate_impl.h",
+    "message_center/ash_message_center_lock_screen_controller.h",
     "message_center/message_center_bubble.h",
     "message_center/message_center_button_bar.h",
     "message_center/message_center_controller.h",
@@ -548,7 +552,6 @@
     "touch/ash_touch_transform_controller.h",
     "touch/touch_devices_controller.h",
     "touch/touch_hud_debug.h",
-    "touch/touch_hud_projection.h",
     "touch/touch_observer_hud.h",
     "touch/touch_transform_setter_mus.h",
     "touch/touch_uma.h",
@@ -748,8 +751,10 @@
     "assistant/ui/dialog_plate/action_view.cc",
     "assistant/ui/dialog_plate/dialog_plate.cc",
     "assistant/ui/logo_view/base_logo_view.cc",
+    "assistant/ui/main_stage/assistant_footer_view.cc",
     "assistant/ui/main_stage/assistant_header_view.cc",
     "assistant/ui/main_stage/assistant_main_stage.cc",
+    "assistant/ui/main_stage/assistant_opt_in_view.cc",
     "assistant/ui/main_stage/assistant_progress_indicator.cc",
     "assistant/ui/main_stage/assistant_query_view.cc",
     "assistant/ui/main_stage/assistant_text_element_view.cc",
@@ -849,6 +854,7 @@
     "login/login_screen_controller_observer.cc",
     "login/ui/animated_rounded_image_view.cc",
     "login/ui/arrow_button_view.cc",
+    "login/ui/horizontal_image_sequence_animation_decoder.cc",
     "login/ui/hover_notifier.cc",
     "login/ui/image_parser.cc",
     "login/ui/lock_contents_view.cc",
@@ -881,6 +887,7 @@
     "magnifier/partial_magnification_controller.cc",
     "media_controller.cc",
     "message_center/arc_notification_manager_delegate_impl.cc",
+    "message_center/ash_message_center_lock_screen_controller.cc",
     "message_center/message_center_bubble.cc",
     "message_center/message_center_button_bar.cc",
     "message_center/message_center_controller.cc",
@@ -1163,7 +1170,6 @@
     "touch/ash_touch_transform_controller.cc",
     "touch/touch_devices_controller.cc",
     "touch/touch_hud_debug.cc",
-    "touch/touch_hud_projection.cc",
     "touch/touch_observer_hud.cc",
     "touch/touch_transform_setter_mus.cc",
     "touch/touch_uma.cc",
@@ -1334,8 +1340,8 @@
     "//ash/components/shortcut_viewer/public/mojom",
     "//ash/components/tap_visualizer/public/mojom",
     "//ash/keyboard/arc",
+    "//ash/login/resources:resources_grit",
     "//ash/system/message_center/arc",
-    "//ash/touch_hud",
     "//base",
     "//base:i18n",
     "//base/third_party/dynamic_annotations",
@@ -1734,6 +1740,7 @@
     "highlighter/highlighter_gesture_util_unittest.cc",
     "ime/ime_controller_unittest.cc",
     "ime/ime_focus_handler_unittest.cc",
+    "keyboard/arc/arc_input_method_surface_manager_unittest.cc",
     "keyboard/virtual_keyboard_controller_unittest.cc",
     "keyboard/virtual_keyboard_unittest.cc",
     "laser/laser_pointer_controller_unittest.cc",
@@ -1972,6 +1979,7 @@
     "//ash/components/quick_launch/public/mojom:constants",
     "//ash/components/shortcut_viewer:unit_tests",
     "//ash/components/tap_visualizer:unit_tests",
+    "//ash/keyboard/arc",
     "//ash/public/cpp",
     "//ash/public/cpp:unit_tests",
     "//ash/public/cpp/vector_icons",
@@ -1979,7 +1987,6 @@
     "//ash/strings",
     "//ash/system/message_center/arc",
     "//ash/system/message_center/arc:test_support",
-    "//ash/touch_hud",
     "//base",
     "//base/test:test_support",
     "//chromeos",
diff --git a/ash/accelerators/accelerator_confirmation_dialog.cc b/ash/accelerators/accelerator_confirmation_dialog.cc
index dfda806a..045828f 100644
--- a/ash/accelerators/accelerator_confirmation_dialog.cc
+++ b/ash/accelerators/accelerator_confirmation_dialog.cc
@@ -36,15 +36,21 @@
           views::TEXT, views::TEXT)));
   AddChildView(new views::Label(l10n_util::GetStringUTF16(dialog_text_id)));
 
-  // Parent the dialog widget to the LockSystemModalContainer to ensure that it
-  // gets displayed on lock/signin screen.
+  // Parent the dialog widget to the LockSystemModalContainer, or
+  // OverlayContainer to ensure that it will get displayed on respective
+  // lock/signin or OOBE screen.
+  SessionController* session_controller = Shell::Get()->session_controller();
+  int container_id = kShellWindowId_SystemModalContainer;
+  if (session_controller->GetSessionState() ==
+      session_manager::SessionState::OOBE) {
+    container_id = kShellWindowId_OverlayContainer;
+  } else if (session_controller->IsUserSessionBlocked()) {
+    container_id = kShellWindowId_LockSystemModalContainer;
+  }
+
   views::Widget* widget = CreateDialogWidget(
       this, nullptr,
-      Shell::GetContainer(
-          ash::Shell::GetPrimaryRootWindow(),
-          Shell::Get()->session_controller()->IsUserSessionBlocked()
-              ? kShellWindowId_LockSystemModalContainer
-              : kShellWindowId_SystemModalContainer));
+      Shell::GetContainer(ash::Shell::GetPrimaryRootWindow(), container_id));
   widget->Show();
 }
 
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index 3638c84..5f7e792 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -135,6 +135,26 @@
 // the parameterized tests.
 INSTANTIATE_TEST_CASE_P(, AppListPresenterDelegateTest, testing::Bool());
 
+// Test a variety of behaviors in tablet mode when home launcher is not enabled.
+class AppListPresenterDelegateNonHomeLauncherTest
+    : public AppListPresenterDelegateTest {
+ public:
+  AppListPresenterDelegateNonHomeLauncherTest() = default;
+  ~AppListPresenterDelegateNonHomeLauncherTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        {}, {app_list::features::kEnableHomeLauncher});
+    AppListPresenterDelegateTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateNonHomeLauncherTest);
+};
+
 // Tests that app list hides when focus moves to a normal window.
 TEST_F(AppListPresenterDelegateTest, HideOnFocusOut) {
   GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId());
@@ -288,7 +308,7 @@
 
 // Tests that the app list state responds correctly to tablet mode being
 // enabled while the app list is being shown.
-TEST_F(AppListPresenterDelegateTest,
+TEST_F(AppListPresenterDelegateNonHomeLauncherTest,
        PeekingToFullscreenWhenTabletModeIsActive) {
   // TODO(newcomer): Investigate mash failures crbug.com/726838
   GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId());
@@ -411,7 +431,7 @@
 }
 
 // Tests that the app list view handles drag properly in tablet mode.
-TEST_F(AppListPresenterDelegateTest,
+TEST_F(AppListPresenterDelegateNonHomeLauncherTest,
        AppListViewDragHandlerTabletModeFromAllApps) {
   // TODO(newcomer): Investigate mash failures crbug.com/726838
   EnableTabletMode(true);
@@ -430,7 +450,7 @@
 
 // Tests that the state of the app list changes properly with drag input from
 // fullscreen search.
-TEST_F(AppListPresenterDelegateTest,
+TEST_F(AppListPresenterDelegateNonHomeLauncherTest,
        AppListViewDragHandlerTabletModeFromSearch) {
   // TODO(newcomer): Investigate mash failures crbug.com/726838
   EnableTabletMode(true);
@@ -1129,7 +1149,7 @@
   // 70%.
   GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId());
   ui::Layer* background_layer =
-      GetAppListView()->app_list_background_shield_for_test()->layer();
+      GetAppListView()->GetAppListBackgroundShieldForTest()->layer();
   EXPECT_EQ(0.7f, background_layer->opacity());
 
   // Turn on tablet mode. The background sheild opacity should be 10%.
@@ -1142,7 +1162,7 @@
   // Show app list in non-tablet mode. The background blur should be enabled.
   GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId());
   ui::Layer* background_layer =
-      GetAppListView()->app_list_background_shield_for_test()->layer();
+      GetAppListView()->GetAppListBackgroundShieldForTest()->layer();
   EXPECT_GT(background_layer->background_blur(), 0.0f);
 
   // Turn on tablet mode. The background blur should be disabled.
diff --git a/ash/app_list/views/app_list_view.cc b/ash/app_list/views/app_list_view.cc
index b5219d36..2313117 100644
--- a/ash/app_list/views/app_list_view.cc
+++ b/ash/app_list/views/app_list_view.cc
@@ -254,6 +254,42 @@
   DISALLOW_COPY_AND_ASSIGN(TransitionAnimationObserver);
 };
 
+// The view for the app list background shield which changes color and radius.
+class AppListBackgroundShieldView : public views::View {
+ public:
+  AppListBackgroundShieldView()
+      : color_(AppListView::kDefaultBackgroundColor), corner_radius_(0) {
+    SetPaintToLayer();
+    layer()->SetFillsBoundsOpaquely(false);
+  }
+
+  ~AppListBackgroundShieldView() override = default;
+
+  void UpdateColor(SkColor color) {
+    color_ = color;
+    SchedulePaint();
+  }
+
+  void UpdateCornerRadius(int corner_radius) {
+    corner_radius_ = corner_radius;
+    SchedulePaint();
+  }
+
+  // Overridden from views::View:
+  void OnPaint(gfx::Canvas* canvas) override {
+    cc::PaintFlags flags;
+    flags.setStyle(cc::PaintFlags::kFill_Style);
+    flags.setColor(color_);
+    canvas->DrawRoundRect(GetContentsBounds(), corner_radius_, flags);
+  }
+
+ private:
+  SkColor color_;
+  int corner_radius_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppListBackgroundShieldView);
+};
+
 ////////////////////////////////////////////////////////////////////////////////
 // AppListView::TestApi
 
@@ -435,11 +471,14 @@
   DISALLOW_COPY_AND_ASSIGN(FullscreenWidgetObserver);
 };
 
+views::View* AppListView::GetAppListBackgroundShieldForTest() {
+  return app_list_background_shield_;
+}
+
 void AppListView::InitContents(int initial_apps_page) {
   // The shield view that colors/blurs the background of the app list and
   // makes it transparent.
-  app_list_background_shield_ = new views::View;
-  app_list_background_shield_->SetPaintToLayer(ui::LAYER_SOLID_COLOR);
+  app_list_background_shield_ = new AppListBackgroundShieldView();
   app_list_background_shield_->layer()->SetOpacity(
       is_background_blur_enabled_ ? kAppListOpacityWithBlur : kAppListOpacity);
   SetBackgroundShieldColor();
@@ -1082,7 +1121,7 @@
     aura::Window* root_window = window->GetRootWindow();
     aura::Window* parent_window = root_window->GetChildById(
         ash::kShellWindowId_AppListTabletModeContainer);
-    if (!parent_window->Contains(window))
+    if (parent_window && !parent_window->Contains(window))
       parent_window->AddChild(window);
 
     // Update background opacity.
@@ -1163,11 +1202,13 @@
     return;
   }
 
-  // Reset the focus to initially focused view. This should be done before
-  // updating visibility of views, because setting focused view invisible
-  // automatically moves focus to next focusable view, which potentially
-  // causes bugs.
-  GetInitiallyFocusedView()->RequestFocus();
+  if (fullscreen_widget_->IsActive()) {
+    // Reset the focus to initially focused view. This should be
+    // done before updating visibility of views, because setting
+    // focused view invisible automatically moves focus to next
+    // focusable view, which potentially causes bugs.
+    GetInitiallyFocusedView()->RequestFocus();
+  }
 
   // Updates the visibility of app list items according to the change of
   // |app_list_state_|.
@@ -1385,8 +1426,12 @@
     // Calculate the progress of this transition.
     const float shelf_height =
         GetScreenBottom() - GetDisplayNearestView().work_area().bottom();
-    DCHECK_LE(shelf_height, current_height);
-    return (current_height - shelf_height) / (peeking_height - shelf_height);
+
+    // When screen is rotated, the current height might be smaller than shelf
+    // height for just one moment, which results in negative progress. So force
+    // the progress to be non-negative.
+    return std::max(0.0f, (current_height - shelf_height) /
+                              (peeking_height - shelf_height));
   }
 
   // Currently transition progress is between peeking and fullscreen state.
@@ -1509,7 +1554,7 @@
   GetWallpaperProminentColors(base::BindOnce(
       [](base::WeakPtr<AppListView> self,
          const std::vector<SkColor>& prominent_colors) {
-        self->app_list_background_shield_->layer()->SetColor(
+        self->app_list_background_shield_->UpdateColor(
             GetBackgroundShieldColor(prominent_colors));
       },
       weak_ptr_factory_.GetWeakPtr()));
@@ -1559,20 +1604,7 @@
         kAppListPeekingBackgroundRadius, kAppListFullscreenBackgroundRadius);
   }
 
-  // Resetting mask layer is heavy operation, so avoid doing so if radius does
-  // not change.
-  static int previous_background_radius = -1;
-  if (previous_background_radius == background_radius)
-    return;
-
-  app_list_background_mask_ = views::Painter::CreatePaintedLayer(
-      views::Painter::CreateSolidRoundRectPainter(SK_ColorBLACK,
-                                                  background_radius));
-  app_list_background_mask_->layer()->SetFillsBoundsOpaquely(false);
-  app_list_background_mask_->layer()->SetBounds(GetContentsBounds());
-  app_list_background_shield_->layer()->SetMaskLayer(
-      app_list_background_mask_->layer());
-  previous_background_radius = background_radius;
+  app_list_background_shield_->UpdateCornerRadius(background_radius);
 }
 
 }  // namespace app_list
diff --git a/ash/app_list/views/app_list_view.h b/ash/app_list/views/app_list_view.h
index a59152f5..3c728af 100644
--- a/ash/app_list/views/app_list_view.h
+++ b/ash/app_list/views/app_list_view.h
@@ -35,6 +35,7 @@
 namespace app_list {
 class AppsContainerView;
 class ApplicationDragAndDropHost;
+class AppListBackgroundShieldView;
 class AppListMainView;
 class AppListModel;
 class AppsGridView;
@@ -241,9 +242,7 @@
   // Returns true if the home_launcher feature is enabled.
   bool is_home_launcher_enabled() const { return is_home_launcher_enabled_; }
 
-  views::View* app_list_background_shield_for_test() {
-    return app_list_background_shield_;
-  }
+  views::View* GetAppListBackgroundShieldForTest();
 
  private:
   // A widget observer that is responsible for keeping the AppListView state up
@@ -348,10 +347,7 @@
   SearchBoxView* search_box_view_ = nullptr;  // Owned by |search_box_widget_|.
   // Owned by the app list's widget. Null if the fullscreen app list is not
   // enabled.
-  views::View* app_list_background_shield_ = nullptr;
-
-  // The mask layer to create rounded corner of the app list background.
-  std::unique_ptr<ui::LayerOwner> app_list_background_mask_ = nullptr;
+  AppListBackgroundShieldView* app_list_background_shield_ = nullptr;
 
   // Whether tablet mode is active.
   bool is_tablet_mode_ = false;
diff --git a/ash/app_list/views/app_list_view_unittest.cc b/ash/app_list/views/app_list_view_unittest.cc
index cfb1009..2200902 100644
--- a/ash/app_list/views/app_list_view_unittest.cc
+++ b/ash/app_list/views/app_list_view_unittest.cc
@@ -29,13 +29,18 @@
 #include "ash/app_list/views/search_result_answer_card_view.h"
 #include "ash/app_list/views/search_result_list_view.h"
 #include "ash/app_list/views/search_result_page_view.h"
+#include "ash/app_list/views/search_result_suggestion_chip_view.h"
 #include "ash/app_list/views/search_result_tile_item_list_view.h"
 #include "ash/app_list/views/search_result_tile_item_view.h"
 #include "ash/app_list/views/search_result_view.h"
+#include "ash/app_list/views/suggestion_chip_container_view.h"
+#include "ash/app_list/views/suggestion_chip_view.h"
 #include "ash/app_list/views/suggestions_container_view.h"
 #include "ash/app_list/views/test/apps_grid_view_test_api.h"
 #include "ash/public/cpp/app_list/answer_card_contents_registry.h"
+#include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_constants.h"
+#include "ash/public/cpp/app_list/app_list_features.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
@@ -59,8 +64,6 @@
 namespace {
 
 constexpr int kInitialItems = 34;
-// Default peeking y value for the app list.
-constexpr int kPeekingYValue = 280;
 
 template <class T>
 size_t GetVisibleViews(const std::vector<T*>& tiles) {
@@ -92,13 +95,39 @@
   DISALLOW_COPY_AND_ASSIGN(TestStartPageSearchResult);
 };
 
-class AppListViewTest : public views::ViewsTestBase {
+struct TestParams {
+  bool is_rtl_enabled;
+  bool is_new_style_launcher_enabled;
+};
+
+const TestParams kAppListViewTestParams[] = {
+    {false /* is_rtl_enabled */, false /* is_new_style_launcher_enabled */},
+    {false, true},
+};
+
+class AppListViewTest : public views::ViewsTestBase,
+                        public testing::WithParamInterface<TestParams> {
  public:
   AppListViewTest() = default;
   ~AppListViewTest() override = default;
 
   void SetUp() override {
     AppListView::SetShortAnimationForTesting(true);
+    if (testing::UnitTest::GetInstance()->current_test_info()->value_param()) {
+      // Setup right to left environment if necessary.
+      is_rtl_ = GetParam().is_rtl_enabled;
+      if (is_rtl_)
+        base::i18n::SetICUDefaultLocale("he");
+
+      is_new_style_launcher_enabled_ = GetParam().is_new_style_launcher_enabled;
+    }
+    if (is_new_style_launcher_enabled_) {
+      scoped_feature_list_.InitAndEnableFeature(
+          features::kEnableNewStyleLauncher);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          features::kEnableNewStyleLauncher);
+    }
     views::ViewsTestBase::SetUp();
   }
 
@@ -178,27 +207,54 @@
   // Used by AppListFolderView::UpdatePreferredBounds.
   keyboard::KeyboardController keyboard_controller_;
 
+  bool is_rtl_ = false;
+  bool is_new_style_launcher_enabled_ = false;
+
+  base::test::ScopedFeatureList scoped_feature_list_;
+
   DISALLOW_COPY_AND_ASSIGN(AppListViewTest);
 };
 
+// Instantiate the parameters which is used to toggle RTL and new style launcher
+// flag in the parameterized tests.
+INSTANTIATE_TEST_CASE_P(,
+                        AppListViewTest,
+                        testing::ValuesIn(kAppListViewTestParams));
+
+const TestParams kAppListViewFocusTestParams[] = {
+    {false /* is_rtl_enabled */, false /* is_new_style_launcher_enabled */},
+    {false, true},
+    {true, false},
+    {true, true},
+};
+
 // TODO(weidongg/766807) Remove all old focus tests after the flag is enabled
 // by default.
 class AppListViewFocusTest : public views::ViewsTestBase,
-                             public testing::WithParamInterface<bool> {
+                             public testing::WithParamInterface<TestParams> {
  public:
   AppListViewFocusTest() = default;
   ~AppListViewFocusTest() override = default;
 
   // testing::Test
   void SetUp() override {
-    views::ViewsTestBase::SetUp();
-
-    // Setup right to left environment if necessary.
     if (testing::UnitTest::GetInstance()->current_test_info()->value_param()) {
-      is_rtl_ = GetParam();
+      // Setup right to left environment if necessary.
+      is_rtl_ = GetParam().is_rtl_enabled;
       if (is_rtl_)
         base::i18n::SetICUDefaultLocale("he");
+
+      is_new_style_launcher_enabled_ = GetParam().is_new_style_launcher_enabled;
     }
+    if (is_new_style_launcher_enabled_) {
+      scoped_feature_list_.InitWithFeatures({features::kEnableNewStyleLauncher},
+                                            {});
+    } else {
+      scoped_feature_list_.InitWithFeatures(
+          {}, {features::kEnableNewStyleLauncher});
+    }
+
+    views::ViewsTestBase::SetUp();
 
     // Creates AnswerCardContentsRegistry and registers a fake answer card
     // view for classic ash. Otherwise, the answer card view will not be
@@ -220,6 +276,16 @@
     params.parent = GetContext();
     view_->Initialize(params);
     test_api_.reset(new AppsGridViewTestApi(apps_grid_view()));
+    if (is_new_style_launcher_enabled_) {
+      suggestions_container_ = contents_view()
+                                   ->GetAppsContainerView()
+                                   ->suggestion_chip_container_view_for_test();
+      expand_arrow_view_ = contents_view()->expand_arrow_view();
+    } else {
+      suggestions_container_ =
+          apps_grid_view()->suggestions_container_for_test();
+      expand_arrow_view_ = apps_grid_view()->expand_arrow_view_for_test();
+    }
 
     // Add suggestion apps, a folder with apps and other app list items.
     const int kSuggestionAppNum = 3;
@@ -234,7 +300,7 @@
     AppListFolderItem* folder_item =
         model->CreateAndPopulateFolderWithApps(kItemNumInFolder);
     model->PopulateApps(kAppListItemNum);
-    apps_grid_view()->ResetForShowApps();
+    suggestions_container()->Update();
     EXPECT_EQ(static_cast<size_t>(kAppListItemNum + 1),
               model->top_level_item_list()->item_count());
     EXPECT_EQ(folder_item->id(),
@@ -459,8 +525,26 @@
         ->app_list_folder_view();
   }
 
-  SuggestionsContainerView* suggestions_container_view() {
-    return apps_grid_view()->suggestions_container_for_test();
+  SearchResultContainerView* suggestions_container() {
+    return suggestions_container_;
+  }
+
+  std::vector<views::View*> GetAllSuggestions() {
+    std::vector<views::View*> suggestions;
+    if (is_new_style_launcher_enabled_) {
+      for (int i = 0; i < suggestions_container()->child_count(); ++i) {
+        suggestions.emplace_back(static_cast<SearchResultSuggestionChipView*>(
+                                     suggestions_container()->child_at(i))
+                                     ->suggestion_chip_view());
+      }
+      return suggestions;
+    }
+
+    for (auto* v :
+         apps_grid_view()->suggestions_container_for_test()->tile_views()) {
+      suggestions.emplace_back(v);
+    }
+    return suggestions;
   }
 
   SearchBoxView* search_box_view() { return main_view()->search_box_view(); }
@@ -473,13 +557,19 @@
     return view_->GetWidget()->GetFocusManager()->GetFocusedView();
   }
 
+  ExpandArrowView* expand_arrow_view() { return expand_arrow_view_; }
+
  protected:
   bool is_rtl_ = false;
+  bool is_new_style_launcher_enabled_ = false;
 
  private:
   AppListView* view_ = nullptr;  // Owned by native widget.
-  std::unique_ptr<AppListTestViewDelegate> delegate_;
+  SearchResultContainerView* suggestions_container_ =
+      nullptr;                                    // Owned by view hierarchy.
+  ExpandArrowView* expand_arrow_view_ = nullptr;  // Owned by view hierarchy.
   base::test::ScopedFeatureList scoped_feature_list_;
+  std::unique_ptr<AppListTestViewDelegate> delegate_;
   std::unique_ptr<AppsGridViewTestApi> test_api_;
   // Restores the locale to default when destructor is called.
   base::test::ScopedRestoreICUDefaultLocale restore_locale_;
@@ -494,9 +584,29 @@
   DISALLOW_COPY_AND_ASSIGN(AppListViewFocusTest);
 };
 
-// Instantiate the Boolean which is used to toggle RTL in the parameterized
-// tests.
-INSTANTIATE_TEST_CASE_P(, AppListViewFocusTest, testing::Bool());
+// Instantiate the parameters which is used to toggle RTL and new style launcher
+// flag in the parameterized tests.
+INSTANTIATE_TEST_CASE_P(,
+                        AppListViewFocusTest,
+                        testing::ValuesIn(kAppListViewFocusTestParams));
+
+// Test behaviors in tablet mode when homcher launcher feature is not enabled.
+class AppListViewNonHomeLauncherTest : public AppListViewTest {
+ public:
+  AppListViewNonHomeLauncherTest() = default;
+  ~AppListViewNonHomeLauncherTest() override = default;
+
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        {}, {app_list::features::kEnableHomeLauncher});
+    AppListViewTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(AppListViewNonHomeLauncherTest);
+};
 
 }  // namespace
 
@@ -513,9 +623,9 @@
 
   std::vector<views::View*> forward_view_list;
   forward_view_list.push_back(search_box_view()->search_box());
-  for (int i = 0; i < suggestions_container_view()->num_results(); ++i)
-    forward_view_list.push_back(suggestions_container_view()->tile_views()[i]);
-  forward_view_list.push_back(apps_grid_view()->expand_arrow_view_for_test());
+  for (auto* v : GetAllSuggestions())
+    forward_view_list.push_back(v);
+  forward_view_list.push_back(expand_arrow_view());
   forward_view_list.push_back(search_box_view()->search_box());
   std::vector<views::View*> backward_view_list = forward_view_list;
   std::reverse(backward_view_list.begin(), backward_view_list.end());
@@ -542,8 +652,8 @@
 
   std::vector<views::View*> forward_view_list;
   forward_view_list.push_back(search_box_view()->search_box());
-  for (int i = 0; i < suggestions_container_view()->num_results(); ++i)
-    forward_view_list.push_back(suggestions_container_view()->tile_views()[i]);
+  for (auto* v : GetAllSuggestions())
+    forward_view_list.push_back(v);
   const views::ViewModelT<AppListItemView>* view_model =
       apps_grid_view()->view_model();
   for (int i = 0; i < view_model->view_size(); ++i)
@@ -659,18 +769,15 @@
 }
 
 // Tests the vertical focus traversal by in PEEKING state.
-TEST_F(AppListViewFocusTest, VerticalFocusTraversalInPeekingState) {
+TEST_P(AppListViewFocusTest, VerticalFocusTraversalInPeekingState) {
   Show();
   SetAppListState(AppListViewState::PEEKING);
 
   std::vector<views::View*> forward_view_list;
   forward_view_list.push_back(search_box_view()->search_box());
-  const std::vector<SearchResultTileItemView*>& tile_views =
-      suggestions_container_view()->tile_views();
-  const int suggestions_num_results =
-      suggestions_container_view()->num_results();
-  forward_view_list.push_back(tile_views.front());
-  forward_view_list.push_back(apps_grid_view()->expand_arrow_view_for_test());
+  const std::vector<views::View*> suggestions = GetAllSuggestions();
+  forward_view_list.push_back(suggestions[0]);
+  forward_view_list.push_back(expand_arrow_view());
   forward_view_list.push_back(search_box_view()->search_box());
 
   // Test traversal triggered by down.
@@ -678,8 +785,8 @@
 
   std::vector<views::View*> backward_view_list;
   backward_view_list.push_back(search_box_view()->search_box());
-  backward_view_list.push_back(apps_grid_view()->expand_arrow_view_for_test());
-  backward_view_list.push_back(tile_views[suggestions_num_results - 1]);
+  backward_view_list.push_back(expand_arrow_view());
+  backward_view_list.push_back(suggestions.back());
   backward_view_list.push_back(search_box_view()->search_box());
 
   // Test traversal triggered by up.
@@ -687,17 +794,14 @@
 }
 
 // Tests the vertical focus traversal in FULLSCREEN_ALL_APPS state.
-TEST_F(AppListViewFocusTest, VerticalFocusTraversalInFullscreenAllAppsState) {
+TEST_P(AppListViewFocusTest, VerticalFocusTraversalInFullscreenAllAppsState) {
   Show();
   SetAppListState(AppListViewState::FULLSCREEN_ALL_APPS);
 
   std::vector<views::View*> forward_view_list;
   forward_view_list.push_back(search_box_view()->search_box());
-  const std::vector<SearchResultTileItemView*>& tile_views =
-      suggestions_container_view()->tile_views();
-  const int suggestions_num_results =
-      suggestions_container_view()->num_results();
-  forward_view_list.push_back(tile_views.front());
+  const std::vector<views::View*> suggestions = GetAllSuggestions();
+  forward_view_list.push_back(suggestions[0]);
   const views::ViewModelT<AppListItemView>* view_model =
       apps_grid_view()->view_model();
   for (int i = 0; i < view_model->view_size(); i += apps_grid_view()->cols())
@@ -712,10 +816,14 @@
   for (int i = view_model->view_size() - 1; i >= 0;
        i -= apps_grid_view()->cols())
     backward_view_list.push_back(view_model->view_at(i));
-  const int index = std::min(view_model->view_size() % apps_grid_view()->cols(),
-                             suggestions_num_results) -
-                    1;
-  backward_view_list.push_back(tile_views[index]);
+  // Up key will always move focus to the last suggestion chip from first row
+  // apps.
+  const int index =
+      is_new_style_launcher_enabled_
+          ? suggestions.size() - 1
+          : std::min((view_model->view_size() - 1) % apps_grid_view()->cols(),
+                     static_cast<int>(suggestions.size()) - 1);
+  backward_view_list.push_back(suggestions[index]);
   backward_view_list.push_back(search_box_view()->search_box());
 
   // Test traversal triggered by up.
@@ -896,14 +1004,14 @@
   Show();
 
   // Set focus to first suggestion app and type a character.
-  suggestions_container_view()->tile_views()[0]->RequestFocus();
+  GetAllSuggestions()[0]->RequestFocus();
   SimulateKeyPress(ui::VKEY_SPACE, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
   EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16(" "));
   EXPECT_FALSE(search_box_view()->search_box()->HasSelection());
 
   // Set focus to expand arrow and type a character.
-  apps_grid_view()->expand_arrow_view_for_test()->RequestFocus();
+  expand_arrow_view()->RequestFocus();
   SimulateKeyPress(ui::VKEY_A, false);
   EXPECT_EQ(search_box_view()->search_box(), focused_view());
   EXPECT_EQ(search_box_view()->search_box()->text(), base::UTF8ToUTF16(" a"));
@@ -1156,7 +1264,7 @@
   Show();
 
   // Set focus to the first suggestion app.
-  suggestions_container_view()->tile_views()[0]->RequestFocus();
+  GetAllSuggestions()[0]->RequestFocus();
   EXPECT_FALSE(search_box_view()->search_box()->HasFocus());
 
   // Activate the search box.
@@ -1201,9 +1309,9 @@
   EXPECT_TRUE(search_box_view()->search_box()->HasFocus());
 
   // Right click on the first suggestion app to trigger context menu.
-  ASSERT_GE(suggestions_container_view()->tile_views().size(), 2u);
-  views::View* first_suggestion_app =
-      suggestions_container_view()->tile_views()[0];
+  const std::vector<views::View*> suggestions = GetAllSuggestions();
+  ASSERT_GE(suggestions.size(), 2u);
+  views::View* first_suggestion_app = suggestions[0];
   ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
                              ui::EventTimeForNow(), ui::EF_RIGHT_MOUSE_BUTTON,
                              ui::EF_RIGHT_MOUSE_BUTTON);
@@ -1213,8 +1321,7 @@
   EXPECT_TRUE(first_suggestion_app->HasFocus());
 
   // Right click on the second suggestion app to trigger context menu.
-  views::View* second_suggestion_app =
-      suggestions_container_view()->tile_views()[1];
+  views::View* second_suggestion_app = suggestions[1];
   second_suggestion_app->OnMouseEvent(&press_event);
 
   // Focus is moved to the second suggestion app.
@@ -1387,14 +1494,14 @@
 }
 
 // Tests that pressing escape when in tablet mode closes the app list.
-TEST_F(AppListViewTest, EscapeKeyTabletModeFullscreenToClosed) {
+TEST_F(AppListViewTest, EscapeKeyTabletModeStayFullscreen) {
   // Put into fullscreen by using tablet mode.
   Initialize(0, true, false);
 
   Show();
   view_->AcceleratorPressed(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
 
-  ASSERT_EQ(AppListViewState::CLOSED, view_->app_list_state());
+  ASSERT_EQ(AppListViewState::FULLSCREEN_ALL_APPS, view_->app_list_state());
 }
 
 // Tests that pressing escape when in fullscreen search changes to fullscreen.
@@ -1472,8 +1579,8 @@
   ASSERT_EQ(AppListViewState::FULLSCREEN_ALL_APPS, view_->app_list_state());
 }
 
-// Tests that leaving tablet mode when in tablet search causes no change.
-TEST_F(AppListViewTest, LeaveTabletModeNoChange) {
+// Tests that leaving tablet mode when in tablet search closes launcher.
+TEST_F(AppListViewTest, LeaveTabletModeClosed) {
   // Put into fullscreen using tablet mode.
   Initialize(0, true, false);
   views::Textfield* search_box =
@@ -1484,11 +1591,11 @@
   search_box->InsertText(base::UTF8ToUTF16("something"));
   view_->OnTabletModeChanged(false);
 
-  ASSERT_EQ(AppListViewState::FULLSCREEN_SEARCH, view_->app_list_state());
+  ASSERT_EQ(AppListViewState::CLOSED, view_->app_list_state());
 }
 
 // Tests that escape works after leaving tablet mode from search.
-TEST_F(AppListViewTest, LeaveTabletModeEscapeKeyToFullscreen) {
+TEST_F(AppListViewNonHomeLauncherTest, LeaveTabletModeEscapeKeyToFullscreen) {
   // Put into fullscreen using tablet mode.
   Initialize(0, true, false);
   views::Textfield* search_box =
@@ -1504,7 +1611,7 @@
 }
 
 // Tests that escape twice closes after leaving tablet mode from search.
-TEST_F(AppListViewTest, LeaveTabletModeEscapeKeyTwiceToClosed) {
+TEST_F(AppListViewNonHomeLauncherTest, LeaveTabletModeEscapeKeyTwiceToClosed) {
   // Put into fullscreen using tablet mode.
   Initialize(0, true, false);
   views::Textfield* search_box =
@@ -1521,15 +1628,13 @@
 }
 
 // Tests that opening in peeking mode sets the correct height.
-TEST_F(AppListViewTest, OpenInPeekingCorrectHeight) {
+TEST_P(AppListViewTest, OpenInPeekingCorrectHeight) {
   Initialize(0, false, false);
 
   Show();
   view_->SetState(AppListViewState::PEEKING);
-  const views::Widget* widget = view_->get_fullscreen_widget_for_test();
-  const int y = widget->GetWindowBoundsInScreen().y();
-
-  ASSERT_EQ(kPeekingYValue, y);
+  ASSERT_EQ(AppListConfig::instance().peeking_app_list_height(),
+            view_->GetCurrentAppListHeight());
 }
 
 // Tests that opening in peeking mode sets the correct height.
@@ -1898,5 +2003,31 @@
   ASSERT_EQ(1, view_->GetAppsPaginationModel()->selected_page());
 }
 
+// Tests that pressing escape when in tablet mode closes the app list.
+TEST_F(AppListViewNonHomeLauncherTest, EscapeKeyTabletModeFullscreenToClosed) {
+  // Put into fullscreen by using tablet mode.
+  Initialize(0, true, false);
+
+  Show();
+  view_->AcceleratorPressed(ui::Accelerator(ui::VKEY_ESCAPE, ui::EF_NONE));
+
+  ASSERT_EQ(AppListViewState::CLOSED, view_->app_list_state());
+}
+
+// Tests that leaving tablet mode when in tablet search causes no change.
+TEST_F(AppListViewNonHomeLauncherTest, LeaveTabletModeNoChange) {
+  // Put into fullscreen using tablet mode.
+  Initialize(0, true, false);
+  views::Textfield* search_box =
+      view_->app_list_main_view()->search_box_view()->search_box();
+
+  Show();
+  search_box->SetText(base::string16());
+  search_box->InsertText(base::UTF8ToUTF16("something"));
+  view_->OnTabletModeChanged(false);
+
+  ASSERT_EQ(AppListViewState::FULLSCREEN_SEARCH, view_->app_list_state());
+}
+
 }  // namespace test
 }  // namespace app_list
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc
index c13d77e..8564471 100644
--- a/ash/app_list/views/apps_container_view.cc
+++ b/ash/app_list/views/apps_container_view.cc
@@ -110,7 +110,7 @@
   // Disable all the items behind the folder so that they will not be reached
   // during focus traversal.
   contents_view_->GetSearchBoxView()->search_box()->RequestFocus();
-  apps_grid_view_->DisableFocusForShowingActiveFolder(true);
+  DisableFocusForShowingActiveFolder(true);
 }
 
 void AppsContainerView::ShowApps(AppListFolderItem* folder_item) {
@@ -118,12 +118,12 @@
     return;
 
   SetShowState(SHOW_APPS, folder_item ? true : false);
-  apps_grid_view_->DisableFocusForShowingActiveFolder(false);
+  DisableFocusForShowingActiveFolder(false);
 }
 
 void AppsContainerView::ResetForShowApps() {
   SetShowState(SHOW_APPS, false);
-  apps_grid_view_->DisableFocusForShowingActiveFolder(false);
+  DisableFocusForShowingActiveFolder(false);
 }
 
 void AppsContainerView::SetDragAndDropHostOfCurrentAppList(
@@ -138,7 +138,7 @@
   if (app_list_folder_view_->IsAnimationRunning())
     return;
   SetShowState(SHOW_ITEM_REPARENT, false);
-  apps_grid_view_->DisableFocusForShowingActiveFolder(false);
+  DisableFocusForShowingActiveFolder(false);
 }
 
 bool AppsContainerView::IsInFolderView() const {
@@ -155,6 +155,11 @@
   apps_grid_view_->UpdateControlVisibility(app_list_state, is_in_drag);
   page_switcher_->SetVisible(
       app_list_state == AppListViewState::FULLSCREEN_ALL_APPS || is_in_drag);
+  if (suggestion_chip_container_view_) {
+    suggestion_chip_container_view_->SetVisible(
+        app_list_state == AppListViewState::FULLSCREEN_ALL_APPS ||
+        app_list_state == AppListViewState::PEEKING || is_in_drag);
+  }
 }
 
 void AppsContainerView::UpdateOpacity() {
@@ -488,4 +493,12 @@
           ->results());
 }
 
+void AppsContainerView::DisableFocusForShowingActiveFolder(bool disabled) {
+  if (suggestion_chip_container_view_) {
+    suggestion_chip_container_view_->DisableFocusForShowingActiveFolder(
+        disabled);
+  }
+  apps_grid_view_->DisableFocusForShowingActiveFolder(disabled);
+}
+
 }  // namespace app_list
diff --git a/ash/app_list/views/apps_container_view.h b/ash/app_list/views/apps_container_view.h
index e331803..584b8c1 100644
--- a/ash/app_list/views/apps_container_view.h
+++ b/ash/app_list/views/apps_container_view.h
@@ -84,6 +84,9 @@
   // list.
   gfx::Rect GetSearchBoxExpectedBounds() const;
 
+  SuggestionChipContainerView* suggestion_chip_container_view_for_test() {
+    return suggestion_chip_container_view_;
+  }
   AppsGridView* apps_grid_view() { return apps_grid_view_; }
   FolderBackgroundView* folder_background_view() {
     return folder_background_view_;
@@ -109,6 +112,10 @@
   // Updates suggestion chips from app list model.
   void UpdateSuggestionChips();
 
+  // Suggestion chips and apps grid view become unfocusable if |disabled| is
+  // true. This is used to trap focus within the folder when it is opened.
+  void DisableFocusForShowingActiveFolder(bool disabled);
+
   ContentsView* contents_view_;  // Not owned.
 
   // True if new style launcher feature is enabled.
diff --git a/ash/app_list/views/apps_grid_view.cc b/ash/app_list/views/apps_grid_view.cc
index 521cd2c0..f369dc4 100644
--- a/ash/app_list/views/apps_grid_view.cc
+++ b/ash/app_list/views/apps_grid_view.cc
@@ -914,6 +914,10 @@
   const AppListViewState state =
       contents_view_->app_list_view()->app_list_state();
   const bool arrow_up = event.key_code() == ui::VKEY_UP;
+
+  if (is_new_style_launcher_enabled_)
+    return HandleVerticalFocusMovement(arrow_up);
+
   if (state == AppListViewState::PEEKING)
     return HandleFocusMovementInPeekingState(arrow_up);
 
@@ -1598,6 +1602,61 @@
   return true;
 }
 
+bool AppsGridView::HandleVerticalFocusMovement(bool arrow_up) {
+  views::View* focused = GetFocusManager()->GetFocusedView();
+  if (focused->GetClassName() != AppListItemView::kViewClassName)
+    return false;
+
+  const GridIndex source_index =
+      GetIndexOfView(static_cast<const AppListItemView*>(focused));
+  int target_page = source_index.page;
+  int target_row = source_index.slot / cols_ + (arrow_up ? -1 : 1);
+  int target_col = source_index.slot % cols_;
+
+  if (target_row < 0) {
+    // Move focus to the last row of previous page if target row is negative.
+    --target_page;
+
+    // |target_page| may be invalid which makes |target_row| invalid, but
+    // |target_row| will not be used if |target_page| is invalid.
+    target_row = (GetItemsNumOfPage(target_page) - 1) / cols_;
+  } else if (target_row > (GetItemsNumOfPage(target_page) - 1) / cols_) {
+    // Move focus to the first row of next page if target row is beyond range.
+    ++target_page;
+    target_row = 0;
+  }
+
+  if (target_page < 0) {
+    // Move focus up outside the apps grid if target page is negative.
+    views::View* v = GetFocusManager()->GetNextFocusableView(
+        view_model_.view_at(0), nullptr, true, false);
+    DCHECK(v);
+    v->RequestFocus();
+    return true;
+  }
+
+  if (target_page >= pagination_model_.total_pages()) {
+    // Move focus down outside the apps grid if target page is beyond range.
+    views::View* v = GetFocusManager()->GetNextFocusableView(
+        view_model_.view_at(view_model_.view_size() - 1), nullptr, false,
+        false);
+    DCHECK(v);
+    v->RequestFocus();
+    return true;
+  }
+
+  GridIndex target_index(target_page, target_row * cols_ + target_col);
+
+  // Ensure the focus is within the range of the target page.
+  target_index.slot =
+      std::min(GetItemsNumOfPage(target_page) - 1, target_index.slot);
+  if (IsValidIndex(target_index)) {
+    GetViewAtIndex(target_index)->RequestFocus();
+    return true;
+  }
+  return false;
+}
+
 void AppsGridView::UpdateColsAndRowsForFolder() {
   if (!folder_delegate_ || !item_list_->item_count())
     return;
@@ -2317,7 +2376,7 @@
       display.bounds().bottom() -
       (contents_view_->app_list_view()->is_side_shelf()
            ? 0
-           : AppListConfig::instance().shelf_height());
+           : (display.bounds().bottom() - display.work_area().bottom()));
 
   return point_in_screen.y() > kBottomDragBufferMin &&
          point_in_screen.y() < kBottomDragBufferMax;
@@ -2792,4 +2851,19 @@
           : 0;
 }
 
+int AppsGridView::GetItemsNumOfPage(int page) const {
+  DCHECK(is_new_style_launcher_enabled_);
+  if (page < 0 || page >= pagination_model_.total_pages())
+    return 0;
+
+  if (IsAppsGridGapEnabled())
+    return view_structure_.items_on_page(page);
+
+  if (page < pagination_model_.total_pages() - 1)
+    return TilesPerPage(page);
+
+  return item_list_->item_count() -
+         (pagination_model_.total_pages() - 1) * TilesPerPage(0);
+}
+
 }  // namespace app_list
diff --git a/ash/app_list/views/apps_grid_view.h b/ash/app_list/views/apps_grid_view.h
index 61b64be..6ad44c49 100644
--- a/ash/app_list/views/apps_grid_view.h
+++ b/ash/app_list/views/apps_grid_view.h
@@ -532,6 +532,9 @@
   // state.
   bool HandleFocusMovementInFullscreenAllAppsState(bool arrow_up);
 
+  // Handle vertical focus movement triggered by arrow up and down.
+  bool HandleVerticalFocusMovement(bool arrow_up);
+
   // Update number of columns and rows for apps within a folder.
   void UpdateColsAndRowsForFolder();
 
@@ -601,6 +604,10 @@
   // Update the padding of tile view based on the contents bounds.
   void UpdateTilePadding();
 
+  // Returns the number of existing items in specified page. Returns 0 if |page|
+  // is out of range.
+  int GetItemsNumOfPage(int page) const;
+
   AppListModel* model_ = nullptr;         // Owned by AppListView.
   AppListItemList* item_list_ = nullptr;  // Not owned.
 
diff --git a/ash/app_list/views/apps_grid_view_unittest.cc b/ash/app_list/views/apps_grid_view_unittest.cc
index f85fbc9..f0feeab 100644
--- a/ash/app_list/views/apps_grid_view_unittest.cc
+++ b/ash/app_list/views/apps_grid_view_unittest.cc
@@ -27,8 +27,10 @@
 #include "ash/app_list/views/folder_background_view.h"
 #include "ash/app_list/views/search_box_view.h"
 #include "ash/app_list/views/search_result_tile_item_view.h"
+#include "ash/app_list/views/suggestion_chip_container_view.h"
 #include "ash/app_list/views/suggestions_container_view.h"
 #include "ash/app_list/views/test/apps_grid_view_test_api.h"
+#include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_constants.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/app_list/app_list_switches.h"
@@ -143,23 +145,35 @@
 struct TestParams {
   bool is_rtl_enabled;
   bool is_apps_grid_gap_enabled;
+  bool is_new_style_launcher_enabled;
 };
 
 const TestParams kAppsGridViewTestParams[] = {
-    {false /* is_rtl_enabled */, false /* is_apps_grid_gap_enabled */},
-    {true, false},
+    {false /* is_rtl_enabled */, false /* is_apps_grid_gap_enabled */,
+     false /* is_new_style_launcher_enabled */},
+    {false, false, true},
+    {true, false, false},
+    {true, false, true},
 };
 
 const TestParams kAppsGridViewDragTestParams[] = {
-    {false /* is_rtl_enabled */, false /* is_apps_grid_gap_enabled */},
-    {true, false},
-    {false, true},
-    {true, true},
+    {false /* is_rtl_enabled */, false /* is_apps_grid_gap_enabled */,
+     false /* is_apps_grid_gap_enabled */},
+    {false, false, true},
+    {true, false, false},
+    {true, false, true},
+    {false, true, false},
+    {false, true, true},
+    {true, true, false},
+    {true, true, true},
 };
 
 const TestParams kAppsGridGapTestParams[] = {
-    {false /* is_rtl_enabled */, true /* is_apps_grid_gap_enabled */},
-    {true, true},
+    {false /* is_rtl_enabled */, true /* is_apps_grid_gap_enabled */,
+     false /* is_apps_grid_gap_enabled */},
+    {false, true, true},
+    {true, true, false},
+    {true, true, true},
 };
 
 }  // namespace
@@ -173,12 +187,28 @@
   // testing::Test overrides:
   void SetUp() override {
     AppListView::SetShortAnimationForTesting(true);
-    views::ViewsTestBase::SetUp();
+    std::vector<base::Feature> enabled_features;
+    std::vector<base::Feature> disabled_features;
     if (testing::UnitTest::GetInstance()->current_test_info()->value_param()) {
       is_rtl_ = GetParam().is_rtl_enabled;
       if (is_rtl_)
         base::i18n::SetICUDefaultLocale("he");
+
+      is_apps_grid_gap_enabled_ = GetParam().is_apps_grid_gap_enabled;
+      is_new_style_launcher_enabled_ = GetParam().is_new_style_launcher_enabled;
     }
+    if (is_apps_grid_gap_enabled_) {
+      enabled_features.emplace_back(features::kEnableAppsGridGapFeature);
+    } else {
+      disabled_features.emplace_back(features::kEnableAppsGridGapFeature);
+    }
+    if (is_new_style_launcher_enabled_) {
+      enabled_features.emplace_back(features::kEnableNewStyleLauncher);
+    } else {
+      disabled_features.emplace_back(features::kEnableNewStyleLauncher);
+    }
+    scoped_feature_list_.InitWithFeatures(enabled_features, disabled_features);
+    views::ViewsTestBase::SetUp();
     gfx::NativeView parent = GetContext();
     // Ensure that parent is big enough to show the full AppListView.
     parent->SetBounds(gfx::Rect(gfx::Point(0, 0), gfx::Size(1024, 768)));
@@ -193,14 +223,21 @@
 
     model_ = delegate_->GetTestModel();
     search_model_ = delegate_->GetSearchModel();
-    suggestions_container_ = apps_grid_view_->suggestions_container_for_test();
+    if (is_new_style_launcher_enabled_) {
+      suggestions_container_ = contents_view_->GetAppsContainerView()
+                                   ->suggestion_chip_container_view_for_test();
+    } else {
+      suggestions_container_ =
+          apps_grid_view_->suggestions_container_for_test();
+    }
+
     expand_arrow_view_ = apps_grid_view_->expand_arrow_view_for_test();
     for (size_t i = 0; i < kNumOfSuggestedApps; ++i) {
       search_model_->results()->Add(
           std::make_unique<TestSuggestedSearchResult>());
     }
     // Needed to update suggestions from |model_|.
-    apps_grid_view_->ResetForShowApps();
+    suggestions_container_->Update();
     app_list_view_->SetState(AppListViewState::FULLSCREEN_ALL_APPS);
     app_list_view_->Layout();
 
@@ -296,7 +333,7 @@
   AppListView* app_list_view_ = nullptr;    // Owned by native widget.
   AppsGridView* apps_grid_view_ = nullptr;  // Owned by |app_list_view_|.
   ContentsView* contents_view_ = nullptr;   // Owned by |app_list_view_|.
-  SuggestionsContainerView* suggestions_container_ =
+  SearchResultContainerView* suggestions_container_ =
       nullptr;                                    // Owned by |apps_grid_view_|.
   ExpandArrowView* expand_arrow_view_ = nullptr;  // Owned by |apps_grid_view_|.
   std::unique_ptr<AppListTestViewDelegate> delegate_;
@@ -305,6 +342,8 @@
   std::unique_ptr<AppsGridViewTestApi> test_api_;
   bool is_rtl_ = false;
   bool test_with_fullscreen_ = true;
+  bool is_apps_grid_gap_enabled_ = false;
+  bool is_new_style_launcher_enabled_ = false;
 
  private:
   // Restores the locale to default when destructor is called.
@@ -313,6 +352,8 @@
   // Used by AppListFolderView::UpdatePreferredBounds.
   keyboard::KeyboardController keyboard_controller_;
 
+  base::test::ScopedFeatureList scoped_feature_list_;
+
   DISALLOW_COPY_AND_ASSIGN(AppsGridViewTest);
 };
 
@@ -350,13 +391,15 @@
   DISALLOW_COPY_AND_ASSIGN(TestAppsGridViewFolderDelegate);
 };
 
-TEST_F(AppsGridViewTest, CreatePage) {
+TEST_P(AppsGridViewTest, CreatePage) {
   // Fully populates a page.
   const int kPages = 1;
 
   EXPECT_EQ(kNumOfSuggestedApps, suggestions_container_->num_results());
-  int kExpectedTilesOnFirstPage =
-      apps_grid_view_->cols() * (apps_grid_view_->rows_per_page() - 1);
+  // For new style launcher, each page has the same number of rows.
+  const int kExpectedTilesOnFirstPage =
+      apps_grid_view_->cols() * (apps_grid_view_->rows_per_page() -
+                                 (is_new_style_launcher_enabled_ ? 0 : 1));
   EXPECT_EQ(kExpectedTilesOnFirstPage, GetTilesPerPage(kPages - 1));
 
   model_->PopulateApps(kPages * GetTilesPerPage(kPages - 1));
@@ -676,24 +719,7 @@
   AppsGridViewDragTest() = default;
   ~AppsGridViewDragTest() override = default;
 
-  // testing::Test overrides:
-  void SetUp() override {
-    if (testing::UnitTest::GetInstance()->current_test_info()->value_param()) {
-      is_apps_grid_gap_enabled_ = GetParam().is_apps_grid_gap_enabled;
-      if (is_apps_grid_gap_enabled_) {
-        scoped_feature_list_.InitWithFeatures(
-            {app_list::features::kEnableAppsGridGapFeature}, {});
-      }
-    }
-    AppsGridViewTest::SetUp();
-  }
-
- protected:
-  bool is_apps_grid_gap_enabled_ = false;
-
  private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-
   DISALLOW_COPY_AND_ASSIGN(AppsGridViewDragTest);
 };
 
@@ -845,12 +871,12 @@
 
 // Test reordering items via dragging.
 TEST_P(AppsGridViewDragTest, MouseDragItemReorder) {
-  // Using a simulated 2x3 layout for the test. The first row is occupied by
-  // suggested apps, so just populate 4 apps.
-  apps_grid_view_->SetLayout(2, 3);
-  model_->PopulateApps(4);
-  EXPECT_EQ(4u, model_->top_level_item_list()->item_count());
-  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
+  // The default layout is 5x4, populate 7 apps so that we have second row to
+  // test dragging item to second row.
+  model_->PopulateApps(7);
+  contents_view_->GetAppsContainerView()->Layout();
+  EXPECT_EQ(7u, model_->top_level_item_list()->item_count());
+  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3,Item 4,Item 5,Item 6"),
             model_->GetModelContent());
 
   // Dragging an item towards its neighbours should not reorder until the drag
@@ -867,21 +893,23 @@
   drag_vector.set_x(-half_tile_width - 4);
   SimulateDrag(AppsGridView::MOUSE, top_right, top_right + drag_vector);
   apps_grid_view_->EndDrag(false);
-  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
+  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3,Item 4,Item 5,Item 6"),
             model_->GetModelContent());
   TestAppListItemViewIndice();
 
   // Drag left, past the folder dropping circle.
   gfx::Vector2d last_drag_vector(drag_vector);
-  drag_vector.set_x(-3 * half_tile_width + 4);
+  drag_vector.set_x(-2 * half_tile_width -
+                    AppListConfig::instance().folder_dropping_circle_radius() -
+                    4);
   SimulateDrag(AppsGridView::MOUSE, top_right + last_drag_vector,
                top_right + drag_vector);
   apps_grid_view_->EndDrag(false);
-  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3"),
+  EXPECT_EQ(std::string("Item 1,Item 0,Item 2,Item 3,Item 4,Item 5,Item 6"),
             model_->GetModelContent());
   TestAppListItemViewIndice();
 
-  // Drag down, between apps 2 and 3. The gap should open up, making space for
+  // Drag down, between apps 5 and 6. The gap should open up, making space for
   // app 1 in the bottom left.
   last_drag_vector = drag_vector;
   drag_vector.set_x(-half_tile_width);
@@ -889,7 +917,7 @@
   SimulateDrag(AppsGridView::MOUSE, top_right + last_drag_vector,
                top_right + drag_vector);
   apps_grid_view_->EndDrag(false);
-  EXPECT_EQ(std::string("Item 0,Item 2,Item 1,Item 3"),
+  EXPECT_EQ(std::string("Item 0,Item 2,Item 3,Item 4,Item 5,Item 1,Item 6"),
             model_->GetModelContent());
   TestAppListItemViewIndice();
 
@@ -901,7 +929,7 @@
   SimulateDrag(AppsGridView::MOUSE, top_right + last_drag_vector,
                top_right + drag_vector);
   apps_grid_view_->EndDrag(false);
-  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3"),
+  EXPECT_EQ(std::string("Item 0,Item 1,Item 2,Item 3,Item 4,Item 5,Item 6"),
             model_->GetModelContent());
   TestAppListItemViewIndice();
 
@@ -912,7 +940,7 @@
   SimulateDrag(AppsGridView::MOUSE, top_right + last_drag_vector,
                top_right + drag_vector);
   apps_grid_view_->EndDrag(false);
-  EXPECT_EQ(std::string("Item 0,Item 2,Item 3,Item 1"),
+  EXPECT_EQ(std::string("Item 0,Item 2,Item 3,Item 4,Item 5,Item 6,Item 1"),
             model_->GetModelContent());
   TestAppListItemViewIndice();
 }
diff --git a/ash/app_list/views/contents_view.h b/ash/app_list/views/contents_view.h
index 4ebf3b3..8388eb0 100644
--- a/ash/app_list/views/contents_view.h
+++ b/ash/app_list/views/contents_view.h
@@ -122,6 +122,8 @@
 
   AppListView* app_list_view() const { return app_list_view_; }
 
+  ExpandArrowView* expand_arrow_view() const { return expand_arrow_view_; }
+
   // Returns the pagination model for the ContentsView.
   const PaginationModel& pagination_model() { return pagination_model_; }
 
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index f1184f7..a695b1e49 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -16,6 +16,7 @@
 #include "ash/app_list/resources/grit/app_list_resources.h"
 #include "ash/app_list/views/app_list_view.h"
 #include "ash/app_list/views/contents_view.h"
+#include "ash/app_list/views/expand_arrow_view.h"
 #include "ash/app_list/views/search_result_base_view.h"
 #include "ash/app_list/views/search_result_page_view.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
@@ -84,6 +85,7 @@
     : search_box::SearchBoxViewBase(delegate),
       view_delegate_(view_delegate),
       app_list_view_(app_list_view),
+      is_new_style_launcher_enabled_(features::IsNewStyleLauncherEnabled()),
       weak_ptr_factory_(this) {
   set_is_tablet_mode(app_list_view->is_tablet_mode());
   if (features::IsZeroStateSuggestionsEnabled())
@@ -101,9 +103,9 @@
 }
 
 views::View* SearchBoxView::GetSelectedViewInContentsView() {
-  if (!contents_view())
+  if (!contents_view_)
     return nullptr;
-  return static_cast<ContentsView*>(contents_view())->GetSelectedView();
+  return contents_view_->GetSelectedView();
 }
 
 void SearchBoxView::HandleSearchBoxEvent(ui::LocatedEvent* located_event) {
@@ -235,18 +237,29 @@
     return;
 
   // If focus is in search box view, up key moves focus to the last element of
-  // contents view, while down key moves focus to the first element of contents
-  // view.
-  ContentsView* contents = static_cast<ContentsView*>(contents_view());
-  AppListPage* page = contents->GetPageView(contents->GetActivePageIndex());
+  // contents view if new style launcher is not enabled while it moves focus to
+  // expand arrow if the feature is enabled. Down key moves focus to the first
+  // element of contents view.
+  AppListPage* page =
+      contents_view_->GetPageView(contents_view_->GetActivePageIndex());
+  views::View* arrow_view = contents_view_->expand_arrow_view();
   views::View* v = event->key_code() == ui::VKEY_UP
-                       ? page->GetLastFocusableView()
+                       ? (arrow_view && arrow_view->IsFocusable()
+                              ? arrow_view
+                              : page->GetLastFocusableView())
                        : page->GetFirstFocusableView();
+
   if (v)
     v->RequestFocus();
   event->SetHandled();
 }
 
+bool SearchBoxView::OnMouseWheel(const ui::MouseWheelEvent& event) {
+  if (contents_view_)
+    return contents_view_->OnMouseWheel(event);
+  return false;
+}
+
 void SearchBoxView::UpdateBackground(double progress,
                                      ash::AppListState current_state,
                                      ash::AppListState target_state) {
@@ -290,15 +303,15 @@
   // the app list from collapsed(0) to peeking(1) state. When the fraction
   // changes from |kOpacityStartFraction| to |kOpaticyEndFraction|, the opacity
   // of searchbox changes from 0.f to 1.0f.
-  ContentsView* contents = static_cast<ContentsView*>(contents_view());
-  if (!contents->GetPageView(contents->GetActivePageIndex())
+  if (!contents_view_->GetPageView(contents_view_->GetActivePageIndex())
            ->ShouldShowSearchBox()) {
     return;
   }
   const int shelf_height = AppListConfig::instance().shelf_height();
   float fraction =
-      std::max<float>(0, contents->app_list_view()->GetCurrentAppListHeight() -
-                             shelf_height) /
+      std::max<float>(
+          0, contents_view_->app_list_view()->GetCurrentAppListHeight() -
+                 shelf_height) /
       (AppListConfig::instance().peeking_app_list_height() - shelf_height);
 
   float opacity =
@@ -307,13 +320,13 @@
                         0.f),
                1.0f);
 
-  AppListView* app_list_view = contents->app_list_view();
+  AppListView* app_list_view = contents_view_->app_list_view();
   bool should_restore_opacity =
       !app_list_view->is_in_drag() &&
       (app_list_view->app_list_state() != AppListViewState::CLOSED);
   // Restores the opacity of searchbox if the gesture dragging ends.
   this->layer()->SetOpacity(should_restore_opacity ? 1.0f : opacity);
-  contents->search_results_page_view()->layer()->SetOpacity(
+  contents_view_->search_results_page_view()->layer()->SetOpacity(
       should_restore_opacity ? 1.0f : opacity);
 }
 
@@ -471,9 +484,7 @@
       // Hitting Enter when focus is on search box opens the first result.
       ui::KeyEvent event(key_event);
       views::View* first_result_view =
-          static_cast<ContentsView*>(contents_view())
-              ->search_results_page_view()
-              ->first_result_view();
+          contents_view_->search_results_page_view()->first_result_view();
       if (first_result_view)
         first_result_view->OnKeyEvent(&event);
       return true;
diff --git a/ash/app_list/views/search_box_view.h b/ash/app_list/views/search_box_view.h
index abefa2ab..cc9296e 100644
--- a/ash/app_list/views/search_box_view.h
+++ b/ash/app_list/views/search_box_view.h
@@ -22,6 +22,7 @@
 
 class AppListView;
 class AppListViewDelegate;
+class ContentsView;
 class SearchModel;
 
 // Subclass of search_box::SearchBoxViewBase. SearchBoxModel is its data model
@@ -51,6 +52,7 @@
 
   // Overridden from views::View:
   void OnKeyEvent(ui::KeyEvent* event) override;
+  bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
 
   // Overridden from views::ButtonListener:
   void ButtonPressed(views::Button* sender, const ui::Event& event) override;
@@ -84,6 +86,11 @@
   // Sets the autocomplete text if autocomplete conditions are met.
   void ProcessAutocomplete();
 
+  void set_contents_view(ContentsView* contents_view) {
+    contents_view_ = contents_view;
+  }
+  ContentsView* contents_view() { return contents_view_; }
+
  private:
   // Gets the wallpaper prominent colors.
   void GetWallpaperProminentColors(
@@ -132,6 +139,10 @@
 
   // Owned by views hierarchy.
   app_list::AppListView* app_list_view_;
+  ContentsView* contents_view_ = nullptr;
+
+  // True if new style launcher feature is enabled.
+  const bool is_new_style_launcher_enabled_;
 
   base::WeakPtrFactory<SearchBoxView> weak_ptr_factory_;
 
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc
index 9b85cba..af69a7e0 100644
--- a/ash/app_list/views/search_box_view_unittest.cc
+++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -11,6 +11,7 @@
 
 #include "ash/app_list/test/app_list_test_view_delegate.h"
 #include "ash/app_list/views/app_list_view.h"
+#include "ash/app_list/views/contents_view.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/app_list/vector_icons/vector_icons.h"
 #include "base/macros.h"
@@ -27,9 +28,10 @@
 namespace app_list {
 namespace test {
 
-class KeyPressCounterView : public views::View {
+class KeyPressCounterView : public ContentsView {
  public:
-  KeyPressCounterView() : count_(0) {}
+  explicit KeyPressCounterView(AppListView* app_list_view)
+      : ContentsView(app_list_view), count_(0) {}
   ~KeyPressCounterView() override {}
 
   int GetCountAndReset() {
@@ -71,7 +73,7 @@
     view_.reset(new SearchBoxView(this, &view_delegate_, app_list_view()));
     view_->Init();
     widget_->SetBounds(gfx::Rect(0, 0, 300, 200));
-    counter_view_ = new KeyPressCounterView();
+    counter_view_ = new KeyPressCounterView(app_list_view_);
     widget_->GetContentsView()->AddChildView(view());
     widget_->GetContentsView()->AddChildView(counter_view_);
     view()->set_contents_view(counter_view_);
diff --git a/ash/app_list/views/search_result_suggestion_chip_view.h b/ash/app_list/views/search_result_suggestion_chip_view.h
index 97731a3..8248bda 100644
--- a/ash/app_list/views/search_result_suggestion_chip_view.h
+++ b/ash/app_list/views/search_result_suggestion_chip_view.h
@@ -39,6 +39,8 @@
   const char* GetClassName() const override;
   gfx::Size CalculatePreferredSize() const override;
 
+  SuggestionChipView* suggestion_chip_view() { return suggestion_chip_view_; }
+
  private:
   // Updates the suggestion chip view's title and icon.
   void UpdateSuggestionChipView();
diff --git a/ash/app_list/views/search_result_tile_item_view.cc b/ash/app_list/views/search_result_tile_item_view.cc
index aa981de4..405db9c 100644
--- a/ash/app_list/views/search_result_tile_item_view.cc
+++ b/ash/app_list/views/search_result_tile_item_view.cc
@@ -49,6 +49,11 @@
 constexpr int kSearchRatingStarHorizontalSpacing = 1;
 constexpr int kSearchRatingStarVerticalSpacing = 2;
 
+// Delta applied to the font size of SearchResultTile rating.
+constexpr int kSearchRatingTextSizeDelta = 1;
+// Delta applied to the font size of SearchResultTile price.
+constexpr int kSearchPriceTextSizeDelta = 1;
+
 constexpr int kIconSelectedSize = 56;
 constexpr int kIconSelectedCornerRadius = 4;
 // Icon selected color, #000 8%.
@@ -192,13 +197,44 @@
     if (rating_) {
       rating_->SetBackground(
           views::CreateSolidBackground(kCardBackgroundColor));
+      if (!IsSuggestedAppTile()) {
+        // App search results use different fonts than AppList apps.
+        rating_->SetFontList(
+            ui::ResourceBundle::GetSharedInstance()
+                .GetFontList(kSearchResultTitleFontStyle)
+                .DeriveWithSizeDelta(kSearchRatingTextSizeDelta));
+        rating_->SetLineHeight(rating_->font_list().GetHeight());
+      } else {
+        rating_->SetFontList(font);
+        rating_->SetLineHeight(font.GetHeight());
+      }
     }
     if (price_) {
       price_->SetBackground(views::CreateSolidBackground(kCardBackgroundColor));
+      if (!IsSuggestedAppTile()) {
+        // App search results use different fonts than AppList apps.
+        price_->SetFontList(
+            ui::ResourceBundle::GetSharedInstance()
+                .GetFontList(kSearchResultTitleFontStyle)
+                .DeriveWithSizeDelta(kSearchPriceTextSizeDelta));
+        price_->SetLineHeight(price_->font_list().GetHeight());
+      } else {
+        price_->SetFontList(font);
+        price_->SetLineHeight(font.GetHeight());
+      }
     }
     title_->SetBackground(views::CreateSolidBackground(kCardBackgroundColor));
-    title_->SetFontList(font);
-    title_->SetLineHeight(font.GetHeight());
+    if (!IsSuggestedAppTile()) {
+      // App search results use different fonts than AppList apps.
+      title_->SetFontList(
+          ui::ResourceBundle::GetSharedInstance()
+              .GetFontList(kSearchResultTitleFontStyle)
+              .DeriveWithSizeDelta(kSearchResultTitleTextSizeDelta));
+      title_->SetLineHeight(title_->font_list().GetHeight());
+    } else {
+      title_->SetFontList(font);
+      title_->SetLineHeight(font.GetHeight());
+    }
     title_->SetEnabledColor(kSearchTitleColor);
   }
 
diff --git a/ash/app_list/views/search_result_view.cc b/ash/app_list/views/search_result_view.cc
index ab211428..1bf350c 100644
--- a/ash/app_list/views/search_result_view.cc
+++ b/ash/app_list/views/search_result_view.cc
@@ -146,7 +146,8 @@
   render_text->SetText(result_->title());
   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
   render_text->SetFontList(
-      rb.GetFontList(ui::ResourceBundle::BaseFont).DeriveWithSizeDelta(2));
+      rb.GetFontList(kSearchResultTitleFontStyle)
+          .DeriveWithSizeDelta(kSearchResultTitleTextSizeDelta));
   // When result is an omnibox non-url search, the matched tag indicates
   // proposed query. For all other cases, the matched tag indicates typed search
   // query.
diff --git a/ash/app_list/views/suggestion_chip_container_view.cc b/ash/app_list/views/suggestion_chip_container_view.cc
index eeafb2b..079290f5 100644
--- a/ash/app_list/views/suggestion_chip_container_view.cc
+++ b/ash/app_list/views/suggestion_chip_container_view.cc
@@ -6,12 +6,16 @@
 
 #include <memory>
 
+#include "ash/app_list/app_list_util.h"
 #include "ash/app_list/views/app_list_main_view.h"
 #include "ash/app_list/views/contents_view.h"
+#include "ash/app_list/views/search_box_view.h"
 #include "ash/app_list/views/search_result_suggestion_chip_view.h"
 #include "ash/public/cpp/app_list/app_list_config.h"
 #include "ash/public/cpp/app_list/app_list_constants.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
+#include "ui/views/controls/textfield/textfield.h"
+#include "ui/views/focus/focus_manager.h"
 #include "ui/views/layout/box_layout.h"
 
 namespace app_list {
@@ -47,9 +51,9 @@
     return num_results();
 
   // Clear all current suggestion chips.
-  for (size_t i = 0; i < suggestion_chip_views.size(); ++i)
-    delete suggestion_chip_views[i];
-  suggestion_chip_views.clear();
+  for (size_t i = 0; i < suggestion_chip_views_.size(); ++i)
+    delete suggestion_chip_views_[i];
+  suggestion_chip_views_.clear();
 
   std::vector<SearchResult*> display_results =
       SearchModel::FilterSearchResultsByDisplayType(
@@ -62,11 +66,11 @@
     SearchResultSuggestionChipView* chip =
         new SearchResultSuggestionChipView(view_delegate_);
     chip->SetSearchResult(result);
-    suggestion_chip_views.emplace_back(chip);
+    suggestion_chip_views_.emplace_back(chip);
   }
 
   Layout();
-  return num_results();
+  return suggestion_chip_views_.size();
 }
 
 const char* SuggestionChipContainerView::GetClassName() const {
@@ -81,7 +85,7 @@
   RemoveAllChildViews(false /* delete_children */);
   int total_width = 0;
   const int max_width = GetContentsBounds().width();
-  for (auto* chip : suggestion_chip_views) {
+  for (auto* chip : suggestion_chip_views_) {
     const int chip_width = chip->GetPreferredSize().width();
     if (chip_width + total_width > max_width)
       break;
@@ -92,6 +96,34 @@
   views::View::Layout();
 }
 
+bool SuggestionChipContainerView::OnKeyPressed(const ui::KeyEvent& event) {
+  // Let the FocusManager handle Left/Right keys.
+  if (!CanProcessUpDownKeyTraversal(event))
+    return false;
+
+  // Up key moves focus to the search box. Down key moves focus to the first
+  // app.
+  views::View* v = nullptr;
+  if (event.key_code() == ui::VKEY_UP) {
+    v = contents_view_->GetSearchBoxView()->search_box();
+  } else {
+    // The first app is the next to this view's last focusable view.
+    views::View* last_focusable_view =
+        GetFocusManager()->GetNextFocusableView(this, nullptr, true, false);
+    v = GetFocusManager()->GetNextFocusableView(last_focusable_view, nullptr,
+                                                false, false);
+  }
+  if (v)
+    v->RequestFocus();
+  return true;
+}
+
+void SuggestionChipContainerView::DisableFocusForShowingActiveFolder(
+    bool disabled) {
+  for (auto* chip : suggestion_chip_views_)
+    chip->suggestion_chip_view()->SetEnabled(!disabled);
+}
+
 bool SuggestionChipContainerView::IgnoreUpdateAndLayout() const {
   // Ignore update and layout when this view is not shown.
   const ash::AppListState state = contents_view_->GetActiveState();
diff --git a/ash/app_list/views/suggestion_chip_container_view.h b/ash/app_list/views/suggestion_chip_container_view.h
index 61dd04f..14f33a2 100644
--- a/ash/app_list/views/suggestion_chip_container_view.h
+++ b/ash/app_list/views/suggestion_chip_container_view.h
@@ -28,6 +28,11 @@
 
   // views::View:
   void Layout() override;
+  bool OnKeyPressed(const ui::KeyEvent& event) override;
+
+  // Suggestion chips become unfocusable if |disabled| is true. This is used to
+  // trap focus within the folder when it is opened.
+  void DisableFocusForShowingActiveFolder(bool disabled);
 
  private:
   // Returns true if update and layout should be ignored.
@@ -36,7 +41,7 @@
   ContentsView* contents_view_ = nullptr;  // Not owned
   AppListViewDelegate* view_delegate_ = nullptr;
 
-  std::vector<SearchResultSuggestionChipView*> suggestion_chip_views;  // Owned
+  std::vector<SearchResultSuggestionChipView*> suggestion_chip_views_;  // Owned
 
   DISALLOW_COPY_AND_ASSIGN(SuggestionChipContainerView);
 };
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd
index b2ac302..0778d93 100644
--- a/ash/ash_strings.grd
+++ b/ash/ash_strings.grd
@@ -1709,6 +1709,21 @@
       <message name="IDS_ASH_ASSISTANT_NOTIFICATION_DISPLAY_SOURCE" desc="The name for the source of the assistant notification.">
         Assistant
       </message>
+      <message name="IDS_ASH_ASSISTANT_OPT_IN_UNLOCK_MORE_FEATURES" desc="Message shown in Assistant UI when the user is opted out to promote an opted in experience.">
+        Unlock more Assistant features.
+      </message>
+      <message name="IDS_ASH_ASSISTANT_OPT_IN_GET_STARTED" desc="Message shown in Assistant UI when the user is opted out to promote an opted in experience.">
+        Get Started
+      </message>
+      <message name="IDS_ASH_ASSISTANT_OPT_IN_PROMPT" desc="Message shown in Assistant UI when the user is opted out to promote an opted in experience. $1 = IDS_ASH_ASSISTANT_OPT_IN_UNLOCK_MORE_FEATURES, $2 = IDS_ASH_ASSISTANT_OPT_IN_GET_STARTED">
+        <ph name="UNLOCK_MORE_FEATURES">$1<ex>Unlock more Assistant features.</ex></ph>  <ph name="GET_STARTED">$2<ex>Get Started</ex></ph>
+      </message>
+      <message name="IDS_ASH_MESSAGE_CENTER_UNLOCK_TO_PERFORM_ACTION" desc="The short message to encourage user to unlock the device so that Chrome OS can perform the notification action selected by user after unlocking.">
+        Unlock device to perform the notification action
+      </message>
+      <message name="IDS_ASH_MESSAGE_CENTER_UNLOCK_TO_PERFORM_ACTION_WITH_USER_ID" desc="The short message to encourage user to unlock the device so that Chrome OS can perform the notification action selected by user after unlocking.">
+        Unlock device as <ph name="login_id">$1<ex>example@gmail.com</ex></ph> to perform the notification action
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/ash/assistant/assistant_notification_controller.cc b/ash/assistant/assistant_notification_controller.cc
index 83fcf0ed..8d41dd6 100644
--- a/ash/assistant/assistant_notification_controller.cc
+++ b/ash/assistant/assistant_notification_controller.cc
@@ -6,8 +6,8 @@
 
 #include "ash/assistant/assistant_controller.h"
 #include "ash/new_window_controller.h"
+#include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "ash/public/interfaces/voice_interaction_controller.mojom.h"
-#include "ash/resources/vector_icons/vector_icons.h"
 #include "ash/shell.h"
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/voice_interaction/voice_interaction_controller.h"
@@ -152,7 +152,7 @@
           new AssistantNotificationDelegate(weak_factory_.GetWeakPtr(),
                                             assistant_controller_->GetWeakPtr(),
                                             notification.Clone()),
-          kAssistantIcon,
+          kNotificationAssistantIcon,
           message_center::SystemNotificationWarningLevel::NORMAL);
   system_notification->set_priority(message_center::DEFAULT_PRIORITY);
   message_center->AddNotification(std::move(system_notification));
diff --git a/ash/assistant/assistant_screen_context_controller.cc b/ash/assistant/assistant_screen_context_controller.cc
index 767b5736..831866d 100644
--- a/ash/assistant/assistant_screen_context_controller.cc
+++ b/ash/assistant/assistant_screen_context_controller.cc
@@ -16,7 +16,7 @@
 #include "base/bind.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/compositor/layer_tree_owner.h"
 #include "ui/gfx/codec/jpeg_codec.h"
diff --git a/ash/assistant/ui/assistant_main_view.cc b/ash/assistant/ui/assistant_main_view.cc
index 8487244..bb9bc5d 100644
--- a/ash/assistant/ui/assistant_main_view.cc
+++ b/ash/assistant/ui/assistant_main_view.cc
@@ -14,6 +14,10 @@
 #include "ash/assistant/ui/caption_bar.h"
 #include "ash/assistant/ui/dialog_plate/dialog_plate.h"
 #include "ash/assistant/ui/main_stage/assistant_main_stage.h"
+#include "ash/assistant/util/animation_util.h"
+#include "base/time/time.h"
+#include "ui/compositor/layer_animation_element.h"
+#include "ui/compositor/layer_animator.h"
 #include "ui/views/layout/box_layout.h"
 
 namespace ash {
@@ -23,6 +27,18 @@
 // Appearance.
 constexpr int kMinHeightDip = 200;
 
+// Caption bar animation.
+constexpr base::TimeDelta kCaptionBarAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(283);
+constexpr base::TimeDelta kCaptionBarAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(167);
+
+// Dialog plate animation.
+constexpr base::TimeDelta kDialogPlateAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(283);
+constexpr base::TimeDelta kDialogPlateAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(167);
+
 }  // namespace
 
 AssistantMainView::AssistantMainView(AssistantController* assistant_controller)
@@ -86,6 +102,11 @@
   // Caption bar.
   caption_bar_ = new CaptionBar();
   caption_bar_->SetButtonVisible(CaptionButtonId::kBack, false);
+
+  // The caption bar will be animated on its own layer.
+  caption_bar_->SetPaintToLayer();
+  caption_bar_->layer()->SetFillsBoundsOpaquely(false);
+
   AddChildView(caption_bar_);
 
   // Main stage.
@@ -96,13 +117,42 @@
 
   // Dialog plate.
   dialog_plate_ = new DialogPlate(assistant_controller_);
+
+  // The dialog plate will be animated on its own layer.
+  dialog_plate_->SetPaintToLayer();
+  dialog_plate_->layer()->SetFillsBoundsOpaquely(false);
+
   AddChildView(dialog_plate_);
 }
 
 void AssistantMainView::OnUiVisibilityChanged(bool visible,
                                               AssistantSource source) {
-  if (visible)
+  if (visible) {
+    // When Assistant UI is shown and the motion spec is enabled, we animate in
+    // the appearance of the caption bar and dialog plate.
+    if (assistant::ui::kIsMotionSpecEnabled) {
+      using namespace assistant::util;
+
+      // Animate the caption bar from 0% to 100% opacity with delay.
+      caption_bar_->layer()->SetOpacity(0.f);
+      caption_bar_->layer()->GetAnimator()->StartAnimation(
+          CreateLayerAnimationSequence(
+              ui::LayerAnimationElement::CreatePauseElement(
+                  ui::LayerAnimationElement::AnimatableProperty::OPACITY,
+                  kCaptionBarAnimationFadeInDelay),
+              CreateOpacityElement(1.f, kCaptionBarAnimationFadeInDuration)));
+
+      // Animate the dialog plate from 0% to 100% opacity with delay.
+      dialog_plate_->layer()->SetOpacity(0.f);
+      dialog_plate_->layer()->GetAnimator()->StartAnimation(
+          CreateLayerAnimationSequence(
+              ui::LayerAnimationElement::CreatePauseElement(
+                  ui::LayerAnimationElement::AnimatableProperty::OPACITY,
+                  kDialogPlateAnimationFadeInDelay),
+              CreateOpacityElement(1.f, kDialogPlateAnimationFadeInDuration)));
+    }
     return;
+  }
 
   // When the Assistant UI is being hidden we need to reset our minimum height
   // restriction so that the default restrictions are restored for the next
diff --git a/ash/assistant/ui/dialog_plate/dialog_plate.cc b/ash/assistant/ui/dialog_plate/dialog_plate.cc
index 2946f7d6..bf3a49b 100644
--- a/ash/assistant/ui/dialog_plate/dialog_plate.cc
+++ b/ash/assistant/ui/dialog_plate/dialog_plate.cc
@@ -20,7 +20,6 @@
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/color_palette.h"
 #include "ui/gfx/paint_vector_icon.h"
-#include "ui/views/background.h"
 #include "ui/views/border.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/textfield/textfield.h"
@@ -97,8 +96,6 @@
 }
 
 void DialogPlate::InitLayout() {
-  SetBackground(views::CreateSolidBackground(SK_ColorWHITE));
-
   views::BoxLayout* layout_manager =
       SetLayoutManager(std::make_unique<views::BoxLayout>(
           views::BoxLayout::Orientation::kHorizontal,
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.cc b/ash/assistant/ui/main_stage/assistant_footer_view.cc
new file mode 100644
index 0000000..4dcbfefe
--- /dev/null
+++ b/ash/assistant/ui/main_stage/assistant_footer_view.cc
@@ -0,0 +1,61 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/assistant/ui/main_stage/assistant_footer_view.h"
+
+#include <memory>
+
+#include "ash/assistant/assistant_controller.h"
+#include "ash/assistant/ui/main_stage/assistant_opt_in_view.h"
+#include "ash/assistant/ui/main_stage/suggestion_container_view.h"
+#include "ui/views/layout/fill_layout.h"
+
+namespace ash {
+
+namespace {
+
+// Appearance.
+constexpr int kPreferredHeightDip = 48;
+
+}  // namespace
+
+AssistantFooterView::AssistantFooterView(
+    AssistantController* assistant_controller)
+    : assistant_controller_(assistant_controller) {
+  InitLayout();
+}
+
+AssistantFooterView::~AssistantFooterView() = default;
+
+gfx::Size AssistantFooterView::CalculatePreferredSize() const {
+  return gfx::Size(INT_MAX, GetHeightForWidth(INT_MAX));
+}
+
+int AssistantFooterView::GetHeightForWidth(int width) const {
+  return kPreferredHeightDip;
+}
+
+void AssistantFooterView::ChildPreferredSizeChanged(views::View* child) {
+  PreferredSizeChanged();
+}
+
+void AssistantFooterView::ChildVisibilityChanged(views::View* child) {
+  PreferredSizeChanged();
+}
+
+// TODO(dmblack): Handle opted out/in state.
+void AssistantFooterView::InitLayout() {
+  SetLayoutManager(std::make_unique<views::FillLayout>());
+
+  // Suggestion container.
+  suggestion_container_ = new SuggestionContainerView(assistant_controller_);
+  AddChildView(suggestion_container_);
+
+  // Opt in view.
+  opt_in_view_ = new AssistantOptInView();
+  opt_in_view_->SetVisible(false);
+  AddChildView(opt_in_view_);
+}
+
+}  // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_footer_view.h b/ash/assistant/ui/main_stage/assistant_footer_view.h
new file mode 100644
index 0000000..48a21c0
--- /dev/null
+++ b/ash/assistant/ui/main_stage/assistant_footer_view.h
@@ -0,0 +1,41 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_FOOTER_VIEW_H_
+#define ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_FOOTER_VIEW_H_
+
+#include "base/macros.h"
+#include "ui/views/view.h"
+
+namespace ash {
+
+class AssistantController;
+class AssistantOptInView;
+class SuggestionContainerView;
+
+class AssistantFooterView : public views::View {
+ public:
+  explicit AssistantFooterView(AssistantController* assistant_controller);
+  ~AssistantFooterView() override;
+
+  // views::View:
+  gfx::Size CalculatePreferredSize() const override;
+  int GetHeightForWidth(int width) const override;
+  void ChildPreferredSizeChanged(views::View* child) override;
+  void ChildVisibilityChanged(views::View* child) override;
+
+ private:
+  void InitLayout();
+
+  AssistantController* const assistant_controller_;  // Owned by Shell.
+
+  SuggestionContainerView* suggestion_container_;  // Owned by view hierarchy.
+  AssistantOptInView* opt_in_view_;                // Owned by view hierarchy.
+
+  DISALLOW_COPY_AND_ASSIGN(AssistantFooterView);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_FOOTER_VIEW_H_
diff --git a/ash/assistant/ui/main_stage/assistant_header_view.cc b/ash/assistant/ui/main_stage/assistant_header_view.cc
index ffef4dd..cfe3af78 100644
--- a/ash/assistant/ui/main_stage/assistant_header_view.cc
+++ b/ash/assistant/ui/main_stage/assistant_header_view.cc
@@ -13,15 +13,10 @@
 #include "ash/assistant/model/assistant_query.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/logo_view/base_logo_view.h"
-#include "ash/assistant/ui/main_stage/assistant_progress_indicator.h"
 #include "ash/assistant/util/animation_util.h"
-#include "ash/strings/grit/ash_strings.h"
 #include "base/time/time.h"
-#include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/layer_animation_sequence.h"
 #include "ui/compositor/layer_animator.h"
-#include "ui/views/border.h"
-#include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
 
 namespace ash {
@@ -30,19 +25,27 @@
 
 // Appearance.
 constexpr int kIconSizeDip = 24;
-constexpr int kInitialHeightDip = 72;
 
-// Molecule icon animation.
-constexpr base::TimeDelta kMoleculeIconAnimationTranslationDuration =
-    base::TimeDelta::FromMilliseconds(333);
-constexpr base::TimeDelta kMoleculeIconAnimationFadeInDelay =
-    base::TimeDelta::FromMilliseconds(50);
-constexpr base::TimeDelta kMoleculeIconAnimationFadeInDuration =
-    base::TimeDelta::FromMilliseconds(83);
-constexpr base::TimeDelta kMoleculeIconAnimationFadeOutDelay =
+// Appear animation.
+constexpr base::TimeDelta kAppearAnimationFadeInDelay =
     base::TimeDelta::FromMilliseconds(33);
-constexpr base::TimeDelta kMoleculeIconAnimationFadeOutDuration =
+constexpr base::TimeDelta kAppearAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(167);
+constexpr base::TimeDelta kAppearAnimationTranslateUpDuration =
+    base::TimeDelta::FromMilliseconds(250);
+constexpr int kAppearAnimationTranslationUpDip = 115;
+
+// Response animation.
+constexpr base::TimeDelta kResponseAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(50);
+constexpr base::TimeDelta kResponseAnimationFadeInDuration =
     base::TimeDelta::FromMilliseconds(83);
+constexpr base::TimeDelta kResponseAnimationFadeOutDelay =
+    base::TimeDelta::FromMilliseconds(33);
+constexpr base::TimeDelta kResponseAnimationFadeOutDuration =
+    base::TimeDelta::FromMilliseconds(83);
+constexpr base::TimeDelta kResponseAnimationTranslateLeftDuration =
+    base::TimeDelta::FromMilliseconds(333);
 
 }  // namespace
 
@@ -66,24 +69,13 @@
   return gfx::Size(INT_MAX, GetHeightForWidth(INT_MAX));
 }
 
-int AssistantHeaderView::GetHeightForWidth(int width) const {
-  return greeting_label_->visible() ? kInitialHeightDip
-                                    : views::View::GetHeightForWidth(width);
-}
-
 void AssistantHeaderView::ChildVisibilityChanged(views::View* child) {
-  if (!assistant::ui::kIsMotionSpecEnabled) {
-    layout_manager_->set_cross_axis_alignment(
-        greeting_label_->visible()
-            ? views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER
-            : views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_START);
-  }
   PreferredSizeChanged();
 }
 
 void AssistantHeaderView::InitLayout() {
   layout_manager_ = SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::Orientation::kVertical, gfx::Insets(), kSpacingDip));
+      views::BoxLayout::Orientation::kVertical));
 
   layout_manager_->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER);
@@ -99,39 +91,21 @@
   molecule_icon_->layer()->SetFillsBoundsOpaquely(false);
 
   AddChildView(molecule_icon_);
-
-  // Greeting label.
-  greeting_label_ = new views::Label(
-      l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_PROMPT_DEFAULT));
-  greeting_label_->SetAutoColorReadabilityEnabled(false);
-  greeting_label_->SetEnabledColor(kTextColorPrimary);
-  greeting_label_->SetFontList(
-      assistant::ui::GetDefaultFontList()
-          .DeriveWithSizeDelta(8)
-          .DeriveWithWeight(gfx::Font::Weight::MEDIUM));
-  greeting_label_->SetHorizontalAlignment(
-      gfx::HorizontalAlignment::ALIGN_CENTER);
-  greeting_label_->SetMultiLine(true);
-  AddChildView(greeting_label_);
-
-  // Progress indicator.
-  // Note that we add an empty border to increase the top margin.
-  progress_indicator_ = new AssistantProgressIndicator();
-  progress_indicator_->SetBorder(
-      views::CreateEmptyBorder(/*top=*/kSpacingDip, 0, 0, 0));
-  progress_indicator_->SetVisible(false);
-  AddChildView(progress_indicator_);
 }
 
 void AssistantHeaderView::OnCommittedQueryChanged(
     const AssistantQuery& committed_query) {
-  greeting_label_->SetVisible(false);
-  progress_indicator_->SetVisible(true);
+  if (!assistant::ui::kIsMotionSpecEnabled) {
+    layout_manager_->set_cross_axis_alignment(
+        views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_START);
+
+    // Force a layout/paint pass.
+    Layout();
+    SchedulePaint();
+  }
 }
 
 void AssistantHeaderView::OnResponseChanged(const AssistantResponse& response) {
-  progress_indicator_->SetVisible(false);
-
   // We only handle the first response when animating the molecule icon. For
   // all subsequent responses the molecule icon remains unchanged.
   if (!is_first_response_)
@@ -153,35 +127,69 @@
   molecule_icon_->layer()->GetAnimator()->StartTogether(
       {// Animate the translation.
        CreateLayerAnimationSequence(CreateTransformElement(
-           transform, kMoleculeIconAnimationTranslationDuration)),
+           transform, kResponseAnimationTranslateLeftDuration)),
        // Animate the opacity.
        CreateLayerAnimationSequence(
            // Pause...
            ui::LayerAnimationElement::CreatePauseElement(
                ui::LayerAnimationElement::AnimatableProperty::OPACITY,
-               kMoleculeIconAnimationFadeOutDelay),
+               kResponseAnimationFadeOutDelay),
            // ...then fade out...
-           CreateOpacityElement(0.f, kMoleculeIconAnimationFadeOutDuration),
+           CreateOpacityElement(0.f, kResponseAnimationFadeOutDuration),
            // ...hold...
            ui::LayerAnimationElement::CreatePauseElement(
                ui::LayerAnimationElement::AnimatableProperty::OPACITY,
-               kMoleculeIconAnimationFadeInDelay),
+               kResponseAnimationFadeInDelay),
            // ...and fade back in.
-           CreateOpacityElement(1.f, kMoleculeIconAnimationFadeInDuration))});
+           CreateOpacityElement(1.f, kResponseAnimationFadeInDuration))});
 }
 
 void AssistantHeaderView::OnUiVisibilityChanged(bool visible,
                                                 AssistantSource source) {
-  // Only when the Assistant UI is being hidden do we need to restore the
-  // initial state for the next session.
-  if (visible)
-    return;
+  if (visible) {
+    // When Assistant UI is shown and the motion spec is enabled, we animate in
+    // the appearance of the molecule icon.
+    if (assistant::ui::kIsMotionSpecEnabled) {
+      using namespace assistant::util;
 
+      // We're going to animate the molecule icon up into position so we'll need
+      // to apply an initial transformation.
+      gfx::Transform transform;
+      transform.Translate(0, kAppearAnimationTranslationUpDip);
+
+      // Set up our pre-animation values.
+      molecule_icon_->layer()->SetOpacity(0.f);
+      molecule_icon_->layer()->SetTransform(transform);
+
+      // Start animating molecule icon.
+      molecule_icon_->layer()->GetAnimator()->StartTogether(
+          {// Animate the transformation.
+           CreateLayerAnimationSequence(CreateTransformElement(
+               gfx::Transform(), kAppearAnimationTranslateUpDuration,
+               gfx::Tween::Type::FAST_OUT_SLOW_IN_2)),
+           // Animate the opacity to 100% with delay.
+           CreateLayerAnimationSequence(
+               ui::LayerAnimationElement::CreatePauseElement(
+                   ui::LayerAnimationElement::AnimatableProperty::OPACITY,
+                   kAppearAnimationFadeInDelay),
+               CreateOpacityElement(1.f, kAppearAnimationFadeInDuration))});
+    }
+    return;
+  }
+
+  // When Assistant UI is hidden, we restore initial state for the next session.
   is_first_response_ = true;
 
+  if (!assistant::ui::kIsMotionSpecEnabled) {
+    layout_manager_->set_cross_axis_alignment(
+        views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER);
+
+    // Force a layout/paint pass.
+    Layout();
+    SchedulePaint();
+  }
+
   molecule_icon_->layer()->SetTransform(gfx::Transform());
-  greeting_label_->SetVisible(true);
-  progress_indicator_->SetVisible(false);
 }
 
 }  // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_header_view.h b/ash/assistant/ui/main_stage/assistant_header_view.h
index 172823ab..3a2f8f9 100644
--- a/ash/assistant/ui/main_stage/assistant_header_view.h
+++ b/ash/assistant/ui/main_stage/assistant_header_view.h
@@ -12,17 +12,15 @@
 
 namespace views {
 class BoxLayout;
-class Label;
 }  // namespace views
 
 namespace ash {
 
 class AssistantController;
-class AssistantProgressIndicator;
 class BaseLogoView;
 
 // AssistantHeaderView is the child of UiElementContainerView which provides
-// the Assistant icon. On first launch, it also displays a greeting to the user.
+// the Assistant icon.
 class AssistantHeaderView : public views::View,
                             public AssistantInteractionModelObserver,
                             public AssistantUiModelObserver {
@@ -32,7 +30,6 @@
 
   // views::View:
   gfx::Size CalculatePreferredSize() const override;
-  int GetHeightForWidth(int width) const override;
   void ChildVisibilityChanged(views::View* child) override;
 
   // AssistantInteractionModelObserver:
@@ -49,8 +46,6 @@
 
   views::BoxLayout* layout_manager_;  // Owned by view hierarchy.
   BaseLogoView* molecule_icon_;       // Owned by view hierarchy.
-  views::Label* greeting_label_;      // Owned by view hierarchy.
-  AssistantProgressIndicator* progress_indicator_;  // Owned by view hierarchy.
 
   // True if this is the first query response received for the current Assistant
   // UI session, false otherwise.
diff --git a/ash/assistant/ui/main_stage/assistant_main_stage.cc b/ash/assistant/ui/main_stage/assistant_main_stage.cc
index 0bab4b62..e9da888b 100644
--- a/ash/assistant/ui/main_stage/assistant_main_stage.cc
+++ b/ash/assistant/ui/main_stage/assistant_main_stage.cc
@@ -8,15 +8,20 @@
 #include "ash/assistant/assistant_interaction_controller.h"
 #include "ash/assistant/assistant_ui_controller.h"
 #include "ash/assistant/ui/assistant_ui_constants.h"
+#include "ash/assistant/ui/main_stage/assistant_footer_view.h"
+#include "ash/assistant/ui/main_stage/assistant_progress_indicator.h"
 #include "ash/assistant/ui/main_stage/assistant_query_view.h"
-#include "ash/assistant/ui/main_stage/suggestion_container_view.h"
 #include "ash/assistant/ui/main_stage/ui_element_container_view.h"
 #include "ash/assistant/util/animation_util.h"
+#include "ash/strings/grit/ash_strings.h"
 #include "base/bind.h"
 #include "base/time/time.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "ui/compositor/callback_layer_animation_observer.h"
 #include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animator.h"
+#include "ui/views/border.h"
+#include "ui/views/controls/label.h"
 #include "ui/views/layout/box_layout.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/layout_manager.h"
@@ -25,6 +30,11 @@
 
 namespace {
 
+// Appearance.
+constexpr int kGreetingLabelMarginTopDip = 32;
+constexpr int kProgressIndicatorMarginLeftDip = 32;
+constexpr int kProgressIndicatorMarginTopDip = 40;
+
 // Animation.
 // TODO(dmblack): Rename these constants to refer to the specific views they are
 // animating to avoid confusion.
@@ -44,22 +54,41 @@
 constexpr base::TimeDelta kAnimationTranslateUpDuration =
     base::TimeDelta::FromMilliseconds(333);
 
+// Footer animation.
+constexpr int kFooterAnimationTranslationDip = 22;
+constexpr base::TimeDelta kFooterAnimationTranslationDelay =
+    base::TimeDelta::FromMilliseconds(66);
+constexpr base::TimeDelta kFooterAnimationTranslationDuration =
+    base::TimeDelta::FromMilliseconds(416);
+constexpr base::TimeDelta kFooterAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(149);
+constexpr base::TimeDelta kFooterAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(250);
+constexpr base::TimeDelta kFooterAnimationFadeOutDuration =
+    base::TimeDelta::FromMilliseconds(100);
+
+// Greeting animation.
+constexpr base::TimeDelta kGreetingAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(33);
+constexpr base::TimeDelta kGreetingAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(167);
+constexpr base::TimeDelta kGreetingAnimationFadeOutDuration =
+    base::TimeDelta::FromMilliseconds(83);
+constexpr base::TimeDelta kGreetingAnimationTranslateUpDuration =
+    base::TimeDelta::FromMilliseconds(250);
+constexpr int kGreetingAnimationTranslationDip = 115;
+
 // Pending query animation.
 constexpr base::TimeDelta kPendingQueryAnimationFadeInDuration =
     base::TimeDelta::FromMilliseconds(433);
 
-// Suggestion container animation.
-constexpr int kSuggestionContainerAnimationTranslationDip = 22;
-constexpr base::TimeDelta kSuggestionContainerAnimationTranslationDelay =
-    base::TimeDelta::FromMilliseconds(66);
-constexpr base::TimeDelta kSuggestionContainerAnimationTranslationDuration =
-    base::TimeDelta::FromMilliseconds(416);
-constexpr base::TimeDelta kSuggestionContainerAnimationFadeInDelay =
-    base::TimeDelta::FromMilliseconds(149);
-constexpr base::TimeDelta kSuggestionContainerAnimationFadeInDuration =
-    base::TimeDelta::FromMilliseconds(250);
-constexpr base::TimeDelta kSuggestionContainerAnimationFadeOutDuration =
-    base::TimeDelta::FromMilliseconds(100);
+// Progress animation.
+constexpr base::TimeDelta kProgressAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(233);
+constexpr base::TimeDelta kProgressAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(167);
+constexpr base::TimeDelta kProgressAnimationFadeOutDuration =
+    base::TimeDelta::FromMilliseconds(83);
 
 // StackLayout -----------------------------------------------------------------
 
@@ -123,13 +152,13 @@
               /*animation_ended_callback=*/base::BindRepeating(
                   &AssistantMainStage::OnActiveQueryExitAnimationEnded,
                   base::Unretained(this)))),
-      suggestion_container_animation_observer_(
+      footer_animation_observer_(
           std::make_unique<ui::CallbackLayerAnimationObserver>(
               /*animation_started_callback=*/base::BindRepeating(
-                  &AssistantMainStage::OnSuggestionContainerAnimationStarted,
+                  &AssistantMainStage::OnFooterAnimationStarted,
                   base::Unretained(this)),
               /*animation_ended_callback=*/base::BindRepeating(
-                  &AssistantMainStage::OnSuggestionContainerAnimationEnded,
+                  &AssistantMainStage::OnFooterAnimationEnded,
                   base::Unretained(this)))) {
   InitLayout(assistant_controller);
 
@@ -155,7 +184,7 @@
 
 void AssistantMainStage::OnViewBoundsChanged(views::View* view) {
   if (view == active_query_view_) {
-    UpdateActiveQueryViewSpacer();
+    UpdateTopPadding();
   } else if (view == committed_query_view_) {
     UpdateQueryViewTransform(committed_query_view_);
   } else if (view == pending_query_view_) {
@@ -187,45 +216,40 @@
 
   InitContentLayoutContainer(assistant_controller);
   InitQueryLayoutContainer(assistant_controller);
+  InitOverlayLayoutContainer();
 }
 
 void AssistantMainStage::InitContentLayoutContainer(
     AssistantController* assistant_controller) {
-  // Note that we will observe children of |content_layout_container| to handle
+  // Note that we will observe children of |content_layout_container_| to handle
   // preferred size and visibility change events in AssistantMainStage. This is
-  // necessary because |content_layout_container| may not change size in
+  // necessary because |content_layout_container_| may not change size in
   // response to these events, necessitating an explicit layout pass.
-  views::View* content_layout_container = new views::View();
+  content_layout_container_ = new views::View();
 
-  views::BoxLayout* layout_manager = content_layout_container->SetLayoutManager(
-      std::make_unique<views::BoxLayout>(
-          views::BoxLayout::Orientation::kVertical));
-
-  // Active query spacer.
-  // Note: This view reserves layout space for |active_query_view_|,
-  // dynamically mirroring its preferred size and visibility.
-  active_query_view_spacer_ = new views::View();
-  active_query_view_spacer_->AddObserver(this);
-  content_layout_container->AddChildView(active_query_view_spacer_);
+  views::BoxLayout* layout_manager =
+      content_layout_container_->SetLayoutManager(
+          std::make_unique<views::BoxLayout>(
+              views::BoxLayout::Orientation::kVertical));
 
   // UI element container.
   ui_element_container_ = new UiElementContainerView(assistant_controller);
   ui_element_container_->AddObserver(this);
-  content_layout_container->AddChildView(ui_element_container_);
+  content_layout_container_->AddChildView(ui_element_container_);
 
   layout_manager->SetFlexForView(ui_element_container_, 1);
 
-  // Suggestion container.
-  suggestion_container_ = new SuggestionContainerView(assistant_controller);
-  suggestion_container_->AddObserver(this);
+  // Footer.
+  footer_ = new AssistantFooterView(assistant_controller);
+  footer_->AddObserver(this);
 
-  // The suggestion container will be animated on its own layer.
-  suggestion_container_->SetPaintToLayer();
-  suggestion_container_->layer()->SetFillsBoundsOpaquely(false);
+  // The footer will be animated on its own layer.
+  footer_->SetPaintToLayer();
+  footer_->layer()->SetFillsBoundsOpaquely(false);
 
-  content_layout_container->AddChildView(suggestion_container_);
+  content_layout_container_->AddChildView(footer_);
 
-  AddChildView(content_layout_container);
+  AddChildView(content_layout_container_);
 }
 
 void AssistantMainStage::InitQueryLayoutContainer(
@@ -242,7 +266,105 @@
   AddChildView(query_layout_container_);
 }
 
+void AssistantMainStage::InitOverlayLayoutContainer() {
+  // The overlay layout container is a view which is laid out on top of both
+  // the content and query layout containers. As such, its children appear over
+  // top of and do not cause repositioning to any of content/query layout's
+  // underlying views. Events pass through the overlay layout container.
+  overlay_layout_container_ = new views::View();
+  overlay_layout_container_->set_can_process_events_within_subtree(false);
+  overlay_layout_container_->SetLayoutManager(std::make_unique<StackLayout>());
+
+  // Greeting label.
+  greeting_label_ = new views::Label(
+      l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_PROMPT_DEFAULT));
+  greeting_label_->SetAutoColorReadabilityEnabled(false);
+  greeting_label_->SetBorder(views::CreateEmptyBorder(/*top=*/32, 0, 0, 0));
+  greeting_label_->SetEnabledColor(kTextColorPrimary);
+  greeting_label_->SetFontList(
+      assistant::ui::GetDefaultFontList()
+          .DeriveWithSizeDelta(8)
+          .DeriveWithWeight(gfx::Font::Weight::MEDIUM));
+  greeting_label_->SetHorizontalAlignment(
+      gfx::HorizontalAlignment::ALIGN_CENTER);
+  greeting_label_->SetMultiLine(true);
+
+  // The greeting label will be animated on its own layer.
+  greeting_label_->SetPaintToLayer();
+  greeting_label_->layer()->SetFillsBoundsOpaquely(false);
+
+  overlay_layout_container_->AddChildView(greeting_label_);
+
+  // Progress indicator.
+  progress_indicator_ = new AssistantProgressIndicator();
+  progress_indicator_->SetBorder(
+      views::CreateEmptyBorder(kProgressIndicatorMarginTopDip, 0, 0, 0));
+
+  // The progress indicator will be animated on its own layer.
+  progress_indicator_->SetPaintToLayer();
+  progress_indicator_->layer()->SetFillsBoundsOpaquely(false);
+  progress_indicator_->layer()->SetOpacity(0.f);
+
+  overlay_layout_container_->AddChildView(progress_indicator_);
+
+  AddChildView(overlay_layout_container_);
+}
+
 void AssistantMainStage::OnCommittedQueryChanged(const AssistantQuery& query) {
+  // When the motion spec is disabled and a query is committed, we...
+  if (!assistant::ui::kIsMotionSpecEnabled) {
+    // ...hide the greeting label...
+    greeting_label_->layer()->SetOpacity(0.f);
+
+    const int overlay_width = overlay_layout_container_->width();
+    const int indicator_width = progress_indicator_->width();
+    const int translation = -(overlay_width - indicator_width) / 2 +
+                            kProgressIndicatorMarginLeftDip;
+
+    gfx::Transform transform;
+    transform.Translate(translation, 0);
+
+    // ...and show the progress indicator, having translated it from being
+    // center aligned, to left aligned in its parent.
+    progress_indicator_->layer()->SetTransform(transform);
+    progress_indicator_->layer()->SetOpacity(1.f);
+  } else {
+    // When the motion spec is enabled we...
+    using namespace assistant::util;
+
+    if (is_first_query_) {
+      // ...hide the greeting label (for the first query)...
+      greeting_label_->layer()->GetAnimator()->StartAnimation(
+          CreateLayerAnimationSequence(
+              CreateOpacityElement(0.f, kGreetingAnimationFadeOutDuration)));
+    }
+
+    // ...and always show the progress indicator.
+    progress_indicator_->layer()->GetAnimator()->StartAnimation(
+        CreateLayerAnimationSequence(
+            // Delay...
+            ui::LayerAnimationElement::CreatePauseElement(
+                ui::LayerAnimationElement::AnimatableProperty::OPACITY,
+                kProgressAnimationFadeInDelay),
+            // ...then fade in.
+            CreateOpacityElement(1.f, kProgressAnimationFadeInDuration)));
+
+    // After the first query, the progress indicator should be left aligned.
+    if (!is_first_query_) {
+      const int overlay_width = overlay_layout_container_->width();
+      const int indicator_width = progress_indicator_->width();
+      const int translation = -(overlay_width - indicator_width) / 2 +
+                              kProgressIndicatorMarginLeftDip;
+
+      gfx::Transform transform;
+      transform.Translate(translation, 0);
+
+      progress_indicator_->layer()->SetTransform(transform);
+    }
+  }
+
+  is_first_query_ = false;
+
   // The pending query has been committed. Update our pointers.
   committed_query_view_ = pending_query_view_;
   pending_query_view_ = nullptr;
@@ -294,8 +416,8 @@
              CreateOpacityElement(1.f, kAnimationFadeInDuration))});
   }
 
-  UpdateActiveQueryViewSpacer();
-  UpdateSuggestionContainer();
+  UpdateTopPadding();
+  UpdateFooter();
 }
 
 void AssistantMainStage::OnActiveQueryCleared() {
@@ -339,7 +461,7 @@
     const ui::CallbackLayerAnimationObserver& observer) {
   // The exited active query view will always be the first child of its parent.
   delete query_layout_container_->child_at(0);
-  UpdateActiveQueryViewSpacer();
+  UpdateTopPadding();
 
   // Return false to prevent the observer from destroying itself.
   return false;
@@ -377,7 +499,7 @@
               CreateOpacityElement(1.f, kPendingQueryAnimationFadeInDuration)));
     }
 
-    UpdateSuggestionContainer();
+    UpdateFooter();
   }
 
   pending_query_view_->SetQuery(query);
@@ -390,24 +512,66 @@
   }
 
   // If the pending query is cleared but a committed query exists, we don't
-  // need to update the suggestions container because the suggestion container
-  // visibility state should not have changed.
+  // need to update the footer because the footer visibility state should not
+  // have changed.
   if (!committed_query_view_)
-    UpdateSuggestionContainer();
+    UpdateFooter();
 }
 
 void AssistantMainStage::OnResponseChanged(const AssistantResponse& response) {
+  // When the response changes, we hide the progress indicator.
+  if (!assistant::ui::kIsMotionSpecEnabled) {
+    progress_indicator_->layer()->SetOpacity(0.f);
+    return;
+  }
+
+  // Animate the progress indicator to 0% opacity.
+  using namespace assistant::util;
+  progress_indicator_->layer()->GetAnimator()->StartAnimation(
+      CreateLayerAnimationSequence(
+          CreateOpacityElement(0.f, kProgressAnimationFadeOutDuration)));
+
   // If the motion spec is enabled, we only consider the query active once
   // the response has been received. When the motion spec is disabled, we
   // immediately activate the query as it is committed.
-  if (assistant::ui::kIsMotionSpecEnabled)
-    OnActivateQuery();
+  OnActivateQuery();
 }
 
 void AssistantMainStage::OnUiVisibilityChanged(bool visible,
                                                AssistantSource source) {
-  if (visible)
+  if (visible) {
+    // When Assistant UI is shown and the motion spec is enabled, we animate in
+    // the appearance of the greeting label.
+    if (assistant::ui::kIsMotionSpecEnabled) {
+      using namespace assistant::util;
+
+      // We're going to animate the greeting label up into position so we'll
+      // need to apply an initial transformation.
+      gfx::Transform transform;
+      transform.Translate(0, kGreetingAnimationTranslationDip);
+
+      // Set up or pre-animation values.
+      greeting_label_->layer()->SetOpacity(0.f);
+      greeting_label_->layer()->SetTransform(transform);
+
+      // Start animating greeting label.
+      greeting_label_->layer()->GetAnimator()->StartTogether(
+          {// Animate the transformation.
+           CreateLayerAnimationSequence(CreateTransformElement(
+               gfx::Transform(), kGreetingAnimationTranslateUpDuration,
+               gfx::Tween::Type::FAST_OUT_SLOW_IN_2)),
+           // Animate the opacity to 100% with delay.
+           CreateLayerAnimationSequence(
+               ui::LayerAnimationElement::CreatePauseElement(
+                   ui::LayerAnimationElement::AnimatableProperty::OPACITY,
+                   kGreetingAnimationFadeInDelay),
+               CreateOpacityElement(1.f, kGreetingAnimationFadeInDuration))});
+    }
     return;
+  }
+
+  // When Assistant UI is hidden, we restore initial state for the next session.
+  is_first_query_ = true;
 
   delete active_query_view_;
   active_query_view_ = nullptr;
@@ -418,15 +582,39 @@
   delete pending_query_view_;
   pending_query_view_ = nullptr;
 
-  UpdateActiveQueryViewSpacer();
-  UpdateSuggestionContainer();
+  greeting_label_->layer()->SetOpacity(1.f);
+
+  progress_indicator_->layer()->SetOpacity(0.f);
+  progress_indicator_->layer()->SetTransform(gfx::Transform());
+
+  UpdateTopPadding();
+  UpdateFooter();
 }
 
-void AssistantMainStage::UpdateActiveQueryViewSpacer() {
-  // The spacer reserves room in the layout for the active query view, so it
-  // needs to match its size.
-  active_query_view_spacer_->SetPreferredSize(
-      active_query_view_ ? active_query_view_->size() : gfx::Size());
+void AssistantMainStage::UpdateTopPadding() {
+  // We need to apply top padding to the content and overlay layout containers
+  // to reserve space for the active query view.
+  const int top_padding = active_query_view_ ? active_query_view_->height() : 0;
+
+  // Apply top padding to the content layout container by applying an empty
+  // border to the UI element container, its first child.
+  ui_element_container_->SetBorder(
+      views::CreateEmptyBorder(top_padding, 0, 0, 0));
+
+  // Force a layout/paint pass.
+  content_layout_container_->Layout();
+  content_layout_container_->SchedulePaint();
+
+  // Apply top padding to the overlay layout container by applying an empty
+  // border to its children.
+  greeting_label_->SetBorder(views::CreateEmptyBorder(
+      kGreetingLabelMarginTopDip + top_padding, 0, 0, 0));
+  progress_indicator_->SetBorder(views::CreateEmptyBorder(
+      kProgressIndicatorMarginTopDip + top_padding, 0, 0, 0));
+
+  // Force a layout/paint pass.
+  overlay_layout_container_->Layout();
+  overlay_layout_container_->SchedulePaint();
 }
 
 void AssistantMainStage::UpdateQueryViewTransform(views::View* query_view) {
@@ -444,75 +632,72 @@
   query_view->layer()->SetTransform(transform);
 }
 
-void AssistantMainStage::UpdateSuggestionContainer() {
-  // The suggestion container is only visible when the committed/pending query
-  // views are not. When it is not visible, it should not process events.
+void AssistantMainStage::UpdateFooter() {
+  // The footer is only visible when the committed/pending query views are not.
+  // When it is not visible, it should not process events.
   bool visible = !committed_query_view_ && !pending_query_view_;
 
   if (!assistant::ui::kIsMotionSpecEnabled) {
-    suggestion_container_->layer()->SetOpacity(visible ? 1.f : 0.f);
-    suggestion_container_->set_can_process_events_within_subtree(
-        visible ? true : false);
+    footer_->layer()->SetOpacity(visible ? 1.f : 0.f);
+    footer_->set_can_process_events_within_subtree(visible ? true : false);
     return;
   }
 
   using namespace assistant::util;
 
   if (visible) {
-    // The suggestion container will animate up into position so we need to set
-    // an initial offset transformation from which to animate.
+    // The footer will animate up into position so we need to set an initial
+    // offset transformation from which to animate.
     gfx::Transform transform;
-    transform.Translate(0, kSuggestionContainerAnimationTranslationDip);
-    suggestion_container_->layer()->SetTransform(transform);
+    transform.Translate(0, kFooterAnimationTranslationDip);
+    footer_->layer()->SetTransform(transform);
 
-    // Animate the entry of the suggestion container.
+    // Animate the entry of the footer.
     StartLayerAnimationSequencesTogether(
-        suggestion_container_->layer()->GetAnimator(),
+        footer_->layer()->GetAnimator(),
         {// Animate the translation with delay.
          CreateLayerAnimationSequence(
              ui::LayerAnimationElement::CreatePauseElement(
                  ui::LayerAnimationElement::AnimatableProperty::TRANSFORM,
-                 kSuggestionContainerAnimationTranslationDelay),
-             CreateTransformElement(
-                 gfx::Transform(),
-                 kSuggestionContainerAnimationTranslationDuration,
-                 gfx::Tween::Type::FAST_OUT_SLOW_IN_2)),
+                 kFooterAnimationTranslationDelay),
+             CreateTransformElement(gfx::Transform(),
+                                    kFooterAnimationTranslationDuration,
+                                    gfx::Tween::Type::FAST_OUT_SLOW_IN_2)),
          // Animate the fade in with delay.
          CreateLayerAnimationSequence(
              ui::LayerAnimationElement::CreatePauseElement(
                  ui::LayerAnimationElement::AnimatableProperty::OPACITY,
-                 kSuggestionContainerAnimationFadeInDelay),
-             CreateOpacityElement(
-                 1.f, kSuggestionContainerAnimationFadeInDuration))},
+                 kFooterAnimationFadeInDelay),
+             CreateOpacityElement(1.f, kFooterAnimationFadeInDuration))},
         // Observer animation start/end events.
-        suggestion_container_animation_observer_.get());
+        footer_animation_observer_.get());
   } else {
-    // Animate the exit of the suggestion container.
+    // Animate the exit of the footer.
     StartLayerAnimationSequence(
-        suggestion_container_->layer()->GetAnimator(),
+        footer_->layer()->GetAnimator(),
         // Animate fade out.
-        CreateLayerAnimationSequence(CreateOpacityElement(
-            0.f, kSuggestionContainerAnimationFadeOutDuration)),
+        CreateLayerAnimationSequence(
+            CreateOpacityElement(0.f, kFooterAnimationFadeOutDuration)),
         // Observe animation start/end events.
-        suggestion_container_animation_observer_.get());
+        footer_animation_observer_.get());
   }
 
   // Set the observer to active so that we'll receive start/end events.
-  suggestion_container_animation_observer_->SetActive();
+  footer_animation_observer_->SetActive();
 }
 
-void AssistantMainStage::OnSuggestionContainerAnimationStarted(
+void AssistantMainStage::OnFooterAnimationStarted(
     const ui::CallbackLayerAnimationObserver& observer) {
-  // The suggestion container should not process events while animating.
-  suggestion_container_->set_can_process_events_within_subtree(false);
+  // The footer should not process events while animating.
+  footer_->set_can_process_events_within_subtree(false);
 }
 
-bool AssistantMainStage::OnSuggestionContainerAnimationEnded(
+bool AssistantMainStage::OnFooterAnimationEnded(
     const ui::CallbackLayerAnimationObserver& observer) {
-  // The suggestion container should only process events when visible. It is
-  // only visible when there is no committed or pending query view.
-  suggestion_container_->set_can_process_events_within_subtree(
-      !committed_query_view_ && !pending_query_view_);
+  // The footer should only process events when visible. It is only visible when
+  // there is no committed or pending query view.
+  footer_->set_can_process_events_within_subtree(!committed_query_view_ &&
+                                                 !pending_query_view_);
 
   // Return false so that the observer does not destroy itself.
   return false;
diff --git a/ash/assistant/ui/main_stage/assistant_main_stage.h b/ash/assistant/ui/main_stage/assistant_main_stage.h
index 32615823..c388ecc 100644
--- a/ash/assistant/ui/main_stage/assistant_main_stage.h
+++ b/ash/assistant/ui/main_stage/assistant_main_stage.h
@@ -17,11 +17,16 @@
 class CallbackLayerAnimationObserver;
 }  // namespace ui
 
+namespace views {
+class Label;
+}  // namespace views
+
 namespace ash {
 
 class AssistantController;
+class AssistantFooterView;
+class AssistantProgressIndicator;
 class AssistantQueryView;
-class SuggestionContainerView;
 class UiElementContainerView;
 
 // AssistantMainStage is the child of AssistantMainView responsible for
@@ -57,38 +62,49 @@
   void InitLayout(AssistantController* assistant_controller);
   void InitContentLayoutContainer(AssistantController* assistant_controller);
   void InitQueryLayoutContainer(AssistantController* assistant_controller);
+  void InitOverlayLayoutContainer();
 
-  void UpdateActiveQueryViewSpacer();
+  void UpdateTopPadding();
   void UpdateQueryViewTransform(views::View* query_view);
-  void UpdateSuggestionContainer();
+  void UpdateFooter();
 
   void OnActivateQuery();
   void OnActiveQueryCleared();
   bool OnActiveQueryExitAnimationEnded(
       const ui::CallbackLayerAnimationObserver& observer);
 
-  void OnSuggestionContainerAnimationStarted(
+  void OnFooterAnimationStarted(
       const ui::CallbackLayerAnimationObserver& observer);
-  bool OnSuggestionContainerAnimationEnded(
+  bool OnFooterAnimationEnded(
       const ui::CallbackLayerAnimationObserver& observer);
 
   AssistantController* const assistant_controller_;  // Owned by Shell.
 
-  views::View* active_query_view_spacer_;          // Owned by view hierarchy.
-  views::View* query_layout_container_;            // Owned by view hierarchy.
-  SuggestionContainerView* suggestion_container_;  // Owned by view hierarchy.
-  UiElementContainerView* ui_element_container_;   // Owned by view hierarchy.
+  // Content layout container and children. Owned by view hierarchy.
+  views::View* content_layout_container_;
+  UiElementContainerView* ui_element_container_;
+  AssistantFooterView* footer_;
 
-  // Owned by view hierarchy.
+  // Query layout container and children. Owned by view hierarchy.
+  views::View* query_layout_container_;
   AssistantQueryView* active_query_view_ = nullptr;
   AssistantQueryView* committed_query_view_ = nullptr;
   AssistantQueryView* pending_query_view_ = nullptr;
 
+  // Overlay layout container and children. Owned by view hierarchy.
+  views::View* overlay_layout_container_;
+  views::Label* greeting_label_;
+  AssistantProgressIndicator* progress_indicator_;
+
   std::unique_ptr<ui::CallbackLayerAnimationObserver>
       active_query_exit_animation_observer_;
 
   std::unique_ptr<ui::CallbackLayerAnimationObserver>
-      suggestion_container_animation_observer_;
+      footer_animation_observer_;
+
+  // True if this is the first query received for the current Assistant UI
+  // session, false otherwise.
+  bool is_first_query_ = true;
 
   DISALLOW_COPY_AND_ASSIGN(AssistantMainStage);
 };
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.cc b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
new file mode 100644
index 0000000..5c9cfee5
--- /dev/null
+++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.cc
@@ -0,0 +1,143 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/assistant/ui/main_stage/assistant_opt_in_view.h"
+
+#include <memory>
+#include <vector>
+
+#include "ash/assistant/ui/assistant_ui_constants.h"
+#include "ash/strings/grit/ash_strings.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/color_palette.h"
+#include "ui/views/controls/styled_label.h"
+#include "ui/views/layout/box_layout.h"
+
+namespace ash {
+
+namespace {
+
+// Appearance.
+constexpr int kPreferredHeightDip = 32;
+
+// Helpers ---------------------------------------------------------------------
+
+views::StyledLabel::RangeStyleInfo CreateStyleInfo(
+    gfx::Font::Weight weight = gfx::Font::Weight::NORMAL) {
+  views::StyledLabel::RangeStyleInfo style;
+  style.custom_font = assistant::ui::GetDefaultFontList()
+                          .DeriveWithSizeDelta(2)
+                          .DeriveWithWeight(weight);
+  style.override_color = SK_ColorWHITE;
+  return style;
+}
+
+// AssistantOptInContainer -----------------------------------------------------
+
+class AssistantOptInContainer : public views::View {
+ public:
+  AssistantOptInContainer() = default;
+  ~AssistantOptInContainer() override = default;
+
+  // views::View:
+  gfx::Size CalculatePreferredSize() const override {
+    const int preferred_width = views::View::CalculatePreferredSize().width();
+    return gfx::Size(preferred_width, GetHeightForWidth(preferred_width));
+  }
+
+  int GetHeightForWidth(int width) const override {
+    return kPreferredHeightDip;
+  }
+
+  void ChildPreferredSizeChanged(views::View* child) override {
+    PreferredSizeChanged();
+  }
+
+  void OnPaintBackground(gfx::Canvas* canvas) override {
+    cc::PaintFlags flags;
+    flags.setAntiAlias(true);
+    flags.setColor(gfx::kGoogleBlue500);
+    canvas->DrawRoundRect(GetContentsBounds(), height() / 2, flags);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(AssistantOptInContainer);
+};
+
+}  // namespace
+
+// AssistantOptInView ----------------------------------------------------------
+
+AssistantOptInView::AssistantOptInView() {
+  InitLayout();
+}
+
+AssistantOptInView::~AssistantOptInView() = default;
+
+void AssistantOptInView::ChildPreferredSizeChanged(views::View* child) {
+  PreferredSizeChanged();
+}
+
+void AssistantOptInView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
+  label_->SizeToFit(width());
+}
+
+void AssistantOptInView::InitLayout() {
+  views::BoxLayout* layout_manager =
+      SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::Orientation::kHorizontal));
+
+  layout_manager->set_cross_axis_alignment(
+      views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_END);
+
+  layout_manager->set_main_axis_alignment(
+      views::BoxLayout::MainAxisAlignment::MAIN_AXIS_ALIGNMENT_CENTER);
+
+  // Container.
+  AssistantOptInContainer* container = new AssistantOptInContainer();
+
+  layout_manager =
+      container->SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::Orientation::kHorizontal,
+          gfx::Insets(0, kPaddingDip)));
+
+  layout_manager->set_cross_axis_alignment(
+      views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER);
+
+  AddChildView(container);
+
+  // Label.
+  label_ = new views::StyledLabel(base::string16(), /*listener=*/nullptr);
+  label_->set_auto_color_readability_enabled(false);
+  label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER);
+
+  // First substitution string: "Unlock more Assistant features."
+  const base::string16 unlock_features =
+      l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_OPT_IN_UNLOCK_MORE_FEATURES);
+
+  // Second substitution string: "Get Started".
+  const base::string16 get_started =
+      l10n_util::GetStringUTF16(IDS_ASH_ASSISTANT_OPT_IN_GET_STARTED);
+
+  // Set the text, having replaced placeholders in the opt in prompt with
+  // substitution strings and caching their offset positions for styling.
+  std::vector<size_t> offsets;
+  label_->SetText(l10n_util::GetStringFUTF16(
+      IDS_ASH_ASSISTANT_OPT_IN_PROMPT, unlock_features, get_started, &offsets));
+
+  // Style the first substitution string.
+  label_->AddStyleRange(
+      gfx::Range(offsets.at(0), offsets.at(0) + unlock_features.length()),
+      CreateStyleInfo());
+
+  // Style the second substitution string.
+  label_->AddStyleRange(
+      gfx::Range(offsets.at(1), offsets.at(1) + get_started.length()),
+      CreateStyleInfo(gfx::Font::Weight::BOLD));
+
+  container->AddChildView(label_);
+}
+
+}  // namespace ash
diff --git a/ash/assistant/ui/main_stage/assistant_opt_in_view.h b/ash/assistant/ui/main_stage/assistant_opt_in_view.h
new file mode 100644
index 0000000..ad133aa
--- /dev/null
+++ b/ash/assistant/ui/main_stage/assistant_opt_in_view.h
@@ -0,0 +1,36 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_OPT_IN_VIEW_H_
+#define ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_OPT_IN_VIEW_H_
+
+#include "base/macros.h"
+#include "ui/views/view.h"
+
+namespace views {
+class StyledLabel;
+}  // namespace views
+
+namespace ash {
+
+class AssistantOptInView : public views::View {
+ public:
+  AssistantOptInView();
+  ~AssistantOptInView() override;
+
+  // views::View:
+  void ChildPreferredSizeChanged(views::View* child) override;
+  void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
+
+ private:
+  void InitLayout();
+
+  views::StyledLabel* label_;  // Owned by view hierarchy.
+
+  DISALLOW_COPY_AND_ASSIGN(AssistantOptInView);
+};
+
+}  // namespace ash
+
+#endif  // ASH_ASSISTANT_UI_MAIN_STAGE_ASSISTANT_OPT_IN_VIEW_H_
diff --git a/ash/assistant/ui/main_stage/assistant_progress_indicator.cc b/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
index 6eff37731..0fe8546e 100644
--- a/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
+++ b/ash/assistant/ui/main_stage/assistant_progress_indicator.cc
@@ -97,9 +97,20 @@
   VisibilityChanged(/*starting_from=*/this, /*is_visible=*/false);
 }
 
+void AssistantProgressIndicator::OnLayerOpacityChanged(
+    ui::PropertyChangeReason reason) {
+  VisibilityChanged(/*starting_from=*/this,
+                    /*is_visible=*/layer()->opacity() > 0.f);
+}
+
 void AssistantProgressIndicator::VisibilityChanged(views::View* starting_from,
                                                    bool is_visible) {
-  if (!is_visible) {
+  if (is_visible == is_visible_)
+    return;
+
+  is_visible_ = is_visible;
+
+  if (!is_visible_) {
     // Stop all animations.
     for (int i = 0; i < child_count(); ++i) {
       child_at(i)->layer()->GetAnimator()->StopAnimating();
diff --git a/ash/assistant/ui/main_stage/assistant_progress_indicator.h b/ash/assistant/ui/main_stage/assistant_progress_indicator.h
index 0dd8f74..c19abc8 100644
--- a/ash/assistant/ui/main_stage/assistant_progress_indicator.h
+++ b/ash/assistant/ui/main_stage/assistant_progress_indicator.h
@@ -20,11 +20,16 @@
   // views::View:
   void AddedToWidget() override;
   void RemovedFromWidget() override;
+  void OnLayerOpacityChanged(ui::PropertyChangeReason reason) override;
   void VisibilityChanged(views::View* starting_from, bool is_visible) override;
 
  private:
   void InitLayout();
 
+  // Caches the last call to VisibilityChanged. Because we trigger this event
+  // artificially, we want to make sure that we don't over trigger.
+  bool is_visible_;
+
   DISALLOW_COPY_AND_ASSIGN(AssistantProgressIndicator);
 };
 
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc
index 3fd1959..fa4b36ab 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.cc
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -18,6 +18,8 @@
 #include "base/time/time.h"
 #include "base/unguessable_token.h"
 #include "ui/aura/window.h"
+#include "ui/compositor/callback_layer_animation_observer.h"
+#include "ui/compositor/layer_animation_element.h"
 #include "ui/compositor/layer_animator.h"
 #include "ui/views/controls/native/native_view_host.h"
 #include "ui/views/layout/box_layout.h"
@@ -33,9 +35,17 @@
 // Appearance.
 constexpr int kPaddingHorizontalDip = 32;
 
-// Animation.
+// Card element animation.
 constexpr float kCardElementAnimationFadeOutOpacity = 0.26f;
+
+// Text element animation.
 constexpr float kTextElementAnimationFadeOutOpacity = 0.f;
+
+// UI element animation.
+constexpr base::TimeDelta kUiElementAnimationFadeInDelay =
+    base::TimeDelta::FromMilliseconds(83);
+constexpr base::TimeDelta kUiElementAnimationFadeInDuration =
+    base::TimeDelta::FromMilliseconds(250);
 constexpr base::TimeDelta kUiElementAnimationFadeOutDuration =
     base::TimeDelta::FromMilliseconds(167);
 
@@ -103,6 +113,11 @@
 UiElementContainerView::UiElementContainerView(
     AssistantController* assistant_controller)
     : assistant_controller_(assistant_controller),
+      ui_elements_exit_animation_observer_(
+          std::make_unique<ui::CallbackLayerAnimationObserver>(
+              /*animation_ended_callback=*/base::BindRepeating(
+                  &UiElementContainerView::OnAllUiElementsExitAnimationEnded,
+                  base::Unretained(this)))),
       render_request_weak_factory_(this) {
   InitLayout();
 
@@ -153,19 +168,38 @@
 
 void UiElementContainerView::OnResponseChanged(
     const AssistantResponse& response) {
-  OnResponseCleared();
-
-  for (const std::unique_ptr<AssistantUiElement>& ui_element :
-       response.GetUiElements()) {
-    // If we are processing a UI element we need to pend the incoming elements
-    // instead of handling them immediately.
-    if (is_processing_ui_element_) {
-      pending_ui_element_list_.push_back(ui_element.get());
-      continue;
-    }
-
-    OnUiElementAdded(ui_element.get());
+  // If the motion spec is disabled, we clear any previous response and then
+  // add the new response in a single step.
+  if (!assistant::ui::kIsMotionSpecEnabled) {
+    OnResponseCleared();
+    OnResponseAdded(response);
+    return;
   }
+
+  // If the motion spec is enabled but we haven't cached any layers, there is
+  // nothing to animate off stage so we can proceed to add the new response.
+  if (ui_element_layers_.empty()) {
+    OnResponseAdded(response);
+    return;
+  }
+
+  using namespace assistant::util;
+
+  // There is a previous response on stage, so we'll animate it off before
+  // adding the new response. The new response will be added upon invocation of
+  // the exit animation ended callback.
+  for (const std::pair<ui::Layer*, float> pair : ui_element_layers_) {
+    StartLayerAnimationSequence(
+        pair.first->GetAnimator(),
+        // Fade out the opacity to 0%.
+        CreateLayerAnimationSequence(
+            CreateOpacityElement(0.f, kUiElementAnimationFadeOutDuration)),
+        // Observe the animation.
+        ui_elements_exit_animation_observer_.get());
+  }
+
+  // Set the observer to active so that we receive callback events.
+  ui_elements_exit_animation_observer_->SetActive();
 }
 
 void UiElementContainerView::OnResponseCleared() {
@@ -186,6 +220,65 @@
   SetProcessingUiElement(false);
 }
 
+void UiElementContainerView::OnResponseAdded(
+    const AssistantResponse& response) {
+  for (const std::unique_ptr<AssistantUiElement>& ui_element :
+       response.GetUiElements()) {
+    // If we are processing a UI element we need to pend the incoming elements
+    // instead of handling them immediately.
+    if (is_processing_ui_element_) {
+      pending_ui_element_list_.push_back(ui_element.get());
+      continue;
+    }
+    OnUiElementAdded(ui_element.get());
+  }
+
+  // If we're no longer processing any UI elements, then all UI elements have
+  // been successfully added.
+  if (!is_processing_ui_element_)
+    OnAllUiElementsAdded();
+}
+
+void UiElementContainerView::OnAllUiElementsAdded() {
+  DCHECK(!is_processing_ui_element_);
+
+  // If the motion spec is disabled, there's nothing to do because the views
+  // do not need to be animated in.
+  if (!assistant::ui::kIsMotionSpecEnabled)
+    return;
+
+  using namespace assistant::util;
+
+  // Now that we've received and added all UI elements for the current query
+  // response, we can animate them in.
+  for (const std::pair<ui::Layer*, float>& pair : ui_element_layers_) {
+    // We fade in the views to full opacity after a slight delay.
+    pair.first->GetAnimator()->StartAnimation(CreateLayerAnimationSequence(
+        ui::LayerAnimationElement::CreatePauseElement(
+            ui::LayerAnimationElement::AnimatableProperty::OPACITY,
+            kUiElementAnimationFadeInDelay),
+        CreateOpacityElement(1.f, kUiElementAnimationFadeInDuration)));
+  }
+}
+
+bool UiElementContainerView::OnAllUiElementsExitAnimationEnded(
+    const ui::CallbackLayerAnimationObserver& observer) {
+  // All UI elements have finished their exit animations so its safe to perform
+  // clearing of their views and managed resources.
+  OnResponseCleared();
+
+  const AssistantResponse* response =
+      assistant_controller_->interaction_controller()->model()->response();
+
+  // If there is a response present (and there should be), it is safe to add it
+  // now that we've cleared the previous content from the stage.
+  if (response)
+    OnResponseAdded(*response);
+
+  // Return false to prevent the observer from destroying itself.
+  return false;
+}
+
 void UiElementContainerView::OnUiElementAdded(
     const AssistantUiElement* ui_element) {
   switch (ui_element->GetType()) {
@@ -259,8 +352,13 @@
 
     if (assistant::ui::kIsMotionSpecEnabled) {
       // The view will be animated on its own layer, so we need to do some
-      // initial layer setup and cache the layer with its desired opacity.
+      // initial layer setup. We're going to fade the view in, so hide it.
       view_holder->native_view()->layer()->SetFillsBoundsOpaquely(false);
+      view_holder->native_view()->layer()->SetOpacity(0.f);
+
+      // We cache the layer for the view for use during animations and cache
+      // its desired opacity that we'll animate to while processing the next
+      // query response.
       ui_element_layers_.push_back(
           std::pair<ui::Layer*, float>(view_holder->native_view()->layer(),
                                        kCardElementAnimationFadeOutOpacity));
@@ -283,9 +381,14 @@
 
   if (assistant::ui::kIsMotionSpecEnabled) {
     // The view will be animated on its own layer, so we need to do some initial
-    // layer setup and cache the layer with its desired opacity.
+    // layer setup. We're going to fade the view in, so hide it.
     text_element_view->SetPaintToLayer();
     text_element_view->layer()->SetFillsBoundsOpaquely(false);
+    text_element_view->layer()->SetOpacity(0.f);
+
+    // We cache the layer for the view for use during animations and cache its
+    // desired opacity that we'll animate to while processing the next query
+    // response.
     ui_element_layers_.push_back(std::pair<ui::Layer*, float>(
         text_element_view->layer(), kTextElementAnimationFadeOutOpacity));
   }
@@ -308,11 +411,18 @@
 }
 
 void UiElementContainerView::ProcessPendingUiElements() {
+  DCHECK(!is_processing_ui_element_);
+
   while (!is_processing_ui_element_ && !pending_ui_element_list_.empty()) {
     const AssistantUiElement* ui_element = pending_ui_element_list_.front();
     pending_ui_element_list_.pop_front();
     OnUiElementAdded(ui_element);
   }
+
+  // If we're no longer processing any UI elements, then all UI elements have
+  // been successfully added.
+  if (!is_processing_ui_element_)
+    OnAllUiElementsAdded();
 }
 
 void UiElementContainerView::ReleaseAllCards() {
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.h b/ash/assistant/ui/main_stage/ui_element_container_view.h
index 3d747f7..e38ae3f 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.h
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.h
@@ -13,6 +13,10 @@
 #include "base/macros.h"
 #include "ui/views/view.h"
 
+namespace ui {
+class CallbackLayerAnimationObserver;
+}  // namespace ui
+
 namespace ash {
 
 class AssistantCardElement;
@@ -43,6 +47,10 @@
  private:
   void InitLayout();
 
+  void OnResponseAdded(const AssistantResponse& response);
+  void OnAllUiElementsAdded();
+  bool OnAllUiElementsExitAnimationEnded(
+      const ui::CallbackLayerAnimationObserver& observer);
   void OnUiElementAdded(const AssistantUiElement* ui_element);
   void OnCardElementAdded(const AssistantCardElement* card_element);
   void OnCardReady(const base::Optional<base::UnguessableToken>& embed_token);
@@ -73,9 +81,13 @@
   bool is_processing_ui_element_ = false;
 
   // UI elements will be animated on their own layers. We track the desired
-  // opacity to which each layer should be animated.
+  // opacity to which each layer should be animated when processing the next
+  // query response.
   std::vector<std::pair<ui::Layer*, float>> ui_element_layers_;
 
+  std::unique_ptr<ui::CallbackLayerAnimationObserver>
+      ui_elements_exit_animation_observer_;
+
   // Weak pointer factory used for card rendering requests.
   base::WeakPtrFactory<UiElementContainerView> render_request_weak_factory_;
 
diff --git a/ash/components/cursor/cursor_view.cc b/ash/components/cursor/cursor_view.cc
index ba4bc771..e7e1f5e 100644
--- a/ash/components/cursor/cursor_view.cc
+++ b/ash/components/cursor/cursor_view.cc
@@ -4,7 +4,7 @@
 
 #include "ash/components/cursor/cursor_view.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "cc/paint/paint_canvas.h"
 #include "ui/aura/window.h"
diff --git a/ash/components/strings/ash_components_strings_fa.xtb b/ash/components/strings/ash_components_strings_fa.xtb
index 8dd0f35..9886e75 100644
--- a/ash/components/strings/ash_components_strings_fa.xtb
+++ b/ash/components/strings/ash_components_strings_fa.xtb
@@ -67,7 +67,7 @@
 <translation id="344577624355799426"><ph name="ALT" /> یا <ph name="SEARCH" /><ph name="SEPARATOR" /><ph name="DOWN" /></translation>
 <translation id="353037708190149633">ذخیره تمام صفحات باز پنجره کنونی شما در پوشه به‌عنوان نشانک</translation>
 <translation id="355103131818127604">بازکردن پیوند در برگه جدیدی در پس‌زمینه</translation>
-<translation id="3622741593887335780">بزرگ کردن (وقتی ذره‌بین متصل یا ذره‌بین تمام‌صفحه فعال است)</translation>
+<translation id="3622741593887335780">بزرگ‌نمایی (وقتی ذره‌بین متصل یا ذره‌بین تمام‌صفحه فعال است)</translation>
 <translation id="3649256019230929621">بازکردن پنجره در حداقل اندازه</translation>
 <translation id="3655154169297074232">برگه‌ها و پنجره‌ها</translation>
 <translation id="3668361878347172356">انجام مجدد آخرین عمل</translation>
@@ -129,7 +129,7 @@
 <translation id="6228457605945141550">کم کردن روشنایی</translation>
 <translation id="6276708887952587684">مشاهده منبع صفحه</translation>
 <translation id="6321940490215594447">باز کردن صفحه سابقه</translation>
-<translation id="6340769215862220182">بزرگ کردن صفحه‌نمایش</translation>
+<translation id="6340769215862220182">بزرگ‌نمایی صفحه‌نمایش</translation>
 <translation id="6359811074279051077"><ph name="MODIFIER" /><ph name="SEPARATOR" /><ph name="KEY" /></translation>
 <translation id="6395172954772765143">انتخاب نوشتار تا انتهای خط</translation>
 <translation id="6419237577786823024"><ph name="CTRL1" /><ph name="SEPARATOR1" /><ph name="LEFT" /> یا <ph name="CTRL2" /><ph name="SEPARATOR2" /><ph name="RIGHT" /></translation>
diff --git a/ash/display/display_color_manager.cc b/ash/display/display_color_manager.cc
index 5ae485d..d68a8b8 100644
--- a/ash/display/display_color_manager.cc
+++ b/ash/display/display_color_manager.cc
@@ -14,7 +14,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/quirks/quirks_manager.h"
diff --git a/ash/display/display_color_manager_unittest.cc b/ash/display/display_color_manager_unittest.cc
index f1c82bd4..4eeeb4f 100644
--- a/ash/display/display_color_manager_unittest.cc
+++ b/ash/display/display_color_manager_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/strings/pattern.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_path_override.h"
 #include "base/test/scoped_task_environment.h"
 #include "chromeos/chromeos_paths.h"
diff --git a/ash/display/screen_ash.cc b/ash/display/screen_ash.cc
index 5154b7e..28a23d3 100644
--- a/ash/display/screen_ash.cc
+++ b/ash/display/screen_ash.cc
@@ -10,6 +10,7 @@
 #include "ash/root_window_settings.h"
 #include "ash/shelf/shelf_widget.h"
 #include "ash/shell.h"
+#include "ash/shell_state.h"
 #include "ash/wm/root_window_finder.h"
 #include "base/command_line.h"
 #include "base/logging.h"
@@ -68,6 +69,9 @@
   display::Display GetPrimaryDisplay() const override {
     return primary_display_;
   }
+  display::Display GetDisplayForNewWindows() const override {
+    return primary_display_;
+  }
   void AddObserver(display::DisplayObserver* observer) override {
     NOTREACHED() << "Observer should not be added during shutdown";
   }
@@ -168,6 +172,11 @@
       WindowTreeHostManager::GetPrimaryDisplayId());
 }
 
+display::Display ScreenAsh::GetDisplayForNewWindows() const {
+  return GetDisplayNearestWindow(
+      Shell::Get()->shell_state()->GetRootWindowForNewWindows());
+}
+
 void ScreenAsh::AddObserver(display::DisplayObserver* observer) {
   GetDisplayManager()->AddObserver(observer);
 }
diff --git a/ash/display/screen_ash.h b/ash/display/screen_ash.h
index e0b4693..209fe4a 100644
--- a/ash/display/screen_ash.h
+++ b/ash/display/screen_ash.h
@@ -42,6 +42,7 @@
   display::Display GetDisplayMatching(
       const gfx::Rect& match_rect) const override;
   display::Display GetPrimaryDisplay() const override;
+  display::Display GetDisplayForNewWindows() const override;
   void AddObserver(display::DisplayObserver* observer) override;
   void RemoveObserver(display::DisplayObserver* observer) override;
 
diff --git a/ash/display/screen_ash_unittest.cc b/ash/display/screen_ash_unittest.cc
index 584e2001..76c3dd7 100644
--- a/ash/display/screen_ash_unittest.cc
+++ b/ash/display/screen_ash_unittest.cc
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "ash/scoped_root_window_for_new_windows.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
 #include "ui/aura/test/test_window_delegate.h"
@@ -31,4 +32,19 @@
                             gfx::Point(250, 260)));
 }
 
+TEST_F(ScreenAshTest, GetDisplayForNewWindows) {
+  UpdateDisplay("200x200,400x400");
+  display::Screen* screen = display::Screen::GetScreen();
+  const std::vector<display::Display> displays = screen->GetAllDisplays();
+  ASSERT_EQ(2u, displays.size());
+
+  // The display for new windows defaults to primary display.
+  EXPECT_EQ(displays[0].id(), screen->GetDisplayForNewWindows().id());
+
+  // The display for new windows is updated when the root window for new windows
+  // changes.
+  ScopedRootWindowForNewWindows scoped_root(Shell::GetAllRootWindows()[1]);
+  EXPECT_EQ(displays[1].id(), screen->GetDisplayForNewWindows().id());
+}
+
 }  // namespace ash
diff --git a/ash/frame/header_view.cc b/ash/frame/header_view.cc
index 20b1089..5afacb4 100644
--- a/ash/frame/header_view.cc
+++ b/ash/frame/header_view.cc
@@ -250,7 +250,8 @@
 void HeaderView::OnTabletModeEnded() {
   caption_button_container_->UpdateCaptionButtonState(true /*=animate*/);
   parent()->Layout();
-  target_widget_->non_client_view()->Layout();
+  if (target_widget_->non_client_view())
+    target_widget_->non_client_view()->Layout();
 }
 
 void HeaderView::OnWindowPropertyChanged(aura::Window* window,
diff --git a/ash/keyboard/arc/BUILD.gn b/ash/keyboard/arc/BUILD.gn
index f2488da..7e69efe7 100644
--- a/ash/keyboard/arc/BUILD.gn
+++ b/ash/keyboard/arc/BUILD.gn
@@ -6,6 +6,8 @@
 
 static_library("arc") {
   sources = [
+    "arc_input_method_surface_manager.cc",
+    "arc_input_method_surface_manager.h",
     "arc_virtual_keyboard_container_layout_manager.cc",
     "arc_virtual_keyboard_container_layout_manager.h",
   ]
@@ -13,6 +15,7 @@
   deps = [
     "//ash/public/cpp",
     "//base",
+    "//components/exo",
     "//ui/aura",
     "//ui/gfx/geometry",
   ]
diff --git a/ash/keyboard/arc/arc_input_method_surface_manager.cc b/ash/keyboard/arc/arc_input_method_surface_manager.cc
new file mode 100644
index 0000000..7cc8486
--- /dev/null
+++ b/ash/keyboard/arc/arc_input_method_surface_manager.cc
@@ -0,0 +1,28 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/keyboard/arc/arc_input_method_surface_manager.h"
+
+namespace ash {
+
+exo::InputMethodSurface* ArcInputMethodSurfaceManager::GetSurface() const {
+  return input_method_surface_;
+}
+
+void ArcInputMethodSurfaceManager::AddSurface(
+    exo::InputMethodSurface* surface) {
+  DCHECK_EQ(input_method_surface_, nullptr);
+  input_method_surface_ = surface;
+}
+
+void ArcInputMethodSurfaceManager::RemoveSurface(
+    exo::InputMethodSurface* surface) {
+  DLOG_IF(ERROR, input_method_surface_ != surface)
+      << "Can't remove not registered surface";
+
+  if (input_method_surface_ == surface)
+    input_method_surface_ = nullptr;
+}
+
+}  // namespace ash
diff --git a/ash/keyboard/arc/arc_input_method_surface_manager.h b/ash/keyboard/arc/arc_input_method_surface_manager.h
new file mode 100644
index 0000000..1d174ca
--- /dev/null
+++ b/ash/keyboard/arc/arc_input_method_surface_manager.h
@@ -0,0 +1,35 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_KEYBOARD_ARC_ARC_INPUT_METHOD_SURFACE_MANAGER_H_
+#define ASH_KEYBOARD_ARC_ARC_INPUT_METHOD_SURFACE_MANAGER_H_
+
+#include "base/macros.h"
+#include "base/observer_list.h"
+#include "components/exo/input_method_surface_manager.h"
+
+namespace ash {
+
+class ArcInputMethodSurfaceManager : public exo::InputMethodSurfaceManager {
+ public:
+  ArcInputMethodSurfaceManager() = default;
+  ~ArcInputMethodSurfaceManager() override = default;
+
+  // TODO(yhanada): Observer surface addition and removal from
+  // ArcInputMethodManagerService.
+
+  // exo::InputMethodSurfaceManager:
+  exo::InputMethodSurface* GetSurface() const override;
+  void AddSurface(exo::InputMethodSurface* surface) override;
+  void RemoveSurface(exo::InputMethodSurface* surface) override;
+
+ private:
+  exo::InputMethodSurface* input_method_surface_ = nullptr;  // Not owned
+
+  DISALLOW_COPY_AND_ASSIGN(ArcInputMethodSurfaceManager);
+};
+
+}  // namespace ash
+
+#endif  // ASH_KEYBOARD_ARC_ARC_INPUT_METHOD_SURFACE_MANAGER_H_
diff --git a/ash/keyboard/arc/arc_input_method_surface_manager_unittest.cc b/ash/keyboard/arc/arc_input_method_surface_manager_unittest.cc
new file mode 100644
index 0000000..5d7967b
--- /dev/null
+++ b/ash/keyboard/arc/arc_input_method_surface_manager_unittest.cc
@@ -0,0 +1,49 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/keyboard/arc/arc_input_method_surface_manager.h"
+#include "ash/test/ash_test_base.h"
+#include "base/macros.h"
+#include "components/exo/input_method_surface.h"
+#include "components/exo/surface.h"
+#include "components/exo/wm_helper.h"
+
+namespace ash {
+
+class ArcInputMethodSurfaceManagerTest : public AshTestBase {
+ public:
+  ArcInputMethodSurfaceManagerTest() = default;
+  ~ArcInputMethodSurfaceManagerTest() override = default;
+
+  void SetUp() override {
+    AshTestBase::SetUp();
+    wm_helper_ = std::make_unique<exo::WMHelper>();
+    exo::WMHelper::SetInstance(wm_helper_.get());
+  }
+
+  void TearDown() override {
+    exo::WMHelper::SetInstance(nullptr);
+    wm_helper_.reset();
+    AshTestBase::TearDown();
+  }
+
+ private:
+  std::unique_ptr<exo::WMHelper> wm_helper_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcInputMethodSurfaceManagerTest);
+};
+
+TEST_F(ArcInputMethodSurfaceManagerTest, AddRemoveSurface) {
+  ArcInputMethodSurfaceManager manager;
+  EXPECT_EQ(nullptr, manager.GetSurface());
+  auto surface = std::make_unique<exo::Surface>();
+  auto input_method_surface =
+      std::make_unique<exo::InputMethodSurface>(nullptr, surface.get(), 1.0);
+  manager.AddSurface(input_method_surface.get());
+  EXPECT_EQ(input_method_surface.get(), manager.GetSurface());
+  manager.RemoveSurface(input_method_surface.get());
+  EXPECT_EQ(nullptr, manager.GetSurface());
+}
+
+}  // namespace ash
diff --git a/ash/login/ui/animated_rounded_image_view.cc b/ash/login/ui/animated_rounded_image_view.cc
index 9ff6f1d8..28321c76 100644
--- a/ash/login/ui/animated_rounded_image_view.cc
+++ b/ash/login/ui/animated_rounded_image_view.cc
@@ -47,19 +47,22 @@
 AnimatedRoundedImageView::~AnimatedRoundedImageView() = default;
 
 void AnimatedRoundedImageView::SetAnimationDecoder(
-    std::unique_ptr<AnimationDecoder> decoder) {
+    std::unique_ptr<AnimationDecoder> decoder,
+    Playback playback) {
   decoder_ = std::move(decoder);
+  playback_ = playback;
   // Force a new decode and repaint.
   frames_scale_ = NAN;
   SchedulePaint();
 }
 
 void AnimatedRoundedImageView::SetImage(const gfx::ImageSkia& image) {
-  SetAnimationDecoder(std::make_unique<SingleFrameImageDecoder>(image));
+  SetAnimationDecoder(std::make_unique<SingleFrameImageDecoder>(image),
+                      Playback::kFirstFrameOnly);
 }
 
-void AnimatedRoundedImageView::SetAnimationEnabled(bool enabled) {
-  should_animate_ = enabled;
+void AnimatedRoundedImageView::SetAnimationPlayback(Playback playback) {
+  playback_ = playback;
   StartOrStopAnimation();
 }
 
@@ -100,7 +103,7 @@
 void AnimatedRoundedImageView::StartOrStopAnimation() {
   // If animation is disabled or if there are less than 2 frames, show a static
   // image.
-  if (!should_animate_ || frames_.size() < 2) {
+  if (playback_ == Playback::kFirstFrameOnly || frames_.size() < 2) {
     active_frame_ = 0;
     update_frame_timer_.Stop();
     SchedulePaint();
@@ -119,11 +122,14 @@
   active_frame_ = (active_frame_ + 1) % frames_.size();
   SchedulePaint();
 
-  // Schedule next frame update.
-  update_frame_timer_.Start(
-      FROM_HERE, frames_[active_frame_].duration,
-      base::BindRepeating(&AnimatedRoundedImageView::UpdateAnimationFrame,
-                          base::Unretained(this)));
+  if (static_cast<size_t>(active_frame_ + 1) < frames_.size() ||
+      playback_ == Playback::kRepeat) {
+    // Schedule next frame update.
+    update_frame_timer_.Start(
+        FROM_HERE, frames_[active_frame_].duration,
+        base::BindRepeating(&AnimatedRoundedImageView::UpdateAnimationFrame,
+                            base::Unretained(this)));
+  }
 }
 
 void AnimatedRoundedImageView::BuildAnimationFrames(float image_scale) {
diff --git a/ash/login/ui/animated_rounded_image_view.h b/ash/login/ui/animated_rounded_image_view.h
index a1be7b10..42cd7fa 100644
--- a/ash/login/ui/animated_rounded_image_view.h
+++ b/ash/login/ui/animated_rounded_image_view.h
@@ -21,6 +21,12 @@
 // A custom image view with rounded edges.
 class AnimatedRoundedImageView : public views::View {
  public:
+  enum class Playback {
+    kFirstFrameOnly,  // Only the first frame in the animation will be shown.
+    kSingle,          // Play the animation only once.
+    kRepeat,          // Play the animation repeatly.
+  };
+
   // Provides animation frames.
   class AnimationDecoder {
    public:
@@ -33,14 +39,15 @@
   AnimatedRoundedImageView(const gfx::Size& size, int corner_radius);
   ~AnimatedRoundedImageView() override;
 
-  // Show an animation.
-  void SetAnimationDecoder(std::unique_ptr<AnimationDecoder> decoder);
+  // Show an animation with specified playback mode.
+  void SetAnimationDecoder(std::unique_ptr<AnimationDecoder> decoder,
+                           Playback playback);
 
   // Show a static image.
   void SetImage(const gfx::ImageSkia& image);
 
-  // Start or stop animation.
-  void SetAnimationEnabled(bool enabled);
+  // Set playback type of the animation.
+  void SetAnimationPlayback(Playback playback);
 
   // views::View:
   gfx::Size CalculatePreferredSize() const override;
@@ -51,10 +58,6 @@
   void UpdateAnimationFrame();
   void BuildAnimationFrames(float image_scale);
 
-  // If true and there are multiple frames, the animation will play. If false,
-  // only the first frame in the animation will be shown.
-  bool should_animate_ = false;
-
   // Currently displayed animation frame.
   int active_frame_ = 0;
 
@@ -64,6 +67,8 @@
   float frames_scale_ = NAN;
   // The raw decoded animation frames.
   AnimationFrames frames_;
+  // Animation playback type.
+  Playback playback_ = Playback::kFirstFrameOnly;
 
   const gfx::Size image_size_;
   const int corner_radius_;
diff --git a/ash/login/ui/horizontal_image_sequence_animation_decoder.cc b/ash/login/ui/horizontal_image_sequence_animation_decoder.cc
new file mode 100644
index 0000000..9d82994
--- /dev/null
+++ b/ash/login/ui/horizontal_image_sequence_animation_decoder.cc
@@ -0,0 +1,45 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/login/ui/horizontal_image_sequence_animation_decoder.h"
+
+namespace ash {
+
+HorizontalImageSequenceAnimationDecoder::
+    HorizontalImageSequenceAnimationDecoder(const gfx::ImageSkia& image,
+                                            base::TimeDelta duration,
+                                            int num_frames)
+    : image_(image), duration_(duration), num_frames_(num_frames) {}
+
+HorizontalImageSequenceAnimationDecoder::
+    ~HorizontalImageSequenceAnimationDecoder() = default;
+
+AnimationFrames HorizontalImageSequenceAnimationDecoder::Decode(
+    float image_scale) {
+  SkBitmap bitmap = image_.GetRepresentation(image_scale).sk_bitmap();
+
+  float frame_width = static_cast<float>(bitmap.width()) / num_frames_;
+  base::TimeDelta frame_duration = duration_ / num_frames_;
+
+  AnimationFrames animation;
+  animation.reserve(num_frames_);
+  for (int i = 0; i < num_frames_; ++i) {
+    // Get the subsection of the animation strip.
+    SkBitmap frame_bitmap;
+    bitmap.extractSubset(
+        &frame_bitmap,
+        SkIRect::MakeXYWH(std::round(i * frame_width), 0,
+                          std::round(frame_width), bitmap.height()));
+
+    // Add an animation frame.
+    AnimationFrame frame;
+    frame.duration = frame_duration;
+    frame.image = gfx::ImageSkia::CreateFrom1xBitmap(frame_bitmap);
+    animation.push_back(frame);
+  }
+
+  return animation;
+}
+
+}  // namespace ash
diff --git a/ash/login/ui/horizontal_image_sequence_animation_decoder.h b/ash/login/ui/horizontal_image_sequence_animation_decoder.h
new file mode 100644
index 0000000..74d7ca73
--- /dev/null
+++ b/ash/login/ui/horizontal_image_sequence_animation_decoder.h
@@ -0,0 +1,46 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_LOGIN_UI_HORIZONTAL_IMAGE_SEQUENCE_ANIMATION_DECODER_H_
+#define ASH_LOGIN_UI_HORIZONTAL_IMAGE_SEQUENCE_ANIMATION_DECODER_H_
+
+#include "ash/login/ui/animated_rounded_image_view.h"
+
+namespace ash {
+
+// Decodes an animation strip that is laid out 1xN (ie, the image grows in
+// width, not height). There is no padding between frames in the animation
+// strip.
+//
+// As an example, if the following ASCII art is 100 pixels wide, it has 4 frames
+// each 25 pixels wide. The frames go from [0, 25), [25, 50), [50, 75), [75,
+// 100). All frames have the same height of 25 pixels.
+//
+//    [1][2][3][4]
+//
+class HorizontalImageSequenceAnimationDecoder
+    : public AnimatedRoundedImageView::AnimationDecoder {
+ public:
+  HorizontalImageSequenceAnimationDecoder(const gfx::ImageSkia& image,
+                                          base::TimeDelta duration,
+                                          int num_frames);
+  ~HorizontalImageSequenceAnimationDecoder() override;
+
+  // AnimatedRoundedImageView::AnimationDecoder:
+  AnimationFrames Decode(float image_scale) override;
+
+ private:
+  // The animation image source.
+  gfx::ImageSkia image_;
+  // The total duration of the animation.
+  base::TimeDelta duration_;
+  // The total number of frames in the animation.
+  int num_frames_;
+
+  DISALLOW_COPY_AND_ASSIGN(HorizontalImageSequenceAnimationDecoder);
+};
+
+}  // namespace ash
+
+#endif  // ASH_LOGIN_UI_HORIZONTAL_IMAGE_SEQUENCE_ANIMATION_DECODER_H_
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index de8f6515..af79f59 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -89,26 +89,10 @@
 constexpr char kLockContentsViewName[] = "LockContentsView";
 constexpr char kAuthErrorContainerName[] = "AuthErrorContainer";
 
-// A view which stores two preferred sizes. The embedder can control which one
-// is used.
-class MultiSizedView : public views::View {
- public:
-  MultiSizedView(const gfx::Size& a, const gfx::Size& b) : a_(a), b_(b) {}
-  ~MultiSizedView() override = default;
-
-  void SwapPreferredSizeTo(bool use_a) {
-    if (use_a)
-      SetPreferredSize(a_);
-    else
-      SetPreferredSize(b_);
-  }
-
- private:
-  gfx::Size a_;
-  gfx::Size b_;
-
-  DISALLOW_COPY_AND_ASSIGN(MultiSizedView);
-};
+// Sets the preferred width for |view| with an arbitrary height.
+void SetPreferredWidthForView(views::View* view, int width) {
+  view->SetPreferredSize(gfx::Size(width, kNonEmptyHeightDp));
+}
 
 class AuthErrorLearnMoreButton : public views::Button,
                                  public views::ButtonListener {
@@ -218,6 +202,69 @@
   return user->basic_user_info->type == user_manager::USER_TYPE_PUBLIC_ACCOUNT;
 }
 
+//
+// Computes a layout described as follows:
+//
+//    l L R r
+//
+// L R go from [0, L/R_max_fixed_width]
+// l and r go from [0, inf]
+//
+// First, width is distributed to L and R up to their maximum widths. If there
+// is not enough width for them, space will be distributed evenly in the same
+// ratio as their original sizes.
+//
+// If L and R are at max width, l and r will receive all remaining space in the
+// specified relative weighting.
+//
+// l -> left_flex_weight
+// L -> left_max_fixed_width
+// R -> right_max_fixed_width
+// r -> right_flex_weight
+//
+// Output data is in the member variables.
+//
+struct MediumViewLayout {
+  MediumViewLayout(int width,
+                   int left_flex_weight,
+                   int left_max_fixed_width,
+                   int right_max_fixed_width,
+                   int right_flex_weight) {
+    // No space to distribute.
+    if (width <= 0)
+      return;
+
+    auto set_values_from_weight = [](int width, float weight_a, float weight_b,
+                                     int* value_a, int* value_b) {
+      float total_weight = weight_a + weight_b;
+      *value_a = width * (weight_a / total_weight);
+      // Subtract to avoid floating point rounding errors, ie, guarantee that
+      // that |value_a + value_b = width|.
+      *value_b = width - *value_a;
+    };
+
+    int flex_width = width - (left_max_fixed_width + right_max_fixed_width);
+    if (flex_width < 0) {
+      // No flex available, distribute to fixed width only
+      set_values_from_weight(width, left_max_fixed_width, right_max_fixed_width,
+                             &left_fixed_width, &right_fixed_width);
+      DCHECK_EQ(width, left_fixed_width + right_fixed_width);
+    } else {
+      // Flex is available; fixed goes to maximum size, extra goes to flex.
+      left_fixed_width = left_max_fixed_width;
+      right_fixed_width = right_max_fixed_width;
+      set_values_from_weight(flex_width, left_flex_weight, right_flex_weight,
+                             &left_flex_width, &right_flex_width);
+      DCHECK_EQ(flex_width, left_flex_width + right_flex_width);
+    }
+  }
+
+  int left_fixed_width = 0;
+  int right_fixed_width = 0;
+  int left_flex_width = 0;
+  int right_flex_width = 0;
+};
+
 }  // namespace
 
 LockContentsView::TestApi::TestApi(LockContentsView* view) : view_(view) {}
@@ -498,7 +545,7 @@
   main_view_->RemoveAllChildViews(true /*delete_children*/);
   opt_secondary_big_view_ = nullptr;
   users_list_ = nullptr;
-  rotation_actions_.clear();
+  layout_actions_.clear();
 
   // Build user state list. Preserve previous state if the user already exists.
   std::vector<UserState> new_users;
@@ -509,7 +556,6 @@
     else
       new_users.push_back(UserState(user));
   }
-
   users_ = std::move(new_users);
 
   // If there are no users, show gaia signin if login, otherwise crash.
@@ -521,26 +567,22 @@
     return;
   }
 
-  auto box_layout =
-      std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal);
-  main_layout_ = box_layout.get();
-  main_layout_->set_main_axis_alignment(
+  // Allocate layout and big user, which are common between all densities.
+  auto* main_layout = main_view_->SetLayoutManager(
+      std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal));
+  main_layout->set_main_axis_alignment(
       views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
-  main_layout_->set_cross_axis_alignment(
+  main_layout->set_cross_axis_alignment(
       views::BoxLayout::CROSS_AXIS_ALIGNMENT_CENTER);
-  main_view_->SetLayoutManager(std::move(box_layout));
-
-  // Add big user.
   primary_big_view_ = AllocateLoginBigUserView(users[0], true /*is_primary*/);
-  main_view_->AddChildView(primary_big_view_);
 
   // Build layout for additional users.
-  if (users.size() == 2)
+  if (users.size() <= 2)
     CreateLowDensityLayout(users);
   else if (users.size() >= 3 && users.size() <= 6)
     CreateMediumDensityLayout(users);
   else if (users.size() >= 7)
-    CreateHighDensityLayout(users);
+    CreateHighDensityLayout(users, main_layout);
 
   LayoutAuth(primary_big_view_, opt_secondary_big_view_, false /*animate*/);
 
@@ -863,8 +905,11 @@
 
 void LockContentsView::OnDisplayMetricsChanged(const display::Display& display,
                                                uint32_t changed_metrics) {
-  // Ignore all metric changes except rotation.
-  if ((changed_metrics & DISPLAY_METRIC_ROTATION) == 0)
+  // Ignore all metrics except for those listed in |filter|.
+  uint32_t filter = DISPLAY_METRIC_BOUNDS | DISPLAY_METRIC_WORK_AREA |
+                    DISPLAY_METRIC_DEVICE_SCALE_FACTOR |
+                    DISPLAY_METRIC_ROTATION;
+  if ((filter & changed_metrics) == 0)
     return;
 
   DoLayout();
@@ -929,81 +974,154 @@
 
 void LockContentsView::CreateLowDensityLayout(
     const std::vector<mojom::LoginUserInfoPtr>& users) {
-  DCHECK_EQ(users.size(), 2u);
+  DCHECK_LE(users.size(), 2u);
 
-  // Space between auth user and alternative user.
-  main_view_->AddChildView(MakeOrientationViewWithWidths(
-      kLowDensityDistanceBetweenUsersInLandscapeDp,
-      kLowDensityDistanceBetweenUsersInPortraitDp));
+  main_view_->AddChildView(primary_big_view_);
 
-  // Build auth user.
-  opt_secondary_big_view_ =
-      AllocateLoginBigUserView(users[1], false /*is_primary*/);
-  main_view_->AddChildView(opt_secondary_big_view_);
+  if (users.size() > 1) {
+    // Space between primary user and secondary user.
+    auto* spacing_middle = new NonAccessibleView();
+    main_view_->AddChildView(spacing_middle);
+
+    // Build secondary auth user.
+    opt_secondary_big_view_ =
+        AllocateLoginBigUserView(users[1], false /*is_primary*/);
+    main_view_->AddChildView(opt_secondary_big_view_);
+
+    // Set |spacing_middle| to the correct size. If there is less spacing
+    // available than desired, use up to the available.
+    AddDisplayLayoutAction(base::BindRepeating(
+        [](views::View* host_view, views::View* big_user_view,
+           views::View* spacing_middle, views::View* secondary_big_view,
+           bool landscape) {
+          int total_width = host_view->GetPreferredSize().width();
+          int available_width =
+              total_width - (big_user_view->GetPreferredSize().width() +
+                             secondary_big_view->GetPreferredSize().width());
+          if (available_width <= 0) {
+            SetPreferredWidthForView(spacing_middle, 0);
+            return;
+          }
+
+          int desired_width = landscape
+                                  ? kLowDensityDistanceBetweenUsersInLandscapeDp
+                                  : kLowDensityDistanceBetweenUsersInPortraitDp;
+          SetPreferredWidthForView(spacing_middle,
+                                   std::min(available_width, desired_width));
+        },
+        this, primary_big_view_, spacing_middle, opt_secondary_big_view_));
+  }
 }
 
 void LockContentsView::CreateMediumDensityLayout(
     const std::vector<mojom::LoginUserInfoPtr>& users) {
-  // Insert spacing before (left of) auth.
-  main_view_->AddChildViewAt(MakeOrientationViewWithWidths(
-                                 kMediumDensityMarginLeftOfAuthUserLandscapeDp,
-                                 kMediumDensityMarginLeftOfAuthUserPortraitDp),
-                             0);
-  // Insert spacing between auth and user list.
-  main_view_->AddChildView(MakeOrientationViewWithWidths(
-      kMediumDensityDistanceBetweenAuthUserAndUsersLandscapeDp,
-      kMediumDensityDistanceBetweenAuthUserAndUsersPortraitDp));
+  // Here is a diagram of this layout:
+  //
+  //    a A x B y b
+  //
+  // a, A: spacing_left
+  // x: primary_big_view_
+  // B: spacing_middle
+  // y: users_list_
+  // b: spacing_right
+  //
+  // A and B are fixed-width spaces; a and b are flexible space that consume any
+  // additional width.
+  //
+  // A and B are the reason for custom layout; no layout manager currently
+  // supports a fixed-width view that can shrink, but not grow (ie, bounds from
+  // [0,x]). Custom layout logic is used instead, which is contained inside of
+  // the AddDisplayLayoutAction call below.
 
+  // Construct instances.
+  auto* spacing_left = new NonAccessibleView();
+  auto* spacing_middle = new NonAccessibleView();
+  auto* spacing_right = new NonAccessibleView();
   users_list_ = BuildScrollableUsersListView(users, LoginDisplayStyle::kSmall);
-  main_view_->AddChildView(users_list_);
 
-  // Insert dynamic spacing on left/right of the content which changes based on
-  // screen rotation and display size.
-  auto* left = new NonAccessibleView();
-  main_view_->AddChildViewAt(left, 0);
-  auto* right = new NonAccessibleView();
-  main_view_->AddChildView(right);
-  AddRotationAction(base::BindRepeating(
-      [](views::BoxLayout* layout, views::View* left, views::View* right,
+  // Add views as described above.
+  main_view_->AddChildView(spacing_left);
+  main_view_->AddChildView(primary_big_view_);
+  main_view_->AddChildView(spacing_middle);
+  main_view_->AddChildView(users_list_);
+  main_view_->AddChildView(spacing_right);
+
+  // Set width for the |spacing_*| views.
+  AddDisplayLayoutAction(base::BindRepeating(
+      [](views::View* host_view, views::View* big_user_view,
+         views::View* users_list, views::View* spacing_left,
+         views::View* spacing_middle, views::View* spacing_right,
          bool landscape) {
-        if (landscape) {
-          layout->SetFlexForView(left, 1);
-          layout->SetFlexForView(right, 1);
-        } else {
-          layout->SetFlexForView(left, 2);
-          layout->SetFlexForView(right, 1);
-        }
+        int total_width = host_view->GetPreferredSize().width();
+        int available_width =
+            total_width - (big_user_view->GetPreferredSize().width() +
+                           users_list->GetPreferredSize().width());
+
+        int left_max_fixed_width =
+            landscape ? kMediumDensityMarginLeftOfAuthUserLandscapeDp
+                      : kMediumDensityMarginLeftOfAuthUserPortraitDp;
+        int right_max_fixed_width =
+            landscape ? kMediumDensityDistanceBetweenAuthUserAndUsersLandscapeDp
+                      : kMediumDensityDistanceBetweenAuthUserAndUsersPortraitDp;
+
+        int left_flex_weight = landscape ? 1 : 2;
+        int right_flex_weight = 1;
+
+        MediumViewLayout medium_layout(
+            available_width, left_flex_weight, left_max_fixed_width,
+            right_max_fixed_width, right_flex_weight);
+
+        SetPreferredWidthForView(
+            spacing_left,
+            medium_layout.left_flex_width + medium_layout.left_fixed_width);
+        SetPreferredWidthForView(spacing_middle,
+                                 medium_layout.right_fixed_width);
+        SetPreferredWidthForView(spacing_right, medium_layout.right_flex_width);
       },
-      main_layout_, left, right));
+      this, primary_big_view_, users_list_, spacing_left, spacing_middle,
+      spacing_right));
 }
 
 void LockContentsView::CreateHighDensityLayout(
-    const std::vector<mojom::LoginUserInfoPtr>& users) {
-  // Insert spacing before and after the auth view.
+    const std::vector<mojom::LoginUserInfoPtr>& users,
+    views::BoxLayout* main_layout) {
+  // Insert spacing before the auth view.
   auto* fill = new NonAccessibleView();
-  main_view_->AddChildViewAt(fill, 0);
-  main_layout_->SetFlexForView(fill, 1);
+  main_view_->AddChildView(fill);
+  main_layout->SetFlexForView(fill, 1);
 
+  main_view_->AddChildView(primary_big_view_);
+
+  // Insert spacing after the auth view.
   fill = new NonAccessibleView();
   main_view_->AddChildView(fill);
-  main_layout_->SetFlexForView(fill, 1);
+  main_layout->SetFlexForView(fill, 1);
 
   users_list_ =
       BuildScrollableUsersListView(users, LoginDisplayStyle::kExtraSmall);
   main_view_->AddChildView(users_list_);
+
+  // User list size may change after a display metric change.
+  AddDisplayLayoutAction(base::BindRepeating(
+      [](views::View* view, bool landscape) { view->SizeToPreferredSize(); },
+      users_list_));
 }
 
 void LockContentsView::DoLayout() {
-  bool landscape = login_views_utils::ShouldShowLandscape(GetWidget());
-  for (auto& action : rotation_actions_)
-    action.Run(landscape);
-
   const display::Display& display =
       display::Screen::GetScreen()->GetDisplayNearestWindow(
           GetWidget()->GetNativeWindow());
+
+  // Set preferred size before running layout actions, as layout actions may
+  // depend on the preferred size to determine layout.
   SetPreferredSize(display.size());
+
+  bool landscape = login_views_utils::ShouldShowLandscape(GetWidget());
+  for (auto& action : layout_actions_)
+    action.Run(landscape);
+
+  // SizeToPreferredSize will call Layout().
   SizeToPreferredSize();
-  Layout();
 }
 
 void LockContentsView::LayoutTopHeader() {
@@ -1027,18 +1145,10 @@
   expanded_view_->SetBoundsRect(bounds);
 }
 
-views::View* LockContentsView::MakeOrientationViewWithWidths(int landscape,
-                                                             int portrait) {
-  auto* view = new MultiSizedView(gfx::Size(landscape, kNonEmptyHeightDp),
-                                  gfx::Size(portrait, kNonEmptyHeightDp));
-  AddRotationAction(base::BindRepeating(&MultiSizedView::SwapPreferredSizeTo,
-                                        base::Unretained(view)));
-  return view;
-}
-
-void LockContentsView::AddRotationAction(const OnRotate& on_rotate) {
-  on_rotate.Run(login_views_utils::ShouldShowLandscape(GetWidget()));
-  rotation_actions_.push_back(on_rotate);
+void LockContentsView::AddDisplayLayoutAction(
+    const DisplayLayoutAction& layout_action) {
+  layout_action.Run(login_views_utils::ShouldShowLandscape(GetWidget()));
+  layout_actions_.push_back(layout_action);
 }
 
 void LockContentsView::SwapActiveAuthBetweenPrimaryAndSecondary(
@@ -1446,11 +1556,8 @@
       const bool is_keyboard_visible =
           keyboard_controller ? keyboard_controller->IsKeyboardVisible()
                               : false;
-      if (state->show_pin && !is_keyboard_visible &&
-          state->fingerprint_state ==
-              mojom::FingerprintUnlockState::UNAVAILABLE) {
+      if (state->show_pin && !is_keyboard_visible)
         to_update_auth |= LoginAuthUserView::AUTH_PIN;
-      }
       if (state->enable_tap_auth)
         to_update_auth |= LoginAuthUserView::AUTH_TAP;
       if (state->fingerprint_state !=
diff --git a/ash/login/ui/lock_contents_view.h b/ash/login/ui/lock_contents_view.h
index d702dcd..38df4973 100644
--- a/ash/login/ui/lock_contents_view.h
+++ b/ash/login/ui/lock_contents_view.h
@@ -213,7 +213,7 @@
     DISALLOW_COPY_AND_ASSIGN(UserState);
   };
 
-  using OnRotate = base::RepeatingCallback<void(bool landscape)>;
+  using DisplayLayoutAction = base::RepeatingCallback<void(bool landscape)>;
 
   // Focus the next/previous widget.
   void FocusNextWidget(bool reverse);
@@ -226,7 +226,8 @@
       const std::vector<mojom::LoginUserInfoPtr>& users);
   // 7+ users.
   void CreateHighDensityLayout(
-      const std::vector<mojom::LoginUserInfoPtr>& users);
+      const std::vector<mojom::LoginUserInfoPtr>& users,
+      views::BoxLayout* main_layout);
 
   // Lay out the entire view. This is called when the view is attached to a
   // widget and when the screen is rotated.
@@ -239,16 +240,9 @@
   // Lay out the expanded public session view.
   void LayoutPublicSessionView();
 
-  // Creates a new view with |landscape| and |portrait| preferred sizes.
-  // |landscape| and |portrait| specify the width of the preferred size; the
-  // height is an arbitrary non-zero value. The correct size is chosen
-  // dynamically based on screen orientation. The view will respond to
-  // orientation changes.
-  views::View* MakeOrientationViewWithWidths(int landscape, int portrait);
-
-  // Adds |on_rotate| to |rotation_actions_| and immediately executes it with
+  // Adds |layout_action| to |layout_actions_| and immediately executes it with
   // the current rotation.
-  void AddRotationAction(const OnRotate& on_rotate);
+  void AddDisplayLayoutAction(const DisplayLayoutAction& layout_action);
 
   // Change the active |auth_user_|. If |is_primary| is true, the active auth
   // switches to |opt_secondary_big_view_|. If |is_primary| is false, the active
@@ -376,12 +370,11 @@
 
   // Contains authentication user and the additional user views.
   NonAccessibleView* main_view_ = nullptr;
-  // Layout used for |main_view_|. Pointer owned by the View base class.
-  views::BoxLayout* main_layout_ = nullptr;
 
-  // Actions that should be executed when rotation changes. A full layout pass
-  // is performed after all actions are executed.
-  std::vector<OnRotate> rotation_actions_;
+  // Actions that should be executed before a new layout happens caused by a
+  // display change (eg. screen rotation). A full layout pass is performed after
+  // all actions are executed.
+  std::vector<DisplayLayoutAction> layout_actions_;
 
   ScopedObserver<display::Screen, display::DisplayObserver> display_observer_;
   ScopedSessionObserver session_observer_;
diff --git a/ash/login/ui/lock_contents_view_unittest.cc b/ash/login/ui/lock_contents_view_unittest.cc
index ec62e851..d9e275b2 100644
--- a/ash/login/ui/lock_contents_view_unittest.cc
+++ b/ash/login/ui/lock_contents_view_unittest.cc
@@ -140,6 +140,65 @@
             widget_bounds.width() - (auth_bounds.x() + auth_bounds.width()));
 }
 
+// Verifies that any top-level spacing views go down to width zero in small
+// screen sizes.
+TEST_F(LockContentsViewUnitTest, LayoutInSmallScreenSize) {
+  // Build lock screen.
+  auto* contents = new LockContentsView(
+      mojom::TrayActionState::kNotAvailable, LockScreen::ScreenType::kLock,
+      data_dispatcher(),
+      std::make_unique<FakeLoginDetachableBaseModel>(data_dispatcher()));
+  LockContentsView::TestApi lock_contents(contents);
+  std::unique_ptr<views::Widget> widget = CreateWidgetWithContent(contents);
+  display::test::DisplayManagerTestApi display_manager_test_api(
+      display_manager());
+
+  auto get_left_view = [&]() -> views::View* {
+    return lock_contents.primary_big_view();
+  };
+  auto get_right_view = [&]() -> views::View* {
+    if (lock_contents.opt_secondary_big_view())
+      return lock_contents.opt_secondary_big_view();
+    return lock_contents.users_list();
+  };
+
+  for (int i = 2; i < 10; ++i) {
+    SetUserCount(i);
+    views::View* left_view = get_left_view();
+    views::View* right_view = get_right_view();
+
+    // Determine the full-sized widths when there is plenty of spacing available
+    display_manager_test_api.UpdateDisplay("2000x1000");
+    int left_width = left_view->width();
+    int right_width = right_view->width();
+
+    int left_x = left_view->x();
+    int right_x = right_view->x();
+
+    // Resize to the minimum width that will fit both the left and right views
+    int display_width = left_width + right_width;
+    display_manager_test_api.UpdateDisplay(std::to_string(display_width) +
+                                           "x400");
+
+    // Verify the views moved, ie, a layout was performed
+    EXPECT_NE(left_view->x(), left_x);
+    EXPECT_NE(right_view->x(), right_x);
+
+    // Left and right views still have their full widths
+    EXPECT_EQ(left_width, left_view->width());
+    EXPECT_EQ(right_width, right_view->width());
+
+    // Left edge of |left_view| should be at start of the screen.
+    EXPECT_EQ(left_view->GetBoundsInScreen().x(), 0);
+    // Left edge of |right_view| should immediately follow |left_view| with no
+    // gap.
+    EXPECT_EQ(left_view->GetBoundsInScreen().right(),
+              right_view->GetBoundsInScreen().x());
+    // Right edge of |right_view| should be at the end of the screen.
+    EXPECT_EQ(right_view->GetBoundsInScreen().right(), display_width);
+  }
+}
+
 // Verifies that layout dynamically updates after a rotation by checking the
 // distance between the auth user and the user list in landscape and portrait
 // mode.
diff --git a/ash/login/ui/lock_debug_view.cc b/ash/login/ui/lock_debug_view.cc
index 5157178..0550fb9 100644
--- a/ash/login/ui/lock_debug_view.cc
+++ b/ash/login/ui/lock_debug_view.cc
@@ -52,6 +52,7 @@
   kGlobalCycleAuthErrorMessage,
   kPerUserTogglePin,
   kPerUserCycleEasyUnlockState,
+  kPerUserCycleFingerprintState,
   kPerUserForceOnlineSignIn,
   kPerUserToggleAuthEnabled,
   kPerUserUseDetachableBase,
@@ -97,6 +98,8 @@
   bool enable_auth = true;
   user_manager::UserType type = user_manager::USER_TYPE_REGULAR;
   mojom::EasyUnlockIconId easy_unlock_id = mojom::EasyUnlockIconId::NONE;
+  mojom::FingerprintUnlockState fingerprint_state =
+      mojom::FingerprintUnlockState::UNAVAILABLE;
 };
 
 std::string DetachableBasePairingStatusToString(
@@ -301,6 +304,33 @@
         debug_user->account_id, debug_user->enable_click_to_unlock);
   }
 
+  // Enables fingerprint auth for the user at |user_index|.
+  void CycleFingerprintUnlockForUserIndex(size_t user_index) {
+    DCHECK(user_index >= 0 && user_index < debug_users_.size());
+    UserMetadata* debug_user = &debug_users_[user_index];
+
+    // FingerprintUnlockState transition.
+    auto get_next_state = [](mojom::FingerprintUnlockState state) {
+      switch (state) {
+        case mojom::FingerprintUnlockState::UNAVAILABLE:
+          return mojom::FingerprintUnlockState::AVAILABLE;
+        case mojom::FingerprintUnlockState::AVAILABLE:
+          return mojom::FingerprintUnlockState::AUTH_SUCCESS;
+        case mojom::FingerprintUnlockState::AUTH_SUCCESS:
+          return mojom::FingerprintUnlockState::AUTH_FAILED;
+        case mojom::FingerprintUnlockState::AUTH_FAILED:
+          return mojom::FingerprintUnlockState::AUTH_DISABLED;
+        case mojom::FingerprintUnlockState::AUTH_DISABLED:
+          return mojom::FingerprintUnlockState::UNAVAILABLE;
+      }
+    };
+
+    debug_user->fingerprint_state =
+        get_next_state(debug_user->fingerprint_state);
+    debug_dispatcher_.SetFingerprintUnlockState(debug_user->account_id,
+                                                debug_user->fingerprint_state);
+  }
+
   // Force online sign-in for the user at |user_index|.
   void ForceOnlineSignInForUserIndex(size_t user_index) {
     DCHECK(user_index >= 0 && user_index < debug_users_.size());
@@ -873,6 +903,10 @@
   if (sender->id() == ButtonId::kPerUserCycleEasyUnlockState)
     debug_data_dispatcher_->CycleEasyUnlockForUserIndex(sender->tag());
 
+  // Cycle fingerprint unlock state.
+  if (sender->id() == ButtonId::kPerUserCycleFingerprintState)
+    debug_data_dispatcher_->CycleFingerprintUnlockForUserIndex(sender->tag());
+
   // Force online sign-in.
   if (sender->id() == ButtonId::kPerUserForceOnlineSignIn)
     debug_data_dispatcher_->ForceOnlineSignInForUserIndex(sender->tag());
@@ -916,6 +950,9 @@
     AddButton("Toggle PIN", ButtonId::kPerUserTogglePin, row)->set_tag(i);
     AddButton("Cycle easy unlock", ButtonId::kPerUserCycleEasyUnlockState, row)
         ->set_tag(i);
+    AddButton("Cycle fingerprint unlock",
+              ButtonId::kPerUserCycleFingerprintState, row)
+        ->set_tag(i);
     AddButton("Force online sign-in", ButtonId::kPerUserForceOnlineSignIn, row)
         ->set_tag(i);
     AddButton("Toggle auth enabled", ButtonId::kPerUserToggleAuthEnabled, row)
diff --git a/ash/login/ui/login_auth_user_view.cc b/ash/login/ui/login_auth_user_view.cc
index 1bf3891..c7cf136 100644
--- a/ash/login/ui/login_auth_user_view.cc
+++ b/ash/login/ui/login_auth_user_view.cc
@@ -8,6 +8,8 @@
 #include <memory>
 
 #include "ash/login/login_screen_controller.h"
+#include "ash/login/resources/grit/login_resources.h"
+#include "ash/login/ui/horizontal_image_sequence_animation_decoder.h"
 #include "ash/login/ui/lock_screen.h"
 #include "ash/login/ui/login_display_style.h"
 #include "ash/login/ui/login_password_view.h"
@@ -51,10 +53,10 @@
 const int kDistanceBetweenUserViewAndPasswordDp = 28;
 
 // Distance between the password textfield and the the pin keyboard.
-const int kDistanceBetweenPasswordFieldAndPinKeyboard = 20;
+const int kDistanceBetweenPasswordFieldAndPinKeyboardDp = 20;
 
 // Distance from the end of pin keyboard to the bottom of the big user view.
-const int kDistanceFromPinKeyboardToBigUserViewBottom = 50;
+const int kDistanceFromPinKeyboardToBigUserViewBottomDp = 50;
 
 // Distance from the top of the user view to the user icon.
 constexpr int kDistanceFromTopOfBigUserViewToUserIconDp = 54;
@@ -62,16 +64,16 @@
 // The color of the online sign-in message text.
 constexpr SkColor kOnlineSignInMessageColor = SkColorSetRGB(0xE6, 0x7C, 0x73);
 
-constexpr SkColor kFingerprintIconViewBorderColor =
-    SkColorSetARGB(0x57, 0xFF, 0xFF, 0xFF);
-constexpr SkColor kFingerprintIconAndTextColor =
+constexpr SkColor kFingerprintTextColor =
     SkColorSetARGB(0x8A, 0xFF, 0xFF, 0xFF);
-constexpr int kFingerprintIconViewBorderThickness = 1;
-constexpr int kFingerprintIconViewSizeDp = 64;
 constexpr int kFingerprintIconSizeDp = 32;
-constexpr int kResetToDefaultIconColorDelayMs = 500;
-constexpr int kFingerprintIconTopSpacing = 50;
-constexpr int kSpacingBetweenFingerprintIconAndLabel = 20;
+constexpr int kResetToDefaultIconDelayMs = 1300;
+constexpr int kFingerprintIconTopSpacingDp = 20;
+constexpr int kSpacingBetweenFingerprintIconAndLabelDp = 15;
+constexpr int kFingerprintViewWidthDp = 204;
+constexpr int kDistanceBetweenPasswordFieldAndFingerprintViewDp = 90;
+constexpr int kFingerprintFailedAnimationDurationMs = 700;
+constexpr int kFingerprintFailedAnimationNumFrames = 45;
 
 constexpr int kDisabledAuthMessageVerticalBorderDp = 14;
 constexpr int kDisabledAuthMessageHorizontalBorderDp = 0;
@@ -83,6 +85,8 @@
 constexpr int kDisabledAuthMessageContentsFontSizeDeltaDp = -1;
 constexpr int kDisabledAuthMessageRoundedCornerRadiusDp = 8;
 
+constexpr int kNonEmptyWidthDp = 1;
+
 // Returns an observer that will hide |view| when it fires. The observer will
 // delete itself after firing. Make sure to call |observer->SetReady()| after
 // attaching it.
@@ -121,61 +125,6 @@
   DISALLOW_COPY_AND_ASSIGN(ClearPasswordAnimationObserver);
 };
 
-// A view which has a round border and a fingerprint icon at the center.
-class FingerprintIconView : public views::View {
- public:
-  FingerprintIconView() {
-    SetPreferredSize(
-        gfx::Size(kFingerprintIconViewSizeDp, kFingerprintIconViewSizeDp));
-    icon_ = new views::ImageView;
-    icon_->SetVerticalAlignment(views::ImageView::CENTER);
-    icon_->SetPreferredSize(
-        gfx::Size(kFingerprintIconSizeDp, kFingerprintIconSizeDp));
-    icon_->SetImage(gfx::CreateVectorIcon(kLockScreenFingerprintIcon,
-                                          kFingerprintIconSizeDp, color_));
-    AddChildView(icon_);
-    SetBorder(views::CreateRoundedRectBorder(
-        kFingerprintIconViewBorderThickness, kFingerprintIconViewSizeDp / 2,
-        kFingerprintIconViewBorderColor));
-  }
-
-  ~FingerprintIconView() override = default;
-
-  // Set color of the icon. The color will be reset to
-  // kFingerprintIconAndTextColor after a short period if different.
-  void SetIconColor(SkColor color) {
-    if (color_ == color)
-      return;
-    color_ = color;
-    reset_icon_color_.Stop();
-    icon_->SetImage(gfx::CreateVectorIcon(kLockScreenFingerprintIcon,
-                                          kFingerprintIconSizeDp, color));
-
-    if (color_ != kFingerprintIconAndTextColor) {
-      reset_icon_color_.Start(
-          FROM_HERE,
-          base::TimeDelta::FromMilliseconds(kResetToDefaultIconColorDelayMs),
-          base::BindRepeating(&FingerprintIconView::SetIconColor,
-                              base::Unretained(this),
-                              kFingerprintIconAndTextColor));
-    }
-  }
-
-  void Layout() override {
-    gfx::Rect icon_bounds = GetContentsBounds();
-    icon_bounds.ClampToCenteredSize(
-        gfx::Size(kFingerprintIconSizeDp, kFingerprintIconSizeDp));
-    icon_->SetBoundsRect(icon_bounds);
-  }
-
- private:
-  views::ImageView* icon_ = nullptr;
-  base::OneShotTimer reset_icon_color_;
-  SkColor color_ = kFingerprintIconAndTextColor;
-
-  DISALLOW_COPY_AND_ASSIGN(FingerprintIconView);
-};
-
 }  // namespace
 
 // Consists of fingerprint icon view and a label.
@@ -184,46 +133,103 @@
   FingerprintView() {
     SetPaintToLayer();
     layer()->SetFillsBoundsOpaquely(false);
+    SetBorder(views::CreateEmptyBorder(kFingerprintIconTopSpacingDp, 0, 0, 0));
 
-    icon_view_ = new FingerprintIconView();
-    AddChildView(icon_view_);
+    auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>(
+        views::BoxLayout::kVertical, gfx::Insets(),
+        kSpacingBetweenFingerprintIconAndLabelDp));
+    layout->set_main_axis_alignment(
+        views::BoxLayout::MAIN_AXIS_ALIGNMENT_CENTER);
+
+    icon_ = new AnimatedRoundedImageView(
+        gfx::Size(kFingerprintIconSizeDp, kFingerprintIconSizeDp),
+        0 /*corner_radius*/);
+    icon_->SetImage(gfx::CreateVectorIcon(
+        kLockScreenFingerprintIcon, kFingerprintIconSizeDp, SK_ColorWHITE));
+    AddChildView(icon_);
+
     label_ = new views::Label(
         l10n_util::GetStringUTF16(IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_MESSAGE));
     label_->SetSubpixelRenderingEnabled(false);
     label_->SetAutoColorReadabilityEnabled(false);
-    label_->SetEnabledColor(kFingerprintIconAndTextColor);
+    label_->SetEnabledColor(kFingerprintTextColor);
     AddChildView(label_);
   }
 
-  void SetIconColor(SkColor color) { icon_view_->SetIconColor(color); }
+  void SetIcon(mojom::FingerprintUnlockState state) {
+    switch (state) {
+      case mojom::FingerprintUnlockState::UNAVAILABLE:
+      case mojom::FingerprintUnlockState::AVAILABLE:
+      case mojom::FingerprintUnlockState::AUTH_SUCCESS:
+        icon_->SetImage(gfx::CreateVectorIcon(
+            kLockScreenFingerprintIcon, kFingerprintIconSizeDp, SK_ColorWHITE));
+        return;
+      case mojom::FingerprintUnlockState::AUTH_FAILED:
+      case mojom::FingerprintUnlockState::AUTH_DISABLED:
+        icon_->SetAnimationDecoder(
+            std::make_unique<HorizontalImageSequenceAnimationDecoder>(
+                *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
+                    IDR_LOGIN_FINGERPRINT_UNLOCK_SPINNER),
+                base::TimeDelta::FromMilliseconds(
+                    kFingerprintFailedAnimationDurationMs),
+                kFingerprintFailedAnimationNumFrames),
+            AnimatedRoundedImageView::Playback::kSingle);
+        return;
+    }
+  }
 
-  void Layout() override {
-    gfx::Rect bounds = GetContentsBounds();
-    icon_view_->SizeToPreferredSize();
-    icon_view_->SetPosition(
-        gfx::Point((bounds.width() - icon_view_->width()) / 2,
-                   bounds.y() + kFingerprintIconTopSpacing));
-    label_->SizeToPreferredSize();
-    label_->SetPosition(
-        gfx::Point(bounds.x(), icon_view_->bounds().bottom() +
-                                   kSpacingBetweenFingerprintIconAndLabel));
+  void SetText(mojom::FingerprintUnlockState state) {
+    auto get_label_id = [&]() -> int {
+      switch (state) {
+        case mojom::FingerprintUnlockState::UNAVAILABLE:
+        case mojom::FingerprintUnlockState::AVAILABLE:
+        case mojom::FingerprintUnlockState::AUTH_SUCCESS:
+          return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_MESSAGE;
+        case mojom::FingerprintUnlockState::AUTH_FAILED:
+          return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_FAILED_MESSAGE;
+        case mojom::FingerprintUnlockState::AUTH_DISABLED:
+          return IDS_ASH_LOGIN_FINGERPRINT_UNLOCK_DISABLED_MESSAGE;
+      }
+    };
+
+    label_->SetText(l10n_util::GetStringUTF16(get_label_id()));
+  }
+
+  void SetState(mojom::FingerprintUnlockState state) {
+    if (state_ == state)
+      return;
+
+    state_ = state;
+    SetVisible(state != mojom::FingerprintUnlockState::UNAVAILABLE);
+    SetIcon(state);
+    SetText(state);
+
+    // Fingerprint icon reset to default sometime after AUTH_FAILED.
+    reset_state_.Stop();
+    if (state == mojom::FingerprintUnlockState::AUTH_FAILED) {
+      reset_state_.Start(
+          FROM_HERE,
+          base::TimeDelta::FromMilliseconds(kResetToDefaultIconDelayMs),
+          base::BindRepeating(&FingerprintView::SetState,
+                              base::Unretained(this),
+                              mojom::FingerprintUnlockState::AVAILABLE));
+    }
   }
 
   ~FingerprintView() override = default;
 
   gfx::Size CalculatePreferredSize() const override {
-    int preferred_height = label_->GetPreferredSize().height() +
-                           icon_view_->GetPreferredSize().height() +
-                           kFingerprintIconTopSpacing +
-                           kSpacingBetweenFingerprintIconAndLabel;
-    int preferred_width = std::max(label_->GetPreferredSize().width(),
-                                   icon_view_->GetPreferredSize().width());
-    return gfx::Size(preferred_width, preferred_height);
+    gfx::Size size = views::View::CalculatePreferredSize();
+    size.set_width(kFingerprintViewWidthDp);
+    return size;
   }
 
  private:
-  FingerprintIconView* icon_view_ = nullptr;
   views::Label* label_ = nullptr;
+  AnimatedRoundedImageView* icon_ = nullptr;
+  base::OneShotTimer reset_state_;
+  mojom::FingerprintUnlockState state_ =
+      mojom::FingerprintUnlockState::UNAVAILABLE;
 
   DISALLOW_COPY_AND_ASSIGN(FingerprintView);
 };
@@ -308,6 +314,7 @@
   gfx::Point pin_start_in_screen;
   bool had_pin = false;
   bool had_password = false;
+  bool had_fingerprint = false;
 
   explicit AnimationState(LoginAuthUserView* view) {
     non_pin_y_start_in_screen = view->GetBoundsInScreen().y();
@@ -316,6 +323,8 @@
     had_pin = (view->auth_methods() & LoginAuthUserView::AUTH_PIN) != 0;
     had_password =
         (view->auth_methods() & LoginAuthUserView::AUTH_PASSWORD) != 0;
+    had_fingerprint =
+        (view->auth_methods() & LoginAuthUserView::AUTH_FINGERPRINT) != 0;
   }
 };
 
@@ -383,6 +392,10 @@
                                            base::Unretained(password_view_)));
   DCHECK(pin_view_->layer());
 
+  padding_below_password_view_ = new NonAccessibleView();
+  padding_below_password_view_->SetPreferredSize(gfx::Size(
+      kNonEmptyWidthDp, kDistanceBetweenPasswordFieldAndPinKeyboardDp));
+
   // Initialization of |password_view_| is deferred because it needs the
   // |pin_view_| pointer.
   password_view_->Init(
@@ -415,14 +428,17 @@
       login_views_utils::WrapViewForPreferredSize(pin_view_);
   auto* wrapped_fingerprint_view =
       login_views_utils::WrapViewForPreferredSize(fingerprint_view_);
+  auto* wrapped_padding_below_password_view =
+      login_views_utils::WrapViewForPreferredSize(padding_below_password_view_);
 
   // Add views in tabbing order; they are rendered in a different order below.
   AddChildView(wrapped_password_view);
   AddChildView(wrapped_online_sign_in_message_view);
   AddChildView(wrapped_disabled_auth_message_view);
-  AddChildView(wrapped_fingerprint_view);
   AddChildView(wrapped_pin_view);
+  AddChildView(wrapped_fingerprint_view);
   AddChildView(wrapped_user_view);
+  AddChildView(wrapped_padding_below_password_view);
 
   // Use views::GridLayout instead of views::BoxLayout because views::BoxLayout
   // lays out children according to the view->children order.
@@ -447,10 +463,10 @@
   add_view(wrapped_password_view);
   add_view(wrapped_online_sign_in_message_view);
   add_view(wrapped_disabled_auth_message_view);
-  add_padding(kDistanceBetweenPasswordFieldAndPinKeyboard);
-  add_view(wrapped_fingerprint_view);
+  add_view(wrapped_padding_below_password_view);
   add_view(wrapped_pin_view);
-  add_padding(kDistanceFromPinKeyboardToBigUserViewBottom);
+  add_view(wrapped_fingerprint_view);
+  add_padding(kDistanceFromPinKeyboardToBigUserViewBottomDp);
 
   // Update authentication UI.
   SetAuthMethods(auth_methods_);
@@ -485,6 +501,13 @@
   pin_view_->SetVisible(has_pin);
   fingerprint_view_->SetVisible(has_fingerprint);
 
+  int padding_view_height = kDistanceBetweenPasswordFieldAndPinKeyboardDp;
+  if (has_fingerprint && !has_pin) {
+    padding_view_height = kDistanceBetweenPasswordFieldAndFingerprintViewDp;
+  }
+  padding_below_password_view_->SetPreferredSize(
+      gfx::Size(kNonEmptyWidthDp, padding_view_height));
+
   // Note: if both |has_tap| and |has_pin| are true, prefer tap placeholder.
   if (has_tap) {
     password_view_->SetPlaceholderText(
@@ -529,6 +552,7 @@
 
   bool has_password = (auth_methods() & AUTH_PASSWORD) != 0;
   bool has_pin = (auth_methods() & AUTH_PIN) != 0;
+  bool has_fingerprint = (auth_methods() & AUTH_FINGERPRINT) != 0;
 
   ////////
   // Animate the user info (ie, icon, name) up or down the screen.
@@ -612,6 +636,26 @@
     pin_view_->layer()->GetAnimator()->ScheduleAnimation(sequence);
   }
 
+  ////////
+  // Fade the fingerprint view if it is being hidden or shown.
+
+  if (cached_animation_state_->had_fingerprint != has_fingerprint) {
+    float opacity_start = 0, opacity_end = 1;
+    if (!has_fingerprint)
+      std::swap(opacity_start, opacity_end);
+
+    fingerprint_view_->layer()->SetOpacity(opacity_start);
+
+    {
+      ui::ScopedLayerAnimationSettings settings(
+          password_view_->layer()->GetAnimator());
+      settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(
+          login_constants::kChangeUserAnimationDurationMs));
+      settings.SetTweenType(gfx::Tween::Type::FAST_OUT_SLOW_IN);
+      fingerprint_view_->layer()->SetOpacity(opacity_end);
+    }
+  }
+
   cached_animation_state_.reset();
 }
 
@@ -625,16 +669,7 @@
 
 void LoginAuthUserView::SetFingerprintState(
     mojom::FingerprintUnlockState state) {
-  fingerprint_view_->SetVisible(state !=
-                                mojom::FingerprintUnlockState::UNAVAILABLE);
-
-  SkColor color = kFingerprintIconAndTextColor;
-  if (state == mojom::FingerprintUnlockState::AUTH_SUCCESS) {
-    color = SK_ColorBLUE;
-  } else if (state == mojom::FingerprintUnlockState::AUTH_FAILED) {
-    color = SK_ColorRED;
-  }
-  fingerprint_view_->SetIconColor(color);
+  fingerprint_view_->SetState(state);
 }
 
 void LoginAuthUserView::SetAuthReenabledTime(
diff --git a/ash/login/ui/login_auth_user_view.h b/ash/login/ui/login_auth_user_view.h
index 5d6017df..bae8990 100644
--- a/ash/login/ui/login_auth_user_view.h
+++ b/ash/login/ui/login_auth_user_view.h
@@ -165,6 +165,11 @@
   views::LabelButton* online_sign_in_message_ = nullptr;
   DisabledAuthMessageView* disabled_auth_message_ = nullptr;
   FingerprintView* fingerprint_view_ = nullptr;
+  // Displays padding between:
+  // 1. Password field and pin keyboard
+  // 2. Password field and fingerprint view, when pin is not available.
+  // Preferred size will change base on current auth method.
+  NonAccessibleView* padding_below_password_view_ = nullptr;
   const OnAuthCallback on_auth_;
   const LoginUserView::OnTap on_tap_;
 
diff --git a/ash/login/ui/login_password_view.cc b/ash/login/ui/login_password_view.cc
index be5380e3..8117ea0 100644
--- a/ash/login/ui/login_password_view.cc
+++ b/ash/login/ui/login_password_view.cc
@@ -4,6 +4,7 @@
 
 #include "ash/login/ui/login_password_view.h"
 
+#include "ash/login/ui/horizontal_image_sequence_animation_decoder.h"
 #include "ash/login/ui/hover_notifier.h"
 #include "ash/login/ui/lock_screen.h"
 #include "ash/login/ui/login_button.h"
@@ -159,62 +160,6 @@
                     IDR_EASY_UNLOCK_LOCKED_PRESSED);
 }
 
-// Decodes an animation strip that is laid out 1xN (ie, the image grows in
-// width, not height). There is no padding between frames in the animation
-// strip.
-//
-// As an example, if the following ASCII art is 100 pixels wide, it has 4 frames
-// each 25 pixels wide. The frames go from [0, 25), [25, 50), [50, 75), [75,
-// 100). All frames have the same height of 25 pixels.
-//
-//    [1][2][3][4]
-//
-class EasyUnlockAnimationDecoder
-    : public AnimatedRoundedImageView::AnimationDecoder {
- public:
-  EasyUnlockAnimationDecoder(const gfx::ImageSkia& image,
-                             base::TimeDelta duration,
-                             int num_frames)
-      : image_(image), duration_(duration), num_frames_(num_frames) {}
-  ~EasyUnlockAnimationDecoder() override = default;
-
-  // AnimatedRoundedImageView::AnimationDecoder:
-  AnimationFrames Decode(float image_scale) override {
-    SkBitmap bitmap = image_.GetRepresentation(image_scale).sk_bitmap();
-
-    int frame_width = bitmap.width() / num_frames_;
-    base::TimeDelta frame_duration = duration_ / num_frames_;
-
-    AnimationFrames animation;
-    animation.reserve(num_frames_);
-    for (int i = 0; i < num_frames_; ++i) {
-      // Get the subsection of the animation strip.
-      SkBitmap frame_bitmap;
-      bitmap.extractSubset(
-          &frame_bitmap,
-          SkIRect::MakeXYWH(i * frame_width, 0, frame_width, bitmap.height()));
-
-      // Add an animation frame.
-      AnimationFrame frame;
-      frame.duration = frame_duration;
-      frame.image = gfx::ImageSkia::CreateFrom1xBitmap(frame_bitmap);
-      animation.push_back(frame);
-    }
-
-    return animation;
-  }
-
- private:
-  // The animation image source.
-  gfx::ImageSkia image_;
-  // The total duration of the animation.
-  base::TimeDelta duration_;
-  // The total number of frames in the animation.
-  int num_frames_;
-
-  DISALLOW_COPY_AND_ASSIGN(EasyUnlockAnimationDecoder);
-};
-
 }  // namespace
 
 class LoginPasswordView::EasyUnlockIcon : public views::Button,
@@ -225,7 +170,6 @@
     SetPreferredSize(size);
     SetLayoutManager(std::make_unique<views::FillLayout>());
     icon_ = new AnimatedRoundedImageView(size, corner_radius);
-    icon_->SetAnimationEnabled(true);
     AddChildView(icon_);
   }
   ~EasyUnlockIcon() override = default;
@@ -328,8 +272,10 @@
       DCHECK_EQ(resources.normal, resources.hover);
       DCHECK_EQ(resources.normal, resources.pressed);
       if (changed_states) {
-        icon_->SetAnimationDecoder(std::make_unique<EasyUnlockAnimationDecoder>(
-            *image, resources.duration, resources.num_frames));
+        icon_->SetAnimationDecoder(
+            std::make_unique<HorizontalImageSequenceAnimationDecoder>(
+                *image, resources.duration, resources.num_frames),
+            AnimatedRoundedImageView::Playback::kRepeat);
       }
     } else {
       icon_->SetImage(*image);
diff --git a/ash/login/ui/login_user_view.cc b/ash/login/ui/login_user_view.cc
index 0d6df9f..6c74aba 100644
--- a/ash/login/ui/login_user_view.cc
+++ b/ash/login/ui/login_user_view.cc
@@ -139,7 +139,11 @@
     }
   }
 
-  void SetAnimationEnabled(bool enable) { image_->SetAnimationEnabled(enable); }
+  void SetAnimationEnabled(bool enable) {
+    image_->SetAnimationPlayback(
+        enable ? AnimatedRoundedImageView::Playback::kRepeat
+               : AnimatedRoundedImageView::Playback::kFirstFrameOnly);
+  }
 
  private:
   void OnImageDecoded(AnimationFrames animation) {
@@ -150,7 +154,8 @@
     }
 
     image_->SetAnimationDecoder(
-        std::make_unique<PassthroughAnimationDecoder>(animation));
+        std::make_unique<PassthroughAnimationDecoder>(animation),
+        AnimatedRoundedImageView::Playback::kRepeat);
   }
 
   AnimatedRoundedImageView* image_ = nullptr;
diff --git a/ash/login/ui/scrollable_users_list_view.cc b/ash/login/ui/scrollable_users_list_view.cc
index 525ac36..a3daaaf 100644
--- a/ash/login/ui/scrollable_users_list_view.cc
+++ b/ash/login/ui/scrollable_users_list_view.cc
@@ -264,10 +264,6 @@
 void ScrollableUsersListView::Layout() {
   DCHECK(contents_layout_);
 
-  // Make sure to resize width, which may be invalid. For example, this happens
-  // after a rotation.
-  SizeToPreferredSize();
-
   // Update clipping height.
   if (parent()) {
     int parent_height = parent()->size().height();
diff --git a/ash/message_center/ash_message_center_lock_screen_controller.cc b/ash/message_center/ash_message_center_lock_screen_controller.cc
new file mode 100644
index 0000000..36e05a4
--- /dev/null
+++ b/ash/message_center/ash_message_center_lock_screen_controller.cc
@@ -0,0 +1,127 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/message_center/ash_message_center_lock_screen_controller.h"
+
+#include "ash/login/ui/lock_screen.h"
+#include "ash/login/ui/lock_window.h"
+#include "ash/session/session_controller.h"
+#include "ash/shelf/shelf.h"
+#include "ash/shell.h"
+#include "ash/strings/grit/ash_strings.h"
+#include "ash/system/status_area_widget.h"
+#include "ash/system/toast/toast_data.h"
+#include "ash/system/toast/toast_manager.h"
+#include "ash/system/unified/unified_system_tray.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ui/base/l10n/l10n_util.h"
+
+namespace ash {
+
+namespace {
+const char kToastId[] = "ash-lock-screen-manager";
+}  // anonymous namespace
+
+AshMessageCenterLockScreenController::AshMessageCenterLockScreenController()
+    : locked_(Shell::Get()->session_controller()->IsScreenLocked()) {}
+
+AshMessageCenterLockScreenController::~AshMessageCenterLockScreenController() {
+  // Invokes the cancel task if any.
+  if (cancel_task_)
+    std::move(cancel_task_).Run();
+}
+
+void AshMessageCenterLockScreenController::DismissLockScreenThenExecute(
+    base::OnceClosure pending_callback,
+    base::OnceClosure cancel_callback) {
+  if (locked_) {
+    // Invokes the previous cancel task if any.
+    if (cancel_task_)
+      std::move(cancel_task_).Run();
+
+    // Stores the new pending/cancel tasks.
+    pending_task_ = std::move(pending_callback);
+    cancel_task_ = std::move(cancel_callback);
+
+    EncourageUserToUnlock();
+  } else {
+    DCHECK(pending_task_.is_null());
+    DCHECK(cancel_task_.is_null());
+    if (pending_callback)
+      std::move(pending_callback).Run();
+  }
+}
+
+bool AshMessageCenterLockScreenController::IsScreenLocked() const {
+  return locked_;
+}
+
+void AshMessageCenterLockScreenController::EncourageUserToUnlock() {
+  DCHECK(locked_);
+
+  DCHECK(LockScreen::Get());
+  DCHECK(LockScreen::Get()->window());
+  auto* unified_system_tray =
+      Shelf::ForWindow(LockScreen::Get()->window()->GetNativeWindow())
+          ->GetStatusAreaWidget()
+          ->unified_system_tray();
+  if (unified_system_tray) {
+    // Lockscreen notification works only with the unified system tray.
+    unified_system_tray->CloseBubble();
+  }
+
+  // TODO(yoshiki): Update UI after the UX finalizes.
+  Shell::Get()->toast_manager()->Show(ToastData(
+      kToastId,
+      (Shell::Get()->session_controller()->NumberOfLoggedInUsers() == 1 ||
+       active_account_id_.empty())
+          ? l10n_util::GetStringUTF16(
+                IDS_ASH_MESSAGE_CENTER_UNLOCK_TO_PERFORM_ACTION)
+          : l10n_util::GetStringFUTF16(
+                IDS_ASH_MESSAGE_CENTER_UNLOCK_TO_PERFORM_ACTION_WITH_USER_ID,
+                base::UTF8ToUTF16(active_account_id_.GetUserEmail())),
+      ToastData::kInfiniteDuration, base::nullopt,
+      /*visible_on_lock_screen=*/true));
+}
+
+void AshMessageCenterLockScreenController::OnLockStateChanged(bool locked) {
+  if (locked_ == locked)
+    return;
+
+  locked_ = locked;
+
+  if (!locked) {
+    Shell::Get()->toast_manager()->Cancel(kToastId);
+
+    // Invokes the pending task and resets the cancel task.
+    if (pending_task_)
+      std::move(pending_task_).Run();
+    std::move(cancel_task_).Reset();
+  } else {
+    DCHECK(pending_task_.is_null());
+    DCHECK(cancel_task_.is_null());
+  }
+}
+
+void AshMessageCenterLockScreenController::OnActiveUserSessionChanged(
+    const AccountId& account_id) {
+  if (active_account_id_ == account_id)
+    return;
+
+  active_account_id_ = account_id;
+
+  if (locked_) {
+    // Cancels the current callbacks, if the user switches the active account
+    // on the lock screen.
+    DCHECK(Shell::Get());
+    DCHECK(Shell::Get()->toast_manager());
+    Shell::Get()->toast_manager()->Cancel(kToastId);
+
+    std::move(pending_task_).Reset();
+    if (cancel_task_)
+      std::move(cancel_task_).Run();
+  }
+}
+
+}  // namespace ash
diff --git a/ash/message_center/ash_message_center_lock_screen_controller.h b/ash/message_center/ash_message_center_lock_screen_controller.h
new file mode 100644
index 0000000..af735a3d
--- /dev/null
+++ b/ash/message_center/ash_message_center_lock_screen_controller.h
@@ -0,0 +1,48 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
+#define ASH_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
+
+#include "ash/ash_export.h"
+#include "ash/session/session_observer.h"
+#include "components/account_id/account_id.h"
+#include "ui/message_center/lock_screen/lock_screen_controller.h"
+
+namespace ash {
+
+// This class implements the ASH logic for the message center.
+class AshMessageCenterLockScreenController
+    : public message_center::LockScreenController,
+      public SessionObserver {
+ public:
+  AshMessageCenterLockScreenController();
+  ~AshMessageCenterLockScreenController() override;
+
+  // message_center::LockScreenController:
+  void DismissLockScreenThenExecute(base::OnceClosure pending_callback,
+                                    base::OnceClosure cancel_callback) override;
+  bool IsScreenLocked() const override;
+
+ private:
+  // SessionObserver:
+  void OnLockStateChanged(bool locked) override;
+  void OnActiveUserSessionChanged(const AccountId& account_id) override;
+
+  // Shows a message that asks a user to unlock the device.
+  void EncourageUserToUnlock();
+
+  bool locked_;
+  AccountId active_account_id_ = EmptyAccountId();
+  base::OnceClosure pending_task_;
+  base::OnceClosure cancel_task_;
+
+  ScopedSessionObserver scoped_session_observer_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(AshMessageCenterLockScreenController);
+};
+
+}  // namespace ash
+
+#endif  // ASH_MESSAGE_CENTER_ASH_MESSAGE_CENTER_LOCK_SCREEN_CONTROLLER_H_
diff --git a/ash/message_center/message_center_controller.cc b/ash/message_center/message_center_controller.cc
index 426b5078..34d5dcf 100644
--- a/ash/message_center/message_center_controller.cc
+++ b/ash/message_center/message_center_controller.cc
@@ -5,6 +5,7 @@
 #include "ash/message_center/message_center_controller.h"
 
 #include "ash/message_center/arc_notification_manager_delegate_impl.h"
+#include "ash/message_center/ash_message_center_lock_screen_controller.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "ash/session/session_controller.h"
@@ -95,7 +96,8 @@
 }  // namespace
 
 MessageCenterController::MessageCenterController() {
-  message_center::MessageCenter::Initialize();
+  message_center::MessageCenter::Initialize(
+      std::make_unique<AshMessageCenterLockScreenController>());
 
   fullscreen_notification_blocker_ =
       std::make_unique<FullscreenNotificationBlocker>(MessageCenter::Get());
@@ -110,7 +112,8 @@
         std::make_unique<PopupNotificationBlocker>(MessageCenter::Get());
   }
 
-  message_center::RegisterVectorIcons({&kNotificationCaptivePortalIcon,
+  message_center::RegisterVectorIcons({&kNotificationAssistantIcon,
+                                       &kNotificationCaptivePortalIcon,
                                        &kNotificationCellularAlertIcon,
                                        &kNotificationDownloadIcon,
                                        &kNotificationEndOfSupportIcon,
diff --git a/ash/message_center/message_center_scroll_bar.cc b/ash/message_center/message_center_scroll_bar.cc
index bc4865d..49a54358 100644
--- a/ash/message_center/message_center_scroll_bar.cc
+++ b/ash/message_center/message_center_scroll_bar.cc
@@ -26,8 +26,9 @@
 
 namespace ash {
 
-MessageCenterScrollBar::MessageCenterScrollBar()
-    : views::OverlayScrollBar(false) {
+MessageCenterScrollBar::MessageCenterScrollBar(
+    MessageCenterScrollBar::Observer* observer)
+    : views::OverlayScrollBar(false), observer_(observer) {
   GetThumb()->layer()->SetVisible(!features::IsSystemTrayUnifiedEnabled() ||
                                   features::IsNotificationScrollBarEnabled());
 }
@@ -46,7 +47,13 @@
     CollectScrollActionReason(ScrollActionReason::kByMouseWheel);
     stats_recorded_ = true;
   }
-  return views::OverlayScrollBar::OnMouseWheel(event);
+
+  bool result = views::OverlayScrollBar::OnMouseWheel(event);
+
+  if (observer_)
+    observer_->OnMessageCenterScrolled();
+
+  return result;
 }
 
 void MessageCenterScrollBar::OnGestureEvent(ui::GestureEvent* event) {
@@ -54,7 +61,11 @@
     CollectScrollActionReason(ScrollActionReason::kByTouch);
     stats_recorded_ = true;
   }
-  return views::OverlayScrollBar::OnGestureEvent(event);
+
+  views::OverlayScrollBar::OnGestureEvent(event);
+
+  if (observer_)
+    observer_->OnMessageCenterScrolled();
 }
 
 }  // namespace ash
diff --git a/ash/message_center/message_center_scroll_bar.h b/ash/message_center/message_center_scroll_bar.h
index cd985eb..172c6830 100644
--- a/ash/message_center/message_center_scroll_bar.h
+++ b/ash/message_center/message_center_scroll_bar.h
@@ -15,7 +15,15 @@
 // after the message center opens is recorded.
 class MessageCenterScrollBar : public views::OverlayScrollBar {
  public:
-  MessageCenterScrollBar();
+  class Observer {
+   public:
+    // Called when scroll event is triggered.
+    virtual void OnMessageCenterScrolled() = 0;
+    virtual ~Observer() = default;
+  };
+
+  // |observer| can be null.
+  explicit MessageCenterScrollBar(Observer* observer);
 
  private:
   // View overrides:
@@ -28,6 +36,8 @@
   // False if no event is recorded yet. True if the first event is recorded.
   bool stats_recorded_ = false;
 
+  Observer* const observer_;
+
   DISALLOW_COPY_AND_ASSIGN(MessageCenterScrollBar);
 };
 
diff --git a/ash/message_center/message_center_view.cc b/ash/message_center/message_center_view.cc
index 78e4072..9496c08 100644
--- a/ash/message_center/message_center_view.cc
+++ b/ash/message_center/message_center_view.cc
@@ -213,7 +213,7 @@
   // set the default opaque background color.
   scroller_->SetBackgroundColor(SK_ColorTRANSPARENT);
   scroller_->ClipHeightTo(kMinScrollViewHeight, max_scroll_view_height);
-  scroller_->SetVerticalScrollBar(new MessageCenterScrollBar());
+  scroller_->SetVerticalScrollBar(new MessageCenterScrollBar(nullptr));
 
   message_list_view_.reset(new MessageListView());
   message_list_view_->SetBorderPadding();
diff --git a/ash/message_center/message_list_view.cc b/ash/message_center/message_list_view.cc
index da6779f..0d4a9a6 100644
--- a/ash/message_center/message_list_view.cc
+++ b/ash/message_center/message_list_view.cc
@@ -328,6 +328,24 @@
       gfx::Insets(message_center::kMarginBetweenItemsInList)));
 }
 
+int MessageListView::GetHeightBelowVisibleRect() const {
+  DCHECK(scroller_);
+
+  int height = 0;
+  int padding = 0;
+  for (int i = 0; i < child_count(); ++i) {
+    const views::View* child = child_at(i);
+    if (!child->visible())
+      continue;
+    if (!IsValidChild(child))
+      continue;
+
+    height += child->bounds().height() + padding;
+    padding = GetMarginBetweenItems();
+  }
+  return std::max(0, height - scroller_->GetVisibleRect().bottom());
+}
+
 void MessageListView::OnBoundsAnimatorProgressed(
     views::BoundsAnimator* animator) {
   DCHECK_EQ(&animator_, animator);
diff --git a/ash/message_center/message_list_view.h b/ash/message_center/message_list_view.h
index e9a93de..c914d617 100644
--- a/ash/message_center/message_list_view.h
+++ b/ash/message_center/message_list_view.h
@@ -70,6 +70,10 @@
 
   void SetBorderPadding();
 
+  // Get the distance from the bottom of ScrollView's visible rect to the bottom
+  // of the notification list.
+  int GetHeightBelowVisibleRect() const;
+
   void set_use_fixed_height(bool use_fixed_height) {
     use_fixed_height_ = use_fixed_height;
   }
diff --git a/ash/public/cpp/app_list/app_list_constants.cc b/ash/public/cpp/app_list/app_list_constants.cc
index b94d0114..5ba246f 100644
--- a/ash/public/cpp/app_list/app_list_constants.cc
+++ b/ash/public/cpp/app_list/app_list_constants.cc
@@ -125,6 +125,13 @@
 const float kAllAppsOpacityStartPx = 8.0f;
 const float kAllAppsOpacityEndPx = 144.0f;
 
+// Delta applied to font size of all AppListSearchResult titles.
+const int kSearchResultTitleTextSizeDelta = 2;
+
+// Font style for AppListSearchResultTileItemViews that are not suggested apps.
+const ui::ResourceBundle::FontStyle kSearchResultTitleFontStyle =
+    ui::ResourceBundle::BaseFont;
+
 // The UMA histogram that logs usage of suggested and regular apps.
 const char kAppListAppLaunched[] = "Apps.AppListAppLaunched";
 
diff --git a/ash/public/cpp/app_list/app_list_constants.h b/ash/public/cpp/app_list/app_list_constants.h
index 390c4901..d1aa080 100644
--- a/ash/public/cpp/app_list/app_list_constants.h
+++ b/ash/public/cpp/app_list/app_list_constants.h
@@ -73,6 +73,10 @@
 ASH_PUBLIC_EXPORT extern const float kAllAppsOpacityStartPx;
 ASH_PUBLIC_EXPORT extern const float kAllAppsOpacityEndPx;
 
+ASH_PUBLIC_EXPORT extern const int kSearchResultTitleTextSizeDelta;
+ASH_PUBLIC_EXPORT extern const ui::ResourceBundle::FontStyle
+    kSearchResultTitleFontStyle;
+
 // The different ways that the app list can transition from PEEKING to
 // FULLSCREEN_ALL_APPS. These values are written to logs.  New enum
 // values can be added, but existing enums must never be renumbered or deleted
diff --git a/ash/public/cpp/app_list/app_list_features.cc b/ash/public/cpp/app_list/app_list_features.cc
index 71651fe1..ffaf114 100644
--- a/ash/public/cpp/app_list/app_list_features.cc
+++ b/ash/public/cpp/app_list/app_list_features.cc
@@ -20,13 +20,13 @@
 const base::Feature kEnablePlayStoreAppSearch{"EnablePlayStoreAppSearch",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kEnableHomeLauncher{"EnableHomeLauncher",
-                                        base::FEATURE_DISABLED_BY_DEFAULT};
+                                        base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kEnableSettingsShortcutSearch{
     "EnableSettingsShortcutSearch", base::FEATURE_DISABLED_BY_DEFAULT};
-const base::Feature kEnableAppsGridGapFeature{
-    "EnableAppsGridGapFeature", base::FEATURE_DISABLED_BY_DEFAULT};
+const base::Feature kEnableAppsGridGapFeature{"EnableAppsGridGapFeature",
+                                              base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kEnableNewStyleLauncher{"EnableNewStyleLauncher",
-                                            base::FEATURE_DISABLED_BY_DEFAULT};
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
 const base::Feature kEnableContinueReading{"EnableContinueReading",
                                            base::FEATURE_DISABLED_BY_DEFAULT};
 const base::Feature kEnableZeroStateSuggestions{
diff --git a/ash/public/cpp/ash_features.cc b/ash/public/cpp/ash_features.cc
index 9e6b1f6..56d02558 100644
--- a/ash/public/cpp/ash_features.cc
+++ b/ash/public/cpp/ash_features.cc
@@ -42,9 +42,6 @@
 const base::Feature kSystemTrayUnified{"SystemTrayUnified",
                                        base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kTapVisualizerApp{"TapVisualizerApp",
-                                      base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kTrilinearFiltering{"TrilinearFiltering",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
diff --git a/ash/public/cpp/ash_features.h b/ash/public/cpp/ash_features.h
index e58f1c7..9562912 100644
--- a/ash/public/cpp/ash_features.h
+++ b/ash/public/cpp/ash_features.h
@@ -58,9 +58,6 @@
 // Enables new system menu.
 ASH_PUBLIC_EXPORT extern const base::Feature kSystemTrayUnified;
 
-// Enables the mojo app implementation of 'Show taps'.
-ASH_PUBLIC_EXPORT extern const base::Feature kTapVisualizerApp;
-
 // Enables trilinear filtering.
 ASH_PUBLIC_EXPORT extern const base::Feature kTrilinearFiltering;
 
diff --git a/ash/public/cpp/vector_icons/BUILD.gn b/ash/public/cpp/vector_icons/BUILD.gn
index aab0436..2f1fef1 100644
--- a/ash/public/cpp/vector_icons/BUILD.gn
+++ b/ash/public/cpp/vector_icons/BUILD.gn
@@ -9,6 +9,7 @@
   icon_directory = "."
 
   icons = [
+    "notification_assistant.icon",
     "notification_captive_portal.icon",
     "notification_cellular_alert.icon",
     "notification_download.icon",
diff --git a/ash/public/cpp/vector_icons/notification_assistant.icon b/ash/public/cpp/vector_icons/notification_assistant.icon
new file mode 100644
index 0000000..3386382
--- /dev/null
+++ b/ash/public/cpp/vector_icons/notification_assistant.icon
@@ -0,0 +1,12 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+CANVAS_DIMENSIONS, 96,
+CIRCLE, 86, 30, 6,
+NEW_PATH,
+CIRCLE, 68, 44, 12,
+NEW_PATH,
+CIRCLE, 68, 74, 14,
+NEW_PATH,
+CIRCLE, 28, 32, 24
diff --git a/ash/public/interfaces/login_user_info.mojom b/ash/public/interfaces/login_user_info.mojom
index 98d6dd24..a39c4bc 100644
--- a/ash/public/interfaces/login_user_info.mojom
+++ b/ash/public/interfaces/login_user_info.mojom
@@ -46,8 +46,14 @@
   AVAILABLE,
   // The unlock attempt is successful, the fingerprint is matched.
   AUTH_SUCCESS,
-  // The unlock attempt is unsuccessful, the fingerprint is not recognized.
+  // The unlock attempt is unsuccessful; the fingerprint is not
+  // recognized; however, the user can make another fingerprint auth
+  // attempt.
   AUTH_FAILED,
+  // The unlock attempt is unsuccessful; the fingerprint is not
+  // recognized.  There have been too many unlock attempts and fingerprint
+  // is now disabled.
+  AUTH_DISABLED,
 };
 
 // Information about the custom icon in the user pod.
diff --git a/ash/public/interfaces/voice_interaction_controller.mojom b/ash/public/interfaces/voice_interaction_controller.mojom
index 0924dab..de67ba6 100644
--- a/ash/public/interfaces/voice_interaction_controller.mojom
+++ b/ash/public/interfaces/voice_interaction_controller.mojom
@@ -98,6 +98,10 @@
   // Return the voice interaction setup complete status.
   IsSetupCompleted() => (bool completed);
 
+  // Return if the user has granted permission to access screen "context", the
+  // text and graphics content that is currently on screen.
+  IsContextEnabled() => (bool enabled);
+
   // Return the voice interaction hotword listening status.
   IsHotwordEnabled() => (bool enabled);
 
diff --git a/ash/root_window_controller.cc b/ash/root_window_controller.cc
index 6c80dd4..e95b74d 100644
--- a/ash/root_window_controller.cc
+++ b/ash/root_window_controller.cc
@@ -42,7 +42,6 @@
 #include "ash/system/tray/tray_background_view.h"
 #include "ash/system/unified/unified_system_tray.h"
 #include "ash/touch/touch_hud_debug.h"
-#include "ash/touch/touch_hud_projection.h"
 #include "ash/touch/touch_observer_hud.h"
 #include "ash/wallpaper/wallpaper_widget_controller.h"
 #include "ash/wm/always_on_top_controller.h"
@@ -528,12 +527,6 @@
   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
   if (command_line->HasSwitch(switches::kAshTouchHud))
     set_touch_hud_debug(new TouchHudDebug(GetRootWindow()));
-
-  // TouchHudProjection manages its own lifetime.
-  if (command_line->HasSwitch(switches::kShowTaps) &&
-      !base::FeatureList::IsEnabled(features::kTapVisualizerApp)) {
-    touch_hud_projection_ = new TouchHudProjection(GetRootWindow());
-  }
 }
 
 aura::Window* RootWindowController::GetWindowForFullscreenMode() {
diff --git a/ash/root_window_controller.h b/ash/root_window_controller.h
index 9d52e0c..41f05dc 100644
--- a/ash/root_window_controller.h
+++ b/ash/root_window_controller.h
@@ -57,7 +57,6 @@
 class SystemWallpaperController;
 class TouchExplorationManager;
 class TouchHudDebug;
-class TouchHudProjection;
 class WallpaperWidgetController;
 class WindowManager;
 class WorkspaceController;
@@ -120,20 +119,8 @@
   // Returns the instance of the sidebar.
   Sidebar* sidebar() { return sidebar_.get(); }
 
-  // Get touch HUDs associated with this root window controller.
   TouchHudDebug* touch_hud_debug() const { return touch_hud_debug_; }
-  TouchHudProjection* touch_hud_projection() const {
-    return touch_hud_projection_;
-  }
-
-  // Set touch HUDs for this root window controller. The root window controller
-  // will not own the HUDs; their lifetimes are managed by themselves. Whenever
-  // the widget showing a HUD is being destroyed (e.g. because of detaching a
-  // display), the HUD deletes itself.
   void set_touch_hud_debug(TouchHudDebug* hud) { touch_hud_debug_ = hud; }
-  void set_touch_hud_projection(TouchHudProjection* hud) {
-    touch_hud_projection_ = hud;
-  }
 
   wm::RootWindowLayoutManager* root_window_layout_manager() {
     return root_window_layout_manager_;
@@ -313,10 +300,10 @@
   // feedback is on.
   std::unique_ptr<TouchExplorationManager> touch_exploration_manager_;
 
-  // Heads-up displays for touch events. These HUDs are not owned by the root
-  // window controller and manage their own lifetimes.
+  // Heads-up displays for touch events for this root. Not owned. Manages its
+  // own lifetime. Whenever the widget showing a HUD is being destroyed (e.g.
+  // because of detaching a display), the HUD deletes itself.
   TouchHudDebug* touch_hud_debug_ = nullptr;
-  TouchHudProjection* touch_hud_projection_ = nullptr;
 
   std::unique_ptr<::wm::ScopedCaptureClient> capture_client_;
 
diff --git a/ash/shelf/app_list_button.cc b/ash/shelf/app_list_button.cc
index 6f2c415..827dc62e 100644
--- a/ash/shelf/app_list_button.cc
+++ b/ash/shelf/app_list_button.cc
@@ -329,7 +329,9 @@
     case mojom::VoiceInteractionState::NOT_READY:
       // If we are showing the bursting or waiting animation, no need to do
       // anything. Otherwise show the waiting animation now.
-      if (!assistant_overlay_->IsBursting() &&
+      // NOTE: No waiting animation for native assistant.
+      if (!chromeos::switches::IsAssistantEnabled() &&
+          !assistant_overlay_->IsBursting() &&
           !assistant_overlay_->IsWaiting()) {
         assistant_overlay_->WaitingAnimation();
       }
diff --git a/ash/shelf/shelf_context_menu_model.cc b/ash/shelf/shelf_context_menu_model.cc
index 5837ee5a..9f1ad44 100644
--- a/ash/shelf/shelf_context_menu_model.cc
+++ b/ash/shelf/shelf_context_menu_model.cc
@@ -191,8 +191,13 @@
     return;
 
   UserMetricsRecorder* metrics = Shell::Get()->metrics();
+  // Clamshell mode only options should not activate in tablet mode.
+  const bool is_tablet_mode = Shell::Get()
+                                  ->tablet_mode_controller()
+                                  ->IsTabletModeWindowManagerEnabled();
   switch (command_id) {
     case MENU_AUTO_HIDE:
+      DCHECK(!is_tablet_mode);
       SetShelfAutoHideBehaviorPref(
           prefs, display_id_,
           GetShelfAutoHideBehaviorPref(prefs, display_id_) ==
@@ -201,14 +206,17 @@
               : SHELF_AUTO_HIDE_BEHAVIOR_ALWAYS);
       break;
     case MENU_ALIGNMENT_LEFT:
+      DCHECK(!is_tablet_mode);
       metrics->RecordUserMetricsAction(UMA_SHELF_ALIGNMENT_SET_LEFT);
       SetShelfAlignmentPref(prefs, display_id_, SHELF_ALIGNMENT_LEFT);
       break;
     case MENU_ALIGNMENT_RIGHT:
+      DCHECK(!is_tablet_mode);
       metrics->RecordUserMetricsAction(UMA_SHELF_ALIGNMENT_SET_RIGHT);
       SetShelfAlignmentPref(prefs, display_id_, SHELF_ALIGNMENT_RIGHT);
       break;
     case MENU_ALIGNMENT_BOTTOM:
+      DCHECK(!is_tablet_mode);
       metrics->RecordUserMetricsAction(UMA_SHELF_ALIGNMENT_SET_BOTTOM);
       SetShelfAlignmentPref(prefs, display_id_, SHELF_ALIGNMENT_BOTTOM);
       break;
diff --git a/ash/shelf/shelf_layout_manager.cc b/ash/shelf/shelf_layout_manager.cc
index fd901cd..1e84a3b 100644
--- a/ash/shelf/shelf_layout_manager.cc
+++ b/ash/shelf/shelf_layout_manager.cc
@@ -217,10 +217,10 @@
   return target_bounds.shelf_bounds_in_root.size();
 }
 
-void ShelfLayoutManager::LayoutShelfAndUpdateBounds(bool change_work_area) {
+void ShelfLayoutManager::LayoutShelfAndUpdateBounds() {
   TargetBounds target_bounds;
   CalculateTargetBounds(state_, &target_bounds);
-  UpdateBoundsAndOpacity(target_bounds, false, change_work_area, nullptr);
+  UpdateBoundsAndOpacity(target_bounds, false, nullptr);
 
   // Update insets in ShelfWindowTargeter when shelf bounds change.
   for (auto& observer : observers_)
@@ -233,7 +233,7 @@
   if (in_shutdown_)
     return;
 
-  LayoutShelfAndUpdateBounds(true);
+  LayoutShelfAndUpdateBounds();
 }
 
 ShelfVisibilityState ShelfLayoutManager::CalculateShelfVisibility() {
@@ -496,13 +496,10 @@
 
 void ShelfLayoutManager::OnKeyboardAppearanceChanged(
     const keyboard::KeyboardStateDescriptor& state) {
-  // If displaced bounds changed, then change the work area too.
-  bool change_work_area = state.displaced_bounds != keyboard_displaced_bounds_;
-
   keyboard_occluded_bounds_ = state.occluded_bounds;
   keyboard_displaced_bounds_ = state.displaced_bounds;
 
-  LayoutShelfAndUpdateBounds(change_work_area);
+  LayoutShelfAndUpdateBounds();
 }
 
 void ShelfLayoutManager::OnKeyboardVisibilityStateChanged(
@@ -629,7 +626,7 @@
   TargetBounds target_bounds;
   CalculateTargetBounds(state_, &target_bounds);
   UpdateBoundsAndOpacity(
-      target_bounds, true /* animate */, true /* change_work_area */,
+      target_bounds, true /* animate */,
       delay_background_change ? update_shelf_observer_ : nullptr);
 
   // OnAutoHideStateChanged Should be emitted when:
@@ -646,7 +643,6 @@
 void ShelfLayoutManager::UpdateBoundsAndOpacity(
     const TargetBounds& target_bounds,
     bool animate,
-    bool change_work_area,
     ui::ImplicitAnimationObserver* observer) {
   StatusAreaWidget* status_widget = shelf_widget_->status_area_widget();
   base::AutoReset<bool> auto_reset_updating_bounds(&updating_bounds_, true);
@@ -706,7 +702,7 @@
             shelf_widget_->GetNativeWindow());
     bool in_overview =
         Shell::Get()->window_selector_controller()->IsSelecting();
-    if (!in_overview && !state_.IsScreenLocked() && change_work_area &&
+    if (!in_overview && !state_.IsScreenLocked() &&
         (shelf_->alignment() != SHELF_ALIGNMENT_BOTTOM_LOCKED ||
          display.work_area() == display.bounds())) {
       gfx::Insets insets;
@@ -1103,8 +1099,7 @@
 
   TargetBounds target_bounds;
   CalculateTargetBounds(state_, &target_bounds);
-  UpdateBoundsAndOpacity(target_bounds, true /* animate */,
-                         true /* change_work_area */, nullptr);
+  UpdateBoundsAndOpacity(target_bounds, true /* animate */, nullptr);
   UpdateVisibilityState();
 }
 
diff --git a/ash/shelf/shelf_layout_manager.h b/ash/shelf/shelf_layout_manager.h
index 39160e69..8a08e89 100644
--- a/ash/shelf/shelf_layout_manager.h
+++ b/ash/shelf/shelf_layout_manager.h
@@ -90,7 +90,7 @@
   }
 
   // Stops any animations and sets the bounds of the shelf and status widgets.
-  void LayoutShelfAndUpdateBounds(bool change_work_area);
+  void LayoutShelfAndUpdateBounds();
 
   // Stops any animations, sets the bounds of the shelf and status widgets, and
   // changes the work area
@@ -259,11 +259,9 @@
 
   // Updates the bounds and opacity of the shelf and status widgets.
   // If |observer| is specified, it will be called back when the animations, if
-  // any, are complete. |change_work_area| specifies whether or not to update
-  // the work area of the screen.
+  // any, are complete.
   void UpdateBoundsAndOpacity(const TargetBounds& target_bounds,
                               bool animate,
-                              bool change_work_area,
                               ui::ImplicitAnimationObserver* observer);
 
   // Stops any animations and progresses them to the end.
diff --git a/ash/shelf/shelf_layout_manager_unittest.cc b/ash/shelf/shelf_layout_manager_unittest.cc
index 8ed95b9..1a5031f 100644
--- a/ash/shelf/shelf_layout_manager_unittest.cc
+++ b/ash/shelf/shelf_layout_manager_unittest.cc
@@ -41,6 +41,7 @@
 #include "base/command_line.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "services/ui/public/interfaces/window_tree_constants.mojom.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/client/window_parenting_client.h"
@@ -670,6 +671,23 @@
             GetShelfWidget()->GetWindowBoundsInScreen().ToString());
 }
 
+class ShelfLayoutManagerNonHomeLauncherTest : public ShelfLayoutManagerTest {
+ public:
+  ShelfLayoutManagerNonHomeLauncherTest() = default;
+  ~ShelfLayoutManagerNonHomeLauncherTest() override = default;
+
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        {}, {app_list::features::kEnableHomeLauncher});
+    ShelfLayoutManagerTest::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(ShelfLayoutManagerNonHomeLauncherTest);
+};
+
 // Makes sure SetVisible updates work area and widget appropriately.
 TEST_F(ShelfLayoutManagerTest, SetVisible) {
   ShelfWidget* shelf_widget = GetShelfWidget();
@@ -1485,7 +1503,7 @@
   GetAppListTestHelper()->CheckVisibility(false);
 }
 
-TEST_F(ShelfLayoutManagerTest,
+TEST_F(ShelfLayoutManagerNonHomeLauncherTest,
        SwipingUpOnShelfInTabletModeForFullscreenAppList) {
   // Animations triggered by immersive mode cause this test to fail.
   ImmersiveFullscreenControllerTestApi::GlobalAnimationDisabler
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 2e067b51..a656182b 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -38,6 +38,7 @@
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/auto_reset.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/scoped_observer.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/chromeos_switches.h"
 #include "ui/accessibility/ax_node_data.h"
@@ -320,16 +321,18 @@
       shelf_(shelf),
       shelf_widget_(shelf_widget),
       view_model_(new views::ViewModel),
+      bounds_animator_(std::make_unique<views::BoundsAnimator>(this)),
       tooltip_(this),
+      focus_search_(std::make_unique<ShelfFocusSearch>(this)),
+      tablet_mode_observer_(this),
       shelf_item_background_color_(kShelfDefaultBaseColor),
       weak_factory_(this) {
   DCHECK(model_);
   DCHECK(shelf_);
   DCHECK(shelf_widget_);
-  bounds_animator_ = std::make_unique<views::BoundsAnimator>(this);
+  tablet_mode_observer_.Add(Shell::Get()->tablet_mode_controller());
   bounds_animator_->AddObserver(this);
   set_context_menu_controller(this);
-  focus_search_ = std::make_unique<ShelfFocusSearch>(this);
 }
 
 ShelfView::~ShelfView() {
@@ -586,6 +589,20 @@
   drag_image_->SetWidgetVisible(true);
 }
 
+void ShelfView::OnTabletModeStarted() {
+  // Close all menus when tablet mode starts to ensure that the clamshell only
+  // context menu options are not available in tablet mode.
+  if (shelf_menu_model_adapter_)
+    shelf_menu_model_adapter_->Cancel();
+}
+
+void ShelfView::OnTabletModeEnded() {
+  // Close all menus when tablet mode ends so that menu options are kept
+  // consistent with device state.
+  if (shelf_menu_model_adapter_)
+    shelf_menu_model_adapter_->Cancel();
+}
+
 void ShelfView::CreateDragIconProxyByLocationWithNoAnimation(
     const gfx::Point& origin_in_screen_coordinates,
     const gfx::ImageSkia& icon,
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h
index 37d5f1f..42597bf 100644
--- a/ash/shelf/shelf_view.h
+++ b/ash/shelf/shelf_view.h
@@ -29,6 +29,10 @@
 #include "ui/views/view.h"
 #include "ui/views/view_model.h"
 
+namespace ash {
+class TabletModeController;
+}
+
 namespace ui {
 class SimpleMenuModel;
 }
@@ -110,7 +114,8 @@
                              public views::ContextMenuController,
                              public views::FocusTraversable,
                              public views::BoundsAnimatorObserver,
-                             public app_list::ApplicationDragAndDropHost {
+                             public app_list::ApplicationDragAndDropHost,
+                             public ash::TabletModeObserver {
  public:
   ShelfView(ShelfModel* model, Shelf* shelf, ShelfWidget* shelf_widget);
   ~ShelfView() override;
@@ -179,6 +184,10 @@
                            const gfx::Vector2d& cursor_offset_from_center,
                            float scale_factor) override;
 
+  // Overridden from ash::TabletModeObserver:
+  void OnTabletModeStarted() override;
+  void OnTabletModeEnded() override;
+
   void CreateDragIconProxyByLocationWithNoAnimation(
       const gfx::Point& origin_in_screen_coordinates,
       const gfx::ImageSkia& icon,
@@ -530,6 +539,10 @@
   // The view which gets replaced by our drag icon proxy.
   views::View* drag_replaced_view_ = nullptr;
 
+  // Observes tablet mode changing.
+  ScopedObserver<ash::TabletModeController, ash::TabletModeObserver>
+      tablet_mode_observer_;
+
   // True when the icon was dragged off the shelf.
   bool dragged_off_shelf_ = false;
 
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index df1775e..c3728af7 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -1966,9 +1966,33 @@
   generator->MoveMouseTo(shelf_view_->GetBoundsInScreen().CenterPoint());
   generator->PressRightButton();
   generator->ReleaseRightButton();
+
   EXPECT_TRUE(test_api_->CloseMenu());
 }
 
+TEST_F(ShelfViewTest, TabletModeStartAndEndClosesContextMenu) {
+  // Show a context menu on the shelf
+  ui::test::EventGenerator* generator = GetEventGenerator();
+  generator->MoveMouseTo(shelf_view_->GetBoundsInScreen().CenterPoint());
+  generator->PressRightButton();
+
+  // Start tablet mode, which should close the menu.
+  shelf_view_->OnTabletModeStarted();
+
+  // Attempt to close the menu, which should already be closed.
+  EXPECT_FALSE(test_api_->CloseMenu());
+
+  // Show another context menu on the shelf.
+  generator->MoveMouseTo(shelf_view_->GetBoundsInScreen().CenterPoint());
+  generator->PressRightButton();
+
+  // End tablet mode, which should close the menu.
+  shelf_view_->OnTabletModeEnded();
+
+  // Attempt to close the menu, which should already be closed.
+  EXPECT_FALSE(test_api_->CloseMenu());
+}
+
 // Tests that the app list button shows a context menu on right click when
 // touchable app context menus are not enabled.
 TEST_F(ShelfViewTest, AppListButtonShowsContextMenu) {
diff --git a/ash/shell.cc b/ash/shell.cc
index 68939c09..bf6c846 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -176,13 +176,11 @@
 #include "services/preferences/public/cpp/pref_service_factory.h"
 #include "services/preferences/public/mojom/preferences.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
-#include "services/ui/public/interfaces/constants.mojom.h"
 #include "services/ui/ws2/gpu_interface_provider.h"
 #include "services/ui/ws2/window_service.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/env.h"
 #include "ui/aura/layout_manager.h"
-#include "ui/aura/mus/user_activity_forwarder.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/base/ui_base_features.h"
@@ -702,9 +700,6 @@
       display_configurator_(new display::DisplayConfigurator()),
       native_cursor_manager_(nullptr),
       weak_factory_(this) {
-  // TODO(sky): better refactor cash/mash dependencies. Perhaps put all cash
-  // state on ShellPortClassic. http://crbug.com/671246.
-
   display_manager_.reset(ScreenAsh::CreateDisplayManager());
   window_tree_host_manager_ = std::make_unique<WindowTreeHostManager>();
   user_metrics_recorder_ = std::make_unique<UserMetricsRecorder>();
@@ -860,9 +855,6 @@
   display_speaker_controller_.reset();
   screen_switch_check_controller_.reset();
 
-  // This also deletes all RootWindows. Note that we invoke Shutdown() on
-  // WindowTreeHostManager before resetting |window_tree_host_manager_|, since
-  // destruction of its owned RootWindowControllers relies on the value.
   ScreenAsh::CreateScreenForShutdown();
   display_configuration_controller_.reset();
 
@@ -896,11 +888,17 @@
   ime_focus_handler_.reset();
 
   shell_port_->Shutdown();
+
+  // Stop observing window activation changes before closing all windows.
+  focus_controller_->RemoveObserver(this);
+
+  // This also deletes all RootWindows. Note that we invoke Shutdown() on
+  // WindowTreeHostManager before resetting |window_tree_host_manager_|, since
+  // destruction of its owned RootWindowControllers relies on the value.
   window_tree_host_manager_->Shutdown();
 
   // Depends on |focus_controller_|, so must be destroyed before.
   window_tree_host_manager_.reset();
-  focus_controller_->RemoveObserver(this);
   focus_controller_.reset();
   screen_position_controller_.reset();
 
@@ -1010,9 +1008,7 @@
 
   wallpaper_controller_ = std::make_unique<WallpaperController>();
 
-  // TODO(sky): move creation to ShellPort.
-  if (config != Config::MASH_DEPRECATED)
-    immersive_handler_factory_ = std::make_unique<ImmersiveHandlerFactoryAsh>();
+  immersive_handler_factory_ = std::make_unique<ImmersiveHandlerFactoryAsh>();
 
   window_positioner_ = std::make_unique<WindowPositioner>();
 
@@ -1134,16 +1130,6 @@
   power_button_controller_->OnDisplayModeChanged(
       display_configurator_->cached_displays());
 
-  // Forward user activity from the window server to |user_activity_detector_|.
-  // The connector is unavailable in some tests.
-  // TODO(sky): this is dead code, clean up.
-  if (aura::Env::GetInstance()->mode() == aura::Env::Mode::MUS && connector_) {
-    ui::mojom::UserActivityMonitorPtr user_activity_monitor;
-    connector_->BindInterface(ui::mojom::kServiceName, &user_activity_monitor);
-    user_activity_forwarder_ = std::make_unique<aura::UserActivityForwarder>(
-        std::move(user_activity_monitor), user_activity_detector_.get());
-  }
-
   if (!::features::IsAshInBrowserProcess())
     client_image_registry_ = std::make_unique<ClientImageRegistry>();
 
@@ -1263,12 +1249,11 @@
   // is started.
   display_manager_->CreateMirrorWindowAsyncIfAny();
 
-  // The show taps feature can be implemented with a separate mojo app.
   // |connector_| is null in unit tests.
-  // TODO(jamescook): Make this work in ash_shell_with_content.
   if (connector_ &&
-      base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowTaps) &&
-      base::FeatureList::IsEnabled(features::kTapVisualizerApp)) {
+      base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kShowTaps)) {
+    // The show taps feature is a separate mojo app.
+    // TODO(jamescook): Make this work in ash_shell_with_content.
     connector_->StartService(tap_visualizer::mojom::kServiceName);
   }
 
@@ -1298,14 +1283,8 @@
 }
 
 void Shell::InitializeDisplayManager() {
-  const Config config = shell_port_->GetAshConfig();
   bool display_initialized = display_manager_->InitFromCommandLine();
 
-  if (!display_initialized && config != Config::CLASSIC) {
-    // Run display configuration off device in mus mode.
-    display_manager_->set_configure_displays(true);
-    display_configurator_->set_configure_display(true);
-  }
   display_configuration_controller_ =
       std::make_unique<DisplayConfigurationController>(
           display_manager_.get(), window_tree_host_manager_.get());
@@ -1323,14 +1302,7 @@
       std::make_unique<ProjectingObserver>(display_configurator_.get());
 
   if (!display_initialized) {
-    // TODO(sky): this is dead code, cleanup.
-    if (config != Config::CLASSIC && !chromeos::IsRunningAsSystemCompositor()) {
-      display::mojom::DevDisplayControllerPtr controller;
-      connector_->BindInterface(ui::mojom::kServiceName, &controller);
-      display_manager_->SetDevDisplayController(std::move(controller));
-    }
-
-    if (config != Config::CLASSIC || chromeos::IsRunningAsSystemCompositor()) {
+    if (chromeos::IsRunningAsSystemCompositor()) {
       display_change_observer_ =
           std::make_unique<display::DisplayChangeObserver>(
               display_configurator_.get(), display_manager_.get());
@@ -1357,8 +1329,7 @@
   if (!display_initialized)
     display_manager_->InitDefaultDisplay();
 
-  if (config == Config::CLASSIC)
-    display_manager_->RefreshFontParams();
+  display_manager_->RefreshFontParams();
 }
 
 void Shell::InitRootWindow(aura::Window* root_window) {
diff --git a/ash/shell.h b/ash/shell.h
index 5b013ac..0cef6be 100644
--- a/ash/shell.h
+++ b/ash/shell.h
@@ -31,7 +31,6 @@
 
 namespace aura {
 class RootWindow;
-class UserActivityForwarder;
 class Window;
 }  // namespace aura
 
@@ -811,10 +810,6 @@
 
   std::unique_ptr<ScreenPinningController> screen_pinning_controller_;
 
-  // Forwards user activity ui::mojom::UserActivityMonitor to
-  // |user_activity_detector_|. Only initialized for mash.
-  std::unique_ptr<aura::UserActivityForwarder> user_activity_forwarder_;
-
   std::unique_ptr<PeripheralBatteryNotifier> peripheral_battery_notifier_;
   std::unique_ptr<PowerEventObserver> power_event_observer_;
   std::unique_ptr<PowerPrefs> power_prefs_;
diff --git a/ash/shell/content/client/shell_browser_main_parts.cc b/ash/shell/content/client/shell_browser_main_parts.cc
index 28cce01..82bcddbb 100644
--- a/ash/shell/content/client/shell_browser_main_parts.cc
+++ b/ash/shell/content/client/shell_browser_main_parts.cc
@@ -12,7 +12,6 @@
 #include "ash/components/tap_visualizer/public/mojom/constants.mojom.h"
 #include "ash/content/content_gpu_interface_provider.h"
 #include "ash/login_status.h"
-#include "ash/public/cpp/ash_features.h"
 #include "ash/shell.h"
 #include "ash/shell/example_session_controller_client.h"
 #include "ash/shell/shell_delegate_impl.h"
@@ -120,11 +119,9 @@
   content::ServiceManagerConnection::GetForProcess()
       ->GetConnector()
       ->StartService(quick_launch::mojom::kServiceName);
-  if (base::FeatureList::IsEnabled(features::kTapVisualizerApp)) {
-    content::ServiceManagerConnection::GetForProcess()
-        ->GetConnector()
-        ->StartService(tap_visualizer::mojom::kServiceName);
-  }
+  content::ServiceManagerConnection::GetForProcess()
+      ->GetConnector()
+      ->StartService(tap_visualizer::mojom::kServiceName);
   shortcut_viewer::mojom::ShortcutViewerPtr shortcut_viewer;
   content::ServiceManagerConnection::GetForProcess()
       ->GetConnector()
diff --git a/ash/shell_state.cc b/ash/shell_state.cc
index 3df1253..5bcc2a89 100644
--- a/ash/shell_state.cc
+++ b/ash/shell_state.cc
@@ -7,6 +7,9 @@
 #include <memory>
 #include <utility>
 
+#include "ash/shell.h"
+#include "ash/ws/window_service_owner.h"
+#include "services/ui/ws2/window_service.h"
 #include "ui/display/display.h"
 #include "ui/display/screen.h"
 
@@ -48,6 +51,14 @@
   clients_.ForAllPtrs([display_id](mojom::ShellStateClient* client) {
     client->SetDisplayIdForNewWindows(display_id);
   });
+
+  // WindowService broadcasts the display id over mojo to all remote apps.
+  // TODO(jamescook): Move this into Shell when ShellState is removed.
+  WindowServiceOwner* ws_owner = Shell::Get()->window_service_owner();
+  // |ws_owner| is null during shutdown and tests. |window_service()| is null
+  // during early startup.
+  if (ws_owner && ws_owner->window_service())
+    ws_owner->window_service()->SetDisplayForNewWindows(display_id);
 }
 
 int64_t ShellState::GetDisplayIdForNewWindows() const {
diff --git a/ash/shell_state.h b/ash/shell_state.h
index b40f8d9..b338fb07 100644
--- a/ash/shell_state.h
+++ b/ash/shell_state.h
@@ -22,6 +22,9 @@
 namespace ash {
 
 // Provides access via mojo to ash::Shell state.
+// TODO(jamescook): Move |root_window_for_new_windows_| to Shell, convert
+// browser code to use display::Screen::GetDisplayForNewWindows() and delete
+// this class.
 class ASH_EXPORT ShellState : public mojom::ShellState {
  public:
   ShellState();
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb
index 6d4df82..b3fd212 100644
--- a/ash/strings/ash_strings_am.xtb
+++ b/ash/strings/ash_strings_am.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ታክሏል</translation>
 <translation id="1056775291175587022">ምንም አውታረ መረቦች የሉም</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />፦ <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">የተደራሽነት ቅንብሮችን አሳይ</translation>
 <translation id="1104621072296271835">የእርስዎ መሣሪያዎች እንዲያውም የተሻለ ይሠራሉ</translation>
 <translation id="112308213915226829">መደርደሪያን በራስ ሰር ደብቅ</translation>
 <translation id="1153356358378277386">የተጣመሩ መሣሪያዎች</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">ደካማ ሲግናል</translation>
 <translation id="1293264513303784526">USB-C መሣሪያ (የግራ ወደብ)</translation>
+<translation id="1302880136325416935">የብሉቱዝ ቅንብሮችን አሳይ። <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">ቀኝ</translation>
 <translation id="1351937230027495976">ምናሌ ሰብስብ</translation>
 <translation id="1383876407941801731">ፍለጋ </translation>
 <translation id="1467432559032391204">ግራ</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">ማስጀመሪያ</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ለአንድ መተግበሪያ ጠፍተዋል}one{የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ለ# መተግበሪያዎች ጠፍተዋል}other{የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ለ# መተግበሪያዎች ጠፍተዋል}}</translation>
 <translation id="1525508553941733066">አሰናብት</translation>
 <translation id="1537254971476575106">የሙሉ ማያ ገጽ ማጉያ</translation>
 <translation id="15373452373711364">ትልቅ የመዳፊት ጠቋሚ</translation>
 <translation id="1550523713251050646">ለተጨማሪ አማራጮች ጠቅ ያድርጉ</translation>
 <translation id="1567387640189251553">የእርስዎን የይለፍ ቃል ለመጨረሻ ጊዜ ካስገቡ ወዲህ የተለየ የቁልፍ ሰሌዳ ተገናኝቷል። የእርስዎን የቁልፍ ጭረቶች ለመስረቅ እየሞከረ ሊሆን ይችላል።</translation>
+<translation id="1570871743947603115">ብሉቱዝን አብራ ወይም አጥፋ። <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">ይህን ተጠቃሚ አስወግድ</translation>
 <translation id="1621499497873603021">ባትሪ ባዶ እስኪሆን ድረስ የቀረው ጊዜ፣ <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">ይቅርታ፣ የይለፍ ቃልዎ አሁንም ሊረጋገጥ አልቻለም። ማሳሰቢያ፦ የይለፍ ቃልዎን በቅርብ ጊዜ ቀይረው ከሆነ አዲስ የይለፍ ቃልዎ የሚተገበረው ሲወጡ ነው፣ እባክዎ የድሮውን ይለፍ ቃል እዚህ ይጠቀሙ።</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">አልታወቀም</translation>
 <translation id="1746730358044914197">የግቤት ስልቶች በእርስዎ አስተዳዳሪ ይዋቀራሉ።</translation>
 <translation id="1747827819627189109">በማያ ገጽ ላይ የቁልፍ ሰሌዳ ነቅቷል</translation>
+<translation id="1761222317188459878">የአውታረ መረብ ግንኙነትን አብራ ወይም አጥፋ። <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">ኤተርኔት፦ <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">ረዳት (በመጫን ላይ...)</translation>
 <translation id="1841545962859478868">የመሣሪያው አስተዳዳሪ የሚከተሉትን ሊከታተል ይችላል፦</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">ይህ መሣሪያ በ<ph name="DOMAIN" /> ነው የሚቀናበረው።</translation>
 <translation id="2050339315714019657">በቁመት</translation>
 <translation id="2067602449040652523">የቁልፍ ሰሌዳ ብሩህነት</translation>
+<translation id="2075212959500165896">ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።</translation>
 <translation id="2081529251031312395">$1 አሁንም በኋላ ላይ በመለያ መግባት ይችላሉ።</translation>
 <translation id="2127372758936585790">አነስተኛ ኃይል ያለው ባትሪ መሙያ</translation>
 <translation id="2135456203358955318">የተተከለ ማጉያ</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">የመስኮት አጠቃላይ እይታን ቀያይር</translation>
 <translation id="2338501278241028356">በአቅራቢያ ያሉ መሣሪያዎችን ለማግኘት ብሉቱዝን ያብሩ</translation>
 <translation id="2339073806695260576">ማስታወሻ ለመያዝ፣ ቅጽበታዊ ገጽ እይታን ለማንሳት፣ ሌዘር ጠቋሚውን ወይም ማጉያ መነጽሩን ለመጠቀም በመደርደሪያው ላይ ያለውን የስታይለስ አዝራሩን መታ ያድርጉ።</translation>
+<translation id="2341729377289034582">ወደ አቀባዊ ተቆልፏል</translation>
 <translation id="2352467521400612932">የስቲለስ ቅንብሮች</translation>
 <translation id="2354174487190027830"><ph name="NAME" />ን በማግበር ላይ</translation>
 <translation id="2359808026110333948">ቀጥል</translation>
 <translation id="2365393535144473978">የተንቀሳቃሽ ስልክ ውሂብን ማንቃት ብሉቱዝን ያነቃል።</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">አትረብሽ የሚለውን አብራ ወይም አጥፋ</translation>
 <translation id="2412593942846481727">ዝማኔ ይገኛል</translation>
+<translation id="2416346634399901812">ከ<ph name="NETWORK_NAME" /> ጋር ተገናኝቷል</translation>
 <translation id="2429753432712299108">የብሉቱዝ መሣሪያ «<ph name="DEVICE_NAME" />» ለመጣመር ፍቃድ ይፈልጋል። ከመቀበልዎ በፊት እባክዎ ይህ የይለፍ ቃል በዚያ መሣሪያ ላይ የሚታይ መሆኑን ያረጋግጡ፦ <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">ማስታወቂያዎች</translation>
 <translation id="2484513351006226581">የቁልፍ ሰሌዳ አቀማመጥን ለመቀየር <ph name="KEYBOARD_SHORTCUT" />ን ይጫኑ</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">ግንኑነት ያክሉ</translation>
 <translation id="2961963223658824723">የሆነ ስህተት ተከስቷል። በጥቂት ሰከንዶች ውስጥ እንደገና ይሞክሩ።</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">የCast መሣሪያዎችን አሳይ።</translation>
 <translation id="2996462380875591307">የተተከለ ማጉያ ነቅቷል። እንደገና እንዲጠፋ አድርጎ ለመቀያየር Ctrl+ፍለጋ+D ይጫኑ።</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> በ<ph name="DOMAIN" /> የሚቀናበር ይፋዊ ክፍለ ጊዜ ነው</translation>
 <translation id="3000461861112256445">ሞኖ ኦዲዮ</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">የተንቀሳቃሽ ስልክ ውሂብ</translation>
 <translation id="3151786313568798007">አቀማመጥ</translation>
 <translation id="3153444934357957346">በአንድ ጊዜ ብዙ መግባት ላይ እስከ <ph name="MULTI_PROFILE_USER_LIMIT" /> መለያዎች ድረስ ብቻ ነው ሊኖርዎት የሚችለው።</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ከአንድ መሣሪያ ጋር ተገናኝቷል}one{ከ# መሣሪያዎች ጋር ተገናኝቷል}other{ከ# መሣሪያዎች ጋር ተገናኝቷል}}</translation>
 <translation id="3236488194889173876">ምንም የተንቀሳቃሽ ስልክ አውታረ መረብ የለም</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">እንግዳ</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">ቆልፍ</translation>
 <translation id="3798670284305777884">ድምጽ ማጉያ (ውስጣዊ)</translation>
 <translation id="380165613292957338">ጤና ይስጥልኝ፣ እንዴት ልርዳዎት?</translation>
+<translation id="383629559565718788">የቁልፍ ሰሌዳ ቅንብሮችን አሳይ</translation>
 <translation id="3846575436967432996">ምንም የአውታረ መረብ መረጃ አይገኝም</translation>
 <translation id="385051799172605136">ተመለስ</translation>
 <translation id="3891340733213178823">ዘግተው ለመውጣት Ctrl+Shift+Qን ሁለቴ ይጫኑ።</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">መካከለኛ ሲግናል</translation>
 <translation id="4200057768455216496">የተተከለውን የማጉያ አቋራጭ ተጭነዋል። ሊያበሩት ይፈልጋሉ?</translation>
 <translation id="4217571870635786043">በቃል ማስጻፍ</translation>
+<translation id="4261870227682513959">የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች ጠፍተዋል</translation>
 <translation id="4274921305979314545">የእርስዎን Chromebook ከእርስዎ ስልክ ጋር ያገናኙ</translation>
 <translation id="4279490309300973883">በማንጸባረቅ ላይ</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" />ን በማግበር ላይ</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome ስርዓተ ክወና</translation>
 <translation id="4338109981321384717">ማጉያ መነጽር</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">ከ«<ph name="FROM_LOCALE" />» ወደ «<ph name="TO_LOCALE" />» የእርስዎን ቅንብሮች ከማመሳሰል በኋላ።</translation>
 <translation id="574392208103952083">መካከለኛ</translation>
 <translation id="5744083938413354016">መታ አድርጎ መጎተት</translation>
+<translation id="5750765938512549687">ብሉቱዝ ጠፍቷል</translation>
 <translation id="5777841717266010279">ማያ ገጽ ማጋራት ይቁም?</translation>
 <translation id="57838592816432529">ድምጽ ይዝጉ</translation>
 <translation id="5805697420284793859">የWindow አስተዳዳሪ</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">የማያ ገጽ ላይ ቁልፍ ሰሌዳ አሳይ</translation>
 <translation id="6164005077879661055">ይህ ክትትል የሚደረግበት ተጠቃሚ አንዴ ከተወገደ በኋላ ሁሉም ከዚህ ክትትል የሚደረግበት ተጠቃሚ ጋር የተጎዳኙ ፋይሎች እና አካባቢያዊ ውሂብ እስከመጨረሻው ይሰረዛሉ። አስተዳዳሪው የዚህ ክትትል የሚደረግበት ተጠቃሚ የጎበኛቸው ድር ጣቢያዎች እና ቅንብሮች <ph name="MANAGEMENT_URL" /> ላይ ሊያዩት ይችላሉ።</translation>
 <translation id="6165508094623778733">ተጨማሪ ለመረዳት</translation>
+<translation id="6254629735336163724">ወደ አግድም ተቆልፏል</translation>
 <translation id="6259254695169772643">ለመጠቀም የእርስዎን ስታይለስ ይጠቀሙ</translation>
 <translation id="6267036997247669271"><ph name="NAME" />፦ በማግበር ላይ...</translation>
 <translation id="6284232397434400372">ጥራቱ ተቀይሯል</translation>
 <translation id="6297287540776456956">ክልል ለመምረጥ ስቲለሱን ይጠቀሙ</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ወደ <ph name="ROTATION" /> ዞሯል</translation>
 <translation id="632744581670418035">የቁልፍ ሰሌዳ ተደራቢ</translation>
+<translation id="6376931439017688372">ብሉቱዝ በርቷል</translation>
 <translation id="639644700271529076">CAPS LOCK ጠፍቷል</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">ሁሉም ተከናውኗል</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">ይህ አውታረ መረብ በአስተዳዳሪዎ ነው የተሰናከለው።</translation>
 <translation id="7067196344162293536">በራስ-አሽከርክር</translation>
 <translation id="7076293881109082629">በመግባት ላይ</translation>
+<translation id="7092922358121866860">የማታ ብርሃን ቅንብሮችን አሳይ</translation>
 <translation id="7098389117866926363">USB-C መሣሪያ (የግራ ወደብ ከኋላ በኩል)</translation>
 <translation id="7131634465328662194">በራስሰር ዘግተው እንዲወጡ ይደረጋሉ።</translation>
 <translation id="7143207342074048698">በመያያዝ ላይ</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">ለመሰረዝ Search ወይም Shift ይጫኑ።</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> እና <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">ጠንካራ ሲግናል</translation>
+<translation id="7842211907556571265">ከ<ph name="NETWORK_NAME" /> ጋር በመገናኘት ላይ...</translation>
 <translation id="7842569679327885685">ማስጠንቀቂያ፦ የሙከራ ባህሪ</translation>
 <translation id="7846634333498149051">የቁልፍ ሰሌዳ</translation>
 <translation id="790040513076446191">ከግላዊነት ጋር የተገናኙ ቅንብሮችን ይቆጣጠሩ</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />፦ ዳግም በማገናኘት ላይ...</translation>
 <translation id="8513108775083588393">በራስ ሰር አሽከርክር</translation>
 <translation id="8517041960877371778">የእርሰዎ <ph name="DEVICE_TYPE" /> እንደበራ ኃይል መሙላት አይችሉ ይሆናል።</translation>
+<translation id="8627191004499078455">ከ<ph name="DEVICE_NAME" /> ጋር ተገናኝቷል</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> ይቀራል</translation>
 <translation id="8649101189709089199">ለመናገር-ይምረጡ</translation>
 <translation id="8652175077544655965">ቅንብሮችን ዝጋ</translation>
+<translation id="8653151467777939995">የማሳወቂያ ቅንብሮችን አሳይ። ማሳወቂያዎች በርተዋል</translation>
+<translation id="8664753092453405566">የአውታረ መረብ ዝርዝርን አሳይ። <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">አነስተኛ ኃይል ያለው ባትሪ መሙያ ተገናኝቷል</translation>
 <translation id="8683506306463609433">የአፈጻጸም ክትትል ገቢር ነው</translation>
 <translation id="8734991477317290293">የእርስዎን የቁልፍ ጭረቶች ለመስረቅ እየሞከረ ሊሆን ይችላል</translation>
+<translation id="8735953464173050365">የቁልፍ ሰሌዳ ቅንብሮችን አሳይ። <ph name="KEYBOARD_NAME" /> ተመርጧል</translation>
+<translation id="875593634123171288">የቪፒኤን ቅንብሮችን አሳይ</translation>
 <translation id="8809737090443522491">የአንድ መተግበሪያ ወይም ሰነድ ስም ይተይቡ</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">ከሁለት ማሳያዎች በላይ ማንጸባረቅ አይደገፍም።</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">የተመለስ አዝራር</translation>
+<translation id="8843682306134542540">የማሽከርከሪያ ቁልፍን አብራ ወይም አጥፋ። <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">መተግበሪያው የተከፈለ ማያ ገጽን አይደግፍም።</translation>
 <translation id="8874184842967597500">አልተገናኘም</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index 8629e6d..12079965 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">تمت إضافة جهاز <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">لم يتم العثور على أي شبكات.</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">عرض إعدادات إمكانية الوصول</translation>
 <translation id="1104621072296271835">تعمل أجهزتك بشكل أفضل وهي مرتبطة معًا</translation>
 <translation id="112308213915226829">الإخفاء التلقائي للرف</translation>
 <translation id="1153356358378277386">الأجهزة المقترنة</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">إشارة ضعيفة</translation>
 <translation id="1293264513303784526">‏جهاز USB-C (المنفذ الأيسر)</translation>
+<translation id="1302880136325416935">عرض إعدادات البلوتوث. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">يمين</translation>
 <translation id="1351937230027495976">تصغير القائمة</translation>
 <translation id="1383876407941801731">البحث</translation>
 <translation id="1467432559032391204">اليسار</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">المشغّل</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لتطبيق واحد}zero{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيق}two{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لتطبيقين (#)}few{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيقات}many{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيقًا}other{عرض إعدادات الإشعارات. تم إيقاف الإشعارات لـ # تطبيق}}</translation>
 <translation id="1525508553941733066">رفض</translation>
 <translation id="1537254971476575106">مكبّر بملء الشاشة</translation>
 <translation id="15373452373711364">مؤشر الماوس الكبير</translation>
 <translation id="1550523713251050646">انقر للحصول على المزيد من الخيارات</translation>
 <translation id="1567387640189251553">تم توصيل لوحة مفاتيح مختلفة منذ آخر إدخال لكلمة المرور، وقد يكون ذلك محاولةً لسرقة ضغطات المفاتيح.</translation>
+<translation id="1570871743947603115">تبديل البلوتوث. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">إزالة هذا المستخدم</translation>
 <translation id="1621499497873603021">الوقت المتبقي حتى تصبح البطارية فارغة <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">عذرًا، لا يمكن التحقق من كلمة المرور حتى الآن. ملاحظة: في حال تغيير كلمة المرور مؤخرًا، سيتم تطبيق كلمة المرور الجديدة بعد تسجيل الخروج، يُرجى استخدام كلمة المرور القديمة هنا.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">لم يتم التعرف عليها</translation>
 <translation id="1746730358044914197">تتم تهيئة طرق الإدخال بواسطة المشرف.</translation>
 <translation id="1747827819627189109">تم تفعيل لوحة المفاتيح على الشاشة</translation>
+<translation id="1761222317188459878">تبديل الاتصال بالشبكة. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">الإيثرنت: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">المساعد (جارٍ التحميل...)</translation>
 <translation id="1841545962859478868">قد يراقب مشرف الجهاز ما يلي:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">تتم إدارة هذا الجهاز بواسطة <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">رأسي</translation>
 <translation id="2067602449040652523">سطوع لوحة المفاتيح</translation>
+<translation id="2075212959500165896">تمّ إجراء محاولات كثيرة. يُرجى إعادة المحاولة لاحقًا.</translation>
 <translation id="2081529251031312395">سيظل بإمكان $1 تسجيل الدخول لاحقًا.</translation>
 <translation id="2127372758936585790">شاحن منخفض الطاقة</translation>
 <translation id="2135456203358955318">المكبّر الذي تم إرساؤه</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">نظرة عامة لنافذة التبديل</translation>
 <translation id="2338501278241028356">تشغيل البلوتوث لاكتشاف الأجهزة القريبة</translation>
 <translation id="2339073806695260576">انقر على زر قلم الشاشة على الرف لتدوين ملاحظة أو للحصول على لقطة شاشة أو لاستخدام مؤشر الليزر أو العدسة المكبرة.</translation>
+<translation id="2341729377289034582">تم القفل على الوضع العمودي</translation>
 <translation id="2352467521400612932">إعدادات قلم الشاشة</translation>
 <translation id="2354174487190027830">تفعيل <ph name="NAME" /></translation>
 <translation id="2359808026110333948">المتابعة</translation>
 <translation id="2365393535144473978">سيؤدي تفعيل ميزة بيانات الجوّال إلى تفعيل البلوتوث.</translation>
 <translation id="2391579633712104609">180 درجة</translation>
+<translation id="239188844683466770">تبديل حالة "الرجاء عدم الإزعاج"</translation>
 <translation id="2412593942846481727">هناك تحديث جديد</translation>
+<translation id="2416346634399901812">تم الاتصال بشبكة <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">يريد جهاز بلوتوث "<ph name="DEVICE_NAME" />" الحصول على إذن للإقران. قبل القبول، يُرجى التأكد أن مفتاح المرور هذا يظهر في هذا الجهاز: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">الاشعارات</translation>
 <translation id="2484513351006226581">انقر على <ph name="KEYBOARD_SHORTCUT" /> لتبديل تنسيق لوحة المفاتيح.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">إضافة اتصال</translation>
 <translation id="2961963223658824723">حدث خطأ. يُرجى إعادة المحاولة خلال بضع ثوانٍ.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">عرض أجهزة البث.</translation>
 <translation id="2996462380875591307">‏تم تفعيل المكبّر. يمكنك إيقافه بالضغط على Ctrl+Search+D مرة أخرى.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> هي جلسة عامة يديرها <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">صوت أحادي</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">بيانات الجوال</translation>
 <translation id="3151786313568798007">الاتجاه</translation>
 <translation id="3153444934357957346">يمكنك الحصول فقط على ما يصل إلى <ph name="MULTI_PROFILE_USER_LIMIT" /> حساب في الدخول المتعدد.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{تم الاتصال بجهاز واحد}zero{تم الاتصال بـ # جهاز}two{تم الاتصال بجهازين (#)}few{تم الاتصال بـ # أجهزة}many{تم الاتصال بـ # جهازًا}other{تم الاتصال بـ # جهاز}}</translation>
 <translation id="3236488194889173876">ليست هناك شبكة جوّال متاحة</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ضيف</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">قفل</translation>
 <translation id="3798670284305777884">سماعة (داخلية)</translation>
 <translation id="380165613292957338">مرحبًا، كيف يمكنني مساعدتك؟</translation>
+<translation id="383629559565718788">عرض إعدادات لوحة المفاتيح</translation>
 <translation id="3846575436967432996">لا توجد معلومات متاحة حول الشبكة</translation>
 <translation id="385051799172605136">الرجوع إلى الوراء</translation>
 <translation id="3891340733213178823">‏للخروج اضغط على Ctrl+Shift+Q مرتين.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">إشارة متوسطة</translation>
 <translation id="4200057768455216496">لقد ضغطت على اختصار المُكبِّر الذي تم إرساؤه. هل ترغب في تفعيله؟</translation>
 <translation id="4217571870635786043">إملاء</translation>
+<translation id="4261870227682513959">عرض إعدادات الإشعارات. تم إيقاف الإشعارات</translation>
 <translation id="4274921305979314545">‏ربط جهاز Chromebook بهاتفك</translation>
 <translation id="4279490309300973883">النسخ المطابق</translation>
+<translation id="4292681942966152062">جارٍ تفعيل <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">العدسة المكبرة</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">من "<ph name="FROM_LOCALE" />" إلى "<ph name="TO_LOCALE" />" بعد مزامنة الإعدادات.</translation>
 <translation id="574392208103952083">متوسط</translation>
 <translation id="5744083938413354016">السحب بعد النقر</translation>
+<translation id="5750765938512549687">تم إيقاف البلوتوث</translation>
 <translation id="5777841717266010279">هل ترغب في إيقاف مشاركة الشاشة؟</translation>
 <translation id="57838592816432529">كتم الصوت</translation>
 <translation id="5805697420284793859">مدير النوافذ</translation>
@@ -273,12 +288,14 @@
 <translation id="6164005077879661055">سيتم حذف جميع الملفات والبيانات المحلية المقترنة بالمستخدم الذي يخضع للإشراف نهائيًا بمجرد 
 إزالة هذا المستخدم الذي يخضع للإشراف. وقد تظل مواقع الويب التي تم الانتقال إليها والإعدادات التابعة للمستخدم الذي يخضع للإشراف مرئية للمدير على <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">مزيد من المعلومات</translation>
+<translation id="6254629735336163724">تم القفل على الوضع الأفقي</translation>
 <translation id="6259254695169772643">استخدام قلم الشاشة للاختيار</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: جارٍ التفعيل...</translation>
 <translation id="6284232397434400372">تم تغيير درجة الدقة</translation>
 <translation id="6297287540776456956">استخدام قلم الشاشة لتحديد منطقة</translation>
 <translation id="6310121235600822547">تم تدوير <ph name="DISPLAY_NAME" /> إلى <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">تراكب لوحة المفاتيح</translation>
+<translation id="6376931439017688372">تم تفعيل البلوتوث</translation>
 <translation id="639644700271529076">‏مفتاح CAPS LOCK قيد الإيقاف</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">ليس لديك أي إشعارات</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">تم إيقاف هذه الشبكة من قِبل مشرفك.</translation>
 <translation id="7067196344162293536">تدوير تلقائي</translation>
 <translation id="7076293881109082629">تسجيل الدخول</translation>
+<translation id="7092922358121866860">عرض إعدادات "الإضاءة الليلية"</translation>
 <translation id="7098389117866926363">‏جهاز USB-C (المنفذ الأيسر في الخلف)</translation>
 <translation id="7131634465328662194">سيتم تسجيل خروجك تلقائيًا.</translation>
 <translation id="7143207342074048698">اتصال</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">‏اضغط على مفتاح البحث أو المفتاح Shift للإلغاء.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> و<ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">إشارة قوية</translation>
+<translation id="7842211907556571265">جارٍ الاتصال بشبكة <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">تحذير: ميزة تجريبية</translation>
 <translation id="7846634333498149051">لوحة المفاتيح</translation>
 <translation id="790040513076446191">معالجة الإعدادات المتعلقة بالخصوصية</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" /> : جارٍ إعادة الاتصال ...</translation>
 <translation id="8513108775083588393">التدوير تلقائي</translation>
 <translation id="8517041960877371778">قد يتعذر شحن <ph name="DEVICE_TYPE" /> أثناء التشغيل.</translation>
+<translation id="8627191004499078455">تم الاتصال بجهاز <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">يتبقى <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">سماع الاختيار</translation>
 <translation id="8652175077544655965">غلق الإعدادات</translation>
+<translation id="8653151467777939995">عرض إعدادات الإشعارات. تم تفعيل الإشعارات</translation>
+<translation id="8664753092453405566">عرض قائمة الشبكات. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270 درجة</translation>
 <translation id="8676770494376880701">تمّ توصيل شاحن منخفض الطاقة</translation>
 <translation id="8683506306463609433">تتبّع الأداء نشط</translation>
 <translation id="8734991477317290293">قد تحاول لوحة المفاتيح سرقة ضغطات المفاتيح.</translation>
+<translation id="8735953464173050365">عرض إعدادات لوحة المفاتيح. تم اختيار <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">‏عرض إعدادات الشبكة الظاهرية الخاصة (VPN)</translation>
 <translation id="8809737090443522491">كتابة اسم التطبيق أو المستند</translation>
 <translation id="8814190375133053267">‏لاسلكي، Wi-Fi</translation>
 <translation id="8825534185036233643">النسخ المطابق بأكثر من عرضين غير مدعوم.</translation>
 <translation id="8828714802988429505">90 درجة</translation>
 <translation id="8841375032071747811">زر الرجوع</translation>
+<translation id="8843682306134542540">تبديل قفل التدوير. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">التطبيق لا يتيح تقسيم الشاشة.</translation>
 <translation id="8874184842967597500">غير متصل</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb
index 8d54462..8a584bb2 100644
--- a/ash/strings/ash_strings_bg.xtb
+++ b/ash/strings/ash_strings_bg.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Добавихте <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Няма мрежи</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Показване на настройките за достъпност</translation>
 <translation id="1104621072296271835">Устройствата ви работят още по-добре заедно</translation>
 <translation id="112308213915226829">Автоматично скриване на лавицата</translation>
 <translation id="1153356358378277386">Сдвоени устройства</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401">„<ph name="DISPLAY_NAME" />“ (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">слаб сигнал</translation>
 <translation id="1293264513303784526">USB-C устройство (левият порт)</translation>
+<translation id="1302880136325416935">Показване на настройките за Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Надясно</translation>
 <translation id="1351937230027495976">Свиване на менюто</translation>
 <translation id="1383876407941801731">Търсене</translation>
 <translation id="1467432559032391204">Наляво</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Стартов панел</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Показване на настройките за известия. Известията са изключени за едно приложение}other{Показване на настройките за известия. Известията са изключени за # приложения}}</translation>
 <translation id="1525508553941733066">ОТХВЪРЛЯНЕ</translation>
 <translation id="1537254971476575106">Лупа за увеличаване на целия екран</translation>
 <translation id="15373452373711364">Голям курсор на мишката</translation>
 <translation id="1550523713251050646">Кликнете за още опции</translation>
 <translation id="1567387640189251553">Свързана е различна клавиатура, откакто последно въведохте паролата си. Тя може да се опитва да записва кои клавиши натискате.</translation>
+<translation id="1570871743947603115">Превключване на Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Премахване на този потребител</translation>
 <translation id="1621499497873603021">Оставащо време до изразходването на батерията: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">За съжаление, паролата ви пак не можа да бъде потвърдена. Забележка: Ако наскоро сте я променили, новата ще влезе в сила, след като излезете от профила си. Моля, използвайте старата парола тук.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Не е разпознато</translation>
 <translation id="1746730358044914197">Методите на въвеждане са конфигурирани от администратора ви.</translation>
 <translation id="1747827819627189109">Екранната клавиатура е активирана</translation>
+<translation id="1761222317188459878">Превключване на връзката с мрежа. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Асистент (зарежда се...)</translation>
 <translation id="1841545962859478868">Администраторът на устройството може да наблюдава следното:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Това устройство се управлява от <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Вертикално</translation>
 <translation id="2067602449040652523">Яркост на клавиатурата</translation>
+<translation id="2075212959500165896">Твърде много опити. Опитайте отново по-късно.</translation>
 <translation id="2081529251031312395">$1 пак може да влезе в профила си по-късно.</translation>
 <translation id="2127372758936585790">Зарядно устройство с малка мощност</translation>
 <translation id="2135456203358955318">Лупа в прикрепен режим</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Превключване на общия преглед на прозорците</translation>
 <translation id="2338501278241028356">Включете Bluetooth, за да бъдат открити устройствата в близост</translation>
 <translation id="2339073806695260576">Докоснете бутона с икона на писалка в лавицата, за да създадете бележка, да направите екранна снимка или да използвате лазерната показалка или лупата.</translation>
+<translation id="2341729377289034582">Заключено във вертикална ориентация</translation>
 <translation id="2352467521400612932">Настройки за писалката</translation>
 <translation id="2354174487190027830">„<ph name="NAME" />“ се активира</translation>
 <translation id="2359808026110333948">Напред</translation>
 <translation id="2365393535144473978">Активирането на мобилните данни ще включи Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Превключване на режима „Не безпокойте“</translation>
 <translation id="2412593942846481727">Налице е актуализация</translation>
+<translation id="2416346634399901812">Установена е връзка (<ph name="NETWORK_NAME" />)</translation>
 <translation id="2429753432712299108">Устройството с Bluetooth „<ph name="DEVICE_NAME" />“ иска разрешение за сдвояване. Преди да приемете, моля, уверете се, че на него се показва следният ключ за достъп: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Известия</translation>
 <translation id="2484513351006226581">Натиснете <ph name="KEYBOARD_SHORTCUT" /> за превключване на клавиатурната подредба.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Добавяне на връзка</translation>
 <translation id="2961963223658824723">Нещо се обърка. Опитайте отново след няколко секунди.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Показване на устройствата за предаване.</translation>
 <translation id="2996462380875591307">Лупата в прикрепен режим е активирана. За да я изключите, натиснете отново Ctrl + клавиш „Търсене“ + D.</translation>
 <translation id="2999742336789313416">„<ph name="DISPLAY_NAME" />“ е обществена сесия, управлявана от <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Монозвук</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Мобилни данни</translation>
 <translation id="3151786313568798007">Ориентация</translation>
 <translation id="3153444934357957346">Можете да използвате най-много <ph name="MULTI_PROFILE_USER_LIMIT" /> профила с функцията за централизиран вход.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Установена е връзка с едно устройство}other{Установена е връзка с # устройства}}</translation>
 <translation id="3236488194889173876">Няма мобилни мрежи</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гост</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Заключване</translation>
 <translation id="3798670284305777884">Високоговорител (вътрешен)</translation>
 <translation id="380165613292957338">Здравейте, как мога да помогна?</translation>
+<translation id="383629559565718788">Показване на настройките на клавиатурата</translation>
 <translation id="3846575436967432996">Не е налице информация за мрежата</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3891340733213178823">Натиснете два пъти „Ctrl+Shift+Q“ за изход.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">умерен сигнал</translation>
 <translation id="4200057768455216496">Използвахте клавишната комбинация за лупата в прикрепен режим. Искате ли да включите функцията?</translation>
 <translation id="4217571870635786043">Диктуване</translation>
+<translation id="4261870227682513959">Показване на настройките за известия. Известията са изключени</translation>
 <translation id="4274921305979314545">Свържете своя Chromebook с телефона си</translation>
 <translation id="4279490309300973883">Дублиране</translation>
+<translation id="4292681942966152062">Мрежата се активира (<ph name="NETWORK_NAME" />)</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Лупа</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">От <ph name="FROM_LOCALE" /> към <ph name="TO_LOCALE" /> след синхронизиране на настройките ви.</translation>
 <translation id="574392208103952083">Среден</translation>
 <translation id="5744083938413354016">Преместване чрез докосване</translation>
+<translation id="5750765938512549687">Функцията за Bluetooth е изключена</translation>
 <translation id="5777841717266010279">Да се спре ли споделянето на екрана?</translation>
 <translation id="57838592816432529">Заглушаване</translation>
 <translation id="5805697420284793859">Мениджър на прозорците</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Показване на екранната клавиатура</translation>
 <translation id="6164005077879661055">Всички файлове и локални данни, свързани с контролирания потребител, ще бъдат изтрити за постоянно, щом той бъде премахнат. Посетените уебсайтове и настройките за него може все още да се виждат от мениджъра на адрес <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Научете повече</translation>
+<translation id="6254629735336163724">Заключено в хоризонтална ориентация</translation>
 <translation id="6259254695169772643">Използвайте писалката за избиране</translation>
 <translation id="6267036997247669271">„<ph name="NAME" />“: Активира се...</translation>
 <translation id="6284232397434400372">Разделителната способност е променена</translation>
 <translation id="6297287540776456956">Използвайте писалката, за да изберете област</translation>
 <translation id="6310121235600822547">Завъртяхте „<ph name="DISPLAY_NAME" />“ на <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Наслагване върху клавиатурата</translation>
+<translation id="6376931439017688372">Функцията за Bluetooth е включена</translation>
 <translation id="639644700271529076">„CAPS LOCK“ е изключен</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Всичко е готово</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Тази мрежа е деактивирана от администратора ви.</translation>
 <translation id="7067196344162293536">Автоматично завъртане</translation>
 <translation id="7076293881109082629">Влизате</translation>
+<translation id="7092922358121866860">Показване на настройките за Нощно осветление</translation>
 <translation id="7098389117866926363">Устройство с USB-C (левият порт на гърба)</translation>
 <translation id="7131634465328662194">Ще излезете автоматично.</translation>
 <translation id="7143207342074048698">Свързва се</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Натиснете клавиша „търсене“ или Shift, за да анулирате.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> и <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">силен сигнал</translation>
+<translation id="7842211907556571265">Установява се връзка (<ph name="NETWORK_NAME" />)</translation>
 <translation id="7842569679327885685">Предупреждение: Експериментална функция</translation>
 <translation id="7846634333498149051">Клавиатура</translation>
 <translation id="790040513076446191">Манипулиране на свързаните с поверителността настройки</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Установява се повторна връзка...</translation>
 <translation id="8513108775083588393">Автоматична ориентация</translation>
 <translation id="8517041960877371778">Възможно е вашият <ph name="DEVICE_TYPE" /> да не се зарежда, докато е включен.</translation>
+<translation id="8627191004499078455">Установена е връзка (<ph name="DEVICE_NAME" />)</translation>
 <translation id="8639760480004882931">Батерия: <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Прочитане на глас</translation>
 <translation id="8652175077544655965">Затваряне на настройките</translation>
+<translation id="8653151467777939995">Показване на настройките за известия. Известията са включени</translation>
+<translation id="8664753092453405566">Показване на списъка с мрежи. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Свързано е зарядно устройство с малка мощност</translation>
 <translation id="8683506306463609433">Проследяването на ефективността е активно</translation>
 <translation id="8734991477317290293">Тя може да се опитва да записва кои клавиши натискате</translation>
+<translation id="8735953464173050365">Показване на настройките на клавиатурата. Избран метод на въвеждане: <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Показване на настройките за VPN</translation>
 <translation id="8809737090443522491">Въведете името на приложение или документ</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Дублирането с повече от два екрана не се поддържа.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Бутон за връщане назад</translation>
+<translation id="8843682306134542540">Превключване на функцията за заключване на завъртането. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">търсене + Esc</translation>
 <translation id="8870509716567206129">Приложението не поддържа разделен екран.</translation>
 <translation id="8874184842967597500">Няма връзка</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb
index 3150266..a54aa8a 100644
--- a/ash/strings/ash_strings_ca.xtb
+++ b/ash/strings/ash_strings_ca.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">S'ha afegit <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Cap xarxa</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Mostra la configuració d'accessibilitat</translation>
 <translation id="1104621072296271835">Els teus dispositius funcionen encara millor junts</translation>
 <translation id="112308213915226829">Amaga el prestatge automàticament</translation>
 <translation id="1153356358378277386">Dispositius vinculats</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Senyal feble</translation>
 <translation id="1293264513303784526">Dispositiu USB-C (port esquerre)</translation>
+<translation id="1302880136325416935">Mostra la configuració del Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">A la dreta</translation>
 <translation id="1351937230027495976">Replega el menú</translation>
 <translation id="1383876407941801731">Cerca</translation>
 <translation id="1467432559032391204">A l'esquerra</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Menú d'aplicacions</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostra la configuració de les notificacions. Les notificacions estan desactivades en una aplicació.}other{Mostra la configuració de les notificacions. Les notificacions estan desactivades en # aplicacions.}}</translation>
 <translation id="1525508553941733066">IGNORA</translation>
 <translation id="1537254971476575106">Lupa de pantalla completa</translation>
 <translation id="15373452373711364">Cursor del ratolí gran</translation>
 <translation id="1550523713251050646">Feu clic per veure més opcions</translation>
 <translation id="1567387640189251553">S'ha connectat un altre teclat des de la darrera vegada que vas introduir la contrasenya. Pot ser que estigui provant de robar-te les combinacions de tecles.</translation>
+<translation id="1570871743947603115">Activa o desactiva el Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Suprimeix aquest usuari</translation>
 <translation id="1621499497873603021">Temps que queda fins que no s'esgoti la bateria: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Encara no s'ha pogut verificar la contrasenya. Nota: si fa poc que has canviat la contrasenya, la nova s'aplicarà un cop hagis tancat la sessió. Fes servir la contrasenya anterior aquí.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">No s'ha reconegut</translation>
 <translation id="1746730358044914197">Els mètodes d'introducció estan configurats per l'administrador.</translation>
 <translation id="1747827819627189109">Teclat en pantalla activat</translation>
+<translation id="1761222317188459878">Activa o desactiva la connexió a la xarxa. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (s'està carregant...)</translation>
 <translation id="1841545962859478868">És possible que l'administrador del dispositiu supervisi el següent:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Aquest dispositiu està gestionat per <ph name="DOMAIN" /></translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brillantor del teclat</translation>
+<translation id="2075212959500165896">S'han fet massa intents. Torna-ho a provar més tard.</translation>
 <translation id="2081529251031312395">$1 pot iniciar la sessió més tard.</translation>
 <translation id="2127372758936585790">Carregador de baix consum</translation>
 <translation id="2135456203358955318">Lupa acoblada</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Commuta la visió general de la finestra</translation>
 <translation id="2338501278241028356">Activa el Bluetooth per detectar dispositius propers</translation>
 <translation id="2339073806695260576">Toca el botó del llapis òptic al prestatge per escriure una nota, fer una captura de pantalla o bé utilitzar-lo com a punter làser o lupa.</translation>
+<translation id="2341729377289034582">Bloquejada en vertical</translation>
 <translation id="2352467521400612932">Configuració del llapis òptic</translation>
 <translation id="2354174487190027830">S'està activant <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2365393535144473978">En activar les dades mòbils s'activarà el Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Activa o desactiva el mode No molestis</translation>
 <translation id="2412593942846481727">Hi ha una actualització disponible</translation>
+<translation id="2416346634399901812">Connectat a <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">El dispositiu Bluetooth "<ph name="DEVICE_NAME" />" sol·licita permís per emparellar-se. Abans d'acceptar, comproveu que aquesta clau d'accés es mostri al dispositiu: <ph name="PASSKEY" />.</translation>
 <translation id="2482878487686419369">Notificacions</translation>
 <translation id="2484513351006226581">Prem <ph name="KEYBOARD_SHORTCUT" /> per canviar el disseny del teclat.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Afegeix una connexió</translation>
 <translation id="2961963223658824723">S'ha produït un error. Torna-ho a provar d'aquí a uns quants segons.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Mostra els dispositius d'emissió</translation>
 <translation id="2996462380875591307">La lupa acoblada està activada. Torna a prémer Ctrl+Cerca+D per desactivar-la.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> és una sessió pública gestionada per <ph name="DOMAIN" />.</translation>
 <translation id="3000461861112256445">Àudio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Dades mòbils</translation>
 <translation id="3151786313568798007">Orientació</translation>
 <translation id="3153444934357957346">Només pots tenir <ph name="MULTI_PROFILE_USER_LIMIT" /> comptes com a màxim en un inici de sessió múltiple.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connectat a un dispositiu}other{Connectat a # dispositius}}</translation>
 <translation id="3236488194889173876">No hi ha cap xarxa mòbil disponible</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="3294437725009624529">Convidat</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Bloqueja</translation>
 <translation id="3798670284305777884">Altaveu (intern)</translation>
 <translation id="380165613292957338">Hola, en què et puc ajudar?</translation>
+<translation id="383629559565718788">Mostra la configuració del teclat</translation>
 <translation id="3846575436967432996">No hi ha informació de xarxa disponible</translation>
 <translation id="385051799172605136">Enrere</translation>
 <translation id="3891340733213178823">Premeu Ctrl+Maj+Q dues vegades per tancar la sessió.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Senyal mitjà</translation>
 <translation id="4200057768455216496">Has premut la drecera de la lupa acoblada. Vols activar-la?</translation>
 <translation id="4217571870635786043">Dictat</translation>
+<translation id="4261870227682513959">Mostra la configuració de notificacions. Les notificacions estan desactivades.</translation>
 <translation id="4274921305979314545">Connecta Chromebook al telèfon</translation>
 <translation id="4279490309300973883">S'està creant una rèplica</translation>
+<translation id="4292681942966152062">S'està activant <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lupa</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Després de sincronitzar la configuració, canvia <ph name="FROM_LOCALE" /> per <ph name="TO_LOCALE" />.</translation>
 <translation id="574392208103952083">Mitjà</translation>
 <translation id="5744083938413354016">Tocar i arrossegar</translation>
+<translation id="5750765938512549687">El Bluetooth està desactivat</translation>
 <translation id="5777841717266010279">Voleu deixar de compartir la pantalla?</translation>
 <translation id="57838592816432529">Silencia</translation>
 <translation id="5805697420284793859">Gestor de finestres</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Mostra el teclat en pantalla</translation>
 <translation id="6164005077879661055">Tots els fitxers i les dades locals associats amb l'usuari supervisat se suprimiran permanentment quan aquest usuari supervisat se suprimeixi. És possible que el gestor encara pugui veure els llocs web visitats i la configuració d'aquest usuari supervisat a la pàgina <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Més informació</translation>
+<translation id="6254629735336163724">Bloquejada en horitzontal</translation>
 <translation id="6259254695169772643">Fes servir el llapis òptic per seleccionar</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: s'està activant...</translation>
 <translation id="6284232397434400372">S'ha canviat la resolució</translation>
 <translation id="6297287540776456956">Utilitza el llapis òptic per seleccionar una part</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> s'ha canviat a <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Superposició de teclat</translation>
+<translation id="6376931439017688372">Bluetooth està activat</translation>
 <translation id="639644700271529076">Bloq Maj està desactivat</translation>
 <translation id="6406704438230478924">AltGr</translation>
 <translation id="643147933154517414">Fet</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">L'administrador ha desactivat aquesta xarxa.</translation>
 <translation id="7067196344162293536">Rotació automàtica</translation>
 <translation id="7076293881109082629">Inicia la sessió</translation>
+<translation id="7092922358121866860">Mostra la configuració de Llum nocturna</translation>
 <translation id="7098389117866926363">Dispositiu USB-C (port posterior esquerre)</translation>
 <translation id="7131634465328662194">La sessió es tancarà automàticament.</translation>
 <translation id="7143207342074048698">S'està connectant</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Prem Cerca o Maj per cancel·lar.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> i <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Senyal potent</translation>
+<translation id="7842211907556571265">S'està connectant a <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Advertiment: funció experimental</translation>
 <translation id="7846634333498149051">Teclat</translation>
 <translation id="790040513076446191">Manipular la configuració relacionada amb la privadesa</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: s'està tornant a connectar…</translation>
 <translation id="8513108775083588393">Rotació automàtica</translation>
 <translation id="8517041960877371778">És possible que el dispositiu <ph name="DEVICE_TYPE" /> no es carregui mentre està encès.</translation>
+<translation id="8627191004499078455">Connectat a <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Queda un <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Escolta la selecció</translation>
 <translation id="8652175077544655965">Tanca la configuració</translation>
+<translation id="8653151467777939995">Mostra la configuració de notificacions. Les notificacions estan activades.</translation>
+<translation id="8664753092453405566">Mostra la llista de xarxes. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">S'ha connectat un carregador de baix consum</translation>
 <translation id="8683506306463609433">Traça del rendiment activa</translation>
 <translation id="8734991477317290293">Pot ser que estigui provant de robar-te les combinacions de tecles</translation>
+<translation id="8735953464173050365">Mostra la configuració del teclat. S'ha seleccionat <ph name="KEYBOARD_NAME" />.</translation>
+<translation id="875593634123171288">Mostra la configuració de la VPN</translation>
 <translation id="8809737090443522491">Escriu el nom d'una aplicació o d'un document</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">No es pot projectar amb més de dues pantalles.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Botó Enrere</translation>
+<translation id="8843682306134542540">Activa o desactiva el bloqueig de rotació. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Cerca + Esc</translation>
 <translation id="8870509716567206129">L'aplicació no admet la pantalla dividida.</translation>
 <translation id="8874184842967597500">No connectat</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb
index e1466732e..16b9242e 100644
--- a/ash/strings/ash_strings_da.xtb
+++ b/ash/strings/ash_strings_da.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> blev tilføjet</translation>
 <translation id="1056775291175587022">Der er ingen netværk</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Vis indstillinger for hjælpefunktioner</translation>
 <translation id="1104621072296271835">Dine enheder fungerer endnu bedre sammen</translation>
 <translation id="112308213915226829">Skjul hylde automatisk</translation>
 <translation id="1153356358378277386">Parrede enheder</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Svagt signal</translation>
 <translation id="1293264513303784526">USB-C-enhed (venstre port)</translation>
+<translation id="1302880136325416935">Vis Bluetooth-indstillinger. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Højre</translation>
 <translation id="1351937230027495976">Skjul menu</translation>
 <translation id="1383876407941801731">Søg</translation>
 <translation id="1467432559032391204">Venstre</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Appliste</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Vis indstillinger for underretninger. Underretninger er slået fra for en app}one{Vis indstillinger for underretninger. Underretninger er slået fra for # app}other{Vis indstillinger for underretninger. Underretninger er slået fra for # apps}}</translation>
 <translation id="1525508553941733066">AFVIS</translation>
 <translation id="1537254971476575106">Forstørrelse af fuld skærm</translation>
 <translation id="15373452373711364">Stor musemarkør</translation>
 <translation id="1550523713251050646">Klik for at se flere muligheder</translation>
 <translation id="1567387640189251553">Der er tilsluttet et andet tastatur, siden du sidst indtastede din adgangskode. Det forsøger muligvis at stjæle dine indtastninger.</translation>
+<translation id="1570871743947603115">Slå Bluetooth til eller fra. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Fjern denne bruger</translation>
 <translation id="1621499497873603021">Tid tilbage, indtil batteriet er tomt, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Din adgangskode kunne stadig ikke bekræftes. Bemærk! Hvis du har ændret din adgangskode for nylig, anvendes din nye adgangskode først, når du har logget ud. Du skal bruge den gamle adgangskode her.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Ikke genkendt</translation>
 <translation id="1746730358044914197">Indtastningsmetoder konfigureres af din administrator.</translation>
 <translation id="1747827819627189109">Skærmtastaturet er aktiveret</translation>
+<translation id="1761222317188459878">Slå netværksforbindelse til eller fra. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (indlæser...)</translation>
 <translation id="1841545962859478868">Administratoren af enheden kan overvåge følgende:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Denne enhed administreres af <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2067602449040652523">Lysstyrke for tastatur</translation>
+<translation id="2075212959500165896">Du har prøvet for mange gange. Prøv igen senere.</translation>
 <translation id="2081529251031312395">$1 kan stadig logge ind senere.</translation>
 <translation id="2127372758936585790">Oplader ved lav kraft</translation>
 <translation id="2135456203358955318">Fastgjort lupvindue</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Skift vinduesoversigt</translation>
 <translation id="2338501278241028356">Slå Bluetooth til for at opdage enheder i nærheden</translation>
 <translation id="2339073806695260576">Tryk på knappen for styluspen på hylden for at skrive en note, tage et screenshot eller bruge lasermarkøren og luppen.</translation>
+<translation id="2341729377289034582">Altid lodret</translation>
 <translation id="2352467521400612932">Penneindstillinger</translation>
 <translation id="2354174487190027830">Aktiverer <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Fortsæt</translation>
 <translation id="2365393535144473978">Bluetooth aktiveres, når du aktiverer mobildata.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Slå Forstyr ikke til eller fra</translation>
 <translation id="2412593942846481727">Der er en tilgængelig opdatering</translation>
+<translation id="2416346634399901812">Forbundet til <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth-enheden "<ph name="DEVICE_NAME" />" vil gerne have parringstilladelse. Inden du accepterer, skal du bekræfte, at denne adgangsnøgle er vist på den pågældende enhed: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Underretninger</translation>
 <translation id="2484513351006226581">Tryk på <ph name="KEYBOARD_SHORTCUT" /> for at skifte tastaturlayout.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Tilføj forbindelse</translation>
 <translation id="2961963223658824723">Der opstod en fejl. Prøv igen om et par sekunder.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Vis Cast-enheder.</translation>
 <translation id="2996462380875591307">Fastgjort lupvindue er aktiveret. Tryk på Ctrl+Søg+D igen for at deaktivere tilstanden.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> er en offentlig session administreret af <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monolyd</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151786313568798007">Retning</translation>
 <translation id="3153444934357957346">Du kan kun have op til <ph name="MULTI_PROFILE_USER_LIMIT" /> konti i samlet login fra flere konti.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Forbundet til en enhed}one{Forbundet til # enhed}other{Forbundet til # enheder}}</translation>
 <translation id="3236488194889173876">Der er ingen tilgængelige mobilnetværk</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gæst</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Lås</translation>
 <translation id="3798670284305777884">Højttaler (indbygget)</translation>
 <translation id="380165613292957338">Hej, hvad kan jeg hjælpe med?</translation>
+<translation id="383629559565718788">Vis tastaturindstillinger</translation>
 <translation id="3846575436967432996">Der er ingen tilgængelige netværksoplysninger</translation>
 <translation id="385051799172605136">Tilbage</translation>
 <translation id="3891340733213178823">Tryk på Ctrl+Shift+Q to gange for at logge ud.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Middel signal</translation>
 <translation id="4200057768455216496">Du trykkede på genvejen for det fastgjorte lupvindue. Vil du aktivere indstillingen?</translation>
 <translation id="4217571870635786043">Diktering</translation>
+<translation id="4261870227682513959">Vis indstillinger for underretninger. Underretninger er slået fra</translation>
 <translation id="4274921305979314545">Knyt din Chromebook til din telefon</translation>
 <translation id="4279490309300973883">Spejling</translation>
+<translation id="4292681942966152062">Aktiverer <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Forstørrelsesglas</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Fra "<ph name="FROM_LOCALE" />" til "<ph name="TO_LOCALE" />", efter at du har synkroniseret dine indstillinger.</translation>
 <translation id="574392208103952083">Mellem</translation>
 <translation id="5744083938413354016">Tryk og træk</translation>
+<translation id="5750765938512549687">Bluetooth er slået fra</translation>
 <translation id="5777841717266010279">Vil du afslutte skærmdeling?</translation>
 <translation id="57838592816432529">Slå lyden fra</translation>
 <translation id="5805697420284793859">Vinduesadministrator</translation>
@@ -273,12 +288,14 @@
 <translation id="6164005077879661055">Alle filer og lokale data, der er knyttet til den administrerede bruger, 
 slettes permanent, når den administrerede bruger fjernes. Besøgte websites og indstillinger for denne administrerede bruger er muligvis stadig synlige for administratoren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Flere oplysninger</translation>
+<translation id="6254629735336163724">Altid vandret</translation>
 <translation id="6259254695169772643">Vælg ved hjælp af din styluspen</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Aktiverer...</translation>
 <translation id="6284232397434400372">Opløsningen blev ændret</translation>
 <translation id="6297287540776456956">Brug pennen til at vælge et område</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> er roteret til <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Tastaturoverlejring</translation>
+<translation id="6376931439017688372">Bluetooth er slået til</translation>
 <translation id="639644700271529076">CAPS LOCK er deaktiveret</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Færdig</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Din administrator har deaktiveret dette netværk.</translation>
 <translation id="7067196344162293536">Automatisk rotering</translation>
 <translation id="7076293881109082629">Login</translation>
+<translation id="7092922358121866860">Vis indstillinger for Nattelys</translation>
 <translation id="7098389117866926363">USB-C-enhed (porten bagpå i venstre side)</translation>
 <translation id="7131634465328662194">Du logges automatisk ud.</translation>
 <translation id="7143207342074048698">Opretter forbindelse</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Tryk på Søg eller Shift for at annullere.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> og <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Stærkt signal</translation>
+<translation id="7842211907556571265">Opretter forbindelse til <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Advarsel! Eksperimentel funktion</translation>
 <translation id="7846634333498149051">Tastatur</translation>
 <translation id="790040513076446191">Manipulere indstillinger til beskyttelse af personlige oplysninger</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Genopretter forbindelsen...</translation>
 <translation id="8513108775083588393">Roter automatisk</translation>
 <translation id="8517041960877371778">Din <ph name="DEVICE_TYPE" /> kan muligvis ikke oplades, mens den er tændt.</translation>
+<translation id="8627191004499078455">Forbundet til <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> tilbage</translation>
 <translation id="8649101189709089199">Tekstoplæsning</translation>
 <translation id="8652175077544655965">Luk indstillinger</translation>
+<translation id="8653151467777939995">Vis indstillinger for underretninger. Underretninger er slået til</translation>
+<translation id="8664753092453405566">Vis netværksliste. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Oplader med lav kraft er tilsluttet</translation>
 <translation id="8683506306463609433">Sporing af effektivitet er aktiv</translation>
 <translation id="8734991477317290293">Det forsøger muligvis at stjæle dine indtastninger</translation>
+<translation id="8735953464173050365">Vis tastaturindstillinger. <ph name="KEYBOARD_NAME" /> er valgt</translation>
+<translation id="875593634123171288">Vis VPN-indstillinger</translation>
 <translation id="8809737090443522491">Skriv navnet på en app eller et dokument</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Spejling med mere end to skærme understøttes ikke.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Knappen Tilbage</translation>
+<translation id="8843682306134542540">Slå Lås rotation til eller fra. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Søg+Esc</translation>
 <translation id="8870509716567206129">Appen understøtter ikke delt skærm.</translation>
 <translation id="8874184842967597500">Ikke tilsluttet</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb
index 69ef3ed..66bb766 100644
--- a/ash/strings/ash_strings_de.xtb
+++ b/ash/strings/ash_strings_de.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> hinzugefügt</translation>
 <translation id="1056775291175587022">Keine Netzwerke</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Einstellungen für Bedienungshilfen anzeigen</translation>
 <translation id="1104621072296271835">Vorteile durch das Verbinden Ihrer Geräte</translation>
 <translation id="112308213915226829">Ablage automatisch ausblenden</translation>
 <translation id="1153356358378277386">Gekoppelte Geräte</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Schwaches Signal</translation>
 <translation id="1293264513303784526">USB-C-Gerät (Port links)</translation>
+<translation id="1302880136325416935">Einstellungen für Bedienungshilfen anzeigen. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Rechts</translation>
 <translation id="1351937230027495976">Menü minimieren</translation>
 <translation id="1383876407941801731">Suchen</translation>
 <translation id="1467432559032391204">Links</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Übersicht</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Benachrichtigungseinstellungen anzeigen. Benachrichtigungen sind für eine App deaktiviert.}other{Benachrichtigungseinstellungen anzeigen. Benachrichtigungen sind für # Apps deaktiviert.}}</translation>
 <translation id="1525508553941733066">SCHLIESSEN</translation>
 <translation id="1537254971476575106">Vollbildlupe</translation>
 <translation id="15373452373711364">Großer Cursor</translation>
 <translation id="1550523713251050646">Für weitere Optionen klicken</translation>
 <translation id="1567387640189251553">Seit der letzten Eingabe Ihres Passwortes wurde eine andere Tastatur angeschlossen. Möglicherweise versucht jemand, darüber Ihre Tastatureingaben zu erfassen.</translation>
+<translation id="1570871743947603115">Bluetooth aktivieren/deaktivieren. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Diesen Nutzer entfernen</translation>
 <translation id="1621499497873603021">Verbleibende Akku-Laufzeit: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Ihr Passwort konnte immer noch nicht bestätigt werden. Hinweis: Falls Sie Ihr Passwort kürzlich geändert haben, wird Ihr neues Passwort übernommen, sobald Sie sich abmelden. Bitte verwenden Sie hier das alte Passwort.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Nicht erkannt</translation>
 <translation id="1746730358044914197">Die Eingabemethoden werden von Ihrem Administrator konfiguriert.</translation>
 <translation id="1747827819627189109">Bildschirmtastatur aktiviert</translation>
+<translation id="1761222317188459878">Netzwerkverbindung aktivieren/deaktivieren. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (wird geladen…)</translation>
 <translation id="1841545962859478868">Der Geräteadministrator überwacht eventuell Folgendes:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Dieses Gerät wird durch <ph name="DOMAIN" /> verwaltet.</translation>
 <translation id="2050339315714019657">Hochformat</translation>
 <translation id="2067602449040652523">Tastaturhelligkeit</translation>
+<translation id="2075212959500165896">Zu viele Versuche. Bitte versuchen Sie es später noch einmal.</translation>
 <translation id="2081529251031312395">$1 kann sich später weiterhin anmelden.</translation>
 <translation id="2127372758936585790">Schwachstrom-Ladegerät</translation>
 <translation id="2135456203358955318">Angedockte Lupe</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Fensterübersicht umschalten</translation>
 <translation id="2338501278241028356">Aktivieren Sie Bluetooth, damit Geräte in der Nähe gefunden werden</translation>
 <translation id="2339073806695260576">Tippen Sie auf die Eingabestift-Schaltfläche in der Ablage, um Notizen oder Screenshots zu erstellen, den Laserpointer oder die Vergrößerungsfunktion zu verwenden.</translation>
+<translation id="2341729377289034582">Vertikale Ausrichtung fixiert</translation>
 <translation id="2352467521400612932">Eingabestift-Einstellungen</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> wird aktiviert</translation>
 <translation id="2359808026110333948">Weiter</translation>
 <translation id="2365393535144473978">Bei Aktivierung der mobilen Daten wird auch Bluetooth aktiviert.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">"Bitte nicht stören" aktivieren/deaktivieren</translation>
 <translation id="2412593942846481727">Update verfügbar</translation>
+<translation id="2416346634399901812">Verbunden mit <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Das Bluetooth-Gerät "<ph name="DEVICE_NAME" />" bittet um Erlaubnis für Kopplung. Bevor Sie akzeptieren, überprüfen Sie, ob folgender Zugangscode auf dem Gerät angezeigt wird: <ph name="PASSKEY" />.</translation>
 <translation id="2482878487686419369">Benachrichtigungen</translation>
 <translation id="2484513351006226581">Drücken Sie <ph name="KEYBOARD_SHORTCUT" />, um das Tastaturlayout zu ändern.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Verbindung hinzufügen</translation>
 <translation id="2961963223658824723">Ein Fehler ist aufgetreten. Bitte versuchen Sie es in ein paar Sekunden noch einmal.</translation>
 <translation id="2963773877003373896">Mod3</translation>
+<translation id="2995447421581609334">Übertragungsgeräte anzeigen.</translation>
 <translation id="2996462380875591307">Angedockte Lupe aktiviert. Drücken Sie Strg + Suchtaste + D, um sie zu deaktivieren.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> ist eine öffentliche Sitzung, die von <ph name="DOMAIN" /> verwaltet wird.</translation>
 <translation id="3000461861112256445">Mono-Audio</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobilfunk</translation>
 <translation id="3151786313568798007">Ausrichtung</translation>
 <translation id="3153444934357957346">Bei der Mehrfachanmeldung sind maximal <ph name="MULTI_PROFILE_USER_LIMIT" /> Konten zulässig.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Mit einem Gerät verbunden}other{Mit # Geräten verbunden}}</translation>
 <translation id="3236488194889173876">Kein Mobilfunknetz verfügbar</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" />, <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gast</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Sperren</translation>
 <translation id="3798670284305777884">Lautsprecher (intern)</translation>
 <translation id="380165613292957338">Hallo, wie kann ich dir helfen?</translation>
+<translation id="383629559565718788">Tastatureinstellungen anzeigen</translation>
 <translation id="3846575436967432996">Keine Netzwerkinformationen verfügbar</translation>
 <translation id="385051799172605136">Zurück</translation>
 <translation id="3891340733213178823">Drücken Sie zum Abmelden zweimal Strg + Umschalttaste + Q.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Durchschnittliches Signal</translation>
 <translation id="4200057768455216496">Sie haben die Tastenkombination für die angedockte Lupe gedrückt. Möchten Sie sie aktivieren?</translation>
 <translation id="4217571870635786043">Spracheingabe</translation>
+<translation id="4261870227682513959">Benachrichtigungseinstellungen anzeigen. Benachrichtigungen sind deaktiviert.</translation>
 <translation id="4274921305979314545">Sie können Ihr Chromebook mit Ihrem Smartphone verbinden</translation>
 <translation id="4279490309300973883">Spiegelung</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> wird aktiviert</translation>
 <translation id="4321179778687042513">Strg</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lupe</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Nach der Synchronisierung der Einstellungen von "<ph name="FROM_LOCALE" />" zu "<ph name="TO_LOCALE" />" geändert.</translation>
 <translation id="574392208103952083">Mittel</translation>
 <translation id="5744083938413354016">Antippen und Ziehen</translation>
+<translation id="5750765938512549687">Bluetooth ist deaktiviert</translation>
 <translation id="5777841717266010279">Bildschirmfreigabe beenden?</translation>
 <translation id="57838592816432529">Stummschalten</translation>
 <translation id="5805697420284793859">Fenstermanager</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Bildschirmtastatur anzeigen</translation>
 <translation id="6164005077879661055">Durch das Entfernen des betreuten Nutzers werden alle mit ihm verknüpften Dateien und lokalen Daten endgültig gelöscht. Besuchte Websites und Einstellungen des betreuten Nutzers kann der Manager möglicherweise weiterhin unter <ph name="MANAGEMENT_URL" /> einsehen.</translation>
 <translation id="6165508094623778733">Weitere Informationen</translation>
+<translation id="6254629735336163724">Horizontale Ausrichtung fixiert</translation>
 <translation id="6259254695169772643">Verwenden Sie den Eingabestift, um Ihre Auswahl zu treffen</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Wird aktiviert...</translation>
 <translation id="6284232397434400372">Auflösung geändert</translation>
 <translation id="6297287540776456956">Diesen Eingabestift verwenden, um einen Bereich auszuwählen</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> wurde zu <ph name="ROTATION" /> gedreht.</translation>
 <translation id="632744581670418035">Tastatur-Overlay</translation>
+<translation id="6376931439017688372">Bluetooth ist aktiviert</translation>
 <translation id="639644700271529076">Feststelltaste Aus</translation>
 <translation id="6406704438230478924">AltGr</translation>
 <translation id="643147933154517414">Fertig</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Dieses Netzwerk wurde von Ihrem Administrator deaktiviert.</translation>
 <translation id="7067196344162293536">Automatisch drehen</translation>
 <translation id="7076293881109082629">Anmeldung</translation>
+<translation id="7092922358121866860">Nachtlichteinstellungen anzeigen</translation>
 <translation id="7098389117866926363">USB-C-Gerät (linker Port hinten)</translation>
 <translation id="7131634465328662194">Sie werden automatisch abgemeldet.</translation>
 <translation id="7143207342074048698">Verbindung wird hergestellt.</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Drücken Sie die Such-Taste oder Umschalttaste, um die Aktivierung aufzuheben.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> und <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Starkes Signal</translation>
+<translation id="7842211907556571265">Verbindung zu <ph name="NETWORK_NAME" /> wird hergestellt</translation>
 <translation id="7842569679327885685">Achtung: Experimentelle Funktion</translation>
 <translation id="7846634333498149051">Tastatur</translation>
 <translation id="790040513076446191">Datenschutzeinstellungen bearbeiten</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Verbindung wird wiederhergestellt...</translation>
 <translation id="8513108775083588393">Automatisch drehen</translation>
 <translation id="8517041960877371778">Ihr <ph name="DEVICE_TYPE" /> wird möglicherweise nicht aufgeladen, wenn es eingeschaltet ist.</translation>
+<translation id="8627191004499078455">Verbunden mit <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> verbleibend</translation>
 <translation id="8649101189709089199">Vorlesen</translation>
 <translation id="8652175077544655965">Einstellungen schließen</translation>
+<translation id="8653151467777939995">Benachrichtigungseinstellungen anzeigen. Benachrichtigungen sind aktiviert.</translation>
+<translation id="8664753092453405566">Netzwerkliste anzeigen. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Schwachstrom-Ladegerät angeschlossen</translation>
 <translation id="8683506306463609433">Leistungsverfolgung ist aktiv</translation>
 <translation id="8734991477317290293">Möglicherweise versucht jemand, darüber Ihre Tastatureingaben zu erfassen</translation>
+<translation id="8735953464173050365">Tastatureinstellungen anzeigen. <ph name="KEYBOARD_NAME" /> ist ausgewählt.</translation>
+<translation id="875593634123171288">VPN-Einstellungen anzeigen</translation>
 <translation id="8809737090443522491">Name einer App oder eines Dokuments eingeben</translation>
 <translation id="8814190375133053267">WLAN</translation>
 <translation id="8825534185036233643">Das Spiegeln mit mehr als zwei Displays wird nicht unterstützt.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Schaltfläche "Zurück"</translation>
+<translation id="8843682306134542540">Rotationssperre aktivieren/deaktivieren. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Suche + Esc</translation>
 <translation id="8870509716567206129">Das Teilen des Bildschirms wird in dieser App nicht unterstützt.</translation>
 <translation id="8874184842967597500">Nicht verbunden</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb
index 66c317a6..d32cb29 100644
--- a/ash/strings/ash_strings_el.xtb
+++ b/ash/strings/ash_strings_el.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Προστέθηκε η συσκευή <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Δεν βρέθηκαν δίκτυα</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Εμφάνιση ρυθμίσεων προσβασιμότητας</translation>
 <translation id="1104621072296271835">Οι συσκευές σας λειτουργούν ακόμα καλύτερα συνδυαστικά</translation>
 <translation id="112308213915226829">Αυτόματη απόκρυψη ραφιού</translation>
 <translation id="1153356358378277386">Συσκευές σε σύζευξη</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Ασθενές σήμα</translation>
 <translation id="1293264513303784526">Συσκευή USB-C (αριστερή θύρα)</translation>
+<translation id="1302880136325416935">Εμφάνιση ρυθμίσεων Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Δεξιά</translation>
 <translation id="1351937230027495976">Σύμπτυξη μενού</translation>
 <translation id="1383876407941801731">Αναζήτηση</translation>
 <translation id="1467432559032391204">Αριστερά</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Λειτουργία εκκίνησης</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Εμφάνιση ρυθμίσεων ειδοποιήσεων. Έχουν απενεργοποιηθεί οι ειδοποιήσεις για κάποια εφαρμογή.}other{Εμφάνιση ρυθμίσεων ειδοποιήσεων. Έχουν απενεργοποιηθεί οι ειδοποιήσεις για # εφαρμογές.}}</translation>
 <translation id="1525508553941733066">ΑΠΟΡΡΙΨΗ</translation>
 <translation id="1537254971476575106">Μεγεθυντικός φακός πλήρους οθόνης</translation>
 <translation id="15373452373711364">Μεγάλος δείκτης ποντικιού</translation>
 <translation id="1550523713251050646">Κάντε κλικ για περισσότερες επιλογές</translation>
 <translation id="1567387640189251553">Συνδέθηκε διαφορετικό πληκτρολόγιο από την τελευταία φορά που εισαγάγατε τον κωδικό πρόσβασής σας. Μπορεί να επιχειρεί να υποκλέψει τα πατήματα πλήκτρων σας.</translation>
+<translation id="1570871743947603115">Εναλλαγή Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Κατάργηση αυτού του χρήστη</translation>
 <translation id="1621499497873603021">Χρόνος που απομένει μέχρι να αδειάσει η μπαταρία, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Λυπούμαστε, η επαλήθευση του κωδικού πρόσβασης εξακολουθεί να μην είναι δυνατή. Σημείωση: Εάν έχετε αλλάξει πρόσφατα τον κωδικό πρόσβασης, ο νέος κωδικός πρόσβασης θα τεθεί σε ισχύ αφού αποσυνδεθείτε. Χρησιμοποιήστε εδώ τον παλιό κωδικό πρόσβασης.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Δεν αναγνωρίστηκε</translation>
 <translation id="1746730358044914197">Οι μέθοδοι εισαγωγής έχουν διαμορφωθεί από τον διαχειριστή σας.</translation>
 <translation id="1747827819627189109">Το πληκτρολόγιο οθόνης είναι ενεργοποιημένο</translation>
+<translation id="1761222317188459878">Εναλλαγή σύνδεσης δικτύου. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Βοηθός (φόρτωση…)</translation>
 <translation id="1841545962859478868">Ο διαχειριστής της συσκευής μπορεί να παρακολουθεί τα παρακάτω:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Η διαχείριση της συσκευής γίνεται από τον τομέα <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Κάθετα</translation>
 <translation id="2067602449040652523">Φωτεινότητα πληκτρολογίου</translation>
+<translation id="2075212959500165896">Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα.</translation>
 <translation id="2081529251031312395">Ο χρήστης $1 μπορεί να συνδεθεί αργότερα.</translation>
 <translation id="2127372758936585790">Χαμηλή ισχύς φορτιστή</translation>
 <translation id="2135456203358955318">Μεγεθυντικός φακός σε παράθυρο</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Επισκόπηση εναλλαγής παραθύρων</translation>
 <translation id="2338501278241028356">Ενεργοποιήστε το Bluetooth, για να εντοπίσετε κοντινές συσκευές</translation>
 <translation id="2339073806695260576">Πατήστε το κουμπί με τη γραφίδα στο ράφι, για να δημιουργήσετε μια σημείωση, ένα στιγμιότυπο οθόνης και να χρησιμοποιήσετε τον δείκτη λέιζερ ή τον μεγεθυντικό φακό.</translation>
+<translation id="2341729377289034582">Κλειδωμένη σε κάθετη</translation>
 <translation id="2352467521400612932">Ρυθμίσεις γραφίδας</translation>
 <translation id="2354174487190027830">Ενεργοποίηση <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Συνέχεια</translation>
 <translation id="2365393535144473978">Με την ενεργοποίηση των δεδομένων κινητής τηλεφωνίας θα ενεργοποιηθεί και το Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Εναλλαγή λειτουργίας "Μην ενοχλείτε"</translation>
 <translation id="2412593942846481727">Υπάρχει διαθέσιμη ενημέρωση</translation>
+<translation id="2416346634399901812">Σε σύνδεση στο δίκτυο <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Η συσκευή Bluetooth "<ph name="DEVICE_NAME" />" ζητά δικαιώματα σύζευξης. Προτού αποδεχτείτε, επιβεβαιώστε ότι αυτό το κλειδί πρόσβασης εμφανίζεται στη συγκεκριμένη συσκευή: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Ειδοποιήσεις</translation>
 <translation id="2484513351006226581">Πατήστε <ph name="KEYBOARD_SHORTCUT" />, για να αλλάξετε διάταξη πληκτρολογίου.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Προσθήκη σύνδεσης</translation>
 <translation id="2961963223658824723">Δυστυχώς, παρουσιάστηκε κάποιο πρόβλημα. Δοκιμάστε ξανά σε λίγα δευτερόλεπτα.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Εμφάνιση συσκευών μετάδοσης.</translation>
 <translation id="2996462380875591307">Ο Μεγεθυντικός φακός σε παράθυρο ενεργοποιήθηκε. Πατήστε Ctrl+Αναζήτηση+D ξανά για να τον απενεργοποιήσετε.</translation>
 <translation id="2999742336789313416">Το <ph name="DISPLAY_NAME" /> είναι μια δημόσια περίοδος σύνδεσης που διαχειρίζεται το <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Μονοφωνικός ήχος</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Δεδομένα κινητής τηλεφωνίας</translation>
 <translation id="3151786313568798007">Προσανατολισμός</translation>
 <translation id="3153444934357957346">Μπορείτε να χρησιμοποιήσετε έως <ph name="MULTI_PROFILE_USER_LIMIT" /> λογαριασμούς στη λειτουργία σύνδεσης σε πολλούς λογαριασμούς.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Συνδέθηκε σε κάποια συσκευή}other{Συνδέθηκε σε # συσκευές}}</translation>
 <translation id="3236488194889173876">Δεν υπάρχουν διαθέσιμα δίκτυα κινητής τηλεφωνίας</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Επισκέπτης</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Κλείδωμα</translation>
 <translation id="3798670284305777884">Ηχείο (εσωτερικό)</translation>
 <translation id="380165613292957338">Γεια, πώς μπορώ να βοηθήσω;</translation>
+<translation id="383629559565718788">Εμφάνιση ρυθμίσεων πληκτρολογίου</translation>
 <translation id="3846575436967432996">Δεν υπάρχουν διαθέσιμες πληροφορίες δικτύου</translation>
 <translation id="385051799172605136">Πίσω</translation>
 <translation id="3891340733213178823">Πατήστε Ctrl + Shift + Q δύο φορές για να αποσυνδεθείτε.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Μεσαίο σήμα</translation>
 <translation id="4200057768455216496">Πατήσατε τη συντόμευση για τον μεγεθυντικό φακό σε παράθυρο. Θέλετε να τον ενεργοποιήσετε;</translation>
 <translation id="4217571870635786043">Υπαγόρευση</translation>
+<translation id="4261870227682513959">Εμφάνιση ρυθμίσεων ειδοποιήσεων. Οι ειδοποιήσεις είναι απενεργοποιημένες.</translation>
 <translation id="4274921305979314545">Συνδέστε το Chromebook με το τηλέφωνό σας</translation>
 <translation id="4279490309300973883">Κατοπτρισμός</translation>
+<translation id="4292681942966152062">Ενεργοποίηση δικτύου <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Μεγεθυντικός φακός</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Από "<ph name="FROM_LOCALE" />" σε "<ph name="TO_LOCALE" />" μετά τον συγχρονισμό των ρυθμίσεων.</translation>
 <translation id="574392208103952083">Μέτριο</translation>
 <translation id="5744083938413354016">Μεταφορά με πάτημα</translation>
+<translation id="5750765938512549687">Το Bluetooth είναι απενεργοποιημένο</translation>
 <translation id="5777841717266010279">Θέλετε να σταματήσετε να μοιράζεστε την οθόνη;</translation>
 <translation id="57838592816432529">Σίγαση</translation>
 <translation id="5805697420284793859">Διαχείριση παραθύρου</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Εμφάνιση πληκτρολογίου οθόνης</translation>
 <translation id="6164005077879661055">Όλα τα αρχεία και τα τοπικά δεδομένα που σχετίζονται με το χρήστη υπό επίβλεψη θα διαγραφούν οριστικά μόλις καταργηθεί ο χρήστης υπό επίβλεψη. Οι ιστοσελίδες που έχει επισκεφτεί και οι ρυθμίσεις που έχει επιλέξει ενδεχομένως να εξακολουθούν να εμφανίζονται στο διαχειριστή στη διεύθυνση <ph name="MANAGEMENT_URL" /> .</translation>
 <translation id="6165508094623778733">Μάθετε περισσότερα</translation>
+<translation id="6254629735336163724">Κλειδωμένη σε οριζόντια</translation>
 <translation id="6259254695169772643">Χρησιμοποιήστε τη γραφίδα σας για επιλογή</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Ενεργοποίηση…</translation>
 <translation id="6284232397434400372">Η ανάλυση άλλαξε</translation>
 <translation id="6297287540776456956">Χρησιμοποιήστε τη γραφίδα για να επιλέξετε μια περιοχή</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> περιστράφηκε σε <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Επικάλυψη πληκτρολογίου</translation>
+<translation id="6376931439017688372">Το Bluetooth είναι ενεργοποιημένο</translation>
 <translation id="639644700271529076">Το CAPS LOCK είναι απενεργοποιημένο</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Όλα έτοιμα</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Το δίκτυο αυτό έχει απενεργοποιηθεί από το διαχειριστή σας.</translation>
 <translation id="7067196344162293536">Αυτόματη περιστροφή</translation>
 <translation id="7076293881109082629">Σύνδεση</translation>
+<translation id="7092922358121866860">Εμφάνιση ρυθμίσεων Νυχτερινού φωτισμού</translation>
 <translation id="7098389117866926363">Συσκευή USB-C (πίσω αριστερή θύρα)</translation>
 <translation id="7131634465328662194">Θα αποσυνδεθείτε αυτόματα.</translation>
 <translation id="7143207342074048698">Σύνδεση</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Πατήστε Search ή Shift για ακύρωση.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> και <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Ισχυρό σήμα</translation>
+<translation id="7842211907556571265">Σύνδεση στο δίκτυο <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Προειδοποίηση: Πειραματική λειτουργία</translation>
 <translation id="7846634333498149051">Πληκτρολόγιο</translation>
 <translation id="790040513076446191">Διαχείριση ρυθμίσεων σχετικά με το απόρρητο</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Επανασύνδεση…</translation>
 <translation id="8513108775083588393">Αυτόματη περιστροφή</translation>
 <translation id="8517041960877371778">Δεν είναι δυνατή η φόρτιση της συσκευής <ph name="DEVICE_TYPE" /> ενώ είναι ενεργοποιημένη.</translation>
+<translation id="8627191004499078455">Συνδέθηκε στη συσκευή <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Απομένει <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Επιλέξτε για αυτόματη ανάγνωση</translation>
 <translation id="8652175077544655965">Κλείσιμο ρυθμίσεων</translation>
+<translation id="8653151467777939995">Εμφάνιση ρυθμίσεων ειδοποιήσεων. Οι ειδοποιήσεις είναι ενεργοποιημένες.</translation>
+<translation id="8664753092453405566">Εμφάνιση λίστας δικτύων. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Ο συνδεδεμένος φορτιστής παρέχει χαμηλή ισχύ</translation>
 <translation id="8683506306463609433">Ενεργή παρακολούθηση απόδοσης</translation>
 <translation id="8734991477317290293">Μπορεί να επιχειρεί να υποκλέψει τα πατήματα πλήκτρων σας</translation>
+<translation id="8735953464173050365">Εμφάνιση ρυθμίσεων πληκτρολογίου. Έχει επιλεχθεί το πληκτρολόγιο <ph name="KEYBOARD_NAME" />.</translation>
+<translation id="875593634123171288">Εμφάνιση ρυθμίσεων VPN</translation>
 <translation id="8809737090443522491">Πληκτρολογήστε το όνομα μιας εφαρμογής ή ενός εγγράφου</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Δεν υποστηρίζεται ο κατοπτρισμός με περισσότερες από δύο οθόνες.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Κουμπί "Πίσω"</translation>
+<translation id="8843682306134542540">Εναλλαγή κλειδώματος περιστροφής. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Πλήκτρο αναζήτησης+Esc</translation>
 <translation id="8870509716567206129">Η εφαρμογή δεν υποστηρίζει διαχωρισμό οθόνης.</translation>
 <translation id="8874184842967597500">Δεν υπάρχει σύνδεση</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index bdd09587..9d04d5f9 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Se ha añadido <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">No hay redes</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Mostrar configuración de accesibilidad</translation>
 <translation id="1104621072296271835">Tus dispositivos funcionan aún mejor juntos</translation>
 <translation id="112308213915226829">Ocultar estantería automáticamente</translation>
 <translation id="1153356358378277386">Dispositivos vinculados</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Señal débil</translation>
 <translation id="1293264513303784526">Dispositivo USB-C (puerto izquierdo)</translation>
+<translation id="1302880136325416935">Muestra la configuración de Bluetooth. <ph name="STATE_TEXT" />.</translation>
 <translation id="1346748346194534595">Derecha</translation>
 <translation id="1351937230027495976">Ocultar menú</translation>
 <translation id="1383876407941801731">Buscar</translation>
 <translation id="1467432559032391204">Izquierda</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Menú de aplicaciones</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Muestra la configuración de notificaciones. Las notificaciones están desactivadas para una aplicación.}other{Muestra la configuración de notificaciones. Las notificaciones están desactivadas para # aplicaciones.}}</translation>
 <translation id="1525508553941733066">IGNORAR</translation>
 <translation id="1537254971476575106">Lupa de pantalla completa</translation>
 <translation id="15373452373711364">Cursor del ratón grande</translation>
 <translation id="1550523713251050646">Haz clic aquí para obtener más opciones</translation>
 <translation id="1567387640189251553">Se ha conectado otro teclado desde la última vez que introdujiste la contraseña. Es posible que esté intentando captar tus pulsaciones de teclas.</translation>
+<translation id="1570871743947603115">Activa o desactiva el Bluetooth. <ph name="STATE_TEXT" />.</translation>
 <translation id="1608626060424371292">Eliminar este usuario</translation>
 <translation id="1621499497873603021">Tiempo restante hasta que se agote la batería: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Aún no se ha podido verificar tu contraseña. Nota: Si has cambiado la contraseña recientemente, la nueva contraseña se aplicará una vez que hayas cerrado sesión. Utiliza la antigua contraseña aquí.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">No se ha reconocido</translation>
 <translation id="1746730358044914197">El administrador configura los métodos de introducción.</translation>
 <translation id="1747827819627189109">Teclado en pantalla habilitado</translation>
+<translation id="1761222317188459878">Activa o desactiva la conexión de red. <ph name="STATE_TEXT" />.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistente (cargando...)</translation>
 <translation id="1841545962859478868">Es posible que el administrador del dispositivo supervise lo siguiente:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Este dispositivo está gestionado por <ph name="DOMAIN" /></translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brillo del teclado</translation>
+<translation id="2075212959500165896">Demasiados intentos. Prueba de nuevo más tarde.</translation>
 <translation id="2081529251031312395">$1 aún podrá iniciar sesión.</translation>
 <translation id="2127372758936585790">Carga lenta</translation>
 <translation id="2135456203358955318">Lupa fijada</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Activar descripción general de ventanas</translation>
 <translation id="2338501278241028356">Activa el Bluetooth para encontrar dispositivos cercanos</translation>
 <translation id="2339073806695260576">Toca el botón del lápiz óptico situado en la estantería para tomar una nota, hacer una captura de pantalla o utilizar el puntero láser o la lupa.</translation>
+<translation id="2341729377289034582">Bloqueada en vertical</translation>
 <translation id="2352467521400612932">Configuración del lápiz óptico</translation>
 <translation id="2354174487190027830">Activación de <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2365393535144473978">La conexión Bluetooth se activará al habilitar los datos móviles.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Activar o desactivar el modo No molestar</translation>
 <translation id="2412593942846481727">Actualización disponible</translation>
+<translation id="2416346634399901812">Conexión establecida con <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">El dispositivo Bluetooth "<ph name="DEVICE_NAME" />" solicita permiso para vincularse. Antes de aceptar, comprueba que la clave de contraseña <ph name="PASSKEY" /> aparezca en el dispositivo</translation>
 <translation id="2482878487686419369">Notificaciones</translation>
 <translation id="2484513351006226581">Pulsa <ph name="KEYBOARD_SHORTCUT" /> para cambiar el diseño del teclado.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Añadir conexión</translation>
 <translation id="2961963223658824723">Se ha producido un error. Vuelve a intentarlo en unos segundos.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Mostrar dispositivos de transmisión</translation>
 <translation id="2996462380875591307">Se ha habilitado la lupa fijada. Pulsa Ctrl + tecla de búsqueda + D de nuevo para desactivarla.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> es una sesión pública administrada por <ph name="DOMAIN" />.</translation>
 <translation id="3000461861112256445">Audio en mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Redes móviles</translation>
 <translation id="3151786313568798007">Orientación</translation>
 <translation id="3153444934357957346">Solo puedes tener un máximo de <ph name="MULTI_PROFILE_USER_LIMIT" /> cuentas en el inicio de sesión múltiple.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectado a 1 dispositivo}other{Conectado a # dispositivos}}</translation>
 <translation id="3236488194889173876">No hay ninguna red móvil disponible</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="3294437725009624529">Invitado</translation>
@@ -160,6 +171,7 @@
 <translation id="3784455785234192852">Bloquear</translation>
 <translation id="3798670284305777884">Altavoz (interno)</translation>
 <translation id="380165613292957338">Hola, ¿cómo puedo ayudarte?</translation>
+<translation id="383629559565718788">Mostrar configuración de teclado</translation>
 <translation id="3846575436967432996">No hay información de red disponible.</translation>
 <translation id="385051799172605136">Atrás</translation>
 <translation id="3891340733213178823">Pulsa Ctrl+Mayús+Q dos veces para cerrar sesión.</translation>
@@ -175,8 +187,10 @@
 <translation id="4072264167173457037">Señal media</translation>
 <translation id="4200057768455216496">Has pulsado la combinación de teclas de la lupa fijada. ¿Quieres activarla?</translation>
 <translation id="4217571870635786043">Dictado</translation>
+<translation id="4261870227682513959">Muestra la configuración de notificaciones. Las notificaciones están desactivadas.</translation>
 <translation id="4274921305979314545">Conecta tu Chromebook con tu teléfono</translation>
 <translation id="4279490309300973883">Duplicando</translation>
+<translation id="4292681942966152062">Activando <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lupa</translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">De "<ph name="FROM_LOCALE" />" a "<ph name="TO_LOCALE" />" después de sincronizar tu configuración.</translation>
 <translation id="574392208103952083">Mediano</translation>
 <translation id="5744083938413354016">Tocar y arrastrar</translation>
+<translation id="5750765938512549687">El Bluetooth está desactivado</translation>
 <translation id="5777841717266010279">¿Dejar de compartir la pantalla?</translation>
 <translation id="57838592816432529">Silenciar</translation>
 <translation id="5805697420284793859">Administrador de ventanas</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Mostrar teclado en pantalla</translation>
 <translation id="6164005077879661055">Todos los archivos y datos locales asociados al usuario supervisado se eliminarán de forma permanente una vez que se haya eliminado este usuario supervisado. Es posible que el administrador pueda seguir viendo la configuración y los sitios web visitados de este usuario supervisado en la página <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Más información</translation>
+<translation id="6254629735336163724">Bloqueada en horizontal</translation>
 <translation id="6259254695169772643">Usa el lápiz óptico para seleccionar contenido</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Activando...</translation>
 <translation id="6284232397434400372">Se ha cambiado la resolución</translation>
 <translation id="6297287540776456956">Usa el lápiz óptico para seleccionar una parte de la pantalla</translation>
 <translation id="6310121235600822547">Se ha modificado la rotación de <ph name="DISPLAY_NAME" /> a <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Superposición de teclado</translation>
+<translation id="6376931439017688372">El Bluetooth está activado</translation>
 <translation id="639644700271529076">Bloqueo de mayúsculas desactivado</translation>
 <translation id="6406704438230478924">Alt Gr</translation>
 <translation id="643147933154517414">Listo</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">El administrador ha inhabilitado esta red.</translation>
 <translation id="7067196344162293536">Rotación automática</translation>
 <translation id="7076293881109082629">Iniciando sesión</translation>
+<translation id="7092922358121866860">Mostrar la configuración de luz nocturna</translation>
 <translation id="7098389117866926363">Dispositivo USB tipo C (puerto izquierdo situado en la parte trasera)</translation>
 <translation id="7131634465328662194">Tu sesión se cerrará automáticamente.</translation>
 <translation id="7143207342074048698">Conectando</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Pulsa la tecla de búsqueda o Mayús para cancelarlo.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> y <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Señal fuerte</translation>
+<translation id="7842211907556571265">Estableciendo conexión con <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Advertencia: Función experimental</translation>
 <translation id="7846634333498149051">Teclado</translation>
 <translation id="790040513076446191">Modificar la configuración relacionada con la privacidad</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: volviendo a conectar...</translation>
 <translation id="8513108775083588393">Girar automáticamente</translation>
 <translation id="8517041960877371778">Es posible que tu <ph name="DEVICE_TYPE" /> no se cargue mientras esté encendido.</translation>
+<translation id="8627191004499078455">Conectado a <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> restante</translation>
 <translation id="8649101189709089199">Enunciar Selección</translation>
 <translation id="8652175077544655965">Cerrar ajustes</translation>
+<translation id="8653151467777939995">Muestra la configuración de notificaciones. Las notificaciones están activadas.</translation>
+<translation id="8664753092453405566">Muestra la lista de redes. <ph name="STATE_TEXT" />.</translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Cargador de baja potencia conectado</translation>
 <translation id="8683506306463609433">Control del rendimiento activo</translation>
 <translation id="8734991477317290293">Es posible que esté intentando captar tus pulsaciones de teclas</translation>
+<translation id="8735953464173050365">Muestra la configuración de teclado. Actualmente está seleccionado <ph name="KEYBOARD_NAME" />.</translation>
+<translation id="875593634123171288">Mostrar configuración de VPN</translation>
 <translation id="8809737090443522491">Escribe el nombre de una aplicación o un documento</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">No se puede proyectar contenido en más de dos pantallas.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Botón Atrás</translation>
+<translation id="8843682306134542540">Activa o desactiva el bloqueo. <ph name="STATE_TEXT" />.</translation>
 <translation id="8850991929411075241">Buscar+Esc</translation>
 <translation id="8870509716567206129">La aplicación no admite la pantalla dividida.</translation>
 <translation id="8874184842967597500">No conectado</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb
index ba0c861..84b3ff5f 100644
--- a/ash/strings/ash_strings_et.xtb
+++ b/ash/strings/ash_strings_et.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> lisati</translation>
 <translation id="1056775291175587022">Võrke ei ole</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Kuvab juurdepääsetavuse seaded</translation>
 <translation id="1104621072296271835">Teie seadmed töötavad koos veelgi paremini</translation>
 <translation id="112308213915226829">Riiuli automaatne peitmine</translation>
 <translation id="1153356358378277386">Seotud seadmed</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Nõrk signaal</translation>
 <translation id="1293264513303784526">C-tüüpi USB-seade (vasakpoolne port)</translation>
+<translation id="1302880136325416935">Kuvab Bluetoothi seaded. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Paremale</translation>
 <translation id="1351937230027495976">Ahenda menüü</translation>
 <translation id="1383876407941801731">Otsi</translation>
 <translation id="1467432559032391204">Vasakule</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Käivitaja</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Kuvab märguandeseaded. Märguanded on rakenduse jaoks välja lülitatud}other{Kuvab märguandeseaded. Märguanded on # rakenduse jaoks välja lülitatud}}</translation>
 <translation id="1525508553941733066">LOOBU</translation>
 <translation id="1537254971476575106">Täisekraani luup</translation>
 <translation id="15373452373711364">Suur hiirekursor</translation>
 <translation id="1550523713251050646">Klõpsake lisavalikute nägemiseks</translation>
 <translation id="1567387640189251553">Pärast parooli viimast sisestamist on ühendatud teine klaviatuur. See võib üritada varastada teie klahvivajutusi.</translation>
+<translation id="1570871743947603115">Lülitab Bluetoothi sisse või välja. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Eemalda see kasutaja</translation>
 <translation id="1621499497873603021">Aku tühjenemiseni on aega <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Kahjuks ei saanud teie parooli kinnitada. Märkus: kui muutsite parooli hiljuti, rakendub uus parool pärast väljalogimist. Kasutage siin vana parooli.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Ei tuvastatud</translation>
 <translation id="1746730358044914197">Sisestusmeetodid seadistab teie administraator.</translation>
 <translation id="1747827819627189109">Ekraanil kuvatav klaviatuur on lubatud</translation>
+<translation id="1761222317188459878">Lülitab võrguühenduse sisse või välja. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (laadimine …)</translation>
 <translation id="1841545962859478868">Seadme administraator võib jälgida järgmist:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Seadet haldab <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Vertikaalpaigutus</translation>
 <translation id="2067602449040652523">Klaviatuuri eredus</translation>
+<translation id="2075212959500165896">Liiga palju katseid. Proovige hiljem uuesti.</translation>
 <translation id="2081529251031312395">$1 saab siiski hiljem sisse logida.</translation>
 <translation id="2127372758936585790">Väikese energiakuluga laadija</translation>
 <translation id="2135456203358955318">Dokitud luup</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Akna ülevaate sisse- ja väljalülitamine</translation>
 <translation id="2338501278241028356">Lülitage Bluetooth sisse, et läheduses olevaid seadmeid avastada</translation>
 <translation id="2339073806695260576">Puudutage riiulil elektronpliiatsi nuppu, et teha märkmeid, jäädvustada ekraanipilt, kasutada laserkursorit või suurendusklaasi.</translation>
+<translation id="2341729377289034582">Lukustatud vertikaalasendisse</translation>
 <translation id="2352467521400612932">Elektronpliiatsi seaded</translation>
 <translation id="2354174487190027830">Võrgu <ph name="NAME" /> aktiveerimine</translation>
 <translation id="2359808026110333948">Jätka</translation>
 <translation id="2365393535144473978">Mobiilse andmeside lubamisel lubatakse Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Lülitab režiimi Mitte segada sisse või välja</translation>
 <translation id="2412593942846481727">Värskendus on saadaval</translation>
+<translation id="2416346634399901812">Ühendatud võrguga <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetoothi seade „<ph name="DEVICE_NAME" />” küsib luba sidumiseks. Enne nõustumist veenduge, et selles seadmes oleks kuvatud see parool: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Märguanded</translation>
 <translation id="2484513351006226581">Klaviatuuripaigutuse muutmiseks vajutage klahvikombinatsiooni <ph name="KEYBOARD_SHORTCUT" />.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Lisa ühendus</translation>
 <translation id="2961963223658824723">Midagi läks valesti. Proovige mõne sekundi pärast uuesti.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Kuvab ülekandeseadmed.</translation>
 <translation id="2996462380875591307">Dokitud luup on lubatud. Vajutage selle väljalülitamiseks klahvikombinatsiooni Ctrl + otsinguklahv + D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> on avalik seanss, mida haldab <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monoheli</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobiilne andmeside</translation>
 <translation id="3151786313568798007">Suund</translation>
 <translation id="3153444934357957346">Saate korraga sisse logida kuni <ph name="MULTI_PROFILE_USER_LIMIT" /> kontole.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ühendatud ühe seadmega}other{Ühendatud # seadmega}}</translation>
 <translation id="3236488194889173876">Ühtegi mobiilsidevõrku pole saadaval</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Külaline</translation>
@@ -160,6 +171,7 @@
 <translation id="3784455785234192852">Lukusta</translation>
 <translation id="3798670284305777884">Kõlar (sisemine)</translation>
 <translation id="380165613292957338">Tere! Kuidas saan aidata?</translation>
+<translation id="383629559565718788">Kuvab klaviatuuriseaded</translation>
 <translation id="3846575436967432996">Võrguteave ei ole saadaval</translation>
 <translation id="385051799172605136">Tagasi</translation>
 <translation id="3891340733213178823">Väljalogimiseks vajutage kaks korda klahvikombinatsiooni Ctrl + tõstuklahv + Q.</translation>
@@ -175,8 +187,10 @@
 <translation id="4072264167173457037">Keskmine signaal</translation>
 <translation id="4200057768455216496">Vajutasite dokitud luubi otseteed. Kas soovite luubi sisse lülitada?</translation>
 <translation id="4217571870635786043">Dikteerimine</translation>
+<translation id="4261870227682513959">Kuvab märguandeseaded. Märguanded on välja lülitatud</translation>
 <translation id="4274921305979314545">Ühendage Chromebook oma telefoniga</translation>
 <translation id="4279490309300973883">Peegeldamine</translation>
+<translation id="4292681942966152062">Võrgu <ph name="NETWORK_NAME" /> aktiveerimine</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Suurendusklaas</translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Pärast seadete sünkroonimist lokaadist „<ph name="FROM_LOCALE" />” lokaati „<ph name="TO_LOCALE" />”.</translation>
 <translation id="574392208103952083">Keskmine</translation>
 <translation id="5744083938413354016">Puudutusega lohistamine</translation>
+<translation id="5750765938512549687">Bluetooth on välja lülitatud</translation>
 <translation id="5777841717266010279">Kas peatada ekraani jagamine?</translation>
 <translation id="57838592816432529">Vaigista</translation>
 <translation id="5805697420284793859">Aknahaldur</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Ekraanil kuvatava klaviatuuri kuvamine</translation>
 <translation id="6164005077879661055">Kõik jälgitava kasutajaga seotud failid ja kohalikud andmed kustutatakse jäädavalt kohe, kui jälgitav kasutaja eemaldatakse. Selle jälgitava kasutaja külastatud veebisaite ja seadeid näeb haldur endiselt aadressil <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Lisateave</translation>
+<translation id="6254629735336163724">Lukustatud horisontaalasendisse</translation>
 <translation id="6259254695169772643">Kasutage valimiseks elektronpliiatsit</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: aktiveerimine ...</translation>
 <translation id="6284232397434400372">Eraldusvõimet muudeti</translation>
 <translation id="6297287540776456956">Valige piirkond elektronpliiatsiga</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> vahetati valikule <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Klaviatuuri ülekate</translation>
+<translation id="6376931439017688372">Bluetooth on sisse lülitatud</translation>
 <translation id="639644700271529076">SUURTÄHELUKK on välja lülitatud</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Kõik on valmis</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Teie administraator on selle võrgu keelanud.</translation>
 <translation id="7067196344162293536">Automaatne pööramine</translation>
 <translation id="7076293881109082629">Sisselogimine</translation>
+<translation id="7092922358121866860">Kuvab öövalguse seaded</translation>
 <translation id="7098389117866926363">C-tüüpi USB-seade (vasakpoolne port taga)</translation>
 <translation id="7131634465328662194">Teid logitakse automaatselt välja.</translation>
 <translation id="7143207342074048698">Ühendamine</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Tühistamiseks vajutage otsinguklahvi või tõstuklahvi.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> ja <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Tugev signaal</translation>
+<translation id="7842211907556571265">Ühenduse loomine võrguga <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Hoiatus: katseline funktsioon</translation>
 <translation id="7846634333498149051">Klaviatuur</translation>
 <translation id="790040513076446191">Privaatsusega seotud seadete muutmine</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: uuesti ühendamine …</translation>
 <translation id="8513108775083588393">Automaatne pööramine</translation>
 <translation id="8517041960877371778">Kui seade <ph name="DEVICE_TYPE" /> on sisse lülitatud, ei pruugita seda laadida.</translation>
+<translation id="8627191004499078455">Ühendatud seadmega <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> on jäänud</translation>
 <translation id="8649101189709089199">Vali ja kuula</translation>
 <translation id="8652175077544655965">Sulgege seaded</translation>
+<translation id="8653151467777939995">Kuvab märguandeseaded. Märguanded on sisse lülitatud</translation>
+<translation id="8664753092453405566">Kuvab võrkude loendi. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Väikese energiakuluga laadija on ühendatud</translation>
 <translation id="8683506306463609433">Toimivuse jälgimine on aktiivne</translation>
 <translation id="8734991477317290293">See võib üritada varastada teie klahvivajutusi</translation>
+<translation id="8735953464173050365">Kuvab klaviatuuriseaded. Valitud on <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Kuvab VPN-i seaded</translation>
 <translation id="8809737090443522491">Sisestage rakenduse või dokumendi nimi</translation>
 <translation id="8814190375133053267">WiFi</translation>
 <translation id="8825534185036233643">Rohkem kui kahe ekraaniga peegeldamist ei toetata.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Nupp Tagasi</translation>
+<translation id="8843682306134542540">Lülitab pööramisluku sisse või välja. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Otsing + ESC</translation>
 <translation id="8870509716567206129">Rakendus ei toeta jagatud ekraani.</translation>
 <translation id="8874184842967597500">Ühendus puudub</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb
index be51b97..63ba9251 100644
--- a/ash/strings/ash_strings_fa.xtb
+++ b/ash/strings/ash_strings_fa.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> اضافه شد</translation>
 <translation id="1056775291175587022">شبکه‌ای وجود ندارد</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />:‏ <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">نشان دادن تنظیمات دسترس‌پذیری</translation>
 <translation id="1104621072296271835">دستگاه‌هایتان باهم به‌مراتب بهتر کار می‌کنند</translation>
 <translation id="112308213915226829">پنهان کردن خودکار قفسه</translation>
 <translation id="1153356358378277386">دستگاه‌های مرتبط‌شده</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">سیگنال ضعیف</translation>
 <translation id="1293264513303784526">‏دستگاه USB-C (درگاه سمت چپ)</translation>
+<translation id="1302880136325416935">نشان دادن تنظیمات بلوتوث. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">راست</translation>
 <translation id="1351937230027495976">کوچک کردن منو</translation>
 <translation id="1383876407941801731">جستجو</translation>
 <translation id="1467432559032391204">چپ</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">راه‌انداز</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{نشان دادن تنظیمات اعلان. اعلان‌های یک برنامه خاموش است}one{نشان دادن تنظیمات اعلان. اعلان‌های # برنامه خاموش است}other{نشان دادن تنظیمات اعلان. اعلان‌های # برنامه خاموش است}}</translation>
 <translation id="1525508553941733066">رد کردن</translation>
 <translation id="1537254971476575106">ذره‌بین تمام‌صفحه</translation>
 <translation id="15373452373711364">نشانگر موشواره بزرگ</translation>
 <translation id="1550523713251050646">برای گزینه‌های بیشتر کلیک کنید</translation>
 <translation id="1567387640189251553">بعد از آخرین باری که گذرواژه‌تان را وارد کردید، صفحه‌کلید دیگری متصل شده است. ممکن است تلاش کند ضربه‌کلیدهای شما را به سرقت ببرد.</translation>
+<translation id="1570871743947603115">روشن/خاموش کردن بلوتوث. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">حذف این کاربر</translation>
 <translation id="1621499497873603021">زمان باقیمانده تا خالی‌شدن شارژ باتری، <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">متأسفیم، گذرواژه‌تان هنوز تأیید نشده است. توجه: اگر به‌تازگی گذرواژه‌تان را تغییر داده‌اید، گذرواژه جدید شما هنگامی‌که از سیستم خارج شوید، اعمال می‌شود؛ لطفاً اینجا از گذرواژه قدیمی خود استفاده کنید.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">شناسایی نشد</translation>
 <translation id="1746730358044914197">روش‌های ورودی توسط سرپرستتان پیکربندی می‌شوند.</translation>
 <translation id="1747827819627189109">صفحه‌کلید روی صفحه فعال شد</translation>
+<translation id="1761222317188459878">تغییر وضعیت اتصال شبکه. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">اترنت: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">دستیار (درحال بار کردن…)</translation>
 <translation id="1841545962859478868">سرپرست دستگاه ممکن است موارد زیر را پایش کند</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">این دستگاه توسط <ph name="DOMAIN" /> مدیریت می‌شود.</translation>
 <translation id="2050339315714019657">عمودی</translation>
 <translation id="2067602449040652523">روشنایی صفحه‌کلید</translation>
+<translation id="2075212959500165896">تلاش‌های ناموفق خیلی زیادی داشتید. بعداً دوباره امتحان کنید.</translation>
 <translation id="2081529251031312395">$1 همچنان می‌تواند بعداً به سیستم وارد شود.</translation>
 <translation id="2127372758936585790">شارژر برق ضعیف</translation>
 <translation id="2135456203358955318">ذره‌بین متصل</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">مروری کلی بر پنجره تغییر حالت</translation>
 <translation id="2338501278241028356">برای کاوش دستگاه‌های همین اطراف، بلوتوث را روشن کنید</translation>
 <translation id="2339073806695260576">برای یادداشت‌برداری، گرفتن عکس صفحه‌نمایش، استفاده از اشاره‌گر لیزری یا ذره‌بین روی دکمه قلم در قفسه ضربه بزنید.</translation>
+<translation id="2341729377289034582">قفل درحالت عمودی</translation>
 <translation id="2352467521400612932">تنظیمات قلم</translation>
 <translation id="2354174487190027830">فعال‌سازی <ph name="NAME" /></translation>
 <translation id="2359808026110333948">ادامه</translation>
 <translation id="2365393535144473978">فعال کردن داده تلفن همراه، بلوتوث را فعال می‌کند.</translation>
 <translation id="2391579633712104609">۱۸۰°</translation>
+<translation id="239188844683466770">روشن/خاموش کردن «مزاحم نشوید»</translation>
 <translation id="2412593942846481727">به‌روزرسانی دردسترس است</translation>
+<translation id="2416346634399901812">متصل به <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">دستگاه بلوتوث «<ph name="DEVICE_NAME" />» برای مرتبط‌سازی به مجوز نیاز دارد. قبل از پذیرش، لطفاً تأیید کنید که این کلیدواژه در آن دستگاه نشان داده می‌شود: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">اعلان‌ها</translation>
 <translation id="2484513351006226581">برای تغییر طرح‌بندی صفحه‌کلید، <ph name="KEYBOARD_SHORTCUT" /> را فشار دهید.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">افزودن اتصال</translation>
 <translation id="2961963223658824723">مشکلی پیش آمد. چند ثانیه دیگر دوباره امتحان کنید.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">نمایش دستگاه‌های ارسال محتوا.</translation>
 <translation id="2996462380875591307">‏«ذره‌بین متصل» فعال شد. برای خاموش کردن آن، Ctrl+Search+D را دوباره فشار دهید.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> یک جلسه عمومی مدیریت‌شده توسط <ph name="DOMAIN" /> است</translation>
 <translation id="3000461861112256445">صدای مونو</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">داده‌های تلفن همراه</translation>
 <translation id="3151786313568798007">جهت‌‌</translation>
 <translation id="3153444934357957346">در ورود چندگانه به سیستم، می‌توانید حداکثر از <ph name="MULTI_PROFILE_USER_LIMIT" /> حساب استفاده کنید.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{متصل به یک دستگاه.}one{متصل به # دستگاه}other{متصل به # دستگاه}}</translation>
 <translation id="3236488194889173876">هیچ شبکه تلفن همراهی دردسترس نیست</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">مهمان</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">قفل</translation>
 <translation id="3798670284305777884">بلندگو (داخلی)</translation>
 <translation id="380165613292957338">سلام، چه کمکی می‌توانم بکنم؟</translation>
+<translation id="383629559565718788">نمایش تنظیمات صفحه‌کلید</translation>
 <translation id="3846575436967432996">اطلاعات شبکه در دسترس نیست</translation>
 <translation id="385051799172605136">بازگشت</translation>
 <translation id="3891340733213178823">‏برای خروج از سیستم Ctrl+Shift+Q را دو بار فشار دهید.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">سیگنال متوسط</translation>
 <translation id="4200057768455216496">میان‌بر مربوط به ذره‌بین متصل را فشار دادید. می‌خواهید آن را روشن کنید؟</translation>
 <translation id="4217571870635786043">املا</translation>
+<translation id="4261870227682513959">نمایش تنظیمات اعلان. اعلان‌ها خاموش است</translation>
 <translation id="4274921305979314545">‏Chromebook را با تلفنتان مرتبط کنید</translation>
 <translation id="4279490309300973883">بازتاب می‌شود</translation>
+<translation id="4292681942966152062">درحال فعال کردن <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">مهار</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">از «<ph name="FROM_LOCALE" />» به «<ph name="TO_LOCALE" />» بعد از همگام‌سازی تنظیمات.</translation>
 <translation id="574392208103952083">متوسط</translation>
 <translation id="5744083938413354016">کشیدن با ضربه زدن</translation>
+<translation id="5750765938512549687">بلوتوث خاموش است</translation>
 <translation id="5777841717266010279">اشتراک‌گذاری صفحه نمایش متوقف شود؟</translation>
 <translation id="57838592816432529">بی‌صدا کردن</translation>
 <translation id="5805697420284793859">مدیر پنجره</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">نمایش صفحه‌کلید روی صفحه</translation>
 <translation id="6164005077879661055">با حذف این کاربر نظارت‌شده، کلیه فایل‌ها و داده‌های محلی مربوط به کاربر نظارت‌شده برای همیشه حذف خواهند شد. وب‌سایت‌های بازدید شده و تنظیمات این کاربر نظارت‌شده همچنان برای مدیر در <ph name="MANAGEMENT_URL" /> قابل مشاهده خواهد بود.</translation>
 <translation id="6165508094623778733">بیشتر بدانید</translation>
+<translation id="6254629735336163724">قفل درحالت افقی</translation>
 <translation id="6259254695169772643">برای انتخاب از قلم استفاده کنید</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: در حال فعال‌سازی…</translation>
 <translation id="6284232397434400372">وضوح تغییر کرد</translation>
 <translation id="6297287540776456956">از قلم برای انتخاب منطقه استفاده کنید</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> به <ph name="ROTATION" /> چرخانده شد</translation>
 <translation id="632744581670418035">هم‌پوشانی صفحه‌کلید</translation>
+<translation id="6376931439017688372">بلوتوث روشن است</translation>
 <translation id="639644700271529076">‏CAPS LOCK خاموش است</translation>
 <translation id="6406704438230478924">دگرساز راست</translation>
 <translation id="643147933154517414">کاملاً انجام شد</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">این شبکه توسط سرپرست شما غیرفعال شده است.</translation>
 <translation id="7067196344162293536">چرخش خودکار</translation>
 <translation id="7076293881109082629">در حال ورود به سیستم</translation>
+<translation id="7092922358121866860">نمایش تنظیمات «نور شب»</translation>
 <translation id="7098389117866926363">‏دستگاه USB-C (درگاه عقب سمت چپ)</translation>
 <translation id="7131634465328662194">به‌طور خودکار از سیستم خارج خواهید شد.</translation>
 <translation id="7143207342074048698">در حال اتصال</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">‏برای لغو کردن، Search یا Shift را فشار دهید.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> و <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">سیگنال قوی</translation>
+<translation id="7842211907556571265">درحال اتصال به <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">هشدار: ویژگی آزمایشی</translation>
 <translation id="7846634333498149051">صفحه‌کلید</translation>
 <translation id="790040513076446191">دستکاری تنظیمات مربوط به حریم خصوصی</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: درحال اتصال مجدد...</translation>
 <translation id="8513108775083588393">چرخش خودکار</translation>
 <translation id="8517041960877371778">ممکن است وقتی <ph name="DEVICE_TYPE" /> شما خاموش است، شارژ نشود.</translation>
+<translation id="8627191004499078455">متصل به <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> باقی‌مانده</translation>
 <translation id="8649101189709089199">انتخاب کنید تا بتوانید صحبت کنید</translation>
 <translation id="8652175077544655965">بستن تنظیمات</translation>
+<translation id="8653151467777939995">نمایش تنظیمات اعلان. اعلان‌ها روشن است</translation>
+<translation id="8664753092453405566">نمایش فهرست شبکه. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">‎۲۷۰°‎</translation>
 <translation id="8676770494376880701">شارژر برق متصل شده ضعیف است</translation>
 <translation id="8683506306463609433">ردیابی عملکرد فعال است</translation>
 <translation id="8734991477317290293">ممکن است تلاش کند ضربه‌کلیدهای شما را به سرقت ببرد</translation>
+<translation id="8735953464173050365">نمایش تنظیمات صفحه‌کلید. <ph name="KEYBOARD_NAME" /> انتخاب شده است</translation>
+<translation id="875593634123171288">‏نمایش تنظیمات VPN</translation>
 <translation id="8809737090443522491">نام برنامه یا سندی را وارد کنید</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">«نمایش صفحه‌نمایش روی دستگاه دیگر» با بیش از دو نمایشگر پشتیبانی نمی‌شود.</translation>
 <translation id="8828714802988429505">۹۰°</translation>
 <translation id="8841375032071747811">دکمه برگشت</translation>
+<translation id="8843682306134542540">تغییر وضعیت قفل چرخش. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">برنامه از تقسیم صفحه پشتیبانی نمی‌کند.</translation>
 <translation id="8874184842967597500">متصل نیست</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb
index 7d5e8fa6..c9d2e093 100644
--- a/ash/strings/ash_strings_fi.xtb
+++ b/ash/strings/ash_strings_fi.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> lisätty</translation>
 <translation id="1056775291175587022">Ei verkkoja</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Näytä esteettömyysasetukset</translation>
 <translation id="1104621072296271835">Laitteesi toimivat entistä paremmin yhdessä</translation>
 <translation id="112308213915226829">Piilota hylly automaattisesti</translation>
 <translation id="1153356358378277386">Laiteparit</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Heikko signaali</translation>
 <translation id="1293264513303784526">C-tyypin USB-laite (vasemman sivun portti)</translation>
+<translation id="1302880136325416935">Näytä Bluetooth-asetukset. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Oikealle</translation>
 <translation id="1351937230027495976">Tiivistä valikko</translation>
 <translation id="1383876407941801731">Haku</translation>
 <translation id="1467432559032391204">Vasemmalle</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Käynnistysohjelma</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Näytä ilmoitusasetukset. Ilmoitukset on poistettu 1 sovelluksen käytöstä.}other{Näytä ilmoitusasetukset. Ilmoitukset on poistettu # sovelluksen käytöstä.}}</translation>
 <translation id="1525508553941733066">HYLKÄÄ</translation>
 <translation id="1537254971476575106">Koko näytön suurennus</translation>
 <translation id="15373452373711364">Suuri hiiren osoitin</translation>
 <translation id="1550523713251050646">Näet lisävaihtoehtoja klikkaamalla tätä.</translation>
 <translation id="1567387640189251553">Laitteeseen on kytketty eri näppäimistö sen jälkeen, kun annoit salasanasi edellisen kerran. Sillä voidaan yrittää kaapata näppäinpainalluksesi.</translation>
+<translation id="1570871743947603115">Ota Bluetooth käyttöön tai poista se käytöstä. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Poista tämä käyttäjä</translation>
 <translation id="1621499497873603021">Akku on tyhjä <ph name="TIME_LEFT" /> kuluttua</translation>
 <translation id="1658406695958299976">Salasanan vahvistaminen ei onnistunut vieläkään. Huom. Jos vaihdoit salasanasi äskettäin, uusi salasana otetaan käyttöön kirjauduttuasi ulos. Käytä tässä vanhaa salasanaasi.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Ei tunnistettu</translation>
 <translation id="1746730358044914197">Järjestelmänvalvoja on määrittänyt syöttötavat.</translation>
 <translation id="1747827819627189109">Ruutunäppäimistö otettiin käyttöön</translation>
+<translation id="1761222317188459878">Ota verkkoyhteys käyttöön tai poista se käytöstä. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (ladataan…)</translation>
 <translation id="1841545962859478868">Laitteen järjestelmänvalvoja voi seurata näitä:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Tätä laitetta hallinnoi <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Pystysuunta</translation>
 <translation id="2067602449040652523">Näppäimistön kirkkaus</translation>
+<translation id="2075212959500165896">Liian monta yritystä. Yritä myöhemmin uudelleen.</translation>
 <translation id="2081529251031312395">$1 voi silti kirjautua sisään myöhemmin.</translation>
 <translation id="2127372758936585790">Pienitehoinen laturi</translation>
 <translation id="2135456203358955318">Kiinnitetty suurennus</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Vaihda ikkunan yleiskatsausta</translation>
 <translation id="2338501278241028356">Löydä lähellä olevat laitteet ottamalla ensin Bluetooth käyttöön.</translation>
 <translation id="2339073806695260576">Napauttamalla hyllyn näyttökynäpainiketta voit tehdä muistiinpanoja, tallentaa kuvakaappauksen ja käyttää laserosoitinta tai suurennuslasia.</translation>
+<translation id="2341729377289034582">Lukittu pystysuuntaiseksi</translation>
 <translation id="2352467521400612932">Näyttökynäasetukset</translation>
 <translation id="2354174487190027830">Aktivoidaan <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Jatka</translation>
 <translation id="2365393535144473978">Jos otat mobiilidatan käyttöön, Bluetooth otetaan samalla käyttöön.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Ota Älä häiritse ‑tila käyttöön tai poista se käytöstä</translation>
 <translation id="2412593942846481727">Päivitys saatavilla</translation>
+<translation id="2416346634399901812">Yhdistetty: <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth-laite <ph name="DEVICE_NAME" /> pyytää lupaa laiteparin muodostamiseen. Ennen kuin hyväksyt pyynnön, varmista, että laitteella näkyy tämä avain: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Ilmoitukset</translation>
 <translation id="2484513351006226581">Paina <ph name="KEYBOARD_SHORTCUT" /> vaihtaaksesi näppäimistöasettelua.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Lisää yhteys</translation>
 <translation id="2961963223658824723">Jokin meni pieleen. Yritä uudelleen parin sekunnin kuluttua.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Näytä Cast-laitteet.</translation>
 <translation id="2996462380875591307">Kiinnitetty suurennus on käytössä. Poista se käytöstä painamalla uudelleen Ctrl + haku + D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> on julkinen käyttökerta, jota hallinnoi <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monoääni</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobiilitiedonsiirto</translation>
 <translation id="3151786313568798007">Suunta</translation>
 <translation id="3153444934357957346">Voit lisätä enintään <ph name="MULTI_PROFILE_USER_LIMIT" /> tiliä useille tileille kirjautumista varten.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Yhdistetty 1 laitteeseen}other{Yhdistetty # laitteeseen}}</translation>
 <translation id="3236488194889173876">Mobiiliverkkoja ei ole käytettävissä</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Vieras</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Lukitse</translation>
 <translation id="3798670284305777884">Kaiutin (sisäinen)</translation>
 <translation id="380165613292957338">Hei. Kuinka voin auttaa?</translation>
+<translation id="383629559565718788">Näytä näppäimistöasetukset</translation>
 <translation id="3846575436967432996">Verkon tietoja ei saatavilla</translation>
 <translation id="385051799172605136">Edellinen</translation>
 <translation id="3891340733213178823">Kirjaudu ulos painamalla Ctrl+Shift+Q kahdesti.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Keskitasoinen signaali</translation>
 <translation id="4200057768455216496">Painoit kiinnitetyn suurennuksen pikanäppäintä. Haluatko ottaa sen käyttöön?</translation>
 <translation id="4217571870635786043">Sanelu</translation>
+<translation id="4261870227682513959">Näytä ilmoitusasetukset. Ilmoitukset on poistettu käytöstä.</translation>
 <translation id="4274921305979314545">Yhdistä Chromebook puhelimeen</translation>
 <translation id="4279490309300973883">Peilaus päällä</translation>
+<translation id="4292681942966152062">Aktivoidaan <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Muutos asetusten synkronoinnin yhteydessä: <ph name="FROM_LOCALE" /> – <ph name="TO_LOCALE" /></translation>
 <translation id="574392208103952083">Keskikoko</translation>
 <translation id="5744083938413354016">Napauttamalla vetäminen</translation>
+<translation id="5750765938512549687">Bluetooth ei ole käytössä</translation>
 <translation id="5777841717266010279">Lopetetaanko näytön jakaminen?</translation>
 <translation id="57838592816432529">Mykistä</translation>
 <translation id="5805697420284793859">Ikkunat</translation>
@@ -275,12 +290,14 @@
  pysyvästi, kun tämä valvottu käyttäjä poistetaan. Vieraillut verkkosivustot ja
  valvotun käyttäjän asetukset saattavat silti vielä näkyä hallinnoijalle osoitteessa <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Lisätietoja</translation>
+<translation id="6254629735336163724">Lukittu vaakasuuntaiseksi</translation>
 <translation id="6259254695169772643">Valitse näyttökynällä</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: aktivoidaan…</translation>
 <translation id="6284232397434400372">Resoluutio vaihdettu</translation>
 <translation id="6297287540776456956">Valitse alue näyttökynällä.</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> käännettiin asentoon <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Näppäimistön peitto</translation>
+<translation id="6376931439017688372">Bluetooth on käytössä</translation>
 <translation id="639644700271529076">CAPS LOCK on pois päältä</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Valmis</translation>
@@ -324,6 +341,7 @@
 <translation id="7066646422045619941">Järjestelmänvalvoja on poistanut tämän verkon käytöstä.</translation>
 <translation id="7067196344162293536">Automaattinen kierto</translation>
 <translation id="7076293881109082629">Kirjautuminen</translation>
+<translation id="7092922358121866860">Näytä Yövalon asetukset</translation>
 <translation id="7098389117866926363">C-tyypin USB-laite (vasemmanpuoleinen takaportti)</translation>
 <translation id="7131634465328662194">Sinut kirjataan automaattisesti ulos.</translation>
 <translation id="7143207342074048698">Yhdistetään</translation>
@@ -359,6 +377,7 @@
 <translation id="7798302898096527229">Peruuta painamalla haku- tai vaihtonäppäintä.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Vahva signaali</translation>
+<translation id="7842211907556571265">Yhdistetään: <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Varoitus: Kokeellinen ominaisuus</translation>
 <translation id="7846634333498149051">Näppäimistö</translation>
 <translation id="790040513076446191">Muokata tietosuojaan liittyviä asetuksia</translation>
@@ -399,18 +418,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Yhdistetään uudelleen…</translation>
 <translation id="8513108775083588393">Automaattinen kääntö</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> ei välttämättä lataudu, kun se on käynnissä.</translation>
+<translation id="8627191004499078455">Yhdistetty: <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> jäljellä</translation>
 <translation id="8649101189709089199">Teksti puhuttuna</translation>
 <translation id="8652175077544655965">Sulje asetukset</translation>
+<translation id="8653151467777939995">Näytä ilmoitusasetukset. Ilmoitukset ovat käytössä.</translation>
+<translation id="8664753092453405566">Näytä verkkoluettelo. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Pienitehoinen laturi kytketty</translation>
 <translation id="8683506306463609433">Tehokkuuden seuranta aktiivinen</translation>
 <translation id="8734991477317290293">Sillä voidaan yrittää kaapata näppäinpainalluksesi</translation>
+<translation id="8735953464173050365">Näytä näppäimistöasetukset. <ph name="KEYBOARD_NAME" /> on valittuna.</translation>
+<translation id="875593634123171288">Näytä VPN-asetukset</translation>
 <translation id="8809737090443522491">Kirjoita sovelluksen tai dokumentin nimi</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Peilaamista yli kahdelle näytölle ei tueta.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Takaisin-painike</translation>
+<translation id="8843682306134542540">Ota kierron lukitus käyttöön tai poista se käytöstä. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Haku+Esc</translation>
 <translation id="8870509716567206129">Sovellus ei tue jaetun näytön tilaa.</translation>
 <translation id="8874184842967597500">Ei yhdistetty</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index 1a7a033f..7580f86 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Idinagdag ang <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Walang network</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Ipakita ang mga setting ng pagiging naa-access</translation>
 <translation id="1104621072296271835">Gagana nang mas maayos ang iyong mga device kung magkakasama</translation>
 <translation id="112308213915226829">Awtomatikong itago ang shelf</translation>
 <translation id="1153356358378277386">Mga nakapares na device</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Mahina ang signal</translation>
 <translation id="1293264513303784526">USB-C device (port sa kaliwa)</translation>
+<translation id="1302880136325416935">Ipakita ang mga setting ng Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Kanan</translation>
 <translation id="1351937230027495976">I-collapse ang menu</translation>
 <translation id="1383876407941801731">Hanapin</translation>
 <translation id="1467432559032391204">Kaliwa</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Launcher</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Ipakita ang mga setting ng notification. Naka-off ang mga notification para sa isang app}one{Ipakita ang mga setting ng notification. Naka-off ang mga notification para sa # app}other{Ipakita ang mga setting ng notification. Naka-off ang mga notification para sa # na app}}</translation>
 <translation id="1525508553941733066">I-DISMISS</translation>
 <translation id="1537254971476575106">Fullscreen magnifier</translation>
 <translation id="15373452373711364">Malaking mouse cursor</translation>
 <translation id="1550523713251050646">Mag-click para sa higit pang mga opsyon</translation>
 <translation id="1567387640189251553">Nagkonekta ng ibang keyboard mula nang huli mong inilagay ang iyong password. Maaaring sinusubukan nitong nakawin ang iyong mga keystroke.</translation>
+<translation id="1570871743947603115">I-toggle ang Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Alisin ang user na ito</translation>
 <translation id="1621499497873603021">Natitirang oras bago maubos ang baterya, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Paumanhin, hindi pa rin ma-verify ang iyong password. Tandaan: kung pinalitan mo kamakailan ang iyong password, malalapat ang bago mong password kapag nag-sign out ka, pakigamit ang lumang password dito.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Hindi nakilala</translation>
 <translation id="1746730358044914197">Isinasaayos ng iyong administrator ang mga pamamaraan sa pag-input.</translation>
 <translation id="1747827819627189109">Naka-enable ang on-screen na keyboard</translation>
+<translation id="1761222317188459878">I-toggle ang koneksyon sa network. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (naglo-load...)</translation>
 <translation id="1841545962859478868">Maaaring subaybayan ng admin ng device ang mga sumusunod:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Pinamamahalaan ng <ph name="DOMAIN" /> ang device na ito.</translation>
 <translation id="2050339315714019657">Portrait</translation>
 <translation id="2067602449040652523">Liwanag ng keyboard</translation>
+<translation id="2075212959500165896">Masyadong maraming beses sumubok. Subukang muli sa ibang pagkakataon.</translation>
 <translation id="2081529251031312395">Maaari pa ring mag-sign in si $1 sa ibang pagkakataon.</translation>
 <translation id="2127372758936585790">Low-power charger</translation>
 <translation id="2135456203358955318">Naka-dock na magnifier</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">I-toggle ang window ng pangkalahatang-ideya</translation>
 <translation id="2338501278241028356">I-on ang Bluetooth upang tuklasin ang mga kalapit na device</translation>
 <translation id="2339073806695260576">I-tap ang button na stylus sa shelf para magsulat ng tala, mag-screenshot, gamitin ang laser pointer, o magnifying glass.</translation>
+<translation id="2341729377289034582">Naka-lock sa vertical</translation>
 <translation id="2352467521400612932">Mga setting ng stylus</translation>
 <translation id="2354174487190027830">Ina-activate ang <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Magpatuloy</translation>
 <translation id="2365393535144473978">Kapag na-enable ang mobile data, mae-enable din ang Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">I-toggle ang Huwag istorbohin</translation>
 <translation id="2412593942846481727">May available na update</translation>
+<translation id="2416346634399901812">Nakakonekta sa <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Gusto ng bluetooth device na "<ph name="DEVICE_NAME" />" ng pahintulot na magpares . Bago tanggapin, pakikumpirma na ipinapakita ang passkey na ito sa device na iyon: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Mga Abiso</translation>
 <translation id="2484513351006226581">Pindutin ang <ph name="KEYBOARD_SHORTCUT" /> upang palitan ang layout ng keyboard.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Magdagdag ng koneksyon</translation>
 <translation id="2961963223658824723">Nagkaproblema. Subukang muli sa loob ng ilang segundo.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Ipakita ang mga cast device.</translation>
 <translation id="2996462380875591307">Na-enable ang Naka-dock na Magnifier. Pinduting muli ang Ctrl+Search+D para i-off ito.</translation>
 <translation id="2999742336789313416">Ang <ph name="DISPLAY_NAME" /> ay isang pampublikong session na pinamamahalaan ng <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Mono audio</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Data sa mobile</translation>
 <translation id="3151786313568798007">Oryentasyon</translation>
 <translation id="3153444934357957346">Maaari ka lang magkaroon ng hanggang <ph name="MULTI_PROFILE_USER_LIMIT" /> (na) account sa maraming pag-sign in.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Nakakonekta sa isang device}one{Nakakonekta sa # device}other{Nakakonekta sa # na device}}</translation>
 <translation id="3236488194889173876">Walang available na mobile network</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Bisita</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">I-lock</translation>
 <translation id="3798670284305777884">Speaker (internal)</translation>
 <translation id="380165613292957338">Kumusta, ano ang maitutulong ko?</translation>
+<translation id="383629559565718788">Ipakita ang mga setting ng keyboard</translation>
 <translation id="3846575436967432996">Walang available na impormasyon sa network</translation>
 <translation id="385051799172605136">Bumalik</translation>
 <translation id="3891340733213178823">Pindutin ang Ctrl+Shift+Q nang dalawang beses upang mag-sign out.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Katamtaman ang signal</translation>
 <translation id="4200057768455216496">Napindot mo ang shortcut para sa naka-dock na magnifier. Gusto mo ba itong i-on?</translation>
 <translation id="4217571870635786043">Pagdidikta</translation>
+<translation id="4261870227682513959">Ipakita ang mga setting ng notification. Naka-off ang mga notification</translation>
 <translation id="4274921305979314545">Ikonekta ang iyong Chromebook sa telepono mo</translation>
 <translation id="4279490309300973883">Nagmi-mirror</translation>
+<translation id="4292681942966152062">Ina-activate ang <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Magnifying glass</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Gagawing "<ph name="TO_LOCALE" />" mula "<ph name="FROM_LOCALE" />" pagkatapos i-sync ang iyong mga setting.</translation>
 <translation id="574392208103952083">Katamtaman</translation>
 <translation id="5744083938413354016">Pag-tap upang mag-drag</translation>
+<translation id="5750765938512549687">Naka-off ang Bluetooth</translation>
 <translation id="5777841717266010279">Itigil ang screen sharing?</translation>
 <translation id="57838592816432529">I-mute</translation>
 <translation id="5805697420284793859">Window manager</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Ipakita ang on-screen na keyboard</translation>
 <translation id="6164005077879661055">Permanenteng matatanggal ang lahat ng file at lokal na data na kaugnay ng pinangangasiwaang user sa oras na alisin ang pinangangasiwaang user na ito. Maaari pa ring makita ng manager ang mga nabisitang website at setting para sa pinangangasiwaang user na ito sa <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Matuto nang higit pa</translation>
+<translation id="6254629735336163724">Naka-lock sa horizontal</translation>
 <translation id="6259254695169772643">Gamitin ang iyong stylus para pumili</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Ina-activate...</translation>
 <translation id="6284232397434400372">Binago ang resolution</translation>
 <translation id="6297287540776456956">Gamitin ang stylus upang pumili ng rehiyon</translation>
 <translation id="6310121235600822547">Na-rotate ang <ph name="DISPLAY_NAME" /> sa <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Overlay ng keyboard</translation>
+<translation id="6376931439017688372">Naka-on ang Bluetooth</translation>
 <translation id="639644700271529076">Naka-off ang CAPS LOCK</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Tapos na ang lahat</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Na-disable ng iyong administrator ang network na ito.</translation>
 <translation id="7067196344162293536">Awtomatikong pag-rotate</translation>
 <translation id="7076293881109082629">Nagsa-sign in</translation>
+<translation id="7092922358121866860">Ipakita ang mga setting ng Night Light</translation>
 <translation id="7098389117866926363">USB-C device (kaliwang port sa likod)</translation>
 <translation id="7131634465328662194">Awtomatiko kang masa-sign out.</translation>
 <translation id="7143207342074048698">Kumokonekta</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Pindutin ang Search o Shift upang kanselahin.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> at <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Malakas ang signal</translation>
+<translation id="7842211907556571265">Kumokonekta sa <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Babala: Pang-eskperimentong feature</translation>
 <translation id="7846634333498149051">Keyboard</translation>
 <translation id="790040513076446191">Manipulahin ang mga setting kaugnay ng privacy</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Muling kumokonekta...</translation>
 <translation id="8513108775083588393">I-auto rotate</translation>
 <translation id="8517041960877371778">Maaaring hindi mag-charge ang iyong <ph name="DEVICE_TYPE" /> habang naka-on ito.</translation>
+<translation id="8627191004499078455">Nakakonekta sa <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> na lang ang natitira</translation>
 <translation id="8649101189709089199">Select-to-Speak</translation>
 <translation id="8652175077544655965">Isara ang mga setting</translation>
+<translation id="8653151467777939995">Ipakita ang mga setting ng notification. Naka-on ang mga notification</translation>
+<translation id="8664753092453405566">Ipakita ang listahan ng network. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Nakakabit ang low-power charger</translation>
 <translation id="8683506306463609433">Aktibo ang pag-trace ng performance</translation>
 <translation id="8734991477317290293">Maaaring sinusubukan nitong nakawin ang iyong mga keystroke</translation>
+<translation id="8735953464173050365">Ipakita ang mga setting ng keyboard. Napili ang <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Ipakita ang mga setting ng VPN</translation>
 <translation id="8809737090443522491">Mag-type ng pangalan ng app o dokumento</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Hindi sinusuportahan ang pagmi-mirror sa mahigit sa dalawang display.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Button na Bumalik</translation>
+<translation id="8843682306134542540">I-toggle ang lock ng pag-rotate. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">Hindi sinusuportahan ng app ang split-screen.</translation>
 <translation id="8874184842967597500">Hindi nakakonekta</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb
index 7d056f7..1631ad1 100644
--- a/ash/strings/ash_strings_fr.xtb
+++ b/ash/strings/ash_strings_fr.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ajouté</translation>
 <translation id="1056775291175587022">Aucun réseau</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" /> : <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Afficher les paramètres d'accessibilité</translation>
 <translation id="1104621072296271835">Vos appareils fonctionnent encore mieux ensemble</translation>
 <translation id="112308213915226829">Masquer automatiquement l'étagère</translation>
 <translation id="1153356358378277386">Appareils associés</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Signal de faible intensité</translation>
 <translation id="1293264513303784526">Appareil USB de type C (port situé sur la gauche de l'appareil)</translation>
+<translation id="1302880136325416935">Afficher les appareils Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Vers la droite</translation>
 <translation id="1351937230027495976">Réduire le menu</translation>
 <translation id="1383876407941801731">Rechercher</translation>
 <translation id="1467432559032391204">Vers la gauche</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Lanceur d'applications</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Afficher les paramètres de notification. Les notifications sont désactivées pour une application}one{Afficher les paramètres de notification. Les notifications sont désactivées pour # application}other{Afficher les paramètres de notification. Les notifications sont désactivées pour # applications}}</translation>
 <translation id="1525508553941733066">IGNORER</translation>
 <translation id="1537254971476575106">Loupe plein écran</translation>
 <translation id="15373452373711364">Grand curseur</translation>
 <translation id="1550523713251050646">Cliquez pour obtenir plus d'options.</translation>
 <translation id="1567387640189251553">Un clavier différent a été branché depuis la dernière fois où vous avez saisi votre mot de passe. Il est possible que ce soit pour enregistrer les touches sur lesquelles vous appuyez et vous soutirer ainsi des informations.</translation>
+<translation id="1570871743947603115">Activer/Désactiver le Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Supprimer cet utilisateur</translation>
 <translation id="1621499497873603021">Temps restant avant que la batterie ne soit vide : <ph name="TIME_LEFT" />.</translation>
 <translation id="1658406695958299976">Impossible de valider le mot de passe. Remarque : si vous l'avez modifié dernièrement, votre nouveau mot de passe ne sera appliqué qu'une fois que vous vous serez déconnecté. Veuillez donc utiliser votre ancien mot de passe.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Non reconnu</translation>
 <translation id="1746730358044914197">Les modes de saisie sont configurés par votre administrateur.</translation>
 <translation id="1747827819627189109">Clavier à l'écran activé</translation>
+<translation id="1761222317188459878">Activer/Désactiver la connexion réseau. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet : <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (chargement…)</translation>
 <translation id="1841545962859478868">L'administrateur de cet appareil peut contrôler les éléments suivants :</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Cet appareil est géré par <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portrait</translation>
 <translation id="2067602449040652523">Luminosité du clavier</translation>
+<translation id="2075212959500165896">Trop de tentatives. Réessayez plus tard.</translation>
 <translation id="2081529251031312395">$1 pourra toujours se connecter plus tard.</translation>
 <translation id="2127372758936585790">Chargeur de faible puissance</translation>
 <translation id="2135456203358955318">Loupe ancrée</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Activer/Désactiver la vue d'ensemble des fenêtres</translation>
 <translation id="2338501278241028356">Activer le Bluetooth pour découvrir les appareils à proximité</translation>
 <translation id="2339073806695260576">Appuyez sur le bouton du stylet situé sur l'étagère pour prendre des notes, effectuer des captures d'écran, et utiliser le pointeur laser ou la loupe.</translation>
+<translation id="2341729377289034582">Verrouillée en position verticale</translation>
 <translation id="2352467521400612932">Paramètres du stylet</translation>
 <translation id="2354174487190027830">Activation du réseau <ph name="NAME" /> en cours…</translation>
 <translation id="2359808026110333948">Continuer</translation>
 <translation id="2365393535144473978">L'activation des données mobiles active également le Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Activer/Désactiver le mode "Ne pas déranger"</translation>
 <translation id="2412593942846481727">Mise à jour disponible</translation>
+<translation id="2416346634399901812">Connecté à <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">L'appareil Bluetooth "<ph name="DEVICE_NAME" />" demande l'autorisation de s'associer. Avant d'accepter, veuillez confirmer que le code d'authentification suivant s'affiche sur l'appareil : <ph name="PASSKEY" />.</translation>
 <translation id="2482878487686419369">Notifications</translation>
 <translation id="2484513351006226581">Appuyez sur <ph name="KEYBOARD_SHORTCUT" /> pour changer la disposition du clavier.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Ajouter une connexion</translation>
 <translation id="2961963223658824723">Une erreur s'est produite. Veuillez réessayer dans quelques secondes.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Afficher les appareils Cast.</translation>
 <translation id="2996462380875591307">Le mode Loupe ancrée est activé. Appuyez de nouveau sur Ctrl+Recherche+D pour le désactiver.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> est une session publique gérée par <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Audio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Données mobiles</translation>
 <translation id="3151786313568798007">Orientation</translation>
 <translation id="3153444934357957346">Vous ne pouvez vous connecter qu'à <ph name="MULTI_PROFILE_USER_LIMIT" /> comptes au maximum dans le cadre de la connexion multicompte.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connecté à un appareil}one{Connecté à # appareil}other{Connecté à # appareils}}</translation>
 <translation id="3236488194889173876">Aucun réseau mobile disponible</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Invité</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Verrouiller</translation>
 <translation id="3798670284305777884">Haut-parleur (interne)</translation>
 <translation id="380165613292957338">Bonjour, comment puis-je vous aider ?</translation>
+<translation id="383629559565718788">Afficher les paramètres du clavier</translation>
 <translation id="3846575436967432996">Aucune information disponible concernant le réseau</translation>
 <translation id="385051799172605136">Retour</translation>
 <translation id="3891340733213178823">Appuyez deux fois sur Ctrl + Maj + Q pour vous déconnecter.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Signal de moyenne intensité</translation>
 <translation id="4200057768455216496">Vous avez utilisé le raccourci de la loupe ancrée. Voulez-vous l'activer ?</translation>
 <translation id="4217571870635786043">Dictée</translation>
+<translation id="4261870227682513959">Afficher les paramètres de notification. Les notifications sont désactivées</translation>
 <translation id="4274921305979314545">Associez votre Chromebook à votre téléphone</translation>
 <translation id="4279490309300973883">Mise en miroir</translation>
+<translation id="4292681942966152062">Activation de <ph name="NETWORK_NAME" />…</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">La langue utilisée est passée de "<ph name="FROM_LOCALE" />" à "<ph name="TO_LOCALE" />" après la synchronisation de vos paramètres.</translation>
 <translation id="574392208103952083">Moyenne</translation>
 <translation id="5744083938413354016">Déplacement tactile</translation>
+<translation id="5750765938512549687">Bluetooth désactivé</translation>
 <translation id="5777841717266010279">Arrêter le partage d'écran ?</translation>
 <translation id="57838592816432529">Couper le son</translation>
 <translation id="5805697420284793859">Gestionnaire de fenêtres</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Afficher le clavier à l'écran</translation>
 <translation id="6164005077879661055">Tous les fichiers et les données locales associés à l'utilisateur supervisé seront définitivement supprimés en même temps que cet utilisateur. Le gestionnaire peut toujours accéder aux sites Web consultés par l'utilisateur supervisé et aux paramètres de celui-ci à l'adresse <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">En savoir plus</translation>
+<translation id="6254629735336163724">Verrouillée en position horizontale</translation>
 <translation id="6259254695169772643">Effectuez une sélection à l'aide de votre stylet</translation>
 <translation id="6267036997247669271"><ph name="NAME" /> : activation en cours…</translation>
 <translation id="6284232397434400372">Résolution modifiée</translation>
 <translation id="6297287540776456956">Utiliser le stylet pour sélectionner une zone</translation>
 <translation id="6310121235600822547">L'écran "<ph name="DISPLAY_NAME" />" a effectué une rotation de <ph name="ROTATION" />.</translation>
 <translation id="632744581670418035">Clavier en superposition</translation>
+<translation id="6376931439017688372">Bluetooth activé</translation>
 <translation id="639644700271529076">La touche de verrouillage des majuscules est désactivée.</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Terminé</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Votre administrateur a désactivé ce réseau.</translation>
 <translation id="7067196344162293536">Rotation automatique</translation>
 <translation id="7076293881109082629">Connexion</translation>
+<translation id="7092922358121866860">Afficher les paramètres d'éclairage nocturne</translation>
 <translation id="7098389117866926363">Appareil USB de type C (port situé sur l'arrière de l'appareil, à gauche)</translation>
 <translation id="7131634465328662194">Vous allez être déconnecté automatiquement.</translation>
 <translation id="7143207342074048698">Connexion en cours</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Appuyez sur Rechercher ou Maj pour annuler.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> et <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Signal de forte intensité</translation>
+<translation id="7842211907556571265">Connexion à <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Avertissement : Fonctionnalité expérimentale</translation>
 <translation id="7846634333498149051">Clavier</translation>
 <translation id="790040513076446191">Modifier les paramètres de confidentialité</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" /> : reconnexion…</translation>
 <translation id="8513108775083588393">Rotation automatique</translation>
 <translation id="8517041960877371778">Il est possible que votre appareil <ph name="DEVICE_TYPE" /> ne se recharge pas lorsqu'il est allumé.</translation>
+<translation id="8627191004499078455">Connecté à <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> restant(s)</translation>
 <translation id="8649101189709089199">Sélectionner pour prononcer</translation>
 <translation id="8652175077544655965">Fermer les paramètres</translation>
+<translation id="8653151467777939995">Afficher les paramètres de notification. Les notifications sont activées</translation>
+<translation id="8664753092453405566">Afficher la liste des réseaux. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Chargeur de faible puissance connecté</translation>
 <translation id="8683506306463609433">Suivi des performances actif</translation>
 <translation id="8734991477317290293">Il est possible que cet autre clavier tente d'enregistrer les touches sur lesquelles vous appuyez afin de vous soutirer des informations</translation>
+<translation id="8735953464173050365">Afficher les paramètres du clavier. <ph name="KEYBOARD_NAME" /> est sélectionné</translation>
+<translation id="875593634123171288">Afficher les paramètres de VPN</translation>
 <translation id="8809737090443522491">Saisissez le nom d'une application ou d'un document</translation>
 <translation id="8814190375133053267">Wi-Fi </translation>
 <translation id="8825534185036233643">La duplication d'écran avec plus de deux écrans n'est pas acceptée.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Bouton Retour</translation>
+<translation id="8843682306134542540">Activer/Désactiver le verrouillage de la rotation. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Recherche+Échap</translation>
 <translation id="8870509716567206129">Application incompatible avec l'écran partagé.</translation>
 <translation id="8874184842967597500">Non connecté</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb
index 513951b..8aa8f0b 100644
--- a/ash/strings/ash_strings_gu.xtb
+++ b/ash/strings/ash_strings_gu.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ઉમેર્યું</translation>
 <translation id="1056775291175587022">કોઈ નેટવર્ક નથી</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">ઍક્સેસિબિલિટી સેટિંગ બતાવો</translation>
 <translation id="1104621072296271835">તમારા ઉપકરણો એક સાથે હોય ત્યારે વધુ કાર્યક્ષમ હોય છે</translation>
 <translation id="112308213915226829">સ્વતઃછુપાવો શેલ્ફ</translation>
 <translation id="1153356358378277386">જોડી કરેલા ઉપકરણો</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">નબળું સિગ્નલ</translation>
 <translation id="1293264513303784526">USB-C ઉપકરણ (ડાબું પોર્ટ)</translation>
+<translation id="1302880136325416935">બ્લૂટૂથ સેટિંગ બતાવો. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">જમણે</translation>
 <translation id="1351937230027495976">મેનૂ સંકુચિત કરો</translation>
 <translation id="1383876407941801731">શોધો</translation>
 <translation id="1467432559032391204">ડાબું</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">લૉન્ચર</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{નોટિફિકેશનની સેટિંગ બતાવો. ઍપ માટે નોટિફિકેશન બંધ છે}one{નોટિફિકેશનની સેટિંગ બતાવો. # ઍપ માટે નોટિફિકેશન બંધ છે}other{નોટિફિકેશનની સેટિંગ બતાવો. # ઍપ માટે નોટિફિકેશન બંધ છે}}</translation>
 <translation id="1525508553941733066">છોડી દો</translation>
 <translation id="1537254971476575106">પૂર્ણસ્ક્રીન મૅગ્નિફાયર</translation>
 <translation id="15373452373711364">મોટું માઉસ કર્સર</translation>
 <translation id="1550523713251050646">વધુ વિકલ્પો માટે ક્લિક કરો</translation>
 <translation id="1567387640189251553">તમે છેલ્લે પાસવર્ડ દાખલ કર્યો, ત્યાર પછી એક અલગ કીબોર્ડ કનેક્ટ કરવામાં આવ્યું છે. તે તમારા કીસ્ટ્રોકની ચોરી કરવાનો પ્રયાસ કરતું હોઈ શકે છે.</translation>
+<translation id="1570871743947603115">બ્લૂટૂથ ટૉગલ કરો. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">આ વપરાશકર્તાને દૂર કરો</translation>
 <translation id="1621499497873603021">બેટરી ખાલી થવામાં બાકી સમય, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">માફ કરશો, તમારો પાસવર્ડ હજી ચકાસી શકાયો નથી. નોંધ: જો તમે તાજેતરમાં તમારો પાસવર્ડ બદલ્યો હોય, તો તમારો નવો પાસવર્ડ તમે એક વાર સાઇન આઉટ કરી લો તે પછી લાગુ થશે, કૃપા કરીને અહીં જૂના પાસવર્ડનો ઉપયોગ કરો.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">ઓળખાયેલ નથી</translation>
 <translation id="1746730358044914197">ઇનપુટ પદ્ધતિઓને તમારા વ્યવસ્થાપક દ્વારા ગોઠવવામાં આવી છે.</translation>
 <translation id="1747827819627189109">ઓન-સ્ક્રીન કીબોર્ડ સક્ષમ કર્યું</translation>
+<translation id="1761222317188459878">નેટવર્ક કનેક્શન ટૉગલ કરો. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">ઇથરનેટ: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">સહાયક (લોડ થઈ રહ્યું છે…)</translation>
 <translation id="1841545962859478868">ઉપકરણ વ્યવસ્થાપક નીચે આપેલનું નિરીક્ષણ કરી શકે છે:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">આ ઉપકરણને <ph name="DOMAIN" /> દ્વારા મેનેજ કરવામાં આવેલું છે.</translation>
 <translation id="2050339315714019657">પોર્ટ્રેટ</translation>
 <translation id="2067602449040652523">કીબોર્ડનું તેજ</translation>
+<translation id="2075212959500165896">ઘણા બધા પ્રયત્નો કર્યા. થોડા સમય પછી ફરી પ્રયાસ કરો.</translation>
 <translation id="2081529251031312395">$1 હજુ થોડા સમય પછી સાઇન ઇન કરી શકશે.</translation>
 <translation id="2127372758936585790">નિમ્ન-પાવર ચાર્જર</translation>
 <translation id="2135456203358955318">ડૉક કરેલ મૅગ્નિફાયર</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">ટોગલ વિન્ડો વિહંગાવલોકન</translation>
 <translation id="2338501278241028356">નજીકનાં ઉપકરણો શોધવા માટે Bluetooth ચાલુ કરો</translation>
 <translation id="2339073806695260576">એક નોંધ અથવા સ્ક્રીનશૉટ લેવા, લેઝર પૉઇન્ટર અથવા મૅગ્નિફાયિંગ ગ્લાસનો ઉપયોગ કરવા માટે શેલ્ફ પરના સ્ટાઇલસ બટન પર ટૅપ કરો.</translation>
+<translation id="2341729377289034582">ઊભી સ્થિતિ પર લૉક કરેલું છે</translation>
 <translation id="2352467521400612932">કલમની સેટિંગ્સ</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> ને સક્રિય કરી રહ્યું છે</translation>
 <translation id="2359808026110333948">ચાલુ રાખો</translation>
 <translation id="2365393535144473978">મોબાઇલ ડેટા સક્ષમ કરવાથી બ્લૂટૂથ સક્ષમ થશે.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">'ખલેલ પાડશો નહીં'ને ટૉગલ કરો</translation>
 <translation id="2412593942846481727">અપડેટ ઉપલબ્ધ છે</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> સાથે કનેક્ટ થયા</translation>
 <translation id="2429753432712299108">Bluetooth ઉપકરણ "<ph name="DEVICE_NAME" />" ને જોડી બનાવવા માટે પરવાનગી જોઈએ છે. સ્વીકારતાં પહેલાં, કૃપા કરીને તે ઉપકરણ પર બતાવેલ આ પાસકીની પુષ્ટિ કરો: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">સૂચનાઓ</translation>
 <translation id="2484513351006226581">કીબોર્ડ લેઆઉટ સ્વિચ કરવા માટે <ph name="KEYBOARD_SHORTCUT" />ને દબાવો.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">કનેક્શન ઉમેરો</translation>
 <translation id="2961963223658824723">કંઈક ખોટું થયું. થોડીવારમાં ફરીથી પ્રયાસ કરો.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">કાસ્ટ ઉપકરણો બતાવો.</translation>
 <translation id="2996462380875591307">ડૉક કરેલ મૅગ્નિફાયર ચાલુ કર્યું. ટૉગલ કરવાનું બંધ કરવા માટે ફરીથી Ctrl+Search+D દબાવો.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> એ <ph name="DOMAIN" /> દ્વારા સંચાલિત સાર્વજનિક સત્ર છે</translation>
 <translation id="3000461861112256445">મૉનો ઑડિઓ</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">મોબાઇલ ડેટા</translation>
 <translation id="3151786313568798007">ઓરિએન્ટેશન</translation>
 <translation id="3153444934357957346">તમે એકથી વધુ સાઇન ઇનમાં માત્ર <ph name="MULTI_PROFILE_USER_LIMIT" /> સુધી એકાઉન્ટ રાખી શકો છો.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ઉપકરણ સાથે કનેક્ટ કર્યું}one{# ઉપકરણો સાથે કનેક્ટ કર્યું}other{# ઉપકરણો સાથે કનેક્ટ કર્યું}}</translation>
 <translation id="3236488194889173876">કોઈ મોબાઇલ નેટવર્ક ઉપલબ્ધ નથી</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">અતિથિ</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">લૉક</translation>
 <translation id="3798670284305777884">સ્પીકર (આંતરિક)</translation>
 <translation id="380165613292957338">નમસ્કાર, હું કેવી રીતે સહાય કરી શકું?</translation>
+<translation id="383629559565718788">કીબોર્ડ સેટિંગ બતાવો</translation>
 <translation id="3846575436967432996">કોઈ નેટવર્ક માહિતી ઉપલબ્ધ નથી</translation>
 <translation id="385051799172605136">પાછળ</translation>
 <translation id="3891340733213178823">સાઇન આઉટ કરવા માટે બે વાર Ctrl+Shift+Q દબાવો.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">મધ્યમ સિગ્નલ</translation>
 <translation id="4200057768455216496">તમે ડૉક કરેલ મૅગ્નિફાયર માટેનો શૉર્ટકટ દબાવેલ છે. શું તમે તે ચાલુ કરવા માગો છો?</translation>
 <translation id="4217571870635786043">ડિક્ટેશન</translation>
+<translation id="4261870227682513959">નોટિફિકેશન સેટિંગ બતાવો. નોટિફિકેશન બંધ છે</translation>
 <translation id="4274921305979314545">તમારી Chromebookને તમારા ફોન સાથે કનેક્ટ કરો</translation>
 <translation id="4279490309300973883">પ્રતિબિંબત થઈ રહ્યું છે</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> સક્રિય થઈ રહ્યું છે</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">બૃહદદર્શક કાચ</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">તમારી સેટિંગને સિંક કર્યા પછી "<ph name="FROM_LOCALE" />" થી "<ph name="TO_LOCALE" />"માં ફેરવો.</translation>
 <translation id="574392208103952083">મધ્યમ</translation>
 <translation id="5744083938413354016">ખેંચવાને ટૅપ કરો</translation>
+<translation id="5750765938512549687">બ્લૂટૂથ બંધ છે</translation>
 <translation id="5777841717266010279">સ્ક્રીન શેરિંગ રોકીએ?</translation>
 <translation id="57838592816432529">અવાજ બંધ કરો</translation>
 <translation id="5805697420284793859">વિન્ડો મેનેજર</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">ઑન-સ્ક્રીન કીબોર્ડ બતાવો</translation>
 <translation id="6164005077879661055">એકવાર આ નિરીક્ષણ કરેલ વપરાશકર્તાને દૂર કરવામાં આવે પછી નિરીક્ષણ કરેલ વપરાશકર્તા સાથે સંકળાયેલી બધી ફાઇલો અને સ્થાનિક ડેટા કાયમી રૂપે કાઢી નાંખવામાં આવશે. નિરીક્ષણ કરેલ વપરાશકર્તા માટે મુલાકાત લીધેલી વેબસાઇટ્સ અને સેટિંગ્સ <ph name="MANAGEMENT_URL" /> પરના સંચાલકને હજી પણ દૃશ્યમાન હોઈ શકે છે.</translation>
 <translation id="6165508094623778733">વધુ જાણો</translation>
+<translation id="6254629735336163724">આડા પર લૉક કરેલું છે</translation>
 <translation id="6259254695169772643">પસંદ કરવા માટે તમારા સ્ટાઇલસનો ઉપયોગ કરો</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: સક્રિય કરી રહ્યું છે...</translation>
 <translation id="6284232397434400372">રિઝોલ્યુશન બદલાયું</translation>
 <translation id="6297287540776456956">કોઈ પ્રદેશ પસંદ કરવા માટે કલમનો ઉપયોગ કરો</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ને <ph name="ROTATION" /> પર ફેરવવામાં આવ્યું હતું</translation>
 <translation id="632744581670418035">કીબોર્ડ ઓવરલે</translation>
+<translation id="6376931439017688372">બ્લૂટૂથ ચાલુ છે</translation>
 <translation id="639644700271529076">CAPS LOCK બંધ છે</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">થઈ ગયું</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">આ નેટવર્ક તમારા વ્યવસ્થાપક દ્વારા અક્ષમ કરેલ છે.</translation>
 <translation id="7067196344162293536">સ્વતઃ ફેરવો</translation>
 <translation id="7076293881109082629">સાઇન ઇન કરી રહ્યું છે</translation>
+<translation id="7092922358121866860">રાત્રિ પ્રકાશ સેટિંગ બતાવો</translation>
 <translation id="7098389117866926363">USB-C ઉપકરણ (પાછળની બાજુએ ડાબું પોર્ટ)</translation>
 <translation id="7131634465328662194">તમે આપમેળે સાઇન આઉટ થઈ જશો.</translation>
 <translation id="7143207342074048698">કનેક્ટ કરી રહ્યું છે</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">રદ કરવા માટે શોધો અથવા Shift દબાવો.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> અને <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">પ્રબળ સિગ્નલ</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> સાથે કનેક્ટ થઈ રહ્યું છે</translation>
 <translation id="7842569679327885685">ચેતવણી: પ્રાયોગિક સુવિધા</translation>
 <translation id="7846634333498149051">કીબોર્ડ</translation>
 <translation id="790040513076446191">ગોપનીયતા સંબંધિત સેટિંગ્સનો કૂશળતાપૂર્વક ઉપયોગ કરે છે.</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: ફરીથી કનેક્ટ કરી રહ્યાં છે...</translation>
 <translation id="8513108775083588393">આપમેળે ફેરવો</translation>
 <translation id="8517041960877371778">તમારું <ph name="DEVICE_TYPE" /> ચાલુ હોય ત્યારે તે ચાર્જ ન થાય તેવું બની શકે.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> સાથે કનેક્ટ થયા</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> બાકી</translation>
 <translation id="8649101189709089199">બોલીને-પસંદ-કરો</translation>
 <translation id="8652175077544655965">સેટિંગ બંધ કરો</translation>
+<translation id="8653151467777939995">નોટિફિકેશન સેટિંગ બતાવો. નોટિફિકેશન ચાલુ છે</translation>
+<translation id="8664753092453405566">નેટવર્ક સૂચિ બતાવો. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">નિમ્ન-પાવર ચાર્જર કનેક્ટ કર્યું છે</translation>
 <translation id="8683506306463609433">કાર્યપ્રદર્શનની નોંધ રાખવાનું સક્રિય છે</translation>
 <translation id="8734991477317290293">તે તમારા કીસ્ટ્રોકની ચોરી કરવાનો પ્રયાસ કરતું હોઈ શકે છે</translation>
+<translation id="8735953464173050365">કીબોર્ડ સેટિંગ બતાવો. <ph name="KEYBOARD_NAME" /> પસંદ કરેલું છે</translation>
+<translation id="875593634123171288">VPN સેટિંગ બતાવો</translation>
 <translation id="8809737090443522491">ઍપ અથવા દસ્તાવેજનું નામ લખો</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">બે કરતાં વધુ પ્રદર્શનો સાથે મીરરીંગ સમર્થિત નથી.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">પાછળ બટન</translation>
+<translation id="8843682306134542540">રોટેશન લૉક ટૉગલ કરો. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">ઍપ સ્ક્રીન-વિભાજનને સહાય કરતી નથી.</translation>
 <translation id="8874184842967597500">કનેક્ટેડ નથી</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 1627acb0..c62f120d 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> को जोड़ा गया</translation>
 <translation id="1056775291175587022">कोई नेटवर्क नहीं</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">सुलभता सेटिंग दिखाएं</translation>
 <translation id="1104621072296271835">साथ मिलकर आपके डिवाइस और बेहतर काम करते हैं</translation>
 <translation id="112308213915226829">अलमारी को स्वत: छिपाएं</translation>
 <translation id="1153356358378277386">युग्‍मित डिवाइस</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">कमज़ोर सिग्नल</translation>
 <translation id="1293264513303784526">USB-C डिवाइस (बायां पोर्ट)</translation>
+<translation id="1302880136325416935">ब्लूटूथ सेटिंग दिखाएं. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">दाएं</translation>
 <translation id="1351937230027495976">मेन्यू छोटा करें</translation>
 <translation id="1383876407941801731">खोज</translation>
 <translation id="1467432559032391204">बाएं</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">लॉन्चर</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{सूचना सेटिंग दिखाएं. किसी एक ऐप्लिकेशन के लिए सूचनाएं बंद हैं}one{सूचना सेटिंग दिखाएं. # ऐप्लिकेशन के लिए सूचनाएं बंद हैं}other{सूचना सेटिंग दिखाएं. # ऐप्लिकेशन के लिए सूचनाएं बंद हैं}}</translation>
 <translation id="1525508553941733066">ख़ारिज करें</translation>
 <translation id="1537254971476575106">फ़ुलस्क्रीन पर सामग्री को बड़ा दिखाने की सुविधा</translation>
 <translation id="15373452373711364">बड़ा माउस कर्सर</translation>
 <translation id="1550523713251050646">अधिक विकल्पों के लिए क्लिक करें</translation>
 <translation id="1567387640189251553">आपके पिछली बार डाले गए पासवर्ड के बाद से एक अलग कीबोर्ड कनेक्ट किया गया है. यह आपके कीस्ट्रोक चुराने की कोशिश कर सकता है.</translation>
+<translation id="1570871743947603115">ब्लूटूथ टॉगल करें. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">इस उपयोगकर्ता को हटाएं</translation>
 <translation id="1621499497873603021">बैटरी के खाली होने में शेष समय, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">माफ़ करें, आपके पासवर्ड की अभी भी पुष्टि नहीं हो पाई है. नोट: अगर आपने हाल ही में अपना पासवर्ड बदला है, तो आपके साइन आउट होते ही आपका नया पासवर्ड लागू हो जाएगा, कृपया यहां पुराने पासवर्ड का इस्तेमाल करें.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">उंगली की पहचान नहीं हो सकी</translation>
 <translation id="1746730358044914197">इनपुट विधियों को आपका व्यवस्थापक कॉन्फ़िगर करता है.</translation>
 <translation id="1747827819627189109">ऑन-स्‍क्रीन कीबोर्ड सक्षम है</translation>
+<translation id="1761222317188459878">नेटवर्क कनेक्शन टॉगल करें. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">ईथरनेट: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (सेवा लोड हो रही है...)</translation>
 <translation id="1841545962859478868">डिवाइस व्यवस्थापक इन चीज़ों की निगरानी कर सकता है:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">यह डिवाइस <ph name="DOMAIN" /> द्वारा प्रबंधित है.</translation>
 <translation id="2050339315714019657">पोर्ट्रेट</translation>
 <translation id="2067602449040652523">कीबोर्ड की रोशनी</translation>
+<translation id="2075212959500165896">कई बार कोशिश की गई. बाद में कोशिश करें.</translation>
 <translation id="2081529251031312395">$1 अभी भी बाद में साइन इन कर सकता है.</translation>
 <translation id="2127372758936585790">कम-शक्ति वाला चार्जर</translation>
 <translation id="2135456203358955318">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">टॉगल विंडो का संक्षिप्त विवरण</translation>
 <translation id="2338501278241028356">आस-पास के डिवाइस खोजने के लिए ब्लूटूथ चालू करें</translation>
 <translation id="2339073806695260576">नोट लेने, स्क्रीनशॉट लेने, लेज़र पॉइंटर या आवर्धक ग्लास का इस्तेमाल करने के लिए शेल्फ़ पर मौजूद स्टाइलस बटन पर टैप करें.</translation>
+<translation id="2341729377289034582">लंबवत पर लॉक किया गया</translation>
 <translation id="2352467521400612932">स्टाइलस की सेटिंग</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> सक्रिय हो रहा है</translation>
 <translation id="2359808026110333948">जारी रखें</translation>
 <translation id="2365393535144473978">मोबाइल डेटा सक्षम करने से ब्लूटूथ सक्षम हो जाएगा.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">परेशान न करें को टॉगल करें</translation>
 <translation id="2412593942846481727">अपडेट मौजूद है</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> से कनेक्ट है</translation>
 <translation id="2429753432712299108">ब्लूटूथ डिवाइस "<ph name="DEVICE_NAME" />" युग्मित करने की अनुमति चाहता है. स्वीकार करने से पहले, कृपया दुबारा पूछें कि यह पासकुंजी उस डिवाइस पर दिखाई जा रही है: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">अधिसूचनाएं</translation>
 <translation id="2484513351006226581">कीबोर्ड लेआउट स्विच करने के लिए <ph name="KEYBOARD_SHORTCUT" /> दबाएं.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">कनेक्शन जोड़ें</translation>
 <translation id="2961963223658824723">कुछ गड़बड़ी हो गई. कुछ सेकंड में फिर से कोशिश करें.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">कास्ट डिवाइस दिखाएं.</translation>
 <translation id="2996462380875591307">सामग्री को बड़ा दिखाने की डॉक की गई सुविधा चालू है. उसे बंद पर टॉगल करने के लिए Ctrl+Search+D फिर से दबाएं.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" />, <ph name="DOMAIN" /> के द्वारा प्रबंधित एक सार्वजनिक सत्र है</translation>
 <translation id="3000461861112256445">मोनो ऑडियो</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">मोबाइल डेटा</translation>
 <translation id="3151786313568798007">अभिविन्‍यास</translation>
 <translation id="3153444934357957346">एक से ज़्यादा साइन-इन की सुविधा में आपके पास ज़्यादा से ज़्यादा <ph name="MULTI_PROFILE_USER_LIMIT" /> खाते हो सकते हैं.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{किसी डिवाइस से कनेक्ट है}one{# डिवाइस से कनेक्ट है}other{# डिवाइस से कनेक्ट है}}</translation>
 <translation id="3236488194889173876">कोई मोबाइल नेटवर्क उपलब्ध नहीं</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">अतिथि</translation>
@@ -160,6 +171,7 @@
 <translation id="3784455785234192852">लॉक करें</translation>
 <translation id="3798670284305777884">स्पीकर (आंतरिक)</translation>
 <translation id="380165613292957338">नमस्ते, मैं आपके लिए क्या कर सकती हूं?</translation>
+<translation id="383629559565718788">कीबोर्ड सेटिंग दिखाएं</translation>
 <translation id="3846575436967432996">कोई नेटवर्क जानकारी उपलब्ध नहीं</translation>
 <translation id="385051799172605136">वापस</translation>
 <translation id="3891340733213178823">साइन आउट करने के लिए दो बार Ctrl+Shift+Q दबाएं.</translation>
@@ -175,8 +187,10 @@
 <translation id="4072264167173457037">मध्यम सिग्नल</translation>
 <translation id="4200057768455216496">आपने 'सामग्री को बड़ा दिखाने वाली डॉक की गई सेवा' का शॉर्टकट दबाया है. क्या आप इसे चालू करना चाहते हैं?</translation>
 <translation id="4217571870635786043">लिखवाना</translation>
+<translation id="4261870227682513959">सूचना सेटिंग दिखाएं. सूचनाएं बंद हैं</translation>
 <translation id="4274921305979314545">अपने Chromebook को अपने फ़ोन से कनेक्ट करें</translation>
 <translation id="4279490309300973883">मिरर करना</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> चालू हो रहा है</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">आवर्धक ग्लास</translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">अपनी सेटिंग सिंक करने के बाद "<ph name="FROM_LOCALE" />" से "<ph name="TO_LOCALE" />".</translation>
 <translation id="574392208103952083">मध्यम</translation>
 <translation id="5744083938413354016">टैप करके खींचना</translation>
+<translation id="5750765938512549687">ब्लूटूथ बंद है</translation>
 <translation id="5777841717266010279">स्‍क्रीन साझाकरण बंद करें?</translation>
 <translation id="57838592816432529">म्यूट करें</translation>
 <translation id="5805697420284793859">विंडो मैनेजर</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">ऑन-स्क्रीन कीबोर्ड दिखाएं</translation>
 <translation id="6164005077879661055">'निगरानी में रखे गए इस उपयोगकर्ता' को हटाने के बाद, निगरानी में रखे गए उपयोगकर्ता से जुड़ीं सभी फ़ाइलें और 'स्थानीय डेटा' हमेशा के लिए मिट जाएंगे. 'निगरानी में रखे गए इस उपयोगकर्ता' की देखी गईं वेबसाइटें और सेटिंग <ph name="MANAGEMENT_URL" /> पर प्रबंधक को अब भी दिखेंगी.</translation>
 <translation id="6165508094623778733">अधिक जानें</translation>
+<translation id="6254629735336163724">क्षैतिज पर लॉक किया गया</translation>
 <translation id="6259254695169772643">चुनने के लिए अपने स्टाइलस का इस्तेमाल करें</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: सक्रिय हो रहा है...</translation>
 <translation id="6284232397434400372">रिज़ॉल्यूशन बदला गया</translation>
 <translation id="6297287540776456956">कोई क्षेत्र चुनने के लिए स्टाइलस का उपयोग करें</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> को <ph name="ROTATION" /> पर घुमाया गया</translation>
 <translation id="632744581670418035">कीबोर्ड ओवरले</translation>
+<translation id="6376931439017688372">ब्लूटूथ चालू है</translation>
 <translation id="639644700271529076">CAPS LOCK बंद है</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">सभी पूरे हो गए</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">यह नेटवर्क आपके व्यवस्थापक द्वारा अक्षम किया गया है.</translation>
 <translation id="7067196344162293536">स्वत: घुमाएं</translation>
 <translation id="7076293881109082629">प्रवेश किया जा रहा है...</translation>
+<translation id="7092922358121866860">नाइट लाइट की सेटिंग दिखाएं</translation>
 <translation id="7098389117866926363">USB-C डिवाइस (पीछे बायां पोर्ट)</translation>
 <translation id="7131634465328662194">आप अपने आप साइन आउट कर जाएंगे.</translation>
 <translation id="7143207342074048698">कनेक्‍ट हो रहा है</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">रद्द करने के लिए Search या Shift दबाएं.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> और <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">मज़बूत सिग्नल</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> से कनेक्ट हो रहा है</translation>
 <translation id="7842569679327885685">चेतावनी: यह फ़ीचर प्रयोग के लिए है</translation>
 <translation id="7846634333498149051">कीबोर्ड</translation>
 <translation id="790040513076446191">निजता-संबंधी सेटिंग में हेरफेर करें</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: पुनः कनेक्ट कर रहा है...</translation>
 <translation id="8513108775083588393">स्क्रीन का अपने आप दिशा बदलना (अॉटो-रोटेट)</translation>
 <translation id="8517041960877371778">हो सकता है आपका <ph name="DEVICE_TYPE" /> चालू होने पर चार्ज नहीं होता हो.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> से कनेक्ट है</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> शेष</translation>
 <translation id="8649101189709089199">चुनें और सुनें</translation>
 <translation id="8652175077544655965">सेटिंग बंद करें</translation>
+<translation id="8653151467777939995">सूचना सेटिंग दिखाएं. सूचनाएं चालू हैं</translation>
+<translation id="8664753092453405566">नेटवर्क सूची दिखाएं. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">कम-शक्ति वाला चार्जर</translation>
 <translation id="8683506306463609433">'परफ़ॉर्मेंस ट्रेसिंग' चालू है</translation>
 <translation id="8734991477317290293">यह आपके कीस्ट्रोक चुराने की कोशिश कर सकता है</translation>
+<translation id="8735953464173050365">कीबोर्ड सेटिंग दिखाएं. <ph name="KEYBOARD_NAME" /> चुना गया है</translation>
+<translation id="875593634123171288">VPN सेटिंग दिखाएं</translation>
 <translation id="8809737090443522491">किसी ऐप्लिकेशन या दस्तावेज़ का नाम लिखें</translation>
 <translation id="8814190375133053267">वाई-फ़ाई </translation>
 <translation id="8825534185036233643">दो से अधिक प्रदर्शनों की मिररिंग समर्थित नहीं है.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">वापस जाएं बटन</translation>
+<translation id="8843682306134542540">रोटेशन लॉक टॉगल करें. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">ऐप दो-स्क्रीन मोड में काम नहीं करता है.</translation>
 <translation id="8874184842967597500">कनेक्ट नहीं है</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb
index 9c7186f..703f4dc 100644
--- a/ash/strings/ash_strings_hr.xtb
+++ b/ash/strings/ash_strings_hr.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Dodan je uređaj <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Nema mreža</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Prikaz postavki pristupačnosti</translation>
 <translation id="1104621072296271835">Vaši uređaji funkcioniraju još bolje zajedno</translation>
 <translation id="112308213915226829">Automatski sakrij policu</translation>
 <translation id="1153356358378277386">Upareni uređaji</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Slab signal</translation>
 <translation id="1293264513303784526">USB-C uređaj (lijevi priključak)</translation>
+<translation id="1302880136325416935">Prikaz postavki Bluetootha. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Udesno</translation>
 <translation id="1351937230027495976">Sažmi izbornik</translation>
 <translation id="1383876407941801731">Traži</translation>
 <translation id="1467432559032391204">Ulijevo</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Pokretač</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Prikaz postavki obavijesti. Obavijesti su isključene za jednu aplikaciju}one{Prikaz postavki obavijesti. Obavijesti su isključene za # aplikaciju}few{Prikaz postavki obavijesti. Obavijesti su isključene za # aplikacije}other{Prikaz postavki obavijesti. Obavijesti su isključene za # aplikacija}}</translation>
 <translation id="1525508553941733066">ODBACI</translation>
 <translation id="1537254971476575106">Povećalo za cijeli zaslon</translation>
 <translation id="15373452373711364">Veliki pokazivač miša</translation>
 <translation id="1550523713251050646">Kliknite za više opcija</translation>
 <translation id="1567387640189251553">Nakon vašeg posljednjeg unosa zaporke povezana je neka druga tipkovnica. Možda pokušava ukrasti podatke o pritisnutim tipkama.</translation>
+<translation id="1570871743947603115">Prebacivanje Bluetootha. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Ukloni tog korisnika</translation>
 <translation id="1621499497873603021">Baterija će se isprazniti za <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Vaša zaporka i dalje nije mogla biti potvrđena. Napomena: ako ste nedavno promijenili zaporku, vaša nova zaporka primjenjivat će se nakon što se odjavite. Ovdje upotrijebite staru zaporku.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Nije prepoznat</translation>
 <translation id="1746730358044914197">Načine unosa konfigurira administrator.</translation>
 <translation id="1747827819627189109">Tipkovnica na zaslonu omogućena je</translation>
+<translation id="1761222317188459878">Prebacivanje mrežne veze. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistent (učitavanje...)</translation>
 <translation id="1841545962859478868">Administrator uređaja može nadzirati sljedeće:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Ovim uređajem upravlja <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portret</translation>
 <translation id="2067602449040652523">Svjetlina tipkovnice</translation>
+<translation id="2075212959500165896">Previše pokušaja. Pokušajte ponovo kasnije.</translation>
 <translation id="2081529251031312395">Korisnik $1 može se prijaviti i kasnije.</translation>
 <translation id="2127372758936585790">Punjač male snage</translation>
 <translation id="2135456203358955318">Usidreno povećalo</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Prebaci na prozor pregleda</translation>
 <translation id="2338501278241028356">Uključite Bluetooth da biste otkrili uređaje u blizini</translation>
 <translation id="2339073806695260576">Dodirnite gumb pisaljke na polici da biste napisali bilješku, izradili snimku zaslona, upotrijebili laserski pokazivač ili povećalo.</translation>
+<translation id="2341729377289034582">Zaključan okomiti prikaz</translation>
 <translation id="2352467521400612932">Postavke pisaljke</translation>
 <translation id="2354174487190027830">Aktiviranje mreže <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Nastavi</translation>
 <translation id="2365393535144473978">Omogućivanjem mobilnih podataka omogućit će Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Prebacivanje načina Ne uznemiravaj</translation>
 <translation id="2412593942846481727">Dostupno je ažuriranje</translation>
+<translation id="2416346634399901812">Povezano s mrežom <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth uređaj "<ph name="DEVICE_NAME" />" traži dopuštenje za uparivanje. Prije prihvaćanja provjerite prikazuje li se na njemu ovaj pristupni ključ: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Obavijesti</translation>
 <translation id="2484513351006226581">Pritisnite <ph name="KEYBOARD_SHORTCUT" /> da biste promijenili raspored tipkovnice.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Dodaj vezu</translation>
 <translation id="2961963223658824723">Nešto nije u redu. Pokušajte ponovno za nekoliko sekundi.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Prikaz uređaja za emitiranje.</translation>
 <translation id="2996462380875591307">Usidreno je povećalo omogućeno. Ponovo pritisnite Ctrl + Search + D da biste ga isključili.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> predstavlja javnu sesiju kojom upravlja domena <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monoaudio</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobilni podaci</translation>
 <translation id="3151786313568798007">Usmjerenje</translation>
 <translation id="3153444934357957346">U višestrukoj prijavi ne možete imati više od <ph name="MULTI_PROFILE_USER_LIMIT" /> računa.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Povezano s jednim uređajem}one{Povezano s # uređajem}few{Povezano s # uređaja}other{Povezano s # uređaja}}</translation>
 <translation id="3236488194889173876">Mobilne mreže nisu dostupne</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gost</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Zaključaj</translation>
 <translation id="3798670284305777884">Zvučnik (ugrađeni)</translation>
 <translation id="380165613292957338">Pozdrav, kako mogu pomoći?</translation>
+<translation id="383629559565718788">Prikaz postavki tipkovnice</translation>
 <translation id="3846575436967432996">Informacije o mreži nisu dostupne</translation>
 <translation id="385051799172605136">Natrag</translation>
 <translation id="3891340733213178823">Pritisnite Ctrl + Shift + Q dvaput da biste se odjavili.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Signal srednje jačine</translation>
 <translation id="4200057768455216496">Pritisnuli ste prečac za usidreno povećalo. Želite li ga uključiti?</translation>
 <translation id="4217571870635786043">Diktat</translation>
+<translation id="4261870227682513959">Prikaz postavki obavijesti. Obavijesti su isključene</translation>
 <translation id="4274921305979314545">Povežite svoj Chromebook sa svojim telefonom</translation>
 <translation id="4279490309300973883">Zrcaljenje</translation>
+<translation id="4292681942966152062">Aktiviranje mreže <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Povećalo</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">"<ph name="FROM_LOCALE" />" je promijenjen u "<ph name="TO_LOCALE" />" nakon sinkronizacije postavki.</translation>
 <translation id="574392208103952083">Srednje</translation>
 <translation id="5744083938413354016">Povlačenje dodirom</translation>
+<translation id="5750765938512549687">Bluetooth je isključen</translation>
 <translation id="5777841717266010279">Prekinuti dijeljenje zaslona?</translation>
 <translation id="57838592816432529">Isključi zvuk</translation>
 <translation id="5805697420284793859">Upravitelj prozora</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Prikaži tipkovnicu na zaslonu</translation>
 <translation id="6164005077879661055">Sve datoteke i lokalni podaci povezani sa zaštićenim korisnikom trajno će se izbrisati kada se taj korisnik ukloni. Web-lokacije koje je taj korisnik posjetio i njegove postavke mogu i dalje biti vidljive upravitelju na adresi <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saznajte više</translation>
+<translation id="6254629735336163724">Zaključan vodoravni prikaz</translation>
 <translation id="6259254695169772643">Odaberite pomoću pisaljke</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: aktiviranje...</translation>
 <translation id="6284232397434400372">Razlučivost je promijenjena</translation>
 <translation id="6297287540776456956">Odaberite regiju pisaljkom</translation>
 <translation id="6310121235600822547">Zaslon <ph name="DISPLAY_NAME" /> rotiran je za <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Preklapanje tipkovnice</translation>
+<translation id="6376931439017688372">Bluetooth je uključen</translation>
 <translation id="639644700271529076">Tipka CAPS LOCK isključena</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Dovršeno</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Tu mrežu onemogućio je vaš administrator.</translation>
 <translation id="7067196344162293536">Automatski izmjenjuj</translation>
 <translation id="7076293881109082629">Prijava</translation>
+<translation id="7092922358121866860">Prikaz postavki Noćnog svjetla</translation>
 <translation id="7098389117866926363">USB-C uređaj (lijevi priključak sa stražnje strane)</translation>
 <translation id="7131634465328662194">Odjavit ćete se automatski.</translation>
 <translation id="7143207342074048698">Povezivanje</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Pritisnite Pretraživanje ili Shift da biste otkazali.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> i <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Jak signal</translation>
+<translation id="7842211907556571265">Povezivanje s mrežom <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Upozorenje: eksperimentalna značajka</translation>
 <translation id="7846634333498149051">Tipkovnica</translation>
 <translation id="790040513076446191">rukovati postavkama koje se odnose na privatnost</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: ponovno povezivanje...</translation>
 <translation id="8513108775083588393">Automatsko zakretanje</translation>
 <translation id="8517041960877371778">Uređaj <ph name="DEVICE_TYPE" /> možda se neće puniti dok je uključen.</translation>
+<translation id="8627191004499078455">Povezano s uređajem <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Preostalo <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Odabir za govor</translation>
 <translation id="8652175077544655965">Zatvaranje postavki</translation>
+<translation id="8653151467777939995">Prikaz postavki obavijesti. Obavijesti su uključene</translation>
+<translation id="8664753092453405566">Prikaz popisa mreža. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Priključen je punjač male snage</translation>
 <translation id="8683506306463609433">Aktivno je praćenje izvedbe</translation>
 <translation id="8734991477317290293">Možda pokušava ukrasti podatke o pritisnutim tipkama</translation>
+<translation id="8735953464173050365">Prikaz postavki tipkovnice. Odabrana je tipkovnica <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Prikaz postavki VPN-a</translation>
 <translation id="8809737090443522491">Unesite naziv aplikacije ili dokumenta</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Zrcaljenje s više od dva zaslona nije podržano.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Gumb Natrag</translation>
+<translation id="8843682306134542540">Prebacivanje zaključavanja rotacije. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Pretraživanje + Esc</translation>
 <translation id="8870509716567206129">Aplikacija ne podržava podijeljeni zaslon.</translation>
 <translation id="8874184842967597500">Niste povezani</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb
index 59fbc4e..05182fb 100644
--- a/ash/strings/ash_strings_hu.xtb
+++ b/ash/strings/ash_strings_hu.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> hozzáadva</translation>
 <translation id="1056775291175587022">Nincs hálózat</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">A kisegítő lehetőségekhez tartozó beállítások megjelenítése</translation>
 <translation id="1104621072296271835">Eszközei együtt még jobban működnek</translation>
 <translation id="112308213915226829">Polc automatikus elrejtése</translation>
 <translation id="1153356358378277386">Párosított eszközök</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Gyenge jel</translation>
 <translation id="1293264513303784526">C típusú USB-vel kompatibilis eszköz (bal oldali port)</translation>
+<translation id="1302880136325416935">Bluetooth-beállítások megjelenítése. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Jobbra</translation>
 <translation id="1351937230027495976">Menü összecsukása</translation>
 <translation id="1383876407941801731">Keresés</translation>
 <translation id="1467432559032391204">Balra</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Indító</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Értesítési beállítások megjelenítése. Az értesítések egyetlen alkalmazásnál vannak kikapcsolva}other{Értesítési beállítások megjelenítése. Az értesítések # alkalmazásnál ki vannak kapcsolva}}</translation>
 <translation id="1525508553941733066">ELVETÉS</translation>
 <translation id="1537254971476575106">Teljes képernyős nagyító</translation>
 <translation id="15373452373711364">Nagy egérmutató</translation>
 <translation id="1550523713251050646">Kattintson további lehetőségekért</translation>
 <translation id="1567387640189251553">A jelszó utolsó megadása óta új billentyűzetet csatlakoztattak. Előfordulhat, hogy így kísérlik meg a billentyűleütések rögzítését.</translation>
+<translation id="1570871743947603115">Bluetooth ki- és bekapcsolása. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Felhasználó eltávolítása</translation>
 <translation id="1621499497873603021">Akkumulátor lemerüléséig hátralévő idő: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Sajnos a jelszó ellenőrzése még mindig nem sikerült. Megjegyzés: ha a közelmúltban módosította jelszavát, az új jelszó beállítása a kijelentkezés után megy végbe, ezért itt a régi jelszót használja.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Nem sikerült felismerni</translation>
 <translation id="1746730358044914197">A rendszergazda állította be a beviteli módszereket.</translation>
 <translation id="1747827819627189109">Képernyő-billentyűzet bekapcsolva</translation>
+<translation id="1761222317188459878">Hálózati kapcsolat ki- és bekapcsolása. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Segéd (betöltés…)</translation>
 <translation id="1841545962859478868">Az eszköz rendszergazdája figyelheti a következőket:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Ezt az eszközt a(z) <ph name="DOMAIN" /> domain kezeli.</translation>
 <translation id="2050339315714019657">Álló</translation>
 <translation id="2067602449040652523">Billentyűzet világossága</translation>
+<translation id="2075212959500165896">Túl sok próbálkozás. Próbálja újra később.</translation>
 <translation id="2081529251031312395">$1 később be tud jelentkezni.</translation>
 <translation id="2127372758936585790">Kis teljesítményű töltő</translation>
 <translation id="2135456203358955318">Dokkolt nagyító</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Ablakáttekintési mód váltása</translation>
 <translation id="2338501278241028356">Kapcsolja be a Bluetooth-t a közeli eszközök felfedezéséhez</translation>
 <translation id="2339073806695260576">Koppintson a polcon az érintőceruza gombra, ha jegyzetet vagy képernyőképet szeretne készíteni, illetve ha a lézermutatót vagy a nagyítót kívánja használni.</translation>
+<translation id="2341729377289034582">Függőleges helyzetben zárolva</translation>
 <translation id="2352467521400612932">Az érintőceruza beállításai</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> aktiválása</translation>
 <translation id="2359808026110333948">Folytatás</translation>
 <translation id="2365393535144473978">A mobiladat-kapcsolat engedélyezésével a Bluetooth is bekapcsol.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">A Ne zavarjanak funkció átkapcsolása</translation>
 <translation id="2412593942846481727">Rendelkezésre áll frissítés</translation>
+<translation id="2416346634399901812">Kapcsolódva a(z) <ph name="NETWORK_NAME" /> hálózathoz</translation>
 <translation id="2429753432712299108">A(z) „<ph name="DEVICE_NAME" />” Bluetooth-eszköz engedélyt kér a párosításra. Mielőtt elfogadná, ellenőrizze, hogy ez a biztonsági kód látható-e azon az eszközön is: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Értesítések</translation>
 <translation id="2484513351006226581">A billentyűzetkiosztás átváltásához nyomja meg a(z) <ph name="KEYBOARD_SHORTCUT" /> billentyűparancsot.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Kapcsolat hozzáadása</translation>
 <translation id="2961963223658824723">Valami nem sikerült. Próbálja újra néhány másodperc múlva.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Cast-eszközök megjelenítése.</translation>
 <translation id="2996462380875591307">Dokkolt nagyító bekapcsolva. A kikapcsoláshoz nyomja le ismét a Ctrl+Keresés+D billentyűparancsot.</translation>
 <translation id="2999742336789313416">A(z) <ph name="DISPLAY_NAME" /> egy <ph name="DOMAIN" /> által kezelt nyilvános munkamenet</translation>
 <translation id="3000461861112256445">Monó hang</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobiladatok</translation>
 <translation id="3151786313568798007">Tájolás</translation>
 <translation id="3153444934357957346">Legfeljebb <ph name="MULTI_PROFILE_USER_LIMIT" /> fiókot használhat a többfiókos bejelentkezés során.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Egy eszközhöz csatlakoztatva}other{# eszközhöz csatlakoztatva}}</translation>
 <translation id="3236488194889173876">Nem áll rendelkezésre mobilhálózat</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Vendég</translation>
@@ -160,6 +171,7 @@
 <translation id="3784455785234192852">Zárolás</translation>
 <translation id="3798670284305777884">Hangszóró (belső)</translation>
 <translation id="380165613292957338">Üdvözlöm. Miben segíthetek?</translation>
+<translation id="383629559565718788">Billentyűzetbeállítások megjelenítése</translation>
 <translation id="3846575436967432996">Nem áll rendelkezésre hálózati információ</translation>
 <translation id="385051799172605136">Vissza</translation>
 <translation id="3891340733213178823">Nyomja meg a Ctrl+Shift+Q billentyűkombinációt kétszer a kijelentkezéshez.</translation>
@@ -175,8 +187,10 @@
 <translation id="4072264167173457037">Közepes jel</translation>
 <translation id="4200057768455216496">Lenyomta a dokkolt nagyító billentyűparancsát. Bekapcsolja a funkciót?</translation>
 <translation id="4217571870635786043">Diktálás</translation>
+<translation id="4261870227682513959">Az értesítési beállítások megjelenítése. Az értesítések ki vannak kapcsolva</translation>
 <translation id="4274921305979314545">Csatlakozás a Chromebookhoz telefonjával</translation>
 <translation id="4279490309300973883">Tükrözés</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> aktiválása</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Nagyító</translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Módosítás <ph name="FROM_LOCALE" /> nyelvről <ph name="TO_LOCALE" /> nyelvre a beállítások szinkronizálása után.</translation>
 <translation id="574392208103952083">Közepes</translation>
 <translation id="5744083938413354016">Érintéssel húzás</translation>
+<translation id="5750765938512549687">Kikapcsolt Bluetooth</translation>
 <translation id="5777841717266010279">Leállítja a képernyőmegosztást?</translation>
 <translation id="57838592816432529">Némítás</translation>
 <translation id="5805697420284793859">Ablakkezelő</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">A képernyő-billentyűzet megjelenítése</translation>
 <translation id="6164005077879661055">Amikor ezt a felügyelt felhasználót eltávolítják, minden hozzá tartozó fájl és helyi adat véglegesen törlődik. A felügyelt felhasználó felkeresett webhelyeit és beállításait a kezelő továbbra is láthatja a következő címen: <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">További információ</translation>
+<translation id="6254629735336163724">Vízszintes helyzetben zárolva</translation>
 <translation id="6259254695169772643">A kiválasztáshoz használja az érintőceruzát</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: aktiválás...</translation>
 <translation id="6284232397434400372">A felbontás módosult</translation>
 <translation id="6297287540776456956">Terület kijelöléséhez használja az érintőceruzát</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> elfordult erre: <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Billentyűzetkiosztás</translation>
+<translation id="6376931439017688372">A Bluetooth be van kapcsolva</translation>
 <translation id="639644700271529076">A CAPS LOCK ki van kapcsolva</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Elkészült</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Ezt a hálózatot letiltotta a rendszergazda.</translation>
 <translation id="7067196344162293536">Automatikus forgatás</translation>
 <translation id="7076293881109082629">Bejelentkezés</translation>
+<translation id="7092922358121866860">Az Éjszakai fényhez tartozó beállítások megjelenítése</translation>
 <translation id="7098389117866926363">C típusú USB-vel kompatibilis eszköz (bal hátsó port)</translation>
 <translation id="7131634465328662194">A rendszer automatikusan kijelentkezteti.</translation>
 <translation id="7143207342074048698">Csatlakozás</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">A kikapcsoláshoz nyomja meg a Keresés vagy a Shift billentyűt.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> és <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Erős jel</translation>
+<translation id="7842211907556571265">Csatlakozás a(z) <ph name="NETWORK_NAME" /> hálózathoz</translation>
 <translation id="7842569679327885685">Figyelem! Kísérleti funkció</translation>
 <translation id="7846634333498149051">Billentyűzet</translation>
 <translation id="790040513076446191">Adatvédelemmel kapcsolatos beállítások módosítása</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Újracsatlakozás…</translation>
 <translation id="8513108775083588393">Automatikus forgatás</translation>
 <translation id="8517041960877371778">Előfordulhat, hogy a(z) <ph name="DEVICE_TYPE" /> nem töltődik, amíg be van kapcsolva.</translation>
+<translation id="8627191004499078455">Csatlakozva a(z) <ph name="DEVICE_NAME" /> eszközhöz</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> maradt</translation>
 <translation id="8649101189709089199">Felolvasás</translation>
 <translation id="8652175077544655965">Beállítások bezárása</translation>
+<translation id="8653151467777939995">Az értesítési beállítások megjelenítése. Az értesítések be vannak kapcsolva</translation>
+<translation id="8664753092453405566">A hálózatok listájának megjelenítése. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Kis teljesítményű töltő csatlakoztatva</translation>
 <translation id="8683506306463609433">A teljesítménykövetés aktív</translation>
 <translation id="8734991477317290293">Előfordulhat, hogy így kísérlik meg a billentyűleütések rögzítését</translation>
+<translation id="8735953464173050365">A billentyűzet beállításainak megjelenítése. <ph name="KEYBOARD_NAME" /> van kiválasztva</translation>
+<translation id="875593634123171288">VPN-beállítások megjelenítése</translation>
 <translation id="8809737090443522491">Írja be a kívánt alkalmazás vagy dokumentum nevét.</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">A böngésző nem támogatja a tükrözést kettőnél több megjelenítő esetén.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Vissza gomb</translation>
+<translation id="8843682306134542540">Váltás a forgatás zárolásának állapotai közt. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Keresés+Esc</translation>
 <translation id="8870509716567206129">Az alkalmazás nem támogatja az osztott képernyős nézetet.</translation>
 <translation id="8874184842967597500">Nincs csatlakozva</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb
index 2e88e267..ea0e8999 100644
--- a/ash/strings/ash_strings_id.xtb
+++ b/ash/strings/ash_strings_id.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ditambahkan</translation>
 <translation id="1056775291175587022">Tidak ada jaringan</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Tampilkan setelan aksesibilitas</translation>
 <translation id="1104621072296271835">Perangkat berfungsi lebih baik jika digunakan bersama</translation>
 <translation id="112308213915226829">Sembunyikan otomatis rak</translation>
 <translation id="1153356358378277386">Perangkat dihubungkan</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Sinyal lemah</translation>
 <translation id="1293264513303784526">Perangkat USB-C (port sebelah kiri)</translation>
+<translation id="1302880136325416935">Tampilkan setelan Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Kanan</translation>
 <translation id="1351937230027495976">Ciutkan menu</translation>
 <translation id="1383876407941801731">Telusuri</translation>
 <translation id="1467432559032391204">Kiri</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Peluncur</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Tampilkan setelan notifikasi. Notifikasi nonaktif untuk satu aplikasi}other{Tampilkan setelan notifikasi. Notifikasi nonaktif untuk # aplikasi}}</translation>
 <translation id="1525508553941733066">TUTUP</translation>
 <translation id="1537254971476575106">Kaca pembesar layar penuh</translation>
 <translation id="15373452373711364">Kursor mouse besar</translation>
 <translation id="1550523713251050646">Klik untuk opsi lainnya</translation>
 <translation id="1567387640189251553">Keyboard yang berbeda telah terhubung sejak Anda terakhir memasukkan sandi. Keyboard tersebut mungkin mencoba mencuri ketukan tombol Anda.</translation>
+<translation id="1570871743947603115">Alihkan Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Hapus pengguna ini</translation>
 <translation id="1621499497873603021">Waktu yang tersisa hingga baterai kosong, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Maaf, sandi Anda masih belum dapat diverifikasi. Catatan: jika Anda baru saja mengubah sandi, sandi yang baru akan diterapkan saat Anda logout, gunakan sandi lama di sini.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Tidak dikenali</translation>
 <translation id="1746730358044914197">Metode masukan dikonfigurasi oleh administrator.</translation>
 <translation id="1747827819627189109">Keyboard di layar diaktifkan</translation>
+<translation id="1761222317188459878">Alihkan sambungan jaringan. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asisten (sedang dimuat...)</translation>
 <translation id="1841545962859478868">Admin perangkat dapat memantau hal-hal berikut:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Perangkat ini dikelola oleh <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Potret</translation>
 <translation id="2067602449040652523">Kecerahan keyboard</translation>
+<translation id="2075212959500165896">Terlalu banyak upaya yang gagal. Coba lagi nanti.</translation>
 <translation id="2081529251031312395">$1 tetap dapat login nanti.</translation>
 <translation id="2127372758936585790">Pengisi daya rendah</translation>
 <translation id="2135456203358955318">Kaca pembesar yang dipasang ke dok</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Beralih ikhtisar jendela</translation>
 <translation id="2338501278241028356">Aktifkan Bluetooth untuk menemukan perangkat di sekitar</translation>
 <translation id="2339073806695260576">Tap tombol stilus di rak untuk mencatat, mengambil screenshot, serta menggunakan penunjuk laser, atau kaca pembesar.</translation>
+<translation id="2341729377289034582">Terkunci ke vertikal</translation>
 <translation id="2352467521400612932">Setelan stilus</translation>
 <translation id="2354174487190027830">Mengaktifkan <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Lanjut</translation>
 <translation id="2365393535144473978">Mengaktifkan data seluler akan mengaktifkan Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Alihkan mode Jangan ganggu</translation>
 <translation id="2412593942846481727">Update tersedia</translation>
+<translation id="2416346634399901812">Terhubung ke <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Perangkat Bluetooth "<ph name="DEVICE_NAME" />" meminta izin untuk bersanding. Sebelum menerima, konfirmasikan bahwa kunci sandi ini ditampilkan pada perangkat tersebut: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Notifikasi</translation>
 <translation id="2484513351006226581">Tekan <ph name="KEYBOARD_SHORTCUT" /> untuk mengganti tata letak keyboard.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Tambahkan koneksi</translation>
 <translation id="2961963223658824723">Terjadi kesalahan. Coba lagi dalam beberapa detik.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Tampilkan perangkat transmisi.</translation>
 <translation id="2996462380875591307">Kaca Pembesar yang Dipasang ke Dok diaktifkan. Tekan Ctrl+Search+D lagi untuk menonaktifkannya.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> adalah sesi publik yang dikelola oleh <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Audio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Data seluler</translation>
 <translation id="3151786313568798007">Orientasi</translation>
 <translation id="3153444934357957346">Anda hanya dapat memiliki maksimum <ph name="MULTI_PROFILE_USER_LIMIT" /> akun dalam fitur login multipel.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Tersambung ke 1 perangkat}other{Tersambung ke # perangkat}}</translation>
 <translation id="3236488194889173876">Jaringan seluler tidak tersedia</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Tamu</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Kunci</translation>
 <translation id="3798670284305777884">Speaker (internal)</translation>
 <translation id="380165613292957338">Hai, ada yang bisa dibantu?</translation>
+<translation id="383629559565718788">Tampilkan setelan keyboard</translation>
 <translation id="3846575436967432996">Tidak tersedia informasi jaringan</translation>
 <translation id="385051799172605136">Mundur</translation>
 <translation id="3891340733213178823">Tekan Ctrl+Shift+Q dua kali untuk keluar.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Sinyal sedang</translation>
 <translation id="4200057768455216496">Anda menekan pintasan untuk kaca pembesar yang terpasang di dok. Ingin mengaktifkannya?</translation>
 <translation id="4217571870635786043">Dikte</translation>
+<translation id="4261870227682513959">Tampilkan setelan notifikasi. Notifikasi nonaktif.</translation>
 <translation id="4274921305979314545">Hubungkan Chromebook dengan ponsel</translation>
 <translation id="4279490309300973883">Mencerminkan</translation>
+<translation id="4292681942966152062">Mengaktifkan <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Kaca pembesar</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Dari "<ph name="FROM_LOCALE" />" ke "<ph name="TO_LOCALE" />" setelah menyinkronkan setelan Anda.</translation>
 <translation id="574392208103952083">Sedang</translation>
 <translation id="5744083938413354016">Tap tarik</translation>
+<translation id="5750765938512549687">Bluetooth nonaktif</translation>
 <translation id="5777841717266010279">Berhenti membagikan layar?</translation>
 <translation id="57838592816432529">Bisukan</translation>
 <translation id="5805697420284793859">Window manager</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Tampilkan keyboard di layar</translation>
 <translation id="6164005077879661055">Semua file dan data lokal yang terkait dengan pengguna yang dilindungi akan dihapus secara permanen setelah pengguna yang dilindungi ini dihapus. Situs web yang dikunjungi dan setelan untuk pengguna yang dilindungi ini mungkin tetap dapat dilihat oleh pengelola di <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Pelajari lebih lanjut</translation>
+<translation id="6254629735336163724">Terkunci ke horizontal</translation>
 <translation id="6259254695169772643">Gunakan stilus untuk memilih</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Mengaktifkan...</translation>
 <translation id="6284232397434400372">Resolusi diubah</translation>
 <translation id="6297287540776456956">Gunakan stilus untuk memilih wilayah</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> diputar ke <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Hamparan keyboard</translation>
+<translation id="6376931439017688372">Bluetooth aktif</translation>
 <translation id="639644700271529076">CAPS LOCK tidak aktif</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Selesai</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Jaringan ini dinonaktifkan oleh administrator Anda.</translation>
 <translation id="7067196344162293536">Putar otomatis</translation>
 <translation id="7076293881109082629">Sedang masuk</translation>
+<translation id="7092922358121866860">Tampilkan setelan Cahaya Malam</translation>
 <translation id="7098389117866926363">Perangkat USB-C (port belakang sebelah kiri)</translation>
 <translation id="7131634465328662194">Anda akan logout otomatis.</translation>
 <translation id="7143207342074048698">Menyambungkan</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Tekan Search atau Shift untuk membatalkan.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> dan <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Sinyal kuat</translation>
+<translation id="7842211907556571265">Menyambungkan ke <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Peringatan: Fitur eksperimental</translation>
 <translation id="7846634333498149051">Keyboard</translation>
 <translation id="790040513076446191">Memanipulasi setelan yang terkait privasi</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Menyambungkan lagi...</translation>
 <translation id="8513108775083588393">Putar otomatis</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> Anda mungkin tidak diisi daya saat dinyalakan.</translation>
+<translation id="8627191004499078455">Tersambung ke <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Sisa <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Klik untuk Diucapkan</translation>
 <translation id="8652175077544655965">Tutup setelan</translation>
+<translation id="8653151467777939995">Tampilkan setelan notifikasi. Notifikasi aktif.</translation>
+<translation id="8664753092453405566">Tampilkan daftar jaringan. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Pengisi daya rendah terpasang</translation>
 <translation id="8683506306463609433">Pelacakan performa aktif</translation>
 <translation id="8734991477317290293">Keyboard mungkin mencoba mencuri ketukan tombol Anda</translation>
+<translation id="8735953464173050365">Tampilkan setelan keyboard. <ph name="KEYBOARD_NAME" /> dipilih</translation>
+<translation id="875593634123171288">Tampilkan setelan VPN</translation>
 <translation id="8809737090443522491">Ketik nama aplikasi atau dokumen</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Pencerminan dengan lebih dari dua layar tidak didukung.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Tombol kembali</translation>
+<translation id="8843682306134542540">Alihkan kunci rotasi. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">Aplikasi tidak mendukung layar terpisah.</translation>
 <translation id="8874184842967597500">Tidak tersambung</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb
index adf886c..918288b 100644
--- a/ash/strings/ash_strings_it.xtb
+++ b/ash/strings/ash_strings_it.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> aggiunto</translation>
 <translation id="1056775291175587022">Nessuna rete</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Mostra impostazioni di accessibilità</translation>
 <translation id="1104621072296271835">I tuoi dispositivi funzionano ancora meglio insieme</translation>
 <translation id="112308213915226829">Nascondi automaticamente shelf</translation>
 <translation id="1153356358378277386">Dispositivi accoppiati</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Segnale debole</translation>
 <translation id="1293264513303784526">Dispositivo USB-C (porta a sinistra)</translation>
+<translation id="1302880136325416935">Mostra impostazioni Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Destra</translation>
 <translation id="1351937230027495976">Comprimi il menu</translation>
 <translation id="1383876407941801731">Cerca</translation>
 <translation id="1467432559032391204">Sinistra</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Avvio applicazioni</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostra impostazioni di notifica. Le notifiche sono disattivate per un'app}other{Mostra impostazioni di notifica. Le notifiche sono disattivate per # app}}</translation>
 <translation id="1525508553941733066">IGNORA</translation>
 <translation id="1537254971476575106">Lente d'ingrandimento a schermo intero</translation>
 <translation id="15373452373711364">Puntatore del mouse grande</translation>
 <translation id="1550523713251050646">Fai clic per visualizzare altre opzioni</translation>
 <translation id="1567387640189251553">È stata collegata una tastiera diversa dall'ultimo inserimento della password. Potrebbe essere un tentativo di rubare i tasti premuti.</translation>
+<translation id="1570871743947603115">Attiva/disattiva Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Rimuovi questo utente</translation>
 <translation id="1621499497873603021">Tempo rimanente all'esaurimento della batteria: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Non è stato ancora possibile verificare la password. Nota: se l'hai modificata di recente, la nuova password verrà applicata quando esci dall'account. Utilizza qui la tua vecchia password.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Non riconosciuta</translation>
 <translation id="1746730358044914197">I metodi di immissione vengono configurati dall'amministratore.</translation>
 <translation id="1747827819627189109">Tastiera sullo schermo attiva</translation>
+<translation id="1761222317188459878">Attiva/disattiva connessione di rete. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistente (caricamento…)</translation>
 <translation id="1841545962859478868">L'amministratore del dispositivo potrebbe monitorare i seguenti elementi:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Questo dispositivo è gestito da <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Verticale</translation>
 <translation id="2067602449040652523">Luminosità della tastiera</translation>
+<translation id="2075212959500165896">Troppi tentativi. Riprova più tardi.</translation>
 <translation id="2081529251031312395">$1 può accedere in seguito.</translation>
 <translation id="2127372758936585790">Caricabatterie a basso consumo</translation>
 <translation id="2135456203358955318">Lente d'ingrandimento ancorata</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Attiva/disattiva panoramica finestra</translation>
 <translation id="2338501278241028356">Attiva il Bluetooth per trovare dispositivi nelle vicinanze</translation>
 <translation id="2339073806695260576">Tocca il pulsante dello stilo nella shelf per creare note, acquisire screenshot, usare il puntatore laser o la lente d'ingrandimento.</translation>
+<translation id="2341729377289034582">Bloccata in verticale</translation>
 <translation id="2352467521400612932">Impostazioni di stilo</translation>
 <translation id="2354174487190027830">Attivazione di <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Continua</translation>
 <translation id="2365393535144473978">Se attivi i dati mobili verrà attivato anche il Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Attiva/disattiva Non disturbare</translation>
 <translation id="2412593942846481727">Aggiornamento disponibile</translation>
+<translation id="2416346634399901812">Connesso a <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Il dispositivo Bluetooth "<ph name="DEVICE_NAME" />" chiede l'autorizzazione per essere accoppiato. Prima di accettare, conferma che questa passkey viene visualizzata sul dispositivo: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Notifiche</translation>
 <translation id="2484513351006226581">Premi <ph name="KEYBOARD_SHORTCUT" /> per cambiare il layout della tastiera.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Aggiungi connessione</translation>
 <translation id="2961963223658824723">Si è verificato un problema. Riprova tra qualche secondo.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Mostra dispositivi di trasmissione.</translation>
 <translation id="2996462380875591307">Lente d'ingrandimento ancorata attivata. Premi di nuovo CTRL + tasto per la ricerca + D per disattivarla.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> è una sessione pubblica gestita da <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Audio in formato mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Dati mobili</translation>
 <translation id="3151786313568798007">Orientamento</translation>
 <translation id="3153444934357957346">Puoi avere massimo <ph name="MULTI_PROFILE_USER_LIMIT" /> account per l'accesso simultaneo.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Connesso a un dispositivo}other{Connesso a # dispositivi}}</translation>
 <translation id="3236488194889173876">Nessuna rete mobile disponibile</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Ospite</translation>
@@ -160,6 +171,7 @@
 <translation id="3784455785234192852">Blocca</translation>
 <translation id="3798670284305777884">Altoparlante (interno)</translation>
 <translation id="380165613292957338">Ciao, come posso aiutarti?</translation>
+<translation id="383629559565718788">Mostra impostazioni tastiera</translation>
 <translation id="3846575436967432996">Nessuna informazione di rete disponibile</translation>
 <translation id="385051799172605136">Indietro</translation>
 <translation id="3891340733213178823">Premi due volte Ctrl+Maiusc+Q per uscire.</translation>
@@ -175,8 +187,10 @@
 <translation id="4072264167173457037">Segnale medio</translation>
 <translation id="4200057768455216496">Hai premuto la scorciatoia per la lente d'ingrandimento ancorata. Vuoi attivarla?</translation>
 <translation id="4217571870635786043">Dettatura</translation>
+<translation id="4261870227682513959">Mostra impostazioni di notifica. Le notifiche sono disattivate</translation>
 <translation id="4274921305979314545">Connetti il Chromebook al telefono</translation>
 <translation id="4279490309300973883">Mirroring</translation>
+<translation id="4292681942966152062">Attivazione della rete <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lente d'ingrandimento</translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Da "<ph name="FROM_LOCALE" />" a "<ph name="TO_LOCALE" />" dopo la sincronizzazione delle impostazioni.</translation>
 <translation id="574392208103952083">Medie</translation>
 <translation id="5744083938413354016">Trascinamento al tocco</translation>
+<translation id="5750765938512549687">Bluetooth non attivo</translation>
 <translation id="5777841717266010279">Interrompere la condivisione dello schermo?</translation>
 <translation id="57838592816432529">Disattiva audio</translation>
 <translation id="5805697420284793859">Gestione finestre</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Mostra tastiera sullo schermo</translation>
 <translation id="6164005077879661055">Tutti i file e i dati locali associati all'utente controllato verranno eliminati definitivamente in seguito alla rimozione dell'utente. Le impostazioni e i siti web visitati relativi all'utente controllato potrebbero essere ancora visibili al gestore all'indirizzo <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Ulteriori informazioni</translation>
+<translation id="6254629735336163724">Bloccata in orizzontale</translation>
 <translation id="6259254695169772643">Usa lo stilo per selezionare</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: attivazione in corso...</translation>
 <translation id="6284232397434400372">Risoluzione modificata</translation>
 <translation id="6297287540776456956">Utilizza lo stilo per selezionare un'area</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> è stato ruotato a <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Overlay tastiera</translation>
+<translation id="6376931439017688372">Bluetooth attivo</translation>
 <translation id="639644700271529076">Funzione BLOC MAIUSC non attiva</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Operazioni completate</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Questa rete è stata disattivata dall'amministratore.</translation>
 <translation id="7067196344162293536">Ruota in modo automatico</translation>
 <translation id="7076293881109082629">Accesso</translation>
+<translation id="7092922358121866860">Mostra le impostazioni Luminosità notturna</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (porta posteriore sinistra)</translation>
 <translation id="7131634465328662194">Verrai disconnesso automaticamente.</translation>
 <translation id="7143207342074048698">Connessione</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Premi il tasto per la ricerca o MAIUSC per annullare.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> e <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Segnale forte</translation>
+<translation id="7842211907556571265">Connessione alla rete <ph name="NETWORK_NAME" />…</translation>
 <translation id="7842569679327885685">Avviso: funzione sperimentale</translation>
 <translation id="7846634333498149051">Tastiera</translation>
 <translation id="790040513076446191">Modifica delle impostazioni relative alla privacy</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: riconnessione in corso...</translation>
 <translation id="8513108775083588393">Rotazione automatica</translation>
 <translation id="8517041960877371778">Il tuo dispositivo <ph name="DEVICE_TYPE" /> potrebbe non caricarsi mentre è acceso.</translation>
+<translation id="8627191004499078455">Collegato al dispositivo <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> rimanente</translation>
 <translation id="8649101189709089199">Seleziona per ascoltare</translation>
 <translation id="8652175077544655965">Chiudi impostazioni</translation>
+<translation id="8653151467777939995">Mostra impostazioni di notifica. Le notifiche sono attive</translation>
+<translation id="8664753092453405566">Mostra elenco di reti. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Caricabatterie a basso consumo collegato</translation>
 <translation id="8683506306463609433">Traccia delle prestazioni attiva</translation>
 <translation id="8734991477317290293">Potrebbe essere un tentativo di rubare i tasti premuti</translation>
+<translation id="8735953464173050365">Mostra impostazioni tastiera. La selezione attiva è <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Mostra impostazioni VPN</translation>
 <translation id="8809737090443522491">Digita il nome di un'app o un documento</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Il mirroring con più di due display non è supportato.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Pulsante Indietro</translation>
+<translation id="8843682306134542540">Attiva/disattiva blocco rotazione. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Tasto di ricerca+ESC</translation>
 <translation id="8870509716567206129">L'app non supporta la modalità Schermo diviso.</translation>
 <translation id="8874184842967597500">Non connessa</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb
index 7a4efea..dff8a4d 100644
--- a/ash/strings/ash_strings_iw.xtb
+++ b/ash/strings/ash_strings_iw.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> נוסף</translation>
 <translation id="1056775291175587022">אין רשתות</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">צפייה בהגדרות הנגישות</translation>
 <translation id="1104621072296271835">ביחד, המכשירים שלך יוכלו לעבוד עוד יותר טוב</translation>
 <translation id="112308213915226829">הסתרה אוטומטית של המדף</translation>
 <translation id="1153356358378277386">מכשירים מותאמים</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />‏ (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">אות חלש</translation>
 <translation id="1293264513303784526">‏מכשיר עם יציאת USB-C (יציאה שמאלית)</translation>
+<translation id="1302880136325416935">‏צפייה בהגדרות Bluetooth‏. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">ימינה</translation>
 <translation id="1351937230027495976">כיווץ התפריט</translation>
 <translation id="1383876407941801731">חפש</translation>
 <translation id="1467432559032391204">שמאלה</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">מפעיל</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{צפייה בהגדרות של הודעות. ההודעות מושבתות באפליקציה אחת}two{צפייה בהגדרות של הודעות. ההודעות מושבתות ב-# אפליקציות}many{צפייה בהגדרות של הודעות. ההודעות מושבתות ב-# אפליקציות}other{צפייה בהגדרות של הודעות. ההודעות מושבתות ב-# אפליקציות}}</translation>
 <translation id="1525508553941733066">סגור</translation>
 <translation id="1537254971476575106">מגדיל למסך מלא</translation>
 <translation id="15373452373711364">סמן עכבר גדול</translation>
 <translation id="1550523713251050646">לחץ לקבלת אפשרויות נוספות</translation>
 <translation id="1567387640189251553">חוברה מקלדת אחרת מאז שהזנת את הסיסמה בפעם האחרונה. ייתכן שהיא מנסה לתעד את ההקשות שלך.</translation>
+<translation id="1570871743947603115">‏החלפת מצב Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">הסר את המשתמש הזה</translation>
 <translation id="1621499497873603021">הזמן שנותר עד להתרוקנות הסוללה, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">מצטערים, עדיין אי אפשר לאמת את הסיסמה שלך. חשוב לדעת: אם שינית לאחרונה את הסיסמה, הסיסמה החדשה תיכנס לתוקף רק אחרי יציאה מהחשבון. צריך להשתמש כאן בסיסמה הישנה.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">לא מזוהה</translation>
 <translation id="1746730358044914197">מנהל המערכת שלך מגדיר את שיטות הקלט.</translation>
 <translation id="1747827819627189109">המקלדת שמופיעה במסך מופעלת</translation>
+<translation id="1761222317188459878">החלפת מצב החיבור לרשת. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">אתרנט: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">‏Assistant (בטעינה...)</translation>
 <translation id="1841545962859478868">ייתכן שמנהל המכשיר עוקב אחרי:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">מכשיר זה מנוהל על ידי <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">לאורך</translation>
 <translation id="2067602449040652523">בהירות מקלדת</translation>
+<translation id="2075212959500165896">יותר מדי ניסיונות. יש לנסות שוב מאוחר יותר.</translation>
 <translation id="2081529251031312395">ל-$1 עדיין תהיה אפשרות להיכנס מאוחר יותר.</translation>
 <translation id="2127372758936585790">מטען בעל מתח נמוך</translation>
 <translation id="2135456203358955318">מגדיל במצב מעוגן</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">החלף סקירת חלון</translation>
 <translation id="2338501278241028356">‏יש להפעיל את Bluetooth כדי לאתר מכשירים קרובים</translation>
 <translation id="2339073806695260576">הקשה על לחצן הסטיילוס במדף מאפשרת לכתוב הערות, לצלם את המסך ולהשתמש בסמן הלייזר או בזכוכית המגדלת.</translation>
+<translation id="2341729377289034582">נעול במצב אנכי</translation>
 <translation id="2352467521400612932">הגדרות סטיילוס</translation>
 <translation id="2354174487190027830">מפעיל את <ph name="NAME" /></translation>
 <translation id="2359808026110333948">המשך</translation>
 <translation id="2365393535144473978">‏כשמפעילים את חבילת הגלישה, מופעלת גם תקשורת Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">החלפת המצב של 'נא לא להפריע'</translation>
 <translation id="2412593942846481727">יש עדכון זמין</translation>
+<translation id="2416346634399901812">יש חיבור אל <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">‏מכשיר ה-Bluetooth ‏"<ph name="DEVICE_NAME" />" מבקש הרשאה לבצע התאמה. לפני שתאשר, ודא שמפתח הסיסמה הבא מוצג במכשיר הזה: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">התראות</translation>
 <translation id="2484513351006226581">צריך להקיש על <ph name="KEYBOARD_SHORTCUT" /> כדי להחליף פריסת מקלדת.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">הוסף חיבור</translation>
 <translation id="2961963223658824723">משהו השתבש. אפשר לנסות שוב בעוד כמה שניות.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">‏צפייה במכשירי CAST.</translation>
 <translation id="2996462380875591307">‏הזכוכית המגדלת במצב עגינה הופעלה. כדי לכבות אותה, יש להקיש שוב על Ctrl+Search+D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> היא הפעלה ציבורית המנוהלת על ידי <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">אודיו במונו</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">נתוני נייד</translation>
 <translation id="3151786313568798007">כיוון</translation>
 <translation id="3153444934357957346">אפשר לכלול עד <ph name="MULTI_PROFILE_USER_LIMIT" /> חשבונות בכניסה עם מספר חשבונות.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{מחובר למכשיר אחד}two{מחובר ל-# מכשירים}many{מחובר ל-# מכשירים}other{מחובר ל-# מכשירים}}</translation>
 <translation id="3236488194889173876">אין רשת סלולרית זמינה</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">אורח</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">נעילה</translation>
 <translation id="3798670284305777884">רמקול (פנימי)</translation>
 <translation id="380165613292957338">היי, איך אפשר לעזור?</translation>
+<translation id="383629559565718788">צפייה בהגדרות המקלדת</translation>
 <translation id="3846575436967432996">אין מידע רשת זמין</translation>
 <translation id="385051799172605136">חזור</translation>
 <translation id="3891340733213178823">‏הקש פעמיים על Ctrl+Shift+Q כדי לצאת.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">אות בינוני</translation>
 <translation id="4200057768455216496">לחצת על מקש הקיצור של זכוכית מגדלת במצב עגינה. להפעיל אותה?</translation>
 <translation id="4217571870635786043">הכתבה</translation>
+<translation id="4261870227682513959">צפייה בהגדרות של הודעות. ההודעות מושבתות</translation>
 <translation id="4274921305979314545">‏חיבור ה-Chromebook אל הטלפון</translation>
 <translation id="4279490309300973883">שיקוף</translation>
+<translation id="4292681942966152062">המערכת מפעילה את <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">זכוכית מגדלת</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">מ"<ph name="FROM_LOCALE" />" ל"<ph name="TO_LOCALE" />" אחרי סנכרון ההגדרות.</translation>
 <translation id="574392208103952083">בינוני</translation>
 <translation id="5744083938413354016">הקשה וגרירה</translation>
+<translation id="5750765938512549687">‏Bluetooth כבוי</translation>
 <translation id="5777841717266010279">להפסיק את שיתוף המסך?</translation>
 <translation id="57838592816432529">השתק</translation>
 <translation id="5805697420284793859">מנהל החלונות</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">הצג מקלדת במסך</translation>
 <translation id="6164005077879661055">כל הקבצים והנתונים המקומיים המשויכים למשתמש בפיקוח יימחקו לצמיתות לאחר שמשתמש בפיקוח זה יוסר. המנהל עדיין יוכל לראות את האתרים שבהם משתמש בפיקוח זה ביקר, ואת ההגדרות שלו, בכתובת <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">למידע נוסף</translation>
+<translation id="6254629735336163724">נעול במצב אופקי</translation>
 <translation id="6259254695169772643">כדי לבחור יש להשתמש בסטיילוס</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: מפעיל...</translation>
 <translation id="6284232397434400372">הרזולוציה השתנתה</translation>
 <translation id="6297287540776456956">בחר אזור באמצעות הסטיילוס</translation>
 <translation id="6310121235600822547">בוצע סיבוב של <ph name="DISPLAY_NAME" /> אל <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">שכבת-על של מקלדת</translation>
+<translation id="6376931439017688372">‏Bluetooth פועל</translation>
 <translation id="639644700271529076">‏CAPS LOCK כבוי</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">הפעולה הושלמה</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">מנהל המערכת השבית את הרשת הזו.</translation>
 <translation id="7067196344162293536">סיבוב אוטומטי</translation>
 <translation id="7076293881109082629">כניסה</translation>
+<translation id="7092922358121866860">צפייה בהגדרות של תאורת לילה</translation>
 <translation id="7098389117866926363">‏מכשיר עם יציאת USB-C (יציאה שמאלית מאחור)</translation>
 <translation id="7131634465328662194">המערכת תוציא אותך מהחשבון באופן אוטומטי.</translation>
 <translation id="7143207342074048698">מתחבר</translation>
@@ -358,6 +376,7 @@
 <translation id="7798302898096527229">‏הקש על Search או על Shift כדי לבטל.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> ו-<ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">אות חזק</translation>
+<translation id="7842211907556571265">המערכת מתחברת אל <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">אזהרה: תכונה ניסיונית</translation>
 <translation id="7846634333498149051">מקלדת</translation>
 <translation id="790040513076446191">לשנות הגדרות הקשורות לפרטיות</translation>
@@ -398,18 +417,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: מתחבר מחדש...</translation>
 <translation id="8513108775083588393">סיבוב אוטומטי</translation>
 <translation id="8517041960877371778">ייתכן שה-<ph name="DEVICE_TYPE" /> לא ייטען כשהוא פועל.</translation>
+<translation id="8627191004499078455">יש חיבור אל <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">שיעור טעינה נותר - <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">הקראה</translation>
 <translation id="8652175077544655965">סגירת ההגדרות</translation>
+<translation id="8653151467777939995">צפייה בהגדרות של הודעות. ההודעות מופעלות</translation>
+<translation id="8664753092453405566">צפייה ברשימת הרשתות. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">חובר מטען בעל מתח נמוך</translation>
 <translation id="8683506306463609433">מעקב הביצועים פעיל</translation>
 <translation id="8734991477317290293">ייתכן שהיא מנסה לתעד את ההקשות שלך.</translation>
+<translation id="8735953464173050365">צפייה בהגדרות המקלדת. המקלדת שנבחרה היא <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">‏צפייה בהגדרות VPN</translation>
 <translation id="8809737090443522491">יש להזין שם של אפליקציה או מסמך</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">אין תמיכה בשיקוף מסך עם יותר משני מסכים.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">לחצן 'הקודם'</translation>
+<translation id="8843682306134542540">החלפת המצב של נעילת הסיבוב. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">האפליקציה אינה תומכת במסך מפוצל.</translation>
 <translation id="8874184842967597500">לא מחובר</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb
index 07432fa..694d393 100644
--- a/ash/strings/ash_strings_ja.xtb
+++ b/ash/strings/ash_strings_ja.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> が追加されました</translation>
 <translation id="1056775291175587022">ネットワークが見つかりません</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">ユーザー補助機能の設定を表示</translation>
 <translation id="1104621072296271835">端末を連携させると活用の幅が広がります</translation>
 <translation id="112308213915226829">シェルフを自動的に隠す</translation>
 <translation id="1153356358378277386">ペア設定されたデバイス</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />(<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">電波: 弱い</translation>
 <translation id="1293264513303784526">USB-C デバイス(左側面のポート)</translation>
+<translation id="1302880136325416935">Bluetooth の設定を表示します。<ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">右</translation>
 <translation id="1351937230027495976">メニューを折りたたむ</translation>
 <translation id="1383876407941801731">検索</translation>
 <translation id="1467432559032391204">左</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" />(HDMI / DP)</translation>
 <translation id="1510238584712386396">ランチャー</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{通知設定を表示します。1 件のアプリで通知がオフになっています}other{通知設定を表示します。# 件のアプリで通知がオフになっています}}</translation>
 <translation id="1525508553941733066">閉じる</translation>
 <translation id="1537254971476575106">拡大鏡(全画面)</translation>
 <translation id="15373452373711364">大きいマウス カーソル</translation>
 <translation id="1550523713251050646">クリックするとその他のオプションが表示されます</translation>
 <translation id="1567387640189251553">前回のパスワード入力時以降に別のキーボードが接続されました。キー入力が読み取られる可能性があります。</translation>
+<translation id="1570871743947603115">Bluetooth を切り替えます。<ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">このユーザーを削除</translation>
 <translation id="1621499497873603021">バッテリーが空になるまであと: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">パスワードをまだ確認できません。注: パスワードを最近変更した場合、新しいパスワードはログアウトした後に適用されます。こちらでは古いパスワードを使用してください。</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">認識されませんでした</translation>
 <translation id="1746730358044914197">入力方法は管理者によって設定されています。</translation>
 <translation id="1747827819627189109">画面キーボードが有効です</translation>
+<translation id="1761222317188459878">ネットワーク接続を切り替えます。<ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">イーサネット: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">アシスタント(読み込み中...)</translation>
 <translation id="1841545962859478868">デバイス管理者が次の情報を監視している可能性があります。</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">この端末は <ph name="DOMAIN" /> によって管理されています。</translation>
 <translation id="2050339315714019657">縦</translation>
 <translation id="2067602449040652523">キーボードの明るさ</translation>
+<translation id="2075212959500165896">試行回数が上限を超えました。しばらくしてからもう一度お試しください。</translation>
 <translation id="2081529251031312395">$1 が後でログインすることは引き続き可能です。</translation>
 <translation id="2127372758936585790">低電力の充電器</translation>
 <translation id="2135456203358955318">拡大鏡(ドッキング)</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">ウィンドウ切り替えの概要</translation>
 <translation id="2338501278241028356">近くのデバイスを検出するには Bluetooth をオンにしてください</translation>
 <translation id="2339073806695260576">シェルフにあるタッチペン ボタンをタップして、メモやスクリーンショットをとったり、レーザー ポインタや虫メガネを使用したりすることができます。</translation>
+<translation id="2341729377289034582">縦に固定</translation>
 <translation id="2352467521400612932">タッチペンの設定</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> を有効にしています</translation>
 <translation id="2359808026110333948">続行</translation>
 <translation id="2365393535144473978">モバイルデータ通信を有効にすると、Bluetooth も有効になります。</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">通知のミュートを切り替え</translation>
 <translation id="2412593942846481727">アップデートが利用可能</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> に接続されています</translation>
 <translation id="2429753432712299108">Bluetooth デバイス「<ph name="DEVICE_NAME" />」がペア設定の権限をリクエストしています。許可するにあたっては、このデバイスで次のパスキーが表示されることを確認してください: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">通知</translation>
 <translation id="2484513351006226581">キーボード レイアウトを切り替えるには <ph name="KEYBOARD_SHORTCUT" /> キーを押します。</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">接続を追加</translation>
 <translation id="2961963223658824723">エラーが発生しました。数秒後にもう一度お試しください。</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">キャスト デバイスを表示します。</translation>
 <translation id="2996462380875591307">拡大鏡(ドッキング)がオンになっています。オフにするには Ctrl+検索+D キーをもう一度押します。</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> は <ph name="DOMAIN" /> が管理する公開セッションです</translation>
 <translation id="3000461861112256445">モノラル音声</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">モバイル データ</translation>
 <translation id="3151786313568798007">向き</translation>
 <translation id="3153444934357957346">マルチログインに使用できるのは <ph name="MULTI_PROFILE_USER_LIMIT" /> アカウントまでです。</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{1 個のデバイスと接続されています}other{# 個のデバイスと接続されています}}</translation>
 <translation id="3236488194889173876">利用できるモバイル ネットワークがありません</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ゲスト</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">ロック</translation>
 <translation id="3798670284305777884">スピーカー(内蔵)</translation>
 <translation id="380165613292957338">はい、どんなご用でしょう?</translation>
+<translation id="383629559565718788">キーボード設定を表示</translation>
 <translation id="3846575436967432996">利用可能なネットワーク情報がありません</translation>
 <translation id="385051799172605136">戻る</translation>
 <translation id="3891340733213178823">ログアウトするには、Ctrl+Shift+Q を 2 回押します。</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">電波: 中程度</translation>
 <translation id="4200057768455216496">拡大鏡(ドッキング)のショートカットを押しました。この機能をオンにしますか?</translation>
 <translation id="4217571870635786043">音声入力</translation>
+<translation id="4261870227682513959">通知設定を表示します。通知はオフです</translation>
 <translation id="4274921305979314545">Chromebook とスマートフォンを接続できます</translation>
 <translation id="4279490309300973883">ミラーリング</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> を有効化しています</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">虫メガネ</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">設定の同期後に「<ph name="FROM_LOCALE" />」から「<ph name="TO_LOCALE" />」に変更されました。</translation>
 <translation id="574392208103952083">中</translation>
 <translation id="5744083938413354016">タップによるドラッグ</translation>
+<translation id="5750765938512549687">Bluetooth がオフです</translation>
 <translation id="5777841717266010279">画面の共有を解除しますか?</translation>
 <translation id="57838592816432529">ミュート</translation>
 <translation id="5805697420284793859">ウィンドウ マネージャ</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">画面キーボードを表示する</translation>
 <translation id="6164005077879661055">この監視対象ユーザーを削除すると、このユーザーに関連付けられたすべてのファイルとローカル データも完全に削除されます。この監視対象ユーザーがアクセスしたウェブサイトやこのユーザーの設定は引き続き、管理者が <ph name="MANAGEMENT_URL" /> で見ることができます。</translation>
 <translation id="6165508094623778733">詳しく見る</translation>
+<translation id="6254629735336163724">横に固定</translation>
 <translation id="6259254695169772643">タッチペンを使って選択してください</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: 有効にしています...</translation>
 <translation id="6284232397434400372">解像度が変更されました</translation>
 <translation id="6297287540776456956">タッチペンを使って部分を選択してください</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> を <ph name="ROTATION" /> に回転しました</translation>
 <translation id="632744581670418035">キーボード オーバーレイ</translation>
+<translation id="6376931439017688372">Bluetooth がオンです</translation>
 <translation id="639644700271529076">CapsLock 機能はオフになっています</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">すべて確認済み</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">このネットワークは管理者によって無効にされています。</translation>
 <translation id="7067196344162293536">自動回転</translation>
 <translation id="7076293881109082629">ログイン中</translation>
+<translation id="7092922358121866860">読書灯の設定を表示</translation>
 <translation id="7098389117866926363">USB-C デバイス(背面左のポート)</translation>
 <translation id="7131634465328662194">制限時間になると自動的にログアウトします。</translation>
 <translation id="7143207342074048698">接続中</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">キャンセルするには検索キーまたは Shift キーを押します。</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">電波: 強い</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> に接続しています</translation>
 <translation id="7842569679327885685">警告: 試験運用版の機能</translation>
 <translation id="7846634333498149051">キーボード</translation>
 <translation id="790040513076446191">プライバシー関連設定を操作する</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: 再接続しています...</translation>
 <translation id="8513108775083588393">自動回転</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> は電源がオンのままでは充電できない可能性があります。</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> と接続しました</translation>
 <translation id="8639760480004882931">バッテリー残量: <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">選択して読み上げ</translation>
 <translation id="8652175077544655965">設定を閉じます</translation>
+<translation id="8653151467777939995">通知設定を表示します。通知はオンです</translation>
+<translation id="8664753092453405566">ネットワーク リストを表示します。<ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">低電力の充電器に接続されています</translation>
 <translation id="8683506306463609433">パフォーマンス追跡機能が有効</translation>
 <translation id="8734991477317290293">キー入力が読み取られる可能性があります</translation>
+<translation id="8735953464173050365">キーボード設定を表示します。<ph name="KEYBOARD_NAME" /> が選択されています</translation>
+<translation id="875593634123171288">VPN 設定を表示</translation>
 <translation id="8809737090443522491">アプリまたはドキュメントの名前を入力</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">2 台を超えるディスプレイのミラーリングはサポートされていません。</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">戻るボタン</translation>
+<translation id="8843682306134542540">画面の向きの固定を切り替えます。<ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">アプリで分割画面がサポートされていません。</translation>
 <translation id="8874184842967597500">未接続</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb
index c1aea83..8c29707 100644
--- a/ash/strings/ash_strings_kn.xtb
+++ b/ash/strings/ash_strings_kn.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ಸೇರಿಸಲಾಗಿದೆ</translation>
 <translation id="1056775291175587022">ಯಾವುದೇ ನೆಟ್‌ವರ್ಕ್‌ಗಳಿಲ್ಲ</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">ಪ್ರವೇಶಿಸುವಿಕೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="1104621072296271835">ನಿಮ್ಮ ಸಾಧನಗಳು ಜೊತೆಯಲ್ಲಿ ಇನ್ನೂ ಚೆನ್ನಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತವೆ</translation>
 <translation id="112308213915226829">ಶೆಲ್ಫ್ ಅನ್ನು ಸ್ವಯಂಮರೆಮಾಡು</translation>
 <translation id="1153356358378277386">ಜೋಡಿ ಮಾಡಲಾದ ಸಾಧನಗಳು</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">ದುರ್ಬಲ ಸಿಗ್ನಲ್</translation>
 <translation id="1293264513303784526">USB-C ಸಾಧನ (ಎಡ ಪೋರ್ಟ್)</translation>
+<translation id="1302880136325416935">ಬ್ಲೂಟೂತ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ.<ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">ಬಲಕ್ಕೆ</translation>
 <translation id="1351937230027495976">ಮೆನುವನ್ನು ಕುಗ್ಗಿಸಿ</translation>
 <translation id="1383876407941801731">ಹುಡುಕಾಟ</translation>
 <translation id="1467432559032391204">ಎಡಕ್ಕೆ</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">ಲಾಂಚರ್</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. ಒಂದು ಅಪ್ಲಿಕೇಶನ್‌ಗಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ}one{ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. # ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ}other{ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. # ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗಾಗಿ ಅಧಿಸೂಚನೆಗಳನ್ನು ಆಫ್ ಮಾಡಲಾಗಿದೆ}}</translation>
 <translation id="1525508553941733066">ವಜಾಗೊಳಿಸಿ</translation>
 <translation id="1537254971476575106">ಪೂರ್ಣಪರದೆ ವರ್ಧಕ</translation>
 <translation id="15373452373711364">ದೊಡ್ಡ ಮೌಸ್ ಕರ್ಸರ್</translation>
 <translation id="1550523713251050646">ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳಿಗೆ ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
 <translation id="1567387640189251553">ನೀವು ಕೊನೆಯ ಬಾರಿ ಪಾಸ್‍ವರ್ಡ್ ನಮೂದಿಸುವಾಗ ಇದ್ದ ಕೀಬೋರ್ಡ್‍ಗಿಂತ ಇದು ಭಿನ್ನವಾಗಿದೆ. ನಿಮ್ಮ ಕೀಸ್ಟ್ರೋಕ್‌ಗಳನ್ನು ಕಳವು ಮಾಡಲು ಇದು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು.</translation>
+<translation id="1570871743947603115">ಬ್ಲೂಟೂತ್ ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">ಈ ಬಳಕೆದಾರರನ್ನು ತೆಗೆದುಹಾಕಿ</translation>
 <translation id="1621499497873603021">ಬ್ಯಾಟರಿ ಖಾಲಿ ಆಗುವವರೆಗೆ ಉಳಿದಿರುವ ಸಮಯ, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">ಕ್ಷಮಿಸಿ, ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಇನ್ನೂ ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ಗಮನಿಸಿ: ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಇತ್ತೀಚೆಗೆ ಬದಲಾಯಿಸಿದ್ದರೆ, ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡಿದ ನಂತರ ನಿಮ್ಮ ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಜಾರಿಗೆ ತರಲಾಗುತ್ತದೆ, ಇಲ್ಲಿ ಹಳೆಯ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಬಳಸಿ.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">ಗುರುತಿಸಲಾಗಿಲ್ಲ</translation>
 <translation id="1746730358044914197">ನಿಮ್ಮ ಇನ್‌ಪುಟ್‌ ವಿಧಾನಗಳನ್ನು ನಿರ್ವಾಹಕರ ಸಹಾಯದಿಂದ ಕಾನ್ಫಿಗರ್‌ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="1747827819627189109">ಆನ್ ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ</translation>
+<translation id="1761222317188459878">ನೆಟ್‌ವರ್ಕ್ ಸಂಪರ್ಕವನ್ನು ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">ಇಥರ್ನೆಟ್: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">ಸಹಾಯಕ (ಲೋಡ್ ಆಗುತ್ತಿದೆ...)</translation>
 <translation id="1841545962859478868">ಸಾಧನದ ನಿರ್ವಾಹಕರು ಕೆಳಗಿನದನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಬಹುದು:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">ಈ ಸಾಧನವು <ph name="DOMAIN" /> ನಿಂದ ನಿರ್ವಹಿಸಲ್ಪಟ್ಟಿದೆ.</translation>
 <translation id="2050339315714019657">ಪೋಟ್ರೇಟ್</translation>
 <translation id="2067602449040652523">ಕೀಬೋರ್ಡ್ ಪ್ರಖರತೆ</translation>
+<translation id="2075212959500165896">ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="2081529251031312395">$1 ಆನಂತರವೂ ಸೈನ್ ಇನ್ ಮಾಡಬಹುದು.</translation>
 <translation id="2127372758936585790">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್</translation>
 <translation id="2135456203358955318">ಡಾಕ್‌‌ ಮಾಡಿರುವ ವರ್ಧಕ</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">ಟಾಗಲ್ ವಿಂಡೋ ಅವಲೋಕನ</translation>
 <translation id="2338501278241028356">ಸಮೀಪದ ಸಾಧನಗಳನ್ನು ಅನ್ವೇಷಿಸಲು ಬ್ಲೂಟೂತ್ ಆನ್ ಮಾಡಿ</translation>
 <translation id="2339073806695260576">ಟಿಪ್ಪಣಿ, ಸ್ಕ್ರೀನ್‌ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲು, ಲೇಸರ್‌ ಪಾಯಿಂಟರ್ ಬಳಸಲು ಅಥವಾ ಭೂತಗನ್ನಡಿ ಬಳಸಲು ಶೆಲ್ಫ್‌ನಲ್ಲಿ ಸ್ಟೈಲಸ್ ಬಟನ್ ಅನ್ನು ಟ್ಯಾಪ್ ಮಾಡಿ.</translation>
+<translation id="2341729377289034582">ಪರದೆಯು ವರ್ಟಿಕಲ್ ಆಗಿ ತೋರುವಂತೆ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="2352467521400612932">ಸ್ಟೈಲಸ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="2359808026110333948">ಮುಂದುವರಿಸು</translation>
 <translation id="2365393535144473978">ಮೊಬೈಲ್ ಡೇಟಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದರಿಂದ ಬ್ಲೂಟೂತ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಸ್ಥಿತಿಯನ್ನು ಟಾಗಲ್ ಮಾಡಿ</translation>
 <translation id="2412593942846481727">ಅಪ್‌ಡೇಟ್‌‌ ಲಭ್ಯವಿದೆ</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</translation>
 <translation id="2429753432712299108">ಬ್ಲೂಟೂತ್‌‌ ಸಾಧನವು "<ph name="DEVICE_NAME" />" ಜೋಡಣೆಗಾಗಿ ಅನುಮತಿಯನ್ನು ಬಯಸುತ್ತದೆ. ಸಮ್ಮತಿಸುವುದಕ್ಕೂ ಮೊದಲು, ದಯವಿಟ್ಟು ಆ ಸಾಧನದಲ್ಲಿ ಈ ಪಾಸ್‌ಕೀಲಿಯನ್ನು ತೋರಿಸಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಾತರಿಪಡಿಸಿಕೊಳ್ಳಿ: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">ಸೂಚನೆಗಳು</translation>
 <translation id="2484513351006226581">ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಬದಲಾಯಿಸಲು <ph name="KEYBOARD_SHORTCUT" /> ಒತ್ತಿರಿ.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">ಸಂಪರ್ಕ ಸೇರಿಸಿ</translation>
 <translation id="2961963223658824723">ಏನೋ ಸಮಸ್ಯೆಯಾಗಿದೆ. ಕೆಲವು ನಿಮಿಷಗಳಲ್ಲಿ ಮತ್ತೊಮ್ಮೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">ಬಿತ್ತರಿಸುವ ಸಾಧನಗಳನ್ನು ತೋರಿಸಿ.</translation>
 <translation id="2996462380875591307">ಡಾಕ್‌‌ ಮಾಡಿರುವ ವರ್ಧಕವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಅದನ್ನು ಟಾಗಲ್‌ ಆಫ್‌ ಮಾಡಲು ಪುನಃ Ctrl+Search+D ಅನ್ನು ಒತ್ತಿರಿ.</translation>
 <translation id="2999742336789313416"><ph name="DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಸಾರ್ವಜನಿಕ ಸೆಶನ್ <ph name="DISPLAY_NAME" /> ಆಗಿದೆ</translation>
 <translation id="3000461861112256445">ಮೊನೊ ಆಡಿಯೊ</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">ಮೊಬೈಲ್ ಡೇಟಾ</translation>
 <translation id="3151786313568798007">ಓರಿಯಂಟೇಶನ್</translation>
 <translation id="3153444934357957346">ಹಲವು ಪ್ರೊಫೈಲ್ ಸೈನ್-ಇನ್‌ ಮಾಡುವಾಗ ನೀವು <ph name="MULTI_PROFILE_USER_LIMIT" /> ಖಾತೆಗಳವರೆಗೆ ಮಾತ್ರ ಹೊಂದಬಹುದು.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ಒಂದು ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ}one{# ಸಾಧನಗಳಿಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ}other{# ಸಾಧನಗಳಿಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ}}</translation>
 <translation id="3236488194889173876">ಮೊಬೈಲ್ ನೆಟ್‌ವರ್ಕ್ ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ಅತಿಥಿ</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">ಲಾಕ್ ಮಾಡಿ</translation>
 <translation id="3798670284305777884">ಸ್ಪೀಕರ್ (ಆಂತರಿಕ)</translation>
 <translation id="380165613292957338">ಹಾಯ್, ನಾನು ಹೇಗೆ ಸಹಾಯ ಮಾಡಬಹುದು?</translation>
+<translation id="383629559565718788">ಕೀಬೋರ್ಡ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="3846575436967432996">ನೆಟ್‌ವರ್ಕ್ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ</translation>
 <translation id="385051799172605136">ಹಿಂದೆ</translation>
 <translation id="3891340733213178823">ಸೈನ್ ಔಟ್ ಮಾಡಲು Ctrl+Shift+Q ಅನ್ನು ಎರಡುಬಾರಿ ಒತ್ತಿರಿ.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">ಮಧ್ಯಮ ಸಿಗ್ನಲ್</translation>
 <translation id="4200057768455216496">ಡಾಕ್ ಮಾಡಿದ ವರ್ಧಕದ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ನೀವು ಒತ್ತಿದ್ದೀರಿ. ಅದನ್ನು ಆನ್ ಮಾಡಲು ಬಯಸುವಿರಾ?</translation>
 <translation id="4217571870635786043">ಉಕ್ತಲೇಖನ</translation>
+<translation id="4261870227682513959">ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. ಅಧಿಸೂಚನೆಗಳು ಆಫ್ ಆಗಿವೆ</translation>
 <translation id="4274921305979314545">ನಿಮ್ಮ ಫೋನ್‌‍ನ ಮೂಲಕ ನಿಮ್ಮ Chromebook ಅನ್ನು ಸಂಪರ್ಕಿಸಿ</translation>
 <translation id="4279490309300973883">ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">ವರ್ಧಕ ಮಸೂರ</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಿದ ಬಳಿಕ "<ph name="FROM_LOCALE" />" ನಿಂದ "<ph name="TO_LOCALE" />" ಗೆ.</translation>
 <translation id="574392208103952083">ಮಧ್ಯಮ</translation>
 <translation id="5744083938413354016">ಟ್ಯಾಪ್ ಎಳೆಯುವಿಕೆ</translation>
+<translation id="5750765938512549687">ಬ್ಲೂಟೂತ್ ಆಫ್ ಆಗಿದೆ</translation>
 <translation id="5777841717266010279">ಸ್ಕ್ರೀನ್ ಹಂಚಿಕೆ ನಿಲ್ಲಿಸುವುದೇ?</translation>
 <translation id="57838592816432529">ಮ್ಯೂಟ್</translation>
 <translation id="5805697420284793859">ವಿಂಡೋ ಮ್ಯಾನೇಜರ್</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">ಆನ್-ಸ್ಕ್ರೀನ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು</translation>
 <translation id="6164005077879661055">ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರನ್ನು ಒಮ್ಮೆ ತೆಗೆದುಹಾಕಿದರೆ, ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಯೋಜಿತವಾಗಿರುವ ಎಲ್ಲ ಫೈಲ್‌ಗಳು ಮತ್ತು ಸ್ಥಳೀಯ ಡೇಟಾವನ್ನು ಶಾಶ್ವತವಾಗಿ ಅಳಿಸಲಾಗುತ್ತದೆ. ಈ ಮೇಲ್ವಿಚಾರಣೆ ಬಳಕೆದಾರಿಗಾಗಿ ಭೇಟಿ ನೀಡಲಾದ ವೆಬ್‌ಸೈಟ್‌ಗಳು ಮತ್ತು ಸೆಟ್ಟಿಂಗ್‌ಗಳು <ph name="MANAGEMENT_URL" /> ನಲ್ಲಿ ನಿರ್ವಾಹಕರಿಗೆ ಈಗಲೂ ಗೋಚರಿಸಬಹುದು.</translation>
 <translation id="6165508094623778733">ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ</translation>
+<translation id="6254629735336163724">ಪರದೆಯು ಅಡ್ಡಲಾಗಿ ತೋರುವಂತೆ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="6259254695169772643">ಆಯ್ಕೆ ಮಾಡಲು ನಿಮ್ಮ ಸ್ಟೈಲಸ್ ಅನ್ನು ಬಳಸಿ</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="6284232397434400372">ರೆಸಲ್ಯೂಷನ್ ಬದಲಾಗಿದೆ</translation>
 <translation id="6297287540776456956">ಪ್ರದೇಶವನ್ನು ಆಯ್ಕೆಮಾಡಲು ಸ್ಟೈಲಸ್ ಬಳಸಿ</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ಅನ್ನು <ph name="ROTATION" /> ಗೆ ತಿರುಗಿಸಲಾಗಿದೆ</translation>
 <translation id="632744581670418035">ಕೀಬೋರ್ಡ್ ಓವರ್‌ಲೇ</translation>
+<translation id="6376931439017688372">ಬ್ಲೂಟೂತ್ ಆನ್ ಆಗಿದೆ</translation>
 <translation id="639644700271529076">CAPS LOCK ಆಫ್ ಆಗಿದೆ</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">ಎಲ್ಲಾ ಮುಗಿದಿದೆ</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">ಈ ನೆಟ್‌ವರ್ಕ್ ಅನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation>
 <translation id="7067196344162293536">ಸ್ವಯಂ ತಿರುಗಿಸು</translation>
 <translation id="7076293881109082629">ಸೈನ್ ಇನ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation>
+<translation id="7092922358121866860">ನೈಟ್ ಲೈಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="7098389117866926363">USB-C ಸಾಧನ (ಹಿಂಭಾಗದಲ್ಲಿ ಎಡ ಪೋರ್ಟ್‌)</translation>
 <translation id="7131634465328662194">ನೀವು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್‌ಔಟ್‌ ಆಗುತ್ತೀರಿ.</translation>
 <translation id="7143207342074048698">ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">ರದ್ದುಗೊಳಿಸಲು 'ಹುಡುಕಾಟ' ಅಥವಾ Shift ಅನ್ನು ಒತ್ತಿರಿ.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> ಮತ್ತು <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">ಪ್ರಬಲ ಸಿಗ್ನಲ್</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ</translation>
 <translation id="7842569679327885685">ಎಚ್ಚರಿಕೆ: ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯ</translation>
 <translation id="7846634333498149051">ಕೀಬೋರ್ಡ್</translation>
 <translation id="790040513076446191">ಗೌಪ್ಯತೆಗೆ- ಸಂಬಂಧಿಸಿದ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸ್ವಾಧೀನಪಡಿಸಿಕೊಳ್ಳಿ</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: ಮರುಸಂಪರ್ಕಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="8513108775083588393">ಸ್ವಯಂ-ತಿರುಗುವಿಕೆ</translation>
 <translation id="8517041960877371778">ನಿಮ್ಮ <ph name="DEVICE_TYPE" /> ಅನ್ನು ಆನ್ ಮಾಡಿರುವಾಗ ಅದನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> ಗೆ ಸಂಪರ್ಕಿಸಲಾಗಿದೆ</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> ಉಳಿದಿದೆ</translation>
 <translation id="8649101189709089199">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ</translation>
 <translation id="8652175077544655965">ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಮುಚ್ಚಿರಿ</translation>
+<translation id="8653151467777939995">ಅಧಿಸೂಚನೆ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. ಅಧಿಸೂಚನೆಗಳು ಆನ್ ಆಗಿವೆ</translation>
+<translation id="8664753092453405566">ನೆಟ್‌ವರ್ಕ್ ಪಟ್ಟಿಯನ್ನು ತೋರಿಸಿ. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">ಕಡಿಮೆ ವಿದ್ಯುತ್ ಚಾರ್ಜರ್ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ</translation>
 <translation id="8683506306463609433">ಕಾರ್ಯಕ್ಷಮತೆಯ ಟ್ರೇಸಿಂಗ್ ಸಕ್ರಿಯವಾಗಿದೆ</translation>
 <translation id="8734991477317290293">ನಿಮ್ಮ ಕೀಸ್ಟ್ರೋಕ್‌ಗಳನ್ನು ಕಳವು ಮಾಡಲು ಇದು ಪ್ರಯತ್ನಿಸುತ್ತಿರಬಹುದು</translation>
+<translation id="8735953464173050365">ಕೀಬೋರ್ಡ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. <ph name="KEYBOARD_NAME" /> ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆ</translation>
+<translation id="875593634123171288">VPN ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ</translation>
 <translation id="8809737090443522491">ಅಪ್ಲಿಕೇಶನ್‌ ಅಥವಾ ಡಾಕ್ಯುಮೆಂಟ್‌ನ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ</translation>
 <translation id="8814190375133053267">ವೈ-ಫೈ</translation>
 <translation id="8825534185036233643">ಎರಡಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಪ್ರದರ್ಶನಗಳ ಪ್ರತಿಬಿಂಬಿಸುವಿಕೆ ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">ಹಿಂದೆ ಬಟನ್</translation>
+<translation id="8843682306134542540">ಪರದೆ ತಿರುಗಿಸುವಿಕೆಯ ಲಾಕ್ ಅನ್ನು ಟಾಗಲ್ ಮಾಡಿ. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">ಅಪ್ಲಿಕೇಶನ್ ಸ್ಪ್ಲಿಟ್ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="8874184842967597500">ಸಂಪರ್ಕಗೊಳಿಸಿಲ್ಲ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb
index 4668139..304333f 100644
--- a/ash/strings/ash_strings_ko.xtb
+++ b/ash/strings/ash_strings_ko.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> 추가됨</translation>
 <translation id="1056775291175587022">네트워크 없음</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">접근성 설정 표시</translation>
 <translation id="1104621072296271835">연결된 기기가 더욱 원활하게 작동합니다</translation>
 <translation id="112308213915226829">실행기 자동 숨김</translation>
 <translation id="1153356358378277386">페어링된 기기</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" />(<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">신호 약함</translation>
 <translation id="1293264513303784526">USB-C 기기(왼쪽 포트)</translation>
+<translation id="1302880136325416935">블루투스 설정을 표시합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">오른쪽</translation>
 <translation id="1351937230027495976">메뉴 접기</translation>
 <translation id="1383876407941801731">검색</translation>
 <translation id="1467432559032391204">왼쪽</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" />(HDMI/DP)</translation>
 <translation id="1510238584712386396">런처</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{알림 설정을 표시합니다. 앱 1개의 알림이 사용 중지되어 있습니다.}other{알림 설정을 표시합니다. 앱 #개의 알림이 사용 중지되어 있습니다.}}</translation>
 <translation id="1525508553941733066">닫기</translation>
 <translation id="1537254971476575106">전체화면 돋보기</translation>
 <translation id="15373452373711364">큰 마우스 커서</translation>
 <translation id="1550523713251050646">더 많은 옵션을 확인하려면 클릭하세요.</translation>
 <translation id="1567387640189251553">마지막으로 비밀번호를 입력한 후 다른 키보드가 연결되었습니다. 키 입력 내용을 도용하려는 시도일 수 있습니다.</translation>
+<translation id="1570871743947603115">블루투스를 전환합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">이 사용자 삭제</translation>
 <translation id="1621499497873603021">남은 배터리 사용 시간은 <ph name="TIME_LEFT" />입니다.</translation>
 <translation id="1658406695958299976">비밀번호를 여전히 확인할 수 없습니다. 참고: 최근에 비밀번호를 변경한 경우 로그아웃해야 새로운 비밀번호가 적용됩니다. 이전 비밀번호를 사용해 보세요.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">인식할 수 없음</translation>
 <translation id="1746730358044914197">입력 방법은 관리자가 설정합니다.</translation>
 <translation id="1747827819627189109">터치 키보드 사용 설정됨</translation>
+<translation id="1761222317188459878">네트워크 연결을 전환합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">이더넷: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">어시스턴트(로드 중...)</translation>
 <translation id="1841545962859478868">기기 관리자가 다음을 모니터링할 수 있습니다.</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">기기는 <ph name="DOMAIN" />에서 관리합니다.</translation>
 <translation id="2050339315714019657">세로 방향</translation>
 <translation id="2067602449040652523">키보드 밝기</translation>
+<translation id="2075212959500165896">시도 횟수가 너무 많습니다. 나중에 다시 시도하세요.</translation>
 <translation id="2081529251031312395">$1님이 나중에 로그인할 수 있습니다.</translation>
 <translation id="2127372758936585790">저출력 충전기</translation>
 <translation id="2135456203358955318">고정 돋보기</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">창 전환 개요</translation>
 <translation id="2338501278241028356">블루투스를 사용 설정하여 근처 기기 탐색</translation>
 <translation id="2339073806695260576">실행기에서 스타일러스 버튼을 탭하여 메모를 작성하거나, 스크린샷을 찍거나, 레이저 포인터 또는 돋보기를 활용할 수 있습니다.</translation>
+<translation id="2341729377289034582">세로로 잠김</translation>
 <translation id="2352467521400612932">스타일러스 설정</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> 활성화 중</translation>
 <translation id="2359808026110333948">계속</translation>
 <translation id="2365393535144473978">모바일 데이터를 사용 설정하면 블루투스가 사용 설정됩니다.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">알림 일시중지 전환</translation>
 <translation id="2412593942846481727">업데이트 가능</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" />에 연결됨</translation>
 <translation id="2429753432712299108">블루투스 기기 '<ph name="DEVICE_NAME" />'에서 페어링 허가를 요청합니다. 허가하기 전에 다음 패스키가 기기에 표시되는지 확인하세요. <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">알림</translation>
 <translation id="2484513351006226581">키보드 레이아웃을 전환하려면 <ph name="KEYBOARD_SHORTCUT" />을(를) 누르세요.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">연결 추가</translation>
 <translation id="2961963223658824723">문제가 발생했습니다. 잠시 후 다시 시도해 주세요.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">전송 기기를 표시합니다.</translation>
 <translation id="2996462380875591307">고정 돋보기가 사용 설정되었습니다. 사용 중지하려면 다시 Ctrl+Search+D를 누르세요.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" />은(는) <ph name="DOMAIN" />에서 관리하는 공개 세션입니다.</translation>
 <translation id="3000461861112256445">모노 오디오</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">모바일 데이터</translation>
 <translation id="3151786313568798007">방향</translation>
 <translation id="3153444934357957346">멀티 로그인에는 계정을 <ph name="MULTI_PROFILE_USER_LIMIT" />개까지만 사용할 수 있습니다.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{기기 1개에 연결됨}other{기기 #개에 연결됨}}</translation>
 <translation id="3236488194889173876">사용할 수 있는 모바일 네트워크 없음</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">손님</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">잠금</translation>
 <translation id="3798670284305777884">스피커(내부)</translation>
 <translation id="380165613292957338">안녕하세요, 무엇을 도와드릴까요?</translation>
+<translation id="383629559565718788">키보드 설정 표시</translation>
 <translation id="3846575436967432996">네트워크 정보 없음</translation>
 <translation id="385051799172605136">뒤로</translation>
 <translation id="3891340733213178823">로그아웃하려면 Ctrl+Shift+Q를 두 번 누릅니다.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">신호 보통</translation>
 <translation id="4200057768455216496">고정 돋보기 단축키를 누르셨습니다. 사용 설정할까요?</translation>
 <translation id="4217571870635786043">음성기록</translation>
+<translation id="4261870227682513959">알림 설정을 표시합니다. 알림이 사용 중지되어 있습니다.</translation>
 <translation id="4274921305979314545">Chromebook을 휴대전화에 연결하세요.</translation>
 <translation id="4279490309300973883">미러링</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> 활성화 중</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">돋보기</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">설정 동기화 후 ‘<ph name="FROM_LOCALE" />’에서 ‘<ph name="TO_LOCALE" />’(으)로 변경합니다.</translation>
 <translation id="574392208103952083">보통</translation>
 <translation id="5744083938413354016">탭 드래그</translation>
+<translation id="5750765938512549687">블루투스가 사용 중지됨</translation>
 <translation id="5777841717266010279">화면 공유를 중단하시겠습니까?</translation>
 <translation id="57838592816432529">음소거</translation>
 <translation id="5805697420284793859">창 관리자</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">터치 키보드 표시</translation>
 <translation id="6164005077879661055">관리 대상 사용자를 제거하면 해당 관리 대상 사용자와 연결되어 있는 모든 파일 및 로컬 데이터가 영구적으로 삭제됩니다. 하지만 관리자는 관리 대상 사용자의 방문한 웹사이트 및 설정을 <ph name="MANAGEMENT_URL" /> 페이지에서 계속 볼 수 있습니다.</translation>
 <translation id="6165508094623778733">자세히 알아보기</translation>
+<translation id="6254629735336163724">가로로 잠김</translation>
 <translation id="6259254695169772643">스타일러스로 선택하세요.</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: 활성화 중...</translation>
 <translation id="6284232397434400372">해상도가 변경됨</translation>
 <translation id="6297287540776456956">스타일러스를 사용하여 영역을 선택하세요.</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" />(이)가 <ph name="ROTATION" />(으)로 회전되었습니다.</translation>
 <translation id="632744581670418035">키보드 오버레이</translation>
+<translation id="6376931439017688372">블루투스 사용 중</translation>
 <translation id="639644700271529076">CAPS LOCK이 꺼져 있음</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">완료</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">관리자가 사용 중지한 네트워크입니다.</translation>
 <translation id="7067196344162293536">자동 회전</translation>
 <translation id="7076293881109082629">로그인</translation>
+<translation id="7092922358121866860">야간 조명 설정 표시</translation>
 <translation id="7098389117866926363">USB-C 기기(좌측 후면 포트)</translation>
 <translation id="7131634465328662194">자동으로 로그아웃됩니다.</translation>
 <translation id="7143207342074048698">연결 중</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">취소하려면 검색 또는 Shift 키를 누르세요.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" />시간 <ph name="MINUTE" />분</translation>
 <translation id="7829386189513694949">신호 강함</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" />에 연결 중</translation>
 <translation id="7842569679327885685">경고: 실험 기능</translation>
 <translation id="7846634333498149051">키보드</translation>
 <translation id="790040513076446191">개인정보 보호 관련 설정 조정</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: 다시 연결하는 중...</translation>
 <translation id="8513108775083588393">자동 회전</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" />이(가) 켜져 있는 동안에는 충전되지 않을 수 있습니다.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" />에 연결됨</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> 남음</translation>
 <translation id="8649101189709089199">텍스트 읽어주기</translation>
 <translation id="8652175077544655965">설정 닫기</translation>
+<translation id="8653151467777939995">알림 설정을 표시합니다. 알림이 사용 설정되어 있습니다.</translation>
+<translation id="8664753092453405566">네트워크 목록을 표시합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">저출력 충전기 연결됨</translation>
 <translation id="8683506306463609433">성능 추적 활성화</translation>
 <translation id="8734991477317290293">키 입력 내용을 도용하려는 시도일 수 있습니다.</translation>
+<translation id="8735953464173050365">키보드 설정을 표시합니다. <ph name="KEYBOARD_NAME" />이(가) 선택되었습니다.</translation>
+<translation id="875593634123171288">VPN 설정 표시</translation>
 <translation id="8809737090443522491">앱 또는 문서 이름 입력</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">3개 이상의 디스플레이 미러링은 지원되지 않습니다.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">뒤로 버튼</translation>
+<translation id="8843682306134542540">회전 잠금을 전환합니다. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">앱이 화면 분할을 지원하지 않습니다.</translation>
 <translation id="8874184842967597500">연결되지 않음</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb
index 7511ead..073c631 100644
--- a/ash/strings/ash_strings_lv.xtb
+++ b/ash/strings/ash_strings_lv.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Ierīce <ph name="DEVICE_NAME" /> ir pievienota</translation>
 <translation id="1056775291175587022">Nav tīklu</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Rādīt pieejamības iestatījumus</translation>
 <translation id="1104621072296271835">Kopā jūsu ierīces darbojas vēl labāk</translation>
 <translation id="112308213915226829">Automātiski slēpt plauktu</translation>
 <translation id="1153356358378277386">Pārī savienotās ierīces</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Vājš signāls</translation>
 <translation id="1293264513303784526">USB-C ierīce (pieslēgvieta pa kreisi)</translation>
+<translation id="1302880136325416935">Rādīt Bluetooth iestatījumus. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Pa labi</translation>
 <translation id="1351937230027495976">Sakļaut izvēlni</translation>
 <translation id="1383876407941801731">Meklēt</translation>
 <translation id="1467432559032391204">Pa kreisi</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Lietojumprogrammu palaidējs</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Rādīt paziņojumu iestatījumus. Paziņojumi lietotnei ir izslēgti}zero{Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti # lietotnēm}one{Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti # lietotnei}other{Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti # lietotnēm}}</translation>
 <translation id="1525508553941733066">NERĀDĪT</translation>
 <translation id="1537254971476575106">Pilnekrāna lupa</translation>
 <translation id="15373452373711364">Liels peles kursors</translation>
 <translation id="1550523713251050646">Noklikšķiniet, lai skatītu citas iespējas.</translation>
 <translation id="1567387640189251553">Kopš pēdējās reizes, kad ievadījāt paroli, ir pievienota cita tastatūra. Tā, iespējams, mēģina piesavināties jūsu taustiņsitienus.</translation>
+<translation id="1570871743947603115">Pārslēgt Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Noņemt šo lietotāju</translation>
 <translation id="1621499497873603021">Atlikušais akumulatora darbības laiks: <ph name="TIME_LEFT" />.</translation>
 <translation id="1658406695958299976">Diemžēl jūsu paroli joprojām nevarēja verificēt. Ņemiet vērā: ja nesen mainījāt paroli, jaunā parole tiks lietota pēc izrakstīšanās. Lūdzu, šeit izmantojiet iepriekšējo paroli.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Nav atpazīts</translation>
 <translation id="1746730358044914197">Administrators konfigurē ievades metodes.</translation>
 <translation id="1747827819627189109">Ekrāna tastatūra iespējota</translation>
+<translation id="1761222317188459878">Pārslēgt tīkla savienojumu. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet adrese: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistents (notiek ielāde...)</translation>
 <translation id="1841545962859478868">Ierīces administrators var uzraudzīt šo:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Šo ierīci pārvalda vietne <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portrets</translation>
 <translation id="2067602449040652523">Tastatūras spilgtums</translation>
+<translation id="2075212959500165896">Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz.</translation>
 <translation id="2081529251031312395">$1 joprojām varēs pierakstīties vēlāk.</translation>
 <translation id="2127372758936585790">Lādētājs ar mazu strāvas padevi</translation>
 <translation id="2135456203358955318">Dokota lupa</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Pārslēgt loga kopsavilkumu</translation>
 <translation id="2338501278241028356">Ieslēdziet Bluetooth, lai atklātu tuvumā esošas ierīces</translation>
 <translation id="2339073806695260576">Pieskarieties skārienekrāna pildspalvas pogai plauktā, lai veiktu piezīmes, uzņemtu ekrānuzņēmumus, izmantotu lāzera rādītāju vai lupu.</translation>
+<translation id="2341729377289034582">Bloķēts vertikāli</translation>
 <translation id="2352467521400612932">Skārienekrāna pildspalvas iestatījumi</translation>
 <translation id="2354174487190027830">Notiek <ph name="NAME" /> aktivizēšana.</translation>
 <translation id="2359808026110333948">Turpināt</translation>
 <translation id="2365393535144473978">Iespējojot mobilos datus, tiks iespējots Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Pārslēgt režīmu “Netraucēt”</translation>
 <translation id="2412593942846481727">Ir pieejams atjauninājums</translation>
+<translation id="2416346634399901812">Izveidots savienojums ar tīklu <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth ierīce “<ph name="DEVICE_NAME" />” vēlas saņemt atļauju, lai izveidotu savienojumu pārī. Pirms piekrītat, lūdzu, pārliecinieties, vai ierīcē tiek parādīta šī ieejas atslēga: <ph name="PASSKEY" />.</translation>
 <translation id="2482878487686419369">Paziņojumi</translation>
 <translation id="2484513351006226581">Nospiediet īsinājumtaustiņu <ph name="KEYBOARD_SHORTCUT" />, lai pārslēgtu tastatūras izkārtojumu.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Pievienot savienojumu</translation>
 <translation id="2961963223658824723">Radās problēma. Pēc dažām sekundēm mēģiniet vēlreiz.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Rādīt apraides ierīces</translation>
 <translation id="2996462380875591307">Dokotās lupas režīms ir iespējots. Lai to izslēgtu, nospiediet taustiņu kombināciju Ctrl+Search+D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> ir publiska sesija, kas tiek pārvaldīta domēnā <ph name="DOMAIN" />.</translation>
 <translation id="3000461861112256445">Mono audio</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobilie dati</translation>
 <translation id="3151786313568798007">Orientācija</translation>
 <translation id="3153444934357957346">Vairākkārtējas pierakstīšanās laikā var izmantot ne vairāk kā <ph name="MULTI_PROFILE_USER_LIMIT" /> kontus.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Savienots ar ierīci}zero{Savienots ar # ierīcēm}one{Savienots ar # ierīci}other{Savienots ar # ierīcēm}}</translation>
 <translation id="3236488194889173876">Mobilais tīkls nav pieejams</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="3294437725009624529">Viesis</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Bloķēt</translation>
 <translation id="3798670284305777884">Skaļrunis (iebūvētais)</translation>
 <translation id="380165613292957338">Sveicināti! Kā varu palīdzēt?</translation>
+<translation id="383629559565718788">Rādīt tastatūras iestatījumus</translation>
 <translation id="3846575436967432996">Tīkla informācija nav pieejama.</translation>
 <translation id="385051799172605136">Atpakaļ</translation>
 <translation id="3891340733213178823">Lai izrakstītos, divas reizes nospiediet taustiņu kombināciju Ctrl+Shift+Q.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Vidēji spēcīgs signāls</translation>
 <translation id="4200057768455216496">Jūs nospiedāt dokotās lupas īsinājumtaustiņu. Vai vēlaties to ieslēgt?</translation>
 <translation id="4217571870635786043">Diktēšana</translation>
+<translation id="4261870227682513959">Rādīt paziņojumu iestatījumus. Paziņojumi ir izslēgti</translation>
 <translation id="4274921305979314545">Izveidojiet sava Chromebook datora un tālruņa savienojumu</translation>
 <translation id="4279490309300973883">Spoguļošana</translation>
+<translation id="4292681942966152062">Notiek tīkla <ph name="NETWORK_NAME" /> aktivizēšana</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lupa</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Pēc iestatījumu sinhronizēšanas valoda tika mainīta no “<ph name="FROM_LOCALE" />” uz “<ph name="TO_LOCALE" />”.</translation>
 <translation id="574392208103952083">Vidējs</translation>
 <translation id="5744083938413354016">Vilkšana pieskaroties</translation>
+<translation id="5750765938512549687">Bluetooth ir izslēgts</translation>
 <translation id="5777841717266010279">Vai apturēt ekrāna koplietošanu?</translation>
 <translation id="57838592816432529">Izslēgt skaņu</translation>
 <translation id="5805697420284793859">Logu pārvaldnieks</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Rādīt ekrāna tastatūru</translation>
 <translation id="6164005077879661055">Visi faili un lokālie dati, kas ir saistīti ar uzraudzīto lietotāju, tiks neatgriezeniski dzēsti, tiklīdz uzraudzītais lietotājs tiks noņemts. Iespējams, pārzinis joprojām varēs skatīt šī uzraudzītā lietotāja apmeklētās vietnes un iestatījumus (vietnē <ph name="MANAGEMENT_URL" />).</translation>
 <translation id="6165508094623778733">Uzziniet vairāk</translation>
+<translation id="6254629735336163724">Bloķēts horizontāli</translation>
 <translation id="6259254695169772643">Atlasīšanai izmantojiet skārienekrāna pildspalvu.</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: notiek aktivizēšana...</translation>
 <translation id="6284232397434400372">Izšķirtspēja nomainīta</translation>
 <translation id="6297287540776456956">Izmantojiet skārienekrāna pildspalvu, lai atlasītu ekrāna daļu.</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> tika pagriezts šādi: <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Tastatūras pārklājums</translation>
+<translation id="6376931439017688372">Bluetooth ir ieslēgts</translation>
 <translation id="639644700271529076">Funkcija CAPS LOCK ir izslēgta.</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Viss gatavs</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Jūsu administrators atspējoja šo tīklu.</translation>
 <translation id="7067196344162293536">Pagriezt automātiski</translation>
 <translation id="7076293881109082629">Pierakstīšanās</translation>
+<translation id="7092922358121866860">Rādīt nakts režīma iestatījumus</translation>
 <translation id="7098389117866926363">USB-C ierīce (pieslēgvieta aizmugurē pa kreisi)</translation>
 <translation id="7131634465328662194">Jūs tiksiet automātiski izrakstīts.</translation>
 <translation id="7143207342074048698">Notiek savienojuma izveide</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Lai atceltu, nospiediet meklēšanas vai pārslēgšanas taustiņu.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> un <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Spēcīgs signāls</translation>
+<translation id="7842211907556571265">Notiek savienojuma izveide ar tīklu <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Brīdinājums: šī ir eksperimentāla funkcija!</translation>
 <translation id="7846634333498149051">Tastatūra</translation>
 <translation id="790040513076446191">Manipulēt ar konfidencialitāti saistītus iestatījumus</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: notiek atkārtota savienojuma izveide…</translation>
 <translation id="8513108775083588393">Automātiska pagriešana</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> ierīce, iespējams, netiks uzlādēta, kamēr tā būs ieslēgta.</translation>
+<translation id="8627191004499078455">Izveidots savienojums ar ierīci (<ph name="DEVICE_NAME" />)</translation>
 <translation id="8639760480004882931">Atlicis: <ph name="PERCENTAGE" />%</translation>
 <translation id="8649101189709089199">Atlasīt, lai izrunātu</translation>
 <translation id="8652175077544655965">Aizvērt iestatījumus</translation>
+<translation id="8653151467777939995">Rādīt paziņojumu iestatījumus. Paziņojumi ir ieslēgti</translation>
+<translation id="8664753092453405566">Rādīt tīklu sarakstu. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Pievienots lādētājs ar mazu strāvas padevi</translation>
 <translation id="8683506306463609433">Veiktspējas izsekošana ir aktīva</translation>
 <translation id="8734991477317290293">Tā, iespējams, mēģina piesavināties jūsu taustiņsitienus</translation>
+<translation id="8735953464173050365">Rādīt tastatūras iestatījumus. Ir atlasīta tastatūra <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Rādīt VPN iestatījumus</translation>
 <translation id="8809737090443522491">Ievadiet lietotnes vai dokumenta nosaukumu</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Spoguļošana ar vairāk nekā diviem ekrāniem netiek atbalstīta.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Poga Atpakaļ</translation>
+<translation id="8843682306134542540">Pārslēgt pagriešanas bloķēšanu. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">Lietotnē netiek atbalstīta ekrāna sadalīšana.</translation>
 <translation id="8874184842967597500">Savienojums nav izveidots</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index 205a56d..177b1ef4 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ചേർത്തു</translation>
 <translation id="1056775291175587022">നെറ്റ്‌വർക്കുകളൊന്നും ഇല്ല</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">പ്രവേശനക്ഷമത ക്രമീകരണം കാണിക്കുക</translation>
 <translation id="1104621072296271835">നിങ്ങളുടെ ഉപകരണങ്ങൾ 'ഒരുമിച്ചും' നന്നായി പ്രവർത്തിക്കും</translation>
 <translation id="112308213915226829">ഷെൽഫ് സ്വയമേവ മറയ്‌ക്കുക</translation>
 <translation id="1153356358378277386">ജോടിയാക്കിയ ഉപകരണങ്ങൾ</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">ദുർബലമായ സിഗ്നൽ</translation>
 <translation id="1293264513303784526">USB-C ഉപകരണം (ഇടത് പോർട്ട്)</translation>
+<translation id="1302880136325416935">Bluetooth ക്രമീകരണം കാണിക്കുക. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">ശരി</translation>
 <translation id="1351937230027495976">മെനു ചുരുക്കുക</translation>
 <translation id="1383876407941801731">തിരയൂ</translation>
 <translation id="1467432559032391204">ഇടത്</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">ലോഞ്ചർ</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. ഒരു ആപ്പിന് അറിയിപ്പുകൾ ഓഫാണ്}other{അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. # ആപ്പുകൾക്ക് അറിയിപ്പുകൾ ഓഫാണ്}}</translation>
 <translation id="1525508553941733066">നിരാകരിക്കുക</translation>
 <translation id="1537254971476575106">പൂർണ്ണസ്‌ക്രീൻ മാഗ്‌നിഫയർ</translation>
 <translation id="15373452373711364">വലിയ മൗസ് കഴ്‌സർ</translation>
 <translation id="1550523713251050646">കൂടുതൽ ഓപ്‌ഷനുകൾക്ക് ക്ലിക്കുചെയ്യുക</translation>
 <translation id="1567387640189251553">നിങ്ങൾ അവസാനം പാസ്‍വേഡ് നൽകിയത് മുതൽ ഒരു വ്യത്യസ്ത കീബോഡ് കണക്റ്റ് ചെയ്‌തിട്ടുണ്ട്. ഇത് നിങ്ങളുടെ കീസ്ട്രോക്കുകൾ മോഷ്‌ടിക്കാൻ ശ്രമിച്ചേക്കാം.</translation>
+<translation id="1570871743947603115">Bluetooth മാറ്റുക. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">ഈ ഉപയോക്താവിനെ നീക്കംചെയ്യുക</translation>
 <translation id="1621499497873603021">ബാറ്ററി ശൂന്യമാകുന്നതിന് ശേഷിക്കുന്ന സമയം, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">ക്ഷമിക്കണം, ഇപ്പോഴും നിങ്ങളുടെ പാസ്‌വേഡ് പരിശോധിച്ചുറപ്പിക്കാൻ കഴിഞ്ഞില്ല. ശ്രദ്ധിക്കുക: സമീപകാലത്ത് നിങ്ങൾ പാസ്‌വേഡ് മാറ്റിയിട്ടുണ്ടെങ്കിൽ, സൈൻ ഔട്ട് ചെയ്‌തുകഴിഞ്ഞാൽ പുതിയ പാസ്‌വേഡ് ബാധകമാകും, ഇവിടെ പഴയ പാസ്‌വേഡ് ഉപയോഗിക്കുക.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">തിരിച്ചറിഞ്ഞില്ല</translation>
 <translation id="1746730358044914197">ഇൻപുട്ട് രീതികൾ കോൺഫിഗർ ചെയ്യുന്നത് നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്ററാണ്.</translation>
 <translation id="1747827819627189109">ഓൺ‌ സ്‌ക്രീൻ കീ‌ബോർഡ് പ്രവർത്തനക്ഷമമാക്കി</translation>
+<translation id="1761222317188459878">നെറ്റ്‌വർക്ക് കണക്ഷൻ മാറ്റുക. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">ഇതർനെറ്റ്: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">സഹായി (ലോഡുചെയ്യുന്നു...)</translation>
 <translation id="1841545962859478868">ഉപകരണ അഡ്‌മിൻ ഇനിപ്പറയുന്നവ നിരീക്ഷിച്ചേക്കാം:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">ഈ ഉപകരണം നിയന്ത്രിക്കുന്നത് <ph name="DOMAIN" /> ആണ്.</translation>
 <translation id="2050339315714019657">ഛായാചിത്രം</translation>
 <translation id="2067602449040652523">കീബോർഡ് തെളിച്ചം</translation>
+<translation id="2075212959500165896">വളരെയധികം ശ്രമങ്ങൾ. പിന്നീട് വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2081529251031312395">$1 എന്ന വ്യക്തിക്ക് പിന്നീട് സൈൻ ഇൻ ചെയ്യാവുന്നതാണ്.</translation>
 <translation id="2127372758936585790">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ</translation>
 <translation id="2135456203358955318">ഡോക്ക് ചെയ്‌ത മാഗ്‌നിഫയർ</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">വിൻഡോ ചുരുക്കവിവരണം ടോഗിൾ ചെയ്യുക</translation>
 <translation id="2338501278241028356">സമീപത്തുള്ള ഉപകരണങ്ങൾ കണ്ടെത്താൻ Bluetooth ഓണാക്കുക</translation>
 <translation id="2339073806695260576">കുറിപ്പ്, സ്‌ക്രീന്‍ഷോട്ട്, എന്നിവ എടുക്കാനും ലേസർ പോയിന്‍ററോ ഭൂതക്കണ്ണാടിയോ ഉപയോഗിക്കാനും ഷെൽഫിലെ സ്‌റ്റൈലസ് ബട്ടൺ ടാപ്പ് ചെയ്യുക.</translation>
+<translation id="2341729377289034582">ലംബമായി ലോക്ക് ചെയ്‌തു</translation>
 <translation id="2352467521400612932">സ്റ്റൈലസ് ക്രമീകരണം</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> സജീവമാക്കുന്നു</translation>
 <translation id="2359808026110333948">തുടരൂ</translation>
 <translation id="2365393535144473978">മൊബൈൽ ഡാറ്റ പ്രവർത്തനക്ഷമമാക്കുമ്പോൾ Bluetooth-ഉം പ്രവർത്തനക്ഷമമാകും.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">'ശല്യപ്പെടുത്തരുത്' മാറ്റുക</translation>
 <translation id="2412593942846481727">അപ്‌ഡേറ്റ് ലഭ്യമാണ്</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> നെറ്റ്‌വർക്കിലേക്ക് കണക്‌റ്റ് ചെയ്‌തു</translation>
 <translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" എന്ന Bluetooth ഉപകരണം ജോടിയാക്കുന്നതിനുള്ള അനുമതി ആവശ്യപ്പെടുന്നു. അനുമതി നൽകുന്നതിനുമുമ്പ്, ആ ഉപകരണത്തിൽ ഈ പാസ്‌കീ കാണിച്ചിരിക്കുന്നുവെന്ന് സ്ഥിരീകരിക്കുക: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">വിജ്ഞാപനങ്ങള്‍‌</translation>
 <translation id="2484513351006226581">കീബോര്‍‌ഡ് ലേഔട്ട് മാറാൻ <ph name="KEYBOARD_SHORTCUT" /> അമർത്തുക.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">കണക്ഷൻ ചേർക്കുക</translation>
 <translation id="2961963223658824723">എന്തോ കുഴപ്പം സംഭവിച്ചു. അൽപ്പസമയത്തിനുള്ളിൽ വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">കാസ്‌റ്റ് ഉപകരണങ്ങൾ കാണിക്കുക.</translation>
 <translation id="2996462380875591307">ഡോക്ക് ചെയ്‌ത മാഗ്നിഫയർ പ്രവർത്തനക്ഷമമാക്കി. ഇത് മാറ്റാൻ, കൺട്രോൾ+തിരയൽ+D വീണ്ടും അമർത്തുക.</translation>
 <translation id="2999742336789313416"><ph name="DOMAIN" /> നിയന്ത്രിക്കുന്ന എല്ലാവർക്കുമുള്ള ഒരു സെഷനാണ് <ph name="DISPLAY_NAME" /></translation>
 <translation id="3000461861112256445">മോണോ ഓഡിയോ</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">മൊബൈല്‍ ഡാറ്റ</translation>
 <translation id="3151786313568798007">ഓറിയന്റേഷൻ</translation>
 <translation id="3153444934357957346">ഒന്നിലധികം സൈൻ ഇന്നുകളിൽ നിങ്ങൾക്ക് <ph name="MULTI_PROFILE_USER_LIMIT" /> അക്കൗണ്ടുകൾ വരെ മാത്രമേ ഉണ്ടായിരിക്കാൻ പാടുള്ളൂ.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ഒരു ഉപകരണത്തിലേക്ക് കണക്റ്റ് ചെയ്‌തു}other{# ഉപകരണങ്ങളിലേക്ക് കണക്റ്റ് ചെയ്‌തു}}</translation>
 <translation id="3236488194889173876">മൊബൈൽ നെറ്റ്‌വർക്ക് ലഭ്യമല്ല</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">അതിഥി</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">ലോക്കുചെയ്യുക</translation>
 <translation id="3798670284305777884">സ്‌പീക്കർ (ഇന്റേണൽ)</translation>
 <translation id="380165613292957338">ഹായ്, എന്ത് സഹായമാണ് വേണ്ടത്?</translation>
+<translation id="383629559565718788">കീബോഡ് ക്രമീകരണം കാണിക്കുക</translation>
 <translation id="3846575436967432996">നെറ്റ്‌വർക്ക് വിവരങ്ങളൊന്നും ലഭ്യമല്ല</translation>
 <translation id="385051799172605136">പിന്നോട്ട്</translation>
 <translation id="3891340733213178823">സൈൻ ഔട്ട് ചെയ്യുന്നതിന് രണ്ടു‌തവണ Ctrl+Shift+Q അമർത്തുക.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">ഇടത്തരം സിഗ്നൽ</translation>
 <translation id="4200057768455216496">നിങ്ങൾ ഡോക്ക് ചെയ്‌ത മാഗ്നിഫയറിനുള്ള കുറുക്കുവഴി അമർത്തി. അത് ഓണാക്കണോ?</translation>
 <translation id="4217571870635786043">പറഞ്ഞ് കൊടുക്കൽ</translation>
+<translation id="4261870227682513959">അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. അറിയിപ്പുകൾ ഓഫാണ്</translation>
 <translation id="4274921305979314545">നിങ്ങളുടെ ഫോൺ ഉപയോഗിച്ച് Chromebook കണക്റ്റ് ചെയ്യുക</translation>
 <translation id="4279490309300973883">മിററിംഗ്</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> സജീവമാക്കുന്നു</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">മാഗ്‌നിഫൈയിംഗ് ഗ്ലാസ്</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">നിങ്ങളുടെ ക്രമീകരണം സമന്വയിപ്പിച്ചതിന് ശേഷം, "<ph name="FROM_LOCALE" />" എന്നതിൽ നിന്ന്"<ph name="TO_LOCALE" />" എന്നതിലേക്ക്.</translation>
 <translation id="574392208103952083">ഇടത്തരം</translation>
 <translation id="5744083938413354016">ടാപ്പുചെയ്‌ത് വലിച്ചിടൽ</translation>
+<translation id="5750765938512549687">Bluetooth ഓഫാണ്</translation>
 <translation id="5777841717266010279">സ്‌ക്രീൻ പങ്കിടൽ നിർത്തണോ?</translation>
 <translation id="57838592816432529">മ്യൂട്ടുചെയ്യുക</translation>
 <translation id="5805697420284793859">വിൻഡോ മാനേജർ</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">ഓൺ-സ്‌ക്രീൻ കീബോർഡ് ദൃശ്യമാക്കുക</translation>
 <translation id="6164005077879661055">സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവിനെ നീക്കംചെയ്‌താൽ, സൂപ്പർവൈസുചെയ്‌ത ഉപയോക്താവുമായി ബന്ധപ്പെടുത്തിയിട്ടുള്ള എല്ലാ ഫയലുകളും പ്രാദേശിക ഡാറ്റയും ശാശ്വതമായി ഇല്ലാതാക്കപ്പെടും. സൂപ്പർവൈസുചെയ്‌ത ഈ ഉപയോക്താവിനായി സന്ദർശിച്ച വെബ്‌സൈറ്റുകളും ക്രമീകരണങ്ങളും <ph name="MANAGEMENT_URL" />-ൽ മാനേജർക്ക് തുടർന്നും കാണാനായേക്കും.</translation>
 <translation id="6165508094623778733">കൂടുതൽ‍ മനസിലാക്കുക</translation>
+<translation id="6254629735336163724">സമാന്തരമായി ലോക്ക് ചെയ്‌തു</translation>
 <translation id="6259254695169772643">തിരഞ്ഞെടുക്കാൻ നിങ്ങളുടെ സ്റ്റൈലസ് ഉപയോഗിക്കുക</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: സജീവമാക്കുന്നു...</translation>
 <translation id="6284232397434400372">റെസല്യൂഷൻ മാറ്റി</translation>
 <translation id="6297287540776456956">ആവശ്യമുള്ള ഏരിയ തിരഞ്ഞെടുക്കാൻ സ്റ്റൈലസ് ഉപയോഗിക്കുക</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> എന്നതിനെ <ph name="ROTATION" /> എന്നതിലേയ്‌ക്ക് തിരിച്ചു</translation>
 <translation id="632744581670418035">കീബോർഡ് ഓവർലേ</translation>
+<translation id="6376931439017688372">Bluetooth ഓണാണ്</translation>
 <translation id="639644700271529076">CAPS LOCK ഓഫാണ്</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">എല്ലാം ചെയ്‌തു</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റർ ഈ നെറ്റ്‌വർക്ക് പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="7067196344162293536">സ്വയമേവ തിരിക്കുക</translation>
 <translation id="7076293881109082629">സൈൻ ഇൻ ചെയ്യുന്നു</translation>
+<translation id="7092922358121866860">നൈറ്റ് ‌ലൈറ്റ് ക്രമീകരണം കാണിക്കുക</translation>
 <translation id="7098389117866926363">USB-C ഉപകരണം (പുറകിൽ ഇടതുവശത്തെ പോർട്ട്)</translation>
 <translation id="7131634465328662194">നിങ്ങൾ സ്വമേധയാ സൈൻ ഔട്ടാകും.</translation>
 <translation id="7143207342074048698">കണക്റ്റുചെയ്യുന്നു</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">റദ്ദാക്കാൻ 'തിരയൽ' അല്ലെങ്കിൽ Shift അമർത്തുക.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" />, <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">ശക്തിയുള്ള സിഗ്നൽ</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> നെറ്റ്‌വർക്കിലേക്ക് കണക്‌റ്റ് ചെയ്യുന്നു</translation>
 <translation id="7842569679327885685">മുന്നറിയിപ്പ്: പരീക്ഷണാത്മക ഫീച്ചർ</translation>
 <translation id="7846634333498149051">കീബോർഡ്</translation>
 <translation id="790040513076446191">സ്വകാര്യത സംബന്ധിയായ ക്രമീകരണങ്ങൾ കൈകാര്യം ചെയ്യുക</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: വീണ്ടും കണക്‌റ്റുചെയ്യുന്നു...</translation>
 <translation id="8513108775083588393">സ്വയം തിരിയുക</translation>
 <translation id="8517041960877371778">നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> ഓണായിരിക്കുമ്പോൾ അത് ചാർജ്ജാകാതിരിക്കാം.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> ഉപകരണത്തിലേക്ക് കണക്റ്റ് ചെയ്‌തു</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> ശേഷിക്കുന്നു</translation>
 <translation id="8649101189709089199">വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="8652175077544655965">ക്രമീകരണം അടയ്ക്കുക</translation>
+<translation id="8653151467777939995">അറിയിപ്പ് ക്രമീകരണം കാണിക്കുക. അറിയിപ്പുകൾ ഓണാണ്</translation>
+<translation id="8664753092453405566">നെറ്റ്‌വർക്ക് ലിസ്റ്റ് കാണിക്കുക. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">കുറഞ്ഞ തോതിൽ വൈദ്യുതി പ്രവഹിക്കുന്ന ചാർജർ കണക്റ്റുചെയ്‌തു</translation>
 <translation id="8683506306463609433">പ്രകടനം പിന്തുടരൽ സജീവം</translation>
 <translation id="8734991477317290293">ഇത് നിങ്ങളുടെ കീസ്ട്രോക്കുകൾ മോഷ്‌ടിക്കാൻ ശ്രമിച്ചേക്കാം.</translation>
+<translation id="8735953464173050365">കീബോഡ് ക്രമീകരണം കാണിക്കുക. <ph name="KEYBOARD_NAME" /> തിരഞ്ഞെടുത്തിരിക്കുന്നു</translation>
+<translation id="875593634123171288">VPN ക്രമീകരണം കാണിക്കുക</translation>
 <translation id="8809737090443522491">ഒരു ആപ്പിന്റെയോ ഡോക്യുമെന്റിന്റെയോ പേര് ടൈപ്പ് ചെയ്യുക</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">രണ്ടിലധികം ഡിസ്‌പ്ലേകളിൽ മിററിംഗ് ചെയ്യുന്നത് പിന്തുണയ്‌ക്കുന്നില്ല.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">ബാക്ക് ബട്ടൺ</translation>
+<translation id="8843682306134542540">റൊട്ടേഷൻ ലോക്ക് മാറ്റുക. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">തിരയൽ+Esc</translation>
 <translation id="8870509716567206129">സ്പ്ലിറ്റ്-സ്ക്രീനിനെ ആപ്പ് പിന്തുണയ്ക്കുന്നില്ല.</translation>
 <translation id="8874184842967597500">കണക്റ്റുചെയ്‌തിട്ടില്ല</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb
index f50e7ea..188f457 100644
--- a/ash/strings/ash_strings_ms.xtb
+++ b/ash/strings/ash_strings_ms.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> ditambahkan</translation>
 <translation id="1056775291175587022">Tiada rangkaian</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Tunjukkan tetapan kebolehaksesan</translation>
 <translation id="1104621072296271835">Peranti anda akan berfungsi lebih baik bersama-sama</translation>
 <translation id="112308213915226829">Autosembunyi rak</translation>
 <translation id="1153356358378277386">Peranti digandingkan</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Isyarat lemah</translation>
 <translation id="1293264513303784526">Peranti USB-C (port kiri)</translation>
+<translation id="1302880136325416935">Tunjukkan tetapan Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Kanan</translation>
 <translation id="1351937230027495976">Runtuhkan menu</translation>
 <translation id="1383876407941801731">Carian</translation>
 <translation id="1467432559032391204">Kiri</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Pelancar</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Tunjukkan tetapan pemberitahuan. Pemberitahuan dimatikan untuk satu apl}other{Tunjukkan tetapan pemberitahuan. Pemberitahuan dimatikan untuk # apl}}</translation>
 <translation id="1525508553941733066">KETEPIKAN</translation>
 <translation id="1537254971476575106">Penggadang skrin penuh</translation>
 <translation id="15373452373711364">Kursor tetikus besar</translation>
 <translation id="1550523713251050646">Klik untuk mendapatkan lagi pilihan</translation>
 <translation id="1567387640189251553">Papan kekunci lain telah disambungkan sejak kali terakhir anda memasukkan kata laluan. Papan kekunci ini mungkin sedang cuba mencuri ketukan kekunci anda.</translation>
+<translation id="1570871743947603115">Togol Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Alih keluar pengguna ini</translation>
 <translation id="1621499497873603021">Masa yang tinggal sehingga bateri kosong, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Maaf, kata laluan anda masih tidak dapat disahkan. Perhatian: jika anda menukar kata laluan anda baru-baru ini, kata laluan baharu anda akan digunakan apabila anda log keluar, sila gunakan kata laluan yang lama di sini.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Tidak dikenali</translation>
 <translation id="1746730358044914197">Kaedah masukan dikonfigurasi oleh pentadbir anda.</translation>
 <translation id="1747827819627189109">Papan kekunci pada skrin didayakan</translation>
+<translation id="1761222317188459878">Togol sambungan rangkaian. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Pembantu (memuat...)</translation>
 <translation id="1841545962859478868">Pentadbir peranti boleh memantau perkara berikut:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Peranti ini diuruskan oleh <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Potret</translation>
 <translation id="2067602449040652523">Kecerahan papan kekunci</translation>
+<translation id="2075212959500165896">Terlalu banyak percubaan. Cuba lagi nanti.</translation>
 <translation id="2081529251031312395">$1 masih dapat log masuk nanti.</translation>
 <translation id="2127372758936585790">Pengecas berkuasa rendah</translation>
 <translation id="2135456203358955318">Penggadang didok</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Togol gambaran keseluruhan tetingkap</translation>
 <translation id="2338501278241028356">Hidupkan Bluetooth untuk menemui peranti berdekatan</translation>
 <translation id="2339073806695260576">Ketik butang stilus pada rak untuk mencatat nota, mengambil tangkapan skrin, menggunakan penuding laser atau kanta pembesar.</translation>
+<translation id="2341729377289034582">Dikunci menegak</translation>
 <translation id="2352467521400612932">Tetapan stilus</translation>
 <translation id="2354174487190027830">Mengaktifkan <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Teruskan</translation>
 <translation id="2365393535144473978">Tindakan mendayakan data mudah alih akan turut mendayakan Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Togol Jangan ganggu</translation>
 <translation id="2412593942846481727">Kemas kini tersedia</translation>
+<translation id="2416346634399901812">Disambungkan ke <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Peranti Bluetooth "<ph name="DEVICE_NAME" />" ingin kebenaran untuk berpasangan. Sebelum menerimanya, sila sahkan bahawa kekunci laluan ini dipaparkan pada peranti tersebut: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Pemberitahuan</translation>
 <translation id="2484513351006226581">Tekan <ph name="KEYBOARD_SHORTCUT" /> untuk menukar atur letak papan kekunci.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Tambah sambungan</translation>
 <translation id="2961963223658824723">Maaf, kesilapan telah berlaku. Cuba lagi dalam beberapa saat.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Tunjukkan peranti cast.</translation>
 <translation id="2996462380875591307">Penggadang Didok didayakan. Tekan Ctrl+Cari+D semula untuk mematikannya.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> ialah sesi awam yang diurus oleh <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Audio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Data mudah alih</translation>
 <translation id="3151786313568798007">Orientasi</translation>
 <translation id="3153444934357957346">Anda hanya boleh memiliki sehingga <ph name="MULTI_PROFILE_USER_LIMIT" /> akaun dalam log masuk berbilang.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Disambungkan ke peranti}other{Disambungkan ke # peranti}}</translation>
 <translation id="3236488194889173876">Tiada rangkaian mudah alih tersedia</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Tetamu</translation>
@@ -160,6 +171,7 @@
 <translation id="3784455785234192852">Kunci</translation>
 <translation id="3798670284305777884">Pembesar suara (dalaman)</translation>
 <translation id="380165613292957338">Hai, bagaimanakah saya boleh membantu?</translation>
+<translation id="383629559565718788">Tunjukkan tetapan papan kekunci</translation>
 <translation id="3846575436967432996">Tiada maklumat rangkaian tersedia</translation>
 <translation id="385051799172605136">Kembali</translation>
 <translation id="3891340733213178823">Tekan Ctrl+Shift+Q dua kali untuk keluar.</translation>
@@ -175,8 +187,10 @@
 <translation id="4072264167173457037">Isyarat sederhana</translation>
 <translation id="4200057768455216496">Anda menekan pintasan untuk penggadang yang didok. Adakah anda ingin menghidupkannya?</translation>
 <translation id="4217571870635786043">Pengimlakan</translation>
+<translation id="4261870227682513959">Tunjukkan tetapan pemberitahuan. Pemberitahuan dimatikan</translation>
 <translation id="4274921305979314545">Sambungkan Chromebook dengan telefon anda</translation>
 <translation id="4279490309300973883">Pencerminan</translation>
+<translation id="4292681942966152062">Mengaktifkan <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">OS Chrome</translation>
 <translation id="4338109981321384717">Kanta pembesar</translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Daripada "<ph name="FROM_LOCALE" />" kepada "<ph name="TO_LOCALE" />" selepas menyegerakkan tetapan anda.</translation>
 <translation id="574392208103952083">Sederhana</translation>
 <translation id="5744083938413354016">Penyeretan ketik</translation>
+<translation id="5750765938512549687">Bluetooth dimatikan</translation>
 <translation id="5777841717266010279">Hentikan perkongsian skrin?</translation>
 <translation id="57838592816432529">Redam</translation>
 <translation id="5805697420284793859">Pengurus tetingkap</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Paparkan papan kekunci pada skrin</translation>
 <translation id="6164005077879661055">Semua fail dan data setempat yang dikaitkan dengan pengguna diselia akan dipadamkan secara kekal apabila pengguna diselia ini dialih keluar. Tapak web yang dilawati dan tetapan untuk pengguna diselia ini masih boleh dilihat oleh pengurus di <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Ketahui lebih lanjut</translation>
+<translation id="6254629735336163724">Dikunci mendatar</translation>
 <translation id="6259254695169772643">Gunakan stilus anda untuk memilih</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Mengaktifkan...</translation>
 <translation id="6284232397434400372">Peleraian ditukar</translation>
 <translation id="6297287540776456956">Gunakan stilus untuk memilih bahagian</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> telah diputarkan ke <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Tindanan papan kekunci</translation>
+<translation id="6376931439017688372">Bluetooth dihidupkan</translation>
 <translation id="639644700271529076">Kekunci CAPS LOCK dimatikan</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Selesai</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Rangkaian ini dilumpuhkan oleh pentadbir anda.</translation>
 <translation id="7067196344162293536">Auto putar</translation>
 <translation id="7076293881109082629">Melog masuk</translation>
+<translation id="7092922358121866860">Tunjukkan tetapan Cahaya Malam</translation>
 <translation id="7098389117866926363">Peranti USB-C (port kiri di belakang)</translation>
 <translation id="7131634465328662194">Anda akan dilog keluar secara automatik.</translation>
 <translation id="7143207342074048698">Menyambung</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Tekan Search atau Shift untuk membatalkan.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> dan <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Isyarat kuat</translation>
+<translation id="7842211907556571265">Menyambung ke <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Amaran: Ciri percubaan</translation>
 <translation id="7846634333498149051">Papan kekunci</translation>
 <translation id="790040513076446191">Manipulasi tetapan yang berkaitan privasi</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Menyambung semula...</translation>
 <translation id="8513108775083588393">Autoputar</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> anda mungkin tidak akan dicas semasa dihidupkan.</translation>
+<translation id="8627191004499078455">Disambungkan ke <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Berbaki <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Pilih untuk Bercakap</translation>
 <translation id="8652175077544655965">Tutup tetapan</translation>
+<translation id="8653151467777939995">Tunjukkan tetapan pemberitahuan. Pemberitahuan dihidupkan</translation>
+<translation id="8664753092453405566">Tunjukkan senarai rangkaian. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Pengecas berkuasa rendah disambungkan</translation>
 <translation id="8683506306463609433">Pengesanan prestasi aktif</translation>
 <translation id="8734991477317290293">Papan kekunci mungkin sedang cuba mencuri ketukan kekunci anda</translation>
+<translation id="8735953464173050365">Tunjukkan tetapan papan kekunci. <ph name="KEYBOARD_NAME" /> dipilih</translation>
+<translation id="875593634123171288">Tunjukkan tetapan VPN</translation>
 <translation id="8809737090443522491">Taip nama apl atau dokumen</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Pencerminan menggunakan lebih daripada dua paparan tidak disokong.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Butang kembali</translation>
+<translation id="8843682306134542540">Togol kunci putaran. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Carian+Esc</translation>
 <translation id="8870509716567206129">Apl tidak menyokong skrin pisah.</translation>
 <translation id="8874184842967597500">Tidak bersambung</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb
index 2519b9a..6e77c201 100644
--- a/ash/strings/ash_strings_nl.xtb
+++ b/ash/strings/ash_strings_nl.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> toegevoegd</translation>
 <translation id="1056775291175587022">Geen netwerken</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Toegankelijkheidsinstellingen weergeven</translation>
 <translation id="1104621072296271835">Je apparaten werken samen nog beter</translation>
 <translation id="112308213915226829">Plank automatisch verbergen</translation>
 <translation id="1153356358378277386">Gekoppelde apparaten</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Zwak signaal</translation>
 <translation id="1293264513303784526">USB-C-apparaat (poort aan linkerkant)</translation>
+<translation id="1302880136325416935">Bluetooth-instellingen weergeven. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Rechts</translation>
 <translation id="1351937230027495976">Menu samenvouwen</translation>
 <translation id="1383876407941801731">Zoeken</translation>
 <translation id="1467432559032391204">Links</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Launcher</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Instellingen voor meldingen weergeven. Meldingen zijn uitgeschakeld voor een app}other{Instellingen voor meldingen weergeven. Meldingen zijn uitgeschakeld voor # apps}}</translation>
 <translation id="1525508553941733066">SLUITEN</translation>
 <translation id="1537254971476575106">Volledig scherm vergroten</translation>
 <translation id="15373452373711364">Grote muisaanwijzer</translation>
 <translation id="1550523713251050646">Klik voor meer opties</translation>
 <translation id="1567387640189251553">Er is een ander toetsenbord aangesloten sinds de laatste keer dat je je wachtwoord hebt ingevoerd. Mogelijk wordt geprobeerd om je toetsaanslagen te stelen.</translation>
+<translation id="1570871743947603115">Bluetooth schakelen. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Deze gebruiker verwijderen</translation>
 <translation id="1621499497873603021">Resterende tijd totdat de batterij leeg is: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Je wachtwoord kan nog steeds niet worden geverifieerd. Opmerking: Als je je wachtwoord onlangs hebt gewijzigd, wordt je nieuwe wachtwoord doorgevoerd wanneer je uitlogt. Gebruik hier het oude wachtwoord.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Niet herkend</translation>
 <translation id="1746730358044914197">Invoermethoden worden ingesteld door je beheerder.</translation>
 <translation id="1747827819627189109">Schermtoetsenbord ingeschakeld</translation>
+<translation id="1761222317188459878">Netwerkverbinding schakelen. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (laden...)</translation>
 <translation id="1841545962859478868">De apparaatbeheerder kan het volgende controleren:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Dit apparaat wordt beheerd door <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Staand</translation>
 <translation id="2067602449040652523">Toetsenbordhelderheid</translation>
+<translation id="2075212959500165896">Te veel pogingen. Probeer het later opnieuw.</translation>
 <translation id="2081529251031312395">$1 kan later nog inloggen.</translation>
 <translation id="2127372758936585790">Laag-vermogen-lader</translation>
 <translation id="2135456203358955318">Gedockt vergrootglas</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Overzicht venster in-/uitschakelen</translation>
 <translation id="2338501278241028356">Schakel Bluetooth in om apparaten in de buurt te vinden</translation>
 <translation id="2339073806695260576">Tik op de stylusknop op de plank om een notitie of screenshot te maken, of om de Assistent, de laserpen of het vergrootglas te gebruiken.</translation>
+<translation id="2341729377289034582">Vergrendeld in verticale stand</translation>
 <translation id="2352467521400612932">Stylusinstellingen</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> activeren</translation>
 <translation id="2359808026110333948">Doorgaan</translation>
 <translation id="2365393535144473978">Als je mobiele data inschakelt, wordt Bluetooth ingeschakeld.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">'Niet storen' schakelen</translation>
 <translation id="2412593942846481727">Update beschikbaar</translation>
+<translation id="2416346634399901812">Verbonden met <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth-apparaat '<ph name="DEVICE_NAME" />' wil toestemming om te koppelen. Bevestig vóór het accepteren dat de volgende toegangscode op dat apparaat wordt weergegeven: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Meldingen</translation>
 <translation id="2484513351006226581">Druk op <ph name="KEYBOARD_SHORTCUT" /> om van toetsenbordindeling te wisselen.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Verbinding toevoegen</translation>
 <translation id="2961963223658824723">Er is iets misgegaan. Probeer het over een paar seconden opnieuw.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Cast-apparaten weergeven.</translation>
 <translation id="2996462380875591307">'Gedockt vergrootglas' is ingeschakeld. Druk nogmaals op Ctrl+Zoeken+D om dit uit te schakelen.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> is een openbare sessie die wordt beheerd door <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monogeluid</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobiele data</translation>
 <translation id="3151786313568798007">Stand</translation>
 <translation id="3153444934357957346">Je kunt maximaal <ph name="MULTI_PROFILE_USER_LIMIT" /> accounts hebben in Toegang tot meerdere accounts.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Verbonden met een apparaat}other{Verbonden met # apparaten}}</translation>
 <translation id="3236488194889173876">Geen mobiel netwerk beschikbaar</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gast</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Vergrendelen</translation>
 <translation id="3798670284305777884">Luidspreker (intern)</translation>
 <translation id="380165613292957338">Hallo, hoe kan ik je helpen?</translation>
+<translation id="383629559565718788">Toetsenbordinstellingen weergeven</translation>
 <translation id="3846575436967432996">Geen netwerkinformatie beschikbaar</translation>
 <translation id="385051799172605136">Vorige</translation>
 <translation id="3891340733213178823">Druk twee keer op Ctrl+Shift+Q om uit te loggen.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Normaal signaal</translation>
 <translation id="4200057768455216496">Je hebt op de sneltoets voor het gedockte vergrootglas gedrukt. Wil je deze functie inschakelen?</translation>
 <translation id="4217571870635786043">Dicteren</translation>
+<translation id="4261870227682513959">Instellingen voor meldingen weergeven. Meldingen zijn uitgeschakeld</translation>
 <translation id="4274921305979314545">Koppel je Chromebook aan je telefoon</translation>
 <translation id="4279490309300973883">Mirroring</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> activeren</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Vergrootglas</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Van '<ph name="FROM_LOCALE" />' naar '<ph name="TO_LOCALE" />' na synchronisatie van je instellingen.</translation>
 <translation id="574392208103952083">Gemiddeld</translation>
 <translation id="5744083938413354016">Tikken en slepen</translation>
+<translation id="5750765938512549687">Bluetooth is uitgeschakeld</translation>
 <translation id="5777841717266010279">Stoppen met scherm delen?</translation>
 <translation id="57838592816432529">Dempen</translation>
 <translation id="5805697420284793859">Vensterbeheer</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Schermtoetsenbord weergeven</translation>
 <translation id="6164005077879661055">Alle bestanden en lokale gegevens gekoppeld aan de gebruiker met beperkte rechten worden permanent verwijderd zodra de gebruiker met beperkte rechten is verwijderd. Bezochte websites en instellingen voor deze gebruiker met beperkte rechten kunnen nog steeds zichtbaar zijn voor de beheerder op <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Meer informatie</translation>
+<translation id="6254629735336163724">Vergrendeld in horizontale stand</translation>
 <translation id="6259254695169772643">Gebruik je stylus om te selecteren</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: activeren...</translation>
 <translation id="6284232397434400372">Resolutie gewijzigd</translation>
 <translation id="6297287540776456956">Gebruik de stylus om een gebied te selecteren</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> is gedraaid naar <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Overlay voor toetsenbord</translation>
+<translation id="6376931439017688372">Bluetooth is ingeschakeld</translation>
 <translation id="639644700271529076">CAPS LOCK is uitgeschakeld</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Klaar</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Dit netwerk is uitgeschakeld door je beheerder.</translation>
 <translation id="7067196344162293536">Automatisch draaien</translation>
 <translation id="7076293881109082629">Inloggen</translation>
+<translation id="7092922358121866860">Instellingen voor Nachtverlichting weergeven</translation>
 <translation id="7098389117866926363">USB-C-apparaat (poort links aan de achterkant)</translation>
 <translation id="7131634465328662194">Je wordt automatisch uitgelogd.</translation>
 <translation id="7143207342074048698">Verbinding maken</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Druk op Zoeken of Shift om te annuleren.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> en <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Sterk signaal</translation>
+<translation id="7842211907556571265">Verbinding maken met <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Waarschuwing: Experimentele functie</translation>
 <translation id="7846634333498149051">Toetsenbord</translation>
 <translation id="790040513076446191">Privacygerelateerde instellingen manipuleren</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Opnieuw verbinding maken...</translation>
 <translation id="8513108775083588393">Automatisch draaien</translation>
 <translation id="8517041960877371778">Je <ph name="DEVICE_TYPE" /> wordt mogelijk niet opgeladen terwijl deze is ingeschakeld.</translation>
+<translation id="8627191004499078455">Verbonden met <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> resterend</translation>
 <translation id="8649101189709089199">Selecteer om uitgesproken te worden</translation>
 <translation id="8652175077544655965">Instellingen sluiten</translation>
+<translation id="8653151467777939995">Instellingen voor meldingen weergeven. Meldingen zijn ingeschakeld</translation>
+<translation id="8664753092453405566">Netwerklijst weergeven. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Laag-vermogen-lader aangesloten</translation>
 <translation id="8683506306463609433">Bijhouden van prestaties is actief</translation>
 <translation id="8734991477317290293">Mogelijk wordt geprobeerd om je toetsaanslagen te stelen</translation>
+<translation id="8735953464173050365">Toetsenbordinstellingen weergeven. <ph name="KEYBOARD_NAME" /> is geselecteerd</translation>
+<translation id="875593634123171288">VPN-instellingen weergeven</translation>
 <translation id="8809737090443522491">Typ de naam van een app of document</translation>
 <translation id="8814190375133053267">Wifi</translation>
 <translation id="8825534185036233643">Mirroring met meer dan twee displays wordt niet ondersteund.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Knop Terug</translation>
+<translation id="8843682306134542540">Draaivergrendeling schakelen. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Zoeken+Esc</translation>
 <translation id="8870509716567206129">App biedt geen ondersteuning voor gesplitst scherm.</translation>
 <translation id="8874184842967597500">Niet verbonden</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index e72146ee..1257d6258 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> er lagt til</translation>
 <translation id="1056775291175587022">Ingen nettverk</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Vis innstillinger for tilgjengelighet</translation>
 <translation id="1104621072296271835">Enhetene fungerer enda bedre sammen</translation>
 <translation id="112308213915226829">Skjul hyllen automatisk</translation>
 <translation id="1153356358378277386">Tilkoblede enheter</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Svakt signal</translation>
 <translation id="1293264513303784526">USB-C-enhet (porten på venstre side)</translation>
+<translation id="1302880136325416935">Vis Bluetooth-innstillinger <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Høyre</translation>
 <translation id="1351937230027495976">Skjul menyen</translation>
 <translation id="1383876407941801731">Søk</translation>
 <translation id="1467432559032391204">Venstre</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Appvelger</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Vis innstillinger for varsler Varsler er slått av for en app}other{Vis innstillinger for varsler Varsler er slått av for # apper}}</translation>
 <translation id="1525508553941733066">AVVIS</translation>
 <translation id="1537254971476575106">Lupe for hele skjermen</translation>
 <translation id="15373452373711364">Stor markør</translation>
 <translation id="1550523713251050646">Klikk for å se flere alternativer</translation>
 <translation id="1567387640189251553">Et annet tastatur er koblet til etter at du sist skrev inn passordet ditt. Det brukes kanskje til å stjele tastetrykkene dine.</translation>
+<translation id="1570871743947603115">Slå av/på Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Fjern denne brukeren</translation>
 <translation id="1621499497873603021">Gjenværende tid til batteriet er tomt – <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Beklager, men passordet ditt kunne fremdeles ikke bekreftes. Merk: Hvis du endret passordet ditt nylig, trer det nye passordet ditt i kraft så snart du logger av. Bruk det gamle passordet ditt her.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Ikke gjenkjent</translation>
 <translation id="1746730358044914197">Inndatametoder konfigureres av administratoren din.</translation>
 <translation id="1747827819627189109">Skjermtastaturet er aktivert</translation>
+<translation id="1761222317188459878">Slå av/på nettverkstilkobling. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (laster inn …)</translation>
 <translation id="1841545962859478868">Enhetsadministratoren kan overvåke følgende:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Denne enheten administreres av <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2067602449040652523">Lysstyrke på tastaturet</translation>
+<translation id="2075212959500165896">For mange forsøk. Prøv igjen senere.</translation>
 <translation id="2081529251031312395">$1 kan likevel logge på senere.</translation>
 <translation id="2127372758936585790">Lading med lav effekt</translation>
 <translation id="2135456203358955318">Dokket lupe</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Vis eller skjul vindusoversikten</translation>
 <translation id="2338501278241028356">Slå på Bluetooth for å finne enheter i nærheten</translation>
 <translation id="2339073806695260576">Trykk på pekepennknappen på hyllen for å ta et notat, ta en skjermdump, bruke laserpekeren eller bruke forstørrelsesglasset.</translation>
+<translation id="2341729377289034582">Låst til vertikal</translation>
 <translation id="2352467521400612932">Innstillinger for pekepenn</translation>
 <translation id="2354174487190027830">Aktiverer <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Fortsett</translation>
 <translation id="2365393535144473978">Hvis du slår på mobildata, blir Bluetooth også slått på.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Slå «ikke forstyrr» på eller av</translation>
 <translation id="2412593942846481727">En oppdatering er tilgjengelig</translation>
+<translation id="2416346634399901812">Koblet til <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth-enheten «<ph name="DEVICE_NAME" />» ber om tillatelse til å koble til. Før du godtar dette, må du bekrefte at denne tilgangskoden vises på den aktuelle enheten: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Varsler</translation>
 <translation id="2484513351006226581">Trykk på <ph name="KEYBOARD_SHORTCUT" /> for å bytte tastaturoppsett.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Legg til forbindelse</translation>
 <translation id="2961963223658824723">Noe gikk galt. Prøv på nytt om noen sekunder.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Vis Cast-enheter.</translation>
 <translation id="2996462380875591307">Dokket lupe er slått på. Trykk på Ctrl + Søk + D igjen for å slå det av.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> er en offentlig økt administrert av <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monolyd</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151786313568798007">Retning</translation>
 <translation id="3153444934357957346">Du kan bare ha opptil <ph name="MULTI_PROFILE_USER_LIMIT" /> kontoer i multipålogging.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Koble til en enhet}other{Koble til # enheter}}</translation>
 <translation id="3236488194889173876">Ingen mobilnettverk er tilgjengelige</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gjest</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Lås</translation>
 <translation id="3798670284305777884">Høyttaler (intern)</translation>
 <translation id="380165613292957338">Hei! Hva kan jeg hjelpe deg med?</translation>
+<translation id="383629559565718788">Vis tastaturinnstillinger</translation>
 <translation id="3846575436967432996">Ingen nettverksinformasjon tilgjengelig</translation>
 <translation id="385051799172605136">Tilbake</translation>
 <translation id="3891340733213178823">Trykk på Control+Shift+Q to ganger for å logge av.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Middels sterkt signal</translation>
 <translation id="4200057768455216496">Du trykket på snarveien for den dokkede lupen. Vil du slå den på?</translation>
 <translation id="4217571870635786043">Diktering</translation>
+<translation id="4261870227682513959">Vis innstillinger for varsler. Varsler er av.</translation>
 <translation id="4274921305979314545">Koble Chromebook til telefonen</translation>
 <translation id="4279490309300973883">Speiling</translation>
+<translation id="4292681942966152062">Aktiverer <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Forstørrelsesglass</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Fra «<ph name="FROM_LOCALE" />» til «<ph name="TO_LOCALE" />» etter at innstillingene dine ble synkronisert.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5744083938413354016">Trykk-og-dra</translation>
+<translation id="5750765938512549687">Bluetooth er av</translation>
 <translation id="5777841717266010279">Vil du stoppe skjermdelingen?</translation>
 <translation id="57838592816432529">Kutt lyden</translation>
 <translation id="5805697420284793859">Window Manager</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Vis skjermtastaturet</translation>
 <translation id="6164005077879661055">Alle filer og lokale data tilknyttet den administrerte brukeren slettes permanent når den administrerte brukeren fjernes. Besøkte nettsteder og innstillinger for denne administrerte brukeren kan fortsatt ses av administratoren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Les mer</translation>
+<translation id="6254629735336163724">Låst til horisontal</translation>
 <translation id="6259254695169772643">Bruk pekepennen til å velge</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: aktiveres …</translation>
 <translation id="6284232397434400372">Oppløsningen er endret</translation>
 <translation id="6297287540776456956">Bruk pekepennen til å velge et område</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ble rotert til <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Tastaturoverlegg</translation>
+<translation id="6376931439017688372">Bluetooth er aktivert</translation>
 <translation id="639644700271529076">CAPS LOCK er av</translation>
 <translation id="6406704438230478924">alt gr</translation>
 <translation id="643147933154517414">Ingen varsler</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Administratoren din har slått av dette nettverket.</translation>
 <translation id="7067196344162293536">Automatisk retning</translation>
 <translation id="7076293881109082629">Pålogging</translation>
+<translation id="7092922358121866860">Vis innstillinger for nattlys</translation>
 <translation id="7098389117866926363">USB-C-enhet (venstre port på baksiden)</translation>
 <translation id="7131634465328662194">Du logges av automatisk.</translation>
 <translation id="7143207342074048698">Kobler til</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Trykk på Søk eller Shift for å avbryte</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> og <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Sterkt signal</translation>
+<translation id="7842211907556571265">Kobler til <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Advarsel: Funksjon på forsøksstadiet</translation>
 <translation id="7846634333498149051">Tastatur</translation>
 <translation id="790040513076446191">manipulere personvernrelaterte innstillinger</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Kobler til på nytt ...</translation>
 <translation id="8513108775083588393">Automatisk rotasjon</translation>
 <translation id="8517041960877371778">Det kan hende at din <ph name="DEVICE_TYPE" /> ikke lader når den er slått på.</translation>
+<translation id="8627191004499078455">Koblet til <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> igjen</translation>
 <translation id="8649101189709089199">Tekstopplesing</translation>
 <translation id="8652175077544655965">Lukk innstillingene</translation>
+<translation id="8653151467777939995">Vis innstillinger for varsler. Varsler er på</translation>
+<translation id="8664753092453405566">Vis nettverksliste. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Laveffektslader er tilkoblet</translation>
 <translation id="8683506306463609433">Ytelsessporing er aktiv</translation>
 <translation id="8734991477317290293">Det brukes kanskje til å stjele tastetrykkene dine.</translation>
+<translation id="8735953464173050365">Vis tastaturinnstillinger. <ph name="KEYBOARD_NAME" /> er valgt</translation>
+<translation id="875593634123171288">Vis innstillinger for VPN</translation>
 <translation id="8809737090443522491">Skriv inn navnet på en app eller et dokument</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Speiling med mer enn to skjermer støttes ikke.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Tilbakeknapp</translation>
+<translation id="8843682306134542540">Slå av/på rotasjonslås. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Søk+Esc</translation>
 <translation id="8870509716567206129">Appen støtter ikke delt skjerm.</translation>
 <translation id="8874184842967597500">Ikke tilkoblet</translation>
@@ -418,7 +443,7 @@
 <translation id="8984179138335769204">Hurtigtaster</translation>
 <translation id="8995603266996330174">Drevet av <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">En oppdatering av Adobe Flash Player er tilgjengelig</translation>
-<translation id="9056839673611986238">Enheten vil hentes tilbake</translation>
+<translation id="9056839673611986238">Enheten blir hentet tilbake</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">Mikrofonen er i bruk.</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb
index b10b60c3..1562df96 100644
--- a/ash/strings/ash_strings_pl.xtb
+++ b/ash/strings/ash_strings_pl.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Dodano urządzenie <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Brak sieci</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Pokaż ustawienia ułatwień dostępu</translation>
 <translation id="1104621072296271835">Razem Twoje urządzenia mogą jeszcze więcej</translation>
 <translation id="112308213915226829">Autoukrywanie półki</translation>
 <translation id="1153356358378277386">Sparowane urządzenia</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">słaby sygnał</translation>
 <translation id="1293264513303784526">Urządzenie USB-C (lewy port)</translation>
+<translation id="1302880136325416935">Pokaż ustawienia Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">W prawo</translation>
 <translation id="1351937230027495976">Zwiń menu</translation>
 <translation id="1383876407941801731">Szukaj</translation>
 <translation id="1467432559032391204">W lewo</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Program uruchamiający</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Pokaż ustawienia powiadomień. Jedna aplikacja ma wyłączone powiadomienia.}few{Pokaż ustawienia powiadomień. # aplikacje mają wyłączone powiadomienia.}many{Pokaż ustawienia powiadomień. # aplikacji ma wyłączone powiadomienia.}other{Pokaż ustawienia powiadomień. # aplikacji ma wyłączone powiadomienia.}}</translation>
 <translation id="1525508553941733066">ZAMKNIJ</translation>
 <translation id="1537254971476575106">Lupa pełnego ekranu</translation>
 <translation id="15373452373711364">Duży kursor myszy</translation>
 <translation id="1550523713251050646">Kliknij, by wyświetlić więcej opcji</translation>
 <translation id="1567387640189251553">Do urządzenia jest podłączona inna klawiatura niż przy ostatnim wpisywaniu hasła. Może ona próbować przechwycić naciskane klawisze.</translation>
+<translation id="1570871743947603115">Włącz lub wyłącz Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Usuń tego użytkownika</translation>
 <translation id="1621499497873603021">Czas pozostały do wyczerpania baterii: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Nadal nie można zweryfikować Twojego hasła. Uwaga: jeśli ostatnio hasło było zmieniane, nowe hasło zostanie zastosowane, gdy się wylogujesz. Tu podaj stare hasło.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Nie rozpoznano</translation>
 <translation id="1746730358044914197">Metody wprowadzania zostały skonfigurowane przez administratora.</translation>
 <translation id="1747827819627189109">Klawiatura ekranowa włączona</translation>
+<translation id="1761222317188459878">Włącz lub wyłącz połączenie sieciowe. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asystent (ładuję…)</translation>
 <translation id="1841545962859478868">Administrator urządzenia może monitorować te zdarzenia:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">To urządzenie jest zarządzane przez: <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Pionowo</translation>
 <translation id="2067602449040652523">Jasność klawiatury</translation>
+<translation id="2075212959500165896">Zbyt wiele prób. Spróbuj ponownie później.</translation>
 <translation id="2081529251031312395">$1 może się wciąż zalogować później.</translation>
 <translation id="2127372758936585790">Ładowarka o małej mocy</translation>
 <translation id="2135456203358955318">Lupa zadokowana</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Przełącz widok ogólny okna</translation>
 <translation id="2338501278241028356">Włącz Bluetooth, by wykryć urządzenia w pobliżu</translation>
 <translation id="2339073806695260576">Kliknij przycisk rysika na półce, by zrobić notatkę lub zrzut ekranu albo użyć wskaźnika laserowego bądź lupy.</translation>
+<translation id="2341729377289034582">Zablokowano w orientacji pionowej</translation>
 <translation id="2352467521400612932">Ustawienia rysika</translation>
 <translation id="2354174487190027830">Aktywuję <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Dalej</translation>
 <translation id="2365393535144473978">Wraz z mobilną transmisją danych zostanie włączony Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Włącz lub wyłącz tryb Nie przeszkadzać</translation>
 <translation id="2412593942846481727">Dostępna aktualizacja</translation>
+<translation id="2416346634399901812">Połączono z siecią <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Urządzenie Bluetooth „<ph name="DEVICE_NAME" />” chce się sparować. Zanim to zaakceptujesz, sprawdź, czy na tym urządzeniu wyświetla się klucz: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Powiadomienia</translation>
 <translation id="2484513351006226581">Naciśnij <ph name="KEYBOARD_SHORTCUT" />, by przełączyć układ klawiatury.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Dodaj połączenie</translation>
 <translation id="2961963223658824723">Coś poszło nie tak. Spróbuj ponownie za kilka sekund.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Pokaż urządzenia przesyłające.</translation>
 <translation id="2996462380875591307">Lupa zadokowana została włączona. Aby ją wyłączyć, naciśnij ponownie Ctrl+Search+D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> jest publiczną sesją zarządzaną przez <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Dźwięk mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Komórkowa transmisja danych</translation>
 <translation id="3151786313568798007">Orientacja</translation>
 <translation id="3153444934357957346">W wielokrotnym logowaniu nie możesz mieć więcej kont niż <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Połączono z urządzeniem}few{Połączono z # urządzeniami}many{Połączono z # urządzeniami}other{Połączono z # urządzenia}}</translation>
 <translation id="3236488194889173876">Brak dostępnych sieci komórkowych</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gość</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Zablokuj</translation>
 <translation id="3798670284305777884">Głośnik (wewnętrzny)</translation>
 <translation id="380165613292957338">Cześć, w czym mogę pomóc?</translation>
+<translation id="383629559565718788">Pokaż ustawienia klawiatury</translation>
 <translation id="3846575436967432996">Brak informacji o sieciach</translation>
 <translation id="385051799172605136">Wstecz</translation>
 <translation id="3891340733213178823">Naciśnij dwukrotnie Ctrl+Shift+Q, by się wylogować.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">średni sygnał</translation>
 <translation id="4200057768455216496">Naciśnięto skrót lupy zadokowanej. Czy chcesz ją włączyć?</translation>
 <translation id="4217571870635786043">Dyktowanie</translation>
+<translation id="4261870227682513959">Pokaż ustawienia powiadomień. Powiadomienia są wyłączone.</translation>
 <translation id="4274921305979314545">Połącz Chromebooka z telefonem</translation>
 <translation id="4279490309300973883">Odbicie lustrzane</translation>
+<translation id="4292681942966152062">Włączam: <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Z języka: „<ph name="FROM_LOCALE" />” na „<ph name="TO_LOCALE" />” po zsynchronizowaniu ustawień.</translation>
 <translation id="574392208103952083">Średni</translation>
 <translation id="5744083938413354016">Przeciąganie dotykiem</translation>
+<translation id="5750765938512549687">Bluetooth jest wyłączony</translation>
 <translation id="5777841717266010279">Zakończyć udostępnianie ekranu?</translation>
 <translation id="57838592816432529">Wycisz</translation>
 <translation id="5805697420284793859">Menedżer okien</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Pokaż klawiaturę ekranową</translation>
 <translation id="6164005077879661055">W chwili usunięcia użytkownika nadzorowanego wszystkie powiązane z nim pliki i dane lokalne zostaną trwale usunięte. Lista stron, na które wszedł ten użytkownik, oraz jego ustawienia mogą być wciąż widoczne dla menedżera na <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Więcej informacji</translation>
+<translation id="6254629735336163724">Zablokowano w orientacji poziomej</translation>
 <translation id="6259254695169772643">Zaznacz rysikiem</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: aktywuję...</translation>
 <translation id="6284232397434400372">Rozdzielczość została zmieniona</translation>
 <translation id="6297287540776456956">Zaznacz obszar rysikiem</translation>
 <translation id="6310121235600822547">Wyświetlacz <ph name="DISPLAY_NAME" /> został obrócony na <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Nakładka klawiatury</translation>
+<translation id="6376931439017688372">Bluetooth jest włączony</translation>
 <translation id="639644700271529076">CAPS LOCK jest wyłączony</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Wszystko gotowe</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Ta sieć została wyłączona przez administratora.</translation>
 <translation id="7067196344162293536">Obracanie automatyczne</translation>
 <translation id="7076293881109082629">Loguję</translation>
+<translation id="7092922358121866860">Pokaż ustawienia Podświetlenia nocnego</translation>
 <translation id="7098389117866926363">Urządzenie USB-C (lewy port z tyłu)</translation>
 <translation id="7131634465328662194">Nastąpi automatyczne wylogowanie.</translation>
 <translation id="7143207342074048698">Łączenie</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Aby anulować, naciśnij Szukaj lub Shift.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> i <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">silny sygnał</translation>
+<translation id="7842211907556571265">Łączę z siecią <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Ostrzeżenie: funkcja eksperymentalna</translation>
 <translation id="7846634333498149051">Klawiatura</translation>
 <translation id="790040513076446191">Manipulować ustawieniami ochrony prywatności</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: ponownie łączę...</translation>
 <translation id="8513108775083588393">Autoobracanie</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> nie może się ładować, gdy jest włączony.</translation>
+<translation id="8627191004499078455">Połączono z urządzeniem <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Pozostało <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Przeczytaj na głos</translation>
 <translation id="8652175077544655965">Zamknij ustawienia</translation>
+<translation id="8653151467777939995">Pokaż ustawienia powiadomień. Powiadomienia są włączone</translation>
+<translation id="8664753092453405566">Pokaż listę sieci. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Podłączono ładowarkę o małej mocy</translation>
 <translation id="8683506306463609433">Śledzenie wydajności jest aktywne</translation>
 <translation id="8734991477317290293">Klawiatura może próbować przechwycić naciskane klawisze</translation>
+<translation id="8735953464173050365">Pokaż ustawienia klawiatury. Wybrana jest: <ph name="KEYBOARD_NAME" />.</translation>
+<translation id="875593634123171288">Pokaż ustawienia VPN</translation>
 <translation id="8809737090443522491">Wpisz nazwę aplikacji lub dokumentu</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Odbicie lustrzane na więcej niż dwóch wyświetlaczach nie jest obsługiwane.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Przycisk Wstecz</translation>
+<translation id="8843682306134542540">Włącz lub wyłącz blokadę obracania. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Szukaj+Esc</translation>
 <translation id="8870509716567206129">Aplikacja nie obsługuje dzielonego ekranu.</translation>
 <translation id="8874184842967597500">Brak połączenia</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb
index 85cce9e..5f6691a1 100644
--- a/ash/strings/ash_strings_pt-BR.xtb
+++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> adicionado</translation>
 <translation id="1056775291175587022">Nenhuma rede encontrada</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Mostrar configurações de acessibilidade</translation>
 <translation id="1104621072296271835">Seus dispositivos funcionam ainda melhor juntos</translation>
 <translation id="112308213915226829">Ocultar estante automaticamente</translation>
 <translation id="1153356358378277386">Dispositivos pareados</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Sinal fraco</translation>
 <translation id="1293264513303784526">Dispositivo USB-C (porta da esquerda)</translation>
+<translation id="1302880136325416935">Mostrar configurações de Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Para a direita</translation>
 <translation id="1351937230027495976">Recolher menu</translation>
 <translation id="1383876407941801731">Pesquisar</translation>
 <translation id="1467432559032391204">Para a esquerda</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Iniciador</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostrar configurações de notificação. As notificações estão desativadas para um app}one{Mostrar configurações de notificação. As notificações estão desativadas para # app}other{Mostrar configurações de notificação. As notificações estão desativadas para # apps}}</translation>
 <translation id="1525508553941733066">DISPENSAR</translation>
 <translation id="1537254971476575106">Lupa de tela cheia</translation>
 <translation id="15373452373711364">Cursor grande do mouse</translation>
 <translation id="1550523713251050646">Clique para ver mais opções</translation>
 <translation id="1567387640189251553">Um teclado diferente foi conectado desde a última vez que você inseriu sua senha. Ele pode estar tentando capturar sua digitação.</translation>
+<translation id="1570871743947603115">Alternar Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Remover este usuário</translation>
 <translation id="1621499497873603021">O tempo restante até que a bateria se esgote é de <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Ainda não foi possível confirmar sua senha. Observação: se você alterou sua senha recentemente, a nova senha será aplicada depois que você sair da conta. Use a senha antiga aqui.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Não reconhecida</translation>
 <translation id="1746730358044914197">Os métodos de entrada são configurados pelo administrador.</translation>
 <translation id="1747827819627189109">Teclado na tela ativado</translation>
+<translation id="1761222317188459878">Alternar conexão de rede. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistente (carregando…)</translation>
 <translation id="1841545962859478868">O administrador do dispositivo pode monitorar o seguinte:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Este dispositivo é gerenciado por <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Retrato</translation>
 <translation id="2067602449040652523">Brilho do teclado</translation>
+<translation id="2075212959500165896">Excesso de tentativas. Tente novamente mais tarde.</translation>
 <translation id="2081529251031312395">$1 ainda pode fazer login mais tarde.</translation>
 <translation id="2127372758936585790">Carregador de baixa potência</translation>
 <translation id="2135456203358955318">Lupa ancorada</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Visão geral da janela de alternância</translation>
 <translation id="2338501278241028356">Ativar o Bluetooth para descobrir dispositivos nas proximidades</translation>
 <translation id="2339073806695260576">Toque no botão da stylus na estante para criar uma nota, fazer uma captura de tela e usar o apontador laser ou a lupa.</translation>
+<translation id="2341729377289034582">Bloqueado na vertical</translation>
 <translation id="2352467521400612932">Configurações da stylus</translation>
 <translation id="2354174487190027830">Ativando <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2365393535144473978">A ativação dos dados móveis também ativará o Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Alternar "Não perturbe"</translation>
 <translation id="2412593942846481727">Atualização disponível</translation>
+<translation id="2416346634399901812">Conectado a <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">O dispositivo Bluetooth "<ph name="DEVICE_NAME" />" deseja permissão para realizar o pareamento. Antes de aceitar, verifique se esta senha aparece no dispositivo: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Notificações</translation>
 <translation id="2484513351006226581">Pressione <ph name="KEYBOARD_SHORTCUT" /> para alterar o layout do teclado.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Adicionar conexão</translation>
 <translation id="2961963223658824723">Algo deu errado. Tente novamente em alguns segundos.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Mostrar dispositivos de transmissão.</translation>
 <translation id="2996462380875591307">Lupa ancorada ativada. Pressione Ctrl+Pesquisa+D novamente para desativá-la.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> é uma sessão pública gerenciada por <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Áudio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Dados do celular</translation>
 <translation id="3151786313568798007">Orientação</translation>
 <translation id="3153444934357957346">Só é possível ter até <ph name="MULTI_PROFILE_USER_LIMIT" /> contas em login múltiplo.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectado a um dispositivo}one{Conectado a # dispositivo}other{Conectado a # dispositivos}}</translation>
 <translation id="3236488194889173876">Nenhuma rede móvel disponível</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Visitante</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Bloquear</translation>
 <translation id="3798670284305777884">Alto-falante (interno)</translation>
 <translation id="380165613292957338">Oi! Como posso ajudar?</translation>
+<translation id="383629559565718788">Mostrar configurações do teclado</translation>
 <translation id="3846575436967432996">Não há informações de rede disponíveis</translation>
 <translation id="385051799172605136">Voltar</translation>
 <translation id="3891340733213178823">Pressione Ctrl+Shift+Q duas vezes para sair.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Sinal médio</translation>
 <translation id="4200057768455216496">Você pressionou o atalho para a lupa ancorada. Gostaria de ativá-la?</translation>
 <translation id="4217571870635786043">Ditado</translation>
+<translation id="4261870227682513959">Mostrar configurações de notificação. As notificações estão desativadas</translation>
 <translation id="4274921305979314545">Conecte o Chromebook ao seu smartphone</translation>
 <translation id="4279490309300973883">Espelhamento</translation>
+<translation id="4292681942966152062">Ativando <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">De "<ph name="FROM_LOCALE" />" para "<ph name="TO_LOCALE" />" após a sincronização das suas configurações.</translation>
 <translation id="574392208103952083">Médio</translation>
 <translation id="5744083938413354016">Arrastar com toque</translation>
+<translation id="5750765938512549687">Bluetooth desativado</translation>
 <translation id="5777841717266010279">Interromper compartilhamento de tela?</translation>
 <translation id="57838592816432529">Desativar som</translation>
 <translation id="5805697420284793859">Gerenciador de janelas</translation>
@@ -274,12 +289,14 @@
 <translation id="6164005077879661055">Todos os arquivos e dados locais associados ao usuário supervisionado serão
 permanentemente excluídos assim que esse usuário for removido. Os websites visitados por esse usuário supervisionado e suas configurações ainda poderão ser vistos pelo administrador em <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saiba mais</translation>
+<translation id="6254629735336163724">Bloqueado na horizontal</translation>
 <translation id="6259254695169772643">Use a stylus para selecionar</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Ativando...</translation>
 <translation id="6284232397434400372">Resolução alterada</translation>
 <translation id="6297287540776456956">Use a stylus para selecionar uma região</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> foi substituída por <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Sobreposição do teclado</translation>
+<translation id="6376931439017688372">Bluetooth ativado</translation>
 <translation id="639644700271529076">CAPS LOCK está desativado</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Pronto</translation>
@@ -323,6 +340,7 @@
 <translation id="7066646422045619941">Esta rede foi desativada pelo seu administrador.</translation>
 <translation id="7067196344162293536">Rotação automática</translation>
 <translation id="7076293881109082629">Como fazer login</translation>
+<translation id="7092922358121866860">Mostrar configurações de Modo noturno</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (porta traseira da esquerda)</translation>
 <translation id="7131634465328662194">Você será automaticamente desconectado.</translation>
 <translation id="7143207342074048698">Conectando</translation>
@@ -358,6 +376,7 @@
 <translation id="7798302898096527229">Pressione Pesquisar ou Shift para cancelar.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> e <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Sinal forte</translation>
+<translation id="7842211907556571265">Conectando-se a <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Aviso: recurso experimental</translation>
 <translation id="7846634333498149051">Teclado</translation>
 <translation id="790040513076446191">Manipular as configurações relacionadas à privacidade</translation>
@@ -398,18 +417,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: reconectando…</translation>
 <translation id="8513108775083588393">Girar automaticamente</translation>
 <translation id="8517041960877371778">Seu <ph name="DEVICE_TYPE" /> pode não ser carregado enquanto estiver ligado.</translation>
+<translation id="8627191004499078455">Conectado a <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> restante(s)</translation>
 <translation id="8649101189709089199">Selecionar para ouvir</translation>
 <translation id="8652175077544655965">Fechar configurações</translation>
+<translation id="8653151467777939995">Mostrar configurações de notificação. As notificações estão ativadas</translation>
+<translation id="8664753092453405566">Mostrar lista de redes. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Carregador de baixa potência conectado</translation>
 <translation id="8683506306463609433">Acompanhamento de desempenho ativo</translation>
 <translation id="8734991477317290293">Ele pode estar tentando capturar sua digitação</translation>
+<translation id="8735953464173050365">Mostrar configurações do teclado. <ph name="KEYBOARD_NAME" /> está selecionado</translation>
+<translation id="875593634123171288">Mostrar configurações de VPN</translation>
 <translation id="8809737090443522491">Digite o nome de um app ou documento</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Não há suporte para o espelhamento com mais de duas telas.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Botão "Voltar"</translation>
+<translation id="8843682306134542540">Alternar bloqueio de rotação. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Pesquisa+Esc</translation>
 <translation id="8870509716567206129">O app não é compatível com a divisão de tela.</translation>
 <translation id="8874184842967597500">Não conectado</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb
index 96d3210..f6758a6 100644
--- a/ash/strings/ash_strings_pt-PT.xtb
+++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> adicionado</translation>
 <translation id="1056775291175587022">Nenhuma rede</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Mostrar definições de acessibilidade</translation>
 <translation id="1104621072296271835">Os seus dispositivos funcionam ainda melhor juntos</translation>
 <translation id="112308213915226829">Ocultar prateleira automaticamente</translation>
 <translation id="1153356358378277386">Dispositivos sincronizados</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Sinal fraco</translation>
 <translation id="1293264513303784526">Dispositivo USB-C (porta esquerda)</translation>
+<translation id="1302880136325416935">Mostrar definições de Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Direita</translation>
 <translation id="1351937230027495976">Reduzir menu</translation>
 <translation id="1383876407941801731">Pesquisar</translation>
 <translation id="1467432559032391204">Esquerda</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Iniciador</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Mostrar definições de notificação. As notificações estão desativadas para uma aplicação}other{Mostrar definições de notificação. As notificações estão desativadas para # aplicações}}</translation>
 <translation id="1525508553941733066">IGNORAR</translation>
 <translation id="1537254971476575106">Lupa de ecrã inteiro</translation>
 <translation id="15373452373711364">Cursor do rato grande</translation>
 <translation id="1550523713251050646">Clicar para obter mais opções</translation>
 <translation id="1567387640189251553">Foi ligado um teclado diferente desde a última vez que introduziu a palavra-passe. É possível que esteja a tentar roubar os seus toques de teclas.</translation>
+<translation id="1570871743947603115">Ativar/desativar Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Remover este utilizador</translation>
 <translation id="1621499497873603021">Tempo restante até a bateria terminar, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Lamentamos, mas ainda não foi possível validar a sua palavra-passe. Nota: se alterou a palavra-passe recentemente, a nova palavra-passe será aplicada quando terminar sessão. Utilize a palavra-passe antiga aqui.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Não reconhecida</translation>
 <translation id="1746730358044914197">Os métodos de introdução são configurados pelo gestor.</translation>
 <translation id="1747827819627189109">Teclado no ecrã ativado</translation>
+<translation id="1761222317188459878">Ativar/desativar ligação de rede. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistente (a carregar...)</translation>
 <translation id="1841545962859478868">O gestor do dispositivo pode monitorizar o seguinte:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Este aparelho é gerido por <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Vertical</translation>
 <translation id="2067602449040652523">Brilho do teclado</translation>
+<translation id="2075212959500165896">Demasiadas tentativas. Tente novamente mais tarde.</translation>
 <translation id="2081529251031312395">$1 pode iniciar sessão mais tarde.</translation>
 <translation id="2127372758936585790">Carregador de baixo consumo</translation>
 <translation id="2135456203358955318">Lupa ancorada</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Ativar/desativar vista geral das janelas</translation>
 <translation id="2338501278241028356">Ativar o Bluetooth para detetar dispositivos próximos</translation>
 <translation id="2339073806695260576">Toque no botão da caneta stylus na prateleira para tirar uma nota, criar uma captura de ecrã, utilizar o ponteiro de laser ou a lupa.</translation>
+<translation id="2341729377289034582">Bloqueado na vertical</translation>
 <translation id="2352467521400612932">Definições da caneta stylus</translation>
 <translation id="2354174487190027830">A ativar <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Continuar</translation>
 <translation id="2365393535144473978">A ativação dos dados móveis ativa o Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Ativar/desativar opção Não incomodar</translation>
 <translation id="2412593942846481727">Atualização disponível</translation>
+<translation id="2416346634399901812">Ligado a <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">O dispositivo Bluetooth "<ph name="DEVICE_NAME" />" necessita de autorização para sincronizar. Antes de aceitar, confirme que esta chave está indicada nesse dispositivo: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Notificações</translation>
 <translation id="2484513351006226581">Prima <ph name="KEYBOARD_SHORTCUT" /> para mudar o esquema do teclado.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Adicionar ligação</translation>
 <translation id="2961963223658824723">Ocorreu um erro. Tente novamente dentro de alguns segundos.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Mostrar dispositivos de transmissão.</translation>
 <translation id="2996462380875591307">Lupa ancorada ativada. Prima Ctrl + Pesquisa + D novamente para a desativar.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> é uma sessão pública gerida por <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Áudio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Dados móveis</translation>
 <translation id="3151786313568798007">Orientação</translation>
 <translation id="3153444934357957346">Apenas pode ter, no máximo, <ph name="MULTI_PROFILE_USER_LIMIT" /> contas no início de sessão integrado.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ligado a um dispositivo}other{Ligado a # dispositivos}}</translation>
 <translation id="3236488194889173876">Nenhuma rede móvel disponível</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Convidado</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Bloquear</translation>
 <translation id="3798670284305777884">Altifalante (interno)</translation>
 <translation id="380165613292957338">Olá, como posso ajudar?</translation>
+<translation id="383629559565718788">Mostrar definições do teclado</translation>
 <translation id="3846575436967432996">Não existem informações de rede disponíveis</translation>
 <translation id="385051799172605136">Anterior</translation>
 <translation id="3891340733213178823">Prima Ctrl+Shift+Q duas vezes para terminar sessão.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Sinal médio</translation>
 <translation id="4200057768455216496">Premiu o atalho da lupa ancorada. Pretende ativá-la?</translation>
 <translation id="4217571870635786043">Ditado</translation>
+<translation id="4261870227682513959">Mostrar definições de notificação. As notificações estão desativadas</translation>
 <translation id="4274921305979314545">Associe o seu Chromebook ao seu telemóvel.</translation>
 <translation id="4279490309300973883">Espelhamento</translation>
+<translation id="4292681942966152062">A ativar <ph name="NETWORK_NAME" />…</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lupa</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">De "<ph name="FROM_LOCALE" />" para "<ph name="TO_LOCALE" />" após a sincronização das suas definições.</translation>
 <translation id="574392208103952083">Médio</translation>
 <translation id="5744083938413354016">Arrastamento através do toque</translation>
+<translation id="5750765938512549687">Bluetooth desativado</translation>
 <translation id="5777841717266010279">Parar a partilha do ecrã?</translation>
 <translation id="57838592816432529">Desativar som</translation>
 <translation id="5805697420284793859">Gestor de janelas</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Mostrar teclado no ecrã</translation>
 <translation id="6164005077879661055">Todos os ficheiros e dados locais associados ao utilizador supervisionado serão definitivamente eliminados depois de este utilizador supervisionado ser removido. Os Sites visitados e as definições deste utilizador supervisionado poderão continuar visíveis para o gestor em <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Saiba mais</translation>
+<translation id="6254629735336163724">Bloqueado na horizontal</translation>
 <translation id="6259254695169772643">Utilize a caneta stylus para selecionar.</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: a ativar...</translation>
 <translation id="6284232397434400372">Resolução alterada</translation>
 <translation id="6297287540776456956">Utilizar a canela stylus para selecionar uma área</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> foi rodado para <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Sobreposição de teclado</translation>
+<translation id="6376931439017688372">Bluetooth ativado</translation>
 <translation id="639644700271529076">CAPS LOCK está desativado</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Tudo concluído</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Esta rede foi desativada pelo gestor.</translation>
 <translation id="7067196344162293536">Rotação automática</translation>
 <translation id="7076293881109082629">Iniciar sessão</translation>
+<translation id="7092922358121866860">Mostrar definições de Luz noturna</translation>
 <translation id="7098389117866926363">Dispositivo USB-C (porta traseira esquerda)</translation>
 <translation id="7131634465328662194">A sessão será terminada automaticamente.</translation>
 <translation id="7143207342074048698">A ligar</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Prima Pesquisar ou Shift para cancelar.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> e <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Sinal forte</translation>
+<translation id="7842211907556571265">A ligar a <ph name="NETWORK_NAME" />…</translation>
 <translation id="7842569679327885685">Aviso: funcionalidade experimental</translation>
 <translation id="7846634333498149051">Teclado</translation>
 <translation id="790040513076446191">Manipular as definições relacionadas com privacidade</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: a restabelecer ligação...</translation>
 <translation id="8513108775083588393">Rotação automática</translation>
 <translation id="8517041960877371778">O <ph name="DEVICE_TYPE" /> pode não carregar enquanto estiver ligado.</translation>
+<translation id="8627191004499078455">Ligado a <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> restante</translation>
 <translation id="8649101189709089199">Selecionar para falar</translation>
 <translation id="8652175077544655965">Fechar definições</translation>
+<translation id="8653151467777939995">Mostrar definições de notificação. As notificações estão ativadas</translation>
+<translation id="8664753092453405566">Mostrar lista de redes. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Carregador de baixo consumo ligado</translation>
 <translation id="8683506306463609433">O rastreio do desempenho está ativo.</translation>
 <translation id="8734991477317290293">É possível que esteja a tentar roubar os seus toques de teclas.</translation>
+<translation id="8735953464173050365">Mostrar definições do teclado. <ph name="KEYBOARD_NAME" /> está selecionado</translation>
+<translation id="875593634123171288">Mostrar definições da VPN</translation>
 <translation id="8809737090443522491">Introduza o nome de uma aplicação ou de um documento.</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">O espelhamento com mais do que dois ecrãs não é suportado.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Botão Anterior</translation>
+<translation id="8843682306134542540">Ativar/desativar bloqueio de rotação. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Pesquisa+Esc</translation>
 <translation id="8870509716567206129">A aplicação não é compatível com o ecrã dividido.</translation>
 <translation id="8874184842967597500">Sem ligação</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb
index c5caf08..a4b995d 100644
--- a/ash/strings/ash_strings_ro.xtb
+++ b/ash/strings/ash_strings_ro.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">S-a adăugat <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Nu s-au găsit rețele</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Afișează setările de accesibilitate</translation>
 <translation id="1104621072296271835">Dispozitivele funcționează și mai bine împreună</translation>
 <translation id="112308213915226829">Ascundeți automat raftul</translation>
 <translation id="1153356358378277386">Dispozitive asociate</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Semnal slab</translation>
 <translation id="1293264513303784526">Dispozitiv USB-C (portul din stânga)</translation>
+<translation id="1302880136325416935">Afișează setările Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Dreapta</translation>
 <translation id="1351937230027495976">Restrânge meniul</translation>
 <translation id="1383876407941801731">Caută</translation>
 <translation id="1467432559032391204">Stânga</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Lansator</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Afișează setările pentru notificări. Notificările sunt dezactivate pentru o aplicație}few{Afișează setările pentru notificări. Notificările sunt dezactivate pentru # aplicații}other{Afișează setările pentru notificări. Notificările sunt dezactivate pentru # de aplicații}}</translation>
 <translation id="1525508553941733066">ÎNCHIDE</translation>
 <translation id="1537254971476575106">Lupă de ecran complet</translation>
 <translation id="15373452373711364">Cursor de mouse mare</translation>
 <translation id="1550523713251050646">Dă clic pentru mai multe opțiuni</translation>
 <translation id="1567387640189251553">A fost conectată o altă tastatură după ce ai introdus parola ultima dată. Aceasta ar putea încerca să înregistreze ce taste apeși.</translation>
+<translation id="1570871743947603115">Comută Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Eliminați acest utilizator</translation>
 <translation id="1621499497873603021">Timp rămas până la descărcarea bateriei: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Ne pare rău, parola tot nu a putut fi confirmată. Notă: dacă ți-ai schimbat recent parola, aceasta se va aplica după ce te deconectezi. Te rugăm să folosești aici parola veche.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Nu este recunoscută</translation>
 <translation id="1746730358044914197">Metodele de introducere a textului sunt configurate de administratorul tău.</translation>
 <translation id="1747827819627189109">Tastatură pe ecran activată</translation>
+<translation id="1761222317188459878">Comută conexiunea la rețea. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistent (se încarcă...)</translation>
 <translation id="1841545962859478868">Este posibil ca administratorul dispozitivului să monitorizeze următoarele:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Acest dispozitiv este gestionat de <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Portret</translation>
 <translation id="2067602449040652523">Luminozitatea tastaturii</translation>
+<translation id="2075212959500165896">Prea multe încercări. Încearcă din nou mai târziu.</translation>
 <translation id="2081529251031312395">$1 se poate conecta și mai târziu.</translation>
 <translation id="2127372758936585790">Încărcător de putere joasă</translation>
 <translation id="2135456203358955318">Lupă andocată</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Activați/Dezactivați prezentarea ferestrei</translation>
 <translation id="2338501278241028356">Pentru a descoperi dispozitivele din apropiere, activează Bluetooth</translation>
 <translation id="2339073806695260576">Atinge butonul creion de pe raft ca să creezi note și capturi de ecran, să folosești indicatorul laser sau lupa.</translation>
+<translation id="2341729377289034582">Blocată pe verticală</translation>
 <translation id="2352467521400612932">Setările creionului</translation>
 <translation id="2354174487190027830">Se activează <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Continuă</translation>
 <translation id="2365393535144473978">Activând datele mobile, se va activa Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Comută Nu deranja</translation>
 <translation id="2412593942846481727">Actualizare disponibilă</translation>
+<translation id="2416346634399901812">Conectat la <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Dispozitivul Bluetooth „<ph name="DEVICE_NAME" />” solicită permisiunea de a se conecta. Înainte de a continua, verificați dacă această parolă apare pe dispozitivul respectiv: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Notificări</translation>
 <translation id="2484513351006226581">Apasă <ph name="KEYBOARD_SHORTCUT" /> pentru a schimba aspectul tastaturii.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Adăugați o conexiune</translation>
 <translation id="2961963223658824723">A apărut o eroare. Încearcă din nou în câteva secunde.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Afișează dispozitivele de proiecție.</translation>
 <translation id="2996462380875591307">Lupa andocată este activată. Apasă din nou pe Ctrl + tasta de căutare + D pentru a o dezactiva.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> este o sesiune publică gestionată de <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Audio mono</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Date mobile</translation>
 <translation id="3151786313568798007">Orientare</translation>
 <translation id="3153444934357957346">Conectarea multiplă acceptă maximum <ph name="MULTI_PROFILE_USER_LIMIT" /> conturi.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Conectat la un dispozitiv}few{Conectat la # dispozitive}other{Conectat la # de dispozitive}}</translation>
 <translation id="3236488194889173876">Nicio rețea mobilă disponibilă</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Invitat</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Blocați</translation>
 <translation id="3798670284305777884">Difuzor (intern)</translation>
 <translation id="380165613292957338">Bună ziua, cu ce vă pot ajuta?</translation>
+<translation id="383629559565718788">Afișează setările pentru tastatură</translation>
 <translation id="3846575436967432996">Nu sunt disponibile informații despre rețele</translation>
 <translation id="385051799172605136">Înapoi</translation>
 <translation id="3891340733213178823">Apăsați de două ori Ctrl+Shift+Q pentru a vă deconecta.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Semnal mediu</translation>
 <translation id="4200057768455216496">Ai accesat comanda rapidă pentru lupa andocată. Vrei să o activezi?</translation>
 <translation id="4217571870635786043">Dictare</translation>
+<translation id="4261870227682513959">Afișează setările pentru notificări. Notificările sunt dezactivate</translation>
 <translation id="4274921305979314545">Conectează Chromebookul la telefon</translation>
 <translation id="4279490309300973883">Oglindire</translation>
+<translation id="4292681942966152062">Se activează <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Sistemul de operare Chrome</translation>
 <translation id="4338109981321384717">Lupă</translation>
@@ -211,7 +225,7 @@
 <translation id="4918086044614829423">Accept</translation>
 <translation id="4924411785043111640">Repornește și resetează</translation>
 <translation id="4961318399572185831">Proiectează ecranul</translation>
-<translation id="5069971504769299223">Managerul de dispozitive poate să îți monitorizeze activitatea.</translation>
+<translation id="5069971504769299223">Managerul de dispozitiv poate să îți monitorizeze activitatea.</translation>
 <translation id="5136175204352732067">Altă tastatură conectată</translation>
 <translation id="5168181903108465623">Dispozitive de proiecție disponibile</translation>
 <translation id="5207949376430453814">Evidențiază cursorul pentru text</translation>
@@ -225,7 +239,7 @@
 <translation id="544691375626129091">Toți utilizatorii disponibili au fost deja adăugați la această sesiune.</translation>
 <translation id="5457599981699367932">Navighează ca invitat</translation>
 <translation id="54609108002486618">Gestionat</translation>
-<translation id="5496819745535887422">Administratorul îți resetează dispozitivul. Toate datele vor fi șterse după repornirea dispozitivului.</translation>
+<translation id="5496819745535887422">Administratorul restabilește o versiune anterioară a SO de pe dispozitiv. Toate datele vor fi șterse după repornirea dispozitivului.</translation>
 <translation id="553675580533261935">Se iese din sesiune</translation>
 <translation id="5537725057119320332">Proiectează</translation>
 <translation id="5548285847212963613">Extensia „<ph name="EXTENSION_NAME" />” te poate ajuta să te conectezi la această rețea.</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Din „<ph name="FROM_LOCALE" />” în „<ph name="TO_LOCALE" />” după sincronizarea setărilor.</translation>
 <translation id="574392208103952083">Medie</translation>
 <translation id="5744083938413354016">Tragere prin atingere</translation>
+<translation id="5750765938512549687">Bluetooth este dezactivat</translation>
 <translation id="5777841717266010279">Oprești permiterea accesului la ecran?</translation>
 <translation id="57838592816432529">Dezactivează sunetul</translation>
 <translation id="5805697420284793859">Managerul de ferestre</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Afișați tastatura pe ecran</translation>
 <translation id="6164005077879661055">Toate fișierele și datele locale asociate acestui utilizator monitorizat vor fi șterse definitiv după eliminarea acestui utilizator monitorizat. Site-urile web accesate și setările acestui utilizator monitorizat pot fi în continuare vizibile pentru manager la <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Află mai multe</translation>
+<translation id="6254629735336163724">Blocată pe orizontală</translation>
 <translation id="6259254695169772643">Folosește creionul pentru a selecta</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: se activează...</translation>
 <translation id="6284232397434400372">Rezoluția a fost schimbată</translation>
 <translation id="6297287540776456956">Folosește creionul pentru a selecta o zonă</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> a fost rotit la <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Suprapunere a tastaturii</translation>
+<translation id="6376931439017688372">Bluetooth este activat</translation>
 <translation id="639644700271529076">Tasta CAPS LOCK este dezactivată</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Gata</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Această rețea este dezactivată de administrator.</translation>
 <translation id="7067196344162293536">Rotire automată</translation>
 <translation id="7076293881109082629">Conectare</translation>
+<translation id="7092922358121866860">Afișează setările pentru Lumină de noapte</translation>
 <translation id="7098389117866926363">Dispozitiv USB-C (portul din stânga în spate)</translation>
 <translation id="7131634465328662194">Vei fi deconectat(ă) automat.</translation>
 <translation id="7143207342074048698">Se conectează</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Apasă pe tasta de căutare sau pe Shift pentru a anula.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" />:<ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Semnal puternic</translation>
+<translation id="7842211907556571265">Se conectează la <ph name="NETWORK_NAME" />…</translation>
 <translation id="7842569679327885685">Avertisment: funcție experimentală</translation>
 <translation id="7846634333498149051">Tastatură</translation>
 <translation id="790040513076446191">Manipulează setările privind confidențialitatea</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: se reconectează...</translation>
 <translation id="8513108775083588393">Rotire automată</translation>
 <translation id="8517041960877371778">Este posibil ca <ph name="DEVICE_TYPE" /> să nu se încarce cât timp este pornit.</translation>
+<translation id="8627191004499078455">Conectat la <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Nivelul bateriei: <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Selectează și ascultă</translation>
 <translation id="8652175077544655965">Închide setările</translation>
+<translation id="8653151467777939995">Afișează setările pentru notificări. Notificările sunt activate</translation>
+<translation id="8664753092453405566">Afișează lista de rețele. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">A fost conectat un încărcător de putere joasă</translation>
 <translation id="8683506306463609433">Urmărirea performanțelor este activă</translation>
 <translation id="8734991477317290293">Aceasta ar putea încerca să înregistreze ce taste apeși</translation>
+<translation id="8735953464173050365">Afișează setările pentru tastatură. Este selectată tastatura <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Afișează setările VPN</translation>
 <translation id="8809737090443522491">Introdu numele unei aplicații sau al unui document</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Oglindirea cu mai mult de două afișaje nu este acceptată.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Butonul Înapoi</translation>
+<translation id="8843682306134542540">Comută blocarea rotației. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Tasta de căutare + Esc</translation>
 <translation id="8870509716567206129">Aplicația nu acceptă ecranul împărțit.</translation>
 <translation id="8874184842967597500">Neconectat</translation>
@@ -418,7 +443,7 @@
 <translation id="8984179138335769204">Lansare rapidă</translation>
 <translation id="8995603266996330174">Gestionat de <ph name="DOMAIN" /></translation>
 <translation id="9029474291399787231">Este disponibilă o actualizare Adobe Flash Player</translation>
-<translation id="9056839673611986238">Dispozitivul va fi resetat</translation>
+<translation id="9056839673611986238">SO de pe dispozitiv va fi adus la o versiune anterioară</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">Microfonul este în uz.</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index a2b5e86..30b68d6 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Добавлено устройство <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Нет сетей</translation>
 <translation id="1059194134494239015">Разрешение экрана <ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Показать настройки специальных возможностей</translation>
 <translation id="1104621072296271835">Вместе ваши устройства будут работать ещё лучше</translation>
 <translation id="112308213915226829">Автоматически скрывать панель запуска</translation>
 <translation id="1153356358378277386">Сопряженные устройства</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">слабый сигнал</translation>
 <translation id="1293264513303784526">Устройство USB-C (порт слева)</translation>
+<translation id="1302880136325416935">Показать настройки Bluetooth. <ph name="STATE_TEXT" />.</translation>
 <translation id="1346748346194534595">Справа</translation>
 <translation id="1351937230027495976">Свернуть меню</translation>
 <translation id="1383876407941801731">Поиск</translation>
 <translation id="1467432559032391204">Слева</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Панель запуска</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Показать настройки уведомлений. Уведомления отключены для одного приложения.}one{Показать настройки уведомлений. Уведомления отключены для # приложения.}few{Показать настройки уведомлений. Уведомления отключены для # приложений.}many{Показать настройки уведомлений. Уведомления отключены для # приложений.}other{Показать настройки уведомлений. Уведомления отключены для # приложения.}}</translation>
 <translation id="1525508553941733066">ЗАКРЫТЬ</translation>
 <translation id="1537254971476575106">Полноэкранная лупа</translation>
 <translation id="15373452373711364">Большой курсор мыши</translation>
 <translation id="1550523713251050646">Чтобы изменить источник питания, нажмите здесь.</translation>
 <translation id="1567387640189251553">После ввода пароля была подключена другая клавиатура. Это может быть попыткой узнать, какие клавиши вы нажимаете.</translation>
+<translation id="1570871743947603115">Изменить настройки Bluetooth. <ph name="STATE_TEXT" />.</translation>
 <translation id="1608626060424371292">Удалить профиль</translation>
 <translation id="1621499497873603021">Оставшееся время работы от батареи: <ph name="TIME_LEFT" />.</translation>
 <translation id="1658406695958299976">Неверный пароль. Обратите внимание! Если вы недавно изменили пароль, но не выходили из системы, значит, новый пароль ещё не вступил в силу и необходимо указать старый.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Не распознано</translation>
 <translation id="1746730358044914197">Способы ввода настраиваются администратором</translation>
 <translation id="1747827819627189109">Экранная клавиатура включена</translation>
+<translation id="1761222317188459878">Изменить настройки сетевого подключения. <ph name="STATE_TEXT" />.</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Ассистент (загрузка…)</translation>
 <translation id="1841545962859478868">Администратор устройства может просматривать следующую информацию:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Это устройство находится в домене <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Книжная</translation>
 <translation id="2067602449040652523">Яркость клавиатуры</translation>
+<translation id="2075212959500165896">Слишком много попыток. Повторите позже.</translation>
 <translation id="2081529251031312395">$1 может войти в аккаунт позже.</translation>
 <translation id="2127372758936585790">Маломощное зарядное устройство</translation>
 <translation id="2135456203358955318">Закрепленная лупа</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Переключить режим обзора</translation>
 <translation id="2338501278241028356">Включите Bluetooth, чтобы найти устройства</translation>
 <translation id="2339073806695260576">Нажмите кнопку стилуса на панели запуска, чтобы создать заметку, сделать скриншот или использовать стилус в качестве лупы или лазерной указки.</translation>
+<translation id="2341729377289034582">Заблокировано в вертикальном положении</translation>
 <translation id="2352467521400612932">Настройки стилуса</translation>
 <translation id="2354174487190027830">Активация <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Далее</translation>
 <translation id="2365393535144473978">Вместе с мобильным Интернетом включится Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Изменить настройки режима "Не беспокоить"</translation>
 <translation id="2412593942846481727">Доступно обновление</translation>
+<translation id="2416346634399901812">Подключено к сети "<ph name="NETWORK_NAME" />"</translation>
 <translation id="2429753432712299108">Устройству <ph name="DEVICE_NAME" /> требуется разрешение на подключение через Bluetooth. Проверьте, отображается ли на нем код: <ph name="PASSKEY" />.</translation>
 <translation id="2482878487686419369">Уведомления</translation>
 <translation id="2484513351006226581">Чтобы переключить раскладку клавиатуры, нажмите клавиши <ph name="KEYBOARD_SHORTCUT" />.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Добавить подключение</translation>
 <translation id="2961963223658824723">Произошла ошибка. Повторите попытку через несколько секунд.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Показать устройства Google Cast</translation>
 <translation id="2996462380875591307">Закрепленная лупа включена. Чтобы отключить ее, нажмите Ctrl + Поиск + D.</translation>
 <translation id="2999742336789313416">Открытый сеанс <ph name="DISPLAY_NAME" /> выполняется в домене <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Монофонический звук</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Мобильное подключение</translation>
 <translation id="3151786313568798007">Ориентация</translation>
 <translation id="3153444934357957346">Для множественного входа можно использовать не более <ph name="MULTI_PROFILE_USER_LIMIT" /> аккаунтов.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Подключено одно устройство}one{Подключено # устройство}few{Подключено # устройства}many{Подключено # устройств}other{Подключено # устройства}}</translation>
 <translation id="3236488194889173876">Нет доступных мобильных сетей</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гость</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Заблокировать</translation>
 <translation id="3798670284305777884">Динамик (встроенный)</translation>
 <translation id="380165613292957338">Привет! Чем могу помочь?</translation>
+<translation id="383629559565718788">Показать настройки клавиатуры</translation>
 <translation id="3846575436967432996">Информация о сетях недоступна</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3891340733213178823">Чтобы выйти, дважды нажмите Ctrl+Shift+Q.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">сигнал средней мощности</translation>
 <translation id="4200057768455216496">Вы нажали сочетание клавиш для закрепленной лупы. Включить ее?</translation>
 <translation id="4217571870635786043">Голосовой ввод</translation>
+<translation id="4261870227682513959">Показать настройки уведомлений. Уведомления отключены.</translation>
 <translation id="4274921305979314545">Подключите Chromebook к телефону.</translation>
 <translation id="4279490309300973883">Отражение</translation>
+<translation id="4292681942966152062">Активация сети "<ph name="NETWORK_NAME" />"</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Лупа</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">В результате синхронизации настроек язык изменен. Теперь используется <ph name="TO_LOCALE" />, а не <ph name="FROM_LOCALE" />.</translation>
 <translation id="574392208103952083">Средний</translation>
 <translation id="5744083938413354016">Перетаскивание нажатием</translation>
+<translation id="5750765938512549687">Bluetooth выключен</translation>
 <translation id="5777841717266010279">Закрыть доступ к экрану?</translation>
 <translation id="57838592816432529">Отключить звук</translation>
 <translation id="5805697420284793859">Менеджер окон</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Показывать экранную клавиатуру</translation>
 <translation id="6164005077879661055">После удаления контролируемого профиля все файлы и локальные данные, связанные с ним, будут удалены. Посещенные страницы и настройки этого профиля будут видны его менеджеру на странице: <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Подробнее...</translation>
+<translation id="6254629735336163724">Заблокировано в горизонтальном положении</translation>
 <translation id="6259254695169772643">Выберите нужное с помощью стилуса</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: выполняется активация...</translation>
 <translation id="6284232397434400372">Разрешение изменено</translation>
 <translation id="6297287540776456956">Чтобы выбрать регион, используйте стилус</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" />: положение изменено на <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Накладка на клавиатуру</translation>
+<translation id="6376931439017688372">Bluetooth включен</translation>
 <translation id="639644700271529076">CAPS LOCK отключен</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Уведомлений больше нет</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Эта сеть отключена администратором.</translation>
 <translation id="7067196344162293536">Автоповорот</translation>
 <translation id="7076293881109082629">Вход</translation>
+<translation id="7092922358121866860">Показать настройки ночного режима</translation>
 <translation id="7098389117866926363">Устройство USB-C (порт слева на задней панели)</translation>
 <translation id="7131634465328662194">После этого вы выйдете из системы.</translation>
 <translation id="7143207342074048698">Подключение</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Для отмены нажмите SEARCH или SHIFT.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">хороший сигнал</translation>
+<translation id="7842211907556571265">Подключение к сети "<ph name="NETWORK_NAME" />"</translation>
 <translation id="7842569679327885685">Внимание! Экспериментальная функция</translation>
 <translation id="7846634333498149051">Клавиатура</translation>
 <translation id="790040513076446191">Управление настройками конфиденциальности</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: повторное подключение...</translation>
 <translation id="8513108775083588393">Автоповорот</translation>
 <translation id="8517041960877371778">Не удается зарядить устройство <ph name="DEVICE_TYPE" />, пока оно включено.</translation>
+<translation id="8627191004499078455">Подключено устройство "<ph name="DEVICE_NAME" />"</translation>
 <translation id="8639760480004882931">Батарея заряжена на <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Озвучивание при нажатии</translation>
 <translation id="8652175077544655965">Закрыть настройки</translation>
+<translation id="8653151467777939995">Показать настройки уведомлений. Уведомления включены.</translation>
+<translation id="8664753092453405566">Показать список сетей. <ph name="STATE_TEXT" />.</translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Подключено маломощное зарядное устройство</translation>
 <translation id="8683506306463609433">Отслеживание эффективности</translation>
 <translation id="8734991477317290293">Это может быть попыткой узнать, какие клавиши вы нажимаете.</translation>
+<translation id="8735953464173050365">Показать настройки клавиатуры. Выбрана клавиатура "<ph name="KEYBOARD_NAME" />".</translation>
+<translation id="875593634123171288">Показать настройки VPN</translation>
 <translation id="8809737090443522491">Введите название приложения или документа</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Зеркалирование более двух дисплеев не поддерживается.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Назад</translation>
+<translation id="8843682306134542540">Изменить настройки автоповорота экрана. <ph name="STATE_TEXT" />.</translation>
 <translation id="8850991929411075241">Клавиша поиска + Esc</translation>
 <translation id="8870509716567206129">Приложение не поддерживает разделение экрана.j</translation>
 <translation id="8874184842967597500">Не подключено</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb
index e9e1694..c7d147b 100644
--- a/ash/strings/ash_strings_sl.xtb
+++ b/ash/strings/ash_strings_sl.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Dodana je bila naprava <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Ni omrežij</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Prikaz nastavitev funkcij za ljudi s posebnimi potrebami</translation>
 <translation id="1104621072296271835">Naprave delujejo še bolje skupaj</translation>
 <translation id="112308213915226829">Samodejno skrivanje police</translation>
 <translation id="1153356358378277386">Seznanjene naprave</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Šibek signal</translation>
 <translation id="1293264513303784526">Naprava USB-C (leva vrata)</translation>
+<translation id="1302880136325416935">Prikaz nastavitev Bluetootha. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">V desno</translation>
 <translation id="1351937230027495976">Strni meni</translation>
 <translation id="1383876407941801731">Išči</translation>
 <translation id="1467432559032391204">V levo</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Zaganjalnik</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Prikaz nastavitev obvestil. Obvestila so izklopljena za eno aplikacijo.}one{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikacijo.}two{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikaciji.}few{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikacije.}other{Prikaz nastavitev obvestil. Obvestila so izklopljena za # aplikacij.}}</translation>
 <translation id="1525508553941733066">OPUSTI</translation>
 <translation id="1537254971476575106">Celozaslonska lupa</translation>
 <translation id="15373452373711364">Velik miškin kazalec</translation>
 <translation id="1550523713251050646">Kliknite za več možnosti</translation>
 <translation id="1567387640189251553">Od zadnjega vnosa gesla je bila priklopljena druga tipkovnica, ki morda poskuša beležiti vse, kar natipkate.</translation>
+<translation id="1570871743947603115">Preklop Bluetootha. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Odstrani tega uporabnika</translation>
 <translation id="1621499497873603021">Preostali čas do izpraznitve akumulatorja, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Vašega gesla še ni bilo mogoče preveriti. Opomba: če ste nedavno spremenili geslo, bo novo geslo začelo veljati, ko se odjavite. Tu uporabite starega.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Ni prepoznano</translation>
 <translation id="1746730358044914197">Načine vnosa konfigurira skrbnik.</translation>
 <translation id="1747827819627189109">Zaslonska tipkovnica omogočena</translation>
+<translation id="1761222317188459878">Preklop omrežne povezave. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Pomočnik (nalaganje ...)</translation>
 <translation id="1841545962859478868">Skrbnik naprave morda nadzira naslednje:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">To napravo upravlja <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Pokončno</translation>
 <translation id="2067602449040652523">Svetlost tipkovnice</translation>
+<translation id="2075212959500165896">Preveč poskusov. Poskusite znova pozneje.</translation>
 <translation id="2081529251031312395">$1 se še vedno lahko prijavi pozneje.</translation>
 <translation id="2127372758936585790">Nizkoenergijski polnilnik</translation>
 <translation id="2135456203358955318">Zasidrana lupa</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Preklop pregleda okna</translation>
 <translation id="2338501278241028356">Vklopite Bluetooth, če želite odkriti naprave v bližini</translation>
 <translation id="2339073806695260576">Dotaknite se gumba pisala na polici, če želite ustvariti zapisek, posneti posnetek zaslona ali uporabiti laserski kazalnik oziroma povečevalno steklo.</translation>
+<translation id="2341729377289034582">Zaklenjeno na pokončno</translation>
 <translation id="2352467521400612932">Nastavitve pisala</translation>
 <translation id="2354174487190027830">Aktiviranje omrežja <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Nadaljuj</translation>
 <translation id="2365393535144473978">Če omogočite prenos podatkov v mobilnem omrežju, bo omogočen Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Preklop načina ne moti</translation>
 <translation id="2412593942846481727">Na voljo je posodobitev</translation>
+<translation id="2416346634399901812">Povezava z omrežjem <ph name="NETWORK_NAME" /> je vzpostavljena</translation>
 <translation id="2429753432712299108">Naprava Bluetooth »<ph name="DEVICE_NAME" />« želi dovoljenje za seznanjanje. Preden sprejmete, se prepričajte, da je na napravi prikazano to geslo: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Obvestila</translation>
 <translation id="2484513351006226581">Pritisnite <ph name="KEYBOARD_SHORTCUT" />, če želite preklopiti postavitev tipkovnice</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Dodaj povezavo</translation>
 <translation id="2961963223658824723">Prišlo je do napake. Poskusite znova čez nekaj sekund.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Prikaz naprav za predvajanje.</translation>
 <translation id="2996462380875591307">Zasidrana lupa je omogočena. Če jo želite izklopiti, znova pritisnite Ctrl + tipko za iskanje + D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> je javna seja, ki jo upravlja <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Mono zvok</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Prenos podatkov v mobilnih omrežjih</translation>
 <translation id="3151786313568798007">Usmerjenost</translation>
 <translation id="3153444934357957346">S prijavo z več računi lahko uporabljate največ toliko računov: <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Vzpostavljena je povezava z eno napravo}one{Vzpostavljena je povezava z # napravo}two{Vzpostavljena je povezava z # napravama}few{Vzpostavljena je povezava s # napravami}other{Vzpostavljena je povezava s # napravami}}</translation>
 <translation id="3236488194889173876">Mobilno omrežje ni na voljo</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gost</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Zakleni</translation>
 <translation id="3798670284305777884">Zvočnik (vgrajeni)</translation>
 <translation id="380165613292957338">Živijo. Kako lahko pomagam?</translation>
+<translation id="383629559565718788">Prikaz nastavitev tipkovnice</translation>
 <translation id="3846575436967432996">Ni podatkov o omrežju</translation>
 <translation id="385051799172605136">Nazaj</translation>
 <translation id="3891340733213178823">Dvakrat pritisnite Ctrl + Shift + Q, če se želite odjaviti.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Srednje močan signal</translation>
 <translation id="4200057768455216496">Pritisnili ste bližnjico za zasidrano lupo. Ali jo želite vklopiti?</translation>
 <translation id="4217571870635786043">Narek</translation>
+<translation id="4261870227682513959">Prikaz nastavitev obvestil. Obvestila so izklopljena.</translation>
 <translation id="4274921305979314545">Povežite Chromebook s telefonom</translation>
 <translation id="4279490309300973883">Zrcaljenje</translation>
+<translation id="4292681942966152062">Aktiviranje omrežja <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Povečevalno steklo</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Iz jezika »<ph name="FROM_LOCALE" />« v jezik »<ph name="TO_LOCALE" />« po sinhronizaciji nastavitev.</translation>
 <translation id="574392208103952083">Srednja</translation>
 <translation id="5744083938413354016">Vlečenje z dotikom</translation>
+<translation id="5750765938512549687">Bluetooth je izklopljen</translation>
 <translation id="5777841717266010279">Želite ustaviti skupno rabo zaslona?</translation>
 <translation id="57838592816432529">Izklopi zvok</translation>
 <translation id="5805697420284793859">Upravitelj oken</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Pokaži zaslonsko tipkovnico</translation>
 <translation id="6164005077879661055">Vse datoteke in lokalni podatki, povezani z zaščitenim uporabnikom, bodo trajno izbrisani, ko ga odstranite. Obiskana spletna mesta in nastavitve tega uporabnika bodo morda še vedno vidna upravitelju na <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Več o tem</translation>
+<translation id="6254629735336163724">Zaklenjeno na vodoravno</translation>
 <translation id="6259254695169772643">Uporabite pisalo za izbiranje</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Aktiviranje ...</translation>
 <translation id="6284232397434400372">Ločljivost je bila spremenjena</translation>
 <translation id="6297287540776456956">S pisalom izberite območje</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> – zasuk na <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Prekrivna tipkovnica</translation>
+<translation id="6376931439017688372">Bluetooth je vklopljen</translation>
 <translation id="639644700271529076">Tipka CAPS LOCK je izklopljena</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Končano</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">To omrežje je onemogočil skrbnik.</translation>
 <translation id="7067196344162293536">Samodejno sukanje</translation>
 <translation id="7076293881109082629">Prijava</translation>
+<translation id="7092922358121866860">Prikaz nastavitev nočne svetlobe</translation>
 <translation id="7098389117866926363">Naprava USB-C (vrata levo zadaj)</translation>
 <translation id="7131634465328662194">Samodejno boste odjavljeni.</translation>
 <translation id="7143207342074048698">Vzpostavljanje povezave</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Za preklic pritisnite tipko za iskanje ali Shift.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> in <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Močan signal</translation>
+<translation id="7842211907556571265">Vzpostavljanje povezave z omrežjem <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Opozorilo: poskusna funkcija</translation>
 <translation id="7846634333498149051">Tipkovnica</translation>
 <translation id="790040513076446191">Upravljajte nastavitve zasebnosti</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Vnovično vzpostavljanje povezave ...</translation>
 <translation id="8513108775083588393">Samodejni zasuk</translation>
 <translation id="8517041960877371778">Akumulator naprave <ph name="DEVICE_TYPE" /> se morda ne bo polnil, medtem ko je naprava vklopljena.</translation>
+<translation id="8627191004499078455">Vzpostavljena povezava z napravo <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Še <ph name="PERCENTAGE" /> %</translation>
 <translation id="8649101189709089199">Izberite in poslušajte</translation>
 <translation id="8652175077544655965">Zapiranje nastavitev</translation>
+<translation id="8653151467777939995">Prikaz nastavitev obvestil. Obvestila so vklopljena.</translation>
+<translation id="8664753092453405566">Prikaz seznama omrežij. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Priključen je nizkoenergijski polnilnik</translation>
 <translation id="8683506306463609433">Sledenje učinkovitosti delovanja je aktivno</translation>
 <translation id="8734991477317290293">Morda poskuša beležiti vse, kar natipkate</translation>
+<translation id="8735953464173050365">Prikaz nastavitev tipkovnice. Izbrana je tipkovnica <ph name="KEYBOARD_NAME" />.</translation>
+<translation id="875593634123171288">Prikaz nastavitev omrežja VPN</translation>
 <translation id="8809737090443522491">Vnesite ime aplikacije ali dokumenta</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Zrcaljenje z več kot dvema zaslonoma ni podprto.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Gumb za nazaj</translation>
+<translation id="8843682306134542540">Preklop zaklepanja zasuka. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Iskanje + Esc</translation>
 <translation id="8870509716567206129">Aplikacija ne podpira načina razdeljenega zaslona.</translation>
 <translation id="8874184842967597500">Povezava ni vzpostavljena</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb
index 36fc712..9b03317f 100644
--- a/ash/strings/ash_strings_sr.xtb
+++ b/ash/strings/ash_strings_sr.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" />: додато</translation>
 <translation id="1056775291175587022">Нема мрежа</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Прегледајте подешавања приступачности</translation>
 <translation id="1104621072296271835">Уређаји заједно функционишу још боље</translation>
 <translation id="112308213915226829">Аутоматски сакриј полицу</translation>
 <translation id="1153356358378277386">Упарени уређаји</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Слаб сигнал</translation>
 <translation id="1293264513303784526">Уређај са USB прикључком типа C (леви порт)</translation>
+<translation id="1302880136325416935">Прегледајте Bluetooth подешавања. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Удесно</translation>
 <translation id="1351937230027495976">Скупи мени</translation>
 <translation id="1383876407941801731">Претражи</translation>
 <translation id="1467432559032391204">Улево</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Покретач</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Прегледајте подешавања обавештења. Обавештења су искључена за једну апликацију}one{Прегледајте подешавања обавештења. Обавештења су искључена за # апликацију}few{Прегледајте подешавања обавештења. Обавештења су искључена за # апликације}other{Прегледајте подешавања обавештења. Обавештења су искључена за # апликација}}</translation>
 <translation id="1525508553941733066">ОДБАЦИ</translation>
 <translation id="1537254971476575106">Лупа за цео екран</translation>
 <translation id="15373452373711364">Велики курсор</translation>
 <translation id="1550523713251050646">Кликните за више опција</translation>
 <translation id="1567387640189251553">Нека друга тастатура је повезана откако сте последњи пут унели лозинку. Можда покушава да украде вашу комбинацију тастера.</translation>
+<translation id="1570871743947603115">Укључите/искључите Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Уклони овог корисника</translation>
 <translation id="1621499497873603021">Време које је преостало док се батерија не испразни, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Жао нам је, верификација лозинке још увек није успела. Напомена: ако сте недавно променили лозинку, нова лозинка ће се применити када се одјавите. Овде користите стару лозинку.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Није препознат</translation>
 <translation id="1746730358044914197">Методе уноса конфигурише администратор.</translation>
 <translation id="1747827819627189109">Тастатура на екрану је омогућена</translation>
+<translation id="1761222317188459878">Укључите/искључите мрежну везу. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Етернет: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Помоћник (учитава се...)</translation>
 <translation id="1841545962859478868">Администратор уређаја може да прати следеће:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Овим уређајем управља домен <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Вертикално</translation>
 <translation id="2067602449040652523">Осветљеност тастатуре</translation>
+<translation id="2075212959500165896">Превише покушаја. Пробајте поново касније.</translation>
 <translation id="2081529251031312395">$1 ће и даље моћи да се пријави касније.</translation>
 <translation id="2127372758936585790">Пуњач мале снаге</translation>
 <translation id="2135456203358955318">Монтирана лупа екрана</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Укључи/искључи преглед прозора</translation>
 <translation id="2338501278241028356">Укључите Bluetooth да бисте открили уређаје у близини</translation>
 <translation id="2339073806695260576">Додирните дугме писаљке на полици да бисте направили белешку и снимак екрана и да бисте користили ласерски показивач или лупу.</translation>
+<translation id="2341729377289034582">Вертикални приказ је закључан</translation>
 <translation id="2352467521400612932">Подешавања писаљке</translation>
 <translation id="2354174487190027830">Активирање мреже <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Настави</translation>
 <translation id="2365393535144473978">Ако омогућите мобилне податке, омогућавате Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Укључите/искључите Не узнемиравај</translation>
 <translation id="2412593942846481727">Доступно је ажурирање</translation>
+<translation id="2416346634399901812">Повезани сте са мрежом <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth уређај „<ph name="DEVICE_NAME" />“ жели дозволу за упаривање. Пре него што му је дате, уверите се да је ова шифра приказана на том уређају: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Обавештења</translation>
 <translation id="2484513351006226581">Притисните <ph name="KEYBOARD_SHORTCUT" /> да бисте променили распоред тастатуре.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Додај везу</translation>
 <translation id="2961963223658824723">Нешто није у реду. Пробајте поново за пар секунди.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Прегледајте уређаје за пребацивање.</translation>
 <translation id="2996462380875591307">Монтирана лупа екрана је омогућена. Притисните Ctrl + тастер за претрагу + D поново да бисте је искључили.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> је јавна сесија којом управља <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Моно звук</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Мобилни подаци</translation>
 <translation id="3151786313568798007">Положај</translation>
 <translation id="3153444934357957346">Можете да имате највише <ph name="MULTI_PROFILE_USER_LIMIT" /> налога за вишеструко пријављивање.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Повезани сте са једним уређајем}one{Повезани сте са # уређајем}few{Повезани сте са # уређаја}other{Повезани сте са # уређаја}}</translation>
 <translation id="3236488194889173876">Није доступна ниједна мобилна мрежа</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гост</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Закључај</translation>
 <translation id="3798670284305777884">Звучник (интерни)</translation>
 <translation id="380165613292957338">Здраво, како могу да помогнем?</translation>
+<translation id="383629559565718788">Прегледајте подешавања тастатуре</translation>
 <translation id="3846575436967432996">Нису доступне информације о мрежи</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3891340733213178823">Двапут притисните Ctrl+Shift+Q да бисте се одјавили.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Сигнал средње јачине</translation>
 <translation id="4200057768455216496">Притиснули сте пречицу за монтирану лупу екрана. Желите ли да је укључите?</translation>
 <translation id="4217571870635786043">Диктирање</translation>
+<translation id="4261870227682513959">Прегледајте подешавања обавештења. Обавештења су искључена</translation>
 <translation id="4274921305979314545">Повежите Chromebook са телефоном</translation>
 <translation id="4279490309300973883">Пресликавање</translation>
+<translation id="4292681942966152062">Активира се мрежа <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome ОС</translation>
 <translation id="4338109981321384717">Лупа</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Са језика „<ph name="FROM_LOCALE" />“ на „<ph name="TO_LOCALE" />“ после синхронизације уређаја.</translation>
 <translation id="574392208103952083">Средња</translation>
 <translation id="5744083938413354016">Превлачење додиром</translation>
+<translation id="5750765938512549687">Bluetooth је искључен</translation>
 <translation id="5777841717266010279">Желите ли да прекинете дељење екрана?</translation>
 <translation id="57838592816432529">Искључи звук</translation>
 <translation id="5805697420284793859">Менаџер прозора</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Прикажи тастатуру на екрану</translation>
 <translation id="6164005077879661055">Све датотеке и локални подаци повезани са корисником под надзором ће бити трајно избрисани када уклоните овог корисника под надзором. Менаџер ће можда и даље моћи да види посећене веб-сајтове и подешавања за овог корисника под надзором на <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Сазнајте више</translation>
+<translation id="6254629735336163724">Хоризонтални приказ је закључан</translation>
 <translation id="6259254695169772643">Изаберите помоћу писаљке</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Активирање...</translation>
 <translation id="6284232397434400372">Резолуција је промењена</translation>
 <translation id="6297287540776456956">Користите писаљку да бисте изабрали област</translation>
 <translation id="6310121235600822547">Екран <ph name="DISPLAY_NAME" /> је промењен у <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Постављени елемент тастатуре</translation>
+<translation id="6376931439017688372">Bluetooth је укључен</translation>
 <translation id="639644700271529076">CAPS LOCK је искључен</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Готово</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Ову мрежу је онемогућио администратор.</translation>
 <translation id="7067196344162293536">Аутоматски ротирај</translation>
 <translation id="7076293881109082629">Пријављивање</translation>
+<translation id="7092922358121866860">Прегледајте подешавања Ноћног светла</translation>
 <translation id="7098389117866926363">Уређај са USB прикључком типа C (леви задњи порт)</translation>
 <translation id="7131634465328662194">Одјавићемо вас аутоматски.</translation>
 <translation id="7143207342074048698">Повезивање</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Притисните тастер за претрагу или Shift да бисте отказали.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> и <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Јак сигнал</translation>
+<translation id="7842211907556571265">Повезујете се са мрежом <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Упозорење: Експериментална функција</translation>
 <translation id="7846634333498149051">Тастатура</translation>
 <translation id="790040513076446191">Управљање подешавањима у вези са приватношћу</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Поново се повезујете...</translation>
 <translation id="8513108775083588393">Аутоматско ротирање</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> се можда неће пунити док је укључен.</translation>
+<translation id="8627191004499078455">Повезани сте са мрежом <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Преостало је <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Изаберите за говор</translation>
 <translation id="8652175077544655965">Затворите подешавања</translation>
+<translation id="8653151467777939995">Прегледајте подешавања обавештења. Обавештења су укључена</translation>
+<translation id="8664753092453405566">Прегледајте листу мрежа. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Повезан је пуњач мале снаге</translation>
 <translation id="8683506306463609433">Праћење учинка је активно</translation>
 <translation id="8734991477317290293">Можда покушава да украде вашу комбинацију тастера</translation>
+<translation id="8735953464173050365">Прегледајте подешавања тастатуре. Изабрана је <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Прегледајте подешавања VPN-а</translation>
 <translation id="8809737090443522491">Унесите назив апликације или документа</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Пресликавање са више од два екрана није подржано.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Дугме Назад</translation>
+<translation id="8843682306134542540">Укључите/искључите закључавање ротације. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">Апликација не подржава подељени екран.</translation>
 <translation id="8874184842967597500">Није повезано</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb
index c2cd3dd..e9bfe9a 100644
--- a/ash/strings/ash_strings_sv.xtb
+++ b/ash/strings/ash_strings_sv.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> har lagts till</translation>
 <translation id="1056775291175587022">Inga nätverk</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Visa tillgänglighetsinställningar</translation>
 <translation id="1104621072296271835">Dina enheter fungerar ännu bättre tillsammans</translation>
 <translation id="112308213915226829">Dölj hyllan automatiskt</translation>
 <translation id="1153356358378277386">Kopplade enheter</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">svag signal</translation>
 <translation id="1293264513303784526">USB-C-enhet (vänster port)</translation>
+<translation id="1302880136325416935">Visa Bluetooth-inställningar. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Höger</translation>
 <translation id="1351937230027495976">Komprimera menyn</translation>
 <translation id="1383876407941801731">Sök</translation>
 <translation id="1467432559032391204">Vänster</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Startprogram</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Visa aviseringsinställningar. Aviseringar har inaktiverats för 1 app}other{Visa aviseringsinställningar. Aviseringar har inaktiverats för # appar}}</translation>
 <translation id="1525508553941733066">IGNORERA</translation>
 <translation id="1537254971476575106">Helskärmsförstorare</translation>
 <translation id="15373452373711364">Stor muspekare</translation>
 <translation id="1550523713251050646">Klicka här för fler alternativ</translation>
 <translation id="1567387640189251553">Ett annat tangentbord har anslutits sedan du senast angav lösenordet. Det kan försöka stjäla dina tangenttryckningar.</translation>
+<translation id="1570871743947603115">Aktivera och inaktivera Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Ta bort den här användaren</translation>
 <translation id="1621499497873603021">Tid som återstår tills batteriet är tomt: <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Det gick inte att verifiera lösenordet. Obs! Om du nyligen har bytt lösenord börjar det nya lösenordet att gälla först när du loggar ut. Använd det gamla lösenordet här.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Identifierades inte</translation>
 <translation id="1746730358044914197">Inmatningsmetoderna konfigureras av administratören.</translation>
 <translation id="1747827819627189109">Skärmen på tangentbordet har aktiverats</translation>
+<translation id="1761222317188459878">Aktivera och inaktivera nätverksanslutning. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistent (läses in …)</translation>
 <translation id="1841545962859478868">Enhetsadministratören kan övervaka följande:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Den här enheten hanteras av <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Stående</translation>
 <translation id="2067602449040652523">Ljusstyrka för tangentbordet</translation>
+<translation id="2075212959500165896">Du har gjort för många försök. Försök igen senare.</translation>
 <translation id="2081529251031312395">$1 kan fortfarande logga in senare.</translation>
 <translation id="2127372758936585790">Laddning med låg effekt</translation>
 <translation id="2135456203358955318">Dockad skärmförstoring</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Växla fönsteröversikt</translation>
 <translation id="2338501278241028356">Aktivera Bluetooth så att det går att upptäcka enheter i närheten</translation>
 <translation id="2339073806695260576">När du har tryckt på e-pennan på hyllan kan du anteckna, ta en skärmdump eller använda laserpekaren eller förstoringsglaset.</translation>
+<translation id="2341729377289034582">Låst i stående läge</translation>
 <translation id="2352467521400612932">Inställningar för e-penna</translation>
 <translation id="2354174487190027830">Aktiverar <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Fortsätt</translation>
 <translation id="2365393535144473978">Om du aktiverar mobildata aktiveras Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Aktivera och inaktivera Stör ej</translation>
 <translation id="2412593942846481727">Det finns en uppdatering</translation>
+<translation id="2416346634399901812">Ansluten till <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Bluetooth-enheten <ph name="DEVICE_NAME" /> har begärt tillstånd för koppling. Innan du godkänner bekräftar du att den här lösenordsnyckeln visas på den enheten: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Aviseringar</translation>
 <translation id="2484513351006226581">Tryck på <ph name="KEYBOARD_SHORTCUT" /> om du vill byta tangentbordslayout.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Lägg till anslutning</translation>
 <translation id="2961963223658824723">Ett fel har uppstått. Försök igen om några sekunder.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Visa cast-enheter</translation>
 <translation id="2996462380875591307">Dockad skärmförstoring har aktiverats. Tryck på Ctrl + Sök + D igen om du vill inaktivera funktionen.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> är en offentlig session som hanteras av <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Monoljud</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobildata</translation>
 <translation id="3151786313568798007">Orientering</translation>
 <translation id="3153444934357957346">Du kan högst använda <ph name="MULTI_PROFILE_USER_LIMIT" /> konton för multiinloggning.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Ansluten till en enhet}other{Ansluten till # enheter}}</translation>
 <translation id="3236488194889173876">Det finns inget tillgängligt mobilnätverk</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Gäst</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Lås</translation>
 <translation id="3798670284305777884">Högtalare (inbyggd)</translation>
 <translation id="380165613292957338">Hej. Hur kan jag hjälpa dig?</translation>
+<translation id="383629559565718788">Visa tangentbordsinställningar</translation>
 <translation id="3846575436967432996">Det finns ingen nätverksinformation</translation>
 <translation id="385051799172605136">Bakåt</translation>
 <translation id="3891340733213178823">Tryck på Ctrl+Skift+Q två gånger om du vill logga ut.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">medelstark signal</translation>
 <translation id="4200057768455216496">Du tryckte på kortkommandot för dockad skärmförstoring. Vill du aktivera funktionen?</translation>
 <translation id="4217571870635786043">Diktering</translation>
+<translation id="4261870227682513959">Visa aviseringsinställningar. Aviseringar har inaktiverats</translation>
 <translation id="4274921305979314545">Koppla Chromebook till mobilen</translation>
 <translation id="4279490309300973883">Spegling</translation>
+<translation id="4292681942966152062">Aktiverar <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Förstoringsglas</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Från <ph name="FROM_LOCALE" /> till <ph name="TO_LOCALE" /> efter synkronisering av inställningarna.</translation>
 <translation id="574392208103952083">Medium</translation>
 <translation id="5744083938413354016">Tryck snabbt två gånger och dra</translation>
+<translation id="5750765938512549687">Bluetooth är inaktiverat</translation>
 <translation id="5777841717266010279">Vill du avbryta skärmdelningen?</translation>
 <translation id="57838592816432529">Stäng av ljudet</translation>
 <translation id="5805697420284793859">Fönsterhanterare</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Visa skärmtangentbordet</translation>
 <translation id="6164005077879661055">Alla filer och lokala data som är kopplade till den hanterade användaren tas bort permanent när den hanterade användaren tas bort. Besökta webbplatser och inställningar för den hanterade användaren kan fortfarande vara synliga för den som hanterar användaren på <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Läs mer</translation>
+<translation id="6254629735336163724">Låst i liggande läge</translation>
 <translation id="6259254695169772643">Välj något med e-pennan</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Aktiverar ...</translation>
 <translation id="6284232397434400372">Upplösningen har ändrats</translation>
 <translation id="6297287540776456956">Markera ett område med e-pennan</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> byttes till <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Tangentbordsöverlägg</translation>
+<translation id="6376931439017688372">Bluetooth är aktiverat</translation>
 <translation id="639644700271529076">CAPS LOCK är av</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Klart</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Det här nätverket har inaktiverats av administratören.</translation>
 <translation id="7067196344162293536">Rotera automatiskt</translation>
 <translation id="7076293881109082629">Logga in</translation>
+<translation id="7092922358121866860">Visa inställningar för Nattljus</translation>
 <translation id="7098389117866926363">USB-C-enhet (vänstra porten på baksidan)</translation>
 <translation id="7131634465328662194">Du loggas ut automatiskt.</translation>
 <translation id="7143207342074048698">Ansluter</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Avbryt genom att trycka på söktangenten eller Skift.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> och <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">stark signal</translation>
+<translation id="7842211907556571265">Ansluter till <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Varning: Experimentfunktion</translation>
 <translation id="7846634333498149051">Tangentbord</translation>
 <translation id="790040513076446191">Ändra sekretessrelaterade inställningar</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: återansluter …</translation>
 <translation id="8513108775083588393">Rotera automatiskt</translation>
 <translation id="8517041960877371778">Din <ph name="DEVICE_TYPE" /> laddas eventuellt inte så länge den är på.</translation>
+<translation id="8627191004499078455">Ansluten till <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> återstår</translation>
 <translation id="8649101189709089199">Textuppläsning</translation>
 <translation id="8652175077544655965">Stäng inställningarna</translation>
+<translation id="8653151467777939995">Visa aviseringsinställningar. Aviseringar har aktiverats</translation>
+<translation id="8664753092453405566">Visa nätverkslista. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Laddare med låg effekt ansluten</translation>
 <translation id="8683506306463609433">Prestandaspårning är aktiv</translation>
 <translation id="8734991477317290293">Det kan försöka stjäla dina tangenttryckningar</translation>
+<translation id="8735953464173050365">Visa tangentbordsinställningar. Inställt på <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Visa VPN-inställningar</translation>
 <translation id="8809737090443522491">Skriv namnet på en app eller ett dokument</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Det finns inte stöd för spegling på fler än två skärmar.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Bakåtknapp</translation>
+<translation id="8843682306134542540">Aktivera och inaktivera rotationslås. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Sök+Escape</translation>
 <translation id="8870509716567206129">Appen har inte stöd för delad skärm.</translation>
 <translation id="8874184842967597500">Inte ansluten</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb
index 1c40dd0..cded5c0 100644
--- a/ash/strings/ash_strings_sw.xtb
+++ b/ash/strings/ash_strings_sw.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Imeongeza <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Hakuna mitandao</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Onyesha mipangilio ya ufikivu</translation>
 <translation id="1104621072296271835">Vifaa vyako vitafanya kazi vizuri vikiwa pamoja</translation>
 <translation id="112308213915226829">Ficha rafu kiotomatiki</translation>
 <translation id="1153356358378277386">Vifaa vilivyooanishwa</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Mtandao si thabiti</translation>
 <translation id="1293264513303784526">Kifaa cha USB-C (mlango wa kushoto)</translation>
+<translation id="1302880136325416935">Onyesha mipangilio ya Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Kulia</translation>
 <translation id="1351937230027495976">Kunja menyu</translation>
 <translation id="1383876407941801731">Tafuta</translation>
 <translation id="1467432559032391204">Kushoto</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Kizindua</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Onyesha mipangilio ya arifa. Umezima arifa katika programu moja}other{Onyesha mipangilio ya arifa. Umezima arifa katika programu #}}</translation>
 <translation id="1525508553941733066">ONDOA</translation>
 <translation id="1537254971476575106">Kikuzaji cha skrini nzima</translation>
 <translation id="15373452373711364">Kishale kikubwa cha kipanya</translation>
 <translation id="1550523713251050646">Bofya ili upate chaguo zaidi</translation>
 <translation id="1567387640189251553">Kibodi tofauti imeunganishwa baada ya tukio lako la hivi karibuni la kuweka nenosiri. Huenda inajaribu kuiba mibofyo yako.</translation>
+<translation id="1570871743947603115">Washa au uzime Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Ondoa mtumiaji huyu</translation>
 <translation id="1621499497873603021">Muda unaosalia mpaka betri inapoisha, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Samahani, tumeshindwa kuthibitisha nenosiri lako. Kumbuka: ikiwa ulibadilisha nenosiri lako hivi karibuni, nenosiri lako jipya litaanza kutumika pindi utakapoondoka kwenye akaunti, tafadhali tumia nenosiri la awali hapa.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Haikutambua alama ya kidole</translation>
 <translation id="1746730358044914197">Mbinu za kuingiza data zimewekwa na msimamizi wako.</translation>
 <translation id="1747827819627189109">Kibodi ya skrini imewashwa</translation>
+<translation id="1761222317188459878">Washa au uzime muunganisho wa mtandao. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethaneti: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Mratibu (inapakia...)</translation>
 <translation id="1841545962859478868">Msimamizi wa kifaa anaweza kufuatilia mambo yafuatayo:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Kifaa hiki kinadhibitiwa na <ph name="DOMAIN" /> .</translation>
 <translation id="2050339315714019657">Wima</translation>
 <translation id="2067602449040652523">Ung'avu wa kibodi</translation>
+<translation id="2075212959500165896">Umejaribu mara nyingi mno. Jaribu tena baadaye.</translation>
 <translation id="2081529251031312395">Bado $1 anaweza kuingia katika akaunti baadaye.</translation>
 <translation id="2127372758936585790">Chaja ya nguvu ya chini</translation>
 <translation id="2135456203358955318">Kikuzaji kilichofungwa</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Geuza muhtasari wa dirisha</translation>
 <translation id="2338501278241028356">Washa Bluetooth ili ugundue vifaa vilivyo karibu</translation>
 <translation id="2339073806695260576">Gusa kitufe cha stylus kwenye rafu ili uandike kidokezo, upige picha ya skrini, utumie kielekezi cha leza au lenzi.</translation>
+<translation id="2341729377289034582">Inatumia skrini wima pekee</translation>
 <translation id="2352467521400612932">Mipangilio ya stylus</translation>
 <translation id="2354174487190027830">Inaanza kutumia <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Endelea</translation>
 <translation id="2365393535144473978">Kuwasha data ya mtandao wa simu kutawasha Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Washa au uzime kipengee cha Usinisumbue</translation>
 <translation id="2412593942846481727">Sasisho linapatikana</translation>
+<translation id="2416346634399901812">Umeunganishwa kwenye <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Kifaa cha Bluetooth cha "<ph name="DEVICE_NAME" />" kinaomba idhini ya kuoanisha. Kabla hujakubali, tafadhali thibitisha kwamba nenosiri hili linaonyeshwa kwenye kifaa hicho: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Arifa</translation>
 <translation id="2484513351006226581">Gonga <ph name="KEYBOARD_SHORTCUT" /> ili ubadilishe mpangilio wa kibodi.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Ongeza muunganisho</translation>
 <translation id="2961963223658824723">Hitilafu fulani imetokea. Jaribu tena baada ya sekunde chache.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Onyesha vifaa vinavyotuma maudhui.</translation>
 <translation id="2996462380875591307">Umewasha Kikuzaji Kilichoambatishwa. Bonyeza Ctrl+Search+D tena ili ukizime.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> ni kipindi cha kila mtu kinachodhibitiwa na <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Kipengele cha sauti moja</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Data ya mtandao wa simu</translation>
 <translation id="3151786313568798007">Mkao</translation>
 <translation id="3153444934357957346">Unaweza kuingia katika akaunti <ph name="MULTI_PROFILE_USER_LIMIT" /> pekee ukitumia kipengele cha uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Imeunganishwa kwenye kifaa kimoja}other{Imeunganishwa kwenye vifaa #}}</translation>
 <translation id="3236488194889173876">Mtandao wa simu haupatikani</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Mgeni</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Funga</translation>
 <translation id="3798670284305777884">Spika (ya ndani)</translation>
 <translation id="380165613292957338">Hujambo, ungependa nikusaidie vipi?</translation>
+<translation id="383629559565718788">Onyesha mipangilio ya kibodi</translation>
 <translation id="3846575436967432996">Hakuna maelezo ya mtandao yanayopatikana</translation>
 <translation id="385051799172605136">Nyuma</translation>
 <translation id="3891340733213178823">Bonyeza Ctrl+Shift+Q mara mbili ili kuondoka katika akaunti.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Mtandao ni thabiti kiasi</translation>
 <translation id="4200057768455216496">Umebofya njia ya mkato ya kikuzaji kilichoambatishwa. Ungependa kukiwasha?</translation>
 <translation id="4217571870635786043">Kuandika kwa kutamka</translation>
+<translation id="4261870227682513959">Onyesha mipangilio ya arifa. Umezima arifa</translation>
 <translation id="4274921305979314545">Unganisha Chromebook na simu yako</translation>
 <translation id="4279490309300973883">Kuakisi</translation>
+<translation id="4292681942966152062">Inawasha <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Lenzi</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Imebadalisha lugha kutoka "<ph name="FROM_LOCALE" />" kuwa "<ph name="TO_LOCALE" />" baada ya kusawazisha mipangilio yako.</translation>
 <translation id="574392208103952083">Wastani</translation>
 <translation id="5744083938413354016">Uburutaji wa kugonga</translation>
+<translation id="5750765938512549687">Bluetooth imezimwa</translation>
 <translation id="5777841717266010279">Je,ungependa kuacha kushiriki skrini?</translation>
 <translation id="57838592816432529">Zima sauti</translation>
 <translation id="5805697420284793859">Kidhibiti cha dirisha</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Onyesha kibodi ya skrini</translation>
 <translation id="6164005077879661055">Faili zote na data ya ndani zinazohusishwa na mtumiaji anayesimamiwa zitafutwa kabisa mtumiaji huyu anayesimamiwa atakapoondolewa. Tovuti zilizotembelewa na mipangilio ya mtumiaji huyu anayesimamiwa inaweza bado kuonekana na msimamizi katika <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Pata maelezo zaidi</translation>
+<translation id="6254629735336163724">Inatumia skrini ya mlalo pekee</translation>
 <translation id="6259254695169772643">Tumia stylus yako kuchagua</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Inaanza kutumia...</translation>
 <translation id="6284232397434400372">Imebadilisha ubora</translation>
 <translation id="6297287540776456956">Tumia stylus kuchagua eneo</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> ilizungushwa hadi <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Kuelea kwa kibodi</translation>
+<translation id="6376931439017688372">Bluetooth imewashwa</translation>
 <translation id="639644700271529076">CAPS LOCK imezimwa</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Hakuna arifa</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Mtandao huu umezimwa na msimamizi wako.</translation>
 <translation id="7067196344162293536">Zungusha kiotomatiki</translation>
 <translation id="7076293881109082629">Unaingia katika akaunti</translation>
+<translation id="7092922358121866860">Onyesha mipangilio ya Mwanga wa Usiku</translation>
 <translation id="7098389117866926363">Kifaa cha USB-C (mlango wa kushoto nyuma)</translation>
 <translation id="7131634465328662194">Utaondolewa kwenye akaunti kiotomatiki.</translation>
 <translation id="7143207342074048698">Inaunganisha</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Bonyeza Tafuta au Shift ili ughairi.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> na <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Mtandao ni thabiti</translation>
+<translation id="7842211907556571265">Inaunganisha kwenye <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Ilani: Kipengele cha majaribio</translation>
 <translation id="7846634333498149051">Kibodi</translation>
 <translation id="790040513076446191">Weka utakavyo mipangilio husika ya faragha</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Inaunganisha upya...</translation>
 <translation id="8513108775083588393">Zungusha kiotomatiki</translation>
 <translation id="8517041960877371778">Huenda kifaa chako cha <ph name="DEVICE_TYPE" /> kisichaji kikiwa kimewashwa.</translation>
+<translation id="8627191004499078455">Imeunganishwa kwenye <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Imebaki <ph name="PERCENTAGE" />%</translation>
 <translation id="8649101189709089199">Chagua ili Izungumze</translation>
 <translation id="8652175077544655965">Funga mipangilio</translation>
+<translation id="8653151467777939995">Onyesha mipangilio ya arifa. Umewasha arifa</translation>
+<translation id="8664753092453405566">Onyesha orodha ya mitandao. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Chaja ya nguvu ya chini imeunganishwa</translation>
 <translation id="8683506306463609433">Kipengele cha ufuatiliaji wa utendaji kinatumika</translation>
 <translation id="8734991477317290293">Huenda inajaribu kuiba mibofyo yako</translation>
+<translation id="8735953464173050365">Onyesha mipangilio ya kibodi. Umechagua <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Onyesha mipangilio ya VPN</translation>
 <translation id="8809737090443522491">Andika jina la programu au hati</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Kuakisi ukitumia zaidi ya skrini mbili hakuruhusiwi.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Kitufe cha Nyuma</translation>
+<translation id="8843682306134542540">Washa au uzime hali ya kufunga kwa kuzungusha. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">Programu haiwezi kutumia skrini iliyogawanywa.</translation>
 <translation id="8874184842967597500">Haijaunganishwa</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index ac0d1c9c1..54a4f8c 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> சேர்க்கப்பட்டது</translation>
 <translation id="1056775291175587022">நெட்வொர்க்குகள் இல்லை</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">அணுகல்தன்மை அமைப்புகளைக் காண்பிக்கும்</translation>
 <translation id="1104621072296271835">இணைத்தால், உங்கள் சாதனங்கள் இன்னும் சிறப்பாக வேலை செய்யும்</translation>
 <translation id="112308213915226829">அடுக்கைத் தானாக மறை</translation>
 <translation id="1153356358378277386">இணைத்த சாதனங்கள்</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">வலுவற்ற சிக்னல்</translation>
 <translation id="1293264513303784526">USB-C சாதனம் (இடது போர்ட்)</translation>
+<translation id="1302880136325416935">புளூடூத் அமைப்புகளைக் காண்பிக்கும். <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">வலது</translation>
 <translation id="1351937230027495976">மெனுவைச் சுருக்கு</translation>
 <translation id="1383876407941801731">தேடல்</translation>
 <translation id="1467432559032391204">இடது</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">துவக்கி</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். ஓர் ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}other{அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். # ஆப்ஸுக்கு அறிவிப்புகள் முடக்கப்பட்டுள்ளன}}</translation>
 <translation id="1525508553941733066">நிராகரி</translation>
 <translation id="1537254971476575106">முழுத்திரைப் பெரிதாக்கி</translation>
 <translation id="15373452373711364">பெரிய மவுஸ் இடஞ்சுட்டி</translation>
 <translation id="1550523713251050646">மேலும் விருப்பங்களுக்குக் கிளிக் செய்யவும்</translation>
 <translation id="1567387640189251553">நீங்கள் கடைசியாகக் கடவுச்சொல்லை உள்ளிட்ட பிறகு வேறொரு விசைப்பலகை இணைக்கப்பட்டுள்ளது. அது உங்கள் விசை அழுத்தங்களைத் திருட முயற்சித்துக் கொண்டிருக்கக்கூடும்.</translation>
+<translation id="1570871743947603115">புளூடூத்தை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">இவரை அகற்று</translation>
 <translation id="1621499497873603021">இன்னும் <ph name="TIME_LEFT" /> இல் பேட்டரி காலியாகிவிடும்</translation>
 <translation id="1658406695958299976">மன்னிக்கவும், உங்கள் கடவுச்சொல் இன்னும் சரிபார்க்கப்படவில்லை. குறிப்பு: உங்கள் கடவுச்சொல்லைச் சமீபத்தில் மாற்றியிருந்தால், நீங்கள் வெளியேறியவுடன் புதிய கடவுச்சொல் பயன்படுத்தப்படும், இங்கு பழைய கடவுச்சொல்லைப் பயன்படுத்தவும்.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">அடையாளங்காண முடியவில்லை</translation>
 <translation id="1746730358044914197">உள்ளீட்டு முறைகளை உங்கள் நிர்வாகி உள்ளமைத்துள்ளார்.</translation>
 <translation id="1747827819627189109">ஆன்ஸ்க்ரீன் விசைப்பலகை இயக்கப்பட்டது</translation>
+<translation id="1761222317188459878">நெட்வொர்க் இணைப்பை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">ஈதர்நெட்: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">அசிஸ்டண்ட் (ஏற்றுகிறது...)</translation>
 <translation id="1841545962859478868">பின்வருவனவற்றைச் சாதன நிர்வாகி கண்காணிக்கக்கூடும்:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390"><ph name="DOMAIN" /> ஆல் இந்த சாதனம் நிர்வகிக்கப்படுகிறது.</translation>
 <translation id="2050339315714019657">செங்குத்து நிலை</translation>
 <translation id="2067602449040652523">விசைப்பலகை ஒளிர்வு</translation>
+<translation id="2075212959500165896">பலமுறை முயன்றுவிட்டீர்கள். பிறகு முயலவும்.</translation>
 <translation id="2081529251031312395">$1 ஆல் பிறகு உள்நுழைய முடியும்.</translation>
 <translation id="2127372758936585790">குறைந்த சக்திகொண்ட சார்ஜர்</translation>
 <translation id="2135456203358955318">டாக் செய்யப்பட்ட பெரிதாக்கி</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">சாளர மேலோட்டத்தை நிலைமாற்று</translation>
 <translation id="2338501278241028356">அருகிலுள்ள சாதனங்களைக் கண்டறிய, புளூடூத்தை இயக்கவும்</translation>
 <translation id="2339073806695260576">குறிப்பெடுக்க, ஸ்கிரீன் ஷாட்டை எடுக்க, லேசர் பாயிண்டர் அல்லது உருப்பெருக்கி ஆகியவற்றைப் பயன்படுத்த, ஷெல்ஃபில் உள்ள ஸ்டைலஸ் பட்டனைத் தட்டவும்.</translation>
+<translation id="2341729377289034582">செங்குத்து நிலையில் பூட்டப்பட்டது</translation>
 <translation id="2352467521400612932">ஸ்டைலஸ் அமைப்புகள்</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> ஐச் செயல்படுத்துகிறது</translation>
 <translation id="2359808026110333948">தொடர்க</translation>
 <translation id="2365393535144473978">மொபைல் டேட்டாவை இயக்கினால், புளூடூத் இயக்கப்படும்.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">“தொந்தரவு செய்ய வேண்டாம்” நிலையை நிலைமாற்றும்</translation>
 <translation id="2412593942846481727">புதுப்பிப்பு உள்ளது</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> உடன் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="2429753432712299108">புளூடூத் சாதனம் "<ph name="DEVICE_NAME" />", இணைப்பதற்கான அனுமதியை விரும்புகிறது. ஏற்றுக்கொள்வதற்கு முன்னர், இந்தக் கடவுச்சொல் அந்தச் சாதனத்தில் காண்பிக்கப்பட்டது என்பதை உறுதிப்படுத்தவும்: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">அறிவிப்புகள்</translation>
 <translation id="2484513351006226581">விசைப்பலகைத் தளவமைப்பை மாற்ற, <ph name="KEYBOARD_SHORTCUT" /> விசையை அழுத்தவும்.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">இணைப்பைச் சேர்</translation>
 <translation id="2961963223658824723">ஏதோ தவறாகிவிட்டது. சில வினாடிகள் கழித்து மீண்டும் முயலவும்.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">அனுப்பும் சாதனங்களைக் காண்பிக்கும்.</translation>
 <translation id="2996462380875591307">டாக் செய்யப்பட்ட பெரிதாக்கி இயக்கப்பட்டது. அதை முடக்க, Ctrl+Search+Dயை மீண்டும் அழுத்தவும்.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> ஆனது <ph name="DOMAIN" /> ஆல் நிர்வகிக்கப்படும் பொது அமர்வாகும்</translation>
 <translation id="3000461861112256445">மோனோ ஆடியோ</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">மொபைல் டேட்டா</translation>
 <translation id="3151786313568798007">திசையமைப்பு</translation>
 <translation id="3153444934357957346">பல உள்நுழைவில் <ph name="MULTI_PROFILE_USER_LIMIT" /> கணக்குகள் வரை மட்டுமே வைத்திருக்கலாம்.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{ஒரு சாதனத்துடன் இணைக்கப்பட்டுள்ளது}other{# சாதனங்களுடன் இணைக்கப்பட்டுள்ளது}}</translation>
 <translation id="3236488194889173876">மொபைல் நெட்வொர்க் இல்லை</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">விருந்தினர்</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">பூட்டு</translation>
 <translation id="3798670284305777884">ஸ்பீக்கர் (அகம்)</translation>
 <translation id="380165613292957338">வணக்கம், நான் எவ்வாறு உதவலாம்?</translation>
+<translation id="383629559565718788">விசைப்பலகை அமைப்புகளைக் காண்பிக்கும்</translation>
 <translation id="3846575436967432996">நெட்வொர்க் தகவல் எதுவும் இல்லை</translation>
 <translation id="385051799172605136">முந்தைய பக்கம்</translation>
 <translation id="3891340733213178823">வெளியேற Ctrl+Shift+Q ஐ இருமுறை அழுத்தவும்.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">நடுத்தரமான சிக்னல்</translation>
 <translation id="4200057768455216496">டாக் செய்யப்பட்ட பெரிதாக்கியின் ஷார்ட்கட்டை அழுத்தியுள்ளீர்கள். அதை இயக்க விரும்புகிறீர்களா?</translation>
 <translation id="4217571870635786043">சொல்வதை எழுதுவது</translation>
+<translation id="4261870227682513959">அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். அறிவிப்புகள் முடக்கப்பட்டுள்ளன</translation>
 <translation id="4274921305979314545">உங்கள் Chromebookகை ஃபோனுடன் இணைக்கவும்</translation>
 <translation id="4279490309300973883">பிரதிபலிக்கிறது</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" />ஐச் செயல்படுத்துகிறது</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">உருப்பெருக்கி</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">அமைப்புகளை ஒத்திசைத்த பின்னர், "<ph name="FROM_LOCALE" />" இலிருந்து "<ph name="TO_LOCALE" />"க்கு மாற்றப்பட்டது.</translation>
 <translation id="574392208103952083">நடுநிலை</translation>
 <translation id="5744083938413354016">தட்டி நகர்த்துதல்</translation>
+<translation id="5750765938512549687">புளூடூத் முடக்கப்பட்டுள்ளது</translation>
 <translation id="5777841717266010279">திரைப் பகிர்வதை நிறுத்தவா?</translation>
 <translation id="57838592816432529">ஒலியடக்கு</translation>
 <translation id="5805697420284793859">சாளர நிர்வாகி</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">ஆன்-ஸ்கிரீன் விசைப்பலகையைக் காட்டு</translation>
 <translation id="6164005077879661055">இந்தக் கண்காணிக்கப்படும் பயனர் அகற்றப்பட்டவுடன் கண்காணிக்கப்படும் பயனருடன் தொடர்புடைய எல்லா கோப்புகளும், அகத் தரவும் நிரந்தரமாக நீக்கப்படும். இந்தக் கண்காணிக்கப்படும் பயனர் பார்வையிட்ட இணையதளங்களையும் அமைப்புகளையும் <ph name="MANAGEMENT_URL" /> இல் இன்னும் நிர்வாகியால் பார்க்க முடியும்.</translation>
 <translation id="6165508094623778733">மேலும் அறிக</translation>
+<translation id="6254629735336163724">கிடைமட்ட நிலையில் பூட்டப்பட்டது</translation>
 <translation id="6259254695169772643">தேர்ந்தெடுக்க, ஸ்டைலஸைப் பயன்படுத்தலாம்</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: செயல்படுத்துகிறது...</translation>
 <translation id="6284232397434400372">தெளிவு மாற்றப்பட்டது</translation>
 <translation id="6297287540776456956">பகுதியைத் தேர்ந்தெடுக்க, ஸ்டைஸைப் பயன்படுத்தவும்</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> <ph name="ROTATION" /> ஆகச் சுழற்றப்பட்டது</translation>
 <translation id="632744581670418035">விசைப்பலகை மேல்தோற்றம்</translation>
+<translation id="6376931439017688372">புளூடூத் இயக்கப்பட்டுள்ளது</translation>
 <translation id="639644700271529076">CAPS LOCK முடக்கப்பட்டுள்ளது</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">அனைத்தும் காட்டப்பட்டன</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">இந்த நெட்வொர்க் உங்கள் நிர்வாகியால் முடக்கப்பட்டுள்ளது.</translation>
 <translation id="7067196344162293536">தானியங்கு சுழற்றல்</translation>
 <translation id="7076293881109082629">உள்நுழைகிறீர்கள்</translation>
+<translation id="7092922358121866860">நைட் லைட் அமைப்புகளைக் காண்பிக்கும்</translation>
 <translation id="7098389117866926363">USB-C சாதனம் (பின்பக்கம் உள்ள இடது போர்ட்)</translation>
 <translation id="7131634465328662194">நீங்கள் தானாக வெளியேற்றப்படுவீர்கள்.</translation>
 <translation id="7143207342074048698">இணைத்தல்</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">ரத்துசெய்ய, தேடல் அல்லது ஷிஃப்ட் விசையை அழுத்தவும்.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> மற்றும் <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">வலுவான சிக்னல்</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> உடன் இணைக்கிறது</translation>
 <translation id="7842569679327885685">எச்சரிக்கை: சோதனை அம்சம்</translation>
 <translation id="7846634333498149051">விசைப்பலகை</translation>
 <translation id="790040513076446191">தனியுரிமைத் தொடர்பான அமைப்புகளை கையாளலாம்</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: மீண்டும் இணைக்கிறது...</translation>
 <translation id="8513108775083588393">தானாகச் சுழற்று</translation>
 <translation id="8517041960877371778">இயக்கப்பட்டிருக்கும் போது உங்கள் <ph name="DEVICE_TYPE" /> இல் சார்ஜ் ஏறாது.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> உடன் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> மீதமுள்ளது</translation>
 <translation id="8649101189709089199">பேசும் திரை</translation>
 <translation id="8652175077544655965">அமைப்புகளை மூடும்</translation>
+<translation id="8653151467777939995">அறிவிப்பு அமைப்புகளைக் காண்பிக்கும். அறிவிப்புகள் இயக்கப்பட்டுள்ளன</translation>
+<translation id="8664753092453405566">நெட்வொர்க் பட்டியலைக் காண்பிக்கும். <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">குறைந்த சக்தியிலான சார்ஜர் இணைக்கப்பட்டுள்ளது</translation>
 <translation id="8683506306463609433">செயல்திறன் டிரேஸிங் இயக்கத்தில்</translation>
 <translation id="8734991477317290293">அது உங்கள் விசை அழுத்தங்களைத் திருட முயற்சித்துக் கொண்டிருக்கக்கூடும்</translation>
+<translation id="8735953464173050365">விசைப்பலகை அமைப்புகளைக் காண்பிக்கும். <ph name="KEYBOARD_NAME" /> தேர்ந்தெடுக்கப்பட்டுள்ளது</translation>
+<translation id="875593634123171288">VPN அமைப்புகளைக் காண்பிக்கும்</translation>
 <translation id="8809737090443522491">பயன்பாடு அல்லது ஆவணத்தின் பெயரை உள்ளிடவும்</translation>
 <translation id="8814190375133053267">வைஃபை</translation>
 <translation id="8825534185036233643">இரண்டிற்கும் மேற்பட்ட திரைகளில் பிரதிபலிப்பது ஆதரிக்கப்படவில்லை.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">முந்தையது பொத்தான்</translation>
+<translation id="8843682306134542540">சுழற்சிப் பூட்டை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">திரையைப் பிரிப்பதைப் பயன்பாடு ஆதரிக்கவில்லை.</translation>
 <translation id="8874184842967597500">இணைக்கப்படவில்லை</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 69314f8c..3f2a58e 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -48,6 +48,7 @@
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME" />కు దర్పణం చేస్తోంది</translation>
 <translation id="1885785240814121742">వేలిముద్రతో అన్‌లాక్ చేయండి</translation>
 <translation id="1919743966458266018">విధి నిర్వాహికిని తెరిచే సత్వరమార్గం మార్చబడింది. దయచేసి <ph name="OLD_SHORTCUT" />కి బదులుగా <ph name="NEW_SHORTCUT" />ని ఉపయోగించండి.</translation>
+<translation id="1923508880661655826">మీరు సైన్ అవుట్ చేసినప్పుడు మీ సెషన్ క్లియర్ చేయబడుతుంది. <ph name="LEARN_MORE" /></translation>
 <translation id="1923539912171292317">స్వయంచాలక క్లిక్‌లు</translation>
 <translation id="1928739107511554905">అప్‌డేట్‌ని పొందడానికి, కీబోర్డ్‌‌ని అలానే జోడించి ఉంచి మీ Chromebookని పునఃప్రారంభించడం కోసం టచ్‌స్క్రీన్‌ని ఉపయోగించండి.</translation>
 <translation id="1942830294380034169">నిండిపోయిన బటన్</translation>
@@ -209,7 +210,9 @@
 <translation id="4905614135390995787">అధిక కాంట్రాస్ట్ మోడ్‌ను టోగుల్ చేయడానికి ఉన్న సత్వరమార్గం మార్చబడింది. దయచేసి <ph name="OLD_SHORTCUT" />కు బదులుగా <ph name="NEW_SHORTCUT" /> ఉపయోగించండి.</translation>
 <translation id="4917385247580444890">బలమైన</translation>
 <translation id="4918086044614829423">ఆమోదించు</translation>
+<translation id="4924411785043111640">మళ్లీ ప్రారంభించి, రీసెట్ చేయండి</translation>
 <translation id="4961318399572185831">స్క్రీన్ ప్రసారం చేయండి</translation>
+<translation id="5069971504769299223">మీ కార్యకలాపాన్ని పరికర మేనేజర్ పర్యవేక్షించవచ్చు.</translation>
 <translation id="5136175204352732067">వేరే కీబోర్డ్ కనెక్ట్ చేయబడింది</translation>
 <translation id="5168181903108465623">Cast పరికరాలు అందుబాటులో ఉన్నాయి</translation>
 <translation id="5207949376430453814">వచన కర్సర్ గుర్తును హైలైట్ చేయి</translation>
@@ -223,6 +226,7 @@
 <translation id="544691375626129091">అందుబాటులో ఉన్న వినియోగదారులందరూ ఇప్పటికే ఈ సెషన్‌కు జోడించబడ్డారు.</translation>
 <translation id="5457599981699367932">అతిథి వలె బ్రౌజ్ చెయ్యండి</translation>
 <translation id="54609108002486618">నిర్వహించబడింది</translation>
+<translation id="5496819745535887422">మీ నిర్వాహకుడు మీ పరికరాన్ని మళ్లీ ప్రారంభిస్తున్నారు. పరికరం మళ్లీ ప్రారంభించినప్పుడు మొత్తం డేటా తొలగించబడుతుంది.</translation>
 <translation id="553675580533261935">సెషన్ నుండి నిష్క్రమిస్తోంది</translation>
 <translation id="5537725057119320332">Cast</translation>
 <translation id="5548285847212963613">"<ph name="EXTENSION_NAME" />" పొడిగింపు ఈ నెట్‌వర్క్‌కు కనెక్ట్ చేయడంలో సహాయపడగలదు.</translation>
@@ -293,6 +297,7 @@
 <translation id="6627638273713273709">Search+Shift+K</translation>
 <translation id="6650933572246256093">బ్లూటూత్ పరికరం "<ph name="DEVICE_NAME" />" జత కావడానికి అనుమతి కోరుతోంది. దయచేసి ఆ పరికరంలో ఈ పాస్‌కీని నమోదు చేయండి: <ph name="PASSKEY" /></translation>
 <translation id="6657585470893396449">పాస్‌వర్డ్</translation>
+<translation id="6687966522050791666">భాష మరియు ఇన్‌పుట్‌ను ఎంచుకోండి</translation>
 <translation id="6691659475504239918">Search+Shift+H</translation>
 <translation id="6696025732084565524">మీ తీసివేయగల కీబోర్డ్‌కి ఒక ముఖ్యమైన అప్‌డేట్ అవసరం</translation>
 <translation id="6700713906295497288">IME మెను బటన్</translation>
@@ -414,6 +419,7 @@
 <translation id="8984179138335769204">శీఘ్ర ప్రారంభం</translation>
 <translation id="8995603266996330174"><ph name="DOMAIN" /> ద్వారా నిర్వహించబడుతోంది</translation>
 <translation id="9029474291399787231">Adobe Flash Player అప్‌డేట్ అందుబాటులో ఉంది</translation>
+<translation id="9056839673611986238">పరికరం తిరిగి ప్రారంభించబడుతుంది</translation>
 <translation id="9074739597929991885">Bluetooth</translation>
 <translation id="9079731690316798640">Wi-Fi: <ph name="ADDRESS" /></translation>
 <translation id="9080206825613744995">మైక్రోఫోన్ ఉపయోగంలో ఉంది.</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb
index 2a957c6..1d1d7d3 100644
--- a/ash/strings/ash_strings_th.xtb
+++ b/ash/strings/ash_strings_th.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">เพิ่ม <ph name="DEVICE_NAME" /> แล้ว</translation>
 <translation id="1056775291175587022">ไม่พบเครือข่าย</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">แสดงการตั้งค่าการเข้าถึงพิเศษ</translation>
 <translation id="1104621072296271835">อุปกรณ์จะทำงานได้ดียิ่งขึ้นเมื่อใช้ร่วมกัน</translation>
 <translation id="112308213915226829">ซ่อนชั้นวางโดยอัตโนมัติ</translation>
 <translation id="1153356358378277386">อุปกรณ์ที่จับคู่</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">สัญญาณไม่ดี</translation>
 <translation id="1293264513303784526">อุปกรณ์ USB-C (พอร์ตด้านซ้าย)</translation>
+<translation id="1302880136325416935">แสดงการตั้งค่าบลูทูธ <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">ขวา</translation>
 <translation id="1351937230027495976">ยุบเมนู</translation>
 <translation id="1383876407941801731">ค้นหา</translation>
 <translation id="1467432559032391204">ซ้าย</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">ตัวเรียกใช้งาน</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{แสดงการตั้งค่าการแจ้งเตือน ปิดการแจ้งเตือนไว้สำหรับ 1 แอป}other{แสดงการตั้งค่าการแจ้งเตือน ปิดการแจ้งเตือนไว้สำหรับ # แอป}}</translation>
 <translation id="1525508553941733066">ปิด</translation>
 <translation id="1537254971476575106">แว่นขยายทั้งหน้าจอ</translation>
 <translation id="15373452373711364">เคอร์เซอร์เมาส์ขนาดใหญ่</translation>
 <translation id="1550523713251050646">คลิกเพื่อดูตัวเลือกเพิ่มเติม</translation>
 <translation id="1567387640189251553">มีการเชื่อมต่อกับแป้นพิมพ์อื่นหลังจากที่คุณป้อนรหัสผ่านครั้งล่าสุด แป้นพิมพ์นี้อาจพยายามขโมยการกดแป้นพิมพ์ของคุณ</translation>
+<translation id="1570871743947603115">เปิด/ปิดบลูทูธ <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">ลบผู้ใช้รายนี้</translation>
 <translation id="1621499497873603021">เวลาที่เหลือกว่าแบตเตอรี่จะหมด, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">ขออภัย ยังคงยืนยันรหัสผ่านไม่ได้ หมายเหตุ: หากคุณเปลี่ยนแปลงรหัสผ่านไปเมื่อเร็วๆ นี้ รหัสผ่านใหม่จะมีผลเมื่อคุณออกจากระบบ โปรดใช้รหัสผ่านเดิมที่นี่</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">ไม่รู้จัก</translation>
 <translation id="1746730358044914197">ผู้ดูแลระบบเป็นคนกำหนดค่าวิธีการป้อนข้อมูล</translation>
 <translation id="1747827819627189109">เปิดใช้แป้นพิมพ์บนหน้าจออยู่</translation>
+<translation id="1761222317188459878">เปิด/ปิดการเชื่อมต่อเครือข่าย <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">อีเทอร์เน็ต: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Assistant (กำลังโหลด...)</translation>
 <translation id="1841545962859478868">ผู้ดูแลระบบของอุปกรณ์อาจตรวจสอบรายการต่อไปนี้</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">อุปกรณ์นี้ได้รับการจัดการโดย <ph name="DOMAIN" /></translation>
 <translation id="2050339315714019657">แนวตั้ง</translation>
 <translation id="2067602449040652523">ความสว่างของแป้นพิมพ์</translation>
+<translation id="2075212959500165896">ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง</translation>
 <translation id="2081529251031312395">$1 ยังมีสิทธิ์ลงชื่อเข้าใช้ภายหลังได้</translation>
 <translation id="2127372758936585790">ที่ชาร์จพลังงานต่ำ</translation>
 <translation id="2135456203358955318">แว่นขยายหน้าจอบางส่วน</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">ภาพรวมการสลับหน้าต่าง</translation>
 <translation id="2338501278241028356">เปิดบลูทูธเพื่อค้นหาอุปกรณ์ใกล้เคียง</translation>
 <translation id="2339073806695260576">แตะปุ่มสไตลัสในชั้นวางเพื่อจดโน้ต บันทึกภาพหน้าจอ ใช้ตัวชี้เลเซอร์ หรือแว่นขยาย</translation>
+<translation id="2341729377289034582">ล็อกไว้ที่แนวตั้งแล้ว</translation>
 <translation id="2352467521400612932">การตั้งค่าสไตลัส</translation>
 <translation id="2354174487190027830">กำลังเปิดใช้งาน <ph name="NAME" /></translation>
 <translation id="2359808026110333948">ดำเนินการต่อ</translation>
 <translation id="2365393535144473978">การเปิดใช้เน็ตมือถือจะเปิดใช้บลูทูธ</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">เปิด/ปิดห้ามรบกวน</translation>
 <translation id="2412593942846481727">มีเวอร์ชันอัปเดต</translation>
+<translation id="2416346634399901812">เชื่อมต่อ <ph name="NETWORK_NAME" /> แล้ว</translation>
 <translation id="2429753432712299108">อุปกรณ์บลูทูธ "<ph name="DEVICE_NAME" />" ต้องการสิทธิ์ในการจับคู่ ก่อนที่จะยอมรับ โปรดยืนยันว่ารหัสผ่านนี้ปรากฏบนอุปกรณ์นั้น: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">การแจ้งเตือน</translation>
 <translation id="2484513351006226581">กด <ph name="KEYBOARD_SHORTCUT" /> เพื่อสลับรูปแบบแป้นพิมพ์</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">เพิ่มการเชื่อมต่อ</translation>
 <translation id="2961963223658824723">เกิดข้อผิดพลาด โปรดลองอีกครั้งในอีกสักครู่</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">แสดงอุปกรณ์แคสต์</translation>
 <translation id="2996462380875591307">เปิดใช้แว่นขยายหน้าจอบางส่วนแล้ว กด Ctrl+Search+D อีกครั้งเพื่อสลับเป็นปิด</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> เป็นเซสชันสาธารณะซึ่งจัดการโดย <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">เสียงแบบโมโน</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">เน็ตมือถือ</translation>
 <translation id="3151786313568798007">การวางแนว</translation>
 <translation id="3153444934357957346">คุณมีบัญชีได้สูงสุด <ph name="MULTI_PROFILE_USER_LIMIT" /> บัญชีในการลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{เชื่อมต่ออุปกรณ์แล้ว 1 เครื่อง}other{เชื่อมต่ออุปกรณ์แล้ว # เครื่อง}}</translation>
 <translation id="3236488194889173876">ไม่มีเครือข่ายมือถือพร้อมใช้งาน</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">ผู้มาเยือน</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">ล็อก</translation>
 <translation id="3798670284305777884">ลำโพง (ภายใน)</translation>
 <translation id="380165613292957338">สวัสดี มีอะไรให้ฉันช่วยไหม</translation>
+<translation id="383629559565718788">แสดงการตั้งค่าแป้นพิมพ์</translation>
 <translation id="3846575436967432996">ไม่มีข้อมูลเครือข่ายที่สามารถใช้งานได้</translation>
 <translation id="385051799172605136">กลับ</translation>
 <translation id="3891340733213178823">กด Ctrl+Shift+Q 2 ครั้งเพื่อออกจากระบบ</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">สัญญาณแรงปานกลาง</translation>
 <translation id="4200057768455216496">คุณกดแป้นพิมพ์ลัดสำหรับแว่นขยายหน้าจอบางส่วน จะเปิดแว่นขยายไหม</translation>
 <translation id="4217571870635786043">การพิมพ์ตามคำบอก</translation>
+<translation id="4261870227682513959">แสดงการตั้งค่าการแจ้งเตือน การแจ้งเตือนปิดอยู่</translation>
 <translation id="4274921305979314545">เชื่อมต่อ Chromebook กับโทรศัพท์</translation>
 <translation id="4279490309300973883">กำลังแสดงผล</translation>
+<translation id="4292681942966152062">กำลังเปิดใช้งาน<ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">เปลี่ยนจาก "<ph name="FROM_LOCALE" />" เป็น "<ph name="TO_LOCALE" />" หลังการซิงก์การตั้งค่า</translation>
 <translation id="574392208103952083">ขนาดกลาง</translation>
 <translation id="5744083938413354016">การแตะลาก</translation>
+<translation id="5750765938512549687">ปิดบลูทูธแล้ว</translation>
 <translation id="5777841717266010279">ต้องการหยุดแชร์หน้าจอไหม</translation>
 <translation id="57838592816432529">ปิดเสียง</translation>
 <translation id="5805697420284793859">ตัวจัดการหน้าต่าง</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">แสดงแป้นพิมพ์บนหน้าจอ</translation>
 <translation id="6164005077879661055">ไฟล์และข้อมูลในตัวเครื่องทั้งหมดที่เกี่ยวข้องกับผู้ใช้ภายใต้การดูแลจะถูกลบออกอย่างถาวรเมื่อผู้ใช้ภายใต้การดูแลนี้ถูกลบ เว็บไซต์ที่เข้าชมและการตั้งค่าสำหรับผู้ใช้ภายใต้การดูแลนี้อาจจะยังคงมองเห็นได้โดยผู้จัดการที่ <ph name="MANAGEMENT_URL" /></translation>
 <translation id="6165508094623778733">ดูข้อมูลเพิ่มเติม</translation>
+<translation id="6254629735336163724">ล็อกไว้ที่แนวนอนแล้ว</translation>
 <translation id="6259254695169772643">ใช้สไตลัสเพื่อเลือก</translation>
 <translation id="6267036997247669271"><ph name="NAME" /> กำลังเปิดใช้งาน...</translation>
 <translation id="6284232397434400372">เปลี่ยนความละเอียดแล้ว</translation>
 <translation id="6297287540776456956">ใช้สไตลัสเพื่อเลือกพื้นที่</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> หมุนเวียนเป็น <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">การวางซ้อนแป้นพิมพ์</translation>
+<translation id="6376931439017688372">เปิดบลูทูธแล้ว</translation>
 <translation id="639644700271529076">CAPS LOCK ปิดอยู่</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">เสร็จเรียบร้อย</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">ผู้ดูแลระบบปิดใช้เครือข่ายนี้</translation>
 <translation id="7067196344162293536">หมุนอัตโนมัติ</translation>
 <translation id="7076293881109082629">กำลังลงชื่อเข้าใช้</translation>
+<translation id="7092922358121866860">แสดงการตั้งค่าแสงตอนกลางคืน</translation>
 <translation id="7098389117866926363">อุปกรณ์ USB-C (พอร์ตด้านหลังซ้าย)</translation>
 <translation id="7131634465328662194">คุณจะออกจากระบบโดยอัตโนมัติ</translation>
 <translation id="7143207342074048698">กำลังเชื่อมต่อ</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">กด Search หรือ Shift เพื่อยกเลิก</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> กับ <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">สัญญาณแรง</translation>
+<translation id="7842211907556571265">กำลังเชื่อมต่อ <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">คำเตือน: ฟีเจอร์ทดลอง</translation>
 <translation id="7846634333498149051">แป้นพิมพ์</translation>
 <translation id="790040513076446191">จัดการการตั้งค่าที่เกี่ยวข้องกับความเป็นส่วนตัว</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: กำลังเชื่อมต่อใหม่...</translation>
 <translation id="8513108775083588393">หมุนอัตโนมัติ</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> ของคุณอาจไม่ชาร์จเมื่อเครื่องเปิดอยู่</translation>
+<translation id="8627191004499078455">เชื่อมต่อ<ph name="DEVICE_NAME" />แล้ว</translation>
 <translation id="8639760480004882931">เหลือ <ph name="PERCENTAGE" />%</translation>
 <translation id="8649101189709089199">เลือกเพื่อให้อ่าน</translation>
 <translation id="8652175077544655965">ปิดการตั้งค่า</translation>
+<translation id="8653151467777939995">แสดงการตั้งค่าการแจ้งเตือน การแจ้งเตือนเปิดอยู่</translation>
+<translation id="8664753092453405566">แสดงรายการเครือข่าย <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">เชื่อมต่อกับที่ชาร์จพลังงานต่ำ</translation>
 <translation id="8683506306463609433">ใช้งานการติดตามประสิทธิภาพอยู่</translation>
 <translation id="8734991477317290293">แป้นพิมพ์นี้อาจพยายามขโมยการกดแป้นพิมพ์ของคุณ</translation>
+<translation id="8735953464173050365">แสดงการตั้งค่าแป้นพิมพ์ เลือก<ph name="KEYBOARD_NAME" />ไว้</translation>
+<translation id="875593634123171288">แสดงการตั้งค่า VPN</translation>
 <translation id="8809737090443522491">พิมพ์ชื่อแอปหรือเอกสาร</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">ไม่สนับสนุนการมิเรอร์บนจอแสดงผลเกิน 2 หน้าจอ</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">ปุ่มกลับ</translation>
+<translation id="8843682306134542540">เปิด/ปิดการล็อกการหมุน <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">แอปไม่สนับสนุนการแยกหน้าจอ</translation>
 <translation id="8874184842967597500">ไม่ได้เชื่อมต่อ</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb
index d2b7d8f..e100045 100644
--- a/ash/strings/ash_strings_tr.xtb
+++ b/ash/strings/ash_strings_tr.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> eklendi</translation>
 <translation id="1056775291175587022">Hücresel ağ yok</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Erişilebilirlik ayarlarını göster</translation>
 <translation id="1104621072296271835">Cihazlarınız birlikte daha da iyi çalışır</translation>
 <translation id="112308213915226829">Rafı otomatik gizle</translation>
 <translation id="1153356358378277386">Eşlenen cihazlar</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Zayıf sinyal</translation>
 <translation id="1293264513303784526">USB-C cihaz (sol bağlantı noktası)</translation>
+<translation id="1302880136325416935">Bluetooth ayarlarını göster. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Sağa</translation>
 <translation id="1351937230027495976">Menüyü daralt</translation>
 <translation id="1383876407941801731">Ara</translation>
 <translation id="1467432559032391204">Sola</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Başlatıcı</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Bildirim ayarlarını göster. Bildirimler bir uygulama için kapalı}other{Bildirim ayarlarını göster. Bildirimler # uygulama için kapalı}}</translation>
 <translation id="1525508553941733066">KAPAT</translation>
 <translation id="1537254971476575106">Tam ekran büyüteci</translation>
 <translation id="15373452373711364">Büyük fare imleci</translation>
 <translation id="1550523713251050646">Daha fazla seçenek için tıklayın</translation>
 <translation id="1567387640189251553">Şifrenizi son girdiğinizden bu yana farklı bir klavye bağlandı. Bu klavye, tuş vuruşlarınızı çalmaya çalışıyor olabilir.</translation>
+<translation id="1570871743947603115">Bluetooth'u aç/kapat. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Bu kullanıcıyı kaldır</translation>
 <translation id="1621499497873603021">Pilin boşalması için kalan süre, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Maalesef şifreniz hâlâ doğrulanamadı. Not: Şifrenizi yakın zamanda değiştirdiyseniz, yeni şifreniz oturumu kapatmanızdan sonra geçerli olacaktır. Lütfen burada eski şifrenizi kullanın.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Tanınmadı</translation>
 <translation id="1746730358044914197">Giriş yöntemleri, yöneticiniz tarafından yapılandırılır.</translation>
 <translation id="1747827819627189109">Dokunmatik klavye etkin</translation>
+<translation id="1761222317188459878">Ağ bağlantısını aç/kapat. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Asistan (yükleniyor...)</translation>
 <translation id="1841545962859478868">Cihaz yöneticisi aşağıdakileri izleyebilir:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Bu cihaz <ph name="DOMAIN" /> tarafından yönetiliyor.</translation>
 <translation id="2050339315714019657">Dikey</translation>
 <translation id="2067602449040652523">Klavye parlaklığı</translation>
+<translation id="2075212959500165896">Çok fazla deneme yapıldı. Daha sonra tekrar deneyin.</translation>
 <translation id="2081529251031312395">$1 daha sonra yine oturum açabilir.</translation>
 <translation id="2127372758936585790">Düşük güçlü şarj cihazı</translation>
 <translation id="2135456203358955318">Yerleştirilmiş büyüteç</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Pencere genel bakışını değiştir</translation>
 <translation id="2338501278241028356">Yakındaki cihazları keşfetmek için Bluetooth'u aç</translation>
 <translation id="2339073806695260576">Not veya ekran görüntüsü almak, lazer işaretçi veya büyüteç işlevlerini kullanmak için raftaki ekran kalemi düğmesine dokunun.</translation>
+<translation id="2341729377289034582">Dikey olarak kilitlendi</translation>
 <translation id="2352467521400612932">Ekran kalemi ayarları</translation>
 <translation id="2354174487190027830"><ph name="NAME" /> etkinleştiriliyor</translation>
 <translation id="2359808026110333948">Devam Et</translation>
 <translation id="2365393535144473978">Mobil veri etkinleştirildiğinde Bluetooth açılır.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Rahatsız etmeyin modunu aç/kapat</translation>
 <translation id="2412593942846481727">Güncelleme var</translation>
+<translation id="2416346634399901812"><ph name="NETWORK_NAME" /> ağına bağlandı</translation>
 <translation id="2429753432712299108">"<ph name="DEVICE_NAME" />" adlı Bluetooth cihaz eşleme izni istiyor. Kabul etmeden önce şu cihazda gösterilen bu parolanın gösterildiğini onaylayın: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Bildirimler</translation>
 <translation id="2484513351006226581">Klavye düzenini değiştirmek için <ph name="KEYBOARD_SHORTCUT" /> tuşlarına basın.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Bağlantı ekle</translation>
 <translation id="2961963223658824723">Bir sorun oluştu. Birkaç saniye sonra tekrar deneyin.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Yayın cihazlarını göster.</translation>
 <translation id="2996462380875591307">Yerleştirilmiş Büyüteç etkinleştirildi. Kapatmak için tekrar Ctrl+Arama+H tuşlarına basın.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" />, <ph name="DOMAIN" /> tarafından yönetilen herkese açık bir oturumdur</translation>
 <translation id="3000461861112256445">Mono ses</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Mobil veriler</translation>
 <translation id="3151786313568798007">Yön</translation>
 <translation id="3153444934357957346">Çoklu oturum açmada en fazla <ph name="MULTI_PROFILE_USER_LIMIT" /> hesabınız olabilir.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Bir cihaza bağlı}other{# cihaza bağlı}}</translation>
 <translation id="3236488194889173876">Kullanılabilir mobil ağ yok</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Misafir</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Kilitle</translation>
 <translation id="3798670284305777884">Hoparlör (dahili)</translation>
 <translation id="380165613292957338">Merhaba, nasıl yardımcı olabilirim?</translation>
+<translation id="383629559565718788">Klavye ayarlarını göster</translation>
 <translation id="3846575436967432996">Hiçbir ağ bilgisi yok</translation>
 <translation id="385051799172605136">Geri</translation>
 <translation id="3891340733213178823">Oturumu kapatmak için Ctrl+ÜstKrktr+Q tuşlarına iki defa basın.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Orta düzeyde sinyal</translation>
 <translation id="4200057768455216496">Yerleştirilmiş büyüteç kısayoluna bastınız. Bu özelliği açmak istiyor musunuz?</translation>
 <translation id="4217571870635786043">Dikte</translation>
+<translation id="4261870227682513959">Bildirim ayarlarını göster. Bildirimler kapalı</translation>
 <translation id="4274921305979314545">Chromebook'unuzu telefonunuza bağlayın</translation>
 <translation id="4279490309300973883">Yansıtılıyor</translation>
+<translation id="4292681942966152062"><ph name="NETWORK_NAME" /> etkinleştiriliyor</translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">Büyüteç</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Ayarlarınız senkronize edildikten sonra "<ph name="FROM_LOCALE" />" olan dil "<ph name="TO_LOCALE" />" olarak değiştirildi.</translation>
 <translation id="574392208103952083">Orta</translation>
 <translation id="5744083938413354016">Dokunarak sürükleme</translation>
+<translation id="5750765938512549687">Bluetooth kapalı</translation>
 <translation id="5777841717266010279">Ekran paylaşma durdurulsun mu?</translation>
 <translation id="57838592816432529">Sesi kapat</translation>
 <translation id="5805697420284793859">Pencere yöneticisi</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Dokunmatik klavyeyi göster</translation>
 <translation id="6164005077879661055">Denetlenen bu kullanıcı kaldırıldığında denetlenen kullanıcıyla ilişkilendirilmiş tüm dosyalar ve yerel veriler kalıcı olarak silinir. Yönetici, denetlenen bu kullanıcıya ilişkin ziyaret edilen web sayfaları ve ayarları <ph name="MANAGEMENT_URL" /> adresinden görüntülemeye devam edebilir.</translation>
 <translation id="6165508094623778733">Daha fazla bilgi edinin</translation>
+<translation id="6254629735336163724">Yatay olarak kilitlendi</translation>
 <translation id="6259254695169772643">Seçmek için ekran kaleminizi kullanın</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Etkinleştiriliyor...</translation>
 <translation id="6284232397434400372">Çözünürlük değiştirildi</translation>
 <translation id="6297287540776456956">Alan seçmek için ekran kalemini kullanın</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> dönme ayarı <ph name="ROTATION" /> olarak değiştirildi</translation>
 <translation id="632744581670418035">Klavye yer paylaşımı</translation>
+<translation id="6376931439017688372">Bluetooth açık</translation>
 <translation id="639644700271529076">CAPS LOCK kapalı</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Tümü bitti</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Bu ağ, yöneticiniz tarafından devre dışı bırakıldı.</translation>
 <translation id="7067196344162293536">Otomatik döndür</translation>
 <translation id="7076293881109082629">Oturum açılıyor</translation>
+<translation id="7092922358121866860">Gece Işığı ayarlarını göster</translation>
 <translation id="7098389117866926363">USB-C cihaz (arkadaki sol bağlantı noktası)</translation>
 <translation id="7131634465328662194">Oturumunuz otomatik olarak kapatılacak.</translation>
 <translation id="7143207342074048698">Bağlanıyor</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">İptal etmek için Ara veya Üst Karakter tuşuna basın.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> ve <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Güçlü sinyal</translation>
+<translation id="7842211907556571265"><ph name="NETWORK_NAME" /> ağına bağlanılıyor</translation>
 <translation id="7842569679327885685">Uyarı: Deneysel özellik</translation>
 <translation id="7846634333498149051">Klavye</translation>
 <translation id="790040513076446191">Gizlilikle ilgili ayarları değiştirme</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Yeniden bağlanılıyor...</translation>
 <translation id="8513108775083588393">Otomatik döndür</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> cihazınız açıkken şarj olmayabilir.</translation>
+<translation id="8627191004499078455"><ph name="DEVICE_NAME" /> cihazına bağlandı</translation>
 <translation id="8639760480004882931"><ph name="PERCENTAGE" /> kaldı</translation>
 <translation id="8649101189709089199">Seç ve Dinle</translation>
 <translation id="8652175077544655965">Ayarları kapat</translation>
+<translation id="8653151467777939995">Bildirim ayarlarını göster. Bildirimler açık</translation>
+<translation id="8664753092453405566">Ağ listesini göster. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Düşük güçlü şarj cihazı bağlandı</translation>
 <translation id="8683506306463609433">Performans izleme etkin</translation>
 <translation id="8734991477317290293">Bu klavye, tuş vuruşlarınızı çalmaya çalışıyor olabilir</translation>
+<translation id="8735953464173050365">Klavye ayarlarını göster. <ph name="KEYBOARD_NAME" /> seçildi</translation>
+<translation id="875593634123171288">VPN ayarlarını göster</translation>
 <translation id="8809737090443522491">Bir uygulamanın veya dokümanın adını yazın</translation>
 <translation id="8814190375133053267">Kablosuz</translation>
 <translation id="8825534185036233643">İkiden fazla ekranla yansıtma desteklenmez.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Geri düğmesi</translation>
+<translation id="8843682306134542540">Döndürme kilidini aç/kapat. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Ara+Esc</translation>
 <translation id="8870509716567206129">Uygulama bölünmüş ekranı desteklemiyor.</translation>
 <translation id="8874184842967597500">Bağlı değil</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb
index 585650b..a0c0fc2 100644
--- a/ash/strings/ash_strings_uk.xtb
+++ b/ash/strings/ash_strings_uk.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303"><ph name="DEVICE_NAME" /> додано</translation>
 <translation id="1056775291175587022">Немає мереж</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Показати налаштування спеціальних можливостей</translation>
 <translation id="1104621072296271835">Ваші пристрої працюватимуть разом ще краще</translation>
 <translation id="112308213915226829">Автоматично ховати полицю</translation>
 <translation id="1153356358378277386">Підключені пристрої</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">слабкий сигнал</translation>
 <translation id="1293264513303784526">Пристрій із портом USB типу C (ліворуч)</translation>
+<translation id="1302880136325416935">Показати налаштування Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Праворуч</translation>
 <translation id="1351937230027495976">Згорнути меню</translation>
 <translation id="1383876407941801731">Пошук</translation>
 <translation id="1467432559032391204">Ліворуч</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Панель запуску</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Показати налаштування сповіщень. Сповіщення вимкнено для додатка}one{Показати налаштування сповіщень. Сповіщення вимкнено для # додатка}few{Показати налаштування сповіщень. Сповіщення вимкнено для # додатків}many{Показати налаштування сповіщень. Сповіщення вимкнено для # додатків}other{Показати налаштування сповіщень. Сповіщення вимкнено для # додатка}}</translation>
 <translation id="1525508553941733066">ЗАКРИТИ</translation>
 <translation id="1537254971476575106">Лупа для всього екрана</translation>
 <translation id="15373452373711364">Великий курсор миші</translation>
 <translation id="1550523713251050646">Натисніть, щоб побачити більше опцій</translation>
 <translation id="1567387640189251553">Після останнього введення пароля було під’єднано іншу клавіатуру. Можливо, це спроба викрасти введені символи.</translation>
+<translation id="1570871743947603115">Увімкнути/вимкнути Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Вилучити цього користувача</translation>
 <translation id="1621499497873603021">До розрядження акумулятора залишилося <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">На жаль, поки не вдалося підтвердити ваш пароль. Зверніть увагу: якщо ви нещодавно змінили пароль, новий пароль буде застосовано, щойно ви вийдете з облікового запису. Скористайтеся старим паролем тут.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Не розпізнано</translation>
 <translation id="1746730358044914197">Адміністратор налаштував методи введення.</translation>
 <translation id="1747827819627189109">Екранну клавіатуру ввімкнено</translation>
+<translation id="1761222317188459878">Увімкнути/вимкнути з’єднання з мережею. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Асистент (завантаження…)</translation>
 <translation id="1841545962859478868">Адміністратор пристрою може відстежувати таку інформацію:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Цим пристроєм керує домен <ph name="DOMAIN" />.</translation>
 <translation id="2050339315714019657">Портретна</translation>
 <translation id="2067602449040652523">Яскравість клавіатури</translation>
+<translation id="2075212959500165896">Забагато спроб. Повторіть пізніше.</translation>
 <translation id="2081529251031312395">$1 усе одно зможе ввійти в обліковий запис.</translation>
 <translation id="2127372758936585790">Зарядний пристрій низької потужності</translation>
 <translation id="2135456203358955318">Закріплена лупа</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Увімкнення чи вимкнення вікна перегляду</translation>
 <translation id="2338501278241028356">Щоб знайти пристрої поблизу, увімкніть Bluetooth</translation>
 <translation id="2339073806695260576">Щоб робити нотатки та знімки екрана, використовувати лазерний вказівник чи лупу, торкніться кнопки стилуса на полиці.</translation>
+<translation id="2341729377289034582">Заблоковано у вертикальному положенні</translation>
 <translation id="2352467521400612932">Налаштування стилуса</translation>
 <translation id="2354174487190027830">Активація <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Продовжити</translation>
 <translation id="2365393535144473978">Якщо ввімкнути мобільне передавання даних, увімкнеться Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Увімкнути/вимкнути режим "Не турбувати"</translation>
 <translation id="2412593942846481727">Доступне оновлення</translation>
+<translation id="2416346634399901812">Під’єднано до мережі: <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Пристрою Bluetooth "<ph name="DEVICE_NAME" />" потрібен дозвіл на підключення. Перш ніж надати його, підтвердьте, що на пристрої відображається цей ключ доступу: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Сповіщення</translation>
 <translation id="2484513351006226581">Натисніть комбінацію клавіш <ph name="KEYBOARD_SHORTCUT" />, щоб змінити розкладку клавіатури.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Додати з’єднання</translation>
 <translation id="2961963223658824723">Сталася помилка. Повторіть спробу за кілька секунд.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Показати пристрої для трансляції</translation>
 <translation id="2996462380875591307">Увімкнено закріплену лупу. Щоб вимкнути її, знову натисніть комбінацію Ctrl + клавіша пошуку + D.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> – загальнодоступний сеанс, керований доменом <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Монофонічне аудіо</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Мобільне передавання даних</translation>
 <translation id="3151786313568798007">Орієнтація</translation>
 <translation id="3153444934357957346">Максимальна кількість паралельних входів в обліковий запис: <ph name="MULTI_PROFILE_USER_LIMIT" />.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Під’єднано до пристрою}one{Під’єднано до # пристрою}few{Під’єднано до # пристроїв}many{Під’єднано до # пристроїв}other{Під’єднано до # пристрою}}</translation>
 <translation id="3236488194889173876">Немає мобільних мереж</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Гість</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Заблокувати</translation>
 <translation id="3798670284305777884">Динамік (внутрішній)</translation>
 <translation id="380165613292957338">Вітаю! Чим я можу допомогти?</translation>
+<translation id="383629559565718788">Показати налаштування клавіатури</translation>
 <translation id="3846575436967432996">Інформація про мережу не доступна</translation>
 <translation id="385051799172605136">Назад</translation>
 <translation id="3891340733213178823">Щоб вийти, двічі натисніть Ctrl+Shift+Q.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">середній сигнал</translation>
 <translation id="4200057768455216496">Ви натиснули комбінацію клавіш для закріпленої лупи. Увімкнути?</translation>
 <translation id="4217571870635786043">Диктування</translation>
+<translation id="4261870227682513959">Показати налаштування сповіщень. Сповіщення вимкнено</translation>
 <translation id="4274921305979314545">Підключіть Chromebook до телефона</translation>
 <translation id="4279490309300973883">Дзеркальне відображення</translation>
+<translation id="4292681942966152062">Активується мережа: <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">ОС Chrome</translation>
 <translation id="4338109981321384717">Лупа</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">Після синхронізації налаштувань мову змінено. Попередня мова: <ph name="FROM_LOCALE" />, нова: <ph name="TO_LOCALE" />.</translation>
 <translation id="574392208103952083">Середній</translation>
 <translation id="5744083938413354016">Перетягування дотиком</translation>
+<translation id="5750765938512549687">Bluetooth вимкнено</translation>
 <translation id="5777841717266010279">Скасувати спільний доступ до екрана?</translation>
 <translation id="57838592816432529">Вимкнути звук</translation>
 <translation id="5805697420284793859">Диспетчер вікон</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">Показувати екранну клавіатуру</translation>
 <translation id="6164005077879661055">Усі файли та локальні дані, пов’язані з контрольованим користувачем, буде назавжди видалено, якщо вилучити цього контрольованого користувача. Менеджер усе одно може бачити веб-сайти, які відвідував цей контрольований користувач, і його налаштування на сторінці <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Докладніше</translation>
+<translation id="6254629735336163724">Заблоковано в горизонтальному положенні</translation>
 <translation id="6259254695169772643">Вибирайте елементи за допомогою стилуса</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: активація…</translation>
 <translation id="6284232397434400372">Роздільну здатність змінено</translation>
 <translation id="6297287540776456956">Виберіть область за допомогою стилуса</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> обернено на <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Накладання клавіатури</translation>
+<translation id="6376931439017688372">Bluetooth увімкнено</translation>
 <translation id="639644700271529076">Режим CAPS LOCK вимкнено</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Готово</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">Ваш адміністратор вимкнув цю мережу.</translation>
 <translation id="7067196344162293536">Автоматичне обертання</translation>
 <translation id="7076293881109082629">Вхід</translation>
+<translation id="7092922358121866860">Показати налаштування нічного режиму</translation>
 <translation id="7098389117866926363">Пристрій, під’єднаний до порту USB-C (ліворуч на задній панелі)</translation>
 <translation id="7131634465328662194">Ви вийдете автоматично.</translation>
 <translation id="7143207342074048698">Під’єднання</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">Щоб скасувати, натисніть клавішу Search або Shift.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> і <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">потужний сигнал</translation>
+<translation id="7842211907556571265">Під’єднання до мережі: <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Попередження. Експериментальна функція</translation>
 <translation id="7846634333498149051">Клавіатура</translation>
 <translation id="790040513076446191">Керувати налаштуваннями, пов’язаними з конфіденційністю</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: під’єднання…</translation>
 <translation id="8513108775083588393">Автообертання</translation>
 <translation id="8517041960877371778">Пристрій <ph name="DEVICE_TYPE" /> може не заряджатися, коли він увімкнений.</translation>
+<translation id="8627191004499078455">Під’єднано до пристрою: <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Залишилося <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Читання з екрана</translation>
 <translation id="8652175077544655965">Закрити налаштування</translation>
+<translation id="8653151467777939995">Показати налаштування сповіщень. Сповіщення ввімкнено</translation>
+<translation id="8664753092453405566">Показати список мереж. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Зарядний пристрій низької потужності підключено</translation>
 <translation id="8683506306463609433">Відстеження ефективності активне</translation>
 <translation id="8734991477317290293">Можливо, це спроба викрасти введенні символи.</translation>
+<translation id="8735953464173050365">Показати налаштування клавіатури. Вибрано: <ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">Показати налаштування VPN</translation>
 <translation id="8809737090443522491">Введіть назву додатка або документа</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Дзеркалювання на більше ніж двох дисплеях не підтримується.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Кнопка "Назад"</translation>
+<translation id="8843682306134542540">Заблокувати/розблокувати обертання. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search (Пошук)+Esc</translation>
 <translation id="8870509716567206129">Додаток не підтримує розділення екрана.</translation>
 <translation id="8874184842967597500">Не під’єднано</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb
index 60216f4..7399d561 100644
--- a/ash/strings/ash_strings_vi.xtb
+++ b/ash/strings/ash_strings_vi.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">Đã thêm <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">Không có mạng</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />: <ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">Hiển thị các tùy chọn cài đặt hỗ trợ tiếp cận</translation>
 <translation id="1104621072296271835">Các thiết bị của bạn hoạt động hiệu quả hơn khi kết nối với nhau</translation>
 <translation id="112308213915226829">Tự động ẩn giá</translation>
 <translation id="1153356358378277386">Thiết bị được ghép nối</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">Tín hiệu yếu</translation>
 <translation id="1293264513303784526">Thiết bị USB-C (cổng bên trái)</translation>
+<translation id="1302880136325416935">Hiển thị các tùy chọn cài đặt Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">Phải</translation>
 <translation id="1351937230027495976">Thu gọn menu</translation>
 <translation id="1383876407941801731">Tìm kiếm</translation>
 <translation id="1467432559032391204">Trái</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">Trình chạy</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{Hiển thị tùy chọn cài đặt thông báo. Các thông báo hiện đang tắt cho một ứng dụng}other{Hiển thị tùy chọn cài đặt thông báo. Các thông báo hiện đang tắt cho # ứng dụng}}</translation>
 <translation id="1525508553941733066">LOẠI BỎ</translation>
 <translation id="1537254971476575106">Phóng to toàn bộ màn hình</translation>
 <translation id="15373452373711364">Con trỏ chuột lớn</translation>
 <translation id="1550523713251050646">Nhấp để xem các tùy chọn khác</translation>
 <translation id="1567387640189251553">Một bàn phím khác đã được kết nối kể từ lần gần đây nhất bạn nhập mật khẩu của mình. Bàn phím này có thể đang cố gắng đánh cắp thao tác nhấn phím của bạn.</translation>
+<translation id="1570871743947603115">Bật/tắt Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">Xóa người dùng này</translation>
 <translation id="1621499497873603021">Thời gian còn lại cho đến khi pin hết, <ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">Rất tiếc, chúng tôi vẫn không thể xác minh được mật khẩu của bạn. Lưu ý: nếu gần đây bạn đã đổi mật khẩu thì mật khẩu mới của bạn sẽ được áp dụng sau khi bạn đăng xuất. Vui lòng sử dụng mật khẩu cũ của bạn tại đây.</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">Không nhận dạng được</translation>
 <translation id="1746730358044914197">Các phương thức nhập do quản trị viên của bạn định cấu hình.</translation>
 <translation id="1747827819627189109">Đã bật bàn phím ảo</translation>
+<translation id="1761222317188459878">Bật/tắt kết nối mạng. <ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">Trợ lý (đang tải...)</translation>
 <translation id="1841545962859478868">Quản trị viên thiết bị có thể theo dõi các vấn đề sau đây:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">Thiết bị này được <ph name="DOMAIN" /> quản lý.</translation>
 <translation id="2050339315714019657">Khổ dọc</translation>
 <translation id="2067602449040652523">Độ sáng bàn phím</translation>
+<translation id="2075212959500165896">Bạn đã thử quá nhiều lần. Hãy thử lại sau.</translation>
 <translation id="2081529251031312395">$1 vẫn có thể đăng nhập sau.</translation>
 <translation id="2127372758936585790">Bộ sạc công suất thấp</translation>
 <translation id="2135456203358955318">Phóng to ở vị trí cố định</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">Tổng quan về chuyển đổi cửa sổ</translation>
 <translation id="2338501278241028356">Bật Bluetooth để khám phá các thiết bị lân cận</translation>
 <translation id="2339073806695260576">Hãy nhấn vào nút bút cảm ứng trên giá để ghi chú, chụp ảnh màn hình, sử dụng con trỏ laser hoặc kính lúp.</translation>
+<translation id="2341729377289034582">Đã khóa theo chiều dọc</translation>
 <translation id="2352467521400612932">Cài đặt bút cảm ứng</translation>
 <translation id="2354174487190027830">Kích hoạt <ph name="NAME" /></translation>
 <translation id="2359808026110333948">Tiếp tục</translation>
 <translation id="2365393535144473978">Bật dữ liệu di động sẽ bật Bluetooth.</translation>
 <translation id="2391579633712104609">180°</translation>
+<translation id="239188844683466770">Bật/tắt trạng thái Không làm phiền</translation>
 <translation id="2412593942846481727">Đã có bản cập nhật</translation>
+<translation id="2416346634399901812">Đã kết nối với <ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">Thiết bị Bluetooth "<ph name="DEVICE_NAME" />" muốn được phép ghép nối. Trước khi chấp nhận, vui lòng xác nhận rằng mã xác nhận này đã hiển thị trên thiết bị đó: <ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">Thông báo</translation>
 <translation id="2484513351006226581">Hãy nhấn <ph name="KEYBOARD_SHORTCUT" /> để chuyển bố cục bàn phím.</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">Thêm kết nối</translation>
 <translation id="2961963223658824723">Đã xảy ra sự cố. Hãy thử lại sau vài giây.</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">Hiển thị các thiết bị truyền.</translation>
 <translation id="2996462380875591307">Đã bật tính năng Phóng to ở vị trí cố định. Hãy nhấn lại tổ hợp phím Ctrl+Search+D để tắt tính năng này.</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> là phiên công khai được quản lý bởi <ph name="DOMAIN" /></translation>
 <translation id="3000461861112256445">Đơn âm</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">Dữ liệu di động</translation>
 <translation id="3151786313568798007">Hướng</translation>
 <translation id="3153444934357957346">Bạn chỉ có thể có tối đa <ph name="MULTI_PROFILE_USER_LIMIT" /> tài khoản khi sử dụng tính năng đăng nhập nhiều tài khoản.</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{Đã kết nối với một thiết bị}other{Đã kết nối với # thiết bị}}</translation>
 <translation id="3236488194889173876">Không có mạng di động nào</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">Khách</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">Khóa</translation>
 <translation id="3798670284305777884">Loa (bên trong)</translation>
 <translation id="380165613292957338">Xin chào, tôi có thể trợ giúp gì?</translation>
+<translation id="383629559565718788">Hiển thị các tùy chọn cài đặt bàn phím</translation>
 <translation id="3846575436967432996">Không có thông tin mạng</translation>
 <translation id="385051799172605136">Quay lại</translation>
 <translation id="3891340733213178823">Nhấn Ctrl+Shift+Q hai lần để đăng xuất.</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">Tín hiệu trung bình</translation>
 <translation id="4200057768455216496">Bạn đã nhấn phím tắt của tính năng phóng to ở vị trí cố định. Bạn có muốn bật tính năng này không?</translation>
 <translation id="4217571870635786043">Nhập bằng giọng nói</translation>
+<translation id="4261870227682513959">Hiển thị các tùy chọn cài đặt thông báo. Thông báo hiện đang tắt</translation>
 <translation id="4274921305979314545">Kết nối Chromebook với điện thoại của bạn</translation>
 <translation id="4279490309300973883">Đang phản chiếu</translation>
+<translation id="4292681942966152062">Đang kích hoạt <ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">ctrl</translation>
 <translation id="4331809312908958774">Chrome OS
 </translation>
@@ -240,6 +254,7 @@
 <translation id="5673434351075758678">Từ "<ph name="FROM_LOCALE" />" sang "<ph name="TO_LOCALE" />" sau khi đồng bộ hóa cài đặt của bạn.</translation>
 <translation id="574392208103952083">Trung bình</translation>
 <translation id="5744083938413354016">Kéo nhấn</translation>
+<translation id="5750765938512549687">Bluetooth đang tắt</translation>
 <translation id="5777841717266010279">Bạn muốn dừng chia sẻ màn hình?</translation>
 <translation id="57838592816432529">Tắt tiếng</translation>
 <translation id="5805697420284793859">Trình quản lý cửa sổ</translation>
@@ -273,12 +288,14 @@
 <translation id="615957422585914272">Hiển thị bàn phím ảo</translation>
 <translation id="6164005077879661055">Tất cả các tệp và dữ liệu trên máy được liên kết với người dùng được giám sát sẽ vĩnh viễn bị xóa khi người dùng được giám sát này bị xóa. Các trang web đã truy cập và các cài đặt của người dùng được giám sát này có thể vẫn hiển thị với người quản lý tại <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Tìm hiểu thêm</translation>
+<translation id="6254629735336163724">Đã khóa theo chiều ngang</translation>
 <translation id="6259254695169772643">Sử dụng bút cảm ứng để chọn</translation>
 <translation id="6267036997247669271"><ph name="NAME" />: Đang kích hoạt...</translation>
 <translation id="6284232397434400372">Đã thay đổi độ phân giải</translation>
 <translation id="6297287540776456956">Sử dụng bút cảm ứng để chọn một vùng</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> đã được xoay vòng sang <ph name="ROTATION" /></translation>
 <translation id="632744581670418035">Lớp phủ bàn phím</translation>
+<translation id="6376931439017688372">Bluetooth đang bật</translation>
 <translation id="639644700271529076">CAPS LOCK tắt</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">Đã xong</translation>
@@ -322,6 +339,7 @@
 <translation id="7066646422045619941">Mạng này bị quản trị viên của bạn tắt.</translation>
 <translation id="7067196344162293536">Tự động xoay</translation>
 <translation id="7076293881109082629">Đăng nhập</translation>
+<translation id="7092922358121866860">Hiển thị các tùy chọn cài đặt Chế độ ánh sáng ban đêm</translation>
 <translation id="7098389117866926363">Thiết bị USB-C (cổng bên trái ở phía sau)</translation>
 <translation id="7131634465328662194">Bạn sẽ tự động bị đăng xuất.</translation>
 <translation id="7143207342074048698">Đang kết nối</translation>
@@ -357,6 +375,7 @@
 <translation id="7798302898096527229">Nhấn phím Search hoặc Shift để hủy.</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> và <ph name="MINUTE" /></translation>
 <translation id="7829386189513694949">Tín hiệu mạnh</translation>
+<translation id="7842211907556571265">Đang kết nối với <ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">Cảnh báo: Tính năng thử nghiệm</translation>
 <translation id="7846634333498149051">Bàn phím</translation>
 <translation id="790040513076446191">Thực hiện cài đặt liên quan đến bảo mật</translation>
@@ -397,18 +416,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />: Đang kết nối lại...</translation>
 <translation id="8513108775083588393">Tự động xoay</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> của bạn có thể không sạc khi được bật.</translation>
+<translation id="8627191004499078455">Đã kết nối với <ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">Còn <ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">Chọn để nói</translation>
 <translation id="8652175077544655965">Đóng cài đặt</translation>
+<translation id="8653151467777939995">Hiển thị các tùy chọn cài đặt thông báo. Thông báo đang tắt</translation>
+<translation id="8664753092453405566">Hiển thị danh sách mạng. <ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270°</translation>
 <translation id="8676770494376880701">Đã kết nối bộ sạc công suất thấp</translation>
 <translation id="8683506306463609433">Tính năng theo dõi hiệu suất đang hoạt động</translation>
 <translation id="8734991477317290293">Bàn phím này có thể đang cố gắng đánh cắp thao tác nhấn phím của bạn</translation>
+<translation id="8735953464173050365">Hiển thị các tùy chọn cài đặt bàn phím. <ph name="KEYBOARD_NAME" /> được chọn</translation>
+<translation id="875593634123171288">Hiển thị các tùy chọn cài đặt VPN</translation>
 <translation id="8809737090443522491">Nhập tên của ứng dụng hoặc tài liệu</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">Không hỗ trợ tính năng phản chiếu với hai màn hình trở lên.</translation>
 <translation id="8828714802988429505">90°</translation>
 <translation id="8841375032071747811">Nút quay lại</translation>
+<translation id="8843682306134542540">Bật/tắt khóa xoay. <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">Search+Esc</translation>
 <translation id="8870509716567206129">Ứng dụng không hỗ trợ chế độ chia đôi màn hình.</translation>
 <translation id="8874184842967597500">Chưa kết nối</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb
index fc765f6..b26d507 100644
--- a/ash/strings/ash_strings_zh-TW.xtb
+++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -7,6 +7,7 @@
 <translation id="1037492556044956303">已新增 <ph name="DEVICE_NAME" /></translation>
 <translation id="1056775291175587022">沒有網路</translation>
 <translation id="1059194134494239015"><ph name="DISPLAY_NAME" />:<ph name="RESOLUTION" /></translation>
+<translation id="1104084341931202936">顯示協助工具設定</translation>
 <translation id="1104621072296271835">完成連結可進一步提升裝置效能</translation>
 <translation id="112308213915226829">自動隱藏檔案櫃</translation>
 <translation id="1153356358378277386">配對裝置</translation>
@@ -20,17 +21,20 @@
 <translation id="1279938420744323401"><ph name="DISPLAY_NAME" /> (<ph name="ANNOTATION" />)</translation>
 <translation id="1290331692326790741">訊號微弱</translation>
 <translation id="1293264513303784526">USB-C 裝置 (左側連接埠)</translation>
+<translation id="1302880136325416935">顯示藍牙設定。<ph name="STATE_TEXT" /></translation>
 <translation id="1346748346194534595">向右</translation>
 <translation id="1351937230027495976">收合選單</translation>
 <translation id="1383876407941801731">搜尋</translation>
 <translation id="1467432559032391204">向左</translation>
 <translation id="1484102317210609525"><ph name="DEVICE_NAME" /> (HDMI/DP)</translation>
 <translation id="1510238584712386396">啟動器</translation>
+<translation id="1520303207432623762">{NUM_APPS,plural, =1{顯示通知設定。已關閉一個應用程式的通知}other{顯示通知設定。已關閉 # 個應用程式的通知}}</translation>
 <translation id="1525508553941733066">關閉</translation>
 <translation id="1537254971476575106">全螢幕放大鏡</translation>
 <translation id="15373452373711364">大型滑鼠游標</translation>
 <translation id="1550523713251050646">按一下即可查看更多選項</translation>
 <translation id="1567387640189251553">自你上次輸入密碼後,裝置已連接其他鍵盤。你的按鍵行為可能會遭到側錄。</translation>
+<translation id="1570871743947603115">切換藍牙設定。<ph name="STATE_TEXT" /></translation>
 <translation id="1608626060424371292">移除這位使用者</translation>
 <translation id="1621499497873603021">電池剩餘使用時間:<ph name="TIME_LEFT" /></translation>
 <translation id="1658406695958299976">很抱歉,系統仍然無法驗證你的密碼。注意:如果你的密碼最近有所異動,新密碼會在你登出後立即生效,目前請在這裡使用舊密碼。</translation>
@@ -40,6 +44,7 @@
 <translation id="1743570585616704562">無法識別</translation>
 <translation id="1746730358044914197">輸入法是由你的管理員所設定。</translation>
 <translation id="1747827819627189109">螢幕小鍵盤已啟用</translation>
+<translation id="1761222317188459878">切換網路連線設定。<ph name="STATE_TEXT" /></translation>
 <translation id="1823873187264960516">乙太網路:<ph name="ADDRESS" /></translation>
 <translation id="1836215606488044471">小幫手 (載入中…)</translation>
 <translation id="1841545962859478868">裝置管理員可能會監控下列項目:</translation>
@@ -63,6 +68,7 @@
 <translation id="2049639323467105390">這個裝置由 <ph name="DOMAIN" /> 管理。</translation>
 <translation id="2050339315714019657">縱向</translation>
 <translation id="2067602449040652523">鍵盤亮度</translation>
+<translation id="2075212959500165896">嘗試次數過多,請稍後再試。</translation>
 <translation id="2081529251031312395">「$1」日後仍可登入。</translation>
 <translation id="2127372758936585790">低功率充電器</translation>
 <translation id="2135456203358955318">停駐放大鏡</translation>
@@ -76,12 +82,15 @@
 <translation id="2303600792989757991">切換視窗總覽</translation>
 <translation id="2338501278241028356">開啟藍牙即可偵測附近的裝置</translation>
 <translation id="2339073806695260576">輕觸檔案櫃的觸控筆圖示即可做筆記、擷取螢幕畫面,以及使用雷射筆或放大鏡。</translation>
+<translation id="2341729377289034582">已鎖定為垂直畫面</translation>
 <translation id="2352467521400612932">觸控筆設定</translation>
 <translation id="2354174487190027830">正在啟用 <ph name="NAME" /></translation>
 <translation id="2359808026110333948">繼續</translation>
 <translation id="2365393535144473978">如果啟用行動數據,藍牙功能也會一併開啟。</translation>
 <translation id="2391579633712104609">180 度</translation>
+<translation id="239188844683466770">切換「零打擾」模式</translation>
 <translation id="2412593942846481727">有可用的更新</translation>
+<translation id="2416346634399901812">已連線至<ph name="NETWORK_NAME" /></translation>
 <translation id="2429753432712299108">藍牙裝置「<ph name="DEVICE_NAME" />」要求配對權限。接受要求前,請確認裝置顯示以下密碼金鑰:<ph name="PASSKEY" /></translation>
 <translation id="2482878487686419369">通知</translation>
 <translation id="2484513351006226581">按下 <ph name="KEYBOARD_SHORTCUT" />可切換鍵盤配置。</translation>
@@ -114,6 +123,7 @@
 <translation id="2946119680249604491">新增連線</translation>
 <translation id="2961963223658824723">發生錯誤,請於幾秒後再試一次。</translation>
 <translation id="2963773877003373896">mod3</translation>
+<translation id="2995447421581609334">顯示投放裝置。</translation>
 <translation id="2996462380875591307">停駐放大鏡已啟用。再次按下 Ctrl 鍵 + 搜尋鍵 + D 鍵即可停用。</translation>
 <translation id="2999742336789313416"><ph name="DISPLAY_NAME" /> 是受 <ph name="DOMAIN" /> 管理的公開工作階段</translation>
 <translation id="3000461861112256445">單聲道音訊</translation>
@@ -128,6 +138,7 @@
 <translation id="315116470104423982">行動數據</translation>
 <translation id="3151786313568798007">方向</translation>
 <translation id="3153444934357957346">使用多帳戶登入功能時,一次最多只能登入 <ph name="MULTI_PROFILE_USER_LIMIT" /> 個帳戶。</translation>
+<translation id="3202010236269062730">{NUM_DEVICES,plural, =1{已連線至一部裝置}other{已連線至 # 部裝置}}</translation>
 <translation id="3236488194889173876">沒有可用的行動網路</translation>
 <translation id="3238765806255363838"><ph name="USERNAME" /> <ph name="MAIL" /></translation>
 <translation id="3294437725009624529">訪客</translation>
@@ -159,6 +170,7 @@
 <translation id="3784455785234192852">鎖定</translation>
 <translation id="3798670284305777884">喇叭 (內部)</translation>
 <translation id="380165613292957338">你好,需要什麼協助嗎?</translation>
+<translation id="383629559565718788">顯示鍵盤設定</translation>
 <translation id="3846575436967432996">沒有可用的網路資訊</translation>
 <translation id="385051799172605136">返回</translation>
 <translation id="3891340733213178823">按兩下 Ctrl+Shift+Q 鍵即可登出。</translation>
@@ -174,8 +186,10 @@
 <translation id="4072264167173457037">訊號中等</translation>
 <translation id="4200057768455216496">你按下了停駐放大鏡的快速鍵。確定要啟用這項功能嗎?</translation>
 <translation id="4217571870635786043">語音輸入</translation>
+<translation id="4261870227682513959">顯示通知設定。已關閉所有通知</translation>
 <translation id="4274921305979314545">為你的 Chromebook 和手機建立連結</translation>
 <translation id="4279490309300973883">鏡像</translation>
+<translation id="4292681942966152062">正在啟動<ph name="NETWORK_NAME" /></translation>
 <translation id="4321179778687042513">Ctrl</translation>
 <translation id="4331809312908958774">Chrome OS</translation>
 <translation id="4338109981321384717">放大鏡</translation>
@@ -239,6 +253,7 @@
 <translation id="5673434351075758678">同步處理設定後,「<ph name="FROM_LOCALE" />」已變更為「<ph name="TO_LOCALE" />」。</translation>
 <translation id="574392208103952083">中</translation>
 <translation id="5744083938413354016">輕觸拖曳</translation>
+<translation id="5750765938512549687">藍牙已關閉</translation>
 <translation id="5777841717266010279">停止共用螢幕?</translation>
 <translation id="57838592816432529">靜音</translation>
 <translation id="5805697420284793859">視窗管理員</translation>
@@ -272,12 +287,14 @@
 <translation id="615957422585914272">顯示螢幕小鍵盤</translation>
 <translation id="6164005077879661055">將這位受監管的使用者移除後,系統即會永久刪除所有與該使用者相關的檔案和本機資料。管理員仍可前往 <ph name="MANAGEMENT_URL" /> 查看這位受監管使用者的網頁瀏覽記錄和設定。</translation>
 <translation id="6165508094623778733">瞭解詳情</translation>
+<translation id="6254629735336163724">已鎖定為水平畫面</translation>
 <translation id="6259254695169772643">請使用觸控筆選取</translation>
 <translation id="6267036997247669271"><ph name="NAME" />:正在啟用...</translation>
 <translation id="6284232397434400372">解析度已變更</translation>
 <translation id="6297287540776456956">使用觸控筆選取擷取範圍</translation>
 <translation id="6310121235600822547"><ph name="DISPLAY_NAME" /> 已旋轉到<ph name="ROTATION" /></translation>
 <translation id="632744581670418035">鍵盤自訂快速鍵</translation>
+<translation id="6376931439017688372">藍牙已開啟</translation>
 <translation id="639644700271529076">大寫鍵已關閉</translation>
 <translation id="6406704438230478924">altgr</translation>
 <translation id="643147933154517414">沒有通知</translation>
@@ -321,6 +338,7 @@
 <translation id="7066646422045619941">您的管理員已停用這個網路。</translation>
 <translation id="7067196344162293536">自動旋轉</translation>
 <translation id="7076293881109082629">登入中</translation>
+<translation id="7092922358121866860">顯示夜燈設定</translation>
 <translation id="7098389117866926363">USB-C 裝置 (背面左側連接埠)</translation>
 <translation id="7131634465328662194">系統會自動將你登出。</translation>
 <translation id="7143207342074048698">連線中</translation>
@@ -356,6 +374,7 @@
 <translation id="7798302898096527229">按下搜尋鍵或 Shift 鍵即可取消。</translation>
 <translation id="7814236020522506259"><ph name="HOUR" /> 小時 <ph name="MINUTE" /> 分鐘</translation>
 <translation id="7829386189513694949">訊號穩定</translation>
+<translation id="7842211907556571265">正在連線至<ph name="NETWORK_NAME" /></translation>
 <translation id="7842569679327885685">警告:實驗功能</translation>
 <translation id="7846634333498149051">鍵盤</translation>
 <translation id="790040513076446191">操控隱私權相關設定</translation>
@@ -396,18 +415,24 @@
 <translation id="8484916590211895857"><ph name="NAME" />:正在重新連線...</translation>
 <translation id="8513108775083588393">自動旋轉</translation>
 <translation id="8517041960877371778"><ph name="DEVICE_TYPE" /> 在開啟時可能無法充電。</translation>
+<translation id="8627191004499078455">已連線至<ph name="DEVICE_NAME" /></translation>
 <translation id="8639760480004882931">剩餘電量:<ph name="PERCENTAGE" /></translation>
 <translation id="8649101189709089199">隨選朗讀</translation>
 <translation id="8652175077544655965">關閉設定</translation>
+<translation id="8653151467777939995">顯示通知設定。已開啟所有通知</translation>
+<translation id="8664753092453405566">顯示網路清單。<ph name="STATE_TEXT" /></translation>
 <translation id="8673028979667498656">270 度</translation>
 <translation id="8676770494376880701">已連接低功率充電器</translation>
 <translation id="8683506306463609433">效能追蹤已啟用</translation>
 <translation id="8734991477317290293">你的按鍵行為可能會遭到側錄</translation>
+<translation id="8735953464173050365">顯示鍵盤設定。已選取<ph name="KEYBOARD_NAME" /></translation>
+<translation id="875593634123171288">顯示 VPN 設定</translation>
 <translation id="8809737090443522491">輸入應用程式或文件名稱</translation>
 <translation id="8814190375133053267">Wi-Fi</translation>
 <translation id="8825534185036233643">鏡像處理作業最多支援兩部顯示器。</translation>
 <translation id="8828714802988429505">90 度</translation>
 <translation id="8841375032071747811">返回按鈕</translation>
+<translation id="8843682306134542540">切換旋轉鎖定。<ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">搜尋鍵 + Esc 鍵</translation>
 <translation id="8870509716567206129">這個應用程式不支援分割畫面。</translation>
 <translation id="8874184842967597500">未連線</translation>
diff --git a/ash/system/unified/unified_message_center_view.cc b/ash/system/unified/unified_message_center_view.cc
index 6f5e71a..969b2d1c 100644
--- a/ash/system/unified/unified_message_center_view.cc
+++ b/ash/system/unified/unified_message_center_view.cc
@@ -6,9 +6,9 @@
 
 #include "ash/message_center/message_center_scroll_bar.h"
 #include "ash/strings/grit/ash_strings.h"
-#include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/sign_out_button.h"
 #include "ash/system/unified/unified_system_tray_controller.h"
+#include "ash/system/unified/unified_system_tray_view.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_types.h"
@@ -36,11 +36,14 @@
 
 UnifiedMessageCenterView::UnifiedMessageCenterView(
     UnifiedSystemTrayController* tray_controller,
+    UnifiedSystemTrayView* parent,
     MessageCenter* message_center)
     : tray_controller_(tray_controller),
+      parent_(parent),
       message_center_(message_center),
       scroller_(new views::ScrollView()),
       message_list_view_(new MessageListView()) {
+  DCHECK(message_center_);
   SetPaintToLayer();
   layer()->SetFillsBoundsOpaquely(false);
 
@@ -51,7 +54,7 @@
   // Need to set the transparent background explicitly, since ScrollView has
   // set the default opaque background color.
   scroller_->SetBackgroundColor(SK_ColorTRANSPARENT);
-  scroller_->SetVerticalScrollBar(new MessageCenterScrollBar());
+  scroller_->SetVerticalScrollBar(new MessageCenterScrollBar(this));
   scroller_->set_draw_overflow_indicator(false);
   AddChildView(scroller_);
 
@@ -97,6 +100,8 @@
   focus_manager_ = GetFocusManager();
   if (focus_manager_)
     focus_manager_->AddFocusChangeListener(this);
+  ScrollToPositionFromBottom();
+  NotifyHeightBelowScroll();
 }
 
 void UnifiedMessageCenterView::SetMaxHeight(int max_height) {
@@ -128,7 +133,8 @@
 
 void UnifiedMessageCenterView::Layout() {
   scroller_->SetBounds(0, 0, width(), height());
-  ScrollToBottom();
+  ScrollToPositionFromBottom();
+  NotifyHeightBelowScroll();
 }
 
 gfx::Size UnifiedMessageCenterView::CalculatePreferredSize() const {
@@ -153,7 +159,6 @@
     }
   }
   Update();
-  ScrollToBottom();
 }
 
 void UnifiedMessageCenterView::OnNotificationRemoved(const std::string& id,
@@ -211,6 +216,20 @@
   tray_controller_->OnClearAllAnimationEnded();
 }
 
+void UnifiedMessageCenterView::OnMessageCenterScrolled() {
+  // Notification list is scrolled manually e.g. by mouse or gesture.
+  auto* scroll_bar = scroller_->vertical_scroll_bar();
+  // Save the distance from the bottom when manually scrolled.
+  position_from_bottom_ =
+      scroll_bar->GetMaxPosition() - scroller_->GetVisibleRect().y();
+  NotifyHeightBelowScroll();
+}
+
+void UnifiedMessageCenterView::NotifyHeightBelowScroll() {
+  parent_->SetNotificationHeightBelowScroll(
+      message_list_view_->GetHeightBelowVisibleRect());
+}
+
 void UnifiedMessageCenterView::Update() {
   SetVisible(message_list_view_->GetNotificationCount() > 0);
 
@@ -229,7 +248,9 @@
   }
 
   scroller_->Layout();
+
   PreferredSizeChanged();
+  NotifyHeightBelowScroll();
 }
 
 void UnifiedMessageCenterView::AddNotificationAt(
@@ -261,14 +282,11 @@
   }
 }
 
-void UnifiedMessageCenterView::ScrollToBottom() {
-  // Hide Clear All button at the buttom from initial viewport.
-  int max_position_without_button =
-      scroller_->vertical_scroll_bar()->GetMaxPosition() -
-      3 * kUnifiedNotificationCenterSpacing;
+void UnifiedMessageCenterView::ScrollToPositionFromBottom() {
   scroller_->ScrollToPosition(
       const_cast<views::ScrollBar*>(scroller_->vertical_scroll_bar()),
-      max_position_without_button);
+      std::max(0, scroller_->vertical_scroll_bar()->GetMaxPosition() -
+                      position_from_bottom_));
 }
 
 }  // namespace ash
diff --git a/ash/system/unified/unified_message_center_view.h b/ash/system/unified/unified_message_center_view.h
index 83ac309..1f34279 100644
--- a/ash/system/unified/unified_message_center_view.h
+++ b/ash/system/unified/unified_message_center_view.h
@@ -8,7 +8,9 @@
 #include <stddef.h>
 
 #include "ash/ash_export.h"
+#include "ash/message_center/message_center_scroll_bar.h"
 #include "ash/message_center/message_list_view.h"
+#include "ash/system/tray/tray_constants.h"
 #include "base/macros.h"
 #include "ui/message_center/message_center_observer.h"
 #include "ui/message_center/notification_list.h"
@@ -31,6 +33,7 @@
 namespace ash {
 
 class UnifiedSystemTrayController;
+class UnifiedSystemTrayView;
 
 // Container for message list view. Acts as a controller/delegate of message
 // list view, passing data back and forth to message center.
@@ -40,9 +43,11 @@
       public views::ViewObserver,
       public views::ButtonListener,
       public views::FocusChangeListener,
-      public MessageListView::Observer {
+      public MessageListView::Observer,
+      public MessageCenterScrollBar::Observer {
  public:
   UnifiedMessageCenterView(UnifiedSystemTrayController* tray_controller,
+                           UnifiedSystemTrayView* parent,
                            message_center::MessageCenter* message_center);
   ~UnifiedMessageCenterView() override;
 
@@ -83,21 +88,33 @@
   // MessageListView::Observer:
   void OnAllNotificationsCleared() override;
 
+  // MessageCenterScrollBar::Observer:
+  void OnMessageCenterScrolled() override;
+
+  // Notify the height below scroll to UnifiedSystemTrayView in order to imitate
+  // notification list scrolling under SystemTray.
+  void NotifyHeightBelowScroll();
+
  private:
   void Update();
   void AddNotificationAt(const message_center::Notification& notification,
                          int index);
   void UpdateNotification(const std::string& notification_id);
 
-  // Scroll the notification list to the bottom.
-  void ScrollToBottom();
+  // Scroll the notification list to |position_from_bottom_|.
+  void ScrollToPositionFromBottom();
 
   UnifiedSystemTrayController* const tray_controller_;
+  UnifiedSystemTrayView* const parent_;
   message_center::MessageCenter* const message_center_;
 
   views::ScrollView* const scroller_;
   MessageListView* const message_list_view_;
 
+  // Position from the bottom of scroll contents in dip. Hide Clear All button
+  // at the buttom from initial viewport.
+  int position_from_bottom_ = 3 * kUnifiedNotificationCenterSpacing;
+
   views::FocusManager* focus_manager_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(UnifiedMessageCenterView);
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc
index af458360..cbb2a1b 100644
--- a/ash/system/unified/unified_system_tray_view.cc
+++ b/ash/system/unified/unified_system_tray_view.cc
@@ -19,8 +19,12 @@
 #include "ash/system/unified/unified_system_tray_controller.h"
 #include "ash/system/unified/unified_system_tray_model.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/canvas.h"
+#include "ui/gfx/scoped_canvas.h"
 #include "ui/message_center/message_center.h"
+#include "ui/message_center/public/cpp/message_center_constants.h"
 #include "ui/views/background.h"
+#include "ui/views/border.h"
 #include "ui/views/controls/label.h"
 #include "ui/views/focus/focus_search.h"
 #include "ui/views/layout/box_layout.h"
@@ -64,12 +68,59 @@
           kUnifiedTrayCornerRadius));
 }
 
+// Border applied to SystemTrayContainer and DetailedViewContainer to iminate
+// notification list scrolling under SystemTray part of UnifiedSystemTray.
+// The border paints mock notification frame behind the top corners based on
+// |height_below_scroll|.
+class TopCornerBorder : public views::Border {
+ public:
+  TopCornerBorder() = default;
+
+  // views::Border:
+  void Paint(const views::View& view, gfx::Canvas* canvas) override {
+    gfx::ScopedCanvas scoped(canvas);
+
+    SkPath path;
+    path.addRoundRect(gfx::RectToSkRect(view.GetLocalBounds()),
+                      SkIntToScalar(kUnifiedTrayCornerRadius),
+                      SkIntToScalar(kUnifiedTrayCornerRadius));
+    canvas->sk_canvas()->clipPath(path, SkClipOp::kDifference, true);
+
+    cc::PaintFlags flags;
+    flags.setColor(message_center::kNotificationBackgroundColor);
+    flags.setStyle(cc::PaintFlags::kFill_Style);
+    flags.setAntiAlias(true);
+
+    const int height = kUnifiedTrayCornerRadius * 4;
+    canvas->DrawRoundRect(
+        gfx::RectF(0,
+                   -height + std::min(height_below_scroll_,
+                                      kUnifiedTrayCornerRadius * 2),
+                   view.width(), height),
+        kUnifiedTrayCornerRadius, flags);
+  }
+
+  gfx::Insets GetInsets() const override { return gfx::Insets(); }
+
+  gfx::Size GetMinimumSize() const override { return gfx::Size(); }
+
+  void set_height_below_scroll(int height_below_scroll) {
+    height_below_scroll_ = height_below_scroll;
+  }
+
+ private:
+  int height_below_scroll_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(TopCornerBorder);
+};
+
 class SystemTrayContainer : public views::View {
  public:
   SystemTrayContainer() {
     SetLayoutManager(
         std::make_unique<views::BoxLayout>(views::BoxLayout::kVertical));
     SetBackground(CreateUnifiedBackground());
+    SetBorder(std::make_unique<TopCornerBorder>());
   }
 
   ~SystemTrayContainer() override = default;
@@ -85,7 +136,10 @@
 
 class DetailedViewContainer : public views::View {
  public:
-  DetailedViewContainer() { SetBackground(CreateUnifiedBackground()); }
+  DetailedViewContainer() {
+    SetBackground(CreateUnifiedBackground());
+    SetBorder(std::make_unique<TopCornerBorder>());
+  }
 
   ~DetailedViewContainer() override = default;
 
@@ -193,9 +247,6 @@
     bool initially_expanded)
     : expanded_amount_(initially_expanded ? 1.0 : 0.0),
       controller_(controller),
-      message_center_view_(
-          new UnifiedMessageCenterView(controller,
-                                       message_center::MessageCenter::Get())),
       notification_hidden_view_(CreateNotificationHiddenView()),
       top_shortcuts_view_(new TopShortcutsView(controller_)),
       feature_pods_container_(new FeaturePodsContainerView(initially_expanded)),
@@ -203,6 +254,10 @@
       system_info_view_(new UnifiedSystemInfoView(controller_)),
       system_tray_container_(new SystemTrayContainer()),
       detailed_view_container_(new DetailedViewContainer()),
+      message_center_view_(
+          new UnifiedMessageCenterView(controller,
+                                       this,
+                                       message_center::MessageCenter::Get())),
       focus_search_(std::make_unique<FocusSearch>(this)),
       interacted_by_tap_recorder_(
           std::make_unique<InteractedByTapRecorder>(this)) {
@@ -342,6 +397,15 @@
   message_center_view_->ShowClearAllAnimation();
 }
 
+void UnifiedSystemTrayView::SetNotificationHeightBelowScroll(
+    int height_below_scroll) {
+  static_cast<TopCornerBorder*>(system_tray_container_->border())
+      ->set_height_below_scroll(height_below_scroll);
+  static_cast<TopCornerBorder*>(detailed_view_container_->border())
+      ->set_height_below_scroll(height_below_scroll);
+  SchedulePaint();
+}
+
 void UnifiedSystemTrayView::OnGestureEvent(ui::GestureEvent* event) {
   gfx::Point screen_location = event->location();
   ConvertPointToScreen(this, &screen_location);
diff --git a/ash/system/unified/unified_system_tray_view.h b/ash/system/unified/unified_system_tray_view.h
index 284cc50c..b089a2a 100644
--- a/ash/system/unified/unified_system_tray_view.h
+++ b/ash/system/unified/unified_system_tray_view.h
@@ -95,6 +95,10 @@
 
   void ShowClearAllAnimation();
 
+  // Update the top of the SystemTray part to imitate notification list
+  // scrolling under SystemTray. |height_below_scroll| should not be negative.
+  void SetNotificationHeightBelowScroll(int height_below_scroll);
+
   // views::View:
   void OnGestureEvent(ui::GestureEvent* event) override;
   void ChildPreferredSizeChanged(views::View* child) override;
@@ -114,7 +118,6 @@
   UnifiedSystemTrayController* const controller_;
 
   // Owned by views hierarchy.
-  UnifiedMessageCenterView* const message_center_view_;
   views::View* const notification_hidden_view_;
   TopShortcutsView* const top_shortcuts_view_;
   FeaturePodsContainerView* const feature_pods_container_;
@@ -122,6 +125,7 @@
   UnifiedSystemInfoView* const system_info_view_;
   views::View* const system_tray_container_;
   views::View* const detailed_view_container_;
+  UnifiedMessageCenterView* const message_center_view_;
 
   const std::unique_ptr<FocusSearch> focus_search_;
   const std::unique_ptr<ui::EventHandler> interacted_by_tap_recorder_;
diff --git a/ash/touch/touch_hud_projection.cc b/ash/touch/touch_hud_projection.cc
deleted file mode 100644
index 0013c78..0000000
--- a/ash/touch/touch_hud_projection.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/touch/touch_hud_projection.h"
-
-#include "ash/root_window_controller.h"
-#include "ash/shell.h"
-#include "ash/touch_hud/touch_hud_renderer.h"
-#include "ui/events/event.h"
-#include "ui/views/widget/widget.h"
-
-namespace ash {
-
-TouchHudProjection::TouchHudProjection(aura::Window* initial_root)
-    : TouchObserverHUD(initial_root, "TouchHud"),
-      touch_hud_renderer_(new TouchHudRenderer(widget())) {}
-
-TouchHudProjection::~TouchHudProjection() = default;
-
-void TouchHudProjection::Clear() {
-  touch_hud_renderer_->Clear();
-}
-
-void TouchHudProjection::OnTouchEvent(ui::TouchEvent* event) {
-  touch_hud_renderer_->HandleTouchEvent(*event);
-}
-
-void TouchHudProjection::SetHudForRootWindowController(
-    RootWindowController* controller) {
-  controller->set_touch_hud_projection(this);
-}
-
-void TouchHudProjection::UnsetHudForRootWindowController(
-    RootWindowController* controller) {
-  controller->set_touch_hud_projection(NULL);
-}
-
-}  // namespace ash
diff --git a/ash/touch/touch_hud_projection.h b/ash/touch/touch_hud_projection.h
deleted file mode 100644
index d5708d09..0000000
--- a/ash/touch/touch_hud_projection.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_TOUCH_TOUCH_HUD_PROJECTION_H_
-#define ASH_TOUCH_TOUCH_HUD_PROJECTION_H_
-
-#include <map>
-
-#include "ash/touch/touch_observer_hud.h"
-#include "base/macros.h"
-
-namespace ash {
-class TouchHudRenderer;
-
-// A heads-up display to show active touch points on the screen. As a derivative
-// of TouchObserverHUD, objects of this class manage their own lifetime.
-class TouchHudProjection : public TouchObserverHUD {
- public:
-  explicit TouchHudProjection(aura::Window* initial_root);
-
-  // Overriden from TouchObserverHUD.
-  void Clear() override;
-
- private:
-  friend class TouchHudProjectionTest;
-
-  ~TouchHudProjection() override;
-
-  // Overriden from TouchObserverHUD.
-  void OnTouchEvent(ui::TouchEvent* event) override;
-  void SetHudForRootWindowController(RootWindowController* controller) override;
-  void UnsetHudForRootWindowController(
-      RootWindowController* controller) override;
-
-  // TouchHudRenderer draws out the touch points.
-  std::unique_ptr<TouchHudRenderer> touch_hud_renderer_;
-
-  DISALLOW_COPY_AND_ASSIGN(TouchHudProjection);
-};
-
-}  // namespace ash
-
-#endif  // ASH_TOUCH_TOUCH_HUD_PROJECTION_H_
diff --git a/ash/touch/touch_observer_hud.h b/ash/touch/touch_observer_hud.h
index 16f18571..7f5ea448 100644
--- a/ash/touch/touch_observer_hud.h
+++ b/ash/touch/touch_observer_hud.h
@@ -25,6 +25,7 @@
 
 // An event filter which handles system level gesture events. Objects of this
 // class manage their own lifetime.
+// TODO(jamescook): Collapse with TouchHudDebug, the only subclass.
 class ASH_EXPORT TouchObserverHUD
     : public ui::EventHandler,
       public views::WidgetObserver,
@@ -77,7 +78,7 @@
   void OnDisplayConfigurationChanged() override;
 
  private:
-  friend class TouchHudTestBase;
+  friend class TouchObserverHUDTest;
 
   const int64_t display_id_;
   aura::Window* root_window_;
diff --git a/ash/touch/touch_observer_hud_unittest.cc b/ash/touch/touch_observer_hud_unittest.cc
index 20d6e41..bf05dbf6 100644
--- a/ash/touch/touch_observer_hud_unittest.cc
+++ b/ash/touch/touch_observer_hud_unittest.cc
@@ -4,7 +4,6 @@
 
 #include "ash/touch/touch_observer_hud.h"
 
-#include "ash/public/cpp/ash_features.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/config.h"
 #include "ash/root_window_controller.h"
@@ -12,12 +11,9 @@
 #include "ash/test/ash_test_base.h"
 #include "ash/touch/touch_devices_controller.h"
 #include "ash/touch/touch_hud_debug.h"
-#include "ash/touch/touch_hud_projection.h"
-#include "ash/touch_hud/touch_hud_renderer.h"
 #include "base/command_line.h"
 #include "base/format_macros.h"
 #include "base/strings/stringprintf.h"
-#include "base/test/scoped_feature_list.h"
 #include "ui/aura/window.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/test/display_manager_test_api.h"
@@ -25,12 +21,17 @@
 
 namespace ash {
 
-class TouchHudTestBase : public AshTestBase {
+class TouchObserverHUDTest : public AshTestBase {
  public:
-  TouchHudTestBase() = default;
-  ~TouchHudTestBase() override = default;
+  TouchObserverHUDTest() = default;
+  ~TouchObserverHUDTest() override = default;
 
   void SetUp() override {
+    // Add ash-touch-hud flag to enable debug touch HUD. This flag should be set
+    // before Ash environment is set up.
+    base::CommandLine::ForCurrentProcess()->AppendSwitch(
+        ash::switches::kAshTouchHud);
+
     AshTestBase::SetUp();
 
     // Initialize display infos. They should be initialized after Ash
@@ -115,6 +116,36 @@
     display_manager()->OnNativeDisplaysChanged(display_info_list_);
   }
 
+  void CheckInternalDisplay() {
+    ASSERT_TRUE(GetInternalTouchHudDebug());
+    EXPECT_EQ(internal_display_id(), GetInternalTouchHudDebug()->display_id());
+    EXPECT_EQ(GetInternalRootWindow(),
+              GetRootWindowForTouchHud(GetInternalTouchHudDebug()));
+    EXPECT_EQ(GetInternalRootWindow(),
+              GetWidgetForTouchHud(GetInternalTouchHudDebug())
+                  ->GetNativeView()
+                  ->GetRootWindow());
+    EXPECT_EQ(GetInternalDisplay().size(),
+              GetWidgetForTouchHud(GetInternalTouchHudDebug())
+                  ->GetWindowBoundsInScreen()
+                  .size());
+  }
+
+  void CheckExternalDisplay() {
+    ASSERT_TRUE(GetExternalTouchHudDebug());
+    EXPECT_EQ(external_display_id(), GetExternalTouchHudDebug()->display_id());
+    EXPECT_EQ(GetExternalRootWindow(),
+              GetRootWindowForTouchHud(GetExternalTouchHudDebug()));
+    EXPECT_EQ(GetExternalRootWindow(),
+              GetWidgetForTouchHud(GetExternalTouchHudDebug())
+                  ->GetNativeView()
+                  ->GetRootWindow());
+    EXPECT_EQ(GetExternalDisplay().size(),
+              GetWidgetForTouchHud(GetExternalTouchHudDebug())
+                  ->GetWindowBoundsInScreen()
+                  .size());
+  }
+
   int64_t internal_display_id() const { return internal_display_id_; }
 
   int64_t external_display_id() const { return external_display_id_; }
@@ -171,6 +202,22 @@
     return RootWindowController::ForWindow(root);
   }
 
+  TouchHudDebug* GetInternalTouchHudDebug() {
+    return GetInternalRootController()->touch_hud_debug();
+  }
+
+  TouchHudDebug* GetExternalTouchHudDebug() {
+    return GetExternalRootController()->touch_hud_debug();
+  }
+
+  TouchHudDebug* GetPrimaryTouchHudDebug() {
+    return GetPrimaryRootController()->touch_hud_debug();
+  }
+
+  TouchHudDebug* GetSecondaryTouchHudDebug() {
+    return GetSecondaryRootController()->touch_hud_debug();
+  }
+
   display::ManagedDisplayInfo CreateDisplayInfo(int64_t id,
                                                 const gfx::Rect& bounds) {
     display::ManagedDisplayInfo info(id, base::StringPrintf("x-%" PRId64, id),
@@ -196,114 +243,11 @@
 
   std::vector<display::ManagedDisplayInfo> display_info_list_;
 
-  DISALLOW_COPY_AND_ASSIGN(TouchHudTestBase);
-};
-
-class TouchHudDebugTest : public TouchHudTestBase {
- public:
-  TouchHudDebugTest() = default;
-  ~TouchHudDebugTest() override = default;
-
-  void SetUp() override {
-    // Add ash-touch-hud flag to enable debug touch HUD. This flag should be set
-    // before Ash environment is set up, i.e., before TouchHudTestBase::SetUp().
-    base::CommandLine::ForCurrentProcess()->AppendSwitch(
-        ash::switches::kAshTouchHud);
-
-    TouchHudTestBase::SetUp();
-  }
-
-  void CheckInternalDisplay() {
-    EXPECT_NE(static_cast<TouchObserverHUD*>(NULL), GetInternalTouchHudDebug());
-    EXPECT_EQ(internal_display_id(), GetInternalTouchHudDebug()->display_id());
-    EXPECT_EQ(GetInternalRootWindow(),
-              GetRootWindowForTouchHud(GetInternalTouchHudDebug()));
-    EXPECT_EQ(GetInternalRootWindow(),
-              GetWidgetForTouchHud(GetInternalTouchHudDebug())
-                  ->GetNativeView()
-                  ->GetRootWindow());
-    EXPECT_EQ(GetInternalDisplay().size(),
-              GetWidgetForTouchHud(GetInternalTouchHudDebug())
-                  ->GetWindowBoundsInScreen()
-                  .size());
-  }
-
-  void CheckExternalDisplay() {
-    EXPECT_NE(static_cast<TouchHudDebug*>(NULL), GetExternalTouchHudDebug());
-    EXPECT_EQ(external_display_id(), GetExternalTouchHudDebug()->display_id());
-    EXPECT_EQ(GetExternalRootWindow(),
-              GetRootWindowForTouchHud(GetExternalTouchHudDebug()));
-    EXPECT_EQ(GetExternalRootWindow(),
-              GetWidgetForTouchHud(GetExternalTouchHudDebug())
-                  ->GetNativeView()
-                  ->GetRootWindow());
-    EXPECT_EQ(GetExternalDisplay().size(),
-              GetWidgetForTouchHud(GetExternalTouchHudDebug())
-                  ->GetWindowBoundsInScreen()
-                  .size());
-  }
-
- private:
-  TouchHudDebug* GetInternalTouchHudDebug() {
-    return GetInternalRootController()->touch_hud_debug();
-  }
-
-  TouchHudDebug* GetExternalTouchHudDebug() {
-    return GetExternalRootController()->touch_hud_debug();
-  }
-
-  TouchHudDebug* GetPrimaryTouchHudDebug() {
-    return GetPrimaryRootController()->touch_hud_debug();
-  }
-
-  TouchHudDebug* GetSecondaryTouchHudDebug() {
-    return GetSecondaryRootController()->touch_hud_debug();
-  }
-
-  DISALLOW_COPY_AND_ASSIGN(TouchHudDebugTest);
-};
-
-class TouchHudProjectionTest : public TouchHudTestBase {
- public:
-  TouchHudProjectionTest() = default;
-  ~TouchHudProjectionTest() override = default;
-
-  // testing::Test:
-  void SetUp() override {
-    base::CommandLine::ForCurrentProcess()->AppendSwitch(switches::kShowTaps);
-    scoped_feature_list_.InitAndDisableFeature(features::kTapVisualizerApp);
-    TouchHudTestBase::SetUp();
-  }
-
-  TouchHudProjection* GetInternalTouchHudProjection() {
-    return GetInternalRootController()->touch_hud_projection();
-  }
-
-  int GetInternalTouchPointsCount() {
-    return GetInternalTouchHudProjection()->touch_hud_renderer_->points_.size();
-  }
-
-  void SendTouchEventToInternalHud(ui::EventType type,
-                                   const gfx::Point& location,
-                                   int touch_id) {
-    ui::TouchEvent event(
-        type, location, event_time,
-        ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH, touch_id));
-    GetInternalTouchHudProjection()->OnTouchEvent(&event);
-
-    // Advance time for next event.
-    event_time += base::TimeDelta::FromMilliseconds(100);
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-  base::TimeTicks event_time;
-
-  DISALLOW_COPY_AND_ASSIGN(TouchHudProjectionTest);
+  DISALLOW_COPY_AND_ASSIGN(TouchObserverHUDTest);
 };
 
 // Checks if debug touch HUD is correctly initialized for a single display.
-TEST_F(TouchHudDebugTest, SingleDisplay) {
+TEST_F(TouchObserverHUDTest, SingleDisplay) {
   // Setup a single display setting.
   SetupSingleDisplay();
 
@@ -313,7 +257,7 @@
 }
 
 // Checks if debug touch HUDs are correctly initialized for two displays.
-TEST_F(TouchHudDebugTest, DualDisplays) {
+TEST_F(TouchObserverHUDTest, DualDisplays) {
   // Setup a dual display setting.
   SetupDualDisplays();
 
@@ -325,7 +269,7 @@
 
 // Checks if debug touch HUDs are correctly handled when primary display is
 // changed.
-TEST_F(TouchHudDebugTest, SwapPrimaryDisplay) {
+TEST_F(TouchObserverHUDTest, SwapPrimaryDisplay) {
   // Setup a dual display setting.
   SetupDualDisplays();
 
@@ -351,7 +295,7 @@
 }
 
 // Checks if debug touch HUDs are correctly handled when displays are mirrored.
-TEST_F(TouchHudDebugTest, MirrorDisplays) {
+TEST_F(TouchObserverHUDTest, MirrorDisplays) {
   // Disable restoring mirror mode to prevent interference from previous
   // display configuration.
   display_manager()->set_disable_restoring_mirror_mode_for_test(true);
@@ -381,7 +325,7 @@
 
 // Checks if debug touch HUDs are correctly handled when displays are mirrored
 // after setting the external display as the primary one.
-TEST_F(TouchHudDebugTest, SwapPrimaryThenMirrorDisplays) {
+TEST_F(TouchObserverHUDTest, SwapPrimaryThenMirrorDisplays) {
   display_manager()->set_disable_restoring_mirror_mode_for_test(true);
 
   // Setup a dual display setting.
@@ -413,7 +357,7 @@
 
 // Checks if debug touch HUDs are correctly handled when the external display,
 // which is the secondary one, is removed.
-TEST_F(TouchHudDebugTest, RemoveSecondaryDisplay) {
+TEST_F(TouchObserverHUDTest, RemoveSecondaryDisplay) {
   // Setup a dual display setting.
   SetupDualDisplays();
 
@@ -437,7 +381,7 @@
 
 // Checks if debug touch HUDs are correctly handled when the external display,
 // which is set as the primary display, is removed.
-TEST_F(TouchHudDebugTest, RemovePrimaryDisplay) {
+TEST_F(TouchObserverHUDTest, RemovePrimaryDisplay) {
   // Setup a dual display setting.
   SetupDualDisplays();
 
@@ -465,7 +409,7 @@
 
 // Checks if debug touch HUDs are correctly handled when all displays are
 // removed.
-TEST_F(TouchHudDebugTest, Headless) {
+TEST_F(TouchObserverHUDTest, Headless) {
   // Setup a single display setting.
   SetupSingleDisplay();
 
@@ -480,79 +424,4 @@
   CheckInternalDisplay();
 }
 
-// Checks projection touch HUD with a sequence of touch-pressed, touch-moved,
-// and touch-released events.
-// Test if the WM sets correct work area under different density.
-TEST_F(TouchHudProjectionTest, TouchMoveRelease) {
-  // Mash has a separate app for touch HUD.
-  if (Shell::GetAshConfig() == Config::MASH_DEPRECATED)
-    return;
-
-  SetupSingleDisplay();
-  EXPECT_NE(static_cast<TouchHudProjection*>(NULL),
-            GetInternalTouchHudProjection());
-  EXPECT_EQ(0, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), 1);
-  EXPECT_EQ(1, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_MOVED, gfx::Point(10, 20), 1);
-  EXPECT_EQ(1, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_RELEASED, gfx::Point(10, 20), 1);
-  EXPECT_EQ(0, GetInternalTouchPointsCount());
-}
-
-// Checks projection touch HUD with a sequence of touch-pressed, touch-moved,
-// and touch-cancelled events.
-TEST_F(TouchHudProjectionTest, TouchMoveCancel) {
-  // Mash has a separate app for touch HUD.
-  if (Shell::GetAshConfig() == Config::MASH_DEPRECATED)
-    return;
-
-  SetupSingleDisplay();
-  EXPECT_NE(static_cast<TouchHudProjection*>(NULL),
-            GetInternalTouchHudProjection());
-  EXPECT_EQ(0, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), 1);
-  EXPECT_EQ(1, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_MOVED, gfx::Point(10, 20), 1);
-  EXPECT_EQ(1, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_CANCELLED, gfx::Point(10, 20), 1);
-  EXPECT_EQ(0, GetInternalTouchPointsCount());
-}
-
-// Checks projection touch HUD with two simultaneous touches.
-TEST_F(TouchHudProjectionTest, DoubleTouch) {
-  // Mash has a separate app for touch HUD.
-  if (Shell::GetAshConfig() == Config::MASH_DEPRECATED)
-    return;
-
-  SetupSingleDisplay();
-  EXPECT_NE(static_cast<TouchHudProjection*>(NULL),
-            GetInternalTouchHudProjection());
-  EXPECT_EQ(0, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_PRESSED, gfx::Point(10, 10), 1);
-  EXPECT_EQ(1, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_PRESSED, gfx::Point(20, 10), 2);
-  EXPECT_EQ(2, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_MOVED, gfx::Point(10, 20), 1);
-  EXPECT_EQ(2, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_MOVED, gfx::Point(20, 20), 2);
-  EXPECT_EQ(2, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_RELEASED, gfx::Point(10, 20), 1);
-  EXPECT_EQ(1, GetInternalTouchPointsCount());
-
-  SendTouchEventToInternalHud(ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), 2);
-  EXPECT_EQ(0, GetInternalTouchPointsCount());
-}
-
 }  // namespace ash
diff --git a/ash/touch_hud/BUILD.gn b/ash/touch_hud/BUILD.gn
deleted file mode 100644
index 4411118..0000000
--- a/ash/touch_hud/BUILD.gn
+++ /dev/null
@@ -1,26 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//build/config/ui.gni")
-
-component("touch_hud") {
-  sources = [
-    "ash_touch_hud_export.h",
-    "touch_hud_renderer.cc",
-    "touch_hud_renderer.h",
-  ]
-
-  defines = [ "ASH_TOUCH_HUD_IMPLEMENTATION" ]
-
-  deps = [
-    "//base",
-    "//cc/paint",
-    "//skia",
-    "//ui/compositor",
-    "//ui/events",
-    "//ui/gfx",
-    "//ui/gfx/geometry",
-    "//ui/views",
-  ]
-}
diff --git a/ash/touch_hud/ash_touch_hud_export.h b/ash/touch_hud/ash_touch_hud_export.h
deleted file mode 100644
index 835d4689..0000000
--- a/ash/touch_hud/ash_touch_hud_export.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_TOUCH_HUD_ASH_TOUCH_HUD_EXPORT_H_
-#define ASH_TOUCH_HUD_ASH_TOUCH_HUD_EXPORT_H_
-
-#if defined(COMPONENT_BUILD)
-#if defined(WIN32)
-
-#if defined(ASH_TOUCH_HUD_IMPLEMENTATION)
-#define ASH_TOUCH_HUD_EXPORT __declspec(dllexport)
-#else
-#define ASH_TOUCH_HUD_EXPORT __declspec(dllimport)
-#endif  // defined(ASH_TOUCH_HUD_IMPLEMENTATION)
-
-#else  // defined(WIN32)
-#if defined(ASH_TOUCH_HUD_IMPLEMENTATION)
-#define ASH_TOUCH_HUD_EXPORT __attribute__((visibility("default")))
-#else
-#define ASH_TOUCH_HUD_EXPORT
-#endif
-#endif
-
-#else  // defined(COMPONENT_BUILD)
-#define ASH_TOUCH_HUD_EXPORT
-#endif
-
-#endif  // ASH_TOUCH_HUD_ASH_TOUCH_HUD_EXPORT_H_
diff --git a/ash/touch_hud/touch_hud_renderer.cc b/ash/touch_hud/touch_hud_renderer.cc
deleted file mode 100644
index 60e9ee84..0000000
--- a/ash/touch_hud/touch_hud_renderer.cc
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ash/touch_hud/touch_hud_renderer.h"
-
-#include "base/time/time.h"
-#include "third_party/skia/include/effects/SkGradientShader.h"
-#include "ui/compositor/layer.h"
-#include "ui/compositor/layer_owner.h"
-#include "ui/events/event.h"
-#include "ui/gfx/animation/animation_delegate.h"
-#include "ui/gfx/animation/linear_animation.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/views/view.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/widget/widget_observer.h"
-
-namespace ash {
-
-const int kPointRadius = 20;
-const SkColor kProjectionFillColor = SkColorSetRGB(0xF5, 0xF5, 0xDC);
-const SkColor kProjectionStrokeColor = SK_ColorGRAY;
-const int kProjectionAlpha = 0xB0;
-constexpr base::TimeDelta kFadeoutDuration =
-    base::TimeDelta::FromMilliseconds(250);
-const int kFadeoutFrameRate = 60;
-
-// TouchPointView draws a single touch point. This object manages its own
-// lifetime and deletes itself upon fade-out completion or whenever |Destroy()|
-// is explicitly called.
-class TouchPointView : public views::View,
-                       public gfx::AnimationDelegate,
-                       public views::WidgetObserver {
- public:
-  explicit TouchPointView(views::Widget* parent_widget)
-      : circle_center_(kPointRadius + 1, kPointRadius + 1),
-        gradient_center_(SkPoint::Make(kPointRadius + 1, kPointRadius + 1)) {
-    SetPaintToLayer();
-    layer()->SetFillsBoundsOpaquely(false);
-
-    SetSize(gfx::Size(2 * kPointRadius + 2, 2 * kPointRadius + 2));
-
-    stroke_flags_.setStyle(cc::PaintFlags::kStroke_Style);
-    stroke_flags_.setColor(kProjectionStrokeColor);
-
-    gradient_colors_[0] = kProjectionFillColor;
-    gradient_colors_[1] = kProjectionStrokeColor;
-
-    gradient_pos_[0] = SkFloatToScalar(0.9f);
-    gradient_pos_[1] = SkFloatToScalar(1.0f);
-
-    parent_widget->GetContentsView()->AddChildView(this);
-
-    parent_widget->AddObserver(this);
-  }
-
-  void UpdateTouch(const ui::LocatedEvent& touch) {
-    if (touch.type() == ui::ET_TOUCH_RELEASED ||
-        touch.type() == ui::ET_TOUCH_CANCELLED ||
-        touch.type() == ui::ET_POINTER_UP ||
-        touch.type() == ui::ET_POINTER_CANCELLED) {
-      fadeout_.reset(
-          new gfx::LinearAnimation(kFadeoutDuration, kFadeoutFrameRate, this));
-      fadeout_->Start();
-    } else {
-      SetX(parent()->GetMirroredXInView(touch.root_location().x()) -
-           kPointRadius - 1);
-      SetY(touch.root_location().y() - kPointRadius - 1);
-    }
-  }
-
-  void Destroy() { delete this; }
-
- private:
-  ~TouchPointView() override {
-    GetWidget()->RemoveObserver(this);
-    parent()->RemoveChildView(this);
-  }
-
-  // Overridden from views::View.
-  void OnPaint(gfx::Canvas* canvas) override {
-    int alpha = kProjectionAlpha;
-    if (fadeout_)
-      alpha = static_cast<int>(fadeout_->CurrentValueBetween(alpha, 0));
-    fill_flags_.setAlpha(alpha);
-    stroke_flags_.setAlpha(alpha);
-    fill_flags_.setShader(cc::PaintShader::MakeRadialGradient(
-        gradient_center_, SkIntToScalar(kPointRadius), gradient_colors_,
-        gradient_pos_, arraysize(gradient_colors_),
-        SkShader::kMirror_TileMode));
-    canvas->DrawCircle(circle_center_, SkIntToScalar(kPointRadius),
-                       fill_flags_);
-    canvas->DrawCircle(circle_center_, SkIntToScalar(kPointRadius),
-                       stroke_flags_);
-  }
-
-  // Overridden from gfx::AnimationDelegate.
-  void AnimationEnded(const gfx::Animation* animation) override {
-    DCHECK_EQ(fadeout_.get(), animation);
-    delete this;
-  }
-
-  void AnimationProgressed(const gfx::Animation* animation) override {
-    DCHECK_EQ(fadeout_.get(), animation);
-    SchedulePaint();
-  }
-
-  void AnimationCanceled(const gfx::Animation* animation) override {
-    AnimationEnded(animation);
-  }
-
-  // Overridden from views::WidgetObserver.
-  void OnWidgetDestroying(views::Widget* widget) override {
-    if (fadeout_)
-      fadeout_->Stop();
-    else
-      Destroy();
-  }
-
-  const gfx::Point circle_center_;
-  const SkPoint gradient_center_;
-
-  cc::PaintFlags fill_flags_;
-  cc::PaintFlags stroke_flags_;
-  SkColor gradient_colors_[2];
-  SkScalar gradient_pos_[2];
-
-  std::unique_ptr<gfx::Animation> fadeout_;
-
-  DISALLOW_COPY_AND_ASSIGN(TouchPointView);
-};
-
-TouchHudRenderer::TouchHudRenderer(views::Widget* parent_widget)
-    : parent_widget_(parent_widget) {}
-
-TouchHudRenderer::~TouchHudRenderer() = default;
-
-void TouchHudRenderer::Clear() {
-  for (std::map<int, TouchPointView*>::iterator iter = points_.begin();
-       iter != points_.end(); iter++)
-    iter->second->Destroy();
-  points_.clear();
-}
-
-void TouchHudRenderer::HandleTouchEvent(const ui::LocatedEvent& event) {
-  int id = 0;
-  if (event.IsTouchEvent()) {
-    id = event.AsTouchEvent()->pointer_details().id;
-  } else {
-    DCHECK(event.IsPointerEvent());
-    DCHECK(event.AsPointerEvent()->pointer_details().pointer_type ==
-           ui::EventPointerType::POINTER_TYPE_TOUCH);
-    id = event.AsPointerEvent()->pointer_details().id;
-  }
-  if (event.type() == ui::ET_TOUCH_PRESSED ||
-      event.type() == ui::ET_POINTER_DOWN) {
-    TouchPointView* point = new TouchPointView(parent_widget_);
-    point->UpdateTouch(event);
-    std::pair<std::map<int, TouchPointView*>::iterator, bool> result =
-        points_.insert(std::make_pair(id, point));
-    // If a |TouchPointView| is already mapped to the touch id, destroy it and
-    // replace it with the new one.
-    if (!result.second) {
-      result.first->second->Destroy();
-      result.first->second = point;
-    }
-  } else {
-    std::map<int, TouchPointView*>::iterator iter = points_.find(id);
-    if (iter != points_.end()) {
-      iter->second->UpdateTouch(event);
-      if (event.type() == ui::ET_TOUCH_RELEASED ||
-          event.type() == ui::ET_TOUCH_CANCELLED ||
-          event.type() == ui::ET_POINTER_UP ||
-          event.type() == ui::ET_POINTER_CANCELLED)
-        points_.erase(iter);
-    }
-  }
-}
-
-}  // namespace ash
diff --git a/ash/touch_hud/touch_hud_renderer.h b/ash/touch_hud/touch_hud_renderer.h
deleted file mode 100644
index 412f036..0000000
--- a/ash/touch_hud/touch_hud_renderer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef ASH_TOUCH_HUD_TOUCH_HUD_RENDERER_H_
-#define ASH_TOUCH_HUD_TOUCH_HUD_RENDERER_H_
-
-#include <map>
-
-#include "ash/touch_hud/ash_touch_hud_export.h"
-#include "base/macros.h"
-
-namespace ui {
-class LocatedEvent;
-}
-
-namespace views {
-class Widget;
-}
-
-namespace ash {
-class TouchHudProjectionTest;
-class TouchPointView;
-
-// Handles touch events to draw out touch points accordingly.
-// TODO(jamescook): Delete this when the mojo touch_hud_app is the default.
-// https://crbug.com/840380
-class ASH_TOUCH_HUD_EXPORT TouchHudRenderer {
- public:
-  explicit TouchHudRenderer(views::Widget* parent_widget);
-  ~TouchHudRenderer();
-
-  // Called to clear touch points and traces from the screen.
-  void Clear();
-
-  // Receives a touch event and draws its touch point.
-  void HandleTouchEvent(const ui::LocatedEvent& event);
-
- private:
-  friend class TouchHudProjectionTest;
-
-  // The parent widget that all touch points would be drawn in.
-  views::Widget* parent_widget_;
-
-  // A map of touch ids to TouchPointView.
-  std::map<int, TouchPointView*> points_;
-
-  DISALLOW_COPY_AND_ASSIGN(TouchHudRenderer);
-};
-
-}  // namespace ash
-
-#endif  // ASH_TOUCH_HUD_TOUCH_HUD_RENDERER_H_
diff --git a/ash/voice_interaction/voice_interaction_controller.cc b/ash/voice_interaction/voice_interaction_controller.cc
index c2a6fc5a..e3a1d159 100644
--- a/ash/voice_interaction/voice_interaction_controller.cc
+++ b/ash/voice_interaction/voice_interaction_controller.cc
@@ -33,6 +33,7 @@
 }
 
 void VoiceInteractionController::NotifyContextEnabled(bool enabled) {
+  context_enabled_ = enabled;
   observers_.ForAllPtrs([enabled](auto* observer) {
     observer->OnVoiceInteractionContextEnabled(enabled);
   });
@@ -74,6 +75,11 @@
   std::move(callback).Run(setup_completed_);
 }
 
+void VoiceInteractionController::IsContextEnabled(
+    IsContextEnabledCallback callback) {
+  std::move(callback).Run(context_enabled_);
+}
+
 void VoiceInteractionController::IsHotwordEnabled(
     IsHotwordEnabledCallback callback) {
   std::move(callback).Run(hotword_enabled_);
diff --git a/ash/voice_interaction/voice_interaction_controller.h b/ash/voice_interaction/voice_interaction_controller.h
index 2e5ca48..1a7355ec 100644
--- a/ash/voice_interaction/voice_interaction_controller.h
+++ b/ash/voice_interaction/voice_interaction_controller.h
@@ -32,6 +32,7 @@
   void NotifyNotificationEnabled(bool enabled) override;
   void IsSettingEnabled(IsSettingEnabledCallback callback) override;
   void IsSetupCompleted(IsSetupCompletedCallback callback) override;
+  void IsContextEnabled(IsContextEnabledCallback callback) override;
   void IsHotwordEnabled(IsHotwordEnabledCallback callback) override;
   void AddObserver(mojom::VoiceInteractionObserverPtr observer) override;
 
@@ -61,6 +62,9 @@
   // Whether voice interaction setup flow has completed.
   bool setup_completed_ = false;
 
+  // Whether screen context is enabled.
+  bool context_enabled_ = false;
+
   // Whether hotword listening is enabled.
   bool hotword_enabled_ = false;
 
diff --git a/ash/wallpaper/wallpaper_controller.cc b/ash/wallpaper/wallpaper_controller.cc
index 68b0615..924cd2c5 100644
--- a/ash/wallpaper/wallpaper_controller.cc
+++ b/ash/wallpaper/wallpaper_controller.cc
@@ -37,7 +37,7 @@
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/values.h"
 #include "chromeos/chromeos_switches.h"
diff --git a/ash/wallpaper/wallpaper_controller_unittest.cc b/ash/wallpaper/wallpaper_controller_unittest.cc
index 01bcbd82..e6a56e8 100644
--- a/ash/wallpaper/wallpaper_controller_unittest.cc
+++ b/ash/wallpaper/wallpaper_controller_unittest.cc
@@ -26,8 +26,8 @@
 #include "base/message_loop/message_loop_current.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/bind_test_util.h"
 #include "chromeos/chromeos_switches.h"
 #include "components/prefs/testing_pref_service.h"
diff --git a/ash/wayland/BUILD.gn b/ash/wayland/BUILD.gn
index 70940c21..95d8e5be 100644
--- a/ash/wayland/BUILD.gn
+++ b/ash/wayland/BUILD.gn
@@ -11,6 +11,7 @@
   ]
 
   deps = [
+    "//ash/keyboard/arc",
     "//ash/public/cpp",
     "//ash/system/message_center/arc",
     "//base",
diff --git a/ash/wayland/wayland_server_controller.cc b/ash/wayland/wayland_server_controller.cc
index 818558bb..91e7f09 100644
--- a/ash/wayland/wayland_server_controller.cc
+++ b/ash/wayland/wayland_server_controller.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "ash/keyboard/arc/arc_input_method_surface_manager.h"
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/config.h"
 #include "ash/system/message_center/arc/arc_notification_surface_manager_impl.h"
@@ -68,10 +69,13 @@
     std::unique_ptr<exo::FileHelper> file_helper) {
   arc_notification_surface_manager_ =
       std::make_unique<ArcNotificationSurfaceManagerImpl>();
+  arc_input_method_surface_manager_ =
+      std::make_unique<ArcInputMethodSurfaceManager>();
   wm_helper_ = std::make_unique<exo::WMHelper>();
   exo::WMHelper::SetInstance(wm_helper_.get());
   display_ = std::make_unique<exo::Display>(
-      arc_notification_surface_manager_.get(), nullptr, std::move(file_helper));
+      arc_notification_surface_manager_.get(),
+      arc_input_method_surface_manager_.get(), std::move(file_helper));
   wayland_server_ = exo::wayland::Server::Create(display_.get());
   // Wayland server creation can fail if XDG_RUNTIME_DIR is not set correctly.
   if (wayland_server_)
diff --git a/ash/wayland/wayland_server_controller.h b/ash/wayland/wayland_server_controller.h
index d364984..951ba2e 100644
--- a/ash/wayland/wayland_server_controller.h
+++ b/ash/wayland/wayland_server_controller.h
@@ -20,6 +20,7 @@
 
 namespace ash {
 
+class ArcInputMethodSurfaceManager;
 class ArcNotificationSurfaceManagerImpl;
 
 class WaylandServerController {
@@ -43,6 +44,8 @@
 
   std::unique_ptr<ArcNotificationSurfaceManagerImpl>
       arc_notification_surface_manager_;
+  std::unique_ptr<ArcInputMethodSurfaceManager>
+      arc_input_method_surface_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(WaylandServerController);
 };
diff --git a/ash/wm/immersive_fullscreen_controller_unittest.cc b/ash/wm/immersive_fullscreen_controller_unittest.cc
index 67558be..c843ca0 100644
--- a/ash/wm/immersive_fullscreen_controller_unittest.cc
+++ b/ash/wm/immersive_fullscreen_controller_unittest.cc
@@ -718,7 +718,6 @@
 
   // Top-of-window views will not be revealed for snapped window in splitview
   // mode either.
-  EnableTabletMode(true);
   Shell::Get()->split_view_controller()->SnapWindow(window(),
                                                     SplitViewController::LEFT);
   EXPECT_TRUE(wm::GetWindowState(window())->IsSnapped());
diff --git a/ash/wm/immersive_gesture_handler_classic.cc b/ash/wm/immersive_gesture_handler_classic.cc
index c9e1bae..e38c0ed 100644
--- a/ash/wm/immersive_gesture_handler_classic.cc
+++ b/ash/wm/immersive_gesture_handler_classic.cc
@@ -66,8 +66,13 @@
   if (!base::FeatureList::IsEnabled(ash::features::kDragAppsInTabletMode))
     return false;
 
-  aura::Window* window(static_cast<aura::Window*>(event->target()));
-  // Only process the event if its target is the native window of
+  views::Widget* widget = views::Widget::GetTopLevelWidgetForNativeView(
+      static_cast<aura::Window*>(event->target()));
+  if (!widget)
+    return false;
+
+  aura::Window* window = widget->GetNativeWindow();
+  // Only process the event if its target has the same native window as
   // |immersive_fullscreen_controller_->widget()|.
   if (window != immersive_fullscreen_controller_->widget()->GetNativeWindow())
     return false;
diff --git a/ash/wm/overview/window_grid.cc b/ash/wm/overview/window_grid.cc
index 3bd630f..f5ac63f 100644
--- a/ash/wm/overview/window_grid.cc
+++ b/ash/wm/overview/window_grid.cc
@@ -198,6 +198,10 @@
   widget->SetContentsView(new NewSelectorItemView());
   widget->Show();
 
+  // Stack the newly created widget below the dragged window.
+  dragged_window->parent()->StackChildBelow(widget->GetNativeWindow(),
+                                            dragged_window);
+
   if (animate) {
     widget->SetOpacity(0.f);
     ui::ScopedLayerAnimationSettings animation_settings(
@@ -573,12 +577,6 @@
   window_selector_->AddItem(new_selector_item_widget_->GetNativeWindow(),
                             /*reposition=*/true, animate);
 
-  // Stack the newly added window item below |dragged_window|.
-  DCHECK_EQ(dragged_window->parent(),
-            new_selector_item_widget_->GetNativeWindow()->parent());
-  dragged_window->parent()->StackChildBelow(
-      new_selector_item_widget_->GetNativeWindow(), dragged_window);
-
   // Called to set caption and title visibility during dragging.
   OnSelectorItemDragStarted(/*item=*/nullptr);
 }
@@ -769,7 +767,7 @@
   return shield_view_->GetLabelBounds();
 }
 
-void WindowGrid::SetWindowListAnimationStates(
+void WindowGrid::CalculateWindowListAnimationStates(
     WindowSelectorItem* selected_item,
     WindowSelector::OverviewTransition transition) {
   // |selected_item| is nullptr during entering animation.
@@ -802,16 +800,16 @@
       const bool is_selected_item = (selected_item == container_item);
       if (!has_checked_selected_item && is_selected_item)
         has_checked_selected_item = true;
-      SetWindowSelectorItemAnimationState(
+      CalculateWindowSelectorItemAnimationState(
           container_item, &has_covered_available_workspace,
           /*selected=*/is_selected_item, transition);
     }
   }
 
   if (!has_checked_selected_item) {
-    SetWindowSelectorItemAnimationState(selected_item,
-                                        &has_covered_available_workspace,
-                                        /*selected=*/true, transition);
+    CalculateWindowSelectorItemAnimationState(selected_item,
+                                              &has_covered_available_workspace,
+                                              /*selected=*/true, transition);
   }
   for (const auto& item : window_list_) {
     // Has checked the |selected_item|.
@@ -820,13 +818,14 @@
     // Has checked all always on top windows.
     if (item->GetWindow()->GetProperty(aura::client::kAlwaysOnTopKey))
       continue;
-    SetWindowSelectorItemAnimationState(item.get(),
-                                        &has_covered_available_workspace,
-                                        /*selected=*/false, transition);
+    CalculateWindowSelectorItemAnimationState(item.get(),
+                                              &has_covered_available_workspace,
+                                              /*selected=*/false, transition);
   }
 }
 
 void WindowGrid::SetWindowListNotAnimatedWhenExiting() {
+  should_animate_when_exiting_ = false;
   for (const auto& item : window_list_)
     item->set_should_animate_when_exiting(false);
 }
@@ -1348,7 +1347,7 @@
   return windows_fit;
 }
 
-void WindowGrid::SetWindowSelectorItemAnimationState(
+void WindowGrid::CalculateWindowSelectorItemAnimationState(
     WindowSelectorItem* selector_item,
     bool* has_covered_available_workspace,
     bool selected,
diff --git a/ash/wm/overview/window_grid.h b/ash/wm/overview/window_grid.h
index 1e38c58..2532db1 100644
--- a/ash/wm/overview/window_grid.h
+++ b/ash/wm/overview/window_grid.h
@@ -153,11 +153,12 @@
 
   gfx::Rect GetNoItemsIndicatorLabelBoundsForTesting() const;
 
-  // Sets |should_animate_when_entering_| and |should_animate_when_exiting_| of
-  // the selector items of the windows based on where the first MRU window
-  // covering the available workspace is found. |selector_item| is not nullptr
-  // when |selector_item| is the selected item when exiting overview mode.
-  void SetWindowListAnimationStates(
+  // Calculates |should_animate_when_entering_| and
+  // |should_animate_when_exiting_| of the window selector items based on where
+  // the first MRU window covering the available workspace is found.
+  // |selector_item| is not nullptr if |selector_item| is the selected item when
+  // exiting overview mode.
+  void CalculateWindowListAnimationStates(
       WindowSelectorItem* selected_item,
       WindowSelector::OverviewTransition transition);
 
@@ -205,6 +206,10 @@
     return new_selector_item_widget_.get();
   }
 
+  bool should_animate_when_exiting() const {
+    return should_animate_when_exiting_;
+  }
+
  private:
   class ShieldView;
   friend class WindowSelectorTest;
@@ -261,11 +266,10 @@
                               int* out_min_right,
                               int* out_max_right);
 
-  // Sets |selector_item|'s |should_animate_when_entering_|,
-  // |should_animate_when_exiting_|.
-  // |selector_item| is not nullptr when |selector_item| is the selected item
-  // when exiting overview mode.
-  void SetWindowSelectorItemAnimationState(
+  // Calculates |selector_item|'s |should_animate_when_entering_|,
+  // |should_animate_when_exiting_|. |selected| is true if if |selector_item| is
+  // the selected item when exiting overview mode.
+  void CalculateWindowSelectorItemAnimationState(
       WindowSelectorItem* selector_item,
       bool* has_fullscreen_coverred,
       bool selected,
@@ -315,6 +319,13 @@
   // True only after all windows have been prepared for overview.
   bool prepared_for_overview_ = false;
 
+  // True if the window grid should animate when exiting overview mode. Note
+  // even if it's true, it doesn't mean all window items in the grid should
+  // animate when exiting overview, instead each window item's animation status
+  // is controlled by its own |should_animate_when_exiting_|. But if it's false,
+  // all window items in the grid don't have animation.
+  bool should_animate_when_exiting_ = true;
+
   // This WindowGrid's total bounds in screen coordinates.
   gfx::Rect bounds_;
 
diff --git a/ash/wm/overview/window_selector.cc b/ash/wm/overview/window_selector.cc
index a0b7533..efa6992 100644
--- a/ash/wm/overview/window_selector.cc
+++ b/ash/wm/overview/window_selector.cc
@@ -307,8 +307,8 @@
       if (dragged_window) {
         window_grid->PositionWindows(/*animate=*/false);
       } else {
-        window_grid->SetWindowListAnimationStates(/*selected_item=*/nullptr,
-                                                  OverviewTransition::kEnter);
+        window_grid->CalculateWindowListAnimationStates(
+            /*selected_item=*/nullptr, OverviewTransition::kEnter);
         window_grid->PositionWindows(/*animate=*/true, /*ignore_item=*/nullptr,
                                      OverviewTransition::kEnter);
       }
@@ -357,13 +357,8 @@
   for (std::unique_ptr<WindowGrid>& window_grid : grid_list_) {
     // During shutdown, do not animate all windows in overview if we need to
     // animate the snapped window.
-    if (split_view_controller->IsSplitViewModeActive() &&
-        split_view_controller->GetDefaultSnappedWindow()->GetRootWindow() ==
-            window_grid->root_window() &&
-        split_view_controller->has_animating_window()) {
-      window_grid->SetWindowListNotAnimatedWhenExiting();
-    } else {
-      window_grid->SetWindowListAnimationStates(
+    if (window_grid->should_animate_when_exiting()) {
+      window_grid->CalculateWindowListAnimationStates(
           selected_item_ && selected_item_->window_grid() == window_grid.get()
               ? selected_item_
               : nullptr,
@@ -638,14 +633,7 @@
 
 bool WindowSelector::ShouldAnimateWallpaper(aura::Window* root_window) {
   // Find the grid associated with |root_window|.
-  WindowGrid* grid = nullptr;
-  for (const auto& window_grid : grid_list_) {
-    if (window_grid->root_window() == root_window) {
-      grid = window_grid.get();
-      break;
-    }
-  }
-
+  WindowGrid* grid = GetGridWithRootWindow(root_window);
   if (!grid)
     return false;
 
@@ -666,6 +654,14 @@
   return false;
 }
 
+void WindowSelector::SetWindowListNotAnimatedWhenExiting(
+    aura::Window* root_window) {
+  // Find the grid accociated with |root_window|.
+  WindowGrid* grid = GetGridWithRootWindow(root_window);
+  if (grid)
+    grid->SetWindowListNotAnimatedWhenExiting();
+}
+
 void WindowSelector::OnDisplayRemoved(const display::Display& display) {
   // TODO(flackr): Keep window selection active on remaining displays.
   CancelSelection();
@@ -728,15 +724,10 @@
     return;
   }
 
-  aura::Window* root_window = gained_active->GetRootWindow();
-  auto grid =
-      std::find_if(grid_list_.begin(), grid_list_.end(),
-                   [root_window](const std::unique_ptr<WindowGrid>& grid) {
-                     return grid->root_window() == root_window;
-                   });
-  if (grid == grid_list_.end())
+  auto* grid = GetGridWithRootWindow(gained_active->GetRootWindow());
+  if (!grid)
     return;
-  const auto& windows = (*grid)->window_list();
+  const auto& windows = grid->window_list();
 
   auto iter = std::find_if(
       windows.begin(), windows.end(),
diff --git a/ash/wm/overview/window_selector.h b/ash/wm/overview/window_selector.h
index 2f126aa2..770e3ab 100644
--- a/ash/wm/overview/window_selector.h
+++ b/ash/wm/overview/window_selector.h
@@ -161,8 +161,18 @@
   // the entire workspace, true otherwise.
   bool ShouldAnimateWallpaper(aura::Window* root_window);
 
+  // Returns true if |window| is currently showing in overview.
   bool IsWindowInOverview(const aura::Window* window);
 
+  // Set the window grid that's displaying in |root_window| not animate when
+  // exiting overview mode, i.e., all window items in the grid will not animate
+  // when exiting overview mode. It may be called in two cases: 1) When a window
+  // gets snapped (either from overview or not) and thus cause the end of the
+  // overview mode, we should not do the exiting animation; 2) When a window
+  // is dragged around and when released, it causes the end of the overview
+  // mode, we also should not do the exiting animation.
+  void SetWindowListNotAnimatedWhenExiting(aura::Window* root_window);
+
   WindowSelectorDelegate* delegate() { return delegate_; }
 
   int text_filter_bottom() const { return text_filter_bottom_; }
diff --git a/ash/wm/splitview/split_view_controller.cc b/ash/wm/splitview/split_view_controller.cc
index dc79cc8..c49863a1 100644
--- a/ash/wm/splitview/split_view_controller.cc
+++ b/ash/wm/splitview/split_view_controller.cc
@@ -718,13 +718,19 @@
 void SplitViewController::OnOverviewModeEnding() {
   DCHECK(IsSplitViewModeActive());
 
-  if (state_ == BOTH_SNAPPED)
-    return;
-
   WindowSelector* window_selector =
       Shell::Get()->window_selector_controller()->window_selector();
-  WindowGrid* current_grid = window_selector->GetGridWithRootWindow(
-      GetDefaultSnappedWindow()->GetRootWindow());
+  aura::Window* root_window = GetDefaultSnappedWindow()->GetRootWindow();
+
+  if (state_ == BOTH_SNAPPED) {
+    // If overview is ended because of the window gets snapped, do not do
+    // exiting overview animation.
+    window_selector->SetWindowListNotAnimatedWhenExiting(root_window);
+    return;
+  }
+
+  WindowGrid* current_grid =
+      window_selector->GetGridWithRootWindow(root_window);
   if (!current_grid)
     return;
 
@@ -737,6 +743,9 @@
       aura::Window* window = window_selector_item->GetWindow();
       if (CanSnap(window) && window != GetDefaultSnappedWindow()) {
         SnapWindow(window, (default_snap_position_ == LEFT) ? RIGHT : LEFT);
+        // If ending overview causes a window to snap, also do not do exiting
+        // overview animation.
+        window_selector->SetWindowListNotAnimatedWhenExiting(root_window);
         return;
       }
     }
@@ -1268,9 +1277,7 @@
   overview_window_item_bounds_map_.erase(iter);
 
   // Restore the window's transform first if it's not identity.
-  has_animating_window_ = !window->layer()->GetTargetTransform().IsIdentity();
-
-  if (has_animating_window_) {
+  if (!window->layer()->GetTargetTransform().IsIdentity()) {
     // Calculate the starting transform based on the window's expected snapped
     // bounds and its window item bounds in overview.
     const gfx::Rect snapped_bounds = GetSnappedWindowBoundsInScreen(
@@ -1461,9 +1468,13 @@
         InsertWindowToOverview(previous_snapped_window);
       }
     } else {
-      // End the overview mode if it's active at the moment. The dragged window
-      // will be restored back to its previous state before dragging.
-      EndOverview();
+      if (window_selector_controller->IsSelecting()) {
+        window_selector_controller->window_selector()
+            ->SetWindowListNotAnimatedWhenExiting(window->GetRootWindow());
+        // End the overview mode if it's active at the moment. The dragged
+        // window will be restored back to its previous state before dragging.
+        EndOverview();
+      }
     }
   } else {
     aura::Window* previous_snapped_window =
diff --git a/ash/wm/splitview/split_view_controller.h b/ash/wm/splitview/split_view_controller.h
index 3002745..9907f4dc 100644
--- a/ash/wm/splitview/split_view_controller.h
+++ b/ash/wm/splitview/split_view_controller.h
@@ -190,9 +190,6 @@
   SnapPosition default_snap_position() const { return default_snap_position_; }
   SplitViewDivider* split_view_divider() { return split_view_divider_.get(); }
   bool is_resizing() const { return is_resizing_; }
-  bool has_animating_window() const {
-    return has_animating_window_;
-  }
 
  private:
   friend class SplitViewControllerTest;
@@ -404,9 +401,6 @@
   // window comes from the overview.
   base::flat_map<aura::Window*, gfx::Rect> overview_window_item_bounds_map_;
 
-  // True if there is an animating window.
-  bool has_animating_window_ = false;
-
   base::ObserverList<Observer> observers_;
   mojo::InterfacePtrSet<mojom::SplitViewObserver> mojo_observers_;
 
diff --git a/ash/wm/splitview/split_view_controller_unittest.cc b/ash/wm/splitview/split_view_controller_unittest.cc
index 1b991ee..dea2fc5 100644
--- a/ash/wm/splitview/split_view_controller_unittest.cc
+++ b/ash/wm/splitview/split_view_controller_unittest.cc
@@ -49,6 +49,46 @@
 
 namespace ash {
 
+namespace {
+
+// The observer to observe the overview states in |root_window_|.
+class OverviewStatesObserver : public ShellObserver {
+ public:
+  OverviewStatesObserver(aura::Window* root_window)
+      : root_window_(root_window) {
+    Shell::Get()->AddShellObserver(this);
+  }
+  ~OverviewStatesObserver() override {
+    Shell::Get()->RemoveShellObserver(this);
+  }
+
+  // ShellObserver:
+  void OnOverviewModeStarting() override {
+    // Reset the value to true.
+    overview_animate_when_exiting_ = true;
+  }
+  void OnOverviewModeEnding() override {
+    WindowSelector* window_selector =
+        Shell::Get()->window_selector_controller()->window_selector();
+    WindowGrid* grid = window_selector->GetGridWithRootWindow(root_window_);
+    if (!grid)
+      return;
+    overview_animate_when_exiting_ = grid->should_animate_when_exiting();
+  }
+
+  bool overview_animate_when_exiting() const {
+    return overview_animate_when_exiting_;
+  }
+
+ private:
+  bool overview_animate_when_exiting_ = true;
+  aura::Window* root_window_;
+
+  DISALLOW_COPY_AND_ASSIGN(OverviewStatesObserver);
+};
+
+}  // namespace
+
 class SplitViewControllerTest : public AshTestBase {
  public:
   SplitViewControllerTest() = default;
@@ -1477,6 +1517,57 @@
   EXPECT_FALSE(shadow_controller->IsShadowVisibleForWindow(window3.get()));
 }
 
+// Tests that if snapping a window causes overview to end (e.g., select two
+// windows in overview mode to snap to both side of the screen), or toggle
+// overview to end overview causes a window to snap, we should not have the
+// exiting animation.
+TEST_F(SplitViewControllerTest, OverviewExitAnimationTest) {
+  const gfx::Rect bounds(0, 0, 400, 400);
+  std::unique_ptr<aura::Window> window1(CreateWindow(bounds));
+  std::unique_ptr<aura::Window> window2(CreateWindow(bounds));
+  std::unique_ptr<aura::Window> window3(CreateWindow(bounds));
+
+  // 1) For normal toggle overview case, we should have animation when
+  // exiting overview.
+  std::unique_ptr<OverviewStatesObserver> overview_observer =
+      std::make_unique<OverviewStatesObserver>(window1->GetRootWindow());
+  ToggleOverview();
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
+  ToggleOverview();
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(overview_observer->overview_animate_when_exiting());
+
+  // 2) If overview is ended because of activating a window:
+  ToggleOverview();
+  // It will end overview.
+  wm::ActivateWindow(window1.get());
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(overview_observer->overview_animate_when_exiting());
+
+  // 3) If overview is ended because of snapping a window:
+  split_view_controller()->SnapWindow(window1.get(), SplitViewController::LEFT);
+  // Reset the observer as we'll need the OverviewStatesObserver to be added to
+  // to ShellObserver list after SplitViewController.
+  overview_observer.reset(new OverviewStatesObserver(window1->GetRootWindow()));
+  ToggleOverview();  // Start overview.
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
+  // Test |overview_animate_when_exiting_| has been properly reset.
+  EXPECT_TRUE(overview_observer->overview_animate_when_exiting());
+  split_view_controller()->SnapWindow(window2.get(),
+                                      SplitViewController::RIGHT);
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_FALSE(overview_observer->overview_animate_when_exiting());
+
+  // 4) If ending overview causes a window to snap:
+  ToggleOverview();
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
+  // Test |overview_animate_when_exiting_| has been properly reset.
+  EXPECT_TRUE(overview_observer->overview_animate_when_exiting());
+  ToggleOverview();
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_FALSE(overview_observer->overview_animate_when_exiting());
+}
+
 // Test the tab-dragging related functionalities in tablet mode. Tab(s) can be
 // dragged out of a window and then put in split view mode or merge into another
 // window.
@@ -2154,6 +2245,78 @@
   EXPECT_FALSE(current_grid->new_selector_item_widget_for_testing());
 }
 
+// Tests that if overview is ended because of releasing the dragged window, we
+// should not do animation when exiting overview.
+TEST_F(SplitViewTabDraggingTest, OverviewExitAnimationTest) {
+  const gfx::Rect bounds(0, 0, 400, 400);
+  std::unique_ptr<aura::Window> window1(CreateWindow(bounds));
+  std::unique_ptr<aura::Window> window2(CreateWindow(bounds));
+  std::unique_ptr<aura::Window> window3(CreateWindow(bounds));
+  std::unique_ptr<OverviewStatesObserver> overview_observer =
+      std::make_unique<OverviewStatesObserver>(window1->GetRootWindow());
+
+  // 1) If dragging a maximized window:
+  std::unique_ptr<WindowResizer> resizer =
+      StartDrag(window1.get(), window1.get());
+  ASSERT_TRUE(resizer.get());
+  // Overview should have been opened because the dragged window is the source
+  // window.
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
+  // The value should be properly initialized.
+  EXPECT_TRUE(overview_observer->overview_animate_when_exiting());
+
+  // Now release the dragged window. There should be no animation when exiting
+  // overview.
+  CompleteDrag(std::move(resizer));
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_FALSE(overview_observer->overview_animate_when_exiting());
+
+  // 2) If dragging a snapped window:
+  split_view_controller()->SnapWindow(window1.get(), SplitViewController::LEFT);
+  split_view_controller()->SnapWindow(window2.get(),
+                                      SplitViewController::RIGHT);
+  overview_observer.reset(new OverviewStatesObserver(window1->GetRootWindow()));
+  resizer = StartDrag(window1.get(), window1.get());
+  ASSERT_TRUE(resizer.get());
+  // Overview should have been opened behind the dragged window.
+  EXPECT_TRUE(Shell::Get()->window_selector_controller()->IsSelecting());
+  // Split view should still be active.
+  EXPECT_EQ(split_view_controller()->state(),
+            SplitViewController::RIGHT_SNAPPED);
+  // The value should be properly initialized.
+  EXPECT_TRUE(overview_observer->overview_animate_when_exiting());
+
+  CompleteDrag(std::move(resizer));
+  EXPECT_FALSE(Shell::Get()->window_selector_controller()->IsSelecting());
+  EXPECT_EQ(split_view_controller()->state(),
+            SplitViewController::BOTH_SNAPPED);
+  EXPECT_FALSE(overview_observer->overview_animate_when_exiting());
+}
+
+class TestWindowDelegateWithWidget : public views::WidgetDelegate {
+ public:
+  TestWindowDelegateWithWidget(bool can_activate)
+      : can_activate_(can_activate) {}
+  ~TestWindowDelegateWithWidget() override = default;
+
+  // views::WidgetDelegate:
+  void DeleteDelegate() override { delete this; }
+  views::Widget* GetWidget() override { return widget_; }
+  const views::Widget* GetWidget() const override { return widget_; }
+  bool CanActivate() const override { return can_activate_; }
+  bool CanResize() const override { return true; }
+  bool CanMaximize() const override { return true; }
+  bool ShouldAdvanceFocusToTopLevelWidget() const override { return true; }
+
+  void set_widget(views::Widget* widget) { widget_ = widget; }
+
+ private:
+  bool can_activate_ = false;
+  views::Widget* widget_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(TestWindowDelegateWithWidget);
+};
+
 class SplitViewAppDraggingTest : public SplitViewControllerTest {
  public:
   SplitViewAppDraggingTest() = default;
@@ -2172,11 +2335,18 @@
   }
 
  protected:
-  aura::Window* CreateAppWindow(const gfx::Rect& bounds) {
-    aura::Window* window = CreateWindow(bounds);
-    window->SetProperty(aura::client::kAppType,
-                        static_cast<int>(ash::AppType::CHROME_APP));
-    return window;
+  std::unique_ptr<aura::Window> CreateTestWindowWithWidget(
+      bool can_activate = true) {
+    views::Widget::InitParams params(views::Widget::InitParams::TYPE_WINDOW);
+    params.show_state = ui::SHOW_STATE_MAXIMIZED;
+    views::Widget* widget = new views::Widget;
+    std::unique_ptr<TestWindowDelegateWithWidget> widget_delegate =
+        std::make_unique<TestWindowDelegateWithWidget>(can_activate);
+    widget_delegate->set_widget(widget);
+    params.delegate = widget_delegate.release();
+    widget->Init(params);
+    widget->Show();
+    return base::WrapUnique<aura::Window>(widget->GetNativeView());
   }
 
   // Sends a gesture scroll sequence to TabletModeAppWindowDragController.
@@ -2236,13 +2406,38 @@
   DISALLOW_COPY_AND_ASSIGN(SplitViewAppDraggingTest);
 };
 
+// Tests that drag the window that cannot be snapped from top of the display
+// will not snap the window into splitscreen.
+TEST_F(SplitViewAppDraggingTest, DragNoneActiveMaximizedWindow) {
+  UpdateDisplay("800x600");
+  std::unique_ptr<aura::Window> window = CreateTestWindowWithWidget(false);
+  EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
+  gfx::Rect display_bounds =
+      split_view_controller()->GetDisplayWorkAreaBoundsInScreen(window.get());
+  const float long_scroll_delta = display_bounds.height() / 4 + 5;
+
+  gfx::Point start = gfx::Point(0, 0);
+  // Drag the window that cannot be snapped long enough, the window will be
+  // restored back to maximized.
+  base::TimeTicks timestamp = base::TimeTicks::Now();
+  SendScrollStartAndUpdate(start, long_scroll_delta, timestamp, window.get());
+  WindowSelectorController* window_selector_controller =
+      Shell::Get()->window_selector_controller();
+  EXPECT_TRUE(window_selector_controller->IsSelecting());
+  EXPECT_FALSE(
+      window_selector_controller->window_selector()->IsWindowInOverview(
+          window.get()));
+  EndScrollSequence(start, long_scroll_delta, timestamp, window.get());
+  EXPECT_FALSE(window_selector_controller->IsSelecting());
+  EXPECT_FALSE(split_view_controller()->IsSplitViewModeActive());
+  EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
+}
+
 // Tests the functionalities that are related to dragging a maximized window
 // into splitscreen.
-TEST_F(SplitViewAppDraggingTest, DragMaximizedWindow) {
+TEST_F(SplitViewAppDraggingTest, DragActiveMaximizedWindow) {
   UpdateDisplay("800x600");
-  std::unique_ptr<aura::Window> window(
-      CreateAppWindow(gfx::Rect(0, 0, 500, 500)));
-  wm::GetWindowState(window.get())->Maximize();
+  std::unique_ptr<aura::Window> window = CreateTestWindowWithWidget();
   EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
   gfx::Rect display_bounds =
       split_view_controller()->GetDisplayWorkAreaBoundsInScreen(window.get());
@@ -2272,24 +2467,6 @@
             SplitViewController::LEFT_SNAPPED);
   EXPECT_TRUE(wm::GetWindowState(window.get())->IsSnapped());
 
-  // Drag the window that cannot be snapped long enough, the window will be
-  // restored back to maximized.
-  aura::test::TestWindowDelegate* delegate =
-      static_cast<aura::test::TestWindowDelegate*>(window->delegate());
-  delegate->set_minimum_size(
-      gfx::Size(display_bounds.width() * 0.67f, display_bounds.height()));
-  timestamp = base::TimeTicks::Now();
-  SendScrollStartAndUpdate(start, long_scroll_delta, timestamp, window.get());
-  window_selector_controller = Shell::Get()->window_selector_controller();
-  EXPECT_TRUE(window_selector_controller->IsSelecting());
-  EXPECT_FALSE(
-      window_selector_controller->window_selector()->IsWindowInOverview(
-          window.get()));
-  EndScrollSequence(start, long_scroll_delta, timestamp, window.get());
-  EXPECT_FALSE(window_selector_controller->IsSelecting());
-  EXPECT_FALSE(split_view_controller()->IsSplitViewModeActive());
-  EXPECT_TRUE(wm::GetWindowState(window.get())->IsMaximized());
-
   // FLING the window with small velocity (smaller than
   // kFlingToOverviewThreshold) will not able to drop the window into overview.
   timestamp = base::TimeTicks::Now();
@@ -2318,8 +2495,7 @@
 // Tests the shelf visibility when a fullscreened window is being dragged.
 TEST_F(SplitViewAppDraggingTest, ShelfVisibilityIfDraggingFullscreenedWindow) {
   UpdateDisplay("800x600");
-  std::unique_ptr<aura::Window> window(
-      CreateAppWindow(gfx::Rect(0, 0, 500, 500)));
+  std::unique_ptr<aura::Window> window = CreateTestWindowWithWidget();
   ShelfLayoutManager* shelf_layout_manager =
       AshTestBase::GetPrimaryShelf()->shelf_layout_manager();
   gfx::Rect display_bounds =
diff --git a/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.cc b/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.cc
index bc2f79058..0d2c414 100644
--- a/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.cc
+++ b/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.cc
@@ -60,10 +60,8 @@
 
 bool TabletModeAppWindowDragController::DragWindowFromTop(
     ui::GestureEvent* event) {
-  if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
-    StartWindowDrag(event);
-    return true;
-  }
+  if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN)
+    return StartWindowDrag(event);
 
   if (!drag_delegate_->dragged_window())
     return false;
@@ -83,10 +81,16 @@
   return false;
 }
 
-void TabletModeAppWindowDragController::StartWindowDrag(
+bool TabletModeAppWindowDragController::StartWindowDrag(
     ui::GestureEvent* event) {
-  drag_delegate_->StartWindowDrag(static_cast<aura::Window*>(event->target()),
+  views::Widget* widget = views::Widget::GetTopLevelWidgetForNativeView(
+      static_cast<aura::Window*>(event->target()));
+  if (!widget)
+    return false;
+
+  drag_delegate_->StartWindowDrag(widget->GetNativeWindow(),
                                   GetEventLocationInScreen(event));
+  return true;
 }
 
 void TabletModeAppWindowDragController::UpdateWindowDrag(
diff --git a/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.h b/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.h
index 804bf9b..f745936 100644
--- a/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.h
+++ b/ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.h
@@ -33,7 +33,7 @@
 
  private:
   // Gesture window drag related functions. Used in DragWindowFromTop.
-  void StartWindowDrag(ui::GestureEvent* event);
+  bool StartWindowDrag(ui::GestureEvent* event);
   void UpdateWindowDrag(ui::GestureEvent* event);
   void EndWindowDrag(ui::GestureEvent* event,
                      wm::WmToplevelWindowEventHandler::DragResult result);
diff --git a/ash/ws/window_service_owner.cc b/ash/ws/window_service_owner.cc
index 00742d8..945de14 100644
--- a/ash/ws/window_service_owner.cc
+++ b/ash/ws/window_service_owner.cc
@@ -13,9 +13,12 @@
 #include "services/ui/ws2/gpu_interface_provider.h"
 #include "services/ui/ws2/window_service.h"
 #include "ui/base/ui_base_features.h"
+#include "ui/display/display.h"
+#include "ui/display/screen.h"
 #include "ui/wm/core/focus_controller.h"
 
 namespace ash {
+
 WindowServiceOwner::WindowServiceOwner(
     std::unique_ptr<ui::ws2::GpuInterfaceProvider> gpu_interface_provider)
     : gpu_interface_provider_(std::move(gpu_interface_provider)) {}
@@ -38,6 +41,8 @@
   window_service_->SetFrameDecorationValues(
       NonClientFrameController::GetPreferredClientAreaInsets(),
       NonClientFrameController::GetMaxTitleBarButtonWidth());
+  window_service_->SetDisplayForNewWindows(
+      display::Screen::GetScreen()->GetDisplayForNewWindows().id());
   RegisterWindowProperties(window_service_->property_converter());
   service_context_ = std::make_unique<service_manager::ServiceContext>(
       std::move(window_service), std::move(request));
diff --git a/base/BUILD.gn b/base/BUILD.gn
index b071b296..2ef131b 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -819,8 +819,12 @@
     "system_monitor/system_monitor.h",
     "task/cancelable_task_tracker.cc",
     "task/cancelable_task_tracker.h",
-    "task/lazy_task_runner_forward.h",
-    "task/post_task_forward.h",
+    "task/lazy_task_runner.cc",
+    "task/lazy_task_runner.h",
+    "task/post_task.cc",
+    "task/post_task.h",
+    "task/scoped_set_task_priority_for_current_thread.cc",
+    "task/scoped_set_task_priority_for_current_thread.h",
     "task/sequence_manager/associated_thread_id.h",
     "task/sequence_manager/enqueue_order.cc",
     "task/sequence_manager/enqueue_order.h",
@@ -858,66 +862,56 @@
     "task/sequence_manager/work_queue.h",
     "task/sequence_manager/work_queue_sets.cc",
     "task/sequence_manager/work_queue_sets.h",
-    "task/single_thread_task_runner_thread_mode_forward.h",
-    "task/task_scheduler/initialization_util_forward.h",
-    "task/task_scheduler/task_scheduler_forward.h",
-    "task/task_traits_forward.h",
+    "task/single_thread_task_runner_thread_mode.h",
+    "task/task_scheduler/can_schedule_sequence_observer.h",
+    "task/task_scheduler/delayed_task_manager.cc",
+    "task/task_scheduler/delayed_task_manager.h",
+    "task/task_scheduler/environment_config.cc",
+    "task/task_scheduler/environment_config.h",
+    "task/task_scheduler/initialization_util.cc",
+    "task/task_scheduler/initialization_util.h",
+    "task/task_scheduler/platform_native_worker_pool_win.cc",
+    "task/task_scheduler/platform_native_worker_pool_win.h",
+    "task/task_scheduler/priority_queue.cc",
+    "task/task_scheduler/priority_queue.h",
+    "task/task_scheduler/scheduler_lock.h",
+    "task/task_scheduler/scheduler_lock_impl.cc",
+    "task/task_scheduler/scheduler_lock_impl.h",
+    "task/task_scheduler/scheduler_single_thread_task_runner_manager.cc",
+    "task/task_scheduler/scheduler_single_thread_task_runner_manager.h",
+    "task/task_scheduler/scheduler_worker.cc",
+    "task/task_scheduler/scheduler_worker.h",
+    "task/task_scheduler/scheduler_worker_observer.h",
+    "task/task_scheduler/scheduler_worker_params.h",
+    "task/task_scheduler/scheduler_worker_pool.cc",
+    "task/task_scheduler/scheduler_worker_pool.h",
+    "task/task_scheduler/scheduler_worker_pool_impl.cc",
+    "task/task_scheduler/scheduler_worker_pool_impl.h",
+    "task/task_scheduler/scheduler_worker_pool_params.cc",
+    "task/task_scheduler/scheduler_worker_pool_params.h",
+    "task/task_scheduler/scheduler_worker_stack.cc",
+    "task/task_scheduler/scheduler_worker_stack.h",
+    "task/task_scheduler/sequence.cc",
+    "task/task_scheduler/sequence.h",
+    "task/task_scheduler/sequence_sort_key.cc",
+    "task/task_scheduler/sequence_sort_key.h",
+    "task/task_scheduler/service_thread.cc",
+    "task/task_scheduler/service_thread.h",
+    "task/task_scheduler/task.cc",
+    "task/task_scheduler/task.h",
+    "task/task_scheduler/task_scheduler.cc",
+    "task/task_scheduler/task_scheduler.h",
+    "task/task_scheduler/task_scheduler_impl.cc",
+    "task/task_scheduler/task_scheduler_impl.h",
+    "task/task_scheduler/task_tracker.cc",
+    "task/task_scheduler/task_tracker.h",
+    "task/task_scheduler/tracked_ref.h",
+    "task/task_traits.cc",
+    "task/task_traits.h",
+    "task/task_traits_details.h",
     "task_runner.cc",
     "task_runner.h",
     "task_runner_util.h",
-    "task_scheduler/can_schedule_sequence_observer.h",
-    "task_scheduler/delayed_task_manager.cc",
-    "task_scheduler/delayed_task_manager.h",
-    "task_scheduler/environment_config.cc",
-    "task_scheduler/environment_config.h",
-    "task_scheduler/initialization_util.cc",
-    "task_scheduler/initialization_util.h",
-    "task_scheduler/lazy_task_runner.cc",
-    "task_scheduler/lazy_task_runner.h",
-    "task_scheduler/platform_native_worker_pool_win.cc",
-    "task_scheduler/platform_native_worker_pool_win.h",
-    "task_scheduler/post_task.cc",
-    "task_scheduler/post_task.h",
-    "task_scheduler/priority_queue.cc",
-    "task_scheduler/priority_queue.h",
-    "task_scheduler/scheduler_lock.h",
-    "task_scheduler/scheduler_lock_impl.cc",
-    "task_scheduler/scheduler_lock_impl.h",
-    "task_scheduler/scheduler_single_thread_task_runner_manager.cc",
-    "task_scheduler/scheduler_single_thread_task_runner_manager.h",
-    "task_scheduler/scheduler_worker.cc",
-    "task_scheduler/scheduler_worker.h",
-    "task_scheduler/scheduler_worker_observer.h",
-    "task_scheduler/scheduler_worker_params.h",
-    "task_scheduler/scheduler_worker_pool.cc",
-    "task_scheduler/scheduler_worker_pool.h",
-    "task_scheduler/scheduler_worker_pool_impl.cc",
-    "task_scheduler/scheduler_worker_pool_impl.h",
-    "task_scheduler/scheduler_worker_pool_params.cc",
-    "task_scheduler/scheduler_worker_pool_params.h",
-    "task_scheduler/scheduler_worker_stack.cc",
-    "task_scheduler/scheduler_worker_stack.h",
-    "task_scheduler/scoped_set_task_priority_for_current_thread.cc",
-    "task_scheduler/scoped_set_task_priority_for_current_thread.h",
-    "task_scheduler/sequence.cc",
-    "task_scheduler/sequence.h",
-    "task_scheduler/sequence_sort_key.cc",
-    "task_scheduler/sequence_sort_key.h",
-    "task_scheduler/service_thread.cc",
-    "task_scheduler/service_thread.h",
-    "task_scheduler/single_thread_task_runner_thread_mode.h",
-    "task_scheduler/task.cc",
-    "task_scheduler/task.h",
-    "task_scheduler/task_scheduler.cc",
-    "task_scheduler/task_scheduler.h",
-    "task_scheduler/task_scheduler_impl.cc",
-    "task_scheduler/task_scheduler_impl.h",
-    "task_scheduler/task_tracker.cc",
-    "task_scheduler/task_tracker.h",
-    "task_scheduler/task_traits.cc",
-    "task_scheduler/task_traits.h",
-    "task_scheduler/task_traits_details.h",
-    "task_scheduler/tracked_ref.h",
     "template_util.h",
     "test/malloc_wrapper.h",
     "third_party/dmg_fp/dmg_fp.h",
@@ -1188,8 +1182,8 @@
       "synchronization/waitable_event_posix.cc",
       "synchronization/waitable_event_watcher_posix.cc",
       "sys_info_posix.cc",
-      "task_scheduler/task_tracker_posix.cc",
-      "task_scheduler/task_tracker_posix.h",
+      "task/task_scheduler/task_tracker_posix.cc",
+      "task/task_scheduler/task_tracker_posix.h",
       "threading/platform_thread_internal_posix.cc",
       "threading/platform_thread_internal_posix.h",
       "threading/platform_thread_posix.cc",
@@ -1437,8 +1431,8 @@
       "synchronization/waitable_event_watcher_posix.cc",
       "sys_info_fuchsia.cc",
       "sys_info_posix.cc",
-      "task_scheduler/task_tracker_posix.cc",
-      "task_scheduler/task_tracker_posix.h",
+      "task/task_scheduler/task_tracker_posix.cc",
+      "task/task_scheduler/task_tracker_posix.h",
       "threading/platform_thread_fuchsia.cc",
       "threading/platform_thread_posix.cc",
       "threading/thread_local_storage_posix.cc",
@@ -1513,8 +1507,8 @@
       "sync_socket_posix.cc",
       "sys_info.cc",
       "sys_info_posix.cc",
-      "task_scheduler/initialization_util.cc",
-      "task_scheduler/initialization_util.h",
+      "task/task_scheduler/initialization_util.cc",
+      "task/task_scheduler/initialization_util.h",
       "trace_event/trace_event_system_stats_monitor.cc",
     ]
 
@@ -1536,8 +1530,8 @@
         "process/launch.h",
         "process/launch_posix.cc",
         "rand_util_posix.cc",
-        "task_scheduler/task_tracker_posix.cc",
-        "task_scheduler/task_tracker_posix.h",
+        "task/task_scheduler/task_tracker_posix.cc",
+        "task/task_scheduler/task_tracker_posix.h",
       ]
     }
   } else {
@@ -2394,6 +2388,8 @@
     "sys_info_unittest.cc",
     "system_monitor/system_monitor_unittest.cc",
     "task/cancelable_task_tracker_unittest.cc",
+    "task/lazy_task_runner_unittest.cc",
+    "task/scoped_set_task_priority_for_current_thread_unittest.cc",
     "task/sequence_manager/intrusive_heap_unittest.cc",
     "task/sequence_manager/lazily_deallocated_deque_unittest.cc",
     "task/sequence_manager/sequence_manager_impl_unittest.cc",
@@ -2401,29 +2397,27 @@
     "task/sequence_manager/time_domain_unittest.cc",
     "task/sequence_manager/work_queue_sets_unittest.cc",
     "task/sequence_manager/work_queue_unittest.cc",
+    "task/task_scheduler/delayed_task_manager_unittest.cc",
+    "task/task_scheduler/priority_queue_unittest.cc",
+    "task/task_scheduler/scheduler_lock_unittest.cc",
+    "task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc",
+    "task/task_scheduler/scheduler_worker_pool_impl_unittest.cc",
+    "task/task_scheduler/scheduler_worker_pool_unittest.cc",
+    "task/task_scheduler/scheduler_worker_stack_unittest.cc",
+    "task/task_scheduler/scheduler_worker_unittest.cc",
+    "task/task_scheduler/sequence_sort_key_unittest.cc",
+    "task/task_scheduler/sequence_unittest.cc",
+    "task/task_scheduler/service_thread_unittest.cc",
+    "task/task_scheduler/task_scheduler_impl_unittest.cc",
+    "task/task_scheduler/task_tracker_unittest.cc",
+    "task/task_scheduler/task_unittest.cc",
+    "task/task_scheduler/test_task_factory.cc",
+    "task/task_scheduler/test_task_factory.h",
+    "task/task_scheduler/test_utils.cc",
+    "task/task_scheduler/test_utils.h",
+    "task/task_scheduler/tracked_ref_unittest.cc",
+    "task/task_traits_unittest.cc",
     "task_runner_util_unittest.cc",
-    "task_scheduler/delayed_task_manager_unittest.cc",
-    "task_scheduler/lazy_task_runner_unittest.cc",
-    "task_scheduler/priority_queue_unittest.cc",
-    "task_scheduler/scheduler_lock_unittest.cc",
-    "task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc",
-    "task_scheduler/scheduler_worker_pool_impl_unittest.cc",
-    "task_scheduler/scheduler_worker_pool_unittest.cc",
-    "task_scheduler/scheduler_worker_stack_unittest.cc",
-    "task_scheduler/scheduler_worker_unittest.cc",
-    "task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc",
-    "task_scheduler/sequence_sort_key_unittest.cc",
-    "task_scheduler/sequence_unittest.cc",
-    "task_scheduler/service_thread_unittest.cc",
-    "task_scheduler/task_scheduler_impl_unittest.cc",
-    "task_scheduler/task_tracker_unittest.cc",
-    "task_scheduler/task_traits_unittest.cc",
-    "task_scheduler/task_unittest.cc",
-    "task_scheduler/test_task_factory.cc",
-    "task_scheduler/test_task_factory.h",
-    "task_scheduler/test_utils.cc",
-    "task_scheduler/test_utils.h",
-    "task_scheduler/tracked_ref_unittest.cc",
     "template_util_unittest.cc",
     "test/metrics/histogram_enum_reader_unittest.cc",
     "test/metrics/histogram_tester_unittest.cc",
@@ -2557,7 +2551,7 @@
       "message_loop/message_loop_io_posix_unittest.cc",
       "posix/file_descriptor_shuffle_unittest.cc",
       "posix/unix_domain_socket_unittest.cc",
-      "task_scheduler/task_tracker_posix_unittest.cc",
+      "task/task_scheduler/task_tracker_posix_unittest.cc",
     ]
   }
 
@@ -2676,7 +2670,7 @@
       "fuchsia/service_directory_unittest.cc",
       "message_loop/message_loop_io_posix_unittest.cc",
       "posix/file_descriptor_shuffle_unittest.cc",
-      "task_scheduler/task_tracker_posix_unittest.cc",
+      "task/task_scheduler/task_tracker_posix_unittest.cc",
     ]
 
     # TODO(crbug.com/851641): FilePatchWatcherImpl is not implemented.
@@ -2764,7 +2758,7 @@
       "metrics/histogram_unittest.nc",
       "optional_unittest.nc",
       "strings/string16_unittest.nc",
-      "task_scheduler/task_traits_unittest.nc",
+      "task/task_traits_unittest.nc",
       "thread_annotations_unittest.nc",
     ]
 
diff --git a/base/allocator/partition_allocator/partition_alloc.h b/base/allocator/partition_allocator/partition_alloc.h
index 4e162058..976f43d 100644
--- a/base/allocator/partition_allocator/partition_alloc.h
+++ b/base/allocator/partition_allocator/partition_alloc.h
@@ -344,6 +344,8 @@
                                                int flags,
                                                size_t size,
                                                const char* type_name) {
+  DCHECK_LT(flags, PartitionAllocLastFlag << 1);
+
 #if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
   void* result = malloc(size);
   CHECK(result || flags & PartitionAllocReturnNull);
diff --git a/base/allocator/partition_allocator/partition_alloc_constants.h b/base/allocator/partition_allocator/partition_alloc_constants.h
index deaa19e..cbf671f 100644
--- a/base/allocator/partition_allocator/partition_alloc_constants.h
+++ b/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -154,6 +154,8 @@
 // Flags for PartitionAllocGenericFlags.
 enum PartitionAllocFlags {
   PartitionAllocReturnNull = 1 << 0,
+
+  PartitionAllocLastFlag = PartitionAllocReturnNull
 };
 
 }  // namespace base
diff --git a/base/android/jni_generator/jni_generator.py b/base/android/jni_generator/jni_generator.py
index 8615649..ee6a52bb 100755
--- a/base/android/jni_generator/jni_generator.py
+++ b/base/android/jni_generator/jni_generator.py
@@ -1347,7 +1347,6 @@
 See SampleForTests.java for more details.
   """
   option_parser = optparse.OptionParser(usage=usage)
-  build_utils.AddDepfileOption(option_parser)
 
   option_parser.add_option('-j', '--jar_file', dest='jar_file',
                            help='Extract the list of input files from'
@@ -1401,9 +1400,6 @@
     output_file = os.path.join(options.output_dir, root_name) + '_jni.h'
   GenerateJNIHeader(input_file, output_file, options)
 
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, output_file)
-
 
 if __name__ == '__main__':
   sys.exit(main(sys.argv))
diff --git a/base/android/jni_generator/jni_generator.pydeps b/base/android/jni_generator/jni_generator.pydeps
new file mode 100644
index 0000000..f3db6708
--- /dev/null
+++ b/base/android/jni_generator/jni_generator.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root base/android/jni_generator --output base/android/jni_generator/jni_generator.pydeps base/android/jni_generator/jni_generator.py
+../../../build/android/gyp/util/__init__.py
+../../../build/android/gyp/util/build_utils.py
+../../../build/android/gyp/util/md5_check.py
+../../../build/gn_helpers.py
+jni_generator.py
diff --git a/base/android/jni_generator/jni_registration_generator.py b/base/android/jni_generator/jni_registration_generator.py
index dec56ee..d4fb39a 100755
--- a/base/android/jni_generator/jni_registration_generator.py
+++ b/base/android/jni_generator/jni_registration_generator.py
@@ -333,7 +333,8 @@
 
   if args.depfile:
     build_utils.WriteDepfile(args.depfile, output_file,
-                             args.sources_files + java_file_paths)
+                             args.sources_files + java_file_paths,
+                             add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/base/android/jni_generator/jni_registration_generator.pydeps b/base/android/jni_generator/jni_registration_generator.pydeps
new file mode 100644
index 0000000..14b0ae22
--- /dev/null
+++ b/base/android/jni_generator/jni_registration_generator.pydeps
@@ -0,0 +1,8 @@
+# Generated by running:
+#   build/print_python_deps.py --root base/android/jni_generator --output base/android/jni_generator/jni_registration_generator.pydeps base/android/jni_generator/jni_registration_generator.py
+../../../build/android/gyp/util/__init__.py
+../../../build/android/gyp/util/build_utils.py
+../../../build/android/gyp/util/md5_check.py
+../../../build/gn_helpers.py
+jni_generator.py
+jni_registration_generator.py
diff --git a/base/compiler_specific.h b/base/compiler_specific.h
index e57194ec..2139ab2f 100644
--- a/base/compiler_specific.h
+++ b/base/compiler_specific.h
@@ -77,9 +77,9 @@
 #define NOINLINE
 #endif
 
-#if COMPILER_GCC && defined(NDEBUG)
+#if defined(COMPILER_GCC) && defined(NDEBUG)
 #define ALWAYS_INLINE inline __attribute__((__always_inline__))
-#elif COMPILER_MSVC && defined(NDEBUG)
+#elif defined(COMPILER_MSVC) && defined(NDEBUG)
 #define ALWAYS_INLINE __forceinline
 #else
 #define ALWAYS_INLINE inline
diff --git a/base/debug/task_annotator_unittest.cc b/base/debug/task_annotator_unittest.cc
index 8659f8a..70e327c2 100644
--- a/base/debug/task_annotator_unittest.cc
+++ b/base/debug/task_annotator_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/base/i18n/streaming_utf8_validator_unittest.cc b/base/i18n/streaming_utf8_validator_unittest.cc
index 0106934..d1b18a3 100644
--- a/base/i18n/streaming_utf8_validator_unittest.cc
+++ b/base/i18n/streaming_utf8_validator_unittest.cc
@@ -32,8 +32,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversion_utils.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "third_party/icu/source/common/unicode/utf8.h"
 
 #endif  // BASE_I18N_UTF8_VALIDATOR_THOROUGH_TEST
diff --git a/base/lazy_instance.h b/base/lazy_instance.h
index 36d31586..4449373 100644
--- a/base/lazy_instance.h
+++ b/base/lazy_instance.h
@@ -55,7 +55,7 @@
 
 // LazyInstance uses its own struct initializer-list style static
 // initialization, which does not require a constructor.
-#define LAZY_INSTANCE_INITIALIZER {0}
+#define LAZY_INSTANCE_INITIALIZER {}
 
 namespace base {
 
diff --git a/base/message_loop/message_loop_unittest.cc b/base/message_loop/message_loop_unittest.cc
index 24620fa..0dacae9 100644
--- a/base/message_loop/message_loop_unittest.cc
+++ b/base/message_loop/message_loop_unittest.cc
@@ -22,7 +22,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/gtest_util.h"
 #include "base/test/metrics/histogram_tester.h"
diff --git a/base/observer_list_unittest.cc b/base/observer_list_unittest.cc
index 96c218ff3..db1ff9a2 100644
--- a/base/observer_list_unittest.cc
+++ b/base/observer_list_unittest.cc
@@ -18,8 +18,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/gtest_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/platform_thread.h"
diff --git a/base/process/kill.cc b/base/process/kill.cc
index 5c1c87b6..f641d3f 100644
--- a/base/process/kill.cc
+++ b/base/process/kill.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/process/process_iterator.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 
 namespace base {
diff --git a/base/process/kill_fuchsia.cc b/base/process/kill_fuchsia.cc
index 081b769..2684a14 100644
--- a/base/process/kill_fuchsia.cc
+++ b/base/process/kill_fuchsia.cc
@@ -7,7 +7,7 @@
 #include <zircon/syscalls.h>
 
 #include "base/process/process_iterator.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 
 namespace base {
diff --git a/base/process/kill_posix.cc b/base/process/kill_posix.cc
index a7b5023..8905f78d 100644
--- a/base/process/kill_posix.cc
+++ b/base/process/kill_posix.cc
@@ -16,7 +16,7 @@
 #include "base/macros.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/process/process_iterator.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
 
diff --git a/base/stl_util.h b/base/stl_util.h
index 6d521cc..e05958a 100644
--- a/base/stl_util.h
+++ b/base/stl_util.h
@@ -172,11 +172,7 @@
 // Returns true if the container is sorted.
 template <typename Container>
 bool STLIsSorted(const Container& cont) {
-  // Note: Use reverse iterator on container to ensure we only require
-  // value_type to implement operator<.
-  return std::adjacent_find(cont.rbegin(), cont.rend(),
-                            std::less<typename Container::value_type>())
-      == cont.rend();
+  return std::is_sorted(std::begin(cont), std::end(cont));
 }
 
 // Returns a new ResultType containing the difference of two sorted containers.
diff --git a/base/stl_util_unittest.cc b/base/stl_util_unittest.cc
index f13f881..100a42e 100644
--- a/base/stl_util_unittest.cc
+++ b/base/stl_util_unittest.cc
@@ -308,6 +308,13 @@
     vector.back() = 1;
     EXPECT_FALSE(STLIsSorted(vector));
   }
+
+  {
+    int array[] = {1, 1, 4, 64, 12432};
+    EXPECT_TRUE(STLIsSorted(array));
+    array[4] = 1;
+    EXPECT_FALSE(STLIsSorted(array));
+  }
 }
 
 TEST(STLUtilTest, STLSetDifference) {
diff --git a/base/strings/string_util.cc b/base/strings/string_util.cc
index 32e5ff2..f0c2197 100644
--- a/base/strings/string_util.cc
+++ b/base/strings/string_util.cc
@@ -22,7 +22,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/singleton.h"
+#include "base/no_destructor.h"
 #include "base/strings/utf_string_conversion_utils.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/third_party/icu/icu_utf.h"
@@ -32,19 +32,6 @@
 
 namespace {
 
-// Force the singleton used by EmptyString[16] to be a unique type. This
-// prevents other code that might accidentally use Singleton<string> from
-// getting our internal one.
-struct EmptyStrings {
-  EmptyStrings() = default;
-  const std::string s;
-  const string16 s16;
-
-  static EmptyStrings* GetInstance() {
-    return Singleton<EmptyStrings>::get();
-  }
-};
-
 // Used by ReplaceStringPlaceholders to track the position in the string of
 // replaced parameters.
 struct ReplacementOffset {
@@ -238,11 +225,13 @@
 }
 
 const std::string& EmptyString() {
-  return EmptyStrings::GetInstance()->s;
+  static const base::NoDestructor<std::string> s;
+  return *s;
 }
 
 const string16& EmptyString16() {
-  return EmptyStrings::GetInstance()->s16;
+  static const base::NoDestructor<string16> s16;
+  return *s16;
 }
 
 template <class StringType>
diff --git a/base/strings/string_util.h b/base/strings/string_util.h
index d6780ec..d534590 100644
--- a/base/strings/string_util.h
+++ b/base/strings/string_util.h
@@ -147,8 +147,8 @@
 // strings.
 //
 // It is likely faster to construct a new empty string object (just a few
-// instructions to set the length to 0) than to get the empty string singleton
-// returned by these functions (which requires threadsafe singleton access).
+// instructions to set the length to 0) than to get the empty string instance
+// returned by these functions (which requires threadsafe static access).
 //
 // Therefore, DO NOT USE THESE AS A GENERAL-PURPOSE SUBSTITUTE FOR DEFAULT
 // CONSTRUCTORS. There is only one case where you should use these: functions
diff --git a/base/task/README.md b/base/task/README.md
index 0db116a..cdecad2 100644
--- a/base/task/README.md
+++ b/base/task/README.md
@@ -1,4 +1,4 @@
-This directory has the following layout (WIP):
+This directory has the following layout:
 - base/task/: public APIs for posting tasks and managing task queues.
 - base/task/task_scheduler/: implementation of the TaskScheduler.
 - base/task/sequence_manager/: implementation of the SequenceManager.
diff --git a/base/task_scheduler/lazy_task_runner.cc b/base/task/lazy_task_runner.cc
similarity index 97%
rename from base/task_scheduler/lazy_task_runner.cc
rename to base/task/lazy_task_runner.cc
index 218d02b..20bac91 100644
--- a/base/task_scheduler/lazy_task_runner.cc
+++ b/base/task/lazy_task_runner.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/lazy_task_runner.h"
+#include "base/task/lazy_task_runner.h"
 
 #include <utility>
 
 #include "base/lazy_instance.h"
 #include "base/logging.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/task/post_task.h"
 
 namespace base {
 namespace internal {
diff --git a/base/task_scheduler/lazy_task_runner.h b/base/task/lazy_task_runner.h
similarity index 96%
rename from base/task_scheduler/lazy_task_runner.h
rename to base/task/lazy_task_runner.h
index 7fcbddff..7b260d34 100644
--- a/base/task_scheduler/lazy_task_runner.h
+++ b/base/task/lazy_task_runner.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 BASE_TASK_SCHEDULER_LAZY_TASK_RUNNER_H_
-#define BASE_TASK_SCHEDULER_LAZY_TASK_RUNNER_H_
+#ifndef BASE_TASK_LAZY_TASK_RUNNER_H_
+#define BASE_TASK_LAZY_TASK_RUNNER_H_
 
 #include <vector>
 
@@ -13,9 +13,9 @@
 #include "base/lazy_instance_helpers.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 
 // Lazy(Sequenced|SingleThread|COMSTA)TaskRunner lazily creates a TaskRunner.
@@ -215,4 +215,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_LAZY_TASK_RUNNER_H_
+#endif  // BASE_TASK_LAZY_TASK_RUNNER_H_
diff --git a/base/task/lazy_task_runner_forward.h b/base/task/lazy_task_runner_forward.h
deleted file mode 100644
index 56b4739..0000000
--- a/base/task/lazy_task_runner_forward.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TASK_LAZY_TASK_RUNNER_FORWARD_H_
-#define BASE_TASK_LAZY_TASK_RUNNER_FORWARD_H_
-
-// If you are seeing this you synced to a very short-lived state in the task
-// scheduler's header migration. To keep as much git history as possible while
-// avoiding a mass header rename in thousands of file in the main move CL,
-// base/task_scheduler's public headers were moved this way :
-// for each base/task_scheduler/public.h:
-//  A.1) Introduce base/task/public_forward.h and move the world to use it
-//  A.2) Move base/task_scheduler/public.h to base/task/public.h (and update
-//       forwarding headers)
-//  A.3) Delete base/task/public_forward.h (move world to base/task/public.h).
-//
-// An alternative would have been:
-//  B.1) Move base/task_scheduler/public.h to base/task/public.h and leave
-//       a stub fowarding header in base/task_scheduler/public.h
-//  B.2) Migrate world from base/task_scheduler/public.h to base/task/public.h
-//       and delete stub.
-// That approach however results in git not considering base/task/public.h as
-// being a new file rather than a move in (B.1) and losing all history.
-//
-// Another alternative would have been:
-//  C.1) Introduce base/task/public.h as a forwarding header and move the world
-//       to it
-//  C.2) Move base/task_scheduler/public.h over base/task/public.h
-// That approach also results in git not considering (C.2) a file move (per
-// overriding an existing file) and losing all history.
-//
-// As such approach A was preferred : the landing process will wait for all 3
-// CLs to be LGTM'ed in approach A and then land them switfly back-to-back.
-
-#include "base/task_scheduler/lazy_task_runner.h"
-
-#endif  // BASE_TASK_LAZY_TASK_RUNNER_FORWARD_H_
diff --git a/base/task_scheduler/lazy_task_runner_unittest.cc b/base/task/lazy_task_runner_unittest.cc
similarity index 97%
rename from base/task_scheduler/lazy_task_runner_unittest.cc
rename to base/task/lazy_task_runner_unittest.cc
index 3ca09c9b..c983187 100644
--- a/base/task_scheduler/lazy_task_runner_unittest.cc
+++ b/base/task/lazy_task_runner_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/lazy_task_runner.h"
+#include "base/task/lazy_task_runner.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/sequence_checker_impl.h"
-#include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
+#include "base/task/scoped_set_task_priority_for_current_thread.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_checker_impl.h"
 #include "build/build_config.h"
diff --git a/base/task_scheduler/post_task.cc b/base/task/post_task.cc
similarity index 96%
rename from base/task_scheduler/post_task.cc
rename to base/task/post_task.cc
index 15210a5..a12b7dd4 100644
--- a/base/task_scheduler/post_task.cc
+++ b/base/task/post_task.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/post_task.h"
+#include "base/task/post_task.h"
 
 #include <utility>
 
 #include "base/logging.h"
-#include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
-#include "base/task_scheduler/task_scheduler.h"
+#include "base/task/scoped_set_task_priority_for_current_thread.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/post_task_and_reply_impl.h"
 
 namespace base {
diff --git a/base/task_scheduler/post_task.h b/base/task/post_task.h
similarity index 93%
rename from base/task_scheduler/post_task.h
rename to base/task/post_task.h
index 438cd02..278cf42 100644
--- a/base/task_scheduler/post_task.h
+++ b/base/task/post_task.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 BASE_TASK_SCHEDULER_POST_TASK_H_
-#define BASE_TASK_SCHEDULER_POST_TASK_H_
+#ifndef BASE_TASK_POST_TASK_H_
+#define BASE_TASK_POST_TASK_H_
 
 #include <memory>
 #include <utility>
@@ -16,15 +16,15 @@
 #include "base/post_task_and_reply_with_result_internal.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
-#include "base/task_scheduler/task_traits.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 
 namespace base {
 
-// This is the preferred interface to post tasks to the TaskScheduler.
+// This is the interface to post tasks to the TaskScheduler.
 //
 // To post a simple one-off task with default traits:
 //     PostTask(FROM_HERE, Bind(...));
@@ -189,8 +189,8 @@
 
 // Returns a SingleThreadTaskRunner whose PostTask invocations result in
 // scheduling tasks using |traits| on a thread determined by |thread_mode|. See
-// base/task_scheduler/single_thread_task_runner_thread_mode.h for |thread_mode|
-// details. Tasks run on a single thread in posting order.
+// base/task/single_thread_task_runner_thread_mode.h for |thread_mode| details.
+// Tasks run on a single thread in posting order.
 //
 // If all you need is to make sure that tasks don't run concurrently (e.g.
 // because they access a data structure which is not thread-safe), use
@@ -208,9 +208,9 @@
 // Returns a SingleThreadTaskRunner whose PostTask invocations result in
 // scheduling tasks using |traits| in a COM Single-Threaded Apartment on a
 // thread determined by |thread_mode|. See
-// base/task_scheduler/single_thread_task_runner_thread_mode.h for |thread_mode|
-// details. Tasks run in the same Single-Threaded Apartment in posting order for
-// the returned SingleThreadTaskRunner. There is not necessarily a one-to-one
+// base/task/single_thread_task_runner_thread_mode.h for |thread_mode| details.
+// Tasks run in the same Single-Threaded Apartment in posting order for the
+// returned SingleThreadTaskRunner. There is not necessarily a one-to-one
 // correspondence between SingleThreadTaskRunners and Single-Threaded
 // Apartments. The implementation is free to share apartments or create new
 // apartments as necessary. In either case, care should be taken to make sure
@@ -223,4 +223,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_POST_TASK_H_
+#endif  // BASE_TASK_POST_TASK_H_
diff --git a/base/task/post_task_forward.h b/base/task/post_task_forward.h
deleted file mode 100644
index 4211828..0000000
--- a/base/task/post_task_forward.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TASK_POST_TASK_FORWARD_H_
-#define BASE_TASK_POST_TASK_FORWARD_H_
-
-// If you are seeing this you synced to a very short-lived state in the task
-// scheduler's header migration. To keep as much git history as possible while
-// avoiding a mass header rename in thousands of file in the main move CL,
-// base/task_scheduler's public headers were moved this way :
-// for each base/task_scheduler/public.h:
-//  A.1) Introduce base/task/public_forward.h and move the world to use it
-//  A.2) Move base/task_scheduler/public.h to base/task/public.h (and update
-//       forwarding headers)
-//  A.3) Delete base/task/public_forward.h (move world to base/task/public.h).
-//
-// An alternative would have been:
-//  B.1) Move base/task_scheduler/public.h to base/task/public.h and leave
-//       a stub fowarding header in base/task_scheduler/public.h
-//  B.2) Migrate world from base/task_scheduler/public.h to base/task/public.h
-//       and delete stub.
-// That approach however results in git not considering base/task/public.h as
-// being a new file rather than a move in (B.1) and losing all history.
-//
-// Another alternative would have been:
-//  C.1) Introduce base/task/public.h as a forwarding header and move the world
-//       to it
-//  C.2) Move base/task_scheduler/public.h over base/task/public.h
-// That approach also results in git not considering (C.2) a file move (per
-// overriding an existing file) and losing all history.
-//
-// As such approach A was preferred : the landing process will wait for all 3
-// CLs to be LGTM'ed in approach A and then land them switfly back-to-back.
-
-#include "base/task_scheduler/post_task.h"
-
-#endif  // BASE_TASK_POST_TASK_FORWARD_H_
diff --git a/base/task_scheduler/scoped_set_task_priority_for_current_thread.cc b/base/task/scoped_set_task_priority_for_current_thread.cc
similarity index 93%
rename from base/task_scheduler/scoped_set_task_priority_for_current_thread.cc
rename to base/task/scoped_set_task_priority_for_current_thread.cc
index a163863..a1bd0e7 100644
--- a/base/task_scheduler/scoped_set_task_priority_for_current_thread.cc
+++ b/base/task/scoped_set_task_priority_for_current_thread.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 "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
+#include "base/task/scoped_set_task_priority_for_current_thread.h"
 
 #include "base/lazy_instance.h"
 #include "base/logging.h"
diff --git a/base/task_scheduler/scoped_set_task_priority_for_current_thread.h b/base/task/scoped_set_task_priority_for_current_thread.h
similarity index 77%
rename from base/task_scheduler/scoped_set_task_priority_for_current_thread.h
rename to base/task/scoped_set_task_priority_for_current_thread.h
index 4508911d..fadc6bf0 100644
--- a/base/task_scheduler/scoped_set_task_priority_for_current_thread.h
+++ b/base/task/scoped_set_task_priority_for_current_thread.h
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SCOPED_SET_TASK_PRIORITY_FOR_CURRENT_THREAD_H_
-#define BASE_TASK_SCHEDULER_SCOPED_SET_TASK_PRIORITY_FOR_CURRENT_THREAD_H_
+#ifndef BASE_TASK_SCOPED_SET_TASK_PRIORITY_FOR_CURRENT_THREAD_H_
+#define BASE_TASK_SCOPED_SET_TASK_PRIORITY_FOR_CURRENT_THREAD_H_
 
 #include "base/base_export.h"
 #include "base/macros.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 
 namespace base {
 namespace internal {
@@ -33,4 +33,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCOPED_SET_TASK_PRIORITY_FOR_CURRENT_THREAD_H_
+#endif  // BASE_TASK_SCOPED_SET_TASK_PRIORITY_FOR_CURRENT_THREAD_H_
diff --git a/base/task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc b/base/task/scoped_set_task_priority_for_current_thread_unittest.cc
similarity index 86%
rename from base/task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc
rename to base/task/scoped_set_task_priority_for_current_thread_unittest.cc
index c497af6..f88f858 100644
--- a/base/task_scheduler/scoped_set_task_priority_for_current_thread_unittest.cc
+++ b/base/task/scoped_set_task_priority_for_current_thread_unittest.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
+#include "base/task/scoped_set_task_priority_for_current_thread.h"
 
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
diff --git a/base/task/sequence_manager/sequence_manager_perftest.cc b/base/task/sequence_manager/sequence_manager_perftest.cc
index c5cd1a00..4bcffa8 100644
--- a/base/task/sequence_manager/sequence_manager_perftest.cc
+++ b/base/task/sequence_manager/sequence_manager_perftest.cc
@@ -17,6 +17,7 @@
 #include "base/task/sequence_manager/test/sequence_manager_for_test.h"
 #include "base/task/sequence_manager/test/test_task_queue.h"
 #include "base/task/sequence_manager/test/test_task_time_observer.h"
+#include "base/task/sequence_manager/thread_controller_with_message_pump_impl.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
@@ -52,7 +53,12 @@
   DISALLOW_COPY_AND_ASSIGN(PerfTestTimeDomain);
 };
 
-class SequenceManagerPerfTest : public testing::Test {
+enum class PerfTestType : int {
+  kUseMessageLoop = 0,
+  kUseMessagePump = 1,
+};
+
+class SequenceManagerPerfTest : public testing::TestWithParam<PerfTestType> {
  public:
   SequenceManagerPerfTest()
       : num_queues_(0),
@@ -64,6 +70,42 @@
   void SetUp() override {
     if (ThreadTicks::IsSupported())
       ThreadTicks::WaitUntilInitialized();
+
+    delayed_task_closure_ = BindRepeating(
+        &SequenceManagerPerfTest::TestDelayedTask, Unretained(this));
+
+    immediate_task_closure_ = BindRepeating(
+        &SequenceManagerPerfTest::TestImmediateTask, Unretained(this));
+
+    switch (GetParam()) {
+      case PerfTestType::kUseMessageLoop:
+        CreateSequenceManagerWithMessageLoop();
+        break;
+      case PerfTestType::kUseMessagePump:
+        CreateSequenceManagerWithMessagePump();
+        break;
+    }
+
+    time_domain_ = std::make_unique<PerfTestTimeDomain>();
+    manager_->RegisterTimeDomain(time_domain_.get());
+    manager_->AddTaskTimeObserver(&test_task_time_observer_);
+  }
+
+  void CreateSequenceManagerWithMessageLoop() {
+    message_loop_ = std::make_unique<MessageLoop>();
+    manager_ = SequenceManagerForTest::Create(message_loop_.get(),
+                                              message_loop_->task_runner(),
+                                              DefaultTickClock::GetInstance());
+  }
+
+  void CreateSequenceManagerWithMessagePump() {
+    manager_ = SequenceManagerForTest::Create(
+        std::make_unique<internal::ThreadControllerWithMessagePumpImpl>(
+            DefaultTickClock::GetInstance()));
+    // ThreadControllerWithMessagePumpImpl doesn't provide a default tas runner.
+    scoped_refptr<TaskQueue> default_task_queue =
+        manager_->CreateTaskQueue<TestTaskQueue>(TaskQueue::Spec("default"));
+    manager_->SetDefaultTaskRunner(default_task_queue);
   }
 
   void TearDown() override {
@@ -74,25 +116,10 @@
 
   void Initialize(size_t num_queues) {
     num_queues_ = num_queues;
-    message_loop_.reset(new MessageLoop());
-    manager_ = SequenceManagerForTest::Create(message_loop_.get(),
-                                              message_loop_->task_runner(),
-                                              DefaultTickClock::GetInstance());
-    manager_->AddTaskTimeObserver(&test_task_time_observer_);
-
-    time_domain_.reset(new PerfTestTimeDomain());
-    manager_->RegisterTimeDomain(time_domain_.get());
-
     for (size_t i = 0; i < num_queues; i++) {
       queues_.push_back(manager_->CreateTaskQueue<TestTaskQueue>(
           TaskQueue::Spec("test").SetTimeDomain(time_domain_.get())));
     }
-
-    delayed_task_closure_ = BindRepeating(
-        &SequenceManagerPerfTest::TestDelayedTask, Unretained(this));
-
-    immediate_task_closure_ = BindRepeating(
-        &SequenceManagerPerfTest::TestImmediateTask, Unretained(this));
   }
 
   void TestDelayedTask() {
@@ -184,8 +211,19 @@
       now = ThreadTicks::Now();
       num_iterations++;
     } while (now - start < TimeDelta::FromSeconds(5));
+
+    std::string trace_suffix;
+    switch (GetParam()) {
+      case PerfTestType::kUseMessageLoop:
+        trace_suffix = " with message loop";
+        break;
+      case PerfTestType::kUseMessagePump:
+        trace_suffix = " with message pump";
+        break;
+    }
+
     perf_test::PrintResult(
-        "task", "", trace,
+        "task", "", trace + trace_suffix,
         (now - start).InMicroseconds() / static_cast<double>(num_iterations),
         "us/run", true);
   }
@@ -207,7 +245,12 @@
   TestTaskTimeObserver test_task_time_observer_;
 };
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandDelayedTasks_OneQueue) {
+INSTANTIATE_TEST_CASE_P(,
+                        SequenceManagerPerfTest,
+                        testing::Values(PerfTestType::kUseMessageLoop,
+                                        PerfTestType::kUseMessagePump));
+
+TEST_P(SequenceManagerPerfTest, RunTenThousandDelayedTasks_OneQueue) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(1u);
@@ -218,7 +261,7 @@
                           Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandDelayedTasks_FourQueues) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandDelayedTasks_FourQueues) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(4u);
@@ -229,7 +272,7 @@
                           Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandDelayedTasks_EightQueues) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandDelayedTasks_EightQueues) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(8u);
@@ -240,7 +283,7 @@
                           Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandDelayedTasks_ThirtyTwoQueues) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandDelayedTasks_ThirtyTwoQueues) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(32u);
@@ -251,7 +294,7 @@
                           Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandImmediateTasks_OneQueue) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandImmediateTasks_OneQueue) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(1u);
@@ -263,7 +306,7 @@
                     Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandImmediateTasks_FourQueues) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandImmediateTasks_FourQueues) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(4u);
@@ -275,7 +318,7 @@
                     Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandImmediateTasks_EightQueues) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandImmediateTasks_EightQueues) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(8u);
@@ -287,7 +330,7 @@
                     Unretained(this), 10000));
 }
 
-TEST_F(SequenceManagerPerfTest, RunTenThousandImmediateTasks_ThirtyTwoQueues) {
+TEST_P(SequenceManagerPerfTest, RunTenThousandImmediateTasks_ThirtyTwoQueues) {
   if (!ThreadTicks::IsSupported())
     return;
   Initialize(32u);
diff --git a/base/task/sequence_manager/test/fake_task.cc b/base/task/sequence_manager/test/fake_task.cc
index 2ddd14e..5f67474 100644
--- a/base/task/sequence_manager/test/fake_task.cc
+++ b/base/task/sequence_manager/test/fake_task.cc
@@ -7,8 +7,14 @@
 namespace base {
 namespace sequence_manager {
 
-FakeTask::FakeTask()
-    : TaskQueue::Task(TaskQueue::PostedTask(OnceClosure(), FROM_HERE),
+FakeTask::FakeTask() : FakeTask(0 /* task_type */) {}
+
+FakeTask::FakeTask(int task_type)
+    : TaskQueue::Task(TaskQueue::PostedTask(OnceClosure(),
+                                            FROM_HERE,
+                                            TimeDelta(),
+                                            Nestable::kNestable,
+                                            task_type),
                       TimeTicks()) {}
 
 FakeTaskTiming::FakeTaskTiming()
diff --git a/base/task/sequence_manager/test/fake_task.h b/base/task/sequence_manager/test/fake_task.h
index 54cc3ac0..4c4759a 100644
--- a/base/task/sequence_manager/test/fake_task.h
+++ b/base/task/sequence_manager/test/fake_task.h
@@ -13,6 +13,7 @@
 class FakeTask : public TaskQueue::Task {
  public:
   FakeTask();
+  explicit FakeTask(int task_type);
 };
 
 class FakeTaskTiming : public TaskQueue::TaskTiming {
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
index d8641649..3dad1c5 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
@@ -14,7 +14,7 @@
 namespace internal {
 
 ThreadControllerWithMessagePumpImpl::ThreadControllerWithMessagePumpImpl(
-    TickClock* time_source)
+    const TickClock* time_source)
     : associated_thread_(AssociatedThreadId::CreateUnbound()),
       pump_(new MessagePumpDefault()),
       time_source_(time_source) {
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.h b/base/task/sequence_manager/thread_controller_with_message_pump_impl.h
index 2a70c45..73a942e5 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.h
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.h
@@ -27,7 +27,7 @@
       public MessagePump::Delegate,
       public RunLoop::Delegate {
  public:
-  explicit ThreadControllerWithMessagePumpImpl(TickClock* time_source);
+  explicit ThreadControllerWithMessagePumpImpl(const TickClock* time_source);
   ~ThreadControllerWithMessagePumpImpl() override;
 
   // ThreadController implementation:
@@ -100,7 +100,7 @@
   MainThreadOnly main_thread_only_;
   std::unique_ptr<MessagePump> pump_;
   debug::TaskAnnotator task_annotator_;
-  TickClock* time_source_;  // Not owned.
+  const TickClock* time_source_;  // Not owned.
 
   DISALLOW_COPY_AND_ASSIGN(ThreadControllerWithMessagePumpImpl);
 };
diff --git a/base/task_scheduler/single_thread_task_runner_thread_mode.h b/base/task/single_thread_task_runner_thread_mode.h
similarity index 78%
rename from base/task_scheduler/single_thread_task_runner_thread_mode.h
rename to base/task/single_thread_task_runner_thread_mode.h
index 6ed4228..a87c519 100644
--- a/base/task_scheduler/single_thread_task_runner_thread_mode.h
+++ b/base/task/single_thread_task_runner_thread_mode.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 BASE_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
-#define BASE_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
+#ifndef BASE_TASK_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
+#define BASE_TASK_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
 
 namespace base {
 
@@ -22,4 +22,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
+#endif  // BASE_TASK_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
diff --git a/base/task/single_thread_task_runner_thread_mode_forward.h b/base/task/single_thread_task_runner_thread_mode_forward.h
deleted file mode 100644
index 5c0626a..0000000
--- a/base/task/single_thread_task_runner_thread_mode_forward.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TASK_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_FORWARD_H_
-#define BASE_TASK_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_FORWARD_H_
-
-// If you are seeing this you synced to a very short-lived state in the task
-// scheduler's header migration. To keep as much git history as possible while
-// avoiding a mass header rename in thousands of file in the main move CL,
-// base/task_scheduler's public headers were moved this way :
-// for each base/task_scheduler/public.h:
-//  A.1) Introduce base/task/public_forward.h and move the world to use it
-//  A.2) Move base/task_scheduler/public.h to base/task/public.h (and update
-//       forwarding headers)
-//  A.3) Delete base/task/public_forward.h (move world to base/task/public.h).
-//
-// An alternative would have been:
-//  B.1) Move base/task_scheduler/public.h to base/task/public.h and leave
-//       a stub fowarding header in base/task_scheduler/public.h
-//  B.2) Migrate world from base/task_scheduler/public.h to base/task/public.h
-//       and delete stub.
-// That approach however results in git not considering base/task/public.h as
-// being a new file rather than a move in (B.1) and losing all history.
-//
-// Another alternative would have been:
-//  C.1) Introduce base/task/public.h as a forwarding header and move the world
-//       to it
-//  C.2) Move base/task_scheduler/public.h over base/task/public.h
-// That approach also results in git not considering (C.2) a file move (per
-// overriding an existing file) and losing all history.
-//
-// As such approach A was preferred : the landing process will wait for all 3
-// CLs to be LGTM'ed in approach A and then land them switfly back-to-back.
-
-#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
-
-#endif  // BASE_TASK_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_FORWARD_H_
diff --git a/base/task_scheduler/can_schedule_sequence_observer.h b/base/task/task_scheduler/can_schedule_sequence_observer.h
similarity index 70%
rename from base/task_scheduler/can_schedule_sequence_observer.h
rename to base/task/task_scheduler/can_schedule_sequence_observer.h
index f2b0551292..50284a1 100644
--- a/base/task_scheduler/can_schedule_sequence_observer.h
+++ b/base/task/task_scheduler/can_schedule_sequence_observer.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_CAN_SCHEDULE_SEQUENCE_OBSERVER_H_
-#define BASE_TASK_SCHEDULER_CAN_SCHEDULE_SEQUENCE_OBSERVER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_CAN_SCHEDULE_SEQUENCE_OBSERVER_H_
+#define BASE_TASK_TASK_SCHEDULER_CAN_SCHEDULE_SEQUENCE_OBSERVER_H_
 
-#include "base/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/sequence.h"
 
 namespace base {
 namespace internal {
@@ -24,4 +24,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_CAN_SCHEDULE_SEQUENCE_OBSERVER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_CAN_SCHEDULE_SEQUENCE_OBSERVER_H_
diff --git a/base/task_scheduler/delayed_task_manager.cc b/base/task/task_scheduler/delayed_task_manager.cc
similarity index 96%
rename from base/task_scheduler/delayed_task_manager.cc
rename to base/task/task_scheduler/delayed_task_manager.cc
index 86a6721..76d62e51 100644
--- a/base/task_scheduler/delayed_task_manager.cc
+++ b/base/task/task_scheduler/delayed_task_manager.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
 
 #include <algorithm>
 
 #include "base/bind.h"
 #include "base/logging.h"
+#include "base/task/task_scheduler/task.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/task.h"
 
 namespace base {
 namespace internal {
diff --git a/base/task_scheduler/delayed_task_manager.h b/base/task/task_scheduler/delayed_task_manager.h
similarity index 91%
rename from base/task_scheduler/delayed_task_manager.h
rename to base/task/task_scheduler/delayed_task_manager.h
index c48aeb1..23015a3 100644
--- a/base/task_scheduler/delayed_task_manager.h
+++ b/base/task/task_scheduler/delayed_task_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_
-#define BASE_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_
+#define BASE_TASK_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_
 
 #include <memory>
 #include <utility>
@@ -15,7 +15,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/atomic_flag.h"
-#include "base/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/tick_clock.h"
 
@@ -77,4 +77,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_DELAYED_TASK_MANAGER_H_
diff --git a/base/task_scheduler/delayed_task_manager_unittest.cc b/base/task/task_scheduler/delayed_task_manager_unittest.cc
similarity index 98%
rename from base/task_scheduler/delayed_task_manager_unittest.cc
rename to base/task/task_scheduler/delayed_task_manager_unittest.cc
index 67c797a..cb9ac1e 100644
--- a/base/task_scheduler/delayed_task_manager_unittest.cc
+++ b/base/task/task_scheduler/delayed_task_manager_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 "base/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
 
 #include <memory>
 #include <utility>
@@ -11,7 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/task.h"
+#include "base/task/task_scheduler/task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/thread.h"
diff --git a/base/task_scheduler/environment_config.cc b/base/task/task_scheduler/environment_config.cc
similarity index 96%
rename from base/task_scheduler/environment_config.cc
rename to base/task/task_scheduler/environment_config.cc
index 5fe28aa..bca9c38 100644
--- a/base/task_scheduler/environment_config.cc
+++ b/base/task/task_scheduler/environment_config.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 "base/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/environment_config.h"
 
 #include "base/synchronization/lock.h"
 #include "base/threading/platform_thread.h"
diff --git a/base/task_scheduler/environment_config.h b/base/task/task_scheduler/environment_config.h
similarity index 88%
rename from base/task_scheduler/environment_config.h
rename to base/task/task_scheduler/environment_config.h
index 19b685a..4ca8416 100644
--- a/base/task_scheduler/environment_config.h
+++ b/base/task/task_scheduler/environment_config.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_ENVIRONMENT_CONFIG_H_
-#define BASE_TASK_SCHEDULER_ENVIRONMENT_CONFIG_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_ENVIRONMENT_CONFIG_H_
+#define BASE_TASK_TASK_SCHEDULER_ENVIRONMENT_CONFIG_H_
 
 #include <stddef.h>
 
 #include "base/base_export.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread.h"
 
 namespace base {
@@ -50,4 +50,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_ENVIRONMENT_CONFIG_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_ENVIRONMENT_CONFIG_H_
diff --git a/base/task_scheduler/initialization_util.cc b/base/task/task_scheduler/initialization_util.cc
similarity index 91%
rename from base/task_scheduler/initialization_util.cc
rename to base/task/task_scheduler/initialization_util.cc
index 7accd19c..37f24f8 100644
--- a/base/task_scheduler/initialization_util.cc
+++ b/base/task/task_scheduler/initialization_util.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 "base/task_scheduler/initialization_util.h"
+#include "base/task/task_scheduler/initialization_util.h"
 
 #include <algorithm>
 
diff --git a/base/task_scheduler/initialization_util.h b/base/task/task_scheduler/initialization_util.h
similarity index 79%
rename from base/task_scheduler/initialization_util.h
rename to base/task/task_scheduler/initialization_util.h
index c3bd9e7..586318c 100644
--- a/base/task_scheduler/initialization_util.h
+++ b/base/task/task_scheduler/initialization_util.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 BASE_TASK_SCHEDULER_INITIALIZATION_UTIL_H_
-#define BASE_TASK_SCHEDULER_INITIALIZATION_UTIL_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_INITIALIZATION_UTIL_H_
+#define BASE_TASK_TASK_SCHEDULER_INITIALIZATION_UTIL_H_
 
 #include "base/base_export.h"
 
@@ -18,4 +18,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_INITIALIZATION_UTIL_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_INITIALIZATION_UTIL_H_
diff --git a/base/task/task_scheduler/initialization_util_forward.h b/base/task/task_scheduler/initialization_util_forward.h
deleted file mode 100644
index 86753270..0000000
--- a/base/task/task_scheduler/initialization_util_forward.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TASK_TASK_SCHEDULER_INITIALIZATION_UTIL_FORWARD_H_
-#define BASE_TASK_TASK_SCHEDULER_INITIALIZATION_UTIL_FORWARD_H_
-
-// If you are seeing this you synced to a very short-lived state in the task
-// scheduler's header migration. To keep as much git history as possible while
-// avoiding a mass header rename in thousands of file in the main move CL,
-// base/task_scheduler's public headers were moved this way :
-// for each base/task_scheduler/public.h:
-//  A.1) Introduce base/task/public_forward.h and move the world to use it
-//  A.2) Move base/task_scheduler/public.h to base/task/public.h (and update
-//       forwarding headers)
-//  A.3) Delete base/task/public_forward.h (move world to base/task/public.h).
-//
-// An alternative would have been:
-//  B.1) Move base/task_scheduler/public.h to base/task/public.h and leave
-//       a stub fowarding header in base/task_scheduler/public.h
-//  B.2) Migrate world from base/task_scheduler/public.h to base/task/public.h
-//       and delete stub.
-// That approach however results in git not considering base/task/public.h as
-// being a new file rather than a move in (B.1) and losing all history.
-//
-// Another alternative would have been:
-//  C.1) Introduce base/task/public.h as a forwarding header and move the world
-//       to it
-//  C.2) Move base/task_scheduler/public.h over base/task/public.h
-// That approach also results in git not considering (C.2) a file move (per
-// overriding an existing file) and losing all history.
-//
-// As such approach A was preferred : the landing process will wait for all 3
-// CLs to be LGTM'ed in approach A and then land them switfly back-to-back.
-
-#include "base/task_scheduler/initialization_util.h"
-
-#endif  // BASE_TASK_TASK_SCHEDULER_INITIALIZATION_UTIL_FORWARD_H_
diff --git a/base/task_scheduler/platform_native_worker_pool_win.cc b/base/task/task_scheduler/platform_native_worker_pool_win.cc
similarity index 96%
rename from base/task_scheduler/platform_native_worker_pool_win.cc
rename to base/task/task_scheduler/platform_native_worker_pool_win.cc
index ebad3a3..483afbe 100644
--- a/base/task_scheduler/platform_native_worker_pool_win.cc
+++ b/base/task/task_scheduler/platform_native_worker_pool_win.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/platform_native_worker_pool_win.h"
+#include "base/task/task_scheduler/platform_native_worker_pool_win.h"
 
-#include "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/task_tracker.h"
 
 namespace base {
 namespace internal {
diff --git a/base/task_scheduler/platform_native_worker_pool_win.h b/base/task/task_scheduler/platform_native_worker_pool_win.h
similarity index 90%
rename from base/task_scheduler/platform_native_worker_pool_win.h
rename to base/task/task_scheduler/platform_native_worker_pool_win.h
index be903b5..44e9b24 100644
--- a/base/task_scheduler/platform_native_worker_pool_win.h
+++ b/base/task/task_scheduler/platform_native_worker_pool_win.h
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_PLATFORM_NATIVE_WORKER_POOL_WIN_H
-#define BASE_TASK_SCHEDULER_PLATFORM_NATIVE_WORKER_POOL_WIN_H
+#ifndef BASE_TASK_TASK_SCHEDULER_PLATFORM_NATIVE_WORKER_POOL_WIN_H_
+#define BASE_TASK_TASK_SCHEDULER_PLATFORM_NATIVE_WORKER_POOL_WIN_H_
 
 #include <windows.h>
 
 #include "base/base_export.h"
 #include "base/logging.h"
 #include "base/synchronization/atomic_flag.h"
-#include "base/task_scheduler/priority_queue.h"
-#include "base/task_scheduler/scheduler_worker_pool.h"
+#include "base/task/task_scheduler/priority_queue.h"
+#include "base/task/task_scheduler/scheduler_worker_pool.h"
 
 namespace base {
 namespace internal {
@@ -87,4 +87,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_PLATFORM_NATIVE_WORKER_POOL_WIN_H
+#endif  // BASE_TASK_TASK_SCHEDULER_PLATFORM_NATIVE_WORKER_POOL_WIN_H_
diff --git a/base/task_scheduler/priority_queue.cc b/base/task/task_scheduler/priority_queue.cc
similarity index 98%
rename from base/task_scheduler/priority_queue.cc
rename to base/task/task_scheduler/priority_queue.cc
index fa11b10b9..9643c87b 100644
--- a/base/task_scheduler/priority_queue.cc
+++ b/base/task/task_scheduler/priority_queue.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 "base/task_scheduler/priority_queue.h"
+#include "base/task/task_scheduler/priority_queue.h"
 
 #include <utility>
 
@@ -59,8 +59,7 @@
 };
 
 PriorityQueue::Transaction::Transaction(PriorityQueue* outer_queue)
-    : auto_lock_(outer_queue->container_lock_), outer_queue_(outer_queue) {
-}
+    : auto_lock_(outer_queue->container_lock_), outer_queue_(outer_queue) {}
 
 PriorityQueue::Transaction::~Transaction() = default;
 
diff --git a/base/task_scheduler/priority_queue.h b/base/task/task_scheduler/priority_queue.h
similarity index 91%
rename from base/task_scheduler/priority_queue.h
rename to base/task/task_scheduler/priority_queue.h
index d882364..ca9ac13 100644
--- a/base/task_scheduler/priority_queue.h
+++ b/base/task/task_scheduler/priority_queue.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 BASE_TASK_SCHEDULER_PRIORITY_QUEUE_H_
-#define BASE_TASK_SCHEDULER_PRIORITY_QUEUE_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_PRIORITY_QUEUE_H_
+#define BASE_TASK_TASK_SCHEDULER_PRIORITY_QUEUE_H_
 
 #include <memory>
 #include <queue>
@@ -12,9 +12,9 @@
 #include "base/base_export.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/sequence_sort_key.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/sequence_sort_key.h"
 
 namespace base {
 namespace internal {
@@ -101,4 +101,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_PRIORITY_QUEUE_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_PRIORITY_QUEUE_H_
diff --git a/base/task_scheduler/priority_queue_unittest.cc b/base/task/task_scheduler/priority_queue_unittest.cc
similarity index 92%
rename from base/task_scheduler/priority_queue_unittest.cc
rename to base/task/task_scheduler/priority_queue_unittest.cc
index 7ea4b3b..f8a5212 100644
--- a/base/task_scheduler/priority_queue_unittest.cc
+++ b/base/task/task_scheduler/priority_queue_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 "base/task_scheduler/priority_queue.h"
+#include "base/task/task_scheduler/priority_queue.h"
 
 #include <memory>
 
@@ -12,9 +12,9 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_traits.h"
 #include "base/test/gtest_util.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/simple_thread.h"
@@ -132,13 +132,12 @@
   PriorityQueue pq_a;
   PriorityQueue pq_b;
 
-  EXPECT_DCHECK_DEATH(
-      {
-        std::unique_ptr<PriorityQueue::Transaction> transaction_a =
-            pq_a.BeginTransaction();
-        std::unique_ptr<PriorityQueue::Transaction> transaction_b =
-            pq_b.BeginTransaction();
-      });
+  EXPECT_DCHECK_DEATH({
+    std::unique_ptr<PriorityQueue::Transaction> transaction_a =
+        pq_a.BeginTransaction();
+    std::unique_ptr<PriorityQueue::Transaction> transaction_b =
+        pq_b.BeginTransaction();
+  });
 }
 
 // Check that it is possible to begin multiple Transactions for the same
diff --git a/base/task_scheduler/scheduler_lock.h b/base/task/task_scheduler/scheduler_lock.h
similarity index 90%
rename from base/task_scheduler/scheduler_lock.h
rename to base/task/task_scheduler/scheduler_lock.h
index c969eb1..20d983d 100644
--- a/base/task_scheduler/scheduler_lock.h
+++ b/base/task/task_scheduler/scheduler_lock.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 BASE_TASK_SCHEDULER_SCHEDULER_LOCK_H
-#define BASE_TASK_SCHEDULER_SCHEDULER_LOCK_H
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_LOCK_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_LOCK_H_
 
 #include <memory>
 
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/lock.h"
-#include "base/task_scheduler/scheduler_lock_impl.h"
+#include "base/task/task_scheduler/scheduler_lock_impl.h"
 
 namespace base {
 namespace internal {
@@ -52,7 +52,7 @@
   explicit SchedulerLock(const SchedulerLock* predecessor)
       : SchedulerLockImpl(predecessor) {}
 };
-#else  // DCHECK_IS_ON()
+#else   // DCHECK_IS_ON()
 class SchedulerLock : public Lock {
  public:
   SchedulerLock() = default;
@@ -85,4 +85,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_LOCK_H
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_LOCK_H_
diff --git a/base/task_scheduler/scheduler_lock_impl.cc b/base/task/task_scheduler/scheduler_lock_impl.cc
similarity index 93%
rename from base/task_scheduler/scheduler_lock_impl.cc
rename to base/task/task_scheduler/scheduler_lock_impl.cc
index d60f259..8a68d57d 100644
--- a/base/task_scheduler/scheduler_lock_impl.cc
+++ b/base/task/task_scheduler/scheduler_lock_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_lock_impl.h"
+#include "base/task/task_scheduler/scheduler_lock_impl.h"
 
 #include <algorithm>
 #include <unordered_map>
@@ -23,9 +23,8 @@
  public:
   SafeAcquisitionTracker() : tls_acquired_locks_(&OnTLSDestroy) {}
 
-  void RegisterLock(
-      const SchedulerLockImpl* const lock,
-      const SchedulerLockImpl* const predecessor) {
+  void RegisterLock(const SchedulerLockImpl* const lock,
+                    const SchedulerLockImpl* const predecessor) {
     DCHECK_NE(lock, predecessor) << "Reentrant locks are unsupported.";
     AutoLock auto_lock(allowed_predecessor_map_lock_);
     allowed_predecessor_map_[lock] = predecessor;
@@ -52,8 +51,8 @@
 
  private:
   using LockVector = std::vector<const SchedulerLockImpl*>;
-  using PredecessorMap = std::unordered_map<
-      const SchedulerLockImpl*, const SchedulerLockImpl*>;
+  using PredecessorMap =
+      std::unordered_map<const SchedulerLockImpl*, const SchedulerLockImpl*>;
 
   // This asserts that the lock is safe to acquire. This means that this should
   // be run before actually recording the acquisition.
@@ -149,8 +148,8 @@
 
 std::unique_ptr<ConditionVariable>
 SchedulerLockImpl::CreateConditionVariable() {
-  return std::unique_ptr<ConditionVariable>(new ConditionVariable(&lock_));
+  return std::make_unique<ConditionVariable>(&lock_);
 }
 
 }  // namespace internal
-}  // base
+}  // namespace base
diff --git a/base/task_scheduler/scheduler_lock_impl.h b/base/task/task_scheduler/scheduler_lock_impl.h
similarity index 85%
rename from base/task_scheduler/scheduler_lock_impl.h
rename to base/task/task_scheduler/scheduler_lock_impl.h
index 65699bb3..755f492 100644
--- a/base/task_scheduler/scheduler_lock_impl.h
+++ b/base/task/task_scheduler/scheduler_lock_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SCHEDULER_LOCK_IMPL_H
-#define BASE_TASK_SCHEDULER_SCHEDULER_LOCK_IMPL_H
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_LOCK_IMPL_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_LOCK_IMPL_H_
 
 #include <memory>
 
@@ -43,4 +43,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_LOCK_IMPL_H
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_LOCK_IMPL_H_
diff --git a/base/task_scheduler/scheduler_lock_unittest.cc b/base/task/task_scheduler/scheduler_lock_unittest.cc
similarity index 96%
rename from base/task_scheduler/scheduler_lock_unittest.cc
rename to base/task/task_scheduler/scheduler_lock_unittest.cc
index 5518247..fe5991c 100644
--- a/base/task_scheduler/scheduler_lock_unittest.cc
+++ b/base/task/task_scheduler/scheduler_lock_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 "base/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
 
 #include <stdlib.h>
 
@@ -24,9 +24,7 @@
 class BasicLockTestThread : public SimpleThread {
  public:
   explicit BasicLockTestThread(SchedulerLock* lock)
-      : SimpleThread("BasicLockTestThread"),
-        lock_(lock),
-        acquired_(0) {}
+      : SimpleThread("BasicLockTestThread"), lock_(lock), acquired_(0) {}
 
   int acquired() const { return acquired_; }
 
@@ -62,13 +60,9 @@
                                     WaitableEvent::InitialState::NOT_SIGNALED) {
   }
 
-  void WaitForLockAcquisition() {
-    lock_acquire_event_.Wait();
-  }
+  void WaitForLockAcquisition() { lock_acquire_event_.Wait(); }
 
-  void ContinueMain() {
-    main_thread_continue_event_.Signal();
-  }
+  void ContinueMain() { main_thread_continue_event_.Signal(); }
 
  private:
   void Run() override {
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc
similarity index 98%
rename from base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
rename to base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc
index 737df42b..f7882167 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.cc
+++ b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h"
+#include "base/task/task_scheduler/scheduler_single_thread_task_runner_manager.h"
 
 #include <algorithm>
 #include <memory>
@@ -15,12 +15,12 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/atomic_flag.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/scheduler_worker.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/scheduler_worker.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_traits.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 
@@ -636,7 +636,7 @@
             shared_com_scheduler_workers_[i][j];
         shared_com_scheduler_workers_[i][j] = nullptr;
 #endif
-    }
+      }
     }
   }
 
@@ -648,7 +648,7 @@
       if (local_shared_com_scheduler_workers[i][j])
         UnregisterSchedulerWorker(local_shared_com_scheduler_workers[i][j]);
 #endif
-  }
+    }
   }
 }
 
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.h
similarity index 91%
rename from base/task_scheduler/scheduler_single_thread_task_runner_manager.h
rename to base/task/task_scheduler/scheduler_single_thread_task_runner_manager.h
index b25230d..e60ed309 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager.h
+++ b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_
 
 #include <memory>
 #include <string>
@@ -12,10 +12,10 @@
 #include "base/base_export.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
-#include "base/task_scheduler/tracked_ref.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/tracked_ref.h"
 #include "base/threading/platform_thread.h"
 #include "build/build_config.h"
 
@@ -152,4 +152,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_MANAGER_H_
diff --git a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
similarity index 98%
rename from base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
rename to base/task/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
index 4c930e1..3c2ed44 100644
--- a/base/task_scheduler/scheduler_single_thread_task_runner_manager_unittest.cc
+++ b/base/task/task_scheduler/scheduler_single_thread_task_runner_manager_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 "base/task_scheduler/scheduler_single_thread_task_runner_manager.h"
+#include "base/task/task_scheduler/scheduler_single_thread_task_runner_manager.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
@@ -10,18 +10,19 @@
 #include "base/synchronization/atomic_flag.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_traits.h"
 #include "base/test/gtest_util.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/simple_thread.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
+#include "build/build_config.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if defined(OS_WIN)
diff --git a/base/task_scheduler/scheduler_worker.cc b/base/task/task_scheduler/scheduler_worker.cc
similarity index 97%
rename from base/task_scheduler/scheduler_worker.cc
rename to base/task/task_scheduler/scheduler_worker.cc
index 152b534..e98aa31 100644
--- a/base/task_scheduler/scheduler_worker.cc
+++ b/base/task/task_scheduler/scheduler_worker.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 "base/task_scheduler/scheduler_worker.h"
+#include "base/task/task_scheduler/scheduler_worker.h"
 
 #include <stddef.h>
 
@@ -11,9 +11,9 @@
 #include "base/compiler_specific.h"
 #include "base/debug/alias.h"
 #include "base/logging.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/scheduler_worker_observer.h"
-#include "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_worker_observer.h"
+#include "base/task/task_scheduler/task_tracker.h"
 #include "base/trace_event/trace_event.h"
 
 #if defined(OS_MACOSX)
diff --git a/base/task_scheduler/scheduler_worker.h b/base/task/task_scheduler/scheduler_worker.h
similarity index 95%
rename from base/task_scheduler/scheduler_worker.h
rename to base/task/task_scheduler/scheduler_worker.h
index 61f049b..f28b3de 100644
--- a/base/task_scheduler/scheduler_worker.h
+++ b/base/task/task_scheduler/scheduler_worker.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 BASE_TASK_SCHEDULER_SCHEDULER_WORKER_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_H_
 
 #include <memory>
 
@@ -12,11 +12,11 @@
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/atomic_flag.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/can_schedule_sequence_observer.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/scheduler_worker_params.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/tracked_ref.h"
+#include "base/task/task_scheduler/can_schedule_sequence_observer.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/scheduler_worker_params.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/tracked_ref.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -259,4 +259,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_H_
diff --git a/base/task_scheduler/scheduler_worker_observer.h b/base/task/task_scheduler/scheduler_worker_observer.h
similarity index 78%
rename from base/task_scheduler/scheduler_worker_observer.h
rename to base/task/task_scheduler/scheduler_worker_observer.h
index 5e6fc8fa..21f3d098 100644
--- a/base/task_scheduler/scheduler_worker_observer.h
+++ b/base/task/task_scheduler/scheduler_worker_observer.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 BASE_TASK_SCHEDULER_SCHEDULER_WORKER_OBSERVER_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_OBSERVER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_OBSERVER_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_OBSERVER_H_
 
 namespace base {
 
@@ -24,4 +24,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_OBSERVER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_OBSERVER_H_
diff --git a/base/task_scheduler/scheduler_worker_params.h b/base/task/task_scheduler/scheduler_worker_params.h
similarity index 77%
rename from base/task_scheduler/scheduler_worker_params.h
rename to base/task/task_scheduler/scheduler_worker_params.h
index ea753ff..82123b2 100644
--- a/base/task_scheduler/scheduler_worker_params.h
+++ b/base/task/task_scheduler/scheduler_worker_params.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 BASE_TASK_SCHEDULER_SCHEDULER_WORKER_PARAMS_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_PARAMS_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_PARAMS_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_PARAMS_H_
 
 namespace base {
 
@@ -21,4 +21,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_PARAMS_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_PARAMS_H_
diff --git a/base/task_scheduler/scheduler_worker_pool.cc b/base/task/task_scheduler/scheduler_worker_pool.cc
similarity index 97%
rename from base/task_scheduler/scheduler_worker_pool.cc
rename to base/task/task_scheduler/scheduler_worker_pool.cc
index 4bb5ca7..0b497650 100644
--- a/base/task_scheduler/scheduler_worker_pool.cc
+++ b/base/task/task_scheduler/scheduler_worker_pool.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_worker_pool.h"
+#include "base/task/task_scheduler/scheduler_worker_pool.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/lazy_instance.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/task_tracker.h"
 #include "base/threading/thread_local.h"
 
 namespace base {
diff --git a/base/task_scheduler/scheduler_worker_pool.h b/base/task/task_scheduler/scheduler_worker_pool.h
similarity index 86%
rename from base/task_scheduler/scheduler_worker_pool.h
rename to base/task/task_scheduler/scheduler_worker_pool.h
index de5329e4..e387aa5 100644
--- a/base/task_scheduler/scheduler_worker_pool.h
+++ b/base/task/task_scheduler/scheduler_worker_pool.h
@@ -2,18 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
 
 #include "base/base_export.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
+#include "base/task/task_scheduler/can_schedule_sequence_observer.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/tracked_ref.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/can_schedule_sequence_observer.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/tracked_ref.h"
 
 namespace base {
 namespace internal {
@@ -76,4 +76,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_H_
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.cc b/base/task/task_scheduler/scheduler_worker_pool_impl.cc
similarity index 98%
rename from base/task_scheduler/scheduler_worker_pool_impl.cc
rename to base/task/task_scheduler/scheduler_worker_pool_impl.cc
index 70bc4a8..38d5d86 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.cc
+++ b/base/task/task_scheduler/scheduler_worker_pool_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_worker_pool_impl.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_impl.h"
 
 #include <stddef.h>
 
@@ -20,9 +20,9 @@
 #include "base/sequence_token.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_traits.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_checker.h"
@@ -522,8 +522,8 @@
   ++num_tasks_since_last_detach_;
 }
 
-void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
-    ReEnqueueSequence(scoped_refptr<Sequence> sequence) {
+void SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::ReEnqueueSequence(
+    scoped_refptr<Sequence> sequence) {
   DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_);
 
   const SequenceSortKey sequence_sort_key = sequence->GetSortKey();
@@ -534,8 +534,8 @@
   // |outer_->shared_priority_queue_|.
 }
 
-TimeDelta SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::
-    GetSleepTimeout() {
+TimeDelta
+SchedulerWorkerPoolImpl::SchedulerWorkerDelegateImpl::GetSleepTimeout() {
   DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_);
   // Sleep for an extra 10% to avoid the following pathological case:
   //   0) A task is running on a timer which matches |suggested_reclaim_time_|.
diff --git a/base/task_scheduler/scheduler_worker_pool_impl.h b/base/task/task_scheduler/scheduler_worker_pool_impl.h
similarity index 95%
rename from base/task_scheduler/scheduler_worker_pool_impl.h
rename to base/task/task_scheduler/scheduler_worker_pool_impl.h
index 72540702..5ff2992b 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl.h
+++ b/base/task/task_scheduler/scheduler_worker_pool_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_
 
 #include <stddef.h>
 
@@ -20,15 +20,15 @@
 #include "base/synchronization/atomic_flag.h"
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/task_scheduler/priority_queue.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/scheduler_worker.h"
+#include "base/task/task_scheduler/scheduler_worker_pool.h"
+#include "base/task/task_scheduler/scheduler_worker_stack.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/tracked_ref.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/priority_queue.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/scheduler_worker.h"
-#include "base/task_scheduler/scheduler_worker_pool.h"
-#include "base/task_scheduler/scheduler_worker_stack.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/tracked_ref.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 
@@ -354,4 +354,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_IMPL_H_
diff --git a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc b/base/task/task_scheduler/scheduler_worker_pool_impl_unittest.cc
similarity index 95%
rename from base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
rename to base/task/task_scheduler/scheduler_worker_pool_impl_unittest.cc
index f6b5aaf..d173d41 100644
--- a/base/task_scheduler/scheduler_worker_pool_impl_unittest.cc
+++ b/base/task/task_scheduler/scheduler_worker_pool_impl_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_worker_pool_impl.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_impl.h"
 
 #include <stddef.h>
 
@@ -25,14 +25,14 @@
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/sequence_sort_key.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/test_task_factory.h"
+#include "base/task/task_scheduler/test_utils.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/sequence_sort_key.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/test_task_factory.h"
-#include "base/task_scheduler/test_utils.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/gtest_util.h"
 #include "base/test/test_simple_task_runner.h"
@@ -519,10 +519,9 @@
   for (auto& factory : factories) {
     count_waiters.push_back(std::make_unique<WaitableEvent>());
     ASSERT_TRUE(factory->PostTask(
-          PostNestedTask::NO,
-          Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::CountZeroTlsValuesAndWait,
-               Unretained(this),
-               count_waiters.back().get())));
+        PostNestedTask::NO,
+        Bind(&TaskSchedulerWorkerPoolCheckTlsReuse::CountZeroTlsValuesAndWait,
+             Unretained(this), count_waiters.back().get())));
     factory->WaitForAllTasksToRun();
   }
 
@@ -1126,16 +1125,15 @@
       kMaxTasks,
       BindOnce(&WaitableEvent::Signal, Unretained(&extra_threads_running)));
   for (size_t i = 0; i < kMaxTasks; ++i) {
-    task_runner_->PostTask(FROM_HERE,
-                           BindOnce(
-                               [](Closure* extra_threads_running_barrier,
-                                  WaitableEvent* extra_threads_continue) {
-                                 extra_threads_running_barrier->Run();
-                                 WaitWithoutBlockingObserver(
-                                     extra_threads_continue);
-                               },
-                               Unretained(&extra_threads_running_barrier),
-                               Unretained(&extra_threads_continue)));
+    task_runner_->PostTask(
+        FROM_HERE, BindOnce(
+                       [](Closure* extra_threads_running_barrier,
+                          WaitableEvent* extra_threads_continue) {
+                         extra_threads_running_barrier->Run();
+                         WaitWithoutBlockingObserver(extra_threads_continue);
+                       },
+                       Unretained(&extra_threads_running_barrier),
+                       Unretained(&extra_threads_continue)));
   }
 
   // Allow tasks to enter ScopedBlockingCall. Workers should be created for the
@@ -1369,16 +1367,15 @@
       BindOnce(&WaitableEvent::Signal, Unretained(&extra_threads_running)));
   // These tasks should run on the new threads from increasing max tasks.
   for (size_t i = 0; i < kLocalMaxTasks; ++i) {
-    task_runner->PostTask(FROM_HERE,
-                          BindOnce(
-                              [](Closure* extra_threads_running_barrier,
-                                 WaitableEvent* extra_threads_continue) {
-                                extra_threads_running_barrier->Run();
-                                WaitWithoutBlockingObserver(
-                                    extra_threads_continue);
-                              },
-                              Unretained(&extra_threads_running_barrier),
-                              Unretained(&extra_threads_continue)));
+    task_runner->PostTask(
+        FROM_HERE, BindOnce(
+                       [](Closure* extra_threads_running_barrier,
+                          WaitableEvent* extra_threads_continue) {
+                         extra_threads_running_barrier->Run();
+                         WaitWithoutBlockingObserver(extra_threads_continue);
+                       },
+                       Unretained(&extra_threads_running_barrier),
+                       Unretained(&extra_threads_continue)));
   }
   extra_threads_running.Wait();
 
@@ -1425,23 +1422,23 @@
 
   // Post ScopedBlockingCall tasks to hit the worker cap.
   for (size_t i = 0; i < kMaxNumberOfWorkers; ++i) {
-    task_runner_->PostTask(FROM_HERE,
-                           BindOnce(
-                               [](Closure* early_threads_barrier_closure,
-                                  WaitableEvent* early_release_threads_continue,
-                                  Closure* early_threads_finished) {
-                                 {
-                                   ScopedBlockingCall scoped_blocking_call(
-                                       BlockingType::WILL_BLOCK);
-                                   early_threads_barrier_closure->Run();
-                                   WaitWithoutBlockingObserver(
-                                       early_release_threads_continue);
-                                 }
-                                 early_threads_finished->Run();
-                               },
-                               Unretained(&early_threads_barrier_closure),
-                               Unretained(&early_release_threads_continue),
-                               Unretained(&early_threads_finished_barrier)));
+    task_runner_->PostTask(
+        FROM_HERE,
+        BindOnce(
+            [](Closure* early_threads_barrier_closure,
+               WaitableEvent* early_release_threads_continue,
+               Closure* early_threads_finished) {
+              {
+                ScopedBlockingCall scoped_blocking_call(
+                    BlockingType::WILL_BLOCK);
+                early_threads_barrier_closure->Run();
+                WaitWithoutBlockingObserver(early_release_threads_continue);
+              }
+              early_threads_finished->Run();
+            },
+            Unretained(&early_threads_barrier_closure),
+            Unretained(&early_release_threads_continue),
+            Unretained(&early_threads_finished_barrier)));
   }
 
   early_blocking_threads_running.Wait();
diff --git a/base/task_scheduler/scheduler_worker_pool_params.cc b/base/task/task_scheduler/scheduler_worker_pool_params.cc
similarity index 91%
rename from base/task_scheduler/scheduler_worker_pool_params.cc
rename to base/task/task_scheduler/scheduler_worker_pool_params.cc
index 08b4f7b0..e787c3e 100644
--- a/base/task_scheduler/scheduler_worker_pool_params.cc
+++ b/base/task/task_scheduler/scheduler_worker_pool_params.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 "base/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
 
 namespace base {
 
diff --git a/base/task_scheduler/scheduler_worker_pool_params.h b/base/task/task_scheduler/scheduler_worker_pool_params.h
similarity index 84%
rename from base/task_scheduler/scheduler_worker_pool_params.h
rename to base/task/task_scheduler/scheduler_worker_pool_params.h
index 9ee9472..84e2e42 100644
--- a/base/task_scheduler/scheduler_worker_pool_params.h
+++ b/base/task/task_scheduler/scheduler_worker_pool_params.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_PARAMS_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_PARAMS_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_PARAMS_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_PARAMS_H_
 
-#include "base/task_scheduler/scheduler_worker_params.h"
+#include "base/task/task_scheduler/scheduler_worker_params.h"
 #include "base/time/time.h"
 
 namespace base {
@@ -41,4 +41,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_PARAMS_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_POOL_PARAMS_H_
diff --git a/base/task_scheduler/scheduler_worker_pool_unittest.cc b/base/task/task_scheduler/scheduler_worker_pool_unittest.cc
similarity index 95%
rename from base/task_scheduler/scheduler_worker_pool_unittest.cc
rename to base/task/task_scheduler/scheduler_worker_pool_unittest.cc
index 0293457..982e6aa8 100644
--- a/base/task_scheduler/scheduler_worker_pool_unittest.cc
+++ b/base/task/task_scheduler/scheduler_worker_pool_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 "base/task_scheduler/scheduler_worker_pool.h"
+#include "base/task/task_scheduler/scheduler_worker_pool.h"
 
 #include <memory>
 
@@ -10,14 +10,14 @@
 #include "base/bind_helpers.h"
 #include "base/location.h"
 #include "base/memory/ref_counted.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_impl.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/test_task_factory.h"
+#include "base/task/task_scheduler/test_utils.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/scheduler_worker_pool_impl.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_task_factory.h"
-#include "base/task_scheduler/test_utils.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/simple_thread.h"
@@ -26,7 +26,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if defined(OS_WIN)
-#include "base/task_scheduler/platform_native_worker_pool_win.h"
+#include "base/task/task_scheduler/platform_native_worker_pool_win.h"
 #endif
 
 namespace base {
diff --git a/base/task_scheduler/scheduler_worker_stack.cc b/base/task/task_scheduler/scheduler_worker_stack.cc
similarity index 92%
rename from base/task_scheduler/scheduler_worker_stack.cc
rename to base/task/task_scheduler/scheduler_worker_stack.cc
index 613fe09..87efd8d46 100644
--- a/base/task_scheduler/scheduler_worker_stack.cc
+++ b/base/task/task_scheduler/scheduler_worker_stack.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_worker_stack.h"
+#include "base/task/task_scheduler/scheduler_worker_stack.h"
 
 #include <algorithm>
 
 #include "base/logging.h"
 #include "base/stl_util.h"
-#include "base/task_scheduler/scheduler_worker.h"
+#include "base/task/task_scheduler/scheduler_worker.h"
 
 namespace base {
 namespace internal {
diff --git a/base/task_scheduler/scheduler_worker_stack.h b/base/task/task_scheduler/scheduler_worker_stack.h
similarity index 91%
rename from base/task_scheduler/scheduler_worker_stack.h
rename to base/task/task_scheduler/scheduler_worker_stack.h
index e9cedec33..944071ce 100644
--- a/base/task_scheduler/scheduler_worker_stack.h
+++ b/base/task/task_scheduler/scheduler_worker_stack.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 BASE_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_
-#define BASE_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_
+#define BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_
 
 #include <stddef.h>
 
@@ -64,4 +64,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SCHEDULER_WORKER_STACK_H_
diff --git a/base/task_scheduler/scheduler_worker_stack_unittest.cc b/base/task/task_scheduler/scheduler_worker_stack_unittest.cc
similarity index 96%
rename from base/task_scheduler/scheduler_worker_stack_unittest.cc
rename to base/task/task_scheduler/scheduler_worker_stack_unittest.cc
index 83d693a9..a49dc895 100644
--- a/base/task_scheduler/scheduler_worker_stack_unittest.cc
+++ b/base/task/task_scheduler/scheduler_worker_stack_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/scheduler_worker_stack.h"
+#include "base/task/task_scheduler/scheduler_worker_stack.h"
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
-#include "base/task_scheduler/scheduler_worker.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/scheduler_worker.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task_tracker.h"
 #include "base/test/gtest_util.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
@@ -38,9 +38,7 @@
   void ReEnqueueSequence(scoped_refptr<Sequence> sequence) override {
     ADD_FAILURE() << "Unexpected call to ReEnqueueSequence()";
   }
-  TimeDelta GetSleepTimeout() override {
-    return TimeDelta::Max();
-  }
+  TimeDelta GetSleepTimeout() override { return TimeDelta::Max(); }
 };
 
 class TaskSchedulerWorkerStackTest : public testing::Test {
diff --git a/base/task_scheduler/scheduler_worker_unittest.cc b/base/task/task_scheduler/scheduler_worker_unittest.cc
similarity index 97%
rename from base/task_scheduler/scheduler_worker_unittest.cc
rename to base/task/task_scheduler/scheduler_worker_unittest.cc
index 1112f55..8c7b3ea9 100644
--- a/base/task_scheduler/scheduler_worker_unittest.cc
+++ b/base/task/task_scheduler/scheduler_worker_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 "base/task_scheduler/scheduler_worker.h"
+#include "base/task/task_scheduler/scheduler_worker.h"
 
 #include <stddef.h>
 
@@ -16,13 +16,13 @@
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/scheduler_worker_observer.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/test_utils.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/scheduler_worker_observer.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/test_utils.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/simple_thread.h"
@@ -425,8 +425,7 @@
 
   ~ControllableCleanupDelegate() override { controls_->destroyed_.Signal(); }
 
-  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker)
-      override {
+  scoped_refptr<Sequence> GetWork(SchedulerWorker* worker) override {
     EXPECT_TRUE(controls_->expect_get_work_);
 
     // Sends one item of work to signal |work_processed_|. On subsequent calls,
@@ -857,10 +856,10 @@
   worker->WakeUp();
   delegate_raw->WaitUntilGetWorkReturned();
 
-  // The call to CoInitializeEx() should have returned S_FALSE to indicate that
-  // the COM library was already initialized on the thread.
-  // See SchedulerWorker::Thread::ThreadMain for why we expect two different
-  // results here.
+// The call to CoInitializeEx() should have returned S_FALSE to indicate that
+// the COM library was already initialized on the thread.
+// See SchedulerWorker::Thread::ThreadMain for why we expect two different
+// results here.
 #if defined(COM_INIT_CHECK_HOOK_ENABLED)
   EXPECT_EQ(S_OK, delegate_raw->coinitialize_hresult());
 #else
diff --git a/base/task_scheduler/sequence.cc b/base/task/task_scheduler/sequence.cc
similarity index 97%
rename from base/task_scheduler/sequence.cc
rename to base/task/task_scheduler/sequence.cc
index 3f4c5fe..6bb04b2 100644
--- a/base/task_scheduler/sequence.cc
+++ b/base/task/task_scheduler/sequence.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 "base/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/sequence.h"
 
 #include <utility>
 
diff --git a/base/task_scheduler/sequence.h b/base/task/task_scheduler/sequence.h
similarity index 92%
rename from base/task_scheduler/sequence.h
rename to base/task/task_scheduler/sequence.h
index 3700b2eb..14dd42ad 100644
--- a/base/task_scheduler/sequence.h
+++ b/base/task/task_scheduler/sequence.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 BASE_TASK_SCHEDULER_SEQUENCE_H_
-#define BASE_TASK_SCHEDULER_SEQUENCE_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SEQUENCE_H_
+#define BASE_TASK_TASK_SCHEDULER_SEQUENCE_H_
 
 #include <stddef.h>
 
@@ -13,9 +13,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "base/sequence_token.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/sequence_sort_key.h"
-#include "base/task_scheduler/task.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/sequence_sort_key.h"
+#include "base/task/task_scheduler/task.h"
 #include "base/threading/sequence_local_storage_map.h"
 
 namespace base {
@@ -99,4 +99,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SEQUENCE_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SEQUENCE_H_
diff --git a/base/task_scheduler/sequence_sort_key.cc b/base/task/task_scheduler/sequence_sort_key.cc
similarity index 94%
rename from base/task_scheduler/sequence_sort_key.cc
rename to base/task/task_scheduler/sequence_sort_key.cc
index e356c8b..497507c 100644
--- a/base/task_scheduler/sequence_sort_key.cc
+++ b/base/task/task_scheduler/sequence_sort_key.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 "base/task_scheduler/sequence_sort_key.h"
+#include "base/task/task_scheduler/sequence_sort_key.h"
 
 namespace base {
 namespace internal {
diff --git a/base/task_scheduler/sequence_sort_key.h b/base/task/task_scheduler/sequence_sort_key.h
similarity index 88%
rename from base/task_scheduler/sequence_sort_key.h
rename to base/task/task_scheduler/sequence_sort_key.h
index 2e126c5f..95406027 100644
--- a/base/task_scheduler/sequence_sort_key.h
+++ b/base/task/task_scheduler/sequence_sort_key.h
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_SEQUENCE_SORT_KEY_H_
-#define BASE_TASK_SCHEDULER_SEQUENCE_SORT_KEY_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SEQUENCE_SORT_KEY_H_
+#define BASE_TASK_TASK_SCHEDULER_SEQUENCE_SORT_KEY_H_
 
 #include "base/base_export.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 
 namespace base {
@@ -49,4 +49,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SEQUENCE_SORT_KEY_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SEQUENCE_SORT_KEY_H_
diff --git a/base/task_scheduler/sequence_sort_key_unittest.cc b/base/task/task_scheduler/sequence_sort_key_unittest.cc
similarity index 98%
rename from base/task_scheduler/sequence_sort_key_unittest.cc
rename to base/task/task_scheduler/sequence_sort_key_unittest.cc
index 7b664f2..024fc2b 100644
--- a/base/task_scheduler/sequence_sort_key_unittest.cc
+++ b/base/task/task_scheduler/sequence_sort_key_unittest.cc
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/sequence_sort_key.h"
+#include "base/task/task_scheduler/sequence_sort_key.h"
 
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/base/task_scheduler/sequence_unittest.cc b/base/task/task_scheduler/sequence_unittest.cc
similarity index 98%
rename from base/task_scheduler/sequence_unittest.cc
rename to base/task/task_scheduler/sequence_unittest.cc
index c735ef8..931425e 100644
--- a/base/task_scheduler/sequence_unittest.cc
+++ b/base/task/task_scheduler/sequence_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 "base/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/sequence.h"
 
 #include <utility>
 
diff --git a/base/task_scheduler/service_thread.cc b/base/task/task_scheduler/service_thread.cc
similarity index 93%
rename from base/task_scheduler/service_thread.cc
rename to base/task/task_scheduler/service_thread.cc
index 763c619..8beadd60 100644
--- a/base/task_scheduler/service_thread.cc
+++ b/base/task/task_scheduler/service_thread.cc
@@ -2,17 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/service_thread.h"
+#include "base/task/task_scheduler/service_thread.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/debug/alias.h"
 #include "base/rand_util.h"
 #include "base/stl_util.h"
-#include "base/task_scheduler/post_task.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_traits.h"
 
 namespace base {
 namespace internal {
diff --git a/base/task_scheduler/service_thread.h b/base/task/task_scheduler/service_thread.h
similarity index 92%
rename from base/task_scheduler/service_thread.h
rename to base/task/task_scheduler/service_thread.h
index caadc1d1..cc5c0d0d 100644
--- a/base/task_scheduler/service_thread.h
+++ b/base/task/task_scheduler/service_thread.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 BASE_TASK_SCHEDULER_SERVICE_THREAD_H_
-#define BASE_TASK_SCHEDULER_SERVICE_THREAD_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SERVICE_THREAD_H_
+#define BASE_TASK_TASK_SCHEDULER_SERVICE_THREAD_H_
 
 #include "base/base_export.h"
 #include "base/macros.h"
@@ -57,4 +57,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SERVICE_THREAD_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SERVICE_THREAD_H_
diff --git a/base/task_scheduler/service_thread_unittest.cc b/base/task/task_scheduler/service_thread_unittest.cc
similarity index 95%
rename from base/task_scheduler/service_thread_unittest.cc
rename to base/task/task_scheduler/service_thread_unittest.cc
index 0214a72..4f9c405 100644
--- a/base/task_scheduler/service_thread_unittest.cc
+++ b/base/task/task_scheduler/service_thread_unittest.cc
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/service_thread.h"
+#include "base/task/task_scheduler/service_thread.h"
 
 #include <string>
 
 #include "base/bind.h"
 #include "base/debug/stack_trace.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/task_scheduler/task_scheduler_impl.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_scheduler_impl.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
diff --git a/base/task_scheduler/single_thread_task_runner_thread_mode.h b/base/task/task_scheduler/single_thread_task_runner_thread_mode.h
similarity index 77%
copy from base/task_scheduler/single_thread_task_runner_thread_mode.h
copy to base/task/task_scheduler/single_thread_task_runner_thread_mode.h
index 6ed4228..3406b39 100644
--- a/base/task_scheduler/single_thread_task_runner_thread_mode.h
+++ b/base/task/task_scheduler/single_thread_task_runner_thread_mode.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 BASE_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
-#define BASE_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
+#define BASE_TASK_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
 
 namespace base {
 
@@ -22,4 +22,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_SINGLE_THREAD_TASK_RUNNER_THREAD_MODE_H_
diff --git a/base/task_scheduler/task.cc b/base/task/task_scheduler/task.cc
similarity index 97%
rename from base/task_scheduler/task.cc
rename to base/task/task_scheduler/task.cc
index 563bb1e5..978d013 100644
--- a/base/task_scheduler/task.cc
+++ b/base/task/task_scheduler/task.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 "base/task_scheduler/task.h"
+#include "base/task/task_scheduler/task.h"
 
 #include <utility>
 
diff --git a/base/task_scheduler/task.h b/base/task/task_scheduler/task.h
similarity index 93%
rename from base/task_scheduler/task.h
rename to base/task/task_scheduler/task.h
index 3e937a8..5764e2e 100644
--- a/base/task_scheduler/task.h
+++ b/base/task/task_scheduler/task.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 BASE_TASK_SCHEDULER_TASK_H_
-#define BASE_TASK_SCHEDULER_TASK_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TASK_H_
+#define BASE_TASK_TASK_SCHEDULER_TASK_H_
 
 #include "base/base_export.h"
 #include "base/callback.h"
@@ -13,7 +13,7 @@
 #include "base/pending_task.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 
 namespace base {
@@ -71,4 +71,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TASK_H_
diff --git a/base/task_scheduler/task_scheduler.cc b/base/task/task_scheduler/task_scheduler.cc
similarity index 94%
rename from base/task_scheduler/task_scheduler.cc
rename to base/task/task_scheduler/task_scheduler.cc
index 6d20ead4..5a8c03c 100644
--- a/base/task_scheduler/task_scheduler.cc
+++ b/base/task/task_scheduler/task_scheduler.cc
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 
 #include <algorithm>
 
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/sys_info.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_scheduler_impl.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/task_scheduler_impl.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 
diff --git a/base/task_scheduler/task_scheduler.h b/base/task/task_scheduler/task_scheduler.h
similarity index 96%
rename from base/task_scheduler/task_scheduler.h
rename to base/task/task_scheduler/task_scheduler.h
index f003f53e..5d030883 100644
--- a/base/task_scheduler/task_scheduler.h
+++ b/base/task/task_scheduler/task_scheduler.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 BASE_TASK_SCHEDULER_TASK_SCHEDULER_H_
-#define BASE_TASK_SCHEDULER_TASK_SCHEDULER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_H_
+#define BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_H_
 
 #include <memory>
 #include <vector>
@@ -15,10 +15,10 @@
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_piece.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
-#include "base/task_scheduler/task_traits.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 
@@ -245,4 +245,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_SCHEDULER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_H_
diff --git a/base/task/task_scheduler/task_scheduler_forward.h b/base/task/task_scheduler/task_scheduler_forward.h
deleted file mode 100644
index 907cf04..0000000
--- a/base/task/task_scheduler/task_scheduler_forward.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_FORWARD_H_
-#define BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_FORWARD_H_
-
-// If you are seeing this you synced to a very short-lived state in the task
-// scheduler's header migration. To keep as much git history as possible while
-// avoiding a mass header rename in thousands of file in the main move CL,
-// base/task_scheduler's public headers were moved this way :
-// for each base/task_scheduler/public.h:
-//  A.1) Introduce base/task/public_forward.h and move the world to use it
-//  A.2) Move base/task_scheduler/public.h to base/task/public.h (and update
-//       forwarding headers)
-//  A.3) Delete base/task/public_forward.h (move world to base/task/public.h).
-//
-// An alternative would have been:
-//  B.1) Move base/task_scheduler/public.h to base/task/public.h and leave
-//       a stub fowarding header in base/task_scheduler/public.h
-//  B.2) Migrate world from base/task_scheduler/public.h to base/task/public.h
-//       and delete stub.
-// That approach however results in git not considering base/task/public.h as
-// being a new file rather than a move in (B.1) and losing all history.
-//
-// Another alternative would have been:
-//  C.1) Introduce base/task/public.h as a forwarding header and move the world
-//       to it
-//  C.2) Move base/task_scheduler/public.h over base/task/public.h
-// That approach also results in git not considering (C.2) a file move (per
-// overriding an existing file) and losing all history.
-//
-// As such approach A was preferred : the landing process will wait for all 3
-// CLs to be LGTM'ed in approach A and then land them switfly back-to-back.
-
-#include "base/task_scheduler/task_scheduler.h"
-
-#endif  // BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_FORWARD_H_
diff --git a/base/task_scheduler/task_scheduler_impl.cc b/base/task/task_scheduler/task_scheduler_impl.cc
similarity index 95%
rename from base/task_scheduler/task_scheduler_impl.cc
rename to base/task/task_scheduler/task_scheduler_impl.cc
index 49f8726..e3db50f8 100644
--- a/base/task_scheduler/task_scheduler_impl.cc
+++ b/base/task/task_scheduler/task_scheduler_impl.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/task_scheduler_impl.h"
+#include "base/task/task_scheduler/task_scheduler_impl.h"
 
 #include <algorithm>
 #include <string>
@@ -13,14 +13,14 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/sequence_sort_key.h"
-#include "base/task_scheduler/service_thread.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/sequence_sort_key.h"
+#include "base/task/task_scheduler/service_thread.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/task_tracker.h"
 #include "base/time/time.h"
 
 namespace base {
diff --git a/base/task_scheduler/task_scheduler_impl.h b/base/task/task_scheduler/task_scheduler_impl.h
similarity index 86%
rename from base/task_scheduler/task_scheduler_impl.h
rename to base/task/task_scheduler/task_scheduler_impl.h
index 598079d5..cfe538f 100644
--- a/base/task_scheduler/task_scheduler_impl.h
+++ b/base/task/task_scheduler/task_scheduler_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_TASK_SCHEDULER_IMPL_H_
-#define BASE_TASK_SCHEDULER_TASK_SCHEDULER_IMPL_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_IMPL_H_
+#define BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_IMPL_H_
 
 #include <memory>
 #include <vector>
@@ -16,18 +16,18 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_piece.h"
 #include "base/synchronization/atomic_flag.h"
-#include "base/task_scheduler/delayed_task_manager.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/scheduler_single_thread_task_runner_manager.h"
-#include "base/task_scheduler/scheduler_worker_pool_impl.h"
-#include "base/task_scheduler/single_thread_task_runner_thread_mode.h"
-#include "base/task_scheduler/task_scheduler.h"
-#include "base/task_scheduler/task_tracker.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_scheduler/delayed_task_manager.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_single_thread_task_runner_manager.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_impl.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_tracker.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 
 #if defined(OS_POSIX) && !defined(OS_NACL_SFI)
-#include "base/task_scheduler/task_tracker_posix.h"
+#include "base/task/task_scheduler/task_tracker_posix.h"
 #endif
 
 #if defined(OS_WIN)
@@ -133,4 +133,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_SCHEDULER_IMPL_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TASK_SCHEDULER_IMPL_H_
diff --git a/base/task_scheduler/task_scheduler_impl_unittest.cc b/base/task/task_scheduler/task_scheduler_impl_unittest.cc
similarity index 98%
rename from base/task_scheduler/task_scheduler_impl_unittest.cc
rename to base/task/task_scheduler/task_scheduler_impl_unittest.cc
index 2d741ef..7c3b939 100644
--- a/base/task_scheduler/task_scheduler_impl_unittest.cc
+++ b/base/task/task_scheduler/task_scheduler_impl_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/task_scheduler_impl.h"
+#include "base/task/task_scheduler/task_scheduler_impl.h"
 
 #include <stddef.h>
 
@@ -20,12 +20,12 @@
 #include "base/metrics/field_trial.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/environment_config.h"
-#include "base/task_scheduler/scheduler_worker_observer.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_task_factory.h"
-#include "base/task_scheduler/test_utils.h"
+#include "base/task/task_scheduler/environment_config.h"
+#include "base/task/task_scheduler/scheduler_worker_observer.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/test_task_factory.h"
+#include "base/task/task_scheduler/test_utils.h"
+#include "base/task/task_traits.h"
 #include "base/test/gtest_util.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
diff --git a/base/task_scheduler/task_tracker.cc b/base/task/task_scheduler/task_tracker.cc
similarity index 99%
rename from base/task_scheduler/task_tracker.cc
rename to base/task/task_scheduler/task_tracker.cc
index 48c2af2..5f68f92d 100644
--- a/base/task_scheduler/task_tracker.cc
+++ b/base/task/task_scheduler/task_tracker.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 "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/task_tracker.h"
 
 #include <limits>
 #include <string>
@@ -16,7 +16,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/sequence_token.h"
 #include "base/synchronization/condition_variable.h"
-#include "base/task_scheduler/scoped_set_task_priority_for_current_thread.h"
+#include "base/task/scoped_set_task_priority_for_current_thread.h"
 #include "base/threading/sequence_local_storage_map.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/base/task_scheduler/task_tracker.h b/base/task/task_scheduler/task_tracker.h
similarity index 97%
rename from base/task_scheduler/task_tracker.h
rename to base/task/task_scheduler/task_tracker.h
index 35f4ba1..b769069 100644
--- a/base/task_scheduler/task_tracker.h
+++ b/base/task/task_scheduler/task_tracker.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 BASE_TASK_SCHEDULER_TASK_TRACKER_H_
-#define BASE_TASK_SCHEDULER_TASK_TRACKER_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TASK_TRACKER_H_
+#define BASE_TASK_TASK_SCHEDULER_TASK_TRACKER_H_
 
 #include <functional>
 #include <memory>
@@ -18,12 +18,12 @@
 #include "base/metrics/histogram_base.h"
 #include "base/strings/string_piece.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/can_schedule_sequence_observer.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/sequence.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/tracked_ref.h"
+#include "base/task/task_scheduler/can_schedule_sequence_observer.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/sequence.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/tracked_ref.h"
+#include "base/task/task_traits.h"
 
 namespace base {
 
@@ -362,4 +362,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_TRACKER_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TASK_TRACKER_H_
diff --git a/base/task_scheduler/task_tracker_posix.cc b/base/task/task_scheduler/task_tracker_posix.cc
similarity index 94%
rename from base/task_scheduler/task_tracker_posix.cc
rename to base/task/task_scheduler/task_tracker_posix.cc
index 8289d90..fad0069 100644
--- a/base/task_scheduler/task_tracker_posix.cc
+++ b/base/task/task_scheduler/task_tracker_posix.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 "base/task_scheduler/task_tracker_posix.h"
+#include "base/task/task_scheduler/task_tracker_posix.h"
 
 #include <utility>
 
diff --git a/base/task_scheduler/task_tracker_posix.h b/base/task/task_scheduler/task_tracker_posix.h
similarity index 90%
rename from base/task_scheduler/task_tracker_posix.h
rename to base/task/task_scheduler/task_tracker_posix.h
index 4689f7a1..29150f00 100644
--- a/base/task_scheduler/task_tracker_posix.h
+++ b/base/task/task_scheduler/task_tracker_posix.h
@@ -2,15 +2,15 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_TASK_TRACKER_POSIX_H_
-#define BASE_TASK_SCHEDULER_TASK_TRACKER_POSIX_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TASK_TRACKER_POSIX_H_
+#define BASE_TASK_TASK_SCHEDULER_TASK_TRACKER_POSIX_H_
 
 #include <memory>
 
 #include "base/base_export.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/task_tracker.h"
 #include "base/threading/platform_thread.h"
 
 namespace base {
@@ -71,4 +71,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_TRACKER_POSIX_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TASK_TRACKER_POSIX_H_
diff --git a/base/task_scheduler/task_tracker_posix_unittest.cc b/base/task/task_scheduler/task_tracker_posix_unittest.cc
similarity index 94%
rename from base/task_scheduler/task_tracker_posix_unittest.cc
rename to base/task/task_scheduler/task_tracker_posix_unittest.cc
index 3ca7533..15ddb21 100644
--- a/base/task_scheduler/task_tracker_posix_unittest.cc
+++ b/base/task/task_scheduler/task_tracker_posix_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 "base/task_scheduler/task_tracker_posix.h"
+#include "base/task/task_scheduler/task_tracker_posix.h"
 
 #include <unistd.h>
 
@@ -18,9 +18,9 @@
 #include "base/posix/eintr_wrapper.h"
 #include "base/run_loop.h"
 #include "base/sequence_token.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_utils.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/test_utils.h"
+#include "base/task/task_traits.h"
 #include "base/test/null_task_runner.h"
 #include "base/threading/thread.h"
 #include "base/time/time.h"
diff --git a/base/task_scheduler/task_tracker_unittest.cc b/base/task/task_scheduler/task_tracker_unittest.cc
similarity index 99%
rename from base/task_scheduler/task_tracker_unittest.cc
rename to base/task/task_scheduler/task_tracker_unittest.cc
index 7c77a3b..2eafe75 100644
--- a/base/task_scheduler/task_tracker_unittest.cc
+++ b/base/task/task_scheduler/task_tracker_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 "base/task_scheduler/task_tracker.h"
+#include "base/task/task_scheduler/task_tracker.h"
 
 #include <stdint.h>
 
@@ -25,10 +25,10 @@
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/atomic_flag.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/scheduler_lock.h"
-#include "base/task_scheduler/task.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_utils.h"
+#include "base/task/task_scheduler/scheduler_lock.h"
+#include "base/task/task_scheduler/task.h"
+#include "base/task/task_scheduler/test_utils.h"
+#include "base/task/task_traits.h"
 #include "base/test/gtest_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/test_simple_task_runner.h"
diff --git a/base/task_scheduler/task_unittest.cc b/base/task/task_scheduler/task_unittest.cc
similarity index 96%
rename from base/task_scheduler/task_unittest.cc
rename to base/task/task_scheduler/task_unittest.cc
index 31a59ded..21f26a55 100644
--- a/base/task_scheduler/task_unittest.cc
+++ b/base/task/task_scheduler/task_unittest.cc
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/task.h"
+#include "base/task/task_scheduler/task.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/location.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/base/task_scheduler/test_task_factory.cc b/base/task/task_scheduler/test_task_factory.cc
similarity index 98%
rename from base/task_scheduler/test_task_factory.cc
rename to base/task/task_scheduler/test_task_factory.cc
index 0867547..9365c6a 100644
--- a/base/task_scheduler/test_task_factory.cc
+++ b/base/task/task_scheduler/test_task_factory.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 "base/task_scheduler/test_task_factory.h"
+#include "base/task/task_scheduler/test_task_factory.h"
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
diff --git a/base/task_scheduler/test_task_factory.h b/base/task/task_scheduler/test_task_factory.h
similarity index 92%
rename from base/task_scheduler/test_task_factory.h
rename to base/task/task_scheduler/test_task_factory.h
index 300b7bf..3e3d7f9 100644
--- a/base/task_scheduler/test_task_factory.h
+++ b/base/task/task_scheduler/test_task_factory.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 BASE_TASK_SCHEDULER_TEST_TASK_FACTORY_H_
-#define BASE_TASK_SCHEDULER_TEST_TASK_FACTORY_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TEST_TASK_FACTORY_H_
+#define BASE_TASK_TASK_SCHEDULER_TEST_TASK_FACTORY_H_
 
 #include <stddef.h>
 
@@ -14,9 +14,9 @@
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/lock.h"
+#include "base/task/task_scheduler/test_utils.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/task_traits.h"
-#include "base/task_scheduler/test_utils.h"
 #include "base/threading/thread_checker_impl.h"
 
 namespace base {
@@ -96,4 +96,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TEST_TASK_FACTORY_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TEST_TASK_FACTORY_H_
diff --git a/base/task_scheduler/test_utils.cc b/base/task/task_scheduler/test_utils.cc
similarity index 92%
rename from base/task_scheduler/test_utils.cc
rename to base/task/task_scheduler/test_utils.cc
index eb509f8..2ae3363 100644
--- a/base/task_scheduler/test_utils.cc
+++ b/base/task/task_scheduler/test_utils.cc
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/test_utils.h"
+#include "base/task/task_scheduler/test_utils.h"
 
 #include <utility>
 
-#include "base/task_scheduler/scheduler_worker_pool.h"
+#include "base/task/task_scheduler/scheduler_worker_pool.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
diff --git a/base/task_scheduler/test_utils.h b/base/task/task_scheduler/test_utils.h
similarity index 84%
rename from base/task_scheduler/test_utils.h
rename to base/task/task_scheduler/test_utils.h
index 42e4eed..e678a434 100644
--- a/base/task_scheduler/test_utils.h
+++ b/base/task/task_scheduler/test_utils.h
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_TEST_UTILS_H_
-#define BASE_TASK_SCHEDULER_TEST_UTILS_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TEST_UTILS_H_
+#define BASE_TASK_TASK_SCHEDULER_TEST_UTILS_H_
 
 #include "base/memory/ref_counted.h"
+#include "base/task/task_scheduler/scheduler_worker_observer.h"
+#include "base/task/task_scheduler/sequence.h"
 #include "base/task_runner.h"
-#include "base/task_scheduler/scheduler_worker_observer.h"
-#include "base/task_scheduler/sequence.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace base {
@@ -49,4 +49,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TEST_UTILS_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TEST_UTILS_H_
diff --git a/base/task_scheduler/tracked_ref.h b/base/task/task_scheduler/tracked_ref.h
similarity index 97%
rename from base/task_scheduler/tracked_ref.h
rename to base/task/task_scheduler/tracked_ref.h
index 4c68622..218fffc 100644
--- a/base/task_scheduler/tracked_ref.h
+++ b/base/task/task_scheduler/tracked_ref.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef BASE_TASK_SCHEDULER_TRACKED_REF_H_
-#define BASE_TASK_SCHEDULER_TRACKED_REF_H_
+#ifndef BASE_TASK_TASK_SCHEDULER_TRACKED_REF_H_
+#define BASE_TASK_TASK_SCHEDULER_TRACKED_REF_H_
 
 #include <memory>
 
@@ -168,4 +168,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TRACKED_REF_H_
+#endif  // BASE_TASK_TASK_SCHEDULER_TRACKED_REF_H_
diff --git a/base/task_scheduler/tracked_ref_unittest.cc b/base/task/task_scheduler/tracked_ref_unittest.cc
similarity index 98%
rename from base/task_scheduler/tracked_ref_unittest.cc
rename to base/task/task_scheduler/tracked_ref_unittest.cc
index b793c07b..995aa5c 100644
--- a/base/task_scheduler/tracked_ref_unittest.cc
+++ b/base/task/task_scheduler/tracked_ref_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 "base/task_scheduler/tracked_ref.h"
+#include "base/task/task_scheduler/tracked_ref.h"
 
 #include <memory>
 
diff --git a/base/task_scheduler/task_traits.cc b/base/task/task_traits.cc
similarity index 96%
rename from base/task_scheduler/task_traits.cc
rename to base/task/task_traits.cc
index f4d1907..4ebb87a7 100644
--- a/base/task_scheduler/task_traits.cc
+++ b/base/task/task_traits.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 "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 
 #include <stddef.h>
 
diff --git a/base/task_scheduler/task_traits.h b/base/task/task_traits.h
similarity index 97%
rename from base/task_scheduler/task_traits.h
rename to base/task/task_traits.h
index 0eaf82e..161901d 100644
--- a/base/task_scheduler/task_traits.h
+++ b/base/task/task_traits.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 BASE_TASK_SCHEDULER_TASK_TRAITS_H_
-#define BASE_TASK_SCHEDULER_TASK_TRAITS_H_
+#ifndef BASE_TASK_TASK_TRAITS_H_
+#define BASE_TASK_TASK_TRAITS_H_
 
 #include <stdint.h>
 
@@ -11,7 +11,7 @@
 #include <type_traits>
 
 #include "base/base_export.h"
-#include "base/task_scheduler/task_traits_details.h"
+#include "base/task/task_traits_details.h"
 #include "build/build_config.h"
 
 namespace base {
@@ -247,4 +247,4 @@
 
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_TRAITS_H_
+#endif  // BASE_TASK_TASK_TRAITS_H_
diff --git a/base/task_scheduler/task_traits_details.h b/base/task/task_traits_details.h
similarity index 96%
rename from base/task_scheduler/task_traits_details.h
rename to base/task/task_traits_details.h
index 05fb605..4d18071 100644
--- a/base/task_scheduler/task_traits_details.h
+++ b/base/task/task_traits_details.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 BASE_TASK_SCHEDULER_TASK_TRAITS_DETAILS_H_
-#define BASE_TASK_SCHEDULER_TASK_TRAITS_DETAILS_H_
+#ifndef BASE_TASK_TASK_TRAITS_DETAILS_H_
+#define BASE_TASK_TASK_TRAITS_DETAILS_H_
 
 #include <type_traits>
 #include <utility>
@@ -125,4 +125,4 @@
 }  // namespace internal
 }  // namespace base
 
-#endif  // BASE_TASK_SCHEDULER_TASK_TRAITS_DETAILS_H_
+#endif  // BASE_TASK_TASK_TRAITS_DETAILS_H_
diff --git a/base/task/task_traits_forward.h b/base/task/task_traits_forward.h
deleted file mode 100644
index 8adde551..0000000
--- a/base/task/task_traits_forward.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_TASK_TASK_TRAITS_FORWARD_H_
-#define BASE_TASK_TASK_TRAITS_FORWARD_H_
-
-// If you are seeing this you synced to a very short-lived state in the task
-// scheduler's header migration. To keep as much git history as possible while
-// avoiding a mass header rename in thousands of file in the main move CL,
-// base/task_scheduler's public headers were moved this way :
-// for each base/task_scheduler/public.h:
-//  A.1) Introduce base/task/public_forward.h and move the world to use it
-//  A.2) Move base/task_scheduler/public.h to base/task/public.h (and update
-//       forwarding headers)
-//  A.3) Delete base/task/public_forward.h (move world to base/task/public.h).
-//
-// An alternative would have been:
-//  B.1) Move base/task_scheduler/public.h to base/task/public.h and leave
-//       a stub fowarding header in base/task_scheduler/public.h
-//  B.2) Migrate world from base/task_scheduler/public.h to base/task/public.h
-//       and delete stub.
-// That approach however results in git not considering base/task/public.h as
-// being a new file rather than a move in (B.1) and losing all history.
-//
-// Another alternative would have been:
-//  C.1) Introduce base/task/public.h as a forwarding header and move the world
-//       to it
-//  C.2) Move base/task_scheduler/public.h over base/task/public.h
-// That approach also results in git not considering (C.2) a file move (per
-// overriding an existing file) and losing all history.
-//
-// As such approach A was preferred : the landing process will wait for all 3
-// CLs to be LGTM'ed in approach A and then land them switfly back-to-back.
-
-#include "base/task_scheduler/task_traits.h"
-
-#endif  // BASE_TASK_TASK_TRAITS_FORWARD_H_
diff --git a/base/task_scheduler/task_traits_unittest.cc b/base/task/task_traits_unittest.cc
similarity index 90%
rename from base/task_scheduler/task_traits_unittest.cc
rename to base/task/task_traits_unittest.cc
index 2111c6a..95d24e41 100644
--- a/base/task_scheduler/task_traits_unittest.cc
+++ b/base/task/task_traits_unittest.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
 
-TEST(TaskSchedulerTaskTraitsTest, Default) {
+TEST(TaskTraitsTest, Default) {
   constexpr TaskTraits traits = {};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
@@ -17,7 +17,7 @@
   EXPECT_FALSE(traits.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, TaskPriority) {
+TEST(TaskTraitsTest, TaskPriority) {
   constexpr TaskTraits traits = {TaskPriority::BEST_EFFORT};
   EXPECT_TRUE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::BEST_EFFORT, traits.priority());
@@ -26,7 +26,7 @@
   EXPECT_FALSE(traits.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, TaskShutdownBehavior) {
+TEST(TaskTraitsTest, TaskShutdownBehavior) {
   constexpr TaskTraits traits = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
@@ -35,7 +35,7 @@
   EXPECT_FALSE(traits.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, MayBlock) {
+TEST(TaskTraitsTest, MayBlock) {
   constexpr TaskTraits traits = {MayBlock()};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
@@ -44,7 +44,7 @@
   EXPECT_FALSE(traits.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, WithBaseSyncPrimitives) {
+TEST(TaskTraitsTest, WithBaseSyncPrimitives) {
   constexpr TaskTraits traits = {WithBaseSyncPrimitives()};
   EXPECT_FALSE(traits.priority_set_explicitly());
   EXPECT_EQ(TaskPriority::USER_VISIBLE, traits.priority());
@@ -53,7 +53,7 @@
   EXPECT_TRUE(traits.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, MultipleTraits) {
+TEST(TaskTraitsTest, MultipleTraits) {
   constexpr TaskTraits traits = {TaskPriority::BEST_EFFORT,
                                  TaskShutdownBehavior::BLOCK_SHUTDOWN,
                                  MayBlock(), WithBaseSyncPrimitives()};
@@ -64,7 +64,7 @@
   EXPECT_TRUE(traits.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, Copy) {
+TEST(TaskTraitsTest, Copy) {
   constexpr TaskTraits traits = {TaskPriority::BEST_EFFORT,
                                  TaskShutdownBehavior::BLOCK_SHUTDOWN,
                                  MayBlock(), WithBaseSyncPrimitives()};
@@ -78,7 +78,7 @@
             traits_copy.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, OverridePriority) {
+TEST(TaskTraitsTest, OverridePriority) {
   constexpr TaskTraits left = {TaskPriority::BEST_EFFORT};
   constexpr TaskTraits right = {TaskPriority::USER_BLOCKING};
   constexpr TaskTraits overridden = TaskTraits::Override(left, right);
@@ -91,7 +91,7 @@
   EXPECT_FALSE(overridden.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, OverrideShutdownBehavior) {
+TEST(TaskTraitsTest, OverrideShutdownBehavior) {
   constexpr TaskTraits left = {TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
   constexpr TaskTraits right = {TaskShutdownBehavior::BLOCK_SHUTDOWN};
   constexpr TaskTraits overridden = TaskTraits::Override(left, right);
@@ -104,7 +104,7 @@
   EXPECT_FALSE(overridden.with_base_sync_primitives());
 }
 
-TEST(TaskSchedulerTaskTraitsTest, OverrideMayBlock) {
+TEST(TaskTraitsTest, OverrideMayBlock) {
   {
     constexpr TaskTraits left = {MayBlock()};
     constexpr TaskTraits right = {};
@@ -131,7 +131,7 @@
   }
 }
 
-TEST(TaskSchedulerTaskTraitsTest, OverrideWithBaseSyncPrimitives) {
+TEST(TaskTraitsTest, OverrideWithBaseSyncPrimitives) {
   {
     constexpr TaskTraits left = {WithBaseSyncPrimitives()};
     constexpr TaskTraits right = {};
@@ -158,7 +158,7 @@
   }
 }
 
-TEST(TaskSchedulerTaskTraitsTest, OverrideMultipleTraits) {
+TEST(TaskTraitsTest, OverrideMultipleTraits) {
   constexpr TaskTraits left = {MayBlock(), TaskPriority::BEST_EFFORT,
                                TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN};
   constexpr TaskTraits right = {WithBaseSyncPrimitives(),
diff --git a/base/task_scheduler/task_traits_unittest.nc b/base/task/task_traits_unittest.nc
similarity index 97%
rename from base/task_scheduler/task_traits_unittest.nc
rename to base/task/task_traits_unittest.nc
index 14aa9b0..aa13b54 100644
--- a/base/task_scheduler/task_traits_unittest.nc
+++ b/base/task/task_traits_unittest.nc
@@ -5,7 +5,7 @@
 // This is a "No Compile Test" suite.
 // http://dev.chromium.org/developers/testing/no-compile-tests
 
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 
 namespace base {
 
diff --git a/base/task_scheduler/OWNERS b/base/task_scheduler/OWNERS
index 0f3ad5e..6e259974 100644
--- a/base/task_scheduler/OWNERS
+++ b/base/task_scheduler/OWNERS
@@ -1,3 +1,7 @@
+# TODO(gab): Remove this file from this now empty directory after
+# base/test/OWNERS is updated on the server to no longer refer to it...
+# https://crbug.com/870426
+
 fdoray@chromium.org
 gab@chromium.org
 robliao@chromium.org
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index a06a02d..7f07ee0 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -378,7 +378,7 @@
       ]
       args = []
       outputs = [
-        "$root_out_dir/fontconfig_caches/",
+        "$root_out_dir/fontconfig_caches/df1acc8c-39d5-4a8b-8507-b1a7396ac3ac-le64.cache-7",
         "$root_out_dir/test_fonts/.uuid",
       ]
     }
diff --git a/base/test/OWNERS b/base/test/OWNERS
index 30d3129..73069a1 100644
--- a/base/test/OWNERS
+++ b/base/test/OWNERS
@@ -1,5 +1,3 @@
-per-file *task_scheduler*=file://base/task_scheduler/OWNERS
-
 # Metrics-related test utilites:
 per-file *scoped_feature_list*=file://base/metrics/OWNERS
 
diff --git a/base/test/android/junit/src/org/chromium/base/test/asynctask/BackgroundShadowAsyncTask.java b/base/test/android/junit/src/org/chromium/base/test/asynctask/BackgroundShadowAsyncTask.java
index 9b11c1e..83e0ce8 100644
--- a/base/test/android/junit/src/org/chromium/base/test/asynctask/BackgroundShadowAsyncTask.java
+++ b/base/test/android/junit/src/org/chromium/base/test/asynctask/BackgroundShadowAsyncTask.java
@@ -13,6 +13,7 @@
 import org.chromium.base.AsyncTask;
 
 import java.util.concurrent.Callable;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
@@ -46,6 +47,12 @@
 
     @Override
     @Implementation
+    public final AsyncTask<Result> executeOnExecutor(Executor e) {
+        return execute();
+    }
+
+    @Override
+    @Implementation
     public final Result get() {
         try {
             runBackgroundTasks();
diff --git a/base/test/generate_fontconfig_caches.cc b/base/test/generate_fontconfig_caches.cc
index bb940329..bbbb5f2 100644
--- a/base/test/generate_fontconfig_caches.cc
+++ b/base/test/generate_fontconfig_caches.cc
@@ -12,6 +12,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
+#include "base/strings/strcat.h"
 #include "base/test/fontconfig_util_linux.h"
 
 // GIANT WARNING: The point of this file is to front-load construction of the
@@ -21,7 +22,7 @@
 // deterministic. This executable tries to set some external state to ensure
 // determinism. We have no way of guaranteeing that this produces correct
 // results, or even has the intended effect.
-int main(void) {
+int main() {
   // fontconfig generates a random uuid and uses it to match font folders with
   // the font cache. Rather than letting fontconfig generate a random uuid,
   // which introduces build non-determinism, we place a fixed uuid in the font
@@ -46,13 +47,17 @@
   new_times.modtime = 123456789;
   utime(test_fonts_file_path.value().c_str(), &new_times);
 
+  base::FilePath fontconfig_caches = dir_module.Append("fontconfig_caches");
+
+  // Delete directory before generating fontconfig caches. This will notify
+  // future fontconfig_caches changes.
+  CHECK(base::DeleteFile(fontconfig_caches, /*recursive=*/true));
+
   base::SetUpFontconfig();
   base::TearDownFontconfig();
 
-  base::FilePath fontconfig_caches = dir_module.Append("fontconfig_caches");
-  CHECK(base::DirectoryExists(fontconfig_caches));
-  base::FilePath stamp = fontconfig_caches.Append("STAMP");
-  CHECK_EQ(0, base::WriteFile(stamp, "", 0));
-
+  // Check existence of intended fontconfig cache file.
+  CHECK(base::PathExists(
+      fontconfig_caches.Append(base::StrCat({uuid, "-le64.cache-7"}))));
   return 0;
 }
diff --git a/base/test/launcher/test_launcher.cc b/base/test/launcher/test_launcher.cc
index 8c05e8f..5a8343f 100644
--- a/base/test/launcher/test_launcher.cc
+++ b/base/test/launcher/test_launcher.cc
@@ -39,8 +39,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/gtest_util.h"
 #include "base/test/launcher/test_launcher_tracer.h"
 #include "base/test/launcher/test_results_tracker.h"
diff --git a/base/test/scoped_task_environment.cc b/base/test/scoped_task_environment.cc
index 99c461e..7702bb30 100644
--- a/base/test/scoped_task_environment.cc
+++ b/base/test/scoped_task_environment.cc
@@ -11,9 +11,9 @@
 #include "base/run_loop.h"
 #include "base/synchronization/condition_variable.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task_scheduler/task_scheduler_impl.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_scheduler_impl.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/sequence_local_storage_map.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/base/test/scoped_task_environment.h b/base/test/scoped_task_environment.h
index eb64c02..839b734a 100644
--- a/base/test/scoped_task_environment.h
+++ b/base/test/scoped_task_environment.h
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "build/build_config.h"
 
 namespace base {
@@ -28,7 +28,7 @@
 
 // ScopedTaskEnvironment allows usage of these APIs within its scope:
 // - (Thread|Sequenced)TaskRunnerHandle, on the thread where it lives
-// - base/task_scheduler/post_task.h, on any thread
+// - base/task/post_task.h, on any thread
 //
 // Tests that need either of these APIs should instantiate a
 // ScopedTaskEnvironment.
@@ -37,10 +37,10 @@
 // RunLoop::Run(UntilIdle) or ScopedTaskEnvironment::RunUntilIdle is called on
 // the thread where the ScopedTaskEnvironment lives.
 //
-// Tasks posted through base/task_scheduler/post_task.h run on dedicated
-// threads. If ExecutionMode is QUEUED, they run when RunUntilIdle() or
-// ~ScopedTaskEnvironment is called. If ExecutionMode is ASYNC, they run
-// as they are posted.
+// Tasks posted through base/task/post_task.h run on dedicated threads. If
+// ExecutionMode is QUEUED, they run when RunUntilIdle() or
+// ~ScopedTaskEnvironment is called. If ExecutionMode is ASYNC, they run as they
+// are posted.
 //
 // All methods of ScopedTaskEnvironment must be called from the same thread.
 //
diff --git a/base/test/scoped_task_environment_unittest.cc b/base/test/scoped_task_environment_unittest.cc
index 31b6e49..f32e93b 100644
--- a/base/test/scoped_task_environment_unittest.cc
+++ b/base/test/scoped_task_environment_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/bind_helpers.h"
 #include "base/synchronization/atomic_flag.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/sequence_local_storage_slot.h"
diff --git a/base/threading/post_task_and_reply_impl.h b/base/threading/post_task_and_reply_impl.h
index 54038ce..388eb112 100644
--- a/base/threading/post_task_and_reply_impl.h
+++ b/base/threading/post_task_and_reply_impl.h
@@ -18,7 +18,7 @@
 // custom execution context.
 //
 // If you're looking for a concrete implementation of PostTaskAndReply, you
-// probably want base::TaskRunner or base/task_scheduler/post_task.h
+// probably want base::TaskRunner or base/task/post_task.h
 class BASE_EXPORT PostTaskAndReplyImpl {
  public:
   virtual ~PostTaskAndReplyImpl() = default;
diff --git a/base/threading/sequenced_task_runner_handle_unittest.cc b/base/threading/sequenced_task_runner_handle_unittest.cc
index fcad40e..de54d91 100644
--- a/base/threading/sequenced_task_runner_handle_unittest.cc
+++ b/base/threading/sequenced_task_runner_handle_unittest.cc
@@ -15,7 +15,7 @@
 #include "base/sequence_checker_impl.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/base/timer/hi_res_timer_manager_win.cc b/base/timer/hi_res_timer_manager_win.cc
index 3977114..49fe399 100644
--- a/base/timer/hi_res_timer_manager_win.cc
+++ b/base/timer/hi_res_timer_manager_win.cc
@@ -9,7 +9,7 @@
 #include "base/atomicops.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/power_monitor/power_monitor.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 
 namespace base {
diff --git a/base/timer/timer_unittest.cc b/base/timer/timer_unittest.cc
index 4782ff9e..3117411 100644
--- a/base/timer/timer_unittest.cc
+++ b/base/timer/timer_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_mock_time_task_runner.h"
 #include "base/threading/platform_thread.h"
diff --git a/base/trace_event/memory_dump_manager_unittest.cc b/base/trace_event/memory_dump_manager_unittest.cc
index 58b25b6..f30a0e8 100644
--- a/base/trace_event/memory_dump_manager_unittest.cc
+++ b/base/trace_event/memory_dump_manager_unittest.cc
@@ -20,7 +20,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_io_thread.h"
 #include "base/threading/platform_thread.h"
diff --git a/base/trace_event/trace_log.cc b/base/trace_event/trace_log.cc
index 54f3d3d8..23d84ad 100644
--- a/base/trace_event/trace_log.cc
+++ b/base/trace_event/trace_log.cc
@@ -28,7 +28,7 @@
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_id_name_manager.h"
diff --git a/base/unguessable_token.cc b/base/unguessable_token.cc
index 0d8aad3..cc8e8aa 100644
--- a/base/unguessable_token.cc
+++ b/base/unguessable_token.cc
@@ -5,6 +5,7 @@
 #include "base/unguessable_token.h"
 
 #include "base/format_macros.h"
+#include "base/no_destructor.h"
 #include "base/rand_util.h"
 #include "base/strings/stringprintf.h"
 
@@ -27,6 +28,12 @@
 }
 
 // static
+const UnguessableToken& UnguessableToken::Null() {
+  static const NoDestructor<UnguessableToken> null_token;
+  return *null_token;
+}
+
+// static
 UnguessableToken UnguessableToken::Deserialize(uint64_t high, uint64_t low) {
   // Receiving a zeroed out UnguessableToken from another process means that it
   // was never initialized via Create(). Treat this case as a security issue.
diff --git a/base/unguessable_token.h b/base/unguessable_token.h
index 6858e22a..584a57c1 100644
--- a/base/unguessable_token.h
+++ b/base/unguessable_token.h
@@ -42,6 +42,12 @@
   // Create a unique UnguessableToken.
   static UnguessableToken Create();
 
+  // Returns a reference to a global null UnguessableToken. This should only be
+  // used for functions that need to return a reference to an UnguessableToken,
+  // and should not be used as a general-purpose substitute for invoking the
+  // default constructor.
+  static const UnguessableToken& Null();
+
   // Return a UnguessableToken built from the high/low bytes provided.
   // It should only be used in deserialization scenarios.
   //
diff --git a/base/win/com_init_check_hook.cc b/base/win/com_init_check_hook.cc
index 3da7622..b7601666 100644
--- a/base/win/com_init_check_hook.cc
+++ b/base/win/com_init_check_hook.cc
@@ -243,7 +243,7 @@
     // evaluate your threading guarantees and dispatch your work with
     // base::CreateCOMSTATaskRunnerWithTraits().
     //
-    // If you need MTA support, ping //base/task_scheduler/OWNERS.
+    // If you need MTA support, ping //base/task/task_scheduler/OWNERS.
     AssertComInitialized(
         "CoCreateInstance calls in Chromium require explicit COM "
         "initialization via base::CreateCOMSTATaskRunnerWithTraits() or "
diff --git a/build/android/gyp/aar.pydeps b/build/android/gyp/aar.pydeps
new file mode 100644
index 0000000..e08c547
--- /dev/null
+++ b/build/android/gyp/aar.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/aar.pydeps build/android/gyp/aar.py
+../../gn_helpers.py
+aar.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/aidl.py b/build/android/gyp/aidl.py
index 1591f245..64ad290 100755
--- a/build/android/gyp/aidl.py
+++ b/build/android/gyp/aidl.py
@@ -18,7 +18,6 @@
 
 def main(argv):
   option_parser = optparse.OptionParser()
-  build_utils.AddDepfileOption(option_parser)
   option_parser.add_option('--aidl-path', help='Path to the aidl binary.')
   option_parser.add_option('--imports', help='Files to import.')
   option_parser.add_option('--includes',
@@ -54,9 +53,6 @@
               pkg_name.replace('.', '/'), os.path.basename(path))
           build_utils.AddToZipHermetic(srcjar, arcname, data=data)
 
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.srcjar)
-
 
 if __name__ == '__main__':
   sys.exit(main(sys.argv))
diff --git a/build/android/gyp/aidl.pydeps b/build/android/gyp/aidl.pydeps
new file mode 100644
index 0000000..2dbce376
--- /dev/null
+++ b/build/android/gyp/aidl.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/aidl.pydeps build/android/gyp/aidl.py
+../../gn_helpers.py
+aidl.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/apkbuilder.pydeps b/build/android/gyp/apkbuilder.pydeps
new file mode 100644
index 0000000..3ae0331
--- /dev/null
+++ b/build/android/gyp/apkbuilder.pydeps
@@ -0,0 +1,8 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/apkbuilder.pydeps build/android/gyp/apkbuilder.py
+../../gn_helpers.py
+apkbuilder.py
+finalize_apk.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/app_bundle_to_apks.pydeps b/build/android/gyp/app_bundle_to_apks.pydeps
new file mode 100644
index 0000000..49c2892
--- /dev/null
+++ b/build/android/gyp/app_bundle_to_apks.pydeps
@@ -0,0 +1,8 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/app_bundle_to_apks.pydeps build/android/gyp/app_bundle_to_apks.py
+../../gn_helpers.py
+app_bundle_to_apks.py
+bundletool.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/bytecode_processor.pydeps b/build/android/gyp/bytecode_processor.pydeps
new file mode 100644
index 0000000..d8ff396
--- /dev/null
+++ b/build/android/gyp/bytecode_processor.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/bytecode_processor.pydeps build/android/gyp/bytecode_processor.py
+../../gn_helpers.py
+bytecode_processor.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index 412c6f74..cda03e60 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -671,7 +671,8 @@
       input_paths=input_paths,
       input_strings=input_strings,
       output_paths=output_paths,
-      depfile_deps=options.dependencies_res_zips + options.extra_r_text_files)
+      depfile_deps=options.dependencies_res_zips + options.extra_r_text_files,
+      add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/compile_resources.pydeps b/build/android/gyp/compile_resources.pydeps
new file mode 100644
index 0000000..2ffcb52
--- /dev/null
+++ b/build/android/gyp/compile_resources.pydeps
@@ -0,0 +1,29 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/compile_resources.pydeps build/android/gyp/compile_resources.py
+../../../third_party/jinja2/__init__.py
+../../../third_party/jinja2/_compat.py
+../../../third_party/jinja2/bccache.py
+../../../third_party/jinja2/compiler.py
+../../../third_party/jinja2/defaults.py
+../../../third_party/jinja2/environment.py
+../../../third_party/jinja2/exceptions.py
+../../../third_party/jinja2/filters.py
+../../../third_party/jinja2/idtracking.py
+../../../third_party/jinja2/lexer.py
+../../../third_party/jinja2/loaders.py
+../../../third_party/jinja2/nodes.py
+../../../third_party/jinja2/optimizer.py
+../../../third_party/jinja2/parser.py
+../../../third_party/jinja2/runtime.py
+../../../third_party/jinja2/tests.py
+../../../third_party/jinja2/utils.py
+../../../third_party/jinja2/visitor.py
+../../../third_party/markupsafe/__init__.py
+../../../third_party/markupsafe/_compat.py
+../../../third_party/markupsafe/_native.py
+../../gn_helpers.py
+compile_resources.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+util/resource_utils.py
diff --git a/build/android/gyp/copy_ex.pydeps b/build/android/gyp/copy_ex.pydeps
new file mode 100644
index 0000000..e0fb31e
--- /dev/null
+++ b/build/android/gyp/copy_ex.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/copy_ex.pydeps build/android/gyp/copy_ex.py
+../../gn_helpers.py
+copy_ex.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/create_apk_operations_script.pydeps b/build/android/gyp/create_apk_operations_script.pydeps
new file mode 100644
index 0000000..9d4dcb8
--- /dev/null
+++ b/build/android/gyp/create_apk_operations_script.pydeps
@@ -0,0 +1,3 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_apk_operations_script.pydeps build/android/gyp/create_apk_operations_script.py
+create_apk_operations_script.py
diff --git a/build/android/gyp/create_app_bundle.pydeps b/build/android/gyp/create_app_bundle.pydeps
new file mode 100644
index 0000000..fef04fa
--- /dev/null
+++ b/build/android/gyp/create_app_bundle.pydeps
@@ -0,0 +1,30 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_app_bundle.pydeps build/android/gyp/create_app_bundle.py
+../../../third_party/jinja2/__init__.py
+../../../third_party/jinja2/_compat.py
+../../../third_party/jinja2/bccache.py
+../../../third_party/jinja2/compiler.py
+../../../third_party/jinja2/defaults.py
+../../../third_party/jinja2/environment.py
+../../../third_party/jinja2/exceptions.py
+../../../third_party/jinja2/filters.py
+../../../third_party/jinja2/idtracking.py
+../../../third_party/jinja2/lexer.py
+../../../third_party/jinja2/loaders.py
+../../../third_party/jinja2/nodes.py
+../../../third_party/jinja2/optimizer.py
+../../../third_party/jinja2/parser.py
+../../../third_party/jinja2/runtime.py
+../../../third_party/jinja2/tests.py
+../../../third_party/jinja2/utils.py
+../../../third_party/jinja2/visitor.py
+../../../third_party/markupsafe/__init__.py
+../../../third_party/markupsafe/_compat.py
+../../../third_party/markupsafe/_native.py
+../../gn_helpers.py
+bundletool.py
+create_app_bundle.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+util/resource_utils.py
diff --git a/build/android/gyp/create_bundle_wrapper_script.pydeps b/build/android/gyp/create_bundle_wrapper_script.pydeps
new file mode 100644
index 0000000..5c87801
--- /dev/null
+++ b/build/android/gyp/create_bundle_wrapper_script.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_bundle_wrapper_script.pydeps build/android/gyp/create_bundle_wrapper_script.py
+../../gn_helpers.py
+create_bundle_wrapper_script.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/create_dist_jar.py b/build/android/gyp/create_dist_jar.py
index 2e06478..7f78935a 100755
--- a/build/android/gyp/create_dist_jar.py
+++ b/build/android/gyp/create_dist_jar.py
@@ -24,7 +24,8 @@
   build_utils.MergeZips(options.output, input_jars)
 
   if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.output, input_jars)
+    build_utils.WriteDepfile(options.depfile, options.output, input_jars,
+                             add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/create_dist_jar.pydeps b/build/android/gyp/create_dist_jar.pydeps
new file mode 100644
index 0000000..f4224d7
--- /dev/null
+++ b/build/android/gyp/create_dist_jar.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_dist_jar.pydeps build/android/gyp/create_dist_jar.py
+../../gn_helpers.py
+create_dist_jar.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/create_java_binary_script.pydeps b/build/android/gyp/create_java_binary_script.pydeps
new file mode 100644
index 0000000..96d79bf
--- /dev/null
+++ b/build/android/gyp/create_java_binary_script.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_java_binary_script.pydeps build/android/gyp/create_java_binary_script.py
+../../gn_helpers.py
+create_java_binary_script.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/create_stack_script.pydeps b/build/android/gyp/create_stack_script.pydeps
new file mode 100644
index 0000000..7bddb156
--- /dev/null
+++ b/build/android/gyp/create_stack_script.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_stack_script.pydeps build/android/gyp/create_stack_script.py
+../../gn_helpers.py
+create_stack_script.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/create_test_runner_script.pydeps b/build/android/gyp/create_test_runner_script.pydeps
new file mode 100644
index 0000000..4b8876b
--- /dev/null
+++ b/build/android/gyp/create_test_runner_script.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_test_runner_script.pydeps build/android/gyp/create_test_runner_script.py
+../../gn_helpers.py
+create_test_runner_script.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/create_tool_wrapper.pydeps b/build/android/gyp/create_tool_wrapper.pydeps
new file mode 100644
index 0000000..75b8326e
--- /dev/null
+++ b/build/android/gyp/create_tool_wrapper.pydeps
@@ -0,0 +1,3 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/create_tool_wrapper.pydeps build/android/gyp/create_tool_wrapper.py
+create_tool_wrapper.py
diff --git a/build/android/gyp/desugar.pydeps b/build/android/gyp/desugar.pydeps
new file mode 100644
index 0000000..a40f3aa7
--- /dev/null
+++ b/build/android/gyp/desugar.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/desugar.pydeps build/android/gyp/desugar.py
+../../gn_helpers.py
+desugar.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/dex.pydeps b/build/android/gyp/dex.pydeps
new file mode 100644
index 0000000..0e18d02a
--- /dev/null
+++ b/build/android/gyp/dex.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/dex.pydeps build/android/gyp/dex.py
+../../gn_helpers.py
+dex.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/dist_aar.py b/build/android/gyp/dist_aar.py
index 6dc38c4..ed823f18 100755
--- a/build/android/gyp/dist_aar.py
+++ b/build/android/gyp/dist_aar.py
@@ -124,7 +124,8 @@
   if options.depfile:
     all_inputs = (options.jars + options.dependencies_res_zips +
                   options.r_text_files + options.proguard_configs)
-    build_utils.WriteDepfile(options.depfile, options.output, all_inputs)
+    build_utils.WriteDepfile(options.depfile, options.output, all_inputs,
+                             add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/dist_aar.pydeps b/build/android/gyp/dist_aar.pydeps
new file mode 100644
index 0000000..da5ea8d
--- /dev/null
+++ b/build/android/gyp/dist_aar.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/dist_aar.pydeps build/android/gyp/dist_aar.py
+../../gn_helpers.py
+dist_aar.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/emma_instr.pydeps b/build/android/gyp/emma_instr.pydeps
new file mode 100644
index 0000000..88f752a0
--- /dev/null
+++ b/build/android/gyp/emma_instr.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/emma_instr.pydeps build/android/gyp/emma_instr.py
+../../gn_helpers.py
+emma_instr.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/filter_zip.pydeps b/build/android/gyp/filter_zip.pydeps
new file mode 100644
index 0000000..67c989c
--- /dev/null
+++ b/build/android/gyp/filter_zip.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/filter_zip.pydeps build/android/gyp/filter_zip.py
+../../gn_helpers.py
+filter_zip.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/gcc_preprocess.py b/build/android/gyp/gcc_preprocess.py
index 8c5c404..8b3444c2 100755
--- a/build/android/gyp/gcc_preprocess.py
+++ b/build/android/gyp/gcc_preprocess.py
@@ -47,7 +47,7 @@
   DoGcc(options)
 
   if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.output)
+    build_utils.WriteDepfile(options.depfile, options.output, add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/gcc_preprocess.pydeps b/build/android/gyp/gcc_preprocess.pydeps
new file mode 100644
index 0000000..64e776b
--- /dev/null
+++ b/build/android/gyp/gcc_preprocess.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/gcc_preprocess.pydeps build/android/gyp/gcc_preprocess.py
+../../gn_helpers.py
+gcc_preprocess.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/generate_proguarded_module_jar.pydeps b/build/android/gyp/generate_proguarded_module_jar.pydeps
new file mode 100644
index 0000000..6d52b4e
--- /dev/null
+++ b/build/android/gyp/generate_proguarded_module_jar.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/generate_proguarded_module_jar.pydeps build/android/gyp/generate_proguarded_module_jar.py
+../../gn_helpers.py
+generate_proguarded_module_jar.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/ijar.pydeps b/build/android/gyp/ijar.pydeps
new file mode 100644
index 0000000..ca10697c
--- /dev/null
+++ b/build/android/gyp/ijar.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/ijar.pydeps build/android/gyp/ijar.py
+../../gn_helpers.py
+ijar.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/java_cpp_enum.py b/build/android/gyp/java_cpp_enum.py
index afb4843..e7374410 100755
--- a/build/android/gyp/java_cpp_enum.py
+++ b/build/android/gyp/java_cpp_enum.py
@@ -447,7 +447,7 @@
         build_utils.AddToZipHermetic(srcjar, output_path, data=data)
 
   if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.srcjar)
+    build_utils.WriteDepfile(options.depfile, options.srcjar, add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/java_cpp_enum.pydeps b/build/android/gyp/java_cpp_enum.pydeps
new file mode 100644
index 0000000..32c8de5
--- /dev/null
+++ b/build/android/gyp/java_cpp_enum.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/java_cpp_enum.pydeps build/android/gyp/java_cpp_enum.py
+../../gn_helpers.py
+java_cpp_enum.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/javac.py b/build/android/gyp/javac.py
index 53d3f99..fec8198 100755
--- a/build/android/gyp/javac.py
+++ b/build/android/gyp/javac.py
@@ -597,7 +597,8 @@
       input_strings=javac_cmd + classpath,
       output_paths=output_paths,
       force=force,
-      pass_changes=True)
+      pass_changes=True,
+      add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/javac.pydeps b/build/android/gyp/javac.pydeps
new file mode 100644
index 0000000..a9d257b
--- /dev/null
+++ b/build/android/gyp/javac.pydeps
@@ -0,0 +1,15 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/javac.pydeps build/android/gyp/javac.py
+../../../third_party/colorama/src/colorama/__init__.py
+../../../third_party/colorama/src/colorama/ansi.py
+../../../third_party/colorama/src/colorama/ansitowin32.py
+../../../third_party/colorama/src/colorama/initialise.py
+../../../third_party/colorama/src/colorama/win32.py
+../../../third_party/colorama/src/colorama/winterm.py
+../../gn_helpers.py
+jar.py
+javac.py
+util/__init__.py
+util/build_utils.py
+util/jar_info_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/jinja_template.py b/build/android/gyp/jinja_template.py
index 434d281..4d5c403 100755
--- a/build/android/gyp/jinja_template.py
+++ b/build/android/gyp/jinja_template.py
@@ -124,7 +124,8 @@
   parser.add_argument('--variables', help='Variables to be made available in '
                       'the template processing environment, as a GYP list '
                       '(e.g. --variables "channel=beta mstone=39")', default='')
-  build_utils.AddDepfileOption(parser)
+  parser.add_argument('--check-includes', action='store_true',
+                      help='Enable inputs and includes checks.')
   options = parser.parse_args()
 
   inputs = build_utils.ParseGnList(options.inputs)
@@ -146,15 +147,13 @@
     _ProcessFiles(processor, inputs, options.inputs_base_dir,
                   options.outputs_zip)
 
-  if options.depfile:
-    output = options.output or options.outputs_zip
+  if options.check_includes:
     all_inputs = set(processor.GetLoadedTemplates())
     all_inputs.difference_update(inputs)
     all_inputs.difference_update(includes)
     if all_inputs:
       raise Exception('Found files not listed via --includes:\n' +
                       '\n'.join(sorted(all_inputs)))
-    build_utils.WriteDepfile(options.depfile, output)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/jinja_template.pydeps b/build/android/gyp/jinja_template.pydeps
new file mode 100644
index 0000000..a2a3817
--- /dev/null
+++ b/build/android/gyp/jinja_template.pydeps
@@ -0,0 +1,41 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/jinja_template.pydeps build/android/gyp/jinja_template.py
+../../../third_party/catapult/devil/devil/__init__.py
+../../../third_party/catapult/devil/devil/android/__init__.py
+../../../third_party/catapult/devil/devil/android/constants/__init__.py
+../../../third_party/catapult/devil/devil/android/constants/chrome.py
+../../../third_party/catapult/devil/devil/android/sdk/__init__.py
+../../../third_party/catapult/devil/devil/android/sdk/keyevent.py
+../../../third_party/catapult/devil/devil/android/sdk/version_codes.py
+../../../third_party/catapult/devil/devil/constants/__init__.py
+../../../third_party/catapult/devil/devil/constants/exit_codes.py
+../../../third_party/jinja2/__init__.py
+../../../third_party/jinja2/_compat.py
+../../../third_party/jinja2/bccache.py
+../../../third_party/jinja2/compiler.py
+../../../third_party/jinja2/defaults.py
+../../../third_party/jinja2/environment.py
+../../../third_party/jinja2/exceptions.py
+../../../third_party/jinja2/filters.py
+../../../third_party/jinja2/idtracking.py
+../../../third_party/jinja2/lexer.py
+../../../third_party/jinja2/loaders.py
+../../../third_party/jinja2/nodes.py
+../../../third_party/jinja2/optimizer.py
+../../../third_party/jinja2/parser.py
+../../../third_party/jinja2/runtime.py
+../../../third_party/jinja2/tests.py
+../../../third_party/jinja2/utils.py
+../../../third_party/jinja2/visitor.py
+../../../third_party/markupsafe/__init__.py
+../../../third_party/markupsafe/_compat.py
+../../../third_party/markupsafe/_native.py
+../../gn_helpers.py
+../pylib/__init__.py
+../pylib/constants/__init__.py
+../pylib/constants/host_paths.py
+jinja_template.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+util/resource_utils.py
diff --git a/build/android/gyp/lint.pydeps b/build/android/gyp/lint.pydeps
new file mode 100644
index 0000000..a8616e4
--- /dev/null
+++ b/build/android/gyp/lint.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/lint.pydeps build/android/gyp/lint.py
+../../gn_helpers.py
+lint.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/main_dex_list.pydeps b/build/android/gyp/main_dex_list.pydeps
new file mode 100644
index 0000000..8c482df
--- /dev/null
+++ b/build/android/gyp/main_dex_list.pydeps
@@ -0,0 +1,8 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/main_dex_list.pydeps build/android/gyp/main_dex_list.py
+../../gn_helpers.py
+main_dex_list.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+util/proguard_util.py
diff --git a/build/android/gyp/merge_jar_info_files.pydeps b/build/android/gyp/merge_jar_info_files.pydeps
new file mode 100644
index 0000000..710091c
--- /dev/null
+++ b/build/android/gyp/merge_jar_info_files.pydeps
@@ -0,0 +1,8 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/merge_jar_info_files.pydeps build/android/gyp/merge_jar_info_files.py
+../../gn_helpers.py
+merge_jar_info_files.py
+util/__init__.py
+util/build_utils.py
+util/jar_info_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/merge_manifest.pydeps b/build/android/gyp/merge_manifest.pydeps
new file mode 100644
index 0000000..37901962c
--- /dev/null
+++ b/build/android/gyp/merge_manifest.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/merge_manifest.pydeps build/android/gyp/merge_manifest.py
+../../gn_helpers.py
+merge_manifest.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
diff --git a/build/android/gyp/prepare_resources.py b/build/android/gyp/prepare_resources.py
index 6237c7d..ae7f53d0 100755
--- a/build/android/gyp/prepare_resources.py
+++ b/build/android/gyp/prepare_resources.py
@@ -297,7 +297,8 @@
       input_paths=input_paths,
       input_strings=input_strings,
       output_paths=output_paths,
-      depfile_deps=depfile_deps)
+      depfile_deps=depfile_deps,
+      add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/prepare_resources.pydeps b/build/android/gyp/prepare_resources.pydeps
new file mode 100644
index 0000000..0e9ccfbe
--- /dev/null
+++ b/build/android/gyp/prepare_resources.pydeps
@@ -0,0 +1,30 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/prepare_resources.pydeps build/android/gyp/prepare_resources.py
+../../../third_party/jinja2/__init__.py
+../../../third_party/jinja2/_compat.py
+../../../third_party/jinja2/bccache.py
+../../../third_party/jinja2/compiler.py
+../../../third_party/jinja2/defaults.py
+../../../third_party/jinja2/environment.py
+../../../third_party/jinja2/exceptions.py
+../../../third_party/jinja2/filters.py
+../../../third_party/jinja2/idtracking.py
+../../../third_party/jinja2/lexer.py
+../../../third_party/jinja2/loaders.py
+../../../third_party/jinja2/nodes.py
+../../../third_party/jinja2/optimizer.py
+../../../third_party/jinja2/parser.py
+../../../third_party/jinja2/runtime.py
+../../../third_party/jinja2/tests.py
+../../../third_party/jinja2/utils.py
+../../../third_party/jinja2/visitor.py
+../../../third_party/markupsafe/__init__.py
+../../../third_party/markupsafe/_compat.py
+../../../third_party/markupsafe/_native.py
+../../gn_helpers.py
+generate_v14_compatible_resources.py
+prepare_resources.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+util/resource_utils.py
diff --git a/build/android/gyp/proguard.pydeps b/build/android/gyp/proguard.pydeps
new file mode 100644
index 0000000..6db3d7d
--- /dev/null
+++ b/build/android/gyp/proguard.pydeps
@@ -0,0 +1,8 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/proguard.pydeps build/android/gyp/proguard.py
+../../gn_helpers.py
+proguard.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+util/proguard_util.py
diff --git a/build/android/gyp/write_build_config.pydeps b/build/android/gyp/write_build_config.pydeps
new file mode 100644
index 0000000..e317c47
--- /dev/null
+++ b/build/android/gyp/write_build_config.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/write_build_config.pydeps build/android/gyp/write_build_config.py
+../../gn_helpers.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+write_build_config.py
diff --git a/build/android/gyp/write_ordered_libraries.py b/build/android/gyp/write_ordered_libraries.py
index 3b9a3374..92c82bb 100755
--- a/build/android/gyp/write_ordered_libraries.py
+++ b/build/android/gyp/write_ordered_libraries.py
@@ -109,7 +109,8 @@
       only_if_changed=True)
 
   if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.output, libraries)
+    build_utils.WriteDepfile(options.depfile, options.output, libraries,
+                             add_pydeps=False)
 
 
 if __name__ == '__main__':
diff --git a/build/android/gyp/write_ordered_libraries.pydeps b/build/android/gyp/write_ordered_libraries.pydeps
new file mode 100644
index 0000000..c2ed1fee
--- /dev/null
+++ b/build/android/gyp/write_ordered_libraries.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/gyp --output build/android/gyp/write_ordered_libraries.pydeps build/android/gyp/write_ordered_libraries.py
+../../gn_helpers.py
+util/__init__.py
+util/build_utils.py
+util/md5_check.py
+write_ordered_libraries.py
diff --git a/build/android/incremental_install/generate_android_manifest.pydeps b/build/android/incremental_install/generate_android_manifest.pydeps
new file mode 100644
index 0000000..de92fafa
--- /dev/null
+++ b/build/android/incremental_install/generate_android_manifest.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/incremental_install --output build/android/incremental_install/generate_android_manifest.pydeps build/android/incremental_install/generate_android_manifest.py
+../../gn_helpers.py
+../gyp/util/__init__.py
+../gyp/util/build_utils.py
+../gyp/util/md5_check.py
+generate_android_manifest.py
diff --git a/build/android/incremental_install/write_installer_json.py b/build/android/incremental_install/write_installer_json.py
index b7e4e77..75bd6d1 100755
--- a/build/android/incremental_install/write_installer_json.py
+++ b/build/android/incremental_install/write_installer_json.py
@@ -19,7 +19,6 @@
 def _ParseArgs(args):
   args = build_utils.ExpandFileArgs(args)
   parser = argparse.ArgumentParser()
-  build_utils.AddDepfileOption(parser)
   parser.add_argument('--output-path',
                       help='Output path for .json file.',
                       required=True)
@@ -76,9 +75,6 @@
   with build_utils.AtomicOutput(options.output_path) as f:
     json.dump(data, f, indent=2, sort_keys=True)
 
-  if options.depfile:
-    build_utils.WriteDepfile(options.depfile, options.output_path)
-
 
 if __name__ == '__main__':
   main(sys.argv[1:])
diff --git a/build/android/incremental_install/write_installer_json.pydeps b/build/android/incremental_install/write_installer_json.pydeps
new file mode 100644
index 0000000..851e6c5
--- /dev/null
+++ b/build/android/incremental_install/write_installer_json.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build/android/incremental_install --output build/android/incremental_install/write_installer_json.pydeps build/android/incremental_install/write_installer_json.py
+../../gn_helpers.py
+../gyp/util/__init__.py
+../gyp/util/build_utils.py
+../gyp/util/md5_check.py
+write_installer_json.py
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt
index d570a03f..b655bfd 100644
--- a/build/check_gn_headers_whitelist.txt
+++ b/build/check_gn_headers_whitelist.txt
@@ -60,7 +60,6 @@
 chrome/browser/notifications/displayed_notifications_dispatch_callback.h
 chrome/browser/permissions/permission_queue_controller.h
 chrome/browser/prefs/active_profile_pref_service.h
-chrome/browser/rlz/chrome_rlz_tracker_delegate.h
 chrome/browser/ui/android/content_settings/subresource_filter_infobar_delegate.h
 chrome/browser/ui/app_icon_loader_delegate.h
 chrome/browser/ui/app_list/app_list_syncable_service_factory.h
diff --git a/build/chromeos/create_vm_test_script.py b/build/chromeos/create_vm_test_script.py
index 67e2ec3..80a7dbb4 100755
--- a/build/chromeos/create_vm_test_script.py
+++ b/build/chromeos/create_vm_test_script.py
@@ -41,6 +41,7 @@
   sys.exit(main())
 """
 
+
 def main(args):
   parser = argparse.ArgumentParser()
   parser.add_argument('--script-output-path')
@@ -49,9 +50,9 @@
   parser.add_argument('--runtime-deps-path')
   parser.add_argument('--cros-cache')
   parser.add_argument('--board')
+  parser.add_argument('--deploy-chrome', action='store_true')
   args = parser.parse_args(args)
 
-
   def RelativizePathToScript(path):
     return os.path.relpath(path, os.path.dirname(args.script_output_path))
 
@@ -62,6 +63,7 @@
       '--board', args.board,
       '-v',
   ]
+
   if args.test_exe:
     vm_test_args.extend([
         'vm-test',
@@ -70,6 +72,8 @@
     ])
   else:
     vm_test_args.append('host-cmd')
+    if args.deploy_chrome:
+      vm_test_args.append('--deploy-chrome')
 
   vm_test_path_args = [
       ('--cros-cache', RelativizePathToScript(args.cros_cache)),
diff --git a/build/chromeos/run_vm_test.py b/build/chromeos/run_vm_test.py
index 6af600c..bb8b8ce 100755
--- a/build/chromeos/run_vm_test.py
+++ b/build/chromeos/run_vm_test.py
@@ -322,13 +322,14 @@
 
 def host_cmd(args, unknown_args):
   if not args.cmd:
-    logging.error('Must specify command to run on the host.')
-    return 1
+    raise TestFormatError('Must specify command to run on the host.')
   elif unknown_args:
-    logging.error(
-        'Args "%s" unsupported. Is your host command correctly formatted?',
-        ' '.join(unknown_args))
-    return 1
+    raise TestFormatError(
+        'Args "%s" unsupported. Is your host command correctly formatted?' % (
+            ' '.join(unknown_args)))
+  elif args.deploy_chrome and not args.path_to_outdir:
+    raise TestFormatError(
+        '--path-to-outdir must be specified if --deploy-chrome is passed.')
 
   cros_run_vm_test_cmd = [
       CROS_RUN_VM_TEST_PATH,
@@ -339,6 +340,24 @@
   if args.verbose:
     cros_run_vm_test_cmd.append('--debug')
 
+  test_env = os.environ.copy()
+  if args.deploy_chrome:
+    cros_run_vm_test_cmd += [
+        '--deploy',
+        '--build-dir', os.path.abspath(args.path_to_outdir),
+    ]
+    # If we're deploying, push chromite/bin's deploy_chrome onto PATH.
+    test_env['PATH'] = (
+        test_env['PATH'] + ':' + os.path.join(CHROMITE_PATH, 'bin'))
+    # deploy_chrome needs a set of GN args used to build chrome to determine if
+    # certain libraries need to be pushed to the VM. It looks for the args via
+    # an env var. To trigger the default deploying behavior, give it a dummy set
+    # of args.
+    # TODO(crbug.com/823996): Make the GN-dependent deps controllable via cmd
+    # line args.
+    if not test_env.get('GN_ARGS'):
+      test_env['GN_ARGS'] = 'is_chromeos = true'
+
   cros_run_vm_test_cmd += [
       '--host-cmd',
       '--',
@@ -348,7 +367,7 @@
   logging.info(' '.join(cros_run_vm_test_cmd))
 
   return subprocess42.call(
-      cros_run_vm_test_cmd, stdout=sys.stdout, stderr=sys.stderr)
+      cros_run_vm_test_cmd, stdout=sys.stdout, stderr=sys.stderr, env=test_env)
 
 
 def main():
@@ -366,6 +385,14 @@
   host_cmd_parser.set_defaults(func=host_cmd)
   host_cmd_parser.add_argument(
       '--cros-cache', type=str, required=True, help='Path to cros cache.')
+  host_cmd_parser.add_argument(
+      '--path-to-outdir', type=os.path.realpath,
+      help='Path to output directory, all of whose contents will be deployed '
+           'to the device.')
+  host_cmd_parser.add_argument(
+      '--deploy-chrome', action='store_true',
+      help='Will deploy a locally built Chrome binary to the VM before running '
+           'the host-cmd.')
   host_cmd_parser.add_argument('cmd', nargs=argparse.REMAINDER)
   # VM-side test args.
   vm_test_parser = subparsers.add_parser(
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 2317a6e1..54a5850 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -6,8 +6,8 @@
 # Some projects (e.g. V8) do not have non-build directories DEPS'ed in.
 import("//build_overrides/build.gni")
 import("//build/config/android/config.gni")
-import("//build/config/compute_inputs_for_analyze.gni")
 import("//build/config/dcheck_always_on.gni")
+import("//build/config/python.gni")
 import("//build/config/sanitizers/sanitizers.gni")
 
 assert(is_android)
@@ -45,14 +45,6 @@
 
 _default_proguard_jar_path = "//third_party/proguard/lib/proguard.jar"
 
-# List of .py files required when scripts import build_utils.py.
-# Use this for "inputs" for actions that rely on build_utils.py.
-build_utils_py = [
-  "//build/android/gyp/util/build_utils.py",
-  "//build/android/gyp/util/md5_check.py",
-  "//build/gn_helpers.py",
-]
-
 # Write the target's .build_config file. This is a json file that contains a
 # dictionary of information about how to build this target (things that
 # require knowledge about this target's dependencies and cannot be calculated
@@ -91,7 +83,7 @@
     sources = []
   }
 
-  action(target_name) {
+  action_with_pydeps(target_name) {
     forward_variables_from(invoker,
                            [
                              "deps",
@@ -106,7 +98,7 @@
 
     script = "//build/android/gyp/write_build_config.py"
     depfile = "$target_gen_dir/$target_name.d"
-    inputs = build_utils_py
+    inputs = []
     outputs = [
       invoker.build_config,
     ]
@@ -438,7 +430,7 @@
 #
 template("copy_ex") {
   set_sources_assignment_filter([])
-  action(target_name) {
+  action_with_pydeps(target_name) {
     forward_variables_from(invoker,
                            [
                              "data",
@@ -451,9 +443,8 @@
     if (defined(invoker.sources)) {
       sources += invoker.sources
     }
-    inputs = build_utils_py
     if (defined(invoker.inputs)) {
-      inputs += invoker.inputs
+      inputs = invoker.inputs
     }
 
     script = "//build/android/gyp/copy_ex.py"
@@ -519,7 +510,7 @@
     }
   }
 
-  action(target_name) {
+  action_with_pydeps(target_name) {
     forward_variables_from(invoker,
                            [
                              "data_deps",
@@ -533,7 +524,6 @@
     }
 
     script = "//build/android/gyp/create_test_runner_script.py"
-    inputs = build_utils_py
 
     data_deps += [
       "//build/android:test_runner_py",
@@ -631,25 +621,25 @@
           "--android-manifest-path",
           rebase_path(invoker.android_manifest_path, root_build_dir),
         ]
-      }
-
-      if (defined(invoker.package_name)) {
+      } else if (defined(invoker.package_name)) {
         test_runner_args += [
           "--package-name",
           invoker.package_name,
         ]
-
-        deps += [ ":${invoker.test_suite}__build_config" ]
-        _junit_binary_build_config =
-            "${target_gen_dir}/${invoker.test_suite}.build_config"
-        _rebased_build_config =
-            rebase_path("$_junit_binary_build_config", root_build_dir)
-        test_runner_args += [
-          "--resource-zips",
-          "@FileArg($_rebased_build_config:resources:dependency_zips)",
-        ]
+      } else {
+        assert(false, "Must specify a package_name or android_manifest_path")
       }
 
+      deps += [ ":${invoker.test_suite}__build_config" ]
+      _junit_binary_build_config =
+          "${target_gen_dir}/${invoker.test_suite}.build_config"
+      _rebased_build_config =
+          rebase_path("$_junit_binary_build_config", root_build_dir)
+      test_runner_args += [
+        "--resource-zips",
+        "@FileArg($_rebased_build_config:resources:dependency_zips)",
+      ]
+
       test_runner_args += [
         "--robolectric-runtime-deps-dir",
         rebase_path("$root_build_dir/lib.java/third_party/robolectric",
@@ -725,15 +715,12 @@
 }
 
 template("stack_script") {
-  forward_variables_from(invoker, [ "testonly" ])
-
-  _stack_target_name = invoker.stack_target_name
-
-  action(target_name) {
+  action_with_pydeps(target_name) {
     forward_variables_from(invoker,
                            [
                              "data_deps",
                              "deps",
+                             "testonly",
                            ])
     if (!defined(deps)) {
       deps = []
@@ -746,8 +733,8 @@
         [ "//third_party/android_platform/development/scripts:stack_py" ]
 
     script = "//build/android/gyp/create_stack_script.py"
-    inputs = build_utils_py
 
+    _stack_target_name = invoker.stack_target_name
     _stack_script = "//third_party/android_platform/development/scripts/stack"
 
     _generated_script = "$root_build_dir/bin/stack_${_stack_target_name}"
@@ -783,7 +770,7 @@
   android_default_aapt2_path = "$android_sdk_build_tools/aapt2"
 
   template("android_lint") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -811,10 +798,10 @@
 
       script = "//build/android/gyp/lint.py"
       depfile = "$target_gen_dir/$target_name.d"
-      inputs = build_utils_py + [
-                 _platform_xml_path,
-                 _suppressions_file,
-               ]
+      inputs = [
+        _platform_xml_path,
+        _suppressions_file,
+      ]
 
       outputs = [
         _result_path,
@@ -891,7 +878,7 @@
   }
 
   template("proguard") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       set_sources_assignment_filter([])
       forward_variables_from(invoker,
                              [
@@ -912,11 +899,10 @@
         _proguard_jar_path = invoker.proguard_jar_path
       }
 
-      inputs = build_utils_py + [
-                 "//build/android/gyp/util/proguard_util.py",
-                 _proguard_jar_path,
-                 invoker.build_config,
-               ]
+      inputs = [
+        _proguard_jar_path,
+        invoker.build_config,
+      ]
       if (defined(invoker.inputs)) {
         inputs += invoker.inputs
       }
@@ -966,7 +952,7 @@
   #     class path when the script will invoke javac.
   #
   template("java_binary_script") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -978,7 +964,9 @@
       _script_name = invoker.script_name
 
       script = "//build/android/gyp/create_java_binary_script.py"
-      inputs = build_utils_py + [ _build_config ]
+      inputs = [
+        _build_config,
+      ]
       _java_script = "$root_build_dir/bin/$_script_name"
       outputs = [
         _java_script,
@@ -1023,7 +1011,7 @@
     if (_enable_multidex) {
       _main_dex_list_path = invoker.output + ".main_dex_list"
       _main_dex_list_target_name = "${target_name}__main_dex_list"
-      action(_main_dex_list_target_name) {
+      action_with_pydeps(_main_dex_list_target_name) {
         forward_variables_from(invoker,
                                [
                                  "deps",
@@ -1046,13 +1034,12 @@
 
         _shrinked_android = "$android_sdk_build_tools/lib/shrinkedAndroid.jar"
         _dx = "$android_sdk_build_tools/lib/dx.jar"
-        inputs = build_utils_py + [
-                   "//build/android/gyp/util/proguard_util.py",
-                   main_dex_rules,
-                   _dx,
-                   _proguard_jar_path,
-                   _shrinked_android,
-                 ]
+        inputs = [
+          main_dex_rules,
+          _dx,
+          _proguard_jar_path,
+          _shrinked_android,
+        ]
 
         outputs = [
           _main_dex_list_path,
@@ -1099,7 +1086,7 @@
     }
 
     assert(defined(invoker.output))
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -1107,7 +1094,7 @@
                              ])
       script = "//build/android/gyp/dex.py"
       depfile = "$target_gen_dir/$target_name.d"
-      inputs = build_utils_py
+      inputs = []
       outputs = [
         invoker.output,
       ]
@@ -1155,7 +1142,7 @@
   }
 
   template("emma_instr") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -1168,7 +1155,7 @@
       _emma_jar = "${android_sdk_root}/tools/lib/emma.jar"
 
       script = "//build/android/gyp/emma_instr.py"
-      inputs = build_utils_py + invoker.java_files + [
+      inputs = invoker.java_files + [
                  _emma_jar,
                  invoker.input_jar_path,
                ]
@@ -1276,7 +1263,7 @@
       _java_bytecode_rewriter_output_jar =
           "$target_out_dir/$target_name-bytecode-rewritten.jar"
 
-      action(_java_bytecode_rewriter_target) {
+      action_with_pydeps(_java_bytecode_rewriter_target) {
         script = "//build/android/gyp/bytecode_processor.py"
         _bytecode_rewriter_script =
             "$root_build_dir/bin/helper/java_bytecode_rewriter"
@@ -1327,7 +1314,7 @@
       _desugar_input_jar = _previous_output_jar
       _desugar_output_jar = "$target_out_dir/$target_name-desugar.jar"
 
-      action(_desugar_target) {
+      action_with_pydeps(_desugar_target) {
         script = "//build/android/gyp/desugar.py"
         deps = _deps
         if (defined(invoker.deps)) {
@@ -1335,11 +1322,11 @@
         }
         _desugar_jar = "//third_party/bazel/desugar/Desugar.jar"
 
-        inputs = build_utils_py + [
-                   _build_config,
-                   _desugar_input_jar,
-                   _desugar_jar,
-                 ]
+        inputs = [
+          _build_config,
+          _desugar_input_jar,
+          _desugar_jar,
+        ]
         outputs = [
           _desugar_output_jar,
         ]
@@ -1365,16 +1352,16 @@
       _filter_input_jar = _previous_output_jar
       _filter_output_jar = "$target_out_dir/$target_name-filtered.jar"
 
-      action(_filter_target) {
+      action_with_pydeps(_filter_target) {
         script = "//build/android/gyp/filter_zip.py"
         deps = _deps
         if (defined(invoker.deps)) {
           deps += invoker.deps
         }
-        inputs = build_utils_py + [
-                   _build_config,
-                   _filter_input_jar,
-                 ]
+        inputs = [
+          _build_config,
+          _filter_input_jar,
+        ]
         outputs = [
           _filter_output_jar,
         ]
@@ -1456,7 +1443,7 @@
   }
 
   template("merge_manifests") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -1465,10 +1452,10 @@
       script = "//build/android/gyp/merge_manifest.py"
       depfile = "$target_gen_dir/$target_name.d"
 
-      inputs = build_utils_py + [
-                 invoker.build_config,
-                 invoker.input_manifest,
-               ]
+      inputs = [
+        invoker.build_config,
+        invoker.input_manifest,
+      ]
 
       outputs = [
         invoker.output_manifest,
@@ -1490,19 +1477,6 @@
     }
   }
 
-  if (compute_inputs_for_analyze) {
-    _prepare_resources_py =
-        exec_script("//build/print_python_deps.py",
-                    [
-                      rebase_path("//build/android/gyp/prepare_resources.py"),
-                      "--no-header",
-                      "--gn-paths",
-                      "--root",
-                      rebase_path("//", root_build_dir),
-                    ],
-                    "list lines")
-  }
-
   # This template is used to parse a set of resource directories and
   # create the R.txt, .srcjar and .resources.zip for it.
   #
@@ -1558,7 +1532,7 @@
     if (defined(invoker.srcjar_path)) {
       _srcjar_path = invoker.srcjar_path
     }
-    action(target_name) {
+    action_with_pydeps(target_name) {
       set_sources_assignment_filter([])
       forward_variables_from(invoker,
                              [
@@ -1599,9 +1573,6 @@
         invoker.build_config,
         _android_aapt_path,
       ]
-      if (compute_inputs_for_analyze) {
-        inputs += _prepare_resources_py
-      }
 
       _rebased_all_resource_dirs =
           rebase_path(_all_resource_dirs, root_build_dir)
@@ -1686,19 +1657,6 @@
     }
   }
 
-  if (compute_inputs_for_analyze) {
-    _compile_resources_py =
-        exec_script("//build/print_python_deps.py",
-                    [
-                      rebase_path("//build/android/gyp/compile_resources.py"),
-                      "--no-header",
-                      "--gn-paths",
-                      "--root",
-                      rebase_path("//", root_build_dir),
-                    ],
-                    "list lines")
-  }
-
   # A template that is used to compile all resources needed by a binary
   # (e.g. an android_apk or a junit_binary) into an intermediate .ar_
   # archive. It can also generate an associated .srcjar that contains the
@@ -1801,7 +1759,7 @@
     #       _2.d for the optional processed compiled resources.
     #       _3.d for the proto-compiled resources.
 
-    action(_compile_resources_target_name) {
+    action_with_pydeps(_compile_resources_target_name) {
       set_sources_assignment_filter([])
       forward_variables_from(invoker,
                              [
@@ -1824,9 +1782,6 @@
         invoker.build_config,
         _android_aapt_path,
       ]
-      if (compute_inputs_for_analyze) {
-        inputs += _compile_resources_py
-      }
 
       _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
 
@@ -2048,17 +2003,16 @@
     _output = invoker.output
     _build_config = invoker.apk_build_config
     _rebased_build_config = rebase_path(_build_config, root_build_dir)
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "testonly",
                                "deps",
                              ])
       script = "//build/android/gyp/merge_jar_info_files.py"
-      inputs = build_utils_py + [
-                 _build_config,
-                 "//build/android/gyp/util/jar_info_utils.py",
-               ]
+      inputs = [
+        _build_config,
+      ]
       outputs = [
         _output,
       ]
@@ -2104,7 +2058,7 @@
   #   uncompress_shared_libraries: (optional, default false) Whether to store
   #     native libraries inside the APK uncompressed and page-aligned.
   template("package_apk") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -2129,8 +2083,7 @@
         "//tools/android/md5sum",
       ]  # Used when deploying APKs
 
-      inputs = build_utils_py + invoker.native_libs + [
-                 "//build/android/gyp/finalize_apk.py",
+      inputs = invoker.native_libs + [
                  invoker.keystore_path,
                  invoker.packaged_resources_path,
                  _apksigner,
@@ -2332,16 +2285,14 @@
       _rebased_build_config =
           rebase_path(invoker.assets_build_config, root_build_dir)
 
-      action(_incremental_compile_resources_target_name) {
+      action_with_pydeps(_incremental_compile_resources_target_name) {
         deps = _incremental_deps
         script =
             "//build/android/incremental_install/generate_android_manifest.py"
-        inputs = build_utils_py + [
-                   # Save on a depfile by listing only .py dep here.
-                   "//build/android/gyp/util/build_utils.py",
-                   _android_manifest,
-                   invoker.packaged_resources_path,
-                 ]
+        inputs = [
+          _android_manifest,
+          invoker.packaged_resources_path,
+        ]
         outputs = [
           # Output the non-compiled manifest for easy debugging (as opposed to
           # generating to a temp file).
@@ -2406,18 +2357,6 @@
     }
   }
 
-  if (compute_inputs_for_analyze) {
-    _javac_py = exec_script("//build/print_python_deps.py",
-                            [
-                              rebase_path("//build/android/gyp/javac.py"),
-                              "--no-header",
-                              "--gn-paths",
-                              "--root",
-                              rebase_path("//", root_build_dir),
-                            ],
-                            "list lines")
-  }
-
   # Compile Java source files into a .jar file, potentially using an
   # annotation processor, and/or the errorprone compiler.
   #
@@ -2526,7 +2465,7 @@
       _javac_args = invoker.javac_args
     }
 
-    action(target_name) {
+    action_with_pydeps(target_name) {
       script = "//build/android/gyp/javac.py"
       depfile = "$target_gen_dir/$target_name.d"
       deps = _srcjar_deps
@@ -2543,9 +2482,6 @@
       if (invoker.java_files != []) {
         inputs += [ invoker.java_sources_file ]
       }
-      if (compute_inputs_for_analyze) {
-        inputs += _javac_py
-      }
 
       _rebased_build_config = rebase_path(_build_config, root_build_dir)
       _rebased_javac_jar_path =
@@ -2618,7 +2554,7 @@
   #   output_jar: Path to output .ijar.
   #
   template("generate_interface_jar") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       _ijar_target = "//third_party/ijar:ijar($host_toolchain)"
       _ijar_executable = get_label_info(_ijar_target, "root_out_dir") + "/ijar"
       forward_variables_from(invoker,
@@ -2636,10 +2572,10 @@
       if (defined(invoker.deps)) {
         deps += invoker.deps
       }
-      inputs = build_utils_py + [
-                 invoker.input_jar,
-                 _ijar_executable,
-               ]
+      inputs = [
+        invoker.input_jar,
+        _ijar_executable,
+      ]
       if (defined(invoker.inputs)) {
         inputs += invoker.inputs
       }
@@ -3274,7 +3210,7 @@
   _build_config = invoker.build_config
   _rebased_build_config = rebase_path(_build_config, root_build_dir)
 
-  action(target_name) {
+  action_with_pydeps(target_name) {
     forward_variables_from(invoker,
                            [
                              "testonly",
@@ -3291,7 +3227,9 @@
     #       dependencies like extra native libraries are all pulled from the
     #       .build_config through @FileArg() references (see below) and
     #       will be listed in the generated depfile instead.
-    inputs = build_utils_py + [ _build_config ]
+    inputs = [
+      _build_config,
+    ]
     outputs = [
       invoker.module_zip_path,
     ]
@@ -3337,10 +3275,9 @@
 template("generate_proguarded_module_jar") {
   _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
 
-  action(target_name) {
+  action_with_pydeps(target_name) {
     forward_variables_from(invoker, [ "deps" ])
     script = "//build/android/gyp/generate_proguarded_module_jar.py"
-    inputs = build_utils_py
     outputs = [
       invoker.output_jar,
     ]
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index cfec1fb..63f5e24 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -8,8 +8,8 @@
 import("//build/config/android/internal_rules.gni")
 import("//build/config/clang/clang.gni")
 import("//build/config/compiler/compiler.gni")
-import("//build/config/compute_inputs_for_analyze.gni")
 import("//build/config/dcheck_always_on.gni")
+import("//build/config/python.gni")
 import("//build/config/zip.gni")
 import("//build/toolchain/toolchain.gni")
 
@@ -76,7 +76,7 @@
   _find_deps_target_name = "${target_name}__find_library_dependencies"
 
   # TODO(agrieve): Extract dependent libs from GN rather than readelf.
-  action(_find_deps_target_name) {
+  action_with_pydeps(_find_deps_target_name) {
     deps = invoker.deps + [ ":$_runtime_deps_target_name" ]
     script = "//build/android/gyp/write_ordered_libraries.py"
     depfile = "$target_gen_dir/$target_name.d"
@@ -157,7 +157,7 @@
 #     target = "//pkg/foo.py"
 #   }
 template("wrapper_script") {
-  action(target_name) {
+  action_with_pydeps(target_name) {
     _name = get_path_info(invoker.target, "name")
     _output = "$root_out_dir/bin/$_name"
 
@@ -233,17 +233,14 @@
     }
 
     _foreach_target_name = "${target_name}__jni_gen"
-    action_foreach(_foreach_target_name) {
+    action_foreach_with_pydeps(_foreach_target_name) {
       script = "//base/android/jni_generator/jni_generator.py"
-      depfile = "$target_gen_dir/$target_name.{{source_name_part}}.d"
       sources = invoker.sources
       outputs = [
         "${_jni_output_dir}/{{source_name_part}}_jni.h",
       ]
 
       args = [
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
         "--input_file={{source}}",
         "--ptr_type=long",
         "--output_dir",
@@ -338,10 +335,9 @@
       _classname = get_path_info(_class, "name")
       _jni_target_name = "${target_name}__jni_${_classname}"
       _jni_actions += [ ":$_jni_target_name" ]
-      action(_jni_target_name) {
+      action_with_pydeps(_jni_target_name) {
         # The sources aren't compiled so don't check their dependencies.
         check_includes = false
-        depfile = "$target_gen_dir/$target_name.d"
         script = "//base/android/jni_generator/jni_generator.py"
         inputs = [
           _jar_file,
@@ -351,8 +347,6 @@
         ]
 
         args = [
-          "--depfile",
-          rebase_path(depfile, root_build_dir),
           "--jar_file",
           rebase_path(_jar_file, root_build_dir),
           "--input_file",
@@ -413,7 +407,7 @@
   #     ]
   #   }
   template("generate_jni_registration") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker, [ "testonly" ])
       _build_config = get_label_info(invoker.target, "target_gen_dir") + "/" +
                       get_label_info(invoker.target, "name") + ".build_config"
@@ -494,7 +488,7 @@
     _base_gen_dir = "${target_gen_dir}/${target_name}/java_cpp_template"
     _package_path = invoker.package_path
 
-    action_foreach(_apply_gcc_target_name) {
+    action_foreach_with_pydeps(_apply_gcc_target_name) {
       forward_variables_from(invoker,
                              [
                                "deps",
@@ -568,7 +562,7 @@
   #   }
   template("java_cpp_enum") {
     set_sources_assignment_filter([])
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "sources",
@@ -596,19 +590,6 @@
     }
   }
 
-  if (compute_inputs_for_analyze) {
-    _jinja_template_pydeps =
-        exec_script("//build/print_python_deps.py",
-                    [
-                      rebase_path("//build/android/gyp/jinja_template.py"),
-                      "--no-header",
-                      "--gn-paths",
-                      "--root",
-                      rebase_path("//", root_build_dir),
-                    ],
-                    "list lines")
-  }
-
   # Declare a target for processing a Jinja template.
   #
   # Variables
@@ -624,26 +605,20 @@
   #     output = "$target_gen_dir/AndroidManifest.xml"
   #   }
   template("jinja_template") {
-    forward_variables_from(invoker, [ "testonly" ])
-
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker,
                              [
                                "visibility",
                                "deps",
+                               "testonly",
                              ])
-
       inputs = [
         invoker.input,
       ]
       if (defined(invoker.includes)) {
         inputs += invoker.includes
       }
-      if (compute_inputs_for_analyze) {
-        inputs += _jinja_template_pydeps
-      }
       script = "//build/android/gyp/jinja_template.py"
-      depfile = "$target_gen_dir/$target_name.d"
 
       outputs = [
         invoker.output,
@@ -656,8 +631,7 @@
         rebase_path(invoker.input, root_build_dir),
         "--output",
         rebase_path(invoker.output, root_build_dir),
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
+        "--check-includes",
       ]
       if (defined(invoker.includes)) {
         _rebased_includes = rebase_path(invoker.includes, root_build_dir)
@@ -753,8 +727,6 @@
   #     variables = ["color=red"]
   #   }
   template("jinja_template_resources") {
-    forward_variables_from(invoker, [ "testonly" ])
-
     # JUnit tests use resource zip files. These must not be put in gen/
     # directory or they will not be available to tester bots.
     _resources_zip_rebased_path = rebase_path(target_gen_dir, root_gen_dir)
@@ -762,11 +734,14 @@
 
     _generating_target_name = "${target_name}__template"
 
-    action(_generating_target_name) {
-      forward_variables_from(invoker, [ "deps" ])
+    action_with_pydeps(_generating_target_name) {
+      forward_variables_from(invoker,
+                             [
+                               "deps",
+                               "testonly",
+                             ])
       inputs = invoker.resources
       script = "//build/android/gyp/jinja_template.py"
-      depfile = "$target_gen_dir/$target_name.d"
 
       outputs = [
         _resources_zip,
@@ -779,8 +754,7 @@
         rebase_path(invoker.res_dir, root_build_dir),
         "--outputs-zip",
         rebase_path(_resources_zip, root_build_dir),
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
+        "--check-includes",
       ]
       if (defined(invoker.variables)) {
         variables = invoker.variables
@@ -789,7 +763,11 @@
     }
 
     android_generated_resources(target_name) {
-      forward_variables_from(invoker, [ "deps" ])
+      forward_variables_from(invoker,
+                             [
+                               "deps",
+                               "testonly",
+                             ])
       generating_target_name = ":$_generating_target_name"
       generated_resources_zip = _resources_zip
     }
@@ -1255,13 +1233,22 @@
       _deps += invoker.deps
     }
 
+    # a package name or a manifest is required to have resources. This is
+    # added so that junit tests that do not care about the package name can
+    # still use resources without having to explicitly set one.
+    if (defined(invoker.package_name)) {
+      _package_name = invoker.package_name
+    } else if (!defined(invoker.android_manifest_path)) {
+      _package_name = "org.chromium.test"
+    }
+
     _prepare_resources_target = "${target_name}__prepare_resources"
     prepare_resources(_prepare_resources_target) {
       deps = _deps + [ ":$_build_config_target_name" ]
       build_config = _build_config
       srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
-      if (defined(invoker.package_name)) {
-        custom_package = invoker.package_name
+      if (defined(_package_name)) {
+        custom_package = _package_name
       }
       if (defined(invoker.android_manifest_path)) {
         android_manifest = invoker.android_manifest_path
@@ -1301,11 +1288,10 @@
       test_suite = invoker.target_name
       test_type = "junit"
       ignore_all_data_deps = true
-      forward_variables_from(invoker,
-                             [
-                               "android_manifest_path",
-                               "package_name",
-                             ])
+      forward_variables_from(invoker, [ "android_manifest_path" ])
+      if (defined(_package_name)) {
+        package_name = _package_name
+      }
     }
 
     group(target_name) {
@@ -1537,7 +1523,7 @@
         }
       }
     } else {
-      action(_jar_target_name) {
+      action_with_pydeps(_jar_target_name) {
         forward_variables_from(invoker, [ "data" ])
         script = "//build/android/gyp/create_dist_jar.py"
         depfile = "$target_gen_dir/$target_name.d"
@@ -1645,7 +1631,7 @@
 
     _rebased_build_config = rebase_path(_build_config, root_build_dir)
 
-    action(target_name) {
+    action_with_pydeps(target_name) {
       forward_variables_from(invoker, [ "data" ])
       depfile = "$target_gen_dir/$target_name.d"
       deps = _deps
@@ -2148,13 +2134,6 @@
       version_code = _version_code
       version_name = _version_name
 
-      # Subtle: required to avoid GN build errors. "testonly" cannot be added
-      # to the forward_variables_from() above because it was already forwarded
-      # at the start of android_apk(). And if the assignment below is not
-      # performed, GN will complain that some test-only targets depend
-      # on non-test-only ones.
-      testonly = defined(testonly) && testonly
-
       if (defined(invoker.post_process_package_resources_script)) {
         post_process_script = invoker.post_process_package_resources_script
       }
@@ -2203,7 +2182,7 @@
 
       # TODO(agrieve): Make GN write runtime deps in dependency order so as to
       # not need this manual sorting step.
-      action(_ordered_libraries_target) {
+      action_with_pydeps(_ordered_libraries_target) {
         script = "//build/android/gyp/write_ordered_libraries.py"
         deps = [
           ":$_build_config_target",
@@ -2620,9 +2599,8 @@
     }
 
     _write_installer_json_rule_name = "${_template_name}__incremental_json"
-    action(_write_installer_json_rule_name) {
+    action_with_pydeps(_write_installer_json_rule_name) {
       script = "//build/android/incremental_install/write_installer_json.py"
-      depfile = "$target_gen_dir/$target_name.d"
       deps = [
         _native_libs_file_arg_dep,
       ]
@@ -2635,14 +2613,12 @@
           rebase_path(_final_apk_path_no_ext, root_build_dir)
       _rebased_incremental_install_json_path =
           rebase_path(_incremental_install_json_path, root_build_dir)
-      _rebased_depfile = rebase_path(depfile, root_build_dir)
       _dex_arg_key = "${_rebased_build_config}:final_dex:dependency_dex_files"
       args = [
         "--apk-path=${_rebased_apk_path_no_ext}_incremental.apk",
         "--output-path=$_rebased_incremental_install_json_path",
         "--dex-file=$_rebased_lib_dex_path",
         "--dex-file-list=@FileArg($_dex_arg_key)",
-        "--depfile=$_rebased_depfile",
       ]
       if (_proguard_enabled) {
         args += [ "--show-proguard-warning" ]
@@ -2668,7 +2644,7 @@
     # Generate apk operation related script.
     if (!defined(invoker.create_apk_script) || invoker.create_apk_script) {
       _apk_operations_target_name = "${target_name}__apk_operations"
-      action(_apk_operations_target_name) {
+      action_with_pydeps(_apk_operations_target_name) {
         _generated_script = "$root_build_dir/bin/${invoker.target_name}"
         script = "//build/android/gyp/create_apk_operations_script.py"
         outputs = [
@@ -3243,7 +3219,7 @@
   #     ]
   #   }
   template("android_aidl") {
-    action(target_name) {
+    action_with_pydeps(target_name) {
       set_sources_assignment_filter([])
       forward_variables_from(invoker, [ "testonly" ])
 
@@ -3261,14 +3237,11 @@
 
       inputs = [ _aidl_path ] + _imports
 
-      depfile = "${target_gen_dir}/${target_name}.d"
       outputs = [
         _srcjar_path,
       ]
       _rebased_imports = rebase_path(_imports, root_build_dir)
       args = [
-        "--depfile",
-        rebase_path(depfile, root_build_dir),
         "--aidl-path",
         rebase_path(_aidl_path, root_build_dir),
         "--imports=$_rebased_imports",
@@ -3341,7 +3314,7 @@
     _proto_path = invoker.proto_path
     _template_name = target_name
 
-    action("${_template_name}__protoc_java") {
+    action_with_pydeps("${_template_name}__protoc_java") {
       _srcjar_path = "$target_gen_dir/$target_name.srcjar"
       script = "//build/protoc_java.py"
 
@@ -3454,7 +3427,7 @@
                " Use ignore_native_libraries = true to silence this error.")
     assert(_scanned_files.has_classes_jar || _scanned_files.subjars == [])
 
-    action(_unpack_target_name) {
+    action_with_pydeps(_unpack_target_name) {
       script = "//build/android/gyp/aar.py"  # Unzips the AAR
       args = [
         "extract",
@@ -3855,18 +3828,10 @@
       _bundle_keystore_name = _keystore_name
     }
 
-    # NOTE: Keep this consistent with the imports of create_app_bundle.py
-    _create_app_bundle_py_imports =
-        build_utils_py + [
-          "//build/android/gyp/util/resource_utils.py",
-          "//build/android/gyp/bundletool.py",
-        ]
-
     _bundle_target_name = "${target_name}__bundle"
-    action(_bundle_target_name) {
+    action_with_pydeps(_bundle_target_name) {
       script = "//build/android/gyp/create_app_bundle.py"
-      inputs = _all_module_zip_paths + _all_module_build_configs +
-               _create_app_bundle_py_imports
+      inputs = _all_module_zip_paths + _all_module_build_configs
       outputs = [
         _bundle_path,
       ]
@@ -3912,12 +3877,12 @@
     _rebased_base_module_build_config =
         rebase_path(_base_module_build_config, root_build_dir)
 
-    action("${target_name}__wrapper_script") {
+    action_with_pydeps("${target_name}__wrapper_script") {
       script = "//build/android/gyp/create_bundle_wrapper_script.py"
-      inputs = build_utils_py + [
-                 "//build/android/gyp/bundletool.py",
-                 _base_module_build_config,
-               ]
+      inputs = [
+        "//build/android/gyp/bundletool.py",
+        _base_module_build_config,
+      ]
       outputs = [
         _bundle_wrapper_script_path,
       ]
diff --git a/build/config/chromeos/rules.gni b/build/config/chromeos/rules.gni
index eae196e..28b03c8a 100644
--- a/build/config/chromeos/rules.gni
+++ b/build/config/chromeos/rules.gni
@@ -9,6 +9,12 @@
   cros_sdk_version = ""
 }
 
+# Creates a script at $generated_script that can be used to launch a cros VM
+# and optionally run a test within it.
+# Args:
+#   generated_script: Path to place the generated script.
+#   deploy_chrome: If true, deploys a locally built chrome located in the root
+#                  build dir to the VM after launching it.
 template("generate_vm_runner_script") {
   _cache_path_prefix =
       "//build/cros_cache/chrome-sdk/tarballs/${cros_board}+${cros_sdk_version}"
@@ -64,8 +70,14 @@
       rebase_path("//build/cros_cache/", root_build_dir),
       "--board",
       cros_board,
+      "--output-directory",
+      rebase_path(root_out_dir, root_build_dir),
     ]
 
+    if (defined(invoker.deploy_chrome) && invoker.deploy_chrome) {
+      args += [ "--deploy-chrome" ]
+    }
+
     # When --test-exe is specified, run_vm_test will push the exe to the VM and
     # execute it. Otherwise it wraps a host-side command and just takes care
     # launching & tearing-down the VM.
@@ -73,8 +85,6 @@
       args += [
         "--test-exe",
         rebase_path(invoker.test_exe, root_build_dir),
-        "--output-directory",
-        rebase_path(root_out_dir, root_build_dir),
       ]
       if (defined(invoker.runtime_deps_file)) {
         args += [
diff --git a/build/config/python.gni b/build/config/python.gni
index e24025f6..4e71e87 100644
--- a/build/config/python.gni
+++ b/build/config/python.gni
@@ -59,3 +59,108 @@
     }
   }
 }
+
+# A template used for actions that execute a Python script, which has an
+# associated .pydeps file. In other words:
+#
+# - This is very similar to just an action(), except that |script| must point
+#   to a Python script (e.g. "//build/.../foo.py") that has a corresponding
+#   .pydeps file in the source tree (e.g. "//build/.../foo.pydeps").
+#
+# - The .pydeps file contains a list of python dependencies (imports really)
+#   and is generated _manually_ by using a command like:
+#
+#     build/print_python_deps.py --inplace build/android/gyp/foo.py
+#
+template("action_with_pydeps") {
+  # Read the .pydeps file now. Note that this is done everytime this
+  # template is called, but benchmarking doesn't show any impact on overall
+  # 'gn gen' speed anyway.
+  _pydeps_file = invoker.script + "deps"
+  _pydeps_raw = read_file(_pydeps_file, "list lines")
+
+  # Filter out comments.
+  # This is a bit convoluted to preserve the value of sources if defined.
+  _old_sources = []
+  if (defined(sources)) {
+    _old_sources = sources
+  }
+  set_sources_assignment_filter([ "#*" ])
+  sources = _pydeps_raw
+  _pydeps = sources
+  set_sources_assignment_filter([])
+  sources = _old_sources
+
+  action(target_name) {
+    # Forward all variables. Ensure that testonly and visibility are forwarded
+    # explicitly, since this performs recursive scope lookups, which is
+    # required to ensure their definition from scopes above the caller are
+    # properly handled. All other variables are forwarded with "*", which
+    # doesn't perform recursive lookups at all. See https://crbug.com/862232
+    forward_variables_from(invoker,
+                           [
+                             "testonly",
+                             "visibility",
+                           ])
+    forward_variables_from(invoker,
+                           "*",
+                           [
+                             "testonly",
+                             "visibility",
+                           ])
+
+    if (!defined(inputs)) {
+      inputs = []
+    }
+
+    # Dependencies are listed relative to the script directory, but inputs
+    # expects paths that are relative to the current BUILD.gn
+    _script_dir = get_path_info(script, "dir")
+    inputs += rebase_path(_pydeps, ".", _script_dir)
+  }
+}
+
+template("action_foreach_with_pydeps") {
+  _pydeps_file = invoker.script + "deps"
+  _pydeps_raw = read_file(_pydeps_file, "list lines")
+
+  # Filter out comments.
+  # This is a bit convoluted to preserve the value of sources if defined.
+  _old_sources = []
+  if (defined(sources)) {
+    _old_sources = sources
+  }
+  set_sources_assignment_filter([ "#*" ])
+  sources = _pydeps_raw
+  _pydeps = sources
+  set_sources_assignment_filter([])
+  sources = _old_sources
+
+  action_foreach(target_name) {
+    # Forward all variables. Ensure that testonly and visibility are forwarded
+    # explicitly, since this performs recursive scope lookups, which is
+    # required to ensure their definition from scopes above the caller are
+    # properly handled. All other variables are forwarded with "*", which
+    # doesn't perform recursive lookups at all. See https://crbug.com/862232
+    forward_variables_from(invoker,
+                           [
+                             "testonly",
+                             "visibility",
+                           ])
+    forward_variables_from(invoker,
+                           "*",
+                           [
+                             "testonly",
+                             "visibility",
+                           ])
+
+    if (!defined(inputs)) {
+      inputs = []
+    }
+
+    # Dependencies are listed relative to the script directory, but inputs
+    # expects paths that are relative to the current BUILD.gn
+    _script_dir = get_path_info(script, "dir")
+    inputs += rebase_path(_pydeps, ".", _script_dir)
+  }
+}
diff --git a/build/fuchsia/common_args.py b/build/fuchsia/common_args.py
index 25e909f4..e6366a6 100644
--- a/build/fuchsia/common_args.py
+++ b/build/fuchsia/common_args.py
@@ -44,6 +44,8 @@
   common_args.add_argument('--ssh-config', '-F',
                            help='The path to the SSH configuration used for '
                                 'connecting to the target device.')
+  common_args.add_argument('--system-log-file',
+                           help='File to write system logs to.')
   common_args.add_argument('--exclude-system-logs',
                            action='store_false',
                            dest='include_system_logs',
@@ -75,7 +77,8 @@
   command line arguments."""
 
   if not args.device:
-    return QemuTarget(args.output_directory, args.target_cpu)
+    return QemuTarget(args.output_directory, args.target_cpu,
+                      args.system_log_file)
   else:
-    return DeviceTarget(args.output_directory, args.target_cpu,
-                        args.host, args.port, args.ssh_config)
+    return DeviceTarget(args.output_directory, args.target_cpu, args.host,
+                        args.port, args.ssh_config, args.system_log_file)
diff --git a/build/fuchsia/device_target.py b/build/fuchsia/device_target.py
index acef61b..91e845f7 100644
--- a/build/fuchsia/device_target.py
+++ b/build/fuchsia/device_target.py
@@ -5,7 +5,6 @@
 """Implements commands for running and interacting with Fuchsia on devices."""
 
 import boot_data
-import log_reader
 import logging
 import os
 import subprocess
@@ -24,7 +23,7 @@
 
 class DeviceTarget(target.Target):
   def __init__(self, output_dir, target_cpu, host=None, port=None,
-               ssh_config=None):
+               ssh_config=None, system_log_file=None):
     """output_dir: The directory which will contain the files that are
                    generated to support the deployment.
     target_cpu: The CPU architecture of the deployment target. Can be
@@ -38,6 +37,8 @@
     self._port = 22
     self._auto = not host or not ssh_config
     self._new_instance = True
+    self._system_log_file = system_log_file
+    self._loglistener = None
 
     if self._auto:
       self._ssh_config_path = EnsurePathExists(
@@ -49,6 +50,10 @@
         self._port = port
       self._new_instance = False
 
+  def __exit__(self, exc_type, exc_val, exc_tb):
+    if self._loglistener:
+      self._loglistener.kill()
+
   def __Discover(self, node_name):
     """Returns the IP address and port of a Fuchsia instance discovered on
     the local area network."""
@@ -98,20 +103,16 @@
       logging.debug(' '.join(bootserver_command))
       subprocess.check_call(bootserver_command)
 
-      # Setup loglistener. Logs will be redirected to stdout if the device takes
-      # longer than expected to boot.
-      loglistener_path = os.path.join(SDK_ROOT, 'tools', 'loglistener')
-      loglistener = subprocess.Popen([loglistener_path, node_name],
-                                     stdout=subprocess.PIPE,
-                                     stderr=subprocess.STDOUT,
-                                     stdin=open(os.devnull))
-      self._SetSystemLogsReader(
-          log_reader.LogReader(loglistener, loglistener.stdout))
+      # Start loglistener to save system logs.
+      if self._system_log_file:
+        loglistener_path = os.path.join(SDK_ROOT, 'tools', 'loglistener')
+        self._loglistener = subprocess.Popen(
+            [loglistener_path, node_name],
+            stdout=open(self._system_log_file, 'w'),
+            stderr=subprocess.STDOUT, stdin=open(os.devnull))
 
       logging.debug('Waiting for device to join network.')
       for retry in xrange(CONNECT_RETRY_COUNT):
-        if retry == CONNECT_RETRY_COUNT_BEFORE_LOGGING:
-          self._system_logs_reader.RedirectTo(sys.stdout);
         self._host = self.__Discover(node_name)
         if self._host:
           break
diff --git a/build/fuchsia/log_reader.py b/build/fuchsia/log_reader.py
deleted file mode 100644
index 667da85d..0000000
--- a/build/fuchsia/log_reader.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright 2018 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import multiprocessing
-import os
-import Queue
-import select
-import threading
-
-
-class LogReader(object):
-  """Helper class used to read a debug log stream on a background thread.
-  By default all log messages are stored in an internal buffer. After
-  RedirectTo() is called all logs are redirected to the specified stream.
-  Optionally the caller can give onwnership of the log process to the reader.
-  That process will be killed automatically when the log reader is closed.
-  """
-
-  def __init__(self, process, stream):
-    self._process = process
-    self._stream = stream
-    self._buffer = Queue.Queue()
-
-    # Start a background thread that redirects the stream to self._buffer.
-    self._StartThread(lambda line: self._buffer.put(line))
-
-  def _StartThread(self, on_message_received):
-    self._quit_pipe, thread_quit_pipe = multiprocessing.Pipe()
-
-    self._thread = threading.Thread(target=self._ReadThread,
-                                    args=(thread_quit_pipe,
-                                          on_message_received))
-    self._thread.daemon = True
-    self._thread.start()
-
-  def __enter__(self):
-    return self
-
-  def __exit__(self, exception_type, exception_value, traceback):
-    self.Close()
-
-  def __del__(self):
-    self.Close()
-
-  def _ReadThread(self, quit_pipe, on_message_received):
-    """Main function for the background thread that reads |self._stream| and
-    calls |on_message_received| for each line."""
-
-    poll = select.poll()
-    poll.register(self._stream.fileno(), select.POLLIN)
-    poll.register(quit_pipe.fileno(), select.POLLIN)
-
-    quit = False
-    while not quit:
-      events = poll.poll()
-      for fileno, event in events:
-        if fileno == quit_pipe.fileno():
-          quit = True
-          break
-
-        assert fileno == self._stream.fileno()
-        if event & select.POLLIN:
-          on_message_received(self._stream.readline())
-        elif event & select.POLLHUP:
-          quit = True
-
-  def _StopThread(self):
-    if self._thread:
-      try:
-        self._quit_pipe.send("quit")
-      except IOError:
-        # The thread has already quit and closed the other end of the pipe.
-        pass
-      self._thread.join();
-      self._thread = None
-
-  def Close(self):
-    self._StopThread()
-    if self._process:
-      self._process.kill()
-      self._process = None
-
-  def RedirectTo(self, stream):
-    self._StopThread()
-
-    # Drain and reset the buffer.
-    while True:
-      try:
-        line = self._buffer.get_nowait()
-        stream.write(line)
-      except Queue.Empty:
-        break
-
-    # Restart the thread to write stream to stdout.
-    self._StartThread(lambda line: stream.write(line))
diff --git a/build/fuchsia/qemu_target.py b/build/fuchsia/qemu_target.py
index 10a8e8d..c5211fe 100644
--- a/build/fuchsia/qemu_target.py
+++ b/build/fuchsia/qemu_target.py
@@ -5,7 +5,6 @@
 """Implements commands for running and interacting with Fuchsia on QEMU."""
 
 import boot_data
-import log_reader
 import logging
 import target
 import os
@@ -34,7 +33,7 @@
 
 
 class QemuTarget(target.Target):
-  def __init__(self, output_dir, target_cpu,
+  def __init__(self, output_dir, target_cpu, system_log_file,
                ram_size_mb=2048):
     """output_dir: The directory which will contain the files that are
                    generated to support the QEMU deployment.
@@ -43,6 +42,7 @@
     super(QemuTarget, self).__init__(output_dir, target_cpu)
     self._qemu_process = None
     self._ram_size_mb = ram_size_mb
+    self._system_log_file = system_log_file
 
   def __enter__(self):
     return self
@@ -138,13 +138,19 @@
     logging.debug('Launching QEMU.')
     logging.debug(' '.join(qemu_command))
 
-    # QEMU stderr/stdout are redirected to LogReader to debug
+    # Zircon sends debug logs to serial port (see kernel.serial=legacy flag
+    # above). Serial port is redirected to a file through QEMU stdout.
+    # This approach is used instead of loglistener to debug
     # https://crbug.com/86975 .
+    if self._system_log_file:
+      stdout = open(self._system_log_file, 'w')
+      stderr = subprocess.STDOUT
+    else:
+      stdout = open(os.devnull)
+      stderr = open(os.devnull)
+
     self._qemu_process = subprocess.Popen(qemu_command, stdin=open(os.devnull),
-                                          stdout=subprocess.PIPE,
-                                          stderr=subprocess.STDOUT)
-    self._SetSystemLogsReader(
-        log_reader.LogReader(None, self._qemu_process.stdout))
+                                          stdout=stdout, stderr=stderr)
     self._WaitUntilReady();
 
   def Shutdown(self):
diff --git a/build/fuchsia/target.py b/build/fuchsia/target.py
index 00c4451..36c1ee7 100644
--- a/build/fuchsia/target.py
+++ b/build/fuchsia/target.py
@@ -4,7 +4,6 @@
 
 import boot_data
 import common
-import log_reader
 import logging
 import remote_cmd
 import sys
@@ -29,7 +28,6 @@
     self._started = False
     self._dry_run = False
     self._target_cpu = target_cpu
-    self._system_logs_reader = None
 
   # Functions used by the Python context manager for teardown.
   def __enter__(self):
@@ -145,32 +143,17 @@
   def _AssertIsStarted(self):
     assert self.IsStarted()
 
-  def _SetSystemLogsReader(self, reader):
-    if self._system_logs_reader:
-      _system_logs_reader.Close()
-    self._system_logs_reader = reader
-
   def _WaitUntilReady(self, retries=_ATTACH_MAX_RETRIES):
     logging.info('Connecting to Fuchsia using SSH.')
 
-    try:
-      for retry in xrange(retries + 1):
-        if retry == 2 and self._system_logs_reader:
-          # Log system logs after 2 failed SSH connection attempt.
-          self._system_logs_reader.RedirectTo(sys.stdout);
-
-        host, port = self._GetEndpoint()
-        if remote_cmd.RunSsh(self._GetSshConfigPath(), host, port, ['true'],
-                             True) == 0:
-          logging.info('Connected!')
-          self._started = True
-          return True
-        time.sleep(_ATTACH_RETRY_INTERVAL)
-    finally:
-      # Redirect logs to /dev/null. run_package.py will use SSH+dlog to get
-      # logs from the machine to console.
-      if self._system_logs_reader:
-        self._system_logs_reader.RedirectTo(open('/dev/null', 'w'));
+    for retry in xrange(retries + 1):
+      host, port = self._GetEndpoint()
+      if remote_cmd.RunSsh(self._GetSshConfigPath(), host, port, ['true'],
+                           True) == 0:
+        logging.info('Connected!')
+        self._started = True
+        return True
+      time.sleep(_ATTACH_RETRY_INTERVAL)
 
     logging.error('Timeout limit reached.')
 
diff --git a/build/print_python_deps.py b/build/print_python_deps.py
index 2459a28e..8ded01e 100755
--- a/build/print_python_deps.py
+++ b/build/print_python_deps.py
@@ -78,6 +78,10 @@
                       help='Directory to make paths relative to.')
   parser.add_argument('--output',
                       help='Write output to a file rather than stdout.')
+  parser.add_argument('--inplace', action='store_true',
+                      help='Write output to a file with the same path as the '
+                      'module, but with a .pydeps extension. Also sets the '
+                      'root to the module\'s directory.')
   parser.add_argument('--no-header', action='store_true',
                       help='Do not write the "# Generated by" header.')
   parser.add_argument('--gn-paths', action='store_true',
@@ -92,6 +96,14 @@
   sys.path[0] = os.path.dirname(options.module)
   imp.load_source('NAME', options.module)
 
+  if options.inplace:
+    if options.output:
+      parser.error('Cannot use --inplace and --output at the same time!')
+    if not options.module.endswith('.py'):
+      parser.error('Input module path should end with .py suffix!')
+    options.output = options.module + 'deps'
+    options.root = os.path.dirname(options.module)
+
   paths_set = _ComputePythonDependencies()
   for path in options.whitelists:
     paths_set.update(os.path.abspath(p) for p in _FindPythonInDirectory(path))
diff --git a/build/protoc_java.py b/build/protoc_java.py
index 2addb82..5227bf9 100755
--- a/build/protoc_java.py
+++ b/build/protoc_java.py
@@ -76,7 +76,8 @@
   if options.depfile:
     assert options.srcjar
     deps = args + [options.protoc]
-    build_utils.WriteDepfile(options.depfile, options.srcjar, deps)
+    build_utils.WriteDepfile(options.depfile, options.srcjar, deps,
+                             add_pydeps=False)
 
   if options.stamp:
     build_utils.Touch(options.stamp)
diff --git a/build/protoc_java.pydeps b/build/protoc_java.pydeps
new file mode 100644
index 0000000..a26622b
--- /dev/null
+++ b/build/protoc_java.pydeps
@@ -0,0 +1,7 @@
+# Generated by running:
+#   build/print_python_deps.py --root build --output build/protoc_java.pydeps build/protoc_java.py
+android/gyp/util/__init__.py
+android/gyp/util/build_utils.py
+android/gyp/util/md5_check.py
+gn_helpers.py
+protoc_java.py
diff --git a/cc/raster/zero_copy_raster_buffer_provider.cc b/cc/raster/zero_copy_raster_buffer_provider.cc
index e893694e..037e8a36 100644
--- a/cc/raster/zero_copy_raster_buffer_provider.cc
+++ b/cc/raster/zero_copy_raster_buffer_provider.cc
@@ -128,7 +128,9 @@
       // If GpuMemoryBuffer allocation failed (https://crbug.com/554541), then
       // we don't have anything to give to the display compositor, but also no
       // way to report an error, so we just make a texture but don't bind
-      // anything to it..
+      // anything to it. Many blink layout tests on macOS fail to have no
+      // |gpu_memory_buffer_| here, so any error reporting will spam console
+      // logs (https://crbug.com/871031).
       if (gpu_memory_buffer_) {
         backing_->image_id = gl->CreateImageCHROMIUM(
             gpu_memory_buffer_->AsClientBuffer(), resource_size_.width(),
@@ -141,7 +143,7 @@
                                     backing_->image_id);
       gl->BindTexImage2DCHROMIUM(backing_->texture_target, backing_->image_id);
     }
-    if (resource_color_space_.IsValid()) {
+    if (backing_->image_id && resource_color_space_.IsValid()) {
       gl->SetColorSpaceMetadataCHROMIUM(
           backing_->texture_id,
           reinterpret_cast<GLColorSpace>(&resource_color_space_));
diff --git a/cc/tiles/image_controller.cc b/cc/tiles/image_controller.cc
index 258ad83..99e977f 100644
--- a/cc/tiles/image_controller.cc
+++ b/cc/tiles/image_controller.cc
@@ -5,8 +5,8 @@
 #include "cc/tiles/image_controller.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/trace_event/trace_event.h"
 #include "cc/base/completion_event.h"
diff --git a/chrome/VERSION b/chrome/VERSION
index 76141e31..04c5e8f 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=70
 MINOR=0
-BUILD=3512
+BUILD=3516
 PATCH=0
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 97d0312..824e61d 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -548,7 +548,7 @@
             android:exported="false">
         </activity>
         <activity android:name="org.chromium.chrome.browser.preferences.website.ManageSpaceActivity"
-            android:theme="@style/PreferencesTheme"
+            android:theme="@style/ManageSpaceTheme"
             android:configChanges="orientation|keyboardHidden|keyboard|screenSize|mcc|mnc|screenLayout|smallestScreenSize"
             android:label="@string/storage_management_activity_label"
             android:exported="false">
diff --git a/chrome/android/java/res/PRESUBMIT.py b/chrome/android/java/res/PRESUBMIT.py
index 7f7e7bf..2a5f3a7 100644
--- a/chrome/android/java/res/PRESUBMIT.py
+++ b/chrome/android/java/res/PRESUBMIT.py
@@ -11,20 +11,26 @@
   - Colors are defined as RRGGBB or AARRGGBB
   - No (A)RGB values are referenced outside colors.xml
   - No duplicate (A)RGB values are referenced in colors.xml
+  - XML namspace "app" is used for "http://schemas.android.com/apk/res-auto"
+  - Android text attributes are only defined in text appearance styles
 """
 
 from collections import defaultdict
 import re
+import xml.etree.ElementTree as ET
 
 COLOR_PATTERN = re.compile(r'(>|")(#[0-9A-Fa-f]+)(<|")')
 VALID_COLOR_PATTERN = re.compile(
     r'^#([0-9A-F][0-9A-E]|[0-9A-E][0-9A-F])?[0-9A-F]{6}$')
 XML_APP_NAMESPACE_PATTERN = re.compile(
     r'xmlns:(\w+)="http://schemas.android.com/apk/res-auto"')
+TEXT_APPEARANCE_STYLE_PATTERN = re.compile(r'^TextAppearance\.')
 
 
 def CheckChangeOnUpload(input_api, output_api):
-  return _CommonChecks(input_api, output_api)
+  result = _CommonChecks(input_api, output_api)
+  result.extend(_CheckNewTextAppearance(input_api, output_api))
+  return result
 
 
 def CheckChangeOnCommit(input_api, output_api):
@@ -38,6 +44,7 @@
   result.extend(_CheckColorReferences(input_api, output_api))
   result.extend(_CheckDuplicateColors(input_api, output_api))
   result.extend(_CheckXmlNamespacePrefixes(input_api, output_api))
+  result.extend(_CheckTextAppearance(input_api, output_api))
   # Add more checks here
   return result
 
@@ -167,3 +174,106 @@
   ''',
         errors)]
   return []
+
+
+def _CheckTextAppearance(input_api, output_api):
+  """Checks text attributes are only used for text appearance styles in XMLs."""
+  text_attributes = [
+      'android:textColor', 'android:textSize', 'android:textStyle',
+      'android:fontFamily', 'android:textAllCaps']
+  namespace = {'android': 'http://schemas.android.com/apk/res/android'}
+  errors = []
+  for f in input_api.AffectedFiles(include_deletes=False):
+    if not f.LocalPath().endswith('.xml'):
+      continue
+    root = ET.fromstring(input_api.ReadFile(f))
+    # Check if there are text attributes defined outside text appearances.
+    for attribute in text_attributes:
+      # Get style name that contains text attributes but is not text appearance.
+      invalid_styles = []
+      for style in root.findall('style') + root.findall('.//style'):
+        name = style.get('name')
+        is_text_appearance = TEXT_APPEARANCE_STYLE_PATTERN.search(name)
+        item = style.find(".//item[@name='"+attribute+"']")
+        if is_text_appearance is None and item is not None:
+          invalid_styles.append(name)
+      # Append error messages.
+      contents = input_api.ReadFile(f)
+      style_count = 0
+      widget_count = len(root.findall('[@'+attribute+']', namespace)) + len(
+          root.findall('.//*[@'+attribute+']', namespace))
+      for line_number, line in enumerate(contents.splitlines(False)):
+        # Error for text attributes in non-text-appearance style.
+        if (style_count < len(invalid_styles) and
+            invalid_styles[style_count] in line):
+          errors.append('  %s:%d contains attribute %s\n    \t%s' % (
+              f.LocalPath(), line_number+1, attribute, line.strip()))
+          style_count += 1
+        # Error for text attributes in layout.
+        if widget_count > 0 and attribute in line:
+          errors.append('  %s:%d contains attribute %s\n    \t%s' % (
+              f.LocalPath(), line_number+1, attribute, line.strip()))
+          widget_count -= 1
+  # TODO(huayinz): Change the path on the error message to the corresponding
+  # styles.xml when this check applies to all resource directories.
+  if errors:
+    return [output_api.PresubmitError(
+  '''
+  Android Text Appearance Check failed:
+    Your modified files contain Android text attributes defined outside
+    text appearance styles, listed below.
+
+    It is recommended to use the pre-defined text appearance styles in
+      src/ui/android/java/res/values-v17/styles.xml
+
+    And to use
+      android:textAppearance="@style/SomeTextAppearance"
+    in the XML layout whenever possible.
+
+    If your text appearance absolutely has to deviate from the existing
+    pre-defined text appearance style, you will need UX approval for adding a
+    new text appearance style.
+
+    If your approved text appearance style is a common text appreance style,
+    please define it in src/ui/android/java/res/values-v17/styles.xml.
+
+    Otherwise, if your approved text appearance is feature-specific, in
+    chrome/android/java/res/values*/styles.xml, please define
+      <style name="TextAppearance.YourTextAppearanceName>
+        <item name="android:textColor">...</item>
+        <item name="android:textSize">...</item>
+        ...
+      </style>
+
+    Please contact hannahs@chromium.org for UX approval, and
+    src/chrome/android/java/res/OWNERS for questions.
+    See https://crbug.com/775198 for more information.
+  ''',
+        errors)]
+  return []
+
+
+def _CheckNewTextAppearance(input_api, output_api):
+  """Checks whether a new text appearance style is defined."""
+  errors = []
+  for f in input_api.AffectedFiles(include_deletes=False):
+    if not f.LocalPath().endswith('.xml'):
+      continue
+    for line_number, line in f.ChangedContents():
+      if '<style name="TextAppearance.' in line:
+        errors.append(
+            '  %s:%d\n    \t%s' % (f.LocalPath(), line_number, line.strip()))
+  if errors:
+    return [output_api.PresubmitPromptWarning(
+  '''
+  New Text Appearance in styles.xml Check failed:
+    Your new code added, edited or removed a text appearance style.
+    If you are removing or editing an existing text appearance style, or your
+    new text appearance style is approved by UX, please bypass this check.
+
+    Otherwise, please contact hannahs@chromium.org for UX approval, and
+    src/chrome/android/java/res/OWNERS for questions.
+    See https://crbug.com/775198 for more information.
+  ''',
+        errors)]
+  return []
\ No newline at end of file
diff --git a/chrome/android/java/res/PRESUBMIT_test.py b/chrome/android/java/res/PRESUBMIT_test.py
index 2bd8e164..d977fa7 100755
--- a/chrome/android/java/res/PRESUBMIT_test.py
+++ b/chrome/android/java/res/PRESUBMIT_test.py
@@ -147,5 +147,148 @@
     self.assertEqual(0, len(errors))
 
 
+class TextAppearanceTest(unittest.TestCase):
+
+  def testFailure_Style(self):
+    lines = [
+        '<resource>',
+        '<style name="TestTextAppearance">',
+        '<item name="android:textColor">@color/default_text_color_link</item>',
+        '<item name="android:textSize">14sp</item>',
+        '<item name="android:textStyle">bold</item>',
+        '<item name="android:fontFamily">some-font</item>',
+        '<item name="android:textAllCaps">true</item>',
+        '</style>',
+        '</resource>']
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [MockFile('chrome/path/test.xml', lines)]
+    errors = PRESUBMIT._CheckTextAppearance(mock_input_api, MockOutputApi())
+    self.assertEqual(1, len(errors))
+    self.assertEqual(5, len(errors[0].items))
+    self.assertEqual(
+        '  chrome/path/test.xml:2 contains attribute android:textColor',
+        errors[0].items[0].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test.xml:2 contains attribute android:textSize',
+        errors[0].items[1].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test.xml:2 contains attribute android:textStyle',
+        errors[0].items[2].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test.xml:2 contains attribute android:fontFamily',
+        errors[0].items[3].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test.xml:2 contains attribute android:textAllCaps',
+        errors[0].items[4].splitlines()[0])
+
+  def testSuccess_Style(self):
+    lines = [
+        '<resource>',
+        '<style name="TextAppearance.Test">',
+        '<item name="android:textColor">@color/default_text_color_link</item>',
+        '<item name="android:textSize">14sp</item>',
+        '<item name="android:textStyle">bold</item>',
+        '<item name="android:fontFamily">some-font</item>',
+        '<item name="android:textAllCaps">true</item>',
+        '</style>',
+        '<style name="TestStyle">',
+        '<item name="android:background">some_background</item>',
+        '</style>',
+        '</resource>']
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [MockFile('chrome/path/test.xml', lines)]
+    errors = PRESUBMIT._CheckTextAppearance(mock_input_api, MockOutputApi())
+    self.assertEqual(0, len(errors))
+
+  def testFailure_Widget(self):
+    lines_top_level = [
+        '<TextView',
+        'xmlns:android="http://schemas.android.com/apk/res/android"',
+        'android:layout_width="match_parent"',
+        'android:layout_height="@dimen/snippets_article_header_height"',
+        'android:textColor="@color/snippets_list_header_text_color"',
+        'android:textSize="14sp" />']
+    lines_subcomponent_widget = [
+        '<RelativeLayout',
+        'xmlns:android="http://schemas.android.com/apk/res/android"',
+        'android:layout_width="match_parent"',
+        'android:layout_height="wrap_content">',
+        '<View',
+        'android:textColor="@color/error_text_color"',
+        'android:textSize="@dimen/text_size_medium"',
+        'android:textAllCaps="true"',
+        'android:background="@drawable/infobar_shadow_top"',
+        'android:visibility="gone" />',
+        '</RelativeLayout>']
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [
+        MockFile('chrome/path/test1.xml', lines_top_level),
+        MockFile('chrome/path/test2.xml', lines_subcomponent_widget)]
+    errors = PRESUBMIT._CheckTextAppearance(mock_input_api, MockOutputApi())
+    self.assertEqual(1, len(errors))
+    self.assertEqual(5, len(errors[0].items))
+    self.assertEqual(
+        '  chrome/path/test1.xml:5 contains attribute android:textColor',
+        errors[0].items[0].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test1.xml:6 contains attribute android:textSize',
+        errors[0].items[1].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test2.xml:6 contains attribute android:textColor',
+        errors[0].items[2].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test2.xml:7 contains attribute android:textSize',
+        errors[0].items[3].splitlines()[0])
+    self.assertEqual(
+        '  chrome/path/test2.xml:8 contains attribute android:textAllCaps',
+        errors[0].items[4].splitlines()[0])
+
+  def testSuccess_Widget(self):
+    lines = [
+        '<RelativeLayout',
+        'xmlns:android="http://schemas.android.com/apk/res/android"',
+        'android:layout_width="match_parent"',
+        'android:layout_height="wrap_content">',
+        '<View',
+        'android:background="@drawable/infobar_shadow_top"',
+        'android:visibility="gone" />',
+        '</RelativeLayout>']
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [MockFile('chrome/path/test.xml', lines)]
+    errors = PRESUBMIT._CheckTextAppearance(mock_input_api, MockOutputApi())
+    self.assertEqual(0, len(errors))
+
+class NewTextAppearanceTest(unittest.TestCase):
+
+  def testFailure(self):
+    lines = [
+        '<resource>',
+        '<style name="TextAppearance.Test">',
+        '<item name="android:textColor">@color/default_text_color_link</item>',
+        '<item name="android:textSize">14sp</item>',
+        '</style>',
+        '</resource>']
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [MockFile('chrome/path/test.xml', lines)]
+    errors = PRESUBMIT._CheckNewTextAppearance(mock_input_api, MockOutputApi())
+    self.assertEqual(1, len(errors))
+    self.assertEqual(1, len(errors[0].items))
+    self.assertEqual(
+        '  chrome/path/test.xml:2',
+        errors[0].items[0].splitlines()[0])
+
+  def testSuccess(self):
+    lines = [
+        '<resource>',
+        '<style name="TextAppearanceTest">',
+        '<item name="android:textColor">@color/default_text_color_link</item>',
+        '<item name="android:textSize">14sp</item>',
+        '</style>',
+        '</resource>']
+    mock_input_api = MockInputApi()
+    mock_input_api.files = [MockFile('chrome/path/test.xml', lines)]
+    errors = PRESUBMIT._CheckNewTextAppearance(mock_input_api, MockOutputApi())
+    self.assertEqual(0, len(errors))
+
 if __name__ == '__main__':
   unittest.main()
diff --git a/chrome/android/java/res/layout/autofill_billing_address_dropdown.xml b/chrome/android/java/res/layout/autofill_billing_address_dropdown.xml
index 943b2926..9948afe 100644
--- a/chrome/android/java/res/layout/autofill_billing_address_dropdown.xml
+++ b/chrome/android/java/res/layout/autofill_billing_address_dropdown.xml
@@ -11,7 +11,7 @@
         android:layout_marginStart="@dimen/pref_autofill_field_horizontal_padding"
         android:layout_marginEnd="@dimen/pref_autofill_field_horizontal_padding"
         android:labelFor="@+id/autofill_credit_card_editor_billing_address_spinner"
-        android:textAppearance="@style/PreferenceFloatLabelTextAppearance"
+        android:textAppearance="@style/BlackCaption"
         android:text="@string/autofill_credit_card_editor_billing_address" />
 
     <android.support.v7.widget.AppCompatSpinner
diff --git a/chrome/android/java/res/layout/autofill_local_card_editor.xml b/chrome/android/java/res/layout/autofill_local_card_editor.xml
index c80562d..c939f2e 100644
--- a/chrome/android/java/res/layout/autofill_local_card_editor.xml
+++ b/chrome/android/java/res/layout/autofill_local_card_editor.xml
@@ -55,7 +55,7 @@
         android:layout_marginTop="@dimen/pref_autofill_field_top_margin"
         android:layout_marginStart="@dimen/pref_autofill_field_horizontal_padding"
         android:layout_marginEnd="@dimen/pref_autofill_field_horizontal_padding"
-        android:textAppearance="@style/PreferenceFloatLabelTextAppearance"
+        android:textAppearance="@style/BlackCaption"
         android:text="@string/autofill_credit_card_editor_expiration_date" />
 
     <LinearLayout
diff --git a/chrome/android/java/res/layout/chip.xml b/chrome/android/java/res/layout/chip.xml
index a37aeb3..2bcb5390 100644
--- a/chrome/android/java/res/layout/chip.xml
+++ b/chrome/android/java/res/layout/chip.xml
@@ -30,5 +30,5 @@
         android:paddingStart="@dimen/chip_icon_padding"
         android:paddingEnd="@dimen/chip_no_icon_padding"
         android:textAlignment="center"
-        android:textAppearance="@style/DownloadHomeChipText" />
+        android:textAppearance="@style/TextAppearance.DownloadHomeChip" />
 </LinearLayout>
diff --git a/chrome/android/java/res/layout/clear_browsing_important_dialog_listview.xml b/chrome/android/java/res/layout/clear_browsing_important_dialog_listview.xml
index 27c68dd..17b9f72 100644
--- a/chrome/android/java/res/layout/clear_browsing_important_dialog_listview.xml
+++ b/chrome/android/java/res/layout/clear_browsing_important_dialog_listview.xml
@@ -17,7 +17,7 @@
         android:paddingBottom="7dip"
         android:paddingStart="24dp"
         android:paddingEnd="15dp"
-        style="@style/PreferenceTextAppearanceMedium"
+        android:textAppearance="@style/TextAppearance.PreferenceMediumText"
         android:text="@string/clear_browsing_data_important_dialog_text"/>
 
     <ListView
diff --git a/chrome/android/java/res/layout/data_reduction_stats_layout.xml b/chrome/android/java/res/layout/data_reduction_stats_layout.xml
index 5a54bf88..c1230147 100644
--- a/chrome/android/java/res/layout/data_reduction_stats_layout.xml
+++ b/chrome/android/java/res/layout/data_reduction_stats_layout.xml
@@ -4,7 +4,6 @@
      found in the LICENSE file. -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/data_reduction_stats_container"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
@@ -31,8 +30,7 @@
                     android:layout_height="wrap_content"
                     android:layout_marginTop="3dp"
                     android:singleLine="true"
-                    android:textColor="@color/default_text_color_link"
-                    android:textSize="23sp" />
+                    android:textAppearance="@style/TextAppearance.DataReductionHeadline" />
 
                 <TextView
                     android:layout_width="match_parent"
@@ -77,15 +75,13 @@
             android:id="@+id/data_reduction_start_date"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textAppearance="@style/PreferenceSummary"
-            android:textSize="14sp" />
+            android:textAppearance="@style/BlackBody" />
 
         <TextView
             android:id="@+id/data_reduction_end_date"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:textAppearance="@style/PreferenceSummary"
-            android:textSize="14sp" />
+            android:textAppearance="@style/BlackBody" />
 
     </FrameLayout>
 
diff --git a/chrome/android/java/res/layout/download_manager_date_item.xml b/chrome/android/java/res/layout/download_manager_date_item.xml
index 0234c442..7069da5 100644
--- a/chrome/android/java/res/layout/download_manager_date_item.xml
+++ b/chrome/android/java/res/layout/download_manager_date_item.xml
@@ -7,11 +7,10 @@
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:paddingTop="4dp"
-    android:paddingBottom="4dp"
-    android:paddingStart="12dp"
+    android:paddingTop="@dimen/download_manager_section_title_padding_top"
+    android:paddingBottom="@dimen/download_manager_section_title_padding_bottom"
+    android:paddingStart="@dimen/list_item_default_margin"
     android:maxLines="1"
     android:gravity="start|center_vertical"
-    android:textAppearance="@style/BlackTitle2"
-    android:textAlignment="viewStart"
-    />
\ No newline at end of file
+    android:textAppearance="@style/BlackTitle1"
+    android:textAlignment="viewStart" />
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/download_manager_date_separator.xml b/chrome/android/java/res/layout/download_manager_date_separator.xml
new file mode 100644
index 0000000..6e8dd67
--- /dev/null
+++ b/chrome/android/java/res/layout/download_manager_date_separator.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2018 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<View
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    style="@style/Divider"
+    android:minHeight="2dp" />
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/download_manager_image_item.xml b/chrome/android/java/res/layout/download_manager_image_item.xml
index 0aed867..19ab784 100644
--- a/chrome/android/java/res/layout/download_manager_image_item.xml
+++ b/chrome/android/java/res/layout/download_manager_image_item.xml
@@ -9,16 +9,17 @@
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
+    android:layout_height="wrap_content"
     android:clickable="true"
-    android:background="@color/modern_primary_color" >
+    android:background="@color/google_grey_100" >
 
     <ImageView
         android:id="@+id/thumbnail"
         android:layout_width="match_parent"
-        android:layout_height="@dimen/download_manager_image_width"
+        android:layout_height="wrap_content"
         android:scaleType="centerCrop"
         android:layout_gravity="center"
+        android:adjustViewBounds="true"
         tools:ignore="ContentDescription" />
 
     <org.chromium.chrome.browser.download.home.view.SelectionView
diff --git a/chrome/android/java/res/layout/download_manager_section_header.xml b/chrome/android/java/res/layout/download_manager_section_header.xml
new file mode 100644
index 0000000..038be20
--- /dev/null
+++ b/chrome/android/java/res/layout/download_manager_section_header.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2018 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:paddingTop="@dimen/download_manager_section_title_padding_top"
+    android:paddingBottom="@dimen/download_manager_section_title_padding_bottom"
+    android:paddingStart="@dimen/list_item_default_margin"
+    android:gravity="start|center_vertical"
+    android:textAppearance="@style/BlackHint2"
+    android:textAlignment="viewStart" />
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/download_manager_section_separator.xml b/chrome/android/java/res/layout/download_manager_section_separator.xml
new file mode 100644
index 0000000..1f69e71
--- /dev/null
+++ b/chrome/android/java/res/layout/download_manager_section_separator.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright 2018 The Chromium Authors. All rights reserved.
+     Use of this source code is governed by a BSD-style license that can be
+     found in the LICENSE file.
+-->
+
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:background="@android:color/white"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <View
+        style="@style/Divider"
+        android:layout_marginStart="16dp" />
+
+</FrameLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/editable_option_editor_icons.xml b/chrome/android/java/res/layout/editable_option_editor_icons.xml
index 1bb114d..c3044ed 100644
--- a/chrome/android/java/res/layout/editable_option_editor_icons.xml
+++ b/chrome/android/java/res/layout/editable_option_editor_icons.xml
@@ -17,7 +17,7 @@
             android:id="@+id/label"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAppearance="@style/PreferenceFloatLabelTextAppearance" />
+            android:textAppearance="@style/BlackCaption" />
 
     <org.chromium.chrome.browser.widget.prefeditor.ExpandableGridView
             android:id="@+id/icons_container"
diff --git a/chrome/android/java/res/layout/new_tab_page_incognito_md.xml b/chrome/android/java/res/layout/new_tab_page_incognito_md.xml
index 32b43ba..e8027ef 100644
--- a/chrome/android/java/res/layout/new_tab_page_incognito_md.xml
+++ b/chrome/android/java/res/layout/new_tab_page_incognito_md.xml
@@ -81,7 +81,7 @@
                 android:clickable="true"
                 android:focusable="true"
                 android:text="@string/learn_more"
-                android:textAppearance="@style/BlueButtonText1"
+                android:textAppearance="@style/TextAppearance.IncognitoNewTabLearnMoreLinkModern"
                 android:lineSpacingExtra="@dimen/md_incognito_ntp_line_spacing" />
 
         </LinearLayout>
diff --git a/chrome/android/java/res/layout/payment_request_editor_dropdown.xml b/chrome/android/java/res/layout/payment_request_editor_dropdown.xml
index 460a73c..7d2fc01f 100644
--- a/chrome/android/java/res/layout/payment_request_editor_dropdown.xml
+++ b/chrome/android/java/res/layout/payment_request_editor_dropdown.xml
@@ -17,7 +17,7 @@
             android:id="@+id/spinner_label"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:textAppearance="@style/PreferenceFloatLabelTextAppearance" />
+            android:textAppearance="@style/BlackCaption" />
 
     <android.support.v7.widget.AppCompatSpinner
             android:id="@+id/spinner"
diff --git a/chrome/android/java/res/layout/payment_request_editor_label.xml b/chrome/android/java/res/layout/payment_request_editor_label.xml
index 82b8750..2d81a75d 100644
--- a/chrome/android/java/res/layout/payment_request_editor_label.xml
+++ b/chrome/android/java/res/layout/payment_request_editor_label.xml
@@ -45,6 +45,6 @@
             android:layout_below="@id/mid_label"
             android:layout_toStartOf="@id/icon"
             android:layout_alignParentStart="true"
-            android:textAppearance="@style/PreferenceFloatLabelTextAppearance" />
+            android:textAppearance="@style/BlackCaption" />
 
 </RelativeLayout>
\ No newline at end of file
diff --git a/chrome/android/java/res/layout/preference_category.xml b/chrome/android/java/res/layout/preference_category.xml
index 7e1281e3..6fa0c8a 100644
--- a/chrome/android/java/res/layout/preference_category.xml
+++ b/chrome/android/java/res/layout/preference_category.xml
@@ -18,7 +18,7 @@
         android:layout_width="0dp"
         android:layout_weight="1"
         android:layout_height="wrap_content"
-        android:textAppearance="@style/PreferenceCategoryTextStyle" />
+        android:textAppearance="@style/TextAppearance.PreferenceCategoryText" />
 
     <!-- Users of this layout are responsible to set contentDescription. -->
     <ImageView
diff --git a/chrome/android/java/res/values-v17/styles.xml b/chrome/android/java/res/values-v17/styles.xml
index b091cb70..53ad29a 100644
--- a/chrome/android/java/res/values-v17/styles.xml
+++ b/chrome/android/java/res/values-v17/styles.xml
@@ -95,13 +95,15 @@
         <item name="android:windowBackground">@null</item>
         <item name="android:windowDisablePreview">true</item>
     </style>
-    <style name="WebappSplashScreenTextTheme">
+    <style name="TextAppearance.WebappSplashScreenText" parent="BlackHeadline1">
         <item name="android:textSize">24sp</item>
-        <item name="android:ellipsize">end</item>
-        <item name="android:textColor">@color/default_text_color</item>
-        <item name="android:gravity">center</item>
         <item name="android:fontFamily">sans-serif-condensed</item>
+    </style>
+    <style name="WebappSplashScreenTextTheme">
+        <item name="android:ellipsize">end</item>
+        <item name="android:gravity">center</item>
         <item name="android:maxLines">2</item>
+        <item name="android:textAppearance">@style/TextAppearance.WebappSplashScreenText</item>
     </style>
 
     <style name="AlertDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
@@ -136,10 +138,15 @@
         <item name="android:paddingBottom">@dimen/modal_dialog_control_padding_vertical</item>
     </style>
 
-    <style name="ModalDialogButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
+    <!-- TODO(huayinz): Move this to pre-defined style once we have the disabled state defined  -->
+    <style name="TextAppearance.ModalDialogButton" parent="BlueButtonText2">
         <item name="android:textColor">@color/blue_when_enabled</item>
     </style>
 
+    <style name="ModalDialogButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
+        <item name="android:textAppearance">@style/TextAppearance.ModalDialogButton</item>
+    </style>
+
     <style name="SimpleDialog" parent="AlertDialogTheme">
         <item name="windowNoTitle">true</item>
         <item name="windowActionBar">false</item>
@@ -148,10 +155,11 @@
     <!-- Preferences -->
     <style name="PreferencesTheme" parent="ThemeWithActionBar">
         <item name="android:textColorLink">@color/pref_accent_color</item>
-        <item name="android:textAppearanceMedium">@style/PreferenceTextAppearanceMedium</item>
+        <item name="android:textAppearanceMedium">@style/TextAppearance.PreferenceMediumText</item>
+        <item name="android:textAppearanceSmall">@style/BlackBody</item>
         <item name="android:preferenceCategoryStyle">@style/PreferenceCategory</item>
         <item name="android:spinnerItemStyle">@style/PreferenceSpinnerItem</item>
-        <item name="floatLabelTextAppearance">@style/PreferenceFloatLabelTextAppearance</item>
+        <item name="floatLabelTextAppearance">@style/BlackCaption</item>
         <item name="floatLabelPaddingLeft">@dimen/pref_autofill_field_horizontal_padding</item>
         <item name="floatLabelPaddingRight">@dimen/pref_autofill_field_horizontal_padding</item>
         <item name="floatLabelPaddingTop">@dimen/pref_autofill_field_top_margin</item>
@@ -161,7 +169,7 @@
     <style name="PreferenceActionBarModern" parent="@style/Widget.AppCompat.Light.ActionBar.Solid">
       <item name="titleTextStyle">@style/BlackHeadline1</item>
     </style>
-    <style name="PreferenceTextAppearanceMedium">
+    <style name="TextAppearance.PreferenceMediumText">
         <item name="android:textSize">18sp</item>
         <item name="android:textColor">?android:attr/textColorPrimary</item>
     </style>
@@ -176,7 +184,7 @@
         <item name="android:paddingTop">16dp</item>
         <item name="android:layout_marginBottom">16dp</item>
     </style>
-    <style name="PreferenceCategoryTextStyle" parent="RobotoMediumStyle">
+    <style name="TextAppearance.PreferenceCategoryText" parent="RobotoMediumStyle">
         <item name="android:textColor">@color/pref_accent_color</item>
         <item name="android:textSize">12sp</item>
     </style>
@@ -186,8 +194,7 @@
         <item name="android:textAppearance">?android:attr/textAppearanceMedium</item>
     </style>
     <style name="PreferenceSummary">
-        <item name="android:textAppearance">?android:attr/textAppearanceSmall</item>
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
+        <item name="android:textAppearance">@style/BlackBody</item>
     </style>
     <style name="PreferenceScreenLayout">
         <item name="android:paddingTop">16dp</item>
@@ -207,14 +214,10 @@
     </style>
     <style name="PreferenceLayout" parent="PreferenceLayoutBase" />
     <style name="DeprecationWarningPreferenceTheme" parent="PreferencesTheme">
-        <item name="android:textSize">14sp</item>
-    </style>
-    <style name="PreferenceFloatLabelTextAppearance">
-        <item name="android:textColor">@color/descriptive_text_color</item>
-        <item name="android:textSize">12sp</item>
+        <item name="android:textAppearance">@style/BlackBodyDefault</item>
     </style>
     <style name="PreferenceSpinnerItem">
-        <item name="android:textAppearance">@style/PreferenceTextAppearanceMedium</item>
+        <item name="android:textAppearance">@style/TextAppearance.PreferenceMediumText</item>
     </style>
     <style name="PreferenceSpinnerUnderlineView">
         <item name="android:layout_width">match_parent</item>
@@ -243,11 +246,25 @@
     <style name="ThemeWithActionBar" parent="ThemeWithActionBarBase" />
 
     <style name="FlushFooterButton">
-      <item name="android:textColor">@color/light_normal_color</item>
-      <item name="android:background">@drawable/flush_footer_button</item>
+        <item name="android:background">@drawable/flush_footer_button</item>
+        <item name="android:textAppearance">@style/TextAppearance.FlushFooterButton</item>
+    </style>
+    <style name="TextAppearance.FlushFooterButton"
+        parent="android:TextAppearance.DeviceDefault.Widget.Button">
+        <item name="android:textColor">@color/light_normal_color</item>
     </style>
 
     <!-- Manage Space Activity -->
+    <style name="ManageSpaceTheme" parent="PreferencesTheme">
+        <!-- Action bar color. This is intentionally a dark color. See crbug.com/871193. -->
+        <item name="colorPrimary">@color/dark_action_bar_color</item>
+        <!-- Status bar color -->
+        <item name="colorPrimaryDark">@color/dark_status_bar_color</item>
+        <item name="actionBarStyle">@style/ManageSpaceActionBarModern</item>
+    </style>
+    <style name="ManageSpaceActionBarModern" parent="PreferenceActionBarModern">
+        <item name="titleTextStyle">@style/WhiteHeadline1</item>
+    </style>
     <style name="ManageSpaceActivityButton">
       <item name="android:layout_width">wrap_content</item>
       <item name="android:layout_height">wrap_content</item>
@@ -290,7 +307,7 @@
         <item name="android:popupBackground">@null</item>
         <item name="android:listDivider">@null</item>
         <item name="android:listPreferredItemHeightSmall">48dp</item>
-        <item name="android:textSize">16sp</item>
+        <item name="android:textAppearance">@style/BlackTitle1</item>
     </style>
     <style name="OverflowMenuButton">
         <item name="android:layout_width">0dp</item>
@@ -399,7 +416,7 @@
     </style>
 
     <!-- Web Notifications -->
-    <style name="TextAppearance_StatusBar_EventContent_LineTwo"
+    <style name="TextAppearance.Notification"
         parent="@android:style/TextAppearance.StatusBar.EventContent">
         <!-- This style is defined as a workaround for TextAppearance.StatusBar.EventContent.Line2
              not being exposed by the framework and removed from the Support Library. It copies
@@ -412,17 +429,17 @@
         parent="@android:style/TextAppearance.StatusBar.EventContent.Title">
         <item name="android:layout_marginStart">8dp</item>
     </style>
-    <style name="WebNotificationBody" parent="TextAppearance_StatusBar_EventContent_LineTwo">
+    <style name="WebNotificationBody" parent="TextAppearance.Notification">
         <item name="android:layout_marginStart">8dp</item>
     </style>
     <style name="WebNotificationBodyBig"
         parent="@android:style/TextAppearance.StatusBar.EventContent">
         <item name="android:layout_marginStart">8dp</item>
     </style>
-    <style name="WebNotificationOrigin" parent="TextAppearance_StatusBar_EventContent_LineTwo">
+    <style name="WebNotificationOrigin" parent="TextAppearance.Notification">
         <item name="android:layout_marginStart">8dp</item>
     </style>
-    <style name="WebNotificationTime" parent="TextAppearance_StatusBar_EventContent_LineTwo"/>
+    <style name="WebNotificationTime" parent="TextAppearance.Notification"/>
     <style name="WebNotificationDivider">
         <item name="android:background">?android:dividerHorizontal</item>
     </style>
@@ -434,12 +451,16 @@
     </style>
     <style name="WebNotificationButton"
         parent="@android:style/Widget.DeviceDefault.Button.Borderless.Small">
+        <item name="android:textAppearance">@style/TextAppearance.WebNotificationButton</item>
+    </style>
+    <style name="TextAppearance.WebNotificationButton"
+        parent="android:TextAppearance.DeviceDefault.Widget.Button">
         <!-- textColor from the 4.4.4 notification_action.xml - no public aliases. -->
         <item name="android:textColor">#ccc</item>
     </style>
     <style name="WebNotificationSettingsButton"
         parent="@style/WebNotificationButton">
-        <item name="android:textAppearance">@style/TextAppearance_StatusBar_EventContent_LineTwo</item>
+        <item name="android:textAppearance">@style/TextAppearance.Notification</item>
         <item name="android:paddingStart">40dp</item>
         <!-- Margin at the end to avoid overlap with the small icon. -->
         <item name="android:layout_marginEnd">24dp</item>
@@ -477,7 +498,7 @@
     </style>
 
     <style name="SigninDialogButtonStyle" parent="Widget.AppCompat.Button.ButtonBar.AlertDialog">
-        <item name="android:textColor">@color/default_text_color_link</item>
+        <item name="android:textAppearance">@style/BlueButtonText2</item>
     </style>
 
     <!-- Contextual Search styles -->
@@ -507,6 +528,10 @@
         <item name="android:includeFontPadding">false</item>
         <item name="android:requiresFadingEdge">horizontal</item>
         <item name="android:singleLine">true</item>
+        <item name="android:textAppearance">
+            @style/TextAppearance.ContextualSearchContextTextView</item>
+    </style>
+    <style name="TextAppearance.ContextualSearchContextTextView">
         <item name="android:textColor">#CCC</item>
         <item name="android:textSize">@dimen/text_size_large</item>
     </style>
@@ -524,27 +549,18 @@
     </style>
 
     <!-- Payments UI -->
-    <style name="PaymentsUiSectionDisabledText">
-        <item name="android:textColor">@color/explanation_text_color</item>
-        <item name="android:textSize">16sp</item>
-    </style>
-    <style name="PaymentsUiSectionDescriptiveText">
-        <item name="android:textColor">@color/descriptive_text_color</item>
-        <item name="android:textSize">14sp</item>
-    </style>
-    <style name="PaymentsUiSectionWarningText">
+    <style name="TextAppearance.PaymentsUiSectionWarningText">
         <item name="android:textColor">@color/error_text_color</item>
-        <item name="android:textSize">14sp</item>
+        <item name="android:textSize">@dimen/text_size_medium</item>
     </style>
-    <style name="PaymentsUiSectionDescriptiveTextEndAligned" parent="PaymentsUiSectionDescriptiveText">
+    <style name="TextAppearance.PaymentsUiSectionDescriptiveTextEndAligned" parent="BlackBody">
         <item name="android:textAlignment">viewEnd</item>
     </style>
-    <style name="PaymentsUiSectionPendingTextEndAligned" parent="PaymentsUiSectionDescriptiveTextEndAligned">
+    <style name="TextAppearance.PaymentsUiSectionPendingTextEndAligned"
+        parent="TextAppearance.PaymentsUiSectionDescriptiveTextEndAligned">
         <item name="android:textColor">@color/explanation_text_color</item>
     </style>
-    <style name="EditorDialogSectionAddButtonLabel">
-        <item name="android:textColor">@color/default_text_color_link</item>
-        <item name="android:textSize">14sp</item>
+    <style name="TextAppearance.EditorDialogSectionAddButton" parent="BlueLink2">
         <item name="android:textAllCaps">true</item>
     </style>
 
@@ -585,27 +601,19 @@
         <item name="android:background">?attr/listChoiceBackgroundIndicator</item>
     </style>
     <style name="SadTabBodyText">
-        <item name="android:textColor">@color/sad_tab_body_text_color</item>
-        <item name="android:textSize">14sp</item>
+        <item name="android:textAppearance">@style/BlackBody</item>
         <item name="android:layout_gravity">start</item>
     </style>
     <style name="SigninButtonCompat">
-        <item name="android:textColor">@android:color/white</item>
-        <item name="android:textSize">14sp</item>
+        <item name="android:textAppearance">@style/WhiteButtonText</item>
         <item name="buttonColor">@color/light_active_color</item>
         <item name="buttonRaised">false</item>
     </style>
-    <!-- TODO(https://crbug.com/856244): Remove text attributes here and use textAppearance once
-         they are removed from @style/ButtonCompatBase. -->
     <style name="SigninButtonBorderlessRegular">
         <item name="android:background">?android:attr/selectableItemBackground</item>
         <item name="android:paddingStart">0dp</item>
         <item name="android:paddingEnd">0dp</item>
-        <item name="android:fontFamily">sans-serif</item>
-        <item name="android:textAllCaps">false</item>
-        <item name="android:textStyle">normal</item>
-        <item name="android:textColor">@color/default_text_color_link</item>
-        <item name="android:textSize">14sp</item>
+        <item name="android:textAppearance">@style/BlueLink2</item>
     </style>
 
     <!-- New tab page RecyclerView overscroll color -->
@@ -644,7 +652,7 @@
     </style>
 
     <!-- Download Home -->
-    <style name="DownloadHomeChipText">
+    <style name="TextAppearance.DownloadHomeChip">
         <item name="android:textColor">@color/chip_text_color</item>
         <item name="android:textSize">@dimen/text_size_medium</item>
     </style>
@@ -653,8 +661,7 @@
         <item name="android:layout_height">wrap_content</item>
         <item name="android:layout_marginTop">0dp</item>
         <item name="android:minHeight">18dp</item>
-        <item name="android:textColor">@color/google_grey_600</item>
-        <item name="android:textSize">12sp</item>
+        <item name="android:textAppearance">@style/BlackBody</item>
         <item name="android:ellipsize">start</item>
         <item name="android:singleLine">true</item>
     </style>
@@ -700,11 +707,14 @@
         <item name="android:paddingStart">6dp</item>
         <item name="android:paddingEnd">6dp</item>
         <item name="android:singleLine">true</item>
+        <item name="android:text">@string/prefetch_badge_new</item>
+        <item name="android:textAppearance">@style/TextAppearance.DownloadNewBadge</item>
+    </style>
+    <style name="TextAppearance.DownloadNewBadge">
         <item name="android:textColor">@android:color/white</item>
         <item name="android:textSize">@dimen/text_size_small</item>
         <item name="android:textStyle">bold</item>
         <item name="android:textAllCaps">true</item>
-        <item name="android:text">@string/prefetch_badge_new</item>
     </style>
 
     <!-- Download Home V2 -->
@@ -717,15 +727,23 @@
     </style>
 
     <!-- Data Reduction -->
+    <style name="TextAppearance.DataUsageBreakdownColumnLabel" parent="@style/BlackButtonText">
+        <item name="android:textAllCaps">false</item>
+    </style>
     <style name="DataUsageBreakdownColumnLabel">
         <item name="android:layout_height">wrap_content</item>
         <item name="android:paddingBottom">10dp</item>
         <item name="android:paddingTop">10dp</item>
         <item name="android:singleLine">true</item>
-        <item name="android:textAppearance">@style/BlackButtonText</item>
+        <item name="android:textAppearance">
+            @style/TextAppearance.DataUsageBreakdownColumnLabel</item>
+    </style>
+    <style name="TextAppearance.DataUsageBreakdownSavedColumnLabel" parent="@style/BlueButtonText2">
+        <item name="android:textAllCaps">false</item>
     </style>
     <style name="DataUsageBreakdownSavedColumnLabel" parent="DataUsageBreakdownColumnLabel">
-        <item name="android:textAppearance">@style/BlueButtonText2</item>
+        <item name="android:textAppearance">
+            @style/TextAppearance.DataUsageBreakdownSavedColumnLabel</item>
     </style>
     <style name="DataUsageBreakdownColumnItem">
         <item name="android:layout_height">wrap_content</item>
@@ -737,6 +755,9 @@
     <style name="DataUsageBreakdownSavedColumnItem" parent="DataUsageBreakdownColumnItem">
         <item name="android:textAppearance">@style/BlueLink3</item>
     </style>
+    <style name="TextAppearance.DataReductionHeadline" parent="BlackHeadline1">
+        <item name="android:textColor">@color/default_text_color_link</item>
+    </style>
 
     <!-- Incognito New Tab Page -->
     <style name="IncognitoNewTabMessage">
@@ -749,9 +770,14 @@
         <item name="android:clickable">true</item>
         <item name="android:focusable">true</item>
         <item name="android:textAppearance">@style/BlueButtonText1</item>
-        <item name="android:textAllCaps">true</item>
         <item name="android:padding">16dp</item>
     </style>
+    <!-- TODO(https://crbug.com/850138): Confirm with UX whether this should be a one-off text
+         appearance or a pre-defined text appearance. -->
+    <style name="TextAppearance.IncognitoNewTabLearnMoreLinkModern">
+        <item name="android:textColor">@color/modern_blue_300</item>
+        <item name="android:textSize">@dimen/text_size_medium</item>
+    </style>
 
     <!-- Picker Dialog animations -->
 
@@ -775,19 +801,19 @@
         <item name="android:ellipsize">end</item>
         <item name="leading">16sp</item>
     </style>
-    <!-- TODO(https://crbug.com/856244): Figure out why the styles in the feed library overrides
-         chrome's style and try to use BlueButtonText2 instead of text attributes here. -->
-    <style name="SuggestionCardAction" parent="ButtonCompatBorderless">
-        <item name="android:textSize">@dimen/text_size_medium</item>
-        <item name="android:textColor">@color/default_text_color_link</item>
+    <style name="SuggestionCardAction">
         <item name="android:minHeight">48dp</item>
     </style>
 
     <!-- Password manager settings page -->
-    <style name="PasswordEntryName" parent="BlueButtonText2">
+    <style name="PasswordEntryName">
+        <item name="android:textAppearance">@style/TextAppearance.PasswordEntryName</item>
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
     </style>
+    <style name="TextAppearance.PasswordEntryName" parent="BlueButtonText2">
+        <item name="android:textAllCaps">false</item>
+    </style>
 
     <!-- ListMenuButton -->
     <style name="ListMenuItemStyle">
diff --git a/chrome/android/java/res/values-v21/styles.xml b/chrome/android/java/res/values-v21/styles.xml
index c4393aed..af6c63cb 100644
--- a/chrome/android/java/res/values-v21/styles.xml
+++ b/chrome/android/java/res/values-v21/styles.xml
@@ -10,7 +10,7 @@
         <item name="android:alertDialogTheme">@style/PreferencesDialogTheme</item>
         <item name="android:divider">@null</item>
         <item name="android:spinnerItemStyle">@style/PreferenceSpinnerItem</item>
-        <item name="floatLabelTextAppearance">@style/PreferenceFloatLabelTextAppearance</item>
+        <item name="floatLabelTextAppearance">@style/BlackCaption</item>
         <item name="floatLabelPaddingLeft">@dimen/pref_autofill_field_horizontal_padding</item>
         <item name="floatLabelPaddingRight">@dimen/pref_autofill_field_horizontal_padding</item>
         <item name="floatLabelPaddingTop">@dimen/pref_autofill_field_top_margin</item>
@@ -23,7 +23,7 @@
         <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
         <item name="android:paddingEnd">4dp</item>
     </style>
-    <style name="PreferenceCategoryTextStyle" parent="RobotoMediumStyle">
+    <style name="TextAppearance.PreferenceCategoryText" parent="RobotoMediumStyle">
         <item name="android:textColor">@color/pref_accent_color</item>
         <item name="android:textSize">12sp</item>
     </style>
@@ -33,8 +33,7 @@
         <item name="android:textAppearance">?android:attr/textAppearanceListItem</item>
     </style>
     <style name="PreferenceSummary">
-        <item name="android:textAppearance">?android:attr/textAppearanceListItemSecondary</item>
-        <item name="android:textColor">?android:attr/textColorSecondary</item>
+        <item name="android:textAppearance">@style/BlackBody</item>
     </style>
     <style name="PreferenceLayoutBase">
         <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
@@ -67,6 +66,10 @@
     <style name="WebNotificationButton"
         parent="@android:style/Widget.DeviceDefault.Light.Button.Borderless.Small">
         <item name="android:background">@drawable/web_notification_button_background</item>
+        <item name="android:textAppearance">@style/TextAppearance.WebNotificationButton</item>
+    </style>
+    <style name="TextAppearance.WebNotificationButton"
+        parent="android:TextAppearance.DeviceDefault.Widget.Button">
         <item name="android:textColor">@color/secondary_text_default_material_light</item>
     </style>
     <style name="WebNotificationSettingsButton"
diff --git a/chrome/android/java/res/values/colors.xml b/chrome/android/java/res/values/colors.xml
index f9676e7..bde089b 100644
--- a/chrome/android/java/res/values/colors.xml
+++ b/chrome/android/java/res/values/colors.xml
@@ -11,6 +11,7 @@
     <color name="input_underline_error_color">#D32F2F</color>
     <color name="explanation_text_color">#909090</color>
     <color name="text_highlight_color">#C6DAFC</color>
+    <!--TODO(huayinz): Change descriptive_text_color to the new default_text_color_secondary. -->
     <color name="descriptive_text_color">#646464</color>
     <color name="error_text_color">@color/google_red_700</color>
 
@@ -26,6 +27,7 @@
 
     <!-- Other common colors -->
     <color name="dark_action_bar_color">#263238</color>
+    <color name="dark_status_bar_color">#161E21</color>
     <color name="modal_dialog_scrim_color">#7F000000</color>
 
     <!-- Modern color palette -->
@@ -122,9 +124,6 @@
     <color name="signin_body_background">@color/google_grey_50</color>
     <color name="signin_header_animation_background">#F8F9FA</color>
 
-    <!-- Sad Tab colors -->
-    <color name="sad_tab_body_text_color">#646464</color>
-
     <!-- NTP and Home sheet colors. Also used on the bookmarks and recent tabs pages. -->
     <color name="ntp_bg">@color/default_primary_color</color>
     <color name="ntp_bg_incognito">@color/incognito_modern_primary_color</color>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml
index a781ccd..437a8cb 100644
--- a/chrome/android/java/res/values/dimens.xml
+++ b/chrome/android/java/res/values/dimens.xml
@@ -584,6 +584,10 @@
     <dimen name="download_manager_prefetch_thumbnail_size">114dp</dimen>
     <dimen name="download_manager_prefetch_horizontal_margin">16dp</dimen>
     <dimen name="download_manager_prefetch_vertical_margin">12dp</dimen>
+    <dimen name="download_manager_section_title_padding_top">16dp</dimen>
+    <dimen name="download_manager_section_title_padding_top_condensed">0dp</dimen>
+    <dimen name="download_manager_section_title_padding_bottom">0dp</dimen>
+    <dimen name="download_manager_section_title_padding_image">8dp</dimen>
 
     <!-- Navigation history popup dimensions -->
     <dimen name="navigation_popup_width">312dp</dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
index 72d6c30..7da3361f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeFeatureList.java
@@ -153,6 +153,7 @@
     public static final String ANDROID_PAY_INTEGRATION_V2 = "AndroidPayIntegrationV2";
     public static final String ANDROID_PAYMENT_APPS = "AndroidPaymentApps";
     public static final String APP_NOTIFICATION_STATUS_MESSAGING = "AppNotificationStatusMessaging";
+    public static final String AUTOFILL_ASSISTANT = "AutofillAssistant";
     public static final String AUTOFILL_KEYBOARD_ACCESSORY = "AutofillKeyboardAccessory";
     public static final String AUTOFILL_SCAN_CARDHOLDER_NAME = "AutofillScanCardholderName";
     public static final String CAF_MEDIA_ROUTER_IMPL = "CafMediaRouterImpl";
@@ -248,6 +249,7 @@
             "OfflinePagesDescriptiveFailStatus";
     public static final String OFFLINE_PAGES_DESCRIPTIVE_PENDING_STATUS =
             "OfflinePagesDescriptivePendingStatus";
+    public static final String OFFLINE_PAGES_LIVE_PAGE_SHARING = "OfflinePagesLivePageSharing";
     public static final String OFFLINE_PAGES_PREFETCHING = "OfflinePagesPrefetching";
     public static final String OMNIBOX_HIDE_SCHEME_DOMAIN_IN_STEADY_STATE =
             "OmniboxUIExperimentHideSteadyStateUrlSchemeAndSubdomains";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index ab1bd471..e85488e0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -672,7 +672,8 @@
         }
 
         if (FeatureUtilities.isTabModelMergingEnabled()) {
-            boolean inMultiWindowMode = MultiWindowUtils.getInstance().isInMultiWindowMode(this);
+            boolean inMultiWindowMode = MultiWindowUtils.getInstance().isInMultiWindowMode(this)
+                    || MultiWindowUtils.getInstance().isInMultiDisplayMode(this);
             // Don't need to merge tabs when mMergeTabsOnResume is null (cold start) since they get
             // merged when TabPersistentStore.loadState(boolean) is called from initializeState().
             if (!inMultiWindowMode && (mMergeTabsOnResume != null && mMergeTabsOnResume)) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java
new file mode 100644
index 0000000..c2ef8b2
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java
@@ -0,0 +1,79 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill_assistant;
+
+import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.chrome.browser.customtabs.CustomTabActivity;
+import org.chromium.chrome.browser.tab.EmptyTabObserver;
+import org.chromium.chrome.browser.tab.Tab;
+import org.chromium.chrome.browser.tabmodel.EmptyTabModelObserver;
+import org.chromium.chrome.browser.tabmodel.TabModel;
+import org.chromium.chrome.browser.tabmodel.TabModel.TabSelectionType;
+import org.chromium.content_public.browser.WebContents;
+
+/**
+ * Bridge to native side AssistantUiControllerAndroid. It allows native side to control Autofill
+ * Assistant related UIs and forward UI events to native side.
+ */
+@JNINamespace("autofill_assistant")
+public class AssistantUiController {
+    private final long mAssistantUiControllerAndroid;
+
+    /**
+     * Construct Autofill Assistant UI controller.
+     *
+     * @param activity The CustomTabActivity of the controller associated with.
+     */
+    public AssistantUiController(CustomTabActivity activity) {
+        // TODO(crbug.com/806868): Implement corresponding UI.
+        Tab activityTab = activity.getActivityTab();
+        mAssistantUiControllerAndroid = nativeInit(activityTab.getWebContents());
+
+        // Stop Autofill Assistant when the tab is detached from the activity.
+        activityTab.addObserver(new EmptyTabObserver() {
+            @Override
+            public void onActivityAttachmentChanged(Tab tab, boolean isAttached) {
+                if (!isAttached) {
+                    activityTab.removeObserver(this);
+                    nativeDestroy(mAssistantUiControllerAndroid);
+                }
+            }
+        });
+
+        // Stop Autofill Assistant when the selected tab (foreground tab) is changed.
+        TabModel currentTabModel = activity.getTabModelSelector().getCurrentModel();
+        currentTabModel.addObserver(new EmptyTabModelObserver() {
+            @Override
+            public void didSelectTab(Tab tab, @TabSelectionType int type, int lastId) {
+                currentTabModel.removeObserver(this);
+
+                // Assume newly selected tab is always different from the last one.
+                nativeDestroy(mAssistantUiControllerAndroid);
+                // TODO(crbug.com/806868): May start a new Autofill Assistant instance for the newly
+                // selected Tab.
+            }
+        });
+    }
+
+    @CalledByNative
+    private void onShowStatusMessage(String message) {
+        // TODO(crbug.com/806868): Implement corresponding UI.
+    }
+
+    @CalledByNative
+    private void onShowOverlay() {
+        // TODO(crbug.com/806868): Implement corresponding UI.
+    }
+
+    @CalledByNative
+    private void onHideOverlay() {
+        // TODO(crbug.com/806868): Implement corresponding UI.
+    }
+
+    // native methods.
+    private native long nativeInit(WebContents webContents);
+    private native void nativeDestroy(long nativeAssistantUiControllerAndroid);
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/OWNERS
new file mode 100644
index 0000000..829eb83
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill_assistant/OWNERS
@@ -0,0 +1 @@
+file://components/autofill_assistant/OWNERS
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java
index 62ddc7ec..fc507d9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java
@@ -42,17 +42,21 @@
     public void addToHomescreen(String title) {
         mAddedToHomescreen = true;
         // The title is ignored for app banners as we respect the developer-provided title.
-        nativeAddToHomescreen(mNativePointer);
+        if (mNativePointer != 0) {
+            nativeAddToHomescreen(mNativePointer);
+        }
     }
 
     @Override
     public void onNativeAppDetailsRequested() {
-        nativeShowNativeAppDetails(mNativePointer);
+        if (mNativePointer != 0) {
+            nativeShowNativeAppDetails(mNativePointer);
+        }
     }
 
     @Override
     public void onDialogDismissed() {
-        if (!mAddedToHomescreen) {
+        if (!mAddedToHomescreen && mNativePointer != 0) {
             nativeOnUiCancelled(mNativePointer);
         }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
index b2296b8c..32bc7be 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -54,6 +54,7 @@
 import org.chromium.chrome.browser.WarmupManager;
 import org.chromium.chrome.browser.WebContentsFactory;
 import org.chromium.chrome.browser.appmenu.AppMenuPropertiesDelegate;
+import org.chromium.chrome.browser.autofill_assistant.AssistantUiController;
 import org.chromium.chrome.browser.browserservices.BrowserSessionContentHandler;
 import org.chromium.chrome.browser.browserservices.BrowserSessionContentUtils;
 import org.chromium.chrome.browser.compositor.layouts.LayoutManager;
@@ -171,6 +172,8 @@
 
     private WebappCustomTabTimeSpentLogger mWebappTimeSpentLogger;
 
+    private AssistantUiController mAutofillAssistantUiController;
+
     @Nullable
     private ModuleEntryPoint mModuleEntryPoint;
     @Nullable
@@ -597,6 +600,14 @@
                     getIntent().getIntExtra(ServiceTabLauncher.LAUNCH_REQUEST_ID_EXTRA, 0),
                     getActivityTab().getWebContents());
         }
+
+        // TODO(crbug.com/806868): Only enable Autofill Assistant when the flag is enabled in the
+        // intent.
+        if (mAutofillAssistantUiController == null
+                && ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_ASSISTANT)) {
+            mAutofillAssistantUiController = new AssistantUiController(this);
+        }
+
         super.finishNativeInitialization();
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DirectoryOption.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DirectoryOption.java
index 08183dc..a00bb16 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DirectoryOption.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DirectoryOption.java
@@ -6,8 +6,6 @@
 
 import android.support.annotation.IntDef;
 
-import org.chromium.base.metrics.RecordHistogram;
-
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -73,12 +71,4 @@
                 this.name, this.location, this.availableSpace, this.totalSpace, this.type);
         return directoryOption;
     }
-
-    /**
-     * Records a histogram for this directory option when the user selects this directory option.
-     */
-    public void recordDirectoryOptionType() {
-        RecordHistogram.recordEnumeratedHistogram("MobileDownload.Location.Setting.DirectoryType",
-                type, DirectoryOption.DownloadLocationDirectoryType.NUM_ENTRIES);
-    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
index 20735d4..93eab9f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadController.java
@@ -79,6 +79,8 @@
     private static void onDownloadCompleted(DownloadInfo downloadInfo) {
         if (sDownloadNotificationService == null) return;
         sDownloadNotificationService.onDownloadCompleted(downloadInfo);
+
+        DownloadMetrics.recordDownloadDirectoryType(downloadInfo.getFilePath());
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java
index de219f2..588c6f07 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadLocationDialogBridge.java
@@ -5,6 +5,7 @@
 package org.chromium.chrome.browser.download;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.browser.ChromeActivity;
 import org.chromium.chrome.browser.modaldialog.ModalDialogManager;
 import org.chromium.chrome.browser.modaldialog.ModalDialogView;
@@ -101,7 +102,10 @@
         if (mNativeDownloadLocationDialogBridge != 0) {
             PrefServiceBridge.getInstance().setDownloadAndSaveFileDefaultDirectory(
                     directoryOption.location);
-            directoryOption.recordDirectoryOptionType();
+
+            RecordHistogram.recordEnumeratedHistogram(
+                    "MobileDownload.Location.Dialog.DirectoryType", directoryOption.type,
+                    DirectoryOption.DownloadLocationDirectoryType.NUM_ENTRIES);
 
             File file = new File(directoryOption.location, fileName);
             nativeOnComplete(mNativeDownloadLocationDialogBridge, file.getAbsolutePath());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java
index 064daa6e..b9c039a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadMetrics.java
@@ -14,6 +14,7 @@
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
 
 /**
  * Records download related metrics on Android.
@@ -93,6 +94,26 @@
         }
     }
 
+    /**
+     * Records download directory type when a download is completed.
+     * @param filePath The absolute file path of the download.
+     */
+    public static void recordDownloadDirectoryType(String filePath) {
+        if (filePath == null || filePath.isEmpty()) return;
+
+        DownloadDirectoryProvider.getInstance().getAllDirectoriesOptions(
+                (ArrayList<DirectoryOption> dirs) -> {
+                    for (DirectoryOption dir : dirs) {
+                        if (filePath.contains(dir.location)) {
+                            RecordHistogram.recordEnumeratedHistogram(
+                                    "MobileDownload.Location.Download.DirectoryType", dir.type,
+                                    DirectoryOption.DownloadLocationDirectoryType.NUM_ENTRIES);
+                            return;
+                        }
+                    }
+                });
+    }
+
     private static boolean isNativeLoaded() {
         return ChromeBrowserInitializer.getInstance(ContextUtils.getApplicationContext())
                 .hasNativeInitializationCompleted();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/Filters.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/Filters.java
index d1b7f5c..201efe3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/Filters.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/filter/Filters.java
@@ -39,7 +39,7 @@
      * @param filter The {@link OfflineItem#filter} type to convert.
      * @return       The corresponding {@link FilterType}.
      */
-    public static @FilterType int fromOfflineItem(@OfflineItemFilter int filter) {
+    public static @FilterType Integer fromOfflineItem(@OfflineItemFilter int filter) {
         switch (filter) {
             case OfflineItemFilter.FILTER_PAGE:
                 return FilterType.SITES;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/BatchListObservable.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/BatchListObservable.java
index d95b86a7..462155d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/BatchListObservable.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/BatchListObservable.java
@@ -8,13 +8,14 @@
 import android.support.v7.util.BatchingListUpdateCallback;
 import android.support.v7.util.ListUpdateCallback;
 
-import org.chromium.chrome.browser.modelutil.ListObservableImpl;
+import org.chromium.chrome.browser.modelutil.SimpleListObservable;
 
 /**
- * Helper class to batch updates to ListObservable before notifying observers.
+ * Helper class to batch updates to SimpleListObservable before notifying observers.
  * @see BatchingListUpdateCallback
+ * @param <T> The object type that this class manages in a list.
  */
-public abstract class BatchListObservable extends ListObservableImpl<Void> {
+public abstract class BatchListObservable<T> extends SimpleListObservable<T> {
     final BatchingListUpdateCallback mBatchingCallback;
 
     /** Creates a new BatchListObservable instance. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
index 74df9aed..177c5f5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMediator.java
@@ -72,7 +72,7 @@
                 boolean selected = mSelectionDelegate.isItemSelected(item);
                 item.showSelectedAnimation = selected && !item.selected;
                 item.selected = selected;
-                mModel.setItem(i, item);
+                mModel.update(i, item);
             }
             mModel.dispatchLastEvent();
             mModel.getProperties().setValue(
@@ -141,6 +141,7 @@
      * @see TypeOfflineItemFilter#onFilterSelected(int)
      */
     public void onFilterTypeSelected(@FilterType int filter) {
+        mListMutator.onFilterTypeSelected(filter);
         try (AnimationDisableClosable closeable = new AnimationDisableClosable()) {
             mTypeFilter.onFilterSelected(filter);
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java
index d647f4c5..b032eea 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutator.java
@@ -5,16 +5,22 @@
 package org.chromium.chrome.browser.download.home.list;
 
 import org.chromium.base.CollectionUtil;
+import org.chromium.chrome.browser.download.home.filter.Filters;
 import org.chromium.chrome.browser.download.home.filter.OfflineItemFilterObserver;
 import org.chromium.chrome.browser.download.home.filter.OfflineItemFilterSource;
-import org.chromium.components.offline_items_collection.ContentId;
+import org.chromium.chrome.browser.download.home.list.ListItem.DateListItem;
+import org.chromium.chrome.browser.download.home.list.ListItem.OfflineItemListItem;
+import org.chromium.chrome.browser.download.home.list.ListItem.SectionHeaderListItem;
+import org.chromium.chrome.browser.download.home.list.ListItem.SeparatorViewListItem;
 import org.chromium.components.offline_items_collection.OfflineItem;
+import org.chromium.components.offline_items_collection.OfflineItemFilter;
 
 import java.util.ArrayList;
-import java.util.Calendar;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 /**
  * A class responsible for turning a {@link Collection} of {@link OfflineItem}s into a list meant
@@ -30,10 +36,14 @@
  *   for an example since that is close to doing what we want - minus the contains() call).
  */
 class DateOrderedListMutator implements OfflineItemFilterObserver {
-    private static final int INVALID_INDEX = -1;
-
     private final ListItemModel mModel;
 
+    private final Map<Date, DateGroup> mDateGroups =
+            new TreeMap<>((lhs, rhs) -> { return rhs.compareTo(lhs); });
+
+    private boolean mHideAllHeaders;
+    private boolean mHideSectionHeaders;
+
     /**
      * Creates an DateOrderedList instance that will reflect {@code source}.
      * @param source The source of data for this list.
@@ -45,106 +55,174 @@
         onItemsAdded(source.getItems());
     }
 
+    /**
+     * Called when the selected tab or chip has changed.
+     * @param filter The currently selected filter type.
+     */
+    public void onFilterTypeSelected(@Filters.FilterType int filter) {
+        mHideAllHeaders = filter == Filters.FilterType.PREFETCHED;
+        mHideSectionHeaders = filter != Filters.FilterType.NONE;
+    }
+
     // OfflineItemFilterObserver implementation.
     @Override
     public void onItemsAdded(Collection<OfflineItem> items) {
-        List<OfflineItem> sorted = new ArrayList<>(items);
-        Collections.sort(sorted, (lhs, rhs) -> {
-            long delta = rhs.creationTimeMs - lhs.creationTimeMs;
-            if (delta > 0) return 1;
-            if (delta < 0) return -1;
-            return 0;
-        });
-
-        for (OfflineItem item : sorted) {
-            int index = getBestIndexFor(item);
-            mModel.addItem(index, new ListItem.OfflineItemListItem(item));
-
-            boolean isFirst = index == 0;
-            boolean isPrevSameDay = !isFirst
-                    && CalendarUtils.isSameDay(
-                               getItemAt(index - 1).date.getTime(), item.creationTimeMs);
-
-            if (isFirst || !isPrevSameDay) {
-                Calendar startOfDay = CalendarUtils.getStartOfDay(item.creationTimeMs);
-                mModel.addItem(index, new ListItem.DateListItem(startOfDay));
+        for (OfflineItem item : items) {
+            Date date = getDateFromOfflineItem(item);
+            DateGroup dateGroup = mDateGroups.get(date);
+            if (dateGroup == null) {
+                dateGroup = new DateGroup();
+                mDateGroups.put(date, dateGroup);
             }
+            dateGroup.addItem(item);
         }
 
-        mModel.dispatchLastEvent();
+        pushItemsToModel();
     }
 
     @Override
     public void onItemsRemoved(Collection<OfflineItem> items) {
-        for (int i = mModel.size() - 1; i >= 0; i--) {
-            ListItem.DateListItem item = getItemAt(i);
-            boolean isHeader = isHeader(item);
-            boolean isLast = i == mModel.size() - 1;
-            boolean isNextHeader = isLast ? false : isHeader(getItemAt(i + 1));
-            boolean removeHeader = isHeader && (isLast || isNextHeader);
-            boolean removeItem = !isHeader && items.contains(getOfflineItemFrom(item));
+        for (OfflineItem item : items) {
+            Date date = getDateFromOfflineItem(item);
+            DateGroup dateGroup = mDateGroups.get(date);
+            if (dateGroup == null) continue;
 
-            if (removeHeader || removeItem) mModel.removeItem(i);
+            dateGroup.removeItem(item);
+            if (dateGroup.sections.isEmpty()) {
+                mDateGroups.remove(date);
+            }
         }
 
-        mModel.dispatchLastEvent();
+        pushItemsToModel();
     }
 
     @Override
     public void onItemUpdated(OfflineItem oldItem, OfflineItem item) {
         assert oldItem.id.equals(item.id);
 
-        int i = indexOfItem(oldItem.id);
-        if (i == INVALID_INDEX) return;
-
-        // If the update changed the creation time, remove and add the element to get it positioned.
-        if (oldItem.creationTimeMs != item.creationTimeMs) {
+        // If the update changed the creation time or filter type, remove and add the element to get
+        // it positioned.
+        if (oldItem.creationTimeMs != item.creationTimeMs || oldItem.filter != item.filter) {
+            // TODO(shaktisahu): Collect UMA when this happens.
             onItemsRemoved(CollectionUtil.newArrayList(oldItem));
             onItemsAdded(CollectionUtil.newArrayList(item));
         } else {
-            mModel.setItem(i, new ListItem.OfflineItemListItem(item));
+            for (int i = 0; i < mModel.size(); i++) {
+                ListItem listItem = mModel.get(i);
+                if (!(listItem instanceof OfflineItemListItem)) continue;
+
+                OfflineItem offlineListItem = ((OfflineItemListItem) listItem).item;
+                if (item.id.equals(offlineListItem.id)) {
+                    mModel.update(i, new OfflineItemListItem(item));
+                }
+            }
         }
 
         mModel.dispatchLastEvent();
     }
 
-    private int indexOfItem(ContentId id) {
-        for (int i = 0; i < mModel.size(); i++) {
-            ListItem.DateListItem listItem = getItemAt(i);
-            if (isHeader(listItem)) continue;
-            if (getOfflineItemFrom(listItem).id.equals(id)) return i;
+    // Flattens out the hierarchical data and adds items to the model in the order they should be
+    // displayed. Date header, section header, date separator and section separators are added
+    // wherever necessary. The existing items in the model are replaced by the new set of items
+    // computed.
+    // TODO(shaktisahu): Write a version having no headers for the prefetch tab.
+    private void pushItemsToModel() {
+        List<ListItem> listItems = new ArrayList<>();
+        int dateIndex = 0;
+        for (Date date : mDateGroups.keySet()) {
+            DateGroup dateGroup = mDateGroups.get(date);
+            int sectionIndex = 0;
+
+            // Add an item for the date header.
+            if (!mHideAllHeaders) {
+                listItems.add(new DateListItem(CalendarUtils.getStartOfDay(date.getTime())));
+            }
+
+            // For each section.
+            for (Integer filter : dateGroup.sections.keySet()) {
+                Section section = dateGroup.sections.get(filter);
+
+                // Add a section header.
+                if (!mHideSectionHeaders && !mHideAllHeaders) {
+                    SectionHeaderListItem sectionHeaderItem =
+                            new SectionHeaderListItem(filter, date.getTime());
+                    sectionHeaderItem.isFirstSectionOfDay = sectionIndex == 0;
+                    listItems.add(sectionHeaderItem);
+                }
+
+                // Add the items in the section.
+                for (OfflineItem offlineItem : section.items.values()) {
+                    OfflineItemListItem item = new OfflineItemListItem(offlineItem);
+                    if (section.items.size() == 1
+                            && offlineItem.filter == OfflineItemFilter.FILTER_IMAGE) {
+                        item.spanFullWidth = true;
+                    }
+                    listItems.add(item);
+                }
+
+                // Add a section separator if needed.
+                if (!mHideAllHeaders && sectionIndex < dateGroup.sections.size() - 1) {
+                    listItems.add(new SeparatorViewListItem(date.getTime(), filter));
+                }
+                sectionIndex++;
+            }
+
+            // Add a date separator if needed.
+            if (!mHideAllHeaders && dateIndex < mDateGroups.size() - 1) {
+                listItems.add(new SeparatorViewListItem(date.getTime()));
+            }
+            dateIndex++;
         }
 
-        return INVALID_INDEX;
+        mModel.set(listItems);
+        mModel.dispatchLastEvent();
     }
 
-    private int getBestIndexFor(OfflineItem item) {
-        for (int i = 0; i < mModel.size(); i++) {
-            ListItem.DateListItem listItem = getItemAt(i);
+    private Date getDateFromOfflineItem(OfflineItem offlineItem) {
+        return CalendarUtils.getStartOfDay(offlineItem.creationTimeMs).getTime();
+    }
 
-            // We need to compare different things depending on whether or not the ListItem is a
-            // header.  If it is a header we want to compare the day, otherwise we want to compare
-            // the exact time.
-            long itemTimestamp = isHeader(listItem)
-                    ? CalendarUtils.getStartOfDay(item.creationTimeMs).getTimeInMillis()
-                    : item.creationTimeMs;
+    /** Represents a group of items which were downloaded on the same day. */
+    private static class DateGroup {
+        /**
+         * The list of sections for the day. The ordering is done in the same order as {@code
+         * Filters.FilterType}.
+         */
+        public Map<Integer, Section> sections = new TreeMap<>((lhs, rhs) -> {
+            return Filters.fromOfflineItem(lhs).compareTo(Filters.fromOfflineItem(rhs));
+        });
 
-            if (itemTimestamp > listItem.date.getTime()) return i;
+        public void addItem(OfflineItem item) {
+            Section section = sections.get(item.filter);
+            if (section == null) {
+                section = new Section();
+                sections.put(item.filter, section);
+            }
+            section.addItem(item);
         }
 
-        return mModel.size();
+        public void removeItem(OfflineItem item) {
+            Section section = sections.get(item.filter);
+            if (section == null) return;
+
+            section.removeItem(item);
+            if (section.items.isEmpty()) {
+                sections.remove(item.filter);
+            }
+        }
     }
 
-    private ListItem.DateListItem getItemAt(int index) {
-        return (ListItem.DateListItem) mModel.get(index);
-    }
+    /** Represents a group of items having the same filter type. */
+    private static class Section {
+        public Map<Date, OfflineItem> items =
+                new TreeMap<>((lhs, rhs) -> { return rhs.compareTo(lhs); });
 
-    private boolean isHeader(ListItem.DateListItem item) {
-        return !(item instanceof ListItem.OfflineItemListItem);
-    }
+        public void addItem(OfflineItem item) {
+            items.put(new Date(item.creationTimeMs), item);
+        }
 
-    private OfflineItem getOfflineItemFrom(ListItem.DateListItem item) {
-        if (isHeader(item)) return null;
-        return ((ListItem.OfflineItemListItem) item).item;
+        public void removeItem(OfflineItem item) {
+            items.remove(new Date(item.creationTimeMs));
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
index ea318f0..40015a1d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItem.java
@@ -14,6 +14,10 @@
 
 /** An abstract class that represents a variety of possible list items to show in downloads home. */
 public abstract class ListItem {
+    private static final long DATE_SEPARATOR_HASH_CODE_OFFSET = 10;
+    private static final long SECTION_SEPARATOR_HASH_CODE_OFFSET = 100;
+    private static final long SECTION_HEADER_HASH_CODE_OFFSET = 1000;
+
     public final long stableId;
 
     /** Indicates that we are in multi-select mode and the item is currently selected. */
@@ -66,9 +70,69 @@
         }
     }
 
+    /** A {@link ListItem} representing a section header. */
+    public static class SectionHeaderListItem extends DateListItem {
+        public final int filter;
+        public boolean isFirstSectionOfDay;
+
+        /**
+         * Creates a {@link SectionHeaderListItem} instance for a given {@code filter} and
+         * {@code timestamp}.
+         */
+        public SectionHeaderListItem(int filter, long timestamp) {
+            super(generateStableId(timestamp, filter), new Date(timestamp));
+            this.filter = filter;
+        }
+
+        @VisibleForTesting
+        static long generateStableId(long timestamp, int filter) {
+            long hash = new Date(timestamp).hashCode();
+            return hash + filter + SECTION_HEADER_HASH_CODE_OFFSET;
+        }
+    }
+
+    /** A {@link ListItem} representing a divider that separates sections and dates. */
+    public static class SeparatorViewListItem extends DateListItem {
+        private final boolean mIsDateDivider;
+
+        /**
+         * Creates a separator to be shown at the end of a given date.
+         * @param timestamp The date corresponding to this group of downloads.
+         */
+        public SeparatorViewListItem(long timestamp) {
+            super(generateStableId(timestamp), new Date(timestamp));
+            mIsDateDivider = true;
+        }
+
+        /**
+         * Creates a separator to be shown at the end of a section for a given section on a given
+         * date.
+         * @param timestamp The date corresponding to the section.
+         * @param filter The type of downloads contained in this section.
+         */
+        public SeparatorViewListItem(long timestamp, int filter) {
+            super(generateStableId(timestamp, filter), new Date(timestamp));
+            mIsDateDivider = false;
+        }
+
+        /** Whether this view represents a date divider. */
+        public boolean isDateDivider() {
+            return mIsDateDivider;
+        }
+
+        private static long generateStableId(long timestamp) {
+            return ((long) (new Date(timestamp).hashCode())) + DATE_SEPARATOR_HASH_CODE_OFFSET;
+        }
+
+        private static long generateStableId(long timestamp, int filter) {
+            return generateStableId(timestamp) + filter + SECTION_SEPARATOR_HASH_CODE_OFFSET;
+        }
+    }
+
     /** A {@link ListItem} that involves a {@link OfflineItem}. */
     public static class OfflineItemListItem extends DateListItem {
         public final OfflineItem item;
+        public boolean spanFullWidth;
 
         /** Creates an {@link OfflineItemListItem} wrapping {@code item}. */
         public OfflineItemListItem(OfflineItem item) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemModel.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemModel.java
index adf0985d..154ccd0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListItemModel.java
@@ -4,20 +4,14 @@
 
 package org.chromium.chrome.browser.download.home.list;
 
-import org.chromium.chrome.browser.modelutil.ListObservable;
 import org.chromium.chrome.browser.modelutil.PropertyModel;
-import org.chromium.chrome.browser.modelutil.SimpleList;
-
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * This model represents the data required to build a list UI around a set of {@link ListItem}s.
- * This includes (1) a {@link ListObservable} implementation and (2) exposing a
+ * This includes (1) a {@link BatchListObservable} implementation and (2) exposing a
  * {@link PropertyModel} for shared item properties and general list information.
  */
-class ListItemModel extends BatchListObservable implements SimpleList<ListItem> {
-    private final List<ListItem> mItems = new ArrayList<>();
+class ListItemModel extends BatchListObservable<ListItem> {
     private final PropertyModel mListProperties = new PropertyModel(ListProperties.ALL_KEYS);
 
     /**
@@ -27,33 +21,4 @@
     public PropertyModel getProperties() {
         return mListProperties;
     }
-
-    /** Adds {@code item} to this list at {@code index}. */
-    public void addItem(int index, ListItem item) {
-        mItems.add(index, item);
-        notifyItemInserted(index);
-    }
-
-    /** Removes the {@link ListItem} at {@code index}. */
-    public void removeItem(int index) {
-        mItems.remove(index);
-        notifyItemRemoved(index);
-    }
-
-    /** Sets the {@link ListItem} at {@code index} to {@code item}. */
-    public void setItem(int index, ListItem item) {
-        mItems.set(index, item);
-        notifyItemChanged(index);
-    }
-
-    // SimpleList implementation.
-    @Override
-    public ListItem get(int index) {
-        return mItems.get(index);
-    }
-
-    @Override
-    public int size() {
-        return mItems.size();
-    }
-}
\ No newline at end of file
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java
index 7e78d6b1..a1b5bce 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/ListUtils.java
@@ -5,7 +5,9 @@
 package org.chromium.chrome.browser.download.home.list;
 
 import android.support.annotation.IntDef;
+import android.support.annotation.StringRes;
 
+import org.chromium.chrome.R;
 import org.chromium.chrome.browser.download.home.list.ListItem.DateListItem;
 import org.chromium.chrome.browser.download.home.list.ListItem.OfflineItemListItem;
 import org.chromium.chrome.browser.download.home.list.ListItem.ViewListItem;
@@ -19,7 +21,8 @@
 public class ListUtils {
     /** The potential types of list items that could be displayed. */
     @IntDef({ViewType.DATE, ViewType.IN_PROGRESS, ViewType.GENERIC, ViewType.VIDEO, ViewType.IMAGE,
-            ViewType.CUSTOM_VIEW, ViewType.PREFETCH})
+            ViewType.CUSTOM_VIEW, ViewType.PREFETCH, ViewType.SECTION_HEADER,
+            ViewType.SEPARATOR_DATE, ViewType.SEPARATOR_SECTION})
     @Retention(RetentionPolicy.SOURCE)
     public @interface ViewType {
         int DATE = 0;
@@ -29,6 +32,9 @@
         int IMAGE = 4;
         int CUSTOM_VIEW = 5;
         int PREFETCH = 6;
+        int SECTION_HEADER = 7;
+        int SEPARATOR_DATE = 8;
+        int SEPARATOR_SECTION = 9;
     }
 
     private ListUtils() {}
@@ -42,6 +48,12 @@
      */
     public static @ViewType int getViewTypeForItem(ListItem item) {
         if (item instanceof ViewListItem) return ViewType.CUSTOM_VIEW;
+        if (item instanceof ListItem.SectionHeaderListItem) return ViewType.SECTION_HEADER;
+        if (item instanceof ListItem.SeparatorViewListItem) {
+            ListItem.SeparatorViewListItem separator = (ListItem.SeparatorViewListItem) item;
+            return separator.isDateDivider() ? ViewType.SEPARATOR_DATE : ViewType.SEPARATOR_SECTION;
+        }
+
         if (item instanceof DateListItem) {
             if (item instanceof OfflineItemListItem) {
                 OfflineItemListItem offlineItem = (OfflineItemListItem) item;
@@ -77,6 +89,28 @@
     }
 
     /**
+     * @return The id of the string to be displayed as the section header for the given filter.
+     */
+    public static @StringRes int getTextForSection(int filter) {
+        switch (filter) {
+            case OfflineItemFilter.FILTER_PAGE:
+                return R.string.download_manager_ui_pages;
+            case OfflineItemFilter.FILTER_IMAGE:
+                return R.string.download_manager_ui_images;
+            case OfflineItemFilter.FILTER_VIDEO:
+                return R.string.download_manager_ui_video;
+            case OfflineItemFilter.FILTER_AUDIO:
+                return R.string.download_manager_ui_audio;
+            case OfflineItemFilter.FILTER_OTHER:
+                return R.string.download_manager_ui_other;
+            case OfflineItemFilter.FILTER_DOCUMENT:
+                return R.string.download_manager_ui_documents;
+            default:
+                return R.string.download_manager_ui_all_downloads;
+        }
+    }
+
+    /**
      * Analyzes a {@link ListItem} and finds the best span size based on the current state.  Span
      * size determines how many columns this {@link ListItem}'s {@link View} will take up in the
      * overall list.
@@ -86,6 +120,10 @@
      * @see             GridLayoutManager.SpanSizeLookup
      */
     public static int getSpanSize(ListItem item, int spanCount) {
+        if (item instanceof OfflineItemListItem && ((OfflineItemListItem) item).spanFullWidth) {
+            return spanCount;
+        }
+
         return getViewTypeForItem(item) == ViewType.IMAGE ? 1 : spanCount;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java
index b07df5c..70f84cb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/CustomViewHolder.java
@@ -14,8 +14,7 @@
 
 /** A {@link RecyclerView.ViewHolder} that holds a {@link View} that is opaque to the holder. */
 public class CustomViewHolder extends ListItemViewHolder {
-    /** Creates a new {@link org.chromium.chrome.browser.download.home.list.holder.CustomViewHolder}
-     * instance. */
+    /** Creates a new {@link CustomViewHolder} instance. */
     public CustomViewHolder(ViewGroup parent) {
         super(new FrameLayout(parent.getContext()));
         itemView.setLayoutParams(new ViewGroup.LayoutParams(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java
index e3c1872..a3f0a29 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/DateViewHolder.java
@@ -16,8 +16,7 @@
 
 /** A {@link RecyclerView.ViewHolder} specifically meant to display a date header. */
 public class DateViewHolder extends ListItemViewHolder {
-    /** Creates a new {@link org.chromium.chrome.browser.download.home.list.holder.DateViewHolder}
-     * instance. */
+    /** Creates a new {@link DateViewHolder} instance. */
     public static org.chromium.chrome.browser.download.home.list.holder.DateViewHolder create(
             ViewGroup parent) {
         View view = LayoutInflater.from(parent.getContext())
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java
index 0786cbf..1632e45 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/GenericViewHolder.java
@@ -38,16 +38,13 @@
     /** The icon to use when there is no thumbnail. */
     private @DrawableRes int mIconId = INVALID_ID;
 
-    /** Creates a new {@link
-     * org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder} instance. */
-    public static org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder create(
-            ViewGroup parent) {
+    /** Creates a new {@link GenericViewHolder} instance. */
+    public static GenericViewHolder create(ViewGroup parent) {
         View view = LayoutInflater.from(parent.getContext())
                             .inflate(R.layout.download_manager_generic_item, null);
         int imageSize = parent.getContext().getResources().getDimensionPixelSize(
                 R.dimen.download_manager_generic_thumbnail_size);
-        return new org.chromium.chrome.browser.download.home.list.holder.GenericViewHolder(
-                view, imageSize);
+        return new GenericViewHolder(view, imageSize);
     }
 
     private GenericViewHolder(View view, int thumbnailSizePx) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
index 42ec086..dad498c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ImageViewHolder.java
@@ -16,18 +16,19 @@
 
 /** A {@link RecyclerView.ViewHolder} specifically meant to display an image {@code OfflineItem}. */
 public class ImageViewHolder extends ThumbnailAwareViewHolder {
-    public static org.chromium.chrome.browser.download.home.list.holder.ImageViewHolder create(
-            ViewGroup parent) {
+    private final int mImageHeightPx;
+
+    public static ImageViewHolder create(ViewGroup parent) {
         View view = LayoutInflater.from(parent.getContext())
                             .inflate(R.layout.download_manager_image_item, null);
         int imageSize = parent.getContext().getResources().getDimensionPixelSize(
                 R.dimen.download_manager_image_width);
-        return new org.chromium.chrome.browser.download.home.list.holder.ImageViewHolder(
-                view, imageSize);
+        return new ImageViewHolder(view, imageSize);
     }
 
     public ImageViewHolder(View view, int thumbnailSizePx) {
         super(view, thumbnailSizePx, thumbnailSizePx);
+        mImageHeightPx = thumbnailSizePx;
     }
 
     // ThumbnailAwareViewHolder implementation.
@@ -37,6 +38,9 @@
         ListItem.OfflineItemListItem offlineItem = (ListItem.OfflineItemListItem) item;
         View imageView = itemView.findViewById(R.id.thumbnail);
         imageView.setContentDescription(offlineItem.item.title);
+        ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
+        layoutParams.height =
+                offlineItem.spanFullWidth ? ViewGroup.LayoutParams.WRAP_CONTENT : mImageHeightPx;
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java
index 2af48b2..ec0ce711 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/InProgressViewHolder.java
@@ -18,8 +18,10 @@
 import org.chromium.chrome.browser.widget.TintedImageButton;
 import org.chromium.components.offline_items_collection.OfflineItemState;
 
-/** A {@link RecyclerView.ViewHolder} specifically meant to display an in-progress {@code
- * OfflineItem}. */
+/**
+ * A {@link RecyclerView.ViewHolder} specifically meant to display an in-progress {@code
+ * OfflineItem}.
+ */
 public class InProgressViewHolder extends ListItemViewHolder {
     private final ProgressBar mProgressBar;
     private final TextView mTitle;
@@ -28,20 +30,15 @@
     private final TintedImageButton mCancelButton;
 
     /**
-     * Creates a new {@link
-     * org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder} instance.
+     * Creates a new {@link InProgressViewHolder} instance.
      */
-    public static org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder create(
-            ViewGroup parent) {
+    public static InProgressViewHolder create(ViewGroup parent) {
         View view = LayoutInflater.from(parent.getContext())
                             .inflate(R.layout.download_manager_in_progress_item, null);
-        return new org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder(view);
+        return new InProgressViewHolder(view);
     }
 
-    /**
-     * Creates a new {@link
-     * org.chromium.chrome.browser.download.home.list.holder.InProgressViewHolder} instance.
-     */
+    /** Constructor. */
     public InProgressViewHolder(View view) {
         super(view);
         mProgressBar = view.findViewById(R.id.progress_bar);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java
index d7c73136..9152116 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java
@@ -43,6 +43,12 @@
                 return new CustomViewHolder(parent);
             case ListUtils.ViewType.PREFETCH:
                 return PrefetchViewHolder.create(parent);
+            case ListUtils.ViewType.SECTION_HEADER:
+                return SectionTitleViewHolder.create(parent);
+            case ListUtils.ViewType.SEPARATOR_DATE:
+                return SeparatorViewHolder.create(parent, true);
+            case ListUtils.ViewType.SEPARATOR_SECTION:
+                return SeparatorViewHolder.create(parent, false);
         }
 
         assert false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java
index baa344d..4eb4a58d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java
@@ -25,17 +25,14 @@
     private final TextView mTimestamp;
 
     /**
-     * Creates a new instance of a {@link
-     * org.chromium.chrome.browser.download.home.list.holder.PrefetchViewHolder}.
+     * Creates a new instance of a {@link PrefetchViewHolder}.
      */
-    public static org.chromium.chrome.browser.download.home.list.holder.PrefetchViewHolder create(
-            ViewGroup parent) {
+    public static PrefetchViewHolder create(ViewGroup parent) {
         View view = LayoutInflater.from(parent.getContext())
                             .inflate(R.layout.download_manager_prefetch_item, null);
         int imageSize = parent.getContext().getResources().getDimensionPixelSize(
                 R.dimen.download_manager_prefetch_thumbnail_size);
-        return new org.chromium.chrome.browser.download.home.list.holder.PrefetchViewHolder(
-                view, imageSize);
+        return new PrefetchViewHolder(view, imageSize);
     }
 
     private PrefetchViewHolder(View view, int thumbnailSizePx) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java
new file mode 100644
index 0000000..eb450cbf
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java
@@ -0,0 +1,58 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.download.home.list.holder;
+
+import android.content.res.Resources;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.download.home.list.ListItem;
+import org.chromium.chrome.browser.download.home.list.ListUtils;
+import org.chromium.chrome.browser.modelutil.PropertyModel;
+import org.chromium.components.offline_items_collection.OfflineItemFilter;
+
+/**
+ * A {@link ViewHolder} specifically meant to display a section header.
+ */
+public class SectionTitleViewHolder extends ListItemViewHolder {
+    /** Create a new {@link SectionTitleViewHolder} instance. */
+    public static SectionTitleViewHolder create(ViewGroup parent) {
+        View view = LayoutInflater.from(parent.getContext())
+                            .inflate(R.layout.download_manager_section_header, null);
+        return new SectionTitleViewHolder(view);
+    }
+
+    private SectionTitleViewHolder(View view) {
+        super(view);
+    }
+
+    // ListItemViewHolder implementation.
+    @Override
+    public void bind(PropertyModel properties, ListItem item) {
+        ListItem.SectionHeaderListItem sectionItem = (ListItem.SectionHeaderListItem) item;
+        ((TextView) itemView).setText(ListUtils.getTextForSection(sectionItem.filter));
+
+        boolean isPhoto = sectionItem.filter == OfflineItemFilter.FILTER_IMAGE;
+        Resources resources = itemView.getContext().getResources();
+
+        int paddingTop = resources.getDimensionPixelSize(isPhoto
+                        ? R.dimen.download_manager_section_title_padding_image
+                        : R.dimen.download_manager_section_title_padding_top);
+        int paddingBottom = resources.getDimensionPixelSize(isPhoto
+                        ? R.dimen.download_manager_section_title_padding_image
+                        : R.dimen.download_manager_section_title_padding_bottom);
+
+        if (sectionItem.isFirstSectionOfDay) {
+            paddingTop = resources.getDimensionPixelSize(
+                    R.dimen.download_manager_section_title_padding_top_condensed);
+        }
+
+        itemView.setPadding(
+                itemView.getPaddingLeft(), paddingTop, itemView.getPaddingRight(), paddingBottom);
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SeparatorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SeparatorViewHolder.java
new file mode 100644
index 0000000..eb12f41
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/home/list/holder/SeparatorViewHolder.java
@@ -0,0 +1,39 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.download.home.list.holder;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.download.home.list.ListItem;
+import org.chromium.chrome.browser.modelutil.PropertyModel;
+
+/**
+ * A {@link ViewHolder} specifically meant to display a separator.
+ */
+public class SeparatorViewHolder extends ListItemViewHolder {
+    /**
+     * Creates a new {@link SeparatorViewHolder} instance.
+     * @param isDateDivider Whether the divider is between dates or individual sections.
+     */
+    public static SeparatorViewHolder create(ViewGroup parent, boolean isDateDivider) {
+        View dividerView =
+                LayoutInflater.from(parent.getContext())
+                        .inflate(isDateDivider ? R.layout.download_manager_date_separator
+                                               : R.layout.download_manager_section_separator,
+                                null);
+        return new SeparatorViewHolder(dividerView);
+    }
+
+    private SeparatorViewHolder(View view) {
+        super(view);
+    }
+
+    // ListItemViewHolder implementation.
+    @Override
+    public void bind(PropertyModel properties, ListItem item) {}
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
index 873587f..6e991251 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
@@ -85,7 +85,9 @@
         DisplayManager displayManager =
                 (DisplayManager) activity.getSystemService(Context.DISPLAY_SERVICE);
         Display[] displays = displayManager.getDisplays();
-        return displays != null && displays.length == 2;
+        if (displays == null || displays.length != 2) return false;
+        return displays[0].getState() == Display.STATE_ON
+                && displays[1].getState() == Display.STATE_ON;
     }
 
     @VisibleForTesting
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/notifications/OWNERS
index f425d44b..d362060 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/OWNERS
@@ -4,7 +4,6 @@
 # //chrome/android/javatests/src/org/chromium/chrome/browser/notifications/
 # //chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/notifications/
 
-awdf@chromium.org
 peter@chromium.org
 
 # TEAM: platform-capabilities@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/OWNERS b/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/OWNERS
index 68ef60e..7dc17a7 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/OWNERS
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/channels/OWNERS
@@ -2,7 +2,6 @@
 # added or removed lightly, and the proper deprecation and versioning steps must be taken when doing
 # so. Please read the README and speak to one of us when adding/removing a channel.
 per-file ChannelDefinitions.java=set noparent
-per-file ChannelDefinitions.java=awdf@chromium.org
 per-file ChannelDefinitions.java=peter@chromium.org
 per-file ChannelDefinitions.java=nyquist@chromium.org
 per-file ChannelDefinitions.java=dtrainor@chromium.org
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index c22db78c..f19610e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -298,10 +298,8 @@
      */
     public void setAllowFocus(boolean allowFocus) {
         mAllowFocus = allowFocus;
-        if (mFirstDrawComplete) {
-            setFocusable(allowFocus);
-            setFocusableInTouchMode(allowFocus);
-        }
+        setFocusable(allowFocus);
+        setFocusableInTouchMode(allowFocus);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java
index b2571b2..7104427 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarMediator.java
@@ -47,6 +47,7 @@
         mModel.setValue(UrlBarProperties.FOCUS_CHANGE_CALLBACK, this::onUrlFocusChange);
         mModel.setValue(UrlBarProperties.SHOW_CURSOR, false);
         mModel.setValue(UrlBarProperties.TEXT_CONTEXT_MENU_DELEGATE, this);
+        setUseDarkTextColors(true);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java
index 87388b1..8a6fff8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omnibox/UrlBarViewBinder.java
@@ -32,8 +32,7 @@
             view.setCustomSelectionActionModeCallback(
                     model.getValue(UrlBarProperties.ACTION_MODE_CALLBACK));
         } else if (UrlBarProperties.ALLOW_FOCUS.equals(propertyKey)) {
-            boolean allowFocus = model.getValue(UrlBarProperties.ALLOW_FOCUS);
-            view.setAllowFocus(allowFocus);
+            view.setAllowFocus(model.getValue(UrlBarProperties.ALLOW_FOCUS));
         } else if (UrlBarProperties.AUTOCOMPLETE_TEXT.equals(propertyKey)) {
             AutocompleteText autocomplete = model.getValue(UrlBarProperties.AUTOCOMPLETE_TEXT);
             if (view.shouldAutocomplete()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
index b111b48..f21d403c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
@@ -627,9 +627,10 @@
                 LineItem item = cart.getContents().get(i);
 
                 TextView description = new TextView(context);
-                ApiCompatibilityUtils.setTextAppearance(description, item.getIsPending()
-                                ? R.style.PaymentsUiSectionPendingTextEndAligned
-                                : R.style.PaymentsUiSectionDescriptiveTextEndAligned);
+                ApiCompatibilityUtils.setTextAppearance(description,
+                        item.getIsPending()
+                            ? R.style.TextAppearance_PaymentsUiSectionPendingTextEndAligned
+                            : R.style.TextAppearance_PaymentsUiSectionDescriptiveTextEndAligned);
                 description.setText(item.getLabel());
                 description.setEllipsize(TruncateAt.END);
                 description.setMaxLines(2);
@@ -638,9 +639,10 @@
                 }
 
                 TextView amount = new TextView(context);
-                ApiCompatibilityUtils.setTextAppearance(amount, item.getIsPending()
-                                ? R.style.PaymentsUiSectionPendingTextEndAligned
-                                : R.style.PaymentsUiSectionDescriptiveTextEndAligned);
+                ApiCompatibilityUtils.setTextAppearance(amount,
+                        item.getIsPending()
+                            ? R.style.TextAppearance_PaymentsUiSectionPendingTextEndAligned
+                            : R.style.TextAppearance_PaymentsUiSectionDescriptiveTextEndAligned);
                 amount.setText(createValueString(item.getCurrency(), item.getPrice(), false));
 
                 // Each item is represented by a row in the GridLayout.
@@ -931,8 +933,7 @@
                 if (mRowType == OPTION_ROW_TYPE_OPTION) {
                     // Show the string representing the EditableOption.
                     ApiCompatibilityUtils.setTextAppearance(labelView,
-                            isEnabled ? R.style.BlackTitle1
-                                      : R.style.PaymentsUiSectionDisabledText);
+                            isEnabled ? R.style.BlackTitle1 : R.style.BlackDisabledText1);
                     labelView.setText(convertOptionToString(mOption, false, /* excludeMainLabel */
                             mDelegate.isBoldLabelNeeded(OptionSection.this),
                             false /* singleLine */));
@@ -943,7 +944,7 @@
                             R.dimen.payments_section_add_button_height);
 
                     ApiCompatibilityUtils.setTextAppearance(
-                            labelView, R.style.EditorDialogSectionAddButtonLabel);
+                            labelView, R.style.TextAppearance_EditorDialogSectionAddButton);
                     labelView.setMinimumHeight(buttonHeight);
                     labelView.setGravity(Gravity.CENTER_VERTICAL);
                     labelView.setTypeface(UiUtils.createRobotoMediumTypeface());
@@ -952,13 +953,12 @@
                     columnStart = 0;
                     columnSpan = 4;
 
-                    ApiCompatibilityUtils.setTextAppearance(
-                            labelView, R.style.PaymentsUiSectionDescriptiveText);
+                    ApiCompatibilityUtils.setTextAppearance(labelView, R.style.BlackBody);
                 } else if (mRowType == OPTION_ROW_TYPE_WARNING) {
                     // Warnings use three columns.
                     columnSpan = 3;
                     ApiCompatibilityUtils.setTextAppearance(
-                            labelView, R.style.PaymentsUiSectionWarningText);
+                            labelView, R.style.TextAppearance_PaymentsUiSectionWarningText);
                 }
 
                 // The label spans two columns if no option or edit icon, or spans three columns if
@@ -1064,7 +1064,7 @@
          */
         private boolean mSplitSummaryInDisplayModeNormal;
 
-        /** Indicates whether the summary is set to R.style.PaymentsUiSectionDescriptiveText. */
+        /** Indicates whether the summary is set to descriptive or title text style. */
         private boolean mSummaryInDescriptiveText;
 
         private FocusChangedObserver mFocusChangedObserver;
@@ -1289,10 +1289,10 @@
 
             if (selectedItem == null) {
                 setLogoDrawable(null);
-                // Section summary should be displayed as R.style.PaymentsUiSectionDescriptiveText.
+                // Section summary should be displayed as descriptive text style.
                 if (!mSummaryInDescriptiveText) {
                     ApiCompatibilityUtils.setTextAppearance(
-                            getSummaryLeftTextView(), R.style.PaymentsUiSectionDescriptiveText);
+                            getSummaryLeftTextView(), R.style.BlackBody);
                     mSummaryInDescriptiveText = true;
                 }
                 SectionUiUtils.showSectionSummaryInTextViewInSingeLine(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
index 9e294a6..21c3adcd 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -1055,7 +1055,7 @@
         TextView view = new TextViewWithClickableSpans(mContext);
         view.setText(spannableMessage);
         view.setMovementMethod(LinkMovementMethod.getInstance());
-        ApiCompatibilityUtils.setTextAppearance(view, R.style.PaymentsUiSectionDescriptiveText);
+        ApiCompatibilityUtils.setTextAppearance(view, R.style.BlackBody);
 
         // Add paddings instead of margin to let getMeasuredHeight return correct value for section
         // resize animation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java
index dffaa58..4ae0130 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/download/DownloadLocationPreferenceAdapter.java
@@ -14,6 +14,7 @@
 import android.widget.RadioButton;
 import android.widget.TextView;
 
+import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.download.DirectoryOption;
 import org.chromium.chrome.browser.download.DownloadUtils;
@@ -100,7 +101,8 @@
         // Update the preference after selected position is updated.
         if (mDelegate != null) mDelegate.onDirectorySelectionChanged();
 
-        option.recordDirectoryOptionType();
+        RecordHistogram.recordEnumeratedHistogram("MobileDownload.Location.Setting.DirectoryType",
+                option.type, DirectoryOption.DownloadLocationDirectoryType.NUM_ENTRIES);
 
         // Refresh the list of download directories UI.
         notifyDataSetChanged();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
index 84b1c7b..8e62d8a3 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -194,6 +194,9 @@
         if (mQueuedUrl != null) loadUrl(mQueuedUrl);
 
         AutocompleteController.nativePrefetchZeroSuggestResults();
+        // TODO(tedchoc): Warmup triggers the CustomTab layout to be inflated, but this widget
+        //                will navigate to Tabbed mode.  Investigate whether this can inflate
+        //                the tabbed mode layout in the background instead of CCTs.
         CustomTabsConnection.getInstance().warmup(0);
         mSearchBox.onDeferredStartup(isVoiceSearchIntent());
         RecordUserAction.record("SearchWidget.WidgetSelected");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java
index 74aa35f..ab49b7c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappDataStorage.java
@@ -183,7 +183,7 @@
                 callback.onDataRetrieved(result);
             }
         }
-                .execute();
+                .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java
index 9b4e14c2..65473c57 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java
@@ -136,7 +136,7 @@
                 if (callback != null) callback.onWebappDataStorageRetrieved(storage);
             }
         }
-                .execute();
+                .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java
index cacf5c750..019afb8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webauth/Fido2ApiHandler.java
@@ -15,7 +15,7 @@
 
 /**
  * Android implementation of the Authenticator service defined in
- * components/webauth/authenticator.mojom.
+ * //third_party/blink/public/platform/modules/webauth/authenticator.mojom.
  */
 public class Fido2ApiHandler {
     private static Fido2ApiHandler sInstance;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
index 4df028bf..71bbab6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/DualControlLayout.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.res.Resources;
 import android.content.res.TypedArray;
-import android.graphics.Color;
 import android.support.annotation.IntDef;
 import android.text.TextUtils;
 import android.util.AttributeSet;
@@ -65,8 +64,6 @@
      */
     public static Button createButtonForLayout(
             Context context, boolean isPrimary, String text, OnClickListener listener) {
-        int textColorLink = ApiCompatibilityUtils.getColor(
-                context.getResources(), R.color.default_text_color_link);
         int buttonColor =
                 ApiCompatibilityUtils.getColor(context.getResources(), R.color.light_active_color);
 
@@ -75,14 +72,14 @@
             primaryButton.setId(R.id.button_primary);
             primaryButton.setOnClickListener(listener);
             primaryButton.setText(text);
-            primaryButton.setTextColor(Color.WHITE);
+            ApiCompatibilityUtils.setTextAppearance(primaryButton, R.style.WhiteButtonText);
             return primaryButton;
         } else {
             Button secondaryButton = ButtonCompat.createBorderlessButton(context);
             secondaryButton.setId(R.id.button_secondary);
             secondaryButton.setOnClickListener(listener);
             secondaryButton.setText(text);
-            secondaryButton.setTextColor(textColorLink);
+            ApiCompatibilityUtils.setTextAppearance(secondaryButton, R.style.BlueButtonText2);
             return secondaryButton;
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/HintedDropDownAdapterWithPlusIcon.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/HintedDropDownAdapterWithPlusIcon.java
index bf74f815..22c5c6f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/HintedDropDownAdapterWithPlusIcon.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/prefeditor/HintedDropDownAdapterWithPlusIcon.java
@@ -76,7 +76,7 @@
 
             // Set the correct appearance, face and style for the text.
             ApiCompatibilityUtils.setTextAppearance(
-                    mTextView, R.style.EditorDialogSectionAddButtonLabel);
+                    mTextView, R.style.TextAppearance_EditorDialogSectionAddButton);
             mTextView.setTypeface(UiUtils.createRobotoMediumTypeface());
 
             // Padding at the bottom of the dropdown.
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 f302de8..fe65550 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_am.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" />ን በማከል ላይ...</translation>
 <translation id="1041308826830691739">ከድር ጣቢያዎች</translation>
 <translation id="1049743911850919806">ማንነት የማያሳውቅ</translation>
+<translation id="1054301162707478098">እርስዎ የግል ሆነዋል።</translation>
 <translation id="10614374240317010">በጭራሽ አልተቀመጠም</translation>
 <translation id="1068672505746868501">በ<ph name="SOURCE_LANGUAGE" /> ውስጥ ገጾችን በጭራሽ አትተርጉም</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">ተጨማሪ ቋንቋዎች</translation>
 <translation id="124678866338384709">የአሁኑን ትር ዝጋ</translation>
 <translation id="1258753120186372309">Google doodle፦ <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">በግል ትሮች ላይ የሚያዩዋቸው ገጾች ሁሉንም የግል ትሮችዎን ከዘጉ በኋላ በእርስዎ የአሳሽ ታሪክ፣ የኩኪ ማከማቻ ወይም የፍለጋ ታሪክ ውስጥ አይቆዩም። የሚያወርዷቸው ማንኛቸውም ፋይሎች ወይም ዕልባቶች ይቀመጣሉ።
+
+ይሁንና እርስዎ ስውር አይደሉም። የግል መሆን የእርስዎን አሰሳ ከአሰሪዎ፣ ከበይነመረብ አገልጋይዎ ወይም ከሚጎበኟቸው ድር ጣቢያዎች አይደብቁዎውም።</translation>
 <translation id="127138278192656016">ማመሳሰልን እና ሁሉንም አገልግሎቶች ይጠቀሙ</translation>
 <translation id="1272079795634619415">አቁም</translation>
 <translation id="1283039547216852943">ለመዘርጋት መታ ያድርጉ</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">የሙሉ ማያ ገጽ ጣቢያ መቆጣጠሪያዎች</translation>
 <translation id="2038563949887743358">የዴስክቶፕ ጣቢያን ጠይቅን አብራ</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> ጊባ ሌሎች መተግበሪያዎች</translation>
+<translation id="2055670718290744343">የፍለጋ ማፍጠኛ</translation>
 <translation id="2063713494490388661">ለመፈለግ መታ ያድርጉ</translation>
 <translation id="2079545284768500474">ቀልብስ</translation>
 <translation id="2082238445998314030">ውጤት <ph name="RESULT_NUMBER" /> ከ<ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">ማመሳሰል እና የGoogle አገልግሎቶች</translation>
 <translation id="2259659629660284697">የይለፍ ቃላትን ወደ ውጭ ላክ...</translation>
 <translation id="2268044343513325586">አጽዳ</translation>
+<translation id="2280910239864711607">አዲስ ትር በግል ሁነታ ውስጥ ክፈት</translation>
 <translation id="2286841657746966508">የመላኪያ አድራሻ</translation>
 <translation id="230115972905494466">ምንም ተኳሃኝ መሣሪያዎች አልተገኙም</translation>
 <translation id="2315043854645842844">የደንበኛ ወገን ዕውቅና ማረጋገጫ ምርጫ በስርዓተ-ክወናው አይደገፍም።</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">ጃቫስክሪፕትን ለአንድ የተወሰነ ጣቢያ ፍቀድ።</translation>
 <translation id="2625189173221582860">የይለፍ ቃል ተቀድቷል።</translation>
 <translation id="2631006050119455616">ተቀምጧል</translation>
+<translation id="2633278372998075009">የግል ትሮችq</translation>
 <translation id="2647434099613338025">ቋንቋ አክል</translation>
 <translation id="2650751991977523696">ፋይሉ እንደገና ይውረድ?</translation>
 <translation id="2653659639078652383">አስገባ</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">የእርስዎን የይለፍሐረግ ከረሱት ወይም ይህን ቅንብር መለወጥ ከፈለጉ <ph name="BEGIN_LINK" />ስምረትን ዳግም ያስጀምሩ<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">ማይክሮፎን</translation>
 <translation id="3232754137068452469">የድር መተግበሪያ</translation>
+<translation id="3234355010754616171">አዲስ የግል ትር</translation>
 <translation id="3236059992281584593">1 ደቂቃ ይቀራል</translation>
 <translation id="3244271242291266297">ወወ</translation>
 <translation id="3254409185687681395">ለእዚህ ገጽ ዕልባት አብጅ</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">ሁሉንም ማንነት የማያሳውቅ ትሮችን ይዝጉ</translation>
 <translation id="3365671512111106261">ውሂብ ቆጣቢ በሚበራበት ጊዜ አይገኝም</translation>
 <translation id="3367813778245106622">ስምረትን ለመጀመር እንደገና ይግቡ</translation>
+<translation id="3377025655491224618">የግል ትር</translation>
 <translation id="3384347053049321195">ምስል አጋራ</translation>
 <translation id="3386292677130313581">ጣቢያዎች አካባቢዎን እንዲያውቁ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation>
 <translation id="3387650086002190359">በስርዓተ-ፋይል ስህተቶች ምክንያት <ph name="FILE_NAME" />ን ማውረድ አልተሳካም።</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን ስምረትን ማብራት ለማግኘት</translation>
 <translation id="4226663524361240545">ማሳወቂያዎች መሣሪያውን እንዲነዝር ሊያደርጉት ይችላሉ</translation>
 <translation id="4242533952199664413">ቅንብሮችን ክፈት</translation>
+<translation id="4243710787042215766">በግል ትር ውስጥ ክፈት</translation>
 <translation id="424864128008805179">ከChrome ተዘግቶ ይወጣ?</translation>
 <translation id="4256782883801055595">የክፍት ምንጭ ፍቃዶች</translation>
 <translation id="4259722352634471385">ዳሰሳ ታግዷል፦ <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">በተኪ አገልጋይ በኩል ዋሻን መመስረት አልተሳካም</translation>
 <translation id="4881695831933465202">ክፈት</translation>
 <translation id="488187801263602086">ፋይልን ዳግም ይሰይሙ</translation>
+<translation id="4883379392681899581">ከግል ሁነታ ውጣ</translation>
 <translation id="4885273946141277891">የማይደገፍ የChrome አብነቶች ብዛት።</translation>
 <translation id="4910889077668685004">የክፍያ መተግበሪያዎች</translation>
 <translation id="4913161338056004800">ስታትስቲክስ ዳግም አስጀምር</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">ከቪዲዮ ጋር</translation>
 <translation id="5233638681132016545">አዲስ ትር</translation>
 <translation id="5240817131241497236">በChrome ውስጥ ስምረትን፣ ግላዊነት ማላበስን እና ሌሎች የGoogle አገልግሎቶችን የሚቆጣጠሩ ቅንብሮች ተቀይረዋል። ይህ በአሁኑ ቅንብሮችዎ ላይ ተጽዕኖ ሊኖረው ይችላል።</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />ቅንብሮች<ph name="END_LINK1" />ን በማንኛውም ጊዜ ማበጀት ይቻላል። Chromeን እና እንደ ትርጉም፣ ፍለጋ እና ማስታወቂያዎች ያሉ ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ Google እርስዎ በሚጎበኟቸው ጣቢያዎች ላይ ያለ ይዘትን እና የአሰሳ እንቅስቃሴ ሊጠቀም ይችላል።</translation>
 <translation id="5271967389191913893">መሣሪያ የሚወርደውን ይዘት መክፈት አይችልም።</translation>
 <translation id="528192093759286357">ከሙሉ ማያ ገጽ ለመውጣት ከላይ ይጎትቱ እና የተመለስ አዝራሩን ይንኩ።</translation>
 <translation id="5284584623296338184">በእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ላይ የተደረጉ ለውጦች ከአሁን በኋላ ከእርስዎ የGoogle መለያ ጋር አይሠምሩም። ሆኖም ግን ነባር ውሂብዎ በእርስዎ የGoogle መለያ ላይ እንደተከማቸ ይቆያል።</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">ያልታወቀ </translation>
 <translation id="5833397272224757657">እርስዎ የሚጎበኙዋቸውን ጣቢያዎች ላይ ይዘትን እንዲሁም የአሰሳ እንቅስቃሴ እና መስተጋብሮች ለግላዊነት ለማላበስ ይጠቀማል</translation>
 <translation id="5833984609253377421">አገናኝ አጋራ</translation>
+<translation id="584427517463557805">የተመረጠ የግል ትር</translation>
 <translation id="5854790677617711513">ከ30 ቀናት በላይ የቆየ</translation>
 <translation id="5858741533101922242">Chrome የብሉቱዝ አስማሚውን ማብራት አልቻለም</translation>
 <translation id="5860033963881614850">አጥፋ</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">መነሻ ገጽን ያርትዑ</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> ሰዓቶች ይቀራሉ</translation>
 <translation id="60924377787140961">ተጨማሪ ጽሑፎች በቅርቡ ይታያሉ። የእርስዎን ከሰዓት ይዝናኑበት!</translation>
+<translation id="6099151465289169210">ወደ የግል ትሮች ተቀይሯል</translation>
 <translation id="6108923351542677676">ማዋቀር በሂደት ላይ…</translation>
 <translation id="6111020039983847643">ጥቅም ላይ የዋለው ውሂብ</translation>
 <translation id="6112702117600201073">ገጽ በማደስ ላይ</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">ንዘር</translation>
 <translation id="6324034347079777476">የAndroid ሥርዓት ስምረት ተሰናክሏል</translation>
 <translation id="6333140779060797560">በ<ph name="APPLICATION" /> በኩል ያጋሩ</translation>
+<translation id="6336451774241870485">አዲስ የግል ትር</translation>
 <translation id="6337234675334993532">ምስጠራ</translation>
 <translation id="6341580099087024258">ፋይሎች የት እንደሚቀመጡ ይጠይቁ</translation>
 <translation id="6343192674172527289">ምንም ውርዶች አልተገኙም</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">የዴስክቶፕ ጣቢያ</translation>
 <translation id="6600954340915313787">ወደ Chrome ተቀድቷል</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> ጊባ</translation>
+<translation id="6610147964972079463">የግል ትሮችን ዝጋ</translation>
 <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation>
 <translation id="6627583120233659107">አቃፊ አርትዕ</translation>
 <translation id="6643016212128521049">አጽዳ</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">ከአብዛኛዎቹ ጣቢያዎች ዘግተው ያስወጣዎታል። ከእርስዎ የGoogle መለያ ዘግተው እንዲወጡ አይደረጉም።</translation>
 <translation id="7454641608352164238">በቂ ቦታ የለም</translation>
 <translation id="7455923816558154057">ለመመልከት መታ ያድርጉ</translation>
+<translation id="7465104139234185284">ሁሉንም የግል ትሮች ዝጋ</translation>
 <translation id="7473891865547856676">አይ፣ አመሰግናለሁ</translation>
 <translation id="7475192538862203634">ይህን በተደጋጋሚነት እያዩት ከሆኑ እነዚህን <ph name="BEGIN_LINK" />የአስተያየት ጥቆማዎች<ph name="END_LINK" /> ይሞክሩ።</translation>
 <translation id="7475688122056506577">ኤስዲ ካርድ አልተገኘም። አንዳንዶቹ ፋይሎችዎ ሊጎድሉ ይችላሉ።</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> ጊባ ወርዷል</translation>
 <translation id="8249310407154411074">ወደ ላይ ውሰድ</translation>
 <translation id="8250920743982581267">ሰነዶች</translation>
+<translation id="825412236959742607">ይህ ገጽ በጣም ብዙ ማህደረ ትውስታን ይጠቀማል፣ ስለዚህ Chrome አንዳንድ ይዘትን አስወግዷል።</translation>
 <translation id="8260126382462817229">እንደገና ለመግባት ይሞክሩ</translation>
 <translation id="8261506727792406068">ሰርዝ</translation>
 <translation id="8266862848225348053">የሚወርድበት ቦታ</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">የድምጽ ፍለጋን ጀምር</translation>
 <translation id="9071742570345586758">የምናባዊ እውነታ ይዘትን ለመመልከት የGoogle ቪአር አገልግሎቶችን ይጫኑ</translation>
 <translation id="9074336505530349563">በGoogle የተጠቆመ ግላዊነት የተላበሰ ይዘትን በመለያ መግባት እና ስምረትን ማብራት ለማግኘት</translation>
+<translation id="9080642952018487277">ወደ የግል ሁነታ ግባ</translation>
 <translation id="9086455579313502267">አውታረ መረቡን መድረስ አልተቻለም።</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> ኪባ ወርዷል</translation>
 <translation id="9100505651305367705">የሚደገፍ ሲሆን ጽሑፎችን በተቃለለ እይታ ለማሳየት ጠይቅ</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 01e4cd4..85475dd7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ar.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">جارٍ إضافة <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">من المواقع الإلكترونية</translation>
 <translation id="1049743911850919806">التصفح المتخفي</translation>
+<translation id="1054301162707478098">لقد انتقلت إلى الوضع الخاص.</translation>
 <translation id="10614374240317010">لم يتم الحفظ مطلقًا</translation>
 <translation id="1068672505746868501">عدم ترجمة الصفحات باللغة <ph name="SOURCE_LANGUAGE" /> مُطلقًا</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">مزيد من اللغات</translation>
 <translation id="124678866338384709">إغلاق علامة التبويب الحالية</translation>
 <translation id="1258753120186372309">‏رسم الشعار المبتكر من Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">لن تظهر الصفحات التي تشاهدها في علامات التبويب الخاصة في سِجل متصفّحك أو في وحدة تخزين ملفات تعريف الارتباط أو في سِجل البحث بعد إغلاق جميع علامات التبويب الخاصة. وسيتم حفظ أي ملفات تنزّلها أو إشارات مرجعية تنشئها.
+
+لكنك لن تكون غير مرئي. فاستخدام الوضع الخاص لا يخفي تصفُّحك عن صاحب العمل أو مزود خدمة الإنترنت أو مواقع الويب التي تزورها.</translation>
 <translation id="127138278192656016">استخدام المزامنة وجميع الخدمات</translation>
 <translation id="1272079795634619415">إيقاف</translation>
 <translation id="1283039547216852943">النقر للتوسيع</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">عناصر التحكم لموقع في وضع ملء الشاشة</translation>
 <translation id="2038563949887743358">تشغيل طلب موقع الويب لسطح المكتب</translation>
 <translation id="2045104531052923016">تطبيقات أخرى بحجم <ph name="GIGABYTES" /> غيغابايت</translation>
+<translation id="2055670718290744343">مسرَّع البحث</translation>
 <translation id="2063713494490388661">انقر للبحث</translation>
 <translation id="2079545284768500474">تراجع</translation>
 <translation id="2082238445998314030">النتيجة <ph name="RESULT_NUMBER" /> من <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">‏خدمات Google والمزامنة</translation>
 <translation id="2259659629660284697">تصدير كلمات المرور...</translation>
 <translation id="2268044343513325586">تحسين</translation>
+<translation id="2280910239864711607">فتح علامة تبويب جديدة في الوضع الخاص</translation>
 <translation id="2286841657746966508">عنوان الفاتورة</translation>
 <translation id="230115972905494466">لم يتم العثور على أي أجهزة متوافقة</translation>
 <translation id="2315043854645842844">لا يدعم نظام التشغيل تحديد الشهادة من جانب العميل.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">السماح بجافا سكريبت لموقع ويب معين.</translation>
 <translation id="2625189173221582860">تم نسخ كلمة المرور</translation>
 <translation id="2631006050119455616">تم الحفظ</translation>
+<translation id="2633278372998075009">علامات التبويب الخاصة</translation>
 <translation id="2647434099613338025">إضافة لغة</translation>
 <translation id="2650751991977523696">هل تريد تنزيل الملف مرة أخرى؟</translation>
 <translation id="2653659639078652383">إرسال</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">إذا نسيت عبارة المرور أو رغبت في تغيير هذا الإعداد، يمكنك <ph name="BEGIN_LINK" />إعادة تعيين المزامنة<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">الميكروفون</translation>
 <translation id="3232754137068452469">تطبيق الويب</translation>
+<translation id="3234355010754616171">علامة تبويب خاصة جديدة</translation>
 <translation id="3236059992281584593">يتبقى دقيقة واحدة</translation>
 <translation id="3244271242291266297">الشهر</translation>
 <translation id="3254409185687681395">وضع إشارة على هذه الصفحة</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">إغلاق كافة علامات تبويب التصفح المتخفي</translation>
 <translation id="3365671512111106261">غير متاح عند تشغيل توفير البيانات</translation>
 <translation id="3367813778245106622">تسجيل الدخول مرة أخرى لبدء المزامنة</translation>
+<translation id="3377025655491224618">علامة تبويب خاصة</translation>
 <translation id="3384347053049321195">مشاركة صورة</translation>
 <translation id="3386292677130313581">السؤال قبل السماح للمواقع بمعرفة الموقع (موصى به)</translation>
 <translation id="3387650086002190359">تعذّر تنزيل الملف <ph name="FILE_NAME" /> بسبب أخطاء في نظام الملف.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">‏للحصول على محتوى مُخصَّص اقترحته Google، يُرجى تفعيل المزامنة.</translation>
 <translation id="4226663524361240545">يمكن أن تؤدي الإشعارات إلى اهتزاز الجهاز</translation>
 <translation id="4242533952199664413">فتح الإعدادات</translation>
+<translation id="4243710787042215766">فتح في علامة تبويب خاصة</translation>
 <translation id="424864128008805179">‏هل تريد الخروج من Chrome؟</translation>
 <translation id="4256782883801055595">تراخيص البرامج مفتوحة المصدر</translation>
 <translation id="4259722352634471385">التنقل محظور: <ph name="URL" /></translation>
@@ -466,6 +476,7 @@
 <translation id="4878404682131129617">أخفق إنشاء نفق عبر الخادم الوكيل.</translation>
 <translation id="4881695831933465202">فتح</translation>
 <translation id="488187801263602086">إعادة تسمية الملف</translation>
+<translation id="4883379392681899581">مغادرة الوضع الخاص</translation>
 <translation id="4885273946141277891">‏عدد نسخ Chrome غير متوافق.</translation>
 <translation id="4910889077668685004">تطبيقات الدفع</translation>
 <translation id="4913161338056004800">إعادة تعيين الإحصائيات</translation>
@@ -507,6 +518,7 @@
 <translation id="5224771365102442243">يتضمن فيديو</translation>
 <translation id="5233638681132016545">علامة تبويب جديدة</translation>
 <translation id="5240817131241497236">‏تم تغيير الإعدادات التي تتحكَّم في المزامنة والتخصيص وخدمات Google الأخرى في Chrome. قد يؤثر هذا في إعداداتك الحالية.</translation>
+<translation id="5264003212305142034">‏يمكن تخصيص <ph name="BEGIN_LINK1" />الإعدادات<ph name="END_LINK1" /> في أي وقت. قد تستخدم Google محتوى المواقع الإلكترونية التي تزورها ونشاط المتصفّح والتفاعلات لتخصيص Chrome وخدمات Google، مثل "ترجمة Google" و"بحث Google" والإعلانات.</translation>
 <translation id="5271967389191913893">لا يمكن للجهاز فتح المحتوى لتنزيله</translation>
 <translation id="528192093759286357">اسحب من الجزء العلوي والمس زر الرجوع للخروج من وضع ملء الشاشة.</translation>
 <translation id="5284584623296338184">‏لن تتم مزامنة التغييرات الطارئة على الإشارات المرجعية والسجل وكلمات المرور وغيرها من الإعدادات بحسابك في Google. ومع ذلك، ستظل بياناتك الحالية مخزنة في حسابك في Google.</translation>
@@ -592,6 +604,7 @@
 <translation id="583281660410589416">غير معروف</translation>
 <translation id="5833397272224757657">يتم استخدام المحتوى على المواقع الإلكترونية التي تزورها، بالإضافة إلى نشاط المتصفِّح وتفاعلاته للتخصيص.</translation>
 <translation id="5833984609253377421">مشاركة الرابط</translation>
+<translation id="584427517463557805">علامة تبويب خاصة مُحدّدة</translation>
 <translation id="5854790677617711513">مرّ عليها أكثر من 30 يومًا</translation>
 <translation id="5858741533101922242">‏يتعذر على Chrome تشغيل محوّل البلوتوث</translation>
 <translation id="5860033963881614850">إيقاف</translation>
@@ -621,6 +634,7 @@
 <translation id="6075798973483050474">تعديل الصفحة الرئيسية</translation>
 <translation id="60923314841986378">عدد الساعات المتبقية: <ph name="HOURS" /></translation>
 <translation id="60924377787140961">ستظهر المزيد من المقالات قريبًا. استمتع بقضاء وقت الظهيرة!</translation>
+<translation id="6099151465289169210">تم التبديل إلى علامات التبويب الخاصة</translation>
 <translation id="6108923351542677676">الإعداد قيد التقدّم…</translation>
 <translation id="6111020039983847643">البيانات المُستخدَمة</translation>
 <translation id="6112702117600201073">يتم الآن تحديث الصفحة</translation>
@@ -650,6 +664,7 @@
 <translation id="6320088164292336938">اهتزاز</translation>
 <translation id="6324034347079777476">‏تمّ إيقاف مزامنة نظام Android</translation>
 <translation id="6333140779060797560">مشاركة عن طريق <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">علامة تبويب خاصة جديدة</translation>
 <translation id="6337234675334993532">تشفير</translation>
 <translation id="6341580099087024258">السؤال عن مكان حفظ الملفات</translation>
 <translation id="6343192674172527289">لم يتم العثور على أي تنزيلات</translation>
@@ -687,6 +702,7 @@
 <translation id="6593061639179217415">العرض بإصدار سطح المكتب</translation>
 <translation id="6600954340915313787">‏تم النسخ إلى Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> غيغابايت</translation>
+<translation id="6610147964972079463">إغلاق علامات التبويب الخاصة</translation>
 <translation id="6612358246767739896">محتوى محمي</translation>
 <translation id="6627583120233659107">تعديل مجلد</translation>
 <translation id="6643016212128521049">محو</translation>
@@ -790,6 +806,7 @@
 <translation id="7453467225369441013">‏سيتم تسجيل الخروج من معظم مواقع الويب لكن لن يتم تسجيل الخروج من حسابك في Google.</translation>
 <translation id="7454641608352164238">سعة التخزين غير كافية</translation>
 <translation id="7455923816558154057">يُرجى النقر للعرض</translation>
+<translation id="7465104139234185284">إغلاق جميع علامات التبويب الخاصة</translation>
 <translation id="7473891865547856676">لا، شكرًا</translation>
 <translation id="7475192538862203634">إذا تكرر ظهور هذا، فحاول الاستفادة من <ph name="BEGIN_LINK" />الاقتراحات<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">‏لم يتم العثور على بطاقة SD. قد يكون بعض الملفات مفقودًا.</translation>
@@ -885,6 +902,7 @@
 <translation id="8220488350232498290">تم تنزيل <ph name="GIGABYTES" /> غيغابايت</translation>
 <translation id="8249310407154411074">نقل إلى الأعلى</translation>
 <translation id="8250920743982581267">المستندات</translation>
+<translation id="825412236959742607">‏تستهلك هذه الصفحة مساحة كبيرة من الذاكرة، لذلك أزال Chrome بعض محتواها.</translation>
 <translation id="8260126382462817229">محاولة تسجيل الدخول مرة أخرى</translation>
 <translation id="8261506727792406068">حذف</translation>
 <translation id="8266862848225348053">موقع التنزيل</translation>
@@ -980,6 +998,7 @@
 <translation id="9070377983101773829">بدء البحث الصوتي</translation>
 <translation id="9071742570345586758">‏لعرض محتوى الواقع الافتراضي، يلزمك تثبيت خدمات Google VR</translation>
 <translation id="9074336505530349563">‏للحصول على محتوى مُخصَّص اقترحته Google، يُرجى تسجيل الدخول وتفعيل المزامنة.</translation>
+<translation id="9080642952018487277">الدخول إلى الوضع الخاص</translation>
 <translation id="9086455579313502267">تعذر الدخول إلى الشبكة</translation>
 <translation id="9099018167121903954">تم تنزيل <ph name="KILOBYTES" /> كيلوبايت</translation>
 <translation id="9100505651305367705">اقتراح مشاهدة المقالات في العرض المبسَّط إذا كان ذلك متاحًا</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 7dbab8c..78e9249 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_bg.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> се добавя...</translation>
 <translation id="1041308826830691739">От уебсайтове</translation>
 <translation id="1049743911850919806">„Инкогнито“</translation>
+<translation id="1054301162707478098">Преминахте в режим на частно сърфиране.</translation>
 <translation id="10614374240317010">Незапазвани никога</translation>
 <translation id="1068672505746868501">Страниците на <ph name="SOURCE_LANGUAGE" /> да не се превеждат</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Още езици</translation>
 <translation id="124678866338384709">Затваряне на текущия раздел</translation>
 <translation id="1258753120186372309">Драскулка на Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">След като затворите всички раздели в режим на частно сърфиране, преглежданите в тях страници няма да останат в историята или хранилището за „бисквитки“ на браузъра ви, нито в историята на търсенията. Ще се запазят всички файлове, които изтеглите, или отметки, които създадете.
+
+Активността ви в мрежата обаче не е невидима. При преминаване в режим на частно сърфиране тя не се скрива от работодателя ви и от доставчика ви на интернет услуги, нито от уебсайтовете, които посещавате.</translation>
 <translation id="127138278192656016">Използване на синхронизиране и всички услуги</translation>
 <translation id="1272079795634619415">Стоп</translation>
 <translation id="1283039547216852943">Докоснете за разгъване</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Контроли за сайтове на цял екран</translation>
 <translation id="2038563949887743358">Включване на функцията за заявяване на настолни сайтове</translation>
 <translation id="2045104531052923016">Други приложения: <ph name="GIGABYTES" /> ГБ</translation>
+<translation id="2055670718290744343">Ускоряване на търсенето</translation>
 <translation id="2063713494490388661">Търсене с докосване</translation>
 <translation id="2079545284768500474">Отмяна</translation>
 <translation id="2082238445998314030">Резултат <ph name="RESULT_NUMBER" /> от <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Синхрониз. и услуги на Google</translation>
 <translation id="2259659629660284697">Експортиране на паролите…</translation>
 <translation id="2268044343513325586">Прецизиране</translation>
+<translation id="2280910239864711607">Отваряне на нов раздел в режим на частно сърфиране</translation>
 <translation id="2286841657746966508">Адрес за фактуриране</translation>
 <translation id="230115972905494466">Няма намерени съвместими устройства</translation>
 <translation id="2315043854645842844">Избраният сертификат от страната на клиента не се поддържа от операционната система.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Разрешаване на JavaScript за конкретен сайт.</translation>
 <translation id="2625189173221582860">Паролата е копирана</translation>
 <translation id="2631006050119455616">Спестени</translation>
+<translation id="2633278372998075009">Раздели в режим на частно сърфиране</translation>
 <translation id="2647434099613338025">Добавяне на език</translation>
 <translation id="2650751991977523696">Да се изтегли ли отново файлът?</translation>
 <translation id="2653659639078652383">Изпращане</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Ако забравите пропуска си или искате да промените тази настройка, <ph name="BEGIN_LINK" />нулирайте синхронизирането<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3232754137068452469">Уеб приложение</translation>
+<translation id="3234355010754616171">Нов частен раздел</translation>
 <translation id="3236059992281584593">Остава 1 мин</translation>
 <translation id="3244271242291266297">ММ</translation>
 <translation id="3254409185687681395">Запазване на отметка към тази страница</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Затваряне на всички раздели в режим „инкогнито“</translation>
 <translation id="3365671512111106261">Не е налице, когато функцията Икономия на данни е включена</translation>
 <translation id="3367813778245106622">Влезте в профила си отново, за да започне синхронизирането</translation>
+<translation id="3377025655491224618">Раздел в режим на частно сърфиране</translation>
 <translation id="3384347053049321195">Споделяне на изображението</translation>
 <translation id="3386292677130313581">Извеждане на запитване, преди на сайтовете да се разреши достъп до местоположението ви (препоръчително)</translation>
 <translation id="3387650086002190359">Изтеглянето на „<ph name="FILE_NAME" />“ не бе успешно поради грешки във файловата система.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Включете синхронизирането, за да получавате персонализирано съдържание, предлагано от Google</translation>
 <translation id="4226663524361240545">Възможно е устройството да вибрира при известия</translation>
 <translation id="4242533952199664413">Отваряне на настройките</translation>
+<translation id="4243710787042215766">Отваряне в частен раздел</translation>
 <translation id="424864128008805179">Искате ли да излезете от Chrome?</translation>
 <translation id="4256782883801055595">Лицензи за отворен код</translation>
 <translation id="4259722352634471385">Навигирането е блокирано: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Създаването на тунел през прокси сървъра не бе успешно</translation>
 <translation id="4881695831933465202">Отваряне</translation>
 <translation id="488187801263602086">Преименуване на файла</translation>
+<translation id="4883379392681899581">Напускане на режима на частно сърфиране</translation>
 <translation id="4885273946141277891">Неподдържан брой екземпляри на Chrome.</translation>
 <translation id="4910889077668685004">Приложения за плащане</translation>
 <translation id="4913161338056004800">Нулиране на статистическите данни</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">С видеоклип</translation>
 <translation id="5233638681132016545">Нов раздел</translation>
 <translation id="5240817131241497236">Настройките за контрол върху синхронизирането, персонализирането и други услуги на Google в Chrome се промениха. Това може да повлияе на настоящите ви настройки.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Настройките<ph name="END_LINK1" /> могат да бъдат персонализирани по всяко време. Може да използваме съдържанието на посещаваните от вас сайтове, активността в браузъра и взаимодействията с него, за да персонализираме Chrome и други услуги на Google, като Преводач, Търсене и рекламите.</translation>
 <translation id="5271967389191913893">Устройството не може да отвори съдържанието за изтегляне.</translation>
 <translation id="528192093759286357">Плъзнете пръст от горната част на екрана и докоснете бутона за връщане назад, за да излезете от режима на цял екран.</translation>
 <translation id="5284584623296338184">Промените в отметките, историята, паролите и другите ви настройки вече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него.</translation>
@@ -592,6 +604,7 @@
 <translation id="583281660410589416">Неизвестно</translation>
 <translation id="5833397272224757657">Използва за персонализиране съдържанието на посещаваните от вас сайтове, както и активността в браузъра и взаимодействията с него</translation>
 <translation id="5833984609253377421">Споделяне на връзката</translation>
+<translation id="584427517463557805">Избран раздел в режим на частно сърфиране</translation>
 <translation id="5854790677617711513">По-стари от 30 дни</translation>
 <translation id="5858741533101922242">Chrome не може да включи адаптера за Bluetooth</translation>
 <translation id="5860033963881614850">Изключено</translation>
@@ -621,6 +634,7 @@
 <translation id="6075798973483050474">Редактиране на началната страница</translation>
 <translation id="60923314841986378">Остават <ph name="HOURS" /> часа</translation>
 <translation id="60924377787140961">Скоро ще се покажат още статии. Приятен следобед!</translation>
+<translation id="6099151465289169210">Превключихте към разделите в режим на частно сърфиране</translation>
 <translation id="6108923351542677676">Извършва се настройване…</translation>
 <translation id="6111020039983847643">използвани данни</translation>
 <translation id="6112702117600201073">Опресняване на страницата</translation>
@@ -650,6 +664,7 @@
 <translation id="6320088164292336938">Вибриране</translation>
 <translation id="6324034347079777476">Системното синхронизиране под Android е деактивирано</translation>
 <translation id="6333140779060797560">Споделяне чрез <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Нов раздел в режим на частно сърфиране</translation>
 <translation id="6337234675334993532">Шифроване</translation>
 <translation id="6341580099087024258">Извеждане на запитване къде да се запазват файловете</translation>
 <translation id="6343192674172527289">Няма намерени изтегляния</translation>
@@ -687,6 +702,7 @@
 <translation id="6593061639179217415">Настолен сайт</translation>
 <translation id="6600954340915313787">Копирано в Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> ГБ</translation>
+<translation id="6610147964972079463">Частни раздели: Затваряне</translation>
 <translation id="6612358246767739896">Защитено съдържание</translation>
 <translation id="6627583120233659107">Редактиране на папката</translation>
 <translation id="6643016212128521049">Изчистване</translation>
@@ -790,6 +806,7 @@
 <translation id="7453467225369441013">Ще излезете от повечето сайтове, но не и от профила си в Google.</translation>
 <translation id="7454641608352164238">Няма достатъчно място</translation>
 <translation id="7455923816558154057">Докоснете за преглед</translation>
+<translation id="7465104139234185284">Затваряне на всички раздели в режим на частно сърфиране</translation>
 <translation id="7473891865547856676">Не, благодаря</translation>
 <translation id="7475192538862203634">Ако виждате това често, изпробвайте тези <ph name="BEGIN_LINK" />предложения<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD картата не е намерена. Някои файлове може да липсват.</translation>
@@ -885,6 +902,7 @@
 <translation id="8220488350232498290">Изтеглени файлове: <ph name="GIGABYTES" /> ГБ</translation>
 <translation id="8249310407154411074">Преместване най-горе</translation>
 <translation id="8250920743982581267">Документи</translation>
+<translation id="825412236959742607">Тази страница използва твърде много памет, така че Chrome премахна част от съдържанието.</translation>
 <translation id="8260126382462817229">Опитайте да влезете отново</translation>
 <translation id="8261506727792406068">Изтриване</translation>
 <translation id="8266862848225348053">Местоположение за изтеглянията</translation>
@@ -980,6 +998,7 @@
 <translation id="9070377983101773829">Стартиране на гласово търсене</translation>
 <translation id="9071742570345586758">За да гледате съдържанието за виртуална реалност, инсталирайте съответните услуги на Google</translation>
 <translation id="9074336505530349563">Влезте в профила си и включете синхронизирането, за да получавате персонализирано съдържание, предлагано от Google</translation>
+<translation id="9080642952018487277">Преминаване в режим на частно сърфиране</translation>
 <translation id="9086455579313502267">Няма достъп до мрежата</translation>
 <translation id="9099018167121903954">Изтеглени файлове: <ph name="KILOBYTES" /> КБ</translation>
 <translation id="9100505651305367705">Извеждане на предложение статиите да се показват в опростен изглед, когато се поддържа</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 f224957..d3b9bd4 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ca.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">S'està afegint <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">De llocs web</translation>
 <translation id="1049743911850919806">Incògnit</translation>
+<translation id="1054301162707478098">Has passat al mode privat.</translation>
 <translation id="10614374240317010">Contrasenyes que no es desen mai</translation>
 <translation id="1068672505746868501">No tradueixis mai les pàgines en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Més idiomes</translation>
 <translation id="124678866338384709">Tanca la pestanya actual</translation>
 <translation id="1258753120186372309">Doodle de Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Les pàgines que visualitzes a les pestanyes privades no quedaran registrades a l'historial del navegador, al magatzem de galetes ni a l'historial de cerques un cop tanquis totes les pestanyes privades. Tots els fitxers que baixis o les adreces d'interès que creïs es conservaran.
+
+Tanmateix, no ets invisible. El teu cap, el teu proveïdor de serveis d'Internet i els llocs web que visitis poden veure la teva navegació privada.</translation>
 <translation id="127138278192656016">Fes servir la sincronització i tots els serveis</translation>
 <translation id="1272079795634619415">Atura</translation>
 <translation id="1283039547216852943">Toca per desplegar</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Controls de pantalla completa</translation>
 <translation id="2038563949887743358">Activa Mostra com a ordinador</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB en altres aplicacions</translation>
+<translation id="2055670718290744343">Accelerador de la cerca</translation>
 <translation id="2063713494490388661">Toca per cercar</translation>
 <translation id="2079545284768500474">Desfés</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sincronització i serveis de Google</translation>
 <translation id="2259659629660284697">Exporta les contrasenyes…</translation>
 <translation id="2268044343513325586">Restringeix</translation>
+<translation id="2280910239864711607">Obre una pestanya nova en mode privat</translation>
 <translation id="2286841657746966508">Adreça de facturació</translation>
 <translation id="230115972905494466">No s'ha trobat cap dispositiu compatible</translation>
 <translation id="2315043854645842844">El sistema operatiu no permet seleccionar el certificat del client.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Permet JavaScript en un lloc concret.</translation>
 <translation id="2625189173221582860">S'ha copiat la contrasenya</translation>
 <translation id="2631006050119455616">Dades desades</translation>
+<translation id="2633278372998075009">Pestanyes privades</translation>
 <translation id="2647434099613338025">Afegir un idioma</translation>
 <translation id="2650751991977523696">Vols tornar a baixar el fitxer?</translation>
 <translation id="2653659639078652383">Envia</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Si oblideu la frase de contrasenya o voleu canviar aquesta configuració, <ph name="BEGIN_LINK" />restabliu la sincronització<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Micròfon</translation>
 <translation id="3232754137068452469">Aplicació web</translation>
+<translation id="3234355010754616171">Pestanya privada nova</translation>
 <translation id="3236059992281584593">Queda 1 minut</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Afegeix aquesta pàgina a les adreces d'interès</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Tanca totes les pestanyes d'incògnit</translation>
 <translation id="3365671512111106261">No està disponible quan l'extensió Economitzador de dades està activada</translation>
 <translation id="3367813778245106622">Torna a iniciar la sessió per començar la sincronització</translation>
+<translation id="3377025655491224618">Pestanya privada</translation>
 <translation id="3384347053049321195">Comparteix la imatge</translation>
 <translation id="3386292677130313581">Pregunta abans de permetre que els llocs sàpiguen la meva ubicació (opció recomanada)</translation>
 <translation id="3387650086002190359">No s'ha pogut baixar <ph name="FILE_NAME" /> a causa d'errors amb el sistema de fitxers.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Perquè Google et suggereixi contingut personalitzat, activa la sincronització</translation>
 <translation id="4226663524361240545">És possible que les notificacions facin vibrar el dispositiu</translation>
 <translation id="4242533952199664413">Obre la configuració</translation>
+<translation id="4243710787042215766">Obre en una pestanya privada</translation>
 <translation id="424864128008805179">Voleu tancar la sessió de Chrome?</translation>
 <translation id="4256782883801055595">Llicències de programari lliure</translation>
 <translation id="4259722352634471385">S'ha bloquejat la navegació: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">S'ha produït un error en establir un túnel mitjançant el servidor intermediari</translation>
 <translation id="4881695831933465202">Obre</translation>
 <translation id="488187801263602086">Canvia el nom del fitxer</translation>
+<translation id="4883379392681899581">Surt del mode privat</translation>
 <translation id="4885273946141277891">No s'admet aquest nombre d'instàncies de Chrome.</translation>
 <translation id="4910889077668685004">Aplicacions de pagament</translation>
 <translation id="4913161338056004800">Restableix les estadístiques</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Amb vídeo</translation>
 <translation id="5233638681132016545">Pestanya nova</translation>
 <translation id="5240817131241497236">La configuració que controla la sincronització, la personalització i altres serveis de Google a Chrome ha canviat. Això pot afectar la teva configuració actual.</translation>
+<translation id="5264003212305142034">La <ph name="BEGIN_LINK1" />configuració<ph name="END_LINK1" /> es pot personalitzar en qualsevol moment. Google pot utilitzar contingut dels llocs web que visites, així com l'activitat i les interaccions al navegador per personalitzar Chrome i els serveis de Google, com ara el Traductor, la Cerca i els anuncis.</translation>
 <translation id="5271967389191913893">El dispositiu no pot obrir el contingut que s'ha de baixar.</translation>
 <translation id="528192093759286357">Arrossegueu la pantalla des de la part superior i toqueu el botó Enrere per sortir de la pantalla completa.</translation>
 <translation id="5284584623296338184">Els canvis fets a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el vostre compte de Google. No obstant això, les dades actuals hi continuaran emmagatzemades.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Desconegut</translation>
 <translation id="5833397272224757657">Utilitza el contingut dels llocs web que visites, així com l'activitat i les interaccions del navegador per oferir una experiència personalitzada.</translation>
 <translation id="5833984609253377421">Comparteix l'enllaç</translation>
+<translation id="584427517463557805">Pestanya privada seleccionada</translation>
 <translation id="5854790677617711513">Anterior a 30 dies</translation>
 <translation id="5858741533101922242">Chrome no pot activar l'adaptador Bluetooth</translation>
 <translation id="5860033963881614850">Desactivat</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Editar la pàgina d'inici</translation>
 <translation id="60923314841986378">Queden <ph name="HOURS" /> hores</translation>
 <translation id="60924377787140961">Aviat es mostraran més articles. Que tinguis una bona tarda.</translation>
+<translation id="6099151465289169210">S'ha canviat a les pestanyes privades</translation>
 <translation id="6108923351542677676">Configuració en curs...</translation>
 <translation id="6111020039983847643">dades utilitzades</translation>
 <translation id="6112702117600201073">S'està actualitzant la pàgina</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibració</translation>
 <translation id="6324034347079777476">La sincronització del sistema Android està desactivada</translation>
 <translation id="6333140779060797560">Comparteix mitjançant <ph name="APPLICATION" />.</translation>
+<translation id="6336451774241870485">Pestanya privada nova</translation>
 <translation id="6337234675334993532">Encriptació</translation>
 <translation id="6341580099087024258">Pregunta on es desen els fitxers</translation>
 <translation id="6343192674172527289">No s'ha trobat cap baixada</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Lloc web per a ordinador</translation>
 <translation id="6600954340915313787">Copiada de Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Tanca les pestanyes privades</translation>
 <translation id="6612358246767739896">Contingut protegit</translation>
 <translation id="6627583120233659107">Edita la carpeta</translation>
 <translation id="6643016212128521049">Esborra</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Et tanca la sessió de la majoria de llocs web, però no la del compte de Google.</translation>
 <translation id="7454641608352164238">No hi ha prou espai</translation>
 <translation id="7455923816558154057">Toca per veure-ho</translation>
+<translation id="7465104139234185284">Tanca totes les pestanyes privades</translation>
 <translation id="7473891865547856676">No, gràcies</translation>
 <translation id="7475192538862203634">Si això passa sovint, proveu aquests <ph name="BEGIN_LINK" />suggeriments<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">La targeta SD no s'ha trobat. Pot ser que faltin alguns fitxers.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB en baixades</translation>
 <translation id="8249310407154411074">Mou a la part superior</translation>
 <translation id="8250920743982581267">Documents</translation>
+<translation id="825412236959742607">Com que aquesta pàgina fa servir massa memòria, Chrome n'ha suprimit contingut.</translation>
 <translation id="8260126382462817229">Torna a iniciar la sessió</translation>
 <translation id="8261506727792406068">Suprimeix</translation>
 <translation id="8266862848225348053">Ubicació de baixada</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Inicia la cerca per veu</translation>
 <translation id="9071742570345586758">Per veure contingut en realitat virtual, instal·la els Serveis RV de Google</translation>
 <translation id="9074336505530349563">Perquè Google et suggereixi contingut personalitzat, inicia la sessió i activa la sincronització</translation>
+<translation id="9080642952018487277">Activa el mode privat</translation>
 <translation id="9086455579313502267">No es pot accedir a la xarxa</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB en baixades</translation>
 <translation id="9100505651305367705">Proposa mostrar articles en visualització simplificada, quan s'admeti</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 48e1723b..c029edca 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_da.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Tilføjer <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">Fra websites</translation>
 <translation id="1049743911850919806">Inkognito</translation>
+<translation id="1054301162707478098">Du er nu i privat tilstand.</translation>
 <translation id="10614374240317010">Aldrig gemt</translation>
 <translation id="1068672505746868501">Oversæt aldrig sider på <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Flere sprog</translation>
 <translation id="124678866338384709">Luk aktuel fane</translation>
 <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Når du har lukket alle dine private faner, gemmes der hverken cookies, browser- eller søgehistorik for de sider, du besøger i privat tilstand. Dog gemmes alle de filer, du downloader, og bogmærker, du opretter.
+
+Husk, at du ikke er usynlig. Den private tilstand skjuler ikke dine søgninger over for din arbejdsgiver, din internetudbyder eller de websites, du besøger.</translation>
 <translation id="127138278192656016">Brug synkronisering og alle tjenester</translation>
 <translation id="1272079795634619415">Stop</translation>
 <translation id="1283039547216852943">Tryk for at udvide</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Kontrolelementer på website i fuld skærm</translation>
 <translation id="2038563949887743358">Slå computerversionen af websitet til</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB af andre apps</translation>
+<translation id="2055670718290744343">Søgeaccelerator</translation>
 <translation id="2063713494490388661">Tryk for at søge</translation>
 <translation id="2079545284768500474">Fortryd</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> af <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synkr. og Google-tjenester</translation>
 <translation id="2259659629660284697">Eksportér adgangskoder…</translation>
 <translation id="2268044343513325586">Juster</translation>
+<translation id="2280910239864711607">Åbn en ny fane i privat tilstand</translation>
 <translation id="2286841657746966508">Faktureringsadresse</translation>
 <translation id="230115972905494466">Der blev ikke fundet nogen kompatible enheder</translation>
 <translation id="2315043854645842844">Klientens certifikatvalg understøttes ikke af operativsystemet.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Tillad JavaScript for et bestemt website.</translation>
 <translation id="2625189173221582860">Adgangskoden er kopieret</translation>
 <translation id="2631006050119455616">Gemt</translation>
+<translation id="2633278372998075009">Private faner</translation>
 <translation id="2647434099613338025">Tilføj sprog</translation>
 <translation id="2650751991977523696">Vil du downloade filen igen?</translation>
 <translation id="2653659639078652383">Indsend</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Hvis du har glemt din adgangssætning eller vil ændre denne indstilling, skal du <ph name="BEGIN_LINK" />nulstille synkroniseringen<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Webapp</translation>
+<translation id="3234355010754616171">Ny privat fane</translation>
 <translation id="3236059992281584593">1 minut tilbage</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Tilføj denne side som bogmærke</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Luk alle inkognitofaner</translation>
 <translation id="3365671512111106261">Ikke tilgængelig, når Datasparefunktion er slået til.</translation>
 <translation id="3367813778245106622">Log ind igen for at starte synkroniseringen</translation>
+<translation id="3377025655491224618">Privat fane</translation>
 <translation id="3384347053049321195">Del billede</translation>
 <translation id="3386292677130313581">Spørg om tilladelse, inden websites får oplyst din placering (anbefales)</translation>
 <translation id="3387650086002190359">Download af <ph name="FILE_NAME" /> mislykkedes på grund af fejl i filsystemet.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Aktivér synkronisering for at hente brugertilpasset indhold, som er foreslået af Google</translation>
 <translation id="4226663524361240545">Underretninger kan få enheden til at vibrere</translation>
 <translation id="4242533952199664413">Åbn Indstillinger</translation>
+<translation id="4243710787042215766">Åbn i privat fane</translation>
 <translation id="424864128008805179">Vil du logge ud af Chrome?</translation>
 <translation id="4256782883801055595">Open source-licenser</translation>
 <translation id="4259722352634471385">Navigationen er blokeret: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Der kunne ikke etableres en tunnel via proxyserver</translation>
 <translation id="4881695831933465202">Åbn</translation>
 <translation id="488187801263602086">Omdøb fil</translation>
+<translation id="4883379392681899581">Afslut privat tilstand</translation>
 <translation id="4885273946141277891">Der er flere forekomster af Chrome, end der understøttes.</translation>
 <translation id="4910889077668685004">Betalingsapps</translation>
 <translation id="4913161338056004800">Nulstil statistik</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Med video</translation>
 <translation id="5233638681132016545">Ny fane</translation>
 <translation id="5240817131241497236">De indstillinger, der styrer synkronisering, tilpasning og andre Google-tjenester i Chrome, er blevet ændret. Dette kan påvirke dine aktuelle indstillinger.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Indstillinger<ph name="END_LINK1" /> kan tilpasses når som helst. Google kan bruge indholdet på de websites, du besøger, samt browseraktivitet og -interaktioner til at tilpasse Chrome og andre Google-tjenester såsom Oversæt, Søgning og annoncer.</translation>
 <translation id="5271967389191913893">Enheden kan ikke åbne det indhold, der skal downloades.</translation>
 <translation id="528192093759286357">Træk fra toppen, og tryk på tilbageknappen igen for at afslutte fuld skærm.</translation>
 <translation id="5284584623296338184">Ændringer i dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres ikke længere til din Google-konto, men dine eksisterende data er stadig gemt på din Google-konto.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Ukendt</translation>
 <translation id="5833397272224757657">Anvender indhold på websites, du besøger, samt browseraktivitet og -interaktioner, så din brugeroplevelse tilpasses</translation>
 <translation id="5833984609253377421">Del link</translation>
+<translation id="584427517463557805">Valgt privat fane</translation>
 <translation id="5854790677617711513">Ældre end 30 dage</translation>
 <translation id="5858741533101922242">Chrome kan ikke slå Bluetooth-adapteren til</translation>
 <translation id="5860033963881614850">Fra</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Rediger startside</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> timer tilbage</translation>
 <translation id="60924377787140961">Der vises snart flere artikler. Hav en god eftermiddag!</translation>
+<translation id="6099151465289169210">Skiftet til private faner</translation>
 <translation id="6108923351542677676">Konfigurationen er i gang...</translation>
 <translation id="6111020039983847643">dataforbrug</translation>
 <translation id="6112702117600201073">Opdaterer siden</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrer</translation>
 <translation id="6324034347079777476">Synkronisering af Android-systemet blev deaktiveret</translation>
 <translation id="6333140779060797560">Del via <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Ny privat fane</translation>
 <translation id="6337234675334993532">Kryptering</translation>
 <translation id="6341580099087024258">Spørg om, hvor filer skal gemmes</translation>
 <translation id="6343192674172527289">Der blev ikke fundet nogen downloads</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Almindeligt website</translation>
 <translation id="6600954340915313787">Kopieret til Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Luk private faner</translation>
 <translation id="6612358246767739896">Beskyttet indhold</translation>
 <translation id="6627583120233659107">Rediger mappen</translation>
 <translation id="6643016212128521049">Ryd</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Logger dig ud af de fleste websites. Du bliver ikke logget ud af din Google-konto.</translation>
 <translation id="7454641608352164238">Der er ikke nok plads</translation>
 <translation id="7455923816558154057">Tryk for at se</translation>
+<translation id="7465104139234185284">Luk alle private faner</translation>
 <translation id="7473891865547856676">Nej tak</translation>
 <translation id="7475192538862203634">Hvis du ser dette jævnligt, kan du prøve disse <ph name="BEGIN_LINK" />forslag<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD-kortet blev fundet. Nogle af dine filer mangler muligvis.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB er downloadet</translation>
 <translation id="8249310407154411074">Flyt til toppen</translation>
 <translation id="8250920743982581267">Dokumenter</translation>
+<translation id="825412236959742607">Denne side anvender for meget hukommelse, så Chrome har fjernet noget indhold.</translation>
 <translation id="8260126382462817229">Prøv at logge ind igen</translation>
 <translation id="8261506727792406068">Slet</translation>
 <translation id="8266862848225348053">Downloadplacering</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Start talesøgning</translation>
 <translation id="9071742570345586758">Installer Google VR-tjenester for at se virtual reality-indhold</translation>
 <translation id="9074336505530349563">Log ind, og aktivér synkronisering for at hente brugertilpasset indhold, som er foreslået af Google</translation>
+<translation id="9080642952018487277">Aktivér privat tilstand</translation>
 <translation id="9086455579313502267">Der kunne ikke opnås adgang til netværket</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB er downloadet</translation>
 <translation id="9100505651305367705">Tilbyd enkel visning af artikler, når det understøttes</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 89301544..bb13f08 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_de.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> wird hinzugefügt...</translation>
 <translation id="1041308826830691739">Von Websites</translation>
 <translation id="1049743911850919806">Inkognito</translation>
+<translation id="1054301162707478098">Sie befinden sich jetzt im privaten Modus.</translation>
 <translation id="10614374240317010">Nie speichern für…</translation>
 <translation id="1068672505746868501">Seiten auf <ph name="SOURCE_LANGUAGE" /> nie übersetzen</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Weitere Sprachen</translation>
 <translation id="124678866338384709">Aktuellen Tab schließen</translation>
 <translation id="1258753120186372309">Google-Doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Seiten, die Sie in privaten Tabs öffnen, werden nicht in Ihrem Browserverlauf, Cookiespeicher oder Suchverlauf gespeichert, nachdem Sie alle privaten Tabs geschlossen haben. Alle heruntergeladenen Dateien und gespeicherten Lesezeichen bleiben erhalten.
+
+Sie sind jedoch nicht unsichtbar. Durch den privaten Modus wird die Tatsache, dass Sie im Web surfen, nicht vor Ihrem Arbeitgeber, Internetanbieter oder den besuchten Websites verborgen.</translation>
 <translation id="127138278192656016">Synchronisierung und alle Dienste nutzen</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1283039547216852943">Zum Maximieren tippen</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Vollbild-Steuerelemente</translation>
 <translation id="2038563949887743358">"Desktopversion ansehen" aktivieren</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB sonstiger Apps</translation>
+<translation id="2055670718290744343">Search Accelerator</translation>
 <translation id="2063713494490388661">Zum Suchen tippen</translation>
 <translation id="2079545284768500474">Rückgängig machen</translation>
 <translation id="2082238445998314030">Ergebnis <ph name="RESULT_NUMBER" /> von <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synchronisierung und Google-Dienste</translation>
 <translation id="2259659629660284697">Passwörter exportieren…</translation>
 <translation id="2268044343513325586">Verfeinern</translation>
+<translation id="2280910239864711607">Neuen Tab im privaten Modus öffnen</translation>
 <translation id="2286841657746966508">Rechnungsadresse</translation>
 <translation id="230115972905494466">Keine kompatiblen Geräte gefunden</translation>
 <translation id="2315043854645842844">Die clientseitige Zertifikatauswahl wird vom Betriebssystem nicht unterstützt.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">JavaScript für eine bestimmte Website zulassen.</translation>
 <translation id="2625189173221582860">Passwort kopiert</translation>
 <translation id="2631006050119455616">Eingespart</translation>
+<translation id="2633278372998075009">Private Tabs</translation>
 <translation id="2647434099613338025">Sprache hinzufügen</translation>
 <translation id="2650751991977523696">Datei noch einmal herunterladen?</translation>
 <translation id="2653659639078652383">Senden</translation>
@@ -241,7 +248,7 @@
 <translation id="2900528713135656174">Termin erstellen</translation>
 <translation id="2902702728133930130">Während des Startvorgangs ist in Chrome ein unerwarteter Fehler aufgetreten.</translation>
 <translation id="2903493209154104877">Adressen</translation>
-<translation id="290376772003165898">Ist diese Seite nicht auf <ph name="LANGUAGE" />?</translation>
+<translation id="290376772003165898">Diese Seite ist nicht auf <ph name="LANGUAGE" />?</translation>
 <translation id="2913331724188855103">Websites dürfen Cookiedaten speichern und lesen (empfohlen)</translation>
 <translation id="2932150158123903946">Google <ph name="APP_NAME" />-Speicher</translation>
 <translation id="2943166482989655199">System- und Nutzungsdaten an Google senden, um Chrome noch besser und sicherer zu machen</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Wenn Sie Ihre Passphrase vergessen oder diese Einstellung ändern möchten, <ph name="BEGIN_LINK" />setzen Sie die Synchronisierung zurück<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Web-App</translation>
+<translation id="3234355010754616171">Neuer privater Tab</translation>
 <translation id="3236059992281584593">1 Minute übrig</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Lesezeichen für diese Seite erstellen</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Alle Inkognito-Tabs schließen</translation>
 <translation id="3365671512111106261">Nicht verfügbar, wenn der Datensparmodus aktiviert ist</translation>
 <translation id="3367813778245106622">Melden Sie sich nochmals an, um die Synchronisierung zu starten</translation>
+<translation id="3377025655491224618">Privater Tab</translation>
 <translation id="3384347053049321195">Bild teilen</translation>
 <translation id="3386292677130313581">Nachfragen, bevor Websites Ihr Standort angezeigt wird (empfohlen)</translation>
 <translation id="3387650086002190359"><ph name="FILE_NAME" /> konnte aufgrund von Dateisystemfehlern nicht heruntergeladen werden.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Aktivieren Sie die Synchronisierung, um personalisierte, von Google vorgeschlagene Inhalte zu erhalten</translation>
 <translation id="4226663524361240545">Bei Benachrichtigungen kann das Gerät vibrieren</translation>
 <translation id="4242533952199664413">Einstellungen öffnen</translation>
+<translation id="4243710787042215766">In privatem Tab öffnen</translation>
 <translation id="424864128008805179">Von Chrome abmelden?</translation>
 <translation id="4256782883801055595">Open Source-Lizenzen</translation>
 <translation id="4259722352634471385">Die Navigation zu <ph name="URL" /> ist blockiert.</translation>
@@ -466,6 +476,7 @@
 <translation id="4878404682131129617">Tunnelerstellung via Proxyserver ist fehlgeschlagen</translation>
 <translation id="4881695831933465202">Öffnen</translation>
 <translation id="488187801263602086">Datei umbenennen</translation>
+<translation id="4883379392681899581">Privaten Modus beenden</translation>
 <translation id="4885273946141277891">Nicht unterstützte Anzahl von Chrome-Instanzen</translation>
 <translation id="4910889077668685004">Zahlungs-Apps</translation>
 <translation id="4913161338056004800">Statistiken zurücksetzen</translation>
@@ -507,6 +518,7 @@
 <translation id="5224771365102442243">Mit Video</translation>
 <translation id="5233638681132016545">Neuer Tab</translation>
 <translation id="5240817131241497236">Die Einstellungen für die Synchronisierung, Personalisierung und andere Google-Dienste in Chrome wurden geändert. Dadurch könnten sich auch Ihre aktuellen Einstellungen geändert haben.</translation>
+<translation id="5264003212305142034">Die <ph name="BEGIN_LINK1" />Einstellungen<ph name="END_LINK1" /> können jederzeit angepasst werden. Google kann die Inhalte der von Ihnen besuchten Websites, Browserinteraktionen und Browseraktivitäten nutzen, um Chrome und andere Google-Dienste wie Übersetzer, die Google-Suche und Werbung zu personalisieren.</translation>
 <translation id="5271967389191913893">Das Gerät kann den Inhalt, der heruntergeladen werden soll, nicht öffnen.</translation>
 <translation id="528192093759286357">Ziehen Sie zum Beenden des Vollbildmodus von oben und tippen Sie auf die Zurück-Taste.</translation>
 <translation id="5284584623296338184">Änderungen an Ihren Lesezeichen, Ihrem Verlauf, Ihren Passwörtern und anderen Einstellungen werden nicht mehr mit Ihrem Google-Konto synchronisiert. Ihre vorhandenen Daten bleiben aber in Ihrem Google-Konto gespeichert.</translation>
@@ -592,6 +604,7 @@
 <translation id="583281660410589416">Unbekannt</translation>
 <translation id="5833397272224757657">Inhalte von besuchten Websites sowie Browseraktivitäten und -interaktionen werden zur Personalisierung verwendet</translation>
 <translation id="5833984609253377421">Link teilen</translation>
+<translation id="584427517463557805">Ausgewählter privater Tab</translation>
 <translation id="5854790677617711513">Älter als 30 Tage</translation>
 <translation id="5858741533101922242">Chrome kann den Bluetooth-Adapter nicht aktivieren</translation>
 <translation id="5860033963881614850">Aus</translation>
@@ -621,6 +634,7 @@
 <translation id="6075798973483050474">Startseite bearbeiten</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> Stunden übrig</translation>
 <translation id="60924377787140961">Weitere Artikel werden in Kürze erscheinen. Schönen Tag noch!</translation>
+<translation id="6099151465289169210">Zu privaten Tabs gewechselt</translation>
 <translation id="6108923351542677676">Einrichtung läuft...</translation>
 <translation id="6111020039983847643">Genutzte Datenmenge</translation>
 <translation id="6112702117600201073">Aktualisierung der Seite</translation>
@@ -650,6 +664,7 @@
 <translation id="6320088164292336938">Vibrieren</translation>
 <translation id="6324034347079777476">Android-Systemsynchronisierung deaktiviert</translation>
 <translation id="6333140779060797560">Über <ph name="APPLICATION" /> teilen</translation>
+<translation id="6336451774241870485">Neuer privater Tab</translation>
 <translation id="6337234675334993532">Verschlüsselung</translation>
 <translation id="6341580099087024258">Fragen, wo Dateien gespeichert werden sollen</translation>
 <translation id="6343192674172527289">Keine Downloads gefunden</translation>
@@ -687,6 +702,7 @@
 <translation id="6593061639179217415">Desktopwebsite</translation>
 <translation id="6600954340915313787">In Chrome kopiert</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Private Tabs schließen</translation>
 <translation id="6612358246767739896">Geschützte Inhalte</translation>
 <translation id="6627583120233659107">Ordner bearbeiten</translation>
 <translation id="6643016212128521049">Löschen</translation>
@@ -790,6 +806,7 @@
 <translation id="7453467225369441013">Sie werden von den meisten Websites, aber nicht aus Ihrem Google-Konto abgemeldet.</translation>
 <translation id="7454641608352164238">Zu wenig Speicherplatz</translation>
 <translation id="7455923816558154057">Zum Ansehen tippen</translation>
+<translation id="7465104139234185284">Alle privaten Tabs schließen</translation>
 <translation id="7473891865547856676">Nein danke</translation>
 <translation id="7475192538862203634">Sollten Sie diese Meldung häufiger erhalten, sehen Sie sich unsere <ph name="BEGIN_LINK" />Empfehlungen<ph name="END_LINK" /> an.</translation>
 <translation id="7475688122056506577">SD-Karte nicht gefunden. Einige Ihrer Dateien fehlen möglicherweise.</translation>
@@ -885,6 +902,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB heruntergeladen</translation>
 <translation id="8249310407154411074">Ganz nach oben</translation>
 <translation id="8250920743982581267">Dokumente</translation>
+<translation id="825412236959742607">Diese Seite benötigt zu viel Arbeitsspeicher. Darum hat Chrome einige Inhalte entfernt.</translation>
 <translation id="8260126382462817229">Melden Sie sich noch einmal an</translation>
 <translation id="8261506727792406068">Löschen</translation>
 <translation id="8266862848225348053">Downloadpfad</translation>
@@ -980,6 +998,7 @@
 <translation id="9070377983101773829">Sprachsuche starten</translation>
 <translation id="9071742570345586758">Google VR Services installieren, um Virtual-Reality-Inhalte zu sehen</translation>
 <translation id="9074336505530349563">Melden Sie sich und aktivieren Sie die Synchronisierung, um personalisierte, von Google vorgeschlagene Inhalte zu erhalten</translation>
+<translation id="9080642952018487277">Privaten Modus aktivieren</translation>
 <translation id="9086455579313502267">Kein Zugriff auf das Netzwerk</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB heruntergeladen</translation>
 <translation id="9100505651305367705">Anbieten, Artikel in vereinfachter Ansicht anzuzeigen, falls unterstützt</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 88ce014c..c095b8e3 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_el.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Προσθήκη <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">Από ιστοτόπους</translation>
 <translation id="1049743911850919806">Ανώνυμη περιήγηση</translation>
+<translation id="1054301162707478098">Πραγματοποιείτε ιδιωτική περιήγηση</translation>
 <translation id="10614374240317010">Δεν έχει αποθηκευθεί ποτέ</translation>
 <translation id="1068672505746868501">Να μην γίνεται μετάφραση σελίδων στα <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Περισσότερες γλώσσες</translation>
 <translation id="124678866338384709">Κλείσιμο τρέχουσας καρτέλας</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Οι σελίδες που προβάλλετε στις καρτέλες ιδιωτικής περιήγησης δεν διατηρούνται στο ιστορικό του προγράμματος περιήγησής σας, στα cookie ή στο ιστορικό αναζήτησης, αφού κλείσετε όλες τις καρτέλες ιδιωτικής περιήγησης. Τα αρχεία που κατεβάζετε ή οι σελιδοδείκτες που δημιουργείτε θα διατηρηθούν.
+
+Ωστόσο, δεν είστε αόρατοι. Με την ιδιωτική περιήγηση, η περιήγησή σας δεν αποκρύπτεται από τον εργοδότη σας, τον πάροχο υπηρεσιών διαδικτύου ή τους ιστοτόπους που επισκέπτεστε.</translation>
 <translation id="127138278192656016">Χρήση συγχρονισμού και όλων των υπηρεσιών</translation>
 <translation id="1272079795634619415">Διακοπή</translation>
 <translation id="1283039547216852943">Πατήστε για ανάπτυξη</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Στοιχ. ελέγ. σε πλήρη οθόνη</translation>
 <translation id="2038563949887743358">Ενεργοποίηση αιτήματος ιστότοπου για υπολογιστές</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB από άλλες εφαρμογές</translation>
+<translation id="2055670718290744343">Αναζήτηση στο Accelerator</translation>
 <translation id="2063713494490388661">Πατήστε για αναζήτηση</translation>
 <translation id="2079545284768500474">Αναίρεση</translation>
 <translation id="2082238445998314030">Αποτέλεσμα <ph name="RESULT_NUMBER" /> από <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Συγχρονισμός και υπηρ. Google</translation>
 <translation id="2259659629660284697">Εξαγωγή κωδικών πρόσβασης…</translation>
 <translation id="2268044343513325586">Περιορισμός</translation>
+<translation id="2280910239864711607">Άνοιγμα νέας καρτέλας σε κατάσταση ιδιωτικής περιήγησης</translation>
 <translation id="2286841657746966508">Διεύθυνση τιμολόγησης</translation>
 <translation id="230115972905494466">Δεν βρέθηκαν συμβατές συσκευές</translation>
 <translation id="2315043854645842844">Η επιλογή πιστοποιητικού από τον πελάτη δεν υποστηρίζεται από το λειτουργικό σύστημα.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Να επιτρέπεται η JavaScript για έναν συγκεκριμένο ιστότοπο.</translation>
 <translation id="2625189173221582860">Ο κωδικός πρόσβασης αντιγράφηκε</translation>
 <translation id="2631006050119455616">Εξοικονομήθηκαν</translation>
+<translation id="2633278372998075009">Καρτέλες ιδιωτικής περιήγησης</translation>
 <translation id="2647434099613338025">Προσθήκη γλώσσας</translation>
 <translation id="2650751991977523696">Επανάληψη λήψης αρχείου;</translation>
 <translation id="2653659639078652383">Υποβολή</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Εάν ξεχάσετε τη φράση πρόσβασής σας ή θέλετε να αλλάξετε αυτήν τη ρύθμιση, <ph name="BEGIN_LINK" />επαναφέρετε το συγχρονισμό<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Μικρόφωνο</translation>
 <translation id="3232754137068452469">Εφαρμογή ιστού</translation>
+<translation id="3234355010754616171">Νέα καρτέλα ιδιωτ. περιήγ.</translation>
 <translation id="3236059992281584593">Απομένει 1 λεπτό</translation>
 <translation id="3244271242291266297">ΜΜ</translation>
 <translation id="3254409185687681395">Προσθήκη αυτής της σελίδας στους σελιδοδείκτες</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Κλείσιμο όλων των καρτελών ανώνυμης περιήγησης</translation>
 <translation id="3365671512111106261">Μη διαθέσιμη όταν είναι ενεργοποιημένη η Εξοικονόμηση δεδομένων</translation>
 <translation id="3367813778245106622">Συνδεθείτε ξανά για να ξεκινήσετε τον συγχρονισμό</translation>
+<translation id="3377025655491224618">Καρτέλα ιδιωτικής περιήγησης</translation>
 <translation id="3384347053049321195">Κοινοποίηση εικόνας</translation>
 <translation id="3386292677130313581">Να γίνεται ερώτηση προτού επιτραπεί η κοινοποίηση της τοποθεσίας σας σε ιστότοπους (συνιστάται)</translation>
 <translation id="3387650086002190359">Η λήψη του αρχείου <ph name="FILE_NAME" /> απέτυχε λόγω σφαλμάτων του συστήματος αρχείων.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Για λήψη εξατομικευμένου περιεχομένου που προτείνεται από την Google, ενεργοποιήστε τον συγχρονισμό</translation>
 <translation id="4226663524361240545">Κατά τη λήψη ειδοποιήσεων ενδέχεται να δονείται η συσκευή</translation>
 <translation id="4242533952199664413">Ανοίξτε τις ρυθμίσεις</translation>
+<translation id="4243710787042215766">Άνοιγμα σε καρτ. ιδιωτ. περ.</translation>
 <translation id="424864128008805179">Αποσύνδεση από το Chrome;</translation>
 <translation id="4256782883801055595">Άδειες λογισμικού ανοικτού κώδικα</translation>
 <translation id="4259722352634471385">Αποκλείστηκε η μετάβαση στη διεύθυνση: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Η δημιουργία διοχέτευσης μέσω διακομιστή μεσολάβησης απέτυχε</translation>
 <translation id="4881695831933465202">Άνοιγμα</translation>
 <translation id="488187801263602086">Μετονομασία αρχείου</translation>
+<translation id="4883379392681899581">Αποχώρηση από την κατάσταση ιδιωτικής περιήγησης</translation>
 <translation id="4885273946141277891">Μη υποστηριζόμενος αριθμός παρουσιών Chrome.</translation>
 <translation id="4910889077668685004">Εφαρμογές πληρωμών</translation>
 <translation id="4913161338056004800">Επαναφορά στατιστικών στοιχείων</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Με βίντεο</translation>
 <translation id="5233638681132016545">Νέα καρτέλα</translation>
 <translation id="5240817131241497236">Οι ρυθμίσεις που ελέγχουν τον συγχρονισμό, την εξατομίκευση και άλλες υπηρεσίες Google στο Chrome άλλαξαν. Αυτό μπορεί να επηρεάσει τις τρέχουσες ρυθμίσεις σας.</translation>
+<translation id="5264003212305142034">Μπορείτε να προσαρμόσετε τις <ph name="BEGIN_LINK1" />Ρυθμίσεις<ph name="END_LINK1" /> ανά πάσα στιγμή. Η Google μπορεί να χρησιμοποιεί το περιεχόμενο σε ιστοτόπους που επισκέπτεστε, καθώς και τη δραστηριότητα και τις αλληλεπιδράσεις με το πρόγραμμα περιήγησης, για την εξατομίκευση του Chrome και άλλων υπηρεσιών Google, όπως της Μετάφρασης, της Αναζήτησης και των διαφημίσεων.</translation>
 <translation id="5271967389191913893">Η συσκευή δεν μπορεί να ανοίξει το περιεχόμενο προς λήψη.</translation>
 <translation id="528192093759286357">Σύρετε από το επάνω τμήμα και αγγίξτε το κουμπί επιστροφής για έξοδο από την πλήρη οθόνη.</translation>
 <translation id="5284584623296338184">Οι αλλαγές σε σελιδοδείκτες, ιστορικό, κωδικούς πρόσβασης και άλλες ρυθμίσεις δεν θα συγχρονίζονται πλέον με το Λογαριασμό σας Google. Ωστόσο, τα υπάρχοντα δεδομένα σας θα παραμείνουν αποθηκευμένα στο λογαριασμό σας Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Άγνωστο</translation>
 <translation id="5833397272224757657">Χρησιμοποιεί περιεχόμενο στους ιστότοπους που επισκέπτεστε, καθώς και δραστηριότητα και αλληλεπιδράσεις του προγράμματος περιήγησης, για εξατομίκευση</translation>
 <translation id="5833984609253377421">Κοινοποίηση συνδέσμου</translation>
+<translation id="584427517463557805">Επιλεγμένη καρτέλα ιδιωτικής περιήγησης</translation>
 <translation id="5854790677617711513">Παλαιότερο από 30 ημέρες</translation>
 <translation id="5858741533101922242">Το Chrome δεν είναι δυνατό να ενεργοποιήσει τον προσαρμογέα Bluetooth</translation>
 <translation id="5860033963881614850">Απενεργοποιημένη</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Επεξεργασία αρχικής σελίδας</translation>
 <translation id="60923314841986378">Απομένουν <ph name="HOURS" /> ώρες</translation>
 <translation id="60924377787140961">Περισσότερα άρθρα θα εμφανιστούν σύντομα. Απολαύστε το απόγευμά σας!</translation>
+<translation id="6099151465289169210">Έγινε εναλλαγή σε καρτέλες ιδιωτικής περιήγησης</translation>
 <translation id="6108923351542677676">Ρύθμιση σε εξέλιξη…</translation>
 <translation id="6111020039983847643">δεδομένα που χρησιμοποιήθηκαν</translation>
 <translation id="6112702117600201073">Ανανέωση σελίδας</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Δόνηση</translation>
 <translation id="6324034347079777476">Ο συγχρονισμός συστήματος Android απενεργοποιήθηκε</translation>
 <translation id="6333140779060797560">Μοιραστείτε μέσω <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Νέα καρτέλα ιδιωτικής περιήγησης</translation>
 <translation id="6337234675334993532">Κρυπτογράφηση</translation>
 <translation id="6341580099087024258">Να γίνεται ερώτηση σχετικά με την τοποθεσία αποθήκευσης των αρχείων</translation>
 <translation id="6343192674172527289">Δεν βρέθηκαν λήψεις</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Για υπολογιστή</translation>
 <translation id="6600954340915313787">Αντιγράφηκε στο Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Κλείσιμο ιδιωτικών καρτελών</translation>
 <translation id="6612358246767739896">Προστατευμένο περιεχόμενο</translation>
 <translation id="6627583120233659107">Επεξεργασία φακέλου</translation>
 <translation id="6643016212128521049">Διαγραφή</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Θα αποσυνδεθείτε από τους περισσότερους ιστοτόπους. Δεν θα αποσυνδεθείτε από τον Λογαριασμό σας Google.</translation>
 <translation id="7454641608352164238">Ανεπαρκής χώρος</translation>
 <translation id="7455923816558154057">Πατήστε για προβολή</translation>
+<translation id="7465104139234185284">Κλείσιμο όλων των καρτελών ιδιωτικής περιήγησης</translation>
 <translation id="7473891865547856676">Όχι, ευχαριστώ</translation>
 <translation id="7475192538862203634">Εάν αυτό το μήνυμα εμφανίζεται συχνά, δοκιμάστε αυτές τις <ph name="BEGIN_LINK" />προτάσεις<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Η κάρτα SD δεν βρέθηκε. Μπορεί να λείπουν μερικά από τα αρχεία σας.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Έγινε λήψη <ph name="GIGABYTES" /> GB</translation>
 <translation id="8249310407154411074">Μετακίνηση επάνω</translation>
 <translation id="8250920743982581267">Έγγραφα</translation>
+<translation id="825412236959742607">Αυτή η σελίδα χρησιμοποιεί πάρα πολλή μνήμη. Για αυτόν τον λόγο, το Chrome κατάργησε κάποιο περιεχόμενο.</translation>
 <translation id="8260126382462817229">Δοκιμάστε να συνδεθείτε ξανά</translation>
 <translation id="8261506727792406068">Διαγραφή</translation>
 <translation id="8266862848225348053">Τοποθεσία λήψης</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Έναρξη φωνητικής αναζήτησης</translation>
 <translation id="9071742570345586758">Για να προβάλλετε περιεχόμενο εικονικής πραγματικότητας, εγκαταστήστε την εφαρμογή Google VR Services</translation>
 <translation id="9074336505530349563">Για λήψη εξατομικευμένου περιεχομένου που προτείνεται από την Google, συνδεθείτε και ενεργοποιήστε τον συγχρονισμό</translation>
+<translation id="9080642952018487277">Είσοδος σε ιδιωτική λειτουργία</translation>
 <translation id="9086455579313502267">Δεν είναι δυνατή η πρόσβαση στο δίκτυο</translation>
 <translation id="9099018167121903954">Έγινε λήψη <ph name="KILOBYTES" /> KB</translation>
 <translation id="9100505651305367705">Προσφορά για προβολή άρθρων σε απλοποιημένη προβολή, όταν υποστηρίζεται</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 bec4b625..b54e766 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Añadiendo <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">De sitios web</translation>
 <translation id="1049743911850919806">Incógnito</translation>
+<translation id="1054301162707478098">Has entrado en modo privado.</translation>
 <translation id="10614374240317010">Contraseñas que nunca se guardan</translation>
 <translation id="1068672505746868501">No traducir nunca las páginas en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Más idiomas</translation>
 <translation id="124678866338384709">Cierra la pestaña actual</translation>
 <translation id="1258753120186372309">Doodles de Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Las páginas que visites a través de las pestañas privadas no se mostrarán en el historial del navegador, en el almacén de cookies ni en el historial de búsquedas una vez que cierres todas las pestañas privadas. Sí se conservarán los archivos que descargues y los marcadores que crees.
+
+No obstante, tus acciones no serán totalmente invisibles. El uso del modo privado no te permite ocultar tu actividad de navegación a tu empresa, a tu proveedor de servicios de Internet o a los sitios web que visites.</translation>
 <translation id="127138278192656016">Usar la sincronización y todos los servicios</translation>
 <translation id="1272079795634619415">Interrumpir</translation>
 <translation id="1283039547216852943">Toca para ampliar</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Controles de pantalla completa</translation>
 <translation id="2038563949887743358">Activar opción para ver como ordenador</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB de otras aplicaciones</translation>
+<translation id="2055670718290744343">Acelerador de búsquedas</translation>
 <translation id="2063713494490388661">Tocar para buscar</translation>
 <translation id="2079545284768500474">Deshacer</translation>
 <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Servicios de Google y sincronización</translation>
 <translation id="2259659629660284697">Exportar contraseñas…</translation>
 <translation id="2268044343513325586">Restringir</translation>
+<translation id="2280910239864711607">Abre una nueva pestaña en modo privado</translation>
 <translation id="2286841657746966508">Dirección de facturación</translation>
 <translation id="230115972905494466">No se han podido encontrar dispositivos compatibles</translation>
 <translation id="2315043854645842844">El sistema operativo no admite la selección de certificados de cliente.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Habilita JavaScript en un sitio web específico.</translation>
 <translation id="2625189173221582860">Se ha copiado la contraseña</translation>
 <translation id="2631006050119455616">Ahorrados</translation>
+<translation id="2633278372998075009">Pestañas privadas</translation>
 <translation id="2647434099613338025">Añadir idioma</translation>
 <translation id="2650751991977523696">¿Quieres descargar el archivo de nuevo?</translation>
 <translation id="2653659639078652383">Enviar</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Si has olvidado tu frase de contraseña o quieres cambiar esta opción, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Micrófono</translation>
 <translation id="3232754137068452469">Aplicación web</translation>
+<translation id="3234355010754616171">Nueva pestaña privada</translation>
 <translation id="3236059992281584593">Queda 1 minuto</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Añadir esta página a marcadores</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Cerrar todas las pestañas de incógnito</translation>
 <translation id="3365671512111106261">No disponible cuando se activa el ahorro de datos</translation>
 <translation id="3367813778245106622">Vuelve a iniciar sesión para que comience la sincronización</translation>
+<translation id="3377025655491224618">Pestaña privada</translation>
 <translation id="3384347053049321195">Compartir imagen</translation>
 <translation id="3386292677130313581">Preguntar antes de permitir que los sitios web detecten tu ubicación (recomendado)</translation>
 <translation id="3387650086002190359">No se ha podido descargar <ph name="FILE_NAME" /> debido a problemas con el sistema de archivos.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Activa la sincronización para obtener contenido personalizado sugerido por Google</translation>
 <translation id="4226663524361240545">Es posible que las notificaciones hagan que el dispositivo vibre</translation>
 <translation id="4242533952199664413">Abrir Configuración</translation>
+<translation id="4243710787042215766">Abrir en pestaña privada</translation>
 <translation id="424864128008805179">¿Cerrar sesión en Chrome?</translation>
 <translation id="4256782883801055595">Licencias de código abierto</translation>
 <translation id="4259722352634471385">Se ha bloqueado la navegación: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">No se ha podido establecer conexión a través del servidor proxy</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="488187801263602086">Cambiar nombre de archivo</translation>
+<translation id="4883379392681899581">Salir del modo privado</translation>
 <translation id="4885273946141277891">Número de instancias de Chrome no admitido.</translation>
 <translation id="4910889077668685004">Aplicaciones para pagar</translation>
 <translation id="4913161338056004800">Restablecer estadísticas</translation>
@@ -478,7 +489,7 @@
 <translation id="4988210275050210843">Descargando archivo (<ph name="MEGABYTES" />).</translation>
 <translation id="4988526792673242964">Páginas</translation>
 <translation id="4996978546172906250">Compartir a través de</translation>
-<translation id="5004339818306944878">Reduce el uso de datos hasta en un 60% y mejora la velocidad de la Web. Los servidores de Google optimizarán las páginas que visites.</translation>
+<translation id="5004339818306944878">Reduce el uso de datos hasta en un 60 % y mejora la velocidad de la Web. Los servidores de Google optimizarán las páginas que visites.</translation>
 <translation id="5005498671520578047">Copiar contraseña</translation>
 <translation id="5011311129201317034"><ph name="SITE" /> quiere conectarse</translation>
 <translation id="5013696553129441713">No hay sugerencias nuevas</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Con vídeo</translation>
 <translation id="5233638681132016545">Nueva pestaña</translation>
 <translation id="5240817131241497236">Las opciones que controlan la sincronización, la personalización y otros servicios de Google en Chrome han cambiado. Es posible que esto afecte a tu configuración actual.</translation>
+<translation id="5264003212305142034">Puedes personalizar la <ph name="BEGIN_LINK1" />configuración<ph name="END_LINK1" /> en cualquier momento. Google puede utilizar el contenido de los sitios web que visites, además de la actividad y las interacciones de navegación para personalizar Chrome y otros servicios de Google, como el Traductor, la Búsqueda y los anuncios.</translation>
 <translation id="5271967389191913893">El dispositivo no puede abrir el contenido para descargarlo.</translation>
 <translation id="528192093759286357">Arrastra el dedo desde la parte superior y toca el botón de retroceso para salir de la pantalla completa.</translation>
 <translation id="5284584623296338184">Los cambios que realices en los marcadores, el historial, las contraseñas y otras opciones no se sincronizarán con tu cuenta de Google. Sin embargo, tus datos actuales seguirán almacenados en tu cuenta.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Desconocido</translation>
 <translation id="5833397272224757657">Utiliza el contenido de los sitios web que visitas, así como las interacciones y la actividad del navegador, para ofrecer una experiencia personalizada</translation>
 <translation id="5833984609253377421">Compartir enlace</translation>
+<translation id="584427517463557805">Pestaña privada seleccionada</translation>
 <translation id="5854790677617711513">Más de 30 días</translation>
 <translation id="5858741533101922242">Chrome no ha podido activar el adaptador Bluetooth</translation>
 <translation id="5860033963881614850">No</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Editar página principal</translation>
 <translation id="60923314841986378">Quedan <ph name="HOURS" /> horas</translation>
 <translation id="60924377787140961">Próximamente se mostrarán más artículos. Disfruta de la tarde.</translation>
+<translation id="6099151465289169210">Se ha cambiado a pestañas privadas</translation>
 <translation id="6108923351542677676">Configuración en curso…</translation>
 <translation id="6111020039983847643">datos utilizados</translation>
 <translation id="6112702117600201073">Actualizando página</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrar</translation>
 <translation id="6324034347079777476">Sincronización del sistema Android inhabilitada</translation>
 <translation id="6333140779060797560">Compartir a través de <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nueva pestaña privada</translation>
 <translation id="6337234675334993532">Cifrado</translation>
 <translation id="6341580099087024258">Preguntar dónde guardar los archivos</translation>
 <translation id="6343192674172527289">No se han encontrado descargas</translation>
@@ -683,9 +698,10 @@
 <translation id="6573431926118603307">Aquí aparecen las pestañas que hayas abierto en Chrome en otros dispositivos.</translation>
 <translation id="6575643671698722332">Error al restablecer. Comprueba la conexión y vuelve a intentarlo.</translation>
 <translation id="6583199322650523874">Añade la página actual a marcadores</translation>
-<translation id="6593061639179217415">Sitio web para ordenador</translation>
+<translation id="6593061639179217415">Versión para ordenador</translation>
 <translation id="6600954340915313787">Copiada a Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Cerrar pestañas privadas</translation>
 <translation id="6612358246767739896">Contenido protegido</translation>
 <translation id="6627583120233659107">Editar carpeta</translation>
 <translation id="6643016212128521049">Eliminar</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Cierra tu sesión en la mayoría de los sitios web. No se cerrará la sesión en tu cuenta de Google.</translation>
 <translation id="7454641608352164238">No hay espacio suficiente</translation>
 <translation id="7455923816558154057">Toca para ver</translation>
+<translation id="7465104139234185284">Cerrar todas las pestañas privadas</translation>
 <translation id="7473891865547856676">No, gracias</translation>
 <translation id="7475192538862203634">Si este mensaje aparece con frecuencia, prueba estas <ph name="BEGIN_LINK" />sugerencias<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">No se ha encontrado la tarjeta SD. Es posible que falten algunos de tus archivos.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">GB descargados: <ph name="GIGABYTES" /></translation>
 <translation id="8249310407154411074">Mover al principio</translation>
 <translation id="8250920743982581267">Documentos</translation>
+<translation id="825412236959742607">Esta página utiliza demasiada memoria, por lo que Chrome ha eliminado parte del contenido.</translation>
 <translation id="8260126382462817229">Prueba a iniciar sesión de nuevo</translation>
 <translation id="8261506727792406068">Eliminar</translation>
 <translation id="8266862848225348053">Ubicación de las descargas</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Iniciar búsqueda por voz</translation>
 <translation id="9071742570345586758">Para ver contenido de realidad virtual, instala Servicios RV de Google</translation>
 <translation id="9074336505530349563">Inicia sesión y activa la sincronización para obtener contenido personalizado sugerido por Google</translation>
+<translation id="9080642952018487277">Activa el modo privado</translation>
 <translation id="9086455579313502267">No ha sido posible acceder a la red</translation>
 <translation id="9099018167121903954">kB descargados: <ph name="KILOBYTES" /></translation>
 <translation id="9100505651305367705">Pregunta si quieres que los artículos se muestren en vista simplificada, si está disponible</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 395c857..d87d8e8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fa.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">درحال افزودن <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">از وب‌سایت‌ها</translation>
 <translation id="1049743911850919806">ناشناس</translation>
+<translation id="1054301162707478098">به حالت خصوصی رفته‌اید.</translation>
 <translation id="10614374240317010">هرگز ذخیره نمی‌شود</translation>
 <translation id="1068672505746868501">هرگز صفحه‌های <ph name="SOURCE_LANGUAGE" /> ترجمه نشوند</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">زبان‌های بیشتر</translation>
 <translation id="124678866338384709">بستن برگه کنونی</translation>
 <translation id="1258753120186372309">‏Google doodle: ‏<ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">صفحاتی که در برگه‌های خصوصی می‌بینید بعد از بسته شدن، در سابقه مرور، فضای ذخیره کوکی یا سابقه جستجویتان به‌جا نمی‌مانند. هر فایلی که بارگیری می‌کنید یا نشانک‌هایی که ایجاد می‌کنید، حفظ می‌شود.
+
+با این حال، نامرئی نیستید. رفتن به حالت خصوصی، مرورتان را از کارفرما، ارائه‌کننده خدمات اینترنتی یا وب‌سایت‌هایی که بازید می‌کنید، پنهان نمی‌کند.</translation>
 <translation id="127138278192656016">استفاده از همگام‌سازی و همه سرویس‌ها</translation>
 <translation id="1272079795634619415">توقف</translation>
 <translation id="1283039547216852943">برای بزرگ کردن ضربه بزنید</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">کنترل‌های سایت تمام‌صفحه</translation>
 <translation id="2038563949887743358">روشن کردن درخواست سایت رایانه‌ای</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> گیگابایت توسط سایر برنامه‌ها</translation>
+<translation id="2055670718290744343">شتاب‌دهنده جستجو</translation>
 <translation id="2063713494490388661">ضربه برای جستجو</translation>
 <translation id="2079545284768500474">لغو</translation>
 <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> نتیجه از <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">‏همگام‌سازی و سرویس‌های Google</translation>
 <translation id="2259659629660284697">درحال صادر کردن گذرواژه‌ها…</translation>
 <translation id="2268044343513325586">فیلتر</translation>
+<translation id="2280910239864711607">باز کردن برگه جدید در حالت خصوصی</translation>
 <translation id="2286841657746966508">آدرس ارسال صورتحساب</translation>
 <translation id="230115972905494466">هیچ دستگاه سازگاری پیدا نشد</translation>
 <translation id="2315043854645842844">انتخاب گواهی سمت کلاینت توسط سیستم‌عامل پشتیبانی نمی‌شود.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">جاوااسکرپیت را برای سایتی خاص مجاز کنید.</translation>
 <translation id="2625189173221582860">گذرواژه کپی شد</translation>
 <translation id="2631006050119455616">ذخیره شده</translation>
+<translation id="2633278372998075009">برگه‌های خصوصی</translation>
 <translation id="2647434099613338025">افزودن زبان</translation>
 <translation id="2650751991977523696">فایل دوباره بارگیری شود؟</translation>
 <translation id="2653659639078652383">ارائه</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">اگر عبارت عبورتان را فراموش کردید یا می‌خواهید این تنظیم را تغییر دهید، <ph name="BEGIN_LINK" />همگام‌سازی را بازنشانی کنید<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">میکروفن</translation>
 <translation id="3232754137068452469">برنامه وب</translation>
+<translation id="3234355010754616171">برگه خصوصی جدید</translation>
 <translation id="3236059992281584593">۱ دقیقه باقی‌مانده است</translation>
 <translation id="3244271242291266297">ماه</translation>
 <translation id="3254409185687681395">نشانک گذاری این صفحه</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">بستن همه برگه‌های ناشناس</translation>
 <translation id="3365671512111106261">در صورت روشن بودن «صرفه‌جویی داده»، در دسترس نیست</translation>
 <translation id="3367813778245106622">دوباره به سیستم وارد شوید یا همگام‌سازی را شروع کنید</translation>
+<translation id="3377025655491224618">برگه خصوصی</translation>
 <translation id="3384347053049321195">اشتراک‌گذاری تصویر</translation>
 <translation id="3386292677130313581">قبل از اجازه به سایت‌ها برای اطلاع از مکانتان، ابتدا سؤال شود (توصیه می‌شود)</translation>
 <translation id="3387650086002190359">به‌دلیل خطاهای سیستم فایل، بارگیری <ph name="FILE_NAME" /> انجام نشد.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">‏برای اینکه Google محتوای شخصی‌شده به شما پیشنهاد دهد، همگام‌سازی را روشن کنید</translation>
 <translation id="4226663524361240545">اعلان‌ها ممکن است دستگاه را بلرزانند</translation>
 <translation id="4242533952199664413">باز کردن تنظیمات</translation>
+<translation id="4243710787042215766">باز کردن در برگه خصوصی</translation>
 <translation id="424864128008805179">‏از سیستم Chrome خارج می شوید؟</translation>
 <translation id="4256782883801055595">مجوزهای منبع آزاد</translation>
 <translation id="4259722352634471385">پیمایش مسدود است: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">برقراری تونل ازطریق سرور پروکسی ناموفق بود</translation>
 <translation id="4881695831933465202">باز کردن</translation>
 <translation id="488187801263602086">تغییر نام فایل</translation>
+<translation id="4883379392681899581">ترک کردن حالت خصوصی</translation>
 <translation id="4885273946141277891">‏این تعداد از نسخه‌های Chrome پشتیبانی نمی‌شود.</translation>
 <translation id="4910889077668685004">برنامه‌های پرداخت</translation>
 <translation id="4913161338056004800">بازنشانی آمار</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">دارای ویدیو</translation>
 <translation id="5233638681132016545">برگه جدید</translation>
 <translation id="5240817131241497236">‏تنظیماتی که همگام‌سازی، شخصی‌سازی و سرویس‌های دیگر Google در Chrome را کنترل می‌کند تغییر کرده است. این تغییر ممکن است روی تنظیمات فعلی تأثیر گذارد.</translation>
+<translation id="5264003212305142034">‏هرزمان بخواهید می‌توانید <ph name="BEGIN_LINK1" />تنظیمات<ph name="END_LINK1" /> را سفارشی کنید. ممکن است Google از محتوای موجود در سایت‌هایی که بازدید می‌کنید و تعاملات و فعالیت مرورگر برای شخصی‌سازی Chrome و سایر سرویس‌های Google (مانند «مترجم»، «جستجو» و آگهی‌ها) استفاده کند.</translation>
 <translation id="5271967389191913893">دستگاه نمی‌تواند محتوا را برای بارگیری باز کند.</translation>
 <translation id="528192093759286357">برای خروج از حالت تمام صفحه، از بالا صفحه را بکشید و دکمه برگشت را لمس کنید.</translation>
 <translation id="5284584623296338184">‏تغییرات در نشانک‌ها، سابقه، گذرواژه و سایر تنظیمات دیگر با حساب Google شما همگام‌سازی نخواهد شد. با این حال، داده‌های موجودتان در حساب Google شما باقی خواهند ماند.</translation>
@@ -590,6 +602,7 @@
 <translation id="583281660410589416">ناشناس</translation>
 <translation id="5833397272224757657">از محتوای سایت‌هایی که بازدید می‌کنید و فعالیت و تعاملات مرورگر برای شخصی‌سازی استفاده می‌کند</translation>
 <translation id="5833984609253377421">اشتراک‌گذاری پیوند</translation>
+<translation id="584427517463557805">برگه خصوصی انتخاب‌شده</translation>
 <translation id="5854790677617711513">قدیمی‌تر از ۳۰ روز</translation>
 <translation id="5858741533101922242">‏Chrome قادر به روشن کردن آداپتور بلوتوث نیست</translation>
 <translation id="5860033963881614850">خاموش</translation>
@@ -619,6 +632,7 @@
 <translation id="6075798973483050474">ویرایش صفحه اصلی</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> ساعت باقی‌مانده است</translation>
 <translation id="60924377787140961">مقاله‌های بیشتر به‌زودی نشان داده می‌شوند. از بعدازظهرتان لذت ببرید!</translation>
+<translation id="6099151465289169210">جابه‌جایی به برگه‌های خصوصی</translation>
 <translation id="6108923351542677676">تنظیم در حال انجام است...</translation>
 <translation id="6111020039983847643">داده مصرف‌شده</translation>
 <translation id="6112702117600201073">درحال بازخوانی صفحه</translation>
@@ -648,6 +662,7 @@
 <translation id="6320088164292336938">لرزش</translation>
 <translation id="6324034347079777476">‏همگام‌سازی سیستم Android غیرفعال شد</translation>
 <translation id="6333140779060797560">اشتراک‌گذاری از طریق <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">برگه خصوصی جدید</translation>
 <translation id="6337234675334993532">رمزگذاری</translation>
 <translation id="6341580099087024258">مکان ذخیره شدن فایل‌ها پرسیده شود</translation>
 <translation id="6343192674172527289">هیچ بارگیری‌ای پیدا نشد</translation>
@@ -685,6 +700,7 @@
 <translation id="6593061639179217415">سایت مخصوص رایانه</translation>
 <translation id="6600954340915313787">‏کپی در Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> گیگابایت</translation>
+<translation id="6610147964972079463">بستن برگه‌های خصوصی</translation>
 <translation id="6612358246767739896">محتوای محافظت‌شده</translation>
 <translation id="6627583120233659107">ویرایش پوشه</translation>
 <translation id="6643016212128521049">پاک کردن</translation>
@@ -788,6 +804,7 @@
 <translation id="7453467225369441013">‏شما را از سیستم اکثر سایت‌ها خارج می‌‌کند. از سیستم حساب Google خارج نمی‌شوید.</translation>
 <translation id="7454641608352164238">فضای کافی وجود ندارد</translation>
 <translation id="7455923816558154057">برای مشاهده ضربه بزنید</translation>
+<translation id="7465104139234185284">بستن همه برگه‌های خصوصی</translation>
 <translation id="7473891865547856676">نه متشکرم</translation>
 <translation id="7475192538862203634">درصورتی‌که این مورد را مکرراً مشاهده می‌کنید، این <ph name="BEGIN_LINK" />پیشنهادات<ph name="END_LINK" /> را امتحان کنید.</translation>
 <translation id="7475688122056506577">‏کارت SD پیدا نشد. ممکن است بعضی از فایل‌هایتان جا بیافتد.</translation>
@@ -883,6 +900,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> گیگابایت بارگیری شد</translation>
 <translation id="8249310407154411074">انتقال به بالا</translation>
 <translation id="8250920743982581267">اسناد</translation>
+<translation id="825412236959742607">‏این صفحه حافظه خیلی زیادی استفاده می‌کند، به‌همین‌دلیل Chrome برخی از محتوا را پاک کرد.</translation>
 <translation id="8260126382462817229">دوباره سعی کنید به سیستم وارد شوید</translation>
 <translation id="8261506727792406068">حذف</translation>
 <translation id="8266862848225348053">مکان بارگیری</translation>
@@ -978,6 +996,7 @@
 <translation id="9070377983101773829">شروع جستجوی گفتاری</translation>
 <translation id="9071742570345586758">‏برای مشاهده محتوای واقعیت مجازی، «سرویس‌های Google VR» را نصب کنید</translation>
 <translation id="9074336505530349563">‏برای اینکه Google محتوای شخصی‌شده به شما پیشنهاد دهد، به سیستم وارده شوید و همگام‌سازی را روشن کنید</translation>
+<translation id="9080642952018487277">وارد شدن به حالت خصوصی</translation>
 <translation id="9086455579313502267">دسترسی به شبکه امکان‌پذیر نیست</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> کیلوبایت بارگیری شد</translation>
 <translation id="9100505651305367705">پیشنهاد نمایش مقالات در نمای ساده‌شده، درصورت پشتیبانی</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 91ae0728..d1cb900 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fi.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Lisätään <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">Verkkosivustoilta</translation>
 <translation id="1049743911850919806">Incognito</translation>
+<translation id="1054301162707478098">Olet siirtynyt yksityiseen tilaan</translation>
 <translation id="10614374240317010">Ei tallenneta</translation>
 <translation id="1068672505746868501">Älä koskaan käännä kielellä <ph name="SOURCE_LANGUAGE" /> kirjoitettuja sivuja.</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Lisää kieliä</translation>
 <translation id="124678866338384709">Sulje nykyinen välilehti</translation>
 <translation id="1258753120186372309">Google-piirros: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Yksityisillä välilehdillä avaamasi sivut eivät jää selaimen historiaan, evästeisiin tai hakuhistoriaan, kun olet sulkenut kaikki yksityiset välilehdet. Kaikki lataamasi tiedostot ja luomasi kirjanmerkit säilytetään.
+
+Et ole kuitenkaan näkymätön. Yksityinen tila ei piilota selaustietojasi työnantajaltasi, internetpalveluntarjoajaltasi tai avaamiltasi verkkosivustoilta.</translation>
 <translation id="127138278192656016">Käytä synkronointia ja kaikkia palveluja</translation>
 <translation id="1272079795634619415">Pysäytä</translation>
 <translation id="1283039547216852943">Laajenna napauttamalla.</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Ohjaimet koko näytön tilassa</translation>
 <translation id="2038563949887743358">Ota käyttöön Käytä tietokoneversiota</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> Gt muita sovelluksia</translation>
+<translation id="2055670718290744343">Haun nopeutus</translation>
 <translation id="2063713494490388661">Hae napauttamalla</translation>
 <translation id="2079545284768500474">Kumoa</translation>
 <translation id="2082238445998314030">Tulos <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synkronointi ja Google-palvelut</translation>
 <translation id="2259659629660284697">Vie salasanat…</translation>
 <translation id="2268044343513325586">Tarkenna</translation>
+<translation id="2280910239864711607">Avaa uusi välilehti yksityisessä tilassa</translation>
 <translation id="2286841657746966508">Laskutusosoite</translation>
 <translation id="230115972905494466">Yhteensopivia laitteita ei löytynyt.</translation>
 <translation id="2315043854645842844">Käyttöjärjestelmä ei tue palvelimen varmennevalintaa.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Salli JavaScript tietyllä sivustolla.</translation>
 <translation id="2625189173221582860">Salasana kopioitu</translation>
 <translation id="2631006050119455616">Säästetty</translation>
+<translation id="2633278372998075009">Yksityiset välilehdet</translation>
 <translation id="2647434099613338025">Lisää kieli</translation>
 <translation id="2650751991977523696">Ladataanko tiedosto uudelleen?</translation>
 <translation id="2653659639078652383">Lähetä</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Jos unohdat tunnuslauseesi tai haluat muokata tätä asetusta, <ph name="BEGIN_LINK" />nollaa synkronointi<ph name="END_LINK" />.</translation>
 <translation id="3227137524299004712">Mikrofoni</translation>
 <translation id="3232754137068452469">Verkkosovellus</translation>
+<translation id="3234355010754616171">Uusi yksityinen välilehti</translation>
 <translation id="3236059992281584593">1 minuutti jäljellä</translation>
 <translation id="3244271242291266297">KK</translation>
 <translation id="3254409185687681395">Luo kirjanmerkki tälle sivulle</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Sulje kaikki incognito-välilehdet.</translation>
 <translation id="3365671512111106261">Ei käytössä, kun Data Saver on käytössä</translation>
 <translation id="3367813778245106622">Aloita synkronointi kirjautumalla uudelleen sisään.</translation>
+<translation id="3377025655491224618">Yksityinen välilehti</translation>
 <translation id="3384347053049321195">Jaa kuva</translation>
 <translation id="3386292677130313581">Pyydä lupaa, kun sivustot yrittävät käyttää sijaintiasi (suositus).</translation>
 <translation id="3387650086002190359">Tiedoston <ph name="FILE_NAME" /> lataus epäonnistui tiedostojärjestelmävirheen vuoksi.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Ota synkronointi käyttöön, niin näet Googlen suosittelemaa yksilöllistä sisältöä</translation>
 <translation id="4226663524361240545">Laite voi väristä ilmoitusten yhteydessä.</translation>
 <translation id="4242533952199664413">Avaa asetukset</translation>
+<translation id="4243710787042215766">Avaa yksityisellä välilehdellä</translation>
 <translation id="424864128008805179">Kirjaudutaanko ulos Chromesta?</translation>
 <translation id="4256782883801055595">Avoimen lähdekoodin käyttöluvat</translation>
 <translation id="4259722352634471385">Kohde on estetty: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Tunnelin muodostaminen välityspalvelimen kautta epäonnistui</translation>
 <translation id="4881695831933465202">Avaa</translation>
 <translation id="488187801263602086">Nimeä tiedosto uudelleen</translation>
+<translation id="4883379392681899581">Poistu yksityisestä tilasta</translation>
 <translation id="4885273946141277891">Chromen versioiden määrää ei tueta.</translation>
 <translation id="4910889077668685004">Maksusovellukset</translation>
 <translation id="4913161338056004800">Nollaa tilastot</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Video sivulla</translation>
 <translation id="5233638681132016545">Uusi välilehti</translation>
 <translation id="5240817131241497236">Synkronointia, personointia ja muita Googlen palveluita Chromessa hallitsevat asetukset ovat muuttuneet. Tämä voi vaikuttaa nykyisiin asetuksiisi.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Asetuksia<ph name="END_LINK1" /> voi muuttaa milloin tahansa. Google saattaa käyttää avaamiesi sivustojen sisältöä sekä selaimen selaus- ja käyttötietoja Chromen, Kääntäjän, Haun, mainosten ja muiden Googlen palvelujen personointiin.</translation>
 <translation id="5271967389191913893">Laite ei voi avata ladattavaa sisältöä.</translation>
 <translation id="528192093759286357">Poistu koko näytön tilasta vetämällä näytön yläreunasta ja koskettamalla Takaisin-painiketta.</translation>
 <translation id="5284584623296338184">Kirjanmerkkeihin, historiaan, salasanoihin ja muihin asetuksiin tehtäviä muutoksia ei enää synkronoida Google-tilillesi. Olemassa olevia tietojasi säilytetään kuitenkin Google-tililläsi.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Tuntematon</translation>
 <translation id="5833397272224757657">Käyttää personointiin avaamiesi sivujen sisältöä, selaustoimintaa ja selainvuorovaikutusta</translation>
 <translation id="5833984609253377421">Jaa linkki</translation>
+<translation id="584427517463557805">Valittu yksityinen välilehti</translation>
 <translation id="5854790677617711513">Yli 30 päivää vanhat</translation>
 <translation id="5858741533101922242">Chrome ei voi ottaa käyttöön Bluetooth-sovitinta.</translation>
 <translation id="5860033963881614850">Pois käytöstä</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Muokkaa etusivua</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> tuntia jäljellä</translation>
 <translation id="60924377787140961">Muita artikkeleita ilmestyy pian. Nauti iltapäivästäsi!</translation>
+<translation id="6099151465289169210">Yksityiset välilehdet valittu</translation>
 <translation id="6108923351542677676">Synkronointia valmistellaan…</translation>
 <translation id="6111020039983847643">dataa käytetty</translation>
 <translation id="6112702117600201073">Sivun päivittäminen</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Värinä</translation>
 <translation id="6324034347079777476">Android-järjestelmän synkronointi poistettu käytöstä</translation>
 <translation id="6333140779060797560">Jaa sovelluksella <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Uusi yksityinen välilehti</translation>
 <translation id="6337234675334993532">Salaus</translation>
 <translation id="6341580099087024258">Kysy tiedostojen tallennussijaintia</translation>
 <translation id="6343192674172527289">Latauksia ei löytynyt.</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Tietokonesivusto</translation>
 <translation id="6600954340915313787">Kopioitiin Chromeen.</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> Gt</translation>
+<translation id="6610147964972079463">Sulje yksityiset välilehdet</translation>
 <translation id="6612358246767739896">Suojattu sisältö</translation>
 <translation id="6627583120233659107">Muokkaa kansiota</translation>
 <translation id="6643016212128521049">Tyhjennä</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Tämä kirjaa sinut ulos useimmilta sivustoilta. Sinua ei kirjata ulos Google-tililtäsi.</translation>
 <translation id="7454641608352164238">Tallennustila ei riitä</translation>
 <translation id="7455923816558154057">Napauta, niin linkki avataan</translation>
+<translation id="7465104139234185284">Sulje kaikki yksityiset välilehdet</translation>
 <translation id="7473891865547856676">Ei kiitos</translation>
 <translation id="7475192538862203634">Jos näet tämän ilmoituksen usein, kokeile näitä <ph name="BEGIN_LINK" />ehdotuksia<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD-korttia ei löydy. Osa tiedostoista voi puuttua.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> Gt ladattu</translation>
 <translation id="8249310407154411074">Siirrä ylimmäksi</translation>
 <translation id="8250920743982581267">Dokumentit</translation>
+<translation id="825412236959742607">Tämä sivu käyttää liikaa muistia, joten Chrome poisti osan sisällöstä.</translation>
 <translation id="8260126382462817229">Yritä kirjautua uudelleen sisään.</translation>
 <translation id="8261506727792406068">Poista</translation>
 <translation id="8266862848225348053">Lataussijainti</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Aloita puhehaku</translation>
 <translation id="9071742570345586758">Jos haluat tarkastella virtuaalitodellisuussisältöä, asenna Googlen VR-palvelut.</translation>
 <translation id="9074336505530349563">Kirjaudu sisään ja ota synkronointi käyttöön, niin näet Googlen suosittelemaa yksilöllistä sisältöä</translation>
+<translation id="9080642952018487277">Siirry yksityiseen tilaan</translation>
 <translation id="9086455579313502267">Ei yhteyttä verkkoon.</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> Kt ladattu</translation>
 <translation id="9100505651305367705">Tarjoa yksinkertaistettua näkymää, jos artikkeli tukee sitä</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 551380c..65a79c0 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Idinaragdag ang <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">Mula sa mga website</translation>
 <translation id="1049743911850919806">Incognito</translation>
+<translation id="1054301162707478098">Nakapribado ka.</translation>
 <translation id="10614374240317010">Hindi kailanman nag-save</translation>
 <translation id="1068672505746868501">Huwag kailanman isalin ang mga page sa <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Higit pang wika</translation>
 <translation id="124678866338384709">Isara ang kasalukuyang tab</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Ang mga page na tinitingnan mo sa mga pribadong tab ay hindi mananatili sa iyong history ng browser, cookie store, o history ng paghahanap pagkatapos mong isara ang lahat ng iyong pribadong tab. Itatago ang anumang file na ida-download mo o anumang bookmark na gagawin mo.
+
+Gayunpaman, hindi ka invisible. Kahit na nakapribado ka, makikita pa rin ng iyong employer, internet service provider, o mga binibisita mong website ang aktibidad mo sa pag-browse.</translation>
 <translation id="127138278192656016">Gamitin ang pag-sync at ang lahat ng serbisyo</translation>
 <translation id="1272079795634619415">Stop</translation>
 <translation id="1283039547216852943">I-tap upang palawakin</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Control ng full screen sa site</translation>
 <translation id="2038563949887743358">I-on ang Hilingin ang site sa desktop</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB na iba pang mga app</translation>
+<translation id="2055670718290744343">Accelerator ng Paghahanap</translation>
 <translation id="2063713494490388661">Mag-tap upang Maghanap</translation>
 <translation id="2079545284768500474">I-undo</translation>
 <translation id="2082238445998314030">Resulta <ph name="RESULT_NUMBER" /> sa <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sync at mga serbisyo ng Google</translation>
 <translation id="2259659629660284697">I-export ang mga password…</translation>
 <translation id="2268044343513325586">Pinuhin</translation>
+<translation id="2280910239864711607">Magbukas ng bagong tab sa Private mode</translation>
 <translation id="2286841657746966508">Billing address</translation>
 <translation id="230115972905494466">Walang nahanap na tugmang device</translation>
 <translation id="2315043854645842844">Hindi sinusuportahan ng operating system ang pagpipilian ng certificate sa panig ng kliyente.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Payagan ang JavaScript para sa isang partikular na site.</translation>
 <translation id="2625189173221582860">Nakopya ang password</translation>
 <translation id="2631006050119455616">Na-save</translation>
+<translation id="2633278372998075009">Mga pribadong tab</translation>
 <translation id="2647434099613338025">Magdagdag ng wika</translation>
 <translation id="2650751991977523696">I-download muli ang file?</translation>
 <translation id="2653659639078652383">Isumite</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Kung nakalimutan mo ang iyong passphrase o gusto mong baguhin ang setting na ito, <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikropono</translation>
 <translation id="3232754137068452469">Web App</translation>
+<translation id="3234355010754616171">Bagong pribadong tab</translation>
 <translation id="3236059992281584593">1 minuto na lang ang natitira</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">I-bookmark ang page na ito</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Isara ang lahat ng incognito na tab</translation>
 <translation id="3365671512111106261">Hindi available kapag naka-on ang Data Saver</translation>
 <translation id="3367813778245106622">Mag-sign in muli upang simulan ang pag-sync</translation>
+<translation id="3377025655491224618">Pribadong Tab</translation>
 <translation id="3384347053049321195">Magbahagi ng larawan</translation>
 <translation id="3386292677130313581">Magtanong bago payagan ang mga site na malaman ang iyong lokasyon (inirerekomenda)</translation>
 <translation id="3387650086002190359">Hindi na-download ang <ph name="FILE_NAME" /> dahil sa mga error sa file system.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Para makakuha ng naka-personalize na content na iminumungkahi ng Google, i-on ang pag-sync</translation>
 <translation id="4226663524361240545">Maaaring mag-vibrate ang device dahil sa mga notification</translation>
 <translation id="4242533952199664413">Buksan ang mga setting</translation>
+<translation id="4243710787042215766">Buksan sa pribadong tab</translation>
 <translation id="424864128008805179">Mag-sign out sa Chrome?</translation>
 <translation id="4256782883801055595">Mga lisensya ng open source</translation>
 <translation id="4259722352634471385">Naka-block ang navigation: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Hindi nakagawa ng tunnel sa pamamagitan ng proxy server</translation>
 <translation id="4881695831933465202">Buksan</translation>
 <translation id="488187801263602086">Palitan ang pangalan ng file</translation>
+<translation id="4883379392681899581">Umalis sa private mode</translation>
 <translation id="4885273946141277891">Hindi sinusuportahang bilang ng mga instance ng Chrome.</translation>
 <translation id="4910889077668685004">Mga app sa pagbabayad</translation>
 <translation id="4913161338056004800">I-reset ang mga istatistika</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">May video</translation>
 <translation id="5233638681132016545">Bagong tab</translation>
 <translation id="5240817131241497236">Ang mga setting na nabago ng pagkontrol sa pag-sync, pag-personalize, at iba pang serbisyo ng Google sa Chrome. Maaari itong makaapekto sa iyong mga kasalukuyang setting.</translation>
+<translation id="5264003212305142034">Maaaring i-customize ang <ph name="BEGIN_LINK1" />Mga Setting<ph name="END_LINK1" /> anumang oras. Maaaring gamitin ng Google ang content sa mga site na binibisita mo, pati na ang aktibidad at pakikipag-ugnayan sa browser para i-personalize ang Chrome at ang iba pang serbisyo ng Google tulad ng Translate, Search, at mga ad.</translation>
 <translation id="5271967389191913893">Hindi mabuksan ng device ang content na ida-download.</translation>
 <translation id="528192093759286357">I-drag mula sa itaas at pindutin ang button na bumalik upang lumabas sa full screen.</translation>
 <translation id="5284584623296338184">Hindi na masi-sync sa iyong Google Account ang mga pagbabago sa iyong mga bookmark, history, password at iba pang mga setting. Gayunpaman, mananatiling nakaimbak sa iyong Google account ang iyong kasalukuyang data.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Hindi-alam</translation>
 <translation id="5833397272224757657">Ginagamit ang content sa mga site na binibisita mo at ang aktibidad at mga pakikipag-ugnayan sa browser para sa pag-personalize</translation>
 <translation id="5833984609253377421">Ibahagi ang link</translation>
+<translation id="584427517463557805">Napiling Pribadong Tab</translation>
 <translation id="5854790677617711513">Mas matagal sa 30 araw</translation>
 <translation id="5858741533101922242">Hindi ma-on ng Chrome ang Bluetooth adapter</translation>
 <translation id="5860033963881614850">Naka-off</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">I-edit ang home page</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> (na) oras na lang ang natitira</translation>
 <translation id="60924377787140961">Marami pang artikulo ang malapit nang lumabas. I-enjoy ang iyong hapon!</translation>
+<translation id="6099151465289169210">Lumipat sa mga pribadong tab</translation>
 <translation id="6108923351542677676">Kasalukuyang sine-setup…</translation>
 <translation id="6111020039983847643">nagamit na data</translation>
 <translation id="6112702117600201073">Nire-refresh ang page</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Mag-vibrate</translation>
 <translation id="6324034347079777476">Naka-disable ang pag-sync ng Android system</translation>
 <translation id="6333140779060797560">Ibahagi sa pamamagitan ng <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Bagong pribadong tab</translation>
 <translation id="6337234675334993532">Pag-encrypt</translation>
 <translation id="6341580099087024258">Itanong kung saan magse-save ng mga file</translation>
 <translation id="6343192674172527289">Walang nakitang download</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Desktop site</translation>
 <translation id="6600954340915313787">Kinopya sa Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Isara ang mga pribadong tab</translation>
 <translation id="6612358246767739896">Pinoprotektahang content</translation>
 <translation id="6627583120233659107">I-edit ang folder</translation>
 <translation id="6643016212128521049">I-clear</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Isa-sign out ka sa karamihan ng mga site. Hindi ka masa-sign out sa iyong Google Account.</translation>
 <translation id="7454641608352164238">Walang sapat na espasyo</translation>
 <translation id="7455923816558154057">I-tap upang tingnan</translation>
+<translation id="7465104139234185284">Isara ang lahat ng pribadong tab</translation>
 <translation id="7473891865547856676">Hindi, Salamat</translation>
 <translation id="7475192538862203634">Kung madalas mo itong makita, subukan ang <ph name="BEGIN_LINK" />mga suhestyon<ph name="END_LINK" /> na ito.</translation>
 <translation id="7475688122056506577">Hindi nakita ang SD card. Maaaring nawawala ang ilan sa iyong mga file.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB na mga na-download</translation>
 <translation id="8249310407154411074">Ilipat sa itaas</translation>
 <translation id="8250920743982581267">Mga Dokumento</translation>
+<translation id="825412236959742607">Masyadong malaki ang ginagamit na memory ng page na ito kaya inalis ng Chrome ang ilang content.</translation>
 <translation id="8260126382462817229">Subukang mag-sign in muli</translation>
 <translation id="8261506727792406068">I-delete</translation>
 <translation id="8266862848225348053">Lokasyon ng download</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Simulan ang paghahanap gamit ang boses</translation>
 <translation id="9071742570345586758">Upang tingnan ang virtual reality na content, i-install ang Mga Serbisyo ng Google VR</translation>
 <translation id="9074336505530349563">Para makakuha ng naka-personalize na content na iminumungkahi ng Google, mag-sign in at i-on ang pag-sync</translation>
+<translation id="9080642952018487277">Pumasok sa private mode</translation>
 <translation id="9086455579313502267">Hindi magawang ma-access ang network</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB na mga na-download</translation>
 <translation id="9100505651305367705">Mag-alok na ipakita ang mga artikulo sa pinasimpleng view, kapag sinusuportahan</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 a7f8578..96273f5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fr.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Ajout de <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">À partir de sites Web</translation>
 <translation id="1049743911850919806">Navigation privée</translation>
+<translation id="1054301162707478098">Vous êtes passé en mode privé.</translation>
 <translation id="10614374240317010">Jamais enregistrés</translation>
 <translation id="1068672505746868501">Ne jamais traduire les pages en <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Plus de langues</translation>
 <translation id="124678866338384709">Fermer l'onglet actuel</translation>
 <translation id="1258753120186372309">Doodle : <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Les pages consultées dans les onglets privés ne sont pas enregistrées dans l'historique de votre navigateur, dans les cookies ni dans l'historique des recherches une fois que vous avez fermé tous les onglets privés. Les fichiers téléchargés et les favoris ajoutés sont conservés.
+
+Vous n'êtes cependant pas devenu invisible. L'utilisation du mode privé n'empêche pas votre employeur, votre fournisseur d'accès à Internet ou les sites Web que vous avez consultés d'avoir accès aux informations relatives à votre navigation.</translation>
 <translation id="127138278192656016">Utiliser la synchronisation et tous les services</translation>
 <translation id="1272079795634619415">Arrêter</translation>
 <translation id="1283039547216852943">Appuyer pour développer</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Commandes du site en plein écran</translation>
 <translation id="2038563949887743358">Activer "Voir version ordinateur"</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> Go par d'autres applis</translation>
+<translation id="2055670718290744343">Accélérateur de recherche</translation>
 <translation id="2063713494490388661">Appuyer pour rechercher</translation>
 <translation id="2079545284768500474">Annuler</translation>
 <translation id="2082238445998314030">Résultat <ph name="RESULT_NUMBER" /> sur <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Services Google/Synchronisation</translation>
 <translation id="2259659629660284697">Exporter les mots de passe…</translation>
 <translation id="2268044343513325586">Affiner</translation>
+<translation id="2280910239864711607">Ouvrir un nouvel onglet en mode privé</translation>
 <translation id="2286841657746966508">Adresse de facturation</translation>
 <translation id="230115972905494466">Aucun appareil compatible détecté</translation>
 <translation id="2315043854645842844">La sélection de certificat côté client n'est pas compatible avec le système d'exploitation.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Autorise le langage JavaScript pour un site spécifique.</translation>
 <translation id="2625189173221582860">Mot de passe copié</translation>
 <translation id="2631006050119455616">Enregistrées</translation>
+<translation id="2633278372998075009">Onglets privés</translation>
 <translation id="2647434099613338025">Ajouter une langue</translation>
 <translation id="2650751991977523696">Télécharger de nouveau le fichier ?</translation>
 <translation id="2653659639078652383">Valider</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Si vous avez oublié votre phrase secrète, ou si vous souhaitez modifier ce paramètre, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" />.</translation>
 <translation id="3227137524299004712">Micro</translation>
 <translation id="3232754137068452469">Application Web</translation>
+<translation id="3234355010754616171">Nouvel onglet privé</translation>
 <translation id="3236059992281584593">1 minute restante</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Ajouter cette page aux favoris</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Fermer tous les onglets de navigation privée</translation>
 <translation id="3365671512111106261">Non disponible lorsque l'économiseur de données est activé</translation>
 <translation id="3367813778245106622">Connectez-vous de nouveau à votre compte pour démarrer la synchronisation.</translation>
+<translation id="3377025655491224618">Onglet privé</translation>
 <translation id="3384347053049321195">Partager l'image</translation>
 <translation id="3386292677130313581">Demander avant d'autoriser des sites à accéder à ma position (recommandé)</translation>
 <translation id="3387650086002190359">Échec du téléchargement du fichier "<ph name="FILE_NAME" />" en raison d'erreurs liées au système de fichiers.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Activez la synchronisation pour obtenir des suggestions de contenu personnalisées de la part de Google</translation>
 <translation id="4226663524361240545">L'appareil vibrera en cas de notifications.</translation>
 <translation id="4242533952199664413">Ouvrir les paramètres</translation>
+<translation id="4243710787042215766">Ouvrir dans un onglet privé</translation>
 <translation id="424864128008805179">Se déconnecter de Chrome ?</translation>
 <translation id="4256782883801055595">Licences Open Source</translation>
 <translation id="4259722352634471385">La navigation sur <ph name="URL" /> est bloquée.</translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Échec de l'établissement d'un tunnel via un serveur proxy</translation>
 <translation id="4881695831933465202">Ouvrir</translation>
 <translation id="488187801263602086">Renommer le fichier</translation>
+<translation id="4883379392681899581">Quitter le mode privé</translation>
 <translation id="4885273946141277891">Le nombre d'instances de Chrome n'est pas compatible.</translation>
 <translation id="4910889077668685004">Applications de paiement</translation>
 <translation id="4913161338056004800">Réinitialiser les statistiques</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Avec vidéo</translation>
 <translation id="5233638681132016545">Nouvel onglet</translation>
 <translation id="5240817131241497236">Les paramètres relatifs à la synchronisation, à la personnalisation et à d'autres services Google dans Chrome ont été modifiés, ce qui peut avoir une incidence sur votre configuration actuelle.</translation>
+<translation id="5264003212305142034">Nous pouvons utiliser le contenu des sites que vous consultez, ainsi que vos activités de navigation et vos interactions avec le navigateur, pour personnaliser Chrome, et d'autres services Google comme Traduction, la recherche Google et les annonces. Sachez toutefois que vous pouvez également personnaliser les <ph name="BEGIN_LINK1" />paramètres<ph name="END_LINK1" /> à tout moment.</translation>
 <translation id="5271967389191913893">Impossible d'ouvrir le contenu à télécharger sur l'appareil.</translation>
 <translation id="528192093759286357">Pour quitter le mode plein écran, faites glisser un doigt du haut vers le bas, puis appuyez sur le bouton Retour.</translation>
 <translation id="5284584623296338184">Les modifications apportées à vos favoris, votre historique, vos mots de passe et d'autres paramètres ne seront plus synchronisées avec votre compte Google. Vos données resteront cependant conservées dans votre compte Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Inconnu</translation>
 <translation id="5833397272224757657">Utilise le contenu des sites que vous consultez, votre activité de navigation et vos interactions pour la personnalisation</translation>
 <translation id="5833984609253377421">Partager le lien</translation>
+<translation id="584427517463557805">Onglet privé sélectionné</translation>
 <translation id="5854790677617711513">Datant de plus de 30 jours</translation>
 <translation id="5858741533101922242">Impossible d'activer l'adaptateur Bluetooth dans Chrome</translation>
 <translation id="5860033963881614850">Désactivé</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Modifier la page d'accueil</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> heures restantes</translation>
 <translation id="60924377787140961">D'autres articles vous seront bientôt proposés. Bon après-midi !</translation>
+<translation id="6099151465289169210">Vous êtes passé aux onglets privés</translation>
 <translation id="6108923351542677676">Configuration en cours…</translation>
 <translation id="6111020039983847643">données utilisées</translation>
 <translation id="6112702117600201073">Actualisation de la page</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibreur</translation>
 <translation id="6324034347079777476">La synchronisation du système Android est désactivée.</translation>
 <translation id="6333140779060797560">Partager via <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nouvel onglet privé</translation>
 <translation id="6337234675334993532">Chiffrement</translation>
 <translation id="6341580099087024258">Demander où enregistrer les fichiers</translation>
 <translation id="6343192674172527289">Aucun téléchargement trouvé</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Version pour ordinateur</translation>
 <translation id="6600954340915313787">Copiée dans Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> Go</translation>
+<translation id="6610147964972079463">Fermer les onglets privés</translation>
 <translation id="6612358246767739896">Contenu protégé</translation>
 <translation id="6627583120233659107">Modifier le dossier</translation>
 <translation id="6643016212128521049">Effacer</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Vous déconnecte de la plupart des sites. Vous ne serez cependant pas déconnecté de votre compte Google.</translation>
 <translation id="7454641608352164238">Espace insuffisant</translation>
 <translation id="7455923816558154057">Appuyer pour afficher</translation>
+<translation id="7465104139234185284">Fermer tous les onglets privés</translation>
 <translation id="7473891865547856676">Non, merci</translation>
 <translation id="7475192538862203634">Si vous rencontrez souvent ce problème, essayez les <ph name="BEGIN_LINK" />suggestions<ph name="END_LINK" /> suivantes.</translation>
 <translation id="7475688122056506577">Carte SD introuvable. Certains de vos fichiers risquent d'être manquants.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> Go téléchargé(s)</translation>
 <translation id="8249310407154411074">Déplacer vers le haut</translation>
 <translation id="8250920743982581267">Documents</translation>
+<translation id="825412236959742607">Cette page utilise trop de mémoire, Chrome a donc supprimé du contenu.</translation>
 <translation id="8260126382462817229">Essayez de vous connecter de nouveau à votre compte.</translation>
 <translation id="8261506727792406068">Supprimer</translation>
 <translation id="8266862848225348053">Emplacement de téléchargement</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Démarrer la recherche vocale</translation>
 <translation id="9071742570345586758">Pour afficher des contenus de réalité virtuelle, installez les services Google VR</translation>
 <translation id="9074336505530349563">Connectez-vous et activez la synchronisation pour obtenir des suggestions de contenu personnalisées de la part de Google</translation>
+<translation id="9080642952018487277">Activer le mode privé</translation>
 <translation id="9086455579313502267">Impossible d'accéder au réseau.</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> Ko téléchargé(s)</translation>
 <translation id="9100505651305367705">Proposer une version simplifiée des articles, si celle-ci est compatible</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 6e3906e..7cacb97b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> जोड़ा जा रहा है...</translation>
 <translation id="1041308826830691739">वेबसाइटों से</translation>
 <translation id="1049743911850919806">गुप्त</translation>
+<translation id="1054301162707478098">आप 'निजी मोड' में चले गए हैं.</translation>
 <translation id="10614374240317010">कभी नहीं सहेजा गया</translation>
 <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" /> भाषा के पेज का कभी भी अनुवाद न करें</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">अधिक भाषाएं</translation>
 <translation id="124678866338384709">वर्तमान टैब को बंद करें</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">जब आप 'निजी मोड' के सभी टैब बंद कर देते हैं, तो जिन पेजों को आपने 'निजी मोड' में देखा था वे आपके ब्राउज़र के इतिहास, कुकी स्टोर या खोज इतिहास में दिखाई नहीं देंगे. आप जो भी फ़ाइल डाउनलोड करते हैं या जो भी बुकमार्क बनाते हैं, उन्हें बनाए रखा जाएगा.
+
+हालांकि, 'निजी मोड' का मतलब यह नहीं है कि आपको कोई भी नहीं देख सकता. 'निजी मोड' में आप जो भी ब्राउजिंग करते हैं उसे आपके नियोक्ता, इंटरनेट सेवा देने वाली कंपनी या आप जिन वेबसाइटों को देखते हैं, वे देख सकते हैं.</translation>
 <translation id="127138278192656016">सिंक और सभी सेवाएं इस्तेमाल करें</translation>
 <translation id="1272079795634619415">रोकें</translation>
 <translation id="1283039547216852943">विस्तृत करने के लिए टैप करें</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">पूरी स्क्रीन के साइट नियंत्रण</translation>
 <translation id="2038563949887743358">अनुरोध डेस्कटॉप साइट चालू करें</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> जीबी अन्य ऐप्लिकेशन</translation>
+<translation id="2055670718290744343">खोज की गति बढ़ाएं</translation>
 <translation id="2063713494490388661">खोजने के लिए टैप करें</translation>
 <translation id="2079545284768500474">वापस लाएं</translation>
 <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> में से <ph name="RESULT_NUMBER" /> परिणाम</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">सिंक और Google सेवाएं</translation>
 <translation id="2259659629660284697">पासवर्ड निर्यात करें…</translation>
 <translation id="2268044343513325586">परिशोधित करें</translation>
+<translation id="2280910239864711607">निजी मोड में नया टैब खोलें</translation>
 <translation id="2286841657746966508">बिलिंग पता</translation>
 <translation id="230115972905494466">कोई संगत डिवाइस नहीं मिला</translation>
 <translation id="2315043854645842844">क्लाइंट-साइड प्रमाणपत्र चयन ऑपरेटिंग सिस्टम के द्वारा समर्थित नहीं है.</translation>
@@ -198,7 +204,7 @@
 <translation id="2501278716633472235">वापस जाएं</translation>
 <translation id="2512222046227390255">फ़ॉर्म अपने आप भरने दें</translation>
 <translation id="2513403576141822879">निजता, सुरक्षा और डेटा इकट्ठा करने से जुड़ी ज़्यादा सेटिंग के लिए, <ph name="BEGIN_LINK" />सिंक और Google सेवाएं<ph name="END_LINK" /> देखें</translation>
-<translation id="2523184218357549926">आपके जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
+<translation id="2523184218357549926">आप जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
 <translation id="2526148617758225454">डेटा सर्वर चालू है. उसे सेटिंग में प्रबंधित करें.</translation>
 <translation id="2532336938189706096">वेब दृश्य</translation>
 <translation id="2536728043171574184">इस पृष्‍ठ की ऑफ़लाइन कॉपी देख रहे हैं</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">विशिष्ट साइट के लिए JavaScript की अनुमति दें.</translation>
 <translation id="2625189173221582860">पासवर्ड कॉपी किया गया</translation>
 <translation id="2631006050119455616">बचाया गया</translation>
+<translation id="2633278372998075009">निजी टैब</translation>
 <translation id="2647434099613338025">भाषा जोड़ें</translation>
 <translation id="2650751991977523696">फ़ाइल दोबारा डाउनलोड करें?</translation>
 <translation id="2653659639078652383">सबमिट करें</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">यदि आप अपना पासफ़्रेज़ भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" />समन्वयन रीसेट करें<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
 <translation id="3232754137068452469">वेब ऐप</translation>
+<translation id="3234355010754616171">नया निजी टैब</translation>
 <translation id="3236059992281584593">1 मिनट शेष</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">इस पेज को बुकमार्क करें</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">सभी गुप्त टैब बंद करें</translation>
 <translation id="3365671512111106261">डेटा बचाने के साधन के चालू होने पर यह सेटिंग अनुपलब्ध होती है</translation>
 <translation id="3367813778245106622">समन्वयन शुरू करने के लिए फिर से प्रवेश करें</translation>
+<translation id="3377025655491224618">निजी टैब</translation>
 <translation id="3384347053049321195">चित्र शेयर करें</translation>
 <translation id="3386292677130313581">साइट को अपना स्थान जानने देने से पहले अनुमति लेना आवश्यक बनाएं (अनुशंसित)</translation>
 <translation id="3387650086002190359">सिस्‍टम त्रुटियों के कारण <ph name="FILE_NAME" /> डाउनलोड विफल रहा.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Google की ओर से सुझाई गई मनमुताबिक सामग्री पाने के लिए, 'सिंक करें' को चालू करें</translation>
 <translation id="4226663524361240545">नोटिफ़िकेशन से डिवाइस में कंपन हो सकता है</translation>
 <translation id="4242533952199664413">सेटिंग खोलें</translation>
+<translation id="4243710787042215766">निजी टैब में खोलें</translation>
 <translation id="424864128008805179">Chrome से प्रस्थान करें?</translation>
 <translation id="4256782883801055595">ओपन सोर्स लाइसेंस</translation>
 <translation id="4259722352634471385">मार्गदर्शक अवरोधित है: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">प्रॉक्सी सर्वर के ज़रिए सुरंग बनाना विफल रहा</translation>
 <translation id="4881695831933465202">खोलें</translation>
 <translation id="488187801263602086">फ़ाइल का नाम बदलें</translation>
+<translation id="4883379392681899581">निजी मोड छोड़ें</translation>
 <translation id="4885273946141277891">Chrome इंस्टेंस की असमर्थित संख्या.</translation>
 <translation id="4910889077668685004">भुगतान ऐप्लिकेशन</translation>
 <translation id="4913161338056004800">आंकड़े रीसेट करें</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">वीडियो के साथ</translation>
 <translation id="5233638681132016545">नया टैब</translation>
 <translation id="5240817131241497236">Chrome में 'सिंक करें', 'मनमुताबिक बनाएं' और दूसरी 'Google सेवाओं' को नियंत्रित करने वाली सेटिंग बदल गई हैं. आपकी मौजूदा सेटिंग पर इसका असर पड़ सकता है.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />सेटिंग<ph name="END_LINK1" /> कभी भी अपनी पसंद के मुताबिक बनाई जा सकती हैं. Chrome और दूसरी Google सेवाओं, जैसे कि 'अनुवाद', 'खोज' और विज्ञापनों को आपकी पसंद के मुताबिक बनाने के लिए Google उन साइटों की सामग्री जिन पर आप गए हैं, साथ ही ब्राउज़र गतिनिधि और इंटरैक्शन का इस्तेमाल कर सकता है.</translation>
 <translation id="5271967389191913893">डाउनलोड की जाने वाली सामग्री को डिवाइस नहीं खोल सकता.</translation>
 <translation id="528192093759286357">पूर्ण स्क्रीन से बाहर निकलने के लिए ऊपर से खींचें और वापस जाएं स्पर्श करें.</translation>
 <translation id="5284584623296338184">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में समन्वयित नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहित रहेगा.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">अज्ञात</translation>
 <translation id="5833397272224757657">आप जिन साइटों पर जाते हैं उनकी सामग्री के साथ ही ब्राउज़र गतिविधि और इंटरैक्शन का इस्तेमाल आपके मनमुताबिक बनाने के लिए करता है</translation>
 <translation id="5833984609253377421">लिंक शेयर करें</translation>
+<translation id="584427517463557805">चुना गया निजी टैब</translation>
 <translation id="5854790677617711513">30 दिनों से ज़्यादा पुराना</translation>
 <translation id="5858741533101922242">Chrome, ब्लूटूथ एडाप्टर को चालू नहीं कर सका</translation>
 <translation id="5860033963881614850">बंद</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">मुखपृष्ठ संपादित करें</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> घंटे शेष</translation>
 <translation id="60924377787140961">जल्द ही और लेख दिखाई देंगे. अपनी दोपहर का आनंद लें!</translation>
+<translation id="6099151465289169210">निजी टैब में स्विच किया गया</translation>
 <translation id="6108923351542677676">सेटअप प्रगति में है…</translation>
 <translation id="6111020039983847643">इस्तेमाल किया गया डेटा</translation>
 <translation id="6112702117600201073">पृष्‍ठ रीफ्रेश किया जा रहा है</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">कंपन</translation>
 <translation id="6324034347079777476">Android सिस्टम समन्वयन अक्षम है</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> के द्वारा शेयर करें</translation>
+<translation id="6336451774241870485">नया निजी टैब</translation>
 <translation id="6337234675334993532">सुरक्षित तरीका</translation>
 <translation id="6341580099087024258">फ़ाइलें सेव करने की जगह पूछें</translation>
 <translation id="6343192674172527289">कोई डाउनलोड नहीं मिला</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">डेस्कटॉप साइट</translation>
 <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> जीबी</translation>
+<translation id="6610147964972079463">निजी टैब बंद करें</translation>
 <translation id="6612358246767739896">सुरक्षित सामग्री</translation>
 <translation id="6627583120233659107">फ़ोल्‍डर संपादित करें</translation>
 <translation id="6643016212128521049">साफ़ करें</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">आपको ज़्यादातर साइटों से साइन आउट कर देता है. आप अपने Google खाते से साइन आउट नहीं होंगे.</translation>
 <translation id="7454641608352164238">जगह काफ़ी नहीं है</translation>
 <translation id="7455923816558154057">देखने के लिए टैप करें</translation>
+<translation id="7465104139234185284">सभी निजी टैब बंद करें</translation>
 <translation id="7473891865547856676">जी रहने दें</translation>
 <translation id="7475192538862203634">यदि आपको यह बार-बार दिखाई दे रहा हो, तो इन <ph name="BEGIN_LINK" />सुझावों<ph name="END_LINK" /> को आज़माएं.</translation>
 <translation id="7475688122056506577">SD कार्ड नहीं मिला. हो सकता है कि आपकी कुछ फ़ाइलें उपलब्ध न हों.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> जीबी डाउनलोड किया गया</translation>
 <translation id="8249310407154411074">सबसे ऊपर ले जाएं</translation>
 <translation id="8250920743982581267">दस्तावेज़</translation>
+<translation id="825412236959742607">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए Chrome ने कुछ सामग्री हटा दी है.</translation>
 <translation id="8260126382462817229">फिर से प्रवेश करके देखें</translation>
 <translation id="8261506727792406068">हटाएं</translation>
 <translation id="8266862848225348053">डाउनलोड सेव करने की जगह</translation>
@@ -900,7 +918,7 @@
 <translation id="8413126021676339697">संपूर्ण इतिहास दिखाएं</translation>
 <translation id="8420510748452002155">मनमुताबिक नहीं बनाई गई सेवाएं</translation>
 <translation id="8428213095426709021">सेटिंग</translation>
-<translation id="8438566539970814960">खोजों और ब्राउज़िेंग को बेहतर बनाएं</translation>
+<translation id="8438566539970814960">खोजों और ब्राउज़िंग को बेहतर बनाएं</translation>
 <translation id="8441146129660941386">पीछे जाएं</translation>
 <translation id="8445448999790540984">पासवर्ड निर्यात नहीं कर सकते</translation>
 <translation id="8447861592752582886">डिवाइस अनुमति निरस्त करें</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">बोलकर खोजें चालू करें</translation>
 <translation id="9071742570345586758">आभासी वास्तविकता वाली सामग्री देखने के लिए, Google VR सेवाएं इंस्टॉल करें</translation>
 <translation id="9074336505530349563">Google की ओर से सुझाई गई मनमुताबिक सामग्री पाने के लिए, साइन इन करें और 'सिंक करें' को चालू करें</translation>
+<translation id="9080642952018487277">निजी मोड में जाएं</translation>
 <translation id="9086455579313502267">नेटवर्क तक पहुंचने में असमर्थ</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> केबी डाउलनोड किया गया</translation>
 <translation id="9100505651305367705">अगर सुविधा उपलब्ध है, तो लेखों को सरल बनाए गए व्यू में दिखाना ऑफ़र करें</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 cb54bb9..6e28a9e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hr.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Dodavanje stavke <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">S web-lokacija</translation>
 <translation id="1049743911850919806">Anonimno</translation>
+<translation id="1054301162707478098">Sada ste u privatnom načinu.</translation>
 <translation id="10614374240317010">Zaporke se nikad ne spremaju</translation>
 <translation id="1068672505746868501">Nikad ne prevodi <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Više jezika</translation>
 <translation id="124678866338384709">Zatvaranje trenutačne kartice</translation>
 <translation id="1258753120186372309">Googleov doodle logotip: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Stranice koje gledate na privatnim karticama neće se zadržati u povijesti preglednika, pohrani kolačića i povijesti pretraživanja nakon što zatvorite sve privatne kartice. Sve datoteke koje preuzmete i oznake koje izradite sačuvat će se.
+
+Međutim, niste nevidljivi. Privatni način neće sakriti vaše pregledavanje od vašeg poslodavca, davatelja internetskih usluga i web-lokacija koje posjetite.</translation>
 <translation id="127138278192656016">Upotreba sinkronizacije i svih usluga</translation>
 <translation id="1272079795634619415">Zaustavi</translation>
 <translation id="1283039547216852943">Dodirnite za proširivanje</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Kontrole web-lokacije na cijelom zaslonu</translation>
 <translation id="2038563949887743358">Uključivanje zahtjeva za prikaz klasične web-lokacije</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB ostale aplikacije</translation>
+<translation id="2055670718290744343">Ubrzano pretraživanje</translation>
 <translation id="2063713494490388661">Dodirnite za pretraživanje</translation>
 <translation id="2079545284768500474">Poništi</translation>
 <translation id="2082238445998314030"><ph name="RESULT_NUMBER" /> od <ph name="TOTAL_RESULTS" /> rezultata</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sinkronizacija i Googleove usluge</translation>
 <translation id="2259659629660284697">Izvoz zaporki...</translation>
 <translation id="2268044343513325586">Pročišćavanje</translation>
+<translation id="2280910239864711607">Otvaranje nove kartice u privatnom načinu</translation>
 <translation id="2286841657746966508">Adresa za naplatu</translation>
 <translation id="230115972905494466">Nije pronađen nijedan kompatibilni uređaj</translation>
 <translation id="2315043854645842844">Operativni sustav ne podržava odabir klijentskog certifikata.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Dopuštanje JavaScripta za određenu web-lokaciju.</translation>
 <translation id="2625189173221582860">Zaporka je kopirana</translation>
 <translation id="2631006050119455616">Spremljeno</translation>
+<translation id="2633278372998075009">Privatne kartice</translation>
 <translation id="2647434099613338025">Dodavanje jezika</translation>
 <translation id="2650751991977523696">Želite li ponovo preuzeti datoteku?</translation>
 <translation id="2653659639078652383">Pošalji</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Ako ste zaboravili šifru ili želite promijeniti tu postavku, <ph name="BEGIN_LINK" />poništite sinkronizaciju<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Web-aplikacija</translation>
+<translation id="3234355010754616171">Nova privatna kartica</translation>
 <translation id="3236059992281584593">Još 1 min</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Označi ovu stranicu</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Zatvori sve anonimne kartice</translation>
 <translation id="3365671512111106261">Nije dostupno uz uključenu Uštedu podataka</translation>
 <translation id="3367813778245106622">Prijavite se ponovo da biste pokrenuli sinkronizaciju</translation>
+<translation id="3377025655491224618">Privatna kartica</translation>
 <translation id="3384347053049321195">Dijeli sliku</translation>
 <translation id="3386292677130313581">Web-lokacije moraju tražiti dopuštenje za pristup lokaciji (preporučeno)</translation>
 <translation id="3387650086002190359">Preuzimanje datoteke <ph name="FILE_NAME" /> nije uspjelo zbog nepoznate pogreške sustava datoteka.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Uključite sinkronizaciju ako želite da vam Google predlaže prilagođene sadržaje</translation>
 <translation id="4226663524361240545">Obavijesti mogu uključiti vibriranje uređaja</translation>
 <translation id="4242533952199664413">Otvori postavke</translation>
+<translation id="4243710787042215766">Otvori u privatnoj kartici</translation>
 <translation id="424864128008805179">Želite li se odjaviti s Chromea?</translation>
 <translation id="4256782883801055595">Licence otvorenog koda</translation>
 <translation id="4259722352634471385">Otvaranje je blokirano: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Uspostava tunela putem proxy poslužitelja nije uspjela</translation>
 <translation id="4881695831933465202">Otvori</translation>
 <translation id="488187801263602086">Promijenite naziv datoteke</translation>
+<translation id="4883379392681899581">Izlaz iz privatnog načina</translation>
 <translation id="4885273946141277891">Nepodržan broj različitih verzija Chromea.</translation>
 <translation id="4910889077668685004">Aplikacije za plaćanje</translation>
 <translation id="4913161338056004800">Poništi statistiku</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">S videozapisom</translation>
 <translation id="5233638681132016545">Nova kartica</translation>
 <translation id="5240817131241497236">Promijenjene su postavke koje upravljaju sinkronizacijom, prilagodbom i drugim Googleovim uslugama u Chromeu. To može utjecati na vaše trenutačne postavke.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Postavke<ph name="END_LINK1" /> možete prilagoditi u bilo kojem trenutku. Google može upotrebljavati sadržaj na web-lokacijama koje posjećujete te vaše interakcije u pregledniku i aktivnost pregledavanja kako bi prilagodio Chrome i druge Googleove usluge kao što su Prevoditelj, Pretraživanje i oglasi.</translation>
 <translation id="5271967389191913893">Uređaj ne može otvoriti sadržaj za preuzimanje.</translation>
 <translation id="528192093759286357">Povucite od vrha zaslona i dodirnite gumb Natrag da biste zatvorili prikaz na cijelom zaslonu.</translation>
 <translation id="5284584623296338184">Promjene oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši postojeći podaci ostat će pohranjeni na vašem Google računu.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Nepoznato</translation>
 <translation id="5833397272224757657">Upotrebljava sadržaj na web-lokacijama koje posjećujete te aktivnosti i interakcije u pregledniku radi prilagodbe</translation>
 <translation id="5833984609253377421">Dijeli vezu</translation>
+<translation id="584427517463557805">Odabrana privatna kartica</translation>
 <translation id="5854790677617711513">Starije od 30 dana</translation>
 <translation id="5858741533101922242">Chrome ne može uključiti Bluetooth adapter</translation>
 <translation id="5860033963881614850">Isključeno</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Uređivanje početne stranice</translation>
 <translation id="60923314841986378">Preostalo sati: <ph name="HOURS" /></translation>
 <translation id="60924377787140961">Uskoro će se prikazati više članaka. Želimo vam ugodno poslijepodne!</translation>
+<translation id="6099151465289169210">Prebačeno na privatne kartice</translation>
 <translation id="6108923351542677676">Postavljanje je u tijeku…</translation>
 <translation id="6111020039983847643">iskorišteni podaci</translation>
 <translation id="6112702117600201073">Osvježavanje stranice</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Omogući vibraciju</translation>
 <translation id="6324034347079777476">Sinkronizacija sustava Android onemogućena</translation>
 <translation id="6333140779060797560">Dijeljenje putem aplikacije <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nova privatna kartica</translation>
 <translation id="6337234675334993532">Enkripcija</translation>
 <translation id="6341580099087024258">Pitaj gdje spremiti datoteke</translation>
 <translation id="6343192674172527289">Preuzimanja nisu pronađena</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Klasični prikaz</translation>
 <translation id="6600954340915313787">Kopirano u Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Zatvori privatne kartice</translation>
 <translation id="6612358246767739896">Zaštićeni sadržaj</translation>
 <translation id="6627583120233659107">Uredi mapu</translation>
 <translation id="6643016212128521049">Izbriši</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Odjavit ćete se s većine web-lokacija, ali se nećete odjaviti s Google računa.</translation>
 <translation id="7454641608352164238">Nema dovoljno prostora</translation>
 <translation id="7455923816558154057">Dodirnite za prikaz</translation>
+<translation id="7465104139234185284">Zatvori sve privatne kartice</translation>
 <translation id="7473891865547856676">Ne, hvala</translation>
 <translation id="7475192538862203634">Ako se to često prikazuje, pokušajte s ovim <ph name="BEGIN_LINK" />prijedlozima<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD kartica nije pronađena. Neke od vaših datoteka možda nedostaju.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB preuzimanja</translation>
 <translation id="8249310407154411074">Na vrh</translation>
 <translation id="8250920743982581267">Dokumenti</translation>
+<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio neki sadržaj.</translation>
 <translation id="8260126382462817229">Ponovo se pokušajte prijaviti</translation>
 <translation id="8261506727792406068">Izbriši</translation>
 <translation id="8266862848225348053">Lokacija za preuzimanje</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Pokretanje glasovnog pretraživanja</translation>
 <translation id="9071742570345586758">Da biste gledali sadržaj virtualne stvarnosti, instalirajte Googleove VR usluge</translation>
 <translation id="9074336505530349563">Prijavite se i uključite sinkronizaciju ako želite da vam Google predlaže prilagođene sadržaje</translation>
+<translation id="9080642952018487277">Ulaz u privatni način</translation>
 <translation id="9086455579313502267">Nije moguće pristupiti mreži</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB preuzimanja</translation>
 <translation id="9100505651305367705">Nuđenje prikazivanja članaka u pojednostavljenom prikazu kada je to podržano</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 d90a953..33c8aa65 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hu.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> hozzáadása…</translation>
 <translation id="1041308826830691739">Webhelyekről</translation>
 <translation id="1049743911850919806">Inkognitómód</translation>
+<translation id="1054301162707478098">Ön privát módra váltott.</translation>
 <translation id="10614374240317010">Az alábbi oldalakról soha ne mentsen jelszavakat</translation>
 <translation id="1068672505746868501">Soha ne fordítsa le a(z) <ph name="SOURCE_LANGUAGE" /> nyelvű oldalakat</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">További nyelvek…</translation>
 <translation id="124678866338384709">Az aktuális lap bezárása</translation>
 <translation id="1258753120186372309">Google ünnepi embléma: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">A privát lapokon megtekintett oldalak nem maradnak meg a böngészési előzményekben, a cookie-k tárolójában vagy a keresési előzményekben, miután bezárta az összes privát lapot. A letöltött fájlok és a létrehozott könyvjelzők azonban megmaradnak.
+
+Azonban Ön nem lesz láthatatlan. A privát mód használatával nem rejtheti el böngészési tevékenységét munkaadója, internetszolgáltatója vagy a felkeresett webhelyek elől.</translation>
 <translation id="127138278192656016">A szinkronizálás és az összes szolgáltatás használata</translation>
 <translation id="1272079795634619415">Leállítás</translation>
 <translation id="1283039547216852943">Koppintson a kibontáshoz</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Teljes képernyős oldal vezérlői</translation>
 <translation id="2038563949887743358">Kapcsolja be az Asztali webhely kérése funkciót</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB más alkalmazások által</translation>
+<translation id="2055670718290744343">Keresésgyorsító</translation>
 <translation id="2063713494490388661">A Keresés koppintással funkció</translation>
 <translation id="2079545284768500474">Visszavonás</translation>
 <translation id="2082238445998314030">Eredmény: <ph name="RESULT_NUMBER" />/<ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Szinkronizálás és Google</translation>
 <translation id="2259659629660284697">Jelszavak exportálása…</translation>
 <translation id="2268044343513325586">Pontosítás</translation>
+<translation id="2280910239864711607">Új lap megnyitása privát módban</translation>
 <translation id="2286841657746966508">Számlázási cím</translation>
 <translation id="230115972905494466">Nem találhatók kompatibilis eszközök</translation>
 <translation id="2315043854645842844">Az ügyféloldali tanúsítványválasztást az operációs rendszer nem támogatja.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">A JavaScript engedélyezése egy adott webhelyen.</translation>
 <translation id="2625189173221582860">Jelszó vágólapra másolva</translation>
 <translation id="2631006050119455616">Megtakarított</translation>
+<translation id="2633278372998075009">Privát lapok</translation>
 <translation id="2647434099613338025">Nyelv hozzáadása</translation>
 <translation id="2650751991977523696">Letölti újra a fájlt?</translation>
 <translation id="2653659639078652383">Elküldés</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Ha elfelejtette összetett jelszavát, vagy módosítani szeretné ezt a beállítást, <ph name="BEGIN_LINK" />állítsa alaphelyzetbe a szinkronizálást<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Internetes alkalmazás</translation>
+<translation id="3234355010754616171">Új privát lap</translation>
 <translation id="3236059992281584593">1 perc van hátra</translation>
 <translation id="3244271242291266297">HH</translation>
 <translation id="3254409185687681395">Könyvjelző hozzáadása ehhez az oldalhoz</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Az összes inkognitólap bezárása</translation>
 <translation id="3365671512111106261">Nem áll rendelkezésre, ha az Adatforgalom-csökkentő be van kapcsolva</translation>
 <translation id="3367813778245106622">A szinkronizálás megkezdéséhez jelentkezzen be újra</translation>
+<translation id="3377025655491224618">Privát lap</translation>
 <translation id="3384347053049321195">Kép megosztása</translation>
 <translation id="3386292677130313581">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a tartózkodási helyhez való hozzáférést (ajánlott)</translation>
 <translation id="3387650086002190359">A következő fájl letöltése a fájlrendszer hibái miatt nem sikerült: <ph name="FILE_NAME" />.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">A Google által javasolt, személyre szabott tartalmak fogadásához kapcsolja be a szinkronizálást</translation>
 <translation id="4226663524361240545">Az értesítések miatt rezeghet az eszköz</translation>
 <translation id="4242533952199664413">Beállítások megnyitása</translation>
+<translation id="4243710787042215766">Megnyitás privát lapon</translation>
 <translation id="424864128008805179">Kijelentkezés a Chrome-ból</translation>
 <translation id="4256782883801055595">Nyílt forráskódú licencek</translation>
 <translation id="4259722352634471385">Le van tiltva az ide vezető navigáció: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Nem sikerült a proxyszerveren keresztüli alagút kialakítása</translation>
 <translation id="4881695831933465202">Megnyitás</translation>
 <translation id="488187801263602086">Fájl átnevezése</translation>
+<translation id="4883379392681899581">Kilépés a privát módból</translation>
 <translation id="4885273946141277891">Ilyen sok Chrome-példány nem futhat egyszerre.</translation>
 <translation id="4910889077668685004">Fizetési alkalmazások</translation>
 <translation id="4913161338056004800">Statisztikák alaphelyzetbe állítása</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Videóval</translation>
 <translation id="5233638681132016545">Új lap</translation>
 <translation id="5240817131241497236">Megváltoztak a szinkronizálást, a személyre szabást és a Chrome más Google-szolgáltatásait vezérlő beállítások. Ez befolyásolhatja az aktuális beállításokat.</translation>
+<translation id="5264003212305142034">A <ph name="BEGIN_LINK1" />Beállításokat<ph name="END_LINK1" /> bármikor személyre szabhatja. A Google felhasználhatja az Ön által felkeresett webhelyeken lévő tartalmakat, a böngészési interakciókat és tevékenységeket a Chrome és az egyéb Google-szolgáltatások (például a Fordító, a Keresés és a megjelenő hirdetések) személyre szabásához.</translation>
 <translation id="5271967389191913893">Az eszköz nem tudja megnyitni a letölteni kívánt tartalmat.</translation>
 <translation id="528192093759286357">A teljes képernyős megjelenítésből való kilépéshez húzza le felülről, majd koppintson a vissza gombra.</translation>
 <translation id="5284584623296338184">Könyvjelzői, előzményei, jelszavai és más beállításai a továbbiakban már nem lesznek szinkronizálva Google-fiókjával. Meglévő adatainak tárolása azonban továbbra is megmarad Google-fiókjában.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Ismeretlen</translation>
 <translation id="5833397272224757657">A felkeresett webhelyeken található tartalmak, a böngészőtevékenysége, valamint a böngészőben végzett interakciók felhasználása személyre szabáshoz</translation>
 <translation id="5833984609253377421">Link megosztása</translation>
+<translation id="584427517463557805">Kijelölt privát lap</translation>
 <translation id="5854790677617711513">30 napnál régebbi</translation>
 <translation id="5858741533101922242">A Chrome nem tudja bekapcsolni a Bluetooth-adaptert</translation>
 <translation id="5860033963881614850">Kikapcsolva</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Kezdőoldal szerkesztése</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> óra van hátra</translation>
 <translation id="60924377787140961">Hamarosan további cikkek jelennek meg. Kellemes délutánt kívánunk!</translation>
+<translation id="6099151465289169210">Privát lapokra váltva</translation>
 <translation id="6108923351542677676">A telepítés folyamatban...</translation>
 <translation id="6111020039983847643">használt adatmennyiség</translation>
 <translation id="6112702117600201073">Oldal frissítése</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Rezgés</translation>
 <translation id="6324034347079777476">Az Android rendszer szinkronizálása letiltva</translation>
 <translation id="6333140779060797560">Megosztás a következőn keresztül: <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Új privát lap</translation>
 <translation id="6337234675334993532">Titkosítás</translation>
 <translation id="6341580099087024258">Rákérdezés a fájlok mentésének helyére</translation>
 <translation id="6343192674172527289">Nem található letöltés</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Asztali webhely</translation>
 <translation id="6600954340915313787">A Chrome-ba másolva</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Privát lapok bezárása</translation>
 <translation id="6612358246767739896">Védett tartalom</translation>
 <translation id="6627583120233659107">Mappa szerkesztése</translation>
 <translation id="6643016212128521049">Törlés</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">A rendszer a legtöbb webhelyről kijelentkezteti Önt, de Google-fiókjából nem.</translation>
 <translation id="7454641608352164238">Nincs elég tárhely</translation>
 <translation id="7455923816558154057">Koppintson a megtekintéshez</translation>
+<translation id="7465104139234185284">Összes privát lap bezárása</translation>
 <translation id="7473891865547856676">Nem, köszönöm</translation>
 <translation id="7475192538862203634">Ha gyakran látja ezt, próbálja ki ezeket a <ph name="BEGIN_LINK" />javaslatokat<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Az SD-kártya nem található. Előfordulhat, hogy egyes fájlok hiányoznak.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB letöltve</translation>
 <translation id="8249310407154411074">Mozgatás az elejére</translation>
 <translation id="8250920743982581267">Dokumentumok</translation>
+<translation id="825412236959742607">Ez az oldal túl sok memóriát használ, ezért a Chrome eltávolított egyes tartalmakat.</translation>
 <translation id="8260126382462817229">Próbáljon meg újra bejelentkezni</translation>
 <translation id="8261506727792406068">Törlés</translation>
 <translation id="8266862848225348053">Letöltés helye</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Hangalapú keresés indítása</translation>
 <translation id="9071742570345586758">A virtuális valósággal kapcsolatos tartalmak megtekintéséhez telepítse a Google VR-szolgáltatásait</translation>
 <translation id="9074336505530349563">A Google által javasolt, személyre szabott tartalmak fogadásához jelentkezzen be, és kapcsolja be a szinkronizálást</translation>
+<translation id="9080642952018487277">Belépés privát módba</translation>
 <translation id="9086455579313502267">Nem sikerült elérni a hálózatot</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB letöltve</translation>
 <translation id="9100505651305367705">A cikkek egyszerűsített nézetben való megjelenítésének felajánlása (ha támogatott a funkció)</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 a79fff3..0b00a21 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_id.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Menambahkan <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">Dari situs</translation>
 <translation id="1049743911850919806">Penyamaran</translation>
+<translation id="1054301162707478098">Anda telah masuk mode rahasia.</translation>
 <translation id="10614374240317010">Jangan pernah disimpan</translation>
 <translation id="1068672505746868501">Jangan pernah menerjemahkan halaman dalam <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Bahasa lainnya</translation>
 <translation id="124678866338384709">Menutup tab aktif</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Halaman yang Anda lihat dalam tab rahasia tidak akan disimpan di histori, penyimpanan cookie, atau histori penelusuran browser setelah semua tab rahasia ditutup. File apa pun yang didownload atau bookmark yang dibuat akan tetap tersimpan.
+
+Namun demikian, bukan berarti Anda sama sekali tidak terlihat. Menggunakan mode rahasia tidak akan menyembunyikan penjelajahan yang Anda lakukan dari atasan di kantor, dari internet service provider, maupun situs yang Anda buka.</translation>
 <translation id="127138278192656016">Gunakan sinkronisasi dan semua layanan</translation>
 <translation id="1272079795634619415">Berhenti</translation>
 <translation id="1283039547216852943">Tap untuk meluaskan</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Kontrol situs layar penuh</translation>
 <translation id="2038563949887743358">Aktifkan Ubah situs desktop</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB aplikasi lain</translation>
+<translation id="2055670718290744343">Akselerator Penelusuran</translation>
 <translation id="2063713494490388661">Ketuk untuk Menelusuri</translation>
 <translation id="2079545284768500474">Urungkan</translation>
 <translation id="2082238445998314030">Hasil <ph name="RESULT_NUMBER" /> dari <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sinkronisasi dan layanan Google</translation>
 <translation id="2259659629660284697">Ekspor sandi…</translation>
 <translation id="2268044343513325586">Saring</translation>
+<translation id="2280910239864711607">Membuka tab baru dalam Mode rahasia</translation>
 <translation id="2286841657746966508">Alamat penagihan</translation>
 <translation id="230115972905494466">Tidak ada perangkat yang kompatibel</translation>
 <translation id="2315043854645842844">Pilihan sertifikat sisi klien tidak didukung oleh sistem operasi.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Izinkan JavaScript untuk situs tertentu.</translation>
 <translation id="2625189173221582860">Sandi disalin</translation>
 <translation id="2631006050119455616">Dihemat</translation>
+<translation id="2633278372998075009">Tab rahasia</translation>
 <translation id="2647434099613338025">Tambah bahasa</translation>
 <translation id="2650751991977523696">Download file lagi?</translation>
 <translation id="2653659639078652383">Kirim</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Jika lupa frasa sandi atau ingin mengubah setelan ini, <ph name="BEGIN_LINK" />setel ulang sinkronisasi<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Aplikasi Web</translation>
+<translation id="3234355010754616171">Tab rahasia yang baru</translation>
 <translation id="3236059992281584593">1 menit lagi</translation>
 <translation id="3244271242291266297">BB</translation>
 <translation id="3254409185687681395">Bookmark halaman ini</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Tutup semua jendela penyamaran</translation>
 <translation id="3365671512111106261">Tidak tersedia jika Penghemat Kuota Internet diaktifkan</translation>
 <translation id="3367813778245106622">Masuk lagi untuk memulai sinkronisasi</translation>
+<translation id="3377025655491224618">Tab Rahasia</translation>
 <translation id="3384347053049321195">Bagikan gambar</translation>
 <translation id="3386292677130313581">Minta izin sebelum memungkinkan situs mengetahui lokasi Anda (disarankan)</translation>
 <translation id="3387650086002190359">Download <ph name="FILE_NAME" /> gagal karena kesalahan sistem file.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Untuk mendapatkan konten hasil personalisasi yang disarankan oleh Google, aktifkan sinkronisasi</translation>
 <translation id="4226663524361240545">Notifikasi dapat membuat perangkat bergetar</translation>
 <translation id="4242533952199664413">Buka setelan</translation>
+<translation id="4243710787042215766">Buka di tab rahasia</translation>
 <translation id="424864128008805179">Keluar dari Chrome?</translation>
 <translation id="4256782883801055595">Lisensi open source</translation>
 <translation id="4259722352634471385">Navigasi diblokir: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Gagal membentuk saluran melalui server proxy</translation>
 <translation id="4881695831933465202">Buka</translation>
 <translation id="488187801263602086">Ganti nama file</translation>
+<translation id="4883379392681899581">Keluar dari mode rahasia</translation>
 <translation id="4885273946141277891">Jumlah kemunculan Chrome tidak didukung.</translation>
 <translation id="4910889077668685004">Aplikasi pembayaran</translation>
 <translation id="4913161338056004800">Setel ulang statistik</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Dengan video</translation>
 <translation id="5233638681132016545">Tab baru</translation>
 <translation id="5240817131241497236">Setelan yang mengontrol sinkronisasi, personalisasi, dan layanan Google lainnya di Chrome telah berubah. Ini dapat memengaruhi setelan saat ini.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Setelan<ph name="END_LINK1" /> dapat disesuaikan kapan saja. Google dapat menggunakan konten di situs yang Anda buka, serta interaksi dan aktivitas browser untuk mempersonalisasi Chrome dan layanan Google lainnya seperti Terjemahan, Penelusuran, dan iklan.</translation>
 <translation id="5271967389191913893">Perangkat tidak dapat membuka konten untuk didownload.</translation>
 <translation id="528192093759286357">Tarik dari atas dan ketuk tombol kembali untuk keluar dari mode layar penuh.</translation>
 <translation id="5284584623296338184">Perubahan pada bookmark, histori, sandi, dan setelan lainnya tidak akan disinkronkan lagi dengan Akun Google Anda. Namun, data yang sudah ada akan tetap disimpan di akun Google Anda.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Tidak dikenal</translation>
 <translation id="5833397272224757657">Menggunakan konten di situs yang Anda buka serta aktivitas browser dan interaksi untuk personalisasi</translation>
 <translation id="5833984609253377421">Bagikan link</translation>
+<translation id="584427517463557805">Memilih Tab Rahasia</translation>
 <translation id="5854790677617711513">Lebih dari 30 hari</translation>
 <translation id="5858741533101922242">Chrome tidak dapat mengaktifkan adaptor Bluetooth</translation>
 <translation id="5860033963881614850">Nonaktif</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Edit halaman beranda</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> jam lagi</translation>
 <translation id="60924377787140961">Artikel lainnya akan segera muncul. Selamat beraktivitas siang!</translation>
+<translation id="6099151465289169210">Beralih ke tab rahasia</translation>
 <translation id="6108923351542677676">Penyiapan sedang berlangsung...</translation>
 <translation id="6111020039983847643">data yang digunakan</translation>
 <translation id="6112702117600201073">Menyegarkan halaman</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Getar</translation>
 <translation id="6324034347079777476">Sinkronisasi sistem Android dinonaktifkan</translation>
 <translation id="6333140779060797560">Bagikan dengan <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Tab rahasia yang baru</translation>
 <translation id="6337234675334993532">Enkripsi</translation>
 <translation id="6341580099087024258">Tanya lokasi menyimpan file</translation>
 <translation id="6343192674172527289">Tidak ada file download</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Situs desktop</translation>
 <translation id="6600954340915313787">Disalin ke Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Tutup tab rahasia</translation>
 <translation id="6612358246767739896">Konten dilindungi</translation>
 <translation id="6627583120233659107">Edit folder</translation>
 <translation id="6643016212128521049">Hapus</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Membuat Anda logout dari sebagian besar situs. Anda tidak akan logout dari Akun Google.</translation>
 <translation id="7454641608352164238">Tidak cukup ruang</translation>
 <translation id="7455923816558154057">Tap untuk melihat</translation>
+<translation id="7465104139234185284">Tutup semua tab rahasia</translation>
 <translation id="7473891865547856676">Lain Kali</translation>
 <translation id="7475192538862203634">Jika masalah ini sering terjadi, coba <ph name="BEGIN_LINK" />saran<ph name="END_LINK" /> berikut.</translation>
 <translation id="7475688122056506577">Kartu SD tidak ditemukan. Beberapa file Anda mungkin tidak tersimpan.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB didownload</translation>
 <translation id="8249310407154411074">Pindahkan ke atas</translation>
 <translation id="8250920743982581267">Dokumen</translation>
+<translation id="825412236959742607">Halaman ini menggunakan terlalu banyak memori, sehingga Chrome menghapus sebagian konten.</translation>
 <translation id="8260126382462817229">Coba masuk lagi</translation>
 <translation id="8261506727792406068">Hapus</translation>
 <translation id="8266862848225348053">Lokasi download</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Mulai penelusuran suara</translation>
 <translation id="9071742570345586758">Untuk melihat konten realitas maya, instal Layanan Google VR</translation>
 <translation id="9074336505530349563">Untuk mendapatkan konten hasil personalisasi yang disarankan oleh Google, login dan aktifkan sinkronisasi</translation>
+<translation id="9080642952018487277">Masuk mode rahasia</translation>
 <translation id="9086455579313502267">Tidak dapat mengakses jaringan</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB didownload</translation>
 <translation id="9100505651305367705">Tawarkan untuk menampilkan artikel dalam tampilan sederhana, jika didukung</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 04e41c9..35b995b 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_it.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Aggiunta di <ph name="WEBAPK_NAME" /> in corso…</translation>
 <translation id="1041308826830691739">Da siti web</translation>
 <translation id="1049743911850919806">In incognito</translation>
+<translation id="1054301162707478098">Sei passato alla navigazione privata.</translation>
 <translation id="10614374240317010">Mai salvate</translation>
 <translation id="1068672505746868501">Non tradurre mai le pagine in <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Altre lingue</translation>
 <translation id="124678866338384709">Chiudi scheda corrente</translation>
 <translation id="1258753120186372309">Doodle di Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Le pagine visualizzate nelle schede di navigazione privata non vengono memorizzate nella cronologia del browser, nell'archivio di cookie o nella cronologia delle ricerche dopo aver chiuso tutte le schede. I file da te scaricati o i Preferiti da te creati vengono mantenuti.
+
+Tuttavia, le tue attività non sono invisibili. L'attivazione della modalità di navigazione privata non consente di nascondere la navigazione al datore di lavoro, al provider di servizi Internet o ai siti web da te visitati.</translation>
 <translation id="127138278192656016">Usa la sincronizzazione e tutti i servizi</translation>
 <translation id="1272079795634619415">Interrompi</translation>
 <translation id="1283039547216852943">Tocca per espandere</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Controlli sito a schermo intero</translation>
 <translation id="2038563949887743358">Attiva Richiedi sito desktop</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB per altre app</translation>
+<translation id="2055670718290744343">Search Accelerator</translation>
 <translation id="2063713494490388661">Tocca per cercare</translation>
 <translation id="2079545284768500474">Annulla</translation>
 <translation id="2082238445998314030">Risultato <ph name="RESULT_NUMBER" /> di <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sincronizzazione e servizi Google</translation>
 <translation id="2259659629660284697">Esporta password…</translation>
 <translation id="2268044343513325586">Perfeziona</translation>
+<translation id="2280910239864711607">Apri nuova scheda in modalità privata</translation>
 <translation id="2286841657746966508">Indirizzo di fatturazione</translation>
 <translation id="230115972905494466">Nessun dispositivo compatibile trovato</translation>
 <translation id="2315043854645842844">La selezione del certificato lato client non è supportata dal sistema operativo.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Consenti JavaScript per un sito specifico.</translation>
 <translation id="2625189173221582860">Password copiata</translation>
 <translation id="2631006050119455616">Risparmiati</translation>
+<translation id="2633278372998075009">Schede private</translation>
 <translation id="2647434099613338025">Aggiungi lingua</translation>
 <translation id="2650751991977523696">Scaricare nuovamente il file?</translation>
 <translation id="2653659639078652383">Invia</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Se non ricordi la passphrase o vuoi modificare questa impostazione, <ph name="BEGIN_LINK" />reimposta la sincronizzazione<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Microfono</translation>
 <translation id="3232754137068452469">App web</translation>
+<translation id="3234355010754616171">Nuova scheda privata</translation>
 <translation id="3236059992281584593">1 min rimanente</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Aggiungi ai Preferiti</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Chiudi tutte le schede di navigazione in incognito</translation>
 <translation id="3365671512111106261">Non disponibile quando è attiva la funzione Risparmio dati</translation>
 <translation id="3367813778245106622">Accedi nuovamente per avviare la sincronizzazione</translation>
+<translation id="3377025655491224618">Scheda privata</translation>
 <translation id="3384347053049321195">Condividi immagine</translation>
 <translation id="3386292677130313581">Chiedi conferma prima di consentire ai siti di conoscere la tua posizione (opzione consigliata)</translation>
 <translation id="3387650086002190359">Download di <ph name="FILE_NAME" /> non riuscito a causa di errori del file system.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Per ricevere contenuti suggeriti appositamente per te da Google, attiva la sincronizzazione</translation>
 <translation id="4226663524361240545">Le notifiche possono far vibrare il dispositivo</translation>
 <translation id="4242533952199664413">Apri le impostazioni</translation>
+<translation id="4243710787042215766">Apri in una scheda privata</translation>
 <translation id="424864128008805179">Uscire da Chrome?</translation>
 <translation id="4256782883801055595">Licenze open source</translation>
 <translation id="4259722352634471385">Navigazione bloccata: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Creazione di un tunnel tramite server proxy non riuscita</translation>
 <translation id="4881695831933465202">Apri</translation>
 <translation id="488187801263602086">Rinomina file</translation>
+<translation id="4883379392681899581">Esci dalla modalità privata</translation>
 <translation id="4885273946141277891">Numero di istanze di Chrome non supportato.</translation>
 <translation id="4910889077668685004">App di pagamento</translation>
 <translation id="4913161338056004800">Reimposta statistiche</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Con video</translation>
 <translation id="5233638681132016545">Nuova scheda</translation>
 <translation id="5240817131241497236">Le impostazioni che controllano sincronizzazione, personalizzazione e altri servizi Google in Chrome sono cambiate. Questo cambiamento potrebbe incidere sulle impostazioni attuali.</translation>
+<translation id="5264003212305142034">Le <ph name="BEGIN_LINK1" />impostazioni<ph name="END_LINK1" /> possono essere personalizzate in qualsiasi momento. Google potrebbe usare i contenuti dei siti che visiti, oltre alle attività e alle interazioni con il browser,per personalizzare Chrome e altri servizi Google come Traduttore, Ricerca e gli annunci.</translation>
 <translation id="5271967389191913893">Non è possibile aprire i contenuti da scaricare sul dispositivo.</translation>
 <translation id="528192093759286357">Trascina dall'alto e tocca il pulsante Indietro per uscire dalla modalità a schermo intero.</translation>
 <translation id="5284584623296338184">Le modifiche ai preferiti, alla cronologia, alle password e ad altre impostazioni non verranno più sincronizzate con il tuo account Google. Tuttavia, i dati esistenti rimarranno memorizzati.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Sconosciuto</translation>
 <translation id="5833397272224757657">Utilizza i contenuti dei siti visitati oltre ad attività e interazioni relative al browser per la personalizzazione</translation>
 <translation id="5833984609253377421">Condividi link</translation>
+<translation id="584427517463557805">Scheda privata selezionata</translation>
 <translation id="5854790677617711513">Oltre 30 giorni fa</translation>
 <translation id="5858741533101922242">Chrome non riesce ad attivare l'adattatore Bluetooth</translation>
 <translation id="5860033963881614850">Off</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Modifica Home page</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> ore rimanenti</translation>
 <translation id="60924377787140961">A breve verranno visualizzati altri articoli. Buon pomeriggio.</translation>
+<translation id="6099151465289169210">Schede private attivate</translation>
 <translation id="6108923351542677676">Configurazione in corso…</translation>
 <translation id="6111020039983847643">Dati utilizzati</translation>
 <translation id="6112702117600201073">Aggiornamento della pagina in corso</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrazione</translation>
 <translation id="6324034347079777476">Sincronizzazione del sistema Android non attiva</translation>
 <translation id="6333140779060797560">Condividi tramite <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nuova scheda privata</translation>
 <translation id="6337234675334993532">Crittografia</translation>
 <translation id="6341580099087024258">Chiedi dove salvare i file</translation>
 <translation id="6343192674172527289">Nessun download trovato</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Sito desktop</translation>
 <translation id="6600954340915313787">Copiata in Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Chiudi schede private</translation>
 <translation id="6612358246767739896">Contenuti protetti</translation>
 <translation id="6627583120233659107">Modifica cartella</translation>
 <translation id="6643016212128521049">Cancella</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Verrai scollegato dalla maggior parte dei siti, ma non dal tuo account Google.</translation>
 <translation id="7454641608352164238">Spazio insufficiente</translation>
 <translation id="7455923816558154057">Tocca per visualizzare</translation>
+<translation id="7465104139234185284">Chiudi tutte le schede private</translation>
 <translation id="7473891865547856676">No grazie</translation>
 <translation id="7475192538862203634">Se il problema si verifica di frequente, prova questi <ph name="BEGIN_LINK" />suggerimenti<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Scheda SD non trovata. Potrebbero mancare alcuni dei tuoi file.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB per i download</translation>
 <translation id="8249310407154411074">Sposta in alto</translation>
 <translation id="8250920743982581267">Documenti</translation>
+<translation id="825412236959742607">Questa pagina utilizza troppa memoria, pertanto Chrome ha rimosso alcuni contenuti.</translation>
 <translation id="8260126382462817229">Prova ad accedere nuovamente</translation>
 <translation id="8261506727792406068">Elimina</translation>
 <translation id="8266862848225348053">Percorso di download</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Avvia la ricerca vocale</translation>
 <translation id="9071742570345586758">Per vedere contenuti di realtà virtuale, installa Servizi Google VR</translation>
 <translation id="9074336505530349563">Per ricevere contenuti suggeriti appositamente per te da Google, accedi e attiva la sincronizzazione</translation>
+<translation id="9080642952018487277">Accedi alla modalità privata</translation>
 <translation id="9086455579313502267">Impossibile accedere alla rete</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB per i download</translation>
 <translation id="9100505651305367705">Chiedi di mostrare gli articoli in visualizzazione semplificata, se supportata</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 1b454bb..3cb3c1d 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_iw.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">מוסיף את <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">מאתרים</translation>
 <translation id="1049743911850919806">גלישה פרטית</translation>
+<translation id="1054301162707478098">עברת למצב פרטיות.</translation>
 <translation id="10614374240317010">פריטים שאף פעם לא נשמרו</translation>
 <translation id="1068672505746868501">אף פעם אל תתרגם דפים ב<ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">שפות נוספות</translation>
 <translation id="124678866338384709">סגור את הכרטיסייה הנוכחית</translation>
 <translation id="1258753120186372309">‏דודל של Google‏: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">‏דפים שמציגים בכרטיסיות פרטיות לא נשמרים בהיסטוריית הדפדפן, במאגר קובצי ה-Cookie או בהיסטוריית החיפושים אחרי שסוגרים את כל כרטיסיות הפרטיות. המערכת שומרת את הקבצים שמורידים ואת הסימניות שיוצרים.
+
+עם זאת, גורמים מסוימים יכולים לראות את הפעילות שלך. מעבר למצב פרטיות אינו מסתיר את פעילות הגלישה מהמעסיק, מספק האינטרנט או מהאתרים שמבקרים בהם.</translation>
 <translation id="127138278192656016">שימוש בסינכרון ובכל השירותים</translation>
 <translation id="1272079795634619415">הפסק</translation>
 <translation id="1283039547216852943">הקש כדי להרחיב</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">פקדי אתר במסך מלא</translation>
 <translation id="2038563949887743358">הפעל את 'בקש אתר עבור מחשב שולחני'</translation>
 <translation id="2045104531052923016">‏‎<ph name="GIGABYTES" /> GB ליישומים אחרים</translation>
+<translation id="2055670718290744343">האצת החיפוש</translation>
 <translation id="2063713494490388661">הקש כדי לחפש</translation>
 <translation id="2079545284768500474">בטל פעולה</translation>
 <translation id="2082238445998314030">תוצאה <ph name="RESULT_NUMBER" /> מתוך <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">‏סנכרון ושירותי Google</translation>
 <translation id="2259659629660284697">ייצוא סיסמאות…</translation>
 <translation id="2268044343513325586">צמצם</translation>
+<translation id="2280910239864711607">פתיחת כרטיסייה חדשה במצב פרטיות</translation>
 <translation id="2286841657746966508">כתובת לחיוב</translation>
 <translation id="230115972905494466">לא נמצאו מכשירים תואמים</translation>
 <translation id="2315043854645842844">מערכת ההפעלה אינה תומכת בבחירת אישור בצד הלקוח.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">‏אפשר JavaScript לאתר ספציפי.</translation>
 <translation id="2625189173221582860">הסיסמה הועתקה</translation>
 <translation id="2631006050119455616">חסכת</translation>
+<translation id="2633278372998075009">כרטיסיות פרטיות</translation>
 <translation id="2647434099613338025">הוסף שפה</translation>
 <translation id="2650751991977523696">האם להוריד את הקובץ שוב?</translation>
 <translation id="2653659639078652383">שלח</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">אם שכחת את ביטוי הסיסמה או אם ברצונך לשנות את ההגדרה הזו, <ph name="BEGIN_LINK" />אפס את הסינכרון<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">מיקרופון</translation>
 <translation id="3232754137068452469">אפליקציית אינטרנט</translation>
+<translation id="3234355010754616171">כרטיסיית פרטיות חדשה</translation>
 <translation id="3236059992281584593">נותרה דקה אחת</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">הוסף את הדף לסימניות</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">סגור את כל כרטיסיות הגלישה בסתר</translation>
 <translation id="3365671512111106261">‏לא זמין כאשר חוסך הנתונים (Data Saver) פועל</translation>
 <translation id="3367813778245106622">היכנס שוב כדי להתחיל בסנכרון</translation>
+<translation id="3377025655491224618">כרטיסיית פרטיות</translation>
 <translation id="3384347053049321195">שתף תמונה</translation>
 <translation id="3386292677130313581">שאל לפני שתאפשר לאתרים לדעת מה המיקום שלך (מומלץ)</translation>
 <translation id="3387650086002190359">הורדת <ph name="FILE_NAME" /> נכשלה עקב שגיאות במערכת הקבצים.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">‏כדי לקבל מ-Google הצעות לתוכן מותאם אישית, יש להפעיל את הסנכרון</translation>
 <translation id="4226663524361240545">רטט של המכשיר אפשרי כשמתקבלת הודעה</translation>
 <translation id="4242533952199664413">פתח את 'הגדרות'</translation>
+<translation id="4243710787042215766">פתיחה בכרטיסיית פרטיות</translation>
 <translation id="424864128008805179">‏האם לצאת מ-Chrome?</translation>
 <translation id="4256782883801055595">רישיונות קוד פתוח</translation>
 <translation id="4259722352634471385">הניווט חסום: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">‏יצירת מנהרה בעזרת שרת proxy נכשלה</translation>
 <translation id="4881695831933465202">פתח</translation>
 <translation id="488187801263602086">שינוי שם של קובץ</translation>
+<translation id="4883379392681899581">יציאה ממצב פרטיות</translation>
 <translation id="4885273946141277891">‏מספר בלתי נתמך של מופעי Chrome.</translation>
 <translation id="4910889077668685004">אפליקציות תשלום</translation>
 <translation id="4913161338056004800">איפוס הנתונים הסטטיסטיים</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">כולל סרטון</translation>
 <translation id="5233638681132016545">כרטיסייה חדשה</translation>
 <translation id="5240817131241497236">‏ההגדרות ששולטות בסינכרון, בהתאמה אישית ובשירותים אחרים של Google ב-Chrome השתנו. השינוי עשוי להשפיע על ההגדרות הנוכחיות שלך.</translation>
+<translation id="5264003212305142034">‏בכל שלב ניתן להתאים אישית את <ph name="BEGIN_LINK1" />ההגדרות<ph name="END_LINK1" />. Google עשויה להשתמש בתוכן באתרים שביקרת בהם, וגם בפעילות בדפדפן ובאינטראקציות, כדי להתאים אישית את Chrome ושירותי Google אחרים כמו Translate, חיפוש ומודעות.</translation>
 <translation id="5271967389191913893">המכשיר לא מצליח לפתוח את התוכן להורדה.</translation>
 <translation id="528192093759286357">כדי לצאת ממסך מלא, גרור מלמעלה וגע בלחצן 'הקודם'.</translation>
 <translation id="5284584623296338184">‏שינויים בסימניות, בהיסטוריה, בסיסמאות ובהגדרות נוספות לא יסונכרנו עוד עם חשבון Google. עם זאת, הנתונים הקיימים עדיין יאוחסנו בחשבון Google שלך.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">לא ידוע</translation>
 <translation id="5833397272224757657">התוכן מאתרים שנכנסת אליהם, פעילות הדפדפן והאינטראקציות שלך ישמשו לצורך התאמה אישית</translation>
 <translation id="5833984609253377421">שתף קישור</translation>
+<translation id="584427517463557805">כרטיסיית הפרטיות שנבחרה</translation>
 <translation id="5854790677617711513">לפני יותר מ-30 ימים</translation>
 <translation id="5858741533101922242">‏לא ניתן להפעיל ב-Chrome את מתאם Bluetooth</translation>
 <translation id="5860033963881614850">כבוי</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">עריכת דף הבית</translation>
 <translation id="60923314841986378">נותרו <ph name="HOURS" /> שעות</translation>
 <translation id="60924377787140961">בקרוב יופיעו מאמרים נוספים. שיהיה לך המשך יום נפלא!</translation>
+<translation id="6099151465289169210">עברת לכרטיסיות פרטיות</translation>
 <translation id="6108923351542677676">ההגדרה מתבצעת…</translation>
 <translation id="6111020039983847643">נתונים שנצרכו</translation>
 <translation id="6112702117600201073">מרענן את הדף</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">רטט</translation>
 <translation id="6324034347079777476">‏סנכרון מערכת Android מושבת</translation>
 <translation id="6333140779060797560">שתף באמצעות <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">כרטיסיית פרטיות חדשה</translation>
 <translation id="6337234675334993532">הצפנה</translation>
 <translation id="6341580099087024258">לשאול איפה לשמור קבצים</translation>
 <translation id="6343192674172527289">לא נמצאו הורדות</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">אתר למחשבים</translation>
 <translation id="6600954340915313787">‏הועתק אל Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">סגירת כרטיסיות הפרטיות</translation>
 <translation id="6612358246767739896">תוכן מוגן</translation>
 <translation id="6627583120233659107">ערוך תיקיה</translation>
 <translation id="6643016212128521049">נקה</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">‏תבוצע יציאה שלך מרוב האתרים. לא תבוצע יציאה מחשבון Google שלך.</translation>
 <translation id="7454641608352164238">אין מספיק מקום</translation>
 <translation id="7455923816558154057">הקש כדי להציג</translation>
+<translation id="7465104139234185284">סגירה של כל כרטיסיות הפרטיות</translation>
 <translation id="7473891865547856676">לא, תודה</translation>
 <translation id="7475192538862203634">אם אתה רואה זאת לעתים קרובות, נסה את <ph name="BEGIN_LINK" />ההצעות<ph name="END_LINK" /> האלה.</translation>
 <translation id="7475688122056506577">‏לא נמצא כרטיס SD. ייתכן שחלק מהקבצים שלך חסרים.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">‏‎<ph name="GIGABYTES" /> GB להורדות</translation>
 <translation id="8249310407154411074">העברה לראש הרשימה</translation>
 <translation id="8250920743982581267">מסמכים</translation>
+<translation id="825412236959742607">‏הדף הזה משתמש בנפח זיכרון גדול מידי, לכן מערכת Chrome הסירה חלק מהתוכן.</translation>
 <translation id="8260126382462817229">נסה להיכנס שוב</translation>
 <translation id="8261506727792406068">מחיקה</translation>
 <translation id="8266862848225348053">מיקום ההורדה</translation>
@@ -977,6 +995,7 @@
 <translation id="9070377983101773829">התחל חיפוש קולי</translation>
 <translation id="9071742570345586758">‏עליך להתקין את Google VR Services כדי שתוכל להציג תוכן של מציאות מדומה</translation>
 <translation id="9074336505530349563">‏כדי לקבל מ-Google הצעות לתוכן מותאם אישית, יש להיכנס ולהפעיל את הסנכרון</translation>
+<translation id="9080642952018487277">כניסה למצב פרטיות</translation>
 <translation id="9086455579313502267">אין אפשרות לגשת לרשת</translation>
 <translation id="9099018167121903954">‏‎<ph name="KILOBYTES" /> KB להורדות</translation>
 <translation id="9100505651305367705">יש להציע הצגת מאמרים בתצוגה פשוטה, כשהאפשרות נתמכת</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 48b130e4..359b809 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ja.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> を追加しています...</translation>
 <translation id="1041308826830691739">ウェブサイトから</translation>
 <translation id="1049743911850919806">シークレット モード</translation>
+<translation id="1054301162707478098">プライベート モードです。</translation>
 <translation id="10614374240317010">常に保存しない</translation>
 <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" />のページを翻訳しない</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">その他の言語</translation>
 <translation id="124678866338384709">現在のタブを閉じる</translation>
 <translation id="1258753120186372309">Google Doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">プライベート タブで表示したページの記録は、プライベート タブをすべて閉じた後、ブラウザの履歴、Cookieの保存場所、検索履歴から消去されます。ただし、ダウンロードしたファイルや作成したブックマークは保存されます。
+
+あらゆる場所に記録が一切残らないわけではありません。プライベート モードを使っても、雇用主、インターネット サービス プロバイダ、訪問先のウェブサイトに閲覧内容が知られる可能性はあります。</translation>
 <translation id="127138278192656016">同期とすべてのサービスを使用する</translation>
 <translation id="1272079795634619415">中止</translation>
 <translation id="1283039547216852943">タップして展開</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">全画面表示時のサイトの操作項目</translation>
 <translation id="2038563949887743358">[PC 版サイトを見る] をオンにします</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB を他のアプリで使用中</translation>
+<translation id="2055670718290744343">検索の高速化</translation>
 <translation id="2063713494490388661">タップして検索</translation>
 <translation id="2079545284768500474">元に戻す</translation>
 <translation id="2082238445998314030">結果 <ph name="TOTAL_RESULTS" /> 件中 <ph name="RESULT_NUMBER" /> 件目</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">同期と Google サービス</translation>
 <translation id="2259659629660284697">パスワードをエクスポート…</translation>
 <translation id="2268044343513325586">絞り込み</translation>
+<translation id="2280910239864711607">新しいタブをプライベート モードで開く</translation>
 <translation id="2286841657746966508">請求先住所</translation>
 <translation id="230115972905494466">対応デバイスが見つかりませんでした</translation>
 <translation id="2315043854645842844">オペレーティング システムでサポートされていないため、クライアント側で証明書を選択することはできません。</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">特定のサイトに対して JavaScript を許可します。</translation>
 <translation id="2625189173221582860">パスワードがコピーされました</translation>
 <translation id="2631006050119455616">削減量</translation>
+<translation id="2633278372998075009">プライベート タブ</translation>
 <translation id="2647434099613338025">言語の追加</translation>
 <translation id="2650751991977523696">ファイルをもう一度ダウンロードしますか?</translation>
 <translation id="2653659639078652383">送信</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">パスフレーズを忘れた場合や、この設定を変更する場合は、<ph name="BEGIN_LINK" />同期をリセット<ph name="END_LINK" />します</translation>
 <translation id="3227137524299004712">マイク</translation>
 <translation id="3232754137068452469">ウェブアプリ</translation>
+<translation id="3234355010754616171">新しいプライベート タブ</translation>
 <translation id="3236059992281584593">残り 1 分</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">このページをブックマークに追加します</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">すべてのシークレット タブを閉じます</translation>
 <translation id="3365671512111106261">データセーバーが有効になっている場合は使用できません</translation>
 <translation id="3367813778245106622">同期を開始するにはもう一度ログインします</translation>
+<translation id="3377025655491224618">プライベート タブ</translation>
 <translation id="3384347053049321195">画像を共有</translation>
 <translation id="3386292677130313581">サイトに現在地の認識を許可する前に確認する(推奨)</translation>
 <translation id="3387650086002190359">ファイル システムでエラーが発生したため、<ph name="FILE_NAME" /> をダウンロードできませんでした。</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">ユーザーに合わせた Google からのおすすめコンテンツを表示するには、同期を有効にします</translation>
 <translation id="4226663524361240545">通知を受け取ると端末が振動します</translation>
 <translation id="4242533952199664413">設定を開く</translation>
+<translation id="4243710787042215766">プライベート タブで開く</translation>
 <translation id="424864128008805179">Chrome からログアウトしますか?</translation>
 <translation id="4256782883801055595">オープンソース ライセンス</translation>
 <translation id="4259722352634471385"><ph name="URL" /> へのアクセスがブロックされました</translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">プロキシ サーバー経由のトンネルを確立できませんでした</translation>
 <translation id="4881695831933465202">開く</translation>
 <translation id="488187801263602086">ファイル名を変更してください</translation>
+<translation id="4883379392681899581">プライベート モードを終了</translation>
 <translation id="4885273946141277891">Chrome のインスタンス数の上限を超えています。</translation>
 <translation id="4910889077668685004">お支払いアプリ</translation>
 <translation id="4913161338056004800">統計情報をリセット</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">動画あり</translation>
 <translation id="5233638681132016545">新しいタブ</translation>
 <translation id="5240817131241497236">Chrome で同期、カスタマイズ、その他の Google サービスを管理する設定を変更しました。これにより、現在の設定に影響が生じる可能性があります。</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />はいつでも変更できます。Google は、Chrome やその他の Google サービス(翻訳、検索、広告など)をカスタマイズする目的で、ユーザーがアクセスしたサイトのコンテンツ、ユーザーの閲覧行動や操作を使用することがあります。</translation>
 <translation id="5271967389191913893">デバイスでダウンロード コンテンツを開くことができません。</translation>
 <translation id="528192093759286357">全画面表示を終了するには、上からドラッグして、戻るボタンをタップします。</translation>
 <translation id="5284584623296338184">今後、ブックマーク、履歴、パスワードなどの設定への変更は Google アカウントに同期されません。ただし、既存のデータは Google アカウントに保存されたままとなります。</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">不明</translation>
 <translation id="5833397272224757657">ユーザーがアクセスしたサイトのコンテンツと、ブラウザのアクティビティおよび操作をカスタマイズに使用します</translation>
 <translation id="5833984609253377421">リンクを共有</translation>
+<translation id="584427517463557805">選択したプライベート タブ</translation>
 <translation id="5854790677617711513">30 日以上経過</translation>
 <translation id="5858741533101922242">Chrome から Bluetooth アダプタをオンにできません</translation>
 <translation id="5860033963881614850">オフ</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">ホームページの編集</translation>
 <translation id="60923314841986378">残り <ph name="HOURS" /> 時間</translation>
 <translation id="60924377787140961">記事は随時更新されます。また後でご覧ください。</translation>
+<translation id="6099151465289169210">プライベート タブに切り替えました</translation>
 <translation id="6108923351542677676">設定しています...</translation>
 <translation id="6111020039983847643">データ使用量</translation>
 <translation id="6112702117600201073">ページを更新しています</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">バイブレーション</translation>
 <translation id="6324034347079777476">Android システムの同期が無効です</translation>
 <translation id="6333140779060797560"><ph name="APPLICATION" /> で共有します</translation>
+<translation id="6336451774241870485">新しいプライベート タブ</translation>
 <translation id="6337234675334993532">暗号化</translation>
 <translation id="6341580099087024258">ファイルの保存場所を確認する</translation>
 <translation id="6343192674172527289">ダウンロードしたアイテムは見つかりませんでした</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">PC 版サイト</translation>
 <translation id="6600954340915313787">Chrome にコピー済み</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">プライベート タブを閉じる</translation>
 <translation id="6612358246767739896">保護されたコンテンツ</translation>
 <translation id="6627583120233659107">フォルダを編集</translation>
 <translation id="6643016212128521049">クリア</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">ほとんどのサイトからログアウトします。Google アカウントへのログイン状態は維持されます。</translation>
 <translation id="7454641608352164238">空き容量が不足しています</translation>
 <translation id="7455923816558154057">タップして表示</translation>
+<translation id="7465104139234185284">すべてのプライベート タブを閉じます</translation>
 <translation id="7473891865547856676">スキップ</translation>
 <translation id="7475192538862203634">このメッセージが繰り返し表示される場合は、こちらの<ph name="BEGIN_LINK" />ヒント<ph name="END_LINK" />をお試しください。</translation>
 <translation id="7475688122056506577">SD カードが見つかりません。一部のファイルが欠落している可能性があります。</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB をダウンロードで使用中</translation>
 <translation id="8249310407154411074">一番上に移動</translation>
 <translation id="8250920743982581267">ドキュメント</translation>
+<translation id="825412236959742607">このページは大量のメモリを使用しているため、Chrome により一部のコンテンツが削除されました。</translation>
 <translation id="8260126382462817229">もう一度ログインしてみてください</translation>
 <translation id="8261506727792406068">削除</translation>
 <translation id="8266862848225348053">ダウンロード場所</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">音声検索を開始</translation>
 <translation id="9071742570345586758">バーチャル リアリティ コンテンツを表示するには、Google VR サービスをインストールしてください</translation>
 <translation id="9074336505530349563">ユーザーに合わせた Google からのおすすめコンテンツを表示するには、ログインして同期を有効にします</translation>
+<translation id="9080642952018487277">プライベート モードを開始</translation>
 <translation id="9086455579313502267">ネットワークにアクセスできません</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB をダウンロードで使用中</translation>
 <translation id="9100505651305367705">記事の簡易表示がサポートされている場合、簡易表示を提案する</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 689a58b..0292e7ef 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ko.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> 추가 중...</translation>
 <translation id="1041308826830691739">웹사이트 알림</translation>
 <translation id="1049743911850919806">시크릿</translation>
+<translation id="1054301162707478098">비공개 모드로 전환되었습니다.</translation>
 <translation id="10614374240317010">저장되지 않음</translation>
 <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" />로 된 페이지는 번역하지 않음</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">다른 언어</translation>
 <translation id="124678866338384709">현재 탭 닫기</translation>
 <translation id="1258753120186372309">Google 기념일 로고: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">비공개 탭을 모두 닫으면 비공개 탭에서 본 페이지는 브라우저 방문 기록, 쿠키 저장소 또는 방문 기록 어디에도 흔적이 남지 않습니다. 단, 다운로드한 파일이나 생성한 북마크는 유지됩니다.
+
+하지만 완전한 비밀이 보장되는 것은 아닙니다. 비공개 모드로 탐색해도 회사, 인터넷 서비스 제공업체(ISP), 방문한 웹사이트에 저장된 흔적까지 없앨 수는 없습니다.</translation>
 <translation id="127138278192656016">동기화 및 모든 서비스 사용</translation>
 <translation id="1272079795634619415">중지</translation>
 <translation id="1283039547216852943">탭하여 펼치기</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">전체화면 사이트 컨트롤</translation>
 <translation id="2038563949887743358">데스크톱 버전으로 보기 사용 설정</translation>
 <translation id="2045104531052923016">기타 앱 <ph name="GIGABYTES" />GB</translation>
+<translation id="2055670718290744343">검색 가속기</translation>
 <translation id="2063713494490388661">탭하여 검색</translation>
 <translation id="2079545284768500474">실행취소</translation>
 <translation id="2082238445998314030">전체 결과 <ph name="TOTAL_RESULTS" />개 중 <ph name="RESULT_NUMBER" />개</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">동기화 및 Google 서비스</translation>
 <translation id="2259659629660284697">비밀번호 내보내기...</translation>
 <translation id="2268044343513325586">상세검색</translation>
+<translation id="2280910239864711607">비공개 모드로 새 탭 열기</translation>
 <translation id="2286841657746966508">결제주소</translation>
 <translation id="230115972905494466">호환되는 기기 없음</translation>
 <translation id="2315043854645842844">클라이언트측 인증서 선택이 운영체제에서 지원되지 않습니다.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">특정 사이트에서 자바스크립트를 허용합니다.</translation>
 <translation id="2625189173221582860">비밀번호 복사됨</translation>
 <translation id="2631006050119455616">절약</translation>
+<translation id="2633278372998075009">비공개 탭</translation>
 <translation id="2647434099613338025">언어 추가</translation>
 <translation id="2650751991977523696">파일을 다시 다운로드하시겠습니까?</translation>
 <translation id="2653659639078652383">제출</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">암호를 잊어버렸거나 이 설정을 변경하려면 <ph name="BEGIN_LINK" />동기화를 재설정<ph name="END_LINK" />합니다.</translation>
 <translation id="3227137524299004712">마이크</translation>
 <translation id="3232754137068452469">웹 앱</translation>
+<translation id="3234355010754616171">새 비공개 탭</translation>
 <translation id="3236059992281584593">1분 남음</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">현재 페이지를 북마크에 추가</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">모든 시크릿 탭 닫기</translation>
 <translation id="3365671512111106261">데이터 절약 모드가 켜져 있으면 사용할 수 없습니다.</translation>
 <translation id="3367813778245106622">다시 로그인하여 동기화 시작</translation>
+<translation id="3377025655491224618">비공개 탭</translation>
 <translation id="3384347053049321195">이미지 공유</translation>
 <translation id="3386292677130313581">사이트에서 내 위치를 파악하도록 허용하기 전에 확인(권장)</translation>
 <translation id="3387650086002190359">파일 시스템에 오류가 발생하여 <ph name="FILE_NAME" />을(를) 다운로드할 수 없습니다.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Google에서 추천하는 맞춤 콘텐츠를 보려면 동기화를 사용 설정하세요.</translation>
 <translation id="4226663524361240545">알림이 있으면 진동이 울릴 수도 있습니다.</translation>
 <translation id="4242533952199664413">설정 열기</translation>
+<translation id="4243710787042215766">비공개 탭으로 열기</translation>
 <translation id="424864128008805179">Chrome에서 로그아웃하시겠습니까?</translation>
 <translation id="4256782883801055595">오픈소스 라이선스</translation>
 <translation id="4259722352634471385">탐색이 차단됨: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">프록시 서버를 통한 터널 설정에 실패했습니다</translation>
 <translation id="4881695831933465202">열기</translation>
 <translation id="488187801263602086">파일 이름 변경</translation>
+<translation id="4883379392681899581">비공개 모드에서 나가기</translation>
 <translation id="4885273946141277891">지원되지 않는 Chrome 인스턴스 수입니다.</translation>
 <translation id="4910889077668685004">결제 앱</translation>
 <translation id="4913161338056004800">통계 재설정</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">동영상 포함</translation>
 <translation id="5233638681132016545">새 탭</translation>
 <translation id="5240817131241497236">Chrome에서 동기화, 맞춤설정 및 기타 Google 서비스를 관리하는 설정이 변경되었습니다. 이로 인해 현재 설정이 영향을 받을 수 있습니다.</translation>
+<translation id="5264003212305142034">언제든지 <ph name="BEGIN_LINK1" />설정<ph name="END_LINK1" />을 변경할 수 있습니다. Google에서 Chrome 및 번역, 검색과 같은 기타 Google 서비스, 광고를 맞춤설정하기 위해 사용자가 방문한 사이트의 콘텐츠, 탐색 활동, 상호작용 기록을 사용할 수 있습니다.</translation>
 <translation id="5271967389191913893">기기에서 다운로드하려는 콘텐츠를 열 수 없습니다.</translation>
 <translation id="528192093759286357">전체화면을 종료하려면 상단에서 드래그하여 뒤로 버튼을 터치하세요.</translation>
 <translation id="5284584623296338184">북마크, 방문 기록, 비밀번호, 기타 설정이 더 이상 Google 계정에 동기화되지 않습니다. 하지만 기존 데이터는 Google 계정에 계속 저장됩니다.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">알 수 없음</translation>
 <translation id="5833397272224757657">방문한 사이트의 콘텐츠와 브라우저 활동 및 상호작용이 맞춤설정에 사용됩니다.</translation>
 <translation id="5833984609253377421">링크 공유</translation>
+<translation id="584427517463557805">선택된 비공개 탭</translation>
 <translation id="5854790677617711513">30일 이상 전</translation>
 <translation id="5858741533101922242">Chrome에서 블루투스 어댑터를 사용 설정할 수 없습니다.</translation>
 <translation id="5860033963881614850">사용 안함</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">홈 페이지 수정</translation>
 <translation id="60923314841986378"><ph name="HOURS" />시간 남음</translation>
 <translation id="60924377787140961">더 많은 콘텐츠가 표시될 예정이니 기대해주세요. 즐거운 오후 보내세요.</translation>
+<translation id="6099151465289169210">비공개 탭으로 전환됨</translation>
 <translation id="6108923351542677676">설정 진행 중...</translation>
 <translation id="6111020039983847643">사용한 데이터</translation>
 <translation id="6112702117600201073">페이지 새로고침</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">진동</translation>
 <translation id="6324034347079777476">Android 시스템 동기화 사용 안함</translation>
 <translation id="6333140779060797560">공유 방법: <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">새 비공개 탭</translation>
 <translation id="6337234675334993532">암호화</translation>
 <translation id="6341580099087024258">파일 저장 위치 묻기</translation>
 <translation id="6343192674172527289">다운로드 항목을 찾을 수 없음</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">데스크톱 사이트</translation>
 <translation id="6600954340915313787">Chrome에 복사됨</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" />GB</translation>
+<translation id="6610147964972079463">비공개 탭 닫기</translation>
 <translation id="6612358246767739896">보호된 콘텐츠</translation>
 <translation id="6627583120233659107">폴더 수정</translation>
 <translation id="6643016212128521049">삭제</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">대부분의 사이트에서 로그아웃됩니다. Google 계정에서는 로그아웃되지 않습니다.</translation>
 <translation id="7454641608352164238">저장공간 부족</translation>
 <translation id="7455923816558154057">탭하여 보기</translation>
+<translation id="7465104139234185284">모든 비공개 탭 닫기</translation>
 <translation id="7473891865547856676">건너뛰기</translation>
 <translation id="7475192538862203634">이 메시지가 자주 표시된다면 다음 <ph name="BEGIN_LINK" />권장사항<ph name="END_LINK" />을 시도해 보세요.</translation>
 <translation id="7475688122056506577">SD 카드가 없습니다. 일부 파일이 누락되었을 수 있습니다.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" />GB가 다운로드됨</translation>
 <translation id="8249310407154411074">맨 위로 이동</translation>
 <translation id="8250920743982581267">문서</translation>
+<translation id="825412236959742607">페이지에서 너무 많은 메모리를 사용하므로 Chrome에서 일부 콘텐츠를 삭제했습니다.</translation>
 <translation id="8260126382462817229">다시 로그인해 주세요.</translation>
 <translation id="8261506727792406068">삭제</translation>
 <translation id="8266862848225348053">다운로드 위치</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">음성 검색 시작</translation>
 <translation id="9071742570345586758">가상 현실 콘텐츠를 보려면 Google VR 서비스를 설치하세요.</translation>
 <translation id="9074336505530349563">Google에서 추천하는 맞춤 콘텐츠를 보려면 로그인하고 동기화를 사용 설정하세요.</translation>
+<translation id="9080642952018487277">비공개 모드로 들어가기</translation>
 <translation id="9086455579313502267">네트워크에 액세스할 수 없습니다.</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" />KB가 다운로드됨</translation>
 <translation id="9100505651305367705">지원되는 경우 간단히 보기로 기사를 표시하는 기능 제공</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 8511c7b1..46de706 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_lv.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Tiek pievienots <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">No vietnēm</translation>
 <translation id="1049743911850919806">Inkognito</translation>
+<translation id="1054301162707478098">Jūs esat atvēris privāto režīmu.</translation>
 <translation id="10614374240317010">Netiek saglabātas</translation>
 <translation id="1068672505746868501">Nekad netulkot lapas šādā valodā: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> — <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Citas valodas…</translation>
 <translation id="124678866338384709">Aizvērt pašreizējo cilni</translation>
 <translation id="1258753120186372309">Google svētku logotips: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Lapas, ko skatāt privātajās cilnēs, nebūs redzamas pārlūka vēsturē, sīkfailu krātuvē vai meklēšanas vēsturē, kad aizvērsiet visas privātās cilnes. Tomēr visi lejupielādētie faili un izveidotās grāmatzīmes tiks saglabātas.
+
+Ņemiet vērā, ka privātajā režīmā jūs neesat neredzams. Jūsu pārlūkošanas darbības inkognito režīmā netiek slēptas no jūsu darba devēja, interneta pakalpojumu sniedzēja vai apmeklētajām vietnēm.</translation>
 <translation id="127138278192656016">Sinhronizēšanas un visu pakalpojumu izmantošana</translation>
 <translation id="1272079795634619415">Apturēt</translation>
 <translation id="1283039547216852943">Pieskarties, lai izvērstu</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Pilnekrāna vietnes vadīklas</translation>
 <translation id="2038563949887743358">Ieslēgt iestatījumu “Pieprasīt datora vietni”</translation>
 <translation id="2045104531052923016">Citas lietotnes: <ph name="GIGABYTES" /> GB</translation>
+<translation id="2055670718290744343">Meklēšanas paātrinātājs</translation>
 <translation id="2063713494490388661">Pieskarties, lai meklētu</translation>
 <translation id="2079545284768500474">Atsaukt</translation>
 <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultāts no <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sinhronizēšana un Google pakalp.</translation>
 <translation id="2259659629660284697">Paroļu eksportēšana…</translation>
 <translation id="2268044343513325586">Uzlabot</translation>
+<translation id="2280910239864711607">Atvērt jaunu cilni privātajā režīmā</translation>
 <translation id="2286841657746966508">Norēķinu adrese</translation>
 <translation id="230115972905494466">Netika atrastas saderīgas ierīces.</translation>
 <translation id="2315043854645842844">Operētājsistēma neatbalsta klienta puses sertifikāta atlasi.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Atļaut JavaScript konkrētai vietnei</translation>
 <translation id="2625189173221582860">Parole ir nokopēta.</translation>
 <translation id="2631006050119455616">Saglabāts</translation>
+<translation id="2633278372998075009">Privātās cilnes</translation>
 <translation id="2647434099613338025">Pievienot valodu</translation>
 <translation id="2650751991977523696">Vai lejupielādēt failu vēlreiz?</translation>
 <translation id="2653659639078652383">Iesniegt</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Ja esat aizmirsis ieejas frāzi vai vēlaties mainīt šo iestatījumu, <ph name="BEGIN_LINK" />atiestatiet sinhronizāciju<ph name="END_LINK" />.</translation>
 <translation id="3227137524299004712">Mikrofons</translation>
 <translation id="3232754137068452469">Tīmekļa lietotne</translation>
+<translation id="3234355010754616171">Jauna privātā cilne</translation>
 <translation id="3236059992281584593">Atlikusi 1 min</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Grāmatot šo lapu</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Aizvērt visas inkognito režīma cilnes</translation>
 <translation id="3365671512111106261">Nav pieejams, kad ir ieslēgts datu lietojuma samazinātājs</translation>
 <translation id="3367813778245106622">Lai sāktu sinhronizēšanu, pierakstieties vēlreiz</translation>
+<translation id="3377025655491224618">Privātā cilne</translation>
 <translation id="3384347053049321195">Kopīgot attēlu</translation>
 <translation id="3386292677130313581">Jautāt, pirms atļaut vietnēm uzzināt jūsu atrašanās vietu (ieteicams)</translation>
 <translation id="3387650086002190359">Neizdevās lejupielādēt failu <ph name="FILE_NAME" />, jo radās failu sistēmas kļūdas.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Lai saņemtu Google ieteikto personalizēto saturu, ieslēdziet sinhronizāciju.</translation>
 <translation id="4226663524361240545">Saņemot paziņojumu, ierīce var vibrēt.</translation>
 <translation id="4242533952199664413">Atvērt iestatījumus</translation>
+<translation id="4243710787042215766">Atvērt privātajā cilnē</translation>
 <translation id="424864128008805179">Vai izrakstīties no pārlūka Chrome?</translation>
 <translation id="4256782883801055595">Atklātā pirmkoda licences</translation>
 <translation id="4259722352634471385">Navigācija ir bloķēta: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Neizdevās iestatīt porta pārsūtīšanu, izmantojot starpniekserveri.</translation>
 <translation id="4881695831933465202">Atvērt</translation>
 <translation id="488187801263602086">Faila pārdēvēšana</translation>
+<translation id="4883379392681899581">Iziet no privātā režīma</translation>
 <translation id="4885273946141277891">Neatbalstīts Chrome instanču skaits</translation>
 <translation id="4910889077668685004">Maksājumu lietotnes</translation>
 <translation id="4913161338056004800">Atiestatīt statistikas datus</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Ar video</translation>
 <translation id="5233638681132016545">Jauna cilne</translation>
 <translation id="5240817131241497236">Ir mainīti sinhronizācijas, personalizācijas un citu Google pakalpojumu pārvaldības iestatījumi pārlūkā Chrome. Tas var ietekmēt jūsu pašreizējos iestatījumus.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" /> Iestatījumus <ph name="END_LINK1" /> var pielāgot jebkurā laikā. Google var izmantot jūsu apmeklēto vietņu saturu, kā arī pārlūkā veiktās darbības un mijiedarbības, lai personalizētu pārlūku Chrome un citus Google pakalpojumus, piemēram, Tulkotājs, Meklēšana un reklāmas.</translation>
 <translation id="5271967389191913893">Ierīcē nevar atvērt lejupielādējamo saturu.</translation>
 <translation id="528192093759286357">Lai izietu no pilnekrāna režīma, velciet no augšas un pieskarieties pogai Atpakaļ.</translation>
 <translation id="5284584623296338184">Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas ar jūsu Google kontu. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Nezināms</translation>
 <translation id="5833397272224757657">Personalizācijai izmanto jūsu apmeklēto vietņu saturu, kā arī darbības un mijiedarbības pārlūkā.</translation>
 <translation id="5833984609253377421">Kopīgot saiti</translation>
+<translation id="584427517463557805">Atlasītā privātā cilne</translation>
 <translation id="5854790677617711513">Vecāki par 30 dienām</translation>
 <translation id="5858741533101922242">Chrome nevar ieslēgt Bluetooth adapteri.</translation>
 <translation id="5860033963881614850">Izsl.</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Sākumlapas rediģēšana</translation>
 <translation id="60923314841986378">Atlikušas <ph name="HOURS" /> h</translation>
 <translation id="60924377787140961">Drīzumā būs pieejami citi raksti. Jauku pēcpusdienu!</translation>
+<translation id="6099151465289169210">Notika pārslēgšanās uz privātajām cilnēm</translation>
 <translation id="6108923351542677676">Notiek iestatīšana...</translation>
 <translation id="6111020039983847643">Izmantotie dati</translation>
 <translation id="6112702117600201073">Lapas atsvaidzināšana</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrācija</translation>
 <translation id="6324034347079777476">Android sistēmas sinhronizācija atspējota</translation>
 <translation id="6333140779060797560">Kopīgot, izmantojot <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Jauna privātā cilne</translation>
 <translation id="6337234675334993532">Šifrēšana</translation>
 <translation id="6341580099087024258">Vaicāt, kur saglabāt failus</translation>
 <translation id="6343192674172527289">Netika atrasta neviena lejupielāde</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Vietne datoriem</translation>
 <translation id="6600954340915313787">Nokopēta pārlūkā Chrome.</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Aizvērt privātās cilnes</translation>
 <translation id="6612358246767739896">Aizsargāts saturs</translation>
 <translation id="6627583120233659107">Rediģēt mapi</translation>
 <translation id="6643016212128521049">Notīrīt</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Jūs tiksiet izrakstīts no lielākās daļas vietņu. Jūs netiksiet izrakstīts no Google konta.</translation>
 <translation id="7454641608352164238">Nepietiek vietas</translation>
 <translation id="7455923816558154057">Pieskarieties, lai skatītu</translation>
+<translation id="7465104139234185284">Aizvērt visas privātā režīma cilnes</translation>
 <translation id="7473891865547856676">Nē, paldies!</translation>
 <translation id="7475192538862203634">Ja šis ziņojums tiek rādīts bieži, izmēģiniet šos <ph name="BEGIN_LINK" />ieteikumus<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD karte nav atrasta. Iespējams, trūkst kādi jūsu faili.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Lejupielādes: <ph name="GIGABYTES" /> GB</translation>
 <translation id="8249310407154411074">Pārvietot uz augšdaļu</translation>
 <translation id="8250920743982581267">Dokumenti</translation>
+<translation id="825412236959742607">Šī lapa izmanto pārāk daudz atmiņas, tādēļ pārlūks Chrome noņēma daļu satura.</translation>
 <translation id="8260126382462817229">Mēģiniet pierakstīties vēlreiz</translation>
 <translation id="8261506727792406068">Dzēst</translation>
 <translation id="8266862848225348053">Lejupielādes atrašanās vieta</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Sākt meklēšanu ar balsi</translation>
 <translation id="9071742570345586758">Lai skatītu virtuālās realitātes saturu, instalējiet Google VR pakalpojumus.</translation>
 <translation id="9074336505530349563">Lai saņemtu Google ieteikto personalizēto saturu, pierakstieties un ieslēdziet sinhronizāciju.</translation>
+<translation id="9080642952018487277">Atvērt privāto režīmu</translation>
 <translation id="9086455579313502267">Nevar piekļūt tīklam</translation>
 <translation id="9099018167121903954">Lejupielādes: <ph name="KILOBYTES" /> KB.</translation>
 <translation id="9100505651305367705">Piedāvāt rādīt rakstus vienkāršotā skatā, ja tāds tiek atbalstīts</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 77e3e78..e698201 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_nl.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> toevoegen...</translation>
 <translation id="1041308826830691739">Van websites</translation>
 <translation id="1049743911850919806">Incognito</translation>
+<translation id="1054301162707478098">Je gebruikt de privémodus.</translation>
 <translation id="10614374240317010">Nooit opgeslagen</translation>
 <translation id="1068672505746868501">Pagina's in het <ph name="SOURCE_LANGUAGE" /> nooit vertalen</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Meer talen</translation>
 <translation id="124678866338384709">Huidig tabblad sluiten</translation>
 <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Pagina's die je bekijkt op privétabbladen, blijven niet in de geschiedenis, cookie-opslag of zoekgeschiedenis van je browser staan nadat je alle privétabbladen hebt gesloten. Bestanden die je downloadt of bladwijzers die je instelt, blijven behouden.
+
+Je bent echter niet onzichtbaar. Als je de privémodus gebruikt, wordt je browsegeschiedenis niet verborgen voor je werkgever, je internetprovider of de websites die je bezoekt.</translation>
 <translation id="127138278192656016">Synchronisatie en alle services gebruiken</translation>
 <translation id="1272079795634619415">Stop</translation>
 <translation id="1283039547216852943">Tik om uit te vouwen</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Siteopties op volledig scherm</translation>
 <translation id="2038563949887743358">'Desktopsite aanvragen' inschakelen</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB voor andere apps</translation>
+<translation id="2055670718290744343">Zoekversneller</translation>
 <translation id="2063713494490388661">Tikken om te zoeken</translation>
 <translation id="2079545284768500474">Ongedaan maken</translation>
 <translation id="2082238445998314030">Resultaat <ph name="RESULT_NUMBER" /> van <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synchronisatie &amp; Google-services</translation>
 <translation id="2259659629660284697">Wachtwoorden exporteren…</translation>
 <translation id="2268044343513325586">Verfijnen</translation>
+<translation id="2280910239864711607">Een nieuw tabblad openen in de privémodus</translation>
 <translation id="2286841657746966508">Factuuradres</translation>
 <translation id="230115972905494466">Geen geschikte apparaten gevonden</translation>
 <translation id="2315043854645842844">Certificaatselectie aan clientzijde wordt niet ondersteund door het besturingssysteem.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">JavaScript toestaan voor een specfieke site.</translation>
 <translation id="2625189173221582860">Wachtwoord gekopieerd</translation>
 <translation id="2631006050119455616">Opgeslagen</translation>
+<translation id="2633278372998075009">Privétabbladen</translation>
 <translation id="2647434099613338025">Taal toevoegen</translation>
 <translation id="2650751991977523696">Bestand opnieuw downloaden?</translation>
 <translation id="2653659639078652383">Verzenden</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Als je je wachtwoordzin bent vergeten of deze instelling wilt wijzigen, <ph name="BEGIN_LINK" />stel je de synchronisatie opnieuw in<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Microfoon</translation>
 <translation id="3232754137068452469">Webapp</translation>
+<translation id="3234355010754616171">Nieuw privétabblad</translation>
 <translation id="3236059992281584593">1 minuut resterend</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Bladwijzer instellen voor deze pagina</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Alle incognitotabbladen sluiten</translation>
 <translation id="3365671512111106261">Niet beschikbaar wanneer Databesparing is ingeschakeld</translation>
 <translation id="3367813778245106622">Log opnieuw in om de synchronisatie te starten</translation>
+<translation id="3377025655491224618">Privétabblad</translation>
 <translation id="3384347053049321195">Afbeelding delen</translation>
 <translation id="3386292677130313581">Vragen of je sites toegang wilt verlenen tot je locatie (aanbevolen)</translation>
 <translation id="3387650086002190359">Downloaden van <ph name="FILE_NAME" /> is mislukt door fouten in het bestandssysteem.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Schakel synchronisatie in om suggesties voor gepersonaliseerde content van Google te ontvangen</translation>
 <translation id="4226663524361240545">Het apparaat kan trillen bij meldingen</translation>
 <translation id="4242533952199664413">Instellingen openen</translation>
+<translation id="4243710787042215766">Openen op privétabblad</translation>
 <translation id="424864128008805179">Uitloggen bij Chrome?</translation>
 <translation id="4256782883801055595">Open-sourcelicenties</translation>
 <translation id="4259722352634471385">Navigatie is geblokkeerd: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Kan geen tunnel tot stand brengen via de proxyserver</translation>
 <translation id="4881695831933465202">Openen</translation>
 <translation id="488187801263602086">Naam van bestand wijzigen</translation>
+<translation id="4883379392681899581">Privémodus verlaten</translation>
 <translation id="4885273946141277891">Niet-ondersteund aantal Chrome-instanties.</translation>
 <translation id="4910889077668685004">Betaal-apps</translation>
 <translation id="4913161338056004800">Statistieken resetten</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Met video</translation>
 <translation id="5233638681132016545">Nieuw tabblad</translation>
 <translation id="5240817131241497236">De instellingen waarmee je synchronisatie, personalisatie en andere Google-services in Chrome beheert, zijn gewijzigd. Dit is mogelijk van invloed op je huidige instellingen.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Instellingen<ph name="END_LINK1" /> kunnen op elk gewenst moment worden aangepast. Google kan content op sites die je bezoekt en je browseractiviteit en interacties gebruiken om Chrome en andere Google-services (zoals Translate, Zoeken en advertenties) te personaliseren.</translation>
 <translation id="5271967389191913893">Het apparaat kan de content niet openen die moet worden gedownload.</translation>
 <translation id="528192093759286357">Sleep vanaf de bovenkant en tik op de knop Terug om het volledige scherm te sluiten.</translation>
 <translation id="5284584623296338184">Wijzigingen in je bladwijzers, geschiedenis, wachtwoorden en andere instellingen worden niet meer gesynchroniseerd met je Google-account. Je bestaande gegevens blijven echter opgeslagen in je Google-account.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Onbekend</translation>
 <translation id="5833397272224757657">Maakt gebruik van content op sites die je bezoekt en browseractiviteit en -interactie voor personalisatie</translation>
 <translation id="5833984609253377421">Link delen</translation>
+<translation id="584427517463557805">Geselecteerd privétabblad</translation>
 <translation id="5854790677617711513">Ouder dan 30 dagen</translation>
 <translation id="5858741533101922242">Chrome kan de Bluetooth-adapter niet inschakelen</translation>
 <translation id="5860033963881614850">Uit</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Homepage bewerken</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> uur resterend</translation>
 <translation id="60924377787140961">Er worden binnenkort meer artikelen weergegeven. Geniet van je middag.</translation>
+<translation id="6099151465289169210">Overgeschakeld naar privétabbladen</translation>
 <translation id="6108923351542677676">Instellen wordt uitgevoerd...</translation>
 <translation id="6111020039983847643">data gebruikt</translation>
 <translation id="6112702117600201073">Pagina vernieuwen</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Trillen</translation>
 <translation id="6324034347079777476">Systeemsynchronisatie van Android uitgeschakeld</translation>
 <translation id="6333140779060797560">Delen via <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nieuw privétabblad</translation>
 <translation id="6337234675334993532">Codering</translation>
 <translation id="6341580099087024258">Vragen waar bestanden moeten worden opgeslagen</translation>
 <translation id="6343192674172527289">Geen downloads gevonden</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Desktopsite</translation>
 <translation id="6600954340915313787">Gekopieerd naar Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Privétabbladen sluiten</translation>
 <translation id="6612358246767739896">Beveiligde content</translation>
 <translation id="6627583120233659107">Map bewerken</translation>
 <translation id="6643016212128521049">Wissen</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Hiermee word je uitgelogd van de meeste sites. Je wordt niet uitgelogd van je Google-account.</translation>
 <translation id="7454641608352164238">Onvoldoende ruimte</translation>
 <translation id="7455923816558154057">Tik om weer te geven</translation>
+<translation id="7465104139234185284">Alle privétabbladen sluiten</translation>
 <translation id="7473891865547856676">Nee, bedankt</translation>
 <translation id="7475192538862203634">Als je deze melding vaker ziet, kun je deze <ph name="BEGIN_LINK" />suggesties<ph name="END_LINK" /> proberen.</translation>
 <translation id="7475688122056506577">SD-kaart niet gevonden. Sommige van je bestanden kunnen ontbreken.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB gedownload</translation>
 <translation id="8249310407154411074">Bovenaan zetten</translation>
 <translation id="8250920743982581267">Documenten</translation>
+<translation id="825412236959742607">Omdat deze pagina te veel geheugen gebruikt, heeft Chrome wat content verwijderd.</translation>
 <translation id="8260126382462817229">Probeer opnieuw in te loggen</translation>
 <translation id="8261506727792406068">Verwijderen</translation>
 <translation id="8266862848225348053">Downloadlocatie</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Gesproken zoekopdracht starten</translation>
 <translation id="9071742570345586758">Installeer VR-services van Google om virtual reality-content te bekijken</translation>
 <translation id="9074336505530349563">Log in en schakel synchronisatie in om suggesties voor gepersonaliseerde content van Google te ontvangen</translation>
+<translation id="9080642952018487277">Privémodus starten</translation>
 <translation id="9086455579313502267">Geen toegang tot het netwerk</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB gedownload</translation>
 <translation id="9100505651305367705">Aanbieden om artikelen weer te geven in een vereenvoudigde weergave (indien ondersteund)</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 883eb64..6740c2ef 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Legger til <ph name="WEBAPK_NAME" /> …</translation>
 <translation id="1041308826830691739">Fra nettsteder</translation>
 <translation id="1049743911850919806">Inkognito</translation>
+<translation id="1054301162707478098">Du er nå i privatmodus.</translation>
 <translation id="10614374240317010">Aldri lagret</translation>
 <translation id="1068672505746868501">Oversett aldri sider på <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Flere språk</translation>
 <translation id="124678866338384709">Lukk den aktive fanen</translation>
 <translation id="1258753120186372309">Google-doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Når du åpner sider i privatfaner, lagres de ikke i nettleser- eller søkeloggen, og eventuelle informasjonskapsler slettes. Filer du laster ned og bokmerker du oppretter, beholdes.
+
+Du er imidlertid ikke usynlig. Privat-modusen skjuler ikke surfingen din for arbeidsgiveren, nettleverandøren eller nettstedene du besøker.</translation>
 <translation id="127138278192656016">Bruk synkronisering og alle tjenester</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1283039547216852943">Trykk for å vise</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Navigering i full skjerm</translation>
 <translation id="2038563949887743358">Slå på Bruk skrivebordsversjon</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB andre apper</translation>
+<translation id="2055670718290744343">Søk akselerator</translation>
 <translation id="2063713494490388661">Trykk for å søke</translation>
 <translation id="2079545284768500474">Angre</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synkronisering/Google-tjenester</translation>
 <translation id="2259659629660284697">Eksportér passord</translation>
 <translation id="2268044343513325586">Finstem</translation>
+<translation id="2280910239864711607">Åpne en ny fane i privat-modus</translation>
 <translation id="2286841657746966508">Faktureringsadresse</translation>
 <translation id="230115972905494466">Fant ingen kompatible enheter</translation>
 <translation id="2315043854645842844">Operativsystemet har ikke støtte for sertifikatvalg på klientsiden.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Tillat JavaScript for et bestemt nettsted.</translation>
 <translation id="2625189173221582860">Passordet er kopiert</translation>
 <translation id="2631006050119455616">Spart</translation>
+<translation id="2633278372998075009">Privatefaner</translation>
 <translation id="2647434099613338025">Legg til språk</translation>
 <translation id="2650751991977523696">Vil du laste ned filen på nytt?</translation>
 <translation id="2653659639078652383">Send</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Hvis du har glemt passordfrasen din eller vil endre denne innstillingen, må du <ph name="BEGIN_LINK" />tilbakestille synkroniseringen<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Nettprogram</translation>
+<translation id="3234355010754616171">Ny privatfane</translation>
 <translation id="3236059992281584593">1 minutt igjen</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Legg til bokmerke for denne siden</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Lukk alle inkognitofaner</translation>
 <translation id="3365671512111106261">Utilgjengelig når Datasparing er slått på</translation>
 <translation id="3367813778245106622">Logg på igjen for å starte synkroniseringen</translation>
+<translation id="3377025655491224618">Privatfane</translation>
 <translation id="3384347053049321195">Del bildet</translation>
 <translation id="3386292677130313581">Spør før nettsteder får vite posisjonen min (anbefales)</translation>
 <translation id="3387650086002190359">Nedlastingen av <ph name="FILE_NAME" /> ble avbrutt på grunn av filsystemfeil.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">For å få forslag om personlig tilpasset innhold fra Google, slå på synkronisering</translation>
 <translation id="4226663524361240545">Varsler kan gjøre at enheten vibrerer</translation>
 <translation id="4242533952199664413">Åpne innstillingene</translation>
+<translation id="4243710787042215766">Åpne i privatfane</translation>
 <translation id="424864128008805179">Vil du logge av Chrome?</translation>
 <translation id="4256782883801055595">Lisenser for åpen kildekode</translation>
 <translation id="4259722352634471385">Nettadressen er blokkert: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Kunne ikke opprette tunnel via proxy-tjener.</translation>
 <translation id="4881695831933465202">Åpne</translation>
 <translation id="488187801263602086">Endre navnet på filen</translation>
+<translation id="4883379392681899581">Avslutt privatmodus</translation>
 <translation id="4885273946141277891">For mange Chrome-forekomster.</translation>
 <translation id="4910889077668685004">Betalingsapper</translation>
 <translation id="4913161338056004800">Tilbakestill statistikken</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Med video</translation>
 <translation id="5233638681132016545">Ny fane</translation>
 <translation id="5240817131241497236">Innstillingene som kontrollerer synkronisering, personlig tilpasning og andre Google-tjenester i Chrome, er blitt endret. Dette kan påvirke de nåværende innstillingene dine.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Innstillinger<ph name="END_LINK1" /> kan tilpasses når som helst. Google kan bruke innhold på nettsteder du besøker, nettleserinteraksjoner og annen aktivitet for å gi Chrome og Google-tjenester (som Oversetter, Søk og annonser) et personlig preg.</translation>
 <translation id="5271967389191913893">Enheten kan ikke åpne innholdet som skal lastes ned.</translation>
 <translation id="528192093759286357">Dra ned fra toppen og trykk på tilbakeknappen for å avslutte fullskjerm.</translation>
 <translation id="5284584623296338184">Endringer i bokmerker, loggoppføringer, passord og andre innstillinger blir ikke synkronisert med Google-kontoen din lenger. Data som allerede er lagret i Google-kontoen din, blir imidlertid ikke fjernet.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Ukjent</translation>
 <translation id="5833397272224757657">Bruker innhold fra nettsteder du besøker, nettleseraktivitet og andre interaksjoner for å gi ting et personlig preg</translation>
 <translation id="5833984609253377421">Del en link</translation>
+<translation id="584427517463557805">Valgt privatfane</translation>
 <translation id="5854790677617711513">Eldre enn 30 dager</translation>
 <translation id="5858741533101922242">Chrome kan ikke slå på Bluetooth-adapteren</translation>
 <translation id="5860033963881614850">Av</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Endre startsiden</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> timer igjen</translation>
 <translation id="60924377787140961">Flere artikler kommer snart. Ha en fin ettermiddag.</translation>
+<translation id="6099151465289169210">Bytt til privatefaner.</translation>
 <translation id="6108923351542677676">Konfigurasjon pågår …</translation>
 <translation id="6111020039983847643">data brukt</translation>
 <translation id="6112702117600201073">Oppdaterer siden.</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrering</translation>
 <translation id="6324034347079777476">Synkronisering for Android-systemet er slått av</translation>
 <translation id="6333140779060797560">Del via <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Ny privatfane</translation>
 <translation id="6337234675334993532">Kryptering</translation>
 <translation id="6341580099087024258">Spør hvor filer skal lagres</translation>
 <translation id="6343192674172527289">Fant ingen nedlastinger</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Side for datamaskiner</translation>
 <translation id="6600954340915313787">Kopiert til Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Lukk privatefaner</translation>
 <translation id="6612358246767739896">Beskyttet innhold</translation>
 <translation id="6627583120233659107">Rediger mappen</translation>
 <translation id="6643016212128521049">Tøm</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Logger deg av de fleste nettsteder. Du blir ikke logget av Google-kontoen din.</translation>
 <translation id="7454641608352164238">Det er ikke nok plass</translation>
 <translation id="7455923816558154057">Trykk for å se</translation>
+<translation id="7465104139234185284">Lukk alle privatefaner</translation>
 <translation id="7473891865547856676">Nei takk</translation>
 <translation id="7475192538862203634">Hvis du ser dette ofte, kan du prøve disse <ph name="BEGIN_LINK" />forslagene<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Finner ikke SD-kort. Noen av filene dine kan mangle.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB er lastet ned</translation>
 <translation id="8249310407154411074">Flytt til toppen</translation>
 <translation id="8250920743982581267">Dokumenter</translation>
+<translation id="825412236959742607">Denne siden bruker for mye minne, så har Chrome fjernet noe av innholdet.</translation>
 <translation id="8260126382462817229">Prøv å logge på igjen</translation>
 <translation id="8261506727792406068">Slett</translation>
 <translation id="8266862848225348053">Nedlastingssted</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Start talesøk</translation>
 <translation id="9071742570345586758">Du må installere Google VR Services for å kunne se innhold for virtuell virkelighet.</translation>
 <translation id="9074336505530349563">For å få forslag om personlig tilpasset innhold fra Google, slå på synkronisering</translation>
+<translation id="9080642952018487277">Start privatmodus</translation>
 <translation id="9086455579313502267">Fikk ikke tilgang til nettverket</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB er lastet ned</translation>
 <translation id="9100505651305367705">Tilby å vise artikler i forenklet visning, når det støttes</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 260e1285..94e53de 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Dodaję aplikację <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">Ze stron internetowych</translation>
 <translation id="1049743911850919806">Incognito</translation>
+<translation id="1054301162707478098">Jesteś w trybie prywatnym.</translation>
 <translation id="10614374240317010">Nigdy nie zapisane</translation>
 <translation id="1068672505746868501">Nigdy nie tłumacz stron, których językiem jest <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Więcej języków</translation>
 <translation id="124678866338384709">Zamknij bieżącą kartę</translation>
 <translation id="1258753120186372309">Doodle Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Po zamknięciu wszystkich kart prywatnych wyświetlane na nich strony nie pozostawią żadnych śladów w historii przeglądarki, magazynie plików cookie ani historii wyszukiwania. Pobrane pliki i utworzone zakładki zostaną zachowane.
+
+To jednak nie oznacza, że Cię nie widać. Nawet gdy przejdziesz w tryb prywatny, Twój pracodawca, dostawca internetu czy administratorzy odwiedzanych stron mogą dowiedzieć się, co przeglądasz.</translation>
 <translation id="127138278192656016">Używaj synchronizacji i wszystkich usług</translation>
 <translation id="1272079795634619415">Zatrzymaj</translation>
 <translation id="1283039547216852943">Kliknij, by rozwinąć</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Elementy sterowania stroną na pełnym ekranie</translation>
 <translation id="2038563949887743358">Włącz opcję „Wersja na komputer”</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB innych aplikacji</translation>
+<translation id="2055670718290744343">Akcelerator szukania</translation>
 <translation id="2063713494490388661">Kliknij, by wyszukać</translation>
 <translation id="2079545284768500474">Cofnij</translation>
 <translation id="2082238445998314030">Wynik <ph name="RESULT_NUMBER" /> z <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synchronizacja i usługi Google</translation>
 <translation id="2259659629660284697">Eksportuj hasła…</translation>
 <translation id="2268044343513325586">Zawęź</translation>
+<translation id="2280910239864711607">Otwórz nową kartę w trybie prywatnym</translation>
 <translation id="2286841657746966508">Adres rozliczeniowy</translation>
 <translation id="230115972905494466">Nie znaleziono zgodnych urządzeń</translation>
 <translation id="2315043854645842844">Wybieranie certyfikatu klienta nie jest obsługiwane przez ten system operacyjny.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Zezwól na użycie JavaScriptu w określonej witrynie.</translation>
 <translation id="2625189173221582860">Hasło zostało skopiowane</translation>
 <translation id="2631006050119455616">Zaoszczędzono</translation>
+<translation id="2633278372998075009">Karty prywatne</translation>
 <translation id="2647434099613338025">Dodaj język</translation>
 <translation id="2650751991977523696">Czy pobrać plik ponownie?</translation>
 <translation id="2653659639078652383">Prześlij</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Jeśli nie pamiętasz hasła lub chcesz zmienić to ustawienie, <ph name="BEGIN_LINK" />zresetuj synchronizację<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Aplikacja internetowa</translation>
+<translation id="3234355010754616171">Nowa karta prywatna</translation>
 <translation id="3236059992281584593">Pozostała minuta</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Dodaj stronę do zakładek</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Zamknij wszystkie karty incognito</translation>
 <translation id="3365671512111106261">Niedostępne, gdy Oszczędzanie danych jest włączone</translation>
 <translation id="3367813778245106622">Zaloguj się ponownie, by rozpocząć synchronizację</translation>
+<translation id="3377025655491224618">Karta prywatna</translation>
 <translation id="3384347053049321195">Udostępnij zdjęcie</translation>
 <translation id="3386292677130313581">Pytaj, zanim udostępnisz stronom swoją lokalizację (zalecane)</translation>
 <translation id="3387650086002190359">Nie udało się pobrać pliku <ph name="FILE_NAME" /> z powodu błędów systemu plików.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Aby uzyskać dostęp do spersonalizowanej treści proponowanej przez Google, włącz synchronizację</translation>
 <translation id="4226663524361240545">Powiadomienia będą sygnalizowane wibracjami</translation>
 <translation id="4242533952199664413">Otwórz ustawienia</translation>
+<translation id="4243710787042215766">Otwórz na karcie prywatnej</translation>
 <translation id="424864128008805179">Wylogować z Chrome?</translation>
 <translation id="4256782883801055595">Licencje open source</translation>
 <translation id="4259722352634471385">Adres zablokowany: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Nie udało się utworzyć tunelu przez serwer proxy</translation>
 <translation id="4881695831933465202">Otwórz</translation>
 <translation id="488187801263602086">Zmień nazwę pliku</translation>
+<translation id="4883379392681899581">Wyłącz tryb prywatny</translation>
 <translation id="4885273946141277891">Nieobsługiwana liczba wystąpień Chrome.</translation>
 <translation id="4910889077668685004">Aplikacje do płatności</translation>
 <translation id="4913161338056004800">Resetuj statystyki</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Z wideo</translation>
 <translation id="5233638681132016545">Nowa karta</translation>
 <translation id="5240817131241497236">Zostały zmienione ustawienia synchronizacji, personalizacji i innych usług Google w Chrome. Może to wpłynąć na Twoje bieżące ustawienia.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Ustawienia<ph name="END_LINK1" /> możesz zmienić w dowolnym momencie. Google może korzystać z zawartości odwiedzanych przez Ciebie stron oraz informacji o Twojej aktywności i interakcjach w przeglądarce, by personalizować Chrome i inne usługi Google takie jak Tłumacz, wyszukiwarka czy reklamy.</translation>
 <translation id="5271967389191913893">Na tym urządzeniu nie można otworzyć treści, które chcesz pobrać.</translation>
 <translation id="528192093759286357">Przeciągnij od góry i kliknij przycisk Wstecz, by wyjść z trybu pełnoekranowego.</translation>
 <translation id="5284584623296338184">Zmiany w zakładkach, historii, hasłach i innych ustawieniach nie będą już synchronizowane z kontem Google. Twoje istniejące dane będą jednak nadal na nim przechowywane.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Nieznany</translation>
 <translation id="5833397272224757657">Zawartość otwieranych stron oraz informacje o Twoich interakcjach i aktywności w przeglądarce zostaną wykorzystane do personalizacji</translation>
 <translation id="5833984609253377421">Udostępnij link</translation>
+<translation id="584427517463557805">Wybrana karta prywatna</translation>
 <translation id="5854790677617711513">Sprzed ponad 30 dni</translation>
 <translation id="5858741533101922242">Chrome nie może włączyć adaptera Bluetooth</translation>
 <translation id="5860033963881614850">Wyłączone</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Edytuj stronę główną</translation>
 <translation id="60923314841986378">Pozostało: <ph name="HOURS" /> godz.</translation>
 <translation id="60924377787140961">Wkrótce pojawi się więcej artykułów. Życzymy miłego popołudnia.</translation>
+<translation id="6099151465289169210">Przełączono do kart prywatnych</translation>
 <translation id="6108923351542677676">Trwa konfigurowanie…</translation>
 <translation id="6111020039983847643">użyte dane</translation>
 <translation id="6112702117600201073">Odświeżam stronę</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Wibracje</translation>
 <translation id="6324034347079777476">Synchronizacja systemu Android jest wyłączona</translation>
 <translation id="6333140779060797560">Udostępnij przez: <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nowa karta prywatna</translation>
 <translation id="6337234675334993532">Szyfrowanie</translation>
 <translation id="6341580099087024258">Pytaj, gdzie zapisać pliki</translation>
 <translation id="6343192674172527289">Brak pobranych plików</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Wersja na komputer</translation>
 <translation id="6600954340915313787">Skopiowana do Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Zamknij karty prywatne</translation>
 <translation id="6612358246767739896">Treść chroniona</translation>
 <translation id="6627583120233659107">Edytuj folder</translation>
 <translation id="6643016212128521049">Wyczyść</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Wylogowuje z większości stron internetowych. Nie wyloguje Cię z konta Google.</translation>
 <translation id="7454641608352164238">Za mało miejsca</translation>
 <translation id="7455923816558154057">Kliknij, by wyświetlić</translation>
+<translation id="7465104139234185284">Zamknij wszystkie karty prywatne</translation>
 <translation id="7473891865547856676">Nie, dziękuję</translation>
 <translation id="7475192538862203634">Jeśli często widzisz ten komunikat, przeczytaj te <ph name="BEGIN_LINK" />wskazówki<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Nie znaleziono karty SD. Może brakować niektórych Twoich plików.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB pobranych plików</translation>
 <translation id="8249310407154411074">Przenieś na początek</translation>
 <translation id="8250920743982581267">Dokumenty</translation>
+<translation id="825412236959742607">Ta strona używa zbyt dużo pamięci, dlatego Chrome usunął część jej zawartości.</translation>
 <translation id="8260126382462817229">Spróbuj zalogować się jeszcze raz</translation>
 <translation id="8261506727792406068">Usuń</translation>
 <translation id="8266862848225348053">Miejsce zapisywania pobranych plików</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Rozpocznij wyszukiwanie głosowe</translation>
 <translation id="9071742570345586758">Aby oglądać treści rzeczywistości wirtualnej, zainstaluj Usługi Google VR</translation>
 <translation id="9074336505530349563">Aby uzyskać dostęp do spersonalizowanej treści proponowanej przez Google, zaloguj się i włącz synchronizację</translation>
+<translation id="9080642952018487277">Włącz tryb prywatny</translation>
 <translation id="9086455579313502267">Nie można uzyskać dostępu do sieci</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB pobranych plików</translation>
 <translation id="9100505651305367705">Proponuj wyświetlanie artykułów w widoku uproszczonym, gdy jest obsługiwany</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 07af7580..01e0546b 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
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Adicionando <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">De sites</translation>
 <translation id="1049743911850919806">Modo anônimo</translation>
+<translation id="1054301162707478098">Você está em modo privado.</translation>
 <translation id="10614374240317010">Nunca salvas</translation>
 <translation id="1068672505746868501">Nunca traduzir páginas em <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" />: <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Mais idiomas</translation>
 <translation id="124678866338384709">Fechar a guia atual</translation>
 <translation id="1258753120186372309">Doodle do Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">As páginas visitadas em guias privadas não são armazenadas no histórico do navegador, nos cookies nem no histórico de pesquisa depois que todas as guias privadas são fechadas. Todos os arquivos transferidos por download ou favoritos criados serão mantidos.
+
+Porém, você não está invisível, O modo privado não oculta sua navegação do seu empregador, seu provedor de Internet ou dos sites visitados.</translation>
 <translation id="127138278192656016">Usar a sincronização e todos os serviços</translation>
 <translation id="1272079795634619415">Parar</translation>
 <translation id="1283039547216852943">Toque para expandir</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Controles de site em tela cheia</translation>
 <translation id="2038563949887743358">Ativar "Ver versão para Web"</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB de outros apps</translation>
+<translation id="2055670718290744343">Acelerador de pesquisa</translation>
 <translation id="2063713494490388661">Tocar para pesquisar</translation>
 <translation id="2079545284768500474">Desfazer</translation>
 <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Serviços do Google e de sincronização</translation>
 <translation id="2259659629660284697">Exportar senhas…</translation>
 <translation id="2268044343513325586">Refinar</translation>
+<translation id="2280910239864711607">Abra uma nova guia no modo privado</translation>
 <translation id="2286841657746966508">Endereço de faturamento</translation>
 <translation id="230115972905494466">Nenhum dispositivo compatível encontrado</translation>
 <translation id="2315043854645842844">A seleção de certificado do cliente não é compatível com o sistema operacional.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Permitir JavaScript para um site específico.</translation>
 <translation id="2625189173221582860">Senha copiada</translation>
 <translation id="2631006050119455616">Salvo</translation>
+<translation id="2633278372998075009">Guias privadas</translation>
 <translation id="2647434099613338025">Adicionar idioma</translation>
 <translation id="2650751991977523696">Fazer o download do arquivo novamente?</translation>
 <translation id="2653659639078652383">Enviar</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Se você esqueceu sua senha longa ou deseja alterar essa configuração, <ph name="BEGIN_LINK" />redefina a sincronização<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Microfone</translation>
 <translation id="3232754137068452469">App da Web</translation>
+<translation id="3234355010754616171">Nova guia privada</translation>
 <translation id="3236059992281584593">Um minuto restante</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Adicionar esta página aos favoritos</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Fechar todas as guias anônimas</translation>
 <translation id="3365671512111106261">Indisponível quando a extensão Economia de dados está ativada</translation>
 <translation id="3367813778245106622">Faça login novamente para começar a sincronizar</translation>
+<translation id="3377025655491224618">Guia privada</translation>
 <translation id="3384347053049321195">Compartilhar imagem</translation>
 <translation id="3386292677130313581">Perguntar antes de permitir que sites saibam seu local (recomendado)</translation>
 <translation id="3387650086002190359">Falha no download de <ph name="FILE_NAME" /> devido a erros do sistema de arquivos.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Para receber conteúdo personalizado sugerido pelo Google, ative a sincronização</translation>
 <translation id="4226663524361240545">É possível que as notificações façam o dispositivo vibrar</translation>
 <translation id="4242533952199664413">Abrir configurações.</translation>
+<translation id="4243710787042215766">Abrir na guia privada</translation>
 <translation id="424864128008805179">Sair do Google Chrome?</translation>
 <translation id="4256782883801055595">Licenças de código aberto</translation>
 <translation id="4259722352634471385">A Navegação GPS está bloqueada: <ph name="URL" /></translation>
@@ -466,6 +476,7 @@
 <translation id="4878404682131129617">Falha ao estabelecer encapsulamento via servidor proxy</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="488187801263602086">Renomear arquivo</translation>
+<translation id="4883379392681899581">Sair do modo privado</translation>
 <translation id="4885273946141277891">Número de instâncias do Google Chrome não suportado.</translation>
 <translation id="4910889077668685004">Apps de pagamento</translation>
 <translation id="4913161338056004800">Redefinir estatísticas</translation>
@@ -507,6 +518,7 @@
 <translation id="5224771365102442243">Com vídeo</translation>
 <translation id="5233638681132016545">Nova guia</translation>
 <translation id="5240817131241497236">As configurações que controlam sincronização, personalização e outros serviços do Google no Chrome foram alteradas. Isso pode afetar suas configurações atuais.</translation>
+<translation id="5264003212305142034">As <ph name="BEGIN_LINK1" />configurações<ph name="END_LINK1" /> podem ser personalizadas a qualquer momento. O Google pode usar o conteúdo dos sites que você visita, além das atividades e interações do navegador para personalizar o Chrome e outros serviços do Google, como o Tradutor, a Pesquisa e os anúncios.</translation>
 <translation id="5271967389191913893">Não é possível abrir no dispositivo o conteúdo a ser transferido por download.</translation>
 <translation id="528192093759286357">Arraste a partir da parte superior e toque no botão "Voltar" para sair da tela cheia.</translation>
 <translation id="5284584623296338184">Alterações feitas nos seus favoritos, histórico, senhas e outras configurações não serão mais sincronizadas com sua Conta do Google. No entanto, os dados já existentes permanecerão armazenados na Conta do Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Desconhecido</translation>
 <translation id="5833397272224757657">Usa o conteúdo dos sites que você visita, além das interações e atividades do navegador, para personalização</translation>
 <translation id="5833984609253377421">Compartilhar link</translation>
+<translation id="584427517463557805">Guia privada selecionada</translation>
 <translation id="5854790677617711513">Com mais de 30 dias</translation>
 <translation id="5858741533101922242">O Chrome não pôde ativar o adaptador Bluetooth</translation>
 <translation id="5860033963881614850">Desativado</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Editar página inicial</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> horas restantes</translation>
 <translation id="60924377787140961">Mais artigos serão exibidos em breve. Aproveite a tarde.</translation>
+<translation id="6099151465289169210">Alternado para guias privadas</translation>
 <translation id="6108923351542677676">Configuração em andamento...</translation>
 <translation id="6111020039983847643">dados usados</translation>
 <translation id="6112702117600201073">Atualizando página</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrar</translation>
 <translation id="6324034347079777476">Sincronização do sistema Android desativada</translation>
 <translation id="6333140779060797560">Compartilhar via <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Nova guia privada</translation>
 <translation id="6337234675334993532">Criptografia</translation>
 <translation id="6341580099087024258">Perguntar onde salvar os arquivos</translation>
 <translation id="6343192674172527289">Nenhum download encontrado</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Site para computador</translation>
 <translation id="6600954340915313787">Copiado no Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Fechar guias privadas</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
 <translation id="6627583120233659107">Editar pasta</translation>
 <translation id="6643016212128521049">Limpar</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Desconecta você da maioria dos sites, mas não da sua Conta do Google.</translation>
 <translation id="7454641608352164238">Espaço insuficiente</translation>
 <translation id="7455923816558154057">Toque para ver</translation>
+<translation id="7465104139234185284">Fechar todas as guias privadas</translation>
 <translation id="7473891865547856676">Não, obrigado</translation>
 <translation id="7475192538862203634">Se estiver vendo isso com frequência, tente estas <ph name="BEGIN_LINK" />sugestões<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Cartão SD não encontrado. Alguns arquivos podem estar faltando.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB transferido(s) por download</translation>
 <translation id="8249310407154411074">Mover para o início</translation>
 <translation id="8250920743982581267">Documentos</translation>
+<translation id="825412236959742607">Como esta página usa muita memória, o Chrome removeu parte do conteúdo.</translation>
 <translation id="8260126382462817229">Tente fazer login novamente</translation>
 <translation id="8261506727792406068">Excluir</translation>
 <translation id="8266862848225348053">Local de download</translation>
@@ -978,6 +996,7 @@
 <translation id="9070377983101773829">Iniciar pesquisa por voz</translation>
 <translation id="9071742570345586758">Para ver conteúdo de realidade virtual, instale os Serviços de RV do Google</translation>
 <translation id="9074336505530349563">Para receber conteúdo personalizado sugerido pelo Google, ative a sincronização</translation>
+<translation id="9080642952018487277">Entrar no modo privado</translation>
 <translation id="9086455579313502267">Não foi possível acessar a rede</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB transferido(s) por download</translation>
 <translation id="9100505651305367705">Oferecer para mostrar artigos em uma visualização simplificada, quando compatível</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 a7d27cc2..4fdbd5fc 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
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">A adicionar <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">De Websites</translation>
 <translation id="1049743911850919806">Navegação anónima</translation>
+<translation id="1054301162707478098">Entrou no modo privado.</translation>
 <translation id="10614374240317010">Nunca guardadas</translation>
 <translation id="1068672505746868501">Nunca traduzir páginas em <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Mais idiomas</translation>
 <translation id="124678866338384709">Fechar o separador atual</translation>
 <translation id="1258753120186372309">Doodle da Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">As páginas que visualizar em separadores privados não serão guardadas no histórico do navegador, no armazenamento de cookies ou no histórico de pesquisas depois de fechar todos os separadores privados. Os ficheiros que transferir ou os marcadores que criar manter-se-ão.
+
+No entanto, a navegação não é invisível. Passar para o modo privado não oculta a navegação do empregador, do fornecedor de serviços de Internet nem dos Websites que visitar.</translation>
 <translation id="127138278192656016">Utilizar a sincronização e todos os serviços</translation>
 <translation id="1272079795634619415">Parar</translation>
 <translation id="1283039547216852943">Toque para expandir</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Controlos de site em ecrã int.</translation>
 <translation id="2038563949887743358">Ativar Pedir site para computador</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB de outras aplicações</translation>
+<translation id="2055670718290744343">Pesquisar Acelerador</translation>
 <translation id="2063713494490388661">Tocar para pesquisar</translation>
 <translation id="2079545284768500474">Anular</translation>
 <translation id="2082238445998314030">Resultado <ph name="RESULT_NUMBER" /> de <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sincronização e serviços Google</translation>
 <translation id="2259659629660284697">Exportar palavras-passe</translation>
 <translation id="2268044343513325586">Refinar</translation>
+<translation id="2280910239864711607">Abrir novo separador no modo privado</translation>
 <translation id="2286841657746966508">Endereço de facturação</translation>
 <translation id="230115972905494466">Não foram encontrados dispositivos compatíveis.</translation>
 <translation id="2315043854645842844">O sistema operativo não suporta a seleção do certificado do lado do cliente.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Permitir JavaScript num site específico.</translation>
 <translation id="2625189173221582860">Palavra-passe copiada</translation>
 <translation id="2631006050119455616">Guardado</translation>
+<translation id="2633278372998075009">Separadores privados</translation>
 <translation id="2647434099613338025">Adicionar idioma</translation>
 <translation id="2650751991977523696">Pretende transferir o ficheiro novamente?</translation>
 <translation id="2653659639078652383">Submeter</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Se se esquecer da frase de acesso ou pretender alterar esta definição, <ph name="BEGIN_LINK" />reponha a sincronização<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Microfone</translation>
 <translation id="3232754137068452469">Aplicação Web</translation>
+<translation id="3234355010754616171">Novo separador privado</translation>
 <translation id="3236059992281584593">Falta 1 minuto</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Marcar esta página</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Fechar todos os separadores de navegação anónima</translation>
 <translation id="3365671512111106261">Não disponível quando a Poupança de dados está ativada</translation>
 <translation id="3367813778245106622">Iniciar sessão novamente para iniciar a sincronização</translation>
+<translation id="3377025655491224618">Separador privado</translation>
 <translation id="3384347053049321195">Partilhar imagem</translation>
 <translation id="3386292677130313581">Perguntar antes de permitir que os sites conheçam a sua localização (recomendado)</translation>
 <translation id="3387650086002190359">A transferência de <ph name="FILE_NAME" /> falhou devido a erros do sistema de ficheiros.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Para obter conteúdo personalizado sugerido pelo Google, ative a sincronização.</translation>
 <translation id="4226663524361240545">As notificações podem fazer com que o dispositivo vibre</translation>
 <translation id="4242533952199664413">Abrir definições</translation>
+<translation id="4243710787042215766">Abrir no separador privado</translation>
 <translation id="424864128008805179">Pretende terminar sessão no Chrome?</translation>
 <translation id="4256782883801055595">Licenças de código aberto</translation>
 <translation id="4259722352634471385">A navegação está bloqueada: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Falha ao estabelecer um túnel através do servidor proxy.</translation>
 <translation id="4881695831933465202">Abrir</translation>
 <translation id="488187801263602086">Mudar o nome do ficheiro</translation>
+<translation id="4883379392681899581">Sair do modo privado</translation>
 <translation id="4885273946141277891">Número não suportado de instâncias do Chrome.</translation>
 <translation id="4910889077668685004">Aplicações de pagamento</translation>
 <translation id="4913161338056004800">Repor estatísticas</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Com vídeo</translation>
 <translation id="5233638681132016545">Novo separador</translation>
 <translation id="5240817131241497236">As definições que controlam a sincronização, a personalização e outros serviços Google no Chrome foram alteradas. Isto pode afetar as suas definições atuais.</translation>
+<translation id="5264003212305142034">Pode personalizar as <ph name="BEGIN_LINK1" />definições<ph name="END_LINK1" /> a qualquer momento. A Google pode utilizar conteúdos nos sites que visita, assim como as interações e a atividade com o navegador, para personalizar o Chrome e outros serviços Google, como o Tradutor, a Pesquisa e os anúncios.</translation>
 <translation id="5271967389191913893">O dispositivo não consegue abrir o conteúdo a transferir.</translation>
 <translation id="528192093759286357">Arraste a partir da parte superior e toque no botão de retrocesso para sair do ecrã inteiro.</translation>
 <translation id="5284584623296338184">As alterações aos marcadores, ao histórico, às palavras-passe e a outras definições deixam de ser sincronizadas com a Conta Google. Contudo, os dados existentes permanecem armazenados na Conta Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Desconhecido</translation>
 <translation id="5833397272224757657">Utiliza conteúdo nos sites que visita e interações e atividades do navegador para personalização.</translation>
 <translation id="5833984609253377421">Partilhar link</translation>
+<translation id="584427517463557805">Separador privado selecionado</translation>
 <translation id="5854790677617711513">Com mais de 30 dias</translation>
 <translation id="5858741533101922242">O Chrome não consegue ativar o adaptador Bluetooth</translation>
 <translation id="5860033963881614850">Desativado</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Editar página inicial</translation>
 <translation id="60923314841986378">Faltam <ph name="HOURS" /> horas</translation>
 <translation id="60924377787140961">Serão apresentados mais artigos em breve. Desfrute da sua tarde!</translation>
+<translation id="6099151465289169210">Mudado para separadores privados</translation>
 <translation id="6108923351542677676">Configuração em curso…</translation>
 <translation id="6111020039983847643">dados utilizados</translation>
 <translation id="6112702117600201073">A atualizar a página</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrar</translation>
 <translation id="6324034347079777476">Sincronização do sistema Android desativada</translation>
 <translation id="6333140779060797560">Partilhar através de <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Novo separador privado</translation>
 <translation id="6337234675334993532">Encriptação</translation>
 <translation id="6341580099087024258">Perguntar onde guardar os ficheiros</translation>
 <translation id="6343192674172527289">Nenhuma transferência encontrada</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Site para computador</translation>
 <translation id="6600954340915313787">Copiado para o Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Fechar separadores privados</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
 <translation id="6627583120233659107">Editar pasta</translation>
 <translation id="6643016212128521049">Limpar</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">A sua sessão é terminada na maioria dos sites. A sessão na sua Conta Google não é terminada.</translation>
 <translation id="7454641608352164238">Espaço insuficiente</translation>
 <translation id="7455923816558154057">Tocar para ver</translation>
+<translation id="7465104139234185284">Fechar todos os separadores privados</translation>
 <translation id="7473891865547856676">Não, obrigado</translation>
 <translation id="7475192538862203634">Se vê isto com frequência, experimente estas <ph name="BEGIN_LINK" />sugestões<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Cartão SD não encontrado. Alguns dos seus ficheiros poderão estar em falta.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB transferido(s)</translation>
 <translation id="8249310407154411074">Mover para o início</translation>
 <translation id="8250920743982581267">Documentos</translation>
+<translation id="825412236959742607">Esta página utiliza demasiada memória, pelo que o Chrome removeu algum conteúdo.</translation>
 <translation id="8260126382462817229">Experimente iniciar sessão novamente</translation>
 <translation id="8261506727792406068">Eliminar</translation>
 <translation id="8266862848225348053">Localização da transferência</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Iniciar pesquisa por voz</translation>
 <translation id="9071742570345586758">Para ver conteúdo de realidade virtual, instale os Serviços de RV da Google</translation>
 <translation id="9074336505530349563">Para obter conteúdo personalizado sugerido pelo Google, inicie sessão e ative a sincronização.</translation>
+<translation id="9080642952018487277">Entrar no modo privado</translation>
 <translation id="9086455579313502267">Não é possível aceder à rede</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB transferido(s)</translation>
 <translation id="9100505651305367705">Sugerir a apresentação de artigos na vista simplificada, quando suportada</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 3a479eb..380b714 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ro.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Se adaugă <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">De la site-uri</translation>
 <translation id="1049743911850919806">Incognito</translation>
+<translation id="1054301162707478098">Ai trecut în modul privat.</translation>
 <translation id="10614374240317010">Nu se salvează niciodată</translation>
 <translation id="1068672505746868501">Nu traduce niciodată paginile în <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Mai multe limbi</translation>
 <translation id="124678866338384709">Închide fila actuală</translation>
 <translation id="1258753120186372309">Doodle Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Paginile pe care le vezi în filele private nu vor fi înregistrate în istoricul browserului, nu vor stoca cookie-uri și nu vor rămâne în istoricul de căutare după ce închizi toate filele private. Fișierele descărcate și marcajele create vor fi păstrate.
+
+Totuși, nu ești invizibil(ă). Trecerea în modul privat nu ascunde activitatea de navigare față de angajator, față de furnizorul de servicii de internet sau față de site-urile pe care le accesezi.</translation>
 <translation id="127138278192656016">Folosește sincronizarea și toate serviciile</translation>
 <translation id="1272079795634619415">Oprește</translation>
 <translation id="1283039547216852943">Atinge pentru a extinde</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Comenzi site în ecran complet</translation>
 <translation id="2038563949887743358">Activează opțiunea Versiune site pentru desktop</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB pentru alte aplicații</translation>
+<translation id="2055670718290744343">Caută butonul Accelerator</translation>
 <translation id="2063713494490388661">Atinge pentru a căuta</translation>
 <translation id="2079545284768500474">Anulează</translation>
 <translation id="2082238445998314030">Rezultatul <ph name="RESULT_NUMBER" /> din <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sincronizarea și serviciile Google</translation>
 <translation id="2259659629660284697">Exportă parolele…</translation>
 <translation id="2268044343513325586">Rafinează</translation>
+<translation id="2280910239864711607">Deschide o filă nouă în modul privat</translation>
 <translation id="2286841657746966508">Adresa de facturare</translation>
 <translation id="230115972905494466">Nu s-au găsit dispozitive compatibile</translation>
 <translation id="2315043854645842844">Selectarea certificatelor pe partea de client nu este acceptată de sistemul de operare.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Permite JavaScript pentru un anumit site.</translation>
 <translation id="2625189173221582860">Parola a fost copiată</translation>
 <translation id="2631006050119455616">Economisite</translation>
+<translation id="2633278372998075009">File private</translation>
 <translation id="2647434099613338025">Adaugă o limbă</translation>
 <translation id="2650751991977523696">Descarci din nou fișierul?</translation>
 <translation id="2653659639078652383">Trimite</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Dacă ai uitat expresia de acces sau dorești să modifici această setare, <ph name="BEGIN_LINK" />resetează sincronizarea<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Microfon</translation>
 <translation id="3232754137068452469">Aplicație web</translation>
+<translation id="3234355010754616171">Filă privată nouă</translation>
 <translation id="3236059992281584593">1 min. rămas</translation>
 <translation id="3244271242291266297">LL</translation>
 <translation id="3254409185687681395">Marcați această pagină</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Închide toate filele incognito</translation>
 <translation id="3365671512111106261">Nu este disponibilă când Economizorul de date este activat</translation>
 <translation id="3367813778245106622">Conectează-te din nou pentru a începe sincronizarea</translation>
+<translation id="3377025655491224618">Filă privată</translation>
 <translation id="3384347053049321195">Trimite imaginea</translation>
 <translation id="3386292677130313581">Întreabă înainte de a permite site-urilor să afle locația (recomandat)</translation>
 <translation id="3387650086002190359">Descărcarea fișierului <ph name="FILE_NAME" /> nu a reușit din cauza unor erori privind sistemul de fișiere.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Pentru a obține sugestii de conținut personalizat de la Google, activează sincronizarea</translation>
 <translation id="4226663524361240545">Notificările pot face dispozitivul să vibreze</translation>
 <translation id="4242533952199664413">Deschide setările</translation>
+<translation id="4243710787042215766">Deschide într-o filă privată</translation>
 <translation id="424864128008805179">Te deconectezi de la Chrome?</translation>
 <translation id="4256782883801055595">Licențe open source</translation>
 <translation id="4259722352634471385">Navigarea este blocată: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Nu s-a putut stabili un tunel prin serverul proxy</translation>
 <translation id="4881695831933465202">Deschide</translation>
 <translation id="488187801263602086">Redenumește fișierul</translation>
+<translation id="4883379392681899581">Ieși din modul privat</translation>
 <translation id="4885273946141277891">Număr de instanțe Chrome neacceptat.</translation>
 <translation id="4910889077668685004">Aplicații pentru plăți</translation>
 <translation id="4913161338056004800">Resetează statisticile</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Cu videoclip</translation>
 <translation id="5233638681132016545">Filă nouă</translation>
 <translation id="5240817131241497236">Setările care controlează sincronizarea, personalizarea și alte servicii Google din Chrome s-au modificat. Această acțiune poate afecta setările curente.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Setările<ph name="END_LINK1" /> pot fi personalizate oricând. Google poate folosi conținutul de pe site-urile pe care le accesezi, interacțiunile cu browserul și activitatea pentru a personaliza Chrome și alte servicii Google precum Traducere, Căutare și anunțuri.</translation>
 <translation id="5271967389191913893">Dispozitivul nu poate deschide conținutul de descărcat.</translation>
 <translation id="528192093759286357">Trage din partea de sus și atinge butonul Înapoi pentru a ieși din ecranul complet.</translation>
 <translation id="5284584623296338184">Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Necunoscut</translation>
 <translation id="5833397272224757657">Folosește conținutul de pe site-urile pe care le accesezi, activitatea browserului și interacțiunile pentru personalizare</translation>
 <translation id="5833984609253377421">Trimite linkul</translation>
+<translation id="584427517463557805">Fișă privată selectată</translation>
 <translation id="5854790677617711513">Mai vechi de 30 de zile</translation>
 <translation id="5858741533101922242">Chrome nu poate activa adaptorul Bluetooth</translation>
 <translation id="5860033963881614850">Dezactivat</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Editează pagina de pornire</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> ore rămase</translation>
 <translation id="60924377787140961">În curând vor apărea mai multe articole. O după-amiază plăcută!</translation>
+<translation id="6099151465289169210">Ai comutat la filele private</translation>
 <translation id="6108923351542677676">Configurare în curs...</translation>
 <translation id="6111020039983847643">date utilizate</translation>
 <translation id="6112702117600201073">Se actualizează pagina</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibrații</translation>
 <translation id="6324034347079777476">Sincronizarea de sistem Android este dezactivată</translation>
 <translation id="6333140779060797560">Trimiteți prin <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Filă privată nouă</translation>
 <translation id="6337234675334993532">Criptare</translation>
 <translation id="6341580099087024258">Întreabă unde să fie salvate fișierele</translation>
 <translation id="6343192674172527289">Nu s-a găsit nicio descărcare</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Versiune site desktop</translation>
 <translation id="6600954340915313787">Copiat în Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Închide filele private</translation>
 <translation id="6612358246767739896">Conținut protejat</translation>
 <translation id="6627583120233659107">Editați dosarul</translation>
 <translation id="6643016212128521049">Ștergeți</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Te deconectează de pe majoritatea site-urilor. Nu te va deconecta de la Contul Google.</translation>
 <translation id="7454641608352164238">Spațiu insuficient</translation>
 <translation id="7455923816558154057">Atinge pentru a afișa</translation>
+<translation id="7465104139234185284">Închide toate filele private</translation>
 <translation id="7473891865547856676">Nu, mulțumesc</translation>
 <translation id="7475192538862203634">Dacă acest mesaj apare frecvent, încearcă următoarele <ph name="BEGIN_LINK" />sugestii<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Nu s-a găsit cardul SD. Este posibil ca unele fișiere să lipsească.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB pentru descărcări</translation>
 <translation id="8249310407154411074">Mută la început</translation>
 <translation id="8250920743982581267">Documente</translation>
+<translation id="825412236959742607">Această pagină folosește prea multă memorie, prin urmare Chrome a eliminat o parte din conținut.</translation>
 <translation id="8260126382462817229">Încearcă să te conectezi din nou</translation>
 <translation id="8261506727792406068">Șterge</translation>
 <translation id="8266862848225348053">Locația de descărcare</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Începe căutarea vocală</translation>
 <translation id="9071742570345586758">Pentru a vedea conținut de realitate virtuală, instalează serviciile Google VR</translation>
 <translation id="9074336505530349563">Pentru a obține sugestii de conținut personalizat de la Google, conectează-te și activează sincronizarea</translation>
+<translation id="9080642952018487277">Intră în modul privat</translation>
 <translation id="9086455579313502267">Nu se poate accesa rețeaua</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB pentru descărcări</translation>
 <translation id="9100505651305367705">Oferă afișarea simplificată a articolelor, dacă este acceptată</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 ff45453..ec71f15 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Добавление файла "<ph name="WEBAPK_NAME" />"…</translation>
 <translation id="1041308826830691739">От сайтов</translation>
 <translation id="1049743911850919806">Инкогнито</translation>
+<translation id="1054301162707478098">Вы перешли в режим инкогнито</translation>
 <translation id="10614374240317010">Сайты, пароли для которых не сохраняются</translation>
 <translation id="1068672505746868501">Не переводить страницы на этом языке: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Другие языки</translation>
 <translation id="124678866338384709">Закрыть вкладку</translation>
 <translation id="1258753120186372309">Дудл Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Информация о страницах, открытых в режиме инкогнито, не сохраняется. Это касается файлов cookie, а также истории браузера или поиска. После того как вы закроете эти вкладки, останутся только скачанные файлы и добавленные закладки.
+
+Однако в режиме инкогнито ваши действия видны системному администратору и интернет-провайдеру, а также доступны сайтам, которые вы посещаете.</translation>
 <translation id="127138278192656016">Включить синхронизацию и все сервисы Chrome</translation>
 <translation id="1272079795634619415">Остановить</translation>
 <translation id="1283039547216852943">Нажмите, чтобы развернуть</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Настройки полноэкранного режима</translation>
 <translation id="2038563949887743358">Включить полную версию сайта</translation>
 <translation id="2045104531052923016">Другие приложения: <ph name="GIGABYTES" /> ГБ</translation>
+<translation id="2055670718290744343">Ускоренный поиск</translation>
 <translation id="2063713494490388661">Нажмите для поиска</translation>
 <translation id="2079545284768500474">Отмена</translation>
 <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" />, всего <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Синхронизация сервисов Google</translation>
 <translation id="2259659629660284697">Экспорт паролей…</translation>
 <translation id="2268044343513325586">Уточнить</translation>
+<translation id="2280910239864711607">Открыть новую вкладку в режиме инкогнито</translation>
 <translation id="2286841657746966508">Платежный адрес</translation>
 <translation id="230115972905494466">Совместимые устройства не найдены.</translation>
 <translation id="2315043854645842844">Сертификат, выбранный клиентом, не поддерживается операционной системой.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Разрешить JavaScript для конкретного сайта.</translation>
 <translation id="2625189173221582860">Пароль скопирован</translation>
 <translation id="2631006050119455616">Сэкономлено</translation>
+<translation id="2633278372998075009">Вкладки инкогнито</translation>
 <translation id="2647434099613338025">Добавить язык</translation>
 <translation id="2650751991977523696">Скачать файл ещё раз?</translation>
 <translation id="2653659639078652383">Отправить</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Если вы забыли кодовую фразу или хотите изменить эту настройку, <ph name="BEGIN_LINK" />сбросьте параметры синхронизации<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3232754137068452469">Веб-приложение</translation>
+<translation id="3234355010754616171">Новая вкладка инкогнито</translation>
 <translation id="3236059992281584593">Осталась 1 мин.</translation>
 <translation id="3244271242291266297">ММ</translation>
 <translation id="3254409185687681395">Добавить страницу в закладки</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Закрыть все вкладки инкогнито</translation>
 <translation id="3365671512111106261">Недоступно, если включена функция "Экономия трафика"</translation>
 <translation id="3367813778245106622">Чтобы начать синхронизацию, снова войдите в аккаунт</translation>
+<translation id="3377025655491224618">Вкладка инкогнито</translation>
 <translation id="3384347053049321195">Поделиться изображением</translation>
 <translation id="3386292677130313581">Запрашивать разрешение на доступ к данным о местоположении (рекомендуется)</translation>
 <translation id="3387650086002190359">Не удалось скачать файл <ph name="FILE_NAME" /> из-за ошибок файловой системы.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Чтобы мы могли рекомендовать вам интересный контент, включите синхронизацию.</translation>
 <translation id="4226663524361240545">Вибрация при получении уведомлений</translation>
 <translation id="4242533952199664413">Открыть настройки</translation>
+<translation id="4243710787042215766">Открыть в режиме инкогнито</translation>
 <translation id="424864128008805179">Выйти из Chrome?</translation>
 <translation id="4256782883801055595">Лицензии на ПО с открытым кодом</translation>
 <translation id="4259722352634471385">Навигация заблокирована: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Не удалось создать туннель через прокси-сервер.</translation>
 <translation id="4881695831933465202">Открыть</translation>
 <translation id="488187801263602086">Необходимо переименовать файл</translation>
+<translation id="4883379392681899581">Выйти из режима инкогнито</translation>
 <translation id="4885273946141277891">Конфликт версий Chrome</translation>
 <translation id="4910889077668685004">Платежные приложения</translation>
 <translation id="4913161338056004800">Сбросить статистику</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Есть видео</translation>
 <translation id="5233638681132016545">Новая вкладка</translation>
 <translation id="5240817131241497236">В Chrome изменились настройки синхронизации, персонализации и других сервисов Google. Это может повлиять на текущие настройки.</translation>
+<translation id="5264003212305142034">Для персонализации рекламы, Chrome и таких сервисов Google, как Переводчик и Поиск, могут использоваться данные с сайтов, которые вы посещаете, а также история просмотров и действий в браузере. Вы можете изменить <ph name="BEGIN_LINK1" />Настройки<ph name="END_LINK1" /> в любой момент.</translation>
 <translation id="5271967389191913893">Не удается открыть скачанный контент.</translation>
 <translation id="528192093759286357">Чтобы выйти из полноэкранного режима, проведите по экрану сверху вниз и нажмите кнопку "Назад".</translation>
 <translation id="5284584623296338184">Изменения в ваших закладках, паролях, истории и других настройках больше не будут синхронизироваться с аккаунтом Google. Это изменение не затронет данные, сохраненные в аккаунте ранее.</translation>
@@ -520,7 +532,7 @@
 <translation id="5335288049665977812">Разрешить сайтам использовать JavaScript (рекомендуется)</translation>
 <translation id="5345040418939504969">Закладка "<ph name="BOOKMARK_TITLE" />" удалена</translation>
 <translation id="5372829067651257087">URL скопирован.</translation>
-<translation id="5391532827096253100">Подключение к сайту не защищено. Информация о сайте.</translation>
+<translation id="5391532827096253100">Подключение к сайту не защищено. Информация о сайте</translation>
 <translation id="5400569084694353794">Работая с приложением, вы принимаете <ph name="BEGIN_LINK1" />Условия использования<ph name="END_LINK1" /> и <ph name="BEGIN_LINK2" />Примечание о конфиденциальности<ph name="END_LINK2" /> Chrome.</translation>
 <translation id="5403644198645076998">Разрешить доступ только к определенным сайтам</translation>
 <translation id="5414836363063783498">Проверка…</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Неизвестно</translation>
 <translation id="5833397272224757657">Использовать для персонализации информацию с посещенных вами сайтов и данные о действиях в браузере</translation>
 <translation id="5833984609253377421">Отправить ссылку</translation>
+<translation id="584427517463557805">Выбрана вкладка инкогнито</translation>
 <translation id="5854790677617711513">Сохраненные более 30 дней назад</translation>
 <translation id="5858741533101922242">Не удалось включить адаптер Bluetooth</translation>
 <translation id="5860033963881614850">Выкл.</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Изменение главной страницы</translation>
 <translation id="60923314841986378">Осталось <ph name="HOURS" /> ч.</translation>
 <translation id="60924377787140961">Другие статьи скоро появятся. Хорошего дня!</translation>
+<translation id="6099151465289169210">Переключено на вкладки инкогнито</translation>
 <translation id="6108923351542677676">Настройка…</translation>
 <translation id="6111020039983847643">использовано</translation>
 <translation id="6112702117600201073">Обновление страницы</translation>
@@ -635,7 +649,7 @@
 <translation id="618555311922999635">Панель навигации открыта полностью</translation>
 <translation id="6192333916571137726">Скачивание файла</translation>
 <translation id="6192792657125177640">Исключения</translation>
-<translation id="6206551242102657620">Подключение защищено. Информация о сайте.</translation>
+<translation id="6206551242102657620">Подключение защищено. Информация о сайте</translation>
 <translation id="6210748933810148297">Не <ph name="EMAIL" />?</translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" />: параметры</translation>
 <translation id="6221633008163990886">Чтобы экспортировать пароли, разблокируйте экран</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Вибросигнал</translation>
 <translation id="6324034347079777476">Синхронизация системы Android отключена</translation>
 <translation id="6333140779060797560">Отправить с помощью <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Новая вкладка инкогнито</translation>
 <translation id="6337234675334993532">Шифрование</translation>
 <translation id="6341580099087024258">Спрашивать, куда сохранять файлы</translation>
 <translation id="6343192674172527289">Ничего не найдено</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Полная версия</translation>
 <translation id="6600954340915313787">Скопировано в Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> ГБ</translation>
+<translation id="6610147964972079463">Закрыть вкладки инкогнито</translation>
 <translation id="6612358246767739896">Защищенный контент</translation>
 <translation id="6627583120233659107">Изменить папку</translation>
 <translation id="6643016212128521049">Очистить</translation>
@@ -727,7 +743,7 @@
 <translation id="6914783257214138813">Ваши пароли будут видны всем, у кого есть доступ к файлу экспорта.</translation>
 <translation id="6942665639005891494">Вы можете в любой момент изменить расположение скачиваемых файлов по умолчанию, воспользовавшись меню "Настройки".</translation>
 <translation id="6945221475159498467">Выбрать</translation>
-<translation id="6963642900430330478">Эта страница представляет опасность. Информация о сайте.</translation>
+<translation id="6963642900430330478">Эта страница представляет опасность. Информация о сайте</translation>
 <translation id="6963766334940102469">Удалить закладки</translation>
 <translation id="6965382102122355670">ОК</translation>
 <translation id="6978479750597523876">Сбросить настройки перевода</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Вы выйдете из аккаунтов на большинстве сайтов, но останетесь в аккаунте Google.</translation>
 <translation id="7454641608352164238">Недостаточно места</translation>
 <translation id="7455923816558154057">Нажмите, чтобы посмотреть</translation>
+<translation id="7465104139234185284">Закрыть все вкладки инкогнито</translation>
 <translation id="7473891865547856676">Пропустить</translation>
 <translation id="7475192538862203634">Если эта проблема возникает часто, узнайте, <ph name="BEGIN_LINK" />как ее решить<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD-карта не найдена. Некоторые файлы могут отсутствовать.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Скачанные файлы: <ph name="GIGABYTES" /> ГБ</translation>
 <translation id="8249310407154411074">Переместить в начало</translation>
 <translation id="8250920743982581267">Документы</translation>
+<translation id="825412236959742607">Эта страница расходовала слишком много памяти, поэтому часть контента была удалена.</translation>
 <translation id="8260126382462817229">Снова войдите в аккаунт</translation>
 <translation id="8261506727792406068">Удалить</translation>
 <translation id="8266862848225348053">Расположение скачиваемых файлов</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Голосовой поиск</translation>
 <translation id="9071742570345586758">Чтобы просматривать контент в режиме виртуальной реальности, установите Google VR-сервисы</translation>
 <translation id="9074336505530349563">Чтобы мы могли рекомендовать вам интересный контент, войдите в аккаунт и включите синхронизацию.</translation>
+<translation id="9080642952018487277">Войти в режим инкогнито</translation>
 <translation id="9086455579313502267">Нет доступа к сети</translation>
 <translation id="9099018167121903954">Скачанные файлы: <ph name="KILOBYTES" /> КБ</translation>
 <translation id="9100505651305367705">Предлагать упрощенный просмотр статей, если он поддерживается</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 caf1d74..d92ec0a 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sk.xtb
@@ -649,7 +649,7 @@
 <translation id="618555311922999635">Navigačný panel bol otvorený na celú výšku</translation>
 <translation id="6192333916571137726">Sťahovanie súboru</translation>
 <translation id="6192792657125177640">Výnimky</translation>
-<translation id="6206551242102657620">Pripojenie je zabezpečné. Informácie o webe</translation>
+<translation id="6206551242102657620">Pripojenie je zabezpečené. Informácie o webe</translation>
 <translation id="6210748933810148297">Nie som <ph name="EMAIL" /></translation>
 <translation id="6216432067784365534"><ph name="NAME_OF_LIST_ITEM" /> – možnosti</translation>
 <translation id="6221633008163990886">Heslá budete môcť exportovať po odomknutí</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 9e09a03..8cb75fa 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sl.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Dodajanje <ph name="WEBAPK_NAME" /> ...</translation>
 <translation id="1041308826830691739">S spletnih mest</translation>
 <translation id="1049743911850919806">Način brez beleženja zgodovine</translation>
+<translation id="1054301162707478098">Uporabljate zasebni način.</translation>
 <translation id="10614374240317010">Nikoli shranjeno</translation>
 <translation id="1068672505746868501">Nikoli ne prevedi strani v jeziku <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Več jezikov</translation>
 <translation id="124678866338384709">Zapiranje trenutnega zavihka</translation>
 <translation id="1258753120186372309">Googlov priložnostni logotip: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Strani, ki si jih ogledate na zasebnih zavihkih, ne bodo pustile sledi v zgodovini brskalnika, shrambi piškotkov ali zgodovini iskanja, ko zaprete vse zasebne zavihke. Prenesene datoteke ali ustvarjeni zaznamki se bodo ohranili.
+
+Kljub temu niste nevidni. Če uporabljate zasebni način, ne skrijete brskanja pred delodajalcem, ponudnikom internetnih storitev ali spletnimi mesti, ki jih obiščete.</translation>
 <translation id="127138278192656016">Uporaba sinhronizacije in vseh storitev</translation>
 <translation id="1272079795634619415">Ustavi</translation>
 <translation id="1283039547216852943">Dotaknite se za razširitev</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Kontrol. za mesto v celo. načinu</translation>
 <translation id="2038563949887743358">Vklop možnosti »Zahteva za namizno spletno mesto«</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB drugih aplikacij</translation>
+<translation id="2055670718290744343">Pospeševalnik iskanja</translation>
 <translation id="2063713494490388661">Iskanje z dotikom</translation>
 <translation id="2079545284768500474">Razveljavi</translation>
 <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. rezultat od <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Sinhroniz. in Googlove storitve</translation>
 <translation id="2259659629660284697">Izvozi gesla …</translation>
 <translation id="2268044343513325586">Izboljšaj iskanje</translation>
+<translation id="2280910239864711607">Odpiranje novega zavihka v zasebnem načinu</translation>
 <translation id="2286841657746966508">Naslov za obračun storitev</translation>
 <translation id="230115972905494466">Ni združljivih naprav</translation>
 <translation id="2315043854645842844">Operacijski sistem ne podpira izbire potrdila pri odjemalcu.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Dovoli JavaScript za določeno spletno mesto.</translation>
 <translation id="2625189173221582860">Geslo kopirano</translation>
 <translation id="2631006050119455616">Prihranjeno</translation>
+<translation id="2633278372998075009">Zasebni zavihki</translation>
 <translation id="2647434099613338025">Dodaj jezik</translation>
 <translation id="2650751991977523696">Želite znova prenesti datoteko?</translation>
 <translation id="2653659639078652383">Pošlji</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Če ste pozabili geslo ali želite spremeniti to nastavitev, <ph name="BEGIN_LINK" />ponastavite sinhronizacijo<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Spletna aplikacija</translation>
+<translation id="3234355010754616171">Novi zasebni zavihek</translation>
 <translation id="3236059992281584593">Še 1 min</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Zaznamujte to stran</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Zapri vse zavihke brez beleženja zgodovine</translation>
 <translation id="3365671512111106261">Ni na voljo, ko je vklopljeno varčevanje s podatki</translation>
 <translation id="3367813778245106622">Prijavite se znova, če želite začeti sinhronizacijo</translation>
+<translation id="3377025655491224618">Zasebni zavihek</translation>
 <translation id="3384347053049321195">Skupna raba slike</translation>
 <translation id="3386292677130313581">Poziv, preden se spletnim mestom razkrije vaša lokacija (priporočeno)</translation>
 <translation id="3387650086002190359">Prenos datoteke <ph name="FILE_NAME" /> ni uspel zaradi napak v datotečnem sistemu.</translation>
@@ -316,7 +325,7 @@
 <translation id="360207483134687714">Pomagajte izboljšati uporabo navidezne resničnosti v Chromu</translation>
 <translation id="3616113530831147358">Zvok</translation>
 <translation id="3620176948598597475">Ponastavitev izbriše zgodovino varčevanja s podatki, vključno s seznamom obiskanih spletnih mest.</translation>
-<translation id="3630011985153972676">Omogočanje Chromu, da prenese članke, ko je v nastavitvah omogočeno omrežje Wi-Fi.</translation>
+<translation id="3630011985153972676">Omogočite Chromu, da prenese članke, ko je v nastavitvah omogočeno omrežje Wi-Fi.</translation>
 <translation id="3632295766818638029">Razkritje gesla</translation>
 <translation id="363596933471559332">Samodejna prijava v spletna mesta s shranjenimi poverilnicami. Ko je ta funkcija izklopljena, bo pri vsaki prijavi v spletno mesto potrebno preverjanje.</translation>
 <translation id="3661699943263275414">Druga spletna mesta lahko shranjujejo in berejo podatke piškotkov</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Če želite prejemati prilagojeno vsebino, ki jo predlaga Google, vklopite sinhronizacijo</translation>
 <translation id="4226663524361240545">Ob prejemanju obvestil naprava morda vibrira</translation>
 <translation id="4242533952199664413">Odpri nastavitve</translation>
+<translation id="4243710787042215766">Odpri v zasebnem zavihku</translation>
 <translation id="424864128008805179">Se želite odjaviti iz Chroma?</translation>
 <translation id="4256782883801055595">Odprtokodne licence</translation>
 <translation id="4259722352634471385">Krmarjenje je blokirano: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Vzpostavljanje tunela prek strežnika proxy ni uspelo</translation>
 <translation id="4881695831933465202">Odpri</translation>
 <translation id="488187801263602086">Preimenovanje datoteke</translation>
+<translation id="4883379392681899581">Zapustitev zasebnega načina</translation>
 <translation id="4885273946141277891">To število primerkov Chroma ni podprto.</translation>
 <translation id="4910889077668685004">Aplikacije za plačevanje</translation>
 <translation id="4913161338056004800">Ponastavitev statističnih podatkov</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Z videoposnetkom</translation>
 <translation id="5233638681132016545">Nov zavihek</translation>
 <translation id="5240817131241497236">Nastavitve, ki nadzirajo sinhronizacijo, prilagajanje in druge Googlove storitve v Chromu, so se spremenile. To lahko vpliva na vaše trenutne nastavitve.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Nastavitve<ph name="END_LINK1" /> je mogoče kadar koli prilagoditi. Google lahko vsebino na spletnih mestih, ki jih obiščete, vključno z dejavnostjo v brskalniku in uporabo brskalnika, uporabi za prilagajanje Chroma in drugih Googlovih storitev, kot so Prevajalnik, Iskanje Google in oglasi.</translation>
 <translation id="5271967389191913893">Naprava ne more odpreti vsebine za prenos.</translation>
 <translation id="528192093759286357">Povlecite z vrha in se dotaknite gumba za nazaj, če želite zapreti celozaslonski način.</translation>
 <translation id="5284584623296338184">Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev ne bodo več sinhronizirane z Google Računom. Obstoječi podatki bodo še naprej shranjeni v Google Računu.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Neznano</translation>
 <translation id="5833397272224757657">Uporablja vsebino na spletnih mestih, ki jih obiščete, ter dejavnost v brskalniku in interakcijo zaradi prilagajanja</translation>
 <translation id="5833984609253377421">Deli povezavo z drugimi</translation>
+<translation id="584427517463557805">Izbran zasebni zavihek</translation>
 <translation id="5854790677617711513">Starejše od 30 dni</translation>
 <translation id="5858741533101922242">Chrome ne more vklopiti vmesnika za Bluetooth</translation>
 <translation id="5860033963881614850">Izklopljeno</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Urejanje domače strani</translation>
 <translation id="60923314841986378">Še <ph name="HOURS" /> h</translation>
 <translation id="60924377787140961">Kmalu bo prikazanih več člankov. Prijetno popoldne.</translation>
+<translation id="6099151465289169210">Preklopili ste na zasebne zavihke</translation>
 <translation id="6108923351542677676">Poteka nastavitev …</translation>
 <translation id="6111020039983847643">količina prenesenih podatkov</translation>
 <translation id="6112702117600201073">Osveževanje strani</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibriranje</translation>
 <translation id="6324034347079777476">Sinhronizacija sistema Android je onemogočena.</translation>
 <translation id="6333140779060797560">Skupna raba prek: <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Novi zasebni zavihek</translation>
 <translation id="6337234675334993532">Šifriranje</translation>
 <translation id="6341580099087024258">Vprašaj, kje shraniti datoteke</translation>
 <translation id="6343192674172527289">Ni prenosov</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Spletno mesto za namizne računalnike</translation>
 <translation id="6600954340915313787">Kopirano v Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Zapri zasebne zavihke</translation>
 <translation id="6612358246767739896">Zaščitena vsebina</translation>
 <translation id="6627583120233659107">Uredi mapo</translation>
 <translation id="6643016212128521049">Počisti</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Odjavi vas iz večine spletnih mest, vendar ne iz Google Računa.</translation>
 <translation id="7454641608352164238">Ni dovolj prostora</translation>
 <translation id="7455923816558154057">Dotaknite se za ogled</translation>
+<translation id="7465104139234185284">Zapri vse zasebne zavihke</translation>
 <translation id="7473891865547856676">Ne, hvala</translation>
 <translation id="7475192538862203634">Če se to pogosto pokaže, poskusite te <ph name="BEGIN_LINK" />predloge<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Kartice SD ni bilo mogoče najti. Nekatere vaše datoteke morda manjkajo.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB prenesenih datotek</translation>
 <translation id="8249310407154411074">Na vrh</translation>
 <translation id="8250920743982581267">Dokumenti</translation>
+<translation id="825412236959742607">Ta stran uporablja preveč pomnilnika, zato je Chrome odstranil nekaj vsebine.</translation>
 <translation id="8260126382462817229">Poskusite se znova prijaviti.</translation>
 <translation id="8261506727792406068">Izbriši</translation>
 <translation id="8266862848225348053">Mesto za prenos</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Začni glasovno iskanje</translation>
 <translation id="9071742570345586758">Če si želite ogledati vsebino v navidezni resničnosti, namestite Googlove storitve za navidezno resničnost</translation>
 <translation id="9074336505530349563">Če želite prejemati prilagojeno vsebino, ki jo predlaga Google, se prijavite in vklopite sinhronizacijo</translation>
+<translation id="9080642952018487277">Vklop zasebnega načina</translation>
 <translation id="9086455579313502267">Dostop do omrežja ni mogoč</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> KB prenesenih datotek</translation>
 <translation id="9100505651305367705">Možnost prikaza člankov v preprostem pogledu, če je podprt</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 0a75730c..c9d53e9 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sr.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Додаје се <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">Са веб-сајтова</translation>
 <translation id="1049743911850919806">Без архивирања</translation>
+<translation id="1054301162707478098">Прешли сте на приватни режим.</translation>
 <translation id="10614374240317010">Никада се не чува</translation>
 <translation id="1068672505746868501">Никад не преводи странице на језику <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Још језика</translation>
 <translation id="124678866338384709">Затварање актуелне картице</translation>
 <translation id="1258753120186372309">Google дудл логотип: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Странице које прегледате на приватним картицама се неће задржавати у историји прегледача, складишту колачића или историји претраге када затворите све приватне картице. Сачуваћемо све преузете датотеке или направљене обележиваче.
+
+          Међутим, нисте невидљиви. Прелазак на приватни режим не сакрива оно што прегледате од послодавца, добављача интернет услуге или веб-сајтова које посећујете.</translation>
 <translation id="127138278192656016">Користите синхронизацију и све услуге</translation>
 <translation id="1272079795634619415">Заустави</translation>
 <translation id="1283039547216852943">Додирните да бисте проширили</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Контроле сајта на целом екрану</translation>
 <translation id="2038563949887743358">Укључи захтевање верзије сајта за рачунаре</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB – друге апликације</translation>
+<translation id="2055670718290744343">Убрзано претраживање</translation>
 <translation id="2063713494490388661">Додирните за претрагу</translation>
 <translation id="2079545284768500474">Опозови</translation>
 <translation id="2082238445998314030"><ph name="RESULT_NUMBER" />. од <ph name="TOTAL_RESULTS" /> резултата</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Синхронизација и Google услуге</translation>
 <translation id="2259659629660284697">Извези лозинке…</translation>
 <translation id="2268044343513325586">Прецизирај</translation>
+<translation id="2280910239864711607">Отворите нову картицу у приватном режиму</translation>
 <translation id="2286841657746966508">Адреса за наплату</translation>
 <translation id="230115972905494466">Није пронађен ниједан компатибилан уређај</translation>
 <translation id="2315043854645842844">Оперативни систем не подржава избор сертификата за клијента.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Дозволите JavaScript за одређени сајт.</translation>
 <translation id="2625189173221582860">Лозинка је копирана</translation>
 <translation id="2631006050119455616">Сачувано</translation>
+<translation id="2633278372998075009">Приватне картице</translation>
 <translation id="2647434099613338025">Додај језик</translation>
 <translation id="2650751991977523696">Преузимате датотеку поново?</translation>
 <translation id="2653659639078652383">Пошаљи</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Ако сте заборавили приступну фразу или желите да промените ово подешавање, <ph name="BEGIN_LINK" />ресетујте синхронизацију<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Микрофон</translation>
 <translation id="3232754137068452469">Веб-апликација</translation>
+<translation id="3234355010754616171">Нова приватна картица</translation>
 <translation id="3236059992281584593">Још 1 мин</translation>
 <translation id="3244271242291266297">ММ</translation>
 <translation id="3254409185687681395">Обележите ову страницу</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Затвори све картице без архивирања</translation>
 <translation id="3365671512111106261">Није доступно када је Уштеда података укључена</translation>
 <translation id="3367813778245106622">Пријавите се поново да бисте започели синхронизацију</translation>
+<translation id="3377025655491224618">Приватна картица</translation>
 <translation id="3384347053049321195">Дели слику</translation>
 <translation id="3386292677130313581">Питај пре него што дозволиш сајтовима да знају локацију (препоручено)</translation>
 <translation id="3387650086002190359">Преузимање датотеке <ph name="FILE_NAME" /> није успело због грешака система датотека.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Да бисте добијали персонализовани садржај који предлаже Google, укључите синхронизацију</translation>
 <translation id="4226663524361240545">Уређај ће вибрирати када примате обавештења</translation>
 <translation id="4242533952199664413">Отвори подешавања</translation>
+<translation id="4243710787042215766">Отвори на приватној картици</translation>
 <translation id="424864128008805179">Желите ли да се одјавите из Chrome-а?</translation>
 <translation id="4256782883801055595">Лиценце отвореног кода</translation>
 <translation id="4259722352634471385">Навигација је блокирана: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Успостављање тунела преко прокси сервера није успело</translation>
 <translation id="4881695831933465202">Отвори</translation>
 <translation id="488187801263602086">Преименујте датотеку</translation>
+<translation id="4883379392681899581">Изађи из приватног режима</translation>
 <translation id="4885273946141277891">Неподржан број Chrome инстанци.</translation>
 <translation id="4910889077668685004">Апликације за плаћање</translation>
 <translation id="4913161338056004800">Ресетуј статистику</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Са видеом</translation>
 <translation id="5233638681132016545">Нова картица</translation>
 <translation id="5240817131241497236">Променила су се подешавања која контролишу синхронизацију, персонализацију и друге Google услуге у Chrome-у. То може да утиче на тренутна подешавања.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Подешавања<ph name="END_LINK1" /> увек можете да прилагодите. Google може да користи садржај на сајтовима које посећујете, као и активности у прегледачима и интеракције са њима да би персонализовао Chrome и друге Google услуге као што су Преводилац, Претрага и огласи.</translation>
 <translation id="5271967389191913893">Уређај не може да отвори садржај за преузимање.</translation>
 <translation id="528192093759286357">Превуците од врха екрана и додирните дугме Назад да бисте изашли из режима целог екрана.</translation>
 <translation id="5284584623296338184">Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће остати сачувани на Google налогу.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Непознато</translation>
 <translation id="5833397272224757657">Користи садржај на сајтовима које посећујете, као и активности и интеракције у прегледачу ради персонализације</translation>
 <translation id="5833984609253377421">Дели линк</translation>
+<translation id="584427517463557805">Изабрана приватна картица</translation>
 <translation id="5854790677617711513">Старије од 30 дана</translation>
 <translation id="5858741533101922242">Chrome не може да укључи Bluetooth адаптер</translation>
 <translation id="5860033963881614850">Искључено</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Измените почетну страницу</translation>
 <translation id="60923314841986378">Још <ph name="HOURS" /> сата/и</translation>
 <translation id="60924377787140961">Још чланака ће се појавити ускоро. Желимо вам пријатно поподне!</translation>
+<translation id="6099151465289169210">Прешли сте на приватне картице</translation>
 <translation id="6108923351542677676">Подешавање је у току...</translation>
 <translation id="6111020039983847643">искоришћени подаци</translation>
 <translation id="6112702117600201073">Освежавање странице</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Вибрација</translation>
 <translation id="6324034347079777476">Синхронизација Android система је онемогућена</translation>
 <translation id="6333140779060797560">Дељење преко <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Нова приватна картица</translation>
 <translation id="6337234675334993532">Шифровање</translation>
 <translation id="6341580099087024258">Питај где да сачуваш датотеке</translation>
 <translation id="6343192674172527289">Нису пронађена преузимања</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Верзија сајта за рачунар</translation>
 <translation id="6600954340915313787">Копирана у Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Затвори приватне картице</translation>
 <translation id="6612358246767739896">Заштићени садржај</translation>
 <translation id="6627583120233659107">Измени директоријум</translation>
 <translation id="6643016212128521049">Обриши</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Одјавиће вас са већине сајтова. Неће вас одјавити са Google налога.</translation>
 <translation id="7454641608352164238">Нема довољно простора</translation>
 <translation id="7455923816558154057">Додирните да бисте прегледали</translation>
+<translation id="7465104139234185284">Затвори све приватне картице</translation>
 <translation id="7473891865547856676">Не, хвала</translation>
 <translation id="7475192538862203634">Ако вам се ово често приказује, испробајте ове <ph name="BEGIN_LINK" />предлоге<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">SD картица није пронађена. Неке датотеке можда недостају.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Преузели сте <ph name="GIGABYTES" /> GB</translation>
 <translation id="8249310407154411074">Премести на врх</translation>
 <translation id="8250920743982581267">Документи</translation>
+<translation id="825412236959742607">Ова страница користи превише меморије, па је Chrome уклонио одређени садржај.</translation>
 <translation id="8260126382462817229">Пробајте поново да се пријавите</translation>
 <translation id="8261506727792406068">Избриши</translation>
 <translation id="8266862848225348053">Локација за преузимање</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Започни гласовну претрагу</translation>
 <translation id="9071742570345586758">Да бисте прегледали садржај виртуелне реалности, инсталирајте Google услуге виртуелне реалности</translation>
 <translation id="9074336505530349563">Да бисте добијали персонализовани садржај који предлаже Google, пријавите се и укључите синхронизацију</translation>
+<translation id="9080642952018487277">Уђи у приватни режим</translation>
 <translation id="9086455579313502267">Не можемо да приступимо мрежи</translation>
 <translation id="9099018167121903954">Преузели сте <ph name="KILOBYTES" /> kB</translation>
 <translation id="9100505651305367705">Понуди приказивање чланака у поједностављеном приказу када је то подржано</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 c2c58d63..6a38725 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sv.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Lägger till <ph name="WEBAPK_NAME" /> …</translation>
 <translation id="1041308826830691739">Från webbplatser</translation>
 <translation id="1049743911850919806">Inkognito</translation>
+<translation id="1054301162707478098">Du surfar privat.</translation>
 <translation id="10614374240317010">Aldrig sparad</translation>
 <translation id="1068672505746868501">Översätt aldrig sidor på <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Fler språk</translation>
 <translation id="124678866338384709">Stäng den aktuella fliken</translation>
 <translation id="1258753120186372309">Googles doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Sidor du öppnar på en privat flik sparas inte i webbläsarhistoriken och lagras inte bland cookies eller i sökhistoriken när du har stängt alla privata flikar. Däremot sparas alla filer du laddar ned och bokmärken du skapar.
+
+Du är dock inte osynlig. Även om du surfar privat kan din arbetsgivare, din internetleverantör eller de webbplatser du besöker se din aktivitet.</translation>
 <translation id="127138278192656016">Använd synkronisering och alla tjänster</translation>
 <translation id="1272079795634619415">Stopp</translation>
 <translation id="1283039547216852943">Tryck och utöka</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Helskärmskontroller på webbsidan</translation>
 <translation id="2038563949887743358">Aktivera begäran av skrivbordsversion</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB används av övriga appar</translation>
+<translation id="2055670718290744343">Sökaccelerator</translation>
 <translation id="2063713494490388661">Tryck för att söka</translation>
 <translation id="2079545284768500474">Ångra</translation>
 <translation id="2082238445998314030">Resultat <ph name="RESULT_NUMBER" /> av <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Synk och Googles tjänster</translation>
 <translation id="2259659629660284697">Exportera lösenord …</translation>
 <translation id="2268044343513325586">Finjustera</translation>
+<translation id="2280910239864711607">Öppna en ny flik i privat läge</translation>
 <translation id="2286841657746966508">Faktureringsadress</translation>
 <translation id="230115972905494466">Inga kompatibla enheter hittades</translation>
 <translation id="2315043854645842844">Val av certifikat på klienten stöds inte av operativsystemet.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Tillåt Javascript på en specifik webbplats.</translation>
 <translation id="2625189173221582860">Lösenordet har kopierats</translation>
 <translation id="2631006050119455616">Sparat</translation>
+<translation id="2633278372998075009">Privata flikar</translation>
 <translation id="2647434099613338025">Lägg till språk</translation>
 <translation id="2650751991977523696">Vill du ladda ned filen igen?</translation>
 <translation id="2653659639078652383">Skicka</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Om du har glömt lösenfrasen eller vill ändra inställningen <ph name="BEGIN_LINK" />återställer du synkroniseringen<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Webbapp</translation>
+<translation id="3234355010754616171">Ny privat flik</translation>
 <translation id="3236059992281584593">1 minut kvar</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Bokmärk sidan</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Stäng alla inkognitoflikar</translation>
 <translation id="3365671512111106261">Inte tillgängligt när Databesparing är aktiverat</translation>
 <translation id="3367813778245106622">Logga in igen om du vill påbörja synkroniseringen</translation>
+<translation id="3377025655491224618">Privat flik</translation>
 <translation id="3384347053049321195">Dela bild</translation>
 <translation id="3386292677130313581">Fråga innan webbplatser tillåts att veta var du befinner dig (rekommenderas)</translation>
 <translation id="3387650086002190359">Det gick inte att ladda ned <ph name="FILE_NAME" /> på grund av filsystemfel.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Aktivera synkronisering om du vill få förslag på anpassat innehåll från Google</translation>
 <translation id="4226663524361240545">Aviseringar kan göra att enheten vibrerar</translation>
 <translation id="4242533952199664413">Öppna Inställningar</translation>
+<translation id="4243710787042215766">Öppna på privat flik</translation>
 <translation id="424864128008805179">Vill du logga ut från Chrome?</translation>
 <translation id="4256782883801055595">Licenser för öppen källkod</translation>
 <translation id="4259722352634471385">Webbadressen har blockerats: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Det gick inte att upprätta en tunnel via proxyserver</translation>
 <translation id="4881695831933465202">Öppna</translation>
 <translation id="488187801263602086">Byt namn på fil</translation>
+<translation id="4883379392681899581">Inaktivera privat läge</translation>
 <translation id="4885273946141277891">Fler Chrome-förekomster än det finns stöd för.</translation>
 <translation id="4910889077668685004">Betalningsappar</translation>
 <translation id="4913161338056004800">Återställ statistik</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Med video</translation>
 <translation id="5233638681132016545">Ny flik</translation>
 <translation id="5240817131241497236">Inställningarna som styr synkronisering, anpassning och andra tjänster från Google i Chrome har ändrats. Detta kan påverka dina nuvarande inställningar.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Inställningarna<ph name="END_LINK1" /> kan anpassas när som helst. Google kan anpassa Chrome och andra tjänster från Google som Översätt, Sök och annonser utifrån innehållet på webbplatser du besöker samt aktivitet i och interaktion med webbläsaren.</translation>
 <translation id="5271967389191913893">Innehållet som skulle laddas ned gick inte att öppna på enheten.</translation>
 <translation id="528192093759286357">Dra uppifrån och tryck på bakåtknappen för att lämna helskärmsläget.</translation>
 <translation id="5284584623296338184">Ändringar i bokmärken, historik, lösenord och andra inställningar synkroniseras inte längre med ditt Google-konto. Befintlig data fortsätter dock att lagras i Google-kontot.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Okänd</translation>
 <translation id="5833397272224757657">Använder innehåll på webbplatser du besöker, samt aktivitet i och interaktion med webbläsaren, i anpassningssyfte</translation>
 <translation id="5833984609253377421">Dela länk</translation>
+<translation id="584427517463557805">Vald privat flik</translation>
 <translation id="5854790677617711513">Äldre än 30 dagar</translation>
 <translation id="5858741533101922242">Det gick inte att aktivera Bluetooth-adaptern i Chrome</translation>
 <translation id="5860033963881614850">Av</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Redigera startsidan</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> timmar kvar</translation>
 <translation id="60924377787140961">Fler artiklar visas snart. Ha en bra eftermiddag!</translation>
+<translation id="6099151465289169210">Du har bytt till privata flikar</translation>
 <translation id="6108923351542677676">Konfigurationen pågår ...</translation>
 <translation id="6111020039983847643">Använd data</translation>
 <translation id="6112702117600201073">Uppdaterar sidan</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Vibration</translation>
 <translation id="6324034347079777476">Synkronisering av Android-system har inaktiverats</translation>
 <translation id="6333140779060797560">Dela via <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Ny privat flik</translation>
 <translation id="6337234675334993532">Kryptering</translation>
 <translation id="6341580099087024258">Fråga var filerna ska sparas</translation>
 <translation id="6343192674172527289">Inga nedladdningar hittades</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Datoranpassad webbplats</translation>
 <translation id="6600954340915313787">Kopierat till Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Stäng privata flikar</translation>
 <translation id="6612358246767739896">Skyddat innehåll</translation>
 <translation id="6627583120233659107">Redigera mapp</translation>
 <translation id="6643016212128521049">Rensa</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Du loggas ut från de flesta webbplatser. Du loggas inte ut från Google-kontot.</translation>
 <translation id="7454641608352164238">Utrymmet räcker inte</translation>
 <translation id="7455923816558154057">Visa genom att trycka här</translation>
+<translation id="7465104139234185284">Stäng alla privata flikar</translation>
 <translation id="7473891865547856676">Nej tack</translation>
 <translation id="7475192538862203634">Om du ser detta ofta provar du de här <ph name="BEGIN_LINK" />förslagen<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Det gick inte att hitta SD-kortet. Det kan saknas filer.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB används av nedladdningar</translation>
 <translation id="8249310407154411074">Flytta högst upp</translation>
 <translation id="8250920743982581267">Dokument</translation>
+<translation id="825412236959742607">Den här sidan använder för mycket minne, så en del innehåll har tagits bort.</translation>
 <translation id="8260126382462817229">Försök att logga in igen</translation>
 <translation id="8261506727792406068">Radera</translation>
 <translation id="8266862848225348053">Nedladdningsplats</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Starta röstsökning</translation>
 <translation id="9071742570345586758">Installera Googles VR-tjänster om du vill visa innehåll med virtuell verklighet</translation>
 <translation id="9074336505530349563">Logga in och aktivera synkronisering om du vill få förslag på anpassat innehåll från Google</translation>
+<translation id="9080642952018487277">Aktivera privat läge</translation>
 <translation id="9086455579313502267">Det går inte att ansluta till nätverket</translation>
 <translation id="9099018167121903954"><ph name="KILOBYTES" /> kB används av nedladdningar</translation>
 <translation id="9100505651305367705">Fråga om artiklarna ska visas i en förenklad vy när detta stöds</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 590c3374..fabebd8 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_sw.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Inaongeza <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">Kutoka kwenye tovuti</translation>
 <translation id="1049743911850919806">Kichupo fiche</translation>
+<translation id="1054301162707478098">Unatumia hali ya faragha.</translation>
 <translation id="10614374240317010">Haijahifadhiwa kamwe</translation>
 <translation id="1068672505746868501">Usiwahi kutafsiri kurasa katika lugha ya <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Lugha zaidi</translation>
 <translation id="124678866338384709">Funga kichupo kilichofunguka</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Kurasa unazoziangalia katika vichupo vya faragha hazitahifadhiwa katika historia ya kivinjari, hifadhi ya vidakuzi au historia ya mambo uliyotafuta, ukishafunga vichupo vyako vyote vya faragha. Faili zozote unazopakua au alamisho unazounda hazitafutwa.
+
+Hata hivyo, hautaficha kila kitu. Hatua ya kutumia hali ya faragha haifichi kuvinjari kwako kusionekane kwa mwajiri, mtoa huduma za intaneti au tovuti unazotembelea.</translation>
 <translation id="127138278192656016">Tumia kipengele cha usawazishaji na huduma zote</translation>
 <translation id="1272079795634619415">Simamisha</translation>
 <translation id="1283039547216852943">Gusa ili upanue</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Vidhibiti vya tovuti vya skrini nzima</translation>
 <translation id="2038563949887743358">Washa Omba Tovuti ya Eneo-kazi</translation>
 <translation id="2045104531052923016">Programu nyingine za GB <ph name="GIGABYTES" /></translation>
+<translation id="2055670718290744343">Kiakibishaji cha Kutafuta</translation>
 <translation id="2063713494490388661">Gusa ili Utafute</translation>
 <translation id="2079545284768500474">Tendua</translation>
 <translation id="2082238445998314030">Tokeo <ph name="RESULT_NUMBER" /> kati ya <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Huduma za Google na usawazishaji</translation>
 <translation id="2259659629660284697">Hamisha manenosiri…</translation>
 <translation id="2268044343513325586">Chuja</translation>
+<translation id="2280910239864711607">Fungua kichupo kipya katika Hali ya Faragha</translation>
 <translation id="2286841657746966508">Anwani ya kutoza</translation>
 <translation id="230115972905494466">Haikupata vifaa vyovyote vinavyooana</translation>
 <translation id="2315043854645842844">Uchaguzi wa cheti cha sehemu ya seva teja hautumiwi na mfumo wa uendeshaji.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Ruhusu JavaScript ya tovuti mahususi.</translation>
 <translation id="2625189173221582860">Nenosiri limenakiliwa</translation>
 <translation id="2631006050119455616">Iliyookolewa</translation>
+<translation id="2633278372998075009">Vichupo vya faragha</translation>
 <translation id="2647434099613338025">Ongeza lugha</translation>
 <translation id="2650751991977523696">Ungependa kupakua faili tena?</translation>
 <translation id="2653659639078652383">Wasilisha</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Ikiwa umesahau kauli yako ya siri au ungependa kubadilisha mipangilio hii, <ph name="BEGIN_LINK" />fanya usawazishaji upya<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Maikrofoni</translation>
 <translation id="3232754137068452469">Programu ya Wavuti</translation>
+<translation id="3234355010754616171">Kichupo kipya cha faragha</translation>
 <translation id="3236059992281584593">Imesalia dakika 1</translation>
 <translation id="3244271242291266297">MW</translation>
 <translation id="3254409185687681395">Alamisha ukurasa huu</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Funga vichupo vyote fiche</translation>
 <translation id="3365671512111106261">Haipatikani Kiokoa Data kinapowashwa</translation>
 <translation id="3367813778245106622">Ingia tena katika akaunti ili uanze kusawazisha</translation>
+<translation id="3377025655491224618">Kichupo cha Faragha</translation>
 <translation id="3384347053049321195">Shiriki picha</translation>
 <translation id="3386292677130313581">Uliza kabla ya kuruhusu tovuti zijue mahali ulipo (inapendekezwa)</translation>
 <translation id="3387650086002190359">Kipakuliwa cha <ph name="FILE_NAME" /> hakijafaulu kwa sababu ya hitilafu za mfumo wa faili.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Washa kipengele cha usawazishaji ili Google ikupendekezee maudhui yanayokufaa</translation>
 <translation id="4226663524361240545">Arifa huenda zitatetemesha kifaa</translation>
 <translation id="4242533952199664413">Fungua mipangilio</translation>
+<translation id="4243710787042215766">Fungua katika kichupo cha faragha</translation>
 <translation id="424864128008805179">Ungependa kuondoka kwenye Chrome?</translation>
 <translation id="4256782883801055595">Leseni za programu huria</translation>
 <translation id="4259722352634471385">Kudurusu kumezuiwa: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Imeshindwa kuanzisha mkondo kupitia seva mbadala</translation>
 <translation id="4881695831933465202">Fungua</translation>
 <translation id="488187801263602086">Badilisha jina la faili</translation>
+<translation id="4883379392681899581">Funga hali ya faragha</translation>
 <translation id="4885273946141277891">Idadi ya matukio ya Chrome isiyoweza kutumika.</translation>
 <translation id="4910889077668685004">Programu za malipo</translation>
 <translation id="4913161338056004800">Weka takwimu upya</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Ina video</translation>
 <translation id="5233638681132016545">Kichupo kipya</translation>
 <translation id="5240817131241497236">Mipangilio inayodhibiti usawazishaji, mapendeleo na huduma nyingine za Google katika Chrome imebadilishwa. Huenda hali hii ikaathiri mipangilio yako ya sasa.</translation>
+<translation id="5264003212305142034">Inaweza kuweka mapendeleo ya <ph name="BEGIN_LINK1" />Mipangilio<ph name="END_LINK1" /> wakati wowote. Huenda Google ikatumia maudhui yaliyo kwenye tovuti unazotembelea, pamoja na shughuli za kuvinjari, ili kuweka mapendeleo kwenye Chrome na huduma nyingine za Google kama vile Tafsiri, Tafuta na matangazo.</translation>
 <translation id="5271967389191913893">Kifaa hakiwezi kufungua maudhui yanayopaswa kupakuliwa.</translation>
 <translation id="528192093759286357">Buruta kutoka juu na uguse kitufe cha kurudi nyuma ili uondoke kwenye skrini nzima.</translation>
 <translation id="5284584623296338184">Mabadiliko kwenye alamisho, historia, manenosiri na mipangilio yako mingine haitasawazishwa tena kwenye Akaunti yako ya Google. Hata hivyo, data yako iliyopo itaendelea kuhifadhiwa katika akaunti yako ya Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Haijulikani</translation>
 <translation id="5833397272224757657">Hutumia maudhui kwenye tovuti unazotembelea pamoja na shughuli na vitendo vya kivinjari ili kuweka mapendeleo</translation>
 <translation id="5833984609253377421">Shiriki kiungo</translation>
+<translation id="584427517463557805">Kichupo cha Faragha Kilichochaguliwa</translation>
 <translation id="5854790677617711513">Iliyohifadhiwa kwa zaidi ya siku 30</translation>
 <translation id="5858741533101922242">Chrome imeshindwa kuwasha adapta ya Bluetooth</translation>
 <translation id="5860033963881614850">Kimezimwa</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Badilisha ukurasa wa mwanzo</translation>
 <translation id="60923314841986378">Zimesalia saa <ph name="HOURS" /></translation>
 <translation id="60924377787140961">Makala zaidi yataonekena hivi karibuni. Alasiri njema!</translation>
+<translation id="6099151465289169210">Unatumia vichupo vya faragha</translation>
 <translation id="6108923351542677676">Usanidi unaendelea...</translation>
 <translation id="6111020039983847643">data iliyotumiwa</translation>
 <translation id="6112702117600201073">Inaonyesha upya ukurasa</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Tetema</translation>
 <translation id="6324034347079777476">Kipengele cha usawazishaji wa mfumo wa Android kimezimwa</translation>
 <translation id="6333140779060797560">Shiriki kupitia <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Kichupo kipya cha faragha</translation>
 <translation id="6337234675334993532">Usimbaji fiche</translation>
 <translation id="6341580099087024258">Iulize ambapo itahifadhi faili</translation>
 <translation id="6343192674172527289">Hakuna vipakuliwa vilivyopatikana</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Tovuti ya kompyuta ya mezani</translation>
 <translation id="6600954340915313787">Imenakiliwa kwenye Chrome</translation>
 <translation id="6608650720463149374">GB <ph name="GIGABYTES" /></translation>
+<translation id="6610147964972079463">Funga vichupo vya faragha</translation>
 <translation id="6612358246767739896">Maudhui yanayolindwa</translation>
 <translation id="6627583120233659107">Badilisha folda</translation>
 <translation id="6643016212128521049">Futa</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Hukuondoa kwenye akaunti za tovuti nyingi. Hutaondolewa kwenye Akaunti ya Google.</translation>
 <translation id="7454641608352164238">Nafasi haitoshi</translation>
 <translation id="7455923816558154057">Gusa ili uangalie</translation>
+<translation id="7465104139234185284">Funga vichupo vyote vya faragha</translation>
 <translation id="7473891865547856676">La Asante</translation>
 <translation id="7475192538862203634">Ikiwa unaona hili kila mara, jaribu <ph name="BEGIN_LINK" />mapendekezo<ph name="END_LINK" /> haya.</translation>
 <translation id="7475688122056506577">SD haikupatikana. Huenda baadhi ya faili zako zinazokosekana.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Imepakua GB <ph name="GIGABYTES" /></translation>
 <translation id="8249310407154411074">Sogeza juu</translation>
 <translation id="8250920743982581267">Hati</translation>
+<translation id="825412236959742607">Ukurasa huu unatumia hifadhi kubwa mno, hivyo basi Chrome imeondoa baadhi ya maudhui.</translation>
 <translation id="8260126382462817229">Jaribu kuingia katika akaunti tena</translation>
 <translation id="8261506727792406068">Futa</translation>
 <translation id="8266862848225348053">Sehemu ya kuweka vipakuliwa</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Anza kutafuta kwa kutamka</translation>
 <translation id="9071742570345586758">Sakinisha Huduma za Google VR ili uangalie maudhui ya uhalisi pepe</translation>
 <translation id="9074336505530349563">Ingia katika akaunti na uwashe kipengee cha usawazishaji ili upate maudhui yanayokufaa unayopendekezewa na Google</translation>
+<translation id="9080642952018487277">Fungua hali ya faragha</translation>
 <translation id="9086455579313502267">Haiwezi kufikia mtandao</translation>
 <translation id="9099018167121903954">Imepakua KB <ph name="KILOBYTES" /></translation>
 <translation id="9100505651305367705">Onyesha makala katika mwonekano rahisi, ikiwa yanatumika</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 3916fd22..a6f1276 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_th.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">กำลังเพิ่ม <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">จากเว็บไซต์</translation>
 <translation id="1049743911850919806">โหมดไม่ระบุตัวตน</translation>
+<translation id="1054301162707478098">คุณเข้าสู่โหมดส่วนตัวแล้ว</translation>
 <translation id="10614374240317010">ไม่เคยบันทึก</translation>
 <translation id="1068672505746868501">ไม่ต้องแปลหน้าเว็บภาษา<ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">ภาษาเพิ่มเติม</translation>
 <translation id="124678866338384709">ปิดแท็บปัจจุบัน</translation>
 <translation id="1258753120186372309">Google doodle: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">หน้าที่คุณดูในแท็บส่วนตัวจะไม่เก็บอยู่ในประวัติของเบราว์เซอร์ ที่จัดเก็บคุกกี้ หรือประวัติการค้นหาหลังจากที่คุณปิดแท็บส่วนตัวทั้งหมดแล้ว แต่จะมีการเก็บไฟล์ที่คุณดาวน์โหลดหรือบุ๊กมาร์กที่คุณสร้างไว้
+
+อย่างไรก็ตาม คนอื่นจะยังมองเห็นคุณ การเข้าสู่โหมดส่วนตัวไม่ได้เป็นการซ่อนการท่องเว็บจากนายจ้าง ผู้ให้บริการอินเทอร์เน็ต หรือเว็บไซต์ที่คุณเข้าชม</translation>
 <translation id="127138278192656016">ใช้การซิงค์และบริการทั้งหมด</translation>
 <translation id="1272079795634619415">หยุด</translation>
 <translation id="1283039547216852943">แตะเพื่อขยาย</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">ส่วนควบคุมเว็บไซต์แบบเต็มหน้าจอ</translation>
 <translation id="2038563949887743358">เปิดการขอเว็บไซต์เดสก์ท็อป</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB จากแอปอื่นๆ</translation>
+<translation id="2055670718290744343">ตัวเร่งการค้นหา</translation>
 <translation id="2063713494490388661">แตะเพื่อค้นหา</translation>
 <translation id="2079545284768500474">เลิกทำ</translation>
 <translation id="2082238445998314030">ผลลัพธ์ <ph name="RESULT_NUMBER" /> จาก <ph name="TOTAL_RESULTS" /> รายการ</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">การซิงค์และบริการของ Google</translation>
 <translation id="2259659629660284697">ส่งออกรหัสผ่าน…</translation>
 <translation id="2268044343513325586">ปรับแต่ง</translation>
+<translation id="2280910239864711607">เปิดแท็บใหม่ในโหมดส่วนตัว</translation>
 <translation id="2286841657746966508">ที่อยู่สำหรับเรียกเก็บเงิน</translation>
 <translation id="230115972905494466">ไม่พบอุปกรณ์ที่เข้ากันได้</translation>
 <translation id="2315043854645842844">ระบบปฏิบัติการไม่สนับสนุนการเลือกใบรับรองฝั่งลูกค้า</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">อนุญาต JavaScript สำหรับเว็บไซต์ใดเว็บไซต์หนึ่ง</translation>
 <translation id="2625189173221582860">คัดลอกรหัสผ่านแล้ว</translation>
 <translation id="2631006050119455616">ประหยัดได้</translation>
+<translation id="2633278372998075009">แท็บส่วนตัว</translation>
 <translation id="2647434099613338025">เพิ่มภาษา</translation>
 <translation id="2650751991977523696">ดาวน์โหลดไฟล์อีกครั้งไหม</translation>
 <translation id="2653659639078652383">ส่ง</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">หากคุณลืมรหัสผ่านหรือต้องการเปลี่ยนการตั้งค่านี้ ให้<ph name="BEGIN_LINK" />รีเซ็ตการซิงค์<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">ไมโครโฟน</translation>
 <translation id="3232754137068452469">เว็บแอป</translation>
+<translation id="3234355010754616171">แท็บส่วนตัวใหม่</translation>
 <translation id="3236059992281584593">เหลือ 1 นาที</translation>
 <translation id="3244271242291266297">ดด</translation>
 <translation id="3254409185687681395">บุ๊กมาร์กหน้านี้</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">ปิดแท็บไม่ระบุตัวตนทั้งหมด</translation>
 <translation id="3365671512111106261">ใช้งานไม่ได้เมื่อเปิดโปรแกรมประหยัดอินเทอร์เน็ต</translation>
 <translation id="3367813778245106622">ลงชื่อเข้าใช้อีกครั้งเพื่อเริ่มซิงค์</translation>
+<translation id="3377025655491224618">แท็บส่วนตัว</translation>
 <translation id="3384347053049321195">แชร์รูปภาพ</translation>
 <translation id="3386292677130313581">ถามก่อนจะอนุญาตให้เว็บไซต์ทราบตำแหน่งของคุณ (แนะนำ)</translation>
 <translation id="3387650086002190359">การดาวน์โหลด <ph name="FILE_NAME" /> ล้มเหลวเพราะเกิดข้อผิดพลาดกับระบบไฟล์</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">เปิดการซิงค์เพื่อรับคำแนะนำเนื้อหาที่ปรับเปลี่ยนในแบบของคุณจาก Google</translation>
 <translation id="4226663524361240545">การแจ้งเตือนอาจทำให้อุปกรณ์สั่น</translation>
 <translation id="4242533952199664413">เปิดการตั้งค่า</translation>
+<translation id="4243710787042215766">เปิดในแท็บส่วนตัว</translation>
 <translation id="424864128008805179">ต้องการออกจากระบบ Chrome ไหม</translation>
 <translation id="4256782883801055595">ใบอนุญาตโอเพนซอร์ส</translation>
 <translation id="4259722352634471385">มีการบล็อกการนำทาง: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">สร้างช่องทางผ่านพร็อกซีเซิร์ฟเวอร์ไม่ได้</translation>
 <translation id="4881695831933465202">เปิด</translation>
 <translation id="488187801263602086">เปลี่ยนชื่อไฟล์</translation>
+<translation id="4883379392681899581">ออกจากโหมดส่วนตัว</translation>
 <translation id="4885273946141277891">อินสแตนซ์ของ Chrome เกินจำนวนที่สนับสนุน</translation>
 <translation id="4910889077668685004">แอปชำระเงิน</translation>
 <translation id="4913161338056004800">รีเซ็ตสถิติ</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">มีวิดีโอ</translation>
 <translation id="5233638681132016545">แท็บใหม่</translation>
 <translation id="5240817131241497236">การตั้งค่าที่ควบคุมการซิงค์ การปรับเปลี่ยนในแบบของคุณ และบริการอื่นๆ ของ Google ใน Chrome มีการเปลี่ยนแปลง ซึ่งอาจส่งผลต่อการตั้งค่าปัจจุบันของคุณ</translation>
+<translation id="5264003212305142034">คุณปรับแต่ง<ph name="BEGIN_LINK1" />การตั้งค่า<ph name="END_LINK1" />ได้ทุกเมื่อ Google อาจใช้เนื้อหาในเว็บไซต์ที่คุณเข้าชม รวมถึงการโต้ตอบและกิจกรรมในเบราว์เซอร์เพื่อปรับ Chrome และบริการอื่นๆ ของ Google อย่างเช่น แปลภาษา, Search และโฆษณาให้เหมาะกับคุณ</translation>
 <translation id="5271967389191913893">อุปกรณ์ไม่สามารถเปิดเนื้อหาที่จะดาวน์โหลดได้</translation>
 <translation id="528192093759286357">ลากจากด้านบน แล้วแตะปุ่มกลับเพื่อออกจากโหมดเต็มหน้าจอ</translation>
 <translation id="5284584623296338184">การเปลี่ยนแปลงบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google ของคุณอีกต่อไป อย่างไรก็ตาม ข้อมูลที่คุณมีจะยังคงจัดเก็บอยู่ในบัญชี Google ของคุณ</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">ไม่รู้จัก</translation>
 <translation id="5833397272224757657">ใช้เนื้อหาในเว็บไซต์ที่คุณเข้าชม รวมถึงกิจกรรมและการโต้ตอบในเบราว์เซอร์เพื่อการปรับเปลี่ยนในแบบของคุณ</translation>
 <translation id="5833984609253377421">แชร์ลิงก์</translation>
+<translation id="584427517463557805">แท็บส่วนตัวที่เลือกไว้</translation>
 <translation id="5854790677617711513">เกิน 30 วัน</translation>
 <translation id="5858741533101922242">Chrome ไม่สามารถเปิดอะแดปเตอร์บลูทูธ</translation>
 <translation id="5860033963881614850">ปิด</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">แก้ไขหน้าแรก</translation>
 <translation id="60923314841986378">เหลือ <ph name="HOURS" /> ชั่วโมง</translation>
 <translation id="60924377787140961">บทความอื่นๆ จะปรากฏขึ้นในอีกไม่ช้า ขอให้เพลิดเพลินกับยามบ่าย</translation>
+<translation id="6099151465289169210">เปลี่ยนเป็นแท็บส่วนตัวแล้ว</translation>
 <translation id="6108923351542677676">กำลังดำเนินการตั้งค่า…</translation>
 <translation id="6111020039983847643">อินเทอร์เน็ตที่ใช้</translation>
 <translation id="6112702117600201073">กำลังรีเฟรชหน้า</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">สั่น</translation>
 <translation id="6324034347079777476">ปิดใช้การซิงค์ระบบ Android อยู่</translation>
 <translation id="6333140779060797560">แชร์ผ่าน <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">แท็บส่วนตัวใหม่</translation>
 <translation id="6337234675334993532">การเข้ารหัส</translation>
 <translation id="6341580099087024258">ถามว่าจะให้บันทึกไฟล์ไว้ที่ใด</translation>
 <translation id="6343192674172527289">ไม่พบการดาวน์โหลด</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">ไซต์เวอร์ชันเดสก์ท็อป</translation>
 <translation id="6600954340915313787">คัดลอกไปยัง Chrome แล้ว</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">ปิดแท็บส่วนตัว</translation>
 <translation id="6612358246767739896">เนื้อหาที่ได้รับความคุ้มครอง</translation>
 <translation id="6627583120233659107">แก้ไขโฟลเดอร์</translation>
 <translation id="6643016212128521049">ล้าง</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">นำคุณออกจากระบบของเว็บไซต์ส่วนใหญ่ แต่คุณจะไม่ออกจากระบบบัญชี Google</translation>
 <translation id="7454641608352164238">พื้นที่ว่างไม่พอ</translation>
 <translation id="7455923816558154057">แตะเพื่อดู</translation>
+<translation id="7465104139234185284">ปิดแท็บส่วนตัวทั้งหมด</translation>
 <translation id="7473891865547856676">ไม่ ขอบคุณ</translation>
 <translation id="7475192538862203634">หากคุณเห็นข้อความนี้บ่อยๆ โปรดลองทำตาม<ph name="BEGIN_LINK" />คำแนะนำ<ph name="END_LINK" />เหล่านี้</translation>
 <translation id="7475688122056506577">ไม่พบการ์ด SD ไฟล์บางไฟล์อาจหายไป</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">พื้นที่ที่ใช้ไปสำหรับการดาวน์โหลด <ph name="GIGABYTES" /> GB</translation>
 <translation id="8249310407154411074">เลื่อนไปบนสุด</translation>
 <translation id="8250920743982581267">เอกสาร</translation>
+<translation id="825412236959742607">หน้านี้ใช้หน่วยความจำมากเกินไป Chrome จึงนำเนื้อหาบางส่วนออก</translation>
 <translation id="8260126382462817229">ลองลงชื่อเข้าใช้อีกครั้ง</translation>
 <translation id="8261506727792406068">ลบ</translation>
 <translation id="8266862848225348053">ตำแหน่งที่ดาวน์โหลด</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">เริ่มค้นหาด้วยเสียง</translation>
 <translation id="9071742570345586758">หากต้องการดูเนื้อหา Virtual Reality โปรดติดตั้งบริการ VR ของ Google</translation>
 <translation id="9074336505530349563">ลงชื่อเข้าใช้และเปิดการซิงค์เพื่อรับคำแนะนำเนื้อหาที่ปรับเปลี่ยนในแบบของคุณจาก Google</translation>
+<translation id="9080642952018487277">เข้าสู่โหมดส่วนตัว</translation>
 <translation id="9086455579313502267">ไม่สามารถเข้าถึงเครือข่าย</translation>
 <translation id="9099018167121903954">พื้นที่ที่ใช้ไปสำหรับการดาวน์โหลด <ph name="KILOBYTES" /> KB</translation>
 <translation id="9100505651305367705">เสนอการแสดงบทความในมุมมองอย่างง่าย ในกรณีที่บทความทำได้</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 6c7eef3..5cdeae2 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_tr.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849"><ph name="WEBAPK_NAME" /> ekleniyor...</translation>
 <translation id="1041308826830691739">Web sitelerinden</translation>
 <translation id="1049743911850919806">Gizli mod</translation>
+<translation id="1054301162707478098">Gizli moda geçtiniz.</translation>
 <translation id="10614374240317010">Hiç kaydedilmeyecekler</translation>
 <translation id="1068672505746868501"><ph name="SOURCE_LANGUAGE" /> dilindeki sayfaları asla çevirme</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Diğer diller</translation>
 <translation id="124678866338384709">Geçerli sekmeyi kapatır</translation>
 <translation id="1258753120186372309">Google doodle'ı: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Gizli sekmelerde görüntülediğiniz sayfalar, gizli sekmelerinizin tamamını kapattıktan sonra tarayıcı geçmişinizde, çerez deponuzda veya arama geçmişinizde kalmaz. İndirdiğiniz dosyalar veya oluşturduğunuz yer işaretleri saklanır.
+
+Yine de, görünmez olmazsınız. Gizli moda geçmeniz web'de yaptıklarınızı işvereninizden, İnternet Servis Sağlayıcınızdan veya ziyaret ettiğiniz web sitelerinden saklamaz.</translation>
 <translation id="127138278192656016">Senkronizasyonu ve tüm hizmetleri kullan</translation>
 <translation id="1272079795634619415">Durdur</translation>
 <translation id="1283039547216852943">Genişletmek için dokunun</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Tam ekran site kontrolleri</translation>
 <translation id="2038563949887743358">Masaüstü sitesi iste işlevini etkinleştir</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> GB diğer uygulamalar</translation>
+<translation id="2055670718290744343">Arama Hızlandırıcı</translation>
 <translation id="2063713494490388661">Aramak İçin Hafifçe Dokunma</translation>
 <translation id="2079545284768500474">Geri al</translation>
 <translation id="2082238445998314030"><ph name="TOTAL_RESULTS" /> sonuçtan <ph name="RESULT_NUMBER" /> numaralı sonuç</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Senkronizasyon ve Google hizmetleri</translation>
 <translation id="2259659629660284697">Şifreleri dışa aktar…</translation>
 <translation id="2268044343513325586">Hassaslaştır</translation>
+<translation id="2280910239864711607">Gizli modda yeni bir sekme açar</translation>
 <translation id="2286841657746966508">Fatura adresi</translation>
 <translation id="230115972905494466">Uyumlu cihaz bulunamadı</translation>
 <translation id="2315043854645842844">İstemci tarafı sertifika seçimi, işletim sistemi tarafından desteklenmiyor.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Belirli bir site için JavaScript'e izin verin.</translation>
 <translation id="2625189173221582860">Şifre kopyalandı</translation>
 <translation id="2631006050119455616">Tasarruf Edilen</translation>
+<translation id="2633278372998075009">Gizli sekmeler</translation>
 <translation id="2647434099613338025">Dil ekle</translation>
 <translation id="2650751991977523696">Dosya tekrar indirilsin mi?</translation>
 <translation id="2653659639078652383">Gönder</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Parolanızı unuttuysanız veya bu ayarı değiştirmek istiyorsanız <ph name="BEGIN_LINK" />senkronizasyonu sıfırlayın<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Mikrofon</translation>
 <translation id="3232754137068452469">Web Uygulaması</translation>
+<translation id="3234355010754616171">Yeni gizli sekme</translation>
 <translation id="3236059992281584593">1 dk. kaldı</translation>
 <translation id="3244271242291266297">AA</translation>
 <translation id="3254409185687681395">Bu sayfaya yer işareti koy</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Tüm gizli sekmeleri kapatın.</translation>
 <translation id="3365671512111106261">Veri Tasarrufu açık olduğunda kullanılamaz</translation>
 <translation id="3367813778245106622">Senkronizasyonu başlatmak için tekrar oturum açın</translation>
+<translation id="3377025655491224618">Gizli Sekme</translation>
 <translation id="3384347053049321195">Resmi paylaş</translation>
 <translation id="3386292677130313581">Sitelerin, konumunuzu öğrenmesine izin verilmeden önce size sorulsun (önerilir)</translation>
 <translation id="3387650086002190359">Dosya sistemi hataları nedeniyle <ph name="FILE_NAME" /> dosyası indirilemedi.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Google tarafından önerilen kişiselleştirilmiş içeriği almak için senkronizasyonu açın</translation>
 <translation id="4226663524361240545">Bildirimler cihazı titretebilir</translation>
 <translation id="4242533952199664413">Ayarları aç</translation>
+<translation id="4243710787042215766">Gizli sekmede aç</translation>
 <translation id="424864128008805179">Chrome oturumu kapatılsın mı?</translation>
 <translation id="4256782883801055595">Açık kaynak lisansları</translation>
 <translation id="4259722352634471385">Gezinme engellendi: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Proxy sunucu üzerinden tünel oluşturulamadı</translation>
 <translation id="4881695831933465202">Aç</translation>
 <translation id="488187801263602086">Dosyayı yeniden adlandırın</translation>
+<translation id="4883379392681899581">Gizli moddan ayrıl</translation>
 <translation id="4885273946141277891">Desteklenmeyen sayıda Chrome örneği var.</translation>
 <translation id="4910889077668685004">Ödeme uygulamaları</translation>
 <translation id="4913161338056004800">İstatistikleri sıfırla</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Videolu</translation>
 <translation id="5233638681132016545">Yeni sekme</translation>
 <translation id="5240817131241497236">Chrome'da senkronizasyon, kişiselleştirme ve diğer Google hizmetlerini kontrol eden ayarlar değişti. Bu durum geçerli ayarlarınızı etkileyebilir.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Ayarlar<ph name="END_LINK1" />'ı istediğiniz zaman özelleştirebilirsiniz. Google; Chrome'un yanı sıra Çeviri, Arama ve reklamlar gibi diğer Google hizmetlerini kişiselleştirmek için, ziyaret ettiğiniz sitelerdeki içeriği, tarayıcı etkinliğini ve etkileşimleri kullanabilir.</translation>
 <translation id="5271967389191913893">Cihaz, indirilecek içeriği açamıyor.</translation>
 <translation id="528192093759286357">Tam ekrandan çıkmak için yukarıdan sürükleyin ve geri düğmesine dokunun.</translation>
 <translation id="5284584623296338184">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızda yaptığınız değişiklikler artık Google Hesabınız ile senkronize edilmeyecek. Ancak, mevcut verileriniz Google hesabınızda saklanmaya devam edecek.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Bilinmiyor</translation>
 <translation id="5833397272224757657">Kişiselleştirme için ziyaret ettiğiniz sitelerin içeriğinin yanı sıra tarayıcı etkinliğini ve etkileşimlerini kullanır</translation>
 <translation id="5833984609253377421">Bağlantıyı paylaş</translation>
+<translation id="584427517463557805">Seçilen Gizli Sekme</translation>
 <translation id="5854790677617711513">30 günden daha eski</translation>
 <translation id="5858741533101922242">Chrome, Bluetooth adaptörünü açamıyor</translation>
 <translation id="5860033963881614850">Kapalı</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Ana sayfayı düzenle</translation>
 <translation id="60923314841986378"><ph name="HOURS" /> saat kaldı</translation>
 <translation id="60924377787140961">Yakında daha fazla seçenek gösterilecek. Güzel bir öğleden sonra geçirmenizi dileriz.</translation>
+<translation id="6099151465289169210">Gizli sekmelere geçildi</translation>
 <translation id="6108923351542677676">Kurulum devam ediyor…</translation>
 <translation id="6111020039983847643">kullanılan veri miktarı</translation>
 <translation id="6112702117600201073">Sayfa yenileniyor</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Titreşim</translation>
 <translation id="6324034347079777476">Android sistem senkronizasyonu devre dışı</translation>
 <translation id="6333140779060797560">Paylaşım yöntemi: <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Yeni gizli sekme</translation>
 <translation id="6337234675334993532">Şifreleme</translation>
 <translation id="6341580099087024258">Dosyaların kaydedileceği yeri sor</translation>
 <translation id="6343192674172527289">İndirilen herhangi bir şey bulunmadı</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Masaüstü sitesi</translation>
 <translation id="6600954340915313787">Chrome'a kopyalandı</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Gizli sekmeleri kapat</translation>
 <translation id="6612358246767739896">Korunan içerik</translation>
 <translation id="6627583120233659107">Klasörü düzenle</translation>
 <translation id="6643016212128521049">Temizle</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Çoğu sitedeki oturumunuz kapatılır. Google Hesabınızdaki oturumunuz kapatılmaz.</translation>
 <translation id="7454641608352164238">Yeterli alan yok</translation>
 <translation id="7455923816558154057">Görüntülemek için dokunun</translation>
+<translation id="7465104139234185284">Tüm gizli sekmeleri kapat</translation>
 <translation id="7473891865547856676">Hayır, Teşekkürler</translation>
 <translation id="7475192538862203634">Bunu çok sık görüyorsanız bu <ph name="BEGIN_LINK" />önerileri<ph name="END_LINK" /> deneyin.</translation>
 <translation id="7475688122056506577">SD kart bulunamadı. Bazı dosyalarınız eksik olabilir.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290"><ph name="GIGABYTES" /> GB indirildi</translation>
 <translation id="8249310407154411074">En üste taşı</translation>
 <translation id="8250920743982581267">Dokümanlar</translation>
+<translation id="825412236959742607">Bu sayfa çok fazla bellek kullandığından Chrome bazı içerikleri kaldırdı.</translation>
 <translation id="8260126382462817229">Tekrar oturum açmayı deneyin</translation>
 <translation id="8261506727792406068">Sil</translation>
 <translation id="8266862848225348053">İndirme konumu</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Sesli arama başlat</translation>
 <translation id="9071742570345586758">Sanal gerçeklik içeriğini görüntülemek için Google VR Hizmetleri'ni yükleyin</translation>
 <translation id="9074336505530349563">Google tarafından önerilen kişiselleştirilmiş içeriği almak için oturum açın ve senkronizasyonu etkinleştirin</translation>
+<translation id="9080642952018487277">Gizli moda geçer</translation>
 <translation id="9086455579313502267">Ağa erişilemiyor</translation>
 <translation id="9099018167121903954">İndirilenler <ph name="KILOBYTES" /> KB</translation>
 <translation id="9100505651305367705">Desteklendiğinde makaleleri basitleştirilmiş görünümde göstermeyi öner</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 53eef3f..862bf59 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_uk.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Додається <ph name="WEBAPK_NAME" />…</translation>
 <translation id="1041308826830691739">З веб-сайтів</translation>
 <translation id="1049743911850919806">Анонімний перегляд</translation>
+<translation id="1054301162707478098">Ви перейшли в приватний режим.</translation>
 <translation id="10614374240317010">Ніколи не зберігалося</translation>
 <translation id="1068672505746868501">Ніколи не перекладати сторінки такою мовою: <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> – <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Інші мови</translation>
 <translation id="124678866338384709">Закрити поточну вкладку</translation>
 <translation id="1258753120186372309">Дудл Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Сторінки, які ви переглядаєте на приватних вкладках, не реєструються в історії веб-переглядача чи історії пошуку й не залишають файлів cookie, коли ви закриваєте всі приватні вкладки. Усі завантажені файли чи створені закладки зберігаються.
+
+Проте ви не можете сховати все. Навіть у приватному режимі ваш роботодавець, постачальник послуг Інтернету чи адміністратори веб-сайтів, які ви відвідуєте, можуть бачити, що ви переглядаєте.</translation>
 <translation id="127138278192656016">Використовувати синхронізацію та всі сервіси</translation>
 <translation id="1272079795634619415">Зупинити</translation>
 <translation id="1283039547216852943">Торкніться, щоб розгорнути</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Керування повноекранним режимом</translation>
 <translation id="2038563949887743358">Увімкнути опцію "Запитувати версію сайту для комп’ютера"</translation>
 <translation id="2045104531052923016"><ph name="GIGABYTES" /> ГБ використовується іншими додатками</translation>
+<translation id="2055670718290744343">Прискорювач пошуку</translation>
 <translation id="2063713494490388661">Торкніться, щоб шукати</translation>
 <translation id="2079545284768500474">Відмінити</translation>
 <translation id="2082238445998314030">Результат <ph name="RESULT_NUMBER" /> з <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Синхронізація та сервіси Google</translation>
 <translation id="2259659629660284697">Експортувати паролі…</translation>
 <translation id="2268044343513325586">Уточнити</translation>
+<translation id="2280910239864711607">Відкрити нову вкладку в приватному режимі</translation>
 <translation id="2286841657746966508">Розрахункова адреса</translation>
 <translation id="230115972905494466">Сумісних пристроїв не знайдено</translation>
 <translation id="2315043854645842844">Операційна система не підтримує сертифікат, вибраний на стороні клієнта.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Увімкнути Javascript на певному сайті.</translation>
 <translation id="2625189173221582860">Пароль скопійовано</translation>
 <translation id="2631006050119455616">Збережено</translation>
+<translation id="2633278372998075009">Приватні вкладки</translation>
 <translation id="2647434099613338025">Додати мову</translation>
 <translation id="2650751991977523696">Завантажити файл ще раз?</translation>
 <translation id="2653659639078652383">Надіслати</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Якщо ви забули парольну фразу або хочете змінити це налаштування, <ph name="BEGIN_LINK" />скиньте синхронізацію<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Мікрофон</translation>
 <translation id="3232754137068452469">Веб-додаток</translation>
+<translation id="3234355010754616171">Нова приватна вкладка</translation>
 <translation id="3236059992281584593">Залишилась 1 хв</translation>
 <translation id="3244271242291266297">ММ</translation>
 <translation id="3254409185687681395">Додати цю сторінку до закладок</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Закрити всі анонімні вікна</translation>
 <translation id="3365671512111106261">Недоступно, коли ввімкнено Заощадження трафіку</translation>
 <translation id="3367813778245106622">Увійдіть знову, щоб почати синхронізацію</translation>
+<translation id="3377025655491224618">Приватна вкладка</translation>
 <translation id="3384347053049321195">Поділитися зображенням</translation>
 <translation id="3386292677130313581">Запитувати, перш ніж дозволити сайтам визначати ваше місцезнаходження (рекомендується)</translation>
 <translation id="3387650086002190359">Файл <ph name="FILE_NAME" /> не завантажено через помилки файлової системи.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Щоб отримувати персоналізовані пропозиції від Google, увімкніть синхронізацію</translation>
 <translation id="4226663524361240545">Коли надходитимуть сповіщення, пристрій може вібрувати</translation>
 <translation id="4242533952199664413">Відкрити налаштування</translation>
+<translation id="4243710787042215766">Відкрити в приватній вкладці</translation>
 <translation id="424864128008805179">Вийти з Chrome?</translation>
 <translation id="4256782883801055595">Ліцензії ПЗ з відкритим кодом</translation>
 <translation id="4259722352634471385">Веб-сторінку <ph name="URL" /> заблоковано</translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Не вдалося налагодити зв’язок через проксі-сервер</translation>
 <translation id="4881695831933465202">Відкрити</translation>
 <translation id="488187801263602086">Перейменувати файл</translation>
+<translation id="4883379392681899581">Вийти з приватного режиму</translation>
 <translation id="4885273946141277891">Забагато копій Chrome.</translation>
 <translation id="4910889077668685004">Додатки для платежів</translation>
 <translation id="4913161338056004800">Скинути дані статистики</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">З відео</translation>
 <translation id="5233638681132016545">Нова вкладка</translation>
 <translation id="5240817131241497236">Змінилися налаштування, які керують синхронізацією, персоналізацією й іншими службами Google у Chrome. Це може вплинути на поточні налаштування.</translation>
+<translation id="5264003212305142034"><ph name="BEGIN_LINK1" />Налаштування<ph name="END_LINK1" /> можна будь-коли змінити. Google може використовувати вміст відвіданих сайтів, дані веб-перегляду й інші дії, щоб персоналізувати Chrome та інші сервіси Google, як-от Перекладач, Пошук і оголошення.</translation>
 <translation id="5271967389191913893">Вміст, який ви хочете завантажити, не можна відкрити на цьому пристрої.</translation>
 <translation id="528192093759286357">Щоб вийти з повноекранного режиму, проведіть пальцем по екрану згори вниз і торкніться кнопки "Назад".</translation>
 <translation id="5284584623296338184">Зміни в закладках, історії, паролях та інших налаштуваннях більше не синхронізуватимуться з вашим обліковим записом Google. Однак наявні дані залишаться у вашому обліковому записі Google.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Невідомий</translation>
 <translation id="5833397272224757657">Використовує вміст відвіданих сайтів, активність у веб-переглядачі та взаємодії для персоналізації</translation>
 <translation id="5833984609253377421">Поділитися посиланням</translation>
+<translation id="584427517463557805">Вибрано приватну вкладку</translation>
 <translation id="5854790677617711513">Понад 30 днів тому</translation>
 <translation id="5858741533101922242">Chrome не може ввімкнути адаптер Bluetooth</translation>
 <translation id="5860033963881614850">Вимк.</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Змінити домашню сторінку</translation>
 <translation id="60923314841986378">Залишилося <ph name="HOURS" /> год</translation>
 <translation id="60924377787140961">Згодом тут з’являться інші статті. Гарного дня.</translation>
+<translation id="6099151465289169210">Ви перейшли на приватні вкладки</translation>
 <translation id="6108923351542677676">Виконується налаштування…</translation>
 <translation id="6111020039983847643">використаний трафік</translation>
 <translation id="6112702117600201073">Оновлення сторінки</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Вібросигнал</translation>
 <translation id="6324034347079777476">Синхронізацію системи Android вимкнено</translation>
 <translation id="6333140779060797560">Надіслати через <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Нова приватна вкладка</translation>
 <translation id="6337234675334993532">Шифрування</translation>
 <translation id="6341580099087024258">Запитувати, де зберігати файли</translation>
 <translation id="6343192674172527289">Завантаження не знайдено</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Версія для комп’ютера</translation>
 <translation id="6600954340915313787">Скопійовано в Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> ГБ</translation>
+<translation id="6610147964972079463">Закрити приватні вкладки</translation>
 <translation id="6612358246767739896">Захищений вміст</translation>
 <translation id="6627583120233659107">Редагувати папку</translation>
 <translation id="6643016212128521049">Очистити</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Ви вийдете з більшості сайтів, але не вийдете з облікового запису Google.</translation>
 <translation id="7454641608352164238">Замало місця</translation>
 <translation id="7455923816558154057">Торкніться, щоб переглянути</translation>
+<translation id="7465104139234185284">Закрити всі приватні вкладки</translation>
 <translation id="7473891865547856676">Ні, дякую</translation>
 <translation id="7475192538862203634">Якщо ви часто бачите таку сторінку, скористайтеся цими <ph name="BEGIN_LINK" />пропозиціями<ph name="END_LINK" />.</translation>
 <translation id="7475688122056506577">Карту SD не знайдено. Деякі файли можуть бути відсутні.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Завантажено <ph name="GIGABYTES" /> ГБ</translation>
 <translation id="8249310407154411074">На початок</translation>
 <translation id="8250920743982581267">Документи</translation>
+<translation id="825412236959742607">Ця сторінка використовує забагато пам’яті, тому веб-переглядач Chrome вилучив деякий вміст.</translation>
 <translation id="8260126382462817229">Спробуйте ввійти ще раз</translation>
 <translation id="8261506727792406068">Видалити</translation>
 <translation id="8266862848225348053">Папка для завантажень</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Почати голосовий пошук</translation>
 <translation id="9071742570345586758">Щоб переглядати вміст віртуальної реальності, установіть Google VR-сервіси</translation>
 <translation id="9074336505530349563">Щоб отримувати персоналізовані пропозиції від Google, увійдіть в обліковий запис і ввімкніть синхронізацію</translation>
+<translation id="9080642952018487277">Перейти в приватний режим</translation>
 <translation id="9086455579313502267">Неможливо отримати доступ до мережі</translation>
 <translation id="9099018167121903954">Завантажено <ph name="KILOBYTES" /> КБ</translation>
 <translation id="9100505651305367705">Пропонувати статті в режимі спрощеного перегляду, якщо він підтримується</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 a4ebb57..677cd592 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_vi.xtb
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">Đang thêm <ph name="WEBAPK_NAME" />...</translation>
 <translation id="1041308826830691739">Từ trang web</translation>
 <translation id="1049743911850919806">Ẩn danh</translation>
+<translation id="1054301162707478098">Bạn đã chuyển sang chế độ riêng tư.</translation>
 <translation id="10614374240317010">Không bao giờ lưu</translation>
 <translation id="1068672505746868501">Không bao giờ dịch các trang viết bằng <ph name="SOURCE_LANGUAGE" /></translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">Ngôn ngữ khác</translation>
 <translation id="124678866338384709">Đóng tab hiện tại</translation>
 <translation id="1258753120186372309">Hình tượng trưng của Google: <ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">Trang mà bạn xem ở tab ẩn danh sẽ không lưu vào lịch sử của trình duyệt, kho cookie hoặc lịch sử tìm kiếm sau khi bạn đóng tất cả tab riêng tư. Mọi tệp bạn tải xuống hoặc dấu trang bạn tạo sẽ được lưu lại.
+
+Tuy nhiên, bạn vẫn có trạng thái hiển thị. Việc chuyển sang chế độ riêng tư sẽ không ẩn hoạt động duyệt web của bạn với chủ lao động, nhà cung cấp dịch vụ Internet hoặc các trang web bạn truy cập.</translation>
 <translation id="127138278192656016">Sử dụng tùy chọn đồng bộ hóa và tất cả dịch vụ</translation>
 <translation id="1272079795634619415">Dừng</translation>
 <translation id="1283039547216852943">Nhấn để mở rộng</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">Kiểm soát trang toàn màn hình</translation>
 <translation id="2038563949887743358">Bật Yêu cầu trang web cho máy tính</translation>
 <translation id="2045104531052923016">Các ứng dụng khác chiếm <ph name="GIGABYTES" /> GB</translation>
+<translation id="2055670718290744343">Trình tăng tốc tìm kiếm</translation>
 <translation id="2063713494490388661">Nhấn để tìm kiếm</translation>
 <translation id="2079545284768500474">Hoàn tác</translation>
 <translation id="2082238445998314030">Kết quả <ph name="RESULT_NUMBER" /> trong tổng số <ph name="TOTAL_RESULTS" /></translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">Đồng bộ hóa và các dịch vụ của Google</translation>
 <translation id="2259659629660284697">Xuất mật khẩu...</translation>
 <translation id="2268044343513325586">Tinh chỉnh</translation>
+<translation id="2280910239864711607">Mở tab mới trong chế độ Riêng tư</translation>
 <translation id="2286841657746966508">Địa chỉ thanh toán</translation>
 <translation id="230115972905494466">Không tìm thấy thiết bị tương thích</translation>
 <translation id="2315043854645842844">Lựa chọn chứng chỉ phía ứng dụng khách không được hệ điều hành hỗ trợ.</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">Cho phép JavaScript cho trang web cụ thể.</translation>
 <translation id="2625189173221582860">Đã sao chép mật khẩu</translation>
 <translation id="2631006050119455616">Đã tiết kiệm</translation>
+<translation id="2633278372998075009">Các tab riêng tư</translation>
 <translation id="2647434099613338025">Thêm ngôn ngữ</translation>
 <translation id="2650751991977523696">Tải tệp xuống lần nữa?</translation>
 <translation id="2653659639078652383">Gửi</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">Nếu bạn quên cụm mật khẩu hoặc muốn thay đổi cài đặt này, hãy <ph name="BEGIN_LINK" />đặt lại đồng bộ hóa<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">Micrô</translation>
 <translation id="3232754137068452469">Ứng dụng web</translation>
+<translation id="3234355010754616171">Tab riêng tư mới</translation>
 <translation id="3236059992281584593">Còn 1 phút</translation>
 <translation id="3244271242291266297">MM</translation>
 <translation id="3254409185687681395">Đánh dấu trang này</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">Đóng tất cả các tab ẩn danh</translation>
 <translation id="3365671512111106261">Không khả dụng khi Trình tiết kiệm dữ liệu được bật</translation>
 <translation id="3367813778245106622">Đăng nhập lại để bắt đầu đồng bộ hóa</translation>
+<translation id="3377025655491224618">Tab riêng tư</translation>
 <translation id="3384347053049321195">Chia sẻ hình ảnh</translation>
 <translation id="3386292677130313581">Hỏi trước khi cho phép các trang web biết vị trí của bạn (được đề xuất)</translation>
 <translation id="3387650086002190359">Tải xuống <ph name="FILE_NAME" /> không thành công do lỗi hệ thống tệp.</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">Để nhận nội dung do Google đề xuất riêng cho bạn, hãy bật tính năng đồng bộ hóa</translation>
 <translation id="4226663524361240545">Thông báo có thể làm rung thiết bị</translation>
 <translation id="4242533952199664413">Mở cài đặt</translation>
+<translation id="4243710787042215766">Mở trong tab riêng tư</translation>
 <translation id="424864128008805179">Đăng xuất khỏi Chrome?</translation>
 <translation id="4256782883801055595">Giấy phép nguồn mở</translation>
 <translation id="4259722352634471385">Điều hướng bị chặn: <ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">Thiết lập đường hầm qua máy chủ proxy không thành công</translation>
 <translation id="4881695831933465202">Mở</translation>
 <translation id="488187801263602086">Đổi tên tệp</translation>
+<translation id="4883379392681899581">Thoát chế độ riêng tư</translation>
 <translation id="4885273946141277891">Số phiên bản Chrome không được hỗ trợ.</translation>
 <translation id="4910889077668685004">Ứng dụng thanh toán</translation>
 <translation id="4913161338056004800">Đặt lại thống kê</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">Có video</translation>
 <translation id="5233638681132016545">Tab mới</translation>
 <translation id="5240817131241497236">Các tùy chọn cài đặt kiểm soát tính năng đồng bộ hóa, cá nhân hóa và các dịch vụ khác của Google trong Chrome đã thay đổi. Điều này có thể ảnh hưởng đến các tùy chọn cài đặt hiện tại của bạn.</translation>
+<translation id="5264003212305142034">Bạn có thể tùy chỉnh mục <ph name="BEGIN_LINK1" />Cài đặt<ph name="END_LINK1" /> bất cứ lúc nào. Google có thể sử dụng nội dung trên các trang web bạn truy cập, cùng với hoạt động và thông tin tương tác trên trình duyệt để tùy chỉnh Chrome và các dịch vụ khác của Google như Dịch, Tìm kiếm và quảng cáo.</translation>
 <translation id="5271967389191913893">Thiết bị không thể mở nội dung được tải xuống.</translation>
 <translation id="528192093759286357">Kéo từ trên xuống và chạm vào nút quay lại để thoát khỏi chế độ toàn màn hình.</translation>
 <translation id="5284584623296338184">Các thay đổi đối với dấu trang, lịch sử, mật khẩu và cài đặt khác sẽ không còn được đồng bộ hóa với Tài khoản Google của bạn. Tuy nhiên, dữ liệu hiện có của bạn sẽ vẫn được lưu trữ trong tài khoản Google của bạn.</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">Không xác định</translation>
 <translation id="5833397272224757657">Dùng nội dung trên trang web bạn truy cập cũng như các tương tác và hoạt động trên trình duyệt để cá nhân hóa</translation>
 <translation id="5833984609253377421">Chia sẻ liên kết</translation>
+<translation id="584427517463557805">Tab đã chọn ở chế độ riêng tư</translation>
 <translation id="5854790677617711513">Đã tồn tại hơn 30 ngày</translation>
 <translation id="5858741533101922242">Chrome không thể bật bộ điều hợp Bluetooth</translation>
 <translation id="5860033963881614850">Tắt</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">Chỉnh sửa trang chủ</translation>
 <translation id="60923314841986378">Còn <ph name="HOURS" /> giờ</translation>
 <translation id="60924377787140961">Các bài viết khác sẽ sớm xuất hiện. Chúc bạn buổi chiều vui vẻ!</translation>
+<translation id="6099151465289169210">Đã chuyển sang tab riêng tư</translation>
 <translation id="6108923351542677676">Đang thiết lập…</translation>
 <translation id="6111020039983847643">dữ liệu đã dùng</translation>
 <translation id="6112702117600201073">Làm mới trang</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">Rung</translation>
 <translation id="6324034347079777476">Đồng bộ hóa hệ thống Android đã bị tắt</translation>
 <translation id="6333140779060797560">Chia sẻ qua <ph name="APPLICATION" /></translation>
+<translation id="6336451774241870485">Tab riêng tư mới</translation>
 <translation id="6337234675334993532">Mã hóa</translation>
 <translation id="6341580099087024258">Hỏi vị trí lưu tệp</translation>
 <translation id="6343192674172527289">Không tìm thấy tài nguyên đã tải xuống nào</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">Trang web cho máy tính</translation>
 <translation id="6600954340915313787">Đã sao chép vào Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">Đóng tab riêng tư</translation>
 <translation id="6612358246767739896">Nội dung được bảo vệ</translation>
 <translation id="6627583120233659107">Chỉnh sửa thư mục</translation>
 <translation id="6643016212128521049">Xóa</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">Đăng xuất bạn khỏi hầu hết các trang web. Bạn sẽ không bị đăng xuất khỏi Tài khoản Google của mình.</translation>
 <translation id="7454641608352164238">Không đủ dung lượng</translation>
 <translation id="7455923816558154057">Nhấn để xem</translation>
+<translation id="7465104139234185284">Đóng tất cả tab riêng tư</translation>
 <translation id="7473891865547856676">Không, cảm ơn</translation>
 <translation id="7475192538862203634">Nếu bạn thường xuyên thấy thông báo này, hãy thử các <ph name="BEGIN_LINK" />đề xuất<ph name="END_LINK" /> sau.</translation>
 <translation id="7475688122056506577">Không tìm thấy thẻ SD. Một số tệp của bạn có thể bị thiếu.</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">Đã tải xuống <ph name="GIGABYTES" /> GB</translation>
 <translation id="8249310407154411074">Chuyển lên trên cùng</translation>
 <translation id="8250920743982581267">Tài liệu</translation>
+<translation id="825412236959742607">Trang này sử dụng quá nhiều bộ nhớ, nên Chrome đã xóa bớt nội dung.</translation>
 <translation id="8260126382462817229">Thử đăng nhập lại</translation>
 <translation id="8261506727792406068">Xóa</translation>
 <translation id="8266862848225348053">Vị trí tải xuống</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">Bắt đầu tìm kiếm bằng giọng nói</translation>
 <translation id="9071742570345586758">Để xem nội dung thực tế ảo, hãy cài đặt Dịch vụ VR của Google</translation>
 <translation id="9074336505530349563">Để nhận nội dung do Google đề xuất riêng cho bạn, hãy đăng nhập và bật tính năng đồng bộ hóa</translation>
+<translation id="9080642952018487277">Vào chế độ riêng tư</translation>
 <translation id="9086455579313502267">Không thể truy cập mạng</translation>
 <translation id="9099018167121903954">Đã tải xuống <ph name="KILOBYTES" /> KB</translation>
 <translation id="9100505651305367705">Đề xuất hiển thị các bài viết ở chế độ xem đơn giản khi được hỗ trợ</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 1221d48..a7befe89 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
@@ -5,6 +5,7 @@
 <translation id="1036727731225946849">正在新增「<ph name="WEBAPK_NAME" />」...</translation>
 <translation id="1041308826830691739">來自網站</translation>
 <translation id="1049743911850919806">無痕模式</translation>
+<translation id="1054301162707478098">你已啟用私密模式。</translation>
 <translation id="10614374240317010">一律不儲存</translation>
 <translation id="1068672505746868501">一律不翻譯<ph name="SOURCE_LANGUAGE" />網頁</translation>
 <translation id="10713315585330490"><ph name="FILE_SIZE" /> - <ph name="DESCRIPTION" /></translation>
@@ -35,6 +36,9 @@
 <translation id="124116460088058876">更多語言</translation>
 <translation id="124678866338384709">關閉目前的分頁</translation>
 <translation id="1258753120186372309">Google Doodle:<ph name="DOODLE_DESCRIPTION" /></translation>
+<translation id="1259100630977430756">你關閉所有私密分頁後,你在其中瀏覽過的網頁都不會保留在瀏覽器記錄、Cookie 儲存庫或搜尋記錄中,但系統仍會保留你下載的所有檔案或是你建立的所有書籤。
+
+不過,這並不代表你完全沒有瀏覽記錄。使用私密模式時,你的雇主、網際網路服務供應商和你所造訪的網站仍然可以追蹤你的瀏覽記錄。</translation>
 <translation id="127138278192656016">使用同步處理功能和所有服務</translation>
 <translation id="1272079795634619415">停止</translation>
 <translation id="1283039547216852943">輕觸即可展開</translation>
@@ -137,6 +141,7 @@
 <translation id="2021896219286479412">全螢幕網站控制</translation>
 <translation id="2038563949887743358">開啟「要求電腦版網站」</translation>
 <translation id="2045104531052923016">其他應用程式佔 <ph name="GIGABYTES" /> GB</translation>
+<translation id="2055670718290744343">搜尋加速器</translation>
 <translation id="2063713494490388661">輕觸搜尋</translation>
 <translation id="2079545284768500474">復原</translation>
 <translation id="2082238445998314030">第 <ph name="RESULT_NUMBER" /> 個結果,共 <ph name="TOTAL_RESULTS" /> 個</translation>
@@ -164,6 +169,7 @@
 <translation id="2234876718134438132">同步處理和 Google 服務</translation>
 <translation id="2259659629660284697">匯出密碼…</translation>
 <translation id="2268044343513325586">修正搜尋</translation>
+<translation id="2280910239864711607">在私密模式下開啟新分頁</translation>
 <translation id="2286841657746966508">帳單地址</translation>
 <translation id="230115972905494466">找不到相容的裝置</translation>
 <translation id="2315043854645842844">作業系統不允許您在用戶端選取憑證。</translation>
@@ -214,6 +220,7 @@
 <translation id="2621115761605608342">允許特定網站執行 JavaScript。</translation>
 <translation id="2625189173221582860">已複製密碼</translation>
 <translation id="2631006050119455616">已節省</translation>
+<translation id="2633278372998075009">私密分頁</translation>
 <translation id="2647434099613338025">新增語言</translation>
 <translation id="2650751991977523696">要再次下載檔案嗎?</translation>
 <translation id="2653659639078652383">提交</translation>
@@ -273,6 +280,7 @@
 <translation id="321773570071367578">如果您忘記通關密語,或是想變更這項設定,請<ph name="BEGIN_LINK" />重設同步功能<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">麥克風</translation>
 <translation id="3232754137068452469">網路應用程式</translation>
+<translation id="3234355010754616171">新私密分頁</translation>
 <translation id="3236059992281584593">還剩 1 分鐘</translation>
 <translation id="3244271242291266297">月</translation>
 <translation id="3254409185687681395">把此頁加入書籤</translation>
@@ -288,6 +296,7 @@
 <translation id="3350687908700087792">關閉所有無痕式分頁</translation>
 <translation id="3365671512111106261">開啟 Data Saver 時無法使用這項設定</translation>
 <translation id="3367813778245106622">如要開始同步處理,請重新登入</translation>
+<translation id="3377025655491224618">私密分頁</translation>
 <translation id="3384347053049321195">分享圖片</translation>
 <translation id="3386292677130313581">允許網站存取您的位置資訊前,必須先詢問您 (建議)</translation>
 <translation id="3387650086002190359">檔案系統發生錯誤,因此無法下載 <ph name="FILE_NAME" />。</translation>
@@ -385,6 +394,7 @@
 <translation id="4209895695669353772">如要取得個人化的 Google 推薦內容,請開啟同步處理功能</translation>
 <translation id="4226663524361240545">收到通知時裝置會震動</translation>
 <translation id="4242533952199664413">開啟設定</translation>
+<translation id="4243710787042215766">在私密分頁中開啟</translation>
 <translation id="424864128008805179">要登出 Chrome 嗎?</translation>
 <translation id="4256782883801055595">開放原始碼授權</translation>
 <translation id="4259722352634471385">瀏覽的網址已封鎖:<ph name="URL" /></translation>
@@ -465,6 +475,7 @@
 <translation id="4878404682131129617">無法透過 Proxy 伺服器建立通道</translation>
 <translation id="4881695831933465202">開啟</translation>
 <translation id="488187801263602086">重新命名檔案</translation>
+<translation id="4883379392681899581">退出私密模式</translation>
 <translation id="4885273946141277891">Chrome 實例的數量已超出上限。</translation>
 <translation id="4910889077668685004">付款應用程式</translation>
 <translation id="4913161338056004800">重設統計資料</translation>
@@ -506,6 +517,7 @@
 <translation id="5224771365102442243">含有影片</translation>
 <translation id="5233638681132016545">新增分頁</translation>
 <translation id="5240817131241497236">Chrome 的同步處理、個人化功能和其他 Google 服務控制設定已變更。這可能影響你目前的設定。</translation>
+<translation id="5264003212305142034">你隨時可以調整<ph name="BEGIN_LINK1" />設定<ph name="END_LINK1" />。Google 可能會根據你所造訪網站的內容、瀏覽器互動行為和瀏覽活動,提供個人化的 Chrome 體驗和 Google 服務體驗,例如翻譯、搜尋和廣告。</translation>
 <translation id="5271967389191913893">裝置無法開啟您要下載的這項內容。</translation>
 <translation id="528192093759286357">從頂端拖曳並輕觸返回按鈕即可結束全螢幕模式。</translation>
 <translation id="5284584623296338184">您更改過的書籤、歷史記錄、密碼和其他設定不會繼續與您 Google 帳戶中的資料保持同步,但是您 Google 帳戶現有的資料仍會保留。</translation>
@@ -591,6 +603,7 @@
 <translation id="583281660410589416">未知</translation>
 <translation id="5833397272224757657">使用你所造訪網站的內容、瀏覽器活動和瀏覽器互動行為,提供個人化的使用體驗</translation>
 <translation id="5833984609253377421">分享連結</translation>
+<translation id="584427517463557805">已選取的私密分頁</translation>
 <translation id="5854790677617711513">超過 30 天前</translation>
 <translation id="5858741533101922242">Chrome 無法開啟藍牙轉接器</translation>
 <translation id="5860033963881614850">關閉</translation>
@@ -620,6 +633,7 @@
 <translation id="6075798973483050474">編輯首頁</translation>
 <translation id="60923314841986378">還剩 <ph name="HOURS" /> 小時</translation>
 <translation id="60924377787140961">系統即將顯示更多文章供你閱覽,陪你度過美好的午後時光!</translation>
+<translation id="6099151465289169210">已切換成私密分頁</translation>
 <translation id="6108923351542677676">設定中…</translation>
 <translation id="6111020039983847643">數據用量</translation>
 <translation id="6112702117600201073">重新整理網頁</translation>
@@ -649,6 +663,7 @@
 <translation id="6320088164292336938">震動</translation>
 <translation id="6324034347079777476">Android 系統同步處理功能已停用</translation>
 <translation id="6333140779060797560">透過 <ph name="APPLICATION" /> 分享</translation>
+<translation id="6336451774241870485">新私密分頁</translation>
 <translation id="6337234675334993532">加密</translation>
 <translation id="6341580099087024258">詢問檔案儲存位置</translation>
 <translation id="6343192674172527289">找不到下載內容</translation>
@@ -686,6 +701,7 @@
 <translation id="6593061639179217415">電腦版網站</translation>
 <translation id="6600954340915313787">已複製到 Chrome</translation>
 <translation id="6608650720463149374"><ph name="GIGABYTES" /> GB</translation>
+<translation id="6610147964972079463">關閉私密分頁</translation>
 <translation id="6612358246767739896">受保護內容</translation>
 <translation id="6627583120233659107">編輯資料夾</translation>
 <translation id="6643016212128521049">清除</translation>
@@ -789,6 +805,7 @@
 <translation id="7453467225369441013">你會從大多數網站登出,但不會因此登出 Google 帳戶。</translation>
 <translation id="7454641608352164238">空間不足</translation>
 <translation id="7455923816558154057">輕觸即可查看</translation>
+<translation id="7465104139234185284">關閉所有私密分頁</translation>
 <translation id="7473891865547856676">不用了,謝謝</translation>
 <translation id="7475192538862203634">如果您經常看到這個頁面,請嘗試這些<ph name="BEGIN_LINK" />建議<ph name="END_LINK" />。</translation>
 <translation id="7475688122056506577">找不到 SD 卡。部分檔案可能會遺失。</translation>
@@ -884,6 +901,7 @@
 <translation id="8220488350232498290">下載內容佔 <ph name="GIGABYTES" /> GB</translation>
 <translation id="8249310407154411074">移至頂端</translation>
 <translation id="8250920743982581267">文件</translation>
+<translation id="825412236959742607">這個網頁使用了過多記憶體,因此 Chrome 移除了部分內容。</translation>
 <translation id="8260126382462817229">請嘗試重新登入</translation>
 <translation id="8261506727792406068">刪除</translation>
 <translation id="8266862848225348053">下載位置</translation>
@@ -979,6 +997,7 @@
 <translation id="9070377983101773829">開始語音搜尋</translation>
 <translation id="9071742570345586758">如要查看虛擬實境內容,請安裝 Google VR 服務</translation>
 <translation id="9074336505530349563">如要取得個人化的 Google 推薦內容,請登入並開啟同步處理功能</translation>
+<translation id="9080642952018487277">進入私密模式</translation>
 <translation id="9086455579313502267">無法存取網路</translation>
 <translation id="9099018167121903954">下載內容佔 <ph name="KILOBYTES" /> KB</translation>
 <translation id="9100505651305367705">詢問是否以簡易模式顯示支援這項功能的文章</translation>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index f7c90e6..8288ddf 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -117,6 +117,7 @@
   "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java",
   "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetCoordinator.java",
   "java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessorySheetViewBinder.java",
+  "java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java",
   "java/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTask.java",
   "java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
   "java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java",
@@ -494,6 +495,8 @@
   "java/src/org/chromium/chrome/browser/download/home/list/holder/ListItemViewHolder.java",
   "java/src/org/chromium/chrome/browser/download/home/list/holder/MoreButtonViewHolder.java",
   "java/src/org/chromium/chrome/browser/download/home/list/holder/PrefetchViewHolder.java",
+  "java/src/org/chromium/chrome/browser/download/home/list/holder/SectionTitleViewHolder.java",
+  "java/src/org/chromium/chrome/browser/download/home/list/holder/SeparatorViewHolder.java",
   "java/src/org/chromium/chrome/browser/download/home/list/holder/ThumbnailAwareViewHolder.java",
   "java/src/org/chromium/chrome/browser/download/home/list/holder/VideoViewHolder.java",
   "java/src/org/chromium/chrome/browser/download/home/list/ListProperties.java",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/filter/FiltersTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/filter/FiltersTest.java
index 6cc5fb7..31dd6156 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/filter/FiltersTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/filter/FiltersTest.java
@@ -18,17 +18,17 @@
 public class FiltersTest {
     @Test
     public void testFilterConversions() {
-        Assert.assertEquals(
-                Filters.FilterType.SITES, Filters.fromOfflineItem(OfflineItemFilter.FILTER_PAGE));
-        Assert.assertEquals(
-                Filters.FilterType.VIDEOS, Filters.fromOfflineItem(OfflineItemFilter.FILTER_VIDEO));
-        Assert.assertEquals(
-                Filters.FilterType.MUSIC, Filters.fromOfflineItem(OfflineItemFilter.FILTER_AUDIO));
-        Assert.assertEquals(
-                Filters.FilterType.IMAGES, Filters.fromOfflineItem(OfflineItemFilter.FILTER_IMAGE));
-        Assert.assertEquals(
-                Filters.FilterType.OTHER, Filters.fromOfflineItem(OfflineItemFilter.FILTER_OTHER));
-        Assert.assertEquals(Filters.FilterType.OTHER,
+        Assert.assertEquals(Integer.valueOf(Filters.FilterType.SITES),
+                Filters.fromOfflineItem(OfflineItemFilter.FILTER_PAGE));
+        Assert.assertEquals(Integer.valueOf(Filters.FilterType.VIDEOS),
+                Filters.fromOfflineItem(OfflineItemFilter.FILTER_VIDEO));
+        Assert.assertEquals(Integer.valueOf(Filters.FilterType.MUSIC),
+                Filters.fromOfflineItem(OfflineItemFilter.FILTER_AUDIO));
+        Assert.assertEquals(Integer.valueOf(Filters.FilterType.IMAGES),
+                Filters.fromOfflineItem(OfflineItemFilter.FILTER_IMAGE));
+        Assert.assertEquals(Integer.valueOf(Filters.FilterType.OTHER),
+                Filters.fromOfflineItem(OfflineItemFilter.FILTER_OTHER));
+        Assert.assertEquals(Integer.valueOf(Filters.FilterType.OTHER),
                 Filters.fromOfflineItem(OfflineItemFilter.FILTER_DOCUMENT));
     }
 }
\ No newline at end of file
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
index b008d49..1da03d1 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/download/home/list/DateOrderedListMutatorTest.java
@@ -24,8 +24,11 @@
 import org.chromium.chrome.browser.download.home.filter.OfflineItemFilterSource;
 import org.chromium.chrome.browser.download.home.list.ListItem.DateListItem;
 import org.chromium.chrome.browser.download.home.list.ListItem.OfflineItemListItem;
+import org.chromium.chrome.browser.download.home.list.ListItem.SectionHeaderListItem;
+import org.chromium.chrome.browser.download.home.list.ListItem.SeparatorViewListItem;
 import org.chromium.chrome.browser.modelutil.ListObservable.ListObserver;
 import org.chromium.components.offline_items_collection.OfflineItem;
+import org.chromium.components.offline_items_collection.OfflineItemFilter;
 
 import java.util.Calendar;
 import java.util.Collections;
@@ -70,126 +73,228 @@
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 1:00 1/1/2018)        [ HEADER @ 0:00 1/1/2018,
-     *                                        item1  @ 1:00 1/1/2018 ]
+     * 1. Set(item1 @ 1:00 1/1/2018)        [ DATE    @ 0:00 1/1/2018,
+     *                                        SECTION @ Video,
+     *                                        item1   @ 1:00 1/1/2018 ]
      */
     @Test
     public void testSingleItem() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 1));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
 
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 1), item1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 1), item1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 2:00 1/1/2018,        [ HEADER @ 0:00 1/1/2018,
-     *        item2 @ 1:00 1/1/2018)          item1  @ 2:00 1/1/2018,
-     *                                        item2  @ 1:00 1/1/2018 ]
+     * 1. Set(item1 @ 2:00 1/1/2018,        [ DATE    @ 0:00 1/1/2018,
+     *        item2 @ 1:00 1/1/2018)          SECTION @ Video,
+     *                                        item1   @ 2:00 1/1/2018,
+     *                                        item2   @ 1:00 1/1/2018 ]
      */
     @Test
     public void testTwoItemsSameDay() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 2));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 1));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 2), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
 
-        Assert.assertEquals(3, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 2), item1);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 1, 1), item2);
+        Assert.assertEquals(4, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 2), item1);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 1, 1), item2);
+    }
+
+    /**
+     * Action                                     List
+     * 1. Set(item1 @ 2:00 1/1/2018 Video,        [ DATE    @ 0:00 1/1/2018,
+     *        item2 @ 1:00 1/1/2018 Audio)          SECTION @ Video,
+     *                                              item1   @ 2:00 1/1/2018,
+     *                                              -----------------------
+     *                                              SECTION @ Audio,
+     *                                              item2   @ 1:00 1/1/2018 ]
+     */
+    @Test
+    public void testTwoItemsSameDayDifferentSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 2), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 1), OfflineItemFilter.FILTER_AUDIO);
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+
+        Assert.assertEquals(6, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 2), item1);
+        assertSeparator(mModel.get(3), buildCalendar(2018, 1, 1, 0), false);
+        assertSectionHeader(
+                mModel.get(4), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_AUDIO);
+        assertOfflineItem(mModel.get(5), buildCalendar(2018, 1, 1, 1), item2);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 0:00 1/2/2018,        [ HEADER @ 0:00 1/2/2018,
-     *        item2 @ 0:00 1/1/2018)          item1  @ 0:00 1/2/2018,
-     *                                        HEADER @ 0:00 1/1/2018,
-     *                                        item2  @ 0:00 1/1/2018 ]
+     * 1. Set(item1 @ 0:00 1/2/2018,        [ DATE    @ 0:00 1/2/2018,
+     *        item2 @ 0:00 1/1/2018)          SECTION @ Video,
+     *                                        item1   @ 0:00 1/2/2018,
+     *                                        -----------------------
+     *                                        DATE  @ 0:00 1/1/2018,
+     *                                        SECTION @ Audio,
+     *                                        item2   @ 0:00 1/1/2018 ]
      */
     @Test
     public void testTwoItemsDifferentDayMatchHeader() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 0));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 0));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_AUDIO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
 
-        Assert.assertEquals(4, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 0), item1);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(3), buildCalendar(2018, 1, 1, 0), item2);
+        Assert.assertEquals(7, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 0), item1);
+        assertSeparator(mModel.get(3), buildCalendar(2018, 1, 2, 0), true);
+        assertDateHeader(mModel.get(4), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(5), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_AUDIO);
+        assertOfflineItem(mModel.get(6), buildCalendar(2018, 1, 1, 0), item2);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 4:00 1/1/2018,        [ HEADER @ 0:00 1/1/2018,
-     *        item2 @ 5:00 1/1/2018)          item2  @ 5:00 1/1/2018,
-     *                                        item1  @ 4:00 1/1/2018 ]
+     * 1. Set(item1 @ 4:00 1/1/2018,        [ DATE    @ 0:00 1/1/2018,
+     *        item2 @ 5:00 1/1/2018)          SECTION @ Video,
+     *                                        item2   @ 5:00 1/1/2018,
+     *                                        item1   @ 4:00 1/1/2018 ]
      */
     @Test
     public void testTwoItemsSameDayOutOfOrder() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 4));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 5));
-        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
-        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
-
-        Assert.assertEquals(3, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 5), item2);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 1, 4), item1);
-    }
-
-    /**
-     * Action                               List
-     * 1. Set(item1 @ 4:00 1/2/2018,        [ HEADER @ 0:00 1/2/2018,
-     *        item2 @ 5:00 1/1/2018)          item2  @ 4:00 1/2/2018,
-     *                                        HEADER @ 0:00 1/1/2018,
-     *                                        item1  @ 5:00 1/1/2018 ]
-     */
-    @Test
-    public void testTwoItemsDifferentDay() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 4));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 5));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
 
         Assert.assertEquals(4, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 4), item1);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(3), buildCalendar(2018, 1, 1, 5), item2);
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 5), item2);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 1, 4), item1);
+    }
+
+    /**
+     * Action                                      List
+     * 1. Set(item1 @ 4:00 1/2/2018 Video,         [ DATE      @ 0:00 1/2/2018,
+     *        item2 @ 5:00 1/1/2018 Video)           SECTION   @ Video,
+     *                                               item2     @ 4:00 1/2/2018,
+     *                                               -----------------------
+     *                                               DATE      @ 0:00 1/1/2018,
+     *                                               SECTION   @ Video,
+     *                                               item1     @ 5:00 1/1/2018 ]
+     */
+    @Test
+    public void testTwoItemsDifferentDaySameSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 4), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_VIDEO);
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+
+        Assert.assertEquals(7, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 4), item1);
+        assertSeparator(mModel.get(3), buildCalendar(2018, 1, 2, 0), true);
+        assertDateHeader(mModel.get(4), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(5), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(6), buildCalendar(2018, 1, 1, 5), item2);
+    }
+
+    /**
+     * Action                                      List
+     * 1. Set(item1 @ 4:00 1/2/2018 Video,         [ DATE      @ 0:00 1/2/2018,
+     *        item2 @ 5:00 1/1/2018 Page )           SECTION   @ Video,
+     *                                               item2     @ 4:00 1/2/2018,
+     *                                               -----------------------
+     *                                               DATE      @ 0:00 1/1/2018,
+     *                                               SECTION   @ Page,
+     *                                               item1     @ 5:00 1/1/2018 ]
+     */
+    @Test
+    public void testTwoItemsDifferentDayDifferentSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 4), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_PAGE);
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+
+        Assert.assertEquals(7, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 4), item1);
+        assertSeparator(mModel.get(3), buildCalendar(2018, 1, 2, 0), true);
+        assertDateHeader(mModel.get(4), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(5), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_PAGE);
+        assertOfflineItem(mModel.get(6), buildCalendar(2018, 1, 1, 5), item2);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 4:00 1/1/2018,        [ HEADER @ 0:00 1/2/2018,
+     * 1. Set(item1 @ 4:00 1/1/2018,        [ DATE   @ 0:00 1/2/2018,
      *        item2 @ 3:00 1/2/2018)          item2  @ 3:00 1/2/2018,
-     *                                        HEADER @ 0:00 1/1/2018,
+     *                                        -----------------------
+     *                                        DATE   @ 0:00 1/1/2018,
      *                                        item1  @ 4:00 1/1/2018 ]
      */
     @Test
     public void testTwoItemsDifferentDayOutOfOrder() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 4));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 2, 3));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 3), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
 
-        Assert.assertEquals(4, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 3), item2);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(3), buildCalendar(2018, 1, 1, 4), item1);
+        Assert.assertEquals(7, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 3), item2);
+        assertSeparator(mModel.get(3), buildCalendar(2018, 1, 2, 0), true);
+        assertDateHeader(mModel.get(4), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(5), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(6), buildCalendar(2018, 1, 1, 4), item1);
     }
 
     /**
      * Action                               List
      * 1. Set()                             [ ]
      *
-     * 2. Add(item1 @ 4:00 1/1/2018)        [ HEADER @ 0:00 1/1/2018,
+     * 2. Add(item1 @ 4:00 1/1/2018)        [ DATE    @ 0:00 1/1/2018,
      *                                        item1  @ 4:00 1/1/2018 ]
      */
     @Test
@@ -198,120 +303,134 @@
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 4));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         list.onItemsAdded(CollectionUtil.newArrayList(item1));
 
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 0, 2);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 4), item1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 4), item1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 1:00 1/2/2018)        [ HEADER @ 0:00 1/2/2018,
+     * 1. Set(item1 @ 1:00 1/2/2018)        [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 1:00 1/2/2018 ]
-     *
-     * 2. Add(item2 @ 2:00 1/2/2018)        [ HEADER @ 0:00 1/2/2018,
+     * 2. Add(item2 @ 2:00 1/2/2018)        [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item2  @ 2:00 1/2/2018
      *                                        item1  @ 1:00 1/2/2018 ]
-     *
-     * 3. Add(item3 @ 2:00 1/3/2018)        [ HEADER @ 0:00 1/3/2018,
+     * 3. Add(item3 @ 2:00 1/3/2018)        [ DATE    @ 0:00 1/3/2018,
+     *                                        SECTION @ Video,
      *                                        item3  @ 2:00 1/3/2018
-     *                                        HEADER @ 0:00 1/2/2018,
+     *                                        -----------------------
+     *                                        DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item2  @ 2:00 1/2/2018
      *                                        item1  @ 1:00 1/2/2018 ]
      */
     @Test
     public void testAddFirstItemToList() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 1));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 1), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
         // Add an item on the same day that will be placed first.
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 2, 2));
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         list.onItemsAdded(CollectionUtil.newArrayList(item2));
 
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 1, 1);
-        Assert.assertEquals(3, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 2), item2);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 2, 1), item1);
+        Assert.assertEquals(4, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 2), item2);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 2, 1), item1);
 
         // Add an item on an earlier day that will be placed first.
-        OfflineItem item3 = buildItem("3", buildCalendar(2018, 1, 3, 2));
+        OfflineItem item3 =
+                buildItem("3", buildCalendar(2018, 1, 3, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2, item3));
         list.onItemsAdded(CollectionUtil.newArrayList(item3));
 
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 0, 2);
-        Assert.assertEquals(5, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 3, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 3, 2), item3);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(3), buildCalendar(2018, 1, 2, 2), item2);
-        assertListItemEquals(mModel.get(4), buildCalendar(2018, 1, 2, 1), item1);
+        Assert.assertEquals(8, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 3, 0));
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 3, 2), item3);
+        assertSeparator(mModel.get(3), buildCalendar(2018, 1, 3, 0), true);
+        assertDateHeader(mModel.get(4), buildCalendar(2018, 1, 2, 0));
+        assertOfflineItem(mModel.get(6), buildCalendar(2018, 1, 2, 2), item2);
+        assertOfflineItem(mModel.get(7), buildCalendar(2018, 1, 2, 1), item1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 4:00 1/2/2018)        [ HEADER @ 0:00 1/2/2018,
+     * 1. Set(item1 @ 4:00 1/2/2018)        [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 4:00 1/2/2018 ]
      *
-     * 2. Add(item2 @ 3:00 1/2/2018)        [ HEADER @ 0:00 1/2/2018,
+     * 2. Add(item2 @ 3:00 1/2/2018)        [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 4:00 1/2/2018
      *                                        item2  @ 3:00 1/2/2018 ]
      *
-     * 3. Add(item3 @ 4:00 1/1/2018)        [ HEADER @ 0:00 1/2/2018,
+     * 3. Add(item3 @ 4:00 1/1/2018)        [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 4:00 1/2/2018
      *                                        item2  @ 3:00 1/2/2018,
-     *                                        HEADER @ 0:00 1/1/2018,
+     *                                        -----------------------
+     *                                        DATE    @ 0:00 1/1/2018,
+     *                                        SECTION @ Video,
      *                                        item3  @ 4:00 1/1/2018
      */
     @Test
     public void testAddLastItemToList() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 4));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 4), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
         // Add an item on the same day that will be placed last.
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 2, 3));
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 3), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         list.onItemsAdded(CollectionUtil.newArrayList(item2));
 
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 2, 1);
-        Assert.assertEquals(3, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 4), item1);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 2, 3), item2);
+        Assert.assertEquals(4, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 4), item1);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 2, 3), item2);
 
         // Add an item on a later day that will be placed last.
-        OfflineItem item3 = buildItem("3", buildCalendar(2018, 1, 1, 4));
+        OfflineItem item3 =
+                buildItem("3", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2, item3));
         list.onItemsAdded(CollectionUtil.newArrayList(item3));
 
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 3, 2);
-        Assert.assertEquals(5, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 4), item1);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 2, 3), item2);
-        assertListItemEquals(mModel.get(3), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(4), buildCalendar(2018, 1, 1, 4), item3);
+        Assert.assertEquals(8, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 4), item1);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 2, 3), item2);
+        assertSeparator(mModel.get(4), buildCalendar(2018, 1, 2, 0), true);
+        assertDateHeader(mModel.get(5), buildCalendar(2018, 1, 1, 0));
+        assertOfflineItem(mModel.get(7), buildCalendar(2018, 1, 1, 4), item3);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 2:00 1/2/2018)        [ HEADER @ 0:00 1/2/2018,
+     * 1. Set(item1 @ 2:00 1/2/2018)        [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 2:00 1/2/2018 ]
      *
      * 2. Remove(item1)                     [ ]
      */
     @Test
     public void testRemoveOnlyItemInList() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 2));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
@@ -319,23 +438,26 @@
         when(mSource.getItems()).thenReturn(Collections.emptySet());
         list.onItemsRemoved(CollectionUtil.newArrayList(item1));
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 0, 2);
         Assert.assertEquals(0, mModel.size());
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 3:00 1/2/2018,        [ HEADER @ 0:00 1/2/2018,
-     *        item2 @ 2:00 1/2/2018)          item1  @ 3:00 1/2/2018,
+     * 1. Set(item1 @ 3:00 1/2/2018,        [ DATE    @ 0:00 1/2/2018,
+     *        item2 @ 2:00 1/2/2018)          SECTION @ Video,
+     *                                        item1  @ 3:00 1/2/2018,
      *                                        item2  @ 2:00 1/2/2018 ]
      *
-     * 2. Remove(item1)                     [ HEADER @ 0:00 1/2/2018,
+     * 2. Remove(item1)                     [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item2  @ 2:00 1/2/2018 ]
      */
     @Test
     public void testRemoveFirstItemInListSameDay() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 3));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 2, 2));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 3), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
@@ -343,25 +465,30 @@
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item2));
         list.onItemsRemoved(CollectionUtil.newArrayList(item1));
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 1, 1);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 2), item2);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 2), item2);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 3:00 1/2/2018,        [ HEADER @ 0:00 1/2/2018,
-     *        item2 @ 2:00 1/2/2018)          item1  @ 3:00 1/2/2018,
+     * 1. Set(item1 @ 3:00 1/2/2018,        [ DATE    @ 0:00 1/2/2018,
+     *        item2 @ 2:00 1/2/2018)          SECTION @ Video,
+     *                                        item1  @ 3:00 1/2/2018,
      *                                        item2  @ 2:00 1/2/2018 ]
      *
-     * 2. Remove(item2)                     [ HEADER @ 0:00 1/2/2018,
+     * 2. Remove(item2)                     [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 3:00 1/2/2018 ]
      */
     @Test
     public void testRemoveLastItemInListSameDay() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 2, 3));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 2, 2));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 3), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
@@ -369,26 +496,67 @@
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         list.onItemsRemoved(CollectionUtil.newArrayList(item2));
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 2, 1);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 3), item1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 3), item1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 3:00 1/3/2018,        [ HEADER @ 0:00 1/3/2018,
-     *        item2 @ 2:00 1/2/2018)          item1  @ 3:00 1/3/2018,
-     *                                        HEADER @ 0:00 1/2/2018,
+     * 1. Set(item1 @ 3:00 1/2/2018 Video,  [ DATE    @ 0:00 1/2/2018,
+     *        item2 @ 2:00 1/2/2018 Image)    SECTION @ Video,
+     *                                        item1  @ 3:00 1/2/2018,
+     *                                        ----------------------
+     *                                        SECTION @ Image,
      *                                        item2  @ 2:00 1/2/2018 ]
      *
-     * 2. Remove(item2)                     [ HEADER @ 0:00 1/3/2018,
+     * 2. Remove(item1)                     [ DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Image,
+     *                                        item2  @ 2:00 1/2/2018 ]
+     */
+    @Test
+    public void testRemoveOnlyItemInSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 3), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_IMAGE);
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        mModel.addObserver(mObserver);
+        Assert.assertEquals(6, mModel.size());
+
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item2));
+        list.onItemsRemoved(CollectionUtil.newArrayList(item1));
+
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_IMAGE);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 2), item2);
+    }
+
+    /**
+     * Action                               List
+     * 1. Set(item1 @ 3:00 1/3/2018,        [ DATE    @ 0:00 1/3/2018,
+     *        item2 @ 2:00 1/2/2018)          SECTION @ Video,
+     *                                        item1  @ 3:00 1/3/2018,
+     *                                        -----------------------
+     *                                        DATE    @ 0:00 1/2/2018,
+     *                                        SECTION @ Video,
+     *                                        item2  @ 2:00 1/2/2018 ]
+     *
+     * 2. Remove(item2)                     [ DATE    @ 0:00 1/3/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 3:00 1/3/2018 ]
      */
     @Test
     public void testRemoveLastItemInListWithMultipleDays() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 3, 3));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 2, 2));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 3, 3), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 2, 2), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
@@ -396,20 +564,24 @@
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         list.onItemsRemoved(CollectionUtil.newArrayList(item2));
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 2, 2);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 3, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 3, 3), item1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 3, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 3, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 3, 3), item1);
     }
 
     /**
      * Action                               List
      * 1. Set()                             [ ]
      *
-     * 2. Add(item1 @ 6:00  1/1/2018,       [ HEADER @ 0:00  1/2/2018,
-     *        item2 @ 4:00  1/1/2018,         item4  @ 12:00 1/2/2018,
-     *        item3 @ 10:00 1/2/2018,         item3  @ 10:00 1/2/2018
-     *        item4 @ 12:00 1/2/2018)         HEADER @ 0:00  1/1/2018,
+     * 2. Add(item1 @ 6:00  1/1/2018,       [ DATE    @ 0:00  1/2/2018,
+     *        item2 @ 4:00  1/1/2018,         SECTION @ Video,
+     *        item3 @ 10:00 1/2/2018,         item4  @ 12:00 1/2/2018,
+     *        item4 @ 12:00 1/2/2018)         item3  @ 10:00 1/2/2018
+     *                                        -----------------------
+     *                                        DATE    @ 0:00  1/1/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 6:00  1/1/2018,
      *                                        item2  @ 4:00  1/1/2018 ]
      */
@@ -419,44 +591,59 @@
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 6));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 4));
-        OfflineItem item3 = buildItem("3", buildCalendar(2018, 1, 2, 10));
-        OfflineItem item4 = buildItem("4", buildCalendar(2018, 1, 2, 12));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 6), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item3 =
+                buildItem("3", buildCalendar(2018, 1, 2, 10), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item4 =
+                buildItem("4", buildCalendar(2018, 1, 2, 12), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems())
                 .thenReturn(CollectionUtil.newArrayList(item1, item2, item3, item4));
         list.onItemsAdded(CollectionUtil.newArrayList(item1, item2, item3, item4));
 
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 0, 6);
-        Assert.assertEquals(6, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 12), item4);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 2, 10), item3);
-        assertListItemEquals(mModel.get(3), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(4), buildCalendar(2018, 1, 1, 6), item1);
-        assertListItemEquals(mModel.get(5), buildCalendar(2018, 1, 1, 4), item2);
+        Assert.assertEquals(9, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 12), item4);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 2, 10), item3);
+        assertSeparator(mModel.get(4), buildCalendar(2018, 1, 2, 0), true);
+        assertDateHeader(mModel.get(5), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(6), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(7), buildCalendar(2018, 1, 1, 6), item1);
+        assertOfflineItem(mModel.get(8), buildCalendar(2018, 1, 1, 4), item2);
     }
 
     /**
      * Action                               List
-     * 2. Set(item1 @ 6:00  1/1/2018,       [ HEADER @ 0:00  1/2/2018,
-     *        item2 @ 4:00  1/1/2018,         item4  @ 12:00 1/2/2018,
-     *        item3 @ 10:00 1/2/2018,         item3  @ 10:00 1/2/2018
-     *        item4 @ 12:00 1/2/2018)         HEADER @ 0:00  1/1/2018,
+     * 2. Set(item1 @ 6:00  1/1/2018,       [ DATE    @ 0:00  1/2/2018,
+     *        item2 @ 4:00  1/1/2018,         SECTION @ Video,
+     *        item3 @ 10:00 1/2/2018,         item4  @ 12:00 1/2/2018,
+     *        item4 @ 12:00 1/2/2018)         item3  @ 10:00 1/2/2018
+     *                                        -----------------------
+     *                                        DATE    @ 0:00  1/1/2018,
+     *                                        SECTION @ Video,
      *                                        item1  @ 6:00  1/1/2018,
      *                                        item2  @ 4:00  1/1/2018 ]
      *
-     * 2. Remove(item2,                     [ HEADER @ 0:00  1/1/2018,
-     *           item3,                       item1  @ 6:00  1/1/2018 ]
-     *           item4)
+     * 2. Remove(item2,                     [ DATE    @ 0:00  1/1/2018,
+     *           item3,                       SECTION @ Video,
+     *           item4)                       item1  @ 6:00  1/1/2018 ]
      */
     @Test
     public void testRemoveMultipleItems() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 6));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 4));
-        OfflineItem item3 = buildItem("3", buildCalendar(2018, 1, 2, 10));
-        OfflineItem item4 = buildItem("4", buildCalendar(2018, 1, 2, 12));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 6), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item3 =
+                buildItem("3", buildCalendar(2018, 1, 2, 10), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item4 =
+                buildItem("4", buildCalendar(2018, 1, 2, 12), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems())
                 .thenReturn(CollectionUtil.newArrayList(item1, item2, item3, item4));
@@ -466,100 +653,155 @@
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         list.onItemsRemoved(CollectionUtil.newArrayList(item2, item3, item4));
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 5, 1);
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 0, 3);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 6), item1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 6), item1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 4:00 1/1/2018)        [ HEADER    @ 0:00  1/1/2018,
+     * 1. Set(item1 @ 4:00 1/1/2018)        [ DATE      @ 0:00  1/1/2018,
+     *                                        SECTION @ Video,
      *                                        item1     @ 4:00  1/1/2018 ]
      *
      * 2. Update (item1,
-     *            newItem1 @ 4:00 1/1/2018) [ HEADER    @ 0:00  1/1/2018,
+     *            newItem1 @ 4:00 1/1/2018) [ DATE      @ 0:00  1/1/2018,
+     *                                        SECTION @ Video,
      *                                        newItem1  @ 4:00  1/1/2018 ]
      */
     @Test
     public void testItemUpdatedSameTimestamp() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 4));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
-        OfflineItem newItem1 = buildItem("1", buildCalendar(2018, 1, 1, 4));
+        OfflineItem newItem1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(newItem1));
         list.onItemUpdated(item1, newItem1);
 
-        verify(mObserver, times(1)).onItemRangeChanged(mModel, 1, 1, null);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 4), newItem1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 4), newItem1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 5:00 1/1/2018,        [ HEADER    @ 0:00  1/1/2018,
-     *        item2 @ 4:00 1/1/2018)          item1     @ 5:00  1/1/2018,
+     * 1. Set(item1 @ 5:00 1/1/2018,        [ DATE      @ 0:00  1/1/2018,
+     *        item2 @ 4:00 1/1/2018)          SECTION @ Video,
+     *                                        item1     @ 5:00  1/1/2018,
      *                                        item2     @ 4:00  1/1/2018
      * 2. Update (item1,
-     *            newItem1 @ 3:00 1/1/2018) [ HEADER    @ 0:00  1/1/2018,
+     *            newItem1 @ 3:00 1/1/2018) [ DATE      @ 0:00  1/1/2018,
+     *                                        SECTION @ Video,
      *                                        item2     @ 4:00  1/1/2018,
      *                                        newItem1  @ 3:00  1/1/2018 ]
      */
     @Test
     public void testItemUpdatedSameDay() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 5));
-        OfflineItem item2 = buildItem("2", buildCalendar(2018, 1, 1, 4));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
-        OfflineItem newItem1 = buildItem("1", buildCalendar(2018, 1, 1, 3));
+        OfflineItem newItem1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 3), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(newItem1, item2));
         list.onItemUpdated(item1, newItem1);
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 1, 1);
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 2, 1);
-        Assert.assertEquals(3, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 1, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 1, 4), item2);
-        assertListItemEquals(mModel.get(2), buildCalendar(2018, 1, 1, 3), newItem1);
+        Assert.assertEquals(4, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 4), item2);
+        assertOfflineItem(mModel.get(3), buildCalendar(2018, 1, 1, 3), newItem1);
+    }
+
+    /**
+     * Action                                   List
+     * 1. Set(item1 @ 5:00 1/1/2018,            [ DATE      @ 0:00  1/1/2018,
+     *        item2 @ 4:00 1/1/2018)              SECTION @ Video,
+     *                                            item1     @ 5:00  1/1/2018,
+     *                                            item2     @ 4:00  1/1/2018
+     * 2. Update (item1,
+     *            newItem1 @ 3:00 1/1/2018 Image) [ DATE      @ 0:00  1/1/2018,
+     *                                              SECTION @ Video,
+     *                                              item2     @ 4:00  1/1/2018,
+     *                                              -------------------------
+     *                                              SECTION @ Image,
+     *                                              newItem1  @ 3:00  1/1/2018 ]
+     */
+    @Test
+    public void testItemUpdatedSameDayDifferentSection() {
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 5), OfflineItemFilter.FILTER_VIDEO);
+        OfflineItem item2 =
+                buildItem("2", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
+
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1, item2));
+        DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
+        mModel.addObserver(mObserver);
+
+        // Update an item with the same timestamp.
+        OfflineItem newItem1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 3), OfflineItemFilter.FILTER_IMAGE);
+        when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(newItem1, item2));
+        list.onItemUpdated(item1, newItem1);
+
+        Assert.assertEquals(6, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 1, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 1, 4), item2);
+        assertSectionHeader(
+                mModel.get(4), buildCalendar(2018, 1, 1, 0), OfflineItemFilter.FILTER_IMAGE);
+        assertOfflineItem(mModel.get(5), buildCalendar(2018, 1, 1, 3), newItem1);
     }
 
     /**
      * Action                               List
-     * 1. Set(item1 @ 4:00 1/1/2018)        [ HEADER    @ 0:00  1/1/2018,
+     * 1. Set(item1 @ 4:00 1/1/2018)        [ DATE      @ 0:00  1/1/2018,
+     *                                        SECTION @ Video,
      *                                        item1     @ 4:00  1/1/2018 ]
      *
      * 2. Update (item1,
-     *            newItem1 @ 6:00 1/2/2018) [ HEADER    @ 0:00  1/2/2018,
+     *            newItem1 @ 6:00 1/2/2018) [ DATE      @ 0:00  1/2/2018,
+     *                                        SECTION @ Video,
      *                                        newItem1  @ 6:00  1/2/2018 ]
      */
     @Test
     public void testItemUpdatedDifferentDay() {
-        OfflineItem item1 = buildItem("1", buildCalendar(2018, 1, 1, 4));
+        OfflineItem item1 =
+                buildItem("1", buildCalendar(2018, 1, 1, 4), OfflineItemFilter.FILTER_VIDEO);
 
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(item1));
         DateOrderedListMutator list = new DateOrderedListMutator(mSource, mModel);
         mModel.addObserver(mObserver);
 
         // Update an item with the same timestamp.
-        OfflineItem newItem1 = buildItem("1", buildCalendar(2018, 1, 2, 6));
+        OfflineItem newItem1 =
+                buildItem("1", buildCalendar(2018, 1, 2, 6), OfflineItemFilter.FILTER_VIDEO);
         when(mSource.getItems()).thenReturn(CollectionUtil.newArrayList(newItem1));
         list.onItemUpdated(item1, newItem1);
 
-        verify(mObserver, times(1)).onItemRangeRemoved(mModel, 0, 2);
-        verify(mObserver, times(1)).onItemRangeInserted(mModel, 0, 2);
-        Assert.assertEquals(2, mModel.size());
-        assertListItemEquals(mModel.get(0), buildCalendar(2018, 1, 2, 0), null);
-        assertListItemEquals(mModel.get(1), buildCalendar(2018, 1, 2, 6), newItem1);
+        Assert.assertEquals(3, mModel.size());
+        assertDateHeader(mModel.get(0), buildCalendar(2018, 1, 2, 0));
+        assertSectionHeader(
+                mModel.get(1), buildCalendar(2018, 1, 2, 0), OfflineItemFilter.FILTER_VIDEO);
+        assertOfflineItem(mModel.get(2), buildCalendar(2018, 1, 2, 6), newItem1);
     }
 
     private static Calendar buildCalendar(int year, int month, int dayOfMonth, int hourOfDay) {
@@ -568,29 +810,54 @@
         return calendar;
     }
 
-    private static OfflineItem buildItem(String id, Calendar calendar) {
+    private static OfflineItem buildItem(
+            String id, Calendar calendar, @OfflineItemFilter int filter) {
         OfflineItem item = new OfflineItem();
         item.id.namespace = "test";
         item.id.id = id;
         item.creationTimeMs = calendar.getTimeInMillis();
+        item.filter = filter;
         return item;
     }
 
-    private static void assertListItemEquals(
-            ListItem item, Calendar calendar, OfflineItem offlineItem) {
+    private static void assertDatesAreEqual(ListItem item, Calendar calendar) {
         Assert.assertTrue(item instanceof DateListItem);
-
-        if (offlineItem == null) {
-            Assert.assertFalse(item instanceof OfflineItemListItem);
-            Assert.assertEquals(DateListItem.generateStableIdForDayOfYear(calendar), item.stableId);
-        } else {
-            Assert.assertTrue(item instanceof OfflineItemListItem);
-            Assert.assertEquals(OfflineItemListItem.generateStableId(offlineItem), item.stableId);
-            Assert.assertEquals(offlineItem, ((OfflineItemListItem) item).item);
-        }
-
         Calendar calendar2 = CalendarFactory.get();
         calendar2.setTime(((DateListItem) item).date);
         Assert.assertEquals(calendar.getTimeInMillis(), calendar2.getTimeInMillis());
     }
-}
\ No newline at end of file
+
+    private static void assertDateHeader(ListItem item, Calendar calendar) {
+        Assert.assertTrue(item instanceof DateListItem);
+        Assert.assertFalse(item instanceof OfflineItemListItem);
+        Assert.assertFalse(item instanceof SectionHeaderListItem);
+        Assert.assertFalse(item instanceof SeparatorViewListItem);
+
+        assertDatesAreEqual(item, calendar);
+        Assert.assertEquals(DateListItem.generateStableIdForDayOfYear(calendar), item.stableId);
+    }
+
+    private static void assertOfflineItem(
+            ListItem item, Calendar calendar, OfflineItem offlineItem) {
+        assertDatesAreEqual(item, calendar);
+        Assert.assertTrue(item instanceof OfflineItemListItem);
+        Assert.assertEquals(OfflineItemListItem.generateStableId(offlineItem), item.stableId);
+        Assert.assertEquals(offlineItem, ((OfflineItemListItem) item).item);
+    }
+
+    private static void assertSectionHeader(
+            ListItem item, Calendar calendar, @OfflineItemFilter int filter) {
+        assertDatesAreEqual(item, calendar);
+        Assert.assertTrue(item instanceof SectionHeaderListItem);
+        Assert.assertEquals(filter, ((SectionHeaderListItem) item).filter);
+        Assert.assertEquals(
+                SectionHeaderListItem.generateStableId(calendar.getTimeInMillis(), filter),
+                item.stableId);
+    }
+
+    private static void assertSeparator(ListItem item, Calendar calendar, boolean isDateDivider) {
+        assertDatesAreEqual(item, calendar);
+        Assert.assertTrue(item instanceof SeparatorViewListItem);
+        Assert.assertEquals(isDateDivider, ((SeparatorViewListItem) item).isDateDivider());
+    }
+}
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 20a9057b..0342213 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-70.0.3510.3_rc-r1.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-70.0.3515.0_rc-r1.afdo.bz2
\ No newline at end of file
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp
index bc3809c..7e1d27a 100644
--- a/chrome/app/chromeos_strings.grdp
+++ b/chrome/app/chromeos_strings.grdp
@@ -4821,10 +4821,10 @@
     Google assistant logo
   </message>
   <message name="IDS_ASSISTANT_HOTWORD_TITLE" desc="Title for assistant hotword optin.">
-    OK Google
+    Ok Google
   </message>
   <message name="IDS_ASSISTANT_HOTWORD_DESC" desc="Description for assistant hotword optin.">
-    Access your Assistant anytime you say "OK Google" when your device is awake and unlocked.
+    Access your Assistant anytime you say "Ok Google" when your device is awake and unlocked.
   </message>
   <message name="IDS_ASSISTANT_SCREEN_CONTEXT_TITLE" desc="Title for assistant screen context optin.">
     Get info for what's on screen
@@ -4839,7 +4839,7 @@
     Your Assistant is ready
   </message>
   <message name="IDS_ASSISTANT_READY_SCREEN_MESSAGE" desc="Message for assistant ready screen.">
-    When your Chromebook is set up, press the Assistant button or say "OK Google" to get help from your Assistant anytime.
+    When your Chromebook is set up, press the Assistant button or say "Ok Google" to get help from your Assistant anytime.
   </message>
   <message name="IDS_ASSISTANT_THIRD_PARTY_SCREEN_TITLE" desc="Title for assitant third party screen.">
     Google Partners work with your Assistant to help you
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb
index 6236f0c..30566da 100644
--- a/chrome/app/resources/chromium_strings_am.xtb
+++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Chromium በዚህ ቋንቋ እየታየ ነው</translation>
 <translation id="81770708095080097">ይህ ፋይል አደገኛ ስለሆነ Chromium አግዶታል።</translation>
 <translation id="8222496066431494154">Chromiumን በእርስዎ ስልክ ላይ ይጫኑ። አንድ ኤስኤምኤስ ወደዚህ የመለያ መልሶ ማግኛ ስልክዎ እንልካለን፦ <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">ይህ ገጽ በጣም ብዙ ማህደረ ትውስታን ይጠቀማል፣ ስለዚህ Chrome አንዳንድ ይዘትን አስወግዷል።</translation>
 <translation id="8269379391216269538">Chromium ይበልጥ የተሻለ እንዲሆን ያግዙ</translation>
 <translation id="8290862415967981663">ይህ ፋይል አደገኛ ሊሆን ስለሚችል Chromium አግዶታል።</translation>
 <translation id="8330519371938183845">Chromiumን በመላ መሣሪያዎችዎ ላይ ለማሳመር እና ግላዊነት ለማላበስ</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb
index 98e327d1..d5e4f45 100644
--- a/chrome/app/resources/chromium_strings_ar.xtb
+++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">‏يتم عرض Chromium بهذه اللغة</translation>
 <translation id="81770708095080097">‏هذا الملف ضار، لذلك فقد حظره Chromium.</translation>
 <translation id="8222496066431494154">‏بادِر بتثبيت Chromium على هاتفك. سنرسل رسالة قصيرة SMS إلى رقم هاتف استرداد حسابك: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">‏تستهلك هذه الصفحة مساحة كبيرة من الذاكرة، لذلك أزال Chrome بعض محتواها.</translation>
 <translation id="8269379391216269538">‏المساعدة في تحسين Chromium</translation>
 <translation id="8290862415967981663">‏قد يكون هذا الملف ضارًا، لذلك فقد حظره Chromium.</translation>
 <translation id="8330519371938183845">‏يمكنك تسجيل الدخول لمزامنة Chromium وتخصيصه على جميع أجهزتك.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb
index b8f96b04..733cfdb12 100644
--- a/chrome/app/resources/chromium_strings_bg.xtb
+++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -226,6 +226,7 @@
 <translation id="8157153840442649507">Chromium се показва на този език</translation>
 <translation id="81770708095080097">Chromium блокира този файл, тъй като е опасен.</translation>
 <translation id="8222496066431494154">Инсталирайте Chromium на телефона си. Ще изпратим SMS на телефонния номер за възстановяване на профила ви: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Тази страница използва твърде много памет, така че Chrome премахна част от съдържанието.</translation>
 <translation id="8269379391216269538">Помощ за подобряването на Chromium</translation>
 <translation id="8290862415967981663">Chromium блокира този файл, тъй като може да е опасен.</translation>
 <translation id="8330519371938183845">Влезте в профила си, за да синхронизирате и персонализирате Chromium на всичките си устройства</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb
index 0e02891..a4a8417 100644
--- a/chrome/app/resources/chromium_strings_ca.xtb
+++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium es mostra en aquest idioma</translation>
 <translation id="81770708095080097">Chromium ha bloquejat aquest fitxer perquè és perillós.</translation>
 <translation id="8222496066431494154">Instal·la Chromium al telèfon. T'enviarem un SMS al número de telèfon de recuperació del compte: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Com que aquesta pàgina fa servir massa memòria, Chrome n'ha suprimit contingut.</translation>
 <translation id="8269379391216269538">Ajudeu a millorar Chromium</translation>
 <translation id="8290862415967981663">Chromium ha bloquejat aquest fitxer perquè pot ser perillós.</translation>
 <translation id="8330519371938183845">Inicia la sessió per sincronitzar i personalitzar Chromium en tots els teus dispositius</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb
index d085606..d5cb4cc 100644
--- a/chrome/app/resources/chromium_strings_da.xtb
+++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium vises på dette sprog</translation>
 <translation id="81770708095080097">Denne fil er farlig, så Chromium har blokeret den.</translation>
 <translation id="8222496066431494154">Installer Chromium på din telefon. Vi sender en sms til dit telefonnummer til gendannelse: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Denne side anvender for meget hukommelse, så Chrome har fjernet noget indhold.</translation>
 <translation id="8269379391216269538">Hjælp med at gøre Chromium bedre</translation>
 <translation id="8290862415967981663">Denne fil kan være farlig, så Chromium har blokeret den.</translation>
 <translation id="8330519371938183845">Log ind for at synkronisere og tilpasse Chromium på alle dine enheder</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb
index 24a44b9..8d81ec0 100644
--- a/chrome/app/resources/chromium_strings_de.xtb
+++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium wird in dieser Sprache angezeigt</translation>
 <translation id="81770708095080097">Diese Datei ist schädlich und wurde von Chromium blockiert.</translation>
 <translation id="8222496066431494154">Installieren Sie Chromium auf Ihrem Smartphone. Wir senden Ihnen eine SMS an die Telefonnummer zur Kontowiederherstellung: <ph name="PHONE_NUMBER" />.</translation>
+<translation id="825412236959742607">Diese Seite benötigt zu viel Arbeitsspeicher. Darum hat Chrome einige Inhalte entfernt.</translation>
 <translation id="8269379391216269538">Chromium mit Ihrer Hilfe verbessern</translation>
 <translation id="8290862415967981663">Diese Datei ist eventuell schädlich und wurde von Chromium blockiert.</translation>
 <translation id="8330519371938183845">Wenn Sie sich anmelden, wird Chromium auf allen Ihren Geräten synchronisiert und personalisiert</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb
index 94e3dbf..96f19f6 100644
--- a/chrome/app/resources/chromium_strings_el.xtb
+++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Το Chromium εμφανίζεται σε αυτήν τη γλώσσα</translation>
 <translation id="81770708095080097">Αυτό το αρχείο είναι επικίνδυνο και έχει αποκλειστεί από το Chromium.</translation>
 <translation id="8222496066431494154">Εγκαταστήστε το Chromium στο τηλέφωνό σας. Θα στείλουμε ένα SMS στον αριθμό τηλεφώνου ανάκτησης του λογαριασμού σας: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Αυτή η σελίδα χρησιμοποιεί πάρα πολλή μνήμη. Για αυτόν τον λόγο, το Chrome κατάργησε κάποιο περιεχόμενο.</translation>
 <translation id="8269379391216269538">Βοηθήστε μας να κάνουμε το Chromium καλύτερο</translation>
 <translation id="8290862415967981663">Αυτό το αρχείο ενδέχεται να είναι επικίνδυνο και έχει αποκλειστεί από το Chromium.</translation>
 <translation id="8330519371938183845">Συνδεθείτε, για να συγχρονίσετε και να εξατομικεύσετε το Chromium στις συσκευές σας</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb
index 903f7645..8b9b8b2 100644
--- a/chrome/app/resources/chromium_strings_es.xtb
+++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Chromium se muestra en este idioma</translation>
 <translation id="81770708095080097">Este archivo es peligroso, por lo que Chromium lo ha bloqueado.</translation>
 <translation id="8222496066431494154">Instala Chromium en tu teléfono. Te enviaremos un SMS al número de recuperación de la cuenta: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Esta página utiliza demasiada memoria, por lo que Chrome ha eliminado parte del contenido.</translation>
 <translation id="8269379391216269538">Ayuda a mejorar Chromium</translation>
 <translation id="8290862415967981663">Es posible que este archivo sea peligroso, por lo que Chromium lo ha bloqueado.</translation>
 <translation id="8330519371938183845">Inicia sesión para sincronizar y personalizar Chromium en todos tus dispositivos</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb
index 13e3162..1ab03a1 100644
--- a/chrome/app/resources/chromium_strings_et.xtb
+++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium kuvatakse selles keeles</translation>
 <translation id="81770708095080097">Chromium blokeeris faili, kuna see on ohtlik.</translation>
 <translation id="8222496066431494154">Installige Chromium oma telefoni. Saadame SMS-i teie konto taastamise telefoninumbrile: <ph name="PHONE_NUMBER" />.</translation>
+<translation id="825412236959742607">Chrome eemaldas osa sisust, kuna leht kasutab liiga palju mälu.</translation>
 <translation id="8269379391216269538">Aidake muuta Chromiumi paremaks</translation>
 <translation id="8290862415967981663">Chromium blokeeris faili, kuna see võib olla ohtlik.</translation>
 <translation id="8330519371938183845">Logige sisse, et Chromium kõigis oma seadmetes sünkroonida ja isikupärastada</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb
index fb9b137..5b4479b 100644
--- a/chrome/app/resources/chromium_strings_fa.xtb
+++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -230,6 +230,7 @@
 <translation id="8157153840442649507">‏Chromium به این زبان نشان داده می‌شود</translation>
 <translation id="81770708095080097">‏این فایل خطرناک است، بنابراین Chromium آن را مسدود کرده است.</translation>
 <translation id="8222496066431494154">‏Chromium را در تلفنتان نصب کنید. پیامکی به شماره تلفن بازیابی حساب شما ارسال خواهیم کرد: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">‏این صفحه حافظه خیلی زیادی استفاده می‌کند، به‌همین‌دلیل Chrome برخی از محتوا را پاک کرد.</translation>
 <translation id="8269379391216269538">‏به بهبود Chromium کمک کنید</translation>
 <translation id="8290862415967981663">‏این فایل ممکن است خطرناک باشد، بنابراین Chromium آن را مسدود کرده است.</translation>
 <translation id="8330519371938183845">‏برای همگام‌سازی و شخصی‌سازی Chromium در همه دستگاه‌هایتان، به سیستم وارد شوید</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb
index c629fa0..2daadc1 100644
--- a/chrome/app/resources/chromium_strings_fi.xtb
+++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium näytetään tällä kielellä.</translation>
 <translation id="81770708095080097">Tämä tiedosto on vaarallinen, joten Chromium on estänyt sen.</translation>
 <translation id="8222496066431494154">Asenna Chromium puhelimellesi. Lähetämme tekstiviestin palauttamisen puhelinnumeroosi: <ph name="PHONE_NUMBER" />.</translation>
+<translation id="825412236959742607">Tämä sivu käyttää liikaa muistia, joten Chrome poisti osan sisällöstä.</translation>
 <translation id="8269379391216269538">Auta parantamaan Chromiumia</translation>
 <translation id="8290862415967981663">Tämä tiedosto voi olla vaarallinen, joten Chromium on estänyt sen.</translation>
 <translation id="8330519371938183845">Kirjaudu sisään, niin voit synkronoida Chromiumin ja tehdä siitä yksilöllisemmän kaikilla laitteilla.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb
index 711a2ab7..3ce6bf4 100644
--- a/chrome/app/resources/chromium_strings_fil.xtb
+++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Ipinapakita ang Chromium sa wikang ito</translation>
 <translation id="81770708095080097">Mapanganib ang file na ito, kaya na-block ito ng Chromium.</translation>
 <translation id="8222496066431494154">I-install ang Chromium sa telepono mo. Magpapadala kami ng SMS sa iyong numero ng telepono para sa pag-recover ng account: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Masyadong malaki ang ginagamit na memory ng page na ito kaya inalis ng Chrome ang ilang content.</translation>
 <translation id="8269379391216269538">Tumulong sa pagpapahusay ng Chromium</translation>
 <translation id="8290862415967981663">Maaaring mapanganib ang file na ito, kaya na-block ito ng Chromium.</translation>
 <translation id="8330519371938183845">Mag-sign in para i-sync at i-personalize ang Chromium sa lahat ng iyong device</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb
index 0f6773d..523225fd 100644
--- a/chrome/app/resources/chromium_strings_fr.xtb
+++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -233,6 +233,7 @@
 <translation id="8157153840442649507">Chromium est affiché dans cette langue</translation>
 <translation id="81770708095080097">Chromium a bloqué ce fichier, car ce dernier est dangereux.</translation>
 <translation id="8222496066431494154">Installez Chromium sur votre téléphone. Vous recevrez un SMS au numéro que vous avez indiqué pour la récupération de compte (<ph name="PHONE_NUMBER" />).</translation>
+<translation id="825412236959742607">Cette page utilise trop de mémoire, Chrome a donc supprimé du contenu.</translation>
 <translation id="8269379391216269538">Aidez-nous à améliorer Chromium</translation>
 <translation id="8290862415967981663">Chromium a bloqué ce fichier, car ce dernier peut être dangereux.</translation>
 <translation id="8330519371938183845">Se connecter pour synchroniser et personnaliser Chromium sur vos appareils</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb
index 15ed3ce2..7e711a0 100644
--- a/chrome/app/resources/chromium_strings_gu.xtb
+++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">આ ભાષામાં Chromium પ્રદર્શિત થાય છે</translation>
 <translation id="81770708095080097">આ ફાઇલ જોખમી છે, તેથી Chromium એ તેને અવરોધિત કરેલ છે.</translation>
 <translation id="8222496066431494154">તમારા ફોન પર Chromium ઇન્સ્ટૉલ કરો. અમે તમારા એકાઉન્ટ પુનઃપ્રાપ્તિ ફોન નંબર પર એક SMS મોકલીશું: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">આ પેજ મેમરીનો બહુ ઉપયોગ કરે છે, તેથી Chromeએ કેટલુંક કન્ટેન્ટ કાઢી નાખ્યું છે.</translation>
 <translation id="8269379391216269538">Chromium ને બહેતર બનાવવામાં સહાય કરો</translation>
 <translation id="8290862415967981663">આ ફાઇલ જોખમી હોઈ શકે છે, તેથી Chromium એ તેને અવરોધિત કરેલ છે.</translation>
 <translation id="8330519371938183845">તમારા બધા ઉપકરણો પર Chromiumને સિંક અને વ્યક્તિગત કરવા માટે સાઇન ઇન કરો</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 5a6e4bf..ae0e1a5 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">क्रोमियम इस भाषा में प्रदर्शित किया जा रहा है</translation>
 <translation id="81770708095080097">यह फ़ाइल खतरनाक है, इसलिए क्रोमियम ने इसे अवरुद्ध कर दिया है.</translation>
 <translation id="8222496066431494154">अपने फ़ोन पर क्रोमियम इंस्टॉल करें. हम आपके उस फ़ोन नंबर पर एक मैसेज (एसएमएस) भेजेंगे जिसे आपने अपना खाता वापस पाने के लिए सेट किया है. <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए Chrome ने कुछ सामग्री हटा दी है.</translation>
 <translation id="8269379391216269538">क्रोमियम को बेहतर बनाने में सहायता करें</translation>
 <translation id="8290862415967981663">यह फ़ाइल खतरनाक हो सकती है, इसलिए क्रोमियम ने इसे अवरुद्ध कर दिया है.</translation>
 <translation id="8330519371938183845">क्रोमियम को अपने सभी डिवाइस पर सिंक करने और मनमुताबिक बनाने के लिए साइन इन करें</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb
index d1634ff0..b6bfdabe 100644
--- a/chrome/app/resources/chromium_strings_hr.xtb
+++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium se prikazuje na tom jeziku</translation>
 <translation id="81770708095080097">Datoteka je opasna i Chromium ju je blokirao.</translation>
 <translation id="8222496066431494154">Instalirajte Chromium na telefon. Poslat ćemo vam SMS na telefonski broj za oporavak računa: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio neki sadržaj.</translation>
 <translation id="8269379391216269538">Pomognite poboljšati Chromium.</translation>
 <translation id="8290862415967981663">Datoteka je možda opasna i Chromium ju je blokirao.</translation>
 <translation id="8330519371938183845">Prijavite se da biste sinkronizirali i prilagodili Chromium na svim svojim uređajima</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb
index 3c19e50..c42fade 100644
--- a/chrome/app/resources/chromium_strings_hu.xtb
+++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -230,6 +230,7 @@
 <translation id="8157153840442649507">A Chromium ezen a nyelven jelenik meg</translation>
 <translation id="81770708095080097">Ez a fájl veszélyes, ezért a Chromium letiltotta.</translation>
 <translation id="8222496066431494154">Telepítse a Chromiumot telefonjára. SMS-t küldünk majd a fiók-helyreállítási telefonszámára: <ph name="PHONE_NUMBER" />.</translation>
+<translation id="825412236959742607">Ez az oldal túl sok memóriát használ, ezért a Chrome eltávolított egyes tartalmakat.</translation>
 <translation id="8269379391216269538">Segítsen a Chromium továbbfejlesztésében</translation>
 <translation id="8290862415967981663">Ez a fájl veszélyes lehet, ezért a Chromium letiltotta.</translation>
 <translation id="8330519371938183845">Jelentkezzen be, hogy szinkronizálhassa és személyre szabhassa a Chromiumot minden eszközén</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb
index f5a630e..8addae9 100644
--- a/chrome/app/resources/chromium_strings_id.xtb
+++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium ditampilkan dalam bahasa ini</translation>
 <translation id="81770708095080097">File ini berbahaya, jadi Chromium telah memblokirnya.</translation>
 <translation id="8222496066431494154">Instal Chromium di ponsel. Kami akan mengirimkan SMS ke nomor telepon pemulihan akun Anda: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Halaman ini menggunakan terlalu banyak memori, sehingga Chrome menghapus sebagian konten.</translation>
 <translation id="8269379391216269538">Bantu kami membuat Chromium menjadi lebih baik</translation>
 <translation id="8290862415967981663">File ini mungkin berbahaya, jadi Chromium telah memblokirnya.</translation>
 <translation id="8330519371938183845">Login untuk menyinkronkan dan mempersonalisasi Chromium di perangkat Anda</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb
index 3fd5053..86cbc36 100644
--- a/chrome/app/resources/chromium_strings_it.xtb
+++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium è visualizzato in questa lingua</translation>
 <translation id="81770708095080097">Questo file è pericoloso, pertanto è stato bloccato da Chromium.</translation>
 <translation id="8222496066431494154">Installa Chromium sul telefono. Invieremo un SMS al tuo numero di telefono per il recupero dell'account: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Questa pagina utilizza troppa memoria, pertanto Chrome ha rimosso alcuni contenuti.</translation>
 <translation id="8269379391216269538">Contribuisci a migliorare Chromium</translation>
 <translation id="8290862415967981663">Questo file potrebbe essere pericoloso, pertanto è stato bloccato da Chromium.</translation>
 <translation id="8330519371938183845">Accedi per sincronizzare e personalizzare Chromium sui tuoi dispositivi</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb
index 1bce5b37..28467ba 100644
--- a/chrome/app/resources/chromium_strings_iw.xtb
+++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -8,7 +8,7 @@
 <translation id="1170115874949214249">‏התקן את Chromium בטלפון שלך, ונשלח הודעת SMS למספר שמוגדר לשחזור החשבון.</translation>
 <translation id="1174473354587728743">‏משתף את המחשב? עכשיו תוכל להגדיר את Chromium בדיוק כמו שאתה אוהב.</translation>
 <translation id="1185134272377778587">‏על Chromium</translation>
-<translation id="1209657686917656928">{0,plural, =0{‏Chromium יופעל מחדש עכשיו}=1{‏Chromium יופעל מחדש בעוד שנייה אחת}two{‏Chromium יופעל מחדש בעוד 2 שניות}many{‏Chromium יופעל מחדש בעוד # שניות}other{‏Chromium יופעל מחדש בעוד # שניות}}</translation>
+<translation id="1209657686917656928">{0,plural, =0{‏Chromium יופעל מחדש עכשיו}=1{‏Chromium יופעל מחדש בעוד שנייה אחת}two{‏Chromium יופעל מחדש בעוד שתי שניות}many{‏Chromium יופעל מחדש בעוד # שניות}other{‏Chromium יופעל מחדש בעוד # שניות}}</translation>
 <translation id="1267419686153937460">{0,plural, =1{‏צריך להפעיל מחדש את Chromium תוך יום אחד}two{‏צריך להפעיל מחדש את Chromium תוך יומיים}many{‏צריך להפעיל מחדש את Chromium תוך # ימים}other{‏צריך להפעיל מחדש את Chromium תוך # ימים}}</translation>
 <translation id="1298199220304005244">‏עזרה באמצעות מערכת ההפעלה של Chromium</translation>
 <translation id="1396446129537741364">‏Chromium מנסה להציג סיסמאות.</translation>
@@ -25,7 +25,7 @@
 <translation id="1808667845054772817">‏התקן מחדש את Chromium</translation>
 <translation id="1869480248812203386">‏אתה יכול לעזור לשפר את הבטיחות של Chromium ולהקל את השימוש בו על ידי דיווח ל-Google על פרטים של בעיות אבטחה אפשריות.</translation>
 <translation id="1881322772814446296">‏אתה נכנס עם חשבון מנוהל ונותן למנהל המערכת שלו שליטה על הפרופיל שלך ב-Chromium. הנתונים שלך ב-Chromium, כגון יישומים, סימניות, היסטוריה, סיסמאות והגדרות אחרות ייקשרו באופן קבוע ל-<ph name="USER_NAME" />. תוכל למחוק את הנתונים האלה באמצעות לוח הבקרה של חשבונות Google, אבל לא תוכל לשייך את הנתונים האלה לחשבון אחר. לחלופין, תוכל ליצור פרופיל חדש כדי לשמור את הנתונים הקיימים שלך ב-Chromium בנפרד.<ph name="LEARN_MORE" /></translation>
-<translation id="1895626441344023878">{0,plural, =0{‏יש עדכון זמין של Chromium}=1{‏יש עדכון זמין של Chromium}two{‏עדכון של Chromium זמין כבר יומיים}many{‏עדכון של Chromium זמין כבר # ימים}other{‏עדכון של Chromium זמין כבר # ימים}}</translation>
+<translation id="1895626441344023878">{0,plural, =0{‏יש עדכון ל-Chromium}=1{‏יש עדכון ל-Chromium}two{‏עדכון של Chromium זמין כבר יומיים}many{‏עדכון של Chromium זמין כבר # ימים}other{‏עדכון של Chromium זמין כבר # ימים}}</translation>
 <translation id="1929939181775079593">‏Chromium אינו מגיב. להפעיל מחדש עכשיו?</translation>
 <translation id="1966382378801805537">‏ב-Chromium לא ניתן לקבוע או להגדיר את דפדפן ברירת המחדל</translation>
 <translation id="2008474315282236005">‏הפעולה הזו תמחק פריט אחד מהמכשיר. כדי לשחזר את הנתונים מאוחר יותר, היכנס אל Chromium עם <ph name="USER_EMAIL" />.</translation>
@@ -55,7 +55,7 @@
 <translation id="2977470724722393594">‏Chromium‏ מעודכן</translation>
 <translation id="3032787606318309379">‏הוספה ל-Chromium</translation>
 <translation id="3046695367536568084">‏עליך להיות מחובר ל-Chromium כדי להשתמש ביישומים. כך Chromium יכול לסנכרן את היישומים, הסימניות, ההיסטוריה, הסיסמאות והגדרות נוספות בין מכשירים שונים.</translation>
-<translation id="3052899382720782935">{0,plural, =1{‏Chromium יופעל מחדש בעוד דקה}two{‏Chromium יופעל מחדש בעוד 2 דקות}many{‏Chromium יופעל מחדש בעוד # דקות}other{‏Chromium יופעל מחדש בעוד # דקות}}</translation>
+<translation id="3052899382720782935">{0,plural, =1{‏Chromium יופעל מחדש בעוד דקה}two{‏Chromium יופעל מחדש בעוד שתי דקות}many{‏Chromium יופעל מחדש בעוד # דקות}other{‏Chromium יופעל מחדש בעוד # דקות}}</translation>
 <translation id="3068515742935458733">‏עזור לשפר את Chromium על ידי שליחת דוחות קריסה ו-<ph name="UMA_LINK" /> אל Google</translation>
 <translation id="3103660991484857065">‏המתקין לא הצליח לבטל את דחיסת הארכיון. הורד שוב את Chromium.</translation>
 <translation id="3130323860337406239">‏Chromium משתמש במיקרופון שלך.</translation>
@@ -109,7 +109,7 @@
 <translation id="4943838377383847465">‏Chromium נמצא במצב רקע.</translation>
 <translation id="4987820182225656817">‏אורחים יכולים להשתמש ב-Chromium בלי להשאיר דבר מאחור.</translation>
 <translation id="4994636714258228724">‏הוסף את עצמך ל-Chromium</translation>
-<translation id="5021854341188256296">{0,plural, =0{‏יש עדכון זמין של Chromium OS}=1{‏יש עדכון זמין של Chromium OS}two{‏עדכון של Chromium OS זמין כבר יומיים}many{‏עדכון של Chromium OS זמין כבר # ימים}other{‏עדכון של Chromium OS זמין כבר # ימים}}</translation>
+<translation id="5021854341188256296">{0,plural, =0{‏יש עדכון ל-Chromium OS}=1{‏יש עדכון ל-Chromium OS}two{‏עדכון של Chromium OS זמין כבר יומיים}many{‏עדכון של Chromium OS זמין כבר # ימים}other{‏עדכון של Chromium OS זמין כבר # ימים}}</translation>
 <translation id="5032989939245619637">‏שמור פרטים ב-Chromium</translation>
 <translation id="5045248521775609809">‏לוקחים את Chromium לכל מקום</translation>
 <translation id="5116586539350239523">‏Chromium יאחסן את הפרטים האישיים שלך באופן מאובטח כדי שלא תידרש להקליד אותם שוב.</translation>
@@ -123,7 +123,7 @@
 <translation id="5480860683791598150">‏Chromium זקוק לגישה למיקום שלך כדי לשתף אותו עם האתר הזה</translation>
 <translation id="549669000822060376">‏המתן בזמן ש-Chromium מתקין את עדכוני המערכת האחרונים.</translation>
 <translation id="5514308096618405748">‏הפיתוח של Chrome OS אפשרי בזכות <ph name="BEGIN_LINK_CROS_OSS" />תוכנות קוד פתוח<ph name="END_LINK_CROS_OSS" /> נוספות, כמו Linux (בטא).</translation>
-<translation id="5529843986978123325">{0,plural, =1{‏Chromium OS תופעל מחדש בעוד דקה אחת}two{‏Chromium OS תופעל מחדש בעוד 2 דקות}many{‏Chromium OS תופעל מחדש בעוד # דקות}other{‏Chromium OS תופעל מחדש בעוד # דקות}}</translation>
+<translation id="5529843986978123325">{0,plural, =1{‏Chromium OS תופעל מחדש בעוד דקה אחת}two{‏Chromium OS תופעל מחדש בעוד שתי דקות}many{‏Chromium OS תופעל מחדש בעוד # דקות}other{‏Chromium OS תופעל מחדש בעוד # דקות}}</translation>
 <translation id="5631814766731275228">‏שם ותמונה ב-Chromium</translation>
 <translation id="5634636535844844681">‏כדי להשתמש ב-Chromium יש צורך ב-Windows מגירסה 7 ואילך.</translation>
 <translation id="5680901439334282664">‏היכנס אל Chromium</translation>
@@ -230,6 +230,7 @@
 <translation id="8157153840442649507">‏Chromium מוצג בשפה זו</translation>
 <translation id="81770708095080097">‏Chromium‏ חסם את הקובץ הזה כי הוא מסוכן.</translation>
 <translation id="8222496066431494154">‏התקן את Chromium בטלפון שלך, ונשלח הודעת SMS למספר שמוגדר לשחזור החשבון: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">‏הדף הזה משתמש בנפח זיכרון גדול מידי, לכן מערכת Chrome הסירה חלק מהתוכן.</translation>
 <translation id="8269379391216269538">‏עזור לנו לשפר את Chromium</translation>
 <translation id="8290862415967981663">‏Chromium‏ חסם את הקובץ הזה כי הוא עלול להיות מסוכן.</translation>
 <translation id="8330519371938183845">‏כניסה לחשבון תסנכרן ותתאים אישית את Chromium בכל המכשירים שברשותך</translation>
@@ -240,7 +241,7 @@
 <translation id="8493179195440786826">‏Chromium אינו מעודכן</translation>
 <translation id="85843667276690461">‏עזרה באמצעות Chromium</translation>
 <translation id="8586442755830160949">‏Copyright <ph name="YEAR" /> The Chromium Authors. כל הזכויות שמורות.</translation>
-<translation id="8599548569518771270">{0,plural, =0{‏Chromium OS תופעל מחדש עכשיו}=1{‏Chromium OS תופעל מחדש בעוד שנייה אחת}two{‏Chromium OS תופעל מחדש בעוד 2 שניות}many{‏Chromium OS תופעל מחדש בעוד # שניות}other{‏Chromium OS תופעל מחדש בעוד # שניות}}</translation>
+<translation id="8599548569518771270">{0,plural, =0{‏Chromium OS תופעל מחדש עכשיו}=1{‏Chromium OS תופעל מחדש בעוד שנייה אחת}two{‏Chromium OS תופעל מחדש בעוד שתי שניות}many{‏Chromium OS תופעל מחדש בעוד # שניות}other{‏Chromium OS תופעל מחדש בעוד # שניות}}</translation>
 <translation id="8619360774459241877">‏הפעלת Chromium מתבצעת...</translation>
 <translation id="8621669128220841554">‏ההתקנה נכשלה בשל שגיאה לא מזוהה. הורד שוב את Chromium.</translation>
 <translation id="8628626585870903697">‏Chromium אינו כולל מציג PDF, הנדרש להפעלת תצוגה מקדימה של הדפסה.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb
index 0f166d1d..c885b96c 100644
--- a/chrome/app/resources/chromium_strings_ja.xtb
+++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium はこの言語で表示されています</translation>
 <translation id="81770708095080097">このファイルは危険なファイルであるため、Chromium でブロックしました。</translation>
 <translation id="8222496066431494154">Chromium をスマートフォンにインストールしませんか。お客様のアカウント再設定用の電話番号(<ph name="PHONE_NUMBER" />)に、Google より SMS をお送りします。</translation>
+<translation id="825412236959742607">このページは大量のメモリを使用しているため、Chrome により一部のコンテンツが削除されました。</translation>
 <translation id="8269379391216269538">Chromium の品質向上にご協力ください</translation>
 <translation id="8290862415967981663">このファイルは危険なファイルの可能性があるため、Chromium でブロックしました。</translation>
 <translation id="8330519371938183845">ログインすると、同期してカスタマイズした Chromium をどの端末でも使用できます</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb
index e34b31a..a7a1aff 100644
--- a/chrome/app/resources/chromium_strings_kn.xtb
+++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -123,7 +123,7 @@
 <translation id="5480860683791598150">ಈ ಸೈಟ್‌ ಜೊತೆಗೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು Chromium ಗೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸುವ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="549669000822060376">ದಯವಿಟ್ಟು ಇತ್ತೀಚಿನ ಸಿಸ್ಟಂ ನವೀಕರಣಗಳನ್ನು Chromium ಸ್ಥಾಪಿಸುವಾಗ ಕಾಯಿರಿ.</translation>
 <translation id="5514308096618405748">ಹೆಚ್ಚುವರಿ <ph name="BEGIN_LINK_CROS_OSS" />ಓಪನ್ ಸೋರ್ಸ್ ಸಾಫ್ಟ್‌ವೇರ್‌<ph name="END_LINK_CROS_OSS" /> ನಿಂದ Chrome OS ನ ರಚನೆ ಸಾಧ್ಯವಾಯಿತು. ಹಾಗೆಯೇ Linux (ಬೀಟಾ) ನದೂ ಸಹ.</translation>
-<translation id="5529843986978123325">{0,plural, =1{1 ನಿಮಿಷದಲ್ಲಿ Chromium OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{ # ನಿಮಿಷಗಳಲ್ಲಿ Chromium OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{ # ನಿಮಿಷಗಳಲ್ಲಿ Chromium OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
+<translation id="5529843986978123325">{0,plural, =1{1 ನಿಮಿಷದಲ್ಲಿ Chromium OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ನಿಮಿಷಗಳಲ್ಲಿ Chromium OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ನಿಮಿಷಗಳಲ್ಲಿ Chromium OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
 <translation id="5631814766731275228">Chromium ಹೆಸರು ಮತ್ತು ಚಿತ್ರ</translation>
 <translation id="5634636535844844681">Chromium ಗೆ Windows 7 ಅಥವಾ ಹೆಚ್ಚಿನ ಆವೃತ್ತಿ ಅಗತ್ಯವಿರುತ್ತದೆ.</translation>
 <translation id="5680901439334282664">Chromium ಗೆ ಸೈನ್ ಇನ್ ಆಗಿ</translation>
@@ -226,6 +226,7 @@
 <translation id="8157153840442649507">ಈ ಭಾಷೆಯಲ್ಲಿ Chromium ಪ್ರದರ್ಶನಗೊಂಡಿದೆ</translation>
 <translation id="81770708095080097">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿದೆ, ಹೀಗಾಗಿ Chromium ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
 <translation id="8222496066431494154">ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ Chromium ಅನ್ನು ಸ್ಥಾಪಿಸಿ. ನಿಮ್ಮ ಖಾತೆ ಮರುಪ್ರಾಪ್ತಿ ಫೋನ್ ಸಂಖ್ಯೆ‌ಗೆ ನಾವು ಎಸ್ಎಂಎಸ್ ಕಳುಹಿಸುತ್ತೇವೆ: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">ಈ ಪುಟವು ತೀರಾ ಹೆಚ್ಚು ಮೆಮೊರಿಯನ್ನು ಬಳಸುತ್ತದೆ, ಆದ್ದರಿಂದ Chrome ಕೆಲವು ವಿಷಯಗಳನ್ನು ತೆಗೆದುಹಾಕಿದೆ.</translation>
 <translation id="8269379391216269538">Chromium ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation>
 <translation id="8290862415967981663">ಈ ಫೈಲ್ ಅಪಾಯಕಾರಿಯಾಗಿರಬಹುದು, ಹೀಗಾಗಿ Chromium ಇದನ್ನು ನಿರ್ಬಂಧಿಸಿದೆ.</translation>
 <translation id="8330519371938183845">ನಿಮ್ಮ ಸಾಧನಗಳಲ್ಲಿ Chromium ಅನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ವೈಯಕ್ತೀಕರಿಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb
index 29531f7..819aa22d 100644
--- a/chrome/app/resources/chromium_strings_ko.xtb
+++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">현재 Chromium에서 사용 중인 언어</translation>
 <translation id="81770708095080097">이 파일은 위험하므로 Chromium에서 차단했습니다.</translation>
 <translation id="8222496066431494154">휴대전화에 Chromium을 설치하세요. 다음의 계정 복구 전화번호로 SMS를 보내 드리겠습니다. <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">페이지에서 너무 많은 메모리를 사용하므로 Chrome에서 일부 콘텐츠를 삭제했습니다.</translation>
 <translation id="8269379391216269538">Chromium 개선에 참여</translation>
 <translation id="8290862415967981663">이 파일은 위험할 수 있으므로 Chromium에서 차단했습니다.</translation>
 <translation id="8330519371938183845">로그인하여 모든 기기에서 Chromium을 동기화하고 맞춤설정하세요.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb
index 0dfbc72..d323b3d 100644
--- a/chrome/app/resources/chromium_strings_lt.xtb
+++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -126,7 +126,7 @@
 <translation id="5479196819031988440">„Chromium“ OS negali atidaryti šio puslapio.</translation>
 <translation id="5480860683791598150">„Chromium“ reikia leidimo, kad galėtų naudoti jūsų vietovės informaciją ir bendrinti ją su šia svetaine</translation>
 <translation id="549669000822060376">Palaukite, kol „Chromium“ įdiegs naujausius sistemos naujinius.</translation>
-<translation id="5514308096618405748">„Chrome“ OS (kaip ir „Linux“ (beta vers.)) pasiekiama naudojant papildomą <ph name="BEGIN_LINK_CROS_OSS" />atvirojo šaltinio programinę įrangą<ph name="END_LINK_CROS_OSS" />.</translation>
+<translation id="5514308096618405748">„Chrome“ OS (kaip ir „Linux“ (beta vers.) pasiekiama naudojant papildomą <ph name="BEGIN_LINK_CROS_OSS" />atvirojo šaltinio programinę įrangą<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="5529843986978123325">{0,plural, =1{„Chromium“ OS bus paleista iš naujo po 1 minutės}one{„Chromium“ OS bus paleista iš naujo po # minutės}few{„Chromium“ OS bus paleista iš naujo po # minučių}many{„Chromium“ OS bus paleista iš naujo po # minutės}other{„Chromium“ OS bus paleista iš naujo po # minučių}}</translation>
 <translation id="5631814766731275228">„Chromium“ pavadinimas ir paveikslėlis</translation>
 <translation id="5634636535844844681">Kad būtų galima naudoti „Chromium“, reikalinga 7 ar naujesnės versijos „Windows“.</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb
index 05882c4..ab7c103 100644
--- a/chrome/app/resources/chromium_strings_lv.xtb
+++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -230,6 +230,7 @@
 <translation id="8157153840442649507">Chromium tiek rādīts šajā valodā.</translation>
 <translation id="81770708095080097">Šis fails ir bīstams, tāpēc Chromium to bloķēja.</translation>
 <translation id="8222496066431494154">Instalējiet pārlūku Chromium savā tālrunī. Mēs nosūtīsim īsziņu uz jūsu konta atkopšanas tālruņa numuru: <ph name="PHONE_NUMBER" />.</translation>
+<translation id="825412236959742607">Šī lapa izmanto pārāk daudz atmiņas, tādēļ pārlūks Chrome noņēma daļu satura.</translation>
 <translation id="8269379391216269538">Palīdziet uzlabot Chromium</translation>
 <translation id="8290862415967981663">Šis fails var būt bīstams, tāpēc Chromium to bloķēja.</translation>
 <translation id="8330519371938183845">Pierakstieties, lai sinhronizētu un personalizētu pārlūku Chromium visās savās ierīcēs.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb
index 20edabb1..aeecb9b 100644
--- a/chrome/app/resources/chromium_strings_ml.xtb
+++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Chromium ഈ ഭാഷയിൽ പ്രദർശിപ്പിച്ചിരിക്കുന്നു</translation>
 <translation id="81770708095080097">ഈ ഫയൽ അപകടകരമായതിനാൽ Chromium ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
 <translation id="8222496066431494154">നിങ്ങളുടെ ഫോണിൽ Chromium ഇൻസ്‌റ്റാൾ ചെയ്യുക. അക്കൗണ്ട് വീണ്ടെടുക്കൽ ഫോൺ നമ്പറിലേക്ക് ഞങ്ങളൊരു SMS അയയ്‌ക്കും: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">ഈ പേജ് കൂടുതൽ മെമ്മറി ഉപയോഗിക്കുന്നു, അതിനാൽ Chrome കുറച്ച് ഉള്ളടക്കം നീക്കം ചെയ്‌തു.</translation>
 <translation id="8269379391216269538">Chromium മികച്ചതാക്കാൻ സഹായിക്കുക</translation>
 <translation id="8290862415967981663">ഈ ഫയൽ അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ Chromium ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
 <translation id="8330519371938183845">നിങ്ങളുടെ ഉപകരണങ്ങളിലുടനീളം Chromium സമന്വയിപ്പിച്ച് വ്യക്തിഗതമാക്കാൻ സൈൻ ഇൻ ചെയ്യുക</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb
index 8969949a..e9d5308 100644
--- a/chrome/app/resources/chromium_strings_mr.xtb
+++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -150,7 +150,7 @@
 <translation id="6096348254544841612">Chromium कस्टमाइझ करा आणि नियंत्रित करा. अपडेट उपलब्ध आहे.</translation>
 <translation id="6120345080069858279">Chromium हा पासवर्ड तुमच्या Google खात्यामध्ये सेव्ह करेल. तुम्हाला पासवर्ड लक्षात ठेवावा लागणार नाही.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> धोकादायक आहे, त्यामुळे Chromium ने ते अवरोधित केले आहे.</translation>
-<translation id="620022061217911843">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावी यासाठी तुम्ही Chrome OS रीस्टार्ट करण्याची आवश्यकता आहे</translation>
+<translation id="620022061217911843">तुमच्या अॅडमिनिस्ट्रेटरला अपडेट लागू करता यावे यासाठी तुम्ही Chrome OS रीस्टार्ट करण्याची आवश्यकता आहे</translation>
 <translation id="6212496753309875659">या संगणकावर आधीपासून Chromium ची अगदी अलीकडील आवृत्ती आहे. सॉफ्‍टवेअर कार्य करत नसल्‍यास, कृपया Chromium विस्‍थापित करा आणि पुन्‍हा प्रयत्‍न करा.</translation>
 <translation id="6248213926982192922">Chromium ला डीफॉल्‍ट ब्राउझर बनवा</translation>
 <translation id="6268381023930128611">Chromium मधून साइन आउट करायचे?</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb
index f12fb13..f7603bf 100644
--- a/chrome/app/resources/chromium_strings_ms.xtb
+++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium dipaparkan dalam bahasa ini</translation>
 <translation id="81770708095080097">Fail ini berbahaya, maka Chromium telah menyekatnya.</translation>
 <translation id="8222496066431494154">Pasang Chromium pada telefon anda. Kami akan menghantar SMS ke nombor telefon pemulihan akaun anda: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Halaman ini menggunakan terlalu banyak memori, jadi Chrome mengalih keluar sesetengah kandungan.</translation>
 <translation id="8269379391216269538">Bantu menjadikan Chromium lebih baik</translation>
 <translation id="8290862415967981663">Fail ini mungkin berbahaya, maka Chromium telah menyekatnya.</translation>
 <translation id="8330519371938183845">Log masuk untuk menyegerakkan dan memperibadikan Chromium pada semua peranti anda</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb
index 0e188717..1cb2f48 100644
--- a/chrome/app/resources/chromium_strings_nl.xtb
+++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Chromium wordt weergegeven in deze taal</translation>
 <translation id="81770708095080097">Dit bestand is gevaarlijk en is daarom door Chromium geblokkeerd.</translation>
 <translation id="8222496066431494154">Installeer Chromium op je telefoon. We sturen een sms naar het hersteltelefoonnummer voor je account: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Omdat deze pagina te veel geheugen gebruikt, heeft Chrome wat content verwijderd.</translation>
 <translation id="8269379391216269538">Help ons Chromium beter te maken</translation>
 <translation id="8290862415967981663">Dit bestand kan gevaarlijk zijn en is daarom door Chromium geblokkeerd.</translation>
 <translation id="8330519371938183845">Log in om Chromium op al je apparaten te synchroniseren en te personaliseren</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb
index de47b95c..f126c16 100644
--- a/chrome/app/resources/chromium_strings_no.xtb
+++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium vises på dette språket</translation>
 <translation id="81770708095080097">Denne filen er farlig, så Chromium har blokkert den.</translation>
 <translation id="8222496066431494154">Installer Chromium på telefonen din. Vi sender en SMS til telefonnummeret ditt for kontogjenoppretting (<ph name="PHONE_NUMBER" />)</translation>
+<translation id="825412236959742607">Denne siden bruker for mye minne, så har Chrome fjernet noe av innholdet.</translation>
 <translation id="8269379391216269538">Bidra til å gjøre Chromium bedre</translation>
 <translation id="8290862415967981663">Denne filen kan være farlig, så Chromium har blokkert den.</translation>
 <translation id="8330519371938183845">Logg på for å synkronisere og gi Chromium et personlig preg på alle enhetene dine</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb
index 77f62a6..d1747d9 100644
--- a/chrome/app/resources/chromium_strings_pl.xtb
+++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -230,6 +230,7 @@
 <translation id="8157153840442649507">Chromium działa obecnie w tym języku</translation>
 <translation id="81770708095080097">Ten plik jest niebezpieczny, dlatego został zablokowany przez Chromium.</translation>
 <translation id="8222496066431494154">Zainstaluj Chromium na telefonie. Wyślemy SMS-a pod numer telefonu do odzyskiwania konta: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Ta strona używa zbyt dużo pamięci, dlatego Chrome usunął część jej zawartości.</translation>
 <translation id="8269379391216269538">Pomóż ulepszyć Chromium</translation>
 <translation id="8290862415967981663">Ten plik może być niebezpieczny, dlatego został zablokowany przez Chromium.</translation>
 <translation id="8330519371938183845">Zaloguj się, by synchronizować dane Chromium i korzystać z własnych ustawień przeglądarki na wielu urządzeniach</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb
index eb5b87c..09968078 100644
--- a/chrome/app/resources/chromium_strings_pt-BR.xtb
+++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -227,6 +227,7 @@
 <translation id="8157153840442649507">O Chromium é exibido neste idioma</translation>
 <translation id="81770708095080097">Esse arquivo é perigoso, por isso ele foi bloqueado pelo Chromium.</translation>
 <translation id="8222496066431494154">Instale o Chromium no seu smartphone. Enviaremos um SMS para o número de recuperação da sua conta: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Como esta página usa muita memória, o Chrome removeu parte do conteúdo.</translation>
 <translation id="8269379391216269538">Ajudar a melhorar o Chromium</translation>
 <translation id="8290862415967981663">Esse arquivo pode ser perigoso, por isso ele foi bloqueado pelo Chromium.</translation>
 <translation id="8330519371938183845">Faça login para sincronizar e personalizar o Chromium em todos os seus dispositivos</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb
index 385fbff..bbe4319 100644
--- a/chrome/app/resources/chromium_strings_pt-PT.xtb
+++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">O Chromium é apresentado neste idioma</translation>
 <translation id="81770708095080097">Este ficheiro é perigoso. Como tal, o Chromium bloqueou-o.</translation>
 <translation id="8222496066431494154">Instale o Chromium no telemóvel. Vamos enviar uma SMS para o seu número de telefone de recuperação de conta: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Esta página utiliza demasiada memória, pelo que o Chrome removeu algum conteúdo.</translation>
 <translation id="8269379391216269538">Ajudar a melhorar o Chromium</translation>
 <translation id="8290862415967981663">Este ficheiro pode ser perigoso. Como tal, o Chromium bloqueou-o.</translation>
 <translation id="8330519371938183845">Inicie sessão para sincronizar e personalizar o Chromium em todos os dispositivos.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb
index 89a6759..c1a8db13 100644
--- a/chrome/app/resources/chromium_strings_ro.xtb
+++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium este afișat în această limbă</translation>
 <translation id="81770708095080097">Fișierul este periculos, așadar Chromium l-a blocat.</translation>
 <translation id="8222496066431494154">Instalează Chromium pe telefon. Vom trimite un SMS la numărul de telefon de recuperare a contului: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Această pagină folosește prea multă memorie, prin urmare Chrome a eliminat o parte din conținut.</translation>
 <translation id="8269379391216269538">Să îmbunătățim Chromium</translation>
 <translation id="8290862415967981663">Este posibil ca fișierul să fie periculos, așadar Chromium l-a blocat.</translation>
 <translation id="8330519371938183845">Conectează-te pentru a sincroniza și a personaliza Chromium pe toate dispozitivele</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb
index edf9ee8e..305fba00 100644
--- a/chrome/app/resources/chromium_strings_ru.xtb
+++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -228,6 +228,7 @@
 <translation id="8157153840442649507">Этот язык сейчас используется в Chromium</translation>
 <translation id="81770708095080097">Chromium заблокировал этот файл как опасный.</translation>
 <translation id="8222496066431494154">Установите Chromium на телефон. Мы отправим SMS на номер, указанный в вашем аккаунте: <ph name="PHONE_NUMBER" />.</translation>
+<translation id="825412236959742607">Эта страница расходовала слишком много памяти, поэтому часть контента была удалена.</translation>
 <translation id="8269379391216269538">Сделайте Chromium лучше</translation>
 <translation id="8290862415967981663">Chromium заблокировал этот файл как потенциально опасный.</translation>
 <translation id="8330519371938183845">Войдите, чтобы синхронизировать данные Chromium на всех устройствах</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb
index 962e69af..4b2ae76 100644
--- a/chrome/app/resources/chromium_strings_sk.xtb
+++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -126,7 +126,7 @@
 <translation id="5479196819031988440">Chromium OS nedokáže túto stránku otvoriť.</translation>
 <translation id="5480860683791598150">Chromium potrebuje prístup k vašej polohe, aby ju mohol zdieľať s týmto webom</translation>
 <translation id="549669000822060376">Počkajte, kým Chromium nainštaluje najnovšie aktualizácie systému.</translation>
-<translation id="5514308096618405748">Chrome OS mohol vzniknúť vďaka ďalšiemu <ph name="BEGIN_LINK_CROS_OSS" />softvéru open source<ph name="END_LINK_CROS_OSS" />, ako je Linux (Beta).</translation>
+<translation id="5514308096618405748">Chrome OS mohol vzniknúť vďaka ďalšiemu <ph name="BEGIN_LINK_CROS_OSS" />softvéru open source<ph name="END_LINK_CROS_OSS" />, ako je Linux (beta).</translation>
 <translation id="5529843986978123325">{0,plural, =1{Chromium OS sa reštartuje o 1 minútu}few{Chromium OS sa reštartuje o # minúty}many{Chromium OS sa reštartuje o # minúty}other{Chromium OS sa reštartuje o # minút}}</translation>
 <translation id="5631814766731275228">Meno a obrázok profilu Chromium</translation>
 <translation id="5634636535844844681">Chromium vyžaduje Windows 7 alebo vyšší.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb
index 1ac8cb5..3ca9ebb5 100644
--- a/chrome/app/resources/chromium_strings_sl.xtb
+++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -127,7 +127,7 @@
 <translation id="5479196819031988440">OS Chromium ne more odpreti te strani.</translation>
 <translation id="5480860683791598150">Chromium potrebuje dostop do vaše lokacije, da jo bo lahko delil s tem spletnim mestom</translation>
 <translation id="549669000822060376">Počakajte, da Chromium namesti najnovejše sistemske posodobitve.</translation>
-<translation id="5514308096618405748">OS Chrome omogoča dodatna <ph name="BEGIN_LINK_CROS_OSS" />odprtokodna programska oprema<ph name="END_LINK_CROS_OSS" />, kot je Linux (beta).</translation>
+<translation id="5514308096618405748">OS Chrome omogoča dodatna <ph name="BEGIN_LINK_CROS_OSS" />odprtokodna programska oprema<ph name="END_LINK_CROS_OSS" />, enako kot Linux (beta).</translation>
 <translation id="5529843986978123325">{0,plural, =1{OS Chromium se bo znova zagnal čez 1 minuto}one{OS Chromium se bo znova zagnal čez # minuto}two{OS Chromium se bo znova zagnal čez # minuti}few{OS Chromium se bo znova zagnal čez # minute}other{OS Chromium se bo znova zagnal čez # minut}}</translation>
 <translation id="5631814766731275228">Ime in slika za Chromium</translation>
 <translation id="5634636535844844681">Za Chromium potrebujete Windows 7 ali novejši.</translation>
@@ -235,6 +235,7 @@
 <translation id="8157153840442649507">Chromium je v tem jeziku</translation>
 <translation id="81770708095080097">Ta datoteka je nevarna, zato jo je Chromium blokiral.</translation>
 <translation id="8222496066431494154">Namestite Chromium v telefonu. Na telefonsko številko za obnovitev računa bomo poslali SMS: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Ta stran uporablja preveč pomnilnika, zato je Chrome odstranil nekaj vsebine.</translation>
 <translation id="8269379391216269538">Pomagajte izboljšati Chromium</translation>
 <translation id="8290862415967981663">Ta datoteka je morda nevarna, zato jo je Chromium blokiral.</translation>
 <translation id="8330519371938183845">Prijavite se, da boste lahko Chromium sinhronizirali in prilagodili v vseh svojih napravah</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb
index ff628367..37932ed3 100644
--- a/chrome/app/resources/chromium_strings_sr.xtb
+++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -126,7 +126,7 @@
 <translation id="5479196819031988440">Chromium ОС не може да отвори ову страницу.</translation>
 <translation id="5480860683791598150">Chromium тражи приступ вашој локацији да бисте је делили са овим сајтом</translation>
 <translation id="549669000822060376">Сачекајте да Chromium инсталира најновија ажурирања система.</translation>
-<translation id="5514308096618405748">Chrome ОС је омогућен захваљујући додатном <ph name="BEGIN_LINK_CROS_OSS" />софтверу са отвореним кодом<ph name="END_LINK_CROS_OSS" />, као и Linux (бета).</translation>
+<translation id="5514308096618405748">Chrome ОС је омогућен захваљујући додатном <ph name="BEGIN_LINK_CROS_OSS" />софтверу са отвореним кодом<ph name="END_LINK_CROS_OSS" />, као што је Linux (бета).</translation>
 <translation id="5529843986978123325">{0,plural, =1{Chromium ОС ће се рестартовати за 1 минут}one{Chromium ОС ће се рестартовати за # минут}few{Chromium ОС ће се рестартовати за # минута}other{Chromium ОС ће се рестартовати за # минута}}</translation>
 <translation id="5631814766731275228">Назив и слика Chromium профила</translation>
 <translation id="5634636535844844681">За Chromium је потребан Windows 7 или новија верзија.</translation>
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Chromium се приказује на овом језику</translation>
 <translation id="81770708095080097">Ова датотека је опасна, па ју је Chromium блокирао.</translation>
 <translation id="8222496066431494154">Инсталирајте Chromium на телефону. Послаћемо вам SMS на број телефона за враћање приступа налогу: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Ова страница користи превише меморије, па је Chrome уклонио одређени садржај.</translation>
 <translation id="8269379391216269538">Помозите нам да побољшамо Chromium</translation>
 <translation id="8290862415967981663">Ова датотека је можда опасна, па ју је Chromium блокирао.</translation>
 <translation id="8330519371938183845">Пријавите се да бисте синхронизовали и персонализовали Chromium на свим уређајима</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb
index b53644d..0daae73 100644
--- a/chrome/app/resources/chromium_strings_sv.xtb
+++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -234,6 +234,7 @@
 <translation id="8157153840442649507">Chromium visas på det här språket</translation>
 <translation id="81770708095080097">Filen är farlig och har blockerats av Chromium.</translation>
 <translation id="8222496066431494154">Installera Chromium på mobilen. Vi skickar ett sms till ditt telefonnummer för kontoåterställning: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Den här sidan använder för mycket minne, så en del innehåll har tagits bort.</translation>
 <translation id="8269379391216269538">Bidra till att förbättra Chromium</translation>
 <translation id="8290862415967981663">Filen kan vara farlig och har blockerats av Chromium.</translation>
 <translation id="8330519371938183845">Genom att logga in kan du synkronisera och anpassa Chromium på alla enheter du använder</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb
index dba1fff..150d370 100644
--- a/chrome/app/resources/chromium_strings_sw.xtb
+++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -233,6 +233,7 @@
 <translation id="8157153840442649507">Chromium inaonyeshwa katika lugha hii</translation>
 <translation id="81770708095080097">Faili hii ni hatari, kwa hivyo Chromium imeizuia.</translation>
 <translation id="8222496066431494154">Sakinisha Chromium kwenye simu yako. Tutatuma SMS kwenye nambari yako ya simu ya mbinu za kurejesha uwezo wa kufikia akaunti: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Ukurasa huu unatumia hifadhi kubwa mno, hivyo basi Chrome imeondoa baadhi ya maudhui.</translation>
 <translation id="8269379391216269538">Saidia ili kuiboresha Chromium</translation>
 <translation id="8290862415967981663">Huenda faili hii ni hatari, kwa hivyo Chromium imeizuia.</translation>
 <translation id="8330519371938183845">Ingia katika akaunti ili usawazishe na uweke mapendeleo kwenye Chromium katika vifaa vyako vyote</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb
index 4cc5b37..83f2ada 100644
--- a/chrome/app/resources/chromium_strings_ta.xtb
+++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium இந்த மொழியில் காட்டப்படுகிறது</translation>
 <translation id="81770708095080097">இந்தக் கோப்பு ஆபத்தானது என்பதால், அதை Chromium தடுத்துள்ளது.</translation>
 <translation id="8222496066431494154">உங்கள் மொபைலில் Chromiumஐ நிறுவவும். கணக்கின் மீட்பு மொபைல் எண்ணுக்கு SMS ஒன்றை அனுப்புவோம்: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">இந்தப் பக்கம் அதிகளவு நினைவகத்தைப் பயன்படுத்துவதால், Chrome சில உள்ளடக்கங்களை அகற்றியது.</translation>
 <translation id="8269379391216269538">Chromium ஐ மேலும் சிறப்பாக்க உதவவும்</translation>
 <translation id="8290862415967981663">இந்தக் கோப்பு ஆபத்தானதாக இருக்கக்கூடும் என்பதால், அதை Chromium தடுத்துள்ளது.</translation>
 <translation id="8330519371938183845">உங்கள் எல்லாச் சாதனங்களிலும் Chromiumஐ ஒத்திசைக்க மற்றும் தனிப்பயனாக்க, உள்நுழையவும்</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb
index de6ed96..9cde13a0 100644
--- a/chrome/app/resources/chromium_strings_te.xtb
+++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -8,6 +8,8 @@
 <translation id="1170115874949214249">మీ ఫోన్‌లో Chromiumను ఇన్‌స్టాల్ చేయండి. మేము మీ ఖాతా పునరుద్ధరణ ఫోన్ నంబర్‌కు SMSను పంపుతాము.</translation>
 <translation id="1174473354587728743">కంప్యూటర్‌ను భాగస్వామ్యం చేయాలా? ఇప్పుడు మీరు కోరుకున్న విధంగా Chromiumను సెటప్ చేయవచ్చు.</translation>
 <translation id="1185134272377778587">Chromium గురించి</translation>
+<translation id="1209657686917656928">{0,plural, =0{Chromium ఇప్పుడు తిరిగి ప్రారంభించబడుతుంది}=1{1 సెకనులో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# సెకన్లలో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation>
+<translation id="1267419686153937460">{0,plural, =1{ఒక రోజులో Chromiumని తిరిగి ప్రారంభించండి}other{# రోజుల్లో Chromiumని తిరిగి ప్రారంభించండి}}</translation>
 <translation id="1298199220304005244">Chromium OSని ఉపయోగించి సహాయాన్ని పొందండి</translation>
 <translation id="1396446129537741364">Chromium పాస్‌వర్డ్‌లను చూపడానికి ప్రయత్నిస్తోంది.</translation>
 <translation id="1414495520565016063">మీరు Chromiumకు సైన్ ఇన్ చేసారు!</translation>
@@ -23,6 +25,7 @@
 <translation id="1808667845054772817">Chromiumను మళ్లీ ఇన్‌స్టాల్ చేయి</translation>
 <translation id="1869480248812203386">సంభావ్య భద్రతాపరమైన దాడులకు సంబంధించిన వివరాలను Googleకి స్వయంచాలకంగా నివేదించడం ద్వారా Chromiumని సురక్షితంగా మరియు సులభంగా ఉపయోగించదగినదిగా చేయడంలో మీ సహాయం అందించవచ్చు.</translation>
 <translation id="1881322772814446296">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు మరియు దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్‌పై నియంత్రణను అందిస్తున్నారు. మీ అనువర్తనాలు, బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డాష్‌బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు, కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. మీరు ప్రస్తుతం ఉన్న మీ Chromium డేటాను వేరుగా ఉంచడానికి ఐచ్ఛికంగా క్రొత్త ప్రొఫైల్‌ను సృష్టించవచ్చు. <ph name="LEARN_MORE" /></translation>
+<translation id="1895626441344023878">{0,plural, =0{Chromium అప్‌డేట్ అందుబాటులో ఉంది}=1{Chromium అప్‌డేట్ అందుబాటులో ఉంది}other{# రోజులుగా Chromium అప్‌డేట్ అందుబాటులో ఉంది}}</translation>
 <translation id="1929939181775079593">Chromium ప్రతిస్పందించడం లేదు. ఇప్పుడు మళ్లీ ప్రారంభించాలా?</translation>
 <translation id="1966382378801805537">Chromium డిఫాల్ట్ బ్రౌజర్‌ను నిశ్చయించలేదు లేదా సెట్ చేయలేదు</translation>
 <translation id="2008474315282236005">ఇది ఈ పరికరం నుండి 1 అంశాన్ని తొలగిస్తుంది. మీ డేటాను తర్వాత తిరిగి పొందడానికి, Chromiumకి <ph name="USER_EMAIL" /> వలె సైన్ ఇన్ చేయండి.</translation>
@@ -52,6 +55,7 @@
 <translation id="2977470724722393594">Chromium తాజాగా ఉంది</translation>
 <translation id="3032787606318309379">Chromiumకి జోడిస్తోంది...</translation>
 <translation id="3046695367536568084">మీరు అనువర్తనాలను ఉపయోగించడానికి Chromiumకు సైన్ ఇన్ చేయాలి. ఇది పరికరాల్లో మీ అనువర్తనాలు, బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌లను సమకాలీకరించడానికి Chromiumను అనుమతిస్తుంది.</translation>
+<translation id="3052899382720782935">{0,plural, =1{1 నిమిషంలో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# నిమిషాల్లో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation>
 <translation id="3068515742935458733">Googleకు వినియోగ గణాంకాలు మరియు <ph name="UMA_LINK" />ను పంపడం ద్వారా Chromiumను మెరుగుపరచడంలో సహాయపడండి</translation>
 <translation id="3103660991484857065">ఇన్‌స్టాలర్ ఆర్కైవ్‌ని వాస్తవ పరిమాణానికి తీసుకుని రావడంలో విఫలమైంది. దయచేసి Chromiumని మళ్లీ డౌన్‌లోడ్ చేయండి.</translation>
 <translation id="3130323860337406239">Chromium మీ మైక్రోఫోన్‌ని ఉపయోగిస్తోంది.</translation>
@@ -71,12 +75,14 @@
 <translation id="3582788516608077514">Chromiumని నవీకరిస్తోంది...</translation>
 <translation id="358997566136285270">Chromium లోగో</translation>
 <translation id="3713809861844741608">కొత్త Chromium &amp;ట్యాబ్‌లో లింక్‌ని తెరువు</translation>
+<translation id="3728336900324680424">చిరునామా బార్‌లో సూచనలు చేయడానికి Chromium మీ డిస్క్‌ను యాక్సెస్ చేస్తుంది</translation>
 <translation id="3762167353400286894">Chromium OS ఈ భాషలో ప్రదర్శించబడుతోంది</translation>
 <translation id="378917192836375108">Chromium వెబ్‌లో ఫోన్ నంబర్ క్లిక్ చేయడానికి మరియు Skypeతో కాల్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది!</translation>
 <translation id="3848258323044014972"><ph name="PAGE_TITLE" /> - Chromium</translation>
 <translation id="3852700440713538496">Chromiumని మీ విధి పట్టీకి పిన్ చేయండి</translation>
 <translation id="3889543394854987837">Chromiumని తెరిచి, బ్రౌజింగ్‌ను ప్రారంభించడానికి మీ పేరుని క్లిక్ చేయండి.</translation>
 <translation id="3898493977366060150">Google స్మార్ట్‌లతో వెబ్ బ్రౌజింగ్</translation>
+<translation id="3965668104013180445">{0,plural, =1{Chromium OS ఒక గంటలో మళ్లీ ప్రారంభించబడుతుంది}other{Chromium OS # గంటల్లో మళ్లీ ప్రారంభించబడుతుంది}}</translation>
 <translation id="4036079820698952681"><ph name="BEGIN_LINK" />ప్రస్తుత సెట్టింగ్‌లను<ph name="END_LINK" /> నివేదించడం ద్వారా Chromiumని మెరుగుపరచడంలో సహాయపడండి</translation>
 <translation id="4050175100176540509">ముఖ్యమైన భద్రతా మెరుగుదలలు మరియు కొత్త లక్షణాలు తాజా సంస్కరణలో అందుబాటులో ఉన్నాయి.</translation>
 <translation id="407254336480250557"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Chromium<ph name="END_BOLD" />ని ఎంచుకోండి</translation>
@@ -103,6 +109,7 @@
 <translation id="4943838377383847465">Chromium నేపథ్య మోడ్‌లో ఉంది.</translation>
 <translation id="4987820182225656817">అతిథులు ఎటువంటి చరిత్రను వదలకుండానే Chromiumను ఉపయోగించవచ్చు.</translation>
 <translation id="4994636714258228724">Chromiumకు మిమ్మల్ని జోడించుకోండి</translation>
+<translation id="5021854341188256296">{0,plural, =0{Chromium OS అప్‌డేట్ అందుబాటులో ఉంది}=1{Chromium OS అప్‌డేట్ అందుబాటులో ఉంది}other{# రోజులుగా Chromium OS అప్‌డేట్ అందుబాటులో ఉంది}}</translation>
 <translation id="5032989939245619637">వివరాలను Chromiumలో సేవ్ చేయి</translation>
 <translation id="5045248521775609809">Chromiumని ప్రతిచోటుకు తీసుకెళ్లండి</translation>
 <translation id="5116586539350239523">Chromium మీ వ్యక్తిగత వివరాలను సురక్షితంగా నిల్వ చేస్తుంది కాబట్టి మీరు వాటిని మళ్లీ టైప్ చేయాల్సిన అవసరం లేదు.</translation>
@@ -115,10 +122,13 @@
 <translation id="5479196819031988440">Chromium OS ఈ పేజీని తెరవలేదు.</translation>
 <translation id="5480860683791598150">ఈ సైట్‌తో మీ స్థానాన్ని షేర్ చేయడానికి Chromiumకు మీ స్థాన యాక్సెస్ అవసరం</translation>
 <translation id="549669000822060376">దయచేసి Chromium తాజా సిస్టమ్ నవీకరణలను ఇన్‌స్టాల్ చేస్తున్నప్పుడు వేచి ఉండండి.</translation>
+<translation id="5514308096618405748">Linux (బీటా)గా అదనపు <ph name="BEGIN_LINK_CROS_OSS" />ఓపన్ సోర్స్ సాఫ్ట్‌వేర్‌<ph name="END_LINK_CROS_OSS" /> ద్వారా Chrome OS సాధ్యం అవుతుంది.</translation>
+<translation id="5529843986978123325">{0,plural, =1{Chromium OS 1 నిమిషంలో మళ్లీ ప్రారంభించబడుతుంది}other{Chromium OS # నిమిషాల్లో మళ్లీ ప్రారంభించబడుతుంది}}</translation>
 <translation id="5631814766731275228">Chromium పేరు మరియు చిత్రం</translation>
 <translation id="5634636535844844681">Chromiumకి Windows 7 లేదా అంతకంటే ఆధునికమైనది ఉండటం ఆవశ్యకం.</translation>
 <translation id="5680901439334282664">Chromiumకి సైన్ ఇన్ చేయండి</translation>
 <translation id="5698481217667032250">Chromiumను ఈ భాషలో ప్రదర్శించు</translation>
+<translation id="5712253116097046984">ఈ అప్‌డేట్‌ని వర్తింపజేయడం కోసం మీరు Chromium OSని మళ్లీ ప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
 <translation id="5726838626470692954">మీ నిర్వాహకులు తప్పనిసరిగా మిమ్మల్ని Chromium నుండి తీసివేసి, తిరిగి జోడించాలి.</translation>
 <translation id="5768914737813585044">Chromium OSను ఈ భాషలో ప్రదర్శించు</translation>
 <translation id="5796460469508169315">Chromium దాదాపు సిద్ధంగా ఉంది.</translation>
@@ -135,7 +145,9 @@
 <translation id="6072279588547424923">Chromiumకు <ph name="EXTENSION_NAME" /> జోడించబడింది</translation>
 <translation id="608189560609172163">సైన్ ఇన్ చేయడంలో లోపం కారణంగా Chromium మీ డేటాను సమకాలీకరించలేకపోయింది.</translation>
 <translation id="6096348254544841612">Chromiumని అనుకూలీకరించండి మరియు నియంత్రించండి. అప్‌డేట్ అందుబాటులో ఉంది.</translation>
+<translation id="6120345080069858279">Chromium ఈ పాస్‌వర్డ్‌ను మీ Google ఖాతాలో సేవ్ చేస్తుంది. మీరు దీనిని గుర్తుంచుకోవాల్సిన అవసరం లేదు.</translation>
 <translation id="6129621093834146363"><ph name="FILE_NAME" /> హానికరం, కావున Chromium దాన్ని బ్లాక్ చేసింది.</translation>
+<translation id="620022061217911843">అప్‌డేట్‌ని వర్తింపజేయడం కోసం మీరు Chromium OSని మళ్లీ ప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
 <translation id="6212496753309875659">ఈ కంప్యూటర్ ఇప్పటికే మరింత తాజా Chromium సంస్కరణని కలిగి ఉంది. సాఫ్ట్‌వేర్ పని చేయకుంటే, దయచేసి Chromiumని అన్ఇన్‌స్టాల్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="6248213926982192922">Chromiumని డిఫాల్ట్ బ్రౌజర్‌గా చేయి</translation>
 <translation id="6268381023930128611">Chromium నుండి సైన్ అవుట్ చేయాలా?</translation>
@@ -187,8 +199,10 @@
 <ph name="BEGIN_LINK_2" />మరింత తెలుసుకోండి<ph name="END_LINK_2" />
 
 దయచేసి తదుపరి సూచనల కోసం <ph name="ACCOUNT_EMAIL" />లో మీ ఇమెయిల్‌ను చూడండి.</translation>
+<translation id="7448255348454382571">Chromium OSని మళ్లీ ప్రారంభించండి</translation>
 <translation id="7449453770951226939"><ph name="PAGE_TITLE" /> - Chromium Dev</translation>
 <translation id="7451052299415159299">ఈ సైట్ కోసం మీ కెమెరాని యాక్సెస్ చేయడానికి Chromiumకు అనుమతి అవసరం</translation>
+<translation id="7471302858145901434">{0,plural, =1{ఒక రోజులో Chromium OSని మళ్లీ ప్రారంభించండి}other{# రోజుల్లో Chromium OSని మళ్లీ ప్రారంభించండి}}</translation>
 <translation id="7483335560992089831">ప్రస్తుతం అమలు చేయబడుతున్న అదే Chromium సంస్కరణని ఇన్‌స్టాల్ చేయలేరు. దయచేసి Chromiumని మూసివేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="7549178288319965365">Chromium OS గురించి</translation>
 <translation id="7577193603922410712">ఇప్పుడే Chromium కోసం ప్రత్యేక భద్రతా నవీకరణ వర్తింపజేయబడింది; అది అమలు కావడం కోసం మీరు దీన్ని ఇప్పుడు పునఃప్రారంభించాలి (మేము మీ ట్యాబ్‌లను పునరుద్ధరిస్తాము).</translation>
@@ -218,10 +232,13 @@
 <translation id="8290862415967981663">ఈ ఫైల్ అపాయకరం కావచ్చు, కాబట్టి Chromium దీన్ని బ్లాక్ చేసింది.</translation>
 <translation id="8330519371938183845">మీ పరికరాల అంతటా Chromiumని సమకాలీకరించడం మరియు వ్యక్తిగతీకరించడం కోసం సైన్ ఇన్ చేయండి</translation>
 <translation id="8340674089072921962"><ph name="USER_EMAIL_ADDRESS" /> మునుపు Chromiumని ఉపయోగించింది</translation>
+<translation id="8375950122744241554">పర్యవేక్షించబడే వినియోగదారు ప్రొఫైల్‌లు Chromium 70తో ప్రారంభమయ్యే వాటిల్లో ఇకపై అందుబాటులో ఉండవు.</translation>
+<translation id="8379713241968949941">{0,plural, =1{ఒక గంటలో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# గంటల్లో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation>
 <translation id="8453117565092476964">ఇన్‌స్టాలర్ ఆర్కైవ్ పాడైంది లేదా చెల్లదు. దయచేసి Chromiumని మళ్లీ డౌన్‌లోడ్ చేయండి.</translation>
 <translation id="8493179195440786826">Chromium కాలం చెల్లినది</translation>
 <translation id="85843667276690461">Chromiumని ఉపయోగించి సహాయాన్ని పొందండి</translation>
 <translation id="8586442755830160949">కాపీరైట్ <ph name="YEAR" /> Chromium రచయితలు. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation>
+<translation id="8599548569518771270">{0,plural, =0{Chromium OS ఇప్పుడు మళ్లీ ప్రారంభించబడుతుంది}=1{Chromium OS 1 సెకనులో మళ్లీ ప్రారంభమవుతుంది}other{Chromium OS # సెకన్లలో మళ్లీ ప్రారంభమవుతుంది}}</translation>
 <translation id="8619360774459241877">Chromiumని ప్రారంభిస్తోంది...</translation>
 <translation id="8621669128220841554">పేర్కొనబడలేని లోపం కారణంగా ఇన్‌స్టాలేషన్ విఫలమైంది. దయచేసి Chromiumని మళ్లీ డౌన్‌లోడ్ చేయండి.</translation>
 <translation id="8628626585870903697">ముద్రణా పరిదృశ్యం పని చేయడానికి అవసరమైన PDF వ్యూయర్‌ని Chromium చేర్చలేదు.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb
index 1dd5d20..8fce934 100644
--- a/chrome/app/resources/chromium_strings_th.xtb
+++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium แสดงในภาษานี้</translation>
 <translation id="81770708095080097">ไฟล์นี้อันตราย Chromium จึงบล็อกไว้</translation>
 <translation id="8222496066431494154">ติดตั้ง Chromium ในโทรศัพท์ เราจะส่ง SMS ไปยังหมายเลขโทรศัพท์สำหรับการกู้คืนบัญชีของคุณ: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">หน้านี้ใช้หน่วยความจำมากเกินไป Chrome จึงนำเนื้อหาบางส่วนออก</translation>
 <translation id="8269379391216269538">ช่วยปรับปรุง Chromium ให้ดีขึ้น</translation>
 <translation id="8290862415967981663">ไฟล์นี้อาจเป็นอันตราย Chromium จึงบล็อกไว้</translation>
 <translation id="8330519371938183845">ลงชื่อเข้าใช้เพื่อซิงค์และปรับเปลี่ยน Chromium ในอุปกรณ์ต่างๆ</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb
index 3dd403d..07bd47e 100644
--- a/chrome/app/resources/chromium_strings_tr.xtb
+++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -230,6 +230,7 @@
 <translation id="8157153840442649507">Chromium bu dilde görüntüleniyor</translation>
 <translation id="81770708095080097">Bu dosya tehlikeli olduğu için Chromium tarafından engellendi.</translation>
 <translation id="8222496066431494154">Chromium'u telefonunuza yükleyin. Hesap kurtarma telefon numaranıza SMS göndereceğiz: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Bu sayfa çok fazla bellek kullandığından Chrome bazı içerikleri kaldırdı.</translation>
 <translation id="8269379391216269538">Chromium'u daha iyi hale getirmeye yardımcı olun</translation>
 <translation id="8290862415967981663">Bu dosya tehlikeli olabileceği için Chromium tarafından engellendi.</translation>
 <translation id="8330519371938183845">Chromium'u cihazlarınız arasında senkronize etmek ve kişiselleştirmek için oturum açın</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb
index c486a158..91a1543e 100644
--- a/chrome/app/resources/chromium_strings_uk.xtb
+++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Для Chromium вибрано цю мову</translation>
 <translation id="81770708095080097">Цей файл небезпечний, тому Chromium заблокував його.</translation>
 <translation id="8222496066431494154">Установіть Chromium на телефоні. Ми надішлемо SMS на номер телефону для відновлення облікового запису: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Ця сторінка використовує забагато пам’яті, тому веб-переглядач Chrome вилучив деякий вміст.</translation>
 <translation id="8269379391216269538">Допоможіть покращити Chromium</translation>
 <translation id="8290862415967981663">Цей файл може бути небезпечним, тому Chromium заблокував його.</translation>
 <translation id="8330519371938183845">Увійдіть, щоб синхронізувати та персоналізувати роботу Chromium на всіх своїх пристроях</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb
index 8726144a..25168e267 100644
--- a/chrome/app/resources/chromium_strings_vi.xtb
+++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium được hiển thị bằng ngôn ngữ này</translation>
 <translation id="81770708095080097">Tệp này nguy hiểm, do đó Chromium đã chặn tệp.</translation>
 <translation id="8222496066431494154">Cài đặt Chromium trên điện thoại của bạn. Chúng tôi sẽ gửi SMS tới số điện thoại khôi phục tài khoản của bạn: <ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">Trang này sử dụng quá nhiều bộ nhớ, nên Chrome đã xóa bớt nội dung.</translation>
 <translation id="8269379391216269538">Giúp cải thiện Chromium</translation>
 <translation id="8290862415967981663">Tệp này nguy hiểm, do đó Chromium đã chặn tệp.</translation>
 <translation id="8330519371938183845">Đăng nhập để đồng bộ hóa và cá nhân hóa Chromium trên các thiết bị của bạn</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb
index 9aec59d..197d163c 100644
--- a/chrome/app/resources/chromium_strings_zh-TW.xtb
+++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -232,6 +232,7 @@
 <translation id="8157153840442649507">Chromium 的介面文字已設為這種語言</translation>
 <translation id="81770708095080097">這個檔案並不安全,因此遭到 Chromium 封鎖。</translation>
 <translation id="8222496066431494154">在手機上安裝 Chromium。我們會傳送簡訊到你的帳戶備援電話號碼:<ph name="PHONE_NUMBER" /></translation>
+<translation id="825412236959742607">這個網頁使用了過多記憶體,因此 Chrome 移除了部分內容。</translation>
 <translation id="8269379391216269538">協助改善 Chromium</translation>
 <translation id="8290862415967981663">這個檔案可能不安全,因此遭到 Chromium 封鎖。</translation>
 <translation id="8330519371938183845">登入即可進行同步處理,讓你在所有裝置上享有個人化的 Chromium 體驗</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 1987744..752dfea 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">እረማ ሆሄ እና ሰዋስው አሳይ</translation>
 <translation id="1593594475886691512">ቅርጸት በመስራት ላይ...</translation>
 <translation id="159359590073980872">የምስል መሸጎጫ</translation>
+<translation id="1593926297800505364">የመክፈያ ዘዴን አስቀምጥ</translation>
 <translation id="1598233202702788831">ዝማኔዎች በእርስዎ አስተዳዳሪ ተሰናክሏል።</translation>
 <translation id="1600857548979126453">የገጽ አራሚ ደጀኑን ይደርስበታል</translation>
 <translation id="1601560923496285236">ተግብር</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">መሣሪያውን ከጎራው ጋር ማቀላቀል አልተቻለም። ማከል ከሚችሉት የመሣሪያዎች ብዛት አለመብለጥዎን ያረጋግጡ።</translation>
 <translation id="1744108098763830590">የጀርባ ገጽ</translation>
 <translation id="1745520510852184940">ሁልጊዜ ይህን አድርግ</translation>
+<translation id="1746417874336251387">የእርስዎን ስልክ ግንኙነት ለየእርስዎ Chromebook የሚጠቀሙ አዲስ ባህሪያትን ያክሉ</translation>
 <translation id="174937106936716857">ጠቅላላ ፋይል ብዛት</translation>
 <translation id="175196451752279553">የተ&amp;ዘጋውን ትር ዳግም ክፈት</translation>
 <translation id="1753905327828125965">በይበልጥ የተጎበኙ</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">በፊት ያልሆነ</translation>
 <translation id="1933809209549026293">እባክዎ መዳፊት ወይም ቁልፍ ሰሌዳ ያገናኙ። የብሉቱዝ መሣሪያ ከሆነ እየተጠቀሙ ያሉት ለመጣመር ዝግጁ መሆኑን ያረጋግጡ።</translation>
 <translation id="1936157145127842922">በአቃፊ አሳይ</translation>
+<translation id="1938351510777341717">ውጫዊ ትዕዛዝ</translation>
 <translation id="1940546824932169984">የተገናኙ መሣሪያዎች</translation>
 <translation id="1942765061641586207">የምስል ጥራት</translation>
+<translation id="1943097386230153518">አዲስ አገልግሎት ጫን</translation>
 <translation id="1944921356641260203">ዝማኔ ተገኝቷል</translation>
 <translation id="1951615167417147110">አንድ ገጽ ወደላይ ይሸበልላል</translation>
 <translation id="1954813140452229842">ማጋራትን ማፈናጠጥ ላይ ስህተት። እባክዎ ምስክርነቶችዎን ይፈትሹና እንደገና ይሞክሩ።</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">አስገባ</translation>
 <translation id="265390580714150011">የመስክ እሴት</translation>
 <translation id="2654166010170466751">ጣቢያዎች የክፍያ ተቆጣጣሪይዎችን እንዲጭኑ ይፍቀዱ</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />ባህሪዎች እንደየመሣሪያው ይለያያሉ</translation>
 <translation id="2660779039299703961">ክስተት</translation>
 <translation id="266079277508604648">ከአታሚ ጋር መገናኘት አልተቻለም። አታሚው መብራቱንና በWi-Fi ወይም በዩኤስቢ ከእርስዎ Chromebook ጋር መገናኘቱን ያረጋግጡ።</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">ፒን ያስገቡ</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">መተግበሪያዎች</translation>
+<translation id="2806891468525657116">አቋራጭ አስቀድሞ አለ</translation>
 <translation id="2807517655263062534">እርስዎ የሚያወርዷቸው ፋይሎች እዚህ ይመጣሉ</translation>
 <translation id="2809586584051668049">እና <ph name="NUMBER_ADDITIONAL_DISABLED" /> ተጨማሪ</translation>
 <translation id="281133045296806353">ባለው አሳሽ ክፍለ ጊዜ አዲስ መስኮት ተፈጥሯል።</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">ወደ መለያ ገብተዋል!</translation>
 <translation id="3429275422858276529">ይህን ገጽ በቀላሉ በኋላ እንዲያገኙ ዕልባት ያድርጉት</translation>
 <translation id="3429599832623003132">$1 ንጥሎች</translation>
+<translation id="3430342160185525240">ረዳቱ ማሳውቂያዎችን ለእርስዎ እንዲያሳይ ያነቃዋል።</translation>
 <translation id="3432227430032737297">ሁሉም የታዩትን አስወግድ</translation>
 <translation id="3432757130254800023">ኦዲዮ እና ቪዲዮ በአካባቢያዊ አውታረ መረብ ላይ ላሉ ማሳያዎች ላክ</translation>
 <translation id="3432762828853624962">የተጋሩ ሠራተኞች</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> መጠቀም ማራገፍ አለብዎት።
 
   <ph name="CONTROL_PANEL_APPLET_NAME" />ን መጀመር ይፈልጋሉ?</translation>
+<translation id="394183848452296464">አቋራጮችን መፍጠር አልተቻለም</translation>
 <translation id="3943582379552582368">&amp;ተመለስ</translation>
 <translation id="3943857333388298514">ለጥፍ</translation>
 <translation id="3948116654032448504">ለምስል <ph name="SEARCH_ENGINE" />ን ይ&amp;ፈልጉ</translation>
@@ -2269,6 +2277,7 @@
 <translation id="4481530544597605423">ያልተጣመሩ መሣሪያዎች</translation>
 <translation id="4482194545587547824">Google ፍለጋን እና ሌሎች የGoogle አገልግሎቶችን ግላዊነት ለማላበስ የአሰሳ ታሪክዎን ሊጠቀም ይችላል</translation>
 <translation id="4495419450179050807">በዚህ ገጽ ላይ አታሳይ</translation>
+<translation id="4499718683476608392">በአንዲት ጠቅታ ቅጾችን ለመሙላት የክሬዲት ካርድ ራስ-ሙላን ያንቁ</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ተበላሽቷል</translation>
 <translation id="450099669180426158">የቃለ አጋኖ አዶ</translation>
 <translation id="4501530680793980440">ማስወገድ ያረጋግጡ</translation>
@@ -2547,7 +2556,6 @@
 <translation id="4917385247580444890">ጠንካራ</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ከቅጥያ «<ph name="EXTENSION_NAME" />» ጋር መገናኘት ይፈልጋል</translation>
 <translation id="4918086044614829423">ይቀበሉ</translation>
-<translation id="4920350943031252905">የLinux መሣሪያዎችን፣ አርታዒያን እና አይዲኢዎች በእርስዎ Chromebook ላይ ያሂዱ።</translation>
 <translation id="4920887663447894854">የሚከተለሉት ጣቢያዎች በዚህ ገጽ ላይ አካባቢዎን ከመከታተል ታግደዋል፦</translation>
 <translation id="492299503953721473">የAndroid መተግበሪያዎችን አስወግድ</translation>
 <translation id="4923279099980110923">አዎ፣ ማገዝ እፈልጋለሁ</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">የChrome OS የክላውድ ምትኬ</translation>
 <translation id="5756163054456765343">የእገዛ ማዕከል</translation>
 <translation id="5759728514498647443">በ <ph name="APP_NAME" /> በኩል ሊያትሙዋቸው የሚልኩዋቸው ሰነዶች በ <ph name="APP_NAME" /> ላይ ሊነበቡ ይችላሉ።</translation>
+<translation id="5762172915276660232">የክሬዲት ካርድ ቅንብሮች</translation>
 <translation id="5763751966069581670">ምንም የዩኤስቢ መሣሪያዎች አልተገኙም</translation>
 <translation id="5764483294734785780">ተሰሚ/ኦዲዮ አስ&amp;ቀምጥ እንደ…</translation>
 <translation id="57646104491463491">የተቀየረበት ቀን</translation>
@@ -3183,6 +3192,7 @@
 <translation id="5855773610748894548">ውይ፣ ደህንነቱ የተጠበቀ ሞዱል ስህተት።</translation>
 <translation id="5856721540245522153">የማረሚያ ባህሪያትን ያንቁ</translation>
 <translation id="5857090052475505287">አዲስ አቃፊ</translation>
+<translation id="585979798156957858">ውጫዊ ሜታ</translation>
 <translation id="5860033963881614850">አጥፋ</translation>
 <translation id="5860209693144823476">ትር 3</translation>
 <translation id="5860491529813859533">አብራ</translation>
@@ -3492,6 +3502,7 @@
 <translation id="6327785803543103246">የድር ተኪ ራስ-ግኝት</translation>
 <translation id="6333064448949140209">ፋይሉ ለመታረም ወደ Google ይላካል</translation>
 <translation id="6333834492048057036">ለመፈለግ የአድራሻ አሞሌ ላይ ያተኩሩ</translation>
+<translation id="6336451774241870485">አዲስ የግል ትር</translation>
 <translation id="6339668969738228384">ለ<ph name="USER_EMAIL_ADDRESS" /> አዲስ መገለጫ ይፈጠሩ</translation>
 <translation id="6340017061976355871">ከአገልጋዩ ጋር መገናኘት አልተቻለም። እባክዎ የአውታረ መረብዎን ግንኙነት ይፈትሹትና እንደገና ይሞክሩ። ችግሩ ከቀጠለ የእርስዎን Chromebook ዳግም ያስጀምሩት።</translation>
 <translation id="6340071272923955280">የበይነመረብ ህትመት ፕሮቶኮል (አይፒፒፒኤስ)</translation>
@@ -3673,6 +3684,7 @@
 <translation id="6606070663386660533">ትር 8</translation>
 <translation id="6607272825297743757">የፋይል መረጃ</translation>
 <translation id="6607831829715835317">&amp;ተጨማሪ መሣሪያዎች</translation>
+<translation id="6610147964972079463">የግል ትሮችን ዝጋ</translation>
 <translation id="6612358246767739896">ጥበቃ የሚደረግለት ይዘት</translation>
 <translation id="6613452264606394692">ይህን ገጽ ዕልባት በማድረግ በፍጥነት ወደዚህ ተመልሰው ይምጡ</translation>
 <translation id="6614893213975402384">ዝማኔዎችን እና መተግበሪያዎችን ይጫኑ። በመቀጠልዎ ይህ መሣሪያ እንዲሁም ዝማኔዎችን እና መተግበሪያዎችን ከGoogle፣ ከአገልግሎት አቅራቢዎ እና ከመሣሪያዎ አምራች በራስ-ሰር ሊያወርድና ሊጭን እንደሚችል፣ ምናልባትም የተንቀሳቃሽ ስልክ ውሂብም በመጠቀም፣ ይስማሙበታል። <ph name="BEGIN_LINK1" />የበለጠ ለመረዳት<ph name="END_LINK1" /></translation>
@@ -3743,6 +3755,7 @@
 <translation id="6710213216561001401">ቀዳሚ</translation>
 <translation id="6718273304615422081">በማጨቅ ላይ...</translation>
 <translation id="671928215901716392">ማያ ገጽ ይቆልፉ</translation>
+<translation id="6720847671508630642">የAndroid ምርጥ በራስ-ሰር ለእርስዎ Chromebook ያጋሩት። ከእርስዎ ኮምፒውተር ሆነው የጽሑፍ መልእክት መላክ፣ የስልክዎን የበይነመረብ ግንኙነት ማጋራት እና የእርስዎን የChromebook ማያ ገጽ መክፈት ለመቻል ስልክዎን ያገናኙት።<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">የደህንነት ቁልፍዎን ስሪት እና ሞዴል ይመልከቱ</translation>
 <translation id="6721972322305477112">&amp;ፋይል</translation>
 <translation id="672213144943476270">እንደ እንግዳ ከማሰስዎ በፊት የእርስዎን መገለጫ እባክዎ ይክፈቱ።</translation>
@@ -3889,6 +3902,7 @@
 <translation id="6970856801391541997">የተወሰኑ ገጾችን አትም</translation>
 <translation id="6972180789171089114">ኦዲዮ/ቪዲዮ</translation>
 <translation id="6973630695168034713">አቃፊዎች</translation>
+<translation id="6974609594866392343">የመስመር ውጭ ማሳያ ሁነታ</translation>
 <translation id="6976108581241006975">የጃቫስክሪፕት ኮንሶል</translation>
 <translation id="6977381486153291903">የጽኑ ትዕዛዝ ክለሳ</translation>
 <translation id="6978121630131642226">የፍለጋ ፕሮግራሞች</translation>
@@ -4483,6 +4497,7 @@
 <translation id="7857949311770343000">የጠበቁት የአዲስ ትር ገጽ ይሄ ነው?</translation>
 <translation id="786073089922909430">አገልግሎት፦ <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;የወረዱ</translation>
+<translation id="7864662577698025113">አዲስ አገልግልቶ አክል</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 ኩኪ}one{# ኩኪዎች}other{# ኩኪዎች}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - ተጣምሯል</translation>
 <translation id="7870730066603611552">ቅንብርን የሚከተሉትን የማስመር አማራጮች ይገምግሙ</translation>
@@ -5002,6 +5017,7 @@
 <translation id="8666584013686199826">አንድ ጣቢያ የዩኤስቢ መሣሪያዎችን መድረስ ሲፈልግ ጠይቅ</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> አሁን ሙሉ ማያ ገጽ ነው፣ እናም የመዳፊትዎ ጠቋሚን አሰናክሎታል።</translation>
 <translation id="8669284339312441707">ይበልጥ ሞቅ ያለ</translation>
+<translation id="8669919703154928649">ረዳት ማሳወቂያዎችን ያሳየዎት</translation>
 <translation id="8669949407341943408">በመውሰድ ላይ...</translation>
 <translation id="8671210955687109937">አስተያየት መስጠት ይችላሉ</translation>
 <translation id="8673026256276578048">ድሩን ፈልግ...</translation>
@@ -5389,6 +5405,7 @@
 <translation id="964286338916298286">የእርስዎ የአይቲ አስተዳዳሪ Chrome Goodiesን ለመሣሪያዎ አሰናክሏል።</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{መተግበሪያ}one{መተግበሪያዎች}other{መተግበሪያዎች}}</translation>
 <translation id="967007123645306417">በእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ላይ የሚደረጉ ለውጦች ከአሁን በኋላ ከGoogle መለያዎ ጋር አይሰምሩም። ይሁንና፣ የእርስዎ ነባር ውሂብ በGoogle መለያዎ ላይ እንደተከማቸ የሚቆይ እና በ<ph name="BEGIN_LINK" />Google ዳሽቦርድ<ph name="END_LINK" /> ላይ መቀናበር የሚችል ነው።</translation>
+<translation id="967624055006145463">የተከማቸ ውሂብ</translation>
 <translation id="968000525894980488">Google Play አገልግሎቶችን ያብሩ።</translation>
 <translation id="968174221497644223">የመተግበሪያ መሸጎጫ</translation>
 <translation id="969096075394517431">ቋንቋዎችን ይቀይሩ</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index f9b7baf..d45b399d 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">إظهار التدقيق الإملائي والتدقيق النحوي</translation>
 <translation id="1593594475886691512">جارٍ التهيئة...</translation>
 <translation id="159359590073980872">ذاكرة التخزين المؤقت للصور</translation>
+<translation id="1593926297800505364">حفظ طريقة الدفع</translation>
 <translation id="1598233202702788831">أوقف المشرف التحديثات.</translation>
 <translation id="1600857548979126453">الدخول إلى الواجهة الخلفية لبرنامج تصحيح خلل الصفحة</translation>
 <translation id="1601560923496285236">تطبيق</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">يتعذَّر ضم الجهاز إلى النطاق. يُرجى التأكُّد من أنك لم تتجاوز عدد الأجهزة التي يمكنك إضافتها.</translation>
 <translation id="1744108098763830590">صفحة الخلفية</translation>
 <translation id="1745520510852184940">أجرِ ذلك دائمًا</translation>
+<translation id="1746417874336251387">‏توفير ميزات جديدة تستخدم اتصال هاتفك بجهاز Chromebook</translation>
 <translation id="174937106936716857">إجمالي عدد الملفات</translation>
 <translation id="175196451752279553">إ&amp;عادة فتح علامة التبويب المغلقة</translation>
 <translation id="1753905327828125965">الأكثر زيارة</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">أول يوم لتفعيل الصلاحية</translation>
 <translation id="1933809209549026293">‏يُرجى توصيل الماوس أو لوحة المفاتيح. إذا كنت تستخدم جهاز Bluetooth، فتأكد من أنه جاهز للإقران.</translation>
 <translation id="1936157145127842922">عرض في المجلد</translation>
+<translation id="1938351510777341717">‏مفتاح Command الخارجي</translation>
 <translation id="1940546824932169984">الأجهزة المتصلة</translation>
 <translation id="1942765061641586207">دقة الصورة</translation>
+<translation id="1943097386230153518">تثبيت خدمة جديدة</translation>
 <translation id="1944921356641260203">تم العثور على التحديث</translation>
 <translation id="1951615167417147110">تمرير صفحة واحدة لأعلى</translation>
 <translation id="1954813140452229842">حدث خطأ في تحميل المشاركة. يُرجى التحقُّق من بيانات الاعتماد وإعادة المحاولة.</translation>
@@ -1107,6 +1111,7 @@
 <translation id="2653659639078652383">إرسال</translation>
 <translation id="265390580714150011">قيمة الحقل</translation>
 <translation id="2654166010170466751">السماح لمواقع الويب بتثبيت معالجات الدفع</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />تختلف الميزات حسب الجهاز</translation>
 <translation id="2660779039299703961">حدث</translation>
 <translation id="266079277508604648">‏يتعذّر الاتصال بالطابعة. تحقق مما إذا كانت الطابعة مُفعّلة ومتصلة بجهاز Chromebook عن طريق Wi-Fi أو USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1213,6 +1218,7 @@
 <translation id="2803375539583399270">أدخل رقم التعريف الشخصي</translation>
 <translation id="2805646850212350655">‏نظام تشفير الملفات لـ Microsoft</translation>
 <translation id="2805756323405976993">التطبيقات</translation>
+<translation id="2806891468525657116">الاختصار موجود من قَبل</translation>
 <translation id="2807517655263062534">هنا تظهر الملفات التي تم تنزيلها</translation>
 <translation id="2809586584051668049">و<ph name="NUMBER_ADDITIONAL_DISABLED" /> من الإضافات الأخرى</translation>
 <translation id="281133045296806353">تم فتح نافذة جديدة في جلسة المتصفح الحالي.</translation>
@@ -1598,6 +1604,7 @@
 <translation id="3428419049384081277">تم تسجيل دخولك!</translation>
 <translation id="3429275422858276529">ضَع إشارة على هذه الصفحة لسهولة العثور عليها لاحقًا</translation>
 <translation id="3429599832623003132">$1 من العناصر</translation>
+<translation id="3430342160185525240">‏يعمل على تفعيل "مساعد Google" لعرض الإشعارات.</translation>
 <translation id="3432227430032737297">إزالة كل العناصر المعروضة</translation>
 <translation id="3432757130254800023">إرسال الإعدادات الصوتية والفيديو لشاشات العرض على الشبكة المحلية</translation>
 <translation id="3432762828853624962">العمال المشتركون</translation>
@@ -1959,6 +1966,7 @@
 <translation id="3940233957883229251">تفعيل الإعادة التلقائية</translation>
 <translation id="3941357410013254652">معرّف القناة</translation>
 <translation id="3941565636838060942">لإخفاء إمكانية الدخول إلى هذا البرنامج، يجب إلغاء تثبيته باستخدام <ph name="CONTROL_PANEL_APPLET_NAME" /> من لوحة التحكّم. هل تريد بدء تشغيل <ph name="CONTROL_PANEL_APPLET_NAME" />؟</translation>
+<translation id="394183848452296464">يتعذّر إنشاء الاختصار</translation>
 <translation id="3943582379552582368">&amp;إلى الوراء</translation>
 <translation id="3943857333388298514">لصق</translation>
 <translation id="3948116654032448504">&amp;بحث على <ph name="SEARCH_ENGINE" /> عن صورة</translation>
@@ -2266,6 +2274,7 @@
 <translation id="4481530544597605423">الأجهزة التي تم إلغاء إقرانها</translation>
 <translation id="4482194545587547824">‏قد يستخدم Google سجل التصفح لتخصيص البحث وخدمات Google الأخرى.</translation>
 <translation id="4495419450179050807">عدم الظهور في هذه الصفحة</translation>
+<translation id="4499718683476608392">تفعيل الملء التلقائي لبطاقة الائتمان لملء النماذج بنقرة واحدة</translation>
 <translation id="4500114933761911433">تعطّل <ph name="PLUGIN_NAME" />.</translation>
 <translation id="450099669180426158">رمز علامة التعجب</translation>
 <translation id="4501530680793980440">تأكيد الإزالة</translation>
@@ -2544,7 +2553,6 @@
 <translation id="4917385247580444890">قوية</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> يريد الاتصال مع الإضافة "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">قبول</translation>
-<translation id="4920350943031252905">‏يمكنك تشغيل أدوات Linux وأدوات التعديل وبرامج IDE على Chromebook.</translation>
 <translation id="4920887663447894854">تم حظر تتبع المواقع التالية لموقعك في هذه الصفحة:</translation>
 <translation id="492299503953721473">‏إزالة تطبيقات Android</translation>
 <translation id="4923279099980110923">نعم، أريد تقديم المساعدة</translation>
@@ -3109,6 +3117,7 @@
 <translation id="5752453871435543420">‏النسخ الاحتياطي في السحاب عبر نظام التشغيل Chrome</translation>
 <translation id="5756163054456765343">مركز المساعدة</translation>
 <translation id="5759728514498647443">يمكن قراءة المستندات التي ترسلها إلى الطباعة عبر <ph name="APP_NAME" /> بواسطة <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">إعدادات بطاقة الائتمان</translation>
 <translation id="5763751966069581670">‏لم يتم العثور على أي أجهزة USB</translation>
 <translation id="5764483294734785780">حف&amp;ظ ملف الصوت باسم...</translation>
 <translation id="57646104491463491">تاريخ التعديل</translation>
@@ -3180,6 +3189,7 @@
 <translation id="5855773610748894548">عفوًا، حدث خطأ في الوحدة الآمنة.</translation>
 <translation id="5856721540245522153">تفعيل ميزات تصحيح الأخطاء</translation>
 <translation id="5857090052475505287">مجلد جديد</translation>
+<translation id="585979798156957858">‏مفتاح Meta الخارجي</translation>
 <translation id="5860033963881614850">إيقاف</translation>
 <translation id="5860209693144823476">علامة التبويب 3</translation>
 <translation id="5860491529813859533">تشغيل</translation>
@@ -3490,6 +3500,7 @@
 <translation id="6327785803543103246">اكتشاف الخادم الوكيل للويب تلقائيًا</translation>
 <translation id="6333064448949140209">‏سيتم إرسال الملف إلى Google لتصحيح الأخطاء</translation>
 <translation id="6333834492048057036">تركيز شريط العناوين للبحث</translation>
+<translation id="6336451774241870485">علامة تبويب خاصة جديدة</translation>
 <translation id="6339668969738228384">إنشاء ملف شخصي جديد لـ <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">‏تعذّر الاتصال بالخادم، يُرجى التحقق من اتصالك بالشبكة والمحاولة مرة أخرى. في حالة استمرار هذه المشكلة، يُرجى إعادة تشغيل Chromebook.</translation>
 <translation id="6340071272923955280">‏بروتوكول الطباعة على الإنترنت (IPPS)</translation>
@@ -3671,6 +3682,7 @@
 <translation id="6606070663386660533">علامة التبويب 8</translation>
 <translation id="6607272825297743757">معلومات الملف</translation>
 <translation id="6607831829715835317">المزيد من &amp;الأدوات</translation>
+<translation id="6610147964972079463">إغلاق علامات التبويب الخاصة</translation>
 <translation id="6612358246767739896">محتوى محمي</translation>
 <translation id="6613452264606394692">يمكنك الرجوع إلى هنا بسرعة بوضع إشارة على هذه الصفحة</translation>
 <translation id="6614893213975402384">‏تثبيت التحديثات والتطبيقات. بالمتابعة، أنت توافق على تفعيل هذا الجهاز من تنزيل التحديثات والتطبيقات وتثبيتها تلقائيًا من Google ومشغِّل شبكة الجوَّال والشركة المصنِّعة للجهاز، وأنّ ذلك قد يتم عبر بيانات شبكة الجوَّال. قد توفّر بعض هذه التطبيقات ميزة الشراء داخل التطبيق. ويمكنك إزالة هذه التطبيقات متى شئت. <ph name="BEGIN_LINK1" />مزيد من المعلومات<ph name="END_LINK1" /></translation>
@@ -3741,6 +3753,7 @@
 <translation id="6710213216561001401">السابق</translation>
 <translation id="6718273304615422081">جارٍ الضغط...</translation>
 <translation id="671928215901716392">قفل الشاشة</translation>
+<translation id="6720847671508630642">‏يمكنك الاستفادة من أفضل ميزات جهاز Android ومشاركتها تلقائيًا على جهاز Chromebook الخاص بك. وتوصيل هاتفك سيمكّنك من إرسال رسائل نصيّة من جهاز الكمبيوتر ومشاركة اتصالك بالإنترنت وإلغاء قفل شاشة جهاز Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">الاطّلاع على العلامة التجارية لمفتاح الأمان وطرازه.</translation>
 <translation id="6721972322305477112">&amp;ملف</translation>
 <translation id="672213144943476270">يُرجى إلغاء قفل ملفك الشخصي قبل التصفح كضيف.</translation>
@@ -3887,6 +3900,7 @@
 <translation id="6970856801391541997">طباعة صفحات محددة</translation>
 <translation id="6972180789171089114">صوت/فيديو</translation>
 <translation id="6973630695168034713">المجلدات</translation>
+<translation id="6974609594866392343">وضع تجريبي بلا اتصال بالإنترنت</translation>
 <translation id="6976108581241006975">وحدة تحكم جافا سكريبت</translation>
 <translation id="6977381486153291903">مراجعة البرامج الثابتة</translation>
 <translation id="6978121630131642226">محرّكات البحث</translation>
@@ -4482,6 +4496,7 @@
 <translation id="7857949311770343000">هل هذه هي صفحة علامة التبويب الجديدة التي كنت تتوقع ظهورها؟</translation>
 <translation id="786073089922909430">الخدمة: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">ال&amp;تنزيلات</translation>
+<translation id="7864662577698025113">إضافة خدمة جديدة</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{ملف تعريف ارتباط واحد}zero{# ملف تعريف ارتباط}two{# ملفا تعريف ارتباط }few{# ملفات تعريف ارتباط}many{# ملف تعريف ارتباط}other{# ملف تعريف ارتباط}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - تم الإقران</translation>
 <translation id="7870730066603611552">مراجعة خيارات المزامنة بعد الإعداد</translation>
@@ -4996,6 +5011,7 @@
 <translation id="8666584013686199826">‏طلب الإذن في حال محاولة أحد المواقع الوصول إلى أجهزة USB (مُوصى به)</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> في وضع ملء الشاشة الآن وتم إيقاف مؤشر الماوس.</translation>
 <translation id="8669284339312441707">أكثر دفئًا</translation>
+<translation id="8669919703154928649">‏السماح لـ "مساعد Google" بعرض الإشعارات</translation>
 <translation id="8669949407341943408">جارٍ النقل...</translation>
 <translation id="8671210955687109937">يمكن التعليق</translation>
 <translation id="8673026256276578048">البحث في الويب...</translation>
@@ -5383,6 +5399,7 @@
 <translation id="964286338916298286">‏أوقف مشرف تقنية المعلومات ميزات Chrome الإضافية لجهازك.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{تطبيق}zero{تطبيقات}two{تطبيقان}few{تطبيقات}many{تطبيقات}other{تطبيقات}}</translation>
 <translation id="967007123645306417">‏سيؤدي هذا إلى تسجيل خروجك من حساباتك على Google. لن تتم بعد ذلك مزامنة التغييرات التي تطرأ على الإشارات المرجعية والسجلّ وكلمات المرور وغيرها من الإعدادات إلى حسابك على Google. ومع ذلك، ستظل بياناتك الحالية مخزّنة في حسابك على Google ويمكن إدارتها في <ph name="BEGIN_LINK" />لوحة تحكُّم Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">البيانات المُخزَّنة</translation>
 <translation id="968000525894980488">‏يُرجى تفعيل خدمات Google Play.</translation>
 <translation id="968174221497644223">ذاكرة التخزين المؤقت للتطبيق</translation>
 <translation id="969096075394517431">تغيير اللغات</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index dc96085..2cc84b2 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">Показване на проверката на правописа и граматиката</translation>
 <translation id="1593594475886691512">Форматира се...</translation>
 <translation id="159359590073980872">Кеш за изображения</translation>
+<translation id="1593926297800505364">Запазване на начина на плащане</translation>
 <translation id="1598233202702788831">Актуализациите са деактивирани от администратора ви.</translation>
 <translation id="1600857548979126453">Достъп до задния слой на инструмента за откриване и отстраняване на грешки в страниците</translation>
 <translation id="1601560923496285236">Прилагане</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">Устройството не може да се присъедини към домейна. Проверете дали не сте надхвърлили броя устройства, които можете да добавите.</translation>
 <translation id="1744108098763830590">фонова страница</translation>
 <translation id="1745520510852184940">Превеждане винаги</translation>
+<translation id="1746417874336251387">Извеждане на предложения за нови функции, които използват връзката на телефона ви с вашия Chromebook</translation>
 <translation id="174937106936716857">Общ брой файлове</translation>
 <translation id="175196451752279553">По&amp;вторно отваряне на затворения раздел</translation>
 <translation id="1753905327828125965">Ползвани</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">Не преди</translation>
 <translation id="1933809209549026293">Моля, свържете мишка или клавиатура. Ако използвате устройство с Bluetooth, уверете се, че е готово за сдвояване.</translation>
 <translation id="1936157145127842922">Показване в папката</translation>
+<translation id="1938351510777341717">Външен клавиш Command</translation>
 <translation id="1940546824932169984">Свързани устройства</translation>
 <translation id="1942765061641586207">Разделителна способност на изображението</translation>
+<translation id="1943097386230153518">Инсталиране на нова услуга</translation>
 <translation id="1944921356641260203">Намерена е актуализация</translation>
 <translation id="1951615167417147110">Превъртане една страница нагоре</translation>
 <translation id="1954813140452229842">Възникна грешка при свързването на дяла. Моля, проверете идентификационните си данни и опитайте отново.</translation>
@@ -1105,6 +1109,7 @@
 <translation id="2653659639078652383">Изпращане</translation>
 <translation id="265390580714150011">Стойност на полето</translation>
 <translation id="2654166010170466751">Разрешаване на сайтовете да инсталират приложения за обработване на плащания</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" /> Функциите варират според устройството</translation>
 <translation id="2660779039299703961">Събитие</translation>
 <translation id="266079277508604648">Не може да се установи връзка с принтера. Уверете се, че е включен и е свързан с вашия Chromebook чрез Wi-Fi или USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1211,6 +1216,7 @@
 <translation id="2803375539583399270">Въведете ПИН кодa</translation>
 <translation id="2805646850212350655">Шифроване на файлова система от Microsoft</translation>
 <translation id="2805756323405976993">Приложения</translation>
+<translation id="2806891468525657116">Прекият път вече съществува</translation>
 <translation id="2807517655263062534">Тук се показват изтеглените от вас файлове</translation>
 <translation id="2809586584051668049">и още <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Създаден е нов прозорец в съществуващата сесия на браузъра.</translation>
@@ -1597,6 +1603,7 @@
 <translation id="3428419049384081277">Влязохте в профила си!</translation>
 <translation id="3429275422858276529">Запазете отметка към тази страница, за да я намирате лесно по-късно</translation>
 <translation id="3429599832623003132">$1 елемента</translation>
+<translation id="3430342160185525240">Дава възможност на Асистент да ви показва известия.</translation>
 <translation id="3432227430032737297">Премахване на всички показани</translation>
 <translation id="3432757130254800023">Изпращане на аудио и видео до дисплеи в локалната мрежа</translation>
 <translation id="3432762828853624962">Споделени изпълнители</translation>
@@ -1963,6 +1970,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> в контролния панел.
 
 Искате ли да стартирате <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Прекият път не може да бъде създаден</translation>
 <translation id="3943582379552582368">&amp;Назад</translation>
 <translation id="3943857333388298514">Поставяне</translation>
 <translation id="3948116654032448504">&amp;Търсене на изображението чрез <ph name="SEARCH_ENGINE" /></translation>
@@ -2270,6 +2278,7 @@
 <translation id="4481530544597605423">Несдвоени устройства</translation>
 <translation id="4482194545587547824">Възможно е да използваме историята ви на сърфиране, за да персонализираме търсенето и други услуги на Google</translation>
 <translation id="4495419450179050807">Да не се показва на тази страница</translation>
+<translation id="4499718683476608392">Активирайте автоматичното попълване на кредитни карти, за да ги въвеждате във формуляри само с едно кликване</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> претърпя срив</translation>
 <translation id="450099669180426158">Икона на удивителен знак</translation>
 <translation id="4501530680793980440">Потвърждаване на премахването</translation>
@@ -2548,7 +2557,6 @@
 <translation id="4917385247580444890">Силен</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> иска да комуникира с разширението „<ph name="EXTENSION_NAME" />“</translation>
 <translation id="4918086044614829423">Приемам</translation>
-<translation id="4920350943031252905">Изпълнявайте инструменти, редактори и интегрирани среди за програмиране за Linux на своя Chromebook.</translation>
 <translation id="4920887663447894854">Следните сайтове бяха блокирани от проследяване на местоположението ви на тази страница:</translation>
 <translation id="492299503953721473">Премахване на приложенията за Android</translation>
 <translation id="4923279099980110923">Да, искам да помогна</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Резервни копия в облака на Chrome OS</translation>
 <translation id="5756163054456765343">П&amp;омощен център</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> може да чете документите, които изпращате за отпечатване чрез <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Настройки за кредитни карти</translation>
 <translation id="5763751966069581670">Няма намерени USB устройства</translation>
 <translation id="5764483294734785780">&amp;Запазване на аудиоклипа като...</translation>
 <translation id="57646104491463491">Дата на промяна</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Ами сега! Възникна грешка в модула за сигурност.</translation>
 <translation id="5856721540245522153">Активиране на функциите за отстраняване на грешки</translation>
 <translation id="5857090052475505287">Нова папка</translation>
+<translation id="585979798156957858">Външен клавиш Meta</translation>
 <translation id="5860033963881614850">Изключено</translation>
 <translation id="5860209693144823476">Раздел 3</translation>
 <translation id="5860491529813859533">Включване</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Автоматично откриване на уеб прокси сървъра</translation>
 <translation id="6333064448949140209">Файлът ще бъде изпратен до Google за отстраняване на грешки</translation>
 <translation id="6333834492048057036">Преместване на фокуса върху адресната лента за търсене</translation>
+<translation id="6336451774241870485">Нов раздел в режим на частно сърфиране</translation>
 <translation id="6339668969738228384">Създаване на нов потребителски профил за <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Не можа да се установи връзка със сървъра. Моля, проверете мрежовата си връзка и опитайте отново. Ако проблемът продължи, рестартирайте своя Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Раздел 8</translation>
 <translation id="6607272825297743757">Информация за файла</translation>
 <translation id="6607831829715835317">Още инструме&amp;нти</translation>
+<translation id="6610147964972079463">Частни раздели: Затваряне</translation>
 <translation id="6612358246767739896">Защитено съдържание</translation>
 <translation id="6613452264606394692">Връщайте се тук бързо, като запазите отметка към тази страница</translation>
 <translation id="6614893213975402384">Инсталиране на актуализации и приложения. С продължаването си приемате, че това устройство може също автоматично да изтегля и инсталира актуализации и приложения от Google, оператора ви и производителя си, при което е възможно да използва мобилни данни. В някои от тези приложения може да се предлагат покупки. В състояние сте да премахнете приложенията по всяко време. <ph name="BEGIN_LINK1" />Научете повече<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Предишна</translation>
 <translation id="6718273304615422081">Компресира се...</translation>
 <translation id="671928215901716392">Заключване на екрана</translation>
+<translation id="6720847671508630642">Автоматично споделяйте най-доброто от Android със своя Chromebook. Свържете телефона си, за да можете да изпращате SMS съобщения от компютъра си, да споделяте връзката на телефона с интернет и да отключвате екрана на своя Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Преглед на марката и модела на ключа ви за сигурност</translation>
 <translation id="6721972322305477112">&amp;Файл</translation>
 <translation id="672213144943476270">Моля, отключете потребителския си профил, преди да сърфирате като гост.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Отпечатване на конкретни страници</translation>
 <translation id="6972180789171089114">Аудио/видео</translation>
 <translation id="6973630695168034713">Папки</translation>
+<translation id="6974609594866392343">Офлайн демонстрационен режим</translation>
 <translation id="6976108581241006975">Конзола на JavaScript</translation>
 <translation id="6977381486153291903">Версия на фърмуера</translation>
 <translation id="6978121630131642226">Търсещи машини</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Това очакваният от вас нов раздел ли е?</translation>
 <translation id="786073089922909430">Услуга: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;За изтегляне</translation>
+<translation id="7864662577698025113">Добавяне на нова услуга</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 „бисквитка“}other{# „бисквитки“}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – сдвоено</translation>
 <translation id="7870730066603611552">Преглед на опциите за синхронизиране след настройването</translation>
@@ -5000,6 +5015,7 @@
 <translation id="8666584013686199826">Извеждане на запитване, когато сайт иска достъп до USB устройства</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> сега е на цял екран и курсорът на мишката ви е деактивиран.</translation>
 <translation id="8669284339312441707">По-топли цветове</translation>
+<translation id="8669919703154928649">Позволяване на Асистент да ви показва известия</translation>
 <translation id="8669949407341943408">Извършва се преместване...</translation>
 <translation id="8671210955687109937">Може да коментира</translation>
 <translation id="8673026256276578048">Търсене в мрежата...</translation>
@@ -5387,6 +5403,7 @@
 <translation id="964286338916298286">Системният ви администратор е деактивирал екстрите за Chrome за устройството ви.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Приложение}other{Приложения}}</translation>
 <translation id="967007123645306417">Така ще излезете от профилите си в Google. Промените във вашите отметки, история, пароли и други настройки повече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него. Можете да ги управлявате от <ph name="BEGIN_LINK" />Google Табло за управление<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Съхранени данни</translation>
 <translation id="968000525894980488">Включете услугите за Google Play.</translation>
 <translation id="968174221497644223">Кеш на приложение</translation>
 <translation id="969096075394517431">Промяна на езиците</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index e7042ffd6..2393cb9b 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -2546,7 +2546,6 @@
 <translation id="4917385247580444890">জোরালো</translation>
 <translation id="4918021164741308375">"<ph name="EXTENSION_NAME" />" এক্সটেনশন দ্বারা <ph name="ORIGIN" /> যোগাযোগ করতে চায়</translation>
 <translation id="4918086044614829423">স্বীকার</translation>
-<translation id="4920350943031252905">Chromebook-এ Linux টুল, এডিটর এবং IDE চালান।</translation>
 <translation id="4920887663447894854">এই পৃষ্ঠাতে আপনার লোকেশন নির্ধারণ করার জন্য নিম্নলিখিত সাইটগুলি অবরুদ্ধ করা হয়েছে:</translation>
 <translation id="492299503953721473">Android অ্যাপ্লিকেশানগুলি সরান</translation>
 <translation id="4923279099980110923">হ্যাঁ, আমি সাহায্য করতে চাই</translation>
@@ -4030,6 +4029,7 @@
 <translation id="7175353351958621980">এখান থেকে লোড হয়েছে:</translation>
 <translation id="7180611975245234373">রিফ্রেশ করুন</translation>
 <translation id="7180865173735832675">কাস্টমাইজ করুন</translation>
+<translation id="7182359331070524176">Google ফটো থেকে একটি অ্যালবাম বেছে নিন</translation>
 <translation id="7186088072322679094">টুলবারের মধ্যে রাখুন</translation>
 <translation id="7187428571767585875">যে রেজিস্ট্রি এন্ট্রি সরিয়ে দেওয়া হবে অথবা পরিবর্তন করা হবে:</translation>
 <translation id="7189234443051076392">আপনার ডিভাইসে পর্যাপ্ত জায়গা আছে কিনা দেখে নিন</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index 7c086a3b..e29648a 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Mostra l'ortografia i la gramàtica</translation>
 <translation id="1593594475886691512">S'està formatant...</translation>
 <translation id="159359590073980872">Memòria cau d'imatges</translation>
+<translation id="1593926297800505364">Desa la forma de pagament</translation>
 <translation id="1598233202702788831">El vostre administrador ha desactivat les actualitzacions.</translation>
 <translation id="1600857548979126453">Accedir al servidor de depuració de pàgina</translation>
 <translation id="1601560923496285236">Aplica</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">No es pot connectar el dispositiu al domini. Comprova que no hagis superat el nombre de dispositius que hi pots afegir.</translation>
 <translation id="1744108098763830590">pàgina en segon pla</translation>
 <translation id="1745520510852184940">Fes-ho sempre</translation>
+<translation id="1746417874336251387">Ofereix funcions noves que utilitzin la connexió del telèfon a Chromebook</translation>
 <translation id="174937106936716857">Total de fitxers</translation>
 <translation id="175196451752279553">T&amp;orna a obrir la pestanya tancada</translation>
 <translation id="1753905327828125965">Els més visitats</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">No abans</translation>
 <translation id="1933809209549026293">Connecteu un cursor o un teclat. Si feu servir un dispositiu Bluetooth, assegureu-vos que estigui preparat per a la sincronització.</translation>
 <translation id="1936157145127842922">Mostra a la carpeta</translation>
+<translation id="1938351510777341717">Ordre externa</translation>
 <translation id="1940546824932169984">Dispositius connectats</translation>
 <translation id="1942765061641586207">Resolució de la imatge</translation>
+<translation id="1943097386230153518">Instal·la un servei nou</translation>
 <translation id="1944921356641260203">S'ha trobat una actualització.</translation>
 <translation id="1951615167417147110">Es desplaça una pàgina cap amunt</translation>
 <translation id="1954813140452229842">S'ha produït un error en activar l'ús compartit. Comprova les credencials i torna-ho a provar.</translation>
@@ -1107,6 +1111,7 @@
 <translation id="2653659639078652383">Envia</translation>
 <translation id="265390580714150011">Valor del camp</translation>
 <translation id="2654166010170466751">Permet que els llocs web instal·lin gestors de pagament</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Les funcions varien segons el dispositiu</translation>
 <translation id="2660779039299703961">Esdeveniment</translation>
 <translation id="266079277508604648">No es pot contactar amb la impressora. Comprova que estigui encesa i connectada al teu Chromebook per Wi-Fi o USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1213,6 +1218,7 @@
 <translation id="2803375539583399270">Introdueix el PIN</translation>
 <translation id="2805646850212350655">Sistema de xifratge de fitxers de Microsoft</translation>
 <translation id="2805756323405976993">Aplicacions</translation>
+<translation id="2806891468525657116">Aquesta drecera ja existeix</translation>
 <translation id="2807517655263062534">Aquí es mostren els fitxers baixats</translation>
 <translation id="2809586584051668049">i <ph name="NUMBER_ADDITIONAL_DISABLED" /> més</translation>
 <translation id="281133045296806353">S'ha creat una finestra nova a la sessió del navegador existent.</translation>
@@ -1598,6 +1604,7 @@
 <translation id="3428419049384081277">Has iniciat la sessió</translation>
 <translation id="3429275422858276529">Afegeix aquesta pàgina a les adreces d'interès per trobar-la fàcilment més endavant</translation>
 <translation id="3429599832623003132">$1 elements</translation>
+<translation id="3430342160185525240">Permet que l'Assistent et mostri notificacions.</translation>
 <translation id="3432227430032737297">Suprimeix totes les que es mostren</translation>
 <translation id="3432757130254800023">Envia àudio i vídeo a les visualitzacions de la xarxa local</translation>
 <translation id="3432762828853624962">Treballadors compartits</translation>
@@ -1961,6 +1968,7 @@
 <translation id="3941565636838060942">Per amagar l'accés a aquest programa, heu de desinstal·lar-lo mitjançant <ph name="CONTROL_PANEL_APPLET_NAME" /> al tauler de control.
 
   Voleu iniciar <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">No es pot crear la drecera</translation>
 <translation id="3943582379552582368">&amp;Enrere</translation>
 <translation id="3943857333388298514">Enganxa</translation>
 <translation id="3948116654032448504">&amp;Cerca la imatge a <ph name="SEARCH_ENGINE" /></translation>
@@ -2268,6 +2276,7 @@
 <translation id="4481530544597605423">Dispositius desvinculats</translation>
 <translation id="4482194545587547824">És possible que Google utilitzi el vostre historial de navegació per personalitzar la Cerca i altres serveis de Google</translation>
 <translation id="4495419450179050807">No la mostris en aquesta pàgina</translation>
+<translation id="4499718683476608392">Permet que la funció Emplenament automàtic de targetes de crèdit empleni els formularis amb un sol clic</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ha fallat</translation>
 <translation id="450099669180426158">Icona de signe d'exclamació</translation>
 <translation id="4501530680793980440">Confirmació de la supressió</translation>
@@ -2547,7 +2556,6 @@
 <translation id="4917385247580444890">Forta</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> es vol comunicar amb l'extensió "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Accepta</translation>
-<translation id="4920350943031252905">Executa les eines, els editors i els IDE de Linux a Chromebook.</translation>
 <translation id="4920887663447894854">Els llocs següents han bloquejat el seguiment de la vostra ubicació en aquesta pàgina:</translation>
 <translation id="492299503953721473">Suprimeix les aplicacions per a Android</translation>
 <translation id="4923279099980110923">Sí, vull contribuir-hi</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Còpia de seguretat de Chrome OS Cloud</translation>
 <translation id="5756163054456765343">C&amp;entre d'ajuda</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> pot llegir els documents que envieu a la impressora mitjançant <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Configuració de la targeta de crèdit</translation>
 <translation id="5763751966069581670">No s'ha trobat cap dispositiu USB</translation>
 <translation id="5764483294734785780">De&amp;sa l'àudio com a...</translation>
 <translation id="57646104491463491">Data de modificació</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">S'ha produït un error en el mòdul de seguretat.</translation>
 <translation id="5856721540245522153">Activar les funcions de depuració</translation>
 <translation id="5857090052475505287">Carpeta nova</translation>
+<translation id="585979798156957858">Tecla meta externa</translation>
 <translation id="5860033963881614850">Desactivat</translation>
 <translation id="5860209693144823476">Pestanya 3</translation>
 <translation id="5860491529813859533">Activa</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Detecció automàtica de servidors intermediaris web</translation>
 <translation id="6333064448949140209">El fitxer s'enviarà a Google per depurar-lo</translation>
 <translation id="6333834492048057036">Mou el focus a la barra d'adreces per fer una cerca.</translation>
+<translation id="6336451774241870485">Pestanya privada nova</translation>
 <translation id="6339668969738228384">Crea un perfil nou per a <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">No s'ha pogut connectar amb el servidor. Comprova la connexió de xarxa i torna-ho a provar. Si el problema continua, reinicia Chromebook.</translation>
 <translation id="6340071272923955280">Protocol d'impressió per Internet (IPPS)</translation>
@@ -3675,6 +3686,7 @@
 <translation id="6606070663386660533">Pestanya 8</translation>
 <translation id="6607272825297743757">Informació del fitxer</translation>
 <translation id="6607831829715835317">Més eine&amp;s</translation>
+<translation id="6610147964972079463">Tanca les pestanyes privades</translation>
 <translation id="6612358246767739896">Contingut protegit</translation>
 <translation id="6613452264606394692">Afegeix aquesta pàgina a les adreces d'interès per poder-hi tornar ràpidament</translation>
 <translation id="6614893213975402384">Instal·la actualitzacions i aplicacions. En continuar, acceptes que aquest dispositiu també pugui baixar i instal·lar automàticament actualitzacions i aplicacions de Google, de l'operador de telefonia mòbil i del fabricant del dispositiu, i que és possible que ho faci utilitzant dades mòbils. Pot ser que algunes d'aquestes aplicacions ofereixin compres des de l'aplicació. Pots suprimir aquestes aplicacions en qualsevol moment. <ph name="BEGIN_LINK1" />Obtén més informació<ph name="END_LINK1" />.</translation>
@@ -3745,6 +3757,7 @@
 <translation id="6710213216561001401">Anterior</translation>
 <translation id="6718273304615422081">S'està comprimint...</translation>
 <translation id="671928215901716392">Bloqueja la pantalla</translation>
+<translation id="6720847671508630642">Comparteix automàticament el millor d'Android amb el teu dispositiu Chromebook. Connecta el telèfon perquè puguis enviar missatges de text des de l'ordinador, compartir la connexió a Internet del telèfon i desbloquejar la pantalla de Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Més informació<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Veure la marca i el model de la teva clau de seguretat</translation>
 <translation id="6721972322305477112">&amp;Fitxer</translation>
 <translation id="672213144943476270">Desbloquegeu el perfil per poder navegar com a convidat.</translation>
@@ -3891,6 +3904,7 @@
 <translation id="6970856801391541997">Imprimeix pàgines específiques</translation>
 <translation id="6972180789171089114">Àudio/Vídeo</translation>
 <translation id="6973630695168034713">Carpetes</translation>
+<translation id="6974609594866392343">Mode de demostració sense connexió</translation>
 <translation id="6976108581241006975">Consola JavaScript</translation>
 <translation id="6977381486153291903">Revisió de microprogramari</translation>
 <translation id="6978121630131642226">Motors de cerca</translation>
@@ -4483,6 +4497,7 @@
 <translation id="7857949311770343000">Aquesta és la pàgina de la pestanya nova que volíeu?</translation>
 <translation id="786073089922909430">Servei: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Baixades</translation>
+<translation id="7864662577698025113">Afegeix un servei nou</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 galeta}other{# galetes}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" />: vinculat</translation>
 <translation id="7870730066603611552">Mostra les opcions de sincronització en finalitzar la configuració</translation>
@@ -4997,6 +5012,7 @@
 <translation id="8666584013686199826">Pregunta'm quan un lloc web vulgui accedir a dispositius USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> es visualitza a pantalla completa i ha desactivat el cursor del ratolí.</translation>
 <translation id="8669284339312441707">Més càlid</translation>
+<translation id="8669919703154928649">Permet que l'Assistent et mostri notificacions</translation>
 <translation id="8669949407341943408">S'estan traslladant...</translation>
 <translation id="8671210955687109937">Pot comentar</translation>
 <translation id="8673026256276578048">Cerca al web...</translation>
@@ -5384,6 +5400,7 @@
 <translation id="964286338916298286">L'administrador de TI ha desactivat els productes extra de Chrome per al dispositiu.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicació}other{Aplicacions}}</translation>
 <translation id="967007123645306417">Es tancarà la sessió dels comptes de Google. Els canvis que es facin a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el Compte de Google. No obstant això, les dades existents continuaran emmagatzemades al teu Compte de Google i es podran gestionar des del <ph name="BEGIN_LINK" />Tauler de control de Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Dades emmagatzemades</translation>
 <translation id="968000525894980488">Activa els serveis de Google Play.</translation>
 <translation id="968174221497644223">Memòria cau de l'aplicació</translation>
 <translation id="969096075394517431">Canvia els idiomes</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 7d44f9f..effcd14 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -222,7 +222,7 @@
 <translation id="1316136264406804862">Vyhledávání...</translation>
 <translation id="1316495628809031177">Synchronizace je pozastavena</translation>
 <translation id="1319979322914001937">Aplikace, která zobrazuje filtrovaný seznam rozšíření v Internetovém obchodu Chrome. Rozšíření v seznamu lze nainstalovat přímo z této aplikace.</translation>
-<translation id="1322046419516468189">Uložená hesla můžete zobrazit a spravovat v: <ph name="SAVED_PASSWORDS_STORE" /></translation>
+<translation id="1322046419516468189">K zobrazení a správě uložených hesel můžete použít svůj <ph name="SAVED_PASSWORDS_STORE" /></translation>
 <translation id="1326317727527857210">Chcete-li získat přístup ke kartám ze svých ostatních zařízení, přihlaste se do Chromu.</translation>
 <translation id="1327074568633507428">Tiskárna ve službě Google Cloud Print</translation>
 <translation id="1327977588028644528">Brána</translation>
@@ -2555,7 +2555,6 @@
 <translation id="4917385247580444890">Silný</translation>
 <translation id="4918021164741308375">Web <ph name="ORIGIN" /> chce komunikovat s rozšířením <ph name="EXTENSION_NAME" /></translation>
 <translation id="4918086044614829423">Přijmout</translation>
-<translation id="4920350943031252905">Spouštějte na svém Chromebooku nástroje, editory a prostředí IDE pro Linux.</translation>
 <translation id="4920887663447894854">Těmto webům bylo na této stránce zakázáno sledování vaší polohy.</translation>
 <translation id="492299503953721473">Odstranit aplikace Android</translation>
 <translation id="4923279099980110923">Ano, chci pomoci</translation>
@@ -2802,7 +2801,7 @@
 <translation id="529175790091471945">Naformátovat toto zařízení</translation>
 <translation id="5292195676005197571">Většinu klíčů lze použít stisknutím tlačítka</translation>
 <translation id="5293170712604732402">Obnovit nastavení na původní výchozí hodnoty</translation>
-<translation id="5297082477358294722">Heslo bylo uloženo. Uložená hesla můžete zobrazit a spravovat v: <ph name="SAVED_PASSWORDS_STORE" />.</translation>
+<translation id="5297082477358294722">Heslo bylo uloženo. K zobrazení a správě uložených hesel můžete použít svůj <ph name="SAVED_PASSWORDS_STORE" />.</translation>
 <translation id="5298219193514155779">Autor motivu</translation>
 <translation id="5299109548848736476">Do Not Track</translation>
 <translation id="5299682071747318445">Všechny údaje jsou šifrovány pomocí vlastního hesla pro synchronizaci.</translation>
@@ -3502,6 +3501,7 @@
 <translation id="6327785803543103246">Automatické zjišťování webového proxy serveru</translation>
 <translation id="6333064448949140209">Soubor bude odeslán do Googlu k ladění</translation>
 <translation id="6333834492048057036">Přejít na adresní řádek za účelem vyhledávání</translation>
+<translation id="6336451774241870485">Nová soukromá karta</translation>
 <translation id="6339668969738228384">Vytvořit nový profil pro uživatele <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">K serveru se nelze se připojit. Zkontrolujte připojení k síti a zkuste to znovu. Pokud problém přetrvává, restartujte Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3683,6 +3683,7 @@
 <translation id="6606070663386660533">Karta 8</translation>
 <translation id="6607272825297743757">Informace o souboru</translation>
 <translation id="6607831829715835317">Další nástro&amp;je</translation>
+<translation id="6610147964972079463">Zavřít soukromé karty</translation>
 <translation id="6612358246767739896">Chráněný obsah</translation>
 <translation id="6613452264606394692">Přidejte si stránku do záložek, abyste sem mohli rychle přejít</translation>
 <translation id="6614893213975402384">Instalace aktualizací a aplikací. Pokračováním vyjadřujete souhlas s tím, že toto zařízení může také automaticky stahovat a instalovat aktualizace a aplikace od společnosti Google, operátora a výrobce zařízení, a v případě potřeby k tomu smí používat mobilní datové připojení. Některé z těchto aplikací mohou nabízet nákupy v aplikaci. Tyto aplikace můžete kdykoliv odstranit. <ph name="BEGIN_LINK1" />Další informace<ph name="END_LINK1" /></translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index b0d92e6..be54a71 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Vis stavning og grammatik</translation>
 <translation id="1593594475886691512">Formaterer...</translation>
 <translation id="159359590073980872">Billedcache</translation>
+<translation id="1593926297800505364">Gem betalingsmetode</translation>
 <translation id="1598233202702788831">Opdateringer er deaktiveret af din administrator.</translation>
 <translation id="1600857548979126453">Få adgang til administration af fejlfinding på siden</translation>
 <translation id="1601560923496285236">Anvend</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">Enheden kunne ikke knyttes til domænet. Sørg for, at du ikke har overskredet antallet af enheder, du kan tilføje.</translation>
 <translation id="1744108098763830590">baggrundsside</translation>
 <translation id="1745520510852184940">Gør altid dette</translation>
+<translation id="1746417874336251387">Tilbyder nye funktioner, der anvender din telefons forbindelse til din Chromebook</translation>
 <translation id="174937106936716857">Samlet antal filer</translation>
 <translation id="175196451752279553">G&amp;enåbn lukket fane</translation>
 <translation id="1753905327828125965">Mest besøgte</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">Ikke før</translation>
 <translation id="1933809209549026293">Tilslut en mus eller et tastatur. Hvis du bruger en Bluetooth-enhed, skal du kontrollere, at den er parat til parring.</translation>
 <translation id="1936157145127842922">Vis i mappe</translation>
+<translation id="1938351510777341717">Ekstern kommando</translation>
 <translation id="1940546824932169984">Tilsluttede enheder</translation>
 <translation id="1942765061641586207">Billedopløsning</translation>
+<translation id="1943097386230153518">Installer ny tjeneste</translation>
 <translation id="1944921356641260203">En opdatering er fundet</translation>
 <translation id="1951615167417147110">Rul en side op</translation>
 <translation id="1954813140452229842">Der opstod en fejl ved anvendelse af deling. Tjek dine loginoplysninger, og prøv igen.</translation>
@@ -1106,6 +1110,7 @@
 <translation id="2653659639078652383">Indsend</translation>
 <translation id="265390580714150011">Feltværdi</translation>
 <translation id="2654166010170466751">Tillad, at websites installerer betalingshandlere</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funktionerne varierer afhængigt af enheden</translation>
 <translation id="2660779039299703961">Hændelse</translation>
 <translation id="266079277508604648">Der kan ikke oprettes forbindelse til printeren. Tjek, at printeren er tændt og tilsluttet din Chromebook via Wi-Fi eller USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1212,6 +1217,7 @@
 <translation id="2803375539583399270">Angiv pinkode</translation>
 <translation id="2805646850212350655">Filsystem til Microsoft-kryptering</translation>
 <translation id="2805756323405976993">Apps</translation>
+<translation id="2806891468525657116">Genvejen findes allerede</translation>
 <translation id="2807517655263062534">Dine downloadede filer vises her</translation>
 <translation id="2809586584051668049">og <ph name="NUMBER_ADDITIONAL_DISABLED" /> mere</translation>
 <translation id="281133045296806353">Der blev oprettet et nyt vindue i den aktuelle browsersession.</translation>
@@ -1598,6 +1604,7 @@
 <translation id="3428419049384081277">Du er logget ind</translation>
 <translation id="3429275422858276529">Tilføj denne side som bogmærke, så du nemt kan finde den igen</translation>
 <translation id="3429599832623003132">$1 elementer</translation>
+<translation id="3430342160185525240">Giver Google Assistent tilladelse til at vise dig underretninger.</translation>
 <translation id="3432227430032737297">Fjern alle viste</translation>
 <translation id="3432757130254800023">Send lyd og video til visninger på det lokale netværk</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1962,6 +1969,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> i kontrolpanelet.
 
 Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Genvejen kan ikke oprettes</translation>
 <translation id="3943582379552582368">&amp;Tilbage</translation>
 <translation id="3943857333388298514">Indsæt</translation>
 <translation id="3948116654032448504">&amp;Søg efter billedet på <ph name="SEARCH_ENGINE" /></translation>
@@ -2269,6 +2277,7 @@
 <translation id="4481530544597605423">Ikke-parrede enheder</translation>
 <translation id="4482194545587547824">Google bruger muligvis din browserhistorik til at personliggøre Søgning og andre Google-tjenester</translation>
 <translation id="4495419450179050807">Vis ikke på denne side</translation>
+<translation id="4499718683476608392">Aktivér AutoFyld for kreditkort for at udfylde formularer med et enkelt klik</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> er gået ned</translation>
 <translation id="450099669180426158">Ikon for udråbstegn</translation>
 <translation id="4501530680793980440">Bekræft fjernelse</translation>
@@ -2547,7 +2556,6 @@
 <translation id="4917385247580444890">Stærk</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ønsker at kommunikere med udvidelsen "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Accepter</translation>
-<translation id="4920350943031252905">Kør Linux-værktøjer, -redigeringsværktøjer og -IDE'er på din Chromebook.</translation>
 <translation id="4920887663447894854">Følgende websites kan ikke spore din placering på denne side:</translation>
 <translation id="492299503953721473">Fjern Android-apps</translation>
 <translation id="4923279099980110923">Ja. Jeg vil gerne hjælpe</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Sikkerhedskopiering i skyen for Chrome OS</translation>
 <translation id="5756163054456765343">H&amp;jælp</translation>
 <translation id="5759728514498647443">De dokumenter, du sender til udskrift via <ph name="APP_NAME" />, kan læses af <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Indstillinger for kreditkort</translation>
 <translation id="5763751966069581670">Der blev ikke fundet nogen USB-enheder</translation>
 <translation id="5764483294734785780">&amp;Gem lyd som...</translation>
 <translation id="57646104491463491">Dato for ændring</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">Ups, der er en fejl i forbindelse med sikkerhedsmodulet.</translation>
 <translation id="5856721540245522153">Aktivér fejlfindingsfunktioner</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
+<translation id="585979798156957858">Ekstern metatast</translation>
 <translation id="5860033963881614850">Fra</translation>
 <translation id="5860209693144823476">Fane 3</translation>
 <translation id="5860491529813859533">Aktivér</translation>
@@ -3494,6 +3504,7 @@
 <translation id="6327785803543103246">Automatisk registrering af webproxy</translation>
 <translation id="6333064448949140209">Filen sendes til Google til fejlretning</translation>
 <translation id="6333834492048057036">Fokuser adresselinje i søgetilstand</translation>
+<translation id="6336451774241870485">Ny privat fane</translation>
 <translation id="6339668969738228384">Opret en ny profil for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Der kunne ikke oprettes forbindelse til serveren. Tjek din netværksforbindelse, og prøv igen. Genstart din Chromebook, hvis problemet fortsætter.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3675,6 +3686,7 @@
 <translation id="6606070663386660533">Fane 8</translation>
 <translation id="6607272825297743757">Filoplysninger</translation>
 <translation id="6607831829715835317">F&amp;lere værktøjer</translation>
+<translation id="6610147964972079463">Luk private faner</translation>
 <translation id="6612358246767739896">Beskyttet indhold</translation>
 <translation id="6613452264606394692">Tilføj denne side som bogmærke, så du hurtigt kan vende tilbage hertil</translation>
 <translation id="6614893213975402384">Installer opdateringer og apps. Hvis du fortsætter, accepterer du, at denne enhed også kan downloade og installere opdateringer og apps automatisk fra Google, dit mobilselskab og producenten af din enhed. Dette kan ske ved hjælp af mobildata. Nogle af disse apps tilbyder muligvis køb i appen. Du kan til enhver tid fjerne disse apps. <ph name="BEGIN_LINK1" />Få flere oplysninger<ph name="END_LINK1" /></translation>
@@ -3745,6 +3757,7 @@
 <translation id="6710213216561001401">Forrige</translation>
 <translation id="6718273304615422081">Komprimerer...</translation>
 <translation id="671928215901716392">Lås skærmen</translation>
+<translation id="6720847671508630642">Del automatisk det bedste fra Android med din Chromebook. Tilknyt din telefon, så du kan sende sms-beskeder fra din computer, dele din telefons internetforbindelse og låse skærmen op på din Chromebook.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Se din sikkerhedsnøgles fabrikat og model</translation>
 <translation id="6721972322305477112">&amp;Fil</translation>
 <translation id="672213144943476270">Lås din profil op, før du kan bruge internettet som gæst.</translation>
@@ -3891,6 +3904,7 @@
 <translation id="6970856801391541997">Udskriv bestemte sider</translation>
 <translation id="6972180789171089114">Lyd/video</translation>
 <translation id="6973630695168034713">Mapper</translation>
+<translation id="6974609594866392343">Offline demotilstand</translation>
 <translation id="6976108581241006975">JavaScript-konsol</translation>
 <translation id="6977381486153291903">Firmwarerevision</translation>
 <translation id="6978121630131642226">Søgemaskiner</translation>
@@ -4033,6 +4047,7 @@
 <translation id="7175353351958621980">Indlæst fra:</translation>
 <translation id="7180611975245234373">Opdater</translation>
 <translation id="7180865173735832675">Tilpas</translation>
+<translation id="7182359331070524176">Vælg et Google Fotos-album</translation>
 <translation id="7186088072322679094">Behold på værktøjslinjen</translation>
 <translation id="7187428571767585875">Registreringsposter, der skal fjernes eller ændres:</translation>
 <translation id="7189234443051076392">Sørg for, at der er nok ledig plads på din enhed</translation>
@@ -4042,7 +4057,7 @@
 <translation id="7196835305346730603">Søger efter Chromeboxes i nærheden...</translation>
 <translation id="7197160646667308890"><ph name="BEGIN_PARAGRAPH1" />Dette er generelle oplysninger om din enhed og om, hvordan du bruger den (f.eks. batteriniveau, appforbrug og netværksforbindelse). Dataene bruges til at forbedre Googles produkter og tjenester for alle. Visse samlede oplysninger hjælper også partnere som f.eks. Android-udviklere med at forbedre deres apps og produkter.<ph name="END_PARAGRAPH1" />
     <ph name="BEGIN_PARAGRAPH2" />Hvis du deaktiverer denne funktion, påvirker det ikke enhedens evne til at sende de oplysninger, der skal bruges til vigtige tjenester som f.eks. systemopdateringer og sikkerhed.<ph name="END_PARAGRAPH2" />
-    <ph name="BEGIN_PARAGRAPH3" />Du kan administrere denne funktion i Indstillinger &gt; Google. Vælg Forbrug og diagnostik i menuen.<ph name="END_PARAGRAPH3" /></translation>
+    <ph name="BEGIN_PARAGRAPH3" />Du kan administrere denne funktion i Indstillinger &gt; Google. Vælg Brug og diagnostik i menuen.<ph name="END_PARAGRAPH3" /></translation>
 <translation id="7199158086730159431">Få H&amp;jælp</translation>
 <translation id="7200083590239651963">Vælg konfiguration</translation>
 <translation id="7201014958346994077">Linux-filerne kan ikke ses</translation>
@@ -4483,6 +4498,7 @@
 <translation id="7857949311770343000">Er dette den forventede side Ny fane?</translation>
 <translation id="786073089922909430">Tjeneste: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
+<translation id="7864662577698025113">Tilføj ny tjeneste</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}one{# cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> er parret</translation>
 <translation id="7870730066603611552">Gennemgå indstillingerne for synkronisering efter konfigurationen</translation>
@@ -4997,6 +5013,7 @@
 <translation id="8666584013686199826">Spørg om tilladelse, når et website vil have adgang til USB-enheder</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> er nu i fuld skærm og har deaktiveret din musemarkør.</translation>
 <translation id="8669284339312441707">Varm</translation>
+<translation id="8669919703154928649">Tillad, at Google Assistent viser underretninger</translation>
 <translation id="8669949407341943408">Flytter…</translation>
 <translation id="8671210955687109937">Kan kommentere</translation>
 <translation id="8673026256276578048">Søg på nettet...</translation>
@@ -5385,6 +5402,7 @@
 <translation id="964286338916298286">Din it-administrator har deaktiveret Chrome Goodies for din enhed.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{App}one{App}other{Apps}}</translation>
 <translation id="967007123645306417">Du logges ud af dine Google-konti. Ændringer af bogmærker, historik, adgangskoder og andre indstillinger synkroniseres ikke længere med din Google-konto. Dine eksisterende data er dog stadig gemt på din Google-konto og kan administreres i <ph name="BEGIN_LINK" />Google Betjeningspanel<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Lagrede data</translation>
 <translation id="968000525894980488">Aktivér Google Play-tjenester.</translation>
 <translation id="968174221497644223">Applikationscache</translation>
 <translation id="969096075394517431">Skift sprog</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index e2a2e093..3771701e 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">Rechtschreibung und Grammatik einblenden</translation>
 <translation id="1593594475886691512">Formatierung wird ausgeführt...</translation>
 <translation id="159359590073980872">Bilder-Cache</translation>
+<translation id="1593926297800505364">Zahlungsmethode speichern</translation>
 <translation id="1598233202702788831">Updates sind durch Ihren Administrator deaktiviert.</translation>
 <translation id="1600857548979126453">Auf das Back-End für Seiten-Debugger zugreifen</translation>
 <translation id="1601560923496285236">Übernehmen</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">Das Gerät konnte der Domain nicht beitreten. Sie dürfen nicht mehr als die erlaubte Anzahl von Geräten hinzufügen.</translation>
 <translation id="1744108098763830590">Hintergrundseite</translation>
 <translation id="1745520510852184940">Immer so verfahren</translation>
+<translation id="1746417874336251387">Es können neue Funktionen angeboten werden, bei denen die Verbindung des Smartphones mit dem Chromebook genutzt wird</translation>
 <translation id="174937106936716857">Gesamtanzahl der Dateien</translation>
 <translation id="175196451752279553">Geschlossenen Tab wieder öffn&amp;en</translation>
 <translation id="1753905327828125965">Meistbesucht</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">Nicht vor</translation>
 <translation id="1933809209549026293">Verbinden Sie eine Maus oder Tastatur. Vergewissern Sie sich bei Verwendung eines Bluetooth-Geräts, ob es bereit zur Kopplung ist.</translation>
 <translation id="1936157145127842922">In Ordner anzeigen</translation>
+<translation id="1938351510777341717">Externer Befehl</translation>
 <translation id="1940546824932169984">Verbundene Geräte</translation>
 <translation id="1942765061641586207">Bildauflösung</translation>
+<translation id="1943097386230153518">Neuen Dienst installieren</translation>
 <translation id="1944921356641260203">Update gefunden</translation>
 <translation id="1951615167417147110">Eine Seite nach oben blättern</translation>
 <translation id="1954813140452229842">Fehler beim Bereitstellen der Freigabe. Überprüfen Sie Ihre Anmeldedaten und versuchen Sie es noch einmal.</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2653659639078652383">Senden</translation>
 <translation id="265390580714150011">Feldwert</translation>
 <translation id="2654166010170466751">Installation von Zahlungs-Handlern auf Websites zulassen</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" /> Die Funktionen variieren je nach Gerät</translation>
 <translation id="2660779039299703961">Ereignis</translation>
 <translation id="266079277508604648">Verbindung zum Drucker nicht möglich. Vergewissern Sie sich, dass der Drucker aktiviert und über WLAN oder USB mit Ihrem Chromebook verbunden ist.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1210,6 +1215,7 @@
 <translation id="2803375539583399270">PIN eingeben</translation>
 <translation id="2805646850212350655">Verschlüsselndes Microsoft-Dateisystem</translation>
 <translation id="2805756323405976993">Apps</translation>
+<translation id="2806891468525657116">Verknüpfung ist bereits vorhanden</translation>
 <translation id="2807517655263062534">Hier werden heruntergeladene Dateien angezeigt</translation>
 <translation id="2809586584051668049">und <ph name="NUMBER_ADDITIONAL_DISABLED" /> weitere</translation>
 <translation id="281133045296806353">Neues Fenster in aktueller Browsersitzung erstellt.</translation>
@@ -1596,6 +1602,7 @@
 <translation id="3428419049384081277">Sie sind angemeldet.</translation>
 <translation id="3429275422858276529">Seite als Lesezeichen speichern, um sie später schneller zu finden</translation>
 <translation id="3429599832623003132">$1 Elemente</translation>
+<translation id="3430342160185525240">Ermöglicht Assistant, Ihnen Benachrichtigungen zu zeigen.</translation>
 <translation id="3432227430032737297">Alle angezeigten Cookies entfernen</translation>
 <translation id="3432757130254800023">Audio und Video auf Bildschirme im lokalen Netzwerk senden</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1960,6 +1967,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> im Steuerfeld deinstalliert wird.
 
 Möchten Sie <ph name="CONTROL_PANEL_APPLET_NAME" /> starten?</translation>
+<translation id="394183848452296464">Verknüpfung kann nicht erstellt werden</translation>
 <translation id="3943582379552582368">&amp;Zurück</translation>
 <translation id="3943857333388298514">Einfügen</translation>
 <translation id="3948116654032448504">Mit <ph name="SEARCH_ENGINE" /> nach Bild &amp;suchen</translation>
@@ -2267,6 +2275,7 @@
 <translation id="4481530544597605423">Entkoppelte Geräte</translation>
 <translation id="4482194545587547824">Google kann die Suche und andere Google-Dienste anhand Ihres Browserverlaufs für Sie personalisieren.</translation>
 <translation id="4495419450179050807">Nicht auf dieser Seite anzeigen</translation>
+<translation id="4499718683476608392">AutoFill für Kreditkarten aktivieren, um Formulare mit nur einem Klick auszufüllen</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ist abgestürzt</translation>
 <translation id="450099669180426158">Ausrufezeichensymbol</translation>
 <translation id="4501530680793980440">Entfernen bestätigen</translation>
@@ -2545,7 +2554,6 @@
 <translation id="4917385247580444890">Stark</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> möchte mit der Erweiterung "<ph name="EXTENSION_NAME" />" kommunizieren.</translation>
 <translation id="4918086044614829423">Annehmen</translation>
-<translation id="4920350943031252905">Führen Sie Linux-Tools, -Editoren und -IDEs auf Ihrem Chromebook aus.</translation>
 <translation id="4920887663447894854">Die folgenden Websites dürfen Ihren Standort auf dieser Seite nicht verfolgen:</translation>
 <translation id="492299503953721473">Android-Apps entfernen</translation>
 <translation id="4923279099980110923">Ja, ich möchte helfen.</translation>
@@ -3111,6 +3119,7 @@
 <translation id="5752453871435543420">Chrome OS-Cloud-Sicherung</translation>
 <translation id="5756163054456765343">H&amp;ilfe</translation>
 <translation id="5759728514498647443">Dokumente, die Sie über <ph name="APP_NAME" /> zum Druck senden, können von <ph name="APP_NAME" /> gelesen werden.</translation>
+<translation id="5762172915276660232">Einstellungen für Kreditkarten</translation>
 <translation id="5763751966069581670">Keine USB-Geräte gefunden</translation>
 <translation id="5764483294734785780">Audio &amp;speichern unter...</translation>
 <translation id="57646104491463491">Änderungsdatum</translation>
@@ -3182,6 +3191,7 @@
 <translation id="5855773610748894548">Hoppla! Fehler mit dem Sicherheitsmodul.</translation>
 <translation id="5856721540245522153">Debugging-Funktionen aktivieren</translation>
 <translation id="5857090052475505287">Neuer Ordner</translation>
+<translation id="585979798156957858">Externe Metataste</translation>
 <translation id="5860033963881614850">Aus</translation>
 <translation id="5860209693144823476">Tab 3</translation>
 <translation id="5860491529813859533">Aktivieren</translation>
@@ -3491,6 +3501,7 @@
 <translation id="6327785803543103246">Web-Proxy Autodiscovery</translation>
 <translation id="6333064448949140209">Datei wird zur Fehlerbehebung an Google gesendet</translation>
 <translation id="6333834492048057036">Adressleiste für die Suche fokussieren</translation>
+<translation id="6336451774241870485">Neuer privater Tab</translation>
 <translation id="6339668969738228384">Neues Profil für <ph name="USER_EMAIL_ADDRESS" /> erstellen</translation>
 <translation id="6340017061976355871">Keine Verbindung mit dem Server möglich. Bitte überprüfen Sie Ihre Netzwerkverbindung und versuchen Sie es noch einmal. Sollte das Problem weiterhin bestehen, starten Sie Ihr Chromebook neu.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3672,6 +3683,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">Dateiinformationen</translation>
 <translation id="6607831829715835317">Weitere Too&amp;ls</translation>
+<translation id="6610147964972079463">Private Tabs schließen</translation>
 <translation id="6612358246767739896">Geschützte Inhalte</translation>
 <translation id="6613452264606394692">Speichern Sie diese Seite als Lesezeichen, um schnell wieder hierher zurückzukehren</translation>
 <translation id="6614893213975402384">Updates und Apps installieren. Wenn Sie fortfahren, stimmen Sie zu, dass dieses Gerät automatisch Updates und Apps von Google, Ihrem Mobilfunkanbieter und dem Hersteller Ihres Geräts herunterladen und installieren darf, möglicherweise über eine mobile Datenverbindung. Einige dieser Apps bieten eventuell In-App-Käufe an. Diese Apps können Sie jederzeit entfernen. <ph name="BEGIN_LINK1" />Weitere Informationen<ph name="END_LINK1" /></translation>
@@ -3742,6 +3754,7 @@
 <translation id="6710213216561001401">Zurück</translation>
 <translation id="6718273304615422081">Wird gezippt...</translation>
 <translation id="671928215901716392">Bildschirm sperren</translation>
+<translation id="6720847671508630642">Die Vorteile von Android automatisch auf Ihrem Chromebook genießen. Wenn Sie Ihr Smartphone verbinden, können Sie damit Textnachrichten von Ihrem Computer senden, seine Internetverbindung teilen und den Chromebook-Bildschirm entsperren.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Den Hersteller und das Modell Ihres Sicherheitsschlüssels anzeigen</translation>
 <translation id="6721972322305477112">&amp;Ablage</translation>
 <translation id="672213144943476270">Bitte entsperren Sie Ihr Profil, bevor Sie als Gast surfen.</translation>
@@ -3888,6 +3901,7 @@
 <translation id="6970856801391541997">Bestimmte Seiten drucken</translation>
 <translation id="6972180789171089114">Audio/Video</translation>
 <translation id="6973630695168034713">Ordner</translation>
+<translation id="6974609594866392343">Offline-Demomodus</translation>
 <translation id="6976108581241006975">JavaScript-Konsole</translation>
 <translation id="6977381486153291903">Firmware-Version</translation>
 <translation id="6978121630131642226">Suchmaschinen</translation>
@@ -4030,6 +4044,7 @@
 <translation id="7175353351958621980">Geladen von:</translation>
 <translation id="7180611975245234373">Aktualisieren</translation>
 <translation id="7180865173735832675">Anpassen</translation>
+<translation id="7182359331070524176">Google Fotos-Album auswählen</translation>
 <translation id="7186088072322679094">In Symbolleiste behalten</translation>
 <translation id="7187428571767585875">Registrierungseinträge, die entfernt oder geändert werden:</translation>
 <translation id="7189234443051076392">Achten Sie darauf, dass auf Ihrem Gerät ausreichend Speicherplatz vorhanden ist</translation>
@@ -4201,7 +4216,7 @@
 <translation id="7463006580194749499">Person hinzufügen</translation>
 <translation id="7464490149090366184">Fehler beim Zippen, Element bereits vorhanden: "$1"</translation>
 <translation id="7465778193084373987">URL zum Zurückrufen von Netscape-Zertifikaten</translation>
-<translation id="7469406957790636836">Wenn Sie diese Funktion aktivieren möchten, müssen Sie zuerst die Rechtschreibprüfung unter <ph name="BEGIN_LINK" />Sprachen und Eingabe<ph name="END_LINK" /> einschalten</translation>
+<translation id="7469406957790636836">Wenn Sie diese Funktion aktivieren möchten, müssen Sie zuerst die Rechtschreibprüfung unter <ph name="BEGIN_LINK" />Sprache und Eingabe<ph name="END_LINK" /> einschalten</translation>
 <translation id="7469894403370665791">Verbindung zu diesem Netzwerk automatisch herstellen</translation>
 <translation id="747114903913869239">Fehler: Erweiterung kann nicht entschlüsselt werden.</translation>
 <translation id="7473753388963818366"><ph name="DEVICE_TYPE" /> einrichten</translation>
@@ -4481,6 +4496,7 @@
 <translation id="7857949311770343000">Ist das die "Neuer Tab"-Seite, die Sie erwartet hatten?</translation>
 <translation id="786073089922909430">Dienst: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
+<translation id="7864662577698025113">Neuen Dienst hinzufügen</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 Cookie}other{# Cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – gekoppelt</translation>
 <translation id="7870730066603611552">Synchronisierungsoptionen nach der Einrichtung überprüfen</translation>
@@ -4996,6 +5012,7 @@
 <translation id="8666584013686199826">Nachfragen, wenn eine Website auf USB-Geräte zugreifen möchte</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> wird nun im Vollbildmodus angezeigt und hat Ihren Mauszeiger deaktiviert.</translation>
 <translation id="8669284339312441707">Wärmer</translation>
+<translation id="8669919703154928649">Assistant Benachrichtigungen anzeigen lassen</translation>
 <translation id="8669949407341943408">Verschieben...</translation>
 <translation id="8671210955687109937">Darf kommentieren</translation>
 <translation id="8673026256276578048">Suche im Web...</translation>
@@ -5384,6 +5401,7 @@
 <translation id="964286338916298286">Ihr IT-Administrator hat Chrome-Extras für Ihr Gerät deaktiviert.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Anwendung}other{Anwendungen}}</translation>
 <translation id="967007123645306417">Hierdurch werden Sie von allen Ihren Google-Konten abgemeldet. Änderungen an Ihrem Verlauf sowie an Ihren Lesezeichen, Passwörtern und sonstigen Einstellungen werden nicht mehr mit Ihrem Google-Konto synchronisiert. Bereits in Ihrem Google-Konto gespeicherte Daten bleiben dort erhalten und können über das <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" /> verwaltet werden.</translation>
+<translation id="967624055006145463">Gespeicherte Daten</translation>
 <translation id="968000525894980488">Aktivieren Sie die Google Play-Dienste.</translation>
 <translation id="968174221497644223">Cache</translation>
 <translation id="969096075394517431">Sprachen ändern</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index 5745243..f122608 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Εμφάνιση Ορθογραφικού και Γραμματικού Ελέγχου</translation>
 <translation id="1593594475886691512">Μορφοποίηση…</translation>
 <translation id="159359590073980872">Προσωρινή μνήμη εικόνας</translation>
+<translation id="1593926297800505364">Αποθήκευση τρόπου πληρωμής</translation>
 <translation id="1598233202702788831">Οι ενημερώσεις έχουν απενεργοποιηθεί από τον διαχειριστή σας.</translation>
 <translation id="1600857548979126453">Πρόσβαση στο σύστημα υποστήριξης εντοπισμού σφαλμάτων σελίδων</translation>
 <translation id="1601560923496285236">Εφαρμογή</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Δεν είναι δυνατή η σύνδεση της συσκευής στον τομέα. Βεβαιωθείτε ότι δεν έχετε υπερβεί τον αριθμό των συσκευών που μπορείτε να προσθέσετε.</translation>
 <translation id="1744108098763830590">σελίδα παρασκηνίου</translation>
 <translation id="1745520510852184940">Να γίνεται πάντα</translation>
+<translation id="1746417874336251387">Προσφέρετε νέες λειτουργίες που χρησιμοποιούν τη σύνδεση του τηλεφώνου σας με το Chromebook</translation>
 <translation id="174937106936716857">Συνολικός αριθμός αρχείων</translation>
 <translation id="175196451752279553">Ε&amp;παναφορά καρτέλας που έχει κλείσει</translation>
 <translation id="1753905327828125965">Πιο Δημοφιλή</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Όχι πριν από</translation>
 <translation id="1933809209549026293">Συνδέστε ένα ποντίκι ή ένα πληκτρολόγιο. Εάν χρησιμοποιείτε συσκευή Bluetooth, βεβαιωθείτε ότι είναι έτοιμη για σύζευξη.</translation>
 <translation id="1936157145127842922">Εμφάνιση στο φάκελο</translation>
+<translation id="1938351510777341717">Εξωτερικό πλήκτρο Command</translation>
 <translation id="1940546824932169984">Συνδεδεμένες συσκευές</translation>
 <translation id="1942765061641586207">Ανάλυση εικόνας</translation>
+<translation id="1943097386230153518">Εγκατάσταση νέας υπηρεσίας</translation>
 <translation id="1944921356641260203">Βρέθηκε ενημέρωση</translation>
 <translation id="1951615167417147110">Κύλιση προς τα επάνω κατά μία σελίδα</translation>
 <translation id="1954813140452229842">Σφάλμα κατά την προσάρτηση του συστήματος κοινοποίησης. Ελέγξτε τα διαπιστευτήριά σας και προσπαθήστε ξανά.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Υποβολή</translation>
 <translation id="265390580714150011">Τιμή πεδίου</translation>
 <translation id="2654166010170466751">Να επιτρέπεται σε ιστοτόπους η εγκατάσταση δεικτών χειρισμού για πληρωμές</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Οι λειτουργίες διαφέρουν ανά συσκευή</translation>
 <translation id="2660779039299703961">Συμβάν</translation>
 <translation id="266079277508604648">Δεν είναι δυνατή η σύνδεση του εκτυπωτή. Βεβαιωθείτε ότι ο εκτυπωτής είναι ενεργοποιημένος και ότι είναι συνδεδεμένος στο Chromebook μέσω Wi-Fi ή USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Εισαγωγή PIN</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">Εφαρμογές </translation>
+<translation id="2806891468525657116">Η συντόμευση υπάρχει ήδη</translation>
 <translation id="2807517655263062534">Τα αρχεία που κατεβάζετε εμφανίζονται εδώ</translation>
 <translation id="2809586584051668049">και ακόμη <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Δημιουργήθηκε νέο παράθυρο σε υπάρχουσα περίοδο σύνδεσης του προγράμματος περιήγησης.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Είστε συνδεδεμένοι!</translation>
 <translation id="3429275422858276529">Προσθέστε σελιδοδείκτη σε αυτήν τη σελίδα, για να την εντοπίσετε εύκολα αργότερα</translation>
 <translation id="3429599832623003132">$1 στοιχεία</translation>
+<translation id="3430342160185525240">Επιτρέπει στον Βοηθό να εμφανίζει ειδοποιήσεις.</translation>
 <translation id="3432227430032737297">Κατάργηση όλων όσων εμφανίζονται</translation>
 <translation id="3432757130254800023">Αποστολή ήχου και βίντεο σε οθόνες στο τοπικό δίκτυο</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> στον Πίνακα ελέγχου.
 
    Θέλετε να γίνει εκκίνηση του <ph name="CONTROL_PANEL_APPLET_NAME" />;</translation>
+<translation id="394183848452296464">Δεν είναι δυνατή η δημιουργία συντόμευσης</translation>
 <translation id="3943582379552582368">&amp;Πίσω</translation>
 <translation id="3943857333388298514">Επικόλληση</translation>
 <translation id="3948116654032448504">&amp;Αναζήτηση <ph name="SEARCH_ENGINE" /> για εικόνα</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Συσκευές στις οποίες διακόπηκε η σύζευξη</translation>
 <translation id="4482194545587547824">Η Google μπορεί να χρησιμοποιεί το ιστορικό περιήγησής σας για να εξατομικεύει την Αναζήτηση και άλλες υπηρεσίες Google</translation>
 <translation id="4495419450179050807">Να μην γίνεται εμφάνιση σε αυτήν τη σελίδα</translation>
+<translation id="4499718683476608392">Ενεργοποίηση Αυτόματης συμπλήρωσης στοιχείων πιστωτικής κάρτας για τη συμπλήρωση φορμών με ένα μόνο κλικ</translation>
 <translation id="4500114933761911433">Η προσθήκη <ph name="PLUGIN_NAME" /> παρουσίασε σφάλμα</translation>
 <translation id="450099669180426158">Εικονίδιο θαυμαστικού</translation>
 <translation id="4501530680793980440">Επιβεβαίωση κατάργησης</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Ισχυρό</translation>
 <translation id="4918021164741308375">Το <ph name="ORIGIN" /> θέλει να επικοινωνήσει με την επέκταση "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Αποδοχή</translation>
-<translation id="4920350943031252905">Εκτέλεση εργαλείων Linux, προγραμμάτων επεξεργασίας και IDE στο Chromebook σας.</translation>
 <translation id="4920887663447894854">Οι ακόλουθοι ιστότοποι έχουν αποκλειστεί από την παρακολούθηση της τοποθεσίας σας σε αυτήν τη σελίδα.</translation>
 <translation id="492299503953721473">Κατάργηση εφαρμογών Android</translation>
 <translation id="4923279099980110923">Ναι, θέλω να βοηθήσω</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Αντίγραφο ασφαλείας στο cloud για το Chrome OS</translation>
 <translation id="5756163054456765343">Κέντρο βοήθειας</translation>
 <translation id="5759728514498647443">Είναι δυνατή η ανάγνωση των εγγράφων που στέλνετε για εκτύπωση μέσω <ph name="APP_NAME" /> με την εφαρμογή <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Ρυθμίσεις πιστωτικής κάρτας</translation>
 <translation id="5763751966069581670">Δεν βρέθηκαν συσκευές USB</translation>
 <translation id="5764483294734785780">Αποθή&amp;κευση ήχου ως...</translation>
 <translation id="57646104491463491">Ημερομηνία τροποποίησης</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Δυστυχώς, παρουσιάστηκε σφάλμα στην ασφαλή λειτουργική μονάδα.</translation>
 <translation id="5856721540245522153">Ενεργοποίηση λειτουργιών εντοπισμού σφαλμάτων</translation>
 <translation id="5857090052475505287">Νέος φάκελος</translation>
+<translation id="585979798156957858">Εξωτερικά μεταδεδομένα</translation>
 <translation id="5860033963881614850">Απενεργοποιημένη</translation>
 <translation id="5860209693144823476">Καρτέλα 3</translation>
 <translation id="5860491529813859533">Ενεργοποίηση</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Αυτόματη ανακάλυψη διακομιστή μεσολάβησης ιστού</translation>
 <translation id="6333064448949140209">Το αρχείο θα σταλεί στην Google για εντοπισμό σφαλμάτων</translation>
 <translation id="6333834492048057036">Γραμμή διευθύνσεων εστίασης για αναζήτηση</translation>
+<translation id="6336451774241870485">Νέα καρτέλα ιδιωτικής περιήγησης</translation>
 <translation id="6339668969738228384">Δημιουργία νέου προφίλ για τη διεύθυνση <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Δεν ήταν δυνατή η σύνδεση με τον διακομιστή. Ελέγξτε τη σύνδεση δικτύου και δοκιμάστε ξανά. Εάν το πρόβλημα παραμένει, επανεκκινήστε το Chromebook.</translation>
 <translation id="6340071272923955280">Πρωτόκολλο εκτύπωσης στο διαδίκτυο (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">Καρτέλα 8</translation>
 <translation id="6607272825297743757">Πληροφορίες αρχείου</translation>
 <translation id="6607831829715835317">Περισσότερα εργαλεία</translation>
+<translation id="6610147964972079463">Κλείσιμο ιδιωτικών καρτελών</translation>
 <translation id="6612358246767739896">Προστατευμένο περιεχόμενο</translation>
 <translation id="6613452264606394692">Προσθέστε σελιδοδείκτη σε αυτήν τη σελίδα για να επιστρέψετε εδώ γρήγορα</translation>
 <translation id="6614893213975402384">Εγκατάσταση ενημερώσεων και εφαρμογών. Εάν συνεχίσετε, αποδέχεστε ότι η συσκευή ενδέχεται επίσης να κατεβάζει και να εγκαθιστά αυτόματα ενημερώσεις και εφαρμογές από την Google, την εταιρεία κινητής τηλεφωνίας και τον κατασκευαστή της συσκευής, πιθανόν με τη χρήση δεδομένων κινητής τηλεφωνίας. Ορισμένες από αυτές τις εφαρμογές μπορεί να προσφέρουν αγορές εντός εφαρμογής. Μπορείτε να καταργήσετε αυτές τις εφαρμογές ανά πάσα στιγμή. <ph name="BEGIN_LINK1" />Μάθετε περισσότερα<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">Προηγούμενο</translation>
 <translation id="6718273304615422081">Συμπίεση…</translation>
 <translation id="671928215901716392">Κλείδωμα οθόνης</translation>
+<translation id="6720847671508630642">Μοιραστείτε αυτόματα τις καλύτερες λειτουργίες του Android με το Chromebook. Συνδέστε το τηλέφωνό σας, για να μπορείτε να στέλνετε μηνύματα κειμένου από τον υπολογιστή σας, να μοιράζεστε τη σύνδεση του τηλεφώνου σας στο διαδίκτυο και να ξεκλειδώνετε την οθόνη του Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Προβολή της κατασκευής και του μοντέλου του Κλειδιού ασφαλείας</translation>
 <translation id="6721972322305477112">&amp;Αρχείο</translation>
 <translation id="672213144943476270">Ξεκλειδώστε το προφίλ σας προτού ξεκινήσετε την περιήγηση ως επισκέπτης.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">Εκτύπωση συγκεκριμένων σελίδων</translation>
 <translation id="6972180789171089114">Ήχος/Βίντεο</translation>
 <translation id="6973630695168034713">Φάκελοι</translation>
+<translation id="6974609594866392343">Λειτουργία επίδειξης εκτός σύνδεσης</translation>
 <translation id="6976108581241006975">Κονσόλα JavaScript</translation>
 <translation id="6977381486153291903">Έκδοση υλικολογισμικού</translation>
 <translation id="6978121630131642226">Μηχανές αναζήτησης</translation>
@@ -4487,6 +4501,7 @@
 <translation id="7857949311770343000">Είναι αυτή η σελίδα νέας καρτέλας που περιμένατε να δείτε;</translation>
 <translation id="786073089922909430">Υπηρεσία: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Λήψεις</translation>
+<translation id="7864662577698025113">Προσθήκη νέας υπηρεσίας</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookie}}</translation>
 <translation id="786957569166715433">Έγινε σύζευξη της συσκευής <ph name="DEVICE_NAME" /></translation>
 <translation id="7870730066603611552">Έλεγχος επιλογών συγχρονισμού μετά τη ρύθμιση</translation>
@@ -5001,6 +5016,7 @@
 <translation id="8666584013686199826">Να γίνεται ερώτηση όταν κάποιος ιστότοπος θέλει να αποκτήσει πρόσβαση σε συσκευές USB</translation>
 <translation id="8667328578593601900">Το <ph name="FULLSCREEN_ORIGIN" /> είναι τώρα πλήρης οθόνη και έχει απενεργοποιήσει τον δείκτη του ποντικιού σας.</translation>
 <translation id="8669284339312441707">Θερμότερο</translation>
+<translation id="8669919703154928649">Επιτρέψτε στον Βοηθό να εμφανίζει ειδοποιήσεις</translation>
 <translation id="8669949407341943408">Μετακίνηση…</translation>
 <translation id="8671210955687109937">Δυνατότητα σχολιασμού</translation>
 <translation id="8673026256276578048">Αναζήτηση στον Ιστό...</translation>
@@ -5386,6 +5402,7 @@
 <translation id="964286338916298286">Ο διαχειριστής τεχνολογιών πληροφορικής της συσκευής σας απενεργοποίησε τα Καλούδια Chrome για τη συσκευή σας.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Εφαρμογή}other{Εφαρμογές}}</translation>
 <translation id="967007123645306417">Με αυτήν την ενέργεια, θα αποσυνδεθείτε από όλους τους Λογαριασμούς σας Google. Οι αλλαγές στους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και σε άλλες ρυθμίσεις δεν θα συγχρονίζονται πλέον με το Λογαριασμό σας Google. Ωστόσο, τα υπάρχοντα δεδομένα σας θα παραμείνουν αποθηκευμένα στον Λογαριασμό σας Google και η διαχείρισή τους μπορεί να πραγματοποιείται στον <ph name="BEGIN_LINK" />Πίνακα ελέγχου Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Αποθηκευμένα δεδομένα</translation>
 <translation id="968000525894980488">Ενεργοποίηση των Υπηρεσιών Google Play.</translation>
 <translation id="968174221497644223">Προσωρινή μνήμη εφαρμογής</translation>
 <translation id="969096075394517431">Αλλαγή γλωσσών</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 4aeea52..9a587f793 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2557,7 +2557,6 @@
 <translation id="4917385247580444890">Strong</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> wants to communicate with the extension "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Accept</translation>
-<translation id="4920350943031252905">Run Linux tools, editors and IDEs on your Chromebook.</translation>
 <translation id="4920887663447894854">The following sites have been blocked from tracking your location on this page:</translation>
 <translation id="492299503953721473">Remove Android apps</translation>
 <translation id="4923279099980110923">Yes, I want to help</translation>
@@ -3505,6 +3504,7 @@
 <translation id="6327785803543103246">Web proxy auto-discovery</translation>
 <translation id="6333064448949140209">File will be sent to Google for debugging</translation>
 <translation id="6333834492048057036">Focus address bar for search</translation>
+<translation id="6336451774241870485">New private tab</translation>
 <translation id="6339668969738228384">Create a new profile for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Couldn’t connect with the server. Please check your network connection and try again. If the problem persists, restart your Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3686,6 +3686,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">File info</translation>
 <translation id="6607831829715835317">More too&amp;ls</translation>
+<translation id="6610147964972079463">Close private tabs</translation>
 <translation id="6612358246767739896">Protected content</translation>
 <translation id="6613452264606394692">Get back here fast by bookmarking this page</translation>
 <translation id="6614893213975402384">Install updates &amp; apps. By continuing, you agree that this device may also automatically download and install updates and apps from Google, your operator and your device's manufacturer, possibly using mobile data. Some of these apps may offer in-app purchases. You can remove these apps at any time. <ph name="BEGIN_LINK1" />Learn More<ph name="END_LINK1" /></translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 6b0339cd..81b6be6 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2546,7 +2546,6 @@
 <translation id="4917385247580444890">Fuerte</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> quiere comunicarse con la extensión "<ph name="EXTENSION_NAME" />".</translation>
 <translation id="4918086044614829423">Aceptar</translation>
-<translation id="4920350943031252905">Ejecuta las herramientas, los editores y los IDE de Linux en tu Chromebook.</translation>
 <translation id="4920887663447894854">Se bloquearon los siguientes sitios para que no puedan rastrear tu ubicación en esta página:</translation>
 <translation id="492299503953721473">Quitar las apps de Android</translation>
 <translation id="4923279099980110923">Sí, quiero ayudar</translation>
@@ -4031,6 +4030,7 @@
 <translation id="7175353351958621980">Cargados desde:</translation>
 <translation id="7180611975245234373">Actualizar</translation>
 <translation id="7180865173735832675">Personalizar</translation>
+<translation id="7182359331070524176">Seleccionar un álbum de Google Fotos</translation>
 <translation id="7186088072322679094">Mantener en la barra de herramientas</translation>
 <translation id="7187428571767585875">Entradas de registro que se quitarán o cambiarán:</translation>
 <translation id="7189234443051076392">Asegúrate de que haya espacio suficiente en tu dispositivo</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index f263ce3..61b2f82 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Mostrar ortografía y gramática</translation>
 <translation id="1593594475886691512">Formateando...</translation>
 <translation id="159359590073980872">Caché de imagen</translation>
+<translation id="1593926297800505364">Guardar el método de pago</translation>
 <translation id="1598233202702788831">El administrador ha inhabilitado las actualizaciones.</translation>
 <translation id="1600857548979126453">Acceder al servidor de depuración de página</translation>
 <translation id="1601560923496285236">Aplicar</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">No se puede vincular el dispositivo con el dominio. Comprueba que no hayas superado el número de dispositivos que puedes añadir.</translation>
 <translation id="1744108098763830590">página en segundo plano</translation>
 <translation id="1745520510852184940">Hacer esto siempre</translation>
+<translation id="1746417874336251387">Ofrece más funciones que usan la conexión de tu teléfono con tu Chromebook</translation>
 <translation id="174937106936716857">Número total de archivos</translation>
 <translation id="175196451752279553">Volv&amp;er a abrir pestaña cerrada</translation>
 <translation id="1753905327828125965">Más visitado</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Posterior a</translation>
 <translation id="1933809209549026293">Conecta un ratón o un teclado. Si utilizas un dispositivo Bluetooth, asegúrate de que esté listo para la vinculación.</translation>
 <translation id="1936157145127842922">Mostrar en carpeta</translation>
+<translation id="1938351510777341717">Tecla Comando externa</translation>
 <translation id="1940546824932169984">Dispositivos conectados</translation>
 <translation id="1942765061641586207">Resolución de imagen</translation>
+<translation id="1943097386230153518">Instala más servicios</translation>
 <translation id="1944921356641260203">Actualización encontrada</translation>
 <translation id="1951615167417147110">Desplazarse hacia arriba en una página</translation>
 <translation id="1954813140452229842">No se ha podido activar el recurso compartido. Comprueba tus credenciales y vuelve a intentarlo.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Enviar</translation>
 <translation id="265390580714150011">Valor de campo</translation>
 <translation id="2654166010170466751">Permitir a los sitios web instalar controladores de pago</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Las funciones varían según el dispositivo</translation>
 <translation id="2660779039299703961">Evento</translation>
 <translation id="266079277508604648">No se puede establecer conexión con la impresora. Comprueba que esté encendida y conectada a tu Chromebook por red Wi‑Fi o USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Introducir PIN</translation>
 <translation id="2805646850212350655">Sistema de archivos de cifrado de Microsoft</translation>
 <translation id="2805756323405976993">Aplicaciones</translation>
+<translation id="2806891468525657116">El acceso directo ya existe</translation>
 <translation id="2807517655263062534">Los archivos que descargues aparecen aquí</translation>
 <translation id="2809586584051668049">y <ph name="NUMBER_ADDITIONAL_DISABLED" /> más</translation>
 <translation id="281133045296806353">Se ha abierto una nueva ventana en la sesión actual del navegador.</translation>
@@ -1598,6 +1604,7 @@
 <translation id="3428419049384081277">Has iniciado sesión</translation>
 <translation id="3429275422858276529">Añade esta página a marcadores para encontrarla fácilmente en otro momento</translation>
 <translation id="3429599832623003132">$1 elementos</translation>
+<translation id="3430342160185525240">Permite que el Asistente te muestre notificaciones.</translation>
 <translation id="3432227430032737297">Quitar todas las que se muestran</translation>
 <translation id="3432757130254800023">Enviar audio y vídeo a pantallas de la red local</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1961,6 +1968,7 @@
 <translation id="3941565636838060942">Para ocultar el acceso a este programa, debes desinstalarlo utilizando la función <ph name="CONTROL_PANEL_APPLET_NAME" /> del Panel de control.
 
 ¿Quieres iniciar <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">No se puede crear el acceso directo</translation>
 <translation id="3943582379552582368">&amp;Atrás</translation>
 <translation id="3943857333388298514">Pegar</translation>
 <translation id="3948116654032448504">&amp;Buscar imagen en <ph name="SEARCH_ENGINE" /></translation>
@@ -2268,6 +2276,7 @@
 <translation id="4481530544597605423">Dispositivos desvinculados</translation>
 <translation id="4482194545587547824">Google puede utilizar tu historial de navegación para personalizar la Búsqueda y otros servicios de Google</translation>
 <translation id="4495419450179050807">No mostrar en esta página</translation>
+<translation id="4499718683476608392">Habilita la función de autocompletar tarjetas de crédito para rellenar formularios web con un solo clic</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ha fallado</translation>
 <translation id="450099669180426158">Icono de signo de exclamación</translation>
 <translation id="4501530680793980440">Confirmar eliminación</translation>
@@ -2546,7 +2555,6 @@
 <translation id="4917385247580444890">Buena</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> quiere comunicarse con al extensión <ph name="EXTENSION_NAME" /></translation>
 <translation id="4918086044614829423">Aceptar</translation>
-<translation id="4920350943031252905">Ejecuta IDEs, editores y herramientas de Linux en tu Chromebook.</translation>
 <translation id="4920887663447894854">Los sitios que se indican a continuación se han bloqueado para evitar que puedan hacer un seguimiento de tu ubicación en esta página:</translation>
 <translation id="492299503953721473">Quitar aplicaciones de Android</translation>
 <translation id="4923279099980110923">Sí, quiero ayudar</translation>
@@ -3111,6 +3119,7 @@
 <translation id="5752453871435543420">Copia de seguridad en la nube de Chrome OS</translation>
 <translation id="5756163054456765343">C&amp;entro de ayuda</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> puede leer los documentos que envías para imprimirse a través de <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Configuración de tarjetas de crédito</translation>
 <translation id="5763751966069581670">No se ha encontrado ningún dispositivo USB</translation>
 <translation id="5764483294734785780">G&amp;uardar audio como...</translation>
 <translation id="57646104491463491">Fecha de modificación</translation>
@@ -3182,6 +3191,7 @@
 <translation id="5855773610748894548">Vaya, se ha producido un error en el módulo de seguridad.</translation>
 <translation id="5856721540245522153">Habilitar funciones de depuración</translation>
 <translation id="5857090052475505287">Nueva carpeta</translation>
+<translation id="585979798156957858">Tecla meta externa</translation>
 <translation id="5860033963881614850">No</translation>
 <translation id="5860209693144823476">Pestaña 3</translation>
 <translation id="5860491529813859533">Habilitar</translation>
@@ -3491,6 +3501,7 @@
 <translation id="6327785803543103246">Detección automática de proxy web</translation>
 <translation id="6333064448949140209">El archivo se enviará a Google para depurarlo</translation>
 <translation id="6333834492048057036">El cursor se sitúa en la barra de direcciones para la búsqueda</translation>
+<translation id="6336451774241870485">Nueva pestaña privada</translation>
 <translation id="6339668969738228384">Crear un perfil para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">No se ha podido conectar con el servidor. Comprueba la conexión de red y vuelve a intentarlo. Si el problema persiste, reinicia el Chromebook.</translation>
 <translation id="6340071272923955280">Protocolo de impresión en Internet (IPPS)</translation>
@@ -3671,6 +3682,7 @@
 <translation id="6606070663386660533">Pestaña 8</translation>
 <translation id="6607272825297743757">Información del archivo</translation>
 <translation id="6607831829715835317">Más herramientas</translation>
+<translation id="6610147964972079463">Cerrar pestañas privadas</translation>
 <translation id="6612358246767739896">Contenido protegido</translation>
 <translation id="6613452264606394692">Añade esta página a marcadores para volver a ella rápidamente</translation>
 <translation id="6614893213975402384">Instalar actualizaciones y aplicaciones. Si continúas, aceptas que este dispositivo pueda descargar e instalar actualizaciones y aplicaciones de Google, de tu operador y del fabricante de forma automática, y que pueda usar datos móviles para ello. Es posible que algunas de estas aplicaciones ofrezcan compras en la aplicación. Puedes desinstalar estas aplicaciones en cualquier momento. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
@@ -3741,6 +3753,7 @@
 <translation id="6710213216561001401">Anterior</translation>
 <translation id="6718273304615422081">Comprimiendo...</translation>
 <translation id="671928215901716392">Bloquear pantalla</translation>
+<translation id="6720847671508630642">Comparte lo mejor de Android con tu Chromebook automáticamente. Conecta tu teléfono para enviar mensajes desde tu ordenador, compartir la conexión a Internet de tu teléfono y desbloquear la pantalla de tu Chromebook.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Ver la marca y el modelo de tu llave de seguridad</translation>
 <translation id="6721972322305477112">&amp;Archivo</translation>
 <translation id="672213144943476270">Desbloquea tu perfil antes de navegar como invitado.</translation>
@@ -3887,6 +3900,7 @@
 <translation id="6970856801391541997">Imprimir páginas específicas</translation>
 <translation id="6972180789171089114">Audio/Vídeo</translation>
 <translation id="6973630695168034713">Carpetas</translation>
+<translation id="6974609594866392343">Modo de demostración sin conexión</translation>
 <translation id="6976108581241006975">Consola JavaScript</translation>
 <translation id="6977381486153291903">Revisión del firmware</translation>
 <translation id="6978121630131642226">Motores de búsqueda</translation>
@@ -4251,7 +4265,7 @@
 <translation id="7530016656428373557">Tasa de descarga en vatios</translation>
 <translation id="7531779363494549572">Accede a Ajustes &gt; Aplicaciones y notificaciones &gt; Notificaciones.</translation>
 <translation id="7536709149194614609">Reinicia el dispositivo y vuelve a intentarlo más tarde.</translation>
-<translation id="7537601449003285327">Anclar a la barra de tareas</translation>
+<translation id="7537601449003285327">Fijar a barra de tareas</translation>
 <translation id="7540972813190816353">Se ha producido un error al comprobar las actualizaciones: <ph name="ERROR" /></translation>
 <translation id="7543104066686362383">Se habilitarán las funciones de depurado en este dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /></translation>
 <translation id="7544853251252956727">Reproducir aleatoriamente</translation>
@@ -4481,6 +4495,7 @@
 <translation id="7857949311770343000">¿Es esta la página Nueva pestaña que esperabas?</translation>
 <translation id="786073089922909430">Servicio: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Descargas</translation>
+<translation id="7864662577698025113">Añadir servicio</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" />: vinculado</translation>
 <translation id="7870730066603611552">Revisar opciones de sincronización después de la configuración</translation>
@@ -4828,7 +4843,7 @@
 <translation id="8420510748452002155">Servicios no personalizados</translation>
 <translation id="8424039430705546751">abajo</translation>
 <translation id="8425213833346101688">Cambiar</translation>
-<translation id="8425492902634685834">Anclar a la barra de tareas</translation>
+<translation id="8425492902634685834">Fijar a barra de tareas</translation>
 <translation id="8425755597197517046">&amp;Pegar y buscar</translation>
 <translation id="8426117172745886547">Avisar antes de salir (<ph name="KEY_EQUIVALENT" />)</translation>
 <translation id="8426713856918551002">Habilitando</translation>
@@ -4995,6 +5010,7 @@
 <translation id="8666584013686199826">Preguntar cuando un sitio web quiera acceder a los dispositivos USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> se muestra ahora en pantalla completa y ha inhabilitado el cursor del ratón.</translation>
 <translation id="8669284339312441707">Más cálido</translation>
+<translation id="8669919703154928649">Permite que el Asistente te muestre notificaciones</translation>
 <translation id="8669949407341943408">Moviendo...</translation>
 <translation id="8671210955687109937">Puede comentar</translation>
 <translation id="8673026256276578048">Búsqueda en la Web...</translation>
@@ -5382,6 +5398,7 @@
 <translation id="964286338916298286">Tu administrador de TI ha inhabilitado el contenido adicional de Chrome para tu dispositivo.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicación}other{Aplicaciones}}</translation>
 <translation id="967007123645306417">Se cerrará la sesión en tus cuentas de Google. Los cambios que hagas en tus marcadores, historial, contraseñas y otros ajustes no se sincronizarán con tu cuenta de Google. Sin embargo, tus datos actuales permanecerán almacenados en esa cuenta y se podrán administrar en el <ph name="BEGIN_LINK" />Panel de Control de Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Datos almacenados</translation>
 <translation id="968000525894980488">Activa los Servicios de Google Play.</translation>
 <translation id="968174221497644223">Caché de aplicación</translation>
 <translation id="969096075394517431">Cambiar idiomas</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index 1fb9b70..49cd3fbb 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Näita õigekirja ja grammatikat</translation>
 <translation id="1593594475886691512">Vormindamine ...</translation>
 <translation id="159359590073980872">Kujutiste vahemälu</translation>
+<translation id="1593926297800505364">Salvestab makseviisi</translation>
 <translation id="1598233202702788831">Administraator on värskendused keelanud.</translation>
 <translation id="1600857548979126453">Juurdepääs lehesiluri tagaosale</translation>
 <translation id="1601560923496285236">Rakenda</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Seadet ei saa domeeniga liita. Veenduge, et lisatavate seadmete maksimumarv ei oleks ületatud.</translation>
 <translation id="1744108098763830590">taustleht</translation>
 <translation id="1745520510852184940">Tee seda alati</translation>
+<translation id="1746417874336251387">Pakub teie Chromebookile uusi funktsioone, mis kasutavad teie telefoni ühendust</translation>
 <translation id="174937106936716857">Faile kokku</translation>
 <translation id="175196451752279553">&amp;Ava suletud vaheleht uuesti</translation>
 <translation id="1753905327828125965">Enim külastatud</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Mitte enne</translation>
 <translation id="1933809209549026293">Ühendage hiir või klaviatuur. Kui kasutate Bluetoothi seadet, veenduge, et see oleks valmis sidumiseks.</translation>
 <translation id="1936157145127842922">Kuva kaustas</translation>
+<translation id="1938351510777341717">Väline Command-klahv</translation>
 <translation id="1940546824932169984">Ühendatud seadmed</translation>
 <translation id="1942765061641586207">Kujutise eraldusvõime</translation>
+<translation id="1943097386230153518">Installi uus teenus</translation>
 <translation id="1944921356641260203">Leiti värskendus</translation>
 <translation id="1951615167417147110">Kerib ühe lehe ülespoole</translation>
 <translation id="1954813140452229842">Viga jagatava üksuse ühendamisel. Kontrollige oma mandaati ja proovige uuesti.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Esita</translation>
 <translation id="265390580714150011">Välja väärtus</translation>
 <translation id="2654166010170466751">Luba saitidel maksetöötlejaid installida</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funktsioonid erinevad seadmeti</translation>
 <translation id="2660779039299703961">Sündmus</translation>
 <translation id="266079277508604648">Printeriga ei saa ühendada. Kontrollige, kas printer on sisse lülitatud ja teie Chromebookiga WiFi või USB kaudu ühendatud.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Sisestage PIN-kood</translation>
 <translation id="2805646850212350655">Microsofti failisüsteemi krüptimine</translation>
 <translation id="2805756323405976993">Rakendused</translation>
+<translation id="2806891468525657116">Otsetee on juba olemas</translation>
 <translation id="2807517655263062534">Siin kuvatakse teie allalaaditud failid</translation>
 <translation id="2809586584051668049">ja veel <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Olemasoleva brauseri seansi ajal loodi uus aken.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Olete sisse logitud.</translation>
 <translation id="3429275422858276529">Lisage see leht järjehoidjatesse, et see hiljem hõlpsalt üles leida</translation>
 <translation id="3429599832623003132">$1 üksust</translation>
+<translation id="3430342160185525240">Võimaldab assistendil teile märguandeid esitada.</translation>
 <translation id="3432227430032737297">Eemalda kõik kuvatud</translation>
 <translation id="3432757130254800023">Saada heli ja video kohalikus võrgus olevatele ekraanidele</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
 kasutades juhtpaneeli funktsiooni <ph name="CONTROL_PANEL_APPLET_NAME" />.
 
   Kas soovite käivitada funktsiooni <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Otseteed ei saa luua</translation>
 <translation id="3943582379552582368">&amp;Tagasi</translation>
 <translation id="3943857333388298514">Kleebi</translation>
 <translation id="3948116654032448504">&amp;Otsi teenusest <ph name="SEARCH_ENGINE" /> kujutist</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Sidumata seadmed</translation>
 <translation id="4482194545587547824">Google võib kasutada teie sirvimisajalugu otsingu ja teiste Google'i teenuste isikupärastamiseks</translation>
 <translation id="4495419450179050807">Ära sellel lehel kuva</translation>
+<translation id="4499718683476608392">Saate lubada krediitkaardiandmete automaattäite, et täita vormid ühe klõpsuga</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> jooksis kokku</translation>
 <translation id="450099669180426158">Hüüumärgi ikoon</translation>
 <translation id="4501530680793980440">Eemaldamise kinnitamine</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Tugev</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> tahab suhelda laiendusega „<ph name="EXTENSION_NAME" />”</translation>
 <translation id="4918086044614829423">Nõustu</translation>
-<translation id="4920350943031252905">Linuxi tööriistade, redaktorite ja IDE-de käitamine teie Chromebookis.</translation>
 <translation id="4920887663447894854">Sellel lehel on järgmiseid saite blokeeritud nii, et need ei saa teie asukohta jälgida:</translation>
 <translation id="492299503953721473">Eemalda Androidi rakendused</translation>
 <translation id="4923279099980110923">Jah, soovin aidata</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Chrome OS-i pilvepõhine varundus</translation>
 <translation id="5756163054456765343">A&amp;bikeskus</translation>
 <translation id="5759728514498647443">Rakenduse <ph name="APP_NAME" /> kaudu printimiseks saadetud dokumente saab lugeda rakenduse <ph name="APP_NAME" /> järgi.</translation>
+<translation id="5762172915276660232">Krediitkaardiseaded</translation>
 <translation id="5763751966069581670">USB-seadmeid ei leitud</translation>
 <translation id="5764483294734785780">Sa&amp;lvesta heli nimega ...</translation>
 <translation id="57646104491463491">Muutmise kuupäev</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Vabandust! Turvamooduli viga.</translation>
 <translation id="5856721540245522153">Silumisfunktsioonide lubamine</translation>
 <translation id="5857090052475505287">Uus kaust</translation>
+<translation id="585979798156957858">Väline metaklahv</translation>
 <translation id="5860033963881614850">Väljas</translation>
 <translation id="5860209693144823476">Vahekaart 3</translation>
 <translation id="5860491529813859533">Lülita sisse</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Veebipõhise puhverserveri automaattuvastamine</translation>
 <translation id="6333064448949140209">Fail saadetakse silumiseks Google'ile</translation>
 <translation id="6333834492048057036">Aadressiriba esiletõstmine otsinguks</translation>
+<translation id="6336451774241870485">Uus privaatne vaheleht</translation>
 <translation id="6339668969738228384">Loo e-posti aadressile <ph name="USER_EMAIL_ADDRESS" /> uus profiil</translation>
 <translation id="6340017061976355871">Serveriga ei õnnestunud ühendust luua. Kontrollige võrguühendust ja proovige uuesti. Probleemi jätkumisel taaskäivitage oma Chromebook.</translation>
 <translation id="6340071272923955280">Interneti prindiprotokoll (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Vahekaart 8</translation>
 <translation id="6607272825297743757">Faili teave</translation>
 <translation id="6607831829715835317">Rohkem töö&amp;riistu</translation>
+<translation id="6610147964972079463">Sule privaatsed vahelehed</translation>
 <translation id="6612358246767739896">Kaitstud sisu</translation>
 <translation id="6613452264606394692">Naaske siia kiiresti, lisades selle lehe järjehoidjatesse</translation>
 <translation id="6614893213975402384">Installige rakendusi ja värskendusi. Jätkamisel nõustute, et see seade võib Google'i, teie operaatori ja seadme tootja värskendusi ning rakendusi automaatselt alla laadida ja installida, kasutades selleks võib-olla teie mobiilset andmesidet. Mõned rakendused võivad pakkuda rakendusesiseseid oste. Need rakendused saab alati eemaldada. <ph name="BEGIN_LINK1" />Lisateave<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Eelmine</translation>
 <translation id="6718273304615422081">Pakkimine ...</translation>
 <translation id="671928215901716392">Lukusta ekraan</translation>
+<translation id="6720847671508630642">Jagage Androidi parimaid funktsioone automaatselt Chromebookiga. Ühendage oma telefon, et saaksite arvutist tekstisõnumeid saata, jagada oma telefoni Interneti-ühendust ja avada oma Chromebooki ekraani.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Vaadata teie turvavõtme tootjat ja mudelit</translation>
 <translation id="6721972322305477112">&amp;Fail</translation>
 <translation id="672213144943476270">Enne külalisena sirvimist avage oma profiil.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Prindi valitud leheküljed</translation>
 <translation id="6972180789171089114">Heli/video</translation>
 <translation id="6973630695168034713">Kaustad</translation>
+<translation id="6974609594866392343">Võrguühenduseta demorežiim</translation>
 <translation id="6976108581241006975">JavaScripti konsool</translation>
 <translation id="6977381486153291903">Püsivara redaktsioon</translation>
 <translation id="6978121630131642226">Otsingumootorid</translation>
@@ -4034,6 +4048,7 @@
 <translation id="7175353351958621980">Laaditud:</translation>
 <translation id="7180611975245234373">Värskenda</translation>
 <translation id="7180865173735832675">Kohandamine</translation>
+<translation id="7182359331070524176">Teenuse Google Photos albumi valimine</translation>
 <translation id="7186088072322679094">Tööriistaribale jätmine</translation>
 <translation id="7187428571767585875">Eemaldatavad või muudetavad registrikanded:</translation>
 <translation id="7189234443051076392">Veenduge, et seadmes oleks piisavalt ruumi</translation>
@@ -4485,6 +4500,7 @@
 <translation id="7857949311770343000">Kas see on uus vaheleht, mida ootasite?</translation>
 <translation id="786073089922909430">Teenus: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Allalaadimised</translation>
+<translation id="7864662577698025113">Lisa uus teenus</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 küpsisefail}other{# küpsisefaili}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – seotud</translation>
 <translation id="7870730066603611552">Vaata sünkroonimisvalikud pärast seadistust üle</translation>
@@ -5000,6 +5016,7 @@
 <translation id="8666584013686199826">Küsi, kui sait soovib juurdepääsu USB-seadmetele</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> on nüüd täisekraanil ja teie hiirekursor on keelatud.</translation>
 <translation id="8669284339312441707">Soojem</translation>
+<translation id="8669919703154928649">Luba assistendil märguandeid esitada</translation>
 <translation id="8669949407341943408">Teisaldamine ...</translation>
 <translation id="8671210955687109937">Saab kommenteerida</translation>
 <translation id="8673026256276578048">Veebist otsimine...</translation>
@@ -5387,6 +5404,7 @@
 <translation id="964286338916298286">IT-administraator on keelanud teie seadmes Chrome'i lisad.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Rakendus}other{Rakendused}}</translation>
 <translation id="967007123645306417">See logib teid teie Google'i kontodelt välja. Teie järjehoidjate, ajaloo, paroolide ja muude seadete muudatusi ei sünkroonita enam teie Google'i kontoga. Teie olemasolevad andmed jäävad aga teie Google'i kontole alles ja neid saab hallata <ph name="BEGIN_LINK" />Google'i juhtpaneelil<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Salvestatud andmete maht</translation>
 <translation id="968000525894980488">Lülitage sisse Google Play teenused.</translation>
 <translation id="968174221497644223">Rakenduse vahemälu</translation>
 <translation id="969096075394517431">Keelte vahetamine</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index cc32251..99b223e 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">نمایش املا و گرامر</translation>
 <translation id="1593594475886691512">در حال قالب‌بندی...</translation>
 <translation id="159359590073980872">حافظهٔ پنهان تصویر</translation>
+<translation id="1593926297800505364">ذخیره روش پرداخت</translation>
 <translation id="1598233202702788831">سرپرست سیستم شما به‌روزرسانی‌ها را غیرفعال کرده است.</translation>
 <translation id="1600857548979126453">دسترسی به مرحله پایانی اشکال‌زدای صفحه</translation>
 <translation id="1601560923496285236">اعمال</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">نمی‌توان دستگاه را به دامنه وصل کرد. مطمئن شوید بیشتر از تعداد مجاز دستگاه اضافه نکرده‌اید.</translation>
 <translation id="1744108098763830590">صفحه پس‌زمینه</translation>
 <translation id="1745520510852184940">این کار همیشه انجام شود</translation>
+<translation id="1746417874336251387">‏ارائه ویژگی‌های جدید که از اتصال تلفن به Chromebook استفاده می‌کند</translation>
 <translation id="174937106936716857">تعداد کل فایل‌ها</translation>
 <translation id="175196451752279553">با&amp;ز کردن مجدد برگه بسته</translation>
 <translation id="1753905327828125965">بیشترین موارد بازدید شده</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">نه قبل از</translation>
 <translation id="1933809209549026293">لطفاً موشواره یا صفحه‌کلیدی را وصل کنید. اگر از دستگاه بلوتوث استفاده می‌کنید، مطمئن شوید آماده مرتبط‌سازی است.</translation>
 <translation id="1936157145127842922">نمایش در پوشه</translation>
+<translation id="1938351510777341717">فرمان خارجی</translation>
 <translation id="1940546824932169984">دستگاه‌های متصل</translation>
 <translation id="1942765061641586207">وضوح تصویر</translation>
+<translation id="1943097386230153518">نصب سرویس جدید</translation>
 <translation id="1944921356641260203">به‌روزرسانی پیدا شد</translation>
 <translation id="1951615167417147110">یک صفحه بالا بروید</translation>
 <translation id="1954813140452229842">هنگام نشاندن دستگاه ذخیره‌سازی متصل به شبکه خطایی روی داد. لطفاً اطلاعات کاربری را بررسی کنید و دوباره امتحان کنید.</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2653659639078652383">ارائه</translation>
 <translation id="265390580714150011">مقدار قسمت</translation>
 <translation id="2654166010170466751">اجازه به سایت‌ها برای نصب کنتر‌ل‌کننده‌های پرداخت</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />ویژگی‌ها براساس دستگاه متفاوت است</translation>
 <translation id="2660779039299703961">رویداد</translation>
 <translation id="266079277508604648">‏چاپگر متصل نشد. بررسی کنید چاپگر روشن و ازطریق Wi-Fi یا USB به Chromebook متصل باشد.</translation>
 <translation id="2661146741306740526">۱۶x۹</translation>
@@ -1210,6 +1215,7 @@
 <translation id="2803375539583399270">پین را وارد کنید</translation>
 <translation id="2805646850212350655">‏سیستم فایل رمزگذاری Microsoft</translation>
 <translation id="2805756323405976993">برنامه‌ها</translation>
+<translation id="2806891468525657116">میان‌بر از قبل وجود دارد</translation>
 <translation id="2807517655263062534">فایل‌هایی که بارگیری می‌کنید اینجا نشان داده می‌شود</translation>
 <translation id="2809586584051668049">و <ph name="NUMBER_ADDITIONAL_DISABLED" /> مورد دیگر</translation>
 <translation id="281133045296806353">پنجرهٔ جدید ایجاد شده در جلسه مرورگر فعلی.</translation>
@@ -1596,6 +1602,7 @@
 <translation id="3428419049384081277">وارد سیستم شده‌اید!</translation>
 <translation id="3429275422858276529">این صفحه را نشانک‌گذاری کنید تا بعداً آن را به‌آسانی پیدا کنید</translation>
 <translation id="3429599832623003132">$1 مورد</translation>
+<translation id="3430342160185525240">به «دستیار» امکان می‌دهد اعلان نشان دهد.</translation>
 <translation id="3432227430032737297">حذف همه موارد نشان‌ داده‌شده</translation>
 <translation id="3432757130254800023">ارسال صوت و تصویر برای نمایش در شبکه محلی</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1960,6 +1967,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> در صفحه کنترل آن را حذف کنید.
 
   آیا می‌خواهید <ph name="CONTROL_PANEL_APPLET_NAME" /> را شروع کنید؟</translation>
+<translation id="394183848452296464">نمی‌توان میان‌بر ایجاد کرد</translation>
 <translation id="3943582379552582368">&amp;برگشت</translation>
 <translation id="3943857333388298514">جاگذاری</translation>
 <translation id="3948116654032448504">&amp;جستجوی <ph name="SEARCH_ENGINE" /> برای تصویر</translation>
@@ -2267,6 +2275,7 @@
 <translation id="4481530544597605423">دستگاه‌های لغو ارتباط‌شده</translation>
 <translation id="4482194545587547824">‏Google ممکن است از سابقه مرورتان برای شخصی‌سازی جستجو و سایر سرویس‌های Google استفاده کند.</translation>
 <translation id="4495419450179050807">در این صفحه نشان داده نشود</translation>
+<translation id="4499718683476608392">به تکمیل خودکار کارت اعتباری امکان می‌دهد فرم‌ها را با یک کلیک پر کند</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> خراب شده است</translation>
 <translation id="450099669180426158">نماد علامت تعجب</translation>
 <translation id="4501530680793980440">تأیید حذف</translation>
@@ -2545,7 +2554,6 @@
 <translation id="4917385247580444890">قوی</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> می‌خواهد با افزونه «<ph name="EXTENSION_NAME" />» ارتباط برقرار کند</translation>
 <translation id="4918086044614829423">می‌پذیرم</translation>
-<translation id="4920350943031252905">‏اجرای ابزارها، ویرایشگرها و محیط‌های یکپارچه توسعه نرم‌افزار (IDEs) ‏Linux در Chromebook.</translation>
 <translation id="4920887663447894854">از ردیابی مکان شما در این صفحه توسط سایت‌های زیر جلوگیری شده است:</translation>
 <translation id="492299503953721473">‏حذف برنامه‌های Android</translation>
 <translation id="4923279099980110923">بله می‌خواهم کمک کنم</translation>
@@ -3111,6 +3119,7 @@
 <translation id="5752453871435543420">‏نسخه پشتیبان Chrome OS Cloud</translation>
 <translation id="5756163054456765343">مرکز را&amp;هنمایی</translation>
 <translation id="5759728514498647443">اسنادی که از طریق <ph name="APP_NAME" /> برای چاپ ارسال می‌کنید، می‌توانند توسط <ph name="APP_NAME" /> خوانده شوند.</translation>
+<translation id="5762172915276660232">تنظیمات کارت اعتباری</translation>
 <translation id="5763751966069581670">‏هیچ دستگاه USB پیدا نشد</translation>
 <translation id="5764483294734785780">ذ&amp;خیره فایل صوتی به‌عنوان...</translation>
 <translation id="57646104491463491">تاریخ تغییر</translation>
@@ -3182,6 +3191,7 @@
 <translation id="5855773610748894548">وای، خطای مدول امن.</translation>
 <translation id="5856721540245522153">فعال کردن ویژگی‌های رفع اشکال</translation>
 <translation id="5857090052475505287">پوشهٔ جدید</translation>
+<translation id="585979798156957858">فراداده خارجی</translation>
 <translation id="5860033963881614850">خاموش</translation>
 <translation id="5860209693144823476">برگه ۳</translation>
 <translation id="5860491529813859533">روشن کردن</translation>
@@ -3491,6 +3501,7 @@
 <translation id="6327785803543103246">کشف خودکار پراکسی وب</translation>
 <translation id="6333064448949140209">‏فایل برای اشکال‌زدایی به Google ارسال خواهد شد</translation>
 <translation id="6333834492048057036">تمرکز نوار آدرس برای جستجو</translation>
+<translation id="6336451774241870485">برگه خصوصی جدید</translation>
 <translation id="6339668969738228384">ایجاد نمایه جدیدی برای <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">‏به سرور متصل نشد. لطفاً اتصال شبکه‌تان را بررسی کرده و دوباره امتحان کنید. اگر مشکل برطرف نشد، Chromebook خود را بازراه‌اندازی کنید.</translation>
 <translation id="6340071272923955280">‏پروتکل چاپ اینترنتی (IPPS)</translation>
@@ -3672,6 +3683,7 @@
 <translation id="6606070663386660533">برگه ۸</translation>
 <translation id="6607272825297743757">اطلاعات فایل</translation>
 <translation id="6607831829715835317">ا&amp;بزارهای بیشتر</translation>
+<translation id="6610147964972079463">بستن برگه‌های خصوصی</translation>
 <translation id="6612358246767739896">محتوای محافظت‌شده</translation>
 <translation id="6613452264606394692">با نشانک‌گذاری این صفحه، سریع به اینجا بازگردید</translation>
 <translation id="6614893213975402384">‏نصب به‌روزرسانی‌ها و برنامه‌ها. با ادامه دادن، موافقت می‌کنید که این دستگاه نیز بتواند به‌طور خودکار به‌روزرسانی‌ها و برنامه‌ها را از Google، شرکت مخابراتی و سازنده دستگاه (احتمالاً با استفاده از داده شبکه تلفن همراه) بارگیری و نصب کند. ممکن است بعضی از این برنامه‌ها خریدهای درون‌برنامه پیشنهاد دهند. هرزمان خواستید می‌توانید این برنامه‌ها را حذف کنید. <ph name="BEGIN_LINK1" />بیشتر بدانید<ph name="END_LINK1" /></translation>
@@ -3742,6 +3754,7 @@
 <translation id="6710213216561001401">قبلی</translation>
 <translation id="6718273304615422081">در حال فشرده سازی ...</translation>
 <translation id="671928215901716392">قفل صفحه</translation>
+<translation id="6720847671508630642">‏بهترین‌های Android را به‌طور خودکار با Chromebook هم‌رسانی کنید. تلفنتان را مرتبط کنید تا بتوانید از رایانه پیام نوشتاری ارسال کنید، اتصال اینترنت تلفن را به اشتراک بگذارید و قفل صفحه Chromebook را باز کنید.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">ساخت و مدل «کلید امنیتی» خود را ببینید</translation>
 <translation id="6721972322305477112">&amp;فایل</translation>
 <translation id="672213144943476270">لطفاً قبل از مرور به‌عنوان مهمان، قفل نمایه‌تان را باز کنید.</translation>
@@ -3888,6 +3901,7 @@
 <translation id="6970856801391541997">صفحات خاص چاپ</translation>
 <translation id="6972180789171089114">صوتی/تصویری</translation>
 <translation id="6973630695168034713">پوشه‌ها</translation>
+<translation id="6974609594866392343">حالت نمایشی آفلاین</translation>
 <translation id="6976108581241006975">کنسول جاوا اسکریپت</translation>
 <translation id="6977381486153291903">بازبینی سفت‌افزار</translation>
 <translation id="6978121630131642226">موتورهای جستجو</translation>
@@ -4482,6 +4496,7 @@
 <translation id="7857949311770343000">این صفحه برگه جدیدی است که منتظرش بودید؟</translation>
 <translation id="786073089922909430">سرویس: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;فایلهای بارگیری‌شده</translation>
+<translation id="7864662577698025113">افزودن سرویس جدید</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{۱ کوکی}one{# کوکی}other{# کوکی}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - مرتبط</translation>
 <translation id="7870730066603611552">مرور گزینه‌های همگام‌سازی به دنبال راه‌اندازی</translation>
@@ -4996,6 +5011,7 @@
 <translation id="8666584013686199826">‏وقتی سایتی می‌خواهد به دستگاه‌های USB دسترسی پیدا کند سؤال شود</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> در حال حاضر تمام صفحه است و مکان‌نمای ماوس شما را غیرفعال کرده است.</translation>
 <translation id="8669284339312441707">گرم‌تر</translation>
+<translation id="8669919703154928649">به «دستیار» اجازه دهید اعلان نشان دهد</translation>
 <translation id="8669949407341943408">در حال انتقال...</translation>
 <translation id="8671210955687109937">می‌تواند نظر بدهد</translation>
 <translation id="8673026256276578048">جستجوی وب…</translation>
@@ -5383,6 +5399,7 @@
 <translation id="964286338916298286">‏سرپرست IT شما Chrome Goodies را برای دستگاهتان غیرفعال کرده است.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{برنامه}one{برنامه}other{برنامه}}</translation>
 <translation id="967007123645306417">‏با این کار از سیستم همه حساب‌های Google خارج می‌شوید. تغییرات ایجادشده در نشانک‌ها، سابقه، گذرواژه‌ها و سایر تنظیمات، دیگر با حساب Google شما همگام‌سازی نخواهد شد. بااین‌وجود، داده‌های کنونی در حساب Google شما باقی خواهد ماند و می‌توانید در <ph name="BEGIN_LINK" />داشبورد Google<ph name="END_LINK" /> آن‌ها را مدیریت کنید.</translation>
+<translation id="967624055006145463">داده ذخیره شد</translation>
 <translation id="968000525894980488">‏«خدمات Google Play» را روشن کنید.</translation>
 <translation id="968174221497644223">حافظه پنهان برنامه</translation>
 <translation id="969096075394517431">تغییر زبان‌ها</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index 7fef625..9a11cdc 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Näytä oikeinkirjoitus ja kielioppi</translation>
 <translation id="1593594475886691512">Alustetaan…</translation>
 <translation id="159359590073980872">Kuvavälimuisti</translation>
+<translation id="1593926297800505364">Tallenna maksutapa</translation>
 <translation id="1598233202702788831">Järjestelmänvalvoja on estänyt päivitykset.</translation>
 <translation id="1600857548979126453">Käyttää sivun viankorjausta</translation>
 <translation id="1601560923496285236">Käytä</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Laitetta ei voi liittää verkkotunnukseen. Varmista, ettei lisättävien laitteiden kiintiösi ole ylittynyt,</translation>
 <translation id="1744108098763830590">taustasivu:</translation>
 <translation id="1745520510852184940">Käännä aina</translation>
+<translation id="1746417874336251387">Tarjota uusia ominaisuuksia, jotka käyttävät puhelimen Chromebook-yhteyttä</translation>
 <translation id="174937106936716857">Tiedostoja yhteensä</translation>
 <translation id="175196451752279553">A&amp;vaa suljettu välilehti uudelleen</translation>
 <translation id="1753905327828125965">Käydyimmät</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Ei aiemmin kuin</translation>
 <translation id="1933809209549026293">Yhdistä hiiri tai näppäimistö. Jos käytät Bluetooth-laitetta, varmista että se on valmis laiteparin muodostamiseen.</translation>
 <translation id="1936157145127842922">Näytä kansiossa</translation>
+<translation id="1938351510777341717">Ulkoinen Komento-näppäin</translation>
 <translation id="1940546824932169984">Yhdistetyt laitteet</translation>
 <translation id="1942765061641586207">Kuvan resoluutio</translation>
+<translation id="1943097386230153518">Asenna uusi palvelu</translation>
 <translation id="1944921356641260203">Päivitys saatavilla</translation>
 <translation id="1951615167417147110">Vieritä ylöspäin yksi sivu</translation>
 <translation id="1954813140452229842">Virhe jaon käyttöönotossa. Tarkista kirjautumistietosi ja yritä uudelleen.</translation>
@@ -1109,6 +1113,7 @@
 <translation id="2653659639078652383">Lähetä</translation>
 <translation id="265390580714150011">Kentän arvo</translation>
 <translation id="2654166010170466751">Salli sivustojen asentaa maksujen käsittelijöitä</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" /> Ominaisuudet vaihtelevat laitteen mukaan</translation>
 <translation id="2660779039299703961">Tapahtuma</translation>
 <translation id="266079277508604648">Tulostimeen yhdistäminen epäonnistui. Tarkista, että tulostin on päällä ja yhteydessä Chromebookiin Wi-Fi-yhteydellä tai USB:llä.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1215,6 +1220,7 @@
 <translation id="2803375539583399270">Anna PIN-koodi.</translation>
 <translation id="2805646850212350655">Microsoftin tietojärjestelmän salaus</translation>
 <translation id="2805756323405976993">Sovellukset</translation>
+<translation id="2806891468525657116">Pikakuvake on jo olemassa</translation>
 <translation id="2807517655263062534">Lataamasi tiedostot näytetään tässä.</translation>
 <translation id="2809586584051668049">ja <ph name="NUMBER_ADDITIONAL_DISABLED" /> muuta</translation>
 <translation id="281133045296806353">Nykyisessä selainistunnossa avattiin uusi ikkuna.</translation>
@@ -1601,6 +1607,7 @@
 <translation id="3428419049384081277">Olet kirjautunut sisään!</translation>
 <translation id="3429275422858276529">Lisää tämä sivu kirjanmerkkeihin, niin löydät sen myöhemmin helposti.</translation>
 <translation id="3429599832623003132">$1 kohdetta</translation>
+<translation id="3430342160185525240">Tämä sallii Assistantin näyttää sinulle ilmoituksia.</translation>
 <translation id="3432227430032737297">Poista kaikki näytetyt</translation>
 <translation id="3432757130254800023">Lähetä ääntä ja videota näyttöihin lähiverkossa</translation>
 <translation id="3432762828853624962">SharedWorkerit</translation>
@@ -1962,6 +1969,7 @@
 <translation id="3940233957883229251">Ota automaattinen toisto käyttöön</translation>
 <translation id="3941357410013254652">Kanavatunnus</translation>
 <translation id="3941565636838060942">Jos haluat piilottaa tämän ohjelman käyttöoikeuden, sinun on poistettava sen asennus käyttämällä sovelmaa <ph name="CONTROL_PANEL_APPLET_NAME" /> ohjauspaneelissa. Haluatko käynnistää sovelman <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Pikakuvakkeen luominen epäonnistui</translation>
 <translation id="3943582379552582368">&amp;Edellinen</translation>
 <translation id="3943857333388298514">Liitä</translation>
 <translation id="3948116654032448504">&amp;Hae kuvaa (<ph name="SEARCH_ENGINE" />)</translation>
@@ -2269,6 +2277,7 @@
 <translation id="4481530544597605423">Laitteet ilman paria</translation>
 <translation id="4482194545587547824">Google voi muokata hakua ja muita Googlen palveluita selaushistoriasi perusteella.</translation>
 <translation id="4495419450179050807">Älä näytä tällä sivulla</translation>
+<translation id="4499718683476608392">Ota luottokorttien automaattinen täyttö käyttöön, niin voit täyttää lomakkeita yhdellä klikkauksella</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> on kaatunut.</translation>
 <translation id="450099669180426158">Huutomerkkikuvake</translation>
 <translation id="4501530680793980440">Vahvista poisto</translation>
@@ -2547,7 +2556,6 @@
 <translation id="4917385247580444890">Vahva</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> haluaa viestiä laajennuksen <ph name="EXTENSION_NAME" /> kanssa.</translation>
 <translation id="4918086044614829423">Hyväksy</translation>
-<translation id="4920350943031252905">Käytä Linux-työkaluja, ‑muokkaustoimintoja ja integroituja Linux-kehitysympäristöjä Chromebookilla.</translation>
 <translation id="4920887663447894854">Seuraavia sivustoja on estetty käyttämästä sijaintiasi tällä sivulla:</translation>
 <translation id="492299503953721473">Poista Android-sovellukset</translation>
 <translation id="4923279099980110923">Kyllä, haluan auttaa</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Chrome-käyttöjärjestelmän pilvivarmuuskopiointi</translation>
 <translation id="5756163054456765343">Ohj&amp;ekeskus</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> voi lukea dokumentteja, jotka lähetät tulostettavaksi sovelluksen <ph name="APP_NAME" /> kautta.</translation>
+<translation id="5762172915276660232">Luottokorttiasetukset</translation>
 <translation id="5763751966069581670">USB-laitteita ei löytynyt.</translation>
 <translation id="5764483294734785780">T&amp;allenna audiotiedosto nimellä...</translation>
 <translation id="57646104491463491">Muokkauspäivämäärä</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">Hups, tapahtui suojausmoduulivirhe.</translation>
 <translation id="5856721540245522153">Ota käyttöön virheenkorjausominaisuudet</translation>
 <translation id="5857090052475505287">Uusi kansio</translation>
+<translation id="585979798156957858">Ulkoinen Meta-näppäin</translation>
 <translation id="5860033963881614850">Pois käytöstä</translation>
 <translation id="5860209693144823476">Välilehti 3</translation>
 <translation id="5860491529813859533">Ota käyttöön</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Verkkovälityspalvelimen automaattinen tunnistaminen</translation>
 <translation id="6333064448949140209">Tiedosto lähetetään Googlelle virheenkorjausta varten.</translation>
 <translation id="6333834492048057036">Tarkenna osoitepalkkiin hakua varten</translation>
+<translation id="6336451774241870485">Uusi yksityinen välilehti</translation>
 <translation id="6339668969738228384">Luo uusi profiili käyttäjälle <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Palvelimeen ei saatu yhteyttä. Tarkista verkkoyhteytesi ja yritä uudelleen. Jos ongelma jatkuu, käynnistä Chromebook uudelleen.</translation>
 <translation id="6340071272923955280">Internet-tulostusprotokolla (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Välilehti 8</translation>
 <translation id="6607272825297743757">Tiedoston tiedot</translation>
 <translation id="6607831829715835317">&amp;Lisää työkaluja</translation>
+<translation id="6610147964972079463">Sulje yksityiset välilehdet</translation>
 <translation id="6612358246767739896">Suojattu sisältö</translation>
 <translation id="6613452264606394692">Lisää sivu kirjanmerkiksi, niin voit palata tähän nopeasti.</translation>
 <translation id="6614893213975402384">Asenna päivityksiä ja sovelluksia. Jatkamalla hyväksyt, että laite voi automaattisesti ladata ja asentaa Googlen, operaattorisi tai laitevalmistajan päivityksiä ja sovelluksia, mahdollisesti mobiilidatayhteyden välityksellä. Jotkin näistä sovelluksista tarjoavat sovelluksen sisäisiä ostoksia. Voit poistaa nämä sovellukset milloin tahansa. <ph name="BEGIN_LINK1" />Lisätietoja<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Edellinen</translation>
 <translation id="6718273304615422081">Pakataan…</translation>
 <translation id="671928215901716392">Ruudunlukitus</translation>
+<translation id="6720847671508630642">Jaa Androidin parhaat ominaisuudet Chromebookillesi automaattisesti. Yhdistä puhelimesi, niin voit lähettää tekstiviestejä tietokoneelta, jakaa puhelimen internetyhteyden ja avata Chromebookin näytön lukituksen.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Lisätietoja<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">nähdä suojausavaimesi merkin ja mallin</translation>
 <translation id="6721972322305477112">&amp;Tiedosto</translation>
 <translation id="672213144943476270">Avaa profiilisi lukitus ennen vierailijakäytön aloittamista.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Tulosta tietyt sivut</translation>
 <translation id="6972180789171089114">Ääni- ja videotiedostot</translation>
 <translation id="6973630695168034713">Kansiot</translation>
+<translation id="6974609594866392343">Offline-esittelytila</translation>
 <translation id="6976108581241006975">JavaScript-konsoli</translation>
 <translation id="6977381486153291903">Laiteohjelmiston versio</translation>
 <translation id="6978121630131642226">Hakukoneet</translation>
@@ -4485,6 +4499,7 @@
 <translation id="7857949311770343000">Onko tämä haluamasi Uusi välilehti -sivu?</translation>
 <translation id="786073089922909430">Palvelu: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Lataukset</translation>
+<translation id="7864662577698025113">Lisää uusi palvelu</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 eväste}other{# evästettä}}</translation>
 <translation id="786957569166715433">Laitepari muodostettu laitteen <ph name="DEVICE_NAME" /> kanssa</translation>
 <translation id="7870730066603611552">Tarkista synkronointiasetukset määrityksen jälkeen</translation>
@@ -4999,6 +5014,7 @@
 <translation id="8666584013686199826">Kysy aina, kun sivusto pyytää USB-laitteen käyttölupaa</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> on nyt koko ruudun kokoinen ja on poistanut hiiren osoittimen käytöstä.</translation>
 <translation id="8669284339312441707">Lämmin</translation>
+<translation id="8669919703154928649">Anna Assistantin näyttää sinulle ilmoituksia</translation>
 <translation id="8669949407341943408">Siirretään…</translation>
 <translation id="8671210955687109937">Voi kommentoida</translation>
 <translation id="8673026256276578048">Haku verkosta...</translation>
@@ -5386,6 +5402,7 @@
 <translation id="964286338916298286">IT-järjestelmänvalvojasi on poistanut Chrome Goodies ‑tarjoukset käytöstä laitteellasi.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Sovellus}other{Sovellukset}}</translation>
 <translation id="967007123645306417">Kirjanmerkkeihin, historiaan, salasanoihin ja muihin asetuksiin tehtyjä muutoksia ei enää synkronoida Google-tilillesi. Nykyiset tietosi pysyvät kuitenkin Google-tilillä ja niitä voidaan ylläpitää <ph name="BEGIN_LINK" />Google Hallintapaneelissa<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Tallennettu data</translation>
 <translation id="968000525894980488">Ota Google Play Palvelut käyttöön.</translation>
 <translation id="968174221497644223">Sovellusvälimuisti</translation>
 <translation id="969096075394517431">Vaihda kieltä</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 27fac8b6..a16c7d0 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Show Spelling and Grammar</translation>
 <translation id="1593594475886691512">Nagpo-format...</translation>
 <translation id="159359590073980872">Cache ng Larawan</translation>
+<translation id="1593926297800505364">I-save ang paraan ng pagbabayad</translation>
 <translation id="1598233202702788831">Na-disable ng iyong administrator ang mga update.</translation>
 <translation id="1600857548979126453">I-access ang backend ng debugger ng pahina</translation>
 <translation id="1601560923496285236">Ilapat</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Hindi maisama ang device sa domain. Tiyaking hindi mo nalampasan ang bilang ng mga device na maaari mong idagdag.</translation>
 <translation id="1744108098763830590">pahina ng background</translation>
 <translation id="1745520510852184940">Palagi Itong Gawin</translation>
+<translation id="1746417874336251387">Mag-alok ng mga bagong feature na gumagamit ng koneksyon ng iyong telepono sa Chromebook mo</translation>
 <translation id="174937106936716857">Kabuuang bilang ng file</translation>
 <translation id="175196451752279553">M&amp;uling buksan ang nakasarang tab</translation>
 <translation id="1753905327828125965">Most Visited</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Hindi Bago</translation>
 <translation id="1933809209549026293">Mangyaring magkonekta ng isang mouse o keyboard. Kung gumagamit ka ng Bluetooth device, tiyakin na ito ay handa na upang ipares.</translation>
 <translation id="1936157145127842922">Ipakita sa Folder</translation>
+<translation id="1938351510777341717">External na Command</translation>
 <translation id="1940546824932169984">Mga nakakonektang device</translation>
 <translation id="1942765061641586207">Resolution ng larawan</translation>
+<translation id="1943097386230153518">Mag-install ng bagong serbisyo</translation>
 <translation id="1944921356641260203">May nahanap na update</translation>
 <translation id="1951615167417147110">Mag-scroll up ng isang pahina</translation>
 <translation id="1954813140452229842">Nagka-error sa pag-mount ng share. Pakitingnan ang iyong mga kredensyal at subukang muli.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Isumite</translation>
 <translation id="265390580714150011">Field Value</translation>
 <translation id="2654166010170466751">Payagan ang mga site na mag-install ng mga tagapangasiwa ng pagbabayad</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Nag-iiba-iba ang feature depende sa device</translation>
 <translation id="2660779039299703961">Kaganapan</translation>
 <translation id="266079277508604648">Hindi makakonekta sa printer. Tiyaking naka-on ang printer at nakakonekta ito sa iyong Chromebook sa pamamagitan ng Wi-Fi o USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Ilagay ang PIN</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">Mga App</translation>
+<translation id="2806891468525657116">Mayroon nang ganitong shortcut</translation>
 <translation id="2807517655263062534">Dito lalabas ang mga file na iyong ida-download</translation>
 <translation id="2809586584051668049">at <ph name="NUMBER_ADDITIONAL_DISABLED" /> pa</translation>
 <translation id="281133045296806353">Lumikha ng bagong window sa umiiral nang session ng browser.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Naka-sign in ka!</translation>
 <translation id="3429275422858276529">I-bookmark ang page na ito upang madali itong mahanap sa ibang pagkakaton</translation>
 <translation id="3429599832623003132">Mga $1 na item</translation>
+<translation id="3430342160185525240">Ine-enable ang Assistant na magpakita sa iyo ng mga notification.</translation>
 <translation id="3432227430032737297">Alisin ang Lahat ng Ipinapakita</translation>
 <translation id="3432757130254800023">Magpadala ng audio at video sa mga display sa lokal na network</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> sa Control Panel.
 
   Gusto mo bang simulan ang <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Hindi makagawa ng shortcut</translation>
 <translation id="3943582379552582368">&amp;Bumalik</translation>
 <translation id="3943857333388298514">Paste</translation>
 <translation id="3948116654032448504">&amp;Maghanap sa <ph name="SEARCH_ENGINE" /> para sa Larawan</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Mga hindi nakapares na device</translation>
 <translation id="4482194545587547824">Maaaring gamitin ng Google ang iyong history ng pagba-browse upang ma-personalize ang Search at iba pang mga serbisyo ng Google</translation>
 <translation id="4495419450179050807">Huwag ipakita sa pahinang ito</translation>
+<translation id="4499718683476608392">Ine-enable ang Autofill ng credit card para mapunan ang mga form sa isang pag-click</translation>
 <translation id="4500114933761911433">Nag-crash ang <ph name="PLUGIN_NAME" /></translation>
 <translation id="450099669180426158">Icon na exclamation mark</translation>
 <translation id="4501530680793980440">Kumpirmahin ang Pag-alis</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Malakas</translation>
 <translation id="4918021164741308375">Gusto ng <ph name="ORIGIN" /> na makipag-ugnayan sa extension na "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Tanggapin</translation>
-<translation id="4920350943031252905">Patakbuhin sa iyong Chromebook ang mga tool, editor, at IDE ng Linux.</translation>
 <translation id="4920887663447894854">Hinarangan ang sumusunod na mga site mula sa pagsubaybay ng iyong lokasyon sa pahinang ito:</translation>
 <translation id="492299503953721473">Alisin ang mga Android app</translation>
 <translation id="4923279099980110923">Oo, gusto kong makatulong</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Backup sa Chrome OS Cloud</translation>
 <translation id="5756163054456765343">Help center</translation>
 <translation id="5759728514498647443">Ang mga dokumentong ipinadadala mo upang i-print sa pamamagitan ng <ph name="APP_NAME" /> ay maaaring buksan ng <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Mga setting ng credit card</translation>
 <translation id="5763751966069581670">Walang nahanap na USB device</translation>
 <translation id="5764483294734785780">I-sa&amp;ve ang audio bilang...</translation>
 <translation id="57646104491463491">Petsa nang Binago</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Oops, nagkaroon ng error sa secure na module.</translation>
 <translation id="5856721540245522153">I-enable ang mga feature para sa pagde-debug</translation>
 <translation id="5857090052475505287">Bagong Folder</translation>
+<translation id="585979798156957858">External na Meta</translation>
 <translation id="5860033963881614850">Naka-off</translation>
 <translation id="5860209693144823476">Tab 3</translation>
 <translation id="5860491529813859533">I-on</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Web proxy autodiscovery</translation>
 <translation id="6333064448949140209">Ipapadala ang file sa Google para sa pagde-debug</translation>
 <translation id="6333834492048057036">I-focus ang address bar para sa paghahanap</translation>
+<translation id="6336451774241870485">Bagong pribadong tab</translation>
 <translation id="6339668969738228384">Gumawa ng bagong profile para sa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Hindi makakonekta sa server. Pakitingnan ang iyong koneksyon sa network at subukang muli. Kung magpapatuloy ang problema, i-restart ang Chromebook mo.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">Impormasyon ng file</translation>
 <translation id="6607831829715835317">Higit pang mga too&amp;l</translation>
+<translation id="6610147964972079463">Isara ang mga pribadong tab</translation>
 <translation id="6612358246767739896">Pinoprotektahang content</translation>
 <translation id="6613452264606394692">Makabalik dito nang mabilis sa pamamagitan ng pag-bookmark sa page na ito</translation>
 <translation id="6614893213975402384">Mag-install ng mga update at app. Sa pamamagitan ng pagpapatuloy, sumasang-ayon ka na maaari ring awtomatikong mag-download at mag-install ang device na ito ng mga update at app mula sa Google, iyong carrier, at manufacturer ng device mo, na posibleng gamit ang cellular data. Maaaring nag-aalok ang ilan sa mga app na ito ng mga in-app na pagbili. Maaari mong alisin ang mga app na ito anumang oras. <ph name="BEGIN_LINK1" />Matuto Pa<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Nakaraan</translation>
 <translation id="6718273304615422081">Nagzi-zip...</translation>
 <translation id="671928215901716392">I-lock ang screen</translation>
+<translation id="6720847671508630642">Awtomatikong ibahagi ang pinakamahusay na kakayahan ng Android sa iyong Chromebook. Ikonekta ang iyong telepono nang sa gayon ay makapag-text ka mula sa computer mo, maibahagi ang koneksyon sa internet ng iyong telepono, at ma-unlock ang screen ng Chromebook mo.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Tingnan ang manufacturer at modelo ng iyong Security Key</translation>
 <translation id="6721972322305477112">&amp;File</translation>
 <translation id="672213144943476270">Paki-unlock ang iyong profile bago mag-browse bilang bisita.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">I-print ang Mga Tiyak na Pahina</translation>
 <translation id="6972180789171089114">Audio/Video</translation>
 <translation id="6973630695168034713">Mga Folder</translation>
+<translation id="6974609594866392343">Offline na demo mode</translation>
 <translation id="6976108581241006975">&amp;JavaScript console</translation>
 <translation id="6977381486153291903">Rebisyon ng firmware</translation>
 <translation id="6978121630131642226">Mga Search Engine</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Ito ba ang page ng bagong tab na inaasahan mo?</translation>
 <translation id="786073089922909430">Serbisyo: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Mga download</translation>
+<translation id="7864662577698025113">Magdagdag ng bagong serbisyo</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}one{# cookie}other{# na cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Nakapares</translation>
 <translation id="7870730066603611552">Suriin ang mga opsyon sa pag-sync pagkatapos ng pag-set up</translation>
@@ -5001,6 +5016,7 @@
 <translation id="8666584013686199826">Magtanong kapag gusto ng isang site na i-access ang mga USB device</translation>
 <translation id="8667328578593601900">Nasa full screen na ngayon ang <ph name="FULLSCREEN_ORIGIN" /> at hindi pinagana ang cursor ng iyong mouse.</translation>
 <translation id="8669284339312441707">Warmer</translation>
+<translation id="8669919703154928649">Payagan ang Assistant na magpakita sa iyo ng mga notification</translation>
 <translation id="8669949407341943408">Inililipat...</translation>
 <translation id="8671210955687109937">Makakapagkomento</translation>
 <translation id="8673026256276578048">Hanapan ang Web...</translation>
@@ -5389,6 +5405,7 @@
 <translation id="964286338916298286">Na-disable ng iyong IT administrator ang Chrome Goodies para sa device mo.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Application}one{Application}other{na Application}}</translation>
 <translation id="967007123645306417">Dahil dito, masa-sign out ka sa iyong mga Google account. Hindi na masi-sync sa Google Account mo ang mga pagbabago sa iyong mga bookmark, history, mga password, at iba pang setting. Gayunpaman, mananatiling naka-store ang kasalukuyan mong data sa iyong Google Account at mapapamahalaan ito sa <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Naka-store na data</translation>
 <translation id="968000525894980488">I-on ang mga serbisyo ng Google Play.</translation>
 <translation id="968174221497644223">Cache ng application</translation>
 <translation id="969096075394517431">Palitan ang mga wika</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index 08efa3b..d50a127 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -222,7 +222,7 @@
 <translation id="1316136264406804862">Recherche en cours…</translation>
 <translation id="1316495628809031177">La synchronisation est mise en veille</translation>
 <translation id="1319979322914001937">Application qui présente une liste filtrée d'extensions du Chrome Web Store. Les extensions figurant sur cette liste peuvent être installées directement depuis l'application.</translation>
-<translation id="1322046419516468189">Afficher et gérer les mots de passe de votre <ph name="SAVED_PASSWORDS_STORE" /></translation>
+<translation id="1322046419516468189">Afficher et gérer les mots de passe enregistrés de votre <ph name="SAVED_PASSWORDS_STORE" /></translation>
 <translation id="1326317727527857210">Connectez-vous à Chrome pour accéder à vos onglets sur vos autres appareils.</translation>
 <translation id="1327074568633507428">Imprimante connectée à Google Cloud Print</translation>
 <translation id="1327977588028644528">Passerelle</translation>
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Afficher l'orthographe et la grammaire</translation>
 <translation id="1593594475886691512">Formatage en cours…</translation>
 <translation id="159359590073980872">Cache des images</translation>
+<translation id="1593926297800505364">Enregistrer le mode de paiement</translation>
 <translation id="1598233202702788831">L'administrateur a désactivé les mises à jour.</translation>
 <translation id="1600857548979126453">Accéder au système du débogueur de pages</translation>
 <translation id="1601560923496285236">Appliquer</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Impossible d'associer l'appareil au domaine. Vérifiez que vous n'avez pas dépassé le nombre d'appareils pouvant être ajoutés.</translation>
 <translation id="1744108098763830590">page en arrière-plan</translation>
 <translation id="1745520510852184940">Toujours procéder ainsi</translation>
+<translation id="1746417874336251387">Propose de nouvelles fonctionnalités qui s'appuient sur l'association de votre téléphone à votre Chromebook</translation>
 <translation id="174937106936716857">Nombre total de fichiers</translation>
 <translation id="175196451752279553">&amp;Rouvrir l'onglet fermé</translation>
 <translation id="1753905327828125965">Les + visités</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Pas avant le</translation>
 <translation id="1933809209549026293">Connectez une souris ou un clavier. Si vous utilisez un périphérique Bluetooth, assurez-vous qu'il est prêt à être associé.</translation>
 <translation id="1936157145127842922">Afficher dans le dossier</translation>
+<translation id="1938351510777341717">Commande externe</translation>
 <translation id="1940546824932169984">Appareils connectés</translation>
 <translation id="1942765061641586207">Résolution de l'image</translation>
+<translation id="1943097386230153518">Installer un nouveau service</translation>
 <translation id="1944921356641260203">Mise à jour trouvée</translation>
 <translation id="1951615167417147110">Faire défiler d'une page vers le haut</translation>
 <translation id="1954813140452229842">Erreur lors de l'installation du partage. Veuillez vérifier vos identifiants, puis réessayer.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Valider</translation>
 <translation id="265390580714150011">Valeur du champ</translation>
 <translation id="2654166010170466751">Autoriser les sites à installer des gestionnaires de paiement</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" /> Les fonctionnalités varient d'un appareil à l'autre</translation>
 <translation id="2660779039299703961">Événement</translation>
 <translation id="266079277508604648">Impossible de se connecter à l'imprimante. Vérifiez qu'elle est sous tension et connectée à votre Chromebook par Wi-Fi ou USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Saisir le code</translation>
 <translation id="2805646850212350655">Système de fichiers de chiffrement Microsoft </translation>
 <translation id="2805756323405976993">Applications</translation>
+<translation id="2806891468525657116">Le raccourci existe déjà</translation>
 <translation id="2807517655263062534">Les fichiers téléchargés s'affichent ici</translation>
 <translation id="2809586584051668049">ainsi que <ph name="NUMBER_ADDITIONAL_DISABLED" /> autre(s) extension(s)</translation>
 <translation id="281133045296806353">Nouvelle fenêtre ouverte dans la session du navigateur</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Vous êtes connecté</translation>
 <translation id="3429275422858276529">Ajoutez cette page aux favoris pour la retrouver facilement</translation>
 <translation id="3429599832623003132">$1 éléments</translation>
+<translation id="3430342160185525240">Active l'Assistant pour vous proposer des notifications.</translation>
 <translation id="3432227430032737297">Supprimer tous les cookies affichés</translation>
 <translation id="3432757130254800023">Envoyer les contenus audio et vidéo aux écrans sur le réseau local</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1917,7 +1924,7 @@
 <translation id="3871092408932389764">Le plus grave</translation>
 <translation id="3872220884670338524">Autres actions (compte <ph name="USERNAME" /> enregistré sur <ph name="DOMAIN" />)</translation>
 <translation id="3872991219937722530">Libérez de l'espace disque, car l'appareil risque de ne plus répondre.</translation>
-<translation id="3873315167136380065">Pour activer cette fonctionnalité, <ph name="BEGIN_LINK" />réinitialiser la synchronisation<ph name="END_LINK" /> pour supprimer votre phrase secrète de synchronisation</translation>
+<translation id="3873315167136380065">Pour activer cette fonctionnalité, <ph name="BEGIN_LINK" />réinitialisez la synchronisation<ph name="END_LINK" /> pour supprimer votre phrase secrète de synchronisation</translation>
 <translation id="3878840326289104869">Création de l'utilisateur supervisé en cours</translation>
 <translation id="3879748587602334249">Gestionnaire de téléchargement</translation>
 <translation id="3880709822663530586">Votre clé de sécurité ne fonctionne que lorsque le Bluetooth est activé sur votre appareil</translation>
@@ -1964,6 +1971,7 @@
 au moyen de <ph name="CONTROL_PANEL_APPLET_NAME" /> dans le panneau de configuration.
 
 Souhaitez-vous lancer <ph name="CONTROL_PANEL_APPLET_NAME" /> ?</translation>
+<translation id="394183848452296464">Impossible de créer un raccourci</translation>
 <translation id="3943582379552582368">R&amp;etour</translation>
 <translation id="3943857333388298514">Coller</translation>
 <translation id="3948116654032448504">&amp;Rechercher une image avec <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Appareils dissociés</translation>
 <translation id="4482194545587547824">Google peut utiliser votre historique de navigation pour personnaliser la recherche et d'autres services Google.</translation>
 <translation id="4495419450179050807">Ne pas afficher sur cette page</translation>
+<translation id="4499718683476608392">Activer la saisie automatique des informations de paiement pour remplir les formulaires d'un simple clic</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> a planté</translation>
 <translation id="450099669180426158">Icône représentant un point d'exclamation</translation>
 <translation id="4501530680793980440">Confirmer la suppression</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Très bon</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> souhaite communiquer avec l'extension "<ph name="EXTENSION_NAME" />".</translation>
 <translation id="4918086044614829423">Accepter</translation>
-<translation id="4920350943031252905">Exécutez les outils, les éditeurs et les IDE Linux sur votre Chromebook.</translation>
 <translation id="4920887663447894854">Le suivi de votre position géographique sur cette page a été bloqué pour les sites suivants :</translation>
 <translation id="492299503953721473">Supprimer des applications Android</translation>
 <translation id="4923279099980110923">Je souhaite apporter mon aide</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Sauvegarde Cloud de Chrome OS</translation>
 <translation id="5756163054456765343">C&amp;entre d'aide</translation>
 <translation id="5759728514498647443">Les documents envoyés pour impression via "<ph name="APP_NAME" />" sont lisibles avec "<ph name="APP_NAME" />"</translation>
+<translation id="5762172915276660232">Paramètres de carte de crédit</translation>
 <translation id="5763751966069581670">Aucun appareil USB détecté</translation>
 <translation id="5764483294734785780">En&amp;registrer le fichier audio sous...</translation>
 <translation id="57646104491463491">Date de modification</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Une erreur liée au module sécurisé s'est produite.</translation>
 <translation id="5856721540245522153">Activer les fonctionnalités de débogage</translation>
 <translation id="5857090052475505287">Nouveau dossier</translation>
+<translation id="585979798156957858">Métadonnées externes</translation>
 <translation id="5860033963881614850">Désactivé</translation>
 <translation id="5860209693144823476">Tab 3</translation>
 <translation id="5860491529813859533">Activer</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Recherche automatique du proxy Web</translation>
 <translation id="6333064448949140209">Le fichier sera envoyé à Google pour être débogué.</translation>
 <translation id="6333834492048057036">Centrer sur la barre d'adresse pour la recherche</translation>
+<translation id="6336451774241870485">Nouvel onglet privé</translation>
 <translation id="6339668969738228384">Créer un profil pour <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Impossible de se connecter au serveur. Veuillez vérifier votre connexion réseau et réessayer. Si le problème persiste, redémarrez votre Chromebook.</translation>
 <translation id="6340071272923955280">Protocole d'impression Internet (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">Informations sur le fichier</translation>
 <translation id="6607831829715835317">Plus d'outi&amp;ls</translation>
+<translation id="6610147964972079463">Fermer les onglets privés</translation>
 <translation id="6612358246767739896">Contenu protégé</translation>
 <translation id="6613452264606394692">Revenez facilement sur cette page en l'ajoutant à vos favoris</translation>
 <translation id="6614893213975402384">Installer des mises à jour et des applications. En continuant, vous acceptez que cet appareil télécharge et installe automatiquement des mises à jour et des applications de Google, de votre opérateur et du fabricant de votre appareil, en utilisant si besoin des données mobiles. Certaines applications peuvent proposer des achats intégrés. Vous pouvez les supprimer à tout moment. <ph name="BEGIN_LINK1" />En savoir plus<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">Précédent</translation>
 <translation id="6718273304615422081">Compression en cours…</translation>
 <translation id="671928215901716392">Verrouillage d'écran</translation>
+<translation id="6720847671508630642">Partagez automatiquement les meilleures fonctionnalités d'Android avec votre Chromebook. Associez votre téléphone pour pouvoir envoyer des SMS depuis votre ordinateur, partager la connexion Internet de votre téléphone et déverrouiller l'écran de votre Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Voir la marque et le modèle de votre clé de sécurité</translation>
 <translation id="6721972322305477112">&amp;Fichier</translation>
 <translation id="672213144943476270">Veuillez déverrouiller votre profil avant de naviguer en tant qu'invité.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">Imprimer des pages spécifiques</translation>
 <translation id="6972180789171089114">Audio/Vidéo</translation>
 <translation id="6973630695168034713">Dossiers</translation>
+<translation id="6974609594866392343">Mode démo hors connexion</translation>
 <translation id="6976108581241006975">Console JavaScript</translation>
 <translation id="6977381486153291903">Version du micrologiciel</translation>
 <translation id="6978121630131642226">Moteurs de recherche</translation>
@@ -4006,7 +4020,7 @@
 <translation id="7127980134843952133">Historique des téléchargements</translation>
 <translation id="7131040479572660648">Lire vos données sur <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> et <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">Ajouter une pa&amp;ge...</translation>
-<translation id="7133578150266914903">Votre administrateur rétablit une version antérieure du système d'exploitation sur cet appareil (<ph name="PROGRESS_PERCENT" />)</translation>
+<translation id="7133578150266914903">Votre administrateur rétablit une version antérieure du système d'exploitation sur cet appareil (<ph name="PROGRESS_PERCENT" />)…</translation>
 <translation id="7134098520442464001">Réduit la taille du texte</translation>
 <translation id="7136694880210472378">Utiliser par défaut</translation>
 <translation id="7136984461011502314">Bienvenue dans <ph name="PRODUCT_NAME" /></translation>
@@ -4035,6 +4049,7 @@
 <translation id="7175353351958621980">Chargé depuis :</translation>
 <translation id="7180611975245234373">Actualiser</translation>
 <translation id="7180865173735832675">Personnaliser</translation>
+<translation id="7182359331070524176">Sélectionner un album Google Photos</translation>
 <translation id="7186088072322679094">Garder dans la barre d'outils</translation>
 <translation id="7187428571767585875">Entrées de registre à supprimer ou à modifier :</translation>
 <translation id="7189234443051076392">Assurez-vous de disposer de suffisamment d'espace sur votre appareil</translation>
@@ -4206,7 +4221,7 @@
 <translation id="7463006580194749499">Ajouter une personne</translation>
 <translation id="7464490149090366184">Échec de la compression au format .zip, car l'élément existe déjà : $1.</translation>
 <translation id="7465778193084373987">URL de révocation de certificat Netscape</translation>
-<translation id="7469406957790636836">Pour activer cette option, activer d'abord la vérification orthographique sous <ph name="BEGIN_LINK" />Langues et saisie<ph name="END_LINK" /></translation>
+<translation id="7469406957790636836">Pour activer cette option, activez d'abord la vérification orthographique sous <ph name="BEGIN_LINK" />Langues et saisie<ph name="END_LINK" /></translation>
 <translation id="7469894403370665791">Se connecter automatiquement à ce réseau</translation>
 <translation id="747114903913869239">Erreur : impossible de décoder l'extension.</translation>
 <translation id="7473753388963818366">Préparons votre <ph name="DEVICE_TYPE" /></translation>
@@ -4486,6 +4501,7 @@
 <translation id="7857949311770343000">Est-ce la page Nouvel onglet que vous attendiez ?</translation>
 <translation id="786073089922909430">Service : <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Téléchargements</translation>
+<translation id="7864662577698025113">Ajouter un service</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}one{# cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> associé</translation>
 <translation id="7870730066603611552">Vérifier les options de synchronisation après la configuration</translation>
@@ -5000,6 +5016,7 @@
 <translation id="8666584013686199826">Me demander lorsqu'un site souhaite accéder aux appareils USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> est maintenant en mode plein écran et a désactivé le curseur de votre souris.</translation>
 <translation id="8669284339312441707">Plus chaud</translation>
+<translation id="8669919703154928649">Autoriser l'Assistant à afficher des notifications</translation>
 <translation id="8669949407341943408">Déplacement en cours…</translation>
 <translation id="8671210955687109937">Commentateur</translation>
 <translation id="8673026256276578048">Rechercher sur le Web...</translation>
@@ -5021,7 +5038,7 @@
 <translation id="8698464937041809063">Dessin Google</translation>
 <translation id="869884720829132584">Menu Applications</translation>
 <translation id="869891660844655955">Date d'expiration</translation>
-<translation id="8699566574894671540">Pour activer cette option, sélectionner d'abord Vérifier l'orthographe lors de la frappe depuis le menu Édition</translation>
+<translation id="8699566574894671540">Pour activer cette option, sélectionnez d'abord "Vérifier l'orthographe lors de la frappe" depuis le menu "Édition"</translation>
 <translation id="870073306461175568">Partages de fichiers en réseau</translation>
 <translation id="8701677791353449257">Le nom de l'appareil doit correspondre à l'expression régulière <ph name="REGEX" />.</translation>
 <translation id="8704521619148782536">Cette opération dure beaucoup plus longtemps que d'habitude. Vous pouvez continuer à attendre, ou annuler l'opération et réessayer plus tard.</translation>
@@ -5387,6 +5404,7 @@
 <translation id="964286338916298286">Votre administrateur informatique a désactivé les bonus Chrome pour votre appareil.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Application}one{Application}other{Applications}}</translation>
 <translation id="967007123645306417">Vous serez déconnecté de vos comptes Google. Les modifications apportées à vos favoris, à votre historique, à vos mots de passe et à d'autres paramètres ne seront plus synchronisées avec votre compte Google. Cependant, les données déjà stockées sur votre compte Google y seront conservées et pourront être gérées dans <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Données stockées</translation>
 <translation id="968000525894980488">Activez les services Google Play.</translation>
 <translation id="968174221497644223">Cache de l'application</translation>
 <translation id="969096075394517431">Modifier les langues</translation>
@@ -5403,7 +5421,7 @@
 <translation id="988978206646512040">Phrase secrète obligatoire</translation>
 <translation id="992032470292211616">Les extensions, les applications et les thèmes peuvent endommager votre appareil. Voulez-vous vraiment continuer ?</translation>
 <translation id="992592832486024913">Désactiver ChromeVox (commentaires audio)</translation>
-<translation id="993540765962421562">Installation en cours</translation>
+<translation id="993540765962421562">Installation…</translation>
 <translation id="994289308992179865">&amp;Répéter</translation>
 <translation id="996250603853062861">Établissement de la connexion sécurisée...</translation>
 <translation id="998747458861718449">I&amp;nspecter</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index a70f841..266f768 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -397,6 +397,7 @@
 <translation id="1589055389569595240">જોડણી અને વ્યાકરણ બતાવો</translation>
 <translation id="1593594475886691512">ફોર્મેટિંગ...</translation>
 <translation id="159359590073980872">છબી કેશ</translation>
+<translation id="1593926297800505364">ચુકવણી પદ્ધતિ સાચવો</translation>
 <translation id="1598233202702788831">તમારા વ્યવસ્થાપક દ્વારા અપડેટ્સ અક્ષમ કરાયા છે.</translation>
 <translation id="1600857548979126453">પૃષ્ઠ ડીબગર બૅકએંડ ઍક્સેસ કરો</translation>
 <translation id="1601560923496285236">લાગુ કરો</translation>
@@ -507,6 +508,7 @@
 <translation id="1744060673522309905">ઉપકરણ ડોમેન સાથે જોડી શકાતું નથી. તમને જેટલા ઉપકરણો ઉમેરવાની મંજૂરી હોય તે સંખ્યા વાટાવી નથી તેની ખાતરી કરો.</translation>
 <translation id="1744108098763830590">પૃષ્ઠભૂમિ પૃષ્ઠ</translation>
 <translation id="1745520510852184940">હંમેશાં આ કરો</translation>
+<translation id="1746417874336251387">તમારી Chromebook પર તમારા ફોનના કનેક્શનનો ઉપયોગ કરે તેવી નવી સુવિધા પ્રસ્તુત કરો</translation>
 <translation id="174937106936716857">કુલ ફાઇલની સંખ્યા</translation>
 <translation id="175196451752279553">બંધ કરેલું ટેબ ફરિથી ખોલો</translation>
 <translation id="1753905327828125965">સૌથી વધુ જોવાયેલ</translation>
@@ -637,8 +639,10 @@
 <translation id="1932098463447129402">આની પહેલા નહીં</translation>
 <translation id="1933809209549026293">કૃપા કરીને માઉસ અથવા કીબોર્ડને કનેક્ટ કરો. જો તમે Bluetooth ઉપકરણ વાપરી રહ્યાં હોવ, તો તે જોડી માટે તૈયાર છે તેની ખાતરી કરો.</translation>
 <translation id="1936157145127842922">ફોલ્ડરમાં બતાવો</translation>
+<translation id="1938351510777341717">બાહ્ય આદેશ</translation>
 <translation id="1940546824932169984">કનેક્ટ થયેલ ઉપકરણો</translation>
 <translation id="1942765061641586207">છબી રિઝોલ્યુશન</translation>
+<translation id="1943097386230153518">નવી સેવા ઇન્સ્ટૉલ કરો</translation>
 <translation id="1944921356641260203">અપડેટ મળ્યું</translation>
 <translation id="1951615167417147110">એક પૃષ્ઠ સ્ક્રોલ કરો</translation>
 <translation id="1954813140452229842">શેર માઉન્ટ કરવામાં ભૂલ આવી. કૃપા કરીને તમારા ઓળખપત્રો ચેક કરો અને ફરી પ્રયાસ કરો.</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2653659639078652383">સબમિટ કરો</translation>
 <translation id="265390580714150011">ફીલ્ડ મૂલ્ય</translation>
 <translation id="2654166010170466751">સાઇટોને ચુકવણી હૅન્ડલર ઇન્સ્ટૉલ કરવાની મંજૂરી આપે છે</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />ઉપકરણ અનુસાર સુવિધાઓ બદલાય છે</translation>
 <translation id="2660779039299703961">ઇવેન્ટ</translation>
 <translation id="266079277508604648">પ્રિન્ટર સાથે કનેક્ટ કરી શકાતું નથી. તપાસો કે પ્રિન્ટર ચાલુ કરેલ છે અને વાઇ-ફાઇ અથવા USB દ્વારા તમારી Chromebook સાથે કનેક્ટ કરેલ છે.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1210,6 +1215,7 @@
 <translation id="2803375539583399270">PIN દાખલ કરો</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">એપ્સ</translation>
+<translation id="2806891468525657116">શૉર્ટકટ પહેલેથી અસ્તિત્વમાં છે</translation>
 <translation id="2807517655263062534">તમે ડાઉનલોડ કરેલી ફાઇલો અહીં દેખાશે</translation>
 <translation id="2809586584051668049">અને <ph name="NUMBER_ADDITIONAL_DISABLED" /> વધુ</translation>
 <translation id="281133045296806353">અસ્તિત્વમાં રહેલા બ્રાઉઝર સત્રમાં નવી વિંડો બનાવી.</translation>
@@ -1596,6 +1602,7 @@
 <translation id="3428419049384081277">તમે સાઇન ઇન છો!</translation>
 <translation id="3429275422858276529">થોડા સમય પછી આ પેજને સરળતાથી શોધવા માટે તેને બુકમાર્ક કરો</translation>
 <translation id="3429599832623003132">$1 આઇટમ્સ</translation>
+<translation id="3430342160185525240">આસિસ્ટંટ તમને નોટિફિકેશનો બતાવે તે ચાલુ કરે છે.</translation>
 <translation id="3432227430032737297">બતાવેલ તમામ દૂર કરો</translation>
 <translation id="3432757130254800023">સ્થાનિક નેટવર્ક પરના પ્રદર્શનો પર ઑડિઓ અને વિડિઓ મોકલો</translation>
 <translation id="3432762828853624962">શેર કરેલા કારીગરો</translation>
@@ -1960,6 +1967,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> નો ઉપયોગ કરીને તેને અનઇન્સ્ટોલ કરવું પડશે.
 
  શું તમે <ph name="CONTROL_PANEL_APPLET_NAME" /> ને પ્રારંભ કરવા માંગો છો?</translation>
+<translation id="394183848452296464">શૉર્ટકટ બનાવી શકતાં નથી</translation>
 <translation id="3943582379552582368">&amp;પાછળ</translation>
 <translation id="3943857333388298514">પેસ્ટ કરો</translation>
 <translation id="3948116654032448504">છબી માટે <ph name="SEARCH_ENGINE" /> પર &amp;શોધો</translation>
@@ -2267,6 +2275,7 @@
 <translation id="4481530544597605423">જોડીથી અલગ કરેલા ઉપકરણો</translation>
 <translation id="4482194545587547824">Google, શોધ અને અન્ય Google સેવાઓને વ્યક્તિગત કરવા માટે તમારા બ્રાઉઝિંગ ઇતિહાસનો ઉપયોગ કરી શકે છે</translation>
 <translation id="4495419450179050807">આ પૃષ્ઠ પર બતાવશો નહીં</translation>
+<translation id="4499718683476608392">એક જ ક્લિકમાં ફૉર્મ ભરાય તે માટે ક્રેડિટ કાર્ડનું ઑટોફિલ ચાલુ કરો</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ક્રૅશ થયું છે</translation>
 <translation id="450099669180426158">ઉદ્ગાર ચિહ્નનું આયકન</translation>
 <translation id="4501530680793980440">રીમૂવલની પુષ્ટિ કરો</translation>
@@ -2545,7 +2554,6 @@
 <translation id="4917385247580444890">સશક્ત</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> એ એક્સ્ટેન્શન "<ph name="EXTENSION_NAME" />" સાથે વાર્તાલાપ કરવા માંગે છે</translation>
 <translation id="4918086044614829423">સ્વીકારો</translation>
-<translation id="4920350943031252905">તમારા Chromebook પર Linux સાધનો, એડિટર અને IDE ચલાવો.</translation>
 <translation id="4920887663447894854">નીચેની સાઇટ્સને આ પૃષ્ઠ પર તમારા સ્થાનને ટ્રેક કરવાથી અવરોધિત કરી છે:</translation>
 <translation id="492299503953721473">Android ઍપ્લિકેશનો દૂર કરો</translation>
 <translation id="4923279099980110923">હા, હું સહાય કરવા માંગુ છું</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Chrome OS મેઘ બેકઅપ</translation>
 <translation id="5756163054456765343">સ&amp;હાય કેન્દ્ર</translation>
 <translation id="5759728514498647443">તમે <ph name="APP_NAME" /> મારફતે છાપવા માટે મોકલેલા દસ્તાવેજો <ph name="APP_NAME" /> દ્વારા વાંચી શકાય છે.</translation>
+<translation id="5762172915276660232">ક્રેડિટ કાર્ડની સેટિંગ</translation>
 <translation id="5763751966069581670">કોઈ USB ઉપકરણ મળ્યું નથી</translation>
 <translation id="5764483294734785780">ઑડિયો આ રૂપે સા&amp;ચવો...</translation>
 <translation id="57646104491463491">ફેરફાર કર્યાની તારીખ</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">અરેરે, સુરક્ષિત મોડ્યુલમાં ભૂલ આવી.</translation>
 <translation id="5856721540245522153">ડિબગિંગ સુવિધાઓ સક્ષમ કરો</translation>
 <translation id="5857090052475505287">નવું ફોલ્ડર</translation>
+<translation id="585979798156957858">બાહ્ય મેટા</translation>
 <translation id="5860033963881614850">બંધ</translation>
 <translation id="5860209693144823476">ટૅબ 3</translation>
 <translation id="5860491529813859533">ચાલુ કરો</translation>
@@ -3493,6 +3503,7 @@
 <translation id="6327785803543103246">વેબ પ્રોક્સી સ્વતઃશોધ</translation>
 <translation id="6333064448949140209">ડીબગિંગ માટે ફાઇલ Google ને મોકલવામાં આવશે</translation>
 <translation id="6333834492048057036">શોધ માટે સરનામાં બાર પર ફોકસ કરો</translation>
+<translation id="6336451774241870485">નવું ખાનગી ટૅબ</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> માટે એક નવી પ્રોફાઇલ બનાવો</translation>
 <translation id="6340017061976355871">સર્વર સાથે કનેક્ટ ન કરી શક્યાં. કૃપા કરીને તમારું નેટવર્ક કનેક્શન તપાસો અને ફરી પ્રયાસ કરો. જો સમસ્યા ચાલુ રહે, તો તમારી Chromebook ફરી શરૂ કરો.</translation>
 <translation id="6340071272923955280">ઇન્ટરનેટ પ્રિંટિંગ પ્રોટોકોલ (IPPS)</translation>
@@ -3674,6 +3685,7 @@
 <translation id="6606070663386660533">ટૅબ 8</translation>
 <translation id="6607272825297743757">ફાઇલ માહિતી</translation>
 <translation id="6607831829715835317">વધુ સા&amp;ધનો</translation>
+<translation id="6610147964972079463">બધાં ખાનગી ટૅબ બંધ કરો</translation>
 <translation id="6612358246767739896">સુરક્ષિત સામગ્રી</translation>
 <translation id="6613452264606394692">આ પેજને બુકમાર્ક કરીને અહીં ઝડપથી પાછા ફરી શકશો</translation>
 <translation id="6614893213975402384">અપડેટ અને ઍપ ઇન્સ્ટૉલ કરો. ચાલુ રાખીને, તમે સંમત થાઓ છો કે આ ઉપકરણ સંભવતઃ સેલ્યુલર ડેટાનો ઉપયોગ કરીને Google, તમારા કૅરિઅર અને તમારા ઉપકરણના નિર્માતાના અપડેટ અને ઍપ આપમેળે ડાઉનલોડ અને ઇન્સ્ટૉલ પણ કરી શકે છે. આમાંની કેટલીક ઍપ ઍપમાંથી-ખરીદીની ઑફર કરી શકે છે. તમે કોઈપણ સમયે આ ઍપ કાઢી નાખી શકો છો. <ph name="BEGIN_LINK1" />વધુ જાણો<ph name="END_LINK1" /></translation>
@@ -3744,6 +3756,7 @@
 <translation id="6710213216561001401">પહેલાનું</translation>
 <translation id="6718273304615422081">ઝિપ કરી રહ્યાં છે...</translation>
 <translation id="671928215901716392">સ્ક્રીન લૉક કરો</translation>
+<translation id="6720847671508630642">તમારી Chromebook સાથે આપમેળે Androidનું સર્વોત્તમ શેર કરો. તમારા ફોનને કનેક્ટ કરો જેથી તમે તમારા કમ્પ્યુટરમાંથી ટેક્સ્ટ સંદેશા મોકલી શકો, તમારા ફોનનું ઇન્ટરનેટ કનેક્શન શેર કરી શકો અને તમારી Chromebook સ્ક્રીનને અનલૉક કરી શકો.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />વધુ જાણો<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">તમારી સુરક્ષા કીની બનાવટ અને મૉડલ જુઓ</translation>
 <translation id="6721972322305477112">&amp;File</translation>
 <translation id="672213144943476270">અતિથિ તરીકે બ્રાઉઝ કરતાં પહેલાં કૃપા કરીને તમારી પ્રોફાઇલ અનલૉક કરો.</translation>
@@ -3890,6 +3903,7 @@
 <translation id="6970856801391541997">વિશિષ્ટ પૃષ્ઠો છાપો</translation>
 <translation id="6972180789171089114">ઑડિઓ/વીડિઓ</translation>
 <translation id="6973630695168034713">ફોલ્ડર્સ</translation>
+<translation id="6974609594866392343">ઑફલાઇન ડેમો મોડ</translation>
 <translation id="6976108581241006975">JavaScript કન્સોલ</translation>
 <translation id="6977381486153291903">ફર્મવેયર પુનરાવર્તન</translation>
 <translation id="6978121630131642226">શોધ એંજીન્સ</translation>
@@ -4032,6 +4046,7 @@
 <translation id="7175353351958621980">અહીંથી લોડ કરેલું:</translation>
 <translation id="7180611975245234373">તાજું કરો</translation>
 <translation id="7180865173735832675">કસ્ટમાઇઝ કરો</translation>
+<translation id="7182359331070524176">Google ફોટો આલ્બમ પસંદ કરો</translation>
 <translation id="7186088072322679094">ટુલબારમાં રાખો</translation>
 <translation id="7187428571767585875">કાઢી નાખવા અથવા બદલવા માટેની રજિસ્ટ્રી એન્ટ્રી:</translation>
 <translation id="7189234443051076392">ખાતરી કરો કે તમારા ઉપકરણ પર પૂરતી સ્પેસ છે</translation>
@@ -4482,6 +4497,7 @@
 <translation id="7857949311770343000">શું આ તમારી અપેક્ષા મુજબનું નવું ટેબ પૃષ્ઠ છે?</translation>
 <translation id="786073089922909430">સેવા: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;ડાઉનલોડ્સ</translation>
+<translation id="7864662577698025113">નવી સેવા ઉમેરો</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 કુકી}one{# કુકી}other{# કુકી}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - જોડી કરેલ</translation>
 <translation id="7870730066603611552">સેટઅપ કર્યા પછી સિંક વિકલ્પો રિવ્યૂ કરો</translation>
@@ -4991,6 +5007,7 @@
 <translation id="8666584013686199826">જ્યારે કોઈ સાઇટ USB ઉપકરણોને ઍક્સેસ કરવા માગે ત્યારે પૂછો</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> હવે પૂર્ણ સ્ક્રીનમાં છે અને તમારું માઉસ કર્સર અક્ષમ કરવામાં આવ્યું છે.</translation>
 <translation id="8669284339312441707">વૉર્મર</translation>
+<translation id="8669919703154928649">આસિસ્ટંટને તમને નોટિફિકેશનો બતાવવા દો</translation>
 <translation id="8669949407341943408">ખસેડી રહ્યું છે...</translation>
 <translation id="8671210955687109937">ટિપ્પણી કરી શકે છે</translation>
 <translation id="8673026256276578048">વેબ પર શોધો...</translation>
@@ -5378,6 +5395,7 @@
 <translation id="964286338916298286">તમારા IT વ્યવસ્થાપકે તમારા ઉપકરણ માટે Chrome ઑફરો બંધ કરેલી છે.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{ઍપ્લિકેશન}one{ઍપ્લિકેશનો}other{ઍપ્લિકેશનો}}</translation>
 <translation id="967007123645306417">તમારા Google એકાઉન્ટમાંથી આ તમને સાઇન આઉટ કરશે. બુકમાર્ક, ઇતિહાસ, પાસવર્ડ અને અન્ય સેટિંગ પરના ફેરફારો અને અન્ય સેટિંગ, હવે તમારા Google એકાઉન્ટમાં સિંક કરેલ રહેશે નહીં. તેમ છતાં તમારો વર્તમાન ડેટા તમારા Google એકાઉન્ટમાં સંગ્રહિત રહેશે અને તે <ph name="BEGIN_LINK" />Google ડૅશબોર્ડ<ph name="END_LINK" /> પર મેનેજ કરવામાં આવી શકે છે.</translation>
+<translation id="967624055006145463">સ્ટોર કરેલ ડેટા</translation>
 <translation id="968000525894980488">Google Play સેવાઓ ચાલુ કરો.</translation>
 <translation id="968174221497644223">ઍપ્લિકેશન કેશ</translation>
 <translation id="969096075394517431">ભાષાઓ બદલો</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index 04f05c14..a301464 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">वर्तनी और व्याकरण दिखाएं</translation>
 <translation id="1593594475886691512">फ़ॉर्मेट किया जा रहा है...</translation>
 <translation id="159359590073980872">चित्र संचय</translation>
+<translation id="1593926297800505364">भुगतान का तरीका सेव करें</translation>
 <translation id="1598233202702788831">आपके व्‍यवस्‍थापक के द्वारा अपडेट अक्षम किए गए हैं</translation>
 <translation id="1600857548979126453">पेज डीबगर बैकएंड तक पहुंचें</translation>
 <translation id="1601560923496285236">लागू करें</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">डिवाइस को डोमेन से नहीं जोड़ सकते. पक्का करें कि आपने जोड़े जा सकने वाले डिवाइस की संख्या पार नहीं की है.</translation>
 <translation id="1744108098763830590">पेजभूमि पेज</translation>
 <translation id="1745520510852184940">हमेशा ऐसा करें</translation>
+<translation id="1746417874336251387">आपके Chromebook में नई सुविधाएं ऑफ़र करती है. ये सुविधाएं आपके फ़ोन कनेक्शन का इस्तेमाल करती हैं</translation>
 <translation id="174937106936716857">फ़ाइलों की कुल संख्या</translation>
 <translation id="175196451752279553">बंद किए गए टैब पु&amp;न: खोलें</translation>
 <translation id="1753905327828125965">सबसे अधिक देखे गए</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">पहले नहीं</translation>
 <translation id="1933809209549026293">कृपया माउस या कीबोर्ड कनेक्ट करें. यदि आप ब्लूटूथ डिवाइस का उपयोग कर रहे हैं, तो सुनिश्चित करें कि वह युग्मित किए जाने के लिए तैयार है.</translation>
 <translation id="1936157145127842922">फ़ोल्डर में दिखाएं</translation>
+<translation id="1938351510777341717">बाहरी निर्देश</translation>
 <translation id="1940546824932169984">कनेक्ट किए गए डिवाइस</translation>
 <translation id="1942765061641586207">चित्र रिज़ॉल्यूशन</translation>
+<translation id="1943097386230153518">नई सेवा इंस्टॉल करें</translation>
 <translation id="1944921356641260203">अपडेट मिला</translation>
 <translation id="1951615167417147110">एक पृष्‍ठ ऊपर स्‍क्रॉल करें</translation>
 <translation id="1954813140452229842">शेयर माउंट करने में गड़बड़ी. कृपया अपने क्रेडेंशियल देखें और दोबारा कोशिश करें.</translation>
@@ -918,7 +922,7 @@
 <translation id="2367199180085172140">File Share जोड़ें</translation>
 <translation id="2367972762794486313">ऐप्स  दिखाएं</translation>
 <translation id="2369536625682139252">कुकी को छोड़कर, <ph name="SITE" /> का स्टोर किया हुआ सारा डेटा मिटा दिया जाएगा.</translation>
-<translation id="237058345584060620">अपनी चाबी को इस डिवाइस से जोड़ें ताकि आप अपने खाते में साइन इन करने के लिए इसका इस्तेमाल कर सकें</translation>
+<translation id="237058345584060620">अपनी 'सुरक्षा चाबी' को इस डिवाइस से जोड़ें ताकि आप अपने खाते में साइन इन करने के लिए इसका इस्तेमाल कर सकें</translation>
 <translation id="2371076942591664043">&amp;पू्र्ण होने पर खोलें</translation>
 <translation id="2376559921867170420">आपका Chromebook सेट अप हो जाने पर, किसी भी समय अपनी Assistant से मदद पाने के लिए Assistant बटन दबाएं या "OK Google" बोलें.</translation>
 <translation id="2377319039870049694">'सूची की तरह देखें' पर स्विच करें</translation>
@@ -1015,7 +1019,7 @@
 <translation id="2520644704042891903">उपलब्ध सॉकेट की प्रतीक्षा की जा रही है...</translation>
 <translation id="252219247728877310">घटक अपडेट नहीं किया गया</translation>
 <translation id="2522791476825452208">बहुत पास है</translation>
-<translation id="2523184218357549926">आपके जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
+<translation id="2523184218357549926">आप जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
 <translation id="2525250408503682495">Kryptonite! कियोस्क ऐप्स  का cryptohome माउंट नहीं किया जा सका.</translation>
 <translation id="2526277209479171883">इंस्टॉल करें और जारी रखें</translation>
 <translation id="2526590354069164005">डेस्कटॉप</translation>
@@ -1091,7 +1095,7 @@
 <translation id="2633199387167390344"><ph name="NAME" /> डिस्क मेमोरी के <ph name="USAGE" /> एमबी का उपयोग कर रहा है.</translation>
 <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />" निकालें?</translation>
 <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> स्थापना पूर्ण नहीं कर सका, लेकिन इसकी डिस्क चित्र से चलना जारी रहेगा.</translation>
-<translation id="2633326789677284179">अपनी चाबी के पीछे प्रिंट किया हुआ नाम देखें</translation>
+<translation id="2633326789677284179">अपनी 'सुरक्षा चाबी' के पीछे प्रिंट किया हुआ नाम देखें</translation>
 <translation id="2635276683026132559">हस्ताक्षर</translation>
 <translation id="2636625531157955190">Chrome, चित्र तक नहीं पहुंच पा रहा.</translation>
 <translation id="2638087589890736295">सिंक शुरू करने के लिए पासफ़्रेज़ की आवश्यकता होती है</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">सबमिट करें</translation>
 <translation id="265390580714150011">फ़ील्ड मान</translation>
 <translation id="2654166010170466751">साइटों को भुगतान हैंडलर इंस्टॉल करने की अनुमति दें</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />डिवाइस के हिसाब से सुविधाएं अलग-अलग हो सकती हैं</translation>
 <translation id="2660779039299703961">इवेंट</translation>
 <translation id="266079277508604648">प्रिंटर से कनेक्ट नहीं किया जा सका. देखें कि प्रिंटर चालू है और वाई-फ़ाई या USB के ज़रिए आपके Chromebook से कनेक्ट किया हुआ है.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">पिन डालें</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">ऐप्स</translation>
+<translation id="2806891468525657116">शॉर्टकट पहले से मौजूद है</translation>
 <translation id="2807517655263062534">आपकी डाउनलोड की गई फ़ाइलें यहां दिखाई देती हैं</translation>
 <translation id="2809586584051668049">तथा <ph name="NUMBER_ADDITIONAL_DISABLED" /> और</translation>
 <translation id="281133045296806353">मौजूदा ब्राउज़र सत्र में नई विंडो बनाई गई.</translation>
@@ -1406,7 +1412,7 @@
 <translation id="3090819949319990166">बाहरी crx फ़ाइल की <ph name="TEMP_CRX_FILE" /> में कॉपी नहीं बनाई जा सकती.</translation>
 <translation id="3090871774332213558">"<ph name="DEVICE_NAME" />" युग्मित किया गया</translation>
 <translation id="3101709781009526431">दिनांक और समय</translation>
-<translation id="3104900172193317662">अपनी सुरक्षा चाबी का इस्तेमाल करने दें</translation>
+<translation id="3104900172193317662">अपनी 'सुरक्षा चाबी' का इस्तेमाल करने दें</translation>
 <translation id="310671807099593501">साइट ब्लूटूथ का इस्तेमाल कर रही है</translation>
 <translation id="3115128645424181617">आपका फ़ोन नहीं मिल पा रहा है. पक्का करें कि वह पहुंच में है और ब्लूटूथ चालू है.</translation>
 <translation id="3115147772012638511">संचय की प्रतीक्षा कर रहा है...</translation>
@@ -1565,7 +1571,7 @@
 <translation id="3360297538363969800">प्रिंट करना विफल रहा. कृपया अपना प्रिंटर जाँचें और पुन: प्रयास करें.</translation>
 <translation id="3364721542077212959">स्टाइलस टूल</translation>
 <translation id="3365598184818502391">Ctrl या फिर Alt का इस्तेमाल करें</translation>
-<translation id="3367047597842238025">अपनी पसंद के हिसाब से अपना <ph name="DEVICE_TYPE" /> सेट अप करें और उन सभी अनोखी क्षमताओं का पता लगाएं जो आपकी आसान पहुंच में हैं.</translation>
+<translation id="3367047597842238025">अपनी पसंद के हिसाब से अपना <ph name="DEVICE_TYPE" /> सेट अप करें और उन सभी अनोखी क्षमताओं का पता लगाएं जिन तक आप आसानी से पहुंच सकते हैं .</translation>
 <translation id="3368922792935385530">कनेक्टेड</translation>
 <translation id="3369624026883419694">होस्ट को परिष्कृत कर रहा है...</translation>
 <translation id="337286756654493126">आपके द्वारा ऐप्लिकेशन में खोले गए फ़ोल्डर पढ़ें</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">आप साइन इन किए हुए हैं!</translation>
 <translation id="3429275422858276529">बाद में इस पेज को आसानी से पाने के लिए इसे बुकमार्क करें</translation>
 <translation id="3429599832623003132">$1 आइटम</translation>
+<translation id="3430342160185525240">Assistant को आपको सूचनाएं दिखाने देती है.</translation>
 <translation id="3432227430032737297">दिखाई गईं सभी कुकी निकालें</translation>
 <translation id="3432757130254800023">स्‍थानीय नेटवर्क पर उपलब्‍ध प्रदर्शनों पर ऑडियो और वीडियो भेजें</translation>
 <translation id="3432762828853624962">शेयर किए गए वर्कर</translation>
@@ -1963,6 +1970,7 @@
 <translation id="3941565636838060942">इस प्रोग्राम की एक्सेस छिपाने के लिए, आपको कंट्रोल पैनल में <ph name="CONTROL_PANEL_APPLET_NAME" /> का उपयोग करके उसे अनइंस्टॉल करने की आवश्यकता होगी.
 
   क्या आप <ph name="CONTROL_PANEL_APPLET_NAME" /> को प्रारंभ करना चाहते हैं?</translation>
+<translation id="394183848452296464">शॉर्टकट नहीं बनाए जा सकते</translation>
 <translation id="3943582379552582368">&amp;वापस</translation>
 <translation id="3943857333388298514">चिपकाएं</translation>
 <translation id="3948116654032448504">चित्र को <ph name="SEARCH_ENGINE" /> पर &amp;खोजें</translation>
@@ -2270,6 +2278,7 @@
 <translation id="4481530544597605423">अयुग्मित किए गए डिवाइस</translation>
 <translation id="4482194545587547824">खोज और अन्य Google सेवाओं को वैयक्तिकृत करने के लिए Google आपके ब्राउज़िंग इतिहास का उपयोग कर सकता है</translation>
 <translation id="4495419450179050807">इस पेज पर न दिखाएं</translation>
+<translation id="4499718683476608392">फ़ॉर्म को एक ही क्लिक में भरने के लिए क्रेडिट कार्ड की जानकारी ऑटोमैटिक भरने की सुविधा चालू करें</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> बंद हो गया है</translation>
 <translation id="450099669180426158">'विस्मयादिबोधक चिह्न' आइकॉन</translation>
 <translation id="4501530680793980440">निकालने की दुबारा पूछें</translation>
@@ -2548,7 +2557,6 @@
 <translation id="4917385247580444890">सशक्त</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" एक्‍सटेंशन से संचार करना चाहता है</translation>
 <translation id="4918086044614829423">स्वीकार करें</translation>
-<translation id="4920350943031252905">अपने Chromebook पर Linux के टूल, संपादक (एडिटर) और IDE चलाएं.</translation>
 <translation id="4920887663447894854">निम्न साइटों को इस पेज पर आपकी स्थिति ट्रैक करने से अवरोधित कर दिया गया है:</translation>
 <translation id="492299503953721473">Android ऐप्लिकेशन निकालें</translation>
 <translation id="4923279099980110923">हां, मुझे सहायता चाहिए</translation>
@@ -3114,6 +3122,7 @@
 <translation id="5752453871435543420">Chrome OS क्‍लाउड बैकअप</translation>
 <translation id="5756163054456765343">&amp;सहायता केंद्र</translation>
 <translation id="5759728514498647443">आपके द्वारा <ph name="APP_NAME" /> के माध्‍यम से प्रिंट करने के लिए भेजे जाने वाले दस्‍तावेज़ <ph name="APP_NAME" /> द्वारा पढ़े जा सकते हैं.</translation>
+<translation id="5762172915276660232">क्रेडिट कार्ड सेटिंग</translation>
 <translation id="5763751966069581670">कोई USB डिवाइस नहीं मि‍ला</translation>
 <translation id="5764483294734785780">इस रूप में ऑडियो स&amp;हेजें...</translation>
 <translation id="57646104491463491">संशोधन की तिथि</translation>
@@ -3185,6 +3194,7 @@
 <translation id="5855773610748894548">ओह, सुरक्षित मॉड्यूल में गड़बड़ी.</translation>
 <translation id="5856721540245522153">डीबग करने वाली सुविधाएं सक्षम करें</translation>
 <translation id="5857090052475505287">नया फ़ोल्डर</translation>
+<translation id="585979798156957858">बाहरी मेटा</translation>
 <translation id="5860033963881614850">बंद</translation>
 <translation id="5860209693144823476">टैब 3</translation>
 <translation id="5860491529813859533">चालू करें</translation>
@@ -3231,7 +3241,7 @@
 <translation id="5924047253200400718">सहायता प्राप्त करें<ph name="SCANNING_STATUS" /></translation>
 <translation id="5924527146239595929">नई फ़ोटो लें या मौजूदा फ़ोटो या आइकॉन चुनें.
     <ph name="LINE_BREAK" />
-    यह तस्वीर Chromebook साइन इन स्क्रीन और लॉक स्क्रीन पर दिखाई देगी.</translation>
+    यह तस्वीर Chromebook के साइन इन स्क्रीन और लॉक स्क्रीन पर दिखाई देगी.</translation>
 <translation id="5925147183566400388">प्रमाणन अभ्यास कथन पॉइंटर</translation>
 <translation id="592880897588170157">PDF फ़ाइलों को Chrome में अपने आप खोलने के बजाय उन्हें डाउनलोड करें</translation>
 <translation id="5931146425219109062">आप जिन वेबसाइट पर जाते हैं, उन पर मौजूद अपना सभी डेटा पढ़ें और बदलें</translation>
@@ -3494,6 +3504,7 @@
 <translation id="6327785803543103246">वेब प्रॉक्सी स्वतः खोज</translation>
 <translation id="6333064448949140209">डीबग करने के लिए फ़ाइल Google को भेजी जाएगी</translation>
 <translation id="6333834492048057036">खोज के लिए पता बार पर फ़ोकस करें</translation>
+<translation id="6336451774241870485">नया निजी टैब</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> के लिए एक नया प्रोफ़ाइल बनाएं</translation>
 <translation id="6340017061976355871">सर्वर से नहीं जुड़ सका. कृपया अपना नेटवर्क कनेक्शन जाँचें और दोबारा कोशिश करें. अगर समस्या बनी रहती है, तो अपना Chromebook फिर से चालू करें.</translation>
 <translation id="6340071272923955280">इंटरनेट प्रिंटिंग प्रोटोकॉल (IPPS)</translation>
@@ -3553,7 +3564,7 @@
 <translation id="642282551015776456">यह नाम कि‍सी फ़ाइल या फ़ोल्‍डर के लि‍ए उपयोग नहीं कि‍या जा सकता</translation>
 <translation id="642469772702851743">इस डिवाइस (क्रमांक: <ph name="SERIAL_NUMBER" />) को मालिक ने लॉक कर दिया था.</translation>
 <translation id="6426200009596957090">ChromeVox सेटिंग खोलें</translation>
-<translation id="6427415464407526111">अपनी सुरक्षा चाबी चुनें</translation>
+<translation id="6427415464407526111">अपनी 'सुरक्षा चाबी' चुनें</translation>
 <translation id="6429384232893414837">अपडेट में गड़बड़ी</translation>
 <translation id="6430814529589430811">Base64 में एन्कोड किया गया ASCII, सिर्फ़ एक प्रमाणपत्र</translation>
 <translation id="6431217872648827691">आपके Google पासवर्ड के द्वारा 
@@ -3675,6 +3686,7 @@
 <translation id="6606070663386660533">टैब 8</translation>
 <translation id="6607272825297743757">फ़ाइल जानकारी</translation>
 <translation id="6607831829715835317">अधिक टू&amp;ल</translation>
+<translation id="6610147964972079463">निजी टैब बंद करें</translation>
 <translation id="6612358246767739896">सुरक्षित सामग्री</translation>
 <translation id="6613452264606394692">इस पेज को बुकमार्क करके झटपट यहां वापस पहुंचें</translation>
 <translation id="6614893213975402384">अपडेट और ऐप्लिकेशन इंस्टॉल करें. जारी रखकर, आप सहमति देते हैं कि यह डिवाइस Google से, मोबाइल और इंटरनेट सेवा देने वाली कंपनी से और आपके डिवाइस के निर्माता से, मोबाइल डेटा का इस्तेमाल करके अपडेट और ऐप्लिकेशन को अपने आप डाउनलोड और इंस्टॉल भी कर सकता है. इनमें से कुछ ऐप्लिकेशन इन-ऐप्लिकेशन खरीदारी की सुविधा दे सकते हैं. आप किसी भी समय इन ऐप्लिकेशन को निकाल सकते हैं. <ph name="BEGIN_LINK1" />अधिक जानें<ph name="END_LINK1" /></translation>
@@ -3745,6 +3757,7 @@
 <translation id="6710213216561001401">पिछला</translation>
 <translation id="6718273304615422081">ज़िप किया जा रहा है...</translation>
 <translation id="671928215901716392">लॉक स्‍क्रीन</translation>
+<translation id="6720847671508630642">अपने Android की बेहतरीन चीज़ें अपने Chromebook से अपने आप शेयर करें. अपना फ़ोन कनेक्ट करें ताकि आप अपने कंप्यूटर से मैसेज कर सकें, अपने फ़ोन का इंटरनेट कनेक्शन शेयर कर सकें और अपनी Chromebook स्क्रीन अनलॉक कर सकें.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">अपनी सुरक्षा कुंजी के निर्माता और मॉडल को देखें</translation>
 <translation id="6721972322305477112">&amp;फ़ाइल</translation>
 <translation id="672213144943476270">कृपया मेहमान के रूप में ब्राउज़ करने से पहले अपनी प्रोफ़ाइल अनलॉक करें.</translation>
@@ -3891,6 +3904,7 @@
 <translation id="6970856801391541997">विशेष पेज प्रिंट करें</translation>
 <translation id="6972180789171089114">ऑडियो/वीडियो</translation>
 <translation id="6973630695168034713">फ़ोल्डर</translation>
+<translation id="6974609594866392343">ऑफ़लाइन डेमो मोड</translation>
 <translation id="6976108581241006975">JavaScript पैनल</translation>
 <translation id="6977381486153291903">फ़र्मवेयर पुनरीक्षण</translation>
 <translation id="6978121630131642226">खोज इंजन</translation>
@@ -4033,6 +4047,7 @@
 <translation id="7175353351958621980">यहां से लोड किया गया:</translation>
 <translation id="7180611975245234373">रीफ्रेश करें</translation>
 <translation id="7180865173735832675">कस्टमाइज़ करें</translation>
+<translation id="7182359331070524176">कोई 'Google फ़ोटो' एल्बम चुनें</translation>
 <translation id="7186088072322679094">टूलबार में रखें</translation>
 <translation id="7187428571767585875">ऐसी रजिस्ट्री प्रविष्टियां जिन्हें हटाया या बदला जाना है:</translation>
 <translation id="7189234443051076392">पक्का करें कि आपके डिवाइस पर ज़रूरी जगह मौजूद हो</translation>
@@ -4484,6 +4499,7 @@
 <translation id="7857949311770343000">क्या यह वही नया टैब पेज है जिसकी आप अपेक्षा कर रहे थे?</translation>
 <translation id="786073089922909430">सेवा: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;डाउनलोड</translation>
+<translation id="7864662577698025113">नई सेवा जोड़ें</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 कुकी}one{# कुकी}other{# कुकी}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - युग्मित किया गया</translation>
 <translation id="7870730066603611552">सेटअप के बाद सिंक विकल्पों की समीक्षा करें</translation>
@@ -4843,7 +4859,7 @@
 <translation id="8435395510592618362"><ph name="APP_NAME" /> के ज़रिए अपनी पहचान की पुष्टि करें</translation>
 <translation id="843760761634048214">क्रेडिट कार्ड सहेजें</translation>
 <translation id="8438328416656800239">किसी स्मार्ट ब्राउज़र पर जाएं</translation>
-<translation id="8438566539970814960">खोजों और ब्राउज़िेंग को बेहतर बनाएं</translation>
+<translation id="8438566539970814960">खोजों और ब्राउज़िंग को बेहतर बनाएं</translation>
 <translation id="8439506636278576865">इस भाषा में पृष्ठों का अनुवाद करने का ऑफ़र दें</translation>
 <translation id="8440630305826533614">Linux ऐप्लिकेशन</translation>
 <translation id="8446884382197647889">अधिक जानें</translation>
@@ -4998,6 +5014,7 @@
 <translation id="8666584013686199826">जब कोई साइट USB डिवाइस एक्सेस करना चाहे, तो इसके लिए पूछें</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> अब पूर्ण स्‍क्रीन है और आपका माउस कर्सर अक्षम कर दिया गया है.</translation>
 <translation id="8669284339312441707">वॉर्मर</translation>
+<translation id="8669919703154928649">Assistant को आपको सूचनाएं दिखाने दें</translation>
 <translation id="8669949407341943408">चल रहे...</translation>
 <translation id="8671210955687109937">टिप्पणी कर सकते हैं</translation>
 <translation id="8673026256276578048">वेब पर खोजें...</translation>
@@ -5199,7 +5216,7 @@
 <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - क्रैश हो गया है</translation>
 <translation id="8983677657449185470">सुरक्षित ब्राउज़िंग को बेहतर बनाने में सहायता करें</translation>
 <translation id="8984654317541110628">फ़ाइल शेयर यूआरएल</translation>
-<translation id="8984872292925913496">अपनी चाबी के पीछे दिया गया छह अंकों वाला पिन देखें</translation>
+<translation id="8984872292925913496">अपनी 'सुरक्षा चाबी' के पीछे दिया गया छह अंकों वाला पिन देखें</translation>
 <translation id="8986362086234534611">भूल जाएं</translation>
 <translation id="8986494364107987395">'इस्तेमाल के आंकड़े' और 'खराबी रिपोर्ट' Google को अपने आप भेजे जाने की अनुमति दें</translation>
 <translation id="8987927404178983737">माह</translation>
@@ -5385,6 +5402,7 @@
 <translation id="964286338916298286">आपके आईटी एडमिन ने आपके डिवाइस के लिए 'Chrome के तोहफ़े' रीडीम करने की सुविधा बंद कर दी है.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{ऐप्लिकेशन}one{ऐप्लिकेशन}other{ऐप्लिकेशन}}</translation>
 <translation id="967007123645306417">इससे आप अपने 'Google खातों' से साइन आउट हो जाएंगे. आपके बुकमार्क, इतिहास, पासवर्ड और दूसरी सेटिंग में किए गए बदलाव अब आपके 'Google खाते' से सिंक नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके 'Google खाते' में संग्रहित रहेगा और <ph name="BEGIN_LINK" />Google डैशबोर्ड<ph name="END_LINK" /> पर प्रबंधित किया जा सकेगा.</translation>
+<translation id="967624055006145463">डेटा संग्रहित किया गया</translation>
 <translation id="968000525894980488">Google Play सेवाएं चालू करें.</translation>
 <translation id="968174221497644223">अनुप्रयोग संचय</translation>
 <translation id="969096075394517431">भाषाएं बदलें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 0ba926b..4933f51 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Prikaži pravopis i gramatiku</translation>
 <translation id="1593594475886691512">Formatiranje...</translation>
 <translation id="159359590073980872">Predmemorija slike</translation>
+<translation id="1593926297800505364">Spremanje načina plaćanja</translation>
 <translation id="1598233202702788831">Administrator je onemogućio ažuriranja.</translation>
 <translation id="1600857548979126453">pristupiti pozadini programa za ispravljanje pogrešaka na stranici</translation>
 <translation id="1601560923496285236">Primijeni</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Uređaj nije moguće pridružiti domeni. Provjerite jeste li premašili broj uređaja koji možete dodati.</translation>
 <translation id="1744108098763830590">pozadinska stranica</translation>
 <translation id="1745520510852184940">Učini to uvijek</translation>
+<translation id="1746417874336251387">Ponuda novih značajki koje upotrebljavaju vezu telefona s Chromebookom</translation>
 <translation id="174937106936716857">Ukupan broj datoteka</translation>
 <translation id="175196451752279553">P&amp;onovo otvori zatvorenu karticu</translation>
 <translation id="1753905327828125965">Najposjećenije</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Ne prije</translation>
 <translation id="1933809209549026293">Priključite miš ili tipkovnicu. Ako upotrebljavate Bluetooth uređaj, provjerite je li spreman za uparivanje.</translation>
 <translation id="1936157145127842922">Prikaži u mapi</translation>
+<translation id="1938351510777341717">Vanjska naredba</translation>
 <translation id="1940546824932169984">Povezani uređaji</translation>
 <translation id="1942765061641586207">Razlučivost slike</translation>
+<translation id="1943097386230153518">Instaliraj novu uslugu</translation>
 <translation id="1944921356641260203">Pronađeno je ažuriranje</translation>
 <translation id="1951615167417147110">Pomak za jednu stranicu prema gore</translation>
 <translation id="1954813140452229842">Pogreška pri učitavanju dijeljenja. Provjerite svoje vjerodajnice i pokušajte ponovo.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Pošalji</translation>
 <translation id="265390580714150011">Vrijednost polja</translation>
 <translation id="2654166010170466751">Dopusti web-lokacijama instalaciju rukovatelja plaćanjem</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Značajke se razlikuju ovisno o uređaju</translation>
 <translation id="2660779039299703961">Događaj</translation>
 <translation id="266079277508604648">Povezivanje s pisačem nije uspjelo. Provjerite je li pisač uključen i povezan s Chromebookom putem Wi-Fi mreže ili USB-a.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Unesite PIN</translation>
 <translation id="2805646850212350655">Microsoftov sustav šifriranja datoteke</translation>
 <translation id="2805756323405976993">Aplikacije</translation>
+<translation id="2806891468525657116">Prečac već postoji</translation>
 <translation id="2807517655263062534">Ovdje se prikazuju datoteke koje ste preuzeli</translation>
 <translation id="2809586584051668049">i još <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Stvoren je novi prozor u postojećoj sesiji pregledavanja.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Prijavljeni ste</translation>
 <translation id="3429275422858276529">Označite ovu stranicu da biste je kasnije lakše pronašli</translation>
 <translation id="3429599832623003132">Broj stavki: $1</translation>
+<translation id="3430342160185525240">Omogućuje Asistentu da vam prikazuje obavijesti.</translation>
 <translation id="3432227430032737297">Ukloni sve prikazano</translation>
 <translation id="3432757130254800023">slati audio i videozapise na zaslone na lokalnoj mreži</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> na upravljačkoj ploči.
 
   Želite li pokrenuti <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Nije moguće izraditi prečac</translation>
 <translation id="3943582379552582368">&amp;Natrag</translation>
 <translation id="3943857333388298514">Zalijepi</translation>
 <translation id="3948116654032448504">&amp;Traži sliku uz <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Neupareni uređaji</translation>
 <translation id="4482194545587547824">Google može upotrebljavati vašu povijest pregledavanja za prilagodbu Pretraživanja i drugih Googleovih usluga.</translation>
 <translation id="4495419450179050807">Ne prikazuj na ovoj stranici</translation>
+<translation id="4499718683476608392">Omogućuje automatsko popunjavanje obrazaca podacima o kreditnoj kartici jednim klikom</translation>
 <translation id="4500114933761911433">Srušio se dodatak <ph name="PLUGIN_NAME" /></translation>
 <translation id="450099669180426158">Ikona uskličnika</translation>
 <translation id="4501530680793980440">Potvrda uklanjanja</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Jak</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> želi komunicirati s proširenjem "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Prihvati</translation>
-<translation id="4920350943031252905">Pokretanje Linuxovih alata, uređivača i IDE-ova na Chromebooku.</translation>
 <translation id="4920887663447894854">Sljedeće web-lokacije blokirane su u praćenju vaše lokacije na ovoj web-stranici:</translation>
 <translation id="492299503953721473">Ukloni Android aplikacije</translation>
 <translation id="4923279099980110923">Da, želim pomoći</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Sigurnosno kopiranje u oblaku OS-a Chrome</translation>
 <translation id="5756163054456765343">Centar za pomoć</translation>
 <translation id="5759728514498647443">Dokumente koje šaljete za ispis putem aplikacije <ph name="APP_NAME" /> može čitati aplikacija <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Postavke za kreditne kartice</translation>
 <translation id="5763751966069581670">Nije pronađen nijedan USB uređaj</translation>
 <translation id="5764483294734785780">Sp&amp;remi zvučni zapis kao...</translation>
 <translation id="57646104491463491">Datum izmjene</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Ups, pogreška sigurnog modula.</translation>
 <translation id="5856721540245522153">Omogućivanje značajki za otklanjanje pogrešaka</translation>
 <translation id="5857090052475505287">Nova mapa</translation>
+<translation id="585979798156957858">Vanjska meta tipka</translation>
 <translation id="5860033963881614850">Isključeno</translation>
 <translation id="5860209693144823476">Kartica 3</translation>
 <translation id="5860491529813859533">Uključi</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Automatsko otkrivanje putem web-proxyja</translation>
 <translation id="6333064448949140209">Datoteka će se poslati Googleu radi uklanjanja pogrešaka</translation>
 <translation id="6333834492048057036">Fokusiraj adresnu traku za pretraživanje</translation>
+<translation id="6336451774241870485">Nova privatna kartica</translation>
 <translation id="6339668969738228384">Izradi novi profil za <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Povezivanje s poslužiteljem nije moguće. Provjerite mrežnu vezu i pokušajte ponovo. Ako se problem ne riješi, ponovo pokrenite Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Kartica 8</translation>
 <translation id="6607272825297743757">Informacije o datoteci</translation>
 <translation id="6607831829715835317">Više a&amp;lata</translation>
+<translation id="6610147964972079463">Zatvori privatne kartice</translation>
 <translation id="6612358246767739896">Zaštićeni sadržaj</translation>
 <translation id="6613452264606394692">Označite ovu stranicu da biste se brzo vratili na nju</translation>
 <translation id="6614893213975402384">Instaliranje ažuriranja i aplikacija. Ako nastavite, pristajete na to da ovaj uređaj također može, između ostalog i mobilnim podatkovnim prijenosom, automatski preuzimati i instalirati ažuriranja i aplikacije koje šalju Google, vaš mobilni operater i proizvođač uređaja. Neke od tih aplikacija mogu nuditi kupnje putem aplikacije. Te aplikacije možete ukloniti u bilo kojem trenutku. <ph name="BEGIN_LINK1" />Saznajte više<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Prethodno</translation>
 <translation id="6718273304615422081">Komprimiranje...</translation>
 <translation id="671928215901716392">Zaključaj zaslon</translation>
+<translation id="6720847671508630642">Automatski dijelite najbolje Androidove značajke s Chromebookom. Povežite svoj telefon da biste mogli slati tekstne poruke s računala, dijeliti internetsku vezu telefona i otključati Chromebookov zaslon.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Pogledajte izradu i model sigurnosnog ključa</translation>
 <translation id="6721972322305477112">&amp;File (Datoteka)</translation>
 <translation id="672213144943476270">Otključajte profil da biste mogli pregledavati kao gost.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Ispis određenih stranica</translation>
 <translation id="6972180789171089114">Audiozapisi/videozapisi</translation>
 <translation id="6973630695168034713">Mape</translation>
+<translation id="6974609594866392343">Izvanmrežni demo način</translation>
 <translation id="6976108581241006975">JavaScript konzola</translation>
 <translation id="6977381486153291903">Revizija opreme</translation>
 <translation id="6978121630131642226">Tražilice</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Je li to web-stranica nove kartice koju ste očekivali?</translation>
 <translation id="786073089922909430">Usluga: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Preuzimanje</translation>
+<translation id="7864662577698025113">Dodaj novu uslugu</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 kolačić}one{# kolačić}few{# kolačića}other{# kolačića}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – uparen</translation>
 <translation id="7870730066603611552">Pregledajte opcije sinkronizacije nakon postavljanja</translation>
@@ -5001,6 +5016,7 @@
 <translation id="8666584013686199826">Kada web-lokacija želi pristupiti USB uređajima, prikaži upit</translation>
 <translation id="8667328578593601900">Stranica <ph name="FULLSCREEN_ORIGIN" /> sada je na cijelom zaslonu i onemogućila je pokazivač miša.</translation>
 <translation id="8669284339312441707">Toplije</translation>
+<translation id="8669919703154928649">Dopustite Asistentu da vam prikazuje obavijesti</translation>
 <translation id="8669949407341943408">Premještanje...</translation>
 <translation id="8671210955687109937">Može komentirati</translation>
 <translation id="8673026256276578048">Pretraživanje weba...</translation>
@@ -5388,6 +5404,7 @@
 <translation id="964286338916298286">Vaš IT administrator onemogućio je Chrome pogodnosti za vaš uređaj.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplikacija}one{Aplikacije}few{Aplikacije}other{Aplikacija}}</translation>
 <translation id="967007123645306417">Time ćete se odjaviti s Google računa. Promjene oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši postojeći podaci ostat će pohranjeni na vašem Google računu i možete upravljati njima na <ph name="BEGIN_LINK" />Google nadzornoj ploči<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Pohranjeni podaci</translation>
 <translation id="968000525894980488">Uključite Google Play usluge.</translation>
 <translation id="968174221497644223">Predmemorija aplikacije</translation>
 <translation id="969096075394517431">Promijenite jezike</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 297252f..fb36811 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Helyesírás és nyelvhelyesség megjelenítése</translation>
 <translation id="1593594475886691512">Formázás...</translation>
 <translation id="159359590073980872">Képek gyorsítótára</translation>
+<translation id="1593926297800505364">Fizetési mód mentése</translation>
 <translation id="1598233202702788831">A frissítéseket a rendszergazda letiltotta.</translation>
 <translation id="1600857548979126453">Hozzáférés az oldal háttérben történő hibakereséséhez</translation>
 <translation id="1601560923496285236">Alkalmaz</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Nem sikerült csatlakoztatni az eszközt a domainhez. Győződjön meg róla, hogy nem lépte túl a hozzáadható eszközök számát.</translation>
 <translation id="1744108098763830590">háttéroldal</translation>
 <translation id="1745520510852184940">Mindig ezt tegye</translation>
+<translation id="1746417874336251387">Új funkciókat ajánlhat, amelyek a telefon és a Chromebook kapcsolatát használják</translation>
 <translation id="174937106936716857">Fájlok száma összesen</translation>
 <translation id="175196451752279553">Bezárt lap m&amp;egnyitása</translation>
 <translation id="1753905327828125965">Leggyakrabban látogatott</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Ez előtt nem:</translation>
 <translation id="1933809209549026293">Csatlakoztasson egy egeret vagy billentyűzetet. Ha Bluetooth-eszközt használ, győződjön meg róla, hogy az készen áll a párosításra.</translation>
 <translation id="1936157145127842922">Megjelenítés mappában</translation>
+<translation id="1938351510777341717">Külső parancs</translation>
 <translation id="1940546824932169984">Társított eszközök</translation>
 <translation id="1942765061641586207">Képfelbontás</translation>
+<translation id="1943097386230153518">Új szolgáltatás telepítése</translation>
 <translation id="1944921356641260203">A rendszer frissítést talált</translation>
 <translation id="1951615167417147110">Felgörgetés egy oldalnyival</translation>
 <translation id="1954813140452229842">Hiba történt a megosztott tároló csatlakoztatása során. Ellenőrizze hitelesítő adatait, majd próbálkozzon újra.</translation>
@@ -1109,6 +1113,7 @@
 <translation id="2653659639078652383">Elküldés</translation>
 <translation id="265390580714150011">Mező értéke</translation>
 <translation id="2654166010170466751">Fizetéskezelők telepítésének engedélyezése a webhelyek számára</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />A funkciók eszköztől függően eltérők lehetnek</translation>
 <translation id="2660779039299703961">Esemény</translation>
 <translation id="266079277508604648">Nem sikerült csatlakozni a nyomtatóhoz. Ellenőrizze, hogy be van-e kapcsolva a nyomtató, és hogy csatlakozik-e a Chromebookhoz Wi-Fi-n vagy USB-n keresztül.</translation>
 <translation id="2661146741306740526">16×9</translation>
@@ -1215,6 +1220,7 @@
 <translation id="2803375539583399270">PIN-kód megadása</translation>
 <translation id="2805646850212350655">Microsoft - fájlrendszer titkosítása</translation>
 <translation id="2805756323405976993">Alkalmazások</translation>
+<translation id="2806891468525657116">Ez a billentyűparancs már létezik</translation>
 <translation id="2807517655263062534">A letöltött fájlok itt jelennek meg</translation>
 <translation id="2809586584051668049">és <ph name="NUMBER_ADDITIONAL_DISABLED" /> további</translation>
 <translation id="281133045296806353">Új ablak jött létre a már futó böngésző-programfolyamatban.</translation>
@@ -1601,6 +1607,7 @@
 <translation id="3428419049384081277">Sikeresen bejelentkezett.</translation>
 <translation id="3429275422858276529">Adja hozzá az oldalt a könyvjelzőkhöz, hogy később könnyen megtalálja</translation>
 <translation id="3429599832623003132">$1 elem</translation>
+<translation id="3430342160185525240">Engedélyezi a Segédnek, hogy értesítéseket jelenítsen meg Önnek.</translation>
 <translation id="3432227430032737297">Az összes megjelenített eltávolítása</translation>
 <translation id="3432757130254800023">Hang és videó küldése a helyi hálózaton lévő kijelzőkre</translation>
 <translation id="3432762828853624962">Shared workers</translation>
@@ -1964,6 +1971,7 @@
 <translation id="3941565636838060942">Ha többé nem akar hozzáférni ehhez a programhoz, el kell távolítania azt a Vezérlőpulton a(z) <ph name="CONTROL_PANEL_APPLET_NAME" /> segítségével.
 
 Elindítja a következőt: <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Nem sikerült billentyűparancsot létrehozni</translation>
 <translation id="3943582379552582368">&amp;Előző</translation>
 <translation id="3943857333388298514">Beillesztés</translation>
 <translation id="3948116654032448504">Képkere&amp;sés ezzel: <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Párosítatlan eszközök</translation>
 <translation id="4482194545587547824">A Google felhasználhatja a böngészési előzményeket a Keresés és más Google-szolgáltatások személyre szabására.</translation>
 <translation id="4495419450179050807">Ne jelenjen meg ezen az oldalon</translation>
+<translation id="4499718683476608392">Használja a hitelkártyaadatokra vonatkozó automatikus kitöltés funkciót, amellyel az űrlapokat egyetlen kattintással kitöltheti</translation>
 <translation id="4500114933761911433">A(z) <ph name="PLUGIN_NAME" /> összeomlott</translation>
 <translation id="450099669180426158">Felkiáltójel ikon</translation>
 <translation id="4501530680793980440">Eltávolítás megerősítése</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Erős</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> kommunikálni szeretne a(z) „<ph name="EXTENSION_NAME" />” bővítménnyel.</translation>
 <translation id="4918086044614829423">Elfogadás</translation>
-<translation id="4920350943031252905">Linuxos eszközök, szerkesztők és IDE-szoftverek futtatása a Chromebookon.</translation>
 <translation id="4920887663447894854">A következő webhelyek nem figyelhetik a tartózkodási helyét ezen az oldalon:</translation>
 <translation id="492299503953721473">Android-alkalmazások eltávolítása</translation>
 <translation id="4923279099980110923">Igen, szeretnék segíteni</translation>
@@ -3117,6 +3125,7 @@
 <translation id="5752453871435543420">Chrome OS – biztonsági másolat a felhőben</translation>
 <translation id="5756163054456765343">Súgó</translation>
 <translation id="5759728514498647443">A(z) <ph name="APP_NAME" /> alkalmazáson keresztül nyomtatásra küldött dokumentumait a(z) <ph name="APP_NAME" /> is elolvashatja.</translation>
+<translation id="5762172915276660232">A hitelkártyához tartozó beállítások</translation>
 <translation id="5763751966069581670">Nem található USB-eszköz</translation>
 <translation id="5764483294734785780">Ha&amp;ng mentése másként...</translation>
 <translation id="57646104491463491">Módosítás dátuma</translation>
@@ -3188,6 +3197,7 @@
 <translation id="5855773610748894548">Hoppá! Biztonsági modult érintő hiba történt.</translation>
 <translation id="5856721540245522153">Hibakeresési funkciók bekapcsolása</translation>
 <translation id="5857090052475505287">Új mappa</translation>
+<translation id="585979798156957858">Külső meta</translation>
 <translation id="5860033963881614850">Kikapcsolva</translation>
 <translation id="5860209693144823476">3. lap</translation>
 <translation id="5860491529813859533">Bekapcsolás</translation>
@@ -3497,6 +3507,7 @@
 <translation id="6327785803543103246">Webproxy automatikus észlelése</translation>
 <translation id="6333064448949140209">A fájlt elküldjük a Google-nak hibakeresésre</translation>
 <translation id="6333834492048057036">Címsávra fókuszálás a kereséshez</translation>
+<translation id="6336451774241870485">Új privát lap</translation>
 <translation id="6339668969738228384">Új profil létrehozása a következőhöz: <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Nem sikerült csatlakozni a szerverhez. Ellenőrizze a hálózati kapcsolatot, és próbálja újra. Ha a probléma továbbra is fennáll, indítsa újra a Chromebookot.</translation>
 <translation id="6340071272923955280">Internetes nyomtatási protokoll (IPPS)</translation>
@@ -3678,6 +3689,7 @@
 <translation id="6606070663386660533">8. lap</translation>
 <translation id="6607272825297743757">Fájlinformáció</translation>
 <translation id="6607831829715835317">További eszközök</translation>
+<translation id="6610147964972079463">Privát lapok bezárása</translation>
 <translation id="6612358246767739896">Védett tartalom</translation>
 <translation id="6613452264606394692">Gyorsan visszajuthat ide, ha hozzáadja az oldalt a könyvjelzőkhöz</translation>
 <translation id="6614893213975402384">Alkalmazások és frissítések telepítése. Ha továbblép, azzal elfogadja, hogy az eszköz automatikusan letölthet és telepíthet frissítéseket és alkalmazásokat a Google-tól, az Ön szolgáltatójától és az eszköz gyártójától, akár mobiladat-kapcsolaton keresztül is. Egyes alkalmazások alkalmazáson belüli vásárlásokat kínálhatnak. Ezeket az alkalmazásokat bármikor eltávolíthatja. <ph name="BEGIN_LINK1" />További információ<ph name="END_LINK1" />.</translation>
@@ -3748,6 +3760,7 @@
 <translation id="6710213216561001401">Előző</translation>
 <translation id="6718273304615422081">Tömörítés...</translation>
 <translation id="671928215901716392">Képernyő lezárása</translation>
+<translation id="6720847671508630642">Automatikusan megoszthatja Chromebookjával az Android legjobb funkcióit. Csatlakoztassa telefonját, hogy üzenetet küldhessen számítógépéről, megoszthassa telefonja internetkapcsolatát, és feloldhassa Chromebookja képernyőjét.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />További információ<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Biztonsági hardverkulcsa gyártmányának és típusának megtekintése</translation>
 <translation id="6721972322305477112">&amp;Fájl</translation>
 <translation id="672213144943476270">Kérjük, oldja fel profilját, mielőtt vendégként kezdene böngészni.</translation>
@@ -3894,6 +3907,7 @@
 <translation id="6970856801391541997">Adott oldalak nyomtatása</translation>
 <translation id="6972180789171089114">Hanganyag/videó</translation>
 <translation id="6973630695168034713">Mappák</translation>
+<translation id="6974609594866392343">Offline demó mód</translation>
 <translation id="6976108581241006975">JavaScript-konzol</translation>
 <translation id="6977381486153291903">Firmware ellenőrzése</translation>
 <translation id="6978121630131642226">Keresők</translation>
@@ -4036,6 +4050,7 @@
 <translation id="7175353351958621980">Betöltve innen:</translation>
 <translation id="7180611975245234373">Frissítés</translation>
 <translation id="7180865173735832675">Testreszabás</translation>
+<translation id="7182359331070524176">Válasszon Google Fotók-albumot</translation>
 <translation id="7186088072322679094">Gomb megtartása az eszköztáron</translation>
 <translation id="7187428571767585875">Eltávolításra vagy módosításra kerülő beállításjegyzékbeli bejegyzések:</translation>
 <translation id="7189234443051076392">Győződjön meg arról, hogy elegendő tárhely áll rendelkezésre az eszközön</translation>
@@ -4487,6 +4502,7 @@
 <translation id="7857949311770343000">Erre az új lap oldalra számított?</translation>
 <translation id="786073089922909430">Szolgáltatás: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Letöltések</translation>
+<translation id="7864662577698025113">Új szolgáltatás hozzáadása</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – párosítva</translation>
 <translation id="7870730066603611552">Szinkronizálási beállítások ellenőrzése a beállítást követően</translation>
@@ -5001,6 +5017,7 @@
 <translation id="8666584013686199826">Kérdezzen rá, ha valamelyik webhely hozzá szeretne férni az USB-eszközökhöz</translation>
 <translation id="8667328578593601900">A(z) <ph name="FULLSCREEN_ORIGIN" /> most teljes képernyős nézetben van, és letiltotta az egérmutatót.</translation>
 <translation id="8669284339312441707">Meleg színek</translation>
+<translation id="8669919703154928649">Engedélyezheti az Asszisztensnek az értesítések megjelenítését</translation>
 <translation id="8669949407341943408">Áthelyezés…</translation>
 <translation id="8671210955687109937">Megjegyzések fűzhetők hozzá</translation>
 <translation id="8673026256276578048">Keresés az interneten...</translation>
@@ -5388,6 +5405,7 @@
 <translation id="964286338916298286">Rendszergazdája letiltotta a Chrome-ajánlatokat az Ön eszközén.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Alkalmazás}other{Alkalmazások}}</translation>
 <translation id="967007123645306417">Ezzel kijelentkezik Google-fiókjaiból. A könyvjelzők, előzmények, jelszavak és egyéb beállítások módosításai nem lesznek szinkronizálva Google-fiókjával. Meglévő adatait azonban továbbra is tárolja Google-fiókja, és ezeket az adatokat a <ph name="BEGIN_LINK" />Google Irányítópulton<ph name="END_LINK" /> kezelheti.</translation>
+<translation id="967624055006145463">Tárolt adatok</translation>
 <translation id="968000525894980488">Kapcsolja be a Google Play-szolgáltatásokat.</translation>
 <translation id="968174221497644223">Alkalmazás-gyorsítótár</translation>
 <translation id="969096075394517431">Nyelvek módosítása</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index 1bbb8b6..3bba622 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Tampilkan Ejaan dan Grammar</translation>
 <translation id="1593594475886691512">Pemformatan...</translation>
 <translation id="159359590073980872">Cache Gambar</translation>
+<translation id="1593926297800505364">Simpan metode pembayaran</translation>
 <translation id="1598233202702788831">Pembaruan dinonaktifkan oleh administrator.</translation>
 <translation id="1600857548979126453">Mengakses backend debugger halaman</translation>
 <translation id="1601560923496285236">Terapkan</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Tidak dapat menggabungkan perangkat ke domain. Pastikan Anda tidak melampaui jumlah perangkat yang dapat ditambahkan.</translation>
 <translation id="1744108098763830590">halaman latar belakang</translation>
 <translation id="1745520510852184940">Selalu Lakukan Tindakan Ini</translation>
+<translation id="1746417874336251387">Tawarkan fitur baru yang menggunakan sambungan internet ponsel ke Chromebook</translation>
 <translation id="174937106936716857">Jumlah file total</translation>
 <translation id="175196451752279553">Buka k&amp;embali tab yang tertutup</translation>
 <translation id="1753905327828125965">Sering Dibuka</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Tidak Sebelum</translation>
 <translation id="1933809209549026293">Sambungkan mouse atau keyboard. Jika Anda menggunakan perangkat Bluetooth, pastikan perangkat siap disandingkan.</translation>
 <translation id="1936157145127842922">Tampilkan dalam Folder</translation>
+<translation id="1938351510777341717">External Command</translation>
 <translation id="1940546824932169984">Perangkat yang terhubung</translation>
 <translation id="1942765061641586207">Resolusi gambar</translation>
+<translation id="1943097386230153518">Instal layanan baru</translation>
 <translation id="1944921356641260203">Pembaruan ditemukan</translation>
 <translation id="1951615167417147110">Gulir ke atas satu halaman</translation>
 <translation id="1954813140452229842">Error saat memasang URL berbagi. Periksa kredensial Anda dan coba lagi.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Kirim</translation>
 <translation id="265390580714150011">Nilai Bidang</translation>
 <translation id="2654166010170466751">Izinkan situs menginstal penangan pembayaran</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Fitur berbeda menurut perangkat</translation>
 <translation id="2660779039299703961">Acara</translation>
 <translation id="266079277508604648">Tidak dapat terhubung ke printer. Harap periksa apakah printer sudah diaktifkan dan terhubung ke Chromebook dengan Wi-Fi atau USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Masukkan PIN</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">Apl</translation>
+<translation id="2806891468525657116">Pintasan sudah ada</translation>
 <translation id="2807517655263062534">File yang Anda download muncul di sini</translation>
 <translation id="2809586584051668049">dan <ph name="NUMBER_ADDITIONAL_DISABLED" /> lainnya</translation>
 <translation id="281133045296806353">Jendela baru dibuat pada sesi browser yang ada.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Anda sudah login</translation>
 <translation id="3429275422858276529">Bookmark halaman ini agar mudah ditemukan nanti</translation>
 <translation id="3429599832623003132">$1 item</translation>
+<translation id="3430342160185525240">Mengaktifkan Asisten untuk menampilkan notifikasi.</translation>
 <translation id="3432227430032737297">Buang Semua Yang Ditampilkan</translation>
 <translation id="3432757130254800023">Kirim audio dan video ke layar di jaringan lokal</translation>
 <translation id="3432762828853624962">Pekerja Bersama</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> di Panel Kontrol.
 
   Apakah Anda ingin memulai <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Tidak dapat membuat pintasan</translation>
 <translation id="3943582379552582368">&amp;Mundur</translation>
 <translation id="3943857333388298514">Sisipkan</translation>
 <translation id="3948116654032448504">&amp;Telusuri <ph name="SEARCH_ENGINE" /> untuk Gambar</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Perangkat tidak tersambung</translation>
 <translation id="4482194545587547824">Google dapat menggunakan histori penjelajahan Anda untuk mempersonalisasi Penelusuran dan layanan Google lainnya</translation>
 <translation id="4495419450179050807">Jangan tampilkan pada halaman ini</translation>
+<translation id="4499718683476608392">Aktifkan IsiOtomatis kartu kredit untuk mengisi formulir dengan sekali klik</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> telah error</translation>
 <translation id="450099669180426158">Ikon tanda seru</translation>
 <translation id="4501530680793980440">Konfirmasi Penghapusan</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Kuat</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ingin berkomunikasi dengan ekstensi "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Terima</translation>
-<translation id="4920350943031252905">Menjalankan fitur, editor, dan IDE Linus di Chromebook Anda.</translation>
 <translation id="4920887663447894854">Situs berikut telah dicekal agar tidak melacak lokasi Anda pada halaman ini:</translation>
 <translation id="492299503953721473">Hapus aplikasi Android</translation>
 <translation id="4923279099980110923">Ya, saya ingin membantu</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Cadangan Awan Chrome OS</translation>
 <translation id="5756163054456765343">Pusat bantuan</translation>
 <translation id="5759728514498647443">Dokumen yang Anda kirim untuk dicetak melalui <ph name="APP_NAME" /> dapat dibaca oleh <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Setelan kartu kredit</translation>
 <translation id="5763751966069581670">Tidak ada perangkat USB yang ditemukan</translation>
 <translation id="5764483294734785780">Sim&amp;pan audio sebagai...</translation>
 <translation id="57646104491463491">Tanggal Dimodifikasi</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Maaf, terjadi error pada modul aman.</translation>
 <translation id="5856721540245522153">Aktifkan fitur debug</translation>
 <translation id="5857090052475505287">Folder Baru</translation>
+<translation id="585979798156957858">Meta Eksternal</translation>
 <translation id="5860033963881614850">Nonaktif</translation>
 <translation id="5860209693144823476">Tab 3</translation>
 <translation id="5860491529813859533">Aktifkan</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Penemuan otomatis proksi web</translation>
 <translation id="6333064448949140209">File akan dikirim ke Google untuk proses debug</translation>
 <translation id="6333834492048057036">Memfokuskan bilah alamat untuk penelusuran</translation>
+<translation id="6336451774241870485">Tab rahasia yang baru</translation>
 <translation id="6339668969738228384">Buat profil baru untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Tidak dapat terhubung dengan server. Harap periksa koneksi jaringan dan coba lagi. Jika masalah berlanjut, nyalakan ulang Chromebook.</translation>
 <translation id="6340071272923955280">Protokol Pencetakan Internet (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">Info file</translation>
 <translation id="6607831829715835317">Fitur &amp;lainnya</translation>
+<translation id="6610147964972079463">Tutup tab rahasia</translation>
 <translation id="6612358246767739896">Konten dilindungi</translation>
 <translation id="6613452264606394692">Kembali ke halaman secara cepat dengan mem-bookmark halaman ini</translation>
 <translation id="6614893213975402384">Instal update &amp; aplikasi. Dengan melanjutkan, Anda menyetujui bahwa perangkat ini juga dapat mendownload serta menginstal update dan aplikasi secara otomatis dari Google, operator, dan produsen perangkat, yang kemungkinan menggunakan kuota. Sebagian aplikasi ini mungkin menawarkan pembelian dalam aplikasi. Anda dapat menghapus aplikasi tersebut kapan saja. <ph name="BEGIN_LINK1" />Pelajari Lebih Lanjut<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Sebelumnya</translation>
 <translation id="6718273304615422081">Membuat file zip...</translation>
 <translation id="671928215901716392">Kunci layar</translation>
+<translation id="6720847671508630642">Bagikan fitur terbaik Android ke Chromebook secara otomatis. Sambungkan ponsel agar Anda dapat mengirim SMS dari komputer, membagikan sambungan internet ponsel, dan membuka kunci layar Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Lihat merek dan model Kunci Keamanan Anda</translation>
 <translation id="6721972322305477112">&amp;Berkas</translation>
 <translation id="672213144943476270">Buka kunci profil sebelum menjelajah sebagai tamu.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Cetak Halaman Khusus</translation>
 <translation id="6972180789171089114">Audio/Video</translation>
 <translation id="6973630695168034713">Folder</translation>
+<translation id="6974609594866392343">Mode demo offline</translation>
 <translation id="6976108581241006975">Konsol JavaScript</translation>
 <translation id="6977381486153291903">Revisi firmware</translation>
 <translation id="6978121630131642226">Mesin Telusur</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Apakah ini halaman tab baru yang Anda harapkan?</translation>
 <translation id="786073089922909430">Layanan: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">Un&amp;duhan</translation>
+<translation id="7864662577698025113">Tambahkan layanan baru</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Disandingkan</translation>
 <translation id="7870730066603611552">Tinjau opsi sinkronisasi setelah penyiapan</translation>
@@ -5000,6 +5015,7 @@
 <translation id="8666584013686199826">Tanyakan saat situs ingin mengakses perangkat USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> sekarang dalam mode layar penuh dan telah menonaktifkan kursor mouse Anda.</translation>
 <translation id="8669284339312441707">Hangat</translation>
+<translation id="8669919703154928649">Izinkan Asisten menampilkan notifikasi</translation>
 <translation id="8669949407341943408">Memindahkan...</translation>
 <translation id="8671210955687109937">Dapat berkomentar</translation>
 <translation id="8673026256276578048">Telusuri Web...</translation>
@@ -5387,6 +5403,7 @@
 <translation id="964286338916298286">Administrator IT telah menonaktifkan Chrome Goodies untuk perangkat Anda.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplikasi}other{Aplikasi}}</translation>
 <translation id="967007123645306417">Tindakan ini akan membuat Anda logout dari akun Google. Perubahan pada bookmark, histori, sandi, dan setelan lainnya tidak akan disinkronkan lagi dengan Akun Google Anda. Namun, data yang sudah ada akan tetap disimpan di Akun Google dan dapat dikelola di <ph name="BEGIN_LINK" />Google Dasbor<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Data disimpan</translation>
 <translation id="968000525894980488">Aktifkan layanan Google Play.</translation>
 <translation id="968174221497644223">Cache aplikasi</translation>
 <translation id="969096075394517431">Ubah bahasa</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index ad57d98..f58b763 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Mostra ortografia e grammatica</translation>
 <translation id="1593594475886691512">Formattazione in corso...</translation>
 <translation id="159359590073980872">Cache immagini</translation>
+<translation id="1593926297800505364">Salva il metodo di pagamento</translation>
 <translation id="1598233202702788831">Gli aggiornamenti sono stati disattivati dall'amministratore.</translation>
 <translation id="1600857548979126453">Accesso al backend del debugger delle pagine</translation>
 <translation id="1601560923496285236">Applica</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Impossibile aggiungere il dispositivo al dominio. Assicurati di non avere superato il numero di dispositivi che puoi aggiungere.</translation>
 <translation id="1744108098763830590">pagina di sfondo</translation>
 <translation id="1745520510852184940">Traduci sempre</translation>
+<translation id="1746417874336251387">Offre nuove funzionalità che usano la connessione del telefono per il Chromebook</translation>
 <translation id="174937106936716857">Numero totale di file</translation>
 <translation id="175196451752279553">R&amp;iapri scheda chiusa</translation>
 <translation id="1753905327828125965">Più visitati</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Non prima</translation>
 <translation id="1933809209549026293">Collega un mouse o una tastiera. Se utilizzi un dispositivo Bluetooth, assicurati che sia pronto per essere accoppiato.</translation>
 <translation id="1936157145127842922">Mostra nella cartella</translation>
+<translation id="1938351510777341717">Comando esterno</translation>
 <translation id="1940546824932169984">Dispositivi collegati</translation>
 <translation id="1942765061641586207">Risoluzione dell'immagine</translation>
+<translation id="1943097386230153518">Installa nuovo servizio</translation>
 <translation id="1944921356641260203">Aggiornamento trovato</translation>
 <translation id="1951615167417147110">Scorri una pagina</translation>
 <translation id="1954813140452229842">Errore durante il montaggio della condivisione. Verifica le tue credenziali e riprova.</translation>
@@ -1107,6 +1111,7 @@
 <translation id="2653659639078652383">Invia</translation>
 <translation id="265390580714150011">Valore campo</translation>
 <translation id="2654166010170466751">Consenti ai siti di installare gestori dei pagamenti</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Le funzionalità variano in base al dispositivo</translation>
 <translation id="2660779039299703961">Evento</translation>
 <translation id="266079277508604648">Impossibile connettere la stampante. Verifica che sia accesa e collegata al Chromebook tramite Wi-Fi o USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1213,6 +1218,7 @@
 <translation id="2803375539583399270">Inserisci PIN</translation>
 <translation id="2805646850212350655">Crittografia file system Microsoft</translation>
 <translation id="2805756323405976993">App</translation>
+<translation id="2806891468525657116">Scorciatoia già presente</translation>
 <translation id="2807517655263062534">I file scaricati vengono mostrati qui</translation>
 <translation id="2809586584051668049">e altre <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">È stata creata una nuova finestra nella sessione corrente del browser.</translation>
@@ -1597,6 +1603,7 @@
 <translation id="3428419049384081277">Hai eseguito l'accesso.</translation>
 <translation id="3429275422858276529">Aggiungi questa pagina ai preferiti per trovarla facilmente in seguito</translation>
 <translation id="3429599832623003132">$1 elementi</translation>
+<translation id="3430342160185525240">Consente all'assistente di mostrarti le notifiche.</translation>
 <translation id="3432227430032737297">Rimuovi tutti i cookie visualizzati</translation>
 <translation id="3432757130254800023">Invio di audio e video agli schermi sulla rete locale</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1961,6 +1968,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> nel Pannello di controllo.
 
   Vuoi avviare <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Impossibile creare scorciatoie</translation>
 <translation id="3943582379552582368">&amp;Indietro</translation>
 <translation id="3943857333388298514">Incolla</translation>
 <translation id="3948116654032448504">&amp;Cerca l'immagine su <ph name="SEARCH_ENGINE" /></translation>
@@ -2268,6 +2276,7 @@
 <translation id="4481530544597605423">Dispositivi disaccoppiati</translation>
 <translation id="4482194545587547824">Google può utilizzare la tua cronologia di navigazione per personalizzare la Ricerca e altri servizi Google</translation>
 <translation id="4495419450179050807">Non visualizzare in questa pagina</translation>
+<translation id="4499718683476608392">Attiva la Compilazione automatica per la carta di credito per compilare i moduli con un singolo clic</translation>
 <translation id="4500114933761911433">Arresto anomalo di <ph name="PLUGIN_NAME" /></translation>
 <translation id="450099669180426158">Icona punto esclamativo</translation>
 <translation id="4501530680793980440">Conferma rimozione</translation>
@@ -2546,7 +2555,6 @@
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> vuole comunicare con l'estensione "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Accetto</translation>
-<translation id="4920350943031252905">Esegui strumenti, editor e IDE di Linux sul tuo Chromebook.</translation>
 <translation id="4920887663447894854">Il monitoraggio della tua posizione da parte dei seguenti siti è stato bloccato su questa pagina:</translation>
 <translation id="492299503953721473">Rimuovi app Android</translation>
 <translation id="4923279099980110923">Sì, desidero dare il mio contributo</translation>
@@ -3111,6 +3119,7 @@
 <translation id="5752453871435543420">Backup nella cloud Chrome OS</translation>
 <translation id="5756163054456765343">Centro assistenza</translation>
 <translation id="5759728514498647443">I documenti inviati alla stampante tramite <ph name="APP_NAME" /> possono essere letti da <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Impostazioni per la carta di credito</translation>
 <translation id="5763751966069581670">Nessun dispositivo USB trovato</translation>
 <translation id="5764483294734785780">Sal&amp;va audio come...</translation>
 <translation id="57646104491463491">Data ultima modifica</translation>
@@ -3182,6 +3191,7 @@
 <translation id="5855773610748894548">Spiacenti, errore del modulo per la sicurezza.</translation>
 <translation id="5856721540245522153">Attiva funzioni di debug</translation>
 <translation id="5857090052475505287">Nuova cartella</translation>
+<translation id="585979798156957858">Meta esterno</translation>
 <translation id="5860033963881614850">Off</translation>
 <translation id="5860209693144823476">Scheda 3</translation>
 <translation id="5860491529813859533">Attiva</translation>
@@ -3491,6 +3501,7 @@
 <translation id="6327785803543103246">Rilevamento automatico proxy web</translation>
 <translation id="6333064448949140209">Il file sarà inviato a Google per il debug</translation>
 <translation id="6333834492048057036">Attivazione della barra degli indirizzi per la ricerca</translation>
+<translation id="6336451774241870485">Nuova scheda privata</translation>
 <translation id="6339668969738228384">Crea un nuovo profilo per <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Impossibile connettersi al server. Controlla la connessione di rete e riprova. Se il problema persiste, riavvia il Chromebook.</translation>
 <translation id="6340071272923955280">Protocollo di stampa Internet (IPPS)</translation>
@@ -3672,6 +3683,7 @@
 <translation id="6606070663386660533">Scheda 8</translation>
 <translation id="6607272825297743757">Info sul file</translation>
 <translation id="6607831829715835317">A&amp;ltri strumenti</translation>
+<translation id="6610147964972079463">Chiudi schede private</translation>
 <translation id="6612358246767739896">Contenuti protetti</translation>
 <translation id="6613452264606394692">Aggiungi questa pagina ai preferiti per ritrovarla rapidamente</translation>
 <translation id="6614893213975402384">Installa aggiornamenti e app. Se continui, accetti che questo dispositivo possa anche scaricare e installare automaticamente aggiornamenti e app di Google, del tuo operatore e del produttore del dispositivo, utilizzando anche la rete dati. Alcune di queste app potrebbero offrire acquisti in-app. Puoi rimuovere tali app in qualsiasi momento. <ph name="BEGIN_LINK1" />Ulteriori informazioni<ph name="END_LINK1" /></translation>
@@ -3742,6 +3754,7 @@
 <translation id="6710213216561001401">Indietro</translation>
 <translation id="6718273304615422081">Compressione...</translation>
 <translation id="671928215901716392">Blocco schermo</translation>
+<translation id="6720847671508630642">Condividi automaticamente il meglio di Android con il tuo Chromebook. Connetti il telefono per poter mandare SMS dal computer, condividere la connessione a Internet del telefono e sbloccare lo schermo del Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Ulteriori informazioni<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Accedere a marca e modello del token di sicurezza</translation>
 <translation id="6721972322305477112">&amp;File</translation>
 <translation id="672213144943476270">Sblocca il tuo profilo prima di navigare come ospite.</translation>
@@ -3888,6 +3901,7 @@
 <translation id="6970856801391541997">Stampa pagine specifiche</translation>
 <translation id="6972180789171089114">Audio/video</translation>
 <translation id="6973630695168034713">Cartelle</translation>
+<translation id="6974609594866392343">Modalità demo offline</translation>
 <translation id="6976108581241006975">Console JavaScript</translation>
 <translation id="6977381486153291903">Revisione firmware</translation>
 <translation id="6978121630131642226">Motori di ricerca</translation>
@@ -4030,6 +4044,7 @@
 <translation id="7175353351958621980">Caricamento da:</translation>
 <translation id="7180611975245234373">Aggiorna</translation>
 <translation id="7180865173735832675">Personalizza</translation>
+<translation id="7182359331070524176">Seleziona un album di Google Foto</translation>
 <translation id="7186088072322679094">Mantieni in barra degli strumenti</translation>
 <translation id="7187428571767585875">Voci del registro da rimuovere o modificare:</translation>
 <translation id="7189234443051076392">Assicurati di avere spazio sufficiente sul dispositivo</translation>
@@ -4479,6 +4494,7 @@
 <translation id="7857949311770343000">È la pagina Nuova scheda prevista?</translation>
 <translation id="786073089922909430">Servizio: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Download</translation>
+<translation id="7864662577698025113">Aggiungi nuovo servizio</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" />, accoppiato</translation>
 <translation id="7870730066603611552">Controlla le opzioni di sincronizzazione dopo la configurazione</translation>
@@ -4993,6 +5009,7 @@
 <translation id="8666584013686199826">Chiedi conferma quando un sito vuole accedere ai dispositivi USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ora è a schermo intero e ha disattivato il puntatore del mouse.</translation>
 <translation id="8669284339312441707">Più calda</translation>
+<translation id="8669919703154928649">Consenti all'assistente di mostrarti notifiche</translation>
 <translation id="8669949407341943408">Spostamento...</translation>
 <translation id="8671210955687109937">Può commentare</translation>
 <translation id="8673026256276578048">Cerca nel Web...</translation>
@@ -5380,6 +5397,7 @@
 <translation id="964286338916298286">Il tuo amministratore IT ha disattivato i vantaggi offerti da Chrome per il tuo dispositivo.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Applicazione}other{Applicazioni}}</translation>
 <translation id="967007123645306417">I tuoi account Google verranno scollegati. Le modifiche apportate a preferiti, cronologia, password e altre impostazioni non verranno più sincronizzate con il tuo account Google. I dati esistenti rimarranno invece memorizzati nel tuo account Google e potranno essere gestiti su <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Dati memorizzati</translation>
 <translation id="968000525894980488">Attiva Google Play Services.</translation>
 <translation id="968174221497644223">Cache applicazione</translation>
 <translation id="969096075394517431">Cambia le lingue</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 2d858e8..2867fc5a8 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">הצג איות ודקדוק</translation>
 <translation id="1593594475886691512">מפרמט...</translation>
 <translation id="159359590073980872">מטמון של תמונה</translation>
+<translation id="1593926297800505364">שמירת אמצעי התשלום</translation>
 <translation id="1598233202702788831">מנהל המערכת השבית את העדכונים.</translation>
 <translation id="1600857548979126453">להיכנס לניפוי הבאגים העורפי של הדף</translation>
 <translation id="1601560923496285236">החל</translation>
@@ -463,7 +464,7 @@
 <translation id="1673137583248014546">האתר <ph name="URL" /> מבקש לראות את היצרן והדגם של מפתח האבטחה שלך</translation>
 <translation id="167832068858235403">הפחתת עוצמת הקול</translation>
 <translation id="1679068421605151609">כלים עבור מפתחים</translation>
-<translation id="1680849702532889074">‏התרחשה שגיאה במהלך ההתקנה של אפליקציית Linux.</translation>
+<translation id="1680849702532889074">‏קרתה שגיאה במהלך ההתקנה של אפליקציית Linux.</translation>
 <translation id="16815041330799488">אין להתיר לאתרים לגשת לטקסט ותמונות שהועתקו ללוח</translation>
 <translation id="1682548588986054654">חלון נסתר חדש</translation>
 <translation id="168715261339224929">כדי שהסימניות שלך יופיעו בכל המכשירים, יש להפעיל סינכרון.</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">אי אפשר לצרף את המכשיר אל הדומיין. יש לוודא שלא חרגת ממספר המכשירים שניתן להוסיף.</translation>
 <translation id="1744108098763830590">דף רקע</translation>
 <translation id="1745520510852184940">עשה זאת תמיד</translation>
+<translation id="1746417874336251387">‏הצעה של תכונות חדשות שמשתמשות בחיבור הטלפון אל ה-Chromebook</translation>
 <translation id="174937106936716857">מספר הקבצים הכולל</translation>
 <translation id="175196451752279553">פ&amp;תח מחדש את הכרטיסייה הסגורה</translation>
 <translation id="1753905327828125965">עם המבקרים הרבים ביותר</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">לא לפני</translation>
 <translation id="1933809209549026293">‏חבר עכבר או מקלדת. אם ברצונך להשתמש במכשיר Bluetooth, ודא שהוא מוכן להתאמה.</translation>
 <translation id="1936157145127842922">הצג בתיקייה</translation>
+<translation id="1938351510777341717">‏מקש Command חיצוני</translation>
 <translation id="1940546824932169984">מכשירים מחוברים</translation>
 <translation id="1942765061641586207">רזולוציית תמונה</translation>
+<translation id="1943097386230153518">התקנת שירות חדש</translation>
 <translation id="1944921356641260203">נמצא עדכון</translation>
 <translation id="1951615167417147110">גלול מעלה דף אחד</translation>
 <translation id="1954813140452229842">קרתה שגיאה בטעינת התקן הרשת לשיתוף קבצים. יש לבדוק את פרטי הכניסה ולנסות שוב.</translation>
@@ -1105,6 +1109,7 @@
 <translation id="2653659639078652383">שלח</translation>
 <translation id="265390580714150011">ערך שדה </translation>
 <translation id="2654166010170466751">‏מתן הרשאה לאתרים להתקין מעבדי handler לתשלומים</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />במכשירים שונים יש תכונות שונות</translation>
 <translation id="2660779039299703961">אירוע</translation>
 <translation id="266079277508604648">‏לא ניתן להתחבר אל המדפסת. יש לוודא שהמדפסת פועלת ומחוברת אל ה-Chromebook דרך רשת ה-Wi-Fi או בחיבור USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1192,7 +1197,7 @@
 <translation id="2775104091073479743">עריכת טביעות האצבעות</translation>
 <translation id="2776441542064982094">נראה שאין מכשירים זמינים לרישום ברשת. אם המכשיר שלך מחובר לאינטרנט, נסה לרשום אותו מחדש באמצעות ההוראות המפורטות במדריך למשתמש שלו.</translation>
 <translation id="2781692009645368755">Google Pay</translation>
-<translation id="2782104745158847185">‏שגיאה במהלך ההתקנה של אפליקציית Linux</translation>
+<translation id="2782104745158847185">‏קרתה שגיאה במהלך ההתקנה של אפליקציית Linux</translation>
 <translation id="2783298271312924866">ההורדה בוצעה</translation>
 <translation id="2783321960289401138">צור קיצור דרך...</translation>
 <translation id="2783829359200813069">בחירת סוגי הצפנה</translation>
@@ -1211,6 +1216,7 @@
 <translation id="2803375539583399270">‏הזן PIN</translation>
 <translation id="2805646850212350655">‏מערכת קבצים מצפינה של Microsoft</translation>
 <translation id="2805756323405976993">אפליקציות</translation>
+<translation id="2806891468525657116">קיצור הדרך כבר קיים</translation>
 <translation id="2807517655263062534">קבצים שתוריד יופיעו כאן</translation>
 <translation id="2809586584051668049">ועוד <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">חלון חדש שנוצר בהפעלת דפדפן קיים.</translation>
@@ -1597,6 +1603,7 @@
 <translation id="3428419049384081277">התחברת!</translation>
 <translation id="3429275422858276529">כדאי לסמן את הדף עם סימניה כדי לגשת אליו בקלות בהמשך</translation>
 <translation id="3429599832623003132">$1 פריטים</translation>
+<translation id="3430342160185525240">‏Assistant יכול להציג הודעות.</translation>
 <translation id="3432227430032737297">הסר את כל התוכן המוצג</translation>
 <translation id="3432757130254800023">שליחה של קטעי אודיו וסרטונים למסכים ברשת המקומית</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1961,6 +1968,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> בלוח הבקרה.
 
 האם תרצה להפעיל את <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">לא ניתן ליצור קיצור דרך</translation>
 <translation id="3943582379552582368">&amp;אחורה</translation>
 <translation id="3943857333388298514">הדבק</translation>
 <translation id="3948116654032448504">בצע &amp;חיפוש תמונה ב-<ph name="SEARCH_ENGINE" /></translation>
@@ -2268,6 +2276,7 @@
 <translation id="4481530544597605423">מכשירים לא מותאמים</translation>
 <translation id="4482194545587547824">‏Google עשויה להשתמש בהיסטוריית הגלישה שלך כדי להתאים אישית את החיפוש ושירותים אחרים של Google</translation>
 <translation id="4495419450179050807">אל תציג בדף זה</translation>
+<translation id="4499718683476608392">התכונה 'מילוי אוטומטי' של כרטיסי אשראי יכולה למלא טפסים בקליק אחד</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> קרס</translation>
 <translation id="450099669180426158">סמל של סימן קריאה</translation>
 <translation id="4501530680793980440">אשר הסרה</translation>
@@ -2546,7 +2555,6 @@
 <translation id="4917385247580444890">חזק</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> רוצה לתקשר עם התוסף"<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">אשר</translation>
-<translation id="4920350943031252905">‏הפעלת כלים, עורכים וסביבות פיתוח משולבות (IDE) של Linux ב-Chromebook.</translation>
 <translation id="4920887663447894854">האתרים הבאים נחסמו ממעקב אחר המיקום שלך בדף זה:</translation>
 <translation id="492299503953721473">‏הסר אפליקציות Android</translation>
 <translation id="4923279099980110923">כן, אני רוצה לעזור</translation>
@@ -2772,7 +2780,7 @@
 <translation id="5264148714798105376">הפעולה יכולה להימשך כדקה.</translation>
 <translation id="5264252276333215551">התחבר לאינטרנט כדי להפעיל את היישום במצב קיוסק.</translation>
 <translation id="5265562206369321422">לא מקוונת במשך יותר משבוע</translation>
-<translation id="5265797726250773323">שגיאה במהלך ההתקנה</translation>
+<translation id="5265797726250773323">קרתה שגיאה במהלך ההתקנה</translation>
 <translation id="5266113311903163739">שגיאת ייבוא של רשות אישורים</translation>
 <translation id="5269977353971873915">ההדפסה נכשלה</translation>
 <translation id="5271549068863921519">שמור סיסמה</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">‏גיבוי בענן של מערכת ההפעלה של Chrome</translation>
 <translation id="5756163054456765343">מרכז עזרה</translation>
 <translation id="5759728514498647443">תוכל להשתמש ב-<ph name="APP_NAME" /> כדי לקרוא מסמכים שתשלח להדפסה באמצעות <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">הגדרות של כרטיסי אשראי</translation>
 <translation id="5763751966069581670">‏לא נמצאו התקני USB</translation>
 <translation id="5764483294734785780">ש&amp;מור שמע כ...</translation>
 <translation id="57646104491463491">תארך השינוי</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">אופס, שגיאה במודול המאובטח.</translation>
 <translation id="5856721540245522153">הפעל תכונות לניפוי באגים</translation>
 <translation id="5857090052475505287">תיקייה חדשה</translation>
+<translation id="585979798156957858">‏מקש Meta חיצוני</translation>
 <translation id="5860033963881614850">כבוי</translation>
 <translation id="5860209693144823476">כרטיסייה 3</translation>
 <translation id="5860491529813859533">הפעל</translation>
@@ -3214,7 +3224,7 @@
 <translation id="5908769186679515905">‏חסום הפעלה של Flash על-ידי אתרים</translation>
 <translation id="5910363049092958439">שמ&amp;ור תמונה כ...</translation>
 <translation id="5911737117543891828">‏תתבצע מחיקה של קבצים זמניים לא מקוונים ב-Google Drive. הקבצים שהגדרת לגישה במצב לא מקוון לא יימחקו מהמכשיר הזה.</translation>
-<translation id="5911887972742538906">‏התרחשה שגיאה במהלך ההתקנה של אפליקציית Linux.</translation>
+<translation id="5911887972742538906">‏קרתה שגיאה במהלך ההתקנה של אפליקציית Linux.</translation>
 <translation id="5912378097832178659">&amp;ערוך מנועי חיפוש...</translation>
 <translation id="5914724413750400082">מודולוס (<ph name="MODULUS_NUM_BITS" /> ביטים):
   <ph name="MODULUS_HEX_DUMP" />
@@ -3493,6 +3503,7 @@
 <translation id="6327785803543103246">‏גילוי אוטומטי של שרת proxy באינטרנט</translation>
 <translation id="6333064448949140209">‏הקובץ יישלח אל Google לניפוי באגים</translation>
 <translation id="6333834492048057036">מיקוד בסרגל כתובות לחיפוש</translation>
+<translation id="6336451774241870485">כרטיסיית פרטיות חדשה</translation>
 <translation id="6339668969738228384">צור פרופיל חדש בשביל <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">‏לא ניתן היה להתחבר אל השרת. יש לבדוק את חיבור הרשת ולנסות שוב. אם הבעיה ממשיכה, יש להפעיל מחדש את ה-Chromebook.</translation>
 <translation id="6340071272923955280">‏פרוטוקול הדפסה באינטרנט (IPPS)</translation>
@@ -3674,6 +3685,7 @@
 <translation id="6606070663386660533">כרטיסייה 8</translation>
 <translation id="6607272825297743757">פרטי הקובץ</translation>
 <translation id="6607831829715835317">כלים &amp;נוספים</translation>
+<translation id="6610147964972079463">סגירת כרטיסיות הפרטיות</translation>
 <translation id="6612358246767739896">תוכן מוגן</translation>
 <translation id="6613452264606394692">הוספת הדף לסימניות תאפשר גישה מהירה אליו</translation>
 <translation id="6614893213975402384">‏התקנת עדכונים ואפליקציות. הבחירה להמשיך תבטא הסכמה מצידך לכך שהמכשיר גם יוריד ויתקין באופן אוטומטי עדכונים ואפליקציות מ-Google, מספק השירות ומיצרן המכשיר. ייתכן שההורדה תיעשה באמצעות חבילת הגלישה. חלק מהאפליקציות האלה עשויות לכלול אפשרות לרכישות מהאפליקציה. תמיד אפשר להסיר את האפליקציות האלה. <ph name="BEGIN_LINK1" />מידע נוסף<ph name="END_LINK1" /></translation>
@@ -3744,6 +3756,7 @@
 <translation id="6710213216561001401">הקודם</translation>
 <translation id="6718273304615422081">דוחס...</translation>
 <translation id="671928215901716392">מסך נעילה</translation>
+<translation id="6720847671508630642">‏אפשר לשתף באופן אוטומטי את מיטב היכולות של Android עם ה-Chromebook. חיבור הטלפון מאפשר לך לשלוח הודעות טקסט מהמחשב, לשתף את חיבור האינטרנט של הטלפון ולבטל את נעילת מסך ה-Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">לראות את היצרן והדגם של מפתח האבטחה</translation>
 <translation id="6721972322305477112">&amp;קובץ</translation>
 <translation id="672213144943476270">בטל את נעילת הפרופיל שלך לפני גלישה כאורח.</translation>
@@ -3890,6 +3903,7 @@
 <translation id="6970856801391541997">הדפסת דפים ספציפיים</translation>
 <translation id="6972180789171089114">אודיו/וידאו</translation>
 <translation id="6973630695168034713">תיקיות</translation>
+<translation id="6974609594866392343">מצב הדגמה לא מקוון</translation>
 <translation id="6976108581241006975">‏לוח JavaScript</translation>
 <translation id="6977381486153291903">שכתוב קושחה</translation>
 <translation id="6978121630131642226">מנועי חיפוש</translation>
@@ -4032,6 +4046,7 @@
 <translation id="7175353351958621980">נטען מתוך:</translation>
 <translation id="7180611975245234373">רענן</translation>
 <translation id="7180865173735832675">התאם אישית</translation>
+<translation id="7182359331070524176">‏בחירת אלבום בתמונות Google</translation>
 <translation id="7186088072322679094">השאר בסרגל הכלים</translation>
 <translation id="7187428571767585875">ערכים בקובץ הרישום שיש להסיר או לשנות:</translation>
 <translation id="7189234443051076392">צריך לוודא שיש מספיק מקום פנוי במכשיר</translation>
@@ -4480,6 +4495,7 @@
 <translation id="7857949311770343000">האם זהו דף הכרטיסייה החדשה שציפית לראות?</translation>
 <translation id="786073089922909430">שירות: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;הורדות</translation>
+<translation id="7864662577698025113">הוספת שירות חדש</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{‏קובץ Cookie אחד}two{‏# קובצי Cookie}many{‏# קובצי Cookie}other{‏# קובצי Cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - מותאם</translation>
 <translation id="7870730066603611552">בדיקת אפשרויות הסינכרון אחרי ההגדרה</translation>
@@ -4994,6 +5010,7 @@
 <translation id="8666584013686199826">‏צריך לבקש ממני אישור כשאתר רוצה לגשת למכשירי USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> הוא כעת במסך מלא והשבית את סמן העכבר שלך.</translation>
 <translation id="8669284339312441707">חמים יותר</translation>
+<translation id="8669919703154928649">‏Assistant יכול להציג הודעות</translation>
 <translation id="8669949407341943408">מעביר...</translation>
 <translation id="8671210955687109937">יכול להגיב</translation>
 <translation id="8673026256276578048">חפש באינטרנט...</translation>
@@ -5381,6 +5398,7 @@
 <translation id="964286338916298286">‏מנהל המערכת שלך השבית את ההטבות של Chrome בשביל המכשיר שלך.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{אפליקציה}two{אפליקציות}many{אפליקציות}other{אפליקציות}}</translation>
 <translation id="967007123645306417">‏פעולה זו תוציא אותך מחשבונות Google שלך. שינויים בסימניות, בהיסטוריה, בסיסמאות ובהגדרות נוספות לא יסונכרנו יותר עם חשבון Google שלך. עם זאת, הנתונים הקיימים עדיין יאוחסנו בחשבון Google שלך ואפשר לנהל אותם ב<ph name="BEGIN_LINK" />מרכז השליטה של Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">נפח הנתונים</translation>
 <translation id="968000525894980488">‏מפעילים את שירותי Google Play.</translation>
 <translation id="968174221497644223">מטמון של יישום</translation>
 <translation id="969096075394517431">החלף שפות</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index ec12997..5f1c330 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">スペルと文法を表示</translation>
 <translation id="1593594475886691512">フォーマット中...</translation>
 <translation id="159359590073980872">画像キャッシュ</translation>
+<translation id="1593926297800505364">お支払い方法を保存</translation>
 <translation id="1598233202702788831">更新は管理者によって無効になっています。</translation>
 <translation id="1600857548979126453">ページ デバッガ バックエンドにアクセスする</translation>
 <translation id="1601560923496285236">適用</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">端末をドメインに追加できません。追加できる端末の上限数を超えていないかご確認ください。</translation>
 <translation id="1744108098763830590">バックグラウンド ページ</translation>
 <translation id="1745520510852184940">常に翻訳する</translation>
+<translation id="1746417874336251387">スマートフォンと Chromebook の接続を使用する新しい機能を利用できます</translation>
 <translation id="174937106936716857">合計ファイル数</translation>
 <translation id="175196451752279553">閉じたタブを開く(&amp;R)</translation>
 <translation id="1753905327828125965">よくアクセスするページ</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">開始時刻</translation>
 <translation id="1933809209549026293">マウスまたはキーボードを接続してください。Bluetooth デバイスを使用している場合は、ペア設定できる状態であることを確認してください。</translation>
 <translation id="1936157145127842922">フォルダで表示</translation>
+<translation id="1938351510777341717">外部コマンド</translation>
 <translation id="1940546824932169984">接続済みの端末</translation>
 <translation id="1942765061641586207">画像解像度</translation>
+<translation id="1943097386230153518">新しいサービスをインストール</translation>
 <translation id="1944921356641260203">アップデートが見つかりました</translation>
 <translation id="1951615167417147110">1 ページ上にスクロールする</translation>
 <translation id="1954813140452229842">共有フォルダのマウントエラー。認証情報を確認してもう一度お試しください。</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">送信</translation>
 <translation id="265390580714150011">フィールド値</translation>
 <translation id="2654166010170466751">サイトに支払いハンドラのインストールを許可</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />機能は端末によって異なります</translation>
 <translation id="2660779039299703961">イベント</translation>
 <translation id="266079277508604648">プリンタに接続できません。プリンタの電源が入っていて、Wi-Fi または USB 経由で Chromebook に接続されていることを確認してください。</translation>
 <translation id="2661146741306740526">16×9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">PIN を入力</translation>
 <translation id="2805646850212350655">Microsoft 暗号化ファイル システム</translation>
 <translation id="2805756323405976993">アプリ</translation>
+<translation id="2806891468525657116">ショートカットがすでに存在します</translation>
 <translation id="2807517655263062534">ダウンロードしたファイルがここに表示されます</translation>
 <translation id="2809586584051668049">、他 <ph name="NUMBER_ADDITIONAL_DISABLED" /> 件</translation>
 <translation id="281133045296806353">既存のブラウザ セッションに新しいウィンドウが作成されました。</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">ログインしました</translation>
 <translation id="3429275422858276529">後で見つけやすいようにこのページをブックマークできます</translation>
 <translation id="3429599832623003132">$1 アイテム</translation>
+<translation id="3430342160185525240">アシスタントの通知を有効にします。</translation>
 <translation id="3432227430032737297">表示中のサイトをすべて削除</translation>
 <translation id="3432757130254800023">映像と音声をローカル ネットワーク経由でディスプレイに送信する</translation>
 <translation id="3432762828853624962">共有ワーカー</translation>
@@ -1964,6 +1971,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> を使用してプログラムをアンインストールする必要があります。
 
 <ph name="CONTROL_PANEL_APPLET_NAME" /> を開きますか?</translation>
+<translation id="394183848452296464">ショートカットを作成できません</translation>
 <translation id="3943582379552582368">戻る(&amp;B)</translation>
 <translation id="3943857333388298514">貼り付け</translation>
 <translation id="3948116654032448504"><ph name="SEARCH_ENGINE" /> で画像を検索(&amp;S)</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">ペア設定されていないデバイス</translation>
 <translation id="4482194545587547824">検索やその他の Google サービスをカスタマイズする目的で、Google が閲覧履歴を使用することがあります</translation>
 <translation id="4495419450179050807">このページに表示しない</translation>
+<translation id="4499718683476608392">フォームにクレジット カード情報をワンクリックで自動入力できるようにします</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> で問題が発生しました</translation>
 <translation id="450099669180426158">感嘆符アイコン</translation>
 <translation id="4501530680793980440">削除の確認</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">強い</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> が拡張機能「<ph name="EXTENSION_NAME" />」との通信をリクエストしています</translation>
 <translation id="4918086044614829423">承諾</translation>
-<translation id="4920350943031252905">Chromebook で Linux のツール、エディタ、IDE を実行します。</translation>
 <translation id="4920887663447894854">以下のサイトは、このページ内であなたの現在地を追跡できないようブロックされています:</translation>
 <translation id="492299503953721473">Android アプリを削除</translation>
 <translation id="4923279099980110923">はい、協力します</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Chrome OS のクラウド バックアップ</translation>
 <translation id="5756163054456765343">ヘルプセンター(&amp;E)</translation>
 <translation id="5759728514498647443">「<ph name="APP_NAME" />」を使用して印刷に送信したドキュメントは「<ph name="APP_NAME" />」で読めます。</translation>
+<translation id="5762172915276660232">クレジット カードの設定</translation>
 <translation id="5763751966069581670">USB デバイスが見つかりませんでした</translation>
 <translation id="5764483294734785780">名前を付けてオーディオを保存(&amp;V)...</translation>
 <translation id="57646104491463491">更新日</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">セキュア モジュール エラー。</translation>
 <translation id="5856721540245522153">デバッグ機能を有効にする</translation>
 <translation id="5857090052475505287">新しいフォルダ</translation>
+<translation id="585979798156957858">外部メタキー</translation>
 <translation id="5860033963881614850">オフ</translation>
 <translation id="5860209693144823476">タブ 3</translation>
 <translation id="5860491529813859533">オンにする</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">ウェブプロキシ自動検出</translation>
 <translation id="6333064448949140209">ファイルはデバッグのため Google に送信されます</translation>
 <translation id="6333834492048057036">検索のためアドレスバーにフォーカスを移動</translation>
+<translation id="6336451774241870485">新しいプライベート タブ</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> の新しいプロフィールを作成します</translation>
 <translation id="6340017061976355871">サーバーに接続できませんでした。ネットワーク接続を確認してもう一度お試しください。問題が解決しない場合は、Chromebook を再起動してください。</translation>
 <translation id="6340071272923955280">インターネット印刷プロトコル(IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">タブ 8</translation>
 <translation id="6607272825297743757">ファイル情報</translation>
 <translation id="6607831829715835317">その他のツール(&amp;L)</translation>
+<translation id="6610147964972079463">プライベート タブを閉じる</translation>
 <translation id="6612358246767739896">保護されたコンテンツ</translation>
 <translation id="6613452264606394692">このページをブックマークすると、すばやくこのページに戻ることができます</translation>
 <translation id="6614893213975402384">アップデートとアプリをインストールします。続行すると、Google、携帯通信会社、端末の製造元からのアップデートやアプリも端末で自動的にダウンロードおよびインストールされる場合があることについて、同意したものと見なされます(ダウンロードの際にはモバイルデータ通信が使用される可能性もあります)。こうしたアプリの一部ではアプリ内購入をすすめられる場合があります。こうしたアプリはいつでも削除できます。<ph name="BEGIN_LINK1" />詳細<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">前へ</translation>
 <translation id="6718273304615422081">圧縮しています...</translation>
 <translation id="671928215901716392">画面をロック</translation>
+<translation id="6720847671508630642">Android の便利な機能を自動的に Chromebook で共有できます。スマートフォンと接続して、パソコンからメッセージを送信したり、スマートフォンのインターネット接続を共有したり、Chromebook の画面のロックを解除したりすることが可能です。<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />詳細<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">セキュリティ キーのメーカーとモデルの読み取り</translation>
 <translation id="6721972322305477112">ファイル(&amp;F)</translation>
 <translation id="672213144943476270">ゲストとしてブラウジングするにはまずプロフィールのロックを解除してください。</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">指定したページを印刷</translation>
 <translation id="6972180789171089114">音声または動画</translation>
 <translation id="6973630695168034713">フォルダ</translation>
+<translation id="6974609594866392343">オフライン デモモード</translation>
 <translation id="6976108581241006975">JavaScript コンソール</translation>
 <translation id="6977381486153291903">ファームウェア リビジョン</translation>
 <translation id="6978121630131642226">検索エンジン</translation>
@@ -4034,6 +4048,7 @@
 <translation id="7175353351958621980">ロード元:</translation>
 <translation id="7180611975245234373">更新</translation>
 <translation id="7180865173735832675">カスタマイズ</translation>
+<translation id="7182359331070524176">Google フォトアルバムを選択</translation>
 <translation id="7186088072322679094">ツールバーに残す</translation>
 <translation id="7187428571767585875">削除または変更されるレジストリ項目:</translation>
 <translation id="7189234443051076392">端末に十分な空き容量があることを確認してください</translation>
@@ -4486,6 +4501,7 @@
 <translation id="7857949311770343000">この新しいタブ ページでよろしいですか?</translation>
 <translation id="786073089922909430">サービス: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">ダウンロード(&amp;D)</translation>
+<translation id="7864662577698025113">新しいサービスを追加</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 件の Cookie}other{# 件の Cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - ペア設定済み</translation>
 <translation id="7870730066603611552">設定後に同期オプションを確認する</translation>
@@ -5000,6 +5016,7 @@
 <translation id="8666584013686199826">サイトから USB デバイスへのアクセス許可を求められたときに確認する</translation>
 <translation id="8667328578593601900">現在 <ph name="FULLSCREEN_ORIGIN" /> は全画面表示で、マウス カーソルは無効です。</translation>
 <translation id="8669284339312441707">暖色</translation>
+<translation id="8669919703154928649">アシスタントの通知を許可する</translation>
 <translation id="8669949407341943408">移動しています...</translation>
 <translation id="8671210955687109937">閲覧者(コメント可)</translation>
 <translation id="8673026256276578048">ウェブ検索...</translation>
@@ -5387,6 +5404,7 @@
 <translation id="964286338916298286">お使いのデバイスの Chrome 特典は IT 管理者によって無効にされています。</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{アプリケーション}other{アプリケーション}}</translation>
 <translation id="967007123645306417">この操作を行うと Google アカウントからログアウトします。ブックマーク、履歴、パスワードなどの設定に行った変更は Google アカウントと同期されなくなります。ただし、既存のデータは Google アカウントに保存されたまま残り、<ph name="BEGIN_LINK" />Google ダッシュボード<ph name="END_LINK" />で管理できます。</translation>
+<translation id="967624055006145463">保存データ</translation>
 <translation id="968000525894980488">Google Play 開発者サービスを有効にします。</translation>
 <translation id="968174221497644223">アプリケーション キャッシュ</translation>
 <translation id="969096075394517431">言語を変更</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 1964b77..7cda3d3 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">ಕಾಗುಣಿತ ಮತ್ತು ವ್ಯಾಕರಣ ತೋರಿಸು</translation>
 <translation id="1593594475886691512">ಸ್ವರೂಪಣೆ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="159359590073980872">ಚಿತ್ರದ ಸಂಗ್ರಹ</translation>
+<translation id="1593926297800505364">ಪಾವತಿ ವಿಧಾನವನ್ನು ಉಳಿಸಿ</translation>
 <translation id="1598233202702788831">ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation>
 <translation id="1600857548979126453">ಡೀಬಗರ್ ಅನ್ನು ಹಿಂತೆಗೆದುಕೊಳ್ಳುವ ಪುಟವನ್ನು ಪ್ರವೇಶಿಸಿ</translation>
 <translation id="1601560923496285236">ಅನ್ವಯಿಸು</translation>
@@ -416,7 +417,7 @@
 <translation id="1618268899808219593">ಸ&amp;ಹಾಯ ಕೇಂದ್ರ</translation>
 <translation id="162035744160882748">ಸಿಂಕ್, ವೈಯಕ್ತೀಕರಣ ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿ</translation>
 <translation id="1620510694547887537">ಕ್ಯಾಮರಾ</translation>
-<translation id="1623132449929929218">ಚಿತ್ರಗಳು ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ. ವಾಲ್‌ಪೇಪರ್ ಸಂಗ್ರಹಗಳನ್ನು ನೋಡಲು ದಯವಿಟ್ಟು ಇಂಟರ್ನೆಟ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ.</translation>
+<translation id="1623132449929929218">ಚಿತ್ರಗಳು ಪ್ರಸ್ತುತ ಲಭ್ಯವಿಲ್ಲ. ವಾಲ್‌ಪೇಪರ್ ಸಂಗ್ರಹಗಳನ್ನು ನೋಡಲು ದಯವಿಟ್ಟು ಇಂಟರ್ನೆಟ್‌ಗೆ ಮರುಸಂಪರ್ಕಿಸಿ.</translation>
 <translation id="1624026626836496796">ಇದು ಒಂದು ಬಾರಿ ಮಾತ್ರ ಸಂಭವಿಸುತ್ತದೆ, ಹಾಗೂ ನಿಮ್ಮ ರುಜುವಾತುಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು ಆಗುವುದಿಲ್ಲ.</translation>
 <translation id="1627276047960621195">ಫೈಲ್ ವಿವರಣೆಗಳು</translation>
 <translation id="1627408615528139100">ಈಗಾಗಲೇ ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">ಡೊಮೇನ್‌ಗೆ ಸಾಧನವನ್ನು ಸೇರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ನೀವು ಸೇರಿಸಬಹುದಾದ ಸಾಧನಗಳ ಸಂಖ್ಯೆಯನ್ನು ಮೀರಿಲ್ಲ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="1744108098763830590">ಹಿನ್ನೆಲೆ ಪುಟ</translation>
 <translation id="1745520510852184940">ಯಾವಾಗಲೂ ಇದನ್ನು ಮಾಡಿ</translation>
+<translation id="1746417874336251387">ನಿಮ್ಮ ಫೋನ್‌ನ ಸಂಪರ್ಕವನ್ನು ಬಳಸುವ ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು Chromebook ಗೆ ಒದಗಿಸಿ</translation>
 <translation id="174937106936716857">ಒಟ್ಟು ಫೈಲ್‌ ಎಣಿಕೆ</translation>
 <translation id="175196451752279553">ಮುಚ್ಚಿದ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮತ್ತೆ ತೆರೆಯಿರಿ</translation>
 <translation id="1753905327828125965">ಅತಿಹೆಚ್ಚು ಬಾರಿ ಸಂದರ್ಶಿಸಿರುವುದು</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">ಅದಕ್ಕಿಂತ ಮೊದಲಲ್ಲ</translation>
 <translation id="1933809209549026293">ದಯವಿಟ್ಟು ಮೌಸ್‌ ಅಥವಾ ಕೀಬೋರ್ಡ್‌ ಸಂಪರ್ಕಿಸಿ. ನೀವು ಬ್ಲೂಟೂತ್‌ ಸಾಧನವನ್ನು ಬಳಸುತ್ತಿದ್ದರೆ, ಜೋಡಿಸಲು ಅದು ಸಿದ್ಧವಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ.</translation>
 <translation id="1936157145127842922">ಫೋಲ್ಡರ್‌ನಲ್ಲಿ ತೋರಿಸಿ</translation>
+<translation id="1938351510777341717">ಬಾಹ್ಯ ಕಮಾಂಡ್ ಕೀ</translation>
 <translation id="1940546824932169984">ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನಗಳು</translation>
 <translation id="1942765061641586207">ಚಿತ್ರದ ರೆಸಲ್ಯೂಷನ್‌‌</translation>
+<translation id="1943097386230153518">ಹೊಸ ಸೇವೆಯನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ</translation>
 <translation id="1944921356641260203">ಅಪ್‌ಡೇಟ್‌‌ ಕಂಡುಬಂದಿದೆ</translation>
 <translation id="1951615167417147110">ಒಂದು ಪುಟವನ್ನು ಮೇಲಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation>
 <translation id="1954813140452229842">ಹಂಚಿಕೆಯನ್ನು ಅಳವಡಿಸುವುದರಲ್ಲಿ ದೋಷವಿದೆ. ನಿಮ್ಮ ರುಜುವಾತುಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
@@ -1105,6 +1109,7 @@
 <translation id="2653659639078652383">ಸಲ್ಲಿಸು</translation>
 <translation id="265390580714150011">ಕ್ಷೇತ್ರ ಮೌಲ್ಯ</translation>
 <translation id="2654166010170466751">ಪಾವತಿ ಹ್ಯಾಂಡ್‌ಲರ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಲು ಸೈಟ್‌ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಅನುಮತಿಸಿ</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />ಸಾಧನದಿಂದ ಸಾಧನಕ್ಕೆ ವೈಶಿಷ್ಟ್ಯಗಳು ಬದಲಾಗುತ್ತವೆ</translation>
 <translation id="2660779039299703961">ಈವೆಂಟ್</translation>
 <translation id="266079277508604648">ಪ್ರಿಂಟರ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ಪ್ರಿಂಟರ್ ಆನ್ ಆಗಿದೆಯೇ ಮತ್ತು ಅದು ನಿಮ್ಮ Chromebook ಗೆ ವೈ-ಫೈ ಅಥವಾ USB ಮೂಲಕ ಸಂಪರ್ಕ ಹೊಂದಿದೆಯೇ ಎಂದು ಪರಿಶೀಲಿಸಿ.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1211,6 +1216,7 @@
 <translation id="2803375539583399270">ಪಿನ್ ನಮೂದಿಸಿ</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">ಆಪ್ಸ್‌‌</translation>
+<translation id="2806891468525657116">ಶಾರ್ಟ್‌ಕಟ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ</translation>
 <translation id="2807517655263062534">ನೀವು ಡೌನ್‌ಲೋಡ್ ಮಾಡಿದ ಫೈಲ್‌ಗಳು ಇಲ್ಲಿ ಕಾಣಿಸಿಕೊಳ್ಳುತ್ತವೆ</translation>
 <translation id="2809586584051668049">ಮತ್ತು <ph name="NUMBER_ADDITIONAL_DISABLED" /> ಇನ್ನಷ್ಟು</translation>
 <translation id="281133045296806353">ಪ್ರಸ್ತುತ ಬ್ರೌಸರ್ ಅವಧಿಯಲ್ಲಿ ಹೊಸ ವಿಂಡೋವನ್ನು ರಚಿಸಲಾಗಿದೆ.</translation>
@@ -1597,6 +1603,7 @@
 <translation id="3428419049384081277">ನೀವೀಗ ಸೈನ್‌ ಇನ್‌ ಆಗಿರುವಿರಿ!</translation>
 <translation id="3429275422858276529">ಈ ಪುಟವನ್ನು ನಂತರ ಸುಲಭವಾಗಿ ಹುಡುಕಲು ಬುಕ್‌ಮಾರ್ಕ್‌ ಮಾಡಿ</translation>
 <translation id="3429599832623003132">$1 ಐಟಂಗಳು</translation>
+<translation id="3430342160185525240">ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಲು ಅಸಿಸ್ಟೆಂಟ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ.</translation>
 <translation id="3432227430032737297">ತೋರಿಸಿರುವ ಎಲ್ಲವನ್ನೂ ತೆಗೆದುಹಾಕು</translation>
 <translation id="3432757130254800023">ಸ್ಥಳೀಯ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಪ್ರದರ್ಶನಗಳಿಗೆ ಆಡಿಯೊ ಮತ್ತು ವೀಡಿಯೊ ಕಳುಹಿಸಿ</translation>
 <translation id="3432762828853624962">ಹಂಚಿಕೊಳ್ಳಲಾದ ಕೆಲಸಗಾರರು</translation>
@@ -1961,6 +1968,7 @@
   ನೀವದನ್ನು ಅಸ್ಥಾಪಿಸಬೇಕಾಗುತ್ತದೆ.
 
   ನೀವು <ph name="CONTROL_PANEL_APPLET_NAME" /> ಪ್ರಾರಂಭಿಸಲು ಬಯಸುವಿರಾ?</translation>
+<translation id="394183848452296464">ಶಾರ್ಟ್‌ಕಟ್ ರಚಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
 <translation id="3943582379552582368">&amp;ಹಿಂದೆ</translation>
 <translation id="3943857333388298514">ಅಂಟಿಸು</translation>
 <translation id="3948116654032448504">ಚಿತ್ರಕ್ಕಾಗಿ <ph name="SEARCH_ENGINE" /> ಹುಡು&amp;ಕಿ</translation>
@@ -2268,6 +2276,7 @@
 <translation id="4481530544597605423">ಜೋಡಿಯಾಗಿರದ ಸಾಧನಗಳು</translation>
 <translation id="4482194545587547824">ಶೋಧ ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಲು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಇತಿಹಾಸವನ್ನು Google ಬಳಸಬಹುದು</translation>
 <translation id="4495419450179050807">ಈ ಪುಟದಲ್ಲಿ ತೋರಿಸಬೇಡ</translation>
+<translation id="4499718683476608392">ಫಾರ್ಮ್‌ಗಳನ್ನು ಒಂದೇ ಕ್ಲಿಕ್‌ನಲ್ಲಿ ಭರ್ತಿ ಮಾಡಲು, ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸ್ವಯಂ ಭರ್ತಿ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ಕ್ರ್ಯಾಶ್ ಆಗಿದೆ</translation>
 <translation id="450099669180426158">ಆಶ್ಚರ್ಯಕರ ಚಿಹ್ನೆಯ ಐಕಾನ್</translation>
 <translation id="4501530680793980440">ತೆಗೆದುಹಾಕುವಿಕೆಯನ್ನು ದೃಢೀಕರಿಸಿ</translation>
@@ -2547,7 +2556,6 @@
 <translation id="4917385247580444890">ಪ್ರಬಲ</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ಅವರು "<ph name="EXTENSION_NAME" />" ವಿಸ್ತರಣೆಯ ಜೊತೆಗೆ ಸಂವಹಿಸಲು ಬಯಸುತ್ತಾರೆ</translation>
 <translation id="4918086044614829423">ಸಮ್ಮತಿಸು</translation>
-<translation id="4920350943031252905">ನಿಮ್ಮ Chromebook ನಲ್ಲಿ Linux ಪರಿಕರಗಳು, ಎಡಿಟರ್‌ಗಳು ಮತ್ತು IDE ಗಳನ್ನು ರನ್ ಮಾಡಿ</translation>
 <translation id="4920887663447894854">ಈ ಪುಟದಲ್ಲಿ ನಿಮ್ಮ ಸ್ಥಾನವನ್ನು ನಿಗಾ ಇರಿಸದಂತೆ ಮುಂದಿನ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ:</translation>
 <translation id="492299503953721473">Android ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ತೆಗೆದುಹಾಕು</translation>
 <translation id="4923279099980110923">ಹೌದು, ನಾನು ಸಹಾಯ ಮಾಡಬೇಕೆಂದಿದ್ದೇನೆ</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Chrome OS ಮೇಘ ಬ್ಯಾಕಪ್</translation>
 <translation id="5756163054456765343">ಸ&amp;ಹಾಯ ಕೇಂದ್ರ</translation>
 <translation id="5759728514498647443">ನೀವು <ph name="APP_NAME" /> ಮೂಲಕ ಪ್ರಿಂಟ್ ಮಾಡಲು ಕಳುಹಿಸುವ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳನ್ನು <ph name="APP_NAME" /> ಮೂಲಕ ಓದಬಹುದಾಗಿದೆ.</translation>
+<translation id="5762172915276660232">ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="5763751966069581670">ಯಾವುದೇ USB ಸಾಧನಗಳು ಕಂಡುಬಂದಿಲ್ಲ</translation>
 <translation id="5764483294734785780">ಇದರಂತೆ ಆಡಿಯೋ ಉ&amp;ಳಿಸಿ...</translation>
 <translation id="57646104491463491">ದಿನಾಂಕ ಮಾರ್ಪಡಿಸಿದೆ</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">ಓಹ್, ಸುಭದ್ರ ಮಾಡ್ಯೂಲ್‌ನಲ್ಲಿ ದೋಷ ಕಂಡುಬಂದಿದೆ.</translation>
 <translation id="5856721540245522153">ಡೀಬಗ್ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="5857090052475505287">ಹೊಸ ಫೋಲ್ಡರ್</translation>
+<translation id="585979798156957858">ಬಾಹ್ಯ ಮೆಟಾ ಕೀ</translation>
 <translation id="5860033963881614850">ಆಫ್</translation>
 <translation id="5860209693144823476">ಟ್ಯಾಬ್ 3</translation>
 <translation id="5860491529813859533">ಆನ್ ಮಾಡಿ</translation>
@@ -3493,6 +3503,7 @@
 <translation id="6327785803543103246">ವೆಬ್‌ ಪ್ರಾಕ್ಸಿಯ ಸ್ವಯಂಅನ್ವೇಷಣೆ</translation>
 <translation id="6333064448949140209">ಡೀಬಗ್ ಮಾಡಲು Google ಗೆ ಫೈಲ್ ಕಳುಹಿಸಲಾಗುತ್ತದೆ</translation>
 <translation id="6333834492048057036">ಹುಡುಕುವುದಕ್ಕೆ ವಿಳಾಸ ಪಟ್ಟಿಯನ್ನು ಗಮನಿಸಿ</translation>
+<translation id="6336451774241870485">ಹೊಸ ಖಾಸಗಿ ಟ್ಯಾಬ್</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> ಗೆ ಹೊಸ ಪ್ರೊಫೈಲ್ ಅನ್ನು ರಚಿಸಿ</translation>
 <translation id="6340017061976355871">ಸರ್ವರ್‌ ಮೂಲಕ ಸಂಪರ್ಕಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ ಸಂಪರ್ಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ. ಸಮಸ್ಯೆ ಮುಂದುವರಿದರೆ, ನಿಮ್ಮ Chromebook ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation>
 <translation id="6340071272923955280">ಇಂಟರ್ನೆಟ್ ಮುದ್ರಿಸುವಿಕೆಯ ಪ್ರೊಟೊಕಾಲ್ (IPPS)</translation>
@@ -3673,6 +3684,7 @@
 <translation id="6606070663386660533">ಟ್ಯಾಬ್ 8</translation>
 <translation id="6607272825297743757">ಫೈಲ್ ಮಾಹಿತಿ</translation>
 <translation id="6607831829715835317">ಹೆಚ್ಚಿನ ಪರಿ&amp;ಕರಗಳು</translation>
+<translation id="6610147964972079463">ಖಾಸಗಿ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮುಚ್ಚಿ</translation>
 <translation id="6612358246767739896">ಸಂರಕ್ಷಿಸಿದ ವಿಷಯ</translation>
 <translation id="6613452264606394692">ಈ ಪುಟವನ್ನು ಬುಕ್‌ಮಾರ್ಕ್‌ ಮಾಡುವ ಮೂಲಕ ಬಳಕೆಗೆ ವೇಗವಾಗಿ ಮರಳಿ ಬನ್ನಿ</translation>
 <translation id="6614893213975402384">ಅಪ್‌ಡೇಟ್‌ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಿ. ಮುಂದುವರಿಸುವ ಮೂಲಕ, ಈ ಸಾಧನವು ಸಂಭಾವ್ಯವಾಗಿ ಸೆಲ್ಯುಲರ್ ಡೇಟಾ ಬಳಸಿ Google, ನಿಮ್ಮ ವಾಹಕ, ಮತ್ತು ನಿಮ್ಮ ಸಾಧನದ ತಯಾರಕರಿಂದ ಅಪ್‌ಡೇಟ್‌ಗಳು ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಸಹ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡಬಹುದು ಹಾಗೂ ಇನ್‌ಸ್ಟಾಲ್ ಮಾಡಬಹುದು ಎಂದು ನೀವು ಒಪ್ಪಿಕೊಳ್ಳುತ್ತೀರಿ. ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಪೈಕಿ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್‍ಗಳು ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿನ ಖರೀದಿಗಳಿಗೆ ಆಫರ್ ಮಾಡಬಹುದು. ಈ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನೀವು ಯಾವ ಸಮಯದಲ್ಲಾದರೂ ತೆಗೆದುಹಾಕಬಹುದು. <ph name="BEGIN_LINK1" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation>
@@ -3743,6 +3755,7 @@
 <translation id="6710213216561001401">ಹಿಂದೆ</translation>
 <translation id="6718273304615422081">ಜಿಪ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="671928215901716392">ಪರದೆಯನ್ನು ಲಾಕ್ ಮಾಡಿ</translation>
+<translation id="6720847671508630642">ನಿಮ್ಮ Chromebook ಮೂಲಕ Android ನ ಅತ್ಯುತ್ತಮ ವಿಷಯಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಹಂಚಿಕೊಳ್ಳಿ. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಿಂದ ಪಠ್ಯ ಸಂದೇಶ ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುವಂತೆ ನಿಮ್ಮ ಫೋನ್ ಅನ್ನು ಸಂಪರ್ಕಿಸಿ, ನಿಮ್ಮ ಫೋನ್‌ನ ಇಂಟರ್ನೆಟ್ ಸಂಪರ್ಕವನ್ನು ಹಂಚಿಕೊಳ್ಳಿ ಮತ್ತು ನಿಮ್ಮ Chromebook ಪರದೆಯನ್ನು ಅನ್‌ಲಾಕ್ ಮಾಡಿ.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">ನಿಮ್ಮ ಸುರಕ್ಷತಾ ಕೀಯ ತಯಾರಕರ ಬ್ರಾಂಡ್ ಹೆಸರು ಮತ್ತು ಮಾದರಿಯನ್ನು ನೋಡಿ</translation>
 <translation id="6721972322305477112">&amp;ಫೈಲ್</translation>
 <translation id="672213144943476270">ಅಥಿತಿಯಾಗಿ ಬ್ರೌಸ್ ಮಾಡುವ ಮೊದಲು ದಯವಿಟ್ಟು ನಿಮ್ಮ ಪ್ರೊಫೈಲ್‌ ಅನ್ನು ಅನ್‌ಲಾಕ್‌ ಮಾಡಿ.</translation>
@@ -3888,6 +3901,7 @@
 <translation id="6970856801391541997">ನಿರ್ದಿಷ್ಟ ಪುಟಗಳನ್ನು ಮುದ್ರಿಸಿ</translation>
 <translation id="6972180789171089114">ಆಡಿಯೋ/ವೀಡಿಯೊ</translation>
 <translation id="6973630695168034713">ಫೋಲ್ಡರ್‌ಗಳು</translation>
+<translation id="6974609594866392343">ಆಫ್‌ಲೈನ್ ಡೆಮೊ ಮೋಡ್</translation>
 <translation id="6976108581241006975">JavaScript ಕನ್ಸೋಲ್</translation>
 <translation id="6977381486153291903">ಫರ್ಮ್‌ವೇರ್ ಮರುಪರಿಶೀಲನೆ</translation>
 <translation id="6978121630131642226">ಹುಡುಕಾಟ ಇಂಜಿನ್‌ಗಳು</translation>
@@ -4476,6 +4490,7 @@
 <translation id="7857949311770343000">ನೀವು ನಿರೀಕ್ಷಿಸುತ್ತಿರುವುದು ಈ ಹೊಸ ಟ್ಯಾಬ್ ಪುಟವೇ?</translation>
 <translation id="786073089922909430">ಸೇವೆ: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;ಡೌನ್‌ಲೋಡ್‌ಗಳು</translation>
+<translation id="7864662577698025113">ಹೊಸ ಸೇವೆಯನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 ಕುಕೀ}one{# ಕುಕೀಗಳು}other{# ಕುಕೀಗಳು}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - ಜೋಡಿಸಲಾಗಿದೆ</translation>
 <translation id="7870730066603611552">ಸೆಟಪ್ ನಂತರ ಸಿಂಕ್ ಆಯ್ಕೆಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
@@ -4991,6 +5006,7 @@
 <translation id="8666584013686199826">ಒಂದು ಸೈಟ್ USB ಸಾಧನಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಬಯಸಿದಾಗ ಕೇಳಿ</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ಇದೀಗ ಪೂರ್ಣ ಪರದೆಯಾಗಿದೆ ಮತ್ತು ನಿಮ್ಮ ಮೌಸ್ ಕರ್ಸರ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದೆ.</translation>
 <translation id="8669284339312441707">ವಾರ್ಮರ್</translation>
+<translation id="8669919703154928649">ನಿಮಗೆ ಅಧಿಸೂಚನೆಗಳನ್ನು ತೋರಿಸಲು ಅಸಿಸ್ಟೆಂಟ್‌ಗೆ ಅನುಮತಿ ನೀಡಿ</translation>
 <translation id="8669949407341943408">ಸರಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="8671210955687109937">ಕಾಮೆಂಟ್ ಮಾಡಬಹುದು</translation>
 <translation id="8673026256276578048">ವೆಬ್ ಹುಡುಕಿ...</translation>
@@ -5379,6 +5395,7 @@
 <translation id="964286338916298286">ನಿಮ್ಮ ಐಟಿ ನಿರ್ವಾಹಕರು ನಿಮ್ಮ ಸಾಧನಕ್ಕೆ Chrome ನ ಗುಡೀಸ್‌ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದ್ದಾರೆ.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{ಅಪ್ಲಿಕೇಶನ್}one{ಅಪ್ಲಿಕೇಶನ್‌ಗಳು}other{ಅಪ್ಲಿಕೇಶನ್‌ಗಳು}}</translation>
 <translation id="967007123645306417">ಇದು ನಿಮ್ಮ Google ಖಾತೆಗಳಿಂದ ನಿಮ್ಮನ್ನು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತದೆ. ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ಮಾಡಲಾಗುವ ಬದಲಾವಣೆಗಳನ್ನು ಇನ್ನು ಮುಂದೆ Google ಖಾತೆಗೆ ಸಿಂಕ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಆದಾಗ್ಯೂ, ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿಯೇ ಇರುತ್ತದೆ ಮತ್ತು ಅದನ್ನು <ph name="BEGIN_LINK" />Google ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌‌ನಲ್ಲಿ<ph name="END_LINK" /> ನಿರ್ವಹಿಸಬಹುದಾಗಿದೆ.</translation>
+<translation id="967624055006145463">ಸಂಗ್ರಹಣೆ ಮಾಡಿರುವ ಡೇಟಾ</translation>
 <translation id="968000525894980488">Google Play ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿ.</translation>
 <translation id="968174221497644223">ಅಪ್ಲಿಕೇಶನ್ ಸಂಗ್ರಹ</translation>
 <translation id="969096075394517431">ಭಾಷೆಗಳನ್ನು ಬದಲಾಯಿಸಿ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 63eb4645..dfa6131 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">영문 철자 및 문법 보기</translation>
 <translation id="1593594475886691512">포맷 중...</translation>
 <translation id="159359590073980872">이미지 캐시</translation>
+<translation id="1593926297800505364">결제 수단 저장</translation>
 <translation id="1598233202702788831">관리자가 업데이트를 사용 중지했습니다.</translation>
 <translation id="1600857548979126453">페이지 디버거 백엔드에 액세스</translation>
 <translation id="1601560923496285236">적용</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">기기가 도메인에 가입하지 못했습니다. 추가할 수 있는 기기 수를 초과하지 않았는지 확인하세요.</translation>
 <translation id="1744108098763830590">백그라운드 페이지</translation>
 <translation id="1745520510852184940">항상 번역</translation>
+<translation id="1746417874336251387">Chromebook과 휴대전화 연결을 활용하는 새로운 기능을 제공하세요.</translation>
 <translation id="174937106936716857">전체 파일 수</translation>
 <translation id="175196451752279553">닫은 탭 다시 열기(&amp;E)</translation>
 <translation id="1753905327828125965">자주 방문한 페이지</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">시작:</translation>
 <translation id="1933809209549026293">마우스나 키보드를 연결하세요. 블루투스 기기를 사용하고 있다면 페어링할 수 있도록 준비하세요.</translation>
 <translation id="1936157145127842922">폴더 열기</translation>
+<translation id="1938351510777341717">외부 명령어</translation>
 <translation id="1940546824932169984">연결된 기기</translation>
 <translation id="1942765061641586207">이미지 해상도</translation>
+<translation id="1943097386230153518">새 서비스 설치</translation>
 <translation id="1944921356641260203">사용 가능한 업데이트 있음</translation>
 <translation id="1951615167417147110">한 페이지 위로 스크롤</translation>
 <translation id="1954813140452229842">공유를 마운트하는 중에 오류가 발생했습니다. 사용자 인증 정보를 확인한 후 다시 시도해 주세요.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">제출</translation>
 <translation id="265390580714150011">필드 값</translation>
 <translation id="2654166010170466751">사이트에서 결제 핸들러를 설치하도록 허용</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />기기에 따라 기능이 다를 수 있습니다.</translation>
 <translation id="2660779039299703961">이벤트</translation>
 <translation id="266079277508604648">프린터에 연결할 수 없습니다. 프린터가 켜져 있으며 Wi-Fi 또는 USB를 통해 Chromebook에 연결되어 있는지 확인하세요.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">PIN 입력</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">앱</translation>
+<translation id="2806891468525657116">바로가기가 이미 존재합니다.</translation>
 <translation id="2807517655263062534">다운로드한 파일이 여기에 표시됩니다.</translation>
 <translation id="2809586584051668049">외 <ph name="NUMBER_ADDITIONAL_DISABLED" />개</translation>
 <translation id="281133045296806353">기존 브라우저 세션에 새 창을 생성했습니다.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">로그인되었습니다</translation>
 <translation id="3429275422858276529">이 페이지를 북마크에 추가하여 나중에 쉽게 찾으세요.</translation>
 <translation id="3429599832623003132">$1 항목</translation>
+<translation id="3430342160185525240">어시스턴트를 사용하여 알림을 표시합니다.</translation>
 <translation id="3432227430032737297">표시된 항목 모두 삭제</translation>
 <translation id="3432757130254800023">로컬 네트워크의 디스플레이로 오디오 및 동영상 전송</translation>
 <translation id="3432762828853624962">공유 작업자</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" />을(를) 사용하여 프로그램을 제거해야 합니다.
 
   <ph name="CONTROL_PANEL_APPLET_NAME" />을(를) 시작하시겠습니까?</translation>
+<translation id="394183848452296464">바로가기를 만들 수 없음</translation>
 <translation id="3943582379552582368">뒤로(&amp;B)</translation>
 <translation id="3943857333388298514">붙여넣기</translation>
 <translation id="3948116654032448504"><ph name="SEARCH_ENGINE" />에서 이미지 검색(&amp;S)</translation>
@@ -2269,6 +2277,7 @@
 <translation id="4481530544597605423">페어링 해제된 기기</translation>
 <translation id="4482194545587547824">검색 및 다른 Google 서비스를 맞춤설정하기 위하여 Google에서 인터넷 사용 기록을 사용할 수 있습니다.</translation>
 <translation id="4495419450179050807">이 페이지에 표시하지 않음</translation>
+<translation id="4499718683476608392">신용카드 자동 완성을 사용하여 클릭 한 번으로 양식을 작성합니다.</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" />이(가) 다운되었습니다</translation>
 <translation id="450099669180426158">느낌표 아이콘</translation>
 <translation id="4501530680793980440">삭제 확인</translation>
@@ -2547,7 +2556,6 @@
 <translation id="4917385247580444890">강력</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" />에서 '<ph name="EXTENSION_NAME" />' 확장 프로그램과 통신하려고 합니다.</translation>
 <translation id="4918086044614829423">수락</translation>
-<translation id="4920350943031252905">Chromebook에서 Linux 도구, 편집기, IDE를 실행합니다.</translation>
 <translation id="4920887663447894854">이 페이지에서 사용자 위치 추적이 차단된 사이트는 다음과 같습니다.</translation>
 <translation id="492299503953721473">Android 앱 삭제</translation>
 <translation id="4923279099980110923">네, 돕고 싶습니다.</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Chrome OS 클라우드 백업</translation>
 <translation id="5756163054456765343">고객센터(H)</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" />을(를) 통해 인쇄하려고 전송한 문서를 <ph name="APP_NAME" />에서 읽을 수 있습니다.</translation>
+<translation id="5762172915276660232">신용카드 설정</translation>
 <translation id="5763751966069581670">USB 기기를 찾을 수 없습니다.</translation>
 <translation id="5764483294734785780">오디오를 다른 이름으로 저장...(&amp;V)</translation>
 <translation id="57646104491463491">수정된 날짜</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">보안 모듈 오류입니다.</translation>
 <translation id="5856721540245522153">디버깅 기능 사용</translation>
 <translation id="5857090052475505287">새 폴더</translation>
+<translation id="585979798156957858">외부 메타</translation>
 <translation id="5860033963881614850">사용 안함</translation>
 <translation id="5860209693144823476">탭 3</translation>
 <translation id="5860491529813859533">사용</translation>
@@ -3493,6 +3503,7 @@
 <translation id="6327785803543103246">웹 프록시 자동검색</translation>
 <translation id="6333064448949140209">디버깅을 위해 파일이 Google로 전송됩니다.</translation>
 <translation id="6333834492048057036">검색을 위해 주소 표시줄로 이동</translation>
+<translation id="6336451774241870485">새 비공개 탭</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" />의 새 프로필을 만드세요.</translation>
 <translation id="6340017061976355871">서버에 연결할 수 없습니다. 네트워크 연결을 확인하고 다시 시도해 주세요. 문제가 지속되면 Chromebook을 다시 시작하세요.</translation>
 <translation id="6340071272923955280">인터넷 인쇄 프로토콜(IPPS)</translation>
@@ -3674,6 +3685,7 @@
 <translation id="6606070663386660533">탭 8</translation>
 <translation id="6607272825297743757">파일 정보</translation>
 <translation id="6607831829715835317">도구 더보기</translation>
+<translation id="6610147964972079463">비공개 탭 닫기</translation>
 <translation id="6612358246767739896">보호된 콘텐츠</translation>
 <translation id="6613452264606394692">이 페이지를 북마크에 추가하여 빠르게 다시 방문하세요.</translation>
 <translation id="6614893213975402384">업데이트 및 앱을 설치합니다. 계속하면 이 기기에서도 Google, 이동통신사, 기기 제조업체로부터 업데이트와 앱을 자동으로 다운로드하고 설치하는 데 동의하는 것으로 간주됩니다(이때 모바일 데이터가 사용될 수도 있음). 일부 앱에서는 인앱 구매가 제공될 수도 있습니다. 이러한 앱은 언제든지 삭제할 수 있습니다. <ph name="BEGIN_LINK1" />자세히 알아보기<ph name="END_LINK1" /></translation>
@@ -3744,6 +3756,7 @@
 <translation id="6710213216561001401">이전</translation>
 <translation id="6718273304615422081">압축 중...</translation>
 <translation id="671928215901716392">화면 잠금</translation>
+<translation id="6720847671508630642">최고의 Android를 Chromebook과 자동으로 공유하세요. 컴퓨터에서 문자 메시지를 보내고 휴대전화의 인터넷 연결을 공유하고 Chromebook 화면을 잠금 해제할 수 있도록 휴대전화를 연결하세요.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">보안 키 제조업체와 모델을 확인하려고 합니다.</translation>
 <translation id="6721972322305477112">파일(&amp;F)</translation>
 <translation id="672213144943476270">프로필을 잠금 해제한 후에 게스트로 탐색하세요.</translation>
@@ -3890,6 +3903,7 @@
 <translation id="6970856801391541997">특정 페이지 인쇄</translation>
 <translation id="6972180789171089114">오디오/비디오</translation>
 <translation id="6973630695168034713">폴더</translation>
+<translation id="6974609594866392343">오프라인 데모 모드</translation>
 <translation id="6976108581241006975">자바스크립트 콘솔</translation>
 <translation id="6977381486153291903">펌웨어 버전</translation>
 <translation id="6978121630131642226">검색엔진</translation>
@@ -4484,6 +4498,7 @@
 <translation id="7857949311770343000">설정한 새 탭 페이지가 맞습니까?</translation>
 <translation id="786073089922909430">서비스: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">다운로드(&amp;D)</translation>
+<translation id="7864662577698025113">새 서비스 추가</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{쿠키 1개}other{쿠키 #개}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - 페어링됨</translation>
 <translation id="7870730066603611552">설정 후 동기화 옵션 검토</translation>
@@ -4998,6 +5013,7 @@
 <translation id="8666584013686199826">사이트에서 USB 기기에 액세스하려고 할 때 확인</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" />이(가) 현재 전체화면으로 전환되었으며 마우스 커서가 사용 중지되었습니다.</translation>
 <translation id="8669284339312441707">따뜻함</translation>
+<translation id="8669919703154928649">어시스턴트가 알림을 표시하도록 허용</translation>
 <translation id="8669949407341943408">이동 중...</translation>
 <translation id="8671210955687109937">댓글 가능</translation>
 <translation id="8673026256276578048">웹 검색...</translation>
@@ -5385,6 +5401,7 @@
 <translation id="964286338916298286">IT 관리자가 내 기기에서 Chrome Goodies를 이용할 수 없도록 설정했습니다.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{애플리케이션}other{애플리케이션}}</translation>
 <translation id="967007123645306417">Google 계정에서 로그아웃됩니다. 북마크, 방문 기록, 비밀번호, 기타 설정이 더 이상 Google 계정에 동기화되지 않습니다. 하지만 기존 데이터는 Google 계정에 계속 저장되며 <ph name="BEGIN_LINK" />Google 대시보드<ph name="END_LINK" />에서 관리할 수 있습니다.</translation>
+<translation id="967624055006145463">저장된 데이터</translation>
 <translation id="968000525894980488">Google Play 서비스를 사용 설정합니다.</translation>
 <translation id="968174221497644223">애플리케이션 캐시</translation>
 <translation id="969096075394517431">언어 변경</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index 3bd45ca..c03470f 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2558,7 +2558,6 @@
 <translation id="4917385247580444890">Stiprus</translation>
 <translation id="4918021164741308375">„<ph name="ORIGIN" />“ nori užmegzti ryšį su plėtiniu „<ph name="EXTENSION_NAME" />“</translation>
 <translation id="4918086044614829423">Priimti</translation>
-<translation id="4920350943031252905">Paleiskite „Linux“ įrankius, redagavimo priemones ir IDE savo „Chromebook“.</translation>
 <translation id="4920887663447894854">Šios svetainės buvo užblokuotos, kad nebūtų galima šiame puslapyje stebėti jūsų vietovės:</translation>
 <translation id="492299503953721473">Pašalinti „Android“ programas</translation>
 <translation id="4923279099980110923">Taip, noriu padėti</translation>
@@ -3507,6 +3506,7 @@
 <translation id="6327785803543103246">Automatinis žiniatinklio tarpinio serverio aptikimas</translation>
 <translation id="6333064448949140209">Failas bus išsiųstas į sistemą „Google“ atlikti derinimą</translation>
 <translation id="6333834492048057036">Aktyvinti adreso juostą ir ieškoti</translation>
+<translation id="6336451774241870485">Naujas privatus skirtukas</translation>
 <translation id="6339668969738228384">Kurti naują <ph name="USER_EMAIL_ADDRESS" /> profilį</translation>
 <translation id="6340017061976355871">Nepavyko užmegzti ryšio su serveriu. Patikrinkite tinklo ryšį ir bandykite dar kartą. Jei problema išlieka, paleiskite „Chromebook“ iš naujo.</translation>
 <translation id="6340071272923955280">Spausdinimo internetu protokolas (IPPS)</translation>
@@ -3688,6 +3688,7 @@
 <translation id="6606070663386660533">8 skirtukas</translation>
 <translation id="6607272825297743757">Failo informacija</translation>
 <translation id="6607831829715835317">Daugiau įrank&amp;ių</translation>
+<translation id="6610147964972079463">Uždaryti privačius skirtuk.</translation>
 <translation id="6612358246767739896">Apsaugotas turinys</translation>
 <translation id="6613452264606394692">Grįžkite čia greičiau ir patogiau pasižymėję šį puslapį</translation>
 <translation id="6614893213975402384">Įdiekite naujinius ir programas. Tęsdami sutinkate, kad šis įrenginys taip pat gali automatiškai atsisiųsti ir įdiegti naujinius bei programas iš „Google“, operatoriaus ir įrenginio gamintojo (gali būti naudojami mobiliojo ryšio duomenys). Kai kurios programos gali siūlyti įsigyti pirkinių programoje. Šias programas galite bet kada pašalinti. <ph name="BEGIN_LINK1" />Sužinokite daugiau<ph name="END_LINK1" /></translation>
@@ -4048,6 +4049,7 @@
 <translation id="7175353351958621980">Įkelta iš:</translation>
 <translation id="7180611975245234373">Atnaujinti</translation>
 <translation id="7180865173735832675">Tinkinti</translation>
+<translation id="7182359331070524176">Pasirinkite „Google“ nuotraukų albumą</translation>
 <translation id="7186088072322679094">Laikyti įrankių juostoje</translation>
 <translation id="7187428571767585875">Registro vertės, kurios bus pašalintos arba pakeistos:</translation>
 <translation id="7189234443051076392">Įsitikinkite, kad įrenginyje yra pakankamai vietos</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 0c4cb1e..f1fced4 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Rādīt pareizrakstības un gramatikas ieteikumus</translation>
 <translation id="1593594475886691512">Notiek formatēšana...</translation>
 <translation id="159359590073980872">Attēlu kešatmiņa</translation>
+<translation id="1593926297800505364">Saglabāt maksājuma veidu</translation>
 <translation id="1598233202702788831">Administrators ir atspējojis atjauninājumus.</translation>
 <translation id="1600857548979126453">Piekļūtu lapas atkļūdotāja aizmugursistēmai</translation>
 <translation id="1601560923496285236">Lietot</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Ierīci nevar saistīt ar domēnu. Nepārsniedziet pievienojamo ierīču skaitu.</translation>
 <translation id="1744108098763830590">fona lapa</translation>
 <translation id="1745520510852184940">Vienmēr</translation>
+<translation id="1746417874336251387">Piedāvā jaunas funkcijas, kurās tiek izmantots jūsu tālruņa savienojums ar Chromebook datoru.</translation>
 <translation id="174937106936716857">Failu kopskaits</translation>
 <translation id="175196451752279553">Vēlr&amp;eiz atvērt aizvērto cilni</translation>
 <translation id="1753905327828125965">Visapmeklētākais</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Nevis pirms</translation>
 <translation id="1933809209549026293">Lūdzu, pievienojiet peli vai tastatūru. Ja izmantojat Bluetooth ierīci, pārliecinieties, ka tā ir gatava savienošanai pārī.</translation>
 <translation id="1936157145127842922">Rādīt mapē</translation>
+<translation id="1938351510777341717">Ārējais komandtaustiņš</translation>
 <translation id="1940546824932169984">Pievienotās ierīces</translation>
 <translation id="1942765061641586207">Attēla izšķirtspēja</translation>
+<translation id="1943097386230153518">Jauna pakalpojuma instalēšana</translation>
 <translation id="1944921356641260203">Atrasts atjauninātājs</translation>
 <translation id="1951615167417147110">Ritināt augšup vienu lapu</translation>
 <translation id="1954813140452229842">Iekļaujot kopīgošanu, radās kļūda. Lūdzu, pārbaudiet akreditācijas datus un mēģiniet vēlreiz.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Iesniegt</translation>
 <translation id="265390580714150011">Lauka vērtība</translation>
 <translation id="2654166010170466751">Atļaut vietnēm instalēt maksājumu apdarinātājus</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Dažādās ierīcēs funkcijas var atšķirties</translation>
 <translation id="2660779039299703961">Notikums</translation>
 <translation id="266079277508604648">Nevar izveidot savienojumu ar printeri. Pārbaudiet, vai printeris ir ieslēgts un vai printerim ir izveidots savienojums ar Chromebook datoru Wi-Fi tīklā vai izmantojot USB savienojumu.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Ievadiet PIN</translation>
 <translation id="2805646850212350655">Microsoft šīfrēšanas failu sistēma</translation>
 <translation id="2805756323405976993">Lietotnes</translation>
+<translation id="2806891468525657116">Saīsne jau pastāv</translation>
 <translation id="2807517655263062534">Šeit ir redzami lejupielādētie faili.</translation>
 <translation id="2809586584051668049">un vēl <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Esošās pārlūkprogrammas sesijā tika izveidots jauns logs.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Jūs esat pierakstījies!</translation>
 <translation id="3429275422858276529">Saglabājiet šo lapu kā grāmatzīmi, lai vēlāk varētu to viegli atrast</translation>
 <translation id="3429599832623003132">$1 vienumi</translation>
+<translation id="3430342160185525240">Ļauj Asistentam rādīt jums paziņojumus</translation>
 <translation id="3432227430032737297">Noņemt visu parādīto</translation>
 <translation id="3432757130254800023">Sūtīt audio un video saturu uz ekrāniem lokālajā tīklā</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" />, kas ir pieejams vadības panelī.
 
 Vai vēlaties palaist rīku <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Nevar izveidot saīsni</translation>
 <translation id="3943582379552582368">Atpakaļ</translation>
 <translation id="3943857333388298514">Ielīmēt</translation>
 <translation id="3948116654032448504">Meklēt attēlu <ph name="SEARCH_ENGINE" /> tīklā</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Pārī nesavienotās ierīces</translation>
 <translation id="4482194545587547824">Google var izmantot jūsu pārlūkošanas vēsturi, lai personalizētu Meklēšanu un citus Google pakalpojumus.</translation>
 <translation id="4495419450179050807">Nerādīt šajā lapā</translation>
+<translation id="4499718683476608392">Iespējojiet kredītkaršu automātisko aizpildi, lai varētu aizpildīt veidlapas ar vienu klikšķi</translation>
 <translation id="4500114933761911433">Spraudnis <ph name="PLUGIN_NAME" /> avarēja.</translation>
 <translation id="450099669180426158">Izsaukuma zīmes ikona</translation>
 <translation id="4501530680793980440">Apstiprināt noņemšanu</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Spēcīgs</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> vēlas sazināties ar paplašinājumu “<ph name="EXTENSION_NAME" />”</translation>
 <translation id="4918086044614829423">Pieņemt</translation>
-<translation id="4920350943031252905">Palaiž Linux rīkus, redaktorus un IDE jūsu Chromebook datorā.</translation>
 <translation id="4920887663447894854">Šīs vietnes ir bloķētas un nevar izsekot jūsu atrašanās vietu šajā lapā:</translation>
 <translation id="492299503953721473">Noņemt Android lietotnes</translation>
 <translation id="4923279099980110923">Jā, es vēlos palīdzēt</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Chrome OS dublēšana mākonī</translation>
 <translation id="5756163054456765343">P&amp;alīdzības centrs</translation>
 <translation id="5759728514498647443">Dokumenti, kurus sūtāt drukāšanai, izmantojot lietotni <ph name="APP_NAME" />, var tikt lasīti lietotnē <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Kredītkaršu iestatījumi</translation>
 <translation id="5763751966069581670">Nav atrasta neviena USB ierīce</translation>
 <translation id="5764483294734785780">S&amp;aglabāt audio kā...</translation>
 <translation id="57646104491463491">Modificētais datums</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Diemžēl radās drošības moduļa kļūda</translation>
 <translation id="5856721540245522153">Atkļūdošanas funkciju iespējošana</translation>
 <translation id="5857090052475505287">Jauna mape</translation>
+<translation id="585979798156957858">Ārējais Meta taustiņš</translation>
 <translation id="5860033963881614850">Izsl.</translation>
 <translation id="5860209693144823476">3. cilne</translation>
 <translation id="5860491529813859533">Ieslēgt</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Tīmekļa starpniekservera automātiskā atklāšana</translation>
 <translation id="6333064448949140209">Fails tiks nosūtīts Google serveriem atkļūdošanai</translation>
 <translation id="6333834492048057036">Iezīmē adreses joslu meklēšanai</translation>
+<translation id="6336451774241870485">Jauna privātā cilne</translation>
 <translation id="6339668969738228384">Izveidot profilu kontam <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Nevarēja izveidot savienojumu ar serveri. Pārbaudiet tīkla savienojumu un mēģiniet vēlreiz. Ja problēma joprojām pastāv, restartējiet Chromebook datoru.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">8. cilne</translation>
 <translation id="6607272825297743757">Faila informācija</translation>
 <translation id="6607831829715835317">Vairā&amp;k rīku</translation>
+<translation id="6610147964972079463">Aizvērt privātās cilnes</translation>
 <translation id="6612358246767739896">Aizsargāts saturs</translation>
 <translation id="6613452264606394692">Saglabājiet šo lapu kā grāmatzīmi, lai vēlāk to vieglāk atrastu</translation>
 <translation id="6614893213975402384">Instalēt atjauninājumus un lietotnes. Turpinot jūs piekrītat, ka šī ierīce var automātiski lejupielādēt un instalēt atjauninājumus un lietotnes, ko nodrošina Google, jūsu mobilo sakaru operators un ierīces ražotājs. Var tikt izmantoti mobilie dati. Dažās lietotnēs var tikt piedāvāti pirkumi. Jebkurā brīdī varat noņemt šīs lietotnes. <ph name="BEGIN_LINK1" />Uzziniet vairāk.<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Iepriekšējais</translation>
 <translation id="6718273304615422081">Notiek tilpsaspiešana...</translation>
 <translation id="671928215901716392">Bloķēt ekrānu</translation>
+<translation id="6720847671508630642">Automātiski kopīgojiet Android ierīci ar savu Chromebook datoru. Izveidojiet savienojumu ar tālruni, lai varētu no datora sūtīt īsziņas, koplietot tālruņa interneta savienojumu un atbloķēt Chromebook datora ekrānu.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Skatīt jūsu drošības atslēgas ražotāju un modeli</translation>
 <translation id="6721972322305477112">&amp;Fails</translation>
 <translation id="672213144943476270">Pirms pārlūkošanas viesa režīmā, lūdzu, atbloķējiet savu profilu.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Drukāt konkrētas lapas</translation>
 <translation id="6972180789171089114">Audio/video</translation>
 <translation id="6973630695168034713">Mapes</translation>
+<translation id="6974609594866392343">Bezsaistes demonstrācijas režīms</translation>
 <translation id="6976108581241006975">JavaScript konsole</translation>
 <translation id="6977381486153291903">Programmaparatūras pārskatīšana</translation>
 <translation id="6978121630131642226">Meklētāji</translation>
@@ -4034,6 +4048,7 @@
 <translation id="7175353351958621980">Ielādēts no:</translation>
 <translation id="7180611975245234373">Atsvaidzināt</translation>
 <translation id="7180865173735832675">Piemērot</translation>
+<translation id="7182359331070524176">Atlasiet Google fotoattēlu albumu</translation>
 <translation id="7186088072322679094">Saglabāšana rīkjoslā</translation>
 <translation id="7187428571767585875">Noņemamie vai maināmie reģistra ieraksti:</translation>
 <translation id="7189234443051076392">Ierīcē ir jābūt pietiekami daudz vietas.</translation>
@@ -4484,6 +4499,7 @@
 <translation id="7857949311770343000">Vai šī ir jaunas cilnes lapa, ko gaidījāt?</translation>
 <translation id="786073089922909430">Pakalpojums: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">Lejupielādes</translation>
+<translation id="7864662577698025113">Pievienot jaunu pakalpojumu</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 sīkfails}zero{# sīkfailu}one{# sīkfails}other{# sīkfaili}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> — izveidots savienojums pārī</translation>
 <translation id="7870730066603611552">Sinhronizācijas opciju pārskatīšana pēc iestatīšanas</translation>
@@ -4999,6 +5015,7 @@
 <translation id="8666584013686199826">Vaicāt, ja vietne vēlas piekļūt USB ierīcēm</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> tagad ir redzams pilnekrāna režīmā un ir atspējojis jūsu peles kursoru.</translation>
 <translation id="8669284339312441707">Siltāks</translation>
+<translation id="8669919703154928649">Ļaut Asistentam parādīt paziņojumus</translation>
 <translation id="8669949407341943408">Notiek pārvietošana...</translation>
 <translation id="8671210955687109937">Var komentēt</translation>
 <translation id="8673026256276578048">Meklēt tīmeklī...</translation>
@@ -5386,6 +5403,7 @@
 <translation id="964286338916298286">IT administrators ir atspējojis Chrome piedāvājumus jūsu ierīcei.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Lietojumprogramma}zero{Lietojumprogrammas}one{Lietojumprogrammas}other{Lietojumprogrammas}}</translation>
 <translation id="967007123645306417">Šādi tiksiet izrakstīts no jūsu Google kontiem. Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas jūsu Google kontā. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā un tos varēsiet pārvaldīt <ph name="BEGIN_LINK" />Google informācijas panelī<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Dati saglabāti</translation>
 <translation id="968000525894980488">Ieslēdziet Google Play pakalpojumus.</translation>
 <translation id="968174221497644223">Lietojumprogrammas kešatmiņa</translation>
 <translation id="969096075394517431">Mainīt valodas</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index a304d52..2496f740 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">സ്‌പെല്ലിംഗും വ്യാകരണവും കാണിക്കുക</translation>
 <translation id="1593594475886691512">ഫോർമാറ്റുചെയ്യുന്നു...</translation>
 <translation id="159359590073980872">ഇമേജ് കാഷെ</translation>
+<translation id="1593926297800505364">പേയ്മെന്റ് രീതികൾ സംരക്ഷിക്കുക</translation>
 <translation id="1598233202702788831">അപ്‌ഡേറ്റുകളെ നിങ്ങളുടെ അഡ്‌മിനിസ്‌ട്രേറ്റര്‍ പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="1600857548979126453">പേജ് ഡീബഗ്ഗർ ബാക്ക്എൻഡ് ആക്‌സസ്സുചെയ്യുക</translation>
 <translation id="1601560923496285236">പ്രയോഗിക്കുക</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">ഉപകരണത്തെ ഡൊമെയ്‌നുമായി ബന്ധിപ്പിക്കാൻ കഴിയുന്നില്ല. നിങ്ങൾക്ക് ചേർക്കാനാവുന്ന ഉപകരണങ്ങളുടെ എണ്ണം കവിഞ്ഞിട്ടില്ലെന്ന് ഉറപ്പാക്കുക.</translation>
 <translation id="1744108098763830590">പശ്ചാത്തല പേജ്</translation>
 <translation id="1745520510852184940">എല്ലായ്‌പ്പോഴും ഇങ്ങനെ ചെയ്യുക</translation>
+<translation id="1746417874336251387">നിങ്ങളുടെ Chromebook-ലേക്ക് ഫോണിന്റെ കണക്ഷൻ ഉപയോഗിക്കുന്ന പുതിയ ഫീച്ചറുകൾ നൽകുന്നു</translation>
 <translation id="174937106936716857">മൊത്തം ഫയലുകളുടെ എണ്ണം</translation>
 <translation id="175196451752279553">അടച്ച ടാബ് വീണ്ടും&amp;തുറക്കുക</translation>
 <translation id="1753905327828125965">കൂടുതൽ‍ സന്ദര്‍ശിച്ചത്</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">മുമ്പല്ല</translation>
 <translation id="1933809209549026293">ഒരു മൗസോ കീബോർഡോ കണക്റ്റുചെയ്യുക. നിങ്ങൾ ഒരു Bluetooth ഉപകരണം ഉപയോഗിക്കുന്നുവെങ്കിൽ, അത് ജോടിയാക്കാൻ തയ്യാറാണെന്ന് ഉറപ്പുവരുത്തുക.</translation>
 <translation id="1936157145127842922">ഫോള്‍ഡറില്‍ കാണിക്കുക</translation>
+<translation id="1938351510777341717">എക്‌സ്‌റ്റേണൽ കമാൻഡ്</translation>
 <translation id="1940546824932169984">കണക്‌റ്റുചെയ്ത ഉപകരണം</translation>
 <translation id="1942765061641586207">ചിത്രത്തിന്റെ റെസല്യൂഷൻ</translation>
+<translation id="1943097386230153518">പുതിയ സേവനം ഇൻസ്‌റ്റാൾ ചെയ്യുക</translation>
 <translation id="1944921356641260203">അപ്‌ഡേറ്റ് കണ്ടെത്തി</translation>
 <translation id="1951615167417147110">ഒരു പേജ് മുകളിലേക്ക് സ്ക്രോള്‍ ചെയ്യുക</translation>
 <translation id="1954813140452229842">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. ക്രെഡൻഷ്യലുകൾ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
@@ -1105,6 +1109,7 @@
 <translation id="2653659639078652383">സമര്‍പ്പിക്കൂ</translation>
 <translation id="265390580714150011">ഫീല്‍‌ഡ് മൂല്യം</translation>
 <translation id="2654166010170466751">പേയ്‌മെന്റ് ഹാൻഡ്‌ലറുകളെ ഇൻസ്റ്റാൾ ചെയ്യാൻ സൈറ്റുകളെ അനുവദിക്കുന്നു</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />ഉപകരണത്തിന് അനുസരിച്ച് ഫീച്ചറുകൾ വ്യത്യാസപ്പെടും</translation>
 <translation id="2660779039299703961">ഇവന്റ്</translation>
 <translation id="266079277508604648">പ്രിന്‍റർ കണക്റ്റ് ചെയ്യാനാവുന്നില്ല. പ്രിന്‍റർ ഓണാണോ എന്നും വൈഫൈയോ USB-യോ ഉപയോഗിച്ച് Chromebook-ലേക്ക് കണക്റ്റ് ചെയ്‌‌തിട്ടുണ്ടോ എന്നും പരിശോധിക്കുക.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1211,6 +1216,7 @@
 <translation id="2803375539583399270">പിൻ നൽകുക</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">ആപ്സ്</translation>
+<translation id="2806891468525657116">കുറുക്കുവഴി മുമ്പേ നിലവിലുണ്ട്</translation>
 <translation id="2807517655263062534">നിങ്ങൾ ഡൗൺലോഡ് ചെയ്യുന്ന ഫയലുകൾ ഇവിടെ ദൃശ്യമാകും</translation>
 <translation id="2809586584051668049">ഒപ്പം <ph name="NUMBER_ADDITIONAL_DISABLED" /> എണ്ണം കൂടി</translation>
 <translation id="281133045296806353">നിലവിലുള്ള ബ്രൌസിംഗ് സെഷനില്‍ പുതിയ വിന്‍ഡോ സൃഷ്‌ടിച്ചു.</translation>
@@ -1597,6 +1603,7 @@
 <translation id="3428419049384081277">നിങ്ങൾ സൈൻ ഇൻ ചെയ്‌തു!</translation>
 <translation id="3429275422858276529">പിന്നീട് ഈ പേജ് എളുപ്പത്തിൽ കണ്ടെത്താൻ ബുക്ക്‌മാർക്ക് ചെയ്യുക</translation>
 <translation id="3429599832623003132">$1 ഇനങ്ങൾ</translation>
+<translation id="3430342160185525240">നിങ്ങൾക്ക് അറിയിപ്പുകൾ കാണിക്കാൻ അസിസ്‌റ്റന്റിനെ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="3432227430032737297">ദൃശ്യമാക്കിയിരിക്കുന്നതെല്ലാം നീക്കംചെയ്യുക</translation>
 <translation id="3432757130254800023">പ്രാദേശിക നെറ്റ്‌വർക്കിലെ ഡിസ്‌പ്ലേകളിലേക്ക് ഓഡിയോയും വീഡിയോയും അയയ്‌ക്കുക</translation>
 <translation id="3432762828853624962">പങ്കിട്ട വർക്കർമാർ</translation>
@@ -1960,6 +1967,7 @@
 <translation id="3941565636838060942">ഈ പ്രോഗ്രാമിലേക്കുള്ള ആക്‌സസ്സ് മറയ്‌ക്കാൻ, നിയന്ത്രണ പാനലിൽ <ph name="CONTROL_PANEL_APPLET_NAME" />   ഉപയോഗിച്ച് നിങ്ങളിത് അൺഇൻസ്‌റ്റാൾ ചെയ്യേണ്ടതാണ്.
 
   <ph name="CONTROL_PANEL_APPLET_NAME" />, ആരംഭിക്കാൻ താൽപ്പര്യമുണ്ടോ?</translation>
+<translation id="394183848452296464">കുറുക്കുവഴി സൃഷ്‌ടിക്കാനാവില്ല</translation>
 <translation id="3943582379552582368">&amp;പിന്നോട്ട്</translation>
 <translation id="3943857333388298514">ഒട്ടിക്കുക</translation>
 <translation id="3948116654032448504">&amp;ചിത്രത്തിനായി തിരയുക <ph name="SEARCH_ENGINE" /></translation>
@@ -2267,6 +2275,7 @@
 <translation id="4481530544597605423">ജോടി മാറ്റിയ ഉപകരണങ്ങൾ</translation>
 <translation id="4482194545587547824">തിരയലും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation>
 <translation id="4495419450179050807">ഈ പേജില്‍ കാണിക്കരുത്</translation>
+<translation id="4499718683476608392">ഒറ്റ ക്ലിക്കിൽ ഫോമുകൾ പൂരിപ്പിക്കാൻ ക്രെഡിറ്റ് കാർഡിന്റെ സ്വമേധയാ പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ക്രാഷ് ചെയ്തിരിക്കുന്നു</translation>
 <translation id="450099669180426158">ആശ്ചര്യചിഹ്നത്തിന്റെ ഐക്കൺ</translation>
 <translation id="4501530680793980440">നീക്കംചെയ്യൽ സ്ഥിരീകരിക്കുക</translation>
@@ -2545,7 +2554,6 @@
 <translation id="4917385247580444890">ശക്തം</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> എന്നതിന് വിപുലീകരണ "<ph name="EXTENSION_NAME" />" ഉപയോഗിച്ച് ആശയവിനിമയം നടത്തേണ്ടതുണ്ട്</translation>
 <translation id="4918086044614829423">സ്വീകരിക്കുക</translation>
-<translation id="4920350943031252905">നിങ്ങളുടെ Chromebook-ൽ Linux ടൂളുകളും എഡിറ്ററുകളും IDE-കളും റൺ ചെയ്യുക.</translation>
 <translation id="4920887663447894854">ഈ പേജിലെ നിങ്ങളുടെ സ്ഥാനം ട്രാക്കുചെയ്യുന്നതില്‍‌ നിന്നും ഇനിപ്പറയുന്ന സൈറ്റുകളെ തടഞ്ഞു:</translation>
 <translation id="492299503953721473">Android ആപ്‌സ് നീക്കംചെയ്യുക</translation>
 <translation id="4923279099980110923">അതെ, ഞാൻ സഹായിക്കാൻ താൽപ്പര്യപ്പെടുന്നു</translation>
@@ -3111,6 +3119,7 @@
 <translation id="5752453871435543420">Chrome OS ക്ലൗഡ് ബാക്കപ്പ്</translation>
 <translation id="5756163054456765343">സഹാ&amp;യ കേന്ദ്രം</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> വഴി പ്രിന്റുചെയ്യാൻ നിങ്ങൾ അയയ്‌ക്കുന്ന പ്രമാണങ്ങളെ <ph name="APP_NAME" /> എന്നതിന് വായിക്കാനാകുന്നു.</translation>
+<translation id="5762172915276660232">ക്രെഡിറ്റ് കാർഡ് ക്രമീകരണം</translation>
 <translation id="5763751966069581670">USB ഉപകരണങ്ങളൊന്നും കണ്ടില്ല</translation>
 <translation id="5764483294734785780">ഓഡിയോ ഇതുപോലെ സം&amp;രക്ഷിക്കുക...</translation>
 <translation id="57646104491463491">തീയതി പരിഷ്കരിച്ചു</translation>
@@ -3182,6 +3191,7 @@
 <translation id="5855773610748894548">ക്ഷമിക്കണം, സുരക്ഷിത മൊഡ്യൂൾ പിശക്.</translation>
 <translation id="5856721540245522153">ഡീബഗ്ഗുചെയ്യൽ ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="5857090052475505287">പുതിയ ഫോള്‍ഡര്‍</translation>
+<translation id="585979798156957858">എക്‌സ്‌റ്റേണൽ മെറ്റ</translation>
 <translation id="5860033963881614850">ഓഫാക്കുക</translation>
 <translation id="5860209693144823476">ടാബ് 3</translation>
 <translation id="5860491529813859533">ഓൺ ചെയ്യുക</translation>
@@ -3492,6 +3502,7 @@
 <translation id="6327785803543103246">വെബ് പ്രോക്‌സി സ്വയമേവ കണ്ടെത്തൽ</translation>
 <translation id="6333064448949140209">ഡീബഗ്ഗുചെയ്യലിനായി ഫയൽ Google-ന് അയയ്‌ക്കും</translation>
 <translation id="6333834492048057036">തിരയലിനുള്ള വിലാസ ബാർ ഫോക്കസുചെയ്യുക</translation>
+<translation id="6336451774241870485">പുതിയ സ്വകാര്യ ടാബ്</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> എന്നയാൾക്ക് വേണ്ടി പുതിയ പ്രൊഫൈൽ സൃഷ്‌ടിക്കുക</translation>
 <translation id="6340017061976355871">സെര്‍വറുമായി കണക്റ്റ് ചെയ്യാനായില്ല. നിങ്ങളുടെ നെറ്റ്‌വർക്ക് കണക്ഷൻ പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക. തുടർന്നും പ്രശ്‌നം നിലനിൽക്കുകയാണെങ്കിൽ, Chromebook റീസ്‌റ്റാർട്ടുചെയ്യുക.</translation>
 <translation id="6340071272923955280">ഇന്റർനെറ്റ് പ്രിന്റിംഗ് പ്രോട്ടോക്കോൾ (IPPS)</translation>
@@ -3674,6 +3685,7 @@
 <translation id="6606070663386660533">ടാബ് 8</translation>
 <translation id="6607272825297743757">ഫയൽ വിവരം</translation>
 <translation id="6607831829715835317">കൂടുതൽ ഉപക&amp;രണങ്ങൾ</translation>
+<translation id="6610147964972079463">സ്വകാര്യ ടാബുകൾ അടയ്ക്കുക</translation>
 <translation id="6612358246767739896">പരിരക്ഷിത ഉള്ളടക്കം</translation>
 <translation id="6613452264606394692">ഈ പേജ് ബുക്ക്‌മാർക്ക് ചെയ്താൽ വേഗത്തിൽ ഇവിടെ മടങ്ങിയെത്താൻ കഴിയും</translation>
 <translation id="6614893213975402384">അപ്‌ഡേറ്റുകളും ആപ്പുകളും ഇൻസ്റ്റാൾ ചെയ്യുക. തുടരുന്നതിലൂടെ, ഈ ഉപകരണം Google-ൽ നിന്നും നിങ്ങളുടെ കാരിയറിൽ നിന്നും ഉപകരണ നിർമ്മാതാവിൽ നിന്നും, ഒരുപക്ഷേ സെല്ലുലാർ ഡാറ്റ ഉപയോഗിച്ച്, അപ്‌ഡേറ്റുകളും ആപ്പുകളും സ്വമേധയാ ഡൗൺലോഡ് ചെയ്‌ത് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് നിങ്ങൾ അംഗീകരിക്കുന്നു. ഈ ആപ്പുകളിൽ ചിലത് 'ആപ്പ് വഴി വാങ്ങൽ' സൗകര്യം നൽകിയേക്കാം. ഏതുസമയത്തും ഈ ആപ്പുകൾ നിങ്ങൾക്ക് നീക്കം ചെയ്യാവുന്നതാണ്. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
@@ -3744,6 +3756,7 @@
 <translation id="6710213216561001401">കഴിഞ്ഞ</translation>
 <translation id="6718273304615422081">Zip ചെയ്യുന്നു...</translation>
 <translation id="671928215901716392">സ്‌ക്രീൻ ലോക്കുചെയ്യുക</translation>
+<translation id="6720847671508630642">Android-ന്റെ മികച്ച ഫീച്ചറുകൾ, നിങ്ങളുടെ Chromebook-മായി സ്വമേധയാ പങ്കിടുക. കമ്പ്യൂട്ടറിൽ നിന്ന് ടെക്‌സ്‌റ്റ് ചെയ്യുക, ഫോണിലെ ഇന്റ്ർനെറ്റ് കണക്ഷൻ പങ്കിടുക, Chromebook സ്‌ക്രീൻ അൺലോക്ക് ചെയ്യുക എന്നിങ്ങനെയുള്ള കാര്യങ്ങൾ നിങ്ങളുടെ ഫോൺ കണക്‌റ്റ് ചെയ്യുമ്പോൾ ചെയ്യാനാവും.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">നിങ്ങളുടെ സുരക്ഷാ കീയുടെ മെയ്‌ക്കും മോഡലും കാണുക</translation>
 <translation id="6721972322305477112">&amp;ഫയല്‍</translation>
 <translation id="672213144943476270">ഒരു അതിഥിയായി ബ്രൗസിംഗ് ആരംഭിക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ പ്രൊഫൈൽ അൺലോക്കുചെയ്യുക.</translation>
@@ -3890,6 +3903,7 @@
 <translation id="6970856801391541997">പ്രിന്റ് പ്രത്യേക പേജുകൾ</translation>
 <translation id="6972180789171089114">ഓഡിയോ/വീഡിയോ</translation>
 <translation id="6973630695168034713">ഫോൾഡറുകൾ</translation>
+<translation id="6974609594866392343">ഓഫ്‌ലൈൻ ഡെമോ മോഡ്</translation>
 <translation id="6976108581241006975">JavaScript കണ്‍സോള്‍</translation>
 <translation id="6977381486153291903">ഫേംവെയർ പുനരവലോകനം</translation>
 <translation id="6978121630131642226">സെര്‍ച്ച് എഞ്ചിനുകള്‍</translation>
@@ -4484,6 +4498,7 @@
 <translation id="7857949311770343000">നിങ്ങൾ ഉദ്ദേശിച്ച പുതിയ ടാബ് പേജ് ഇതാണോ?</translation>
 <translation id="786073089922909430">സേവനം: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;ഡൌണ്‍ലോഡുകള്‍</translation>
+<translation id="7864662577698025113">പുതിയ സേവനം ചേർക്കുക</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{ഒരു കുക്കി}other{# കുക്കികൾ}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - ജോടിയാക്കി</translation>
 <translation id="7870730066603611552">സജ്ജീകരണത്തിന് ശേഷം സമന്വയ ഓപ്‌ഷനുകൾ അവലോകനം ചെയ്യുക</translation>
@@ -4998,6 +5013,7 @@
 <translation id="8666584013686199826">USB ഉപകരണങ്ങൾ ആക്‌സസ് ചെയ്യാൻ ഒരു സൈറ്റ് താൽപ്പര്യപ്പെടുമ്പോൾ ചോദിക്കുക</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ഇപ്പോൾ പൂർണ‌സ്‌ക്രീനിലാണ് കൂടാതെ നിങ്ങളുടെ മൗസ് കഴ്‌സർ അപ്രാപ്തമാക്കി.</translation>
 <translation id="8669284339312441707">തീക്ഷ്‌ണമായ</translation>
+<translation id="8669919703154928649">നിങ്ങൾക്ക് അറിയിപ്പുകൾ കാണിക്കാൻ അസിസ്‌റ്റന്റിനെ അനുവദിക്കുക</translation>
 <translation id="8669949407341943408">നീക്കുന്നു...</translation>
 <translation id="8671210955687109937">അഭിപ്രായമിടാനാകുന്നത്</translation>
 <translation id="8673026256276578048">വെബില്‍‌ തിരയുക...</translation>
@@ -5385,6 +5401,7 @@
 <translation id="964286338916298286">നിങ്ങളുടെ ഐടി അഡ്‌മിനിസ്‌ട്രേറ്റർ നിങ്ങളുടെ ഉപകരണത്തിനായുള്ള Chrome Goodies പ്രവർത്തനരഹിതമാക്കി.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{അപ്ലിക്കേഷൻ}other{അപ്ലിക്കേഷനുകൾ}}</translation>
 <translation id="967007123645306417">ഇത് നിങ്ങളുടെ Google അക്കൗണ്ടുകളിൽ നിന്ന് നിങ്ങളെ സൈൻ ഔട്ട് ചെയ്യിക്കും. ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, പാസ്‌വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയിലുള്ള മാറ്റങ്ങളെ ഇനി നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കില്ല. എന്നിരുന്നാലും, നിലവിലുള്ള വിവരങ്ങളെ Google അക്കൗണ്ടിൽ തുടർന്നും നിലനിർത്തും, അവ <ph name="BEGIN_LINK" />Google ഡാഷ്‌ബോർഡിൽ<ph name="END_LINK" /> മാനേജ് ചെയ്യാം.</translation>
+<translation id="967624055006145463">ഡാറ്റ സംഭരിച്ചു</translation>
 <translation id="968000525894980488">Google Play സേവനങ്ങൾ ഓണാക്കുക</translation>
 <translation id="968174221497644223">അപ്ലിക്കേഷന്‍ കാഷെ</translation>
 <translation id="969096075394517431">ഭാഷകൾ മാറ്റുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index e5201a7..0112b31 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -2557,7 +2557,6 @@
 <translation id="4917385247580444890">मजबूत</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" विस्ताराशी संवाद प्रस्थापित करू इच्छित आहे</translation>
 <translation id="4918086044614829423">स्वीकारा</translation>
-<translation id="4920350943031252905">तुमच्या Chromebook वर Linux टूल, संपादक, आणि IDE रन करा.</translation>
 <translation id="4920887663447894854">या पृष्ठावर आपले स्थान ट्रॅक करण्यापासून खालील साइट अवरोधित केल्या गेल्या आहेत:</translation>
 <translation id="492299503953721473">Android अॅप्स काढा</translation>
 <translation id="4923279099980110923">होय, मी मदत घेऊ इच्छितो</translation>
@@ -3507,6 +3506,7 @@
 <translation id="6327785803543103246">वेब प्रॉक्सी स्वयं शोध</translation>
 <translation id="6333064448949140209">फाईल डीबग करण्यासाठी Google कडे पाठविली जाईल</translation>
 <translation id="6333834492048057036">शोधासाठी अ‍ॅड्रेस बार वर फोकस करा</translation>
+<translation id="6336451774241870485">नवीन खाजगी टॅब</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> साठी एक नवीन प्रोफाइल तयार करा</translation>
 <translation id="6340017061976355871">सर्व्हरशी कनेक्ट करता आले नाही. कृपया तुमचे नेटवर्क कनेक्शन तपासा आणि पुन्हा प्रयत्न करा. समस्या तशीच राहिल्यास, तुमचे Chromebook रीस्टार्ट करा.</translation>
 <translation id="6340071272923955280">इंटरनेट प्रिंट प्रोटोकॉल (IPPS)</translation>
@@ -3689,6 +3689,7 @@
 <translation id="6606070663386660533">टॅब 8</translation>
 <translation id="6607272825297743757">फाईल माहिती</translation>
 <translation id="6607831829715835317">अधिक साध&amp;ने</translation>
+<translation id="6610147964972079463">खाजगी टॅब बंद करा</translation>
 <translation id="6612358246767739896">संरक्षित सामग्री</translation>
 <translation id="6613452264606394692">या पेजला बुकमार्क करून येथे जलद परत या</translation>
 <translation id="6614893213975402384">अपडेट आणि अ‍ॅप्स इंस्टॉल करा. पुढे सुरु ठेवून, तुम्ही सहमती देता की हे डिव्हाइस शक्यतो सेल्युलर डेटा वापरुन Google, तुमचा वाहक आणि तुमच्या डिव्हाइसच्या निर्मात्याकडून अपडेट आणि अॅप्ससुद्धा अापोआप डाउनलोड आणि इंस्टॉल करू शकते. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index cf8ae9e..c9e95e8 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Tunjukkan Ejaan dan Tatabahasa</translation>
 <translation id="1593594475886691512">Memformatkan...</translation>
 <translation id="159359590073980872">Cache Imej</translation>
+<translation id="1593926297800505364">Simpan kaedah pembayaran</translation>
 <translation id="1598233202702788831">Kemas kini dilumpuhkan oleh pentadbir anda</translation>
 <translation id="1600857548979126453">Akses bahagian belakang penyahpepijat halaman</translation>
 <translation id="1601560923496285236">Gunakan</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Tidak dapat menghubungkan peranti ke domain. Pastikan anda belum melebihi jumlah peranti yang boleh ditambahkan.</translation>
 <translation id="1744108098763830590">halaman latar belakang</translation>
 <translation id="1745520510852184940">Sentiasa Terjemahkan</translation>
+<translation id="1746417874336251387">Tawarkan ciri baharu yang menggunakan sambungan telefon anda ke Chromebook anda</translation>
 <translation id="174937106936716857">Jumlah kiraan fail</translation>
 <translation id="175196451752279553">B&amp;uka semula tab yang ditutup</translation>
 <translation id="1753905327828125965">Paling Kerap Dilawati</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Bukan Sebelum</translation>
 <translation id="1933809209549026293">Sila sambungkan tetikus atau papan kekunci. Jika anda menggunakan peranti Buetooth, pastikan ia sedia untuk digandingkan.</translation>
 <translation id="1936157145127842922">Paparkan dalam Folder</translation>
+<translation id="1938351510777341717">Perintah Luaran</translation>
 <translation id="1940546824932169984">Peranti yang disambungkan</translation>
 <translation id="1942765061641586207">Peleraian imej</translation>
+<translation id="1943097386230153518">Pasang perkhidmatan baharu</translation>
 <translation id="1944921356641260203">Kemas kini ditemui</translation>
 <translation id="1951615167417147110">Tatal ke atas satu halaman</translation>
 <translation id="1954813140452229842">Ralat melekapkan perkongsian. Sila semak bukti kelayakan anda dan cuba lagi.</translation>
@@ -1109,6 +1113,7 @@
 <translation id="2653659639078652383">Serah</translation>
 <translation id="265390580714150011">Nilai Medan</translation>
 <translation id="2654166010170466751">Benarkan tapak untuk memasang pengendali pembayaran</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Ciri berbeza-beza mengikut peranti</translation>
 <translation id="2660779039299703961">Acara</translation>
 <translation id="266079277508604648">Tidak dapat menyambungkan pencetak. Pastikan pencetak dihidupkan dan disambungkan kepada Chromebook anda melalui Wi-Fi atau USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1215,6 +1220,7 @@
 <translation id="2803375539583399270">Masukkan PIN</translation>
 <translation id="2805646850212350655">Sistem Fail Penyulitan Microsoft</translation>
 <translation id="2805756323405976993">Apl</translation>
+<translation id="2806891468525657116">Pintasan sudah wujud</translation>
 <translation id="2807517655263062534">Fail yang anda muat turun dipaparkan di sini</translation>
 <translation id="2809586584051668049">dan <ph name="NUMBER_ADDITIONAL_DISABLED" /> lagi</translation>
 <translation id="281133045296806353">Mencipta tetingkap baharu dalam sesi penyemak imbas yang sedia ada.</translation>
@@ -1601,6 +1607,7 @@
 <translation id="3428419049384081277">Anda sudah log masuk!</translation>
 <translation id="3429275422858276529">Tandai halaman ini agar mudah dicari kemudian</translation>
 <translation id="3429599832623003132">$1 item</translation>
+<translation id="3430342160185525240">Mendayakan Assistant untuk menunjukkan pemberitahuan kepada anda.</translation>
 <translation id="3432227430032737297">Alih Keluar Semua Yang Ditunjukkan</translation>
 <translation id="3432757130254800023">Hantar audio dan video untuk disiarkan pada rangkaian tempatan</translation>
 <translation id="3432762828853624962">Pekerja Kongsi</translation>
@@ -1965,6 +1972,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> dalam Panel Kawalan.
 
   Adakah anda ingin memulakan <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Tidak dapat membuat pintasan</translation>
 <translation id="3943582379552582368">&amp;Kembali</translation>
 <translation id="3943857333388298514">Tampal</translation>
 <translation id="3948116654032448504">&amp;Cari Imej di <ph name="SEARCH_ENGINE" /></translation>
@@ -2272,6 +2280,7 @@
 <translation id="4481530544597605423">Peranti dinyahganding</translation>
 <translation id="4482194545587547824">Google boleh menggunakan sejarah penyemakan imbas anda untuk memperibadikan Carian dan perkhidmatan Google yang lain.</translation>
 <translation id="4495419450179050807">Jangan paparkan pada halaman ini</translation>
+<translation id="4499718683476608392">Dayakan Autolengkap kad kredit untuk mengisi borang dengan satu klikan</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> telah ranap</translation>
 <translation id="450099669180426158">Ikon tanda seru</translation>
 <translation id="4501530680793980440">Sahkan Pengalihan Keluar</translation>
@@ -2550,7 +2559,6 @@
 <translation id="4917385247580444890">Kuat</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ingin berkomunikasi dengan sambungan "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Terima</translation>
-<translation id="4920350943031252905">Jalankan alatan, editor dan IDE Linux pada Chromebook anda.</translation>
 <translation id="4920887663447894854">Tapak berikut telah disekat daripada menjejaki lokasi anda pada halaman ini:</translation>
 <translation id="492299503953721473">Alih keluar apl Android</translation>
 <translation id="4923279099980110923">Ya, saya ingin membantu</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Sandaran Awan OS Chrome</translation>
 <translation id="5756163054456765343">P&amp;usat bantuan</translation>
 <translation id="5759728514498647443">Dokumen yang anda hantar untuk dicetak melalui <ph name="APP_NAME" /> boleh dibaca oleh <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Tetapan kad kredit</translation>
 <translation id="5763751966069581670">Tiada peranti USB ditemui</translation>
 <translation id="5764483294734785780">Si&amp;mpan audio sebagai...</translation>
 <translation id="57646104491463491">Tarikh Diubah Suai</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Oops, ralat modul selamat.</translation>
 <translation id="5856721540245522153">Dayakan ciri penyahpepijatan</translation>
 <translation id="5857090052475505287">Folder Baharu</translation>
+<translation id="585979798156957858">Meta Luaran</translation>
 <translation id="5860033963881614850">Dimatikan</translation>
 <translation id="5860209693144823476">Tab 3</translation>
 <translation id="5860491529813859533">Hidupkan</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Autopenemuan proksi web</translation>
 <translation id="6333064448949140209">Fail akan dihantar kepada Google untuk dinyahpepijat</translation>
 <translation id="6333834492048057036">Fokus bar alamat untuk carian</translation>
+<translation id="6336451774241870485">Tab peribadi baharu</translation>
 <translation id="6339668969738228384">Buat profil baharu untuk <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Tidak dapat menyambung ke pelayan. Sila semak sambungan rangkaian anda dan cuba lagi. Sekiranya masalah ini berterusan, mulakan semula Chromebook anda.</translation>
 <translation id="6340071272923955280">Protokol Cetakan Internet (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">Maklumat fail</translation>
 <translation id="6607831829715835317">Lagi al&amp;at</translation>
+<translation id="6610147964972079463">Tutup tab peribadi</translation>
 <translation id="6612358246767739896">Kandungan yang dilindungi</translation>
 <translation id="6613452264606394692">Tandai halaman ini untuk kembali ke sini dengan cepat</translation>
 <translation id="6614893213975402384">Pasang kemas kini &amp; apl. Dengan meneruskan, anda bersetuju bahawa peranti ini mungkin turut memuat turun dan memasang kemas kini serta apl secara automatik daripada Google, pembawa anda dan pengeluar peranti anda mungkin menggunakan data selular. Sesetengah apl ini mungkin menawarkan pembelian dalam apl. Anda boleh mengalih keluar apl ini pada bila-bila masa. <ph name="BEGIN_LINK1" />Ketahui Lebih Lanjut<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">Sebelumnya</translation>
 <translation id="6718273304615422081">Mengezip...</translation>
 <translation id="671928215901716392">Kunci skrin</translation>
+<translation id="6720847671508630642">Kongsi ciri terbaik Android dengan Chromebook anda secara automatik. Sambungkan telefon anda agar anda dapat menghantar teks dari komputer anda, berkongsi sambungan Internet telefon anda dan membuka kunci skrin Chromebook anda. <ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Lihat jenama dan model Kunci Keselamatan anda</translation>
 <translation id="6721972322305477112">&amp;Fail</translation>
 <translation id="672213144943476270">Sila buka kunci profil anda sebelum menyemak imbas sebagai tetamu.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">Cetak Halaman Tertentu</translation>
 <translation id="6972180789171089114">Audio/Video</translation>
 <translation id="6973630695168034713">Folder</translation>
+<translation id="6974609594866392343">Mod tunjuk cara luar talian</translation>
 <translation id="6976108581241006975">Konsol JavaScript</translation>
 <translation id="6977381486153291903">Semakan perisian tegar</translation>
 <translation id="6978121630131642226">Enjin Carian</translation>
@@ -4487,6 +4501,7 @@
 <translation id="7857949311770343000">Adakah ini halaman tab baharu yang anda jangkakan?</translation>
 <translation id="786073089922909430">Perkhidmatan: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Muat turun</translation>
+<translation id="7864662577698025113">Tambah perkhidmatan baharu</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 kuki}other{# kuki}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Digandingkan</translation>
 <translation id="7870730066603611552">Semak pilihan penyegerakan selepas persediaan</translation>
@@ -5002,6 +5017,7 @@
 <translation id="8666584013686199826">Tanya apabila tapak mahu mengakses peranti USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> kini dipaparkan dalam skrin penuh dan telah melumpuhkan kursor tetikus.</translation>
 <translation id="8669284339312441707">Hangat</translation>
+<translation id="8669919703154928649">Benarkan Assistant menunjukkan pemberitahuan kepada anda</translation>
 <translation id="8669949407341943408">Bergerak...</translation>
 <translation id="8671210955687109937">Boleh ulas</translation>
 <translation id="8673026256276578048">Cari di Web...</translation>
@@ -5389,6 +5405,7 @@
 <translation id="964286338916298286">Pentadbir IT anda telah melumpuhkan Chrome Goodies untuk peranti anda.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplikasi}other{Aplikasi}}</translation>
 <translation id="967007123645306417">Ini akan melog anda keluar daripada akaun Google anda. Perubahan kepada penanda halaman, sejarah, kata laluan dan tetapan anda yang lain tidak akan disegerakkan ke Akaun Google anda lagi. Walau bagaimanapun, data sedia ada akan kekal disimpan dalam Akaun Google anda dan boleh diuruskan di <ph name="BEGIN_LINK" />Papan Pemuka Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Data disimpan</translation>
 <translation id="968000525894980488">Hidupkan perkhidmatan Google Play.</translation>
 <translation id="968174221497644223">Cache aplikasi</translation>
 <translation id="969096075394517431">Tukar bahasa</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index 389fdd43..5243b75c 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Toon spelling en grammatica</translation>
 <translation id="1593594475886691512">Formatteren...</translation>
 <translation id="159359590073980872">Cache met afbeeldingen</translation>
+<translation id="1593926297800505364">Betaalmethode opslaan</translation>
 <translation id="1598233202702788831">Updates zijn uitgeschakeld door je beheerder.</translation>
 <translation id="1600857548979126453">Back-end voor foutopsporing van pagina openen</translation>
 <translation id="1601560923496285236">Toepassen</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Kan het apparaat niet aan het domein koppelen. Zorg ervoor dat je het aantal apparaten dat je kunt toevoegen niet overschrijdt.</translation>
 <translation id="1744108098763830590">achtergrondpagina</translation>
 <translation id="1745520510852184940">Dit altijd doen</translation>
+<translation id="1746417874336251387">Nieuwe functies aanbieden die de verbinding van je telefoon met je Chromebook gebruiken</translation>
 <translation id="174937106936716857">Totaal aantal bestanden</translation>
 <translation id="175196451752279553">Gesloten tabblad opni&amp;euw openen</translation>
 <translation id="1753905327828125965">Meest bezocht</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Niet vóór</translation>
 <translation id="1933809209549026293">Sluit een muis of een toetsenbord aan. Als je een Bluetooth-apparaat gebruikt, zorg je ervoor dat dit kan worden gekoppeld.</translation>
 <translation id="1936157145127842922">Weergeven in map</translation>
+<translation id="1938351510777341717">Externe opdracht</translation>
 <translation id="1940546824932169984">Verbonden apparaten</translation>
 <translation id="1942765061641586207">Afbeeldingsresolutie</translation>
+<translation id="1943097386230153518">Nieuwe service installeren</translation>
 <translation id="1944921356641260203">Update gevonden</translation>
 <translation id="1951615167417147110">Eén pagina omhoog bladeren</translation>
 <translation id="1954813140452229842">Fout bij het activeren van de fileshare. Controleer je inloggegevens en probeer het opnieuw.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Verzenden</translation>
 <translation id="265390580714150011">Veldwaarde</translation>
 <translation id="2654166010170466751">Toestaan dat sites betalingshandlers installeren</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Functies verschillen per apparaat</translation>
 <translation id="2660779039299703961">Gebeurtenis</translation>
 <translation id="266079277508604648">Verbinding met printer niet mogelijk. Controleer of de printer is ingeschakeld en via wifi of USB is verbonden met je Chromebook.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Pincode opgeven</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">Apps</translation>
+<translation id="2806891468525657116">Snelkoppeling bestaat al</translation>
 <translation id="2807517655263062534">Bestanden die je downloadt, worden hier weergegeven</translation>
 <translation id="2809586584051668049">en <ph name="NUMBER_ADDITIONAL_DISABLED" /> meer</translation>
 <translation id="281133045296806353">Er is een nieuw venster gemaakt in de bestaande browsersessie.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Je bent ingelogd.</translation>
 <translation id="3429275422858276529">Stel een bladwijzer in voor deze pagina zodat je de pagina later makkelijk kunt terugvinden</translation>
 <translation id="3429599832623003132">$1 items</translation>
+<translation id="3430342160185525240">Hiermee kan de Assistent je meldingen laten zien.</translation>
 <translation id="3432227430032737297">Alle weergegeven verwijderen</translation>
 <translation id="3432757130254800023">Audio en video verzenden naar displays in het lokale netwerk</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> in het Configuratiescherm.
 
   Wil je <ph name="CONTROL_PANEL_APPLET_NAME" /> starten?</translation>
+<translation id="394183848452296464">Kan snelkoppeling niet maken</translation>
 <translation id="3943582379552582368">&amp;Vorige</translation>
 <translation id="3943857333388298514">Plak</translation>
 <translation id="3948116654032448504">&amp;Afbeelding zoeken in <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Ontkoppelde apparaten</translation>
 <translation id="4482194545587547824">Google kan je browsegeschiedenis gebruiken om Google Zoeken en andere Google-services te personaliseren</translation>
 <translation id="4495419450179050807">Niet op deze pagina weergeven</translation>
+<translation id="4499718683476608392">Automatisch aanvullen van creditcardgegevens inschakelen om formulieren met één klik in te vullen</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> is gecrasht</translation>
 <translation id="450099669180426158">Uitroeptekenpictogram</translation>
 <translation id="4501530680793980440">Verwijderen bevestigen</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Sterk</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> wil communiceren met de extensie '<ph name="EXTENSION_NAME" />'</translation>
 <translation id="4918086044614829423">Accepteren</translation>
-<translation id="4920350943031252905">Voer Linux-tools, -editors en -IDE's op je Chromebook uit.</translation>
 <translation id="4920887663447894854">De volgende sites kunnen je locatie op deze pagina niet bijhouden:</translation>
 <translation id="492299503953721473">Android-apps verwijderen</translation>
 <translation id="4923279099980110923">Ja, ik wil helpen</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Cloudback-up van Chrome OS</translation>
 <translation id="5756163054456765343">H&amp;elpcentrum</translation>
 <translation id="5759728514498647443">Documenten die je via <ph name="APP_NAME" /> verzendt om af te drukken, kunnen door <ph name="APP_NAME" /> worden gelezen.</translation>
+<translation id="5762172915276660232">Creditcardinstellingen</translation>
 <translation id="5763751966069581670">Geen USB-apparaten gevonden</translation>
 <translation id="5764483294734785780">Audio op&amp;slaan als...</translation>
 <translation id="57646104491463491">Bijgewerkt op</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Fout met beveiligde module.</translation>
 <translation id="5856721540245522153">Foutopsporingsfuncties inschakelen</translation>
 <translation id="5857090052475505287">Nieuwe map</translation>
+<translation id="585979798156957858">Externe meta</translation>
 <translation id="5860033963881614850">Uit</translation>
 <translation id="5860209693144823476">Tabblad 3</translation>
 <translation id="5860491529813859533">Inschakelen</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Webproxy automatisch vinden</translation>
 <translation id="6333064448949140209">Bestanden worden naar Google gestuurd voor foutopsporing</translation>
 <translation id="6333834492048057036">Focus op adresbalk voor zoeken</translation>
+<translation id="6336451774241870485">Nieuw privétabblad</translation>
 <translation id="6339668969738228384">Een nieuw profiel maken voor <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Kan geen verbinding maken met de server. Controleer de netwerkverbinding en probeer het opnieuw. Als het probleem blijft optreden, start je de Chromebook opnieuw op.</translation>
 <translation id="6340071272923955280">Internetafdrukprotocol (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">Tabblad 8</translation>
 <translation id="6607272825297743757">Bestandsinformatie</translation>
 <translation id="6607831829715835317">Meer hu&amp;lpprogramma's</translation>
+<translation id="6610147964972079463">Privétabbladen sluiten</translation>
 <translation id="6612358246767739896">Beveiligde content</translation>
 <translation id="6613452264606394692">Keer hier snel terug door een bladwijzer voor deze pagina in te stellen</translation>
 <translation id="6614893213975402384">Updates en apps installeren. Als je doorgaat, ga je ermee akkoord dat dit apparaat ook automatisch updates en apps van Google, je provider en de fabrikant van dit apparaat kan downloaden en installeren, en dat hiervoor mogelijk mobiele data worden gebruikt. Sommige van deze apps kunnen in-app-aankopen aanbieden. Je kunt deze apps op elk gewenst moment verwijderen. <ph name="BEGIN_LINK1" />Meer informatie<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">Vorige</translation>
 <translation id="6718273304615422081">Inpakken...</translation>
 <translation id="671928215901716392">Scherm vergrendelen</translation>
+<translation id="6720847671508630642">Deel het beste van Android automatisch met je Chromebook. Koppel je telefoon zodat je kunt sms'en vanaf je computer, de internetverbinding van je telefoon kunt delen en je Chromebook-scherm kunt ontgrendelen.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Meer informatie<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Het merk en het model van je beveiligingssleutel bekijken</translation>
 <translation id="6721972322305477112">&amp;Archief</translation>
 <translation id="672213144943476270">Ontgrendel je profiel voordat je browst als gast.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">Specifieke pagina's afdrukken</translation>
 <translation id="6972180789171089114">Audio/video</translation>
 <translation id="6973630695168034713">Mappen</translation>
+<translation id="6974609594866392343">Offline demomodus</translation>
 <translation id="6976108581241006975">JavaScript-console</translation>
 <translation id="6977381486153291903">Firmwarerevisie</translation>
 <translation id="6978121630131642226">Zoekmachines</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Is dit de nieuwe pagina met tabbladen die je had verwacht?</translation>
 <translation id="786073089922909430">Service: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
+<translation id="7864662577698025113">Nieuwe service toevoegen</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - gekoppeld</translation>
 <translation id="7870730066603611552">Synchronisatieopties bekijken na de installatie</translation>
@@ -5000,6 +5015,7 @@
 <translation id="8666584013686199826">Goedkeuring vragen wanneer een site toegang wil hebben tot USB-apparaten</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> is nu een volledig scherm en heeft je muisaanwijzer uitgeschakeld.</translation>
 <translation id="8669284339312441707">Warmer</translation>
+<translation id="8669919703154928649">Toestaan dat de Assistent je meldingen laat zien</translation>
 <translation id="8669949407341943408">Verplaatsen…</translation>
 <translation id="8671210955687109937">Mag reageren</translation>
 <translation id="8673026256276578048">Zoeken op internet...</translation>
@@ -5388,6 +5404,7 @@
 <translation id="964286338916298286">Je IT-beheerder heeft Chrome-extra's uitgeschakeld voor je apparaat.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{App}other{Apps}}</translation>
 <translation id="967007123645306417">Hiermee word je uitgelogd van je Google-accounts. Wijzigingen in je bladwijzers, geschiedenis, wachtwoorden en andere instellingen worden niet meer gesynchroniseerd met je Google-account. Je bestaande gegevens blijven echter opgeslagen in je Google-account en kunnen worden beheerd via <ph name="BEGIN_LINK" />Google Dashboard<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Opgeslagen gegevens</translation>
 <translation id="968000525894980488">Schakel Google Play-services in.</translation>
 <translation id="968174221497644223">Applicatiecache</translation>
 <translation id="969096075394517431">Talen wijzigen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index d83a9c2..18dccfb 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">Vis stavekontroll og grammatikk</translation>
 <translation id="1593594475886691512">Formaterer …</translation>
 <translation id="159359590073980872">Bildebuffer</translation>
+<translation id="1593926297800505364">Lagre betalingsmåte</translation>
 <translation id="1598233202702788831">Administratoren din har slått av oppdateringer.</translation>
 <translation id="1600857548979126453">få tilgang til bakdata for sidefeilsøkingsprogrammet</translation>
 <translation id="1601560923496285236">Bruk</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">Kan ikke knytte enheten til domenet. Kontrollér at du ikke har overskredet antall enheter som du kan legge til.</translation>
 <translation id="1744108098763830590">bakgrunnsside</translation>
 <translation id="1745520510852184940">Gjør alltid dette</translation>
+<translation id="1746417874336251387">Legg til nye funksjoner som bruker telefonens tilkobling på Chromebooken din</translation>
 <translation id="174937106936716857">Totalt antall filer</translation>
 <translation id="175196451752279553">Gj&amp;enåpne den lukkede fanen</translation>
 <translation id="1753905327828125965">Mest besøkt</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">Ikke før</translation>
 <translation id="1933809209549026293">Du må koble til en mus eller et tastatur. Hvis du bruker en Bluetooth-enhet, må du sjekke at den er klar til å kobles til.</translation>
 <translation id="1936157145127842922">Vis i mappe</translation>
+<translation id="1938351510777341717">Ekstern kommando</translation>
 <translation id="1940546824932169984">Tilkoblede enheter</translation>
 <translation id="1942765061641586207">Bildeoppløsning</translation>
+<translation id="1943097386230153518">Installer ny tjeneste</translation>
 <translation id="1944921356641260203">En oppdatering ble funnet</translation>
 <translation id="1951615167417147110">Rull én side oppover</translation>
 <translation id="1954813140452229842">Feil ved innsetting av deling. Sjekk legitimasjonen og prøv igjen.</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2653659639078652383">Send</translation>
 <translation id="265390580714150011">Feltverdi</translation>
 <translation id="2654166010170466751">Tillat at nettsteder installerer betalingsbehandlere</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funksjonene varierer fra enhet til enhet</translation>
 <translation id="2660779039299703961">Aktivitet</translation>
 <translation id="266079277508604648">Kan ikke koble til skriveren. Kontrollér at skriveren er slått på og koblet til Chromebooken din via Wi-Fi eller USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1191,7 +1196,7 @@
 <translation id="2775104091073479743">Endre fingeravtrykk</translation>
 <translation id="2776441542064982094">Det ser ut til at det ikke er noen enheter som kan registreres på nettverket. Hvis enheten din er slått på og koblet til Internett, kan du prøve å registrere den ved å følge instruksjonene i instruksjonshåndboken.</translation>
 <translation id="2781692009645368755">Google Pay</translation>
-<translation id="2782104745158847185">Feil ived installasjon av Linux-programmet</translation>
+<translation id="2782104745158847185">Feil ved installasjon av Linux-programmet</translation>
 <translation id="2783298271312924866">Lastet ned</translation>
 <translation id="2783321960289401138">Opprett snarvei</translation>
 <translation id="2783829359200813069">Velg krypteringstyper</translation>
@@ -1210,6 +1215,7 @@
 <translation id="2803375539583399270">Skriv inn PIN-koden</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">Apper</translation>
+<translation id="2806891468525657116">Snarveien fins allerede.</translation>
 <translation id="2807517655263062534">Filer du laster ned, vises her</translation>
 <translation id="2809586584051668049">og <ph name="NUMBER_ADDITIONAL_DISABLED" /> til</translation>
 <translation id="281133045296806353">Opprettet nytt vindu i eksisterende nettleserøkt.</translation>
@@ -1595,6 +1601,7 @@
 <translation id="3428419049384081277">Du er pålogget</translation>
 <translation id="3429275422858276529">Sett denne siden som bokmerke for å finne den enkelt senere</translation>
 <translation id="3429599832623003132">$1 elementer</translation>
+<translation id="3430342160185525240">Gjør at assistenten kan vise deg rvarsler.</translation>
 <translation id="3432227430032737297">Fjern alle som vises</translation>
 <translation id="3432757130254800023">Send lyd og bilde til skjermer på lokalnettverket</translation>
 <translation id="3432762828853624962">Delte arbeidere (SharedWorker)</translation>
@@ -1878,7 +1885,7 @@
 <translation id="3827774300009121996">&amp;Full skjerm</translation>
 <translation id="3828029223314399057">Søk i bokmerker</translation>
 <translation id="3830674330436234648">Ingen avspillinger er tilgjengelige</translation>
-<translation id="3831436149286513437">Søkeforslag fra Google disk</translation>
+<translation id="3831436149286513437">Søkeforslag fra Google Disk</translation>
 <translation id="3831486154586836914">Du er i modusen for vindusoversikt</translation>
 <translation id="383161972796689579">Eieren av denne enheten har deaktivert tillegging av nye brukere</translation>
 <translation id="3834775135533257713">Kunne ikke legge til appen «<ph name="TO_INSTALL_APP_NAME" />» fordi den er i konflikt med «<ph name="INSTALLED_APP_NAME" />».</translation>
@@ -1957,6 +1964,7 @@
 <translation id="3941357410013254652">Kanal-ID</translation>
 <translation id="3941565636838060942">Hvis du vil skjule tilgangen til dette programmet, må du avinstallere det ved hjelp av  <ph name="CONTROL_PANEL_APPLET_NAME" /> i kontrollpanelet.
   Vil du starte <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Kan ikke opprette snarvei</translation>
 <translation id="3943582379552582368">Til&amp;bake</translation>
 <translation id="3943857333388298514">Lim inn</translation>
 <translation id="3948116654032448504">&amp;Søk etter bilder i <ph name="SEARCH_ENGINE" /></translation>
@@ -2264,6 +2272,7 @@
 <translation id="4481530544597605423">Frakoblede enheter</translation>
 <translation id="4482194545587547824">Google kan bruke nettlesingsloggen din for å gi Søk og andre Google-tjenester et personlig preg</translation>
 <translation id="4495419450179050807">Ikke vis på denne siden</translation>
+<translation id="4499718683476608392">Slå på kredittkort-autofyll for å fylle ut skjemaer ved hjelp av ett enkelt klikk</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> har kræsjet</translation>
 <translation id="450099669180426158">Utropstegnikon</translation>
 <translation id="4501530680793980440">Bekreftelse av fjerning</translation>
@@ -2542,7 +2551,6 @@
 <translation id="4917385247580444890">Sterk</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ønsker å kommunisere med «<ph name="EXTENSION_NAME" />»-utvidelsen</translation>
 <translation id="4918086044614829423">Godta</translation>
-<translation id="4920350943031252905">Kjør Linux-verktøy, redigeringsverktøy og IDE-er på Chromebook.</translation>
 <translation id="4920887663447894854">Følgende nettsteder har blitt nektet tillatelse til å spore posisjonen din på siden:</translation>
 <translation id="492299503953721473">Fjern Android-appene</translation>
 <translation id="4923279099980110923">Ja, jeg ønsker å hjelpe</translation>
@@ -3107,6 +3115,7 @@
 <translation id="5752453871435543420">Skybaserte sikkerhetskopier for Chrome OS</translation>
 <translation id="5756163054456765343">&amp;Brukerstøtte</translation>
 <translation id="5759728514498647443">Dokumenter du sender til utskrift via <ph name="APP_NAME" />, kan leses av <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Innstillinger for kredittkort</translation>
 <translation id="5763751966069581670">Fant ingen USB-enheter</translation>
 <translation id="5764483294734785780">La&amp;gre lyd som</translation>
 <translation id="57646104491463491">Dato endret</translation>
@@ -3178,6 +3187,7 @@
 <translation id="5855773610748894548">Beklager – feil i den sikre modulen.</translation>
 <translation id="5856721540245522153">Slå på feilsøkingsfunksjoner</translation>
 <translation id="5857090052475505287">Ny mappe</translation>
+<translation id="585979798156957858">Ekstern Meta</translation>
 <translation id="5860033963881614850">Av</translation>
 <translation id="5860209693144823476">Fane 3</translation>
 <translation id="5860491529813859533">Slå på</translation>
@@ -3487,6 +3497,7 @@
 <translation id="6327785803543103246">Automatisk oppdagelse av proxy-tjenere</translation>
 <translation id="6333064448949140209">Filen sendes til Google for feilsøking</translation>
 <translation id="6333834492048057036">Fokusér på adressefeltet for søk</translation>
+<translation id="6336451774241870485">Ny privatfane</translation>
 <translation id="6339668969738228384">Opprett en ny profil for <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Kunne ikke koble til tjeneren. Kontrollér nettverkstilkoblingen din, og prøv igjen. Start Chromebooken på nytt hvis problemet vedvarer.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3667,6 +3678,7 @@
 <translation id="6606070663386660533">Fane 8</translation>
 <translation id="6607272825297743757">Filinformasjon</translation>
 <translation id="6607831829715835317">Flere verktøy</translation>
+<translation id="6610147964972079463">Lukk privatefaner</translation>
 <translation id="6612358246767739896">Beskyttet innhold</translation>
 <translation id="6613452264606394692">Kom raskt tilbake hit ved å sette denne siden som bokmerke</translation>
 <translation id="6614893213975402384">Installer oppdateringer og apper. Ved å fortsette godtar du at denne enheten også kan laste ned og installere oppdateringer automatisk fra Google, operatøren din og produsenten av enheten. Dette bruker muligens mobildata. Noen av disse appene kan inneholde kjøp i app-funksjonalitet. Du kan fjerne disse appene når som helst. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation>
@@ -3737,6 +3749,7 @@
 <translation id="6710213216561001401">Forrige</translation>
 <translation id="6718273304615422081">Zipper ...</translation>
 <translation id="671928215901716392">Lås skjerm</translation>
+<translation id="6720847671508630642">Koble til telefonen, slik at du kan sende tekstmeldinger fra datamaskinen din, dele telefonens Internett-tilkobling og låse opp Chromebook-skjermen. <ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">se merket og modellen til sikkerhetsnøkkelen din</translation>
 <translation id="6721972322305477112">&amp;Fil</translation>
 <translation id="672213144943476270">Du må låse opp profilen din før du kan surfe som gjest.</translation>
@@ -3883,6 +3896,7 @@
 <translation id="6970856801391541997">Skriv ut bestemte sider</translation>
 <translation id="6972180789171089114">Lyd og video</translation>
 <translation id="6973630695168034713">Mapper</translation>
+<translation id="6974609594866392343">Frakoblet demomodus</translation>
 <translation id="6976108581241006975">JavaScript-konsoll</translation>
 <translation id="6977381486153291903">Fastvareversjon</translation>
 <translation id="6978121630131642226">Søkemotorer</translation>
@@ -4475,6 +4489,7 @@
 <translation id="7857949311770343000">Er dette den nye fanen du ventet på?</translation>
 <translation id="786073089922909430">Tjeneste: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">Ne&amp;dlastinger</translation>
+<translation id="7864662577698025113">Legg til ny tjeneste</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 informasjonskapsel}other{# informasjonskapsler}}</translation>
 <translation id="786957569166715433">«<ph name="DEVICE_NAME" />» er tilkoblet</translation>
 <translation id="7870730066603611552">Gå gjennom alternativene for synkronisering etter konfigureringen</translation>
@@ -4989,6 +5004,7 @@
 <translation id="8666584013686199826">Spør når et nettsted vil ha tilgang til USB-enheter</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> vises nå i fullskjermsvisning, og har deaktivert markøren din.</translation>
 <translation id="8669284339312441707">Varmere</translation>
+<translation id="8669919703154928649">La assistenten vis deg varslene</translation>
 <translation id="8669949407341943408">Flytter …</translation>
 <translation id="8671210955687109937">Kan kommentere</translation>
 <translation id="8673026256276578048">Søk på nettet</translation>
@@ -5376,6 +5392,7 @@
 <translation id="964286338916298286">IT-administratoren din har deaktivert ekstrafunksjoner for Chrome på enheten din.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Program}other{Programmer}}</translation>
 <translation id="967007123645306417">Dette logger deg av Google-kontoene dine. Endringer i bokmerkene, loggen, passordene og andre innstillinger du har, blir ikke lenger synkronisert med Google-kontoen din. Data som allerede er lagret i Google-kontoen din, blir imidlertid værende og kan administreres ved hjelp av <ph name="BEGIN_LINK" />Google Oversikt<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Lagrede data</translation>
 <translation id="968000525894980488">Slå på Google Play Tjenester.</translation>
 <translation id="968174221497644223">Programbuffer</translation>
 <translation id="969096075394517431">Endre språk</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 1551595..23ded9f 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Pokaż pisownię i gramatykę</translation>
 <translation id="1593594475886691512">Formatuję...</translation>
 <translation id="159359590073980872">Pamięć podręczna grafiki</translation>
+<translation id="1593926297800505364">Zapisz formę płatności</translation>
 <translation id="1598233202702788831">Aktualizacje zostały wyłączone przez administratora.</translation>
 <translation id="1600857548979126453">Dostęp do backendu debugera stron</translation>
 <translation id="1601560923496285236">Zastosuj</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Nie można dołączyć urządzenia do domeny. Upewnij się, że nie została przekroczona dozwolona liczba urządzeń.</translation>
 <translation id="1744108098763830590">strona w tle</translation>
 <translation id="1745520510852184940">Tłumacz zawsze</translation>
+<translation id="1746417874336251387">Nowe funkcje używające połączenia telefonu z Chromebookiem</translation>
 <translation id="174937106936716857">Łączna liczba plików</translation>
 <translation id="175196451752279553">Prz&amp;ywróć zamkniętą kartę</translation>
 <translation id="1753905327828125965">Najczęstsze</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Nie wcześniej niż</translation>
 <translation id="1933809209549026293">Podłącz mysz lub klawiaturę. Jeśli używasz urządzenia Bluetooth, upewnij się, że jest ono gotowe do sparowania.</translation>
 <translation id="1936157145127842922">Pokaż w folderze</translation>
+<translation id="1938351510777341717">Polecenie zewnętrzne</translation>
 <translation id="1940546824932169984">Połączone urządzenia</translation>
 <translation id="1942765061641586207">Rozdzielczość grafiki</translation>
+<translation id="1943097386230153518">Zainstaluj nową usługę</translation>
 <translation id="1944921356641260203">Znaleziono aktualizację</translation>
 <translation id="1951615167417147110">Przewiń o jedną stronę w górę</translation>
 <translation id="1954813140452229842">Błąd podczas podłączania udziału. Sprawdź dane logowania i spróbuj ponownie.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Prześlij</translation>
 <translation id="265390580714150011">Wartość pola</translation>
 <translation id="2654166010170466751">Zezwalaj stronom na instalowanie modułów do obsługi płatności</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Dostępne funkcje zależą od urządzenia</translation>
 <translation id="2660779039299703961">Wydarzenie</translation>
 <translation id="266079277508604648">Nie można połączyć z drukarką. Upewnij się, że drukarka jest włączona i podłączona do Chromebooka przez Wi-Fi lub USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Wpisz kod PIN</translation>
 <translation id="2805646850212350655">System szyfrowania plików firmy Microsoft</translation>
 <translation id="2805756323405976993">Aplikacje</translation>
+<translation id="2806891468525657116">Skrót już istnieje</translation>
 <translation id="2807517655263062534">Tutaj wyświetlają się pobrane pliki</translation>
 <translation id="2809586584051668049">i jeszcze <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Utworzono nowe okno w istniejącej sesji przeglądarki.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Jesteś zalogowany</translation>
 <translation id="3429275422858276529">Dodaj tę stronę do zakładek, by później łatwo ją znaleźć</translation>
 <translation id="3429599832623003132">Elementy: $1</translation>
+<translation id="3430342160185525240">Umożliwia Asystentowi wyświetlanie powiadomień.</translation>
 <translation id="3432227430032737297">Usuń wszystkie wyświetlone</translation>
 <translation id="3432757130254800023">Wysyłanie obrazu i dźwięku na ekrany w sieci lokalnej</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   używając apletu <ph name="CONTROL_PANEL_APPLET_NAME" /> w Panelu sterowania.
 
   Uruchomić aplet <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Nie można utworzyć skrótu</translation>
 <translation id="3943582379552582368">&amp;Wstecz</translation>
 <translation id="3943857333388298514">Wklej</translation>
 <translation id="3948116654032448504">&amp;Szukaj obrazu w <ph name="SEARCH_ENGINE" /></translation>
@@ -2170,7 +2178,7 @@
 <translation id="428608937826130504">8 element na półce</translation>
 <translation id="4287502004382794929">Nie masz wystarczającej liczby licencji na oprogramowanie, by zarejestrować to urządzenie. Aby dokupić licencje, skontaktuj się z działem sprzedaży. Jeśli uważasz, że widzisz tę wiadomość z powodu błędu, skontaktuj się z obsługą klienta.</translation>
 <translation id="4289540628985791613">Przegląd</translation>
-<translation id="4295072614469448764">Aplikacja jest teraz dostępna w terminalu. Może mieć też ikonę w Menu z aplikacjami.</translation>
+<translation id="4295072614469448764">Aplikacja jest teraz dostępna na terminalu. Może mieć też ikonę w Menu z aplikacjami.</translation>
 <translation id="4296575653627536209">Dodaj nadzorowanego użytkownika</translation>
 <translation id="4297219207642690536">Uruchom ponownie i zresetuj</translation>
 <translation id="4297322094678649474">Zmień języki</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Niesparowane urządzenia</translation>
 <translation id="4482194545587547824">Google może korzystać z Twojej historii przeglądania, by dostosowywać wyniki wyszukiwania i działanie innych usług</translation>
 <translation id="4495419450179050807">Nie pokazuj na tej stronie</translation>
+<translation id="4499718683476608392">Włącz autouzupełnianie danych karty kredytowej, by wypełniać formularze jednym kliknięciem</translation>
 <translation id="4500114933761911433">We wtyczce <ph name="PLUGIN_NAME" /> wystąpił poważny błąd</translation>
 <translation id="450099669180426158">Ikona wykrzyknika</translation>
 <translation id="4501530680793980440">Potwierdź usunięcie</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Silny</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> chce nawiązać połączenie z rozszerzeniem „<ph name="EXTENSION_NAME" />”</translation>
 <translation id="4918086044614829423">Akceptuj</translation>
-<translation id="4920350943031252905">Używaj na Chromebooku narzędzi, edytorów i IDE na Linuksa.</translation>
 <translation id="4920887663447894854">Następującym witrynom zablokowano możliwość śledzenia Twojej lokalizacji na tej stronie:</translation>
 <translation id="492299503953721473">Usuń aplikacje na Androida</translation>
 <translation id="4923279099980110923">Tak, chcę pomóc</translation>
@@ -3066,7 +3074,7 @@
 <translation id="5677503058916217575">Język strony:</translation>
 <translation id="5677928146339483299">Zablokowane</translation>
 <translation id="5678550637669481956">Uprawnienia do zapisu i odczytu nośnika <ph name="VOLUME_NAME" /> zostały przyznane.</translation>
-<translation id="5678784840044122290">Aplikacja na Linuksa będzie dostępna w terminalu. Może mieć też ikonę w Menu z aplikacjami.</translation>
+<translation id="5678784840044122290">Aplikacja na Linuksa będzie dostępna na terminalu. Może mieć też ikonę w Menu z aplikacjami.</translation>
 <translation id="5678955352098267522">Odczyt Twoich danych na stronie <ph name="WEBSITE_1" /></translation>
 <translation id="5684661240348539843">Identyfikator zasobu</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Nie można odłączyć archiwum lub dysku wirtualnego<ph name="END_BOLD" />
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Kopia zapasowa Chrome OS w chmurze</translation>
 <translation id="5756163054456765343">C&amp;entrum pomocy</translation>
 <translation id="5759728514498647443">Dokumenty wysłane do drukowania z aplikacji <ph name="APP_NAME" /> można odczytać w aplikacji <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Ustawienia kart kredytowych</translation>
 <translation id="5763751966069581670">Nie znaleziono urządzeń USB</translation>
 <translation id="5764483294734785780">Za&amp;pisz element audio jako...</translation>
 <translation id="57646104491463491">Data modyfikacji</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Ups, błąd modułu zabezpieczeń.</translation>
 <translation id="5856721540245522153">Włącz funkcje debugowania</translation>
 <translation id="5857090052475505287">Nowy folder</translation>
+<translation id="585979798156957858">Zewnętrzny klawisz Meta</translation>
 <translation id="5860033963881614850">Wyłączone</translation>
 <translation id="5860209693144823476">Karta 3</translation>
 <translation id="5860491529813859533">Włącz</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Automatyczne wykrywanie internetowego serwera proxy</translation>
 <translation id="6333064448949140209">Plik zostanie wysłany do Google w celu debugowania</translation>
 <translation id="6333834492048057036">Zaznacz pasek adresu, by przeprowadzić wyszukiwanie</translation>
+<translation id="6336451774241870485">Nowa karta prywatna</translation>
 <translation id="6339668969738228384">Utwórz nowy profil dla adresu <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Nie udało połączyć się z serwerem. Sprawdź połączenie sieciowe i spróbuj ponownie. Jeśli problem nie zniknie, uruchom ponownie Chromebooka.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Karta 8</translation>
 <translation id="6607272825297743757">Informacje o pliku</translation>
 <translation id="6607831829715835317">Więcej narzę&amp;dzi</translation>
+<translation id="6610147964972079463">Zamknij karty prywatne</translation>
 <translation id="6612358246767739896">Treść chroniona</translation>
 <translation id="6613452264606394692">Dodaj tę stronę do zakładek, by szybko na nią wrócić</translation>
 <translation id="6614893213975402384">Instalowanie aktualizacji i aplikacji. Przechodząc dalej, zgadzasz się, że urządzenie może też automatycznie pobierać i instalować aktualizacje oraz aplikacje od Google, Twojego operatora i producenta urządzenia oraz że może się to odbywać z użyciem komórkowej transmisji danych. Niektóre z tych aplikacji mogą oferować zakupy w aplikacji. Te aplikacje możesz w dowolnym momencie usunąć. <ph name="BEGIN_LINK1" />Więcej informacji<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Wstecz</translation>
 <translation id="6718273304615422081">Pakuję...</translation>
 <translation id="671928215901716392">Zablokuj ekran</translation>
+<translation id="6720847671508630642">Automatycznie korzystaj z najlepszych funkcji Androida na Chromebooku. Połącz urządzenie ze swoim telefonem, by wysyłać SMS-y z komputera, udostępniać połączenie internetowe z telefonu i odblokowywać ekran Chromebooka.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Odczytywanie marki i modelu klucza bezpieczeństwa</translation>
 <translation id="6721972322305477112">&amp;Plik</translation>
 <translation id="672213144943476270">Aby przeglądać jako gość, odblokuj swój profil.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Drukuj wybrane strony</translation>
 <translation id="6972180789171089114">Audio/wideo</translation>
 <translation id="6973630695168034713">Foldery</translation>
+<translation id="6974609594866392343">Tryb demo offline</translation>
 <translation id="6976108581241006975">Konsola JavaScript</translation>
 <translation id="6977381486153291903">Wersja oprogramowania</translation>
 <translation id="6978121630131642226">Wyszukiwarki</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Czy to oczekiwana strona nowej karty?</translation>
 <translation id="786073089922909430">Usługa: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Pobrane pliki</translation>
+<translation id="7864662577698025113">Dodaj nową usługę</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 plik cookie}few{# pliki cookie}many{# plików cookie}other{# pliku cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – sparowano</translation>
 <translation id="7870730066603611552">Sprawdź opcje synchronizowania po konfiguracji</translation>
@@ -5001,6 +5016,7 @@
 <translation id="8666584013686199826">Pytaj, gdy strona chce uzyskać dostęp do urządzeń USB</translation>
 <translation id="8667328578593601900">Strona <ph name="FULLSCREEN_ORIGIN" /> jest obecnie wyświetlana na pełnym ekranie i wyłączyła kursor myszy.</translation>
 <translation id="8669284339312441707">Cieplejsze</translation>
+<translation id="8669919703154928649">Pozwól Asystentowi wyświetlać powiadomienia</translation>
 <translation id="8669949407341943408">Przenoszę...</translation>
 <translation id="8671210955687109937">Może komentować</translation>
 <translation id="8673026256276578048">Szukaj w internecie</translation>
@@ -5022,7 +5038,7 @@
 <translation id="8698464937041809063">Rysunek Google</translation>
 <translation id="869884720829132584">Menu aplikacji</translation>
 <translation id="869891660844655955">Data wygaśnięcia</translation>
-<translation id="8699566574894671540">Aby włączyć tę funkcję, najpierw w menu Edycja włącz opcję Sprawdzaj pisownię w trakcie pisania</translation>
+<translation id="8699566574894671540">Aby włączyć tę funkcję, najpierw w menu Edytuj włącz Sprawdzaj pisownię w trakcie pisania</translation>
 <translation id="870073306461175568">Sieciowe udziały plików</translation>
 <translation id="8701677791353449257">Nazwa urządzenia musi odpowiadać wyrażeniu regularnemu <ph name="REGEX" />.</translation>
 <translation id="8704521619148782536">To trwa o wiele dłużej niż zwykle. Możesz zaczekać albo anulować i spróbować ponownie później.</translation>
@@ -5388,6 +5404,7 @@
 <translation id="964286338916298286">Twój administrator IT wyłączył możliwość korzystania z bonusów Chrome na tym urządzeniu.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplikacja}few{Aplikacje}many{Aplikacje}other{Aplikacje}}</translation>
 <translation id="967007123645306417">Spowoduje to wylogowanie Cię z Twoich kont Google. Zmiany w zakładkach, historii, hasłach i innych ustawieniach nie będą już synchronizowane z Twoim kontem Google. Dane już zapisane na koncie Google pozostaną na nim. Możesz nimi zarządzać w <ph name="BEGIN_LINK" />Panelu Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Zapisane dane</translation>
 <translation id="968000525894980488">Włącz Usługi Google Play.</translation>
 <translation id="968174221497644223">Pamięć podręczna aplikacji</translation>
 <translation id="969096075394517431">Zmień języki</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index eef7fec..9e4660da 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Mostrar ortografia e gramática</translation>
 <translation id="1593594475886691512">Formatando...</translation>
 <translation id="159359590073980872">Cache de imagem</translation>
+<translation id="1593926297800505364">Salvar forma de pagamento</translation>
 <translation id="1598233202702788831">As atualizações foram desativadas pelo seu administrador.</translation>
 <translation id="1600857548979126453">Acessar back-end do depurador de página</translation>
 <translation id="1601560923496285236">Aplicar</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Não é possível vincular o dispositivo ao domínio. Verifique se você não excedeu o número de dispositivos que podem ser adicionados.</translation>
 <translation id="1744108098763830590">página de plano de fundo</translation>
 <translation id="1745520510852184940">Sempre fazer isso</translation>
+<translation id="1746417874336251387">Oferecer novos recursos que usam a conexão do seu smartphone ao Chromebook</translation>
 <translation id="174937106936716857">Contagem total de arquivos</translation>
 <translation id="175196451752279553">R&amp;eabrir guia fechada</translation>
 <translation id="1753905327828125965">Mais visitados</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Não antes</translation>
 <translation id="1933809209549026293">Conecte um mouse ou um teclado. Se você está usando um dispositivo com Bluetooth, certifique-se de que ele esteja pronto para ser pareado.</translation>
 <translation id="1936157145127842922">Mostrar na pasta</translation>
+<translation id="1938351510777341717">Comando externo</translation>
 <translation id="1940546824932169984">Dispositivos conectados</translation>
 <translation id="1942765061641586207">Resolução da imagem</translation>
+<translation id="1943097386230153518">Instalar novo serviço</translation>
 <translation id="1944921356641260203">Atualização encontrada</translation>
 <translation id="1951615167417147110">Rolar uma página para cima</translation>
 <translation id="1954813140452229842">Erro ao ativar o compartilhamento. Verifique suas credenciais e tente novamente.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Enviar</translation>
 <translation id="265390580714150011">Valor do campo</translation>
 <translation id="2654166010170466751">Permitir que sites instalem gerenciadores de pagamento</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Os recursos variam de acordo com o dispositivo</translation>
 <translation id="2660779039299703961">Evento</translation>
 <translation id="266079277508604648">Não é possível conectar a impressora. Verifique se ela está ligada e conectada ao seu Chromebook por Wi-Fi ou USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Insira o PIN</translation>
 <translation id="2805646850212350655">Sistema de arquivos com criptografia da Microsoft</translation>
 <translation id="2805756323405976993">Apps</translation>
+<translation id="2806891468525657116">O atalho já existe</translation>
 <translation id="2807517655263062534">Os arquivos transferidos por download aparecem aqui</translation>
 <translation id="2809586584051668049">e mais <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Foi criada uma nova janela em uma sessão existente do navegador.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Você está conectado</translation>
 <translation id="3429275422858276529">Adicionar esta página aos favoritos para encontrá-la mais facilmente depois</translation>
 <translation id="3429599832623003132">$1 itens</translation>
+<translation id="3430342160185525240">Permite que o Assistente mostre notificações.</translation>
 <translation id="3432227430032737297">Remover todos os cookies mostrados</translation>
 <translation id="3432757130254800023">Enviar áudio e vídeo para telas na rede local</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1917,7 +1924,7 @@
 <translation id="3871092408932389764">Mais baixa</translation>
 <translation id="3872220884670338524">Mais ações, contas salvas de <ph name="USERNAME" /> em <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Libere espaço em disco, ou o dispositivo deixará de responder.</translation>
-<translation id="3873315167136380065">Para ativar essa configuração, <ph name="BEGIN_LINK" />redefina a sincronização<ph name="END_LINK" /> para remover sua senha longa de sincronização</translation>
+<translation id="3873315167136380065">Para ativar essa configuração, <ph name="BEGIN_LINK" />redefina a sincronização<ph name="END_LINK" /> e remova sua senha longa de sincronização</translation>
 <translation id="3878840326289104869">Criando usuário supervisionado</translation>
 <translation id="3879748587602334249">Gerenciador de downloads</translation>
 <translation id="3880709822663530586">Sua chave de segurança só funciona quando o Bluetooth do dispositivo está ativado</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> no Painel de controle.
 
   Quer iniciar o <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Falha ao criar o atalho</translation>
 <translation id="3943582379552582368">&amp;Voltar</translation>
 <translation id="3943857333388298514">Colar</translation>
 <translation id="3948116654032448504">&amp;Procurar imagem no <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Dispositvos não pareados</translation>
 <translation id="4482194545587547824">O Google pode usar seu histórico de navegação para personalizar a Pesquisa e outros serviços Google</translation>
 <translation id="4495419450179050807">Não mostrar esta página</translation>
+<translation id="4499718683476608392">Ativa o preenchimento automático de cartão de crédito para preencher formulários com um único clique</translation>
 <translation id="4500114933761911433">O plug-in <ph name="PLUGIN_NAME" /> falhou</translation>
 <translation id="450099669180426158">Ícone de ponto de exclamação</translation>
 <translation id="4501530680793980440">Confirmar remoção</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> deseja se comunicar com a extensão "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Aceitar</translation>
-<translation id="4920350943031252905">Execute ferramentas, editores e ambientes de desenvolvimento integrado do Linux no seu Chromebook.</translation>
 <translation id="4920887663447894854">Os seguintes sites foram impedidos de rastrear o seu local nesta página:</translation>
 <translation id="492299503953721473">Remover apps Android</translation>
 <translation id="4923279099980110923">Sim, eu quero ajudar</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Backup na nuvem do Chrome OS</translation>
 <translation id="5756163054456765343">Central de ajuda</translation>
 <translation id="5759728514498647443">Os documentos enviados para impressão pelo <ph name="APP_NAME" /> podem ser lidos pelo <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Configurações de cartão de crédito</translation>
 <translation id="5763751966069581670">Nenhum dispositivo USB encontrado</translation>
 <translation id="5764483294734785780">Sal&amp;var áudio como...</translation>
 <translation id="57646104491463491">Data da modificação</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Erro do módulo de segurança.</translation>
 <translation id="5856721540245522153">Ativar recursos de depuração</translation>
 <translation id="5857090052475505287">Nova pasta</translation>
+<translation id="585979798156957858">Meta externa</translation>
 <translation id="5860033963881614850">Desativado</translation>
 <translation id="5860209693144823476">Aba 3</translation>
 <translation id="5860491529813859533">Ativar</translation>
@@ -3497,6 +3507,7 @@
 <translation id="6327785803543103246">Descoberta automática do proxy da Web</translation>
 <translation id="6333064448949140209">O arquivo será enviado ao Google para depuração</translation>
 <translation id="6333834492048057036">Foco na barra de endereço p/ pesquisa</translation>
+<translation id="6336451774241870485">Nova guia privada</translation>
 <translation id="6339668969738228384">Criar um novo perfil para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Não foi possível conectar-se ao servidor. Verifique a conexão de rede e tente novamente. Se o problema persistir, reinicie o Chromebook.</translation>
 <translation id="6340071272923955280">Protocolo de impressão via Internet (IPPS)</translation>
@@ -3678,6 +3689,7 @@
 <translation id="6606070663386660533">Aba 8</translation>
 <translation id="6607272825297743757">Informações do arquivo</translation>
 <translation id="6607831829715835317">Mais ferramen&amp;tas</translation>
+<translation id="6610147964972079463">Fechar guias privadas</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
 <translation id="6613452264606394692">Você pode voltar rapidamente a esta página, adicionando-a esta aos favoritos</translation>
 <translation id="6614893213975402384">Instalar atualizações e apps. Ao continuar, você aceita que este dispositivo também pode fazer automaticamente o download e a instalação de atualizações e apps do Google, da operadora e do fabricante do dispositivo, possivelmente usando dados da rede celular. Alguns desses apps podem oferecer compras no aplicativo. É possível remover esses apps a qualquer momento. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation>
@@ -3748,6 +3760,7 @@
 <translation id="6710213216561001401">Anterior</translation>
 <translation id="6718273304615422081">Compactando...</translation>
 <translation id="671928215901716392">Bloquear tela</translation>
+<translation id="6720847671508630642">Compartilhe o melhor do Android com seu Chromebook automaticamente. Conecte seu smartphone para enviar mensagens de texto do computador, compartilhar a conexão do smartphone com a Internet e desbloquear a tela do Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Veja a marca e o modelo da sua chave de segurança</translation>
 <translation id="6721972322305477112">&amp;Arquivo</translation>
 <translation id="672213144943476270">Desbloqueie seu perfil antes de navegar como convidado.</translation>
@@ -3894,6 +3907,7 @@
 <translation id="6970856801391541997">Imprimir páginas específicas</translation>
 <translation id="6972180789171089114">Áudio/vídeo</translation>
 <translation id="6973630695168034713">Pastas</translation>
+<translation id="6974609594866392343">Modo de demonstração off-line</translation>
 <translation id="6976108581241006975">Console JavaScript</translation>
 <translation id="6977381486153291903">Revisão do firmware</translation>
 <translation id="6978121630131642226">Mecanismos de pesquisa</translation>
@@ -4488,6 +4502,7 @@
 <translation id="7857949311770343000">Esta é a página "Nova guia" que você esperava?</translation>
 <translation id="786073089922909430">Serviço: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Downloads</translation>
+<translation id="7864662577698025113">Adicionar novo serviço</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}one{# cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" />: pareado</translation>
 <translation id="7870730066603611552">Revisar as opções de sincronização após a configuração</translation>
@@ -5003,6 +5018,7 @@
 <translation id="8666584013686199826">Perguntar quando um site quiser acessar dispositivos USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> está agora em modo de tela inteira e desativou o cursor do mouse.</translation>
 <translation id="8669284339312441707">Mais quentes</translation>
+<translation id="8669919703154928649">Permitir que o Assistente exiba notificações</translation>
 <translation id="8669949407341943408">Movendo...</translation>
 <translation id="8671210955687109937">Pode comentar</translation>
 <translation id="8673026256276578048">Pesquisar na web...</translation>
@@ -5390,6 +5406,7 @@
 <translation id="964286338916298286">Seu administrador de TI desativou os Goodies do Chrome para seu dispositivo.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicativo}one{Aplicativo}other{Aplicativos}}</translation>
 <translation id="967007123645306417">Isso desconectará você das suas Contas do Google. As alterações feitas nos seus favoritos, histórico, senhas e outras configurações não serão mais sincronizadas com sua Conta do Google. No entanto, os dados já existentes continuarão armazenados na Conta do Google e poderão ser gerenciados no <ph name="BEGIN_LINK" />Painel do Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Dados armazenados</translation>
 <translation id="968000525894980488">Ative o Google Play Services.</translation>
 <translation id="968174221497644223">Cache de aplicativo</translation>
 <translation id="969096075394517431">Alterar idiomas</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 0675274..c8c9403 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Mostrar ortografia e gramática</translation>
 <translation id="1593594475886691512">A formatar...</translation>
 <translation id="159359590073980872">Cache de Imagem</translation>
+<translation id="1593926297800505364">Guardar método de pagamento</translation>
 <translation id="1598233202702788831">As atualizações estão desativadas pelo seu gestor.</translation>
 <translation id="1600857548979126453">Aceder ao back-end do depurador da página</translation>
 <translation id="1601560923496285236">Aplicar</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Não é possível associar o dispositivo ao domínio. Certifique-se de que não excedeu o número de dispositivos que pode adicionar.</translation>
 <translation id="1744108098763830590">página de fundo</translation>
 <translation id="1745520510852184940">Fazer sempre isto</translation>
+<translation id="1746417874336251387">Oferecer novas funcionalidades que utilizam a ligação do telemóvel ao Chromebook</translation>
 <translation id="174937106936716857">Contagem total de ficheiros</translation>
 <translation id="175196451752279553">Voltar a abrir o s&amp;eparador fechado</translation>
 <translation id="1753905327828125965">Mais visitados</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Não anterior a</translation>
 <translation id="1933809209549026293">Ligue um rato ou um teclado. Se estiver a utilizar um dispositivo Bluetooth, certifique-se de que está preparado para sincronizar.</translation>
 <translation id="1936157145127842922">Mostrar na pasta</translation>
+<translation id="1938351510777341717">Comando externo</translation>
 <translation id="1940546824932169984">Dispositivos associados</translation>
 <translation id="1942765061641586207">Resolução da imagem</translation>
+<translation id="1943097386230153518">Instalar novo serviço</translation>
 <translation id="1944921356641260203">Atualização encontrada</translation>
 <translation id="1951615167417147110">Deslocar uma página para cima</translation>
 <translation id="1954813140452229842">Erro ao montar a partilha. Verifique as suas credenciais e tente novamente.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Submeter</translation>
 <translation id="265390580714150011">Campo Valor</translation>
 <translation id="2654166010170466751">Permitir que os sites instalem controladores de pagamentos</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" /> As funcionalidades variam consoante o dispositivo.</translation>
 <translation id="2660779039299703961">Evento</translation>
 <translation id="266079277508604648">Não é possível ligar à impressora. Verifique se a impressora está ligada e associada ao Chromebook por Wi-Fi ou USB.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Introduzir PIN</translation>
 <translation id="2805646850212350655">Sistema de encriptação de ficheiros Microsoft</translation>
 <translation id="2805756323405976993">Aplicações</translation>
+<translation id="2806891468525657116">O atalho já existe.</translation>
 <translation id="2807517655263062534">Os ficheiros que transferir são apresentados aqui</translation>
 <translation id="2809586584051668049">e mais <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Nova janela criada na sessão de browser existente</translation>
@@ -1601,6 +1607,7 @@
 <translation id="3428419049384081277">Tem sessão iniciada</translation>
 <translation id="3429275422858276529">Adicione esta página aos marcadores para encontrá-la facilmente mais tarde</translation>
 <translation id="3429599832623003132">$1 itens</translation>
+<translation id="3430342160185525240">Permite que o Assistente lhe mostre notificações.</translation>
 <translation id="3432227430032737297">Remover tudo o que é mostrado</translation>
 <translation id="3432757130254800023">Enviar áudio e vídeo para ecrãs na rede local</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1965,6 +1972,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> no Painel de controlo.
 
   Pretende iniciar <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Não é possível criar o atalho.</translation>
 <translation id="3943582379552582368">&amp;Anterior</translation>
 <translation id="3943857333388298514">Colar</translation>
 <translation id="3948116654032448504">Pe&amp;squisar Imagem no <ph name="SEARCH_ENGINE" /></translation>
@@ -2272,6 +2280,7 @@
 <translation id="4481530544597605423">Dispositivos dessincronizados</translation>
 <translation id="4482194545587547824">A Google pode utilizar o seu histórico de navegação para personalizar a Pesquisa Google e outros serviços Google</translation>
 <translation id="4495419450179050807">Não mostrar nesta página</translation>
+<translation id="4499718683476608392">Ativar o Preenchimento automático de cartões de crédito para preencher formulários com um único clique</translation>
 <translation id="4500114933761911433">O plug-in <ph name="PLUGIN_NAME" /> falhou.</translation>
 <translation id="450099669180426158">Ícone de ponto de exclamação</translation>
 <translation id="4501530680793980440">Confirmar Remoção</translation>
@@ -2550,7 +2559,6 @@
 <translation id="4917385247580444890">Forte</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> pretende comunicar com a extensão "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Aceitar</translation>
-<translation id="4920350943031252905">Execute ferramentas, editores e IDEs do Linux no seu Chromebook.</translation>
 <translation id="4920887663447894854">Os sites seguintes foram bloqueados de monitorizar a sua localização nesta página:</translation>
 <translation id="492299503953721473">Remover aplicações para Android</translation>
 <translation id="4923279099980110923">Sim, quero ajudar</translation>
@@ -3117,6 +3125,7 @@
 <translation id="5752453871435543420">Cópia de segurança na nuvem do Chrome OS</translation>
 <translation id="5756163054456765343">C&amp;entro de Ajuda</translation>
 <translation id="5759728514498647443">Os documentos enviados para impressão através de <ph name="APP_NAME" /> podem ser lidos por <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Definições de cartões de crédito</translation>
 <translation id="5763751966069581670">Não foram encontrados dispositivos USB</translation>
 <translation id="5764483294734785780">Gua&amp;rdar áudio como...</translation>
 <translation id="57646104491463491">Data modificada</translation>
@@ -3188,6 +3197,7 @@
 <translation id="5855773610748894548">Ups! Ocorreu um erro no módulo seguro.</translation>
 <translation id="5856721540245522153">Ativar funcionalidades de depuração</translation>
 <translation id="5857090052475505287">Nova pasta</translation>
+<translation id="585979798156957858">Meta externo</translation>
 <translation id="5860033963881614850">Desativado</translation>
 <translation id="5860209693144823476">Separador 3</translation>
 <translation id="5860491529813859533">Ativar</translation>
@@ -3497,6 +3507,7 @@
 <translation id="6327785803543103246">Deteção automática de proxy da Web</translation>
 <translation id="6333064448949140209">O ficheiro será enviado para a Google para depuração</translation>
 <translation id="6333834492048057036">Focar barra de endereço para pesquisa</translation>
+<translation id="6336451774241870485">Novo separador privado</translation>
 <translation id="6339668969738228384">Criar um novo perfil para <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Não foi possível estabelecer ligação ao servidor. Verifique a sua ligação de rede e tente novamente. Se o problema persistir, reinicie o Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3678,6 +3689,7 @@
 <translation id="6606070663386660533">Separador 8</translation>
 <translation id="6607272825297743757">Informações do ficheiro</translation>
 <translation id="6607831829715835317">Mais ferrament&amp;as</translation>
+<translation id="6610147964972079463">Fechar separadores privados</translation>
 <translation id="6612358246767739896">Conteúdo protegido</translation>
 <translation id="6613452264606394692">Volte aqui rapidamente ao adicionar esta página aos marcadores</translation>
 <translation id="6614893213975402384">Instale atualizações e aplicações. Ao continuar, aceita que este dispositivo também pode transferir e instalar automaticamente atualizações e aplicações da Google, do seu operador e do fabricante do dispositivo, possivelmente através de dados móveis. Algumas destas aplicações podem oferecer compras na aplicação. Pode remover estas aplicações a qualquer momento. <ph name="BEGIN_LINK1" />Saiba mais<ph name="END_LINK1" /></translation>
@@ -3748,6 +3760,7 @@
 <translation id="6710213216561001401">Anterior</translation>
 <translation id="6718273304615422081">A comprimir...</translation>
 <translation id="671928215901716392">Bloquear ecrã</translation>
+<translation id="6720847671508630642">Partilhe o melhor do Android com o Chromebook automaticamente. Associe o telemóvel para poder enviar mensagens de texto a partir do computador, partilhar a ligação à Internet do telemóvel e desbloquear o ecrã do Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Saiba mais<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Ver a marca e o modelo da sua Chave de segurança</translation>
 <translation id="6721972322305477112">&amp;Ficheiro</translation>
 <translation id="672213144943476270">Desbloqueie o seu perfil antes de navegar como convidado</translation>
@@ -3894,6 +3907,7 @@
 <translation id="6970856801391541997">Imprimir Páginas Específicas</translation>
 <translation id="6972180789171089114">Áudio/Vídeo</translation>
 <translation id="6973630695168034713">Pastas</translation>
+<translation id="6974609594866392343">Modo de demonstração offline</translation>
 <translation id="6976108581241006975">Consola de JavaScript</translation>
 <translation id="6977381486153291903">Revisão de firmware</translation>
 <translation id="6978121630131642226">Motores de pesquisa</translation>
@@ -4488,6 +4502,7 @@
 <translation id="7857949311770343000">É esta a página novo separador que esperava?</translation>
 <translation id="786073089922909430">Serviço: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Transferências</translation>
+<translation id="7864662577698025113">Adicionar novo serviço</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – sincronizado</translation>
 <translation id="7870730066603611552">Rever opções de sincronização após a configuração</translation>
@@ -5002,6 +5017,7 @@
 <translation id="8666584013686199826">Perguntar quando um site pretender aceder a dispositivos USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> está agora em ecrã inteiro e desativou o cursor do rato.</translation>
 <translation id="8669284339312441707">Mais quente</translation>
+<translation id="8669919703154928649">Permitir que o Assistente mostre notificações</translation>
 <translation id="8669949407341943408">A mover...</translation>
 <translation id="8671210955687109937">Pode comentar</translation>
 <translation id="8673026256276578048">Pesquisar na Web...</translation>
@@ -5389,6 +5405,7 @@
 <translation id="964286338916298286">O gestor de TI desativou os Extras do Chrome para o dispositivo.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicação}other{Aplicações}}</translation>
 <translation id="967007123645306417">Deste modo, termina sessão nas suas Contas Google. As alterações aos marcadores, ao histórico, às palavras-passe e a outras definições deixam de ser sincronizadas com a Conta Google. Contudo, os dados existentes permanecem armazenados na Conta Google e podem ser geridos no <ph name="BEGIN_LINK" />Painel de Controlo Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Dados armazenados</translation>
 <translation id="968000525894980488">Ative os Serviços do Google Play.</translation>
 <translation id="968174221497644223">Cache da aplicação</translation>
 <translation id="969096075394517431">Alterar idiomas</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index 5942da0..71e9731 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Afișează verificarea ortografiei și a gramaticii</translation>
 <translation id="1593594475886691512">Se formatează...</translation>
 <translation id="159359590073980872">Memorie cache de imagini</translation>
+<translation id="1593926297800505364">Salvează metoda de plată</translation>
 <translation id="1598233202702788831">Actualizările sunt dezactivate de administrator.</translation>
 <translation id="1600857548979126453">Accesează procesul de fundal al depanatorului de pagină</translation>
 <translation id="1601560923496285236">Aplicați</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Dispozitivul nu a putut fi asociat domeniului. Asigură-te că nu ai depășit numărul de dispozitive pe care le poți adăuga.</translation>
 <translation id="1744108098763830590">pagină de fundal</translation>
 <translation id="1745520510852184940">Tradu întotdeauna</translation>
+<translation id="1746417874336251387">Oferă funcții noi care folosesc conexiunea telefonului la Chromebook</translation>
 <translation id="174937106936716857">Numărul total de fișiere</translation>
 <translation id="175196451752279553">R&amp;edeschide fila închisă</translation>
 <translation id="1753905327828125965">Cele mai vizitate</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Nu înainte de</translation>
 <translation id="1933809209549026293">Conectează un mouse sau o tastatură. Dacă folosești un dispozitiv Bluetooth,  asigură-te că este gata pentru conectare.</translation>
 <translation id="1936157145127842922">Afișați în dosar</translation>
+<translation id="1938351510777341717">Comandă externă</translation>
 <translation id="1940546824932169984">Dispozitive conectate</translation>
 <translation id="1942765061641586207">Rezoluția imaginii</translation>
+<translation id="1943097386230153518">Instalează un serviciu nou</translation>
 <translation id="1944921356641260203">A fost găsită o actualizare</translation>
 <translation id="1951615167417147110">Derulează o pagină în sus</translation>
 <translation id="1954813140452229842">Eroare la montarea dispozitivului de stocare în rețea. Verifică acreditările și încearcă din nou.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Trimite</translation>
 <translation id="265390580714150011">Valoarea câmpului</translation>
 <translation id="2654166010170466751">Permite site-urilor să instaleze handlere pentru plăți</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funcțiile variază în funcție de dispozitiv</translation>
 <translation id="2660779039299703961">Eveniment</translation>
 <translation id="266079277508604648">Nu se poate conecta imprimanta. Asigură-te că este pornită și conectată la Chromebook prin Wi-Fi sau USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Introdu codul PIN</translation>
 <translation id="2805646850212350655">Sistem Microsoft de criptare a fișierelor</translation>
 <translation id="2805756323405976993">Aplicații</translation>
+<translation id="2806891468525657116">Comanda rapidă există deja</translation>
 <translation id="2807517655263062534">Fișierele pe care le descarci apar aici</translation>
 <translation id="2809586584051668049">și încă <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">În sesiunea de browser existentă a fost creată o fereastră nouă.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Te-ai conectat!</translation>
 <translation id="3429275422858276529">Marchează această pagină pentru a o găsi ușor mai târziu</translation>
 <translation id="3429599832623003132">$1 elemente</translation>
+<translation id="3430342160185525240">Permite Asistentului să afișeze notificări.</translation>
 <translation id="3432227430032737297">Elimină-le pe cele afișate</translation>
 <translation id="3432757130254800023">Trimite conținut audio și video pe afișajele din rețeaua locală</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> din Panoul de control.
 
   Doriți să porniți <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Nu se poate crea comanda rapidă</translation>
 <translation id="3943582379552582368">&amp;Înapoi</translation>
 <translation id="3943857333388298514">Inserează</translation>
 <translation id="3948116654032448504">&amp;Caută imaginea cu <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Dispozitive neasociate</translation>
 <translation id="4482194545587547824">Google poate folosi istoricul de navigare pentru a personaliza Căutarea și alte servicii Google</translation>
 <translation id="4495419450179050807">Nu afișa pe această pagină</translation>
+<translation id="4499718683476608392">Activează completarea automată a cardurilor de credit pentru a completa formularele cu un singur clic</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> s-a blocat</translation>
 <translation id="450099669180426158">Pictogramă semn de exclamare</translation>
 <translation id="4501530680793980440">Confirmați eliminarea</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Puternic</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> dorește să comunice cu extensia „<ph name="EXTENSION_NAME" />”</translation>
 <translation id="4918086044614829423">Accept</translation>
-<translation id="4920350943031252905">Rulează instrumentele, aplicațiile de editare și IDE-urile Linux pe Chromebook.</translation>
 <translation id="4920887663447894854">Urmărirea locației pe această pagină a fost blocată pentru următoarele site-uri:</translation>
 <translation id="492299503953721473">Elimină aplicațiile Android</translation>
 <translation id="4923279099980110923">Da, doresc să ajut</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Backup în cloud pentru sistemul de operare Chrome</translation>
 <translation id="5756163054456765343">C&amp;entrul de ajutor</translation>
 <translation id="5759728514498647443">Documentele pe care le trimiți prin <ph name="APP_NAME" /> pentru a fi printate pot fi citite de <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Setări pentru cardurile de credit</translation>
 <translation id="5763751966069581670">Nu s-au găsit dispozitive USB</translation>
 <translation id="5764483294734785780">Sal&amp;vează conținutul audio ca...</translation>
 <translation id="57646104491463491">Data modificării</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Hopa, eroare privind modulul securizat.</translation>
 <translation id="5856721540245522153">Activează funcțiile de remediere a erorilor</translation>
 <translation id="5857090052475505287">Dosar nou</translation>
+<translation id="585979798156957858">Tasta Meta externă</translation>
 <translation id="5860033963881614850">Dezactivat</translation>
 <translation id="5860209693144823476">Fila 3</translation>
 <translation id="5860491529813859533">Activează</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Web Proxy Auto-Discovery</translation>
 <translation id="6333064448949140209">Fișierul va fi trimis la Google pentru remedierea erorilor</translation>
 <translation id="6333834492048057036">Focalizează pe bara de adrese pentru căutare</translation>
+<translation id="6336451774241870485">Filă privată nouă</translation>
 <translation id="6339668969738228384">Creează un profil nou pentru <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Nu s-a putut conecta la server. Verifică conexiunea la rețea și încearcă din nou. Dacă problema persistă, repornește Chromebookul.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Fila 8</translation>
 <translation id="6607272825297743757">Informațiile fișierului</translation>
 <translation id="6607831829715835317">Mai multe instru&amp;mente</translation>
+<translation id="6610147964972079463">Închide filele private</translation>
 <translation id="6612358246767739896">Conținut protejat</translation>
 <translation id="6613452264606394692">Marchează această pagină pentru a o putea accesa din nou rapid</translation>
 <translation id="6614893213975402384">Instalează actualizări și aplicații. Dacă alegi să continui, ești de acord că este posibil ca dispozitivul să descarce și să instaleze automat actualizări și aplicații de la Google, de la operatorul tău și de la producătorul dispozitivului, eventual folosind datele mobile. Este posibil ca unele dintre aceste aplicații să ofere achiziții în aplicație. Poți elimina oricând aceste aplicații. <ph name="BEGIN_LINK1" />Află mai multe<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Înapoi</translation>
 <translation id="6718273304615422081">Se arhivează...</translation>
 <translation id="671928215901716392">Blocați ecranul</translation>
+<translation id="6720847671508630642">Beneficiază automat de cele mai bune funcții Android cu Chromebook. Conectează-ți telefonul ca să trimiți mesaje text de pe computer, să permiți accesul la conexiunea de internet a telefonului și să deblochezi ecranul Chromebookului.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Află mai multe<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">să vadă marca și modelul cheii de securitate</translation>
 <translation id="6721972322305477112">&amp;Fișier</translation>
 <translation id="672213144943476270">Deblochează profilul înainte de a naviga ca invitat.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Printează anumite pagini</translation>
 <translation id="6972180789171089114">Audio/Video</translation>
 <translation id="6973630695168034713">Dosare</translation>
+<translation id="6974609594866392343">Modul demo offline</translation>
 <translation id="6976108581241006975">Consolă pentru JavaScript</translation>
 <translation id="6977381486153291903">Versiune firmware</translation>
 <translation id="6978121630131642226">Motoarele de căutare</translation>
@@ -4005,7 +4019,7 @@
 <translation id="7127980134843952133">Istoricul descărcărilor</translation>
 <translation id="7131040479572660648">Citește datele de pe <ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> și <ph name="WEBSITE_3" /></translation>
 <translation id="713122686776214250">Adăugați pa&amp;gina...</translation>
-<translation id="7133578150266914903">Administratorul îți resetează acest dispozitiv (<ph name="PROGRESS_PERCENT" />)</translation>
+<translation id="7133578150266914903">Administratorul restabilește o versiune anterioară a OS de pe acest dispozitiv (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="7134098520442464001">Micșorează textul</translation>
 <translation id="7136694880210472378">Setează ca prestabilit</translation>
 <translation id="7136984461011502314">Bun venit la <ph name="PRODUCT_NAME" /></translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Aceasta este pagina Filă nouă pe care o așteptați?</translation>
 <translation id="786073089922909430">Serviciu: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Descărcări</translation>
+<translation id="7864662577698025113">Adaugă un serviciu nou</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{un cookie}few{# cookie-uri}other{# de cookie-uri}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – asociat</translation>
 <translation id="7870730066603611552">Examinează opțiunile de sincronizare după configurare</translation>
@@ -5000,6 +5015,7 @@
 <translation id="8666584013686199826">Anunță-mă dacă un site vrea să acceseze dispozitive USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> este acum în modul ecran complet și a dezactivat cursorul mouse-ului dvs.</translation>
 <translation id="8669284339312441707">Mai caldă</translation>
+<translation id="8669919703154928649">Permite Asistentului să afișeze notificări</translation>
 <translation id="8669949407341943408">Se mută...</translation>
 <translation id="8671210955687109937">Poate face comentarii</translation>
 <translation id="8673026256276578048">Caută pe web...</translation>
@@ -5217,7 +5233,7 @@
 <translation id="9009369504041480176">Se încarcă (<ph name="PROGRESS_PERCENT" />%)...</translation>
 <translation id="9011163749350026987">Afișează întotdeauna pictograma</translation>
 <translation id="9011178328451474963">Ultima filă</translation>
-<translation id="9013707997379828817">Administratorul a resetat acest dispozitiv. Salvează fișierele importante, apoi repornește-l. Toate datele de pe dispozitiv vor fi șterse.</translation>
+<translation id="9013707997379828817">Administratorul a restabilit o versiune anterioară a OS de pe acest dispozitiv. Salvează fișierele importante, apoi repornește-l. Toate datele de pe dispozitiv vor fi șterse.</translation>
 <translation id="9014987600015527693">Vezi alt telefon</translation>
 <translation id="9018218886431812662">Instalare finalizată</translation>
 <translation id="901834265349196618">e-mail</translation>
@@ -5387,6 +5403,7 @@
 <translation id="964286338916298286">Administratorul IT a dezactivat accesoriile Chrome pentru dispozitiv.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplicație}few{Aplicații}other{Aplicații}}</translation>
 <translation id="967007123645306417">Astfel, te vei deconecta de la conturile Google. Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google și pot fi gestionate din <ph name="BEGIN_LINK" />Tabloul de bord Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Date stocate</translation>
 <translation id="968000525894980488">Activează serviciile Google Play.</translation>
 <translation id="968174221497644223">Memoria cache a aplicației</translation>
 <translation id="969096075394517431">Schimbați limbile</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index ff6f03b..198fc07 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -400,6 +400,7 @@
 <translation id="1589055389569595240">Показать правописание и грамматику</translation>
 <translation id="1593594475886691512">Форматирование...</translation>
 <translation id="159359590073980872">Кеш изображений</translation>
+<translation id="1593926297800505364">Сохранить способ оплаты</translation>
 <translation id="1598233202702788831">Функция обновления отключена администратором.</translation>
 <translation id="1600857548979126453">Доступ к работе отладчика страниц</translation>
 <translation id="1601560923496285236">Применить</translation>
@@ -510,6 +511,7 @@
 <translation id="1744060673522309905">Не удалось подключить устройство к домену. Убедитесь, что вы не превысили допустимое количество устройств.</translation>
 <translation id="1744108098763830590">фоновая страница</translation>
 <translation id="1745520510852184940">Всегда переводить</translation>
+<translation id="1746417874336251387">Добавление в Chromebook функций, использующих подключение к мобильной сети</translation>
 <translation id="174937106936716857">Общее количество файлов</translation>
 <translation id="175196451752279553">От&amp;крыть закрытую вкладку</translation>
 <translation id="1753905327828125965">Наиболее посещаемые</translation>
@@ -640,8 +642,10 @@
 <translation id="1932098463447129402">Не ранее</translation>
 <translation id="1933809209549026293">Подключите мышь или клавиатуру. Если вы используете Bluetooth-устройство, убедитесь, что оно готово к установке соединения.</translation>
 <translation id="1936157145127842922">Показать в папке</translation>
+<translation id="1938351510777341717">Внешняя клавиша Command</translation>
 <translation id="1940546824932169984">Подключенные устройства</translation>
 <translation id="1942765061641586207">Разрешение изображения</translation>
+<translation id="1943097386230153518">Установить новый сервис</translation>
 <translation id="1944921356641260203">Найдено обновление</translation>
 <translation id="1951615167417147110">На одну страницу вверх</translation>
 <translation id="1954813140452229842">Не удалось подключить ресурс. Проверьте учетные данные и повторите попытку.</translation>
@@ -1109,6 +1113,7 @@
 <translation id="2653659639078652383">Отправить</translation>
 <translation id="265390580714150011">Значение поля</translation>
 <translation id="2654166010170466751">Разрешить сайтам устанавливать обработчики платежей.</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Набор доступных функций зависит от устройства.</translation>
 <translation id="2660779039299703961">Событие</translation>
 <translation id="266079277508604648">Не удается установить соединение с принтером. Убедитесь, что он включен и подключен к устройству Chromebook через Wi-Fi или USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1215,6 +1220,7 @@
 <translation id="2803375539583399270">Введите PIN-код</translation>
 <translation id="2805646850212350655">Зашифрованная файловая система (EFS) Microsoft</translation>
 <translation id="2805756323405976993">Приложения</translation>
+<translation id="2806891468525657116">Ярлык уже добавлен</translation>
 <translation id="2807517655263062534">Скачанные файлы появятся здесь</translation>
 <translation id="2809586584051668049">и ещё <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">В текущем сеансе браузера создано новое окно.</translation>
@@ -1601,6 +1607,7 @@
 <translation id="3428419049384081277">Вы вошли в аккаунт</translation>
 <translation id="3429275422858276529">Чтобы в будущем эту страницу было проще найти, добавьте ее в закладки</translation>
 <translation id="3429599832623003132">Элементов: $1</translation>
+<translation id="3430342160185525240">Позволяет Ассистенту показывать вам уведомления.</translation>
 <translation id="3432227430032737297">Удалить все показанные файлы cookie</translation>
 <translation id="3432757130254800023">Отправлять аудио и видео на устройства в локальной сети</translation>
 <translation id="3432762828853624962">Разделяемые объекты worker</translation>
@@ -1965,6 +1972,7 @@
   "<ph name="CONTROL_PANEL_APPLET_NAME" />" в панели управления.
 
   Запустить компонент "<ph name="CONTROL_PANEL_APPLET_NAME" />"?</translation>
+<translation id="394183848452296464">Не удалось создать ярлык</translation>
 <translation id="3943582379552582368">&amp;Назад</translation>
 <translation id="3943857333388298514">Вставить</translation>
 <translation id="3948116654032448504">&amp;Найти картинку (<ph name="SEARCH_ENGINE" />)</translation>
@@ -2272,6 +2280,7 @@
 <translation id="4481530544597605423">Отключенные устройства</translation>
 <translation id="4482194545587547824">Google может использовать историю просмотров для персонализации Поиска и других сервисов.</translation>
 <translation id="4495419450179050807">Не показывать на этой странице</translation>
+<translation id="4499718683476608392">Включить автозаполнение данных банковской карты</translation>
 <translation id="4500114933761911433">Сбой в плагине <ph name="PLUGIN_NAME" /></translation>
 <translation id="450099669180426158">Значок восклицательного знака.</translation>
 <translation id="4501530680793980440">Подтверждение удаления</translation>
@@ -2550,7 +2559,6 @@
 <translation id="4917385247580444890">Сильный</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> запрашивает доступ к расширению "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Принять</translation>
-<translation id="4920350943031252905">Запускайте инструменты, редакторы и интегрированные среды разработки Linux на вашем устройстве Chromebook.</translation>
 <translation id="4920887663447894854">Вы запретили передачу ваших геоданных следующим сайтам:</translation>
 <translation id="492299503953721473">Удалить приложения для Android</translation>
 <translation id="4923279099980110923">Да, отправить файл на анализ</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Резервное копирование в облаке Chrome</translation>
 <translation id="5756163054456765343">Справочный &amp;центр</translation>
 <translation id="5759728514498647443">"<ph name="APP_NAME" />" может читать документы, отправленные на печать через приложение "<ph name="APP_NAME" />".</translation>
+<translation id="5762172915276660232">Настройки банковских карт</translation>
 <translation id="5763751966069581670">USB-устройства не найдены</translation>
 <translation id="5764483294734785780">Со&amp;хранить аудио как...</translation>
 <translation id="57646104491463491">Последнее изменение</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Ошибка безопасного модуля</translation>
 <translation id="5856721540245522153">Включение функций отладки</translation>
 <translation id="5857090052475505287">Новая папка</translation>
+<translation id="585979798156957858">Внешняя клавиша Meta</translation>
 <translation id="5860033963881614850">Выкл.</translation>
 <translation id="5860209693144823476">Вкладка 3</translation>
 <translation id="5860491529813859533">Включить</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Автоматическое определение настроек прокси-сервера</translation>
 <translation id="6333064448949140209">Файл будет отправлен в Google для отладки</translation>
 <translation id="6333834492048057036">Ввод поискового запроса в адресной строке</translation>
+<translation id="6336451774241870485">Новая вкладка инкогнито</translation>
 <translation id="6339668969738228384">Создать профиль для <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Не удалось подключиться к серверу. Проверьте подключение к сети и повторите попытку. Если проблема не исчезнет, перезагрузите устройство Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">Вкладка 8</translation>
 <translation id="6607272825297743757">Информация о файле</translation>
 <translation id="6607831829715835317">Дополнительные инстру&amp;менты</translation>
+<translation id="6610147964972079463">Закрыть вкладки инкогнито</translation>
 <translation id="6612358246767739896">Защищенный контент</translation>
 <translation id="6613452264606394692">Чтобы вам было проще вернуться на эту страницу, добавьте ее в закладки</translation>
 <translation id="6614893213975402384">Установка обновлений и приложений. Продолжая, вы разрешаете устройству автоматически скачивать, а затем устанавливать обновления и приложения от производителя устройства, оператора связи и компании Google (в том числе по мобильной сети). В некоторых приложениях могут быть предусмотрены дополнительные покупки. Такие программы можно удалить в любой момент. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">Назад</translation>
 <translation id="6718273304615422081">Архивирование…</translation>
 <translation id="671928215901716392">Блокировать экран</translation>
+<translation id="6720847671508630642">Получите доступ к функциям телефона Android на устройстве Chromebook. Подключив телефон, вы сможете отправлять с компьютера SMS и пользоваться на нем настроенным на телефоне интернет-соединением. Также можно будет разблокировать Chromebook с помощью телефона<ph name="FOOTNOTE_POINTER" />. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Просмотр производителя и модели Электронного ключа</translation>
 <translation id="6721972322305477112">&amp;Файл</translation>
 <translation id="672213144943476270">Чтобы пользоваться браузером в гостевом режиме, разблокируйте свой профиль.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">Печать выбранных страниц</translation>
 <translation id="6972180789171089114">Аудио/видео</translation>
 <translation id="6973630695168034713">Папки</translation>
+<translation id="6974609594866392343">Демонстрационный офлайн-режим</translation>
 <translation id="6976108581241006975">Консоль JavaScript</translation>
 <translation id="6977381486153291903">Версия встроенного ПО</translation>
 <translation id="6978121630131642226">Поисковые системы</translation>
@@ -4035,6 +4049,7 @@
 <translation id="7175353351958621980">Загружено из:</translation>
 <translation id="7180611975245234373">Обновить</translation>
 <translation id="7180865173735832675">Настроить</translation>
+<translation id="7182359331070524176">Выберите альбом в Google Фото</translation>
 <translation id="7186088072322679094">Сохранить на Панели инструментов</translation>
 <translation id="7187428571767585875">Записи реестра, которые будут удалены или изменены:</translation>
 <translation id="7189234443051076392">Убедитесь, что на вашем устройстве достаточно свободного места.</translation>
@@ -4486,6 +4501,7 @@
 <translation id="7857949311770343000">Другая страница быстрого доступа?</translation>
 <translation id="786073089922909430">Сервис: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Загрузки</translation>
+<translation id="7864662577698025113">Добавить новый сервис</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 файл cookie}one{# файл cookie}few{# файла cookie}many{# файлов cookie}other{# файла cookie}}</translation>
 <translation id="786957569166715433">Подключено устройство: <ph name="DEVICE_NAME" /></translation>
 <translation id="7870730066603611552">Проверять параметры синхронизации после начала сеанса</translation>
@@ -5000,6 +5016,7 @@
 <translation id="8666584013686199826">Спрашивать моего разрешения на доступ сайтов к USB-устройствам</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> работает в полноэкранном режиме и не показывает курсор.</translation>
 <translation id="8669284339312441707">Теплее</translation>
+<translation id="8669919703154928649">Разрешить Ассистенту показывать уведомления</translation>
 <translation id="8669949407341943408">Перемещение...</translation>
 <translation id="8671210955687109937">Комментирование</translation>
 <translation id="8673026256276578048">Поиск в Интернете...</translation>
@@ -5387,6 +5404,7 @@
 <translation id="964286338916298286">Администратор отключил бонусы Chrome для вашего устройства.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Приложение}one{Приложения}few{Приложения}many{Приложения}other{Приложения}}</translation>
 <translation id="967007123645306417">Вы выйдете из аккаунта Google. С ним перестанут синхронизироваться изменения, связанные с закладками, историей, паролями и другими параметрами. Уже сохраненные данные останутся в аккаунте. Вы можете посмотреть и изменить их в <ph name="BEGIN_LINK" />Личном кабинете Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Объем занятой памяти</translation>
 <translation id="968000525894980488">Включите сервисы Google Play.</translation>
 <translation id="968174221497644223">Кеш приложения</translation>
 <translation id="969096075394517431">Изменить языки</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 7bea0a3..fc0b675f 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2178,7 +2178,7 @@
 <translation id="428608937826130504">8. položka na poličke</translation>
 <translation id="4287502004382794929">Nemáte dostatočný počet softvérových licencií na registráciu tohto zariadenia. Kontaktujte obchodné oddelenie a kúpte si ďalšie. Ak sa domnievate, že ide o chybu, kontaktujte podporu.</translation>
 <translation id="4289540628985791613">Prehľad</translation>
-<translation id="4295072614469448764">Aplikácia je k dispozícii v termináli. V spúšťači sa môže tiež objaviť jej ikona.</translation>
+<translation id="4295072614469448764">Aplikácia je k dispozícii v termináli. V Spúšťači sa môže tiež objaviť jej ikona.</translation>
 <translation id="4296575653627536209">Pridať kontrolovaného používateľa</translation>
 <translation id="4297219207642690536">Reštartovať a resetovať</translation>
 <translation id="4297322094678649474">Zmeniť jazyky</translation>
@@ -2456,7 +2456,7 @@
 <translation id="4776917500594043016">Heslo pre účet <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="4777825441726637019">Obchod Play</translation>
 <translation id="4779083564647765204">Lupa</translation>
-<translation id="477945296921629067">{NUM_POPUPS,plural, =1{Kontextové okno bolo zablokované}few{Boli zablokované # kontextové okná}many{Bolo zablokovaného # kontextového okna}other{Bolo zablokovaných # kontextových okien}}</translation>
+<translation id="477945296921629067">{NUM_POPUPS,plural, =1{Zablokované vyskakovacie okno}few{Zablokované # vyskakovacie okná}many{# pop-ups blocked}other{Zablokovaných # vyskakovacích okien}}</translation>
 <translation id="4780321648949301421">Uložiť stránku ako...</translation>
 <translation id="4781787911582943401">Priblížiť obrazovku</translation>
 <translation id="4784330909746505604">Prezentácia aplikácie PowerPoint</translation>
@@ -2558,7 +2558,6 @@
 <translation id="4917385247580444890">Silné</translation>
 <translation id="4918021164741308375">Web <ph name="ORIGIN" /> chce komunikovať s rozšírením <ph name="EXTENSION_NAME" /></translation>
 <translation id="4918086044614829423">Prijať</translation>
-<translation id="4920350943031252905">Spustite nástroje, editory aj Linux a súbory IDE vo svojom Chromebooku.</translation>
 <translation id="4920887663447894854">Tieto webové stránky majú zablokované sledovanie vašej polohy na tejto stránke:</translation>
 <translation id="492299503953721473">Odstrániť aplikácie pre Android</translation>
 <translation id="4923279099980110923">Áno, chcem pomôcť</translation>
@@ -3075,7 +3074,7 @@
 <translation id="5677503058916217575">Jazyk stránky:</translation>
 <translation id="5677928146339483299">Zablokované</translation>
 <translation id="5678550637669481956">Bol udelený prístup k médiu <ph name="VOLUME_NAME" /> s povolením čítať a zapisovať.</translation>
-<translation id="5678784840044122290">Aplikácia Linux bude k dispozícii v termináli a jej ikona sa môže tiež zobraziť v spúšťači.</translation>
+<translation id="5678784840044122290">Aplikácia Linux bude k dispozícii v termináli a jej ikona sa môže tiež zobraziť v Spúšťači.</translation>
 <translation id="5678955352098267522">Čítať vaše údaje na: <ph name="WEBSITE_1" /></translation>
 <translation id="5684661240348539843">Identifikátor obsahu</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />Nedá sa odpojiť od archívu či virtuálneho disku<ph name="END_BOLD" />
@@ -3506,6 +3505,7 @@
 <translation id="6327785803543103246">Automatické zisťovanie webového proxy servera</translation>
 <translation id="6333064448949140209">Súbor bude odoslaný Googlu na účely ladenia</translation>
 <translation id="6333834492048057036">Zamerať na panel s adresou za účelom vyhľadávania</translation>
+<translation id="6336451774241870485">Nová súkromná karta</translation>
 <translation id="6339668969738228384">Vytvoriť nový profil pre používateľa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Nepodarilo sa pripojiť k serveru. Skontrolujte sieťové pripojenie a skúste to znova. Ak problém pretrváva, reštartujte Chromebook.</translation>
 <translation id="6340071272923955280">Protokol IPP (IPPS)</translation>
@@ -3687,6 +3687,7 @@
 <translation id="6606070663386660533">Karta 8</translation>
 <translation id="6607272825297743757">Informácie o súbore</translation>
 <translation id="6607831829715835317">Ďalšie nástro&amp;je</translation>
+<translation id="6610147964972079463">Zavrieť súkromné karty</translation>
 <translation id="6612358246767739896">Chránený obsah</translation>
 <translation id="6613452264606394692">Vráťte sa sem rýchlejšie tak, že stránku uložíte ako záložku</translation>
 <translation id="6614893213975402384">Inštalácia aktualizácií a aplikácií. Pokračovaním vyjadrujete súhlas s tým, že toto zariadenie môže tiež automaticky sťahovať a inštalovať aktualizácie a aplikácie od Googlu, operátora a výrobcu zariadenia a v prípade potreby pri tom môže používať mobilné dáta. Niektoré z týchto aplikácií môžu ponúkať nákupy v aplikácii. Tieto aplikácie môžete kedykoľvek odstrániť. <ph name="BEGIN_LINK1" />Ďalšie informácie<ph name="END_LINK1" /></translation>
@@ -4188,7 +4189,7 @@
 <translation id="7400418766976504921">Webová adresa</translation>
 <translation id="740083207982962331">Počkajte, kým sa zariadenie Chromebox reštartuje...</translation>
 <translation id="7400839060291901923">Nastavenie pripojenia v telefóne <ph name="PHONE_NAME" /></translation>
-<translation id="740624631517654988">Kontextové okno bolo zablokované</translation>
+<translation id="740624631517654988">Zablokované vyskakovacie okno</translation>
 <translation id="7407430846095439694">Importovať a spojiť</translation>
 <translation id="7409836189476010449">spustiť obsah vo formáte Flash</translation>
 <translation id="7410344089573941623">Opýtať sa, ak stránky <ph name="HOST" /> chcú pristupovať ku kamere a mikrofónu</translation>
@@ -4563,7 +4564,7 @@
 <translation id="7953739707111622108">Toto zariadenie nie je možné otvoriť, pretože jeho systém súborov nebol rozpoznaný.</translation>
 <translation id="7953955868932471628">Spravovať skratky</translation>
 <translation id="7955383984025963790">Karta 5</translation>
-<translation id="7957054228628133943">Spravovať blokovanie kontextových okien...</translation>
+<translation id="7957054228628133943">Spravovať blokovanie vyskakovacích okien…</translation>
 <translation id="7957615753207896812">Otvoriť nastavenia klávesnice</translation>
 <translation id="7959074893852789871">Súbor obsahoval viacero certifikátov a niektoré z nich neboli importované:</translation>
 <translation id="7961015016161918242">Nikdy</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index b842f938..afeba84b 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Pokaži črkovanje in slovnico</translation>
 <translation id="1593594475886691512">Formatiranje ...</translation>
 <translation id="159359590073980872">Predpomnilnik za slike</translation>
+<translation id="1593926297800505364">Shranjevanje plačilnega sredstva</translation>
 <translation id="1598233202702788831">Skrbnik je onemogočil posodobitve.</translation>
 <translation id="1600857548979126453">Dostopajte do podsistema iskalnika napak na strani</translation>
 <translation id="1601560923496285236">Uporabi</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Naprave ni mogoče pridružiti domeni. Preverite, ali niste presegli števila naprav, ki jih lahko dodate.</translation>
 <translation id="1744108098763830590">stran v ozadju</translation>
 <translation id="1745520510852184940">Vedno izvedi to</translation>
+<translation id="1746417874336251387">Ponudi nove funkcije, ki uporabljajo povezavo telefona s Chromebookom</translation>
 <translation id="174937106936716857">Skupno število datotek</translation>
 <translation id="175196451752279553">&amp;Znova odpri zaprt zavihek</translation>
 <translation id="1753905327828125965">Najpogosteje obiskane</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Ne pred</translation>
 <translation id="1933809209549026293">Priključite miško ali tipkovnico. Če uporabljate napravo Bluetooth, mora biti pripravljena na seznanjanje.</translation>
 <translation id="1936157145127842922">Pokaži v mapi</translation>
+<translation id="1938351510777341717">Zunanji ukaz</translation>
 <translation id="1940546824932169984">Povezane naprave</translation>
 <translation id="1942765061641586207">Ločljivost slike</translation>
+<translation id="1943097386230153518">Namesti novo storitev</translation>
 <translation id="1944921356641260203">Najdena je bila posodobitev</translation>
 <translation id="1951615167417147110">Pomakni se za stran navzgor</translation>
 <translation id="1954813140452229842">Napaka pri vpenjanju datotečnega sredstva v skupni rabi. Preverite poverilnice in poskusite znova.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Pošlji</translation>
 <translation id="265390580714150011">Vrednost polja</translation>
 <translation id="2654166010170466751">Spletnim mestom dovoli namestitev rutin za obravnavo plačil</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funkcije se razlikujejo glede na napravo</translation>
 <translation id="2660779039299703961">Dogodek</translation>
 <translation id="266079277508604648">Ni se mogoče povezati s tiskalnikom. Preverite, ali je tiskalnik vklopljen in povezan s Chromebookom prek omrežja Wi-Fi ali z USB-jem.</translation>
 <translation id="2661146741306740526">16 x 9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Vnesite kodo PIN</translation>
 <translation id="2805646850212350655">Microsoftov šifrirni datotečni sistem</translation>
 <translation id="2805756323405976993">Aplikacije</translation>
+<translation id="2806891468525657116">Bližnjica že obstaja</translation>
 <translation id="2807517655263062534">Tu so prikazane datoteke, ki jih prenesete</translation>
 <translation id="2809586584051668049">in še <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Ustvarjeno je novo okno v obstoječi seji brskalnika.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Prijavljeni ste.</translation>
 <translation id="3429275422858276529">Dodajte to stran med zaznamke, da jo boste pozneje hitreje našli</translation>
 <translation id="3429599832623003132">Št. elementov: $1</translation>
+<translation id="3430342160185525240">Omogoči Pomočniku, da vam prikazuje obvestila.</translation>
 <translation id="3432227430032737297">Odstrani vse prikazane</translation>
 <translation id="3432757130254800023">Pošiljanje zvoka in videa zaslonom v lokalnem omrežju</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> na nadzorni plošči.
 
   Ali želite zagnati <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Bližnjice ni mogoče ustvariti</translation>
 <translation id="3943582379552582368">&amp;Nazaj</translation>
 <translation id="3943857333388298514">Prilepi</translation>
 <translation id="3948116654032448504">&amp;Išči sliko tu: <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Naprave, za katere je bila preklicana seznanitev</translation>
 <translation id="4482194545587547824">Google lahko vašo zgodovino brskanja uporabi za prilagajanje Iskanja Google in drugih Googlovih storitev</translation>
 <translation id="4495419450179050807">Ne pokaži na tej strani</translation>
+<translation id="4499718683476608392">Omogoči samodejno izpolnjevanje za kreditne kartice za izpolnjevanje obrazcev z enim klikom</translation>
 <translation id="4500114933761911433">Vtičnik <ph name="PLUGIN_NAME" /> se je zrušil</translation>
 <translation id="450099669180426158">Ikona klicaja</translation>
 <translation id="4501530680793980440">Potrditev odstranitve</translation>
@@ -2327,7 +2336,7 @@
 <translation id="4576541033847873020">Seznanitev naprave Bluetooth</translation>
 <translation id="4579581181964204535">Ni mogoče predvajati <ph name="HOST_NAME" />.</translation>
 <translation id="4580526846085481512">Ali ste prepričani, da želite izbrisati $1 elementov?</translation>
-<translation id="4582497162516204941">Namestitev z Linuxom (beta)</translation>
+<translation id="4582497162516204941">Namestitev v Linuxu (beta)</translation>
 <translation id="4582563038311694664">Ponastavi vse nastavitve</translation>
 <translation id="4585793705637313973">Urejanje strani</translation>
 <translation id="4589268276914962177">Nov terminal</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Močan</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> želi vzpostaviti povezavo z razširitvijo »<ph name="EXTENSION_NAME" />«</translation>
 <translation id="4918086044614829423">Sprejmi</translation>
-<translation id="4920350943031252905">Izvajanje orodij, urejevalnikov in IDE-jev za Linux v Chromebooku.</translation>
 <translation id="4920887663447894854">Zaradi blokade ta spletna mesta ne morejo slediti vaši lokaciji na tej strani:</translation>
 <translation id="492299503953721473">Odstrani aplikacije za Android</translation>
 <translation id="4923279099980110923">Da, želim pomagati</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Varnostna kopija sistema Chrome OS v oblaku</translation>
 <translation id="5756163054456765343">Center za pomoč</translation>
 <translation id="5759728514498647443">Dokumente, ki jih pošljete v tiskanje v aplikaciji <ph name="APP_NAME" />, lahko prebere aplikacija <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Nastavitve kreditnih kartic</translation>
 <translation id="5763751966069581670">Najdena ni bila nobena naprava USB</translation>
 <translation id="5764483294734785780">Shr&amp;ani zvočni posnetek kot ...</translation>
 <translation id="57646104491463491">Datum spremembe</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Napaka varnega modula.</translation>
 <translation id="5856721540245522153">Omogočanje funkcij za odpravljanje napak</translation>
 <translation id="5857090052475505287">Nova mapa</translation>
+<translation id="585979798156957858">Zunanja meta-tipka</translation>
 <translation id="5860033963881614850">Izklopljeno</translation>
 <translation id="5860209693144823476">Zavihek 3</translation>
 <translation id="5860491529813859533">Vklopi</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Samodejno odkrivanje spletnega strežnika proxy</translation>
 <translation id="6333064448949140209">Datoteka bo poslana Googlu zaradi odpravljanja napak</translation>
 <translation id="6333834492048057036">Preklop na naslovno vrstico za iskanje</translation>
+<translation id="6336451774241870485">Novi zasebni zavihek</translation>
 <translation id="6339668969738228384">Ustvarjanje novega profila za uporabnika <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Ni se bilo mogoče povezati s strežnikom. Preverite omrežno povezavo in poskusite znova. Če težave ne odpravite, znova zaženite Chromebook.</translation>
 <translation id="6340071272923955280">Internet Printing Protocol (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Zavihek 8</translation>
 <translation id="6607272825297743757">Podatki o datoteki</translation>
 <translation id="6607831829715835317">Več orodij</translation>
+<translation id="6610147964972079463">Zapri zasebne zavihke</translation>
 <translation id="6612358246767739896">Zaščitena vsebina</translation>
 <translation id="6613452264606394692">Hitro se vrnite na to stran tako, da jo dodate med zaznamke</translation>
 <translation id="6614893213975402384">Namestitev posodobitev in aplikacij. Če nadaljujete, se strinjate, da lahko ta naprava tudi samodejno prenese in namesti posodobitve ter aplikacije, ki jih zagotavljajo Google, vaš operater in proizvajalec vaše naprave – morda s prenosom podatkov v mobilnih omrežjih. Nekatere od teh aplikacij morda ponujajo nakupe v aplikaciji. Te aplikacije lahko kadar koli odstranite. <ph name="BEGIN_LINK1" />Več o tem<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Nazaj</translation>
 <translation id="6718273304615422081">Stiskanje ...</translation>
 <translation id="671928215901716392">Zakleni zaslon</translation>
+<translation id="6720847671508630642">Samodejno delite najboljše iz Androida s Chromebookom. Povežite telefon, tako da boste lahko pošiljali sporočila SMS iz računalnika, delili internetno povezavo telefona in odklenili zaslon Chromebooka.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Ogled znamke in modela varnostnega ključa</translation>
 <translation id="6721972322305477112">&amp;Datoteka</translation>
 <translation id="672213144943476270">Preden brskate kot gost, odklenite profil.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Natisni določene strani</translation>
 <translation id="6972180789171089114">Zvok/video</translation>
 <translation id="6973630695168034713">Mape</translation>
+<translation id="6974609594866392343">Predstavitveni način brez povezave</translation>
 <translation id="6976108581241006975">Konzola JavaScript</translation>
 <translation id="6977381486153291903">Različica vdelane programske opreme</translation>
 <translation id="6978121630131642226">Iskalniki</translation>
@@ -4034,6 +4048,7 @@
 <translation id="7175353351958621980">Naloženo iz:</translation>
 <translation id="7180611975245234373">Osveži</translation>
 <translation id="7180865173735832675">Prilagodi</translation>
+<translation id="7182359331070524176">Izberite album v Googlu Foto</translation>
 <translation id="7186088072322679094">Ohrani v orodni vrstici</translation>
 <translation id="7187428571767585875">Vnosi v register, ki bodo odstranjeni ali spremenjeni:</translation>
 <translation id="7189234443051076392">Poskrbite, da je v napravi dovolj prostora</translation>
@@ -4485,6 +4500,7 @@
 <translation id="7857949311770343000">Ste pričakovali takšno stran »Nov zavihek«?</translation>
 <translation id="786073089922909430">Storitev: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Prenosi</translation>
+<translation id="7864662577698025113">Dodaj novo storitev</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 piškotek}one{# piškotek}two{# piškotka}few{# piškotki}other{# piškotkov}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – seznanjeno</translation>
 <translation id="7870730066603611552">Ogled možnosti sinhronizacije po nastavitvi</translation>
@@ -4999,6 +5015,7 @@
 <translation id="8666584013686199826">Vprašaj, ko želi spletno mesto dostopati do naprav USB</translation>
 <translation id="8667328578593601900">Stran <ph name="FULLSCREEN_ORIGIN" /> je zdaj v celozaslonskem načinu in je onemogočila miškin kazalec.</translation>
 <translation id="8669284339312441707">Topleje</translation>
+<translation id="8669919703154928649">Naj vam Pomočnik prikazuje obvestila</translation>
 <translation id="8669949407341943408">Premikanje ...</translation>
 <translation id="8671210955687109937">Komentiranje dovoljeno</translation>
 <translation id="8673026256276578048">Iskanje v spletu ...</translation>
@@ -5386,6 +5403,7 @@
 <translation id="964286338916298286">Skrbnik za IT je za vašo napravo onemogočil dodatke za Chrome.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Aplikacija}one{Aplikacije}two{Aplikacije}few{Aplikacije}other{Aplikacije}}</translation>
 <translation id="967007123645306417">S tem boste odjavljeni iz Google Računov. Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev ne bodo več sinhronizirane z Google Računom. Obstoječi podatki bodo še naprej shranjeni v Google Računu in mogoče jih bo upravljati na <ph name="BEGIN_LINK" />Google Nadzorni plošči<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Shranjeni podatki</translation>
 <translation id="968000525894980488">Vklopite storitve Google Play</translation>
 <translation id="968174221497644223">Predpomnilnik aplikacij</translation>
 <translation id="969096075394517431">Spreminjanje jezikov</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index 4b60f8d..7a3942c 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">Прикажи правопис и граматику</translation>
 <translation id="1593594475886691512">Форматирање...</translation>
 <translation id="159359590073980872">Кеш слике</translation>
+<translation id="1593926297800505364">Сачувајте начин плаћања</translation>
 <translation id="1598233202702788831">Администратор је онемогућио ажурирања.</translation>
 <translation id="1600857548979126453">Приступ позадинском механизму програма за отклањање грешака на страници</translation>
 <translation id="1601560923496285236">Примени</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">Придруживање уређаја домену није успело. Уверите се да нисте премашили број уређаја које можете да додате.</translation>
 <translation id="1744108098763830590">страница у позадини</translation>
 <translation id="1745520510852184940">Увек ради ово</translation>
+<translation id="1746417874336251387">Нуде се нове функције које користе везу телефона са Chromebook-ом</translation>
 <translation id="174937106936716857">Укупан број датотека</translation>
 <translation id="175196451752279553">П&amp;оново отвори затворену картицу</translation>
 <translation id="1753905327828125965">Најпосећеније</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">Не пре</translation>
 <translation id="1933809209549026293">Повежите миша или тастатуру. Ако користите Bluetooth уређај, проверите да ли је спреман за упаривање.</translation>
 <translation id="1936157145127842922">Прикажи у директоријуму</translation>
+<translation id="1938351510777341717">External Command (Спољна команда)</translation>
 <translation id="1940546824932169984">Повезани уређаји</translation>
 <translation id="1942765061641586207">Резолуција слике</translation>
+<translation id="1943097386230153518">Инсталирајте нову услугу</translation>
 <translation id="1944921356641260203">Ажурирање је пронађено</translation>
 <translation id="1951615167417147110">Померање за једну страницу нагоре</translation>
 <translation id="1954813140452229842">Грешка при учитавању дељене датотеке. Проверите акредитиве и пробајте поново.</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2653659639078652383">Пошаљи</translation>
 <translation id="265390580714150011">Вредност поља</translation>
 <translation id="2654166010170466751">Дозволи сајтовима да инсталирају обрађиваче плаћања</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Функције се разликују у зависности од уређаја</translation>
 <translation id="2660779039299703961">Догађај</translation>
 <translation id="266079277508604648">Повезивање са штампачем није успело. Проверите да ли је штампач укључен и повезан са Chromebook-ом помоћу Wi-Fi-ја или USB-а.</translation>
 <translation id="2661146741306740526">16×9</translation>
@@ -1210,6 +1215,7 @@
 <translation id="2803375539583399270">Унесите PIN</translation>
 <translation id="2805646850212350655">Microsoft систем за шифровање датотека</translation>
 <translation id="2805756323405976993">Апликације</translation>
+<translation id="2806891468525657116">Пречица већ постоји</translation>
 <translation id="2807517655263062534">Датотеке које преузмете ће се појавити овде</translation>
 <translation id="2809586584051668049">и још <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Направљен је нови прозор у постојећој сесији прегледача.</translation>
@@ -1596,6 +1602,7 @@
 <translation id="3428419049384081277">Пријављени сте!</translation>
 <translation id="3429275422858276529">Обележите ову страницу да бисте је касније лакше пронашли</translation>
 <translation id="3429599832623003132">Ставки: $1</translation>
+<translation id="3430342160185525240">Омогућава да Помоћник приказује обавештења.</translation>
 <translation id="3432227430032737297">Уклони све приказано</translation>
 <translation id="3432757130254800023">Шаљи аудио и видео садржај екранима на локалној мрежи</translation>
 <translation id="3432762828853624962">Дељени ресурси</translation>
@@ -1960,6 +1967,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> у контролној табли.
 
   Желите ли одмах да покренете <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Прављење пречице није успело</translation>
 <translation id="3943582379552582368">&amp;Назад</translation>
 <translation id="3943857333388298514">Налепи</translation>
 <translation id="3948116654032448504">&amp;Потражи слику у претраживачу <ph name="SEARCH_ENGINE" /></translation>
@@ -2267,6 +2275,7 @@
 <translation id="4481530544597605423">Уређаји чије је упаривање опозвано</translation>
 <translation id="4482194545587547824">Google може да користи историју прегледања за персонализацију Претраге и других Google услуга</translation>
 <translation id="4495419450179050807">Не приказуј на овој страници</translation>
+<translation id="4499718683476608392">Омогућава аутоматско попуњавање образаца подацима о кредитним картицама једним кликом</translation>
 <translation id="4500114933761911433">Додатна компонента <ph name="PLUGIN_NAME" /> је отказала</translation>
 <translation id="450099669180426158">Икона узвичника</translation>
 <translation id="4501530680793980440">Потврда уклањања</translation>
@@ -2545,7 +2554,6 @@
 <translation id="4917385247580444890">Јак</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> жели да комуницира са додатком „<ph name="EXTENSION_NAME" />“</translation>
 <translation id="4918086044614829423">Прихвати</translation>
-<translation id="4920350943031252905">Покреће Linux алатке, уређиваче и IDE-ове на Chromebook-у.</translation>
 <translation id="4920887663447894854">Следећим сајтовима је онемогућено праћење ваше локације на овој страници:</translation>
 <translation id="492299503953721473">Уклони Android апликације</translation>
 <translation id="4923279099980110923">Да, желим да помогнем</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Резервне копије у клауду за Chrome ОС</translation>
 <translation id="5756163054456765343">Ц&amp;ентар за помоћ</translation>
 <translation id="5759728514498647443">Документе које шаљете на штампање преко <ph name="APP_NAME" /> може да чита <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Подешавања кредитних картица</translation>
 <translation id="5763751966069581670">Није пронађен ниједан USB уређај</translation>
 <translation id="5764483294734785780">Са&amp;чувај аудио снимак као...</translation>
 <translation id="57646104491463491">Датум измене</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">Упс, грешка са безбедносним модулом.</translation>
 <translation id="5856721540245522153">Омогућавање функција за отклањање грешака</translation>
 <translation id="5857090052475505287">Нови директоријум</translation>
+<translation id="585979798156957858">Спољни мета тастер</translation>
 <translation id="5860033963881614850">Искључено</translation>
 <translation id="5860209693144823476">3. картица</translation>
 <translation id="5860491529813859533">Укључи</translation>
@@ -3493,6 +3503,7 @@
 <translation id="6327785803543103246">Аутоматско откривање веб-проксија</translation>
 <translation id="6333064448949140209">Датотека ће бити послата Google-у ради отклањања грешака</translation>
 <translation id="6333834492048057036">Фокус на траци за адресу за претрагу</translation>
+<translation id="6336451774241870485">Нова приватна картица</translation>
 <translation id="6339668969738228384">Отвори нови профил за <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Повезивање са сервером није успело. Проверите мрежну везу и пробајте поново касније. Ако се проблем настави, рестартујте Chromebook.</translation>
 <translation id="6340071272923955280">Интернет протокол за штампање (IPPS)</translation>
@@ -3673,6 +3684,7 @@
 <translation id="6606070663386660533">8. картица</translation>
 <translation id="6607272825297743757">Информације о датотеци</translation>
 <translation id="6607831829715835317">Још а&amp;латки</translation>
+<translation id="6610147964972079463">Затвори приватне картице</translation>
 <translation id="6612358246767739896">Заштићени садржај</translation>
 <translation id="6613452264606394692">Можете брзо да се вратите овде ако обележите ову страницу</translation>
 <translation id="6614893213975402384">Инсталирајте ажурирања и апликације. Ако наставите, пристајете да овај уређај може аутоматски да преузима и инсталира ажурирања и апликације од Google-а, мобилног оператера и произвођача уређаја, уз могућност коришћења мобилних података. Неке од ових апликација можда нуде куповине у апликацији. Те апликације можете да уклоните у било ком тренутку. <ph name="BEGIN_LINK1" />Сазнајте више<ph name="END_LINK1" /></translation>
@@ -3743,6 +3755,7 @@
 <translation id="6710213216561001401">Претходно</translation>
 <translation id="6718273304615422081">Прављење zip датотеке...</translation>
 <translation id="671928215901716392">Закључај екран</translation>
+<translation id="6720847671508630642">Делите најбоље од Android-а аутоматски са Chromebook-ом Повежите телефон да бисте могли да шаљете SMS-ове помоћу рачунара, делите интернет везу телефона и откључате екран Chromebook-а.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Сазнајте више<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">да види произвођача и модел безбедносног кључа</translation>
 <translation id="6721972322305477112">&amp;File (Датотека)</translation>
 <translation id="672213144943476270">Откључајте профил да бисте прегледали као гост.</translation>
@@ -3889,6 +3902,7 @@
 <translation id="6970856801391541997">Штампање посебних страница</translation>
 <translation id="6972180789171089114">Аудио/видео</translation>
 <translation id="6973630695168034713">Директоријуми</translation>
+<translation id="6974609594866392343">Офлајн режим демонстрације</translation>
 <translation id="6976108581241006975">JavaScript конзола</translation>
 <translation id="6977381486153291903">Ревизија фирмвера</translation>
 <translation id="6978121630131642226">Претраживачи</translation>
@@ -4031,6 +4045,7 @@
 <translation id="7175353351958621980">Учитава се са:</translation>
 <translation id="7180611975245234373">Освежи</translation>
 <translation id="7180865173735832675">Прилагоди</translation>
+<translation id="7182359331070524176">Изаберите албум Google слика</translation>
 <translation id="7186088072322679094">Задржи на траци с алаткама</translation>
 <translation id="7187428571767585875">Уноси у регистру које треба уклонити или променити:</translation>
 <translation id="7189234443051076392">Проверите да ли на уређају има довољно простора</translation>
@@ -4482,6 +4497,7 @@
 <translation id="7857949311770343000">Да ли је ово страница нове картице коју сте очекивали?</translation>
 <translation id="786073089922909430">Услуга: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Преузимања</translation>
+<translation id="7864662577698025113">Додајте нову услугу</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 колачић}one{# колачић}few{# колачића}other{# колачића}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – Упарен је</translation>
 <translation id="7870730066603611552">Прегледа опције синхронизације после подешавања</translation>
@@ -4996,6 +5012,7 @@
 <translation id="8666584013686199826">Питај када сајт жели да приступи USB уређајима</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> је сада у режиму целог екрана и онемогућио је курсор.</translation>
 <translation id="8669284339312441707">Топлије</translation>
+<translation id="8669919703154928649">Омогућите да вам Помоћник приказује обавештења</translation>
 <translation id="8669949407341943408">Премештање...</translation>
 <translation id="8671210955687109937">Може да коментарише</translation>
 <translation id="8673026256276578048">Претражи Веб...</translation>
@@ -5383,6 +5400,7 @@
 <translation id="964286338916298286">ИТ администратор је онемогућио Chrome забавне стварчице за уређај.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Апликација}one{Апликације}few{Апликације}other{Апликације}}</translation>
 <translation id="967007123645306417">Овим ћете се одјавити са Google налога. Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће се и даље чувати на Google налогу и можете да управљате њима на <ph name="BEGIN_LINK" />Google контролној табли<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Сачувани подаци</translation>
 <translation id="968000525894980488">Укључите Google Play услуге.</translation>
 <translation id="968174221497644223">Кеш апликације</translation>
 <translation id="969096075394517431">Промени језике</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 9fb23a6..8a7b4ca 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Visa stavning och grammatik</translation>
 <translation id="1593594475886691512">Formaterar ...</translation>
 <translation id="159359590073980872">Cacheminne för bilder</translation>
+<translation id="1593926297800505364">Spara betalningsmetod</translation>
 <translation id="1598233202702788831">Uppdateringar har inaktiverats av administratören.</translation>
 <translation id="1600857548979126453">Få åtkomst till serverdelen för felsökning av sida</translation>
 <translation id="1601560923496285236">Verkställ</translation>
@@ -510,6 +511,7 @@
 <translation id="1744060673522309905">Det gick inte att ansluta enheten till domänen. Kontrollera att du inte redan har lagt till det högsta tillåtna antalet enheter.</translation>
 <translation id="1744108098763830590">bakgrundssida</translation>
 <translation id="1745520510852184940">Gör alltid detta</translation>
+<translation id="1746417874336251387">Erbjud nya funktioner som använder mobilens anslutning till Chromebook</translation>
 <translation id="174937106936716857">Totalt antal filer</translation>
 <translation id="175196451752279553">Ö&amp;ppna en stängd flik igen</translation>
 <translation id="1753905327828125965">Mest besökta</translation>
@@ -640,8 +642,10 @@
 <translation id="1932098463447129402">Inte före</translation>
 <translation id="1933809209549026293">Anslut en mus eller ett tangentbord. Om du använder en Bluetooth-enhet kontrollerar du att den är klar att kopplas.</translation>
 <translation id="1936157145127842922">Visa i mapp</translation>
+<translation id="1938351510777341717">Extern kommandotangent</translation>
 <translation id="1940546824932169984">Anslutna enheter</translation>
 <translation id="1942765061641586207">Bildupplösning</translation>
+<translation id="1943097386230153518">Installera ny tjänst</translation>
 <translation id="1944921356641260203">En uppdatering hittades</translation>
 <translation id="1951615167417147110">Bläddra uppåt en sida</translation>
 <translation id="1954813140452229842">Det gick inte att montera den delade resursen. Kontrollera användaruppgifterna och försök igen.</translation>
@@ -1107,6 +1111,7 @@
 <translation id="2653659639078652383">Skicka</translation>
 <translation id="265390580714150011">Fältvärde</translation>
 <translation id="2654166010170466751">Tillåt att nya betalningshanterare installeras av webbplatser</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Funktionerna varierar beroende på enhet</translation>
 <translation id="2660779039299703961">Event</translation>
 <translation id="266079277508604648">Det gick inte att ansluta till skrivaren. Kontrollera att skrivaren är påslagen och ansluten till Chromebook via Wi-Fi eller USB.</translation>
 <translation id="2661146741306740526">16:9</translation>
@@ -1213,6 +1218,7 @@
 <translation id="2803375539583399270">Ange pinkod</translation>
 <translation id="2805646850212350655">Microsofts krypterande filsystem</translation>
 <translation id="2805756323405976993">Appar</translation>
+<translation id="2806891468525657116">Genvägen finns redan</translation>
 <translation id="2807517655263062534">Filer som du laddar ned visas här</translation>
 <translation id="2809586584051668049">och ytterligare <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Ett nytt fönster skapades under den aktuella webbläsarsessionen.</translation>
@@ -1599,6 +1605,7 @@
 <translation id="3428419049384081277">Du är inloggad!</translation>
 <translation id="3429275422858276529">Lägg till ett bokmärke för den här sidan så att du enkelt kan hitta tillbaka till den</translation>
 <translation id="3429599832623003132">$1 objekt</translation>
+<translation id="3430342160185525240">Tillåter att assistenten visar aviseringar.</translation>
 <translation id="3432227430032737297">Ta bort alla som visas</translation>
 <translation id="3432757130254800023">Skicka ljud och bild till skärmar i det lokala nätverket</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1963,6 +1970,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> i kontrollpanelen.
 
   Vill du starta <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Det gick inte att skapa genvägen</translation>
 <translation id="3943582379552582368">&amp;Bakåt</translation>
 <translation id="3943857333388298514">Klistra in</translation>
 <translation id="3948116654032448504">&amp;Sök på <ph name="SEARCH_ENGINE" /> efter bild</translation>
@@ -2270,6 +2278,7 @@
 <translation id="4481530544597605423">Frånkopplade enheter</translation>
 <translation id="4482194545587547824">Google kan använda webbhistoriken för att anpassa Sök och andra tjänster från Google.</translation>
 <translation id="4495419450179050807">Visa inte den här sidan</translation>
+<translation id="4499718683476608392">Aktivera Autofyll för kreditkort och fyll i formulär med ett enda klick</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> har kraschat</translation>
 <translation id="450099669180426158">Ikon med utropstecken</translation>
 <translation id="4501530680793980440">Bekräfta borttagning</translation>
@@ -2548,7 +2557,6 @@
 <translation id="4917385247580444890">Stark</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> vill kommunicera med tillägget <ph name="EXTENSION_NAME" /></translation>
 <translation id="4918086044614829423">Acceptera</translation>
-<translation id="4920350943031252905">Kör verktyg, redigerare och IDE:er för Linux på Chromebook.</translation>
 <translation id="4920887663447894854">Följande webbplatser har förhindrats att spåra din plats på sidan:</translation>
 <translation id="492299503953721473">Ta bort Android-appar</translation>
 <translation id="4923279099980110923">Ja, jag vill hjälpa till</translation>
@@ -3114,6 +3122,7 @@
 <translation id="5752453871435543420">Säkerhetskopiering i molnet för Chrome OS</translation>
 <translation id="5756163054456765343">Hjälpc&amp;enter</translation>
 <translation id="5759728514498647443">Dokument som du skickar till utskrift via <ph name="APP_NAME" /> kan läsas av <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Inställningar för kreditkort</translation>
 <translation id="5763751966069581670">Inga USB-enheter hittades</translation>
 <translation id="5764483294734785780">S&amp;para ljud som...</translation>
 <translation id="57646104491463491">Datum ändrad</translation>
@@ -3185,6 +3194,7 @@
 <translation id="5855773610748894548">Ett fel uppstod i den säkra modulen</translation>
 <translation id="5856721540245522153">Aktivera felsökningsfunktioner</translation>
 <translation id="5857090052475505287">Ny mapp</translation>
+<translation id="585979798156957858">Extern metatangent</translation>
 <translation id="5860033963881614850">Av</translation>
 <translation id="5860209693144823476">Flik 3</translation>
 <translation id="5860491529813859533">Aktivera</translation>
@@ -3494,6 +3504,7 @@
 <translation id="6327785803543103246">Automatisk identifiering av webbproxy</translation>
 <translation id="6333064448949140209">Filen skickas till Google för felsökning</translation>
 <translation id="6333834492048057036">Fokusera på adressfältet för sökning</translation>
+<translation id="6336451774241870485">Ny privat flik</translation>
 <translation id="6339668969738228384">Skapa en ny profil för <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Det gick inte att ansluta till servern. Kontrollera nätverksanslutningen och försök igen. Starta om Chromebook om problemet kvarstår.</translation>
 <translation id="6340071272923955280">Protokoll för internetutskrift (IPPS)</translation>
@@ -3675,6 +3686,7 @@
 <translation id="6606070663386660533">Flik 8</translation>
 <translation id="6607272825297743757">Filinformation</translation>
 <translation id="6607831829715835317">Fler verkt&amp;yg</translation>
+<translation id="6610147964972079463">Stäng privata flikar</translation>
 <translation id="6612358246767739896">Skyddat innehåll</translation>
 <translation id="6613452264606394692">Hitta snabbt tillbaka hit med ett bokmärke</translation>
 <translation id="6614893213975402384">Installera uppdateringar och appar. Genom att fortsätta godkänner du att enheten kan ladda ned och installera uppdateringar och appar automatiskt från Google, operatören och enhetstillverkaren, eventuellt genom att använda mobildata. Det kan hända att några av apparna erbjuder köp i appen. Du kan när som helst ta bort dessa appar. <ph name="BEGIN_LINK1" />Läs mer<ph name="END_LINK1" /></translation>
@@ -3745,6 +3757,7 @@
 <translation id="6710213216561001401">Föregående</translation>
 <translation id="6718273304615422081">Komprimerar ...</translation>
 <translation id="671928215901716392">Lås skärmen</translation>
+<translation id="6720847671508630642">Dela det bästa på Android med din Chromebook automatiskt. Anslut mobilen så att du kan skicka sms från datorn, dela mobilens internetanslutning och låsa upp skärmen på Chromebook.<ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Visa säkerhetsnyckelns märke och modell</translation>
 <translation id="6721972322305477112">&amp;Arkiv</translation>
 <translation id="672213144943476270">Du måste låsa upp din profil innan du kan surfa som gäst.</translation>
@@ -3891,6 +3904,7 @@
 <translation id="6970856801391541997">Skriv ut vissa sidor</translation>
 <translation id="6972180789171089114">Ljud/video</translation>
 <translation id="6973630695168034713">Mappar</translation>
+<translation id="6974609594866392343">Demoläge offline</translation>
 <translation id="6976108581241006975">JavaScript-konsol</translation>
 <translation id="6977381486153291903">Revision av firmware</translation>
 <translation id="6978121630131642226">Sökmotorer</translation>
@@ -4033,6 +4047,7 @@
 <translation id="7175353351958621980">Överförd från:</translation>
 <translation id="7180611975245234373">Uppdatera</translation>
 <translation id="7180865173735832675">Anpassa</translation>
+<translation id="7182359331070524176">Välj ett fotoalbum i Google Foto</translation>
 <translation id="7186088072322679094">Spara i verktygsfältet</translation>
 <translation id="7187428571767585875">Registerposter som tas bort eller ändras:</translation>
 <translation id="7189234443051076392">Kontrollera att det finns tillräckligt mycket utrymme på enheten</translation>
@@ -4484,6 +4499,7 @@
 <translation id="7857949311770343000">Var det den här nya fliksidan du väntade dig?</translation>
 <translation id="786073089922909430">Tjänst: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Nedladdade filer</translation>
+<translation id="7864662577698025113">Lägg till ny tjänst</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookies}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> – kopplad</translation>
 <translation id="7870730066603611552">Granska synkroniseringsalternativen efter konfigureringen</translation>
@@ -4998,6 +5014,7 @@
 <translation id="8666584013686199826">Fråga om en webbplats försöker få åtkomst till USB-enheter</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> visas nu i helskärm och har inaktiverat din muspekare.</translation>
 <translation id="8669284339312441707">Varmare</translation>
+<translation id="8669919703154928649">Tillåt assistenten att visa aviseringar</translation>
 <translation id="8669949407341943408">Flyttar …</translation>
 <translation id="8671210955687109937">Kan kommentera</translation>
 <translation id="8673026256276578048">Sök på webben ...</translation>
@@ -5385,6 +5402,7 @@
 <translation id="964286338916298286">IT-administratören har inaktiverat Godbitar från Chrome för din enhet.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{App}other{Appar}}</translation>
 <translation id="967007123645306417">Du loggas ut från dina Google-konton. När bokmärken, historik, lösenord och andra inställningar ändras kommer dessa ändringar inte längre att synkroniseras med Google-kontot. Uppgifter som redan har sparats i Google-kontot finns däremot kvar och kan hanteras via <ph name="BEGIN_LINK" />Google Översikt<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Sparad data</translation>
 <translation id="968000525894980488">Aktivera Google Play-tjänster.</translation>
 <translation id="968174221497644223">Programmets cacheminne</translation>
 <translation id="969096075394517431">Ändra språk</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index e726e0f..fe878b9 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -398,6 +398,7 @@
 <translation id="1589055389569595240">Onyesha Tahajia na Sarufi</translation>
 <translation id="1593594475886691512">Inaumbiza...</translation>
 <translation id="159359590073980872">Akiba ya Picha</translation>
+<translation id="1593926297800505364">Hifadhi njia ya kulipa</translation>
 <translation id="1598233202702788831">Sasisho zimezimwa na msimamizi wako.</translation>
 <translation id="1600857548979126453">Fikia sehemu ya nyuma ya kitatuzi ukurasa</translation>
 <translation id="1601560923496285236">Tekeleza</translation>
@@ -508,6 +509,7 @@
 <translation id="1744060673522309905">Imeshindwa kuunganisha kifaa kwenye kikoa. Hakikisha kuwa hujapitisha idadi ya vifaa unavyoruhusiwa kuongeza.</translation>
 <translation id="1744108098763830590">Ukurasa wa mandharinyuma</translation>
 <translation id="1745520510852184940">Fanya Hivi Kila Mara</translation>
+<translation id="1746417874336251387">Kutoa vipengele vipya vinavyotumia muunganisho wa simu yako kwenye Chromebook</translation>
 <translation id="174937106936716857">Jumla ya idadi ya faili</translation>
 <translation id="175196451752279553">&amp;Fungua tena kichupo kilichofungwa</translation>
 <translation id="1753905327828125965">Zinazotembelewa Zaidi</translation>
@@ -638,8 +640,10 @@
 <translation id="1932098463447129402">Sio Kabla</translation>
 <translation id="1933809209549026293">Tafadhali unganisha kipanya au kibodi. Ikiwa unatumia kifaa cha Bluetooth, hakikisha kuwa kiko tayari kuoanisha.</translation>
 <translation id="1936157145127842922">Onyesha katika Folda</translation>
+<translation id="1938351510777341717">Amri ya Nje</translation>
 <translation id="1940546824932169984">Vifaa vilivyounganishwa</translation>
 <translation id="1942765061641586207">Ubora wa picha</translation>
+<translation id="1943097386230153518">Sakinisha huduma mpya</translation>
 <translation id="1944921356641260203">Sasisho imepatikana</translation>
 <translation id="1951615167417147110">Sogeza ukurasa mmoja juu</translation>
 <translation id="1954813140452229842">Hitilafu imetokea wakati wa kupachika faili ya kushiriki. Tafadhali angalia kitambulisho chako kisha ujaribu tena.</translation>
@@ -1104,6 +1108,7 @@
 <translation id="2653659639078652383">Wasilisha</translation>
 <translation id="265390580714150011">Thamani ya Uga</translation>
 <translation id="2654166010170466751">Ruhusu tovuti zisakinishe vidhibiti vya malipo</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Vipengele vinatofautiana kulingana na kifaa</translation>
 <translation id="2660779039299703961">Tukio</translation>
 <translation id="266079277508604648">Imeshindwa kuunganisha kwenye printa. Hakikisha kuwa printa imewashwa na imeunganishwa kwenye Chromebook yako kwa kutumia Wi-Fi au USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1210,6 +1215,7 @@
 <translation id="2803375539583399270">Weka PIN</translation>
 <translation id="2805646850212350655">Mfumo wa Microsoft wa Usimbaji wa Faili</translation>
 <translation id="2805756323405976993">Programu</translation>
+<translation id="2806891468525657116">Tayari umeweka njia hii ya mkato</translation>
 <translation id="2807517655263062534">Faili unazopakua zitaonekana hapa</translation>
 <translation id="2809586584051668049">na <ph name="NUMBER_ADDITIONAL_DISABLED" /> zaidi</translation>
 <translation id="281133045296806353">Imeunda ukurasa mpya katika kipindi cha kivinjari kilichopo.</translation>
@@ -1593,6 +1599,7 @@
 <translation id="3428419049384081277">Umeingia katika akaunti!</translation>
 <translation id="3429275422858276529">Alamisha ukurasa huu ili uupate kwa urahisi baadaye</translation>
 <translation id="3429599832623003132">Vipengee $1</translation>
+<translation id="3430342160185525240">Huruhusu programu ya Mratibu ikuonyeshe arifa.</translation>
 <translation id="3432227430032737297">Futa Vidakuzi Vyote Vilivyoonyeshwa</translation>
 <translation id="3432757130254800023">Tuma sauti na video za kuonyesha kwenye mtandao wa ndani</translation>
 <translation id="3432762828853624962">Wafanyakazi wa Pamoja</translation>
@@ -1957,6 +1964,7 @@
 <ph name="CONTROL_PANEL_APPLET_NAME" /> katika Kidirisha cha Kudhibiti.
 
 Ungependa kuanza <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Imeshindwa kuunda njia ya mkato</translation>
 <translation id="3943582379552582368">&amp;Nyuma</translation>
 <translation id="3943857333388298514">Bandika</translation>
 <translation id="3948116654032448504">Tafuta <ph name="SEARCH_ENGINE" /> Picha</translation>
@@ -2262,6 +2270,7 @@
 <translation id="4481530544597605423">Vifaa visivyooanishwa</translation>
 <translation id="4482194545587547824">Google inaweza kutumia historia yako ya mambo uliyovinjari kuweka mapendeleo ya huduma za Tafuta na huduma nyingine za Google.</translation>
 <translation id="4495419450179050807">Usionyeshe kwenye ukurasa huu</translation>
+<translation id="4499718683476608392">Ruhusu huduma ya Kujaza Kiotomatiki kadi za mikopo ijaze fomu kwa kubofya mara moja</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> imeacha kufanya kazi</translation>
 <translation id="450099669180426158">Aikoni ya alama hisi</translation>
 <translation id="4501530680793980440">Thibitisha Uondoaji</translation>
@@ -2540,7 +2549,6 @@
 <translation id="4917385247580444890">Thabiti</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> inataka kuwasiliana na kiendelezi "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Kubali</translation>
-<translation id="4920350943031252905">Tumia IDE, vihariri na zana za Linux kwenye Chromebook yako.</translation>
 <translation id="4920887663447894854">Tovuti zifuatazo zimezuiwa zisifuatilie mahali ulipo kwenye ukurasa huu:</translation>
 <translation id="492299503953721473">Ondoa programu za Android</translation>
 <translation id="4923279099980110923">Ndiyo, nataka kusaidia</translation>
@@ -3106,6 +3114,7 @@
 <translation id="5752453871435543420">Hifadhi rudufu ya Wingu la Chrome OS</translation>
 <translation id="5756163054456765343">Kituo cha Usaidizi</translation>
 <translation id="5759728514498647443">Hati unazotuma zichapishwe kupitia <ph name="APP_NAME" /> zinaweza kusomwa na <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Mipangilio ya kadi ya mikopo</translation>
 <translation id="5763751966069581670">Hakuna vifaa vya USB</translation>
 <translation id="5764483294734785780">&amp;Hifadhi audio kama</translation>
 <translation id="57646104491463491">Tarehe ya Kubadilishwa</translation>
@@ -3177,6 +3186,7 @@
 <translation id="5855773610748894548">Lo! Hitilafu ya sehemu salama imetokea.</translation>
 <translation id="5856721540245522153">Washa vipengele vya kutatua</translation>
 <translation id="5857090052475505287">Folda Mpya</translation>
+<translation id="585979798156957858">Meta ya Nje</translation>
 <translation id="5860033963881614850">Kimezimwa</translation>
 <translation id="5860209693144823476">Kichupo cha 3</translation>
 <translation id="5860491529813859533">Washa</translation>
@@ -3486,6 +3496,7 @@
 <translation id="6327785803543103246">Ugunduzi wa seva mbadala za wavuti kiotomatiki</translation>
 <translation id="6333064448949140209">Faili itatumwa kwa Google kwa ajili ya utatuzi</translation>
 <translation id="6333834492048057036">Sehemu ya anwani ya kulenga ya kutafuta</translation>
+<translation id="6336451774241870485">Kichupo kipya cha faragha</translation>
 <translation id="6339668969738228384">Unda wasifu mpya wa <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Imeshindwa kuunganisha kwenye seva. Tafadhali angalia muunganisho wa mtandao wako kisha ujaribu tena. Kama tatizo litaendelea kwa muda, zima kisha uwashe Chromebook yako.</translation>
 <translation id="6340071272923955280">Itifaki ya Kuchapisha ya Intaneti (IPPS)</translation>
@@ -3667,6 +3678,7 @@
 <translation id="6606070663386660533">Kichupo cha 8</translation>
 <translation id="6607272825297743757">Maelezo ya faili</translation>
 <translation id="6607831829715835317">Zana zaidi</translation>
+<translation id="6610147964972079463">Funga vichupo vya faragha</translation>
 <translation id="6612358246767739896">Maudhui yanayolindwa</translation>
 <translation id="6613452264606394692">Rejea hapa kwa haraka kwa kualamisha ukurasa huu</translation>
 <translation id="6614893213975402384">Sakinisha programu na masasisho. Kwa kuendelea, unakubali kuwa kifaa hiki kinaweza kupakua na kusakinisha programu na masasisho kiotomatiki kutoka Google, mtoa huduma wako na anayetengeneza kifaa chako, kwa kutumia data ya mtandao wa simu, panapowezekana. Huenda baadhi ya programu hizi zikawa na bidhaa zinazonunuliwa ndani ya programu. Unaweza kuondoa programu hizi wakati wowote. <ph name="BEGIN_LINK1" />Pata Maelezo Zaidi<ph name="END_LINK1" /></translation>
@@ -3737,6 +3749,7 @@
 <translation id="6710213216561001401">Iliyotangulia</translation>
 <translation id="6718273304615422081">Inabanwa...</translation>
 <translation id="671928215901716392">Funga skrini</translation>
+<translation id="6720847671508630642">Shiriki kiotomatiki vipengele bora vya Android ukitumia Chromebook. Unganisha simu yako ili uweze kutuma SMS ukitumia kompyuta, ushiriki muunganisho wa intaneti wa simu yako na ufungue skrini ya Chromebook yako.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Angalia muundo na aina ya Ufunguo wako wa Usalama</translation>
 <translation id="6721972322305477112">&amp;Faili</translation>
 <translation id="672213144943476270">Tafadhali fungua wasifu wako kabla ya kuvinjari ukitumia hali ya mgeni.</translation>
@@ -3883,6 +3896,7 @@
 <translation id="6970856801391541997">Chapisha Kurasa Mahsusi</translation>
 <translation id="6972180789171089114">Sauti/Video</translation>
 <translation id="6973630695168034713">Folda</translation>
+<translation id="6974609594866392343">Hali ya onyesho la nje ya mtando</translation>
 <translation id="6976108581241006975">Kidhibiti JavaScript</translation>
 <translation id="6977381486153291903">Sahihisho la programu dhibiti</translation>
 <translation id="6978121630131642226">Injini tafuti</translation>
@@ -4025,6 +4039,7 @@
 <translation id="7175353351958621980">Imepakiwa kutoka:</translation>
 <translation id="7180611975245234373">Onyesha upya</translation>
 <translation id="7180865173735832675">Binafsisha</translation>
+<translation id="7182359331070524176">Chagua albamu ya Picha kwenye Google</translation>
 <translation id="7186088072322679094">Weka katika Upau wa Vidhibiti</translation>
 <translation id="7187428571767585875">Data ya sajili itakayoondolewa au kubadilishwa:</translation>
 <translation id="7189234443051076392">Hakikisha kuwa una nafasi ya kutosha kwenye kifaa chako</translation>
@@ -4477,6 +4492,7 @@
 <translation id="7857949311770343000">Je, huu ndio ukurasa wa kichupo kipya uliokuwa ukiutarajia?</translation>
 <translation id="786073089922909430">Huduma: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Vipakuzi</translation>
+<translation id="7864662577698025113">Ongeza huduma mpya</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{Kidakuzi 1}other{Vidakuzi #}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Imeoanishwa</translation>
 <translation id="7870730066603611552">Kagua chaguo za usawazishaji baada ya kuweka mipangilio</translation>
@@ -4992,6 +5008,7 @@
 <translation id="8666584013686199826">Iulize wakati tovuti inataka kufikia vifaa vya USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> sasa ni skrini nzima na imelemaza kiteuzi chako cha kipanya.</translation>
 <translation id="8669284339312441707">Inayong'aa kidogo</translation>
+<translation id="8669919703154928649">Ruhusu programu ya Mratibu ikuonyeshe arifa</translation>
 <translation id="8669949407341943408">Inahamisha...</translation>
 <translation id="8671210955687109937">Anaweza kutoa maoni</translation>
 <translation id="8673026256276578048">Tafuta Wavuti...</translation>
@@ -5379,6 +5396,7 @@
 <translation id="964286338916298286">Msimamizi wako wa Tehama amezima Zawadi za Chrome kwa kifaa chako.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Programu}other{Programu}}</translation>
 <translation id="967007123645306417">Hatua hii itakuondoa katika akaunti zako za Google. Mabadiliko utakayofanya kwenye alamisho, historia, manenosiri na mipangilio yako mingine hayatasawazishwa katika Akaunti yako ya Google. Hata hivyo, data yako ya sasa itaendelea kuhifadhiwa katika Akaunti yako ya Google na inaweza kudhibitiwa kwenye <ph name="BEGIN_LINK" />Dashibodi ya Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Data iliyohifadhiwa</translation>
 <translation id="968000525894980488">Washa huduma za Google Play.</translation>
 <translation id="968174221497644223">Akiba ya programu</translation>
 <translation id="969096075394517431">Badilisha lugha</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 5c6d3c59..03034db 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">இலக்கணம் மற்றும் எழுத்துப்பிழையைக் காண்பி</translation>
 <translation id="1593594475886691512">வடிவமைக்கிறது...</translation>
 <translation id="159359590073980872">படத்தின் தற்காலிக சேமிப்பு</translation>
+<translation id="1593926297800505364">கட்டண முறையைச் சேமிக்கும்</translation>
 <translation id="1598233202702788831">உங்கள் நிர்வாகியால் புதுப்பிப்புகள் முடக்கப்பட்டுள்ளன.</translation>
 <translation id="1600857548979126453">பக்க பிழைதிருத்தியின் பின்தளத்தை அணுகலாம்</translation>
 <translation id="1601560923496285236">பயன்படுத்து</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">சாதனத்தை டொமைனுடன் இணைக்க முடியவில்லை. நீங்கள் சேர்க்கக்கூடிய சாதனங்களின் அதிகபட்ச எண்ணிக்கையை மீறவில்லை என்பதை உறுதிசெய்யவும்.</translation>
 <translation id="1744108098763830590">பின்புலப் பக்கம்</translation>
 <translation id="1745520510852184940">எப்போதும் இதைச் செய்</translation>
+<translation id="1746417874336251387">Chromebookகில் உங்கள் ஃபோனின் இணைப்பைப் பயன்படுத்தும் புதிய அம்சங்களை வழங்குகிறது</translation>
 <translation id="174937106936716857">மொத்த கோப்பின் எண்ணிக்கை</translation>
 <translation id="175196451752279553">மூடிய தாவலை ம&amp;றுபடி திறக்கவும்</translation>
 <translation id="1753905327828125965">அதிகமாகப் பார்க்கப்பட்டவை</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">இதற்குமுன் அல்ல</translation>
 <translation id="1933809209549026293">சுட்டி அல்லது விசைப்பலகையை இணைக்கவும். புளூடூத் சாதனத்தைப் பயன்படுத்துகிறீர்கள் எனில், அது இணைப்பதற்குத் தயாராக உள்ளது என்பதை உறுதிசெய்யவும்.</translation>
 <translation id="1936157145127842922">கோப்புறையில் காண்பி</translation>
+<translation id="1938351510777341717">வெளிக் கட்டளை</translation>
 <translation id="1940546824932169984">இணைத்துள்ள சாதனங்கள்</translation>
 <translation id="1942765061641586207">படத் தெளிவுத்திறன்</translation>
+<translation id="1943097386230153518">புதிய சேவையை நிறுவு</translation>
 <translation id="1944921356641260203">புதுப்பிப்பு உள்ளது</translation>
 <translation id="1951615167417147110">ஒரு பக்கம் மேலே செல்</translation>
 <translation id="1954813140452229842">பகிர்வை ஏற்றுவதில் பிழை. உங்கள் அனுமதிச் சான்றுகளைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation>
@@ -1109,6 +1113,7 @@
 <translation id="2653659639078652383">சமர்ப்பி</translation>
 <translation id="265390580714150011">புல மதிப்பு</translation>
 <translation id="2654166010170466751">பேமண்ட் ஹேண்ட்லர்களை நிறுவுவதற்குத் தளங்களை அனுமதிக்கும்</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />சாதனத்திற்கேற்ப அம்சங்கள் மாறுபடலாம்</translation>
 <translation id="2660779039299703961">நிகழ்வு</translation>
 <translation id="266079277508604648">பிரிண்டருடன் இணைக்க முடியவில்லை. பிரிண்டர் இயக்கப்பட்டு, வைஃபை அல்லது USB மூலம் அது உங்கள் Chromebook உடன் இணைக்கப்பட்டுள்ளதா எனச் சரிபார்க்கவும்.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1215,6 +1220,7 @@
 <translation id="2803375539583399270">பின்னை உள்ளிடவும்</translation>
 <translation id="2805646850212350655">Microsoft Encrypting File System</translation>
 <translation id="2805756323405976993">ஆப்ஸ்</translation>
+<translation id="2806891468525657116">ஷார்ட்கட் ஏற்கனவே உள்ளது</translation>
 <translation id="2807517655263062534">நீங்கள் பதிவிறக்கும் கோப்புகள் இங்கே தோன்றும்</translation>
 <translation id="2809586584051668049">மேலும் <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">முன்பே உள்ள உலாவி அமர்வில் புதிய சாளரம் உருவாக்கப்பட்டது.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">உள்நுழைந்துவிட்டீர்கள்!</translation>
 <translation id="3429275422858276529">இந்தப் பக்கத்தைப் பிறகு எளிதாகக் கண்டறிய, புத்தகக்குறியிடவும்</translation>
 <translation id="3429599832623003132">$1 உருப்படிகள்</translation>
+<translation id="3430342160185525240">அறிவிப்புகளைக் காண்பிக்க அசிஸ்டண்ட்டுக்கு அனுமதியளிக்கும்.</translation>
 <translation id="3432227430032737297">காட்டப்படும் அனைத்தையும் அகற்று</translation>
 <translation id="3432757130254800023">அக நெட்வொர்க்கில் உள்ள காட்சிகளுக்கு ஆடியோவையும் வீடியோவையும் அனுப்பு</translation>
 <translation id="3432762828853624962">ஷேர்டு வொர்க்கர்ஸ்</translation>
@@ -1964,6 +1971,7 @@
   கட்டுப்பாட்டு பலகத்தில் உள்ள <ph name="CONTROL_PANEL_APPLET_NAME" /> ஐப் பயன்படுத்தி இதை நிறுவல் நீக்க வேண்டும்.
 
   <ph name="CONTROL_PANEL_APPLET_NAME" /> ஐத் தொடங்க வேண்டுமா?</translation>
+<translation id="394183848452296464">ஷார்ட்கட்டை உருவாக்க முடியவில்லை</translation>
 <translation id="3943582379552582368">&amp;முந்தைய பக்கம்</translation>
 <translation id="3943857333388298514">ஒட்டு</translation>
 <translation id="3948116654032448504">படத்தைத் &amp;தேடு <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">இணைக்காத சாதனங்கள்</translation>
 <translation id="4482194545587547824">தேடல் மற்றும் பிற Google சேவைகளைத் தனிப்பயனாக்க, உங்கள் உலாவல் வரலாற்றை Google பயன்படுத்தக்கூடும்</translation>
 <translation id="4495419450179050807">இந்தப் பக்கத்தில் காண்பிக்க வேண்டாம்</translation>
+<translation id="4499718683476608392">படிவங்களை ஒரே கிளிக்கில் நிரப்புவதற்காக, கிரெடிட் கார்டுத் தன்னிரப்பி அம்சத்தை இயக்கும்</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> செயலிழந்தது</translation>
 <translation id="450099669180426158">ஆச்சரியக்குறி ஐகான்</translation>
 <translation id="4501530680793980440">அகற்றுதலை உறுதிப்படுத்து</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">வலிமையானது</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" />, "<ph name="EXTENSION_NAME" />" நீட்டிப்புடன் தொடர்புகொள்ள விழைகிறது</translation>
 <translation id="4918086044614829423">ஏற்கிறேன்</translation>
-<translation id="4920350943031252905">Chromebook இல் Linux கருவிகள், திருத்திகள், IDEகள் ஆகியவற்றை இயக்கும்.</translation>
 <translation id="4920887663447894854">இந்தப் பக்கத்தில் உங்கள் இருப்பிடத்தைத் தடமறிவதிலிருந்து பின்வரும் தளங்கள் தடுக்கப்பட்டுள்ளன:</translation>
 <translation id="492299503953721473">Android பயன்பாடுகளை அகற்று</translation>
 <translation id="4923279099980110923">ஆம், எனக்கு உதவி தேவை</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Chrome OS கிளவுடு காப்புப் பிரதி</translation>
 <translation id="5756163054456765343">உதவி மையம்</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> மூலமாக அச்சிட அனுப்பிய ஆவணங்களை, <ph name="APP_NAME" /> படிக்க முடியும்.</translation>
+<translation id="5762172915276660232">கிரெடிட் கார்டு அமைப்புகள்</translation>
 <translation id="5763751966069581670">USB சாதனங்கள் இல்லை</translation>
 <translation id="5764483294734785780">ஆடியோவை இவ்வாறு சே&amp;மி...</translation>
 <translation id="57646104491463491">மாற்றிய தேதி</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">அச்சச்சோ, பாதுகாப்பு மாட்யூலில் பிழை.</translation>
 <translation id="5856721540245522153">பிழைதிருத்த அம்சங்களை இயக்குதல்</translation>
 <translation id="5857090052475505287">புதிய கோப்புறை</translation>
+<translation id="585979798156957858">வெளி மீத்தரவு விசை</translation>
 <translation id="5860033963881614850">ஆஃப்</translation>
 <translation id="5860209693144823476">தாவல் 3</translation>
 <translation id="5860491529813859533">இயக்கு</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">இணைய ப்ராக்ஸியைத் தானாகக் கண்டறி</translation>
 <translation id="6333064448949140209">பிழைத்திருத்தத்திற்காக, Googleக்குக் கோப்பு அனுப்பப்படும்</translation>
 <translation id="6333834492048057036">தேடலிற்காக முகவரி பட்டியைக் கவனி</translation>
+<translation id="6336451774241870485">புதிய மறைநிலைத் தாவல்</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" />க்குப் புதிய சுயவிவரத்தை உருவாக்கு</translation>
 <translation id="6340017061976355871">சேவையகத்துடன் இணைக்க முடியவில்லை. நெட்வொர்க் இணைப்பைச் சரிபார்த்து, மீண்டும் முயலவும். சிக்கல் தொடர்ந்தால், Chromebookஐ மீண்டும் தொடங்கவும்.</translation>
 <translation id="6340071272923955280">இன்டர்நெட் பிரிண்டிங் புரோட்டோகால் (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">தாவல் 8</translation>
 <translation id="6607272825297743757">கோப்புத் தகவல்</translation>
 <translation id="6607831829715835317">மேலும் கருவி&amp;கள்</translation>
+<translation id="6610147964972079463">மறைநிலைத் தாவல்களை மூடு</translation>
 <translation id="6612358246767739896">பாதுகாக்கப்பட்ட உள்ளடக்கம்</translation>
 <translation id="6613452264606394692">இந்தப் பக்கத்தைப் புத்தகக்குறியிடுவதன் மூலம், விரைவாக இதை அணுகலாம்</translation>
 <translation id="6614893213975402384">புதுப்பிப்புகளையும் பயன்பாடுகளையும் நிறுவும். தொடர்வதன் மூலம், இந்தச் சாதனமானது Google, உங்கள் தொலைத்தொடர்பு நிறுவனம் மற்றும் இந்தச் சாதனத்தின் உற்பத்தியாளர் ஆகியோரிடமிருந்து வரும் புதுப்பிப்புகளையும் பயன்பாடுகளையும் மொபைல் டேட்டா வழியே தானாகவே பதிவிறக்கி, நிறுவக்கூடும் என்பதை ஏற்கிறீர்கள். இந்தப் பயன்பாட்டில் சில, பயன்பாடு சார்ந்த வாங்குதல்களை அளிக்கலாம். நீங்கள் எப்போது வேண்டுமானாலும் இந்தப் பயன்பாடுகளை அகற்றிக்கொள்ளலாம். <ph name="BEGIN_LINK1" />மேலும் அறிக<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">முந்தையது</translation>
 <translation id="6718273304615422081">ஜிப் செய்கிறது...</translation>
 <translation id="671928215901716392">திரையைப் பூட்டு</translation>
+<translation id="6720847671508630642">Androidன் சிறந்த அம்சங்களை உங்கள் Chromebookகுடன் தானாகப் பகிரலாம். உங்கள் ஃபோனை இணைத்தால், உங்கள் கம்ப்யூட்டரிலிருந்து உரைச் செய்தி அனுப்பலாம், ஃபோனின் இணைய இணைப்பைப் பகிரலாம், Chromebookகின் திரையைப் பூட்டுநீக்கலாம்.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">உங்கள் பாதுகாப்பு விசையின் உற்பத்தியாளர் மற்றும் மாடலைப் பார்க்க விரும்புகிறது</translation>
 <translation id="6721972322305477112">&amp;File</translation>
 <translation id="672213144943476270">விருந்தினராக உலாவும் முன், உங்கள் சுயவிவரத்தைத் திறக்கவும்.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">குறிப்பிட்ட பக்கங்களை அச்சிடு</translation>
 <translation id="6972180789171089114">ஆடியோ/வீடியோ</translation>
 <translation id="6973630695168034713">கோப்புறைகள்</translation>
+<translation id="6974609594866392343">ஆஃப்லைன் டெமோ பயன்முறை</translation>
 <translation id="6976108581241006975">JavaScript கன்சோல்</translation>
 <translation id="6977381486153291903">நிலைபொருள் பதிப்பு</translation>
 <translation id="6978121630131642226">தேடு பொறிகள்</translation>
@@ -4485,6 +4499,7 @@
 <translation id="7857949311770343000">இந்தப் புதிய தாவல் பக்கத்தைத்தான் எதிர்பார்த்தீர்களா?</translation>
 <translation id="786073089922909430">சேவை: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;பதிவிறக்கங்கள்</translation>
+<translation id="7864662577698025113">புதிய சேவையைச் சேர்</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 குக்கீ}other{# குக்கீகள்}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - இணைக்கப்பட்டது</translation>
 <translation id="7870730066603611552">அமைவைத் தொடர்ந்து, ஒத்திசைவு விருப்பங்களை மதிப்பாய்வு செய்யவும்</translation>
@@ -4999,6 +5014,7 @@
 <translation id="8666584013686199826">தளமானது USB சாதனங்களை அணுக விரும்பும் போது அனுமதி கேள்</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> இப்போது முழுத்திரையில் உள்ளது. மேலும் உங்கள் இடஞ்சுட்டியை முடக்கியுள்ளது.</translation>
 <translation id="8669284339312441707">குறைவான நீலம்</translation>
+<translation id="8669919703154928649">அறிவிப்புகளைக் காண்பிக்க அசிஸ்டண்ட்டை அனுமதிக்கவும்</translation>
 <translation id="8669949407341943408">நகர்கிறது...</translation>
 <translation id="8671210955687109937">கருத்துத் தெரிவிக்கலாம்</translation>
 <translation id="8673026256276578048">வலையில் தேடு...</translation>
@@ -5386,6 +5402,7 @@
 <translation id="964286338916298286">உங்கள் சாதனத்திற்கான Chrome சலுகைகளை உங்கள் IT நிர்வாகி முடக்கியுள்ளார்.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{இணங்காத பயன்பாடு}other{இணங்காத பயன்பாடுகள்}}</translation>
 <translation id="967007123645306417">உங்கள் Google கணக்குகளிலிருந்து வெளியேற்றப்படுவீர்கள். இனி உங்கள் Google கணக்குடன் புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகள் ஒத்திசைக்கப்படாது. இருப்பினும், ஏற்கனவே சேமிக்கப்பட்ட உங்கள் தரவு Google கணக்கில் அப்படியே இருக்கும், அவற்றை <ph name="BEGIN_LINK" />Google டாஷ்போர்டில்<ph name="END_LINK" /> நிர்வகிக்கலாம்.</translation>
+<translation id="967624055006145463">சேமிக்கப்பட்ட தரவின்படி</translation>
 <translation id="968000525894980488">Google Play சேவைகளை இயக்கவும்.</translation>
 <translation id="968174221497644223">பயன்பாட்டு தற்காலிக சேமிப்பு</translation>
 <translation id="969096075394517431">மொழிகளை மாற்று</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 9c7fb67..067158d 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -222,6 +222,7 @@
 <translation id="1316136264406804862">శోధిస్తోంది...</translation>
 <translation id="1316495628809031177">సమకాలీకరణ పాజ్ చేయబడింది</translation>
 <translation id="1319979322914001937">Chrome వెబ్ స్టోర్ నుండి ఫిల్టర్ చేసిన పొడిగింపుల జాబితాను చూపే అనువర్తనం. జాబితాలో ఉన్న పొడిగింపులు అనువర్తనం నుండి నేరుగా ఇన్‌స్టాల్ చేయబడతాయి.</translation>
+<translation id="1322046419516468189">మీ <ph name="SAVED_PASSWORDS_STORE" />లో సేవ్ చేసిన పాస్‌వర్డ్‌లను చూడండి మరియు నిర్వహించండి</translation>
 <translation id="1326317727527857210">మీ ఇతర పరికరాల నుండి మీ ట్యాబ్‌లను పొందడానికి, Chromeకి సైన్ ఇన్ చేయండి.</translation>
 <translation id="1327074568633507428">Google మేఘ ముద్రణలో ప్రింటర్</translation>
 <translation id="1327977588028644528">గేట్‌వే</translation>
@@ -418,11 +419,13 @@
 <translation id="1618268899808219593">స&amp;హాయ కేంద్రం</translation>
 <translation id="162035744160882748">సమకాలీకరణ, వ్యక్తిగతీకరణ మరియు ఇతర Google సేవలను ఆన్ చేయండి</translation>
 <translation id="1620510694547887537">కెమెరా</translation>
+<translation id="1623132449929929218">చిత్రాలు ప్రస్తుతం అందుబాటులో లేవు. వాల్‌పేపప్ సేకరణలను చూడటానికి, దయచేసి ఇంటర్నెట్‌కు మళ్లీ కనెక్ట్ చేయండి.</translation>
 <translation id="1624026626836496796">ఇది ఒకసారి మాత్రమే జరుగుతుంది మరియు మీ ఆధారాలు నిల్వ చేయబడవు.</translation>
 <translation id="1627276047960621195">ఫైల్ వివరణలు</translation>
 <translation id="1627408615528139100">ఇప్పటికే డౌన్‌లోడ్ చేయబడింది</translation>
 <translation id="1632803087685957583">మీ కీబోర్డ్ పునరావృత రేటు, పద సూచన మొదలైనవి సర్దుబాటు చేయడానికి మిమ్మల్ని అనుమతిస్తుంది</translation>
 <translation id="1635033183663317347">మీ పర్యవేక్షకుడు ఇన్‌స్టాల్ చేసారు.</translation>
+<translation id="1635885551358739414">Chromeని మరియు అనువాదం, శోధన మరియు ప్రకటనలు వంటి ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి, మీరు సందర్శించే సైట్‌లలోని కంటెంట్‌ను, అలాగే బ్రౌజర్ కార్యకలాపం మరియు పరస్పర చర్యలను Google ఉపయోగించవచ్చు. మీరు దీన్ని సెట్టింగ్‌‌లలో అనుకూలీకరించవచ్చు.</translation>
 <translation id="1637224376458524414">ఈ బుక్‌మార్క్‌ని మీ iPhoneలో పొందండి</translation>
 <translation id="1637765355341780467">మీ ప్రొఫైల్‌ను తెరుస్తున్నప్పుడు ఏదో తప్పు జరిగింది. కొన్ని లక్షణాలు అందుబాటులో ఉండకపోవచ్చు.</translation>
 <translation id="1639239467298939599">లోడ్ అవుతోంది</translation>
@@ -453,6 +456,7 @@
 <translation id="166179487779922818">పాస్‌వర్డ్ చాలా చిన్నదిగా ఉంది.</translation>
 <translation id="1661867754829461514">PIN లేదు</translation>
 <translation id="16620462294541761">క్షమించండి, మీ పాస్‌వర్డ్ ధృవీకరించబడలేదు. దయచేసి మళ్ళీ ప్రయత్నించండి.</translation>
+<translation id="1662550410081243962">చెల్లింపు పద్ధతులను సేవ్ చేసి, పూరించండి</translation>
 <translation id="166278006618318542">విషయం పబ్లిక్ కీ అల్గారిథం</translation>
 <translation id="166439687370499867">షేర్ చేసిన నెట్‌వర్క్ కాన్ఫిగరేషన్‌లను మార్చడం అనుమతించబడదు</translation>
 <translation id="1665611772925418501">ఫైల్‌ను సవరించడం సాధ్యపడదు.</translation>
@@ -462,6 +466,7 @@
 <translation id="1673137583248014546"><ph name="URL" /> మీ భద్రతా కీ యొక్క తయారీదారు బ్రాండ్ పేరు మరియు మోడల్‌ని చూడాలనుకుంటోంది</translation>
 <translation id="167832068858235403">వాల్యూ. తగ్గించు</translation>
 <translation id="1679068421605151609">డెవలపర్ సాధనాలు</translation>
+<translation id="1680849702532889074">మీ Linux అప్లికేషన్ ఇన్‌స్టాలేషన్ సమయంలో ఎర్రర్ సంభవించింది.</translation>
 <translation id="16815041330799488">క్లిప్‌బోర్డ్‌కు కాపీ చేసిన వచనం మరియు చిత్రాలను చూడటానికి సైట్‌లను అనుమతించవద్దు</translation>
 <translation id="1682548588986054654">క్రొత్త అజ్ఞాత విండో</translation>
 <translation id="168715261339224929">మీ బుక్‌మార్క్‌లను మీ అన్ని పరికరాలలోనూ పొందాలంటే, సమకాలీకరణను ఆన్ చేయండి.</translation>
@@ -497,6 +502,7 @@
 <translation id="1732215134274276513">టాబ్‌లను అన్‌పిన్ చెయ్యండి</translation>
 <translation id="1734824808160898225"><ph name="PRODUCT_NAME" /> తనకు తాను అప్‌డేట్ అవుతూ ఉండటం సాధ్యం కాకపోవచ్చు</translation>
 <translation id="1736419249208073774">అన్వేషించండి</translation>
+<translation id="1736827427463982819">Linux (బీటా)ను షట్ డౌన్ చేయండి</translation>
 <translation id="1737968601308870607">ఫైల్ బగ్</translation>
 <translation id="1741314857973421784">కొనసాగించు</translation>
 <translation id="174173592514158117">అన్ని ప్లే ఫోల్డర్‌లను చూపు</translation>
@@ -669,6 +675,7 @@
 <translation id="1997484222658892567"><ph name="URL" /> శాశ్వతంగా అధిక డేటాని మీ స్థానిక కంప్యూటర్‌లో నిల్వ చేయాలనుకుంటోంది</translation>
 <translation id="1997616988432401742">మీ ప్రమాణపత్రాలు</translation>
 <translation id="1999115740519098545">ప్రారంభించిన తరువాత</translation>
+<translation id="2000419248597011803">చిరునామా బార్ మరియు శోధన పెట్టెలోని కొన్ని కుక్కీలు మరియు శోధనలను మీ డిఫాల్ట్ శోధన ఇంజిన్‌కు పంపుతుంది</translation>
 <translation id="2001796770603320721">డిస్క్‌లో నిర్వహించు</translation>
 <translation id="2004663115385769400">$1తో తెరవడం సాధ్యపడదు</translation>
 <translation id="200544492091181894">మీరు దీన్ని తర్వాత ఎప్పుడైనా సెట్టింగ్‌లలో మార్చవచ్చు</translation>
@@ -695,6 +702,7 @@
 <translation id="2045969484888636535">కుకీలను నిరోధించడాన్ని కొనసాగించండి</translation>
 <translation id="204622017488417136">మీ పరికరం మునుపు ఇన్‌స్టాల్ చేసిన Chrome సంస్కరణకు తిరిగి మార్చబడింది. అన్ని వినియోగదారు ఖాతాలు మరియు స్థానిక డేటా తీసివేయబడుతుంది. దీన్ని రద్దు చేయడం సాధ్యపడదు.</translation>
 <translation id="2048182445208425546">మీ నెట్‌వర్క్ ట్రాఫిక్‌ను ప్రాప్యత చేయండి</translation>
+<translation id="2048653237708779538">చర్య అందుబాటులో లేదు</translation>
 <translation id="204914487372604757">సత్వరమార్గాన్ని సృష్టించు</translation>
 <translation id="2050339315714019657">నిలువు</translation>
 <translation id="2053312383184521053">నిష్క్రియ స్థితి డేటా</translation>
@@ -783,6 +791,7 @@
 <translation id="2178098616815594724"><ph name="PEPPER_PLUGIN_DOMAIN" />లోని <ph name="PEPPER_PLUGIN_NAME" /> మీ కంప్యూటర్‌ని యాక్సెస్ చేయాలనుకుంటోంది</translation>
 <translation id="2178614541317717477">CA రాజీ</translation>
 <translation id="218070003709087997">ఎన్ని కాపీలను ముద్రించాలో (1 నుండి 999) సంఖ్యతో సూచించండి.</translation>
+<translation id="2183558561014688873">మీ పరికరం యాక్టివ్ అయ్యి, అన్‌లాక్ చేయబడినప్పుడు మీరు ఎప్పుడైనా "OK Google" అని చెప్పి, అసిస్టెంట్‌ను యాక్సెస్ చేయవచ్చు.</translation>
 <translation id="2187895286714876935">సర్వర్  ప్రమాణపత్రం  దిగుమతి లోపం</translation>
 <translation id="2187906491731510095">పొడిగింపులు నవీకరించబడ్డాయి</translation>
 <translation id="2188881192257509750"><ph name="APPLICATION" />ని తెరువు</translation>
@@ -854,6 +863,7 @@
 <translation id="2282146716419988068">GPU ప్రాసెస్</translation>
 <translation id="2282155092769082568">స్వయంచాలక కాన్ఫిగరేషన్ URL:</translation>
 <translation id="2283117145434822734">F6</translation>
+<translation id="2283340219607151381">చిరునామాలను సేవ్ చేసి, పూరించండి</translation>
 <translation id="2286841657746966508">బిల్లింగ్ చిరునామా</translation>
 <translation id="2288181517385084064">వీడియో రికార్డర్‌కి మార్చు</translation>
 <translation id="2288735659267887385">ప్రాప్యత సెట్టింగ్‌లు</translation>
@@ -935,6 +945,7 @@
 <translation id="2425665904502185219">మొత్తం ఫైల్ పరిమాణం</translation>
 <translation id="2428510569851653187">ట్యాబ్ క్రాష్ అయిన సమయంలో మీరు ఏం చేస్తున్నారో వివరించండి</translation>
 <translation id="2431027948063157455">Google సహాయకం లోడ్ చేయడం సాధ్యపడలేదు, దయచేసి మీ నెట్‌వర్క్ కనెక్షన్‌ను తనిఖీ చేసుకుని మళ్లీ ప్రయత్నించండి.</translation>
+<translation id="2432753757290432042">Linux (బీటా) అప్‌డేట్ అవసరం</translation>
 <translation id="2433452467737464329">పేజీని స్వీయ రీఫ్రెష్ చేయడానికి URLలో ప్రశ్న పరామితిని జోడించండి: chrome://network/?refresh=&lt;sec&gt;</translation>
 <translation id="2433507940547922241">కనిపించే తీరు</translation>
 <translation id="2433836460518180625">పరికరాన్ని మాత్రం అన్‌లాక్ చేయండి</translation>
@@ -1184,6 +1195,7 @@
 <translation id="2775104091073479743">వేలిముద్రలను సవరించండి</translation>
 <translation id="2776441542064982094">నెట్‌వర్క్‌లో నమోదు చేయడానికి పరికరాలు అందుబాటులో లేనట్లుగా కనిపిస్తోంది. మీ పరికరం ఆన్‌లో ఉండి, ఇంటర్నెట్‌కు కనెక్ట్ చేయబడి ఉంటే, దాని యొక్క సూచన మాన్యువల్‌లోని సూచనలని పాటించి దాన్ని నమోదు చేయడానికి ప్రయత్నించండి.</translation>
 <translation id="2781692009645368755">Google Pay</translation>
+<translation id="2782104745158847185">Linux అప్లికేషన్‌ను ఇన్‌స్టాల్ చేయడంలో ఎర్రర్</translation>
 <translation id="2783298271312924866">డౌన్‌లోడ్ చేయబడింది</translation>
 <translation id="2783321960289401138">సత్వరమార్గాన్ని సృష్టించు...</translation>
 <translation id="2783829359200813069">ఎన్‌క్రిప్షన్ రకాలను ఎంచుకోండి</translation>
@@ -1208,6 +1220,7 @@
 <translation id="2812944337881233323">సైన్ అవుట్ చేసి, తిరిగి సైన్ ఇన్ చేయడం ప్రయత్నించండి</translation>
 <translation id="2812989263793994277">ఏ చిత్రాలనూ చూపించవద్దు</translation>
 <translation id="2814489978934728345">ఈ పేజిని లోడ్ చెయ్యడం ఆపు</translation>
+<translation id="281504910091592009">మీ <ph name="BEGIN_LINK" />Google ఖాతా<ph name="END_LINK" />లో సేవ్ చేసిన పాస్‌వర్డ్‌లను చూడండి మరియు నిర్వహించండి</translation>
 <translation id="2815500128677761940">బుక్‌మార్క్‌ల పట్టీ</translation>
 <translation id="2815693974042551705">ఫోల్డర్‌ను బుక్‌మార్క్ చేయండి</translation>
 <translation id="2818476747334107629">ప్రింటర్ వివరాలు</translation>
@@ -1288,6 +1301,7 @@
 <translation id="2939938020978911855">అందుబాటులో ఉన్న బ్లూటూత్ పరికరాలను చూపు</translation>
 <translation id="2941112035454246133">తక్కువ</translation>
 <translation id="2942560570858569904">వేచి ఉంది...</translation>
+<translation id="2942581856830209953">ఈ పేజీని అనుకూలీకరించండి</translation>
 <translation id="2943400156390503548">స్లయిడ్‌లు</translation>
 <translation id="2943503720238418293">కొద్దిగా చిన్న పేరును ఉపయోగించండి</translation>
 <translation id="2946119680249604491">కనెక్షన్‌ని జోడించండి</translation>
@@ -1772,6 +1786,7 @@
 <translation id="3693415264595406141">పాస్‌వర్డ్:</translation>
 <translation id="3694027410380121301">మునుపటి టాబ్‌ను ఎంచుకో</translation>
 <translation id="3699624789011381381">ఇమెయిల్ చిరునామా</translation>
+<translation id="3699920817649120894">సమకాలీకరణ మరియు వ్యక్తిగతీకరణను ఆఫ్ చేయాలా?</translation>
 <translation id="3700888195348409686">ప్రదర్శించబడుతోంది (<ph name="PAGE_ORIGIN" />)</translation>
 <translation id="3702500414347826004">మీ ప్రారంభ పేజీలు <ph name="URL" />ని చేర్చేలా మార్చబడ్డాయి.</translation>
 <translation id="370415077757856453">JavaScript బ్లాక్ చేయబడింది</translation>
@@ -1868,6 +1883,7 @@
 <translation id="3827774300009121996">&amp;పూర్తి స్క్రీన్</translation>
 <translation id="3828029223314399057">బుక్‌మార్క్‌లను శోధించు</translation>
 <translation id="3830674330436234648">ప్లేబ్యాక్ అందుబాటులో లేదు</translation>
+<translation id="3831436149286513437">Google డిస్క్ శోధన సూచనలు</translation>
 <translation id="3831486154586836914">విండో స్థూలదృష్టి మోడ్‌లోకి ప్రవేశించారు</translation>
 <translation id="383161972796689579">ఈ పరికరం యొక్క యజమాని క్రొత్త వినియోగదారులను జోడించడం నిలిపివేసారు</translation>
 <translation id="3834775135533257713"><ph name="TO_INSTALL_APP_NAME" /> అనువర్తనం "<ph name="INSTALLED_APP_NAME" />"కి వైరుధ్యంగా ఉన్నందున దాన్ని జోడించలేరు.</translation>
@@ -1901,6 +1917,7 @@
 <translation id="3871092408932389764">అతి తక్కువ</translation>
 <translation id="3872220884670338524">మరిన్ని చర్యలు, <ph name="DOMAIN" />లో <ph name="USERNAME" /> కోసం సేవ్ చేయబడిన ఖాతా</translation>
 <translation id="3872991219937722530">డిస్క్ స్థలాన్ని ఖాళీ చేయండి, లేదంటే పరికరం ప్రతిస్పందనరహితం అవుతుంది.</translation>
+<translation id="3873315167136380065">దీన్ని ఆన్ చేయడానికి, మీ సమకాలీకరణ రహస్య పదబంధాన్ని తీసివేయడానికి <ph name="BEGIN_LINK" />సమకాలీకరణను రీసెట్ చేయండి<ph name="END_LINK" /></translation>
 <translation id="3878840326289104869">పర్యవేక్షించబడే వినియోగదారుని సృష్టిస్తోంది</translation>
 <translation id="3879748587602334249">డౌన్‌లోడ్ నిర్వాహికి</translation>
 <translation id="3880709822663530586">మీ పరికరం బ్లూటూత్ ఆన్‌లో ఉన్నప్పుడు మాత్రమే మీ భద్రతా కీ పని చేస్తుంది</translation>
@@ -2024,6 +2041,7 @@
 <translation id="4068776064906523561">సేవ్ చేయబడిన వేలిముద్రలు</translation>
 <translation id="407173827865827707">క్లిక్ చేసినప్పుడు</translation>
 <translation id="4071770069230198275"><ph name="PROFILE_NAME" />: సైన్ ఇన్ లోపం</translation>
+<translation id="4071828814509176232">OK Google</translation>
 <translation id="4074900173531346617">ఇమెయిల్ సైన్ చేసినవారి సర్టిఫికెట్</translation>
 <translation id="407520071244661467">ప్రమాణం</translation>
 <translation id="4075639477629295004"><ph name="FILE_NAME" />ని ప్రసారం చేయడం సాధ్యపడలేదు.</translation>
@@ -2091,6 +2109,7 @@
 <translation id="4192273449750167573">తర్వాతి స్క్రీన్‌లో మీ సెట్టింగ్‌లను సమీక్షించండి</translation>
 <translation id="4193154014135846272">Google పత్రం</translation>
 <translation id="4194570336751258953">క్లిక్ చెయ్యడానికి టాప్ చెయ్యి ప్రారంభించు</translation>
+<translation id="4195249722193633765">Linux (బీటా)తో అప్లికేషన్‌ని ఇన్‌స్టాల్ చేయండి</translation>
 <translation id="4195643157523330669">క్రొత్త టాబ్‌లో తెరువు</translation>
 <translation id="4195814663415092787">మీరు నిష్క్రమించిన చోటు నుండే కొనసాగించండి</translation>
 <translation id="4197674956721858839">జిప్ ఎంపిక</translation>
@@ -2151,7 +2170,9 @@
 <translation id="428608937826130504">అర అంశం 8</translation>
 <translation id="4287502004382794929">ఈ పరికరాన్ని నమోదు చేయడానికి మీకు తగిన సాఫ్ట్‌వేర్ లైసెన్స్‌లు లేవు. దయచేసి మరిన్నింటిని కొనుగోలు చేయడానికి విక్రయ కేంద్రాన్ని సంప్రదించండి. మీరు ఈ సందేశాన్ని పొరపాటున చూస్తున్నారని విశ్వసిస్తే, దయచేసి మద్దతు కేంద్రాన్ని సంప్రదించండి.</translation>
 <translation id="4289540628985791613">స్థూలదృష్టి</translation>
+<translation id="4295072614469448764">మీ టెర్మినల్‌లో యాప్ అందుబాటులో ఉంది. మీ లాంచర్‌లో కూడా ఒక చిహ్నం ఉండవచ్చు.</translation>
 <translation id="4296575653627536209">పర్యవేక్షించబడే వినియోగదారును జోడించు</translation>
+<translation id="4297219207642690536">మళ్లీ ప్రారంభించి, రీసెట్ చేయండి</translation>
 <translation id="4297322094678649474">భాషలను మార్చు</translation>
 <translation id="4300305918532693141">ఈ సెట్టింగ్‌ను మార్చడానికి, <ph name="BEGIN_LINK" />సమకాలీకరణను రీసెట్ చేయండి<ph name="END_LINK" />.</translation>
 <translation id="4305227814872083840">దీర్ఘసమయం (2s)</translation>
@@ -2187,6 +2208,7 @@
 <translation id="4370975561335139969">మీరు నమోదు చేసిన ఇమెయిల్ మరియు పాస్‌వర్డ్ సరిపోలలేదు</translation>
 <translation id="437184764829821926">అధునాతన ఫాంట్ సెట్టింగ్‌లు</translation>
 <translation id="4372884569765913867">1x1</translation>
+<translation id="4374831787438678295">Linux ఇన్‌స్టాలర్</translation>
 <translation id="4375035964737468845">డౌన్‌లోడ్ చేసిన పైల్‌లను తెరవండి</translation>
 <translation id="4377363674125277448">సర్వర్ ప్రమాణపత్రంతో సమస్య ఏర్పడింది.</translation>
 <translation id="4378154925671717803">ఫోన్</translation>
@@ -2305,6 +2327,7 @@
 <translation id="4576541033847873020">బ్లూటూత్ పరికరాన్ని జత చేయండి</translation>
 <translation id="4579581181964204535"><ph name="HOST_NAME" />ని ప్రసారం చేయడం సాధ్యపడలేదు.</translation>
 <translation id="4580526846085481512">మీరు $1 ఐటమ్‌లను ఖచ్చితంగా తొలగించాలనుకుంటున్నారా?</translation>
+<translation id="4582497162516204941">Linux (బీటా)తో ఇన్‌స్టాల్ చేయండి</translation>
 <translation id="4582563038311694664">అన్ని సెట్టింగ్‌లను రీసెట్ చేయి</translation>
 <translation id="4585793705637313973">పేజీని సవరించండి</translation>
 <translation id="4589268276914962177">క్రొత్త టెర్మినల్</translation>
@@ -2526,7 +2549,6 @@
 <translation id="4917385247580444890">బలమైన</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> "<ph name="EXTENSION_NAME" />" పొడిగింపుతో కమ్యూనికేట్ చేయాలనుకుంటోంది</translation>
 <translation id="4918086044614829423">ఆమోదించు</translation>
-<translation id="4920350943031252905">మీ Chromebookలో Linux సాధనాలు, ఎడిటర్‌లు మరియు IDEలను అమలు చేస్తుంది.</translation>
 <translation id="4920887663447894854">ఈ పేజీలో మీ స్థానాన్ని ట్రాక్ చెయ్యకుండా ఈ క్రింది సైట్‌లు బ్లాక్ చెయ్యబడ్డాయి:</translation>
 <translation id="492299503953721473">Android అనువర్తనాలను తీసివేయి</translation>
 <translation id="4923279099980110923">అవును, నేను సహాయం అందించాలనుకుంటున్నాను</translation>
@@ -2548,6 +2570,7 @@
 <translation id="4953808748584563296">డిఫాల్ట్ నారింజ రంగు అవతార్</translation>
 <translation id="4955814292505481804">వార్షికం</translation>
 <translation id="4957949153200969297"><ph name="IDS_SHORT_PRODUCT_NAME" /> సమకాలీకరణకు సంబంధించిన ఫీచర్‌లను మాత్రమే ప్రారంభిస్తుంది</translation>
+<translation id="4959262764292427323">మీ Google ఖాతాలో పాస్‌వర్డ్‌లు సేవ్ చేయబడతాయి కాబట్టి మీరు వాటిని ఏ పరికరంలోనైనా ఉపయోగించవచ్చు</translation>
 <translation id="4960294539892203357"><ph name="WINDOW_TITLE" /> - <ph name="PROFILE_NAME" /></translation>
 <translation id="496226124210045887">మీరు ఎంచుకున్న ఫోల్డర్‌లో ముఖ్యమైన ఫైల్‌లు ఉన్నాయి. మీరు ఖచ్చితంగా ఈ ఫోల్డర్ కోసం "$1"కు శాశ్వతంగా చదవగల ప్రాప్యతను మంజూరు చేయాలనుకుంటున్నారా?</translation>
 <translation id="4964455510556214366">అమరిక</translation>
@@ -2727,6 +2750,7 @@
 <translation id="5240817131241497236">Chromeలో సమకాలీకరణ, వ్యక్తిగతీకరణ మరియు ఇతర Google సేవలను నియంత్రించే సెట్టింగ్‌లు మార్చబడ్డాయి. ఇది మీ ప్రస్తుత సెట్టింగ్‌లను ప్రభావితం చేయవచ్చు.</translation>
 <translation id="5241128660650683457">మీరు సందర్శించే వెబ్‌సైట్‌ల్లోని మీ మొత్తం డేటాను చదవండి</translation>
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />"ని ప్రారంభించాలా?</translation>
+<translation id="5243522832766285132">దయచేసి కొన్ని నిమిషాల్లో మళ్లీ ప్రయత్నించండి</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />కి సమకాలీకరిస్తోంది</translation>
 <translation id="5246282308050205996"><ph name="APP_NAME" /> క్రాష్ అయ్యింది. అనువర్తనం పునఃప్రారంభించడానికి ఈ బెలూన్‌ని క్లిక్ చెయ్యండి.</translation>
 <translation id="5247051749037287028">ప్రదర్శన పేరు (ఐచ్ఛికం)</translation>
@@ -2749,6 +2773,7 @@
 <translation id="5264148714798105376">ఇది ఇంచుమించు ఒక నిమిషంలో పూర్తి కావచ్చు.</translation>
 <translation id="5264252276333215551">దయచేసి మీ అనువర్తనాన్ని కియోస్క్ మోడ్‌లో లాంచ్ చేయడానికి ఇంటర్నెట్‌కు కనెక్ట్ చేయండి.</translation>
 <translation id="5265562206369321422">వారం పైగా ఆఫ్‌లైన్‌లో ఉంది</translation>
+<translation id="5265797726250773323">ఇన్‌స్టాల్ చేయడంలో ఎర్రర్</translation>
 <translation id="5266113311903163739">ప్రమాణపత్రం అధికారి దిగుమతి లోపం</translation>
 <translation id="5269977353971873915">ముద్రణ విఫలమైంది</translation>
 <translation id="5271549068863921519">పాస్‌వర్డ్‌ను సేవ్ చెయ్యి</translation>
@@ -2771,6 +2796,7 @@
 <translation id="529175790091471945">ఈ పరికరాన్ని ఫార్మాట్ చేయి</translation>
 <translation id="5292195676005197571">ఎక్కువ కీలను ఉపయోగించడానికి, బటన్‌ని నొక్కండి</translation>
 <translation id="5293170712604732402">సెట్టింగ్‌లను వాటి అసలు డిఫాల్ట్ విలువలకు పునరుద్ధరించండి</translation>
+<translation id="5297082477358294722">పాస్‌వర్డ్ సేవ్ చేయబడింది. మీ <ph name="SAVED_PASSWORDS_STORE" />లో సేవ్ చేసిన పాస్‌వర్డ్‌లను చూడండి మరియు నిర్వహించండి.</translation>
 <translation id="5298219193514155779">థీమ్ వీరిచే సృష్టించబడింది</translation>
 <translation id="5299109548848736476">ట్రాక్ చేయవద్దు</translation>
 <translation id="5299682071747318445">మీ సమకాలీకరణ రహస్య పదబంధంతో డేటా మొత్తం గుప్తీకరించబడింది</translation>
@@ -2998,6 +3024,7 @@
 <translation id="5612720917913232150"><ph name="URL" /> మీ కంప్యూటర్ స్థానాన్ని ఉపయోగించాలనుకుంటోంది</translation>
 <translation id="5612734644261457353">క్షమించండి, మీ పాస్‌వర్డ్ ఇప్పటికీ ధృవీకరించబడలేదు. గమనిక: మీరు మీ పాస్‌వర్డ్‌ను ఇటీవల మార్చి ఉంటే, మీరు సైన్ అవుట్ చేసిన తర్వాత మీ క్రొత్త పాస్‌వర్డ్ వర్తించబడుతుంది, దయచేసి ఇక్కడ పాత పాస్‌వర్డ్‌ను ఉపయోగించండి.</translation>
 <translation id="5614190747811328134">వినియోగదారు నోటీస్</translation>
+<translation id="5614553682702429503">పాస్‌వర్డ్‌ను సేవ్ చేయాలా?</translation>
 <translation id="561698261642843490">Firefoxని మూసివేయండి</translation>
 <translation id="5618075537869101857">అయ్యో, కియోస్క్ అనువర్తనాన్ని ప్రారంభించడం సాధ్యపడలేదు.</translation>
 <translation id="5618333180342767515">(దీనికి కొన్ని నిమిషాల సమయం పట్టవచ్చు)</translation>
@@ -3038,6 +3065,7 @@
 <translation id="5677503058916217575">పేజీ భాష:</translation>
 <translation id="5677928146339483299">బ్లాక్ చెయ్యబడింది</translation>
 <translation id="5678550637669481956"><ph name="VOLUME_NAME" />కి చదవడానికి మరియు వ్రాయడానికి ప్రాప్యత మంజూరు చేయబడింది.</translation>
+<translation id="5678784840044122290">Linux అప్లికేషన్ మీ టెర్మినల్‌లో అందుబాటులో ఉంటుంది మరియు మీ లాంచర్‌లో ఒక చిహ్నం కూడా చూపవచ్చు.</translation>
 <translation id="5678955352098267522"><ph name="WEBSITE_1" />లోని మీ డేటాను చదవండి</translation>
 <translation id="5684661240348539843">అసెట్ ఐడెంటిఫైయర్</translation>
 <translation id="5686799162999241776"><ph name="BEGIN_BOLD" />ఆర్కైవ్ లేదా వర్చువల్ డిస్క్ నుండి డిస్‌కనెక్ట్ చేయడం సాధ్యం కాదు<ph name="END_BOLD" />
@@ -3133,6 +3161,7 @@
 <translation id="5832805196449965646">వ్యక్తిని జోడించు</translation>
 <translation id="583281660410589416">తెలియని</translation>
 <translation id="5832976493438355584">లాక్ చేయబడింది</translation>
+<translation id="5833397272224757657">మీరు సందర్శించే సైట్‌లలోని కంటెంట్‌ను, దీనితో పాటు బ్రౌజర్ కార్యకలాపం అలాగే పరస్పర చర్యలను మీ అభిరుచికి తగిన విధంగా సెట్ చేయడంలో ఉపయోగిస్తుంది</translation>
 <translation id="5833610766403489739">ఈ ఫైల్ ఉన్న స్థలం తెలియదు. దయచేసి మీ డౌన్‌లోడ్ స్థానం సెట్టింగ్‌ను తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5833726373896279253">ఈ సెట్టింగ్‌లు మీ యజమాని ద్వారా మాత్రమే సవరించబడతాయి:</translation>
 <translation id="5834581999798853053">సుమారు <ph name="TIME" /> నిమిషాలు మిగిలి ఉన్నాయి</translation>
@@ -3186,6 +3215,7 @@
 <translation id="5908769186679515905">Flashని అమలు చేయనీయకుండా సైట్‌లను బ్లాక్ చేయి</translation>
 <translation id="5910363049092958439">చిత్రాన్ని ఇలా సే&amp;వ్ చెయ్యి...</translation>
 <translation id="5911737117543891828">తాత్కాలిక Google డిస్క్ ఆఫ్‌లైన్ ఫైల్‌లు తొలగించబడతాయి. మీరు ఆఫ్‌లైన్‌లో అందుబాటులో ఉంచేట్లుగా సెట్ చేసిన ఫైల్‌లు ఈ పరికరం నుండి తొలగించబడవు.</translation>
+<translation id="5911887972742538906">మీ Linux అప్లికేషన్ యొక్క ఇన్‌స్టాలేషన్ సమయంలో ఎర్రర్ సంభవించింది.</translation>
 <translation id="5912378097832178659">శోధన ఇంజిన్‌లను &amp;సవరించు...</translation>
 <translation id="5914724413750400082">మధ్యగుణకము (<ph name="MODULUS_NUM_BITS" /> బిట్‌లు):
   <ph name="MODULUS_HEX_DUMP" />
@@ -3372,6 +3402,7 @@
 <translation id="6198102561359457428">సైన్ అవుట్ చేసి, మళ్లీ సైన్ ఇన్ చేయండి...</translation>
 <translation id="6198252989419008588">పిన్ మార్పు</translation>
 <translation id="6199801702437275229">ఖాళీ సమాచారం కోసం వేచి ఉంది...</translation>
+<translation id="6201792273624501289">Linux యాప్‌లు</translation>
 <translation id="6204015976622790023">మీ స్క్రీన్‌లో ఉన్న వాటికి సంబంధించి మీ అసిస్టెంట్ నుండి సంబంధిత సూచనలను చూడండి.</translation>
 <translation id="6205710420833115353">కొన్ని చర్యలకి అనుకున్నదాని కంటే ఎక్కువ సమయం పడుతోంది. మీరు వాటిని రద్దు చేయాలనుకుంటున్నారా?</translation>
 <translation id="6206311232642889873">చిత్రాన్ని కా&amp;పీ చెయ్యి</translation>
@@ -3847,6 +3878,7 @@
 <translation id="6945221475159498467">ఎంచుకోండి</translation>
 <translation id="694592694773692225">మళ్ళింపు ఈ పేజీలో బ్లాక్ చేయబడింది.</translation>
 <translation id="6949306908218145636">తెరిచిన పేజీలను బుక్‌మార్క్ చేయి...</translation>
+<translation id="6950627417367801484">యాప్‌లను పునరుద్ధరించండి</translation>
 <translation id="6951153907720526401">చెల్లింపు హ్యాండ్లర్‌లు</translation>
 <translation id="6955446738988643816">పాప్‌అప్‌ను పరిశీలించు</translation>
 <translation id="6957231940976260713">సేవ పేరు</translation>
@@ -3972,6 +4004,7 @@
 <translation id="7127980134843952133">డౌన్‌లోడ్ చరిత్ర</translation>
 <translation id="7131040479572660648"><ph name="WEBSITE_1" />, <ph name="WEBSITE_2" /> మరియు <ph name="WEBSITE_3" />లోని మీ డేటాను చదవండి</translation>
 <translation id="713122686776214250">పే&amp;జీని జోడించండి...</translation>
+<translation id="7133578150266914903">మీ నిర్వాహకుడు మీ పరికరాన్ని మళ్లీ ప్రారంభిస్తున్నారు (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="7134098520442464001">టెక్స్ట్‌ని చిన్నదిగా చెయ్యండి</translation>
 <translation id="7136694880210472378">డిఫాల్ట్‌గా చెయ్యి</translation>
 <translation id="7136984461011502314"><ph name="PRODUCT_NAME" />కు స్వాగతం</translation>
@@ -4000,6 +4033,7 @@
 <translation id="7175353351958621980">దీని నుండి లోడ్ అయ్యింది:</translation>
 <translation id="7180611975245234373">రీఫ్రెష్ చేయి</translation>
 <translation id="7180865173735832675">అనుకూలీకరించు</translation>
+<translation id="7182359331070524176">ఏదైనా ఒక Google ఫోటోలు ఆల్బమ్‌ను ఎంచుకోండి</translation>
 <translation id="7186088072322679094">సాధనపట్టీలో ఉంచండి</translation>
 <translation id="7187428571767585875">తీసివేయాల్సిన లేదా మార్చాల్సిన రిజిస్ట్రీ నమోదులు:</translation>
 <translation id="7189234443051076392">మీ పరికరంలో తగినంత స్థలం ఉన్నట్లు నిర్ధారించుకోండి</translation>
@@ -4171,6 +4205,7 @@
 <translation id="7463006580194749499">వ్యక్తిని జోడించు</translation>
 <translation id="7464490149090366184">జిప్ చేయడంలో విఫలమైంది, ఈ అంశం ఉనికిలో ఉంది: "$1"</translation>
 <translation id="7465778193084373987">Netscape సర్టిఫికెట్ రద్దు URL</translation>
+<translation id="7469406957790636836">దీన్ని ఆన్ చేయడానికి, మొదట <ph name="BEGIN_LINK" />భాషలు మరియు ఇన్‌పుట్<ph name="END_LINK" />లో స్పెల్ చెక్‌ను ఆన్ చేయండి</translation>
 <translation id="7469894403370665791">స్వయంచాలకంగా ఈ నెట్‌వర్క్‌కి కనెక్ట్ చెయ్యి</translation>
 <translation id="747114903913869239">లోపం: పొడిగింపులను డీకోడ్ చేయడం సాధ్యం కాదు</translation>
 <translation id="7473753388963818366">మీ <ph name="DEVICE_TYPE" />ని మీ కోసం సిద్ధంగా ఉండేలా సెటప్ చేద్దాం రండి</translation>
@@ -4268,6 +4303,7 @@
 <translation id="7606992457248886637">అధికారాలు</translation>
 <translation id="7607002721634913082">పాజ్ చెయ్యబడింది</translation>
 <translation id="7607274158153386860">టాబ్లెట్ సైట్‌ను అభ్యర్థించు</translation>
+<translation id="7609148976235050828">దయచేసి ఇంటర్నెట్‌కి కనెక్ట్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="7611008212562900400">మీ పరికరం, యాప్‌లు, వెబ్‌ను వెతకండి...</translation>
 <translation id="7616214729753637086">పరికరాన్ని నమోదు చేస్తోంది...</translation>
 <translation id="7617366389578322136">"<ph name="DEVICE_NAME" />"కు కనెక్ట్ చేస్తోంది</translation>
@@ -4336,6 +4372,7 @@
 <translation id="7730449930968088409">మీ స్క్రీన్ కంటెంట్‌ని క్యాప్చర్ చేయండి</translation>
 <translation id="7730494089396812859">Cloud బ్యాకప్ వివరాలను చూపు</translation>
 <translation id="7732111077498238432">విధానం ద్వారా నెట్‌వర్క్ నియంత్రించబడుతుంది</translation>
+<translation id="7737238973539693982">Linux (బీటా)ని తొలగించండి</translation>
 <translation id="773905249182896430">ప్రమాదకరమైన సైట్‌ల నుండి మిమ్మల్ని మరియు మీ పరికరాన్ని రక్షిస్తుంది</translation>
 <translation id="7740996059027112821">ప్రామాణికం</translation>
 <translation id="7748528009589593815">మునుపటి ట్యాబ్</translation>
@@ -4523,6 +4560,7 @@
 <translation id="7974936243149753750">ఓవర్‌స్కాన్ సర్దుబాటు</translation>
 <translation id="7977551819349545646">Chromeboxని నవీకరిస్తోంది...</translation>
 <translation id="7978412674231730200">వ్యక్తిగత కీ</translation>
+<translation id="7978450511781612192">ఇది మిమ్మల్ని మీ Google ఖాతాల నుండి సైన్ అవుట్ చేస్తుంది. మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు మరిన్ని ఇకపై సమకాలీకరించబడవు.</translation>
 <translation id="7979036127916589816">సమకాలీకరణ లోపం</translation>
 <translation id="7980084013673500153">అసెట్ ID: <ph name="ASSET_ID" /></translation>
 <translation id="7981313251711023384">వేగవంతమైన బ్రౌజింగ్ మరియు శోధన కోసం పేజీలను ముందస్తుగా లోడ్ చేస్తుంది</translation>
@@ -4685,6 +4723,7 @@
 <translation id="8226619461731305576">క్రమ వరుస</translation>
 <translation id="8226742006292257240">క్రింద యాదృచ్ఛికంగా సృష్టించబడిన TPM పాస్‌వర్డ్‌లు మీ కంప్యూటర్‌కు సూచించబడ్డాయి:</translation>
 <translation id="8227119283605456246">ఫైల్‌ను జోడించు</translation>
+<translation id="8230134520748321204"><ph name="ORIGIN" /> కోసం పాస్‌వర్డ్‌ని సేవ్ చేయాలా?</translation>
 <translation id="8234795456569844941">దయచేసి ఈ సమస్యను పరిష్కరించడంలో మా ఇంజినీర్‌లకు సహాయపడండి. మీకు ప్రొఫైల్ లోప సందేశం ఎదురుకావడం కంటే ముందు ఏమి జరిగిందో మాకు తెలియజేయండి:</translation>
 <translation id="8234989666557591529">మీ <ph name="DEVICE_TYPE" />ని అన్‌లాక్ చేయడానికి ఫోన్‌ని ఎంచుకోండి</translation>
 <translation id="8239020549147958415"><ph name="FULL_NAME" /> వలె సమకాలీకరించండి</translation>
@@ -4804,6 +4843,7 @@
 <translation id="8438328416656800239">స్మార్ట్ బ్రౌజర్‌కు మారండి</translation>
 <translation id="8438566539970814960">శోధనలు మరియు బ్రౌజింగ్‌ను మెరుగుపరచండి</translation>
 <translation id="8439506636278576865">ఈ భాషలో పేజీలకు అనువాదం అందించు</translation>
+<translation id="8440630305826533614">Linux యాప్‌లు</translation>
 <translation id="8446884382197647889">మరింత తెలుసుకోండి</translation>
 <translation id="8447409163267621480">Ctrl లేదా Altను చేర్చండి</translation>
 <translation id="8448729345478502352">మీ స్క్రీన్‌లోని అంశాలను చిన్నవిగా లేదా పెద్దవిగా చేయండి</translation>
@@ -4848,6 +4888,7 @@
 <translation id="8497219075884839166">Windows వినియోగాలు</translation>
 <translation id="8498214519255567734">కాంతి తక్కువగా ఉన్నప్పుడు మీ స్క్రీన్‌ని చూడటం లేదా చదవడాన్ని సులభతరం చేస్తుంది</translation>
 <translation id="8498395510292172881">Chromeలో చదవడం కొనసాగించండి</translation>
+<translation id="8502536196501630039">Google Play నుండి యాప్‌లను ఉపయోగించడానికి, మీరు మొదట మీ యాప్‌లను పునరుద్ధరించాలి. కొంత డేటాను కోల్పోయే అవకాశం ఉంది.</translation>
 <translation id="8503813439785031346">యూజర్‌పేరు</translation>
 <translation id="850875081535031620">హానికరమైన సాఫ్ట్‌వేర్ కనుగొనబడలేదు</translation>
 <translation id="8509646642152301857">అక్షరక్రమ తనిఖీ నిఘంటువును డౌన్‌లోడ్ చేయడం విఫలమైంది.</translation>
@@ -4976,6 +5017,7 @@
 <translation id="8698464937041809063">Google డ్రాయింగ్</translation>
 <translation id="869884720829132584">అనువర్తనాల మెను</translation>
 <translation id="869891660844655955">గడువు తేదీ</translation>
+<translation id="8699566574894671540">దీన్ని ఆన్ చేయడానికి, మొదట సవరణ మెనూలో టైప్ చేస్తున్నప్పుడు స్పెల్లింగ్‌ను తనిఖీ చేయిని ఎంచుకోండి</translation>
 <translation id="870073306461175568">నెట్‌వర్క్ ఫైల్ షేర్‌లు</translation>
 <translation id="8701677791353449257">పరికరం పేరు రెగ్యులర్ ఎక్స్‌ప్రెషన్‌ <ph name="REGEX" />కు సరిపోలాలి.</translation>
 <translation id="8704521619148782536">ఇందుకు సాధారణంగా పట్టే సమయం కంటే ఎక్కువసేపు పడుతోంది. మీరు నిరీక్షించవచ్చు లేదా రద్దు చేసి, తర్వాత మళ్లీ ప్రయత్నించవచ్చు.</translation>
@@ -5015,6 +5057,7 @@
 
           &lt;p&gt;కానీ మీరు ఇప్పటికీ ఆదేశ పంక్తి ద్వారా కాన్ఫిగర్ చేయవచ్చు. దయచేసి ఫ్లాగ్‌లు మరియు పరిసర చరరాశులకు సంబంధించిన మరింత సమాచారం కోసం &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt;ని సందర్శించండి.&lt;/p&gt;</translation>
 <translation id="8755376271068075440">&amp;పెద్దగా</translation>
+<translation id="8756969031206844760">పాస్‌వర్డ్‌ను అప్‌డేట్ చేయాలా?</translation>
 <translation id="8757090071857742562">డెస్క్‌టాప్‌ను ప్రసారం చేయడం సాధ్యపడలేదు.  మీ స్క్రీన్‌ను భాగస్వామ్యం చేయడం ప్రారంభించడానికి మీరు ప్రాంప్ట్‌ని నిర్ధారించారో లేదో సరిచూసుకోవడానికి తనిఖీ చేయండి.</translation>
 <translation id="8757640015637159332">పబ్లిక్ సెషన్‌లోకి ప్రవేశించండి</translation>
 <translation id="8757742102600829832">కనెక్ట్ చేయడానికి Chromeboxని ఎంచుకోండి</translation>
@@ -5170,7 +5213,9 @@
 <translation id="9009369504041480176">అప్‌లోడ్ అవుతోంది (<ph name="PROGRESS_PERCENT" />%)...</translation>
 <translation id="9011163749350026987">ఎల్లప్పుడూ చిహ్నాన్ని చూపు</translation>
 <translation id="9011178328451474963">చివరి ట్యాబ్</translation>
+<translation id="9013707997379828817">మీ నిర్వాహకుడు ఈ పరికరాన్ని తిరిగి ప్రారంభించారు. దయచేసి ముఖ్యమైన ఫైల్‌లను సేవ్ చేసి, ఆపై మళ్లీ ప్రారంభించండి. పరికరంలో ఉన్న మొత్తం డేటా తొలగించబడుతుంది.</translation>
 <translation id="9014987600015527693">మరొక ఫోన్‌ను చూపు</translation>
+<translation id="9018218886431812662">ఇన్‌స్టాలేషన్ పూర్తయింది</translation>
 <translation id="901834265349196618">ఇమెయిల్</translation>
 <translation id="9019062154811256702">స్వీయ పూరింపు సెట్టింగ్‌లను చదవడానికి మరియు మార్చడానికి అనుమతి</translation>
 <translation id="9020362265352758658">4x</translation>
@@ -5194,6 +5239,7 @@
 <translation id="9038649477754266430">పేజీలను మరింత శీఘ్రంగా లోడ్ చేయడానికి సూచన సేవను ఉపయోగించండి</translation>
 <translation id="9039663905644212491">PEAP</translation>
 <translation id="9039890312082871605">ట్యాబ్‌లను మ్యూట్ చేయండి</translation>
+<translation id="9040661932550800571"><ph name="ORIGIN" /> కోసం పాస్‌వర్డ్‌ను అప్‌డేట్ చేయాలా?</translation>
 <translation id="9041692268811217999">మీ యంత్రంలో స్థానిక ఫైల్‌లకు యాక్సెస్‌ని మీ నిర్వాహకులు నిలిపివేసారు</translation>
 <translation id="9042893549633094279">గోప్యత మరియు భద్రత</translation>
 <translation id="904451693890288097">దయచేసి "<ph name="DEVICE_NAME" />" కోసం రహస్య కీని నమోదు చేయండి:</translation>
@@ -5298,6 +5344,7 @@
 <translation id="9203478404496196495">ట్యాబ్‌ను అన్‌మ్యూట్ చేయి</translation>
 <translation id="9203904171912129171">ఒక పరికరాన్ని ఎంచుకోండి</translation>
 <translation id="9203962528777363226">ఈ పరికరం యొక్క నిర్వాహకుడు క్రొత్త వినియోగదారులను జోడించడం నిలిపివేసారు</translation>
+<translation id="9213073329713032541">ఇన్‌స్టాలేషన్ విజయవంతంగా ప్రారంభించబడింది.</translation>
 <translation id="9214520840402538427">అయ్యో!  ఇన్‌స్టాలేషన్-సమయ లక్షణాల ప్రారంభ సమయం ముగిసింది.  దయచేసి మీ మద్దతు ప్రతినిధిని సంప్రదించండి.</translation>
 <translation id="9214695392875603905">కప్ కేక్</translation>
 <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" జోడించబడింది</translation>
@@ -5352,6 +5399,7 @@
 <translation id="988978206646512040">రహస్య పదబంధం ఖాళీగా ఉంటే అనుమతించబడదు</translation>
 <translation id="992032470292211616">పొడిగింపులు, అనువర్తనాలు మరియు థీమ్‌లు మీ పరికరానికి హాని కలిగించవచ్చు. మీరు ఖచ్చితంగా కొనసాగాలనుకుంటున్నారా?</translation>
 <translation id="992592832486024913">ChromeVox (చదవబడే అభిప్రాయం)ని నిలిపివేయి</translation>
+<translation id="993540765962421562">ఇన్‌స్టాలేషన్ ప్రోగ్రెస్‌లో ఉంది</translation>
 <translation id="994289308992179865">&amp;లూప్</translation>
 <translation id="996250603853062861">సురక్షిత కనెక్షన్‌ను ప్రారంభిస్తోంది...</translation>
 <translation id="998747458861718449">ప&amp;ర్యవేక్షించు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index b05d863..52e77f7 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">แสดงตัวสะกดและไวยากรณ์</translation>
 <translation id="1593594475886691512">กำลังจัดรูปแบบ...</translation>
 <translation id="159359590073980872">แคชของภาพ</translation>
+<translation id="1593926297800505364">บันทึกวิธีการชำระเงิน</translation>
 <translation id="1598233202702788831">ผู้ดูแลระบบปิดใช้การอัปเดต</translation>
 <translation id="1600857548979126453">เข้าถึงแบ็คเอนด์เครื่องซ่อมแซมหน้าเว็บ</translation>
 <translation id="1601560923496285236">นำไปใช้</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">นำอุปกรณ์เข้าร่วมโดเมนไม่ได้ ตรวจสอบว่าคุณไม่ได้เพิ่มอุปกรณ์เกินจำนวนจำกัด</translation>
 <translation id="1744108098763830590">หน้าพื้นหลัง</translation>
 <translation id="1745520510852184940">แปลทุกครั้ง</translation>
+<translation id="1746417874336251387">เสนอฟีเจอร์ใหม่ที่ใช้การเชื่อมต่อโทรศัพท์กับ Chromebook</translation>
 <translation id="174937106936716857">จำนวนไฟล์ทั้งหมด</translation>
 <translation id="175196451752279553">เ&amp;ปิดแท็บที่ถูกปิดขึ้นใหม่</translation>
 <translation id="1753905327828125965">เข้าชมบ่อยสุด</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">หลังจาก</translation>
 <translation id="1933809209549026293">โปรดเชื่อมต่อเมาส์หรือแป้นพิมพ์ หากคุณใช้อุปกรณ์บลูทูธ โปรดตรวจสอบว่าอุปกรณ์พร้อมที่จะจับคู่</translation>
 <translation id="1936157145127842922">แสดงในโฟลเดอร์</translation>
+<translation id="1938351510777341717">แป้น Command ภายนอก</translation>
 <translation id="1940546824932169984">อุปกรณ์ที่เชื่อมต่อ</translation>
 <translation id="1942765061641586207">ความละเอียดของรูปภาพ</translation>
+<translation id="1943097386230153518">ติดตั้งบริการใหม่</translation>
 <translation id="1944921356641260203">พบการอัปเดต</translation>
 <translation id="1951615167417147110">เลื่อนขึ้นหนึ่งหน้า</translation>
 <translation id="1954813140452229842">เกิดข้อผิดพลาดขณะต่อเชื่อมพื้นที่แชร์ โปรดตรวจสอบข้อมูลรับรองแล้วลองอีกครั้ง</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">ส่ง</translation>
 <translation id="265390580714150011">ค่าฟิลด์ </translation>
 <translation id="2654166010170466751">อนุญาตให้เว็บไซต์ติดตั้งเครื่องจัดการการชำระเงิน</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />ฟีเจอร์แตกต่างกันไปตามอุปกรณ์</translation>
 <translation id="2660779039299703961">กิจกรรม</translation>
 <translation id="266079277508604648">เชื่อมต่อเครื่องพิมพ์ไม่ได้ โปรดตรวจสอบว่าเครื่องพิมพ์เปิดอยู่และเชื่อมต่อกับ Chromebook ผ่าน Wi-Fi หรือ USB</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">ป้อน PIN</translation>
 <translation id="2805646850212350655">ระบบไฟล์การเข้ารหัสของ Microsoft</translation>
 <translation id="2805756323405976993">แอป</translation>
+<translation id="2806891468525657116">มีทางลัดนี้อยู่แล้ว</translation>
 <translation id="2807517655263062534">ไฟล์ที่คุณดาวน์โหลดจะปรากฏที่นี่</translation>
 <translation id="2809586584051668049">และอีก <ph name="NUMBER_ADDITIONAL_DISABLED" /> รายการ</translation>
 <translation id="281133045296806353">สร้างหน้าต่างใหม่ในเซสชันของเบราว์เซอร์ปัจจุบัน</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">คุณลงชื่อเข้าใช้แล้ว</translation>
 <translation id="3429275422858276529">บุ๊กมาร์กหน้านี้เพื่อให้หาเจอง่ายในภายหลัง</translation>
 <translation id="3429599832623003132">$1 รายการ</translation>
+<translation id="3430342160185525240">ให้ Assistant แสดงการแจ้งเตือน</translation>
 <translation id="3432227430032737297">นำรายการที่แสดงทั้งหมดออก</translation>
 <translation id="3432757130254800023">ส่งภาพและเสียงไปยังจอแสดงผลบนเครือข่ายเฉพาะที่</translation>
 <translation id="3432762828853624962">คนทำงานที่แชร์</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> ในแผงควบคุม
 
   คุณต้องการเริ่มต้น <ph name="CONTROL_PANEL_APPLET_NAME" /> ไหม</translation>
+<translation id="394183848452296464">สร้างทางลัดไม่ได้</translation>
 <translation id="3943582379552582368">&amp;กลับ</translation>
 <translation id="3943857333388298514">วาง</translation>
 <translation id="3948116654032448504">ค้นหา&amp;รูปภาพด้วย <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">อุปกรณ์ที่ไม่ได้จับคู่</translation>
 <translation id="4482194545587547824">Google อาจใช้ประวัติการท่องเว็บของคุณเพื่อปรับเปลี่ยน Search และบริการอื่นๆ ของ Google ในแบบของคุณ</translation>
 <translation id="4495419450179050807">ไม่แสดงในหน้านี้อีก</translation>
+<translation id="4499718683476608392">เปิดใช้การป้อนข้อมูลบัตรเครดิตอัตโนมัติเพื่อกรอกฟอร์มด้วยการคลิกเพียงครั้งเดียว</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> ขัดข้อง</translation>
 <translation id="450099669180426158">ไอคอนเครื่องหมายอัศเจรีย์</translation>
 <translation id="4501530680793980440">ยืนยันการนำออก</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">แรง</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> ต้องการสื่อสารกับส่วนขยาย "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">ยอมรับ</translation>
-<translation id="4920350943031252905">เรียกใช้เครื่องมือ ตัวแก้ไข และ IDE ของ Linux ใน Chromebook</translation>
 <translation id="4920887663447894854">ไซต์ต่อไปนี้ถูกปิดกั้นไม่ให้ติดตามตำแหน่งของคุณบนหน้าเว็บนี้</translation>
 <translation id="492299503953721473">นำแอป Android ออก</translation>
 <translation id="4923279099980110923">ใช่ ฉันต้องการช่วย</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">ข้อมูลสำรองในระบบคลาวด์ของ Chrome OS</translation>
 <translation id="5756163054456765343">ศู&amp;นย์ช่วยเหลือ</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> สามารถอ่านเอกสารที่คุณส่งไปพิมพ์ผ่าน <ph name="APP_NAME" /> ได้</translation>
+<translation id="5762172915276660232">การตั้งค่าบัตรเครดิต</translation>
 <translation id="5763751966069581670">ไม่พบอุปกรณ์ USB</translation>
 <translation id="5764483294734785780">บั&amp;นทึกวิดีโอเป็น...</translation>
 <translation id="57646104491463491">วันที่แก้ไข</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">อ๊ะ เกิดข้อผิดพลาดกับโมดูลความปลอดภัย</translation>
 <translation id="5856721540245522153">เปิดใช้ฟีเจอร์การแก้ไขข้อบกพร่อง</translation>
 <translation id="5857090052475505287">โฟลเดอร์ใหม่</translation>
+<translation id="585979798156957858">แป้นเมตาภายนอก</translation>
 <translation id="5860033963881614850">ปิด</translation>
 <translation id="5860209693144823476">แท็บ 3</translation>
 <translation id="5860491529813859533">เปิด</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">การค้นหาเว็บพร็อกซีอัตโนมัติ</translation>
 <translation id="6333064448949140209">ระบบจะส่งไฟล์ไปยัง Google เพื่อแก้ไขข้อบกพร่อง</translation>
 <translation id="6333834492048057036">เน้นแถบที่อยู่เว็บสำหรับการค้นหา</translation>
+<translation id="6336451774241870485">แท็บส่วนตัวใหม่</translation>
 <translation id="6339668969738228384">สร้างโปรไฟล์ใหม่สำหรับ <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">เชื่อมต่อกับเซิร์ฟเวอร์ไม่ได้ โปรดตรวจสอบการเชื่อมต่อและลองอีกครั้ง หากยังพบปัญหาอยู่ ให้รีสตาร์ท Chromebook</translation>
 <translation id="6340071272923955280">โปรโตคอลการพิมพ์ผ่านอินเทอร์เน็ต (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">แท็บ 8</translation>
 <translation id="6607272825297743757">ข้อมูลไฟล์</translation>
 <translation id="6607831829715835317">เ&amp;ครื่องมือเพิ่มเติม</translation>
+<translation id="6610147964972079463">ปิดแท็บส่วนตัว</translation>
 <translation id="6612358246767739896">เนื้อหาที่ได้รับความคุ้มครอง</translation>
 <translation id="6613452264606394692">บุ๊กมาร์กหน้านี้ไว้เพื่อให้กลับมาได้อย่างรวดเร็ว</translation>
 <translation id="6614893213975402384">ติดตั้งการอัปเดตและแอป การดำเนินการต่อเป็นการยอมรับว่าอุปกรณ์นี้อาจใช้อินเทอร์เน็ตมือถือดาวน์โหลดและติดตั้งการอัปเดตและแอปจาก Google ผู้ให้บริการ และผู้ผลิตอุปกรณ์โดยอัตโนมัติ แอปบางแอปอาจมีการซื้อในแอป คุณนำแอปเหล่านี้ออกได้ทุกเมื่อ <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">ก่อนหน้า</translation>
 <translation id="6718273304615422081">กำลังซิป...</translation>
 <translation id="671928215901716392">ล็อกหน้าจอ</translation>
+<translation id="6720847671508630642">นำฟีเจอร์ดีๆ ของ Android ไปใช้ใน Chromebook โดยอัตโนมัติ เชื่อมต่อโทรศัพท์เพื่อให้ส่งข้อความจากคอมพิวเตอร์ แชร์การเชื่อมต่ออินเทอร์เน็ตผ่านโทรศัพท์ และปลดล็อกหน้าจอ Chromebook ได้<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">ดูยี่ห้อและรุ่นของคีย์ความปลอดภัย</translation>
 <translation id="6721972322305477112">&amp;ไฟล์</translation>
 <translation id="672213144943476270">โปรดปลดล็อกโปรไฟล์ของคุณก่อนท่องเว็บในฐานะผู้เยี่ยมชม</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">พิมพ์หน้าเว็บที่ระบุ</translation>
 <translation id="6972180789171089114">เสียง/วิดีโอ</translation>
 <translation id="6973630695168034713">โฟลเดอร์</translation>
+<translation id="6974609594866392343">โหมดสาธิตแบบออฟไลน์</translation>
 <translation id="6976108581241006975">คอนโซล JavaScript</translation>
 <translation id="6977381486153291903">การแก้ไขเฟิร์มแวร์</translation>
 <translation id="6978121630131642226">เครื่องมือค้นหา</translation>
@@ -4034,6 +4048,7 @@
 <translation id="7175353351958621980">โหลดจาก:</translation>
 <translation id="7180611975245234373">รีเฟรช</translation>
 <translation id="7180865173735832675">กำหนดค่า</translation>
+<translation id="7182359331070524176">เลือกอัลบั้ม Google Photos</translation>
 <translation id="7186088072322679094">เก็บในแถบเครื่องมือ</translation>
 <translation id="7187428571767585875">รายการรีจิสทรีที่จะนำออกหรือเปลี่ยนแปลง:</translation>
 <translation id="7189234443051076392">ตรวจสอบว่าอุปกรณ์มีพื้นที่ว่างเพียงพอ</translation>
@@ -4485,6 +4500,7 @@
 <translation id="7857949311770343000">นี่คือหน้าแท็บใหม่ที่คุณคาดไว้ใช่ไหม</translation>
 <translation id="786073089922909430">บริการ: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;ดาวน์โหลด</translation>
+<translation id="7864662577698025113">เพิ่มบริการใหม่</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{คุกกี้ 1 รายการ}other{คุกกี้ # รายการ}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - จับคู่แล้ว</translation>
 <translation id="7870730066603611552">ตรวจสอบตัวเลือกการซิงค์หลังการตั้งค่า</translation>
@@ -4999,6 +5015,7 @@
 <translation id="8666584013686199826">ถามเมื่อเว็บไซต์ต้องการเข้าถึงอุปกรณ์ USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> แสดงแบบเต็มหน้าจออยู่และได้ปิดใช้งานเคอร์เซอร์เมาส์แล้ว</translation>
 <translation id="8669284339312441707">อบอุ่น</translation>
+<translation id="8669919703154928649">อนุญาตให้ Assistant แสดงการแจ้งเตือน</translation>
 <translation id="8669949407341943408">กำลังย้าย...</translation>
 <translation id="8671210955687109937">สามารถแสดงความคิดเห็นได้</translation>
 <translation id="8673026256276578048">ค้นหาเว็บ...</translation>
@@ -5386,6 +5403,7 @@
 <translation id="964286338916298286">ผู้ดูแลระบบไอทีได้ปิดการใช้สินค้าจาก Chrome ในอุปกรณ์ของคุณ</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{แอปพลิเคชัน}other{แอปพลิเคชัน}}</translation>
 <translation id="967007123645306417">การดำเนินการนี้จะนำคุณออกจากระบบบัญชี Google การเปลี่ยนแปลงในบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google อีกต่อไป แต่ข้อมูลที่มีอยู่จะยังจัดเก็บไว้ในบัญชี Google และจัดการได้ใน <ph name="BEGIN_LINK" />Google แดชบอร์ด<ph name="END_LINK" /></translation>
+<translation id="967624055006145463">ข้อมูลที่จัดเก็บ</translation>
 <translation id="968000525894980488">เปิดบริการ Google Play</translation>
 <translation id="968174221497644223">แคชของแอปพลิเคชัน</translation>
 <translation id="969096075394517431">เปลี่ยนภาษา</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 21dca4d5..deb708a 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Yazım ve Dilbilgisi'ni Göster</translation>
 <translation id="1593594475886691512">Biçimlendiriliyor...</translation>
 <translation id="159359590073980872">Resim Önbelleği</translation>
+<translation id="1593926297800505364">Ödeme yöntemini kaydet</translation>
 <translation id="1598233202702788831">Güncellemeler yöneticiniz tarafından devre dışı bırakıldı.</translation>
 <translation id="1600857548979126453">Sayfa hata ayıklayıcı arka ucuna erişme</translation>
 <translation id="1601560923496285236">Uygula</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Cihaz alan adına eklenemiyor. Ekleyebileceğiniz cihaz sayısını aşmadığınızdan emin olun.</translation>
 <translation id="1744108098763830590">arka plan sayfası</translation>
 <translation id="1745520510852184940">Bunu Her Zaman Yap</translation>
+<translation id="1746417874336251387">Telefonunuzun Chromebook'unuz ile bağlantısını kullanan yeni özellikler sunar</translation>
 <translation id="174937106936716857">Toplam dosya sayısı</translation>
 <translation id="175196451752279553">&amp;Kapatılan sekmeyi yeniden aç</translation>
 <translation id="1753905327828125965">En Çok Ziyaret Edilenler</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Şundan Önce Değil:</translation>
 <translation id="1933809209549026293">Bir fare veya klavye bağlayın. Bluetooth cihaz kullanıyorsanız cihazın eşleştirmeye hazır olduğundan emin olun.</translation>
 <translation id="1936157145127842922">Klasörde Göster</translation>
+<translation id="1938351510777341717">Harici Komut</translation>
 <translation id="1940546824932169984">Bağlı cihazlar</translation>
 <translation id="1942765061641586207">Resim çözünürlüğü</translation>
+<translation id="1943097386230153518">Yeni hizmet ekle</translation>
 <translation id="1944921356641260203">Güncelleme bulundu</translation>
 <translation id="1951615167417147110">Bir sayfa yukarı kaydır</translation>
 <translation id="1954813140452229842">Paylaşım eklenirken hata oluştu. Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Gönder</translation>
 <translation id="265390580714150011">Alan Değeri</translation>
 <translation id="2654166010170466751">Sitelerin ödeme işleyici yüklemesine izin ver</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Özellikler cihaza göre değişiklik gösterir</translation>
 <translation id="2660779039299703961">Etkinlik</translation>
 <translation id="266079277508604648">Yazıcıya bağlanılamıyor. Yazıcının açık olduğundan ve kablosuz ağ üzerinden veya USB kablosuyla Chromebook'unuza bağlı olduğundan emin olun.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">PIN girin</translation>
 <translation id="2805646850212350655">Microsoft Şifreleme Dosya Sistemi</translation>
 <translation id="2805756323405976993">Uygulamalar</translation>
+<translation id="2806891468525657116">Kısayol zaten mevcut</translation>
 <translation id="2807517655263062534">İndirdiğiniz dosyalar burada görünür</translation>
 <translation id="2809586584051668049">ve diğer <ph name="NUMBER_ADDITIONAL_DISABLED" /> öğe</translation>
 <translation id="281133045296806353">Mevcut tarayıcı oturumunda yeni pencere oluşturuldu.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Oturum açtınız!</translation>
 <translation id="3429275422858276529">Bu sayfayı daha sonra kolayca bulmak için sayfaya yer işareti koyun</translation>
 <translation id="3429599832623003132">$1 öğe</translation>
+<translation id="3430342160185525240">Asistan'ın bildirimleri göstermesini sağlar.</translation>
 <translation id="3432227430032737297">Tüm Gösterilenleri Kaldır</translation>
 <translation id="3432757130254800023">Yerel ağdaki ekranlara ses ve video gönderme</translation>
 <translation id="3432762828853624962">Ortak Çalışanlar</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> aracını kullanarak programın yüklemesini kaldırmanız gerekir.
 
 <ph name="CONTROL_PANEL_APPLET_NAME" /> aracını başlatmak ister misiniz?</translation>
+<translation id="394183848452296464">Kısayol oluşturulamıyor</translation>
 <translation id="3943582379552582368">&amp;Geri</translation>
 <translation id="3943857333388298514">Yapıştır</translation>
 <translation id="3948116654032448504"><ph name="SEARCH_ENGINE" /> içinde Resim &amp;ara</translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Eşlemesi kaldırılmış cihazlar</translation>
 <translation id="4482194545587547824">Google, Arama ve diğer Google hizmetlerini kişiselleştirmek için tarama geçmişinizi kullanabilir</translation>
 <translation id="4495419450179050807">Bu sayfada gösterme</translation>
+<translation id="4499718683476608392">Formları tek bir tıklamayla doldurmak için kredi kartı bilgilerini Otomatik Doldurma özelliğini etkinleştirir</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> eklentisi kilitlendi</translation>
 <translation id="450099669180426158">Ünlem işareti simgesi</translation>
 <translation id="4501530680793980440">Kaldırmayı Onaylayın</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Güçlü</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" />, "<ph name="EXTENSION_NAME" />" uzantısıyla iletişim kurmak istiyor</translation>
 <translation id="4918086044614829423">Kabul et</translation>
-<translation id="4920350943031252905">Linux araçları, düzenleyicileri ve IDE'lerini Chromebook'unuzda çalıştırır.</translation>
 <translation id="4920887663447894854">Aşağıdaki sitelerin bu sayfadaki konumunuzu izlemesi engellendi:</translation>
 <translation id="492299503953721473">Android uygulamalarını kaldır</translation>
 <translation id="4923279099980110923">Evet, yardımcı olmak istiyorum</translation>
@@ -3116,6 +3124,7 @@
 <translation id="5752453871435543420">Chrome OS Bulut yedekleme</translation>
 <translation id="5756163054456765343">Y&amp;ardım merkezi</translation>
 <translation id="5759728514498647443"><ph name="APP_NAME" /> aracılığıyla yazdırılmaları için gönderdiğiniz dokümanlar <ph name="APP_NAME" /> tarafından okunabilir.</translation>
+<translation id="5762172915276660232">Kredi kartı ayarları</translation>
 <translation id="5763751966069581670">USB cihazı bulunamadı</translation>
 <translation id="5764483294734785780">Sesi farklı kay&amp;det...</translation>
 <translation id="57646104491463491">Değiştirilme Tarihi</translation>
@@ -3187,6 +3196,7 @@
 <translation id="5855773610748894548">Tüh, güvenli modül hatası.</translation>
 <translation id="5856721540245522153">Hata ayıklama özelliklerini etkinleştirin</translation>
 <translation id="5857090052475505287">Yeni Klasör</translation>
+<translation id="585979798156957858">Harici Meta</translation>
 <translation id="5860033963881614850">Kapalı</translation>
 <translation id="5860209693144823476">Sekme 3</translation>
 <translation id="5860491529813859533">Etkinleştir</translation>
@@ -3496,6 +3506,7 @@
 <translation id="6327785803543103246">Web proxy otomatik keşfi</translation>
 <translation id="6333064448949140209">Dosya, hata ayıklama amacıyla Google'a gönderilecektir</translation>
 <translation id="6333834492048057036">Aramak için adres çubuğuna odaklan</translation>
+<translation id="6336451774241870485">Yeni gizli sekme</translation>
 <translation id="6339668969738228384"><ph name="USER_EMAIL_ADDRESS" /> için yeni profil oluştur</translation>
 <translation id="6340017061976355871">Sunucuya bağlanamadı. Lütfen ağ bağlantınızı kontrol edip tekrar deneyin. Sorun devam ederse Chromebook'unuzu yeniden başlatın.</translation>
 <translation id="6340071272923955280">İnternet Yazdırma Protokolü (IPPS)</translation>
@@ -3677,6 +3688,7 @@
 <translation id="6606070663386660533">Sekme 8</translation>
 <translation id="6607272825297743757">Dosya bilgileri</translation>
 <translation id="6607831829715835317">Diğer araç&amp;lar</translation>
+<translation id="6610147964972079463">Gizli sekmeleri kapat</translation>
 <translation id="6612358246767739896">Korunan içerik</translation>
 <translation id="6613452264606394692">Bu sayfaya yer işareti koyarak buraya hızlıca geri dönün</translation>
 <translation id="6614893213975402384">Güncellemeleri ve uygulamaları yükleyin. Devam ederek bu cihazın Google'dan, operatörünüzden ve cihazınızın üreticisinden güncellemeleri ve uygulamaları, muhtemelen hücresel veri üzerinden otomatik olarak indirip yükleyebileceğini kabul etmiş olursunuz. Bu uygulamalardan bazıları uygulama içi satın alma seçenekleri sunabilir. Bu uygulamaları istediğiniz zaman kaldırabilirsiniz. <ph name="BEGIN_LINK1" />Daha Fazla Bilgi<ph name="END_LINK1" /></translation>
@@ -3747,6 +3759,7 @@
 <translation id="6710213216561001401">Önceki</translation>
 <translation id="6718273304615422081">Sıkıştırılıyor...</translation>
 <translation id="671928215901716392">Kilit ekranı</translation>
+<translation id="6720847671508630642">Android'in en iyi işlevlerini Chrombook'unuzla otomatik olarak paylaşın. Bilgisayarınızdan kısa mesaj gönderebilmek, telefonunuzun internet bağlantısını paylaşabilmek ve Chromebook ekranınızın kilidini açabilmek için telefonunuzu bağlayın. <ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Güvenlik Anahtarınızın markasını ve modelini görme</translation>
 <translation id="6721972322305477112">&amp;Dosya</translation>
 <translation id="672213144943476270">Lütfen misafir olarak göz atmadan önce profilinizin kilidini açın.</translation>
@@ -3893,6 +3906,7 @@
 <translation id="6970856801391541997">Belirli Sayfaları Yazdır</translation>
 <translation id="6972180789171089114">Ses/Video</translation>
 <translation id="6973630695168034713">Klasörler</translation>
+<translation id="6974609594866392343">Çevrimdışı demo modu</translation>
 <translation id="6976108581241006975">JavaScript konsolu</translation>
 <translation id="6977381486153291903">Donanım yazılımı düzeltmesi</translation>
 <translation id="6978121630131642226">Arama Motorları</translation>
@@ -4035,6 +4049,7 @@
 <translation id="7175353351958621980">Yükleme kaynağı:</translation>
 <translation id="7180611975245234373">Yenile</translation>
 <translation id="7180865173735832675">Özelleştir</translation>
+<translation id="7182359331070524176">Google Fotoğraflar albümü seçin</translation>
 <translation id="7186088072322679094">Araç Çubuğunda Tut</translation>
 <translation id="7187428571767585875">Kaldırılacak veya değiştirilecek kayıt defteri girişleri:</translation>
 <translation id="7189234443051076392">Cihazınızda yeterli alan bulunduğundan emin olun</translation>
@@ -4485,6 +4500,7 @@
 <translation id="7857949311770343000">Bu, beklediğiniz yeni sekme sayfası mı?</translation>
 <translation id="786073089922909430">Hizmet: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;İndirilenler</translation>
+<translation id="7864662577698025113">Yeni hizmet ekle</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 çerez}other{# çerez}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Eşlendi</translation>
 <translation id="7870730066603611552">Kurulumdan sonra senkronizasyon seçeneklerini inceleyin</translation>
@@ -4999,6 +5015,7 @@
 <translation id="8666584013686199826">Bir site USB cihazlarına erişmek istediğinde sor</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> artık tam ekran görüntüleniyor ve fare imlecinizi devre dışı bıraktı.</translation>
 <translation id="8669284339312441707">Daha Sıcak</translation>
+<translation id="8669919703154928649">Asistan'ın size bildirimleri göstermesine izin verin</translation>
 <translation id="8669949407341943408">Taşınıyor...</translation>
 <translation id="8671210955687109937">Yorum yapabilir</translation>
 <translation id="8673026256276578048">Web’de ara...</translation>
@@ -5386,6 +5403,7 @@
 <translation id="964286338916298286">BT yöneticiniz cihazınızda Chrome Ekstraları'nı devre dışı bırakmış.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Uygulama}other{Uygulamalar}}</translation>
 <translation id="967007123645306417">Bu işlem Google hesaplarınızın oturumunu kapatacaktır. Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızla ilgili değişiklikler artık Google Hesabınızla senkronize edilmeyecek. Ancak mevcut verileriniz Google Hesabınızda kalmaya devam edecek ve <ph name="BEGIN_LINK" />Google Hesap Özeti<ph name="END_LINK" />'nde yönetilebilecektir.</translation>
+<translation id="967624055006145463">Depolanan veriler</translation>
 <translation id="968000525894980488">Google Play hizmetlerini açın.</translation>
 <translation id="968174221497644223">Uygulama önbelleği</translation>
 <translation id="969096075394517431">Dilleri değiştir</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 9579ec1..a00c9d6 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Показати опцію "Правопис і граматика"</translation>
 <translation id="1593594475886691512">Форматування…</translation>
 <translation id="159359590073980872">Кеш зображень</translation>
+<translation id="1593926297800505364">Зберегти спосіб оплати</translation>
 <translation id="1598233202702788831">Адміністратор вимкнув оновлення.</translation>
 <translation id="1600857548979126453">Отримувати доступ до серверної частини налагоджувача сторінки</translation>
 <translation id="1601560923496285236">Застосувати</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Не вдається приєднати пристрій до домену. Переконайтеся, що ви не перевищили допустиму кількість доданих пристроїв.</translation>
 <translation id="1744108098763830590">фонова сторінка</translation>
 <translation id="1745520510852184940">Завжди виконувати цю дію</translation>
+<translation id="1746417874336251387">Пропонує нові функції, які використовують з’єднання телефона на Chromebook</translation>
 <translation id="174937106936716857">Усього файлів</translation>
 <translation id="175196451752279553">В&amp;ідкрити закриту вкладку знову</translation>
 <translation id="1753905327828125965">Часто відвідувані</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Не раніше</translation>
 <translation id="1933809209549026293">Підключіть мишу чи клавіатуру. Якщо ви користуєтеся пристроєм Bluetooth, перевірте, чи він готовий до підключення.</translation>
 <translation id="1936157145127842922">Показати в папці</translation>
+<translation id="1938351510777341717">Зовнішня клавіша Command</translation>
 <translation id="1940546824932169984">Під’єднані пристрої</translation>
 <translation id="1942765061641586207">Роздільна здатність зображення</translation>
+<translation id="1943097386230153518">Установити новий сервіс</translation>
 <translation id="1944921356641260203">Знайдено оновлення</translation>
 <translation id="1951615167417147110">Прокрутити вгору на одну сторінку</translation>
 <translation id="1954813140452229842">Помилка підключення спільного доступу. Перевірте облікові дані та повторіть спробу.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Надіслати</translation>
 <translation id="265390580714150011">Значення поля</translation>
 <translation id="2654166010170466751">Дозволити сайтам встановлювати обробники платежів</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />На різних пристроях функції можуть бути іншими</translation>
 <translation id="2660779039299703961">Подія</translation>
 <translation id="266079277508604648">Не вдається під’єднатися до принтера. Перевірте, чи принтер увімкнено та під’єднано до Chromebook через Wi-Fi або USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Введіть PIN-код</translation>
 <translation id="2805646850212350655">Система шифрування файлів Microsoft</translation>
 <translation id="2805756323405976993">Додатки</translation>
+<translation id="2806891468525657116">Ярлик уже є</translation>
 <translation id="2807517655263062534">Тут відображаються завантажені файли</translation>
 <translation id="2809586584051668049">і ще <ph name="NUMBER_ADDITIONAL_DISABLED" /></translation>
 <translation id="281133045296806353">Відкрито нове вікно в поточному сеансі веб-переглядача.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Ви ввійшли.</translation>
 <translation id="3429275422858276529">Створіть закладку цієї сторінки, щоб легко знайти її пізніше</translation>
 <translation id="3429599832623003132">$1 елем.</translation>
+<translation id="3430342160185525240">Дозволяє Асистенту показувати вам сповіщення.</translation>
 <translation id="3432227430032737297">Вилучити всі показані</translation>
 <translation id="3432757130254800023">Надсилати аудіо та відео на дисплеї в локальній мережі</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> на панелі керування.
 
   Запустити міні-додаток <ph name="CONTROL_PANEL_APPLET_NAME" />?</translation>
+<translation id="394183848452296464">Не вдається створити ярлик</translation>
 <translation id="3943582379552582368">&amp;Назад</translation>
 <translation id="3943857333388298514">Вставити</translation>
 <translation id="3948116654032448504">Шукати зображення в <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Відключені пристрої</translation>
 <translation id="4482194545587547824">Google може використовувати вашу історію веб-перегляду, щоб персоналізувати Пошук та інші служби Google</translation>
 <translation id="4495419450179050807">Не показувати на цій сторінці</translation>
+<translation id="4499718683476608392">Вмикає "Автозаповнення" для кредитних карток, щоб вводити дані у форми одним кліком</translation>
 <translation id="4500114933761911433">Плагін <ph name="PLUGIN_NAME" /> аварійно завершив роботу</translation>
 <translation id="450099669180426158">Значок знака оклику</translation>
 <translation id="4501530680793980440">Підтвердити видалення</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Потужний</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> хоче обмінюватися даними з розширенням <ph name="EXTENSION_NAME" /></translation>
 <translation id="4918086044614829423">Прийняти</translation>
-<translation id="4920350943031252905">Запускає інструменти Linux, редактори й ІСР на Chromebook.</translation>
 <translation id="4920887663447894854">На цій сторінці заборонено відстежувати ваше місцезнаходження таким сайтам:</translation>
 <translation id="492299503953721473">Видалити додатки Android</translation>
 <translation id="4923279099980110923">Так, я хочу допомогти</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Резервне копіювання ОС Chrome в Інтернеті</translation>
 <translation id="5756163054456765343">Довідковий центр</translation>
 <translation id="5759728514498647443">Документи, які ви друкуєте через додаток <ph name="APP_NAME" />, може переглядати додаток <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Налаштування кредитних карток</translation>
 <translation id="5763751966069581670">Пристроїв USB не знайдено</translation>
 <translation id="5764483294734785780">Збере&amp;гти аудіо як...</translation>
 <translation id="57646104491463491">Дата змінення</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Помилка модуля безпеки.</translation>
 <translation id="5856721540245522153">Увімкнути функції налагодження</translation>
 <translation id="5857090052475505287">Нова папка</translation>
+<translation id="585979798156957858">Зовнішня мета-клавіша</translation>
 <translation id="5860033963881614850">Вимк.</translation>
 <translation id="5860209693144823476">Вкладка 3</translation>
 <translation id="5860491529813859533">Увімкнути</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Автоматичне виявлення веб-проксі</translation>
 <translation id="6333064448949140209">Файл буде надіслано в Google для налагодження</translation>
 <translation id="6333834492048057036">Вибрати адресний рядок для пошуку</translation>
+<translation id="6336451774241870485">Нова приватна вкладка</translation>
 <translation id="6339668969738228384">Створити новий профіль для облікового запису <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Не вдалося з’єднатись із сервером. Перевірте з’єднання з мережею та повторіть спробу. Якщо проблема не зникне, перезапустіть Chromebook.</translation>
 <translation id="6340071272923955280">Протокол друку через Інтернет (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Вкладка 8</translation>
 <translation id="6607272825297743757">Інформація про файл</translation>
 <translation id="6607831829715835317">Інші інстру&amp;менти</translation>
+<translation id="6610147964972079463">Закрити приватні вкладки</translation>
 <translation id="6612358246767739896">Захищений вміст</translation>
 <translation id="6613452264606394692">Створіть закладку цієї сторінки, щоб швидко повернутися на неї</translation>
 <translation id="6614893213975402384">Встановлення оновлень і додатків. Продовжуючи, ви дозволяєте цьому пристрою автоматично завантажувати й встановлювати оновлення та додатки від Google, вашого оператора й виробника пристрою, зокрема через мобільний трафік. Деякі з цих додатків можуть пропонувати покупки в додатку. Ви можете будь-коли видалити ці додатки. <ph name="BEGIN_LINK1" />Докладніше<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Попереднє</translation>
 <translation id="6718273304615422081">Архівування…</translation>
 <translation id="671928215901716392">Блокування екрана</translation>
+<translation id="6720847671508630642">Автоматично діліться найкращими функціями Android із Chromebook. Підключіть телефон, щоб мати змогу надсилати SMS із комп’ютера, надавати доступ до Інтернету з телефона й розблоковувати екран Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Переглядати марку й модель ключа безпеки</translation>
 <translation id="6721972322305477112">&amp;Файл</translation>
 <translation id="672213144943476270">Перш ніж переглядати сторінки в гостьовому режимі, розблокуйте профіль.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">Друкувати певні сторінки</translation>
 <translation id="6972180789171089114">Звук і відео</translation>
 <translation id="6973630695168034713">Папки</translation>
+<translation id="6974609594866392343">Демо-режим офлайн</translation>
 <translation id="6976108581241006975">Консоль JavaScript</translation>
 <translation id="6977381486153291903">Мікропрограма</translation>
 <translation id="6978121630131642226">Пошукові системи</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Це сторінка нової вкладки, яку ви очікували?</translation>
 <translation id="786073089922909430">Сервіс: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Завантаження</translation>
+<translation id="7864662577698025113">Додати нові сервіси</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 файл cookie}one{# файл cookie}few{# файли cookie}many{# файлів cookie}other{# файлу cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" />: підключено</translation>
 <translation id="7870730066603611552">Після налаштування перевірте параметри синхронізації</translation>
@@ -5000,6 +5015,7 @@
 <translation id="8666584013686199826">Запитувати, коли сайт хоче отримати доступ до пристроїв USB</translation>
 <translation id="8667328578593601900">Сторінка <ph name="FULLSCREEN_ORIGIN" /> зараз відображається в повноекранному режимі та вимкнула курсор миші.</translation>
 <translation id="8669284339312441707">Тепло</translation>
+<translation id="8669919703154928649">Дозволити Асистенту показувати сповіщення</translation>
 <translation id="8669949407341943408">Переміщення…</translation>
 <translation id="8671210955687109937">Може коментувати</translation>
 <translation id="8673026256276578048">Пошук в Інтернеті...</translation>
@@ -5387,6 +5403,7 @@
 <translation id="964286338916298286">ІТ-адміністратор вимкнув додаткові можливості Chrome для вашого пристрою.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Додаток}one{Додатки}few{Додатки}many{Додатки}other{Додатки}}</translation>
 <translation id="967007123645306417">Ви вийдете з облікових записів Google. Зміни в закладках, історії, паролях та інших налаштуваннях більше не синхронізуватимуться з ним. Дані, які зберігаються в обліковому записі Google, не буде видалено. Ними можна керувати на <ph name="BEGIN_LINK" />Інформаційній панелі Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Збережені дані</translation>
 <translation id="968000525894980488">Увімкніть сервіси Google Play.</translation>
 <translation id="968174221497644223">Кеш програми</translation>
 <translation id="969096075394517431">Змінити мови</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index c523be2..c84e727 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">Hiển thị Chính tả và Ngữ pháp</translation>
 <translation id="1593594475886691512">Đang định dạng...</translation>
 <translation id="159359590073980872">Bộ nhớ đệm hình ảnh</translation>
+<translation id="1593926297800505364">Lưu phương thức thanh toán</translation>
 <translation id="1598233202702788831">Quản trị viên của bạn đã tắt bản cập nhật.</translation>
 <translation id="1600857548979126453">Truy cập chương trình phụ trợ trình gỡ lỗi trang</translation>
 <translation id="1601560923496285236">Áp dụng</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">Không thể kết hợp thiết bị với miền. Hãy đảm bảo số thiết bị bạn thêm không vượt quá giới hạn.</translation>
 <translation id="1744108098763830590">trang nền</translation>
 <translation id="1745520510852184940">Luôn làm điều này</translation>
+<translation id="1746417874336251387">Cung cấp các tính năng mới có thể sử dụng kết nối của điện thoại với Chromebook của bạn</translation>
 <translation id="174937106936716857">Tổng số lượng tệp</translation>
 <translation id="175196451752279553">&amp;Mở lại tab đã đóng</translation>
 <translation id="1753905327828125965">Truy cập nhiều nhất</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">Không được Trước</translation>
 <translation id="1933809209549026293">Hãy kết nối chuột hoặc bàn phím. Nếu bạn đang sử dụng thiết bị Bluetooth, hãy đảm bảo thiết bị đã sẵn sàng ghép nối.</translation>
 <translation id="1936157145127842922">Hiển thị trong Thư mục</translation>
+<translation id="1938351510777341717">Lệnh bên ngoài</translation>
 <translation id="1940546824932169984">Thiết bị đã kết nối</translation>
 <translation id="1942765061641586207">Độ phân giải hình ảnh</translation>
+<translation id="1943097386230153518">Cài đặt dịch vụ mới</translation>
 <translation id="1944921356641260203">Đã tìm thấy bản cập nhật</translation>
 <translation id="1951615167417147110">Cuộn lên một trang</translation>
 <translation id="1954813140452229842">Lỗi khi kết nối với thư mục chia sẻ. Vui lòng kiểm tra thông tin đăng nhập của bạn rồi thử lại.</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">Gửi</translation>
 <translation id="265390580714150011">Giá trị Trường</translation>
 <translation id="2654166010170466751">Cho phép các trang web cài đặt trình xử lý thanh toán</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />Các tính năng có thể thay đổi tùy theo thiết bị</translation>
 <translation id="2660779039299703961">Sự kiện</translation>
 <translation id="266079277508604648">Không thể kết nối với máy in. Hãy kiểm tra để đảm bảo rằng bạn đã bật máy in cũng như đã kết nối máy in với Chromebook qua Wi-Fi hoặc USB.</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">Nhập mã PIN</translation>
 <translation id="2805646850212350655">Hệ thống Tệp Mã hóa của Microsoft</translation>
 <translation id="2805756323405976993">Ứng dụng</translation>
+<translation id="2806891468525657116">Lối tắt đã tồn tại</translation>
 <translation id="2807517655263062534">Các tệp bạn tải xuống sẽ xuất hiện ở đây</translation>
 <translation id="2809586584051668049">và <ph name="NUMBER_ADDITIONAL_DISABLED" /> mục khác</translation>
 <translation id="281133045296806353">Đã tạo cửa sổ mới trong phiên trình duyệt hiện có.</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">Bạn đã đăng nhập!</translation>
 <translation id="3429275422858276529">Đánh dấu trang này để dễ dàng tìm kiếm về sau</translation>
 <translation id="3429599832623003132">$1 mục</translation>
+<translation id="3430342160185525240">Bật Trợ lý để hiển thị thông báo cho bạn.</translation>
 <translation id="3432227430032737297">Xóa tất cả cookie hiển thị</translation>
 <translation id="3432757130254800023">Gửi âm thanh và video tới màn hình trên mạng cục bộ</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1964,6 +1971,7 @@
   <ph name="CONTROL_PANEL_APPLET_NAME" /> trong Bảng điều khiển.
 
   Bạn có muốn khởi động <ph name="CONTROL_PANEL_APPLET_NAME" /> không?</translation>
+<translation id="394183848452296464">Không thể tạo lối tắt</translation>
 <translation id="3943582379552582368">&amp;Quay lại</translation>
 <translation id="3943857333388298514">Dán</translation>
 <translation id="3948116654032448504">&amp;Tìm kiếm hình ảnh trên <ph name="SEARCH_ENGINE" /></translation>
@@ -2271,6 +2279,7 @@
 <translation id="4481530544597605423">Thiết bị được hủy ghép nối</translation>
 <translation id="4482194545587547824">Google có thể sử dụng lịch sử duyệt web của bạn để cá nhân hóa Tìm kiếm và các dịch vụ khác của Google.</translation>
 <translation id="4495419450179050807">Không hiển thị trên trang này</translation>
+<translation id="4499718683476608392">Bật tính năng Tự động điền thẻ tín dụng để điền vào các biểu mẫu chỉ bằng một lần nhấp</translation>
 <translation id="4500114933761911433"><ph name="PLUGIN_NAME" /> đã bị lỗi</translation>
 <translation id="450099669180426158">Biểu tượng dấu chấm than</translation>
 <translation id="4501530680793980440">Xác nhận xóa</translation>
@@ -2549,7 +2558,6 @@
 <translation id="4917385247580444890">Mạnh</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> muốn giao tiếp với tiện ích "<ph name="EXTENSION_NAME" />"</translation>
 <translation id="4918086044614829423">Chấp nhận</translation>
-<translation id="4920350943031252905">Chạy IDE, trình biên tập và công cụ Linux trên Chromebook của bạn.</translation>
 <translation id="4920887663447894854">Các trang web sau đã bị chặn theo dõi vị trí của bạn trên trang này:</translation>
 <translation id="492299503953721473">Xóa ứng dụng Android</translation>
 <translation id="4923279099980110923">Vâng, tôi muốn được trợ giúp</translation>
@@ -3115,6 +3123,7 @@
 <translation id="5752453871435543420">Sao lưu Chrome OS Cloud</translation>
 <translation id="5756163054456765343">Trung tâm trợ g&amp;iúp</translation>
 <translation id="5759728514498647443">Tài liệu bạn gửi để in qua <ph name="APP_NAME" /> có thể đọc được bằng <ph name="APP_NAME" />.</translation>
+<translation id="5762172915276660232">Tùy chọn cài đặt thẻ tín dụng</translation>
 <translation id="5763751966069581670">Không tìm thấy thiết bị USB nào</translation>
 <translation id="5764483294734785780">Lư&amp;u âm thanh thành...</translation>
 <translation id="57646104491463491">Ngày Sửa đổi</translation>
@@ -3186,6 +3195,7 @@
 <translation id="5855773610748894548">Rất tiếc, mô-đun an toàn bị lỗi.</translation>
 <translation id="5856721540245522153">Bật tính năng gỡ lỗi</translation>
 <translation id="5857090052475505287">Thư mục Mới</translation>
+<translation id="585979798156957858">Meta bên ngoài</translation>
 <translation id="5860033963881614850">Tắt</translation>
 <translation id="5860209693144823476">Tab 3</translation>
 <translation id="5860491529813859533">Bật</translation>
@@ -3495,6 +3505,7 @@
 <translation id="6327785803543103246">Tự động phát hiện proxy web</translation>
 <translation id="6333064448949140209">Tệp sẽ được gửi tới Google để được gỡ lỗi</translation>
 <translation id="6333834492048057036">Tập trung vào thanh địa chỉ để tìm kiếm</translation>
+<translation id="6336451774241870485">Tab riêng tư mới</translation>
 <translation id="6339668969738228384">Tạo hồ sơ mới cho <ph name="USER_EMAIL_ADDRESS" /></translation>
 <translation id="6340017061976355871">Không thể kết nối với máy chủ. Vui lòng kiểm tra kết nối mạng của bạn và thử lại. Nếu sự cố vẫn tiếp diễn, hãy khởi động lại Chromebook.</translation>
 <translation id="6340071272923955280">Giao thức in qua Internet (IPPS)</translation>
@@ -3676,6 +3687,7 @@
 <translation id="6606070663386660533">Tab 8</translation>
 <translation id="6607272825297743757">Thông tin tệp</translation>
 <translation id="6607831829715835317">Côn&amp;g cụ khác</translation>
+<translation id="6610147964972079463">Đóng tab riêng tư</translation>
 <translation id="6612358246767739896">Nội dung được bảo vệ</translation>
 <translation id="6613452264606394692">Quay lại đây nhanh chóng bằng cách đánh dấu trang này</translation>
 <translation id="6614893213975402384">Cài đặt bản cập nhật và ứng dụng. Bằng việc tiếp tục, bạn đồng ý rằng thiết bị này cũng có thể tự động tải xuống và cài đặt các bản cập nhật cũng như ứng dụng từ Google, nhà mạng và nhà sản xuất thiết bị bằng cách sử dụng dữ liệu di động. Một vài ứng dụng có thể cung cấp tùy chọn mua hàng trong ứng dụng. Bạn có thể xóa những ứng dụng này bất kỳ lúc nào. <ph name="BEGIN_LINK1" />Tìm hiểu thêm<ph name="END_LINK1" /></translation>
@@ -3746,6 +3758,7 @@
 <translation id="6710213216561001401">Trước đó</translation>
 <translation id="6718273304615422081">Đang nén...</translation>
 <translation id="671928215901716392">Khóa màn hình</translation>
+<translation id="6720847671508630642">Tự động chia sẻ những tính năng ưu việt nhất của Android với Chromebook của bạn. Kết nối điện thoại để bạn có thể nhắn tin từ máy tính, dùng chung kết nối Internet của điện thoại và mở khóa màn hình Chromebook.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Tìm hiểu thêm<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">Xem nhãn hiệu và kiểu Khóa bảo mật của bạn</translation>
 <translation id="6721972322305477112">&amp;Tệp</translation>
 <translation id="672213144943476270">Vui lòng mở khóa hồ sơ của bạn trước khi duyệt với tư cách khách.</translation>
@@ -3892,6 +3905,7 @@
 <translation id="6970856801391541997">In các trang cụ thể</translation>
 <translation id="6972180789171089114">Âm thanh/video</translation>
 <translation id="6973630695168034713">Thư mục</translation>
+<translation id="6974609594866392343">Chế độ minh họa ngoại tuyến</translation>
 <translation id="6976108581241006975">Bảng điều khiển JavaScript</translation>
 <translation id="6977381486153291903">Hiệu chỉnh chương trình cơ sở</translation>
 <translation id="6978121630131642226">Công cụ Tìm kiếm</translation>
@@ -4486,6 +4500,7 @@
 <translation id="7857949311770343000">Đây có phải là trang tab mới bạn muốn không?</translation>
 <translation id="786073089922909430">Dịch vụ: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">&amp;Tải xuống</translation>
+<translation id="7864662577698025113">Thêm dịch vụ mới</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 cookie}other{# cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - Đã ghép nối</translation>
 <translation id="7870730066603611552">Xem lại các tùy chọn đồng bộ hóa sau khi thiết lập</translation>
@@ -5000,6 +5015,7 @@
 <translation id="8666584013686199826">Hỏi khi một trang web muốn truy cập vào các thiết bị USB</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> hiện ở chế độ toàn màn hình và đã tắt con trỏ chuột của bạn.</translation>
 <translation id="8669284339312441707">Ấm hơn</translation>
+<translation id="8669919703154928649">Cho phép Trợ lý hiển thị thông báo cho bạn</translation>
 <translation id="8669949407341943408">Đang di chuyển...</translation>
 <translation id="8671210955687109937">Có thể nhận xét</translation>
 <translation id="8673026256276578048">Tìm kiếm Web...</translation>
@@ -5387,6 +5403,7 @@
 <translation id="964286338916298286">Quản trị viên CNTT đã tắt các Ưu đãi của Chrome trên thiết bị của bạn.</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{Ứng dụng}other{Các ứng dụng}}</translation>
 <translation id="967007123645306417">Thao tác này sẽ đăng xuất bạn khỏi tài khoản Google. Các thay đổi đối với dấu trang, lịch sử, mật khẩu và các mục cài đặt khác sẽ không đồng bộ hóa với Tài khoản Google của bạn nữa. Tuy nhiên, dữ liệu hiện có sẽ vẫn được lưu trữ trong Tài khoản Google của bạn và có thể quản lý trên <ph name="BEGIN_LINK" />Trang tổng quan Google<ph name="END_LINK" />.</translation>
+<translation id="967624055006145463">Dữ liệu đã lưu trữ</translation>
 <translation id="968000525894980488">Bật dịch vụ của Google Play.</translation>
 <translation id="968174221497644223">Bộ nhớ đệm của ứng dụng</translation>
 <translation id="969096075394517431">Thay đổi ngôn ngữ</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index f51bedc..323a032 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2542,7 +2542,6 @@
 <translation id="4917385247580444890">强</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> 希望与“<ph name="EXTENSION_NAME" />”扩展程序通信</translation>
 <translation id="4918086044614829423">接受</translation>
-<translation id="4920350943031252905">在您的 Chromebook 上运行 Linux 工具、编辑器和 IDE。</translation>
 <translation id="4920887663447894854">系统已阻止以下网站跟踪您在此网页上的位置:</translation>
 <translation id="492299503953721473">移除 Android 应用</translation>
 <translation id="4923279099980110923">我愿意提供帮助</translation>
@@ -4020,6 +4019,7 @@
 <translation id="7175353351958621980">加载来源:</translation>
 <translation id="7180611975245234373">刷新</translation>
 <translation id="7180865173735832675">自定义</translation>
+<translation id="7182359331070524176">选择一个 Google 照片相册</translation>
 <translation id="7186088072322679094">固定在工具栏中</translation>
 <translation id="7187428571767585875">要移除或要更改的注册表项:</translation>
 <translation id="7189234443051076392">确保您的设备上有足够的空间</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 4caca609..723b8ac 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -401,6 +401,7 @@
 <translation id="1589055389569595240">顯示拼字與文法</translation>
 <translation id="1593594475886691512">正在格式化...</translation>
 <translation id="159359590073980872">圖片快取</translation>
+<translation id="1593926297800505364">儲存付款方式</translation>
 <translation id="1598233202702788831">您的管理員停用了更新功能。</translation>
 <translation id="1600857548979126453">存取網頁偵錯工具後端</translation>
 <translation id="1601560923496285236">套用</translation>
@@ -511,6 +512,7 @@
 <translation id="1744060673522309905">無法將這個裝置加入網域。請確認裝置數量沒有超過添加上限。</translation>
 <translation id="1744108098763830590">背景頁面</translation>
 <translation id="1745520510852184940">一律採取這種處理方式</translation>
+<translation id="1746417874336251387">提供將手機和 Chromebook 連結便能使用的新功能</translation>
 <translation id="174937106936716857">檔案總數</translation>
 <translation id="175196451752279553">重新開啟已關閉分頁(&amp;E)</translation>
 <translation id="1753905327828125965">最常造訪</translation>
@@ -641,8 +643,10 @@
 <translation id="1932098463447129402">此日期之後:</translation>
 <translation id="1933809209549026293">請連接滑鼠或鍵盤。如果你使用的是藍牙裝置,請確認該裝置處於可進行配對的狀態。</translation>
 <translation id="1936157145127842922">在資料夾中顯示</translation>
+<translation id="1938351510777341717">外部 Command 鍵</translation>
 <translation id="1940546824932169984">已連結的裝置</translation>
 <translation id="1942765061641586207">影像解析度</translation>
+<translation id="1943097386230153518">安裝新服務</translation>
 <translation id="1944921356641260203">找到更新</translation>
 <translation id="1951615167417147110">向上捲動一頁</translation>
 <translation id="1954813140452229842">掛接共用裝置時發生錯誤。請檢查你的憑證,然後再試一次。</translation>
@@ -1108,6 +1112,7 @@
 <translation id="2653659639078652383">提交</translation>
 <translation id="265390580714150011">欄位值</translation>
 <translation id="2654166010170466751">允許網站安裝付款處理常式</translation>
+<translation id="2659381484350128933"><ph name="FOOTNOTE_POINTER" />功能會因裝置而異</translation>
 <translation id="2660779039299703961">活動</translation>
 <translation id="266079277508604648">無法連上印表機。請確認印表機已開啟,且已透過 Wi-Fi 或 USB 連上 Chromebook。</translation>
 <translation id="2661146741306740526">16x9</translation>
@@ -1214,6 +1219,7 @@
 <translation id="2803375539583399270">輸入 PIN</translation>
 <translation id="2805646850212350655">Microsoft 加密檔案系統</translation>
 <translation id="2805756323405976993">應用程式</translation>
+<translation id="2806891468525657116">捷徑已經存在</translation>
 <translation id="2807517655263062534">你下載的檔案會顯示在這裡</translation>
 <translation id="2809586584051668049">和另外 <ph name="NUMBER_ADDITIONAL_DISABLED" /> 個</translation>
 <translation id="281133045296806353">已在目前的瀏覽器工作階段開啟新視窗。</translation>
@@ -1600,6 +1606,7 @@
 <translation id="3428419049384081277">你已登入帳戶!</translation>
 <translation id="3429275422858276529">將這個網頁加入書籤,方便日後查看</translation>
 <translation id="3429599832623003132">$1 個項目</translation>
+<translation id="3430342160185525240">允許 Google 助理向你顯示通知。</translation>
 <translation id="3432227430032737297">將顯示的項目全部移除</translation>
 <translation id="3432757130254800023">傳送要在區域網路顯示的影音內容</translation>
 <translation id="3432762828853624962">Shared Workers</translation>
@@ -1963,6 +1970,7 @@
 <translation id="3941565636838060942">如要隱藏這個程式的存取權,你必須使用控制台中的「<ph name="CONTROL_PANEL_APPLET_NAME" />」解除安裝此程式。
 
   是否要開啟「<ph name="CONTROL_PANEL_APPLET_NAME" />」?</translation>
+<translation id="394183848452296464">無法建立捷徑</translation>
 <translation id="3943582379552582368">上一頁(&amp;B)</translation>
 <translation id="3943857333388298514">貼上</translation>
 <translation id="3948116654032448504">透過 <ph name="SEARCH_ENGINE" /> 搜尋圖片(&amp;S)</translation>
@@ -2270,6 +2278,7 @@
 <translation id="4481530544597605423">解除配對的裝置</translation>
 <translation id="4482194545587547824">Google 可能會使用您的瀏覽記錄,為您提供個人化的搜尋服務和其他各項 Google 服務。</translation>
 <translation id="4495419450179050807">不要顯示這個網頁</translation>
+<translation id="4499718683476608392">啟用信用卡自動填入功能,輕鬆一按即可填妥表單</translation>
 <translation id="4500114933761911433">「<ph name="PLUGIN_NAME" />」當機了</translation>
 <translation id="450099669180426158">驚嘆號圖示</translation>
 <translation id="4501530680793980440">確認移除</translation>
@@ -2548,7 +2557,6 @@
 <translation id="4917385247580444890">強</translation>
 <translation id="4918021164741308375"><ph name="ORIGIN" /> 要求與「<ph name="EXTENSION_NAME" />」擴充功能通訊</translation>
 <translation id="4918086044614829423">接受</translation>
-<translation id="4920350943031252905">在你的 Chromebook 上執行 Linux 工具、編輯器和 IDE。</translation>
 <translation id="4920887663447894854">下列網站已遭封鎖,無法在你瀏覽此網頁時追蹤你的位置:</translation>
 <translation id="492299503953721473">移除 Android 應用程式</translation>
 <translation id="4923279099980110923">是,我願意協助</translation>
@@ -3113,6 +3121,7 @@
 <translation id="5752453871435543420">Chrome 作業系統雲端備份</translation>
 <translation id="5756163054456765343">說明中心(&amp;E)</translation>
 <translation id="5759728514498647443">「<ph name="APP_NAME" />」可以讀取您透過「<ph name="APP_NAME" />」傳送的待列印文件。</translation>
+<translation id="5762172915276660232">信用卡設定</translation>
 <translation id="5763751966069581670">找不到 USB 裝置</translation>
 <translation id="5764483294734785780">將音訊另存為(&amp;V)...</translation>
 <translation id="57646104491463491">已修改日期</translation>
@@ -3184,6 +3193,7 @@
 <translation id="5855773610748894548">糟糕,發生安全模組錯誤。</translation>
 <translation id="5856721540245522153">啟用偵錯功能</translation>
 <translation id="5857090052475505287">新資料夾</translation>
+<translation id="585979798156957858">外部 Meta 鍵</translation>
 <translation id="5860033963881614850">關閉</translation>
 <translation id="5860209693144823476">分頁 3</translation>
 <translation id="5860491529813859533">啟用</translation>
@@ -3493,6 +3503,7 @@
 <translation id="6327785803543103246">網路 Proxy 自動探索</translation>
 <translation id="6333064448949140209">檔案會傳送給 Google 進行偵錯</translation>
 <translation id="6333834492048057036">將焦點移至網址列以便進行搜尋</translation>
+<translation id="6336451774241870485">新私密分頁</translation>
 <translation id="6339668969738228384">為 <ph name="USER_EMAIL_ADDRESS" /> 建立新的個人資料</translation>
 <translation id="6340017061976355871">無法連上伺服器。請檢查網路連線狀態,然後再試一次。如果問題持續發生,請重新啟動 Chromebook。</translation>
 <translation id="6340071272923955280">網際網路列印通訊協定 (IPPS)</translation>
@@ -3673,6 +3684,7 @@
 <translation id="6606070663386660533">分頁 8</translation>
 <translation id="6607272825297743757">檔案資訊</translation>
 <translation id="6607831829715835317">更多工具(&amp;L)</translation>
+<translation id="6610147964972079463">關閉私密分頁</translation>
 <translation id="6612358246767739896">受保護內容</translation>
 <translation id="6613452264606394692">將此頁加入書籤,方便你快速返回</translation>
 <translation id="6614893213975402384">安裝更新和應用程式。如果您選擇繼續,即表示您允許這部裝置自動下載及安裝來自 Google、您的電信業者和裝置製造商的更新內容和應用程式,上述程序可能會使用行動數據。這類應用程式中,有些可能會提供應用程式內購功能。您隨時可以移除這類應用程式。<ph name="BEGIN_LINK1" />瞭解詳情<ph name="END_LINK1" /></translation>
@@ -3743,6 +3755,7 @@
 <translation id="6710213216561001401">返回</translation>
 <translation id="6718273304615422081">壓縮中...</translation>
 <translation id="671928215901716392">鎖定螢幕</translation>
+<translation id="6720847671508630642">自動將最佳 Android 功能分享給你的 Chromebook。與手機連結後,即可透過電腦收發簡訊、讓電腦使用手機的網際網路連線,並使用手機解鎖 Chromebook 螢幕。<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />瞭解詳情<ph name="LINK_END" /></translation>
 <translation id="6721678857435001674">查看安全金鑰的製造商和型號</translation>
 <translation id="6721972322305477112">檔案(&amp;F)</translation>
 <translation id="672213144943476270">以訪客身分瀏覽之前,請先取消鎖定您的個人資料。</translation>
@@ -3889,6 +3902,7 @@
 <translation id="6970856801391541997">列印特定網頁</translation>
 <translation id="6972180789171089114">音效/影片</translation>
 <translation id="6973630695168034713">資料夾</translation>
+<translation id="6974609594866392343">離線示範模式</translation>
 <translation id="6976108581241006975">JavaScript 控制台</translation>
 <translation id="6977381486153291903">韌體版本</translation>
 <translation id="6978121630131642226">搜尋引擎</translation>
@@ -4031,6 +4045,7 @@
 <translation id="7175353351958621980">載入來源:</translation>
 <translation id="7180611975245234373">重新整理</translation>
 <translation id="7180865173735832675">自訂</translation>
+<translation id="7182359331070524176">選取 Google 相簿</translation>
 <translation id="7186088072322679094">固定在工具列中</translation>
 <translation id="7187428571767585875">系統將移除或變更下列登錄檔項目:</translation>
 <translation id="7189234443051076392">確認你的裝置上有足夠空間</translation>
@@ -4481,6 +4496,7 @@
 <translation id="7857949311770343000">這是你想要的新分頁嗎?</translation>
 <translation id="786073089922909430">服務:<ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7861215335140947162">下載(&amp;D)</translation>
+<translation id="7864662577698025113">新增服務</translation>
 <translation id="7868378670806575181">{NUM_COOKIES,plural, =1{1 個 Cookie}other{# 個 Cookie}}</translation>
 <translation id="786957569166715433"><ph name="DEVICE_NAME" /> - 已配對</translation>
 <translation id="7870730066603611552">設定後查看同步處理選項</translation>
@@ -4995,6 +5011,7 @@
 <translation id="8666584013686199826">網站要求存取 USB 裝置時詢問我</translation>
 <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> 已顯示為全螢幕,並且停用了滑鼠游標。</translation>
 <translation id="8669284339312441707">暖色調</translation>
+<translation id="8669919703154928649">允許 Google 助理顯示你的通知</translation>
 <translation id="8669949407341943408">移動中...</translation>
 <translation id="8671210955687109937">可以註解</translation>
 <translation id="8673026256276578048">搜尋網頁...</translation>
@@ -5382,6 +5399,7 @@
 <translation id="964286338916298286">你的 IT 管理員已為你的裝置停用 Chrome 好康優惠。</translation>
 <translation id="964439421054175458">{NUM_APLLICATIONS,plural, =1{應用程式}other{應用程式}}</translation>
 <translation id="967007123645306417">你將登出自己的 Google 帳戶。你的書籤、歷史記錄、密碼和其他設定的變更將不會再同步到你的 Google 帳戶。不過,你的現有資料仍會儲存在你的 Google 帳戶中,並可透過 <ph name="BEGIN_LINK" />Google 資訊主頁<ph name="END_LINK" />管理。</translation>
+<translation id="967624055006145463">已儲存的資料</translation>
 <translation id="968000525894980488">開啟 Google Play 服務。</translation>
 <translation id="968174221497644223">應用程式快取</translation>
 <translation id="969096075394517431">變更語言</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb
index 0177c6bf..086d558 100644
--- a/chrome/app/resources/google_chrome_strings_am.xtb
+++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Chromeን በእርስዎ ስልክ ላይ ይጫኑ። አንድ ኤስኤምኤስ ወደ የእርስዎ ስልክ እንልካለን።</translation>
 <translation id="8183957050892517584">Chrome የግል መረጃዎችዎን ዳግም መተየብ እንዳይኖርብዎት በጥንቃቄ ያከማቻቸዋል።</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS አሁን ዳግም ይጀምራል}=1{Chrome OS በ1 ሰከንድ ውስጥ ዳግም ይጀምራል}one{Chrome OS በ# ሰከንዶች ውስጥ ዳግም ይጀምራል}other{Chrome OS በ# ሰከንዶች ውስጥ ዳግም ይጀምራል}}</translation>
+<translation id="825412236959742607">ይህ ገጽ በጣም ብዙ ማህደረ ትውስታን ይጠቀማል፣ ስለዚህ Chrome አንዳንድ ይዘትን አስወግዷል።</translation>
 <translation id="8255190535488645436">Google Chrome ካሜራዎን እና ማይክሮፎንዎን እየተጠቀመ ነው።</translation>
 <translation id="8286862437124483331">Google Chrome የይለፍ ቃሎችን ለማሳየት እየሞከረ ነው። ይህንን ለመፍቀድ የእርስዎን Windows የይለፍ ቃል ይተይቡ።</translation>
 <translation id="8290100596633877290">ኧረ ገዳይ! Google Chrome ተሰናክሏል። አሁን እንደገና ይጀመር?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb
index 718656d..5da44dc 100644
--- a/chrome/app/resources/google_chrome_strings_ar.xtb
+++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -255,6 +255,7 @@
 <translation id="8179874765710681175">‏بادِر بتثبيت Chrome على هاتفك. سنرسل رسالة قصيرة إلى هاتفك.</translation>
 <translation id="8183957050892517584">‏سيخزّن Chrome معلوماتك الشخصية بشكلٍ آمن لكي لا تُضطر إلى كتابتها مرة أخرى.</translation>
 <translation id="8226081633851087288">{0,plural, =0{‏ستتم إعادة تشغيل نظام التشغيل Chrome الآن}=1{‏ستتم إعادة تشغيل نظام التشغيل Chrome خلال ثانية واحدة}two{‏ستتم إعادة تشغيل نظام التشغيل Chrome خلال ثانيتين (#)}few{‏ستتم إعادة تشغيل نظام التشغيل Chrome خلال # ثوانٍ}many{‏ستتم إعادة تشغيل نظام التشغيل Chrome خلال # ثانيةً}other{‏ستتم إعادة تشغيل نظام التشغيل Chrome خلال # ثانيةً}}</translation>
+<translation id="825412236959742607">‏تستهلك هذه الصفحة مساحة كبيرة من الذاكرة، لذلك أزال Chrome بعض محتواها.</translation>
 <translation id="8255190535488645436">‏يستخدم Google Chrome الكاميرا والميكروفون.</translation>
 <translation id="8286862437124483331">‏يحاول Google Chrome عرض كلمات المرور. اكتب كلمة مرور Windows للسماح بذلك.</translation>
 <translation id="8290100596633877290">‏للأسف! تعطل Google Chrome. هل تريد إعادة التشغيل الآن؟</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb
index ad09345..6dd0b88 100644
--- a/chrome/app/resources/google_chrome_strings_bg.xtb
+++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -253,6 +253,7 @@
 <translation id="8179874765710681175">Инсталирайте Chrome на телефона си. Ще ви изпратим SMS на него.</translation>
 <translation id="8183957050892517584">Chrome ще съхранява надеждно личните ви данни, за да не се налага да ги въвеждате отново.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS ще се рестартира сега}=1{Chrome OS ще се рестартира след 1 секунда}other{Chrome OS ще се рестартира след # секунди}}</translation>
+<translation id="825412236959742607">Тази страница използва твърде много памет, така че Chrome премахна част от съдържанието.</translation>
 <translation id="8255190535488645436">Google Chrome използва камерата и микрофона ви.</translation>
 <translation id="8286862437124483331">Google Chrome опитва да покаже паролите. За да разрешите това, въведете паролата си за Windows.</translation>
 <translation id="8290100596633877290">О, не! Google Chrome претърпя срив. Да се стартира ли отново сега?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb
index 5a4178a..de24d77 100644
--- a/chrome/app/resources/google_chrome_strings_ca.xtb
+++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Instal·la Chrome al telèfon. T'enviarem un SMS al telèfon.</translation>
 <translation id="8183957050892517584">Chrome emmagatzemarà de manera segura les vostres dades personals perquè no les hàgiu de tornar a escriure</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS es reiniciarà ara}=1{Chrome OS es reiniciarà d'aquí a 1 segon}other{Chrome OS es reiniciarà d'aquí a # segons}}</translation>
+<translation id="825412236959742607">Com que aquesta pàgina fa servir massa memòria, Chrome n'ha suprimit contingut.</translation>
 <translation id="8255190535488645436">Google Chrome està utilitzant la càmera i el micròfon.</translation>
 <translation id="8286862437124483331">Google Chrome està provant de mostrar contrasenyes. Escriviu la vostra contrasenya de Windows per permetre-ho.</translation>
 <translation id="8290100596633877290">Google Chrome s'ha bloquejat. Voleu tornar-lo a iniciar?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb
index 7f72a80..16df9f8 100644
--- a/chrome/app/resources/google_chrome_strings_da.xtb
+++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -154,7 +154,7 @@
 <translation id="4990567037958725628">Google Chrome Canary</translation>
 <translation id="5028489144783860647">Google Chrome kunne ikke synkronisere dine data. Opdater din adgangssætning til synkronisering.</translation>
 <translation id="5062123544085870375">Genstart Chrome OS</translation>
-<translation id="5090044601776247154">Administrerede brugerprofiler vil ikke længere være tilgængelige fra og med Goolge Chrome 70.</translation>
+<translation id="5090044601776247154">Administrerede brugerprofiler vil ikke længere være tilgængelige fra og med Google Chrome 70.</translation>
 <translation id="5132929315877954718">Find fantastiske apps, spil, udvidelser og temaer til Google Chrome.</translation>
 <translation id="5166975452760862670">Google Chrome vises på dette sprog</translation>
 <translation id="5170938038195470297">Din profil kan ikke bruges, fordi den stammer fra en nyere version af Google Chrome. Nogle funktioner er muligvis ikke tilgængelige. Angiv en anden profilmappe, eller brug en nyere version af Chrome.</translation>
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Installer Chrome på din telefon. Vi sender en sms til din telefon.</translation>
 <translation id="8183957050892517584">Chrome gemmer dine personlige oplysninger på sikker vis, så du ikke behøver at angive dem igen.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS genstarter nu}=1{Chrome OS genstarter om 1 sekund}one{Chrome OS genstarter om # sekund}other{Chrome OS genstarter om # sekunder}}</translation>
+<translation id="825412236959742607">Denne side anvender for meget hukommelse, så Chrome har fjernet noget indhold.</translation>
 <translation id="8255190535488645436">Google Chrome bruger dit kamera og din mikrofon.</translation>
 <translation id="8286862437124483331">Google Chrome forsøger at vise adgangskoder. Angiv din Windows-adgangskode for at tillade dette.</translation>
 <translation id="8290100596633877290">Hovsa! Google Chrome er gået ned. Vil du genstarte nu?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb
index 4e7877c..755687c 100644
--- a/chrome/app/resources/google_chrome_strings_de.xtb
+++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Installieren Sie Chrome auf Ihrem Smartphone. Wir senden Ihnen eine SMS.</translation>
 <translation id="8183957050892517584">Ihre personenbezogenen Daten werden von Chrome sicher gespeichert. Dadurch brauchen Sie sie nicht noch einmal einzugeben.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS wird jetzt neu gestartet}=1{Chrome OS wird in 1 Sekunde neu gestartet}other{Chrome OS wird in # Sekunden neu gestartet}}</translation>
+<translation id="825412236959742607">Diese Seite benötigt zu viel Arbeitsspeicher. Darum hat Chrome einige Inhalte entfernt.</translation>
 <translation id="8255190535488645436">Google Chrome verwendet Ihre Kamera und Ihr Mikrofon.</translation>
 <translation id="8286862437124483331">Google Chrome möchte Passwörter anzeigen. Geben Sie Ihr Windows-Passwort ein, um dies zuzulassen.</translation>
 <translation id="8290100596633877290">Google Chrome ist abgestürzt. Jetzt neu starten?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb
index 11f245e..e8a08ce 100644
--- a/chrome/app/resources/google_chrome_strings_el.xtb
+++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -255,6 +255,7 @@
 <translation id="8179874765710681175">Εγκαταστήστε το Chrome στο τηλέφωνό σας. Θα στείλουμε ένα SMS στο τηλέφωνό σας.</translation>
 <translation id="8183957050892517584">Το Chrome θα αποθηκεύσει με ασφάλεια τα προσωπικά σας στοιχεία, έτσι ώστε να μην χρειάζεται να τα πληκτρολογείτε ξανά.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Η επανεκκίνηση του Chrome OS θα γίνει τώρα}=1{Η επανεκκίνηση του Chrome OS θα γίνει σε 1 δευτερόλεπτο}other{Η επανεκκίνηση του Chrome OS θα γίνει σε # δευτερόλεπτα}}</translation>
+<translation id="825412236959742607">Αυτή η σελίδα χρησιμοποιεί πάρα πολλή μνήμη. Για αυτόν τον λόγο, το Chrome κατάργησε κάποιο περιεχόμενο.</translation>
 <translation id="8255190535488645436">Το Google Chrome χρησιμοποιεί την κάμερα και το μικρόφωνό σας.</translation>
 <translation id="8286862437124483331">Το Google Chrome προσπαθεί να εμφανίσει τους κωδικούς πρόσβασης. Πληκτρολογήστε τον κωδικό πρόσβασής σας Windows για να το επιτρέψετε αυτό.</translation>
 <translation id="8290100596633877290">Πω πω! Το Google Chrome παρουσίασε σφάλμα. Επανεκκίνηση τώρα;</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 886febb..6c92a52 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Instala Chrome en tu teléfono. Te enviaremos un SMS a tu teléfono.</translation>
 <translation id="8183957050892517584">Chrome almacenará de forma segura tu información personal, de modo que no tendrás que volver a introducirla.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS se reiniciará ahora}=1{Chrome OS se reiniciará en 1 segundo}other{Chrome OS se reiniciará en # segundos}}</translation>
+<translation id="825412236959742607">Esta página utiliza demasiada memoria, por lo que Chrome ha eliminado parte del contenido.</translation>
 <translation id="8255190535488645436">Google Chrome está utilizando la cámara y el micrófono.</translation>
 <translation id="8286862437124483331">Google Chrome está intentando mostrar contraseñas. Para permitirlo, escribe tu contraseña de Windows.</translation>
 <translation id="8290100596633877290">¡Vaya! Se ha producido un fallo en Google Chrome. ¿Quieres reiniciar el navegador ahora?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb
index 05d0e727..da88790 100644
--- a/chrome/app/resources/google_chrome_strings_et.xtb
+++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -255,6 +255,7 @@
 <translation id="8179874765710681175">Installige Chrome oma telefoni. Saadame teie telefoni SMS-i.</translation>
 <translation id="8183957050892517584">Chrome salvestab turvaliselt teie isiklikud andmed, et te ei peaks neid uuesti sisestama.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS taaskäivitatakse kohe}=1{Chrome OS taaskäivitatakse 1 sekundi pärast}other{Chrome OS taaskäivitatakse # sekundi pärast}}</translation>
+<translation id="825412236959742607">Chrome eemaldas osa sisust, kuna leht kasutab liiga palju mälu.</translation>
 <translation id="8255190535488645436">Google Chrome kasutab kaamerat ja mikrofoni.</translation>
 <translation id="8286862437124483331">Google Chrome proovib kuvada paroole. Selle lubamiseks sisestage Windowsi parool.</translation>
 <translation id="8290100596633877290">Tohoh! Google Chrome jooksis kokku. Kas soovite kohe taaskäivitada?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb
index 4fd9a4a..6830eee 100644
--- a/chrome/app/resources/google_chrome_strings_fa.xtb
+++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -252,6 +252,7 @@
 <translation id="8179874765710681175">‏Chrome را روی تلفنتان نصب کنید. پیامکی به تلفن شما خواهیم فرستاد.</translation>
 <translation id="8183957050892517584">‏Chrome به‌طور امن جزئیات شخصی‌تان را ذخیره خواهد کرد تا نیازی نباشد دوباره آن‌ها را تایپ کنید.</translation>
 <translation id="8226081633851087288">{0,plural, =0{‏سیستم‌عامل Chrome اکنون بازراه‌اندازی می‌شود}=1{‏سیستم‌عامل Chrome ‏۱ ثانیه دیگر بازراه‌اندازی می‌شود}one{‏سیستم‌عامل Chrome # ثانیه دیگر بازراه‌اندازی می‌شود}other{‏سیستم‌عامل Chrome # ثانیه دیگر بازراه‌اندازی می‌شود}}</translation>
+<translation id="825412236959742607">‏این صفحه حافظه خیلی زیادی استفاده می‌کند، به‌همین‌دلیل Chrome برخی از محتوا را پاک کرد.</translation>
 <translation id="8255190535488645436">‏Google Chrome درحال استفاده از دوربین و میکروفون شما است.</translation>
 <translation id="8286862437124483331">‏Google Chrome در حال تلاش برای نشان دادن گذرواژه‌هاست. برای اجازه به این کار، گذرواژه Windows خود را تایپ کنید.</translation>
 <translation id="8290100596633877290">‏اوه! Google Chrome با اشکال مواجه شده است. دوباره راه‌اندازی شود؟</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb
index c415efd..40e89e4 100644
--- a/chrome/app/resources/google_chrome_strings_fi.xtb
+++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -252,6 +252,7 @@
 <translation id="8179874765710681175">Asenna Chrome puhelimeesi. Lähetämme tekstiviestin puhelimeen.</translation>
 <translation id="8183957050892517584">Chrome tallentaa tietosi turvalliseen paikkaan, jottei sinun tarvitse kirjoittaa tietoja uudelleen.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS käynnistetään uudelleen nyt}=1{Chrome OS käynnistetään uudelleen 1 sekunnin kuluttua}other{Chrome OS käynnistetään uudelleen # sekunnin kuluttua}}</translation>
+<translation id="825412236959742607">Tämä sivu käyttää liikaa muistia, joten Chrome poisti osan sisällöstä.</translation>
 <translation id="8255190535488645436">Google Chrome käyttää kameraasi ja mikrofoniasi.</translation>
 <translation id="8286862437124483331">Google Chrome yrittää näyttää salasanoja. Salli tämä kirjoittamalla Windows-salasanasi.</translation>
 <translation id="8290100596633877290">Hups! Google Chrome kaatui. Käynnistetäänkö uudelleen?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 83e4708..6af3849 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">I-install ang Chrome sa iyong telepono. Magpapadala kami ng SMS sa telepono mo.</translation>
 <translation id="8183957050892517584">Secure na iiimbak ng Chrome ang iyong mga personal na detalye nang sa gayon ay hindi mo na kailangang i-type muli ang mga ito.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Magre-restart na ang Chrome OS}=1{Magre-restart ang Chrome OS sa loob ng 1 segundo}one{Magre-restart ang Chrome OS sa loob ng # segundo}other{Magre-restart ang Chrome OS sa loob ng # na segundo}}</translation>
+<translation id="825412236959742607">Masyadong malaki ang ginagamit na memory ng page na ito kaya inalis ng Chrome ang ilang content.</translation>
 <translation id="8255190535488645436">Ginagamit ng Google Chrome ang iyong camera at mikropono.</translation>
 <translation id="8286862437124483331">Sinusubukan ng Google Chrome na ipakita ang mga password. I-type ang iyong password sa Windows upang payagan ito.</translation>
 <translation id="8290100596633877290">Whoa! Nag-crash ang Google Chrome. Ilunsad muli ngayon?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb
index 1c017d6..c1db39ea 100644
--- a/chrome/app/resources/google_chrome_strings_fr.xtb
+++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -152,7 +152,7 @@
 <translation id="4891791193823137474">Laisser Google Chrome s'exécuter en arrière-plan</translation>
 <translation id="4895437082222824641">Ouvrir le lien dans un nouvel ongle&amp;t Chrome</translation>
 <translation id="4921569541910214635">Vous partagez un ordinateur ? Vous pouvez désormais configurer Chrome selon vos besoins.</translation>
-<translation id="4945319281866068441">{0,plural, =1{Redémarrer Chrome OS d'ici un jour}one{Redémarrer Chrome OS d'ici # jour}other{Rdémarrer Chrome OS d'ici # jours}}</translation>
+<translation id="4945319281866068441">{0,plural, =1{Redémarrer Chrome OS d'ici un jour}one{Redémarrer Chrome OS d'ici # jour}other{Redémarrer Chrome OS d'ici # jours}}</translation>
 <translation id="4953650215774548573">Définir Google Chrome en tant que navigateur par défaut</translation>
 <translation id="495931528404527476">Dans Chrome</translation>
 <translation id="4990567037958725628">Google Chrome Canary</translation>
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Installez Chrome sur votre téléphone. Vous y recevrez un SMS.</translation>
 <translation id="8183957050892517584">Chrome va stocker les informations personnelles vous concernant de manière sécurisée. Ainsi, vous n'aurez pas besoin de les saisir à nouveau.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS va redémarrer maintenant}=1{Chrome OS va redémarrer dans 1 seconde}one{Chrome OS va redémarrer dans # seconde}other{Chrome OS va redémarrer dans # secondes}}</translation>
+<translation id="825412236959742607">Cette page utilise trop de mémoire, Chrome a donc supprimé du contenu.</translation>
 <translation id="8255190535488645436">Votre webcam et votre micro sont en cours d'utilisation dans Google Chrome.</translation>
 <translation id="8286862437124483331">Google Chrome tente d'afficher les mots de passe. Pour autoriser cette action, saisissez votre mot de passe Windows.</translation>
 <translation id="8290100596633877290">Google Chrome est bloqué. Voulez-vous le relancer maintenant ?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb
index 4efc5db..16ee50b 100644
--- a/chrome/app/resources/google_chrome_strings_gu.xtb
+++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">તમારા ફોન પર Chrome ઇન્સ્ટૉલ કરો. અમે તમારા ફોન પર એક SMS મોકલીશું.</translation>
 <translation id="8183957050892517584">Chrome તમારી વ્યક્તિગત માહિતીને સુરક્ષિત રીતે સંગ્રહિત કરશે જેથી તમારે તેમને ફરીથી ટાઇપ કરવાની જરૂર નથી.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS હવે ફરી શરૂ થશે}=1{Chrome OS 1 સેકન્ડમાં ફરી શરૂ થશે}one{Chrome OS # સેકન્ડમાં ફરી શરૂ થશે}other{Chrome OS # સેકન્ડમાં ફરી શરૂ થશે}}</translation>
+<translation id="825412236959742607">આ પેજ મેમરીનો બહુ ઉપયોગ કરે છે, તેથી Chromeએ કેટલુંક કન્ટેન્ટ કાઢી નાખ્યું છે.</translation>
 <translation id="8255190535488645436">Google Chrome તમારા કેમેરા અને માઇક્રોફોનનો ઉપયોગ કરી રહ્યું છે.</translation>
 <translation id="8286862437124483331">Google Chrome પાસવર્ડ્સ બતાવવાનો પ્રયાસ કરી રહ્યું છે. આની મંજૂરી આપવા માટે તમારો Windows પાસવર્ડ લખો.</translation>
 <translation id="8290100596633877290">ઓહ! Google Chrome ક્રેશ થઈ ગયું. હમણાં ફરીથી લોંચ કરીએ?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index 228167e..f7d8859 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -255,11 +255,12 @@
 <translation id="8179874765710681175">अपने फ़ोन पर Chrome इंस्टॉल करें. हम आपके फ़ोन पर एक मैसेज (एसएमएस) भेजेंगे.</translation>
 <translation id="8183957050892517584">Chrome आपके व्यक्तिगत विवरण को सुरक्षित रूप से संग्रहित करेगा, इसलिए आपको इन्हें पुनः लिखने की आवश्यकता नहीं है.</translation>
 <translation id="8226081633851087288">{0,plural, =0{अब Chrome OS रीस्टार्ट होगा}=1{Chrome OS एक सेकंड में रीस्टार्ट होगा}one{Chrome OS # सेकंड में रीस्टार्ट होगा}other{Chrome OS # सेकंड में रीस्टार्ट होगा}}</translation>
+<translation id="825412236959742607">यह पेज बहुत ज़्यादा मेमोरी का इस्तेमाल करता है, इसलिए Chrome ने कुछ सामग्री हटा दी है.</translation>
 <translation id="8255190535488645436">Google Chrome आपके कैमरे और माइक्रोफ़ोन का उपयोग कर रहा है.</translation>
 <translation id="8286862437124483331">Google Chrome पासवर्ड दिखाने का प्रयास कर रहा है. इसकी अनुमति देने के लिए अपना Windows पासवर्ड लिखें.</translation>
 <translation id="8290100596633877290">रुकिए! Google Chrome क्रैश हो गया है. अभी पुन: लॉन्च करें?</translation>
 <translation id="8342675569599923794">यह फ़ाइल खतरनाक है, इसलिए Chrome ने इसे अवरुद्ध कर दिया है.</translation>
-<translation id="8380166467911888159">स्पेलिंग की गड़बड़ियां ठीक करने के लिए, Chrome लेख फ़ील्ड में आपके लिखे गए लेख को Google को भेजती है</translation>
+<translation id="8380166467911888159">स्पेलिंग की गड़बड़ियां ठीक करने के लिए, Chrome लेख फ़ील्ड में आपके लिखे गए लेख को Google को भेजता है</translation>
 <translation id="840084489713044809">Google Chrome आपके पासवर्ड निर्यात करना चाहता है.</translation>
 <translation id="8406086379114794905">Chrome को बेहतर बनाने में सहायता करें</translation>
 <translation id="8455999171311319804">वैकल्पिक: Google को गड़बड़ी और उपयोग का डेटा अपने आप भेजकर Chrome OS को बेहतर बनाने में सहायता करें.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb
index 38686063a..ecadd64 100644
--- a/chrome/app/resources/google_chrome_strings_hr.xtb
+++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Instalirajte Chrome na telefon. Poslat ćemo vam SMS na telefon.</translation>
 <translation id="8183957050892517584">Chrome će pohraniti vaše osobne podatke na siguran način tako da ih ne morate ponovo upisivati.</translation>
 <translation id="8226081633851087288">{0,plural, =0{OS Chrome sada će se ponovo pokrenuti}=1{OS Chrome ponovo će se pokrenuti za 1 sekundu}one{OS Chrome ponovo će se pokrenuti za # sekundu}few{OS Chrome ponovo će se pokrenuti za # sekunde}other{OS Chrome ponovo će se pokrenuti za # sekundi}}</translation>
+<translation id="825412236959742607">Ova stranica upotrebljava previše memorije, pa je Chrome uklonio neki sadržaj.</translation>
 <translation id="8255190535488645436">Google Chrome upotrebljava vašu kameru i mikrofon.</translation>
 <translation id="8286862437124483331">Google Chrome pokušava prikazati zaporke. Upišite svoju zaporku za Windows da biste to dopustili.</translation>
 <translation id="8290100596633877290">Opa! Google Chrome je pao. Ponovo pokrenuti sada?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb
index 4d09294..88504096 100644
--- a/chrome/app/resources/google_chrome_strings_hu.xtb
+++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Telepítse a Chrome-ot telefonjára. SMS-t küldünk majd a telefonra.</translation>
 <translation id="8183957050892517584">A Chrome biztonságosan tárolja a személyes adatait, így nem kell újra begépelnie őket.</translation>
 <translation id="8226081633851087288">{0,plural, =0{A Chrome OS most újraindul}=1{A Chrome OS 1 másodpercen belül újraindul}other{A Chrome OS # másodpercen belül újraindul}}</translation>
+<translation id="825412236959742607">Ez az oldal túl sok memóriát használ, ezért a Chrome eltávolított egyes tartalmakat.</translation>
 <translation id="8255190535488645436">A Google Chrome használja a kamerát és a mikrofont.</translation>
 <translation id="8286862437124483331">A Google Chrome megkísérli megjeleníteni a jelszavakat. Ennek engedélyezéséhez írja be Windows-jelszavát.</translation>
 <translation id="8290100596633877290">Hmm. A Google Chrome összeomlott. Újraindítja most?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb
index 28da3198..8704d441 100644
--- a/chrome/app/resources/google_chrome_strings_id.xtb
+++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Instal Chrome di ponsel. Kami akan mengirimkan SMS ke ponsel Anda.</translation>
 <translation id="8183957050892517584">Chrome akan meyimpan informasi pribadi Anda dengan aman sehingga Anda tidak perlu mengetiknya lagi.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS akan dimulai ulang sekarang}=1{Chrome OS akan dimulai ulang dalam 1 detik}other{Chrome OS akan dimulai ulang dalam # detik}}</translation>
+<translation id="825412236959742607">Halaman ini menggunakan terlalu banyak memori, sehingga Chrome menghapus sebagian konten.</translation>
 <translation id="8255190535488645436">Google Chrome menggunakan kamera dan mikrofon Anda.</translation>
 <translation id="8286862437124483331">Google Chrome mencoba menampilkan sandi. Ketik sandi Windows Anda untuk mengizinkannya.</translation>
 <translation id="8290100596633877290">Aduh! Google Chrome ngadat. Luncurkan ulang sekarang?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb
index cad2948..fc7490c 100644
--- a/chrome/app/resources/google_chrome_strings_it.xtb
+++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -252,6 +252,7 @@
 <translation id="8179874765710681175">Installa Chrome sul telefono. Invieremo un SMS al tuo telefono.</translation>
 <translation id="8183957050892517584">Chrome memorizzerà in sicurezza i tuoi dati personali affinché tu non debba digitarli di nuovo.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS verrà riavviato ora}=1{Chrome OS verrà riavviato tra un secondo}other{Chrome OS verrà riavviato tra # secondi}}</translation>
+<translation id="825412236959742607">Questa pagina utilizza troppa memoria, pertanto Chrome ha rimosso alcuni contenuti.</translation>
 <translation id="8255190535488645436">Google Chrome sta utilizzando videocamera e microfono.</translation>
 <translation id="8286862437124483331">Google Chrome sta cercando di visualizzare le password. Per consentire la visualizzazione, digita la tua password Windows.</translation>
 <translation id="8290100596633877290">Spiacenti, si è verificato un arresto anomalo di Google Chrome. Riavviarlo ora?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb
index 6cfe1119..35bfe567 100644
--- a/chrome/app/resources/google_chrome_strings_iw.xtb
+++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -13,7 +13,7 @@
 <translation id="123620459398936149">‏מערכת ההפעלה של Chrome לא הצליחה לסנכרן את הנתונים שלך. עדכן את משפט הסיסמה שלך לסנכרון.</translation>
 <translation id="127345590676626841">‏Chrome מתעדכן באופן אוטומטי, כך שתמיד ברשותך הגרסה העדכנית ביותר. כשההורדה תסתיים, Chrome יופעל מחדש ותוכל להמשיך.</translation>
 <translation id="1302523850133262269">‏המתן בזמן ש-Chrome מתקין את עדכוני המערכת האחרונים.</translation>
-<translation id="1312676208694947750">{0,plural, =0{‏יש עדכון זמין של Chrome OS}=1{‏יש עדכון זמין של Chrome OS}two{‏עדכון של Chrome OS זמין כבר יומיים}many{‏עדכון של Chrome OS זמין כבר # ימים}other{‏עדכון של Chrome OS זמין כבר # ימים}}</translation>
+<translation id="1312676208694947750">{0,plural, =0{‏יש עדכון ל-Chrome OS}=1{‏יש עדכון ל-Chrome OS}two{‏עדכון של Chrome OS זמין כבר יומיים}many{‏עדכון של Chrome OS זמין כבר # ימים}other{‏עדכון של Chrome OS זמין כבר # ימים}}</translation>
 <translation id="137466361146087520">‏גרסת הביטא של Google Chrome</translation>
 <translation id="1393853151966637042">‏קבלת עזרה לשימוש ב-Chrome</translation>
 <translation id="1399397803214730675">‏במחשב זה מותקנת כבר גירסה עדכנית יותר של Google Chrome. אם התוכנה אינה פועלת, הסר את ההתקנה של Google Chrome ונסה שוב.</translation>
@@ -164,7 +164,7 @@
 <translation id="532046782124376502">‏אזהרה: Google Chrome לא יכול למנוע מתוספים לתעד את היסטוריית הגלישה שלך. כדי להשבית את התוסף הזה במצב גלישה בסתר, יש לבטל את האפשרות הזו.</translation>
 <translation id="5386244825306882791">‏הגדרה זו גם קובעת איזה דף מוצג כשאתה מפעיל את Chrome או מבצע חיפוש  מסרגל הכתובות.</translation>
 <translation id="5430073640787465221">‏קובץ ההעדפות שלך פגום או לא חוקי. Google Chrome לא יכול לשחזר את ההגדרות שלך.</translation>
-<translation id="5483595757826856374">{0,plural, =0{‏Chrome יופעל מחדש עכשיו}=1{‏Chrome יופעל מחדש בעוד שנייה}two{‏Chrome יופעל מחדש בעוד 2 שניות}many{‏Chrome יופעל מחדש בעוד # שניות}other{‏Chrome יופעל מחדש בעוד # שניות}}</translation>
+<translation id="5483595757826856374">{0,plural, =0{‏Chrome יופעל מחדש עכשיו}=1{‏Chrome יופעל מחדש בעוד שנייה}two{‏Chrome יופעל מחדש בעוד שתי שניות}many{‏Chrome יופעל מחדש בעוד # שניות}other{‏Chrome יופעל מחדש בעוד # שניות}}</translation>
 <translation id="5514308096618405748">‏הפיתוח של Chrome OS אפשרי בזכות <ph name="BEGIN_LINK_CROS_OSS" />תוכנות קוד פתוח<ph name="END_LINK_CROS_OSS" /> נוספות, כמו Linux (בטא).</translation>
 <translation id="556024056938947818">‏Google Chrome מנסה להציג סיסמאות.</translation>
 <translation id="5566025111015594046">‏Google Chrome‏ (mDNS-In)</translation>
@@ -203,7 +203,7 @@
 <translation id="683440813066116847">‏כלל נכנס עבור הגרסה הניסיונית של Google Chrome על מנת לאפשר תנועת mDNS.</translation>
 <translation id="686561893457936865">‏לוקחים את Chrome לכל מקום</translation>
 <translation id="6885412569789873916">‏אפליקציות לגרסת הביטא של Chrome</translation>
-<translation id="6964107240822114422">{0,plural, =0{‏יש עדכון זמין של Chrome}=1{‏יש עדכון זמין של Chrome}two{‏עדכון של Chrome זמין כבר יומיים}many{‏עדכון של Chrome זמין כבר # ימים}other{‏עדכון של Chrome זמין כבר # ימים}}</translation>
+<translation id="6964107240822114422">{0,plural, =0{‏יש עדכון ל-Chrome}=1{‏יש עדכון ל-Chrome}two{‏עדכון של Chrome זמין כבר יומיים}many{‏עדכון של Chrome זמין כבר # ימים}other{‏עדכון של Chrome זמין כבר # ימים}}</translation>
 <translation id="6967962315388095737">‏כלל נכנס לגרסת הביטא של Google Chrome כדי לאפשר תנועת mDNS.</translation>
 <translation id="6970811910055250180">מעדכן את המכשיר שלך...</translation>
 <translation id="6982337800632491844">‏<ph name="DOMAIN" /> דורש שתקרא ותקבל את התנאים וההגבלות הבאים לפני שתשתמש במכשיר הזה. תנאים אלה אינם מרחיבים, משנים או מגבילים את התנאים לשימוש במערכת ההפעלה של Google Chrome.</translation>
@@ -224,7 +224,7 @@
 <translation id="7486227612705979895">‏Chrome ייגש ל-Drive שלך כדי להציג הצעות בסרגל הכתובות</translation>
 <translation id="7535429826459677826">‏גרסת הפיתוח של Google Chrome</translation>
 <translation id="7552219221109926349">‏הצג את מערכת ההפעלה של Chrome בשפה זו</translation>
-<translation id="7561940363513215021">{0,plural, =1{‏Chrome יופעל מחדש בעוד דקה}two{‏Chrome יופעל מחדש בעוד 2 דקות}many{‏Chrome יופעל מחדש בעוד # דקות}other{‏Chrome יופעל מחדש בעוד # דקות}}</translation>
+<translation id="7561940363513215021">{0,plural, =1{‏Chrome יופעל מחדש בעוד דקה}two{‏Chrome יופעל מחדש בעוד שתי דקות}many{‏Chrome יופעל מחדש בעוד # דקות}other{‏Chrome יופעל מחדש בעוד # דקות}}</translation>
 <translation id="7589360514048265910">‏המחשב הזה יפסיק לקבל עדכונים של Google Chrome כי כבר אין תמיכה בגירסה 10.9 של Mac OS X.</translation>
 <translation id="7592736734348559088">‏Google Chrome לא הצליח לסנכרן את הנתונים שלך מפני שפרטי הכניסה של חשבונך אינם מעודכנים.</translation>
 <translation id="7626032353295482388">‏ברוכים הבאים ל-Chrome</translation>
@@ -250,7 +250,8 @@
 <translation id="8129812357326543296">‏מידע על Google Chrome&amp;</translation>
 <translation id="8179874765710681175">‏התקן את Chrome בטלפון שלך, ונשלח אליו הודעת SMS.</translation>
 <translation id="8183957050892517584">‏Chrome יאחסן את הפרטים האישיים שלך באופן מאובטח כדי שלא תידרש להקליד אותם שוב.</translation>
-<translation id="8226081633851087288">{0,plural, =0{‏Chrome OS תופעל מחדש עכשיו}=1{‏Chrome OS תופעל מחדש בעוד שנייה אחת}two{‏Chrome OS תופעל מחדש בעוד 2 שניות}many{‏Chrome OS תופעל מחדש בעוד # שניות}other{‏Chrome OS תופעל מחדש בעוד # שניות}}</translation>
+<translation id="8226081633851087288">{0,plural, =0{‏Chrome OS תופעל מחדש עכשיו}=1{‏Chrome OS תופעל מחדש בעוד שנייה אחת}two{‏Chrome OS תופעל מחדש בעוד שתי שניות}many{‏Chrome OS תופעל מחדש בעוד # שניות}other{‏Chrome OS תופעל מחדש בעוד # שניות}}</translation>
+<translation id="825412236959742607">‏הדף הזה משתמש בנפח זיכרון גדול מידי, לכן מערכת Chrome הסירה חלק מהתוכן.</translation>
 <translation id="8255190535488645436">‏Google Chrome משתמש במצלמה ובמיקרופון שלך.</translation>
 <translation id="8286862437124483331">‏Google Chrome מנסה להציג סיסמאות. הקלד את הסיסמה שלך ל-Windows כדי לאפשר זאת.</translation>
 <translation id="8290100596633877290">‏אופס! Google Chrome קרס. להפעיל מחדש עכשיו?</translation>
@@ -273,7 +274,7 @@
 <translation id="870251953148363156">‏עדכן את Google Chrome&amp;</translation>
 <translation id="873133009373065397">‏Google Chrome אינו יכול לקבוע או להגדיר את דפדפן ברירת המחדל</translation>
 <translation id="8736674169840206667">‏לפי דרישת מנהל המערכת, יש להפעיל מחדש את Chrome כדי להחיל עדכון</translation>
-<translation id="8791470158600044404">{0,plural, =1{‏Chrome OS תופעל מחדש בעוד דקה אחת}two{‏Chrome OS תופעל מחדש בעוד 2 דקות}many{‏Chrome OS תופעל מחדש בעוד # דקות}other{‏Chrome OS תופעל מחדש בעוד # דקות}}</translation>
+<translation id="8791470158600044404">{0,plural, =1{‏Chrome OS תופעל מחדש בעוד דקה אחת}two{‏Chrome OS תופעל מחדש בעוד שתי דקות}many{‏Chrome OS תופעל מחדש בעוד # דקות}other{‏Chrome OS תופעל מחדש בעוד # דקות}}</translation>
 <translation id="8796108026289707191">‏עליך לאתחל את Google Chrome עכשיו.</translation>
 <translation id="8823341990149967727">‏Chrome אינו מעודכן</translation>
 <translation id="884296878221830158">‏הגדרה זו גם קובעת איזה דף מוצג כשאתה מפעיל את Chrome או לוחץ על הלחצן 'דף הבית'.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb
index fd42c71d..2e6f30c 100644
--- a/chrome/app/resources/google_chrome_strings_ja.xtb
+++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Chrome をスマートフォンにインストールしませんか。Google よりスマートフォンに SMS をお送りします。</translation>
 <translation id="8183957050892517584">Chrome でユーザーの情報が安全に保存されるので、再度入力する必要がなくなります。</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS は今すぐ再起動されます}=1{Chrome OS は 1 秒後に再起動されます}other{Chrome OS は # 秒後に再起動されます}}</translation>
+<translation id="825412236959742607">このページは大量のメモリを使用しているため、Chrome により一部のコンテンツが削除されました。</translation>
 <translation id="8255190535488645436">Google Chrome がカメラとマイクを使用しています。</translation>
 <translation id="8286862437124483331">Google Chrome でパスワードを表示しようとしています。続行するには、Windows のパスワードを入力してください。</translation>
 <translation id="8290100596633877290">エラー: Google Chrome で問題が発生しました。今すぐ再起動しますか?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb
index 59c9152..efd8b3f 100644
--- a/chrome/app/resources/google_chrome_strings_kn.xtb
+++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -50,7 +50,7 @@
 <translation id="216054706567564023">ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ Chrome ಅನ್ನು ಸ್ಥಾಪಿಸಿ. ನಿಮ್ಮ ಖಾತೆ ಮರುಪ್ರಾಪ್ತಿ ಫೋನ್ ಸಂಖ್ಯೆ‌ಗೆ ನಾವು ಎಸ್ಎಂಎಸ್ ಕಳುಹಿಸುತ್ತೇವೆ.</translation>
 <translation id="2246246234298806438">ಬಿಲ್ಟ್ ಇನ್ PDF ವೀಕ್ಷಣೆಯು ಕಾಣೆಯಾಗಿರುವಾಗ Google Chrome ಮುದ್ರಣ ಪೂರ್ವವೀಕ್ಷಣೆಯನ್ನು ತೋರಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="2252923619938421629">ಪ್ರಸ್ತುತ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ವರದಿ ಮಾಡುವುದರ ಮೂಲಕ Google Chrome ಅನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ಸಹಾಯಮಾಡಿ</translation>
-<translation id="225363235161345695">{0,plural, =1{ಒಂದು ಗಂಟೆಯಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{ # ಗಂಟೆಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{ # ಗಂಟೆಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
+<translation id="225363235161345695">{0,plural, =1{ಒಂದು ಗಂಟೆಯಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಗಂಟೆಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಗಂಟೆಗಳಲ್ಲಿ Chrome ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
 <translation id="2286950485307333924">ನೀವು ಇದೀಗ Chrome ಗೆ ಸೈನ್‌ ಇನ್‌ ಆಗಿರುವಿರಿ</translation>
 <translation id="2290014774651636340">Google API ಕೀಗಳು ಕಾಣೆಯಾಗಿವೆ. Google Chrome ನ ಕೆಲವು ಕಾರ್ಯವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="2290095356545025170">ನೀವು ಖಚಿತವಾಗಿ Google Chrome ಸ್ಥಾಪನೆಯನ್ನು ತೆಗೆಯಲು ಬಯಸುತ್ತೀರಾ?</translation>
@@ -252,7 +252,8 @@
 <translation id="8129812357326543296">&amp;Google Chrome ಕುರಿತು</translation>
 <translation id="8179874765710681175">ನಿಮ್ಮ ಫೋನ್‌ನಲ್ಲಿ Chrome ಅನ್ನು ಸ್ಥಾಪಿಸಿ. ನಿಮ್ಮ ಫೋನ್‌‌ಗೆ ನಾವು ಎಸ್ಎಂಎಸ್ ಕಳುಹಿಸುತ್ತೇವೆ.</translation>
 <translation id="8183957050892517584">Chrome ನಿಮ್ಮ ವೈಯಕ್ತಿಕ ವಿವರಗಳನ್ನು ಸುರಕ್ಷಿತವಾಗಿ ಸಂಗ್ರಹಿಸಿಕೊಳ್ಳುತ್ತದೆ ಇದರಿಂದಾಗಿ ನೀವು ಅವುಗಳನ್ನು ಮತ್ತೆ ಟೈಪ್ ಮಾಡಬೇಕಾಗಿಲ್ಲ.</translation>
-<translation id="8226081633851087288">{0,plural, =0{ ಇದೀಗ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}=1{1 ಸೆಕೆಂಡ್‌ನಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
+<translation id="8226081633851087288">{0,plural, =0{ಇದೀಗ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}=1{1 ಸೆಕೆಂಡ್‌ನಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಸೆಕೆಂಡುಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
+<translation id="825412236959742607">ಈ ಪುಟವು ತೀರಾ ಹೆಚ್ಚು ಮೆಮೊರಿಯನ್ನು ಬಳಸುತ್ತದೆ, ಆದ್ದರಿಂದ Chrome ಕೆಲವು ವಿಷಯಗಳನ್ನು ತೆಗೆದುಹಾಕಿದೆ.</translation>
 <translation id="8255190535488645436">Google Chrome ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್ ಅನ್ನು ಬಳಸುತ್ತಿದೆ.</translation>
 <translation id="8286862437124483331">Google Chrome ಪಾಸ್‌ವರ್ಡ್‌ಗಳನ್ನು ಪ್ರದರ್ಶಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದೆ. ಇದಕ್ಕೆ ಅನುಮತಿಸಲು ನಿಮ್ಮ Windows ಪಾಸ್‌ವರ್ಡ್‌ ಟೈಪ್ ಮಾಡಿ.</translation>
 <translation id="8290100596633877290">ಓಹ್! Google Chrome ಕ್ರ‍್ಯಾಶ್‌ ಆಗಿದೆ.ಇದೀಗ ಮರುಪ್ರಾರಂಭಿಸುವುದೆ?</translation>
@@ -285,7 +286,7 @@
 <translation id="9026991721384951619">ನಿಮ್ಮ ಖಾತೆಯ ಸೈನ್ ಇನ್ ವಿವರಗಳು ಹಳೆಯದಾಗಿರುವ ಕಾರಣ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸಿಂಕ್ ಮಾಡಲು Chrome OS ಗೆ ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ.</translation>
 <translation id="9067395829937117663">Google Chrome ಗೆ Windows 7 ಅಥವಾ ಹೆಚ್ಚಿನ ಆವೃತ್ತಿಯು ಅಗತ್ಯವಿರುತ್ತದೆ.</translation>
 <translation id="9084668267983921457">ದೃಢೀಕರಣ ಪ್ರಮಾಣಪತ್ರವು ವಿಫಲವಾಗಿದೆ. ಹೆಚ್ಚಿನ ಮಾಹಿತಿಗಾಗಿ ಪುನಃ Google Chrome ಗೆ ಸೈನ್‌ ಇನ್‌ ಮಾಡಿ ಅಥವಾ ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ. <ph name="ADDITIONAL_EXPLANATION" /></translation>
-<translation id="909149346112452267">{0,plural, =1{ಒಂದು ಗಂಟೆಯಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{ # ಗಂಟೆಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{ # ಗಂಟೆಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
+<translation id="909149346112452267">{0,plural, =1{ಒಂದು ಗಂಟೆಯಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ಗಂಟೆಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ಗಂಟೆಗಳಲ್ಲಿ Chrome OS ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation>
 <translation id="911206726377975832">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಡೇಟಾವನ್ನು ಸಹ ಅಳಿಸುವುದೇ?</translation>
 <translation id="919706545465235479">ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು Chrome ಅಪ್‌ಡೇಟ್ ಮಾಡಿ</translation>
 <translation id="924447568950697217">Chrome ಅನ್ನು ನಿಮ್ಮ ಡಿಫಾಲ್ಟ್ ಬ್ರೌಸರ್ ಆಗಿಸಿ</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb
index 3bc64d8..8e0182f 100644
--- a/chrome/app/resources/google_chrome_strings_ko.xtb
+++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">휴대전화에 Chrome을 설치하세요. 휴대전화로 SMS를 보내 드리겠습니다.</translation>
 <translation id="8183957050892517584">Chrome은 개인정보를 안전하게 저장하므로 정보를 다시 입력할 필요가 없습니다.</translation>
 <translation id="8226081633851087288">{0,plural, =0{곧 Chrome OS 다시 시작}=1{1초 후에 Chrome OS 다시 시작}other{#초 후에 Chrome OS 다시 시작}}</translation>
+<translation id="825412236959742607">페이지에서 너무 많은 메모리를 사용하므로 Chrome에서 일부 콘텐츠를 삭제했습니다.</translation>
 <translation id="8255190535488645436">Chrome에서 카메라와 마이크를 사용 중입니다.</translation>
 <translation id="8286862437124483331">Chrome에서 비밀번호를 표시하려고 합니다. 허용하려면 Windows 비밀번호를 입력하세요.</translation>
 <translation id="8290100596633877290">Chrome이 다운되었습니다. 다시 시작하시겠습니까?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb
index 3cb42a3..0487903 100644
--- a/chrome/app/resources/google_chrome_strings_lt.xtb
+++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -174,7 +174,7 @@
 
 „Google Chrome“ negali atkurti nustatymų.</translation>
 <translation id="5483595757826856374">{0,plural, =0{„Chrome“ bus paleista iš naujo dabar}=1{„Chrome“ bus paleista iš naujo po 1 sekundės}one{„Chrome“ bus paleista iš naujo po # sekundės}few{„Chrome“ bus paleista iš naujo po # sekundžių}many{„Chrome“ bus paleista iš naujo po # sekundės}other{„Chrome“ bus paleista iš naujo po # sekundžių}}</translation>
-<translation id="5514308096618405748">„Chrome“ OS (kaip ir „Linux“ (beta vers.)) pasiekiama naudojant papildomą <ph name="BEGIN_LINK_CROS_OSS" />atvirojo šaltinio programinę įrangą<ph name="END_LINK_CROS_OSS" />.</translation>
+<translation id="5514308096618405748">„Chrome“ OS (kaip ir „Linux“ (beta vers.) pasiekiama naudojant papildomą <ph name="BEGIN_LINK_CROS_OSS" />atvirojo šaltinio programinę įrangą<ph name="END_LINK_CROS_OSS" />.</translation>
 <translation id="556024056938947818">„Google Chrome“ bando rodyti slaptažodžius.</translation>
 <translation id="5566025111015594046">„Google Chrome“ (mDNS-In)</translation>
 <translation id="565744775970812598">Failas „<ph name="FILE_NAME" />“ gali būti pavojingas, todėl „Chrome“ jį užblokavo.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb
index b7e51488..9dbe8ee 100644
--- a/chrome/app/resources/google_chrome_strings_lv.xtb
+++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -255,6 +255,7 @@
 <translation id="8179874765710681175">Instalējiet pārlūkprogrammu Chrome savā tālrunī. Mēs nosūtīsim īsziņu uz jūsu tālruņa numuru.</translation>
 <translation id="8183957050892517584">Chrome droši saglabās jūsu privāto informāciju, lai tā vairs nebūtu atkārtoti jāievada.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Operētājsistēma Chrome OS tiks restartēta tūlīt}=1{Operētājsistēma Chrome OS tiks restartēta pēc 1 sekundes}zero{Operētājsistēma Chrome OS tiks restartēta pēc # sekundēm}one{Operētājsistēma Chrome OS tiks restartēta pēc # sekundes}other{Operētājsistēma Chrome OS tiks restartēta pēc # sekundēm}}</translation>
+<translation id="825412236959742607">Šī lapa izmanto pārāk daudz atmiņas, tādēļ pārlūks Chrome noņēma daļu satura.</translation>
 <translation id="8255190535488645436">Pārlūkā Google Chrome tiek izmantota kamera un mikrofons.</translation>
 <translation id="8286862437124483331">Google Chrome mēģina rādīt paroles. Lai to atļautu, ierakstiet savu Windows paroli.</translation>
 <translation id="8290100596633877290">Eh! Google Chrome ir avarējis. Vai restartēt to tūlīt?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index c73e3a4..15b84ea 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">നിങ്ങളുടെ ഫോണിൽ Chrome ഇൻസ്‌റ്റാൾ ചെയ്യുക. ഫോണിലേക്ക് ഞങ്ങളൊരു SMS അയയ്‌ക്കും.</translation>
 <translation id="8183957050892517584">Chrome നിങ്ങളുടെ വ്യക്തിപരമായ വിശദാംശങ്ങൾ സുരക്ഷിതമായി സൂക്ഷിക്കുന്നതിനാൽ അവ വീണ്ടും ടൈപ്പുചെയ്യേണ്ടതില്ല.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS ഇപ്പോൾ പുനഃരാരംഭിക്കും}=1{Chrome OS ഒരു സെക്കൻഡിൽ പുനഃരാരംഭിക്കും}other{Chrome OS # സെക്കൻഡിൽ പുനഃരാരംഭിക്കും}}</translation>
+<translation id="825412236959742607">ഈ പേജ് കൂടുതൽ മെമ്മറി ഉപയോഗിക്കുന്നു, അതിനാൽ Chrome കുറച്ച് ഉള്ളടക്കം നീക്കം ചെയ്‌തു.</translation>
 <translation id="8255190535488645436">Google Chrome നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു.</translation>
 <translation id="8286862437124483331">Google Chrome പാസ്‌വേഡുകൾ ദൃശ്യമാക്കാൻ ശ്രമിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്‌വേഡ് ടൈപ്പുചെയ്യുക.</translation>
 <translation id="8290100596633877290">ഓ! Google Chrome ക്രാഷുചെയ്തു. ഇപ്പോള്‍ വീണ്ടും സമാരംഭിക്കണോ?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb
index 861f199..34a0355 100644
--- a/chrome/app/resources/google_chrome_strings_ms.xtb
+++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Pasang Chrome pada telefon anda. Kami akan menghantar SMS ke telefon anda.</translation>
 <translation id="8183957050892517584">Chrome akan menyimpan butiran peribadi anda dengan selamat supaya anda tidak perlu menaipnya semula.</translation>
 <translation id="8226081633851087288">{0,plural, =0{OS Chrome akan dimulakan semula sekarang}=1{OS Chrome akan dimulakan semula dalam masa sesaat}other{OS Chrome akan dimulakan semula dalam masa # saat}}</translation>
+<translation id="825412236959742607">Halaman ini menggunakan terlalu banyak memori, jadi Chrome mengalih keluar sesetengah kandungan.</translation>
 <translation id="8255190535488645436">Google Chrome menggunakan kamera dan mikrofon anda.</translation>
 <translation id="8286862437124483331">Google Chrome cuba menunjukkan kata laluan. Taip kata laluan Windows anda untuk membenarkannya.</translation>
 <translation id="8290100596633877290">Alamak! Google Chrome mengalami ranap sistem. Lancarkan semula sekarang?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb
index 22be139..5466587 100644
--- a/chrome/app/resources/google_chrome_strings_nl.xtb
+++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -257,6 +257,7 @@
 <translation id="8179874765710681175">Installeer Chrome op je telefoon. We sturen een sms naar je telefoon.</translation>
 <translation id="8183957050892517584">Chrome slaat je persoonlijke gegevens beveiligd op, zodat je ze niet opnieuw hoeft op te geven.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS wordt nu opnieuw opgestart}=1{Chrome OS wordt over één seconde opnieuw opgestart}other{Chrome OS wordt over # seconden opnieuw opgestart}}</translation>
+<translation id="825412236959742607">Omdat deze pagina te veel geheugen gebruikt, heeft Chrome wat content verwijderd.</translation>
 <translation id="8255190535488645436">Google Chrome gebruikt je camera en microfoon.</translation>
 <translation id="8286862437124483331">Google Chrome probeert wachtwoorden weer te geven. Geef je Windows-wachtwoord op om dit toe te staan.</translation>
 <translation id="8290100596633877290">Oeps! Google Chrome is vastgelopen. Nu opnieuw starten?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index f1a19d8..2bb8e9f3 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -30,7 +30,7 @@
 <translation id="1682634494516646069">Google Chrome kan ikke lese og skrive til sin egen datakatalog: <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="1698376642261615901">Google Chrome er en nettleser som kjører nettsider og programmer i ekspressfart. Den er rask, stabil og enkel å bruke. Google Chrome har innebygd beskyttelse mot skadelig programvare og svindelforsøk (nettfisking), slik at du kan føle deg tryggere når du surfer på nettet.</translation>
 <translation id="1718131156967340976">Velg <ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" /></translation>
-<translation id="1734234790201236882">Chrome vil lagre passordet i Google-kontoen din, så du trenger ikke å huske det.</translation>
+<translation id="1734234790201236882">Chrome lagrer passordet i Google-kontoen din, så du trenger ikke å huske det.</translation>
 <translation id="174539241580958092">Google Chrome kunne ikke synkronisere dataene dine på grunn av en påloggingsfeil.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1773601347087397504">Få hjelp med å bruke Chrome OS</translation>
@@ -250,7 +250,8 @@
 <translation id="8129812357326543296">Om &amp;Google Chrome</translation>
 <translation id="8179874765710681175">Installer Chrome på telefonen din. Vi sender deg en SMS.</translation>
 <translation id="8183957050892517584">Chrome lagrer personopplysningene dine sikkert, slik at du slipper å skrive dem inn på nytt.</translation>
-<translation id="8226081633851087288">{0,plural, =0{Chrome OS vil nå starte på nytt}=1{Chrome OS vil starte på nytt om 1 sekund}other{Chrome OS vil starte på nytt om # sekunder}}</translation>
+<translation id="8226081633851087288">{0,plural, =0{Chrome OS starter nå på nytt}=1{Chrome OS starter på nytt om 1 sekund}other{Chrome OS starter på nytt om # sekunder}}</translation>
+<translation id="825412236959742607">Denne siden bruker for mye minne, så har Chrome fjernet noe av innholdet.</translation>
 <translation id="8255190535488645436">Google Chrome bruker kameraet og mikrofonen din.</translation>
 <translation id="8286862437124483331">Google Chrome forsøker å vise passord. Skriv inn Windows-passordet ditt for å tillate dette.</translation>
 <translation id="8290100596633877290">Google Chrome har fått et programstopp. Vil du starte på nytt nå?</translation>
@@ -273,7 +274,7 @@
 <translation id="870251953148363156">Oppdater &amp;Google Chrome</translation>
 <translation id="873133009373065397">Google Chrome kan ikke fastslå eller angi standardnettleseren</translation>
 <translation id="8736674169840206667">Administratoren din krever at du starter Chrome på nytt for at en oppdatering skal tas i bruk</translation>
-<translation id="8791470158600044404">{0,plural, =1{Chrome OS vil starte på nytt om 1 minutt}other{Chrome OS vil starte på nytt om # minutter}}</translation>
+<translation id="8791470158600044404">{0,plural, =1{Chrome OS startr på nytt om 1 minutt}other{Chrome OS starter på nytt om # minutter}}</translation>
 <translation id="8796108026289707191">Du bør starte Google Chrome på nytt nå.</translation>
 <translation id="8823341990149967727">Chrome er utdatert</translation>
 <translation id="884296878221830158">Den styrer også hvilken side som vises når du starter Chrome eller klikker på Startside-knappen.</translation>
@@ -282,7 +283,7 @@
 <translation id="9026991721384951619">Chrome OS kunne ikke synkronisere dataene fordi påloggingsopplysningene dine er foreldede.</translation>
 <translation id="9067395829937117663">Google Chrome krever Windows 7 eller nyere.</translation>
 <translation id="9084668267983921457">Autentiseringssertifikatet mislyktes. Logg på Google Chrome på nytt, eller kontakt administratoren din for å få mer informasjon. <ph name="ADDITIONAL_EXPLANATION" /></translation>
-<translation id="909149346112452267">{0,plural, =1{Chrome OS vil starte på nytt om én time}other{Chrome OS vil starte på nytt om # timer}}</translation>
+<translation id="909149346112452267">{0,plural, =1{Chrome OS starter på nytt om én time}other{Chrome OS starter på nytt om # timer}}</translation>
 <translation id="911206726377975832">Vil du slette all nettleserdata også?</translation>
 <translation id="919706545465235479">Oppdater Chrome for å starte synkroniseringen</translation>
 <translation id="924447568950697217">Bruk Chrome som standard nettleser</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb
index 793e9382..5fba82c 100644
--- a/chrome/app/resources/google_chrome_strings_pl.xtb
+++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -252,6 +252,7 @@
 <translation id="8179874765710681175">Zainstaluj Chrome na telefonie. Na Twój telefon wyślemy SMS-a.</translation>
 <translation id="8183957050892517584">Chrome będzie bezpiecznie przechowywać Twoje dane, dzięki czemu nie będzie trzeba wpisywać ich ponownie.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS uruchomi się ponownie teraz}=1{Chrome OS uruchomi się ponownie za 1 sekundę}few{Chrome OS uruchomi się ponownie za # sekundy}many{Chrome OS uruchomi się ponownie za # sekund}other{Chrome OS uruchomi się ponownie za # sekundy}}</translation>
+<translation id="825412236959742607">Ta strona używa zbyt dużo pamięci, dlatego Chrome usunął część jej zawartości.</translation>
 <translation id="8255190535488645436">Google Chrome używa Twojej kamery i mikrofonu.</translation>
 <translation id="8286862437124483331">Google Chrome próbuje pokazać hasła. Podaj swoje hasło do Windows, by na to zezwolić.</translation>
 <translation id="8290100596633877290">O kurczę! Przeglądarka Google Chrome uległa awarii. Uruchomić ją teraz ponownie?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
index 98b38fac..85f0274a 100644
--- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -252,6 +252,7 @@
 <translation id="8179874765710681175">Instale o Chrome no seu smartphone. Enviaremos um SMS para seu número.</translation>
 <translation id="8183957050892517584">O Chrome armazenará seus dados pessoais com segurança para que não seja necessário digitá-los novamente.</translation>
 <translation id="8226081633851087288">{0,plural, =0{O Chrome OS será reiniciado agora}=1{O Chrome OS será reiniciado em 1 segundo}one{O Chrome OS será reiniciado em # segundo}other{O Chrome OS será reiniciado em # segundos}}</translation>
+<translation id="825412236959742607">Como esta página usa muita memória, o Chrome removeu parte do conteúdo.</translation>
 <translation id="8255190535488645436">O Google Chrome está usando sua câmera e seu microfone.</translation>
 <translation id="8286862437124483331">O Google Chrome está tentando mostrar senhas. Digite sua senha do Windows para permitir isso.</translation>
 <translation id="8290100596633877290">Nossa! Houve uma falha no Google Chrome. Reiniciar agora?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
index b34799a..77933c4 100644
--- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb
+++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Instale o Chrome no telemóvel. Vamos enviar uma SMS para o seu telemóvel.</translation>
 <translation id="8183957050892517584">O Chrome armazena os seus detalhes pessoais em segurança para que não tenha de os introduzir novamente.</translation>
 <translation id="8226081633851087288">{0,plural, =0{O Chrome OS será reiniciado agora}=1{O Chrome OS será reiniciado dentro de 1 segundo}other{O Chrome OS será reiniciado dentro de # segundos}}</translation>
+<translation id="825412236959742607">Esta página utiliza demasiada memória, pelo que o Chrome removeu algum conteúdo.</translation>
 <translation id="8255190535488645436">O Google Chrome está a utilizar a câmara e o microfone.</translation>
 <translation id="8286862437124483331">O Google Chrome está a tentar mostrar palavras-passe. Escreva a sua palavra-passe do Windows para permitir esta ação.</translation>
 <translation id="8290100596633877290">Ups! O Google Chrome falhou. Reiniciar agora?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb
index 71c3d8ad..395a6ee9 100644
--- a/chrome/app/resources/google_chrome_strings_ro.xtb
+++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Instalează Chrome pe telefon. Vom trimite un SMS pe telefon.</translation>
 <translation id="8183957050892517584">Chrome va stoca în siguranță detaliile personale, pentru a nu fi necesar să le introduci din nou.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Sistemul de operare Chrome va reporni acum}=1{Sistemul de operare Chrome va reporni într-o secundă}few{Sistemul de operare Chrome va reporni în # secunde}other{Sistemul de operare Chrome va reporni în # de secunde}}</translation>
+<translation id="825412236959742607">Această pagină folosește prea multă memorie, prin urmare Chrome a eliminat o parte din conținut.</translation>
 <translation id="8255190535488645436">Google Chrome utilizează camera foto și microfonul.</translation>
 <translation id="8286862437124483331">Google Chrome încearcă să afișeze parolele. Pentru a permite acest lucru, introduceți parola pentru Windows.</translation>
 <translation id="8290100596633877290">Hopa! Google Chrome s-a blocat. Repornești acum?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 5959e10..712797ee 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Установите Chrome на телефоне. Мы отправим вам SMS.</translation>
 <translation id="8183957050892517584">Chrome будет хранить ваши данные в защищенном виде, поэтому их не придется вводить повторно.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS перезапускается}=1{Chrome OS перезапустится через 1 секунду}one{Chrome OS перезапустится через # секунду}few{Chrome OS перезапустится через # секунды}many{Chrome OS перезапустится через # секунд}other{Chrome OS перезапустится через # секунды}}</translation>
+<translation id="825412236959742607">Эта страница расходовала слишком много памяти, поэтому часть контента была удалена.</translation>
 <translation id="8255190535488645436">Google Chrome использует камеру и микрофон.</translation>
 <translation id="8286862437124483331">Чтобы просмотреть пароли, введите пароль своего аккаунта Windows.</translation>
 <translation id="8290100596633877290">Произошел сбой Google Chrome. Перезапустить?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb
index 38dc077..f2daf71 100644
--- a/chrome/app/resources/google_chrome_strings_sk.xtb
+++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -171,7 +171,7 @@
 
 Prehliadač Google Chrome nedokáže obnoviť vaše nastavenia.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Chrome sa teraz reštartuje}=1{Chrome sa reštartuje o 1 sekundu}few{Chrome sa reštartuje o # sekundy}many{Chrome sa reštartuje o # sekundy}other{Chrome sa reštartuje o # sekúnd}}</translation>
-<translation id="5514308096618405748">Chrome OS mohol vzniknúť vďaka ďalšiemu <ph name="BEGIN_LINK_CROS_OSS" />softvéru open source<ph name="END_LINK_CROS_OSS" />, ako je Linux (Beta).</translation>
+<translation id="5514308096618405748">Chrome OS mohol vzniknúť vďaka ďalšiemu <ph name="BEGIN_LINK_CROS_OSS" />softvéru open source<ph name="END_LINK_CROS_OSS" />, ako je Linux (beta).</translation>
 <translation id="556024056938947818">Prehliadač Google Chrome sa snaží zobraziť heslá.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">Súbor <ph name="FILE_NAME" /> môže byť nebezpečný, a preto ho Chrome zablokoval.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb
index 6eb695b..36ec8568 100644
--- a/chrome/app/resources/google_chrome_strings_sl.xtb
+++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -173,7 +173,7 @@
 
 Google Chrome ne more obnoviti vaših nastavitev.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Chrome se bo zdaj znova zagnal}=1{Chrome se bo znova zagnal čez 1 sekundo}one{Chrome se bo znova zagnal čez # sekundo}two{Chrome se bo znova zagnal čez # sekundi}few{Chrome se bo znova zagnal čez # sekunde}other{Chrome se bo znova zagnal čez # sekund}}</translation>
-<translation id="5514308096618405748">OS Chrome omogoča dodatna <ph name="BEGIN_LINK_CROS_OSS" />odprtokodna programska oprema<ph name="END_LINK_CROS_OSS" />, kot je Linux (beta).</translation>
+<translation id="5514308096618405748">OS Chrome omogoča dodatna <ph name="BEGIN_LINK_CROS_OSS" />odprtokodna programska oprema<ph name="END_LINK_CROS_OSS" />, enako kot Linux (beta).</translation>
 <translation id="556024056938947818">Google Chrome poskuša prikazati gesla.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">Datoteka <ph name="FILE_NAME" /> je morda nevarna, zato jo je Chrome blokiral.</translation>
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Namestite Chrome v telefonu. V telefon vam bomo poslali SMS.</translation>
 <translation id="8183957050892517584">Chrome bo varno shranil vaše osebne podatke, tako da vam jih ne bo treba več vnesti.</translation>
 <translation id="8226081633851087288">{0,plural, =0{OS Chrome se bo zdaj znova zagnal}=1{OS Chrome se bo znova zagnal čez 1 sekundo}one{OS Chrome se bo znova zagnal čez # sekundo}two{OS Chrome se bo znova zagnal čez # sekundi}few{OS Chrome se bo znova zagnal čez # sekunde}other{OS Chrome se bo znova zagnal čez # sekund}}</translation>
+<translation id="825412236959742607">Ta stran uporablja preveč pomnilnika, zato je Chrome odstranil nekaj vsebine.</translation>
 <translation id="8255190535488645436">Google Chrome uporablja vašo kamero in mikrofon.</translation>
 <translation id="8286862437124483331">Google Chrome poskuša prikazati gesla. Če želite omogočiti to, vnesite geslo za Windows.</translation>
 <translation id="8290100596633877290">Opa! Google Chrome se je zrušil. Ga želite znova zagnati?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb
index 9fc4f54..95cf088 100644
--- a/chrome/app/resources/google_chrome_strings_sr.xtb
+++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -173,7 +173,7 @@
 
 Google Chrome не може да врати подешавања.</translation>
 <translation id="5483595757826856374">{0,plural, =0{Поново ћемо покренути Chrome}=1{Поново ћемо покренути Chrome за 1 секунду}one{Поново ћемо покренути Chrome за # секунду}few{Поново ћемо покренути Chrome за # секунде}other{Поново ћемо покренути Chrome за # секунди}}</translation>
-<translation id="5514308096618405748">Chrome ОС је омогућен захваљујући додатном <ph name="BEGIN_LINK_CROS_OSS" />софтверу са отвореним кодом<ph name="END_LINK_CROS_OSS" />, као и Linux (бета).</translation>
+<translation id="5514308096618405748">Chrome ОС је омогућен захваљујући додатном <ph name="BEGIN_LINK_CROS_OSS" />софтверу са отвореним кодом<ph name="END_LINK_CROS_OSS" />, као што је Linux (бета).</translation>
 <translation id="556024056938947818">Google Chrome покушава да прикаже лозинке.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">Датотека <ph name="FILE_NAME" /> је можда опасна, па ју је Chrome блокирао.</translation>
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Инсталирајте Chrome на телефону. Послаћемо вам SMS на телефон.</translation>
 <translation id="8183957050892517584">Chrome ће безбедно складиштити личне податке да не бисте морали поново да их уносите.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome ОС ће се рестартовати}=1{Chrome ОС ће се рестартовати за 1 секунду}one{Chrome ОС ће се рестартовати за # секунду}few{Chrome ОС ће се рестартовати за # секунде}other{Chrome ОС ће се рестартовати за # секунди}}</translation>
+<translation id="825412236959742607">Ова страница користи превише меморије, па је Chrome уклонио одређени садржај.</translation>
 <translation id="8255190535488645436">Google Chrome користи камеру и микрофон.</translation>
 <translation id="8286862437124483331">Google Chrome покушава да прикаже лозинке. Унесите лозинку за Windows да бисте то омогућили.</translation>
 <translation id="8290100596633877290">Опа! Google Chrome је отказао. Желите ли да га одмах поново покренете?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb
index 4b17197c..cf79ebb 100644
--- a/chrome/app/resources/google_chrome_strings_sv.xtb
+++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Installera Chrome på mobilen. Vi skickar ett sms till mobilen.</translation>
 <translation id="8183957050892517584">Chrome sparar dina personliga uppgifter på ett säkert sätt så att du inte behöver ange dem på nytt.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS startas om nu}=1{Om en sekund startas Chrome OS om}other{Om # sekunder startas Chrome OS om}}</translation>
+<translation id="825412236959742607">Den här sidan använder för mycket minne, så en del innehåll har tagits bort.</translation>
 <translation id="8255190535488645436">Google Chrome använder din kamera och mikrofon.</translation>
 <translation id="8286862437124483331">Skriv ditt Windows-lösenord om du vill tillåta att lösenord visas i Google Chrome.</translation>
 <translation id="8290100596633877290">Hoppsan! Google Chrome har kraschat. Vill du starta om nu?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb
index 772a512..5aa1ea9 100644
--- a/chrome/app/resources/google_chrome_strings_sw.xtb
+++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -259,6 +259,7 @@
 <translation id="8179874765710681175">Sakinisha Chrome kwenye simu yako. Tutakutumia SMS kwenye simu yako.</translation>
 <translation id="8183957050892517584">Chrome itahifadhi salama maelezo yako ya kibinafsi ili usihitaji kuyaandika tena.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Mfumo wa uendeshaji wa Chrome utazimwa kisha uwashwe sasa}=1{Mfumo wa uendeshaji wa Chrome utazimwa kisha uwashwe baada ya sekunde 1}other{Mfumo wa uendeshaji wa Chrome utazimwa kisha uwashwe baada ya sekunde #}}</translation>
+<translation id="825412236959742607">Ukurasa huu unatumia hifadhi kubwa mno, hivyo basi Chrome imeondoa baadhi ya maudhui.</translation>
 <translation id="8255190535488645436">Google Chrome inatumia kamera na maikrofoni yako.</translation>
 <translation id="8286862437124483331">Google Chrome inajaribu kuonyesha manenosiri. Chapa nenosiri lako la Windows ili uruhusu hili.</translation>
 <translation id="8290100596633877290">Ho! Google Chrome imezimika. Ianzishe tena sasa?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb
index af4e1d3..4c8918c 100644
--- a/chrome/app/resources/google_chrome_strings_ta.xtb
+++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">உங்கள் மொபைலில் Chromeஐ நிறுவவும். மொபைலுக்கு SMS ஒன்றை அனுப்புவோம்.</translation>
 <translation id="8183957050892517584">Chrome உங்கள் தனிப்பட்ட விவரங்களைப் பாதுகாப்பாகச் சேமிக்கும் என்பதால் அவற்றை மீண்டும் உள்ளிட வேண்டியதில்லை.</translation>
 <translation id="8226081633851087288">{0,plural, =0{இப்போது Chrome OS மீண்டும் தொடங்கும்}=1{1 வினாடியில் Chrome OS மீண்டும் தொடங்கும்}other{# வினாடிகளில் Chrome OS மீண்டும் தொடங்கும்}}</translation>
+<translation id="825412236959742607">இந்தப் பக்கம் அதிகளவு நினைவகத்தைப் பயன்படுத்துவதால், Chrome சில உள்ளடக்கங்களை அகற்றியது.</translation>
 <translation id="8255190535488645436">Google Chrome உங்கள் கேமராவையும் மைக்ரோஃபோனையும் பயன்படுத்துகிறது.</translation>
 <translation id="8286862437124483331">Google Chrome கடவுச்சொற்களைக் காண்பிக்க முயற்சிக்கிறது. இதை அனுமதிக்க உங்கள் Windows கடவுச்சொல்லைத் தட்டச்சு செய்யவும்.</translation>
 <translation id="8290100596633877290">அச்சச்சோ! Google Chrome செயலிழந்தது. இப்போது மீண்டும் தொடங்கவா?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index 39f42c9..720f8b9a 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -13,6 +13,7 @@
 <translation id="123620459398936149">Chrome OS మీ డేటాను సమకాలీకరించలేకపోయింది. దయచేసి మీ సమకాలీకరణ రహస్య పదబంధాన్ని నవీకరించండి.</translation>
 <translation id="127345590676626841">Chrome స్వయంచాలకంగా నవీకరించబడుతుంది కనుక మీరు ఎల్లప్పుడూ తాజా సంస్కరణని కలిగి ఉంటారు. ఈ డౌన్‌లోడ్ పూర్తయినప్పుడు, Chrome పునఃప్రారంభించబడుతుంది మరియు మీరు మీ పనిని కొనసాగించవచ్చు.</translation>
 <translation id="1302523850133262269">దయచేసి Chrome తాజా సిస్టమ్ నవీకరణలను ఇన్‌స్టాల్ చేస్తున్నప్పుడు వేచి ఉండండి.</translation>
+<translation id="1312676208694947750">{0,plural, =0{Chrome OS అప్‌డేట్ అందుబాటులో ఉంది}=1{Chrome OS అప్‌డేట్ అందుబాటులో ఉంది}other{# రోజులుగా Chrome OS అప్‌డేట్ అందుబాటులో ఉంది}}</translation>
 <translation id="137466361146087520">Google Chrome బీటా</translation>
 <translation id="1393853151966637042">Chromeని ఉపయోగించి సహాయాన్ని పొందండి</translation>
 <translation id="1399397803214730675">ఈ కంప్యూటర్‌లో ఇప్పటికే Google Chrome యొక్క తాజా సంస్కరణ ఉంది. సాఫ్ట్‌వేర్ పని చెయ్యకపోతే, దయచేసి Google Chromeను అన్‌ఇన్‌స్టాల్ చేసి, మళ్ళీ ప్రయత్నించండి.</translation>
@@ -29,6 +30,7 @@
 <translation id="1682634494516646069">Google Chrome దీని డేటా డైరెక్టరీని చదవలేదు మరియు దీనిలో వ్రాయలేదు: <ph name="USER_DATA_DIRECTORY" /></translation>
 <translation id="1698376642261615901">Google Chrome అనేది మెరుపు వేగంతో వెబ్‌పేజీలను మరియు అనువర్తనాలను అమలు చేసే వెబ్ బ్రౌజర్. ఇది వేగమైనది, సామర్థ్యం కలది మరియు ఉపయోగించడానికి సులభమైంది. Google Chromeలో నిర్మితమైన మాల్వేర్ మరియు ఫిషింగ్ భద్రతతో మరింత సురక్షితంగా వెబ్‌ను బ్రౌజ్ చేయండి.</translation>
 <translation id="1718131156967340976"><ph name="SMALL_PRODUCT_LOGO" /> <ph name="BEGIN_BOLD" />Google Chrome<ph name="END_BOLD" />ని ఎంచుకోండి</translation>
+<translation id="1734234790201236882">Chrome ఈ పాస్‌వర్డ్‌ను మీ Google ఖాతాలో సేవ్ చేస్తుంది. మీరు దీనిని గుర్తుంచుకోవాల్సిన అవసరం లేదు.</translation>
 <translation id="174539241580958092">సైన్ ఇన్ చేయడంలో లోపం సంభవించినందున Google Chrome మీ డేటాను సమకాలీకరించలేకపోయింది.</translation>
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1773601347087397504">Chrome OSని ఉపయోగించి సహాయాన్ని పొందండి</translation>
@@ -46,6 +48,7 @@
 <translation id="216054706567564023">మీ ఫోన్‌లో Chromeను ఇన్‌స్టాల్ చేయండి. మేము మీ ఖాతా పునరుద్ధరణ ఫోన్ నంబర్‌కు SMSను పంపుతాము.</translation>
 <translation id="2246246234298806438">అంతర్నిర్మిత PDF వ్యూవర్ లేనప్పుడు Google Chrome ముద్రణ పరిదృశ్యాన్ని చూపించదు.</translation>
 <translation id="2252923619938421629">ప్రస్తుత సెట్టింగ్‌లను నివేదించడం ద్వారా Google Chromeను మెరుగుపరచడంలో సహాయపడండి</translation>
+<translation id="225363235161345695">{0,plural, =1{ఒక గంటలో Chrome తిరిగి ప్రారంభించబడుతుంది}other{# గంటల్లో Chrome తిరిగి ప్రారంభించబడుతుంది}}</translation>
 <translation id="2286950485307333924">మీరు ఇప్పుడు Chromeకి సైన్ ఇన్ చేసారు</translation>
 <translation id="2290014774651636340">Google API కీలు లేవు. Google Chrome కార్యాచరణలో కొంత భాగం నిలిపివేయబడుతుంది.</translation>
 <translation id="2290095356545025170">మీరు Google Chrome ని ఖచ్చితంగా అన్ ఇన్‌స్టాల్ చెయ్యాలని అనుకుంటున్నారా?</translation>
@@ -145,10 +148,13 @@
 <translation id="4891791193823137474">Google Chromeను నేపథ్యంలో అమలు అయ్యేలా అనుమతించండి</translation>
 <translation id="4895437082222824641">కొత్త Chrome &amp;ట్యాబ్‌లో లింక్‌ను తెరువు</translation>
 <translation id="4921569541910214635">కంప్యూటర్‌ను భాగస్వామ్యం చేయాలా? ఇప్పుడు మీరు కోరుకున్న విధంగా Chromeను సెటప్ చేయవచ్చు.</translation>
+<translation id="4945319281866068441">{0,plural, =1{ఒక రోజులోపు Chrome OSని మళ్లీ ప్రారంభించండి}other{# రోజుల్లోపు Chromeని OS మళ్లీ ప్రారంభించండి}}</translation>
 <translation id="4953650215774548573">Google Chromeను మీ డిఫాల్ట్ బ్రౌజర్‌గా సెట్ చేయండి</translation>
 <translation id="495931528404527476">Chromeలో</translation>
 <translation id="4990567037958725628">Google Chrome కేనరీ</translation>
 <translation id="5028489144783860647">Google Chrome మీ డేటాను సమకాలీకరించలేకపోయింది. దయచేసి మీ సమకాలీకరణ రహస్య పదబంధాన్ని నవీకరించండి.</translation>
+<translation id="5062123544085870375">Chrome OSను మళ్లీ ప్రారంభించండి</translation>
+<translation id="5090044601776247154">పర్యవేక్షించబడే వినియోగదారు ప్రొఫైల్‌లు Google Chrome 70తో ప్రారంభమయ్యే వాటిల్లో ఇకపై అందుబాటులో ఉండవు.</translation>
 <translation id="5132929315877954718">Google Chrome కోసం గొప్ప అనువర్తనాలు, ఆటలు, పొడిగింపులు మరియు థీమ్‌లను కనుగొనండి.</translation>
 <translation id="5166975452760862670">Google Chrome ఈ భాషలో ప్రదర్శించబడుతోంది</translation>
 <translation id="5170938038195470297">మీ ప్రొఫైల్ ఉపయోగించబడదు ఎందుకంటే ఇది ఒక క్రొత్త Google Chrome సంస్కరణ నుండి తీసుకోబడింది. కొన్ని లక్షణాలు అందుబాటులో ఉండకపోవచ్చు. దయచేసి వేరొక ప్రొఫైల్ డైరెక్టరీని పేర్కొనండి లేదా Chrome యొక్క క్రొత్త సంస్కరణను ఉపయోగించండి.</translation>
@@ -158,6 +164,8 @@
 <translation id="532046782124376502">హెచ్చరిక: Google Chrome మీ బ్రౌజింగ్ చరిత్రను రికార్డ్ చేయకుండా పొడిగింపులను నివారించలేదు. ఈ పొడిగింపును అజ్ఞాత మోడ్‌లో ఆపివేయడానికి, ఈ ఎంపికను రద్దు చేయండి.</translation>
 <translation id="5386244825306882791">ఇది మీరు Chromeని ప్రారంభించేటప్పుడు లేదా ఓమ్నిపెట్టె నుండి శోధించేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
 <translation id="5430073640787465221">మీ ప్రాధాన్యతల ఫైల్ పాడైంది లేదా చెల్లదు. Google Chrome మీ సెట్టింగ్‌లను తిరిగి పొందలేకపోయింది.</translation>
+<translation id="5483595757826856374">{0,plural, =0{ఇప్పుడు Chrome తిరిగి ప్రారంభించబడుతుంది}=1{1 సెకనులో Chrome తిరిగి ప్రారంభించబడుతుంది}other{# సెకన్లలో Chrome తిరిగి ప్రారంభించబడుతుంది}}</translation>
+<translation id="5514308096618405748">Linux (బీటా)గా అదనపు <ph name="BEGIN_LINK_CROS_OSS" />ఓపన్ సోర్స్ సాఫ్ట్‌వేర్‌<ph name="END_LINK_CROS_OSS" /> ద్వారా Chrome OS సాధ్యం అవుతుంది.</translation>
 <translation id="556024056938947818">Google Chrome పాస్‌వర్డ్‌లను చూపడానికి ప్రయత్నిస్తోంది.</translation>
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> హానికరం కావచ్చు, కావున Chrome దాన్ని బ్లాక్ చేసింది.</translation>
@@ -183,6 +191,7 @@
 <translation id="6291549208091401781">మీ కంప్యూటర్‌లోని వినియోగదారులందరికీ Google Chrome ఇప్పటికే ఇన్‌స్టాల్ చేయబడింది.</translation>
 <translation id="6338556085225130112">Google Chromeని నవీకరిస్తోంది</translation>
 <translation id="6368958679917195344">అదనపు <ph name="BEGIN_LINK_CROS_OSS" />ఓపన్ సోర్స్ సాఫ్ట్‌వేర్‌<ph name="END_LINK_CROS_OSS" /> ద్వారా  Chrome OS సాధ్యం అవుతుంది.</translation>
+<translation id="6468844726266617801">{0,plural, =1{ఒక రోజులో Chromeని తిరిగి ప్రారంభించండి}other{# రోజుల్లో Chromeని తిరిగి ప్రారంభించండి}}</translation>
 <translation id="6515495397637126556"><ph name="PAGE_TITLE" /> - Google Chrome Dev</translation>
 <translation id="6566149418543181476">Google Chrome నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation>
 <translation id="6598387184982954187">మీరు మీ Chrome అంశాలను సమకాలీకరించడానికి <ph name="PROFILE_EMAIL" />ని ఉపయోగిస్తున్నారు. మీ సమకాలీకరణ ప్రాధాన్యతను నవీకరించడానికి లేదా Google ఖాతా లేకుండా Chromeని ఉపయోగించడానికి, <ph name="SETTINGS_LINK" />ను సందర్శించండి.</translation>
@@ -194,10 +203,12 @@
 <translation id="683440813066116847">mDNS ట్రాఫిక్‌ను అనుమతించడానికి Google Chrome కెనరీ కోసం ఇన్‌బౌండ్ నియమం.</translation>
 <translation id="686561893457936865">Chromeని ప్రతిచోటుకు తీసుకెళ్లండి</translation>
 <translation id="6885412569789873916">Chrome బీటా అనువర్తనాలు</translation>
+<translation id="6964107240822114422">{0,plural, =0{Chrome అప్‌డేట్ అందుబాటులో ఉంది}=1{Chrome అప్‌డేట్ అందుబాటులో ఉంది}other{# రోజులుగా Chrome అప్‌డేట్ అందుబాటులో ఉంది}}</translation>
 <translation id="6967962315388095737">mDNS ట్రాఫిక్‌ను అనుమతించడానికి Google Chrome బీటా కోసం ఇన్‌బౌండ్ నియమం.</translation>
 <translation id="6970811910055250180">మీ పరికరాన్ని నవీకరిస్తోంది...</translation>
 <translation id="6982337800632491844">మీరు ఈ పరికరాన్ని ఉపయోగించడానికి ముందు సేవా నిబంధనలను చదివి, అంగీకరించాలని <ph name="DOMAIN" /> కోరుతోంది. ఈ నిబంధనలు Google Chrome OS నిబంధనలను విస్తరింపజేయవు, సవరించవు లేదా పరిమితం చేయవు.</translation>
 <translation id="6989339256997917931">Google Chrome నవీకరింబడింది, కానీ మీరు దీన్ని కనీసం 30 రోజులు ఉయోగించలేరు.</translation>
+<translation id="7023651421574588884">అప్‌డేట్‌ని వర్తింపజేయడం కోసం మీరు Chrome OSని మళ్లీ ప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
 <translation id="7098166902387133879">Google Chrome మీ మైక్రోఫోన్‌ని ఉపయోగిస్తోంది.</translation>
 <translation id="7106741999175697885">విధి నిర్వాహకుడు - Google Chrome</translation>
 <translation id="7164397146364144019">సంభావ్య భద్రతాపరమైన దాడులకు సంబంధించిన వివరాలను Googleకి స్వయంచాలకంగా నివేదించడం ద్వారా Chrome‌ని సురక్షితంగా మరియు సులభంగా ఉపయోగించదగినదిగా చేయడంలో మీ సహాయం అందించవచ్చు.</translation>
@@ -210,8 +221,10 @@
 <translation id="7419046106786626209">మీ డొమైన్ కోసం సమకాలీకరణ అందుబాటులో లేనందున Chrome OS మీ డేటాను సమకాలీకరించలేకపోయింది.</translation>
 <translation id="7459554271817304652">వెబ్‌కు మీ వ్యక్తిగతీకరించి బ్రౌజర్ లక్షణాలను సేవ్ చేయడానికి మరియు ఏదైనా కంప్యూటర్‌లోని Google Chrome నుండి అయినా వాటిని ప్రాప్యత చేయడానికి సమకాలీకరణని సెటప్ చేయండి.</translation>
 <translation id="7473136999113284234">Chrome స్వయంచాలకంగా నవీకరించబడుతుంది కనుక మీరు ఎల్లప్పుడూ తాజా సంస్కరణను కలిగి ఉంటారు.</translation>
+<translation id="7486227612705979895">చిరునామా బార్‌లో సూచనలను చేయడానికి Chrome మీ డిస్క్‌ను యాక్సెస్ చేస్తుంది</translation>
 <translation id="7535429826459677826">Google Chrome డెవలపర్</translation>
 <translation id="7552219221109926349">Chrome OSను ఈ భాషలో ప్రదర్శించు</translation>
+<translation id="7561940363513215021">{0,plural, =1{1 నిమిషంలో Chrome తిరిగి ప్రారంభించబడుతుంది}other{# నిమిషాల్లో Chrome తిరిగి ప్రారంభించబడుతుంది}}</translation>
 <translation id="7589360514048265910">Mac OS X 10.9కు మద్దతు లేనందున ఈ కంప్యూటర్ ఇకపై Google Chrome అప్‌డేట్‌లను స్వీకరించదు.</translation>
 <translation id="7592736734348559088">మీ ఖాతా సైన్-ఇన్ వివరాల గడువు ముగిసినందున Google Chrome మీ డేటాను సమకాలీకరించలేకపోయింది.</translation>
 <translation id="7626032353295482388">Chromeకు స్వాగతం</translation>
@@ -233,9 +246,11 @@
 <translation id="8008534537613507642">Chromeను మళ్లీ ఇన్‌స్టాల్ చేయి</translation>
 <translation id="8030318113982266900">మీ పరికరాన్ని <ph name="CHANNEL_NAME" /> ఛానెల్‌కి నవీకరిస్తోంది...</translation>
 <translation id="8032142183999901390">Chrome నుండి మీ ఖాతాను తీసివేసిన తర్వాత, ప్రభావవంతం కావడానికి మీరు మీ తెరిచిన ట్యాబ్‌లను మళ్లీ లోడ్ చేయాల్సి రావచ్చు.</translation>
+<translation id="8077352834923175128">ఈ అప్‌డేట్‌ని వర్తింపజేయడం కోసం మీరు Chrome OSని మళ్లీ ప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
 <translation id="8129812357326543296">&amp;Google Chrome గురించి</translation>
 <translation id="8179874765710681175">మీ ఫోన్‌లో Chromeని ఇన్‌స్టాల్ చేయండి. మేము మీ ఫోన్‌కు SMSను పంపుతాము.</translation>
 <translation id="8183957050892517584">Chrome మీ వ్యక్తిగత వివరాలను సురక్షితంగా నిల్వ చేస్తుంది కాబట్టి మీరు వాటిని మళ్లీ టైప్ చేయాల్సిన అవసరం లేదు.</translation>
+<translation id="8226081633851087288">{0,plural, =0{Chrome OS ఇప్పుడు మళ్లీ ప్రారంభించబడుతుంది}=1{Chrome OS 1 సెకనులో మళ్లీ ప్రారంభించబడుతుంది}other{Chrome OS # సెకన్లలో మళ్లీ ప్రారంభించబడుతుంది}}</translation>
 <translation id="8255190535488645436">Google Chrome మీ కెమెరా మరియు మైక్రోఫోన్‌ని ఉపయోగిస్తోంది.</translation>
 <translation id="8286862437124483331">Google Chrome పాస్‌వర్డ్‌లను చూపడానికి ప్రయత్నిస్తోంది. దీన్ని అనుమతించడానికి మీ Windows పాస్‌వర్డ్‌ను టైప్ చేయండి.</translation>
 <translation id="8290100596633877290">ఆపండి! Google Chrome క్రాష్ అయ్యింది. ఇప్పుడు మళ్ళీ ప్రారంభించాల?</translation>
@@ -258,6 +273,7 @@
 <translation id="870251953148363156">&amp;Google Chromeను నవీకరించు</translation>
 <translation id="873133009373065397">Google Chrome డిఫాల్ట్ బ్రౌజర్‌ను నిశ్చయించలేదు లేదా సెట్ చేయలేదు</translation>
 <translation id="8736674169840206667">అప్‌డేట్‌ని వర్తింపజేయడం కోసం మీరు Chromeని పునఃప్రారంభించాలని మీ నిర్వాహకుడు కోరుతున్నారు</translation>
+<translation id="8791470158600044404">{0,plural, =1{Chrome OS 1 నిమిషంలో మళ్లీ ప్రారంభించబడుతుంది}other{Chrome OS # నిమిషాల్లో మళ్లీ ప్రారంభించబడుతుంది}}</translation>
 <translation id="8796108026289707191">మీరు ఇప్పుడు Google Chromeని పునఃప్రారంభించాలి.</translation>
 <translation id="8823341990149967727">Chrome కాలం చెల్లినది</translation>
 <translation id="884296878221830158">ఇది మీరు Chromeని ప్రారంభించేటప్పుడు లేదా హోమ్ బటన్‌ను క్లిక్ చేసేటప్పుడు చూపబడే పేజీని కూడా నియంత్రిస్తుంది.</translation>
@@ -266,6 +282,7 @@
 <translation id="9026991721384951619">మీ ఖాతా సైన్-ఇన్ వివరాల గడువు ముగిసినందున Chrome OS మీ డేటాను సమకాలీకరించలేకపోయింది.</translation>
 <translation id="9067395829937117663">Google Chromeకి Windows 7 లేదా అంతకంటే ఆధునికమైనది ఉండటం ఆవశ్యకం.</translation>
 <translation id="9084668267983921457">ప్రమాణీకరణ ప్రమాణపత్రం విఫలమైంది. దయచేసి Google Chromeలో మళ్లీ సైన్ ఇన్ చేయండి లేదా మరింత సమాచారం కోసం మీ నిర్వాహకులను సంప్రదించండి. <ph name="ADDITIONAL_EXPLANATION" /></translation>
+<translation id="909149346112452267">{0,plural, =1{Chrome OS గంటలో మళ్లీ ప్రారంభించబడుతుంది}other{Chrome OS # గంటల్లో మళ్లీ ప్రారంభించబడుతుంది}}</translation>
 <translation id="911206726377975832">మీ బ్రౌజింగ్ డేటాని కూడా తొలగించాలా?</translation>
 <translation id="919706545465235479">సమకాలీకరణను ప్రారంభించడానికి Chromeని నవీకరించాలి</translation>
 <translation id="924447568950697217">Chromeని మీ డిఫాల్ట్ బ్రౌజర్‌గా చేయండి</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb
index 868b00c..2dab132 100644
--- a/chrome/app/resources/google_chrome_strings_th.xtb
+++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -252,6 +252,7 @@
 <translation id="8179874765710681175">ติดตั้ง Chrome ในโทรศัพท์ เราจะส่ง SMS ไปยังโทรศัพท์ของคุณ</translation>
 <translation id="8183957050892517584">Chrome จะเก็บรายละเอียดส่วนตัวของคุณอย่างปลอดภัย คุณจึงไม่จำเป็นต้องพิมพ์รายละเอียดเหล่านั้นอีกครั้ง</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS จะรีสตาร์ทตอนนี้}=1{Chrome OS จะรีสตาร์ทใน 1 วินาที}other{Chrome OS จะรีสตาร์ทใน # วินาที}}</translation>
+<translation id="825412236959742607">หน้านี้ใช้หน่วยความจำมากเกินไป Chrome จึงนำเนื้อหาบางส่วนออก</translation>
 <translation id="8255190535488645436">Google Chrome ใช้กล้องและไมโครโฟนของคุณอยู่</translation>
 <translation id="8286862437124483331">Google Chrome กำลังพยายามแสดงรหัสผ่าน พิมพ์รหัสผ่าน Windows ของคุณเพื่อแสดงรหัสผ่าน</translation>
 <translation id="8290100596633877290">อ๊ะ! Google Chrome ขัดข้อง เปิดใหม่ตอนนี้หรือไม่</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb
index df55029..153830a8 100644
--- a/chrome/app/resources/google_chrome_strings_tr.xtb
+++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -254,6 +254,7 @@
 <translation id="8179874765710681175">Chrome'u telefonunuza yükleyin. Telefonunuza SMS göndereceğiz.</translation>
 <translation id="8183957050892517584">Chrome, kişisel bilgilerinizi güvenli şekilde depoladığından bu bilgileri tekrar yazmak zorunda kalmazsınız.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS şimdi yeniden başlatılacak}=1{Chrome OS 1 saniye içinde yeniden başlatılacak}other{Chrome OS # saniye içinde yeniden başlatılacak}}</translation>
+<translation id="825412236959742607">Bu sayfa çok fazla bellek kullandığından Chrome bazı içerikleri kaldırdı.</translation>
 <translation id="8255190535488645436">Google Chrome kameranızı ve mikrofonunuzu kullanıyor.</translation>
 <translation id="8286862437124483331">Google Chrome şifreleri göstermeye çalışıyor. Buna izin vermek için Windows şifrenizi yazın.</translation>
 <translation id="8290100596633877290">Of! Google Chrome kilitlendi. Şimdi yeniden başlatılsın mı?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb
index c57de14..9ca85eb5 100644
--- a/chrome/app/resources/google_chrome_strings_uk.xtb
+++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -251,6 +251,7 @@
 <translation id="8179874765710681175">Установіть Chrome на телефоні. Ми надішлемо SMS на ваш телефон.</translation>
 <translation id="8183957050892517584">Chrome надійно зберігатиме ваші особисті дані, тож вам не потрібно буде вводити їх знову.</translation>
 <translation id="8226081633851087288">{0,plural, =0{ОС Chrome перезапуститься зараз}=1{ОС Chrome перезапуститься через 1 секунду}one{ОС Chrome перезапуститься через # секунду}few{ОС Chrome перезапуститься через # секунди}many{ОС Chrome перезапуститься через # секунд}other{ОС Chrome перезапуститься через # секунди}}</translation>
+<translation id="825412236959742607">Ця сторінка використовує забагато пам’яті, тому веб-переглядач Chrome вилучив деякий вміст.</translation>
 <translation id="8255190535488645436">Google Chrome використовує вашу камеру та мікрофон.</translation>
 <translation id="8286862437124483331">Google Chrome намагається показати паролі. Щоб дозволити, введіть свій пароль Windows.</translation>
 <translation id="8290100596633877290">Відбулося аварійне завершення роботи Google Chrome. Перезапустити зараз?</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb
index 27b20f2..f115a8b 100644
--- a/chrome/app/resources/google_chrome_strings_vi.xtb
+++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -256,6 +256,7 @@
 <translation id="8179874765710681175">Cài đặt Chrome trên điện thoại của bạn. Chúng tôi sẽ gửi SMS tới điện thoại của bạn.</translation>
 <translation id="8183957050892517584">Chrome sẽ lưu trữ an toàn chi tiết cá nhân của bạn nên bạn không cần nhập lại thông tin này.</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome OS sẽ khởi động lại ngay bây giờ}=1{Chrome OS sẽ khởi động lại sau 1 giây}other{Chrome OS sẽ khởi động lại sau # giây}}</translation>
+<translation id="825412236959742607">Trang này sử dụng quá nhiều bộ nhớ, nên Chrome đã xóa bớt nội dung.</translation>
 <translation id="8255190535488645436">Google Chrome đang sử dụng máy ảnh và micrô của bạn.</translation>
 <translation id="8286862437124483331">Google Chrome đang cố gắng hiển thị mật khẩu. Hãy nhập mật khẩu Windows của bạn để cho phép việc này.</translation>
 <translation id="8290100596633877290">Chà! Google Chrome đã bị lỗi. Mở lại bây giờ không? </translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
index ee55edf..3f3fa4d 100644
--- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb
+++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -253,6 +253,7 @@
 <translation id="8179874765710681175">在手機上安裝 Chrome。我們會傳送簡訊到你的手機。</translation>
 <translation id="8183957050892517584">Chrome 會妥善保存您的個人詳細資料,讓您不必重複輸入相同的資料。</translation>
 <translation id="8226081633851087288">{0,plural, =0{Chrome 作業系統將立即重新啟動}=1{Chrome 作業系統將於 1 秒後重新啟動}other{Chrome 作業系統將於 # 後重新啟動}}</translation>
+<translation id="825412236959742607">這個網頁使用了過多記憶體,因此 Chrome 移除了部分內容。</translation>
 <translation id="8255190535488645436">Google Chrome 正在使用你的攝影機和麥克風。</translation>
 <translation id="8286862437124483331">Google Chrome 現在會嘗試顯示密碼。如果你同意的話,請輸入你的 Windows 密碼。</translation>
 <translation id="8290100596633877290">真糟糕!Google Chrome 當掉了,要立即重新啟動嗎?</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f88e1756..7190013 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1940,6 +1940,8 @@
       "android/android_theme_resources.h",
       "android/app_hooks.cc",
       "android/app_hooks.h",
+      "android/autofill_assistant/assistant_ui_controller_android.cc",
+      "android/autofill_assistant/assistant_ui_controller_android.h",
       "android/background_sync_launcher_android.cc",
       "android/background_sync_launcher_android.h",
       "android/background_tab_manager.cc",
@@ -3316,9 +3318,8 @@
       "net/disk_cache_dir_policy_handler.h",
       "notifications/fullscreen_notification_blocker.cc",
       "notifications/fullscreen_notification_blocker.h",
-      "notifications/message_center_notification_manager.cc",
-      "notifications/message_center_notification_manager.h",
-      "notifications/notification_ui_manager_desktop.cc",
+      "notifications/notification_ui_manager_impl.cc",
+      "notifications/notification_ui_manager_impl.h",
       "notifications/screen_lock_notification_blocker.cc",
       "notifications/screen_lock_notification_blocker.h",
       "platform_util.cc",
@@ -4076,7 +4077,16 @@
   }
 
   if (enable_rlz) {
-    deps += [ ":rlz" ]
+    sources += [
+      "rlz/chrome_rlz_tracker_delegate.cc",
+      "rlz/chrome_rlz_tracker_delegate.h",
+    ]
+
+    public_deps += [
+      "//components/google/core/browser",
+      "//components/rlz",
+      "//rlz:rlz_lib",
+    ]
   }
 
   if (enable_service_discovery) {
@@ -4390,6 +4400,7 @@
       "../android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java",
       "../android/java/src/org/chromium/chrome/browser/autofill/PhoneNumberUtil.java",
       "../android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/PasswordAccessoryBridge.java",
+      "../android/java/src/org/chromium/chrome/browser/autofill_assistant/AssistantUiController.java",
       "../android/java/src/org/chromium/chrome/browser/banners/AppBannerManager.java",
       "../android/java/src/org/chromium/chrome/browser/banners/AppBannerUiDelegateAndroid.java",
       "../android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java",
@@ -5130,19 +5141,3 @@
     ]
   }
 }
-
-if (enable_rlz_support) {
-  static_library("rlz") {
-    sources = [
-      "rlz/chrome_rlz_tracker_delegate.cc",
-      "rlz/chrome_rlz_tracker_delegate.h",
-    ]
-    public_deps = [
-      "//components/google/core/browser",
-      "//components/omnibox/browser",
-      "//components/rlz",
-      "//components/search_engines",
-      "//rlz:rlz_lib",
-    ]
-  }
-}
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index 824078a..12f65817 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -187,7 +187,7 @@
   "+third_party/blink/public/platform/modules/payments/payment_request.mojom.h",
   "+third_party/blink/public/platform/modules/permissions/permission_status.mojom.h",
   "+third_party/blink/public/platform/modules/presentation/presentation.mojom.h",
-  "+third_party/blink/public/platform/modules/webauth/authenticator.mojom.h",
+  "+third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h",
   "+third_party/blink/public/platform/modules/webshare/webshare.mojom.h",
   "+third_party/blink/public/platform/oom_intervention.mojom.h",
   "+third_party/blink/public/platform/site_engagement.mojom.h",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index e8b836c..dc09a32 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1527,9 +1527,6 @@
     {"site-settings", flag_descriptions::kSiteSettings,
      flag_descriptions::kSiteSettingsDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kSiteSettings)},
-    {"secondary-ui-md", flag_descriptions::kSecondaryUiMd,
-     flag_descriptions::kSecondaryUiMdDescription, kOsDesktop,
-     FEATURE_VALUE_TYPE(features::kSecondaryUiMd)},
     {"touch-events", flag_descriptions::kTouchEventsName,
      flag_descriptions::kTouchEventsDescription, kOsDesktop,
      MULTI_VALUE_TYPE(kTouchEventFeatureDetectionChoices)},
@@ -2376,6 +2373,10 @@
     {"offline-pages-sharing", flag_descriptions::kOfflinePagesSharingName,
      flag_descriptions::kOfflinePagesSharingDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(offline_pages::kOfflinePagesSharingFeature)},
+    {"offline-pages-live-page-sharing",
+     flag_descriptions::kOfflinePagesLivePageSharingName,
+     flag_descriptions::kOfflinePagesLivePageSharingDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(offline_pages::kOfflinePagesLivePageSharingFeature)},
     {"offline-pages-prefetching",
      flag_descriptions::kOfflinePagesPrefetchingName,
      flag_descriptions::kOfflinePagesPrefetchingDescription, kOsAndroid,
@@ -4023,12 +4024,6 @@
      flag_descriptions::kDisallowUnsafeHttpDownloadsNameDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kDisallowUnsafeHttpDownloads)},
 
-#if defined(OS_CHROMEOS)
-    {"tap-visualizer-app", flag_descriptions::kTapVisualizerAppName,
-     flag_descriptions::kTapVisualizerAppDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(ash::features::kTapVisualizerApp)},
-#endif
-
     {"enable-websocket-auth-connection-reuse",
      flag_descriptions::kWebSocketHandshakeReuseConnectionName,
      flag_descriptions::kWebSocketHandshakeReuseConnectionDescription, kOsAll,
@@ -4121,10 +4116,10 @@
 #endif
 
 #if defined(OS_MACOSX)
-    {"enable-suggested-text-touch-bar",
-     flag_descriptions::kSuggestedTextTouchBarName,
-     flag_descriptions::kSuggestedTextTouchBarDescription, kOsMac,
-     FEATURE_VALUE_TYPE(features::kSuggestedTextTouchBar)},
+    {"enable-text-suggestions-touch-bar",
+     flag_descriptions::kTextSuggestionsTouchBarName,
+     flag_descriptions::kTextSuggestionsTouchBarDescription, kOsMac,
+     FEATURE_VALUE_TYPE(features::kTextSuggestionsTouchBar)},
 #endif
 
 #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/after_startup_task_utils_unittest.cc b/chrome/browser/after_startup_task_utils_unittest.cc
index 8c6c8814..8b833f5 100644
--- a/chrome/browser/after_startup_task_utils_unittest.cc
+++ b/chrome/browser/after_startup_task_utils_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/bind_helpers.h"
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/android/autofill_assistant/OWNERS b/chrome/browser/android/autofill_assistant/OWNERS
new file mode 100644
index 0000000..829eb83
--- /dev/null
+++ b/chrome/browser/android/autofill_assistant/OWNERS
@@ -0,0 +1 @@
+file://components/autofill_assistant/OWNERS
\ No newline at end of file
diff --git a/chrome/browser/android/autofill_assistant/assistant_ui_controller_android.cc b/chrome/browser/android/autofill_assistant/assistant_ui_controller_android.cc
new file mode 100644
index 0000000..d715b55
--- /dev/null
+++ b/chrome/browser/android/autofill_assistant/assistant_ui_controller_android.cc
@@ -0,0 +1,73 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/android/autofill_assistant/assistant_ui_controller_android.h"
+
+#include "base/android/jni_android.h"
+#include "base/android/jni_string.h"
+#include "components/autofill_assistant/browser/assistant_controller.h"
+#include "content/public/browser/web_contents.h"
+#include "jni/AssistantUiController_jni.h"
+
+using base::android::AttachCurrentThread;
+using base::android::JavaParamRef;
+
+namespace autofill_assistant {
+
+AssistantUiControllerAndroid::AssistantUiControllerAndroid(
+    JNIEnv* env,
+    jobject jcaller,
+    const JavaParamRef<jobject>& webContents)
+    : ui_delegate_(nullptr) {
+  java_assistant_ui_controller_.Reset(env, jcaller);
+
+  content::WebContents* web_contents =
+      content::WebContents::FromJavaWebContents(webContents);
+  DCHECK(web_contents);
+  AssistantController::CreateAndStartForWebContents(
+      web_contents, std::unique_ptr<AssistantUiController>(this));
+  DCHECK(ui_delegate_);
+}
+
+AssistantUiControllerAndroid::~AssistantUiControllerAndroid() {}
+
+void AssistantUiControllerAndroid::SetUiDelegate(
+    AssistantUiDelegate* ui_delegate) {
+  ui_delegate_ = ui_delegate;
+}
+
+void AssistantUiControllerAndroid::ShowStatusMessage(
+    const std::string& message) {
+  JNIEnv* env = AttachCurrentThread();
+  Java_AssistantUiController_onShowStatusMessage(
+      env, java_assistant_ui_controller_,
+      base::android::ConvertUTF8ToJavaString(env, message));
+}
+
+void AssistantUiControllerAndroid::ShowOverlay() {
+  Java_AssistantUiController_onShowOverlay(AttachCurrentThread(),
+                                           java_assistant_ui_controller_);
+}
+
+void AssistantUiControllerAndroid::HideOverlay() {
+  Java_AssistantUiController_onHideOverlay(AttachCurrentThread(),
+                                           java_assistant_ui_controller_);
+}
+
+void AssistantUiControllerAndroid::Destroy(JNIEnv* env,
+                                           const JavaParamRef<jobject>& obj) {
+  ui_delegate_->OnDestroy();
+}
+
+static jlong JNI_AssistantUiController_Init(
+    JNIEnv* env,
+    const base::android::JavaParamRef<jobject>& jcaller,
+    const base::android::JavaParamRef<jobject>& webContents) {
+  auto* assistant_ui_controller_android =
+      new autofill_assistant::AssistantUiControllerAndroid(env, jcaller,
+                                                           webContents);
+  return reinterpret_cast<intptr_t>(assistant_ui_controller_android);
+}
+
+}  // namespace autofill_assistant.
diff --git a/chrome/browser/android/autofill_assistant/assistant_ui_controller_android.h b/chrome/browser/android/autofill_assistant/assistant_ui_controller_android.h
new file mode 100644
index 0000000..f943ce1
--- /dev/null
+++ b/chrome/browser/android/autofill_assistant/assistant_ui_controller_android.h
@@ -0,0 +1,44 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_ASSISTANT_UI_CONTROLLER_ANDROID_H_
+#define CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_ASSISTANT_UI_CONTROLLER_ANDROID_H_
+
+#include "components/autofill_assistant/browser/assistant_ui_controller.h"
+
+#include <string>
+
+#include "base/android/scoped_java_ref.h"
+#include "base/macros.h"
+
+namespace autofill_assistant {
+// Class implements AssistantUiController and starts AssistantController.
+class AssistantUiControllerAndroid : public AssistantUiController {
+ public:
+  AssistantUiControllerAndroid(
+      JNIEnv* env,
+      jobject jcaller,
+      const base::android::JavaParamRef<jobject>& webContents);
+  ~AssistantUiControllerAndroid() override;
+
+  // Overrides AssistantUiController:
+  void SetUiDelegate(AssistantUiDelegate* ui_delegate) override;
+  void ShowStatusMessage(const std::string& message) override;
+  void ShowOverlay() override;
+  void HideOverlay() override;
+
+  // Called by Java.
+  void Destroy(JNIEnv* env, const base::android::JavaParamRef<jobject>& obj);
+
+ private:
+  // Java-side AssistantUiController object.
+  base::android::ScopedJavaGlobalRef<jobject> java_assistant_ui_controller_;
+
+  AssistantUiDelegate* ui_delegate_;
+
+  DISALLOW_COPY_AND_ASSIGN(AssistantUiControllerAndroid);
+};
+
+}  // namespace autofill_assistant.
+#endif  // CHROME_BROWSER_ANDROID_AUTOFILL_ASSISTANT_ASSISTANT_UI_CONTROLLER_ANDROID_H_
\ No newline at end of file
diff --git a/chrome/browser/android/chrome_feature_list.cc b/chrome/browser/android/chrome_feature_list.cc
index 7b472ff..8f85ee9 100644
--- a/chrome/browser/android/chrome_feature_list.cc
+++ b/chrome/browser/android/chrome_feature_list.cc
@@ -73,6 +73,7 @@
     &kAndroidPayIntegrationV1,
     &kAndroidPayIntegrationV2,
     &kAndroidPaymentApps,
+    &kAutofillAssistant,
     &kCCTBackgroundTab,
     &kCCTExternalLinkHandling,
     &kCCTModule,
@@ -160,6 +161,7 @@
     &offline_pages::kOfflinePagesDescriptiveFailStatusFeature,
     &offline_pages::kOfflinePagesDescriptivePendingStatusFeature,
     &offline_pages::kOfflinePagesSharingFeature,
+    &offline_pages::kOfflinePagesLivePageSharingFeature,
     &offline_pages::kPrefetchingOfflinePagesFeature,
     &omnibox::kUIExperimentHideSteadyStateUrlSchemeAndSubdomains,
     &password_manager::features::kPasswordExport,
@@ -197,6 +199,9 @@
 const base::Feature kAndroidPaymentApps{"AndroidPaymentApps",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kAutofillAssistant{"AutofillAssistant",
+                                       base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kBackgroundTaskComponentUpdate{
     "BackgroundTaskComponentUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chrome/browser/android/chrome_feature_list.h b/chrome/browser/android/chrome_feature_list.h
index 54a6f8cd..ec1a550 100644
--- a/chrome/browser/android/chrome_feature_list.h
+++ b/chrome/browser/android/chrome_feature_list.h
@@ -17,6 +17,7 @@
 extern const base::Feature kAndroidPayIntegrationV1;
 extern const base::Feature kAndroidPayIntegrationV2;
 extern const base::Feature kAndroidPaymentApps;
+extern const base::Feature kAutofillAssistant;
 extern const base::Feature kBackgroundTaskComponentUpdate;
 extern const base::Feature kCCTBackgroundTab;
 extern const base::Feature kCCTExternalLinkHandling;
diff --git a/chrome/browser/android/download/download_media_parser_bridge.cc b/chrome/browser/android/download/download_media_parser_bridge.cc
index df9275d..3d32146 100644
--- a/chrome/browser/android/download/download_media_parser_bridge.cc
+++ b/chrome/browser/android/download/download_media_parser_bridge.cc
@@ -6,7 +6,7 @@
 
 #include "base/android/jni_string.h"
 #include "base/files/file_path.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/android/download/download_media_parser.h"
 #include "jni/DownloadMediaParserBridge_jni.h"
 
diff --git a/chrome/browser/android/history_report/delta_file_service.cc b/chrome/browser/android/history_report/delta_file_service.cc
index 55feb10..526c106 100644
--- a/chrome/browser/android/history_report/delta_file_service.cc
+++ b/chrome/browser/android/history_report/delta_file_service.cc
@@ -7,8 +7,8 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "chrome/browser/android/history_report/delta_file_backend_leveldb.h"
 #include "chrome/browser/android/history_report/delta_file_commons.h"
diff --git a/chrome/browser/android/history_report/usage_reports_buffer_service.cc b/chrome/browser/android/history_report/usage_reports_buffer_service.cc
index 0ae2e6d..0a3276b 100644
--- a/chrome/browser/android/history_report/usage_reports_buffer_service.cc
+++ b/chrome/browser/android/history_report/usage_reports_buffer_service.cc
@@ -7,8 +7,8 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/trace_event/memory_dump_manager.h"
 #include "chrome/browser/android/history_report/usage_reports_buffer_backend.h"
 #include "chrome/browser/android/proto/delta_file.pb.h"
diff --git a/chrome/browser/android/password_ui_view_android.cc b/chrome/browser/android/password_ui_view_android.cc
index 83d34a22..234d122 100644
--- a/chrome/browser/android/password_ui_view_android.cc
+++ b/chrome/browser/android/password_ui_view_android.cc
@@ -18,7 +18,7 @@
 #include "base/metrics/field_trial.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/android/thumbnail/thumbnail_cache.cc b/chrome/browser/android/thumbnail/thumbnail_cache.cc
index 1eb6aed..2881a49 100644
--- a/chrome/browser/android/thumbnail/thumbnail_cache.cc
+++ b/chrome/browser/android/thumbnail/thumbnail_cache.cc
@@ -17,7 +17,7 @@
 #include "base/files/file_util.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/android/vr/arcore_device/arcore_device.cc b/chrome/browser/android/vr/arcore_device/arcore_device.cc
index e5fcd166..e03b990 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_device.cc
+++ b/chrome/browser/android/vr/arcore_device/arcore_device.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/numerics/math_constants.h"
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/android/vr/arcore_device/arcore_gl.h"
diff --git a/chrome/browser/android/vr/arcore_device/arcore_gl.cc b/chrome/browser/android/vr/arcore_device/arcore_gl.cc
index e2371f8..ab23afb3 100644
--- a/chrome/browser/android/vr/arcore_device/arcore_gl.cc
+++ b/chrome/browser/android/vr/arcore_device/arcore_gl.cc
@@ -13,7 +13,7 @@
 #include "base/containers/queue.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event_argument.h"
 #include "chrome/browser/android/vr/arcore_device/ar_image_transport.h"
diff --git a/chrome/browser/android/vr/mailbox_to_surface_bridge.cc b/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
index 6707fc0e..1f4a960 100644
--- a/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
+++ b/chrome/browser/android/vr/mailbox_to_surface_bridge.cc
@@ -9,7 +9,7 @@
 
 #include "base/logging.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/viz/common/gpu/context_provider.h"
 #include "content/public/browser/android/compositor.h"
diff --git a/chrome/browser/android/vr/vr_shell_gl.cc b/chrome/browser/android/vr/vr_shell_gl.cc
index 2ceb816..e49029b2 100644
--- a/chrome/browser/android/vr/vr_shell_gl.cc
+++ b/chrome/browser/android/vr/vr_shell_gl.cc
@@ -17,7 +17,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event_argument.h"
diff --git a/chrome/browser/android/webapk/webapk_installer.cc b/chrome/browser/android/webapk/webapk_installer.cc
index 76903c7..23b4f8ac 100644
--- a/chrome/browser/android/webapk/webapk_installer.cc
+++ b/chrome/browser/android/webapk/webapk_installer.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/elapsed_timer.h"
diff --git a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc
index ee0b80c..fe3cad0 100644
--- a/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc
+++ b/chrome/browser/android/webapps/add_to_homescreen_data_fetcher.cc
@@ -10,7 +10,7 @@
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/android/shortcut_helper.h"
 #include "chrome/browser/android/webapk/chrome_webapk_host.h"
 #include "chrome/browser/android/webapk/webapk_web_manifest_checker.h"
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm
index 388e2ea..a6484e9b 100644
--- a/chrome/browser/app_controller_mac.mm
+++ b/chrome/browser/app_controller_mac.mm
@@ -25,7 +25,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h"
@@ -81,8 +81,8 @@
 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/user_manager.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_paths_internal.h"
 #include "chrome/common/chrome_switches.h"
@@ -1185,7 +1185,7 @@
         extensions::ExtensionRegistry* registry =
             extensions::ExtensionRegistry::Get(browser->profile());
         const extensions::Extension* extension = registry->GetExtensionById(
-            web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+            web_app::GetAppIdFromApplicationName(browser->app_name()),
             extensions::ExtensionRegistry::ENABLED);
         if (extension && extension->is_hosted_app())
           continue;
diff --git a/chrome/browser/apps/app_shim/app_shim_host_manager_mac.mm b/chrome/browser/apps/app_shim/app_shim_host_manager_mac.mm
index a166fac..f62fcdd6 100644
--- a/chrome/browser/apps/app_shim/app_shim_host_manager_mac.mm
+++ b/chrome/browser/apps/app_shim/app_shim_host_manager_mac.mm
@@ -11,7 +11,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/apps/app_shim/app_shim_handler_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_mac.h"
 #include "chrome/browser/apps/app_shim/extension_app_shim_handler_mac.h"
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 b512084c..83166ac 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
@@ -18,7 +18,7 @@
 #include "base/process/launch.h"
 #include "base/run_loop.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_restrictions.h"
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 043ddb1c..25d2b181 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,8 +27,8 @@
 #include "chrome/browser/ui/extensions/extension_enable_flow.h"
 #include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
 #include "chrome/browser/ui/user_manager.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/extensions/extension_metrics.h"
@@ -291,10 +291,8 @@
     return;
 
   for (const Browser* browser : it->second) {
-    if (web_app::GetExtensionIdFromApplicationName(browser->app_name()) !=
-        app_id) {
+    if (web_app::GetAppIdFromApplicationName(browser->app_name()) != app_id)
       continue;
-    }
 
     if (hidden)
       browser->window()->Hide();
@@ -327,7 +325,7 @@
 
   return MaybeGetAppExtension(
       browser->profile(),
-      web_app::GetExtensionIdFromApplicationName(browser->app_name()));
+      web_app::GetAppIdFromApplicationName(browser->app_name()));
 }
 
 // static
diff --git a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
index 1b74065..98228a9 100644
--- a/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
+++ b/chrome/browser/autocomplete/chrome_autocomplete_provider_client.cc
@@ -57,18 +57,28 @@
 // This list should be kept in sync with chrome/common/webui_url_constants.h.
 // Only include useful sub-pages, confirmation alerts are not useful.
 const char* const kChromeSettingsSubPages[] = {
-    chrome::kAutofillSubPage,        chrome::kClearBrowserDataSubPage,
-    chrome::kContentSettingsSubPage, chrome::kLanguageOptionsSubPage,
-    chrome::kPasswordManagerSubPage, chrome::kResetProfileSettingsSubPage,
-    chrome::kSearchEnginesSubPage,   chrome::kSyncSetupSubPage,
+    chrome::kAutofillSubPage,
+    chrome::kClearBrowserDataSubPage,
+    chrome::kContentSettingsSubPage,
+    chrome::kLanguageOptionsSubPage,
+    chrome::kPasswordManagerSubPage,
+    chrome::kPaymentsSubPage,
+    chrome::kResetProfileSettingsSubPage,
+    chrome::kSearchEnginesSubPage,
+    chrome::kSyncSetupSubPage,
 #if defined(OS_CHROMEOS)
-    chrome::kAccessibilitySubPage,   chrome::kBluetoothSubPage,
-    chrome::kDateTimeSubPage,        chrome::kDisplaySubPage,
-    chrome::kInternetSubPage,        chrome::kPowerSubPage,
+    chrome::kAccessibilitySubPage,
+    chrome::kBluetoothSubPage,
+    chrome::kDateTimeSubPage,
+    chrome::kDisplaySubPage,
+    chrome::kInternetSubPage,
+    chrome::kPowerSubPage,
     chrome::kStylusSubPage,
 #else
-    chrome::kCreateProfileSubPage,   chrome::kImportDataSubPage,
-    chrome::kManageProfileSubPage,   chrome::kPeopleSubPage,
+    chrome::kCreateProfileSubPage,
+    chrome::kImportDataSubPage,
+    chrome::kManageProfileSubPage,
+    chrome::kPeopleSubPage,
 #endif
 };
 #endif  // !defined(OS_ANDROID)
diff --git a/chrome/browser/background/background_mode_manager_mac.mm b/chrome/browser/background/background_mode_manager_mac.mm
index 58e12b6..221dfb7 100644
--- a/chrome/browser/background/background_mode_manager_mac.mm
+++ b/chrome/browser/background/background_mode_manager_mac.mm
@@ -6,7 +6,7 @@
 #include "base/command_line.h"
 #include "base/mac/mac_util.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/background/background_mode_manager.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/background/background_mode_manager_win.cc b/chrome/browser/background/background_mode_manager_win.cc
index 36ec9fb4..f523b4e 100644
--- a/chrome/browser/background/background_mode_manager_win.cc
+++ b/chrome/browser/background/background_mode_manager_win.cc
@@ -9,7 +9,7 @@
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/win/registry.h"
 #include "chrome/browser/background/background_mode_manager.h"
 #include "chrome/common/chrome_switches.h"
diff --git a/chrome/browser/bookmarks/bookmark_html_writer.h b/chrome/browser/bookmarks/bookmark_html_writer.h
index f3fc24f..3365891 100644
--- a/chrome/browser/bookmarks/bookmark_html_writer.h
+++ b/chrome/browser/bookmarks/bookmark_html_writer.h
@@ -14,7 +14,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/task/cancelable_task_tracker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/favicon_base/favicon_types.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
index f4e4433..5a8030a9 100644
--- a/chrome/browser/browser_process.h
+++ b/chrome/browser/browser_process.h
@@ -39,11 +39,8 @@
 class WatchDogThread;
 class WebRtcLogUploader;
 
-namespace content {
-class NetworkConnectionTracker;
-}
-
 namespace network {
+class NetworkConnectionTracker;
 class NetworkQualityTracker;
 class SharedURLLoaderFactory;
 }
@@ -188,7 +185,7 @@
 
   // Returns a NetworkConnectionTracker that can be used to subscribe for
   // network change events.
-  virtual content::NetworkConnectionTracker* network_connection_tracker() = 0;
+  virtual network::NetworkConnectionTracker* network_connection_tracker() = 0;
 
   // Returns a NetworkQualityTracker that can be used to subscribe for
   // network quality change events.
diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
index d10dc158..2ce3eea 100644
--- a/chrome/browser/browser_process_impl.cc
+++ b/chrome/browser/browser_process_impl.cc
@@ -25,8 +25,8 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -117,7 +117,6 @@
 #include "components/web_resource/web_resource_pref_names.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/child_process_security_policy.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/plugin_service.h"
@@ -135,6 +134,7 @@
 #include "net/url_request/url_request_context_getter.h"
 #include "ppapi/buildflags/buildflags.h"
 #include "printing/buildflags/buildflags.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/network/public/cpp/network_quality_tracker.h"
 #include "services/network/public/cpp/network_switches.h"
 #include "services/preferences/public/cpp/in_process_service_factory.h"
@@ -637,13 +637,13 @@
   return system_network_context_manager()->GetSharedURLLoaderFactory();
 }
 
-content::NetworkConnectionTracker*
+network::NetworkConnectionTracker*
 BrowserProcessImpl::network_connection_tracker() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(io_thread_);
   if (!network_connection_tracker_) {
     network_connection_tracker_ =
-        std::make_unique<content::NetworkConnectionTracker>(
+        std::make_unique<network::NetworkConnectionTracker>(
             base::BindRepeating(&content::GetNetworkService));
   }
   return network_connection_tracker_.get();
diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
index 1d5a6e2..834e6c6 100644
--- a/chrome/browser/browser_process_impl.h
+++ b/chrome/browser/browser_process_impl.h
@@ -126,7 +126,7 @@
   SystemNetworkContextManager* system_network_context_manager() override;
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory()
       override;
-  content::NetworkConnectionTracker* network_connection_tracker() override;
+  network::NetworkConnectionTracker* network_connection_tracker() override;
   network::NetworkQualityTracker* network_quality_tracker() override;
   WatchDogThread* watchdog_thread() override;
   ProfileManager* profile_manager() override;
@@ -243,7 +243,7 @@
 
   std::unique_ptr<SystemNetworkContextManager> system_network_context_manager_;
 
-  std::unique_ptr<content::NetworkConnectionTracker>
+  std::unique_ptr<network::NetworkConnectionTracker>
       network_connection_tracker_;
 
   std::unique_ptr<network::NetworkQualityTracker> network_quality_tracker_;
diff --git a/chrome/browser/browser_process_impl_unittest.cc b/chrome/browser/browser_process_impl_unittest.cc
index e407217b..30400aa 100644
--- a/chrome/browser/browser_process_impl_unittest.cc
+++ b/chrome/browser/browser_process_impl_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/metrics/user_metrics.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index 7b8c34ff..643b28c 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -686,6 +686,9 @@
       <if expr="not is_android">
         <include name="IDR_TAB_RANKER_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="resource_coordinator\tab_ranker\example_preprocessor_config.pb" type="BINDATA" />
       </if>
+      <if expr="chromeos">
+        <include name="IDR_SMART_DIM_EXAMPLE_PREPROCESSOR_CONFIG_PB" file="chromeos\power\ml\smart_dim\example_preprocessor_config.pb" type="BINDATA" />
+      </if>
     </includes>
   </release>
 </grit>
diff --git a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
index 06fc4bab..b66a3aa 100644
--- a/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
+++ b/chrome/browser/browsing_data/browsing_data_remover_browsertest.cc
@@ -530,8 +530,8 @@
   {
     base::RunLoop run_loop;
     video_decode_perf_history->GetSaveCallback().Run(
-        kOrigin, kIsTopFrame, prediction_features, prediction_targets,
-        kPlayerId, run_loop.QuitWhenIdleClosure());
+        ukm::kInvalidSourceId, kIsTopFrame, prediction_features,
+        prediction_targets, kPlayerId, run_loop.QuitWhenIdleClosure());
     run_loop.Run();
   }
 
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
index 182072a..e98fd9d 100644
--- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
+++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -15,7 +15,7 @@
 #include "base/callback.h"
 #include "base/callback_helpers.h"
 #include "base/metrics/user_metrics.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/android/feed/feed_host_service_factory.h"
 #include "chrome/browser/autofill/personal_data_manager_factory.h"
diff --git a/chrome/browser/browsing_data/site_data_size_collector.cc b/chrome/browser/browsing_data/site_data_size_collector.cc
index b9e4521..5256e28c 100644
--- a/chrome/browser/browsing_data/site_data_size_collector.cc
+++ b/chrome/browser/browsing_data/site_data_size_collector.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/browsing_data/site_data_size_collector.h"
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/pref_names.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/budget_service/budget_database.cc b/chrome/browser/budget_service/budget_database.cc
index 55b8ab7..14f16b9 100644
--- a/chrome/browser/budget_service/budget_database.cc
+++ b/chrome/browser/budget_service/budget_database.cc
@@ -6,7 +6,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/clock.h"
 #include "base/time/default_clock.h"
 #include "chrome/browser/budget_service/budget.pb.h"
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc
index 08bf50e..29790d96c 100644
--- a/chrome/browser/chrome_browser_field_trials.cc
+++ b/chrome/browser/chrome_browser_field_trials.cc
@@ -18,7 +18,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/metrics/chrome_metrics_service_client.h"
diff --git a/chrome/browser/chrome_browser_field_trials_desktop.cc b/chrome/browser/chrome_browser_field_trials_desktop.cc
index 049d14f3..e72df79 100644
--- a/chrome/browser/chrome_browser_field_trials_desktop.cc
+++ b/chrome/browser/chrome_browser_field_trials_desktop.cc
@@ -21,7 +21,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/prerender/prerender_field_trial.h"
 #include "chrome/common/chrome_paths.h"
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 21c4de68..8faaf838 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -40,7 +40,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
@@ -2084,8 +2084,6 @@
 
   performance_monitor::PerformanceMonitor::GetInstance()->StartGatherCycle();
 
-  resource_coordinator::RenderProcessProbe::GetInstance()->StartGatherCycle();
-
   metrics::MetricsService::SetExecutionPhase(
       metrics::ExecutionPhase::MAIN_MESSAGE_LOOP_RUN,
       g_browser_process->local_state());
diff --git a/chrome/browser/chrome_browser_main_android.cc b/chrome/browser/chrome_browser_main_android.cc
index f292a78..fa700a5b 100644
--- a/chrome/browser/chrome_browser_main_android.cc
+++ b/chrome/browser/chrome_browser_main_android.cc
@@ -10,7 +10,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/android/mojo/chrome_interface_registrar_android.h"
 #include "chrome/browser/android/preferences/clipboard_android.h"
diff --git a/chrome/browser/chrome_browser_main_linux.cc b/chrome/browser/chrome_browser_main_linux.cc
index 25992d9f..ab9bf62 100644
--- a/chrome/browser/chrome_browser_main_linux.cc
+++ b/chrome/browser/chrome_browser_main_linux.cc
@@ -12,7 +12,7 @@
 
 #include "base/files/file_path.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/grit/chromium_strings.h"
diff --git a/chrome/browser/chrome_browser_main_mac.mm b/chrome/browser/chrome_browser_main_mac.mm
index a07ff6f..689f151 100644
--- a/chrome/browser/chrome_browser_main_mac.mm
+++ b/chrome/browser/chrome_browser_main_mac.mm
@@ -15,8 +15,8 @@
 #include "base/mac/scoped_nsobject.h"
 #include "base/mac/sdk_forward_declarations.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #import "chrome/browser/app_controller_mac.h"
 #include "chrome/browser/apps/app_shim/app_shim_host_manager_mac.h"
diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc
index b39ae49e..cc39c3d 100644
--- a/chrome/browser/chrome_browser_main_win.cc
+++ b/chrome/browser/chrome_browser_main_win.cc
@@ -27,7 +27,7 @@
 #include "base/scoped_native_library.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/version.h"
 #include "base/win/pe_image.h"
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index d399763..9846c9c 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -357,7 +357,7 @@
 #include "services/proxy_resolver/proxy_resolver_service.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "third_party/blink/public/platform/modules/payments/payment_request.mojom.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h"
 #include "ui/base/resource/resource_bundle_android.h"
 #include "ui/base/ui_base_paths.h"
 #elif defined(OS_POSIX)
@@ -1418,7 +1418,7 @@
 }
 
 const char*
-ChromeContentBrowserClient::GetInitatorSchemeBypassingDocumentBlocking() {
+ChromeContentBrowserClient::GetInitiatorSchemeBypassingDocumentBlocking() {
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   // Don't block responses for extension processes or for content scripts.
   // TODO(creis): When every extension fetch (including content scripts) has
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index c78cafd..173ea46e 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -117,7 +117,7 @@
                                        const GURL& effective_site_url) override;
   bool ShouldLockToOrigin(content::BrowserContext* browser_context,
                           const GURL& effective_site_url) override;
-  const char* GetInitatorSchemeBypassingDocumentBlocking() override;
+  const char* GetInitiatorSchemeBypassingDocumentBlocking() override;
   void GetAdditionalWebUISchemes(
       std::vector<std::string>* additional_schemes) override;
   void GetAdditionalViewSourceSchemes(
diff --git a/chrome/browser/chrome_do_not_track_browsertest.cc b/chrome/browser/chrome_do_not_track_browsertest.cc
index e9e7667..694e3ad 100644
--- a/chrome/browser/chrome_do_not_track_browsertest.cc
+++ b/chrome/browser/chrome_do_not_track_browsertest.cc
@@ -18,30 +18,47 @@
 
 class ChromeDoNotTrackTest : public InProcessBrowserTest {
  protected:
-  void TestDoNoTrack(bool enabled) {
-    ASSERT_TRUE(embedded_test_server()->Start());
-
+  void SetEnableDoNotTrack(bool enabled) {
     PrefService* prefs = browser()->profile()->GetPrefs();
     prefs->SetBoolean(prefs::kEnableDoNotTrack, enabled);
+  }
 
-    GURL url = embedded_test_server()->GetURL("/echo");
-    ui_test_utils::NavigateToURL(browser(), url);
-    EXPECT_EQ(enabled, browser()
-                           ->tab_strip_model()
-                           ->GetActiveWebContents()
-                           ->GetMutableRendererPrefs()
-                           ->enable_do_not_track);
+  void ExpectPageTextEq(const std::string& expected_content) {
+    std::string text;
+    ASSERT_TRUE(ExecuteScriptAndExtractString(
+        browser()->tab_strip_model()->GetActiveWebContents(),
+        "window.domAutomationController.send(document.body.innerText);",
+        &text));
+    EXPECT_EQ(expected_content, text);
   }
 };
 
-// Checks that the DNT preference is set on the WebContents when navigating.
-
 IN_PROC_BROWSER_TEST_F(ChromeDoNotTrackTest, NotEnabled) {
-  TestDoNoTrack(/*enabled=*/false);
+  ASSERT_TRUE(embedded_test_server()->Start());
+  SetEnableDoNotTrack(false /* enabled */);
+
+  GURL url = embedded_test_server()->GetURL("/echoheader?DNT");
+  ui_test_utils::NavigateToURL(browser(), url);
+  EXPECT_EQ(false, browser()
+                       ->tab_strip_model()
+                       ->GetActiveWebContents()
+                       ->GetMutableRendererPrefs()
+                       ->enable_do_not_track);
+  ExpectPageTextEq("None");
 }
 
 IN_PROC_BROWSER_TEST_F(ChromeDoNotTrackTest, Enabled) {
-  TestDoNoTrack(/*enabled=*/true);
+  ASSERT_TRUE(embedded_test_server()->Start());
+  SetEnableDoNotTrack(true /* enabled */);
+
+  GURL url = embedded_test_server()->GetURL("/echoheader?DNT");
+  ui_test_utils::NavigateToURL(browser(), url);
+  EXPECT_EQ(true, browser()
+                      ->tab_strip_model()
+                      ->GetActiveWebContents()
+                      ->GetMutableRendererPrefs()
+                      ->enable_do_not_track);
+  ExpectPageTextEq("1");
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 1f11627..9a37ce5 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -56,8 +56,9 @@
     "//cc/paint",
     "//chrome/app:command_ids",
     "//chrome/app/vector_icons",
-    "//chrome/browser:rlz",
     "//chrome/browser/apps/foundation/app_service:lib",
+    "//chrome/browser/chromeos/power/ml:user_activity_ukm_logger_helpers",
+    "//chrome/browser/chromeos/power/ml/smart_dim",
     "//chrome/browser/devtools",
     "//chrome/browser/extensions",
     "//chrome/browser/resource_coordinator:tab_metrics_event_proto",
@@ -105,6 +106,7 @@
     "//components/feedback",
     "//components/flags_ui",
     "//components/gcm_driver",
+    "//components/google/core/common:common",
     "//components/guest_view/browser",
     "//components/image_fetcher/core",
     "//components/invalidation/impl",
@@ -127,6 +129,7 @@
     "//components/quirks",
     "//components/rappor",
     "//components/renderer_context_menu",
+    "//components/rlz",
     "//components/safe_browsing:csd_proto",
     "//components/safe_browsing/db:metadata_proto",
     "//components/session_manager/core",
@@ -1533,9 +1536,6 @@
     "power/ml/real_boot_clock.h",
     "power/ml/recent_events_counter.cc",
     "power/ml/recent_events_counter.h",
-    "power/ml/smart_dim_model.h",
-    "power/ml/smart_dim_model_impl.cc",
-    "power/ml/smart_dim_model_impl.h",
     "power/ml/user_activity_controller.cc",
     "power/ml/user_activity_controller.h",
     "power/ml/user_activity_manager.cc",
@@ -2176,7 +2176,9 @@
     "power/ml/idle_event_notifier_unittest.cc",
     "power/ml/real_boot_clock_unittest.cc",
     "power/ml/recent_events_counter_unittest.cc",
+    "power/ml/smart_dim/model_unittest.cc",
     "power/ml/user_activity_manager_unittest.cc",
+    "power/ml/user_activity_ukm_logger_helpers_unittest.cc",
     "power/ml/user_activity_ukm_logger_unittest.cc",
     "power/power_data_collector_unittest.cc",
     "power/power_metrics_reporter_unittest.cc",
@@ -2294,6 +2296,7 @@
     ":arc_test_support",
     ":attestation_proto",
     ":test_support",
+    ":user_activity_event_proto",
     "//ash",
     "//ash/system/message_center/arc:test_support",
     "//base",
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data.cc b/chrome/browser/chromeos/app_mode/kiosk_app_data.cc
index c32817d..71de044 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_data.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_data.cc
@@ -11,7 +11,7 @@
 #include "base/json/json_writer.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/app_mode/kiosk_app_data_delegate.h"
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc b/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc
index 22a00c9..61b984e 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_data_base.cc
@@ -7,8 +7,8 @@
 #include <utility>
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/browser_process.h"
 #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc b/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc
index 6f741fa..182e41fc 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_icon_loader.cc
@@ -10,8 +10,8 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/image_decoder.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
index 6cf552b9..b56227c7 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
@@ -18,7 +18,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/app_mode/app_session.h"
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_update_service_browsertest.cc b/chrome/browser/chromeos/app_mode/kiosk_app_update_service_browsertest.cc
index 1b3d275..bae6f6a 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_update_service_browsertest.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_update_service_browsertest.cc
@@ -20,8 +20,8 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/scoped_path_override.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/arc/arc_util.cc b/chrome/browser/chromeos/arc/arc_util.cc
index 85fb065..1dfd077 100644
--- a/chrome/browser/chromeos/arc/arc_util.cc
+++ b/chrome/browser/chromeos/arc/arc_util.cc
@@ -17,10 +17,11 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/policy/arc_policy_util.h"
+#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/user_flow.h"
 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
@@ -553,14 +554,7 @@
 }
 
 bool IsArcDemoModeSetupFlow() {
-  chromeos::LoginDisplayHost* const host =
-      chromeos::LoginDisplayHost::default_host();
-  if (!host)
-    return false;
-
-  const chromeos::WizardController* const wizard_controller =
-      host->GetWizardController();
-  return wizard_controller && wizard_controller->is_in_demo_mode_setup_flow();
+  return chromeos::DemoSetupController::IsOobeDemoSetupFlowInProgress();
 }
 
 void UpdateArcFileSystemCompatibilityPrefIfNeeded(
diff --git a/chrome/browser/chromeos/arc/downloads_watcher/arc_downloads_watcher_service.cc b/chrome/browser/chromeos/arc/downloads_watcher/arc_downloads_watcher_service.cc
index 51bcade..3fd32d3 100644
--- a/chrome/browser/chromeos/arc/downloads_watcher/arc_downloads_watcher_service.cc
+++ b/chrome/browser/chromeos/arc/downloads_watcher/arc_downloads_watcher_service.cc
@@ -18,8 +18,8 @@
 #include "base/memory/singleton.h"
 #include "base/sequence_checker.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chrome/browser/download/download_prefs.h"
diff --git a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc
index 01eaddb4..98bf963 100644
--- a/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc
+++ b/chrome/browser/chromeos/arc/fileapi/arc_content_file_system_file_stream_reader.cc
@@ -8,7 +8,7 @@
 #include <unistd.h>
 
 #include "base/files/file.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner_util.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc
index 6603da7..d2a4e19f 100644
--- a/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc
+++ b/chrome/browser/chromeos/arc/fileapi/file_stream_forwarder.cc
@@ -8,8 +8,8 @@
 #include <utility>
 
 #include "base/files/file_util.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/net_errors.h"
 
diff --git a/chrome/browser/chromeos/arc/intent_helper/start_smart_selection_action_menu.cc b/chrome/browser/chromeos/arc/intent_helper/start_smart_selection_action_menu.cc
index 4b8085d..056240e 100644
--- a/chrome/browser/chromeos/arc/intent_helper/start_smart_selection_action_menu.cc
+++ b/chrome/browser/chromeos/arc/intent_helper/start_smart_selection_action_menu.cc
@@ -8,6 +8,7 @@
 #include <utility>
 
 #include "base/bind.h"
+#include "base/metrics/user_metrics.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/chrome_command_ids.h"
@@ -53,6 +54,7 @@
   if (!instance)
     return;
 
+  base::RecordAction(base::UserMetricsAction("Arc.SmartTextSelection.Request"));
   instance->RequestTextSelectionActions(
       base::UTF16ToUTF8(params.selection_text),
       mojom::ScaleFactor(ui::GetSupportedScaleFactors().back()),
diff --git a/chrome/browser/chromeos/arc/print/arc_print_service.cc b/chrome/browser/chromeos/arc/print/arc_print_service.cc
index ba1e2826..a846d5b 100644
--- a/chrome/browser/chromeos/arc/print/arc_print_service.cc
+++ b/chrome/browser/chromeos/arc/print/arc_print_service.cc
@@ -13,7 +13,7 @@
 #include "base/bind_helpers.h"
 #include "base/memory/singleton.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/printing/cups_print_job.h"
 #include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
diff --git a/chrome/browser/chromeos/arc/process/arc_process_service.cc b/chrome/browser/chromeos/arc/process/arc_process_service.cc
index 806e160..da755e2d 100644
--- a/chrome/browser/chromeos/arc/process/arc_process_service.cc
+++ b/chrome/browser/chromeos/arc/process/arc_process_service.cc
@@ -21,8 +21,8 @@
 #include "base/memory/singleton.h"
 #include "base/process/process.h"
 #include "base/process/process_iterator.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/trace_event/trace_event.h"
 #include "components/arc/arc_bridge_service.h"
diff --git a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
index ba244c57..3dcb55f 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.cc
@@ -19,7 +19,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/boot_phase_monitor/arc_boot_phase_monitor_bridge.h"
 #include "chrome/browser/chromeos/arc/voice_interaction/highlighter_controller_client.h"
diff --git a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc
index 04ab055..8c021aa 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc
+++ b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.cc
@@ -58,6 +58,11 @@
   std::move(callback).Run(voice_interaction_setup_completed_);
 }
 
+void FakeVoiceInteractionController::IsContextEnabled(
+    IsContextEnabledCallback callback) {
+  std::move(callback).Run(voice_interaction_context_enabled_);
+}
+
 void FakeVoiceInteractionController::IsHotwordEnabled(
     IsHotwordEnabledCallback callback) {
   std::move(callback).Run(voice_interaction_hotword_enabled_);
diff --git a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h
index 82b5e30..bb5b6223 100644
--- a/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h
+++ b/chrome/browser/chromeos/arc/voice_interaction/fake_voice_interaction_controller.h
@@ -28,6 +28,7 @@
   void NotifyNotificationEnabled(bool enabled) override;
   void IsSettingEnabled(IsSettingEnabledCallback callback) override;
   void IsSetupCompleted(IsSetupCompletedCallback callback) override;
+  void IsContextEnabled(IsContextEnabledCallback callback) override;
   void IsHotwordEnabled(IsHotwordEnabledCallback callback) override;
   void AddObserver(ash::mojom::VoiceInteractionObserverPtr observer) override {}
 
diff --git a/chrome/browser/chromeos/arc/wallpaper/arc_wallpaper_service.cc b/chrome/browser/chromeos/arc/wallpaper/arc_wallpaper_service.cc
index 5c036ec5..9db2ecb 100644
--- a/chrome/browser/chromeos/arc/wallpaper/arc_wallpaper_service.cc
+++ b/chrome/browser/chromeos/arc/wallpaper/arc_wallpaper_service.cc
@@ -10,7 +10,7 @@
 
 #include "base/logging.h"
 #include "base/memory/singleton.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/ui/ash/wallpaper_controller_client.h"
 #include "components/account_id/account_id.h"
 #include "components/arc/arc_bridge_service.h"
diff --git a/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc b/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc
index 350ec89..6b05e11 100644
--- a/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc
+++ b/chrome/browser/chromeos/authpolicy/auth_policy_credentials_manager.cc
@@ -11,7 +11,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/lifetime/application_lifetime.h"
diff --git a/chrome/browser/chromeos/base/file_flusher.cc b/chrome/browser/chromeos/base/file_flusher.cc
index 7234070..3864d514 100644
--- a/chrome/browser/chromeos/base/file_flusher.cc
+++ b/chrome/browser/chromeos/base/file_flusher.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_enumerator.h"
 #include "base/logging.h"
 #include "base/synchronization/cancellation_flag.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/base/locale_util.cc b/chrome/browser/chromeos/base/locale_util.cc
index e7b8098..aba8c11b 100644
--- a/chrome/browser/chromeos/base/locale_util.cc
+++ b/chrome/browser/chromeos/base/locale_util.cc
@@ -7,7 +7,7 @@
 #include <utility>
 #include <vector>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/session/user_session_manager.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/boot_times_recorder.cc b/chrome/browser/chromeos/boot_times_recorder.cc
index 5c48e214..7ae4ac2d 100644
--- a/chrome/browser/chromeos/boot_times_recorder.cc
+++ b/chrome/browser/chromeos/boot_times_recorder.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/chromeos/camera_detector.cc b/chrome/browser/chromeos/camera_detector.cc
index 60b79596..be39a67 100644
--- a/chrome/browser/chromeos/camera_detector.cc
+++ b/chrome/browser/chromeos/camera_detector.cc
@@ -10,7 +10,7 @@
 #include "base/location.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "components/storage_monitor/udev_util_linux.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 57dc910..c1ada1b 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -29,9 +29,9 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part_chromeos.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.cc b/chrome/browser/chromeos/crostini/crostini_manager.cc
index edb40d4..9d1c15c 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.cc
+++ b/chrome/browser/chromeos/crostini/crostini_manager.cc
@@ -12,12 +12,11 @@
 #include "base/no_destructor.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/crostini/crostini_remover.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser.h"
@@ -448,28 +447,6 @@
   InstallTerminaComponent(base::DoNothing());
 }
 
-namespace {
-void InstallTerminaComponentLoaderCallback(
-    CrostiniManager::BoolCallback callback,
-    component_updater::CrOSComponentManager::Error error,
-    const base::FilePath& result) {
-  DCHECK(!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-
-  bool is_successful =
-      error == component_updater::CrOSComponentManager::Error::NONE;
-
-  if (!is_successful) {
-    LOG(ERROR)
-        << "Failed to install the cros-termina component with error code: "
-        << static_cast<int>(error);
-  }
-  // Hop to the UI thread to update state and run |callback|.
-  content::BrowserThread::PostTask(
-      content::BrowserThread::UI, FROM_HERE,
-      base::BindOnce(std::move(callback), is_successful));
-}
-}  // namespace
-
 void CrostiniManager::InstallTerminaComponent(BoolCallback callback) {
   if (chromeos::DBusThreadManager::Get()->IsUsingFakes()) {
     // Running in test. We still PostTask to prevent races.
@@ -477,7 +454,9 @@
         content::BrowserThread::UI, FROM_HERE,
         base::BindOnce(&CrostiniManager::OnInstallTerminaComponent,
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback),
-                       true, true));
+                       true,
+                       component_updater::CrOSComponentManager::Error::NONE,
+                       base::FilePath()));
     return;
   }
   auto* cros_component_manager =
@@ -517,20 +496,30 @@
       imageloader::kTerminaComponentName,
       component_updater::CrOSComponentManager::MountPolicy::kMount,
       update_policy,
-      base::BindOnce(
-          InstallTerminaComponentLoaderCallback,
-          base::BindOnce(&CrostiniManager::OnInstallTerminaComponent,
-                         weak_ptr_factory_.GetWeakPtr(), std::move(callback),
-                         update_policy == UpdatePolicy::kForce)));
+      base::BindOnce(&CrostiniManager::OnInstallTerminaComponent,
+                     weak_ptr_factory_.GetWeakPtr(), std::move(callback),
+                     update_policy == UpdatePolicy::kForce));
 }
 
-void CrostiniManager::OnInstallTerminaComponent(BoolCallback callback,
-                                                bool is_update_checked,
-                                                bool is_successful) {
+void CrostiniManager::OnInstallTerminaComponent(
+    CrostiniManager::BoolCallback callback,
+    bool is_update_checked,
+    component_updater::CrOSComponentManager::Error error,
+    const base::FilePath& result) {
+  bool is_successful =
+      error == component_updater::CrOSComponentManager::Error::NONE;
+
+  if (!is_successful) {
+    LOG(ERROR)
+        << "Failed to install the cros-termina component with error code: "
+        << static_cast<int>(error);
+  }
+
   if (is_successful && is_update_checked) {
     VLOG(1) << "cros-termina update check successful.";
     termina_update_check_needed_ = false;
   }
+
   std::move(callback).Run(is_successful);
 }
 
@@ -1238,6 +1227,13 @@
   }
 }
 
+void CrostiniManager::OnLxdContainerCreated(
+    const vm_tools::cicerone::LxdContainerCreatedSignal& signal) {}
+void CrostiniManager::OnLxdContainerDownloading(
+    const vm_tools::cicerone::LxdContainerDownloadingSignal& signal) {}
+void CrostiniManager::OnTremplinStarted(
+    const vm_tools::cicerone::TremplinStartedSignal& signal) {}
+
 void CrostiniManager::OnLaunchContainerApplication(
     LaunchContainerApplicationCallback callback,
     base::Optional<vm_tools::cicerone::LaunchContainerApplicationResponse>
diff --git a/chrome/browser/chromeos/crostini/crostini_manager.h b/chrome/browser/chromeos/crostini/crostini_manager.h
index 90ef750..6f9a05a 100644
--- a/chrome/browser/chromeos/crostini/crostini_manager.h
+++ b/chrome/browser/chromeos/crostini/crostini_manager.h
@@ -16,6 +16,7 @@
 #include "base/memory/singleton.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
+#include "chrome/browser/component_updater/cros_component_installer_chromeos.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/extensions/app_launch_params.h"
 #include "chromeos/dbus/cicerone/cicerone_service.pb.h"
@@ -328,6 +329,12 @@
   void OnInstallLinuxPackageProgress(
       const vm_tools::cicerone::InstallLinuxPackageProgressSignal& signal)
       override;
+  void OnLxdContainerCreated(
+      const vm_tools::cicerone::LxdContainerCreatedSignal& signal) override;
+  void OnLxdContainerDownloading(
+      const vm_tools::cicerone::LxdContainerDownloadingSignal& signal) override;
+  void OnTremplinStarted(
+      const vm_tools::cicerone::TremplinStartedSignal& signal) override;
 
   void RemoveCrostini(Profile* profile,
                       std::string vm_name,
@@ -383,9 +390,11 @@
 
   // Callback for CrostiniManager::InstallCrostiniComponent. Must be called on
   // the UI thread.
-  void OnInstallTerminaComponent(BoolCallback callback,
-                                 bool is_update_checked,
-                                 bool is_successful);
+  void OnInstallTerminaComponent(
+      BoolCallback callback,
+      bool is_update_checked,
+      component_updater::CrOSComponentManager::Error error,
+      const base::FilePath& result);
 
   // Callback for CrostiniClient::StartConcierge. Called after the
   // DebugDaemon service method finishes.
diff --git a/chrome/browser/chromeos/crostini/crostini_registry_service.cc b/chrome/browser/chromeos/crostini/crostini_registry_service.cc
index 52e3d16..de66412 100644
--- a/chrome/browser/chromeos/crostini/crostini_registry_service.cc
+++ b/chrome/browser/chromeos/crostini/crostini_registry_service.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/clock.h"
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/crostini/crostini_util.cc b/chrome/browser/chromeos/crostini/crostini_util.cc
index 259bec5..b8f26e28 100644
--- a/chrome/browser/chromeos/crostini/crostini_util.cc
+++ b/chrome/browser/chromeos/crostini/crostini_util.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/timer/timer.h"
 #include "chrome/browser/chromeos/crostini/crostini_app_launch_observer.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
diff --git a/chrome/browser/chromeos/customization/customization_document.cc b/chrome/browser/chromeos/customization/customization_document.cc
index df803c8..a326f27 100644
--- a/chrome/browser/chromeos/customization/customization_document.cc
+++ b/chrome/browser/chromeos/customization/customization_document.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/customization/customization_wallpaper_downloader.cc b/chrome/browser/chromeos/customization/customization_wallpaper_downloader.cc
index 964e165..9c56e242 100644
--- a/chrome/browser/chromeos/customization/customization_wallpaper_downloader.cc
+++ b/chrome/browser/chromeos/customization/customization_wallpaper_downloader.cc
@@ -9,7 +9,7 @@
 #include <utility>
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/customization/customization_wallpaper_util.cc b/chrome/browser/chromeos/customization/customization_wallpaper_util.cc
index fd0865977..0e02406 100644
--- a/chrome/browser/chromeos/customization/customization_wallpaper_util.cc
+++ b/chrome/browser/chromeos/customization/customization_wallpaper_util.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/customization/customization_document.h"
 #include "chrome/browser/chromeos/login/users/avatar/user_image_loader.h"
diff --git a/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.cc b/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.cc
index 8ee5e3f..fba84cfa 100644
--- a/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.cc
+++ b/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.cc
@@ -4,10 +4,12 @@
 
 #include "chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.h"
 
+#include "base/feature_list.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/chrome_features.h"
 
 namespace chromeos {
 
@@ -28,4 +30,8 @@
   return IsCrostiniAllowedForProfile(profile);
 }
 
+bool FinchFeaturesServiceProviderDelegate::IsUsbguardEnabled() {
+  return base::FeatureList::IsEnabled(features::kUsbguard);
+}
+
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.h b/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.h
index fc0b7084..eb1e241 100644
--- a/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.h
+++ b/chrome/browser/chromeos/dbus/finch_features_service_provider_delegate.h
@@ -19,6 +19,7 @@
 
   // ChromeServiceProvider::Delegate:
   bool IsCrostiniEnabled(const std::string& user_id_hash) override;
+  bool IsUsbguardEnabled() override;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(FinchFeaturesServiceProviderDelegate);
diff --git a/chrome/browser/chromeos/drive/download_handler.cc b/chrome/browser/chromeos/drive/download_handler.cc
index 9a64b24f..9ddc7c3 100644
--- a/chrome/browser/chromeos/drive/download_handler.cc
+++ b/chrome/browser/chromeos/drive/download_handler.cc
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/strings/string_util.h"
 #include "base/supports_user_data.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
diff --git a/chrome/browser/chromeos/drive/drive_integration_service.cc b/chrome/browser/chromeos/drive/drive_integration_service.cc
index 086221f..f081c007 100644
--- a/chrome/browser/chromeos/drive/drive_integration_service.cc
+++ b/chrome/browser/chromeos/drive/drive_integration_service.cc
@@ -14,7 +14,7 @@
 #include "base/md5.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/timer/timer.h"
 #include "base/unguessable_token.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/drive/file_system_util.cc b/chrome/browser/chromeos/drive/file_system_util.cc
index 4aa407a..24a89e80 100644
--- a/chrome/browser/chromeos/drive/file_system_util.cc
+++ b/chrome/browser/chromeos/drive/file_system_util.cc
@@ -20,7 +20,7 @@
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
diff --git a/chrome/browser/chromeos/drive/fileapi/async_file_util.cc b/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
index f266230..5fc15ff 100644
--- a/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
+++ b/chrome/browser/chromeos/drive/fileapi/async_file_util.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
diff --git a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc b/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
index 3ce1dec2..a99c659 100644
--- a/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
+++ b/chrome/browser/chromeos/drive/fileapi/fileapi_worker.cc
@@ -11,7 +11,7 @@
 
 #include "base/files/file_path.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
 #include "components/drive/chromeos/file_system_interface.h"
diff --git a/chrome/browser/chromeos/drive/write_on_cache_file.cc b/chrome/browser/chromeos/drive/write_on_cache_file.cc
index 3a8df1a..2598505 100644
--- a/chrome/browser/chromeos/drive/write_on_cache_file.cc
+++ b/chrome/browser/chromeos/drive/write_on_cache_file.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/drive/chromeos/file_system_interface.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/chromeos/extensions/default_app_order.cc b/chrome/browser/chromeos/extensions/default_app_order.cc
index 912c5a40..8b8f641 100644
--- a/chrome/browser/chromeos/extensions/default_app_order.cc
+++ b/chrome/browser/chromeos/extensions/default_app_order.cc
@@ -13,7 +13,7 @@
 #include "base/json/json_file_value_serializer.h"
 #include "base/macros.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/genius_app/app_id.h"
diff --git a/chrome/browser/chromeos/extensions/echo_private_api.cc b/chrome/browser/chromeos/extensions/echo_private_api.cc
index 83689783..edd80ee 100644
--- a/chrome/browser/chromeos/extensions/echo_private_api.cc
+++ b/chrome/browser/chromeos/extensions/echo_private_api.cc
@@ -13,7 +13,7 @@
 #include "base/location.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/extensions/external_cache_impl_unittest.cc b/chrome/browser/chromeos/extensions/external_cache_impl_unittest.cc
index 4417552..dc09cf2e 100644
--- a/chrome/browser/chromeos/extensions/external_cache_impl_unittest.cc
+++ b/chrome/browser/chromeos/extensions/external_cache_impl_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/extensions/external_cache_delegate.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
index f12ec7da..968c595 100644
--- a/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router.cc
@@ -2,10 +2,12 @@
 // 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/file_manager/device_event_router.h"
+
 #include "base/bind.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "chrome/browser/chromeos/extensions/file_manager/device_event_router.h"
 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
+#include "chromeos/disks/disk.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace file_manager {
@@ -63,14 +65,12 @@
   OnDeviceEvent(file_manager_private::DEVICE_EVENT_TYPE_REMOVED, device_path);
 }
 
-void DeviceEventRouter::OnDiskAdded(
-    const chromeos::disks::DiskMountManager::Disk& disk,
-    bool mounting) {
+void DeviceEventRouter::OnDiskAdded(const chromeos::disks::Disk& disk,
+                                    bool mounting) {
   // Do nothing.
 }
 
-void DeviceEventRouter::OnDiskRemoved(
-    const chromeos::disks::DiskMountManager::Disk& disk) {
+void DeviceEventRouter::OnDiskRemoved(const chromeos::disks::Disk& disk) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   if (is_resuming_ || is_starting_up_)
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router.h b/chrome/browser/chromeos/extensions/file_manager/device_event_router.h
index f912720..2039feb 100644
--- a/chrome/browser/chromeos/extensions/file_manager/device_event_router.h
+++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router.h
@@ -42,10 +42,8 @@
   void Startup();
 
   // VolumeManagerObserver overrides.
-  void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
-                   bool mounting) override;
-  void OnDiskRemoved(
-      const chromeos::disks::DiskMountManager::Disk& disk) override;
+  void OnDiskAdded(const chromeos::disks::Disk& disk, bool mounting) override;
+  void OnDiskRemoved(const chromeos::disks::Disk& disk) override;
   void OnDeviceAdded(const std::string& device_path) override;
   void OnDeviceRemoved(const std::string& device_path) override;
   void OnVolumeMounted(chromeos::MountError error_code,
diff --git a/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc
index c34fefad..5c8f21d 100644
--- a/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/device_event_router_unittest.cc
@@ -12,13 +12,14 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
+#include "chromeos/disks/disk.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace file_manager {
 namespace {
 
 namespace file_manager_private = extensions::api::file_manager_private;
-typedef chromeos::disks::DiskMountManager::Disk Disk;
+using chromeos::disks::Disk;
 
 const char kTestDevicePath[] = "/device/test";
 
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.cc b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
index 821a121..099a6a2 100644
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.cc
@@ -36,6 +36,7 @@
 #include "chrome/common/pref_names.h"
 #include "chromeos/components/drivefs/drivefs_host.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/login/login_state.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state_handler.h"
@@ -55,6 +56,7 @@
 #include "storage/common/fileapi/file_system_types.h"
 #include "storage/common/fileapi/file_system_util.h"
 
+using chromeos::disks::Disk;
 using chromeos::disks::DiskMountManager;
 using chromeos::NetworkHandler;
 using content::BrowserThread;
@@ -295,9 +297,8 @@
   // chrome-os-partner:58309.
   // TODO(fukino): Remove this workaround when the root cause is fixed.
   if (volume.type() == VOLUME_TYPE_REMOVABLE_DISK_PARTITION) {
-    const DiskMountManager::Disk* disk =
-        DiskMountManager::GetInstance()->FindDiskBySourcePath(
-            volume.source_path().AsUTF8Unsafe());
+    const Disk* disk = DiskMountManager::GetInstance()->FindDiskBySourcePath(
+        volume.source_path().AsUTF8Unsafe());
     if (disk && disk->vendor_id() == "0ea0" && disk->product_id() == "2272")
       return false;
   }
@@ -994,13 +995,12 @@
       file_manager_private::OnDirectoryChanged::Create(event));
 }
 
-void EventRouter::OnDiskAdded(
-    const DiskMountManager::Disk& disk, bool mounting) {
+void EventRouter::OnDiskAdded(const Disk& disk, bool mounting) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // Do nothing.
 }
 
-void EventRouter::OnDiskRemoved(const DiskMountManager::Disk& disk) {
+void EventRouter::OnDiskRemoved(const Disk& disk) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   // Do nothing.
 }
diff --git a/chrome/browser/chromeos/extensions/file_manager/event_router.h b/chrome/browser/chromeos/extensions/file_manager/event_router.h
index ae498ac..c7a88ba 100644
--- a/chrome/browser/chromeos/extensions/file_manager/event_router.h
+++ b/chrome/browser/chromeos/extensions/file_manager/event_router.h
@@ -132,10 +132,8 @@
                         const base::FilePath& drive_path) override;
 
   // VolumeManagerObserver overrides.
-  void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
-                   bool mounting) override;
-  void OnDiskRemoved(
-      const chromeos::disks::DiskMountManager::Disk& disk) override;
+  void OnDiskAdded(const chromeos::disks::Disk& disk, bool mounting) override;
+  void OnDiskRemoved(const chromeos::disks::Disk& disk) override;
   void OnDeviceAdded(const std::string& device_path) override;
   void OnDeviceRemoved(const std::string& device_path) override;
   void OnVolumeMounted(chromeos::MountError error_code,
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
index 7978e1af..82126aa 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_browser_handler_api_test.cc
@@ -14,7 +14,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/extension_apitest.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
index ed46d337..ac0b09d5 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
@@ -19,11 +19,13 @@
 #include "chrome/browser/chromeos/file_system_provider/icon_set.h"
 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
 #include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/api/file_system_provider_capabilities/file_system_provider_capabilities_handler.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/dbus/cros_disks_client.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/mock_disk_mount_manager.h"
 #include "components/drive/file_change.h"
 #include "components/prefs/pref_service.h"
@@ -31,11 +33,13 @@
 #include "extensions/common/extension.h"
 #include "extensions/common/install_warning.h"
 #include "google_apis/drive/test_util.h"
+#include "services/identity/public/cpp/identity_test_utils.h"
 #include "storage/browser/fileapi/external_mount_points.h"
 
 using ::testing::_;
 using ::testing::ReturnRef;
 
+using chromeos::disks::Disk;
 using chromeos::disks::DiskMountManager;
 
 namespace {
@@ -283,7 +287,7 @@
 
         volumes_.insert(DiskMountManager::DiskMap::value_type(
             kTestMountPoints[i].source_path,
-            std::make_unique<DiskMountManager::Disk>(
+            std::make_unique<Disk>(
                 kTestMountPoints[i].source_path, kTestMountPoints[i].mount_path,
                 kTestDisks[disk_info_index].write_disabled_by_policy,
                 kTestDisks[disk_info_index].system_path,
@@ -310,8 +314,7 @@
     }
   }
 
-  const DiskMountManager::Disk* FindVolumeBySourcePath(
-      const std::string& source_path) {
+  const Disk* FindVolumeBySourcePath(const std::string& source_path) {
     auto volume_it = volumes_.find(source_path);
     return (volume_it == volumes_.end()) ? nullptr : volume_it->second.get();
   }
@@ -510,8 +513,10 @@
   crostini::CrostiniManager::GetInstance()->set_skip_restart_for_testing();
 
   // Profile must be signed in with email for crostini.
-  SigninManagerFactory::GetForProfileIfExists(browser()->profile())
-      ->SetAuthenticatedAccountInfo("12345", "testuser@gmail.com");
+  identity::SetPrimaryAccount(
+      SigninManagerFactory::GetForProfileIfExists(browser()->profile()),
+      IdentityManagerFactory::GetForProfileIfExists(browser()->profile()),
+      "testuser@gmail.com");
 
   // DiskMountManager mock.
   std::string known_hosts;
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
index 8d1fe98..7c28f86 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_drive.cc
@@ -13,7 +13,7 @@
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/strcat.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index 7e0c540..8e9d972 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -14,7 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
index 72688743..99d8f18 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_mount.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/format_macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
 #include "chrome/browser/chromeos/extensions/file_manager/private_api_util.h"
 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
diff --git a/chrome/browser/chromeos/extensions/info_private_api.cc b/chrome/browser/chromeos/extensions/info_private_api.cc
index 0b537e42..cba2cce 100644
--- a/chrome/browser/chromeos/extensions/info_private_api.cc
+++ b/chrome/browser/chromeos/extensions/info_private_api.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/chromeos/system/timezone_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
+#include "chromeos/chromeos_switches.h"
 #include "chromeos/network/device_state.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state_handler.h"
@@ -185,6 +186,17 @@
 // stylus or a stylus has been seen before.
 const char kStylusStatusSeen[] = "seen";
 
+// Key which corresponds to the assistantStatus property in JS.
+const char kPropertyAssistantStatus[] = "assistantStatus";
+
+// Value to which assistantStatus property is set when the device does not
+// support Assistant.
+const char kAssistantStatusUnsupported[] = "unsupported";
+
+// Value to which assistantStatus property is set when the device supports
+// Assistant.
+const char kAssistantStatusSupported[] = "supported";
+
 const struct {
   const char* api_name;
   const char* preference_name;
@@ -362,6 +374,12 @@
                                               : kStylusStatusSupported);
   }
 
+  if (property_name == kPropertyAssistantStatus) {
+    return std::make_unique<base::Value>(
+        chromeos::switches::IsAssistantEnabled() ? kAssistantStatusSupported
+                                                 : kAssistantStatusUnsupported);
+  }
+
   if (property_name == kPropertyClientId) {
     return std::make_unique<base::Value>(GetClientId());
   }
diff --git a/chrome/browser/chromeos/extensions/info_private_apitest.cc b/chrome/browser/chromeos/extensions/info_private_apitest.cc
index 8df7daae..58d76d6 100644
--- a/chrome/browser/chromeos/extensions/info_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/info_private_apitest.cc
@@ -6,6 +6,7 @@
 #include "ash/public/cpp/ash_switches.h"
 #include "ash/public/cpp/stylus_utils.h"
 #include "base/sys_info.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
@@ -15,6 +16,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
+#include "chromeos/chromeos_switches.h"
 #include "chromeos/settings/cros_settings_names.h"
 #include "components/arc/arc_util.h"
 #include "components/prefs/pref_service.h"
@@ -137,6 +139,26 @@
       << message_;
 }
 
+IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, AssistantSupported) {
+  // Enable native Assistant.
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(chromeos::switches::kAssistantFeature);
+
+  ASSERT_TRUE(RunPlatformAppTestWithArg("chromeos_info_private/extended",
+                                        "assistant supported"))
+      << message_;
+}
+
+IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, AssistantUnsupported) {
+  // Disable native Assistant.
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndDisableFeature(chromeos::switches::kAssistantFeature);
+
+  ASSERT_TRUE(RunPlatformAppTestWithArg("chromeos_info_private/extended",
+                                        "assistant unsupported"))
+      << message_;
+}
+
 IN_PROC_BROWSER_TEST_F(ChromeOSInfoPrivateTest, StylusUnsupported) {
   ASSERT_TRUE(RunPlatformAppTestWithArg("chromeos_info_private/extended",
                                         "stylus unsupported"))
diff --git a/chrome/browser/chromeos/extensions/install_limiter.cc b/chrome/browser/chromeos/extensions/install_limiter.cc
index ee19736..7db15a7 100644
--- a/chrome/browser/chromeos/extensions/install_limiter.cc
+++ b/chrome/browser/chromeos/extensions/install_limiter.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/extensions/install_limiter_factory.h"
 #include "content/public/browser/notification_details.h"
 #include "content/public/browser/notification_source.h"
diff --git a/chrome/browser/chromeos/extensions/wallpaper_function_base.cc b/chrome/browser/chromeos/extensions/wallpaper_function_base.cc
index 6bcf577e..8860ef7f 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_function_base.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_function_base.cc
@@ -8,8 +8,8 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/synchronization/cancellation_flag.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/image_decoder.h"
 #include "chrome/grit/generated_resources.h"
 #include "chromeos/login/login_state.h"
diff --git a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
index 8548477..4472ac9 100644
--- a/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
+++ b/chrome/browser/chromeos/extensions/wallpaper_private_api.cc
@@ -313,7 +313,8 @@
     return;
   }
 
-  if (sync_service->GetState() == syncer::SyncService::State::ACTIVE) {
+  if (sync_service->GetTransportState() ==
+      syncer::SyncService::TransportState::ACTIVE) {
     dict->SetBoolean("syncThemes",
                      sync_service->GetActiveDataTypes().Has(syncer::THEMES));
     Respond(OneArgument(std::move(dict)));
diff --git a/chrome/browser/chromeos/external_metrics.cc b/chrome/browser/chromeos/external_metrics.cc
index 7f92deb5..7326b8b8 100644
--- a/chrome/browser/chromeos/external_metrics.cc
+++ b/chrome/browser/chromeos/external_metrics.cc
@@ -16,7 +16,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/metrics/user_metrics.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/metrics/chromeos_metrics_provider.h"
 #include "components/metrics/serialization/metric_sample.h"
 #include "components/metrics/serialization/serialization_utils.h"
diff --git a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc
index 0e4c7b67..678d804 100644
--- a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc
+++ b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
 
+#include "chromeos/disks/disk.h"
+
 namespace file_manager {
 
 FakeDiskMountManager::MountRequest::MountRequest(
@@ -55,8 +57,7 @@
   return disks_;
 }
 
-const chromeos::disks::DiskMountManager::Disk*
-FakeDiskMountManager::FindDiskBySourcePath(
+const chromeos::disks::Disk* FakeDiskMountManager::FindDiskBySourcePath(
     const std::string& source_path) const {
   DiskMap::const_iterator iter = disks_.find(source_path);
   return iter != disks_.end() ? iter->second.get() : nullptr;
@@ -144,7 +145,8 @@
     const UnmountDeviceRecursivelyCallbackType& callback) {
 }
 
-bool FakeDiskMountManager::AddDiskForTest(std::unique_ptr<Disk> disk) {
+bool FakeDiskMountManager::AddDiskForTest(
+    std::unique_ptr<chromeos::disks::Disk> disk) {
   DCHECK(disk);
   return disks_.insert(make_pair(disk->device_path(), std::move(disk))).second;
 }
@@ -156,7 +158,7 @@
 
 void FakeDiskMountManager::InvokeDiskEventForTest(
     chromeos::disks::DiskMountManager::DiskEvent event,
-    const chromeos::disks::DiskMountManager::Disk* disk) {
+    const chromeos::disks::Disk* disk) {
   for (auto& observer : observers_) {
     disk->IsAutoMountable() ? observer.OnAutoMountableDiskEvent(event, *disk)
                             : observer.OnBootDeviceDiskEvent(event, *disk);
diff --git a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h
index 892a94b..cdc642e3 100644
--- a/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h
+++ b/chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h
@@ -73,7 +73,7 @@
   void AddObserver(Observer* observer) override;
   void RemoveObserver(Observer* observer) override;
   const DiskMap& disks() const override;
-  const Disk* FindDiskBySourcePath(
+  const chromeos::disks::Disk* FindDiskBySourcePath(
       const std::string& source_path) const override;
   const MountPointMap& mount_points() const override;
   void EnsureMountInfoRefreshed(
@@ -100,9 +100,10 @@
       const std::string& device_path,
       const UnmountDeviceRecursivelyCallbackType& callback) override;
 
-  bool AddDiskForTest(std::unique_ptr<Disk> disk) override;
+  bool AddDiskForTest(std::unique_ptr<chromeos::disks::Disk> disk) override;
   bool AddMountPointForTest(const MountPointInfo& mount_point) override;
-  void InvokeDiskEventForTest(DiskEvent event, const Disk* disk);
+  void InvokeDiskEventForTest(DiskEvent event,
+                              const chromeos::disks::Disk* disk);
 
  private:
   base::ObserverList<Observer> observers_;
diff --git a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc
index 255a3a4..6b7680ce 100644
--- a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc
+++ b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc
@@ -16,7 +16,7 @@
 #include "base/i18n/case_conversion.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
 #include "chrome/browser/chromeos/file_manager/app_id.h"
 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
diff --git a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
index 191c0ec..f4baac8 100644
--- a/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/chromeos/file_manager/file_manager_browsertest.cc
@@ -245,8 +245,14 @@
                       TestCase("createFolderDrive"),
                       TestCase("createFolderDrive").EnableDriveFs()));
 
+// crbug.com/871684
+#if !defined(NDEBUG)
+#define MAYBE_KeyboardOperations DISABLED_KeyboardOperations
+#else
+#define MAYBE_KeyboardOperations KeyboardOperations
+#endif
 WRAPPED_INSTANTIATE_TEST_CASE_P(
-    KeyboardOperations, /* keyboard_operations.js */
+    MAYBE_KeyboardOperations, /* keyboard_operations.js */
     FilesAppBrowserTest,
     ::testing::Values(TestCase("keyboardDeleteDownloads").InGuestMode(),
                       TestCase("keyboardDeleteDownloads"),
diff --git a/chrome/browser/chromeos/file_manager/file_watcher.cc b/chrome/browser/chromeos/file_manager/file_watcher.cc
index 97ddc84..896ada265 100644
--- a/chrome/browser/chromeos/file_manager/file_watcher.cc
+++ b/chrome/browser/chromeos/file_manager/file_watcher.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/chromeos/file_manager/file_watcher.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_thread.h"
 #include "google_apis/drive/task_util.h"
diff --git a/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc b/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc
index ac5f0bc..76754d79 100644
--- a/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc
+++ b/chrome/browser/chromeos/file_manager/file_watcher_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "google_apis/drive/test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/chromeos/file_manager/open_with_browser.cc b/chrome/browser/chromeos/file_manager/open_with_browser.cc
index e8977652..9154c64 100644
--- a/chrome/browser/chromeos/file_manager/open_with_browser.cc
+++ b/chrome/browser/chromeos/file_manager/open_with_browser.cc
@@ -11,7 +11,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/file_manager/filesystem_api_util.h"
diff --git a/chrome/browser/chromeos/file_manager/path_util.cc b/chrome/browser/chromeos/file_manager/path_util.cc
index 3250d9a..8c296c2 100644
--- a/chrome/browser/chromeos/file_manager/path_util.cc
+++ b/chrome/browser/chromeos/file_manager/path_util.cc
@@ -6,21 +6,25 @@
 
 #include "base/barrier_closure.h"
 #include "base/logging.h"
+#include "base/strings/string_util.h"
 #include "base/sys_info.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.h"
 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root_map.h"
 #include "chrome/browser/chromeos/arc/fileapi/chrome_content_provider_url_util.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
+#include "chrome/browser/chromeos/drive/file_system_util.h"
 #include "chrome/browser/chromeos/fileapi/external_file_url_util.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/grit/generated_resources.h"
 #include "components/drive/file_system_core_util.h"
 #include "components/user_manager/user.h"
 #include "components/user_manager/user_manager.h"
 #include "content/public/browser/browser_thread.h"
 #include "net/base/escape.h"
 #include "net/base/filename_util.h"
+#include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
 
 namespace file_manager {
@@ -29,6 +33,8 @@
 namespace {
 
 const char kDownloadsFolderName[] = "Downloads";
+const char kGoogleDriveDisplayName[] = "Google Drive";
+const char kRootRelativeToDriveMount[] = "root";
 
 // Sync with the file provider in ARC++ side.
 constexpr char kArcFileProviderUrl[] =
@@ -251,5 +257,41 @@
   }
 }
 
+bool ReplacePrefix(std::string* s,
+                   const std::string& prefix,
+                   const std::string& replacement) {
+  if (base::StartsWith(*s, prefix, base::CompareCase::SENSITIVE)) {
+    base::ReplaceFirstSubstringAfterOffset(s, 0, prefix, replacement);
+    return true;
+  }
+  return false;
+}
+
+std::string GetDownloadLocationText(Profile* profile, const std::string& path) {
+  std::string result(path);
+  if (ReplacePrefix(&result, "/home/chronos/user/Downloads",
+                    kDownloadsFolderName)) {
+  } else if (ReplacePrefix(&result,
+                           "/home/chronos/" +
+                               profile->GetPath().BaseName().value() +
+                               "/Downloads",
+                           kDownloadsFolderName)) {
+  } else if (ReplacePrefix(&result,
+                           drive::util::GetDriveMountPointPath(profile)
+                               .Append(kRootRelativeToDriveMount)
+                               .value(),
+                           kGoogleDriveDisplayName)) {
+  } else if (ReplacePrefix(&result, kAndroidFilesPath,
+                           l10n_util::GetStringUTF8(
+                               IDS_FILE_BROWSER_ANDROID_FILES_ROOT_LABEL))) {
+  } else if (ReplacePrefix(&result, GetCrostiniMountDirectory(profile).value(),
+                           l10n_util::GetStringUTF8(
+                               IDS_FILE_BROWSER_LINUX_FILES_ROOT_LABEL))) {
+  }
+
+  base::ReplaceChars(result, "/", " \u203a ", &result);
+  return result;
+}
+
 }  // namespace util
 }  // namespace file_manager
diff --git a/chrome/browser/chromeos/file_manager/path_util.h b/chrome/browser/chromeos/file_manager/path_util.h
index 9a8811b..1be3dee 100644
--- a/chrome/browser/chromeos/file_manager/path_util.h
+++ b/chrome/browser/chromeos/file_manager/path_util.h
@@ -74,6 +74,16 @@
     const std::vector<storage::FileSystemURL>& file_system_urls,
     ConvertToContentUrlsCallback callback);
 
+// Convert download location path into a string suitable for display.
+// Replacements:
+// * /home/chronos/user/Downloads                => Downloads
+// * /home/chronos/u-<hash>/Downloads            => Downloads
+// * /special/drive-<hash>/root                  => Google Drive
+// * /run/arc/sdcard/write/emulated/0            => Play files
+// * /media/fuse/crostini_<hash>_termina_penguin => Linux files
+// * '/' with ' \u203a ' (angled quote sign) for display purposes.
+std::string GetDownloadLocationText(Profile* profile, const std::string& path);
+
 }  // namespace util
 }  // namespace file_manager
 
diff --git a/chrome/browser/chromeos/file_manager/path_util_unittest.cc b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
index c438b91..d09639bf 100644
--- a/chrome/browser/chromeos/file_manager/path_util_unittest.cc
+++ b/chrome/browser/chromeos/file_manager/path_util_unittest.cc
@@ -37,6 +37,26 @@
     "CHROMEOS_RELEASE_NAME=Chrome OS\n"
     "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
 
+TEST(FileManagerPathUtilTest, GetDownloadLocationText) {
+  content::TestBrowserThreadBundle thread_bundle;
+  TestingProfile profile(base::FilePath("/home/chronos/u-0123456789abcdef"));
+  EXPECT_EQ("Downloads",
+            GetDownloadLocationText(&profile, "/home/chronos/user/Downloads"));
+  EXPECT_EQ("Downloads",
+            GetDownloadLocationText(
+                &profile, "/home/chronos/u-0123456789abcdef/Downloads"));
+  EXPECT_EQ("Google Drive \u203a foo",
+            GetDownloadLocationText(
+                &profile, "/special/drive-0123456789abcdef/root/foo"));
+  EXPECT_EQ("Play files \u203a foo \u203a bar",
+            GetDownloadLocationText(
+                &profile, "/run/arc/sdcard/write/emulated/0/foo/bar"));
+  EXPECT_EQ("Linux files \u203a foo",
+            GetDownloadLocationText(
+                &profile,
+                "/media/fuse/crostini_0123456789abcdef_termina_penguin/foo"));
+}
+
 TEST(FileManagerPathUtilTest, MultiProfileDownloadsFolderMigration) {
   content::TestBrowserThreadBundle thread_bundle;
   TestingProfile profile;
diff --git a/chrome/browser/chromeos/file_manager/snapshot_manager.cc b/chrome/browser/chromeos/file_manager/snapshot_manager.cc
index c05f535..b23c2a0 100644
--- a/chrome/browser/chromeos/file_manager/snapshot_manager.cc
+++ b/chrome/browser/chromeos/file_manager/snapshot_manager.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/containers/circular_deque.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/file_manager/app_id.h"
 #include "chrome/browser/chromeos/file_manager/fileapi_util.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc
index 57c3a4d..9449e474 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc
@@ -36,6 +36,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/chromeos_switches.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/drive/chromeos/file_system_interface.h"
 #include "components/prefs/pref_service.h"
@@ -227,7 +228,7 @@
 // static
 std::unique_ptr<Volume> Volume::CreateForRemovable(
     const chromeos::disks::DiskMountManager::MountPointInfo& mount_point,
-    const chromeos::disks::DiskMountManager::Disk* disk) {
+    const chromeos::disks::Disk* disk) {
   std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = MountTypeToVolumeType(mount_point.mount_type);
   volume->source_path_ = base::FilePath(mount_point.source_path);
@@ -630,7 +631,7 @@
 
 void VolumeManager::OnAutoMountableDiskEvent(
     chromeos::disks::DiskMountManager::DiskEvent event,
-    const chromeos::disks::DiskMountManager::Disk& disk) {
+    const chromeos::disks::Disk& disk) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   // Disregard hidden devices.
@@ -737,7 +738,7 @@
     }
     case chromeos::MOUNT_TYPE_DEVICE: {
       // Notify a mounting/unmounting event to observers.
-      const chromeos::disks::DiskMountManager::Disk* const disk =
+      const chromeos::disks::Disk* const disk =
           disk_mount_manager_->FindDiskBySourcePath(mount_info.source_path);
       std::unique_ptr<Volume> volume =
           Volume::CreateForRemovable(mount_info, disk);
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.h b/chrome/browser/chromeos/file_manager/volume_manager.h
index 1b1fa08..a62234c 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.h
+++ b/chrome/browser/chromeos/file_manager/volume_manager.h
@@ -33,6 +33,11 @@
 
 namespace chromeos {
 class PowerManagerClient;
+
+namespace disks {
+class Disk;
+}  // namespace disks
+
 }  // namespace chromeos
 
 namespace content {
@@ -89,7 +94,7 @@
       const base::FilePath& downloads_path);
   static std::unique_ptr<Volume> CreateForRemovable(
       const chromeos::disks::DiskMountManager::MountPointInfo& mount_point,
-      const chromeos::disks::DiskMountManager::Disk* disk);
+      const chromeos::disks::Disk* disk);
   static std::unique_ptr<Volume> CreateForProvidedFileSystem(
       const chromeos::file_system_provider::ProvidedFileSystemInfo&
           file_system_info,
@@ -316,7 +321,7 @@
   // chromeos::disks::DiskMountManager::Observer overrides.
   void OnAutoMountableDiskEvent(
       chromeos::disks::DiskMountManager::DiskEvent event,
-      const chromeos::disks::DiskMountManager::Disk& disk) override;
+      const chromeos::disks::Disk& disk) override;
   void OnDeviceEvent(chromeos::disks::DiskMountManager::DeviceEvent event,
                      const std::string& device_path) override;
   void OnMountEvent(chromeos::disks::DiskMountManager::MountEvent event,
diff --git a/chrome/browser/chromeos/file_manager/volume_manager_observer.h b/chrome/browser/chromeos/file_manager/volume_manager_observer.h
index bf300c7..7fcd3e2 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager_observer.h
+++ b/chrome/browser/chromeos/file_manager/volume_manager_observer.h
@@ -8,7 +8,12 @@
 #include <string>
 
 #include "chromeos/dbus/cros_disks_client.h"
-#include "chromeos/disks/disk_mount_manager.h"
+
+namespace chromeos {
+namespace disks {
+class Disk;
+}  // namespace disks
+}  // namespace chromeos
 
 namespace file_manager {
 
@@ -20,12 +25,11 @@
   virtual ~VolumeManagerObserver() = default;
 
   // Fired when a new disk is added.
-  virtual void OnDiskAdded(
-      const chromeos::disks::DiskMountManager::Disk& disk, bool mounting) = 0;
+  virtual void OnDiskAdded(const chromeos::disks::Disk& disk,
+                           bool mounting) = 0;
 
   // Fired when a disk is removed.
-  virtual void OnDiskRemoved(
-      const chromeos::disks::DiskMountManager::Disk& disk) = 0;
+  virtual void OnDiskRemoved(const chromeos::disks::Disk& disk) = 0;
 
   // Fired when a new device is added.
   virtual void OnDeviceAdded(const std::string& device_path) = 0;
diff --git a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc
index 985813b..ae46fd8 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc
+++ b/chrome/browser/chromeos/file_manager/volume_manager_unittest.cc
@@ -23,6 +23,7 @@
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/dbus/fake_power_manager_client.h"
 #include "chromeos/dbus/power_manager/suspend.pb.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/drive/chromeos/dummy_file_system.h"
 #include "components/drive/service/dummy_drive_service.h"
@@ -33,8 +34,8 @@
 #include "extensions/browser/extension_registry.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using DiskMountManager = chromeos::disks::DiskMountManager;
-using Disk = DiskMountManager::Disk;
+using chromeos::disks::Disk;
+using chromeos::disks::DiskMountManager;
 
 namespace file_manager {
 namespace {
diff --git a/chrome/browser/chromeos/first_run/goodies_displayer.cc b/chrome/browser/chromeos/first_run/goodies_displayer.cc
index 9d4b3b5..e0487fd 100644
--- a/chrome/browser/chromeos/first_run/goodies_displayer.cc
+++ b/chrome/browser/chromeos/first_run/goodies_displayer.cc
@@ -7,7 +7,7 @@
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/startup_utils.h"
diff --git a/chrome/browser/chromeos/hats/hats_dialog.cc b/chrome/browser/chromeos/hats/hats_dialog.cc
index 78135e58..0f075fe 100644
--- a/chrome/browser/chromeos/hats/hats_dialog.cc
+++ b/chrome/browser/chromeos/hats/hats_dialog.cc
@@ -6,7 +6,7 @@
 
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/hats/hats_notification_controller.cc b/chrome/browser/chromeos/hats/hats_notification_controller.cc
index a290eda..30af434 100644
--- a/chrome/browser/chromeos/hats/hats_notification_controller.cc
+++ b/chrome/browser/chromeos/hats/hats_notification_controller.cc
@@ -7,7 +7,7 @@
 #include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "base/command_line.h"
 #include "base/feature_list.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/hats/hats_dialog.h"
 #include "chrome/browser/chromeos/hats/hats_finch_helper.h"
diff --git a/chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.cc b/chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.cc
index 6362359..3df3fe5 100644
--- a/chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.cc
@@ -15,7 +15,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/extensions/component_loader.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/chromeos/input_method/input_method_syncer.cc b/chrome/browser/chromeos/input_method/input_method_syncer.cc
index 602e7cb..4eeb9b5 100644
--- a/chrome/browser/chromeos/input_method/input_method_syncer.cc
+++ b/chrome/browser/chromeos/input_method/input_method_syncer.cc
@@ -12,7 +12,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/chromeos/logging.cc b/chrome/browser/chromeos/logging.cc
index e08e562..edd99c39 100644
--- a/chrome/browser/chromeos/logging.cc
+++ b/chrome/browser/chromeos/logging.cc
@@ -8,7 +8,7 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/logging_chrome.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_extensions_external_loader.cc b/chrome/browser/chromeos/login/demo_mode/demo_extensions_external_loader.cc
index 63497f6..698d543 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_extensions_external_loader.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_extensions_external_loader.cc
@@ -13,8 +13,8 @@
 #include "base/json/json_reader.h"
 #include "base/location.h"
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc
index fa79c59..e5946c2 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.cc
@@ -1,15 +1,15 @@
-// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 
-#include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
@@ -26,6 +26,11 @@
 constexpr char kOfflineDeviceLocalAccountPolicyFileName[] =
     "local_account_policy";
 
+// The policy blob data for offline demo-mode is embedded into the filesystem.
+// TODO(mukai, agawronska): fix this when switching to dm-verity image.
+constexpr const base::FilePath::CharType kOfflineDemoModeDir[] =
+    FILE_PATH_LITERAL("/usr/share/chromeos-assets/demo_mode_resources/policy");
+
 bool CheckOfflinePolicyFilesExist(const base::FilePath& policy_dir,
                                   std::string* message) {
   base::FilePath device_policy_path =
@@ -93,22 +98,48 @@
 bool DemoSetupController::IsOobeDemoSetupFlowInProgress() {
   const WizardController* const wizard_controller =
       WizardController::default_controller();
-  return wizard_controller && wizard_controller->is_in_demo_mode_setup_flow();
+  return wizard_controller &&
+         wizard_controller->demo_setup_controller() != nullptr;
 }
 
-DemoSetupController::DemoSetupController(Delegate* delegate)
-    : delegate_(delegate), weak_ptr_factory_(this) {
-  DCHECK(delegate_);
-}
+DemoSetupController::DemoSetupController() : weak_ptr_factory_(this) {}
 
 DemoSetupController::~DemoSetupController() {
   if (device_local_account_policy_store_)
     device_local_account_policy_store_->RemoveObserver(this);
 }
 
-void DemoSetupController::EnrollOnline() {
+bool DemoSetupController::IsOfflineEnrollment() const {
+  return enrollment_type_ && *enrollment_type_ == EnrollmentType::kOffline;
+}
+
+void DemoSetupController::Enroll(OnSetupSuccess on_setup_success,
+                                 OnSetupError on_setup_error) {
+  DCHECK(enrollment_type_)
+      << "Enrollment type needs to be explicitly set before calling Enroll()";
   DCHECK_EQ(mode_, policy::EnrollmentConfig::MODE_NONE);
   DCHECK(!enrollment_helper_);
+
+  on_setup_success_ = std::move(on_setup_success);
+  on_setup_error_ = std::move(on_setup_error);
+
+  switch (*enrollment_type_) {
+    case EnrollmentType::kOnline:
+      EnrollOnline();
+      return;
+    case EnrollmentType::kOffline: {
+      const base::FilePath offline_data_dir =
+          policy_dir_for_tests_.empty() ? base::FilePath(kOfflineDemoModeDir)
+                                        : policy_dir_for_tests_;
+      EnrollOffline(offline_data_dir);
+      return;
+    }
+    default:
+      NOTREACHED() << "Unknown demo mode enrollment type";
+  }
+}
+
+void DemoSetupController::EnrollOnline() {
   policy::BrowserPolicyConnectorChromeOS* connector =
       g_browser_process->platform_part()->browser_policy_connector_chromeos();
   connector->GetDeviceCloudPolicyManager()->SetDeviceRequisition(
@@ -124,8 +155,6 @@
 }
 
 void DemoSetupController::EnrollOffline(const base::FilePath& policy_dir) {
-  DCHECK_EQ(mode_, policy::EnrollmentConfig::MODE_NONE);
-  DCHECK(!enrollment_helper_);
   DCHECK(policy_dir_.empty());
   policy_dir_ = policy_dir;
   mode_ = policy::EnrollmentConfig::MODE_OFFLINE_DEMO;
@@ -145,7 +174,7 @@
   DCHECK(!policy_dir_.empty());
 
   if (!ok) {
-    SetupFailed(*message, false);
+    SetupFailed(*message, DemoSetupError::kRecoverable);
     return;
   }
 
@@ -172,12 +201,13 @@
           "validation_status: %d lock_status: %d",
           status.status(), status.client_status(), status.store_status(),
           status.validation_status(), status.lock_status()),
-      false);
+      DemoSetupError::kRecoverable);
 }
 
 void DemoSetupController::OnOtherError(
     EnterpriseEnrollmentHelper::OtherError error) {
-  SetupFailed(base::StringPrintf("Other error: %d", error), false);
+  SetupFailed(base::StringPrintf("Other error: %d", error),
+              DemoSetupError::kRecoverable);
 }
 
 void DemoSetupController::OnDeviceEnrolled(
@@ -200,7 +230,8 @@
     return;
   }
   Reset();
-  delegate_->OnSetupSuccess();
+  if (!on_setup_success_.is_null())
+    std::move(on_setup_success_).Run();
 }
 
 void DemoSetupController::OnMultipleLicensesAvailable(
@@ -221,18 +252,25 @@
   device_local_account_policy_store_ = store;
 }
 
+void DemoSetupController::SetOfflineDataDirForTest(
+    const base::FilePath& offline_dir) {
+  policy_dir_for_tests_ = offline_dir;
+}
+
 void DemoSetupController::OnDeviceLocalAccountPolicyLoaded(
     base::Optional<std::string> blob) {
   if (!blob.has_value()) {
     // This is very unlikely to happen since the file existence is already
     // checked as CheckOfflinePolicyFilesExist.
-    SetupFailed("Policy file for the device local account not found", true);
+    SetupFailed("Policy file for the device local account not found",
+                DemoSetupError::kFatal);
     return;
   }
 
   enterprise_management::PolicyFetchResponse policy;
   if (!policy.ParseFromString(blob.value())) {
-    SetupFailed("Error parsing local account policy blob.", true);
+    SetupFailed("Error parsing local account policy blob.",
+                DemoSetupError::kFatal);
     return;
   }
 
@@ -240,7 +278,8 @@
   enterprise_management::PolicyData policy_data;
   if (policy.policy_data().empty() ||
       !policy_data.ParseFromString(policy.policy_data())) {
-    SetupFailed("Error parsing local account policy data.", true);
+    SetupFailed("Error parsing local account policy data.",
+                DemoSetupError::kFatal);
     return;
   }
 
@@ -252,17 +291,20 @@
   }
 
   if (!device_local_account_policy_store_) {
-    SetupFailed("Can't find the store for the local account policy.", true);
+    SetupFailed("Can't find the store for the local account policy.",
+                DemoSetupError::kFatal);
     return;
   }
   device_local_account_policy_store_->AddObserver(this);
   device_local_account_policy_store_->Store(policy);
 }
 
-void DemoSetupController::SetupFailed(const std::string& message, bool fatal) {
+void DemoSetupController::SetupFailed(const std::string& message,
+                                      DemoSetupError error) {
   Reset();
-  LOG(ERROR) << message << " fatal=" << fatal;
-  delegate_->OnSetupError(fatal);
+  LOG(ERROR) << message << " fatal=" << (error == DemoSetupError::kFatal);
+  if (!on_setup_error_.is_null())
+    std::move(on_setup_error_).Run(error);
 }
 
 void DemoSetupController::Reset() {
@@ -281,12 +323,14 @@
 void DemoSetupController::OnStoreLoaded(policy::CloudPolicyStore* store) {
   DCHECK_EQ(store, device_local_account_policy_store_);
   Reset();
-  delegate_->OnSetupSuccess();
+  if (!on_setup_success_.is_null())
+    std::move(on_setup_success_).Run();
 }
 
 void DemoSetupController::OnStoreError(policy::CloudPolicyStore* store) {
   DCHECK_EQ(store, device_local_account_policy_store_);
-  SetupFailed("Failed to store the local account policy", true);
+  SetupFailed("Failed to store the local account policy",
+              DemoSetupError::kFatal);
 }
 
 }  //  namespace chromeos
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h
index a0949f7..74cfda3d 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h
@@ -5,6 +5,9 @@
 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_CONTROLLER_H_
 #define CHROME_BROWSER_CHROMEOS_LOGIN_DEMO_MODE_DEMO_SETUP_CONTROLLER_H_
 
+#include <string>
+
+#include "base/callback_forward.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
@@ -20,38 +23,54 @@
     : public EnterpriseEnrollmentHelper::EnrollmentStatusConsumer,
       public policy::CloudPolicyStore::Observer {
  public:
+  // Type of demo mode enrollment.
+  enum class EnrollmentType {
+    // Online enrollment into demo mode that is established with DMServer.
+    kOnline,
+    // Offline enrollment into demo mode that is established locally.
+    kOffline,
+  };
+
+  // Type of demo mode setup error.
+  enum class DemoSetupError {
+    // Recoverable or temporary demo mode setup error. Another attempt to setup
+    // demo mode may succeed.
+    kRecoverable,
+    // Fatal demo mode setup error. Device requires powerwash to recover from
+    // the resulting state.
+    kFatal,
+  };
+
+  // Demo mode setup callbacks.
+  using OnSetupSuccess = base::OnceClosure;
+  using OnSetupError = base::OnceCallback<void(DemoSetupError)>;
+
   // Domain that demo mode devices are enrolled into.
   static constexpr char kDemoModeDomain[] = "cros-demo-mode.com";
 
-  // Delegate that will be notified about result of setup flow when it is
-  // finished.
-  class Delegate {
-   public:
-    virtual ~Delegate() = default;
-
-    // Called when the setup flow finished with error. |fatal| is true if the
-    // error isn't recoverable and needs powerwash.
-    virtual void OnSetupError(bool fatal) = 0;
-
-    // Called when the setup flow finished successfully.
-    virtual void OnSetupSuccess() = 0;
-  };
-
-  // Returns whether demo mode setup flow is in progress in OOBE.
+  // Utility method that returns whether demo mode setup flow is in progress in
+  // OOBE.
   static bool IsOobeDemoSetupFlowInProgress();
 
-  explicit DemoSetupController(Delegate* delegate);
+  DemoSetupController();
   ~DemoSetupController() override;
 
-  // Initiates online enrollment that registers and sets up the device in the
-  // Demo Mode domain.
-  void EnrollOnline();
+  // Sets enrollment type that will be used to setup the device. It has to be
+  // set before calling Enroll().
+  void set_enrollment_type(EnrollmentType enrollment_type) {
+    enrollment_type_ = enrollment_type;
+  }
 
-  // Initiates offline enrollment that locks the device and sets up offline
-  // policies required by Demo Mode. It requires no network connectivity since
-  // and all setup will be done locally. The policy files will be loaded
-  // from the |base_path|.
-  void EnrollOffline(const base::FilePath& base_path);
+  // Whether offline enrollment is used for setup.
+  bool IsOfflineEnrollment() const;
+
+  // Initiates enrollment that sets up the device in the demo mode domain. The
+  // |enrollment_type_| determines whether online or offline setup will be
+  // performed and it should be set with set_enrollment_type() before calling
+  // Enroll(). |on_setup_success| will be called when enrollment finishes
+  // successfully. |on_setup_error| will be called when enrollment finishes with
+  // an error.
+  void Enroll(OnSetupSuccess on_setup_success, OnSetupError on_setup_error);
 
   // EnterpriseEnrollmentHelper::EnrollmentStatusConsumer:
   void OnDeviceEnrolled(const std::string& additional_token) override;
@@ -64,8 +83,19 @@
       const EnrollmentLicenseMap& licenses) override;
 
   void SetDeviceLocalAccountPolicyStoreForTest(policy::CloudPolicyStore* store);
+  void SetOfflineDataDirForTest(const base::FilePath& offline_dir);
 
  private:
+  // Initiates online enrollment that registers and sets up the device in the
+  // demo mode domain.
+  void EnrollOnline();
+
+  // Initiates offline enrollment that locks the device and sets up offline
+  // policies required by demo mode. It requires no network connectivity since
+  // all setup will be done locally. The policy files will be loaded from the
+  // |policy_dir|.
+  void EnrollOffline(const base::FilePath& policy_dir);
+
   // Called when the checks of policy files for the offline demo mode is done.
   void OnOfflinePolicyFilesExisted(std::string* message, bool ok);
 
@@ -74,7 +104,7 @@
   void OnDeviceLocalAccountPolicyLoaded(base::Optional<std::string> blob);
 
   // Finish the flow with an error message.
-  void SetupFailed(const std::string& message, bool fatal);
+  void SetupFailed(const std::string& message, DemoSetupError error);
 
   // Clears the internal state.
   void Reset();
@@ -83,7 +113,15 @@
   void OnStoreLoaded(policy::CloudPolicyStore* store) override;
   void OnStoreError(policy::CloudPolicyStore* store) override;
 
-  Delegate* delegate_ = nullptr;
+  // Enrollment type that will be performed when Enroll() is called. Should be
+  // set explicitly.
+  base::Optional<EnrollmentType> enrollment_type_;
+
+  // Callback to call when enrollment finishes with an error.
+  OnSetupError on_setup_error_;
+
+  // Callback to call when enrollment finishes successfully.
+  OnSetupSuccess on_setup_success_;
 
   // The mode of the current enrollment flow.
   policy::EnrollmentConfig::Mode mode_ = policy::EnrollmentConfig::MODE_NONE;
@@ -93,6 +131,9 @@
   // on the online enrollment.
   base::FilePath policy_dir_;
 
+  // The directory containing policy blob files used for testing.
+  base::FilePath policy_dir_for_tests_;
+
   // The CloudPolicyStore for the device local account for the offline policy.
   policy::CloudPolicyStore* device_local_account_policy_store_ = nullptr;
 
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller_unittest.cc b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller_unittest.cc
index c318778..a73566c 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_controller_unittest.cc
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_controller_unittest.cc
@@ -4,8 +4,12 @@
 
 #include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 
-#include "base/files/file_util.h"
+#include <memory>
+
+#include "base/bind.h"
+#include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/macros.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
@@ -20,26 +24,27 @@
 using chromeos::test::DemoModeSetupResult;
 using chromeos::test::MockDemoModeOfflineEnrollmentHelperCreator;
 using chromeos::test::MockDemoModeOnlineEnrollmentHelperCreator;
+using chromeos::test::SetupDummyOfflinePolicyDir;
 using testing::_;
 
 namespace chromeos {
 
 namespace {
 
-class MockDemoSetupControllerDelegate : public DemoSetupController::Delegate {
+class DemoSetupControllerTestHelper {
  public:
-  MockDemoSetupControllerDelegate()
+  DemoSetupControllerTestHelper()
       : run_loop_(std::make_unique<base::RunLoop>()) {}
-  ~MockDemoSetupControllerDelegate() override = default;
+  virtual ~DemoSetupControllerTestHelper() = default;
 
-  void OnSetupError(bool fatal) override {
+  void OnSetupError(DemoSetupController::DemoSetupError error) {
     EXPECT_FALSE(succeeded_.has_value());
     succeeded_ = false;
-    fatal_ = fatal;
+    error_ = error;
     run_loop_->Quit();
   }
 
-  void OnSetupSuccess() override {
+  void OnSetupSuccess() {
     EXPECT_FALSE(succeeded_.has_value());
     succeeded_ = true;
     run_loop_->Quit();
@@ -54,7 +59,9 @@
   }
 
   // Returns true if it receives a fatal error.
-  bool IsErrorFatal() const { return fatal_; }
+  bool IsErrorFatal() const {
+    return error_ == DemoSetupController::DemoSetupError::kFatal;
+  }
 
   void Reset() {
     succeeded_.reset();
@@ -63,45 +70,13 @@
 
  private:
   base::Optional<bool> succeeded_;
-  bool fatal_ = false;
+  DemoSetupController::DemoSetupError error_ =
+      DemoSetupController::DemoSetupError::kRecoverable;
   std::unique_ptr<base::RunLoop> run_loop_;
 
-  DISALLOW_COPY_AND_ASSIGN(MockDemoSetupControllerDelegate);
+  DISALLOW_COPY_AND_ASSIGN(DemoSetupControllerTestHelper);
 };
 
-bool SetupDummyOfflineDir(const std::string& account_id,
-                          base::ScopedTempDir* temp_dir) {
-  if (!temp_dir->CreateUniqueTempDir()) {
-    LOG(ERROR) << "Failed to create unique tempdir";
-    return false;
-  }
-
-  if (base::WriteFile(temp_dir->GetPath().AppendASCII("device_policy"), "",
-                      0) != 0) {
-    LOG(ERROR) << "Failed to create device_policy file";
-    return false;
-  }
-
-  // We use MockCloudPolicyStore for the device local account policy in the
-  // tests, thus actual policy content can be empty. account_id is specified
-  // since it is used by DemoSetupController to look up the store.
-  std::string policy_blob;
-  if (!account_id.empty()) {
-    enterprise_management::PolicyData policy_data;
-    policy_data.set_username(account_id);
-    enterprise_management::PolicyFetchResponse policy;
-    policy.set_policy_data(policy_data.SerializeAsString());
-    policy_blob = policy.SerializeAsString();
-  }
-  if (base::WriteFile(temp_dir->GetPath().AppendASCII("local_account_policy"),
-                      policy_blob.data(), policy_blob.size()) !=
-      static_cast<int>(policy_blob.size())) {
-    LOG(ERROR) << "Failed to create local_account_policy file";
-    return false;
-  }
-  return true;
-}
-
 }  // namespace
 
 class DemoSetupControllerTest : public testing::Test {
@@ -113,8 +88,8 @@
     SystemSaltGetter::Initialize();
     DBusThreadManager::Initialize();
     DeviceSettingsService::Initialize();
-    delegate_ = std::make_unique<MockDemoSetupControllerDelegate>();
-    tested_controller_ = std::make_unique<DemoSetupController>(delegate_.get());
+    helper_ = std::make_unique<DemoSetupControllerTestHelper>();
+    tested_controller_ = std::make_unique<DemoSetupController>();
   }
 
   void TearDown() override {
@@ -123,7 +98,7 @@
     DeviceSettingsService::Shutdown();
   }
 
-  std::unique_ptr<MockDemoSetupControllerDelegate> delegate_;
+  std::unique_ptr<DemoSetupControllerTestHelper> helper_;
   std::unique_ptr<DemoSetupController> tested_controller_;
 
  private:
@@ -134,7 +109,7 @@
 
 TEST_F(DemoSetupControllerTest, OfflineSuccess) {
   base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
+  ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
 
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOfflineEnrollmentHelperCreator<
@@ -145,8 +120,16 @@
           &mock_store, &policy::MockCloudPolicyStore::NotifyStoreLoaded));
   tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
 
-  tested_controller_->EnrollOffline(temp_dir.GetPath());
-  EXPECT_TRUE(delegate_->WaitResult(true));
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOffline);
+  tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(true));
 }
 
 TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyLoadFailure) {
@@ -158,15 +141,23 @@
   EXPECT_CALL(mock_store, Store(_)).Times(0);
   tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
 
-  tested_controller_->EnrollOffline(
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOffline);
+  tested_controller_->SetOfflineDataDirForTest(
       base::FilePath(FILE_PATH_LITERAL("/no/such/path")));
-  EXPECT_TRUE(delegate_->WaitResult(false));
-  EXPECT_FALSE(delegate_->IsErrorFatal());
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(false));
+  EXPECT_FALSE(helper_->IsErrorFatal());
 }
 
 TEST_F(DemoSetupControllerTest, OfflineDeviceLocalAccountPolicyStoreFailed) {
   base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
+  ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
 
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOfflineEnrollmentHelperCreator<
@@ -177,27 +168,43 @@
           &mock_store, &policy::MockCloudPolicyStore::NotifyStoreError));
   tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
 
-  tested_controller_->EnrollOffline(temp_dir.GetPath());
-  EXPECT_TRUE(delegate_->WaitResult(false));
-  EXPECT_TRUE(delegate_->IsErrorFatal());
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOffline);
+  tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(false));
+  EXPECT_TRUE(helper_->IsErrorFatal());
 }
 
 TEST_F(DemoSetupControllerTest, OfflineInvalidDeviceLocalAccountPolicyBlob) {
   base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(SetupDummyOfflineDir("", &temp_dir));
+  ASSERT_TRUE(SetupDummyOfflinePolicyDir("", &temp_dir));
 
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOfflineEnrollmentHelperCreator<
           DemoModeSetupResult::SUCCESS>);
 
-  tested_controller_->EnrollOffline(temp_dir.GetPath());
-  EXPECT_TRUE(delegate_->WaitResult(false));
-  EXPECT_TRUE(delegate_->IsErrorFatal());
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOffline);
+  tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(false));
+  EXPECT_TRUE(helper_->IsErrorFatal());
 }
 
 TEST_F(DemoSetupControllerTest, OfflineError) {
   base::ScopedTempDir temp_dir;
-  ASSERT_TRUE(SetupDummyOfflineDir("test", &temp_dir));
+  ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &temp_dir));
 
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
@@ -206,43 +213,79 @@
   EXPECT_CALL(mock_store, Store(_)).Times(0);
   tested_controller_->SetDeviceLocalAccountPolicyStoreForTest(&mock_store);
 
-  tested_controller_->EnrollOffline(temp_dir.GetPath());
-  EXPECT_TRUE(delegate_->WaitResult(false));
-  EXPECT_FALSE(delegate_->IsErrorFatal());
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOffline);
+  tested_controller_->SetOfflineDataDirForTest(temp_dir.GetPath());
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(false));
+  EXPECT_FALSE(helper_->IsErrorFatal());
 }
 
 TEST_F(DemoSetupControllerTest, OnlineSuccess) {
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
 
-  tested_controller_->EnrollOnline();
-  EXPECT_TRUE(delegate_->WaitResult(true));
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOnline);
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(true));
 }
 
 TEST_F(DemoSetupControllerTest, OnlineError) {
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
 
-  tested_controller_->EnrollOnline();
-  EXPECT_TRUE(delegate_->WaitResult(false));
-  EXPECT_FALSE(delegate_->IsErrorFatal());
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOnline);
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(false));
+  EXPECT_FALSE(helper_->IsErrorFatal());
 }
 
 TEST_F(DemoSetupControllerTest, EnrollTwice) {
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
 
-  tested_controller_->EnrollOnline();
-  EXPECT_TRUE(delegate_->WaitResult(false));
-  EXPECT_FALSE(delegate_->IsErrorFatal());
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOnline);
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
 
-  delegate_->Reset();
+  EXPECT_TRUE(helper_->WaitResult(false));
+  EXPECT_FALSE(helper_->IsErrorFatal());
+
+  helper_->Reset();
 
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
 
-  tested_controller_->EnrollOnline();
-  EXPECT_TRUE(delegate_->WaitResult(true));
+  tested_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOnline);
+  tested_controller_->Enroll(
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupSuccess,
+                     base::Unretained(helper_.get())),
+      base::BindOnce(&DemoSetupControllerTestHelper::OnSetupError,
+                     base::Unretained(helper_.get())));
+
+  EXPECT_TRUE(helper_->WaitResult(true));
 }
 
 }  //  namespace chromeos
diff --git a/chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h b/chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h
index 8fb880b..d51aa47 100644
--- a/chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h
+++ b/chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h
@@ -7,10 +7,14 @@
 
 #include <string>
 
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h"
 #include "chrome/browser/chromeos/policy/enrollment_config.h"
 #include "chrome/browser/chromeos/policy/enrollment_status_chromeos.h"
+#include "components/policy/proto/device_management_backend.pb.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -72,6 +76,40 @@
   return mock;
 }
 
+// Creates fake offline policy directory to be used in tests.
+bool SetupDummyOfflinePolicyDir(const std::string& account_id,
+                                base::ScopedTempDir* temp_dir) {
+  if (!temp_dir->CreateUniqueTempDir()) {
+    LOG(ERROR) << "Failed to create unique tempdir";
+    return false;
+  }
+
+  if (base::WriteFile(temp_dir->GetPath().AppendASCII("device_policy"), "",
+                      0) != 0) {
+    LOG(ERROR) << "Failed to create device_policy file";
+    return false;
+  }
+
+  // We use MockCloudPolicyStore for the device local account policy in the
+  // tests, thus actual policy content can be empty. account_id is specified
+  // since it is used by DemoSetupController to look up the store.
+  std::string policy_blob;
+  if (!account_id.empty()) {
+    enterprise_management::PolicyData policy_data;
+    policy_data.set_username(account_id);
+    enterprise_management::PolicyFetchResponse policy;
+    policy.set_policy_data(policy_data.SerializeAsString());
+    policy_blob = policy.SerializeAsString();
+  }
+  if (base::WriteFile(temp_dir->GetPath().AppendASCII("local_account_policy"),
+                      policy_blob.data(), policy_blob.size()) !=
+      static_cast<int>(policy_blob.size())) {
+    LOG(ERROR) << "Failed to create local_account_policy file";
+    return false;
+  }
+  return true;
+}
+
 }  // namespace test
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/demo_setup_browsertest.cc b/chrome/browser/chromeos/login/demo_setup_browsertest.cc
index 59e2782..2ee0b1a 100644
--- a/chrome/browser/chromeos/login/demo_setup_browsertest.cc
+++ b/chrome/browser/chromeos/login/demo_setup_browsertest.cc
@@ -5,10 +5,12 @@
 #include <string>
 
 #include "base/command_line.h"
+#include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
+#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_setup_test_utils.h"
 #include "chrome/browser/chromeos/login/login_manager_test.h"
 #include "chrome/browser/chromeos/login/mock_network_state_helper.h"
@@ -16,6 +18,7 @@
 #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
 #include "chrome/browser/chromeos/login/screens/network_screen.h"
 #include "chrome/browser/chromeos/login/screens/screen_exit_code.h"
+#include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/login/test/js_checker.h"
 #include "chrome/browser/chromeos/login/test/oobe_screen_waiter.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
@@ -27,6 +30,7 @@
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state.h"
 #include "chromeos/network/network_state_handler.h"
+#include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
 #include "content/public/test/browser_test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
@@ -35,6 +39,7 @@
 using chromeos::test::DemoModeSetupResult;
 using chromeos::test::MockDemoModeOfflineEnrollmentHelperCreator;
 using chromeos::test::MockDemoModeOnlineEnrollmentHelperCreator;
+using chromeos::test::SetupDummyOfflinePolicyDir;
 
 namespace chromeos {
 
@@ -48,7 +53,7 @@
 constexpr char kDefaultNetworkName[] = "eth1";
 
 constexpr base::TimeDelta kJsConditionCheckFrequency =
-    base::TimeDelta::FromMilliseconds(200);
+    base::TimeDelta::FromMilliseconds(10);
 
 // How js query is executed.
 enum class JSExecution { kSync, kAsync };
@@ -57,7 +62,7 @@
 enum class OobeButton { kBack, kNext, kText };
 
 // Dialogs that are a part of Demo Mode setup screens.
-enum class DemoSetupDialog { kNetwork, kEula, kSettings, kProgress, kError };
+enum class DemoSetupDialog { kNetwork, kEula, kProgress, kError };
 
 // Returns js id of the given |button| type.
 std::string ButtonToStringId(OobeButton button) {
@@ -80,8 +85,6 @@
       return "networkDialog";
     case DemoSetupDialog::kEula:
       return "eulaDialog";
-    case DemoSetupDialog::kSettings:
-      return "demoSetupSettingsDialog";
     case DemoSetupDialog::kProgress:
       return "demoSetupProgressDialog";
     case DemoSetupDialog::kError:
@@ -316,21 +319,31 @@
     JSExecuteAsync(query);
   }
 
-  void SkipToDialog(DemoSetupDialog dialog) {
-    InvokeDemoMode();
-    ClickOkOnConfirmationDialog();
+  void SkipToErrorDialog() {
+    // Simulate online setup error.
+    EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
+        &MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
+
     auto* const wizard_controller = WizardController::default_controller();
     wizard_controller->SimulateDemoModeSetupForTesting();
+    // Enrollment type is set in the part of the flow that is skipped, That is
+    // why we need to set it here.
+    wizard_controller->demo_setup_controller()->set_enrollment_type(
+        DemoSetupController::EnrollmentType::kOnline);
     wizard_controller->AdvanceToScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
 
     OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
-    EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
+    // TODO(agawronska): Progress dialog transition is async - extra work is
+    // needed to be able to check it reliably.
+    WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
+                        DemoSetupDialog::kError);
+  }
 
-    const std::string query = base::StrCat(
-        {ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP),
-         ".showScreenForTesting('", DialogToStringId(dialog), "')"});
-    EXPECT_TRUE(JSExecute(query));
-    EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP, dialog));
+  void WaitForScreenDialog(OobeScreen screen, DemoSetupDialog dialog) {
+    const std::string query =
+        base::StrCat({"!", ScreenToContentQuery(screen), ".$.",
+                      DialogToStringId(dialog), ".hidden"});
+    JsConditionWaiter(js_checker(), query).Wait();
   }
 
   void SkipToScreen(OobeScreen screen) {
@@ -348,6 +361,22 @@
             OobeScreen::SCREEN_OOBE_DEMO_SETUP));
   }
 
+  void SimulateOfflineEnvironment() {
+    DemoSetupController* controller =
+        WizardController::default_controller()->demo_setup_controller();
+
+    // Simulate offline data directory.
+    ASSERT_TRUE(SetupDummyOfflinePolicyDir("test", &fake_policy_dir_));
+    controller->SetOfflineDataDirForTest(fake_policy_dir_.GetPath());
+
+    // Simulate policy store.
+    EXPECT_CALL(mock_policy_store_, Store(testing::_))
+        .WillRepeatedly(testing::InvokeWithoutArgs(
+            &mock_policy_store_,
+            &policy::MockCloudPolicyStore::NotifyStoreLoaded));
+    controller->SetDeviceLocalAccountPolicyStoreForTest(&mock_policy_store_);
+  }
+
   // Simulates device being connected to the network.
   void SimulateNetworkConnected() {
     ShillServiceClient::TestInterface* service =
@@ -400,6 +429,10 @@
     content::ExecuteScriptAsync(web_contents(), script);
   }
 
+  // TODO(agawronska): Maybe create a separate test fixture for offline setup.
+  base::ScopedTempDir fake_policy_dir_;
+  policy::MockCloudPolicyStore mock_policy_store_;
+
   DISALLOW_COPY_AND_ASSIGN(DemoSetupTest);
 };
 
@@ -469,16 +502,8 @@
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
 
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
-  EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kSettings));
-
-  ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                          DemoSetupDialog::kSettings, OobeButton::kNext,
-                          JSExecution::kAsync);
-
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kProgress));
+  // TODO(agawronska): Progress dialog transition is async - extra work is
+  // needed to be able to check it reliably.
 
   OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
 }
@@ -525,39 +550,26 @@
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_UPDATE).Wait();
 
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
-  EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kSettings));
-
-  ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                          DemoSetupDialog::kSettings, OobeButton::kNext,
-                          JSExecution::kAsync);
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kProgress));
-
-  // Wait for progress dialog to be hidden.
-  const std::string progress_dialog_hidden_query = base::StrCat(
-      {"!!", ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP), ".$.",
-       DialogToStringId(DemoSetupDialog::kProgress), ".hidden"});
-  JsConditionWaiter(js_checker(), progress_dialog_hidden_query).Wait();
-
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kError));
-
-  ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                          DemoSetupDialog::kError, OobeButton::kBack,
-                          JSExecution::kAsync);
-  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_WELCOME).Wait();
+  // TODO(agawronska): Progress dialog transition is async - extra work is
+  // needed to be able to check it reliably.
+  WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
+                      DemoSetupDialog::kError);
 }
 
-IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
+IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowSuccess) {
+  // Simulate offline setup success.
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
-      &MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
+      &MockDemoModeOfflineEnrollmentHelperCreator<
+          DemoModeSetupResult::SUCCESS>);
   SimulateNetworkDisconnected();
 
   InvokeDemoMode();
   ClickOkOnConfirmationDialog();
 
+  // It needs to be done after demo setup controller was created (demo setup
+  // flow was started).
+  SimulateOfflineEnvironment();
+
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES).Wait();
   EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
 
@@ -578,31 +590,55 @@
   EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_EULA));
 
   ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_EULA, DemoSetupDialog::kEula,
-                          OobeButton::kText, JSExecution::kAsync);
+                          OobeButton::kText, JSExecution::kSync);
 
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
-  EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP));
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kSettings));
+  // TODO(agawronska): Progress dialog transition is async - extra work is
+  // needed to be able to check it reliably.
 
-  ClickScreenDialogButtonWithId(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                                DemoSetupDialog::kSettings,
-                                "[name=offlineSetup]", JSExecution::kSync);
-  ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                          DemoSetupDialog::kSettings, OobeButton::kNext,
-                          JSExecution::kAsync);
+  OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
+}
 
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kProgress));
+IN_PROC_BROWSER_TEST_F(DemoSetupTest, OfflineSetupFlowError) {
+  // Simulate offline setup failure.
+  EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
+      &MockDemoModeOfflineEnrollmentHelperCreator<DemoModeSetupResult::ERROR>);
+  SimulateNetworkDisconnected();
 
-  // Wait for progress dialog to be hidden.
-  const std::string progress_dialog_hidden_query = base::StrCat(
-      {"!!", ScreenToContentQuery(OobeScreen::SCREEN_OOBE_DEMO_SETUP), ".$.",
-       DialogToStringId(DemoSetupDialog::kProgress), ".hidden"});
-  JsConditionWaiter(js_checker(), progress_dialog_hidden_query).Wait();
+  InvokeDemoMode();
+  ClickOkOnConfirmationDialog();
 
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kError));
+  // It needs to be done after demo setup controller was created (demo setup
+  // flow was started).
+  SimulateOfflineEnvironment();
+
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES).Wait();
+  EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
+
+  ClickOobeButton(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES, OobeButton::kText,
+                  JSExecution::kAsync);
+
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
+  EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_NETWORK));
+  EXPECT_FALSE(IsScreenDialogElementEnabled(
+      OobeScreen::SCREEN_OOBE_NETWORK, DemoSetupDialog::kNetwork,
+      ButtonToStringId(OobeButton::kNext)));
+
+  const std::string offline_setup_item_name =
+      l10n_util::GetStringUTF8(IDS_NETWORK_OFFLINE_DEMO_SETUP_LIST_ITEM_NAME);
+  ClickNetworkListElement(offline_setup_item_name);
+
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_EULA).Wait();
+  EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_EULA));
+
+  ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_EULA, DemoSetupDialog::kEula,
+                          OobeButton::kText, JSExecution::kSync);
+
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
+  // TODO(agawronska): Progress dialog transition is async - extra work is
+  // needed to be able to check it reliably.
+  WaitForScreenDialog(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
+                      DemoSetupDialog::kError);
 }
 
 IN_PROC_BROWSER_TEST_F(DemoSetupTest, NextDisabledOnNetworkScreen) {
@@ -657,44 +693,44 @@
   EXPECT_TRUE(IsScreenShown(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES));
 }
 
-IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnSettingsScreen) {
-  SkipToDialog(DemoSetupDialog::kSettings);
+IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnArcTermsScreen) {
+  // User cannot go to ARC ToS screen without accepting eula - simulate that.
+  StartupUtils::MarkEulaAccepted();
+
+  SkipToScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
+
+  ClickOobeButton(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE, OobeButton::kBack,
+                  JSExecution::kSync);
+
+  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_NETWORK).Wait();
+}
+
+IN_PROC_BROWSER_TEST_F(DemoSetupTest, BackOnErrorScreen) {
+  SkipToErrorDialog();
 
   ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                          DemoSetupDialog::kSettings, OobeButton::kBack,
+                          DemoSetupDialog::kError, OobeButton::kBack,
                           JSExecution::kAsync);
 
   OobeScreenWaiter(OobeScreen::SCREEN_OOBE_WELCOME).Wait();
 }
 
 IN_PROC_BROWSER_TEST_F(DemoSetupTest, RetryOnErrorScreen) {
-  // Simulate successful online setup after retry.
+  SkipToErrorDialog();
+
+  // Simulate successful online setup on retry.
   EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
       &MockDemoModeOnlineEnrollmentHelperCreator<DemoModeSetupResult::SUCCESS>);
 
-  SkipToDialog(DemoSetupDialog::kError);
-
   ClickScreenDialogButton(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
                           DemoSetupDialog::kError, OobeButton::kText,
                           JSExecution::kAsync);
-  EXPECT_TRUE(IsDialogShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                            DemoSetupDialog::kProgress));
+  // TODO(agawronska): Progress dialog transition is async - extra work is
+  // needed to be able to check it reliably.
 
   OobeScreenWaiter(OobeScreen::SCREEN_GAIA_SIGNIN).Wait();
 }
 
-IN_PROC_BROWSER_TEST_F(DemoSetupTest, ShowOnlineAndOfflineButton) {
-  SkipToDialog(DemoSetupDialog::kSettings);
-  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
-
-  EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                                         DemoSetupDialog::kSettings,
-                                         "[name=onlineSetup]"));
-  EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                                         DemoSetupDialog::kSettings,
-                                         "[name=offlineSetup]"));
-}
-
 IN_PROC_BROWSER_TEST_F(DemoSetupTest, ShowOfflineSetupOptionOnNetworkList) {
   SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
 
@@ -716,18 +752,6 @@
   DISALLOW_COPY_AND_ASSIGN(DemoSetupOfflineDisabledTest);
 };
 
-IN_PROC_BROWSER_TEST_F(DemoSetupOfflineDisabledTest, DoNotShowOfflineButton) {
-  SkipToDialog(DemoSetupDialog::kSettings);
-  OobeScreenWaiter(OobeScreen::SCREEN_OOBE_DEMO_SETUP).Wait();
-
-  EXPECT_TRUE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                                         DemoSetupDialog::kSettings,
-                                         "[name=onlineSetup]"));
-  EXPECT_FALSE(IsScreenDialogElementShown(OobeScreen::SCREEN_OOBE_DEMO_SETUP,
-                                          DemoSetupDialog::kSettings,
-                                          "[name=offlineSetup]"));
-}
-
 IN_PROC_BROWSER_TEST_F(DemoSetupOfflineDisabledTest,
                        NoOfflineSetupOptionOnNetworkList) {
   SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK);
diff --git a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_tpm_key_manager.cc b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_tpm_key_manager.cc
index a6d0ce17..cdcc620d 100644
--- a/chrome/browser/chromeos/login/easy_unlock/easy_unlock_tpm_key_manager.cc
+++ b/chrome/browser/chromeos/login/easy_unlock/easy_unlock_tpm_key_manager.cc
@@ -15,7 +15,7 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
diff --git a/chrome/browser/chromeos/login/helper.cc b/chrome/browser/chromeos/login/helper.cc
index 5ccbd4f..4e7cf4a6 100644
--- a/chrome/browser/chromeos/login/helper.cc
+++ b/chrome/browser/chromeos/login/helper.cc
@@ -11,7 +11,7 @@
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/login/signin_partition_manager.h"
 #include "chrome/browser/chromeos/login/ui/login_display_host.h"
 #include "chrome/browser/chromeos/login/ui/webui_login_view.h"
diff --git a/chrome/browser/chromeos/login/lock/views_screen_locker.cc b/chrome/browser/chromeos/login/lock/views_screen_locker.cc
index 400c1dc..8a84cdf 100644
--- a/chrome/browser/chromeos/login/lock/views_screen_locker.cc
+++ b/chrome/browser/chromeos/login/lock/views_screen_locker.cc
@@ -42,14 +42,16 @@
 ash::mojom::FingerprintUnlockState ConvertFromFingerprintState(
     ScreenLocker::FingerprintState state) {
   switch (state) {
-    case ScreenLocker::FingerprintState::kRemoved:
     case ScreenLocker::FingerprintState::kHidden:
-    case ScreenLocker::FingerprintState::kDefault:
       return ash::mojom::FingerprintUnlockState::UNAVAILABLE;
+    case ScreenLocker::FingerprintState::kDefault:
+      return ash::mojom::FingerprintUnlockState::AVAILABLE;
     case ScreenLocker::FingerprintState::kSignin:
       return ash::mojom::FingerprintUnlockState::AUTH_SUCCESS;
     case ScreenLocker::FingerprintState::kFailed:
       return ash::mojom::FingerprintUnlockState::AUTH_FAILED;
+    case ScreenLocker::FingerprintState::kRemoved:
+      return ash::mojom::FingerprintUnlockState::AUTH_DISABLED;
   }
 }
 
diff --git a/chrome/browser/chromeos/login/login_utils_browsertest.cc b/chrome/browser/chromeos/login/login_utils_browsertest.cc
index 7e3f1fce1..7f218bf1 100644
--- a/chrome/browser/chromeos/login/login_utils_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_utils_browsertest.cc
@@ -32,7 +32,7 @@
 #include "ui/base/ui_base_features.h"
 
 #if BUILDFLAG(ENABLE_RLZ)
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/rlz/rlz_tracker.h"
 #endif
 
diff --git a/chrome/browser/chromeos/login/oobe_configuration.cc b/chrome/browser/chromeos/login/oobe_configuration.cc
index 26599f0b..87fb6ae 100644
--- a/chrome/browser/chromeos/login/oobe_configuration.cc
+++ b/chrome/browser/chromeos/login/oobe_configuration.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_reader.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/chromeos/login/screens/demo_setup_screen.cc b/chrome/browser/chromeos/login/screens/demo_setup_screen.cc
index 6cfa058c1..7fd224f 100644
--- a/chrome/browser/chromeos/login/screens/demo_setup_screen.cc
+++ b/chrome/browser/chromeos/login/screens/demo_setup_screen.cc
@@ -4,24 +4,16 @@
 
 #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
 
-#include "base/files/file_path.h"
-#include "base/logging.h"
-#include "chrome/browser/chromeos/login/screen_manager.h"
+#include "base/bind.h"
 #include "chrome/browser/chromeos/login/screens/base_screen_delegate.h"
 #include "chrome/browser/chromeos/login/screens/demo_setup_screen_view.h"
-#include "chrome/browser/chromeos/policy/enrollment_config.h"
+#include "chrome/browser/chromeos/login/wizard_controller.h"
 
 namespace {
 
-constexpr char kUserActionOnlineSetup[] = "online-setup";
-constexpr char kUserActionOfflineSetup[] = "offline-setup";
+constexpr char kUserActionStartSetup[] = "start-setup";
 constexpr char kUserActionClose[] = "close-setup";
 
-// The policy blob data for offline demo-mode is embedded into the filesystem.
-// TODO(mukai, agawronska): fix this when switching to dm-verity image.
-constexpr const base::FilePath::CharType kOfflineDemoModeDir[] =
-    FILE_PATH_LITERAL("/usr/share/chromeos-assets/demo_mode_resources/policy");
-
 }  // namespace
 
 namespace chromeos {
@@ -29,10 +21,10 @@
 DemoSetupScreen::DemoSetupScreen(BaseScreenDelegate* base_screen_delegate,
                                  DemoSetupScreenView* view)
     : BaseScreen(base_screen_delegate, OobeScreen::SCREEN_OOBE_DEMO_SETUP),
-      view_(view) {
+      view_(view),
+      weak_ptr_factory_(this) {
   DCHECK(view_);
   view_->Bind(this);
-  demo_controller_.reset(new DemoSetupController(this));
 }
 
 DemoSetupScreen::~DemoSetupScreen() {
@@ -51,10 +43,8 @@
 }
 
 void DemoSetupScreen::OnUserAction(const std::string& action_id) {
-  if (action_id == kUserActionOnlineSetup) {
-    demo_controller_->EnrollOnline();
-  } else if (action_id == kUserActionOfflineSetup) {
-    demo_controller_->EnrollOffline(base::FilePath(kOfflineDemoModeDir));
+  if (action_id == kUserActionStartSetup) {
+    StartEnrollment();
   } else if (action_id == kUserActionClose) {
     Finish(ScreenExitCode::DEMO_MODE_SETUP_CANCELED);
   } else {
@@ -62,11 +52,22 @@
   }
 }
 
-void DemoSetupScreen::OnSetupError(bool fatal) {
-  // TODO(mukai): propagate |fatal| information and change the error message.
+void DemoSetupScreen::OnSetupError(DemoSetupController::DemoSetupError error) {
+  // TODO(mukai): propagate |error| information and change the error message.
   view_->OnSetupFinished(false, std::string());
 }
 
+void DemoSetupScreen::StartEnrollment() {
+  // Demo setup screen is only shown in OOBE.
+  DCHECK(DemoSetupController::IsOobeDemoSetupFlowInProgress());
+  DemoSetupController* demo_controller =
+      WizardController::default_controller()->demo_setup_controller();
+  demo_controller->Enroll(base::BindOnce(&DemoSetupScreen::OnSetupSuccess,
+                                         weak_ptr_factory_.GetWeakPtr()),
+                          base::BindOnce(&DemoSetupScreen::OnSetupError,
+                                         weak_ptr_factory_.GetWeakPtr()));
+}
+
 void DemoSetupScreen::OnSetupSuccess() {
   Finish(ScreenExitCode::DEMO_MODE_SETUP_FINISHED);
 }
@@ -74,7 +75,6 @@
 void DemoSetupScreen::OnViewDestroyed(DemoSetupScreenView* view) {
   if (view_ == view)
     view_ = nullptr;
-  demo_controller_.reset();
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/login/screens/demo_setup_screen.h b/chrome/browser/chromeos/login/screens/demo_setup_screen.h
index 27e06f17..7e52b94 100644
--- a/chrome/browser/chromeos/login/screens/demo_setup_screen.h
+++ b/chrome/browser/chromeos/login/screens/demo_setup_screen.h
@@ -5,8 +5,10 @@
 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_SETUP_SCREEN_H_
 #define CHROME_BROWSER_CHROMEOS_LOGIN_SCREENS_DEMO_SETUP_SCREEN_H_
 
-#include <memory>
+#include <string>
 
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/chromeos/login/screens/base_screen.h"
 
@@ -17,8 +19,7 @@
 
 // Controlls demo mode setup. The screen can be shown during OOBE. It allows
 // user to setup retail demo mode on the device.
-class DemoSetupScreen : public BaseScreen,
-                        public DemoSetupController::Delegate {
+class DemoSetupScreen : public BaseScreen {
  public:
   DemoSetupScreen(BaseScreenDelegate* base_screen_delegate,
                   DemoSetupScreenView* view);
@@ -29,17 +30,22 @@
   void Hide() override;
   void OnUserAction(const std::string& action_id) override;
 
-  // DemoSetupManager::Delegate:
-  void OnSetupError(bool fatal) override;
-  void OnSetupSuccess() override;
-
   // Called when view is being destroyed. If Screen is destroyed earlier
   // then it has to call Bind(nullptr).
   void OnViewDestroyed(DemoSetupScreenView* view);
 
  private:
+  void StartEnrollment();
+
+  // Called when the setup flow finished with error.
+  void OnSetupError(DemoSetupController::DemoSetupError error);
+
+  // Called when the setup flow finished successfully.
+  void OnSetupSuccess();
+
   DemoSetupScreenView* view_;
-  std::unique_ptr<DemoSetupController> demo_controller_;
+
+  base::WeakPtrFactory<DemoSetupScreen> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(DemoSetupScreen);
 };
diff --git a/chrome/browser/chromeos/login/screens/mock_demo_setup_screen.cc b/chrome/browser/chromeos/login/screens/mock_demo_setup_screen.cc
index e98e962..d22a651 100644
--- a/chrome/browser/chromeos/login/screens/mock_demo_setup_screen.cc
+++ b/chrome/browser/chromeos/login/screens/mock_demo_setup_screen.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
diff --git a/chrome/browser/chromeos/login/screens/reset_screen.cc b/chrome/browser/chromeos/login/screens/reset_screen.cc
index 896fd7c..82cfd7f 100644
--- a/chrome/browser/chromeos/login/screens/reset_screen.cc
+++ b/chrome/browser/chromeos/login/screens/reset_screen.cc
@@ -6,7 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/screens/base_screen_delegate.h"
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index e519f6ce..98c95274 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -25,7 +25,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string16.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/about_flags.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
diff --git a/chrome/browser/chromeos/login/startup_utils.cc b/chrome/browser/chromeos/login/startup_utils.cc
index 7109fe2..5f54827 100644
--- a/chrome/browser/chromeos/login/startup_utils.cc
+++ b/chrome/browser/chromeos/login/startup_utils.cc
@@ -11,7 +11,7 @@
 #include "base/command_line.h"
 #include "base/path_service.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_authentication.cc b/chrome/browser/chromeos/login/supervised/supervised_user_authentication.cc
index 1d02ebb..6b06649 100644
--- a/chrome/browser/chromeos/login/supervised/supervised_user_authentication.cc
+++ b/chrome/browser/chromeos/login/supervised/supervised_user_authentication.cc
@@ -10,7 +10,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/login/supervised/supervised_user_constants.h"
 #include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
diff --git a/chrome/browser/chromeos/login/supervised/supervised_user_creation_controller_new.cc b/chrome/browser/chromeos/login/supervised/supervised_user_creation_controller_new.cc
index 193e047..e3ad6f9 100644
--- a/chrome/browser/chromeos/login/supervised/supervised_user_creation_controller_new.cc
+++ b/chrome/browser/chromeos/login/supervised/supervised_user_creation_controller_new.cc
@@ -12,7 +12,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/login/supervised/supervised_user_authentication.h"
diff --git a/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc b/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc
index 99e75c4463a..98e780b 100644
--- a/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/avatar/user_image_manager_impl.cc
@@ -18,7 +18,7 @@
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
index ca948d9..4d01e5b 100644
--- a/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/chrome_user_manager_impl.cc
@@ -27,7 +27,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
diff --git a/chrome/browser/chromeos/login/users/supervised_user_manager_impl.cc b/chrome/browser/chromeos/login/users/supervised_user_manager_impl.cc
index 3900bb9..c3dd11d 100644
--- a/chrome/browser/chromeos/login/users/supervised_user_manager_impl.cc
+++ b/chrome/browser/chromeos/login/users/supervised_user_manager_impl.cc
@@ -11,7 +11,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/supervised/supervised_user_authentication.h"
diff --git a/chrome/browser/chromeos/login/version_info_updater.cc b/chrome/browser/chromeos/login/version_info_updater.cc
index 24dca32d..1207701 100644
--- a/chrome/browser/chromeos/login/version_info_updater.cc
+++ b/chrome/browser/chromeos/login/version_info_updater.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
diff --git a/chrome/browser/chromeos/login/wizard_controller.cc b/chrome/browser/chromeos/login/wizard_controller.cc
index 62219c75f..fd8c910 100644
--- a/chrome/browser/chromeos/login/wizard_controller.cc
+++ b/chrome/browser/chromeos/login/wizard_controller.cc
@@ -22,7 +22,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part.h"
@@ -32,6 +32,7 @@
 #include "chrome/browser/chromeos/arc/arc_util.h"
 #include "chrome/browser/chromeos/arc/voice_interaction/arc_voice_interaction_framework_service.h"
 #include "chrome/browser/chromeos/customization/customization_document.h"
+#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_check_screen.h"
 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
 #include "chrome/browser/chromeos/login/existing_user_controller.h"
@@ -816,7 +817,7 @@
 }
 
 void WizardController::OnNetworkBack() {
-  if (is_in_demo_setup_flow_) {
+  if (demo_setup_controller_) {
     ShowDemoModePreferencesScreen();
   } else {
     ShowWelcomeScreen();
@@ -824,6 +825,11 @@
 }
 
 void WizardController::OnNetworkConnected() {
+  if (demo_setup_controller_) {
+    demo_setup_controller_->set_enrollment_type(
+        DemoSetupController::EnrollmentType::kOnline);
+  }
+
   if (is_official_build_) {
     if (!StartupUtils::IsEulaAccepted()) {
       ShowEulaScreen();
@@ -842,8 +848,10 @@
 }
 
 void WizardController::OnOfflineDemoModeSetup() {
-  DCHECK(is_in_demo_setup_flow_);
-  is_offline_demo_setup_ = true;
+  DCHECK(demo_setup_controller_);
+  demo_setup_controller_->set_enrollment_type(
+      DemoSetupController::EnrollmentType::kOffline);
+
   if (is_official_build_) {
     if (!StartupUtils::IsEulaAccepted()) {
       ShowEulaScreen();
@@ -865,7 +873,7 @@
 }
 
 void WizardController::OnUpdateCompleted() {
-  if (is_in_demo_setup_flow_) {
+  if (demo_setup_controller_) {
     ShowDemoModeSetupScreen();
     return;
   }
@@ -889,8 +897,7 @@
   PerformPostEulaActions();
 
   // TODO(crbug.com/857275): Show Play Store ToS when available offline.
-  if (is_offline_demo_setup_) {
-    DCHECK(is_in_demo_setup_flow_);
+  if (demo_setup_controller_ && demo_setup_controller_->IsOfflineEnrollment()) {
     ShowDemoModeSetupScreen();
     return;
   }
@@ -1031,7 +1038,7 @@
 }
 
 void WizardController::OnArcTermsOfServiceAccepted() {
-  if (is_in_demo_setup_flow_) {
+  if (demo_setup_controller_) {
     InitiateOOBEUpdate();
     return;
   }
@@ -1052,7 +1059,7 @@
 }
 
 void WizardController::OnArcTermsOfServiceBack() {
-  DCHECK(is_in_demo_setup_flow_);
+  DCHECK(demo_setup_controller_);
   DCHECK(StartupUtils::IsEulaAccepted());
   ShowNetworkScreen();
 }
@@ -1102,29 +1109,26 @@
 }
 
 void WizardController::OnDemoSetupFinished() {
-  DCHECK(is_in_demo_setup_flow_);
-  is_in_demo_setup_flow_ = false;
-  is_offline_demo_setup_ = false;
+  DCHECK(demo_setup_controller_);
+  demo_setup_controller_.reset();
   PerformOOBECompletedActions();
   ShowLoginScreen(LoginScreenContext());
 }
 
 void WizardController::OnDemoSetupCanceled() {
-  DCHECK(is_in_demo_setup_flow_);
-  is_in_demo_setup_flow_ = false;
-  is_offline_demo_setup_ = false;
+  DCHECK(demo_setup_controller_);
+  demo_setup_controller_.reset();
   ShowWelcomeScreen();
 }
 
 void WizardController::OnDemoPreferencesContinued() {
-  DCHECK(is_in_demo_setup_flow_);
+  DCHECK(demo_setup_controller_);
   ShowNetworkScreen();
 }
 
 void WizardController::OnDemoPreferencesCanceled() {
-  DCHECK(is_in_demo_setup_flow_);
-  is_in_demo_setup_flow_ = false;
-  is_offline_demo_setup_ = false;
+  DCHECK(demo_setup_controller_);
+  demo_setup_controller_.reset();
   ShowWelcomeScreen();
 }
 
@@ -1427,12 +1431,12 @@
 }
 
 void WizardController::StartDemoModeSetup() {
-  is_in_demo_setup_flow_ = true;
+  demo_setup_controller_ = std::make_unique<DemoSetupController>();
   ShowDemoModePreferencesScreen();
 }
 
 void WizardController::SimulateDemoModeSetupForTesting() {
-  is_in_demo_setup_flow_ = true;
+  demo_setup_controller_ = std::make_unique<DemoSetupController>();
 }
 
 ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/chromeos/login/wizard_controller.h b/chrome/browser/chromeos/login/wizard_controller.h
index ecd2150a..7fb5e33 100644
--- a/chrome/browser/chromeos/login/wizard_controller.h
+++ b/chrome/browser/chromeos/login/wizard_controller.h
@@ -44,6 +44,7 @@
 class NetworkStateHelper;
 }  // namespace login
 
+class DemoSetupController;
 class ErrorScreen;
 struct Geoposition;
 class LoginDisplayHost;
@@ -106,7 +107,10 @@
   // Starts Demo Mode setup flow. The flow starts from network screen and reuses
   // some of regular OOBE screens. It consists of the following screens:
   //    chromeos::OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES
+  //    chromeos::OobeScreen::SCREEN_OOBE_NETWORK
   //    chromeos::OobeScreen::SCREEN_OOBE_EULA
+  //    chromeos::OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE
+  //    chromeos::OobeScreen::SCREEN_OOBE_UPDATE
   //    chromeos::OobeScreen::SCREEN_OOBE_DEMO_SETUP
   void StartDemoModeSetup();
 
@@ -127,6 +131,12 @@
   // reworked at hackaton.
   void EnableUserImageScreenReturnToPreviousHack();
 
+  // Returns current DemoSetupController if demo setup flow is in progress or
+  // nullptr otherwise.
+  DemoSetupController* demo_setup_controller() const {
+    return demo_setup_controller_.get();
+  }
+
   // Returns a pointer to the current screen or nullptr if there's no such
   // screen.
   BaseScreen* current_screen() const { return current_screen_; }
@@ -134,9 +144,6 @@
   // Returns true if the current wizard instance has reached the login screen.
   bool login_screen_started() const { return login_screen_started_; }
 
-  // Whether demo mode setup OOBE flow is currently in progress.
-  bool is_in_demo_mode_setup_flow() const { return is_in_demo_setup_flow_; }
-
   // Returns a given screen. Creates it lazily.
   BaseScreen* GetScreen(OobeScreen screen);
 
@@ -434,16 +441,6 @@
 
   bool is_in_session_oobe_ = false;
 
-  // Whether the currently presented flow is Demo Mode setup.
-  bool is_in_demo_setup_flow_ = false;
-
-  // TODO(agawronska): Refactor |is_in_demo_setup_flow_| and
-  // |is_offline_demo_setup_| to DemoSetupController and use it here to
-  // determine demo setup configuration.
-  // Whether offline demo setup was chosen as a part of
-  // demo mode setup. Should be check together with |is_in_demo_setup_flow_|.
-  bool is_offline_demo_setup_ = false;
-
   // Indicates that once image selection screen finishes we should return to
   // a previous screen instead of proceeding with usual flow.
   bool user_image_screen_return_to_previous_hack_ = false;
@@ -480,6 +477,10 @@
   // Helper for network realted operations.
   std::unique_ptr<login::NetworkStateHelper> network_state_helper_;
 
+  // Controller of the demo mode setup. It has the lifetime of the single demo
+  // mode setup flow.
+  std::unique_ptr<DemoSetupController> demo_setup_controller_;
+
   // Maps screen names to last time of their shows.
   std::map<std::string, base::Time> screen_show_times_;
 
diff --git a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
index e373795..22f0293 100644
--- a/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
+++ b/chrome/browser/chromeos/login/wizard_controller_browsertest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
 #include "chrome/browser/chromeos/base/locale_util.h"
+#include "chrome/browser/chromeos/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h"
 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
@@ -2166,10 +2167,6 @@
     testing::Mock::VerifyAndClearExpectations(mock_welcome_screen_);
   }
 
-  bool IsInDemoSetupFlow() const {
-    return WizardController::default_controller()->is_in_demo_setup_flow_;
-  }
-
   template <class T, class H>
   void SkipToScreen(OobeScreen screen, MockOutShowHide<T, H>* screen_mock) {
     EXPECT_CALL(*screen_mock, Show()).Times(1);
@@ -2185,7 +2182,7 @@
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
                        OnlineDemoSetupFlowFinished) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
 
   EXPECT_CALL(*mock_welcome_screen_, Hide()).Times(1);
@@ -2195,7 +2192,7 @@
   WizardController::default_controller()->StartDemoModeSetup();
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
@@ -2204,7 +2201,7 @@
          ScreenExitCode::DEMO_MODE_PREFERENCES_CONTINUED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
@@ -2212,7 +2209,7 @@
   OnExit(*mock_network_screen_, ScreenExitCode::NETWORK_CONNECTED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_arc_terms_of_service_screen_, Show()).Times(1);
@@ -2220,7 +2217,7 @@
   OnExit(*mock_eula_screen_, ScreenExitCode::EULA_ACCEPTED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_arc_terms_of_service_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
@@ -2231,7 +2228,7 @@
   base::RunLoop().RunUntilIdle();
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_UPDATE);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_demo_setup_screen_, Show()).Times(1);
@@ -2239,19 +2236,19 @@
   OnExit(*mock_arc_terms_of_service_screen_, ScreenExitCode::UPDATE_INSTALLED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   OnExit(*mock_demo_setup_screen_, ScreenExitCode::DEMO_MODE_SETUP_FINISHED);
 
   EXPECT_TRUE(StartupUtils::IsOobeCompleted());
   EXPECT_TRUE(ExistingUserController::current_controller());
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest,
                        OfflineDemoSetupFlowFinished) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
 
   EXPECT_CALL(*mock_welcome_screen_, Hide()).Times(1);
@@ -2261,7 +2258,7 @@
   WizardController::default_controller()->StartDemoModeSetup();
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
@@ -2270,7 +2267,7 @@
          ScreenExitCode::DEMO_MODE_PREFERENCES_CONTINUED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
@@ -2278,7 +2275,7 @@
   OnExit(*mock_network_screen_, ScreenExitCode::NETWORK_OFFLINE_DEMO_SETUP);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_demo_setup_screen_, Show()).Times(1);
@@ -2286,18 +2283,18 @@
   OnExit(*mock_eula_screen_, ScreenExitCode::EULA_ACCEPTED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   OnExit(*mock_demo_setup_screen_, ScreenExitCode::DEMO_MODE_SETUP_FINISHED);
 
   EXPECT_TRUE(StartupUtils::IsOobeCompleted());
   EXPECT_TRUE(ExistingUserController::current_controller());
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoSetupCanceled) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
 
   EXPECT_CALL(*mock_welcome_screen_, Hide()).Times(1);
@@ -2307,7 +2304,7 @@
   WizardController::default_controller()->StartDemoModeSetup();
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
@@ -2316,7 +2313,7 @@
          ScreenExitCode::DEMO_MODE_PREFERENCES_CONTINUED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_eula_screen_, Show()).Times(1);
@@ -2324,7 +2321,7 @@
   OnExit(*mock_network_screen_, ScreenExitCode::NETWORK_CONNECTED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_arc_terms_of_service_screen_, Show()).Times(1);
@@ -2332,7 +2329,7 @@
   OnExit(*mock_eula_screen_, ScreenExitCode::EULA_ACCEPTED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_arc_terms_of_service_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_update_screen_, Show()).Times(1);
@@ -2340,11 +2337,10 @@
   OnExit(*mock_arc_terms_of_service_screen_,
          ScreenExitCode::ARC_TERMS_OF_SERVICE_ACCEPTED);
 
-  // Let update screen smooth time process (time = 0ms).
   base::RunLoop().RunUntilIdle();
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_UPDATE);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_update_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_demo_setup_screen_, Show()).Times(1);
@@ -2352,7 +2348,7 @@
   OnExit(*mock_arc_terms_of_service_screen_, ScreenExitCode::UPDATE_INSTALLED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_SETUP);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_demo_setup_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_welcome_screen_, Show()).Times(1);
@@ -2361,18 +2357,18 @@
   OnExit(*mock_demo_setup_screen_, ScreenExitCode::DEMO_MODE_SETUP_CANCELED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, DemoPreferencesCanceled) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
   SkipToScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES,
                mock_demo_preferences_screen_);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_demo_preferences_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_welcome_screen_, Show()).Times(1);
@@ -2381,17 +2377,17 @@
          ScreenExitCode::DEMO_MODE_PREFERENCES_CANCELED);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, NetworkBackPressed) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
   SkipToScreen(OobeScreen::SCREEN_OOBE_NETWORK, mock_network_screen_);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_network_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_demo_preferences_screen_, Show()).Times(1);
@@ -2399,17 +2395,17 @@
   OnExit(*mock_eula_screen_, ScreenExitCode::NETWORK_BACK);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_DEMO_PREFERENCES);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, EulaBackPressed) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
   SkipToScreen(OobeScreen::SCREEN_OOBE_EULA, mock_eula_screen_);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_EULA);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_eula_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
@@ -2417,12 +2413,12 @@
   OnExit(*mock_eula_screen_, ScreenExitCode::EULA_BACK);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 IN_PROC_BROWSER_TEST_F(WizardControllerDemoSetupTest, ArcTosBackPressed) {
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_WELCOME);
-  EXPECT_FALSE(IsInDemoSetupFlow());
+  EXPECT_FALSE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
   WaitUntilJSIsReady();
 
   // User cannot go to ARC ToS screen without accepting eula - simulate that.
@@ -2431,7 +2427,7 @@
                mock_arc_terms_of_service_screen_);
 
   CheckCurrentScreen(OobeScreen::SCREEN_ARC_TERMS_OF_SERVICE);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 
   EXPECT_CALL(*mock_arc_terms_of_service_screen_, Hide()).Times(1);
   EXPECT_CALL(*mock_network_screen_, Show()).Times(1);
@@ -2440,7 +2436,7 @@
          ScreenExitCode::ARC_TERMS_OF_SERVICE_BACK);
 
   CheckCurrentScreen(OobeScreen::SCREEN_OOBE_NETWORK);
-  EXPECT_TRUE(IsInDemoSetupFlow());
+  EXPECT_TRUE(DemoSetupController::IsOobeDemoSetupFlowInProgress());
 }
 
 class WizardControllerOobeResumeTest : public WizardControllerTest {
diff --git a/chrome/browser/chromeos/mobile/mobile_activator.cc b/chrome/browser/chromeos/mobile/mobile_activator.cc
index 38fce923..8054efbc 100644
--- a/chrome/browser/chromeos/mobile/mobile_activator.cc
+++ b/chrome/browser/chromeos/mobile/mobile_activator.cc
@@ -20,7 +20,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/timer.h"
 #include "base/values.h"
diff --git a/chrome/browser/chromeos/mobile_config.cc b/chrome/browser/chromeos/mobile_config.cc
index 238ee4c..02b865da 100644
--- a/chrome/browser/chromeos/mobile_config.cc
+++ b/chrome/browser/chromeos/mobile_config.cc
@@ -14,7 +14,7 @@
 #include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/net/client_cert_store_chromeos.cc b/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
index 17e3e8e4..9ee71ab 100644
--- a/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
+++ b/chrome/browser/chromeos/net/client_cert_store_chromeos.cc
@@ -13,7 +13,7 @@
 #include "base/bind_helpers.h"
 #include "base/callback.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "chrome/browser/chromeos/certificate_provider/certificate_provider.h"
 #include "crypto/nss_crypto_module_delegate.h"
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
index c30c51a..dc64996 100644
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc
@@ -17,7 +17,7 @@
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys.cc b/chrome/browser/chromeos/platform_keys/platform_keys.cc
index b5c8c27..dc6be27 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys.cc
+++ b/chrome/browser/chromeos/platform_keys/platform_keys.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "net/base/hash_value.h"
 #include "net/cert/x509_certificate.h"
 
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc b/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc
index 9ea6c8c..d098db0 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_nss.cc
@@ -19,7 +19,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part_chromeos.h"
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_collector.h b/chrome/browser/chromeos/policy/app_install_event_log_collector.h
index 6f7ac761..b8d17f3b 100644
--- a/chrome/browser/chromeos/policy/app_install_event_log_collector.h
+++ b/chrome/browser/chromeos/policy/app_install_event_log_collector.h
@@ -18,7 +18,7 @@
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chromeos/dbus/power_manager_client.h"
 #include "components/arc/common/policy.mojom.h"
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 class Profile;
 
@@ -31,7 +31,7 @@
 class AppInstallEventLogCollector
     : public chromeos::PowerManagerClient::Observer,
       public arc::ArcPolicyBridge::Observer,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver,
+      public network::NetworkConnectionTracker::NetworkConnectionObserver,
       public ArcAppListPrefs::Observer {
  public:
   // The delegate that events are forwarded to for inclusion in the log.
@@ -76,7 +76,7 @@
   void SuspendImminent(power_manager::SuspendImminent::Reason reason) override;
   void SuspendDone(const base::TimeDelta& sleep_duration) override;
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver:
+  // network::NetworkConnectionTracker::NetworkConnectionObserver:
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   // arc::ArcPolicyBridge::Observer:
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_collector_unittest.cc b/chrome/browser/chromeos/policy/app_install_event_log_collector_unittest.cc
index 21f291f..67f4ef5 100644
--- a/chrome/browser/chromeos/policy/app_install_event_log_collector_unittest.cc
+++ b/chrome/browser/chromeos/policy/app_install_event_log_collector_unittest.cc
@@ -145,7 +145,7 @@
   }
 
   void SetNetworkState(
-      content::NetworkConnectionTracker::NetworkConnectionObserver* observer,
+      network::NetworkConnectionTracker::NetworkConnectionObserver* observer,
       const std::string& service_path,
       const std::string& state) {
     service_test_->SetServiceProperty(service_path, shill::kStateProperty,
diff --git a/chrome/browser/chromeos/policy/app_install_event_log_manager.cc b/chrome/browser/chromeos/policy/app_install_event_log_manager.cc
index 4e7542b..a9f8384a0 100644
--- a/chrome/browser/chromeos/policy/app_install_event_log_manager.cc
+++ b/chrome/browser/chromeos/policy/app_install_event_log_manager.cc
@@ -11,8 +11,8 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/policy/app_install_event_logger.cc b/chrome/browser/chromeos/policy/app_install_event_logger.cc
index c225ac9..734e37a 100644
--- a/chrome/browser/chromeos/policy/app_install_event_logger.cc
+++ b/chrome/browser/chromeos/policy/app_install_event_logger.cc
@@ -13,8 +13,8 @@
 #include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
@@ -22,6 +22,7 @@
 #include "chrome/browser/policy/profile_policy_connector.h"
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/arc/arc_prefs.h"
 #include "components/policy/core/common/policy_map.h"
diff --git a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h
index 15742b72..bdf3122d 100644
--- a/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h
+++ b/chrome/browser/chromeos/policy/auto_enrollment_client_impl.h
@@ -15,7 +15,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/policy/auto_enrollment_client.h"
 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "third_party/protobuf/src/google/protobuf/repeated_field.h"
 
 class PrefRegistrySimple;
@@ -35,7 +35,7 @@
 // OOBE.
 class AutoEnrollmentClientImpl
     : public AutoEnrollmentClient,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver {
+      public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   // Subclasses of this class provide an identifier and specify the identifier
   // set for the DeviceAutoEnrollmentRequest,
@@ -86,7 +86,7 @@
   std::string device_id() const override;
   AutoEnrollmentState state() const override;
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver:
+  // network::NetworkConnectionTracker::NetworkConnectionObserver:
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
  private:
diff --git a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
index 99fdda59..72c5b34 100644
--- a/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
+++ b/chrome/browser/chromeos/policy/browser_policy_connector_chromeos.cc
@@ -17,7 +17,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/attestation/attestation_ca_client.h"
 #include "chrome/browser/chromeos/policy/active_directory_policy_manager.h"
diff --git a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
index 4c7fe54b..d8c50a2d4 100644
--- a/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
+++ b/chrome/browser/chromeos/policy/device_local_account_policy_service.cc
@@ -17,8 +17,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/affiliated_cloud_policy_invalidator.h"
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc
index 137b8745..a866f83 100644
--- a/chrome/browser/chromeos/policy/device_status_collector.cc
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc
@@ -27,7 +27,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
 #include "base/version.h"
diff --git a/chrome/browser/chromeos/policy/dm_token_storage.cc b/chrome/browser/chromeos/policy/dm_token_storage.cc
index b863af0..1c58ba6 100644
--- a/chrome/browser/chromeos/policy/dm_token_storage.cc
+++ b/chrome/browser/chromeos/policy/dm_token_storage.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/chromeos/policy/dm_token_storage.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/settings/token_encryptor.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/cryptohome/system_salt_getter.h"
diff --git a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
index c7cb909..50f0428c 100644
--- a/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
+++ b/chrome/browser/chromeos/policy/enrollment_handler_chromeos.cc
@@ -13,7 +13,7 @@
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/enrollment/auto_enrollment_controller.h"
diff --git a/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc b/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc
index e7584bf..66ab2be 100644
--- a/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc
+++ b/chrome/browser/chromeos/policy/pre_signin_policy_fetcher.cc
@@ -13,8 +13,8 @@
 #include "base/logging.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "chromeos/chromeos_paths.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
diff --git a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc b/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc
index 8768838..c71c7da 100644
--- a/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc
+++ b/chrome/browser/chromeos/policy/remote_commands/screenshot_delegate.cc
@@ -53,8 +53,6 @@
   chromeos::DeviceOAuth2TokenService* device_oauth2_token_service =
       chromeos::DeviceOAuth2TokenServiceFactory::Get();
 
-  scoped_refptr<net::URLRequestContextGetter> system_request_context =
-      g_browser_process->system_request_context();
   std::string robot_account_id =
       device_oauth2_token_service->GetRobotAccountId();
 
@@ -80,7 +78,7 @@
       )");
   return std::unique_ptr<UploadJob>(new UploadJobImpl(
       upload_url, robot_account_id, device_oauth2_token_service,
-      system_request_context, delegate,
+      g_browser_process->shared_url_loader_factory(), delegate,
       base::WrapUnique(new UploadJobImpl::RandomMimeBoundaryGenerator),
       traffic_annotation, base::ThreadTaskRunnerHandle::Get()));
 }
diff --git a/chrome/browser/chromeos/policy/system_log_uploader.cc b/chrome/browser/chromeos/policy/system_log_uploader.cc
index b7e318a..58b41a9 100644
--- a/chrome/browser/chromeos/policy/system_log_uploader.cc
+++ b/chrome/browser/chromeos/policy/system_log_uploader.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/syslog_logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/policy/upload_job_impl.h"
 #include "chrome/browser/chromeos/settings/device_oauth2_token_service.h"
@@ -27,6 +27,7 @@
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/user_manager/user_manager.h"
 #include "net/http/http_request_headers.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
 
 namespace policy {
 
@@ -144,8 +145,6 @@
   chromeos::DeviceOAuth2TokenService* device_oauth2_token_service =
       chromeos::DeviceOAuth2TokenServiceFactory::Get();
 
-  scoped_refptr<net::URLRequestContextGetter> system_request_context =
-      g_browser_process->system_request_context();
   std::string robot_account_id =
       device_oauth2_token_service->GetRobotAccountId();
 
@@ -173,7 +172,7 @@
       )");
   return std::make_unique<UploadJobImpl>(
       upload_url, robot_account_id, device_oauth2_token_service,
-      system_request_context, delegate,
+      g_browser_process->shared_url_loader_factory(), delegate,
       std::make_unique<UploadJobImpl::RandomMimeBoundaryGenerator>(),
       traffic_annotation, task_runner_);
 }
diff --git a/chrome/browser/chromeos/policy/upload_job_impl.cc b/chrome/browser/chromeos/policy/upload_job_impl.cc
index 9fd89b2..30b2cfc 100644
--- a/chrome/browser/chromeos/policy/upload_job_impl.cc
+++ b/chrome/browser/chromeos/policy/upload_job_impl.cc
@@ -19,7 +19,8 @@
 #include "net/base/mime_util.h"
 #include "net/http/http_status_code.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/url_request_status.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
 
 namespace policy {
 
@@ -27,7 +28,7 @@
 
 // Format for bearer tokens in HTTP requests to access OAuth 2.0 protected
 // resources.
-const char kAuthorizationHeaderFormat[] = "Authorization: Bearer %s";
+const char kAuthorizationHeaderFormat[] = "Bearer %s";
 
 // Value the "Content-Type" field will be set to in the POST request.
 const char kUploadContentType[] = "multipart/form-data";
@@ -151,7 +152,7 @@
     const GURL& upload_url,
     const std::string& account_id,
     OAuth2TokenService* token_service,
-    scoped_refptr<net::URLRequestContextGetter> url_context_getter,
+    scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
     Delegate* delegate,
     std::unique_ptr<MimeBoundaryGenerator> boundary_generator,
     net::NetworkTrafficAnnotationTag traffic_annotation,
@@ -160,7 +161,7 @@
       upload_url_(upload_url),
       account_id_(account_id),
       token_service_(token_service),
-      url_context_getter_(url_context_getter),
+      url_loader_factory_(std::move(url_loader_factory)),
       delegate_(delegate),
       boundary_generator_(std::move(boundary_generator)),
       traffic_annotation_(traffic_annotation),
@@ -169,7 +170,7 @@
       task_runner_(task_runner),
       weak_factory_(this) {
   DCHECK(token_service_);
-  DCHECK(url_context_getter_);
+  DCHECK(url_loader_factory_);
   DCHECK(delegate_);
   SYSLOG(INFO) << "Upload job created.";
   if (!upload_url_.is_valid()) {
@@ -299,7 +300,7 @@
   return true;
 }
 
-void UploadJobImpl::CreateAndStartURLFetcher(const std::string& access_token) {
+void UploadJobImpl::CreateAndStartURLLoader(const std::string& access_token) {
   // Ensure that the content has been prepared and the upload url is valid.
   DCHECK_EQ(PREPARING_CONTENT, state_);
   SYSLOG(INFO) << "Starting URL fetcher.";
@@ -308,13 +309,20 @@
   content_type.append("; boundary=");
   content_type.append(*mime_boundary_.get());
 
-  upload_fetcher_ = net::URLFetcher::Create(upload_url_, net::URLFetcher::POST,
-                                            this, traffic_annotation_);
-  upload_fetcher_->SetRequestContext(url_context_getter_.get());
-  upload_fetcher_->SetUploadData(content_type, *post_data_);
-  upload_fetcher_->AddExtraRequestHeader(
+  auto resource_request = std::make_unique<network::ResourceRequest>();
+  resource_request->method = "POST";
+  resource_request->url = upload_url_;
+  resource_request->headers.SetHeader(
+      net::HttpRequestHeaders::kAuthorization,
       base::StringPrintf(kAuthorizationHeaderFormat, access_token.c_str()));
-  upload_fetcher_->Start();
+
+  url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request),
+                                                 traffic_annotation_);
+  url_loader_->AttachStringForUpload(*post_data_, content_type);
+  url_loader_->DownloadHeadersOnly(
+      url_loader_factory_.get(),
+      base::BindOnce(&UploadJobImpl::OnURLLoadComplete,
+                     base::Unretained(this)));
 }
 
 void UploadJobImpl::StartUpload() {
@@ -326,7 +334,7 @@
     state_ = ERROR;
     return;
   }
-  CreateAndStartURLFetcher(access_token_);
+  CreateAndStartURLLoader(access_token_);
   state_ = UPLOADING;
 }
 
@@ -356,7 +364,7 @@
 
 void UploadJobImpl::HandleError(ErrorCode error_code) {
   retry_++;
-  upload_fetcher_.reset();
+  url_loader_.reset();
 
   SYSLOG(ERROR) << "Upload failed, error code: " << error_code;
 
@@ -397,34 +405,31 @@
   }
 }
 
-void UploadJobImpl::OnURLFetchComplete(const net::URLFetcher* source) {
-  DCHECK_EQ(upload_fetcher_.get(), source);
+void UploadJobImpl::OnURLLoadComplete(
+    scoped_refptr<net::HttpResponseHeaders> headers) {
   DCHECK_EQ(UPLOADING, state_);
+
   SYSLOG(INFO) << "URL fetch completed.";
-  const net::URLRequestStatus& status = source->GetStatus();
-  if (!status.is_success()) {
-    SYSLOG(ERROR) << "URLRequestStatus error " << status.error();
+  std::unique_ptr<network::SimpleURLLoader> url_loader = std::move(url_loader_);
+
+  if (!headers) {
+    SYSLOG(ERROR) << "SimpleURLLoader error " << url_loader->NetError();
     HandleError(NETWORK_ERROR);
+  } else if (headers->response_code() == net::HTTP_OK) {
+    // Successful upload
+    access_token_.clear();
+    post_data_.reset();
+    state_ = SUCCESS;
+    UMA_HISTOGRAM_EXACT_LINEAR(kUploadJobSuccessHistogram, retry_,
+                               static_cast<int>(UploadJobSuccess::REQUEST_MAX));
+    delegate_->OnSuccess();
+  } else if (headers->response_code() == net::HTTP_UNAUTHORIZED) {
+    SYSLOG(ERROR) << "Unauthorized request.";
+    HandleError(AUTHENTICATION_ERROR);
   } else {
-    const int response_code = source->GetResponseCode();
-    if (response_code == net::HTTP_OK) {
-      // Successful upload
-      upload_fetcher_.reset();
-      access_token_.clear();
-      post_data_.reset();
-      state_ = SUCCESS;
-      UMA_HISTOGRAM_EXACT_LINEAR(
-          kUploadJobSuccessHistogram, retry_,
-          static_cast<int>(UploadJobSuccess::REQUEST_MAX));
-      delegate_->OnSuccess();
-    } else if (response_code == net::HTTP_UNAUTHORIZED) {
-      SYSLOG(ERROR) << "Unauthorized request.";
-      HandleError(AUTHENTICATION_ERROR);
-    } else {
-      SYSLOG(ERROR) << "POST request failed with HTTP status code "
-                    << response_code << ".";
-      HandleError(SERVER_ERROR);
-    }
+    SYSLOG(ERROR) << "POST request failed with HTTP status code "
+                  << headers->response_code() << ".";
+    HandleError(SERVER_ERROR);
   }
 }
 
diff --git a/chrome/browser/chromeos/policy/upload_job_impl.h b/chrome/browser/chromeos/policy/upload_job_impl.h
index 4c639519..2a7c777 100644
--- a/chrome/browser/chromeos/policy/upload_job_impl.h
+++ b/chrome/browser/chromeos/policy/upload_job_impl.h
@@ -15,23 +15,28 @@
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/chromeos/policy/upload_job.h"
 #include "google_apis/gaia/oauth2_token_service.h"
-#include "net/url_request/url_fetcher.h"
-#include "net/url_request/url_fetcher_delegate.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
 
 namespace base {
 class SequencedTaskRunner;
 }
 
+namespace net {
+class HttpResponseHeaders;
+}
+
+namespace network {
+class SharedURLLoaderFactory;
+class SimpleURLLoader;
+}  // namespace network
+
 namespace policy {
 
 // This implementation of UploadJob uses the OAuth2TokenService to acquire
 // access tokens for the device management (cloud-based policy) server scope and
-// uses a URLFetcher to upload data to the specified upload url.
-class UploadJobImpl : public UploadJob,
-                      public OAuth2TokenService::Consumer,
-                      public net::URLFetcherDelegate {
+// uses a SimpleURLLoader to upload data to the specified upload url.
+class UploadJobImpl : public UploadJob, public OAuth2TokenService::Consumer {
  public:
   // UploadJobImpl uses a MimeBoundaryGenerator to generate strings which
   // mark the boundaries between data segments.
@@ -56,14 +61,15 @@
 
   // |task_runner| must belong to the same thread from which the constructor and
   // all the public methods are called.
-  UploadJobImpl(const GURL& upload_url,
-                const std::string& account_id,
-                OAuth2TokenService* token_service,
-                scoped_refptr<net::URLRequestContextGetter> url_context_getter,
-                Delegate* delegate,
-                std::unique_ptr<MimeBoundaryGenerator> boundary_generator,
-                net::NetworkTrafficAnnotationTag traffic_annotation,
-                scoped_refptr<base::SequencedTaskRunner> task_runner);
+  UploadJobImpl(
+      const GURL& upload_url,
+      const std::string& account_id,
+      OAuth2TokenService* token_service,
+      scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
+      Delegate* delegate,
+      std::unique_ptr<MimeBoundaryGenerator> boundary_generator,
+      net::NetworkTrafficAnnotationTag traffic_annotation,
+      scoped_refptr<base::SequencedTaskRunner> task_runner);
   ~UploadJobImpl() override;
 
   // UploadJob:
@@ -103,15 +109,15 @@
   void OnGetTokenFailure(const OAuth2TokenService::Request* request,
                          const GoogleServiceAuthError& error) override;
 
-  // net::URLFetcherDelegate:
-  void OnURLFetchComplete(const net::URLFetcher* source) override;
+  // Called when the SimpleURLLoader is finished.
+  void OnURLLoadComplete(scoped_refptr<net::HttpResponseHeaders> headers);
 
   void HandleError(ErrorCode errorCode);
 
   // Requests an access token for the upload scope.
   void RequestAccessToken();
 
-  // Dispatches POST request to URLFetcher.
+  // Dispatches POST request.
   void StartUpload();
 
   // Constructs the body of the POST request by concatenating the
@@ -122,9 +128,9 @@
   // an error, clears |post_data_| and |mime_boundary_| and returns false.
   bool SetUpMultipart();
 
-  // Assembles the request and starts the URLFetcher. Fails if another upload
-  // is still in progress or the content was not successfully encoded.
-  void CreateAndStartURLFetcher(const std::string& access_token);
+  // Assembles the request and starts the SimpleURLLoader. Fails if another
+  // upload is still in progress or the content was not successfully encoded.
+  void CreateAndStartURLLoader(const std::string& access_token);
 
   // The URL to which the POST request should be directed.
   const GURL upload_url_;
@@ -135,8 +141,8 @@
   // The token service used to retrieve the access token.
   OAuth2TokenService* const token_service_;
 
-  // This is used to initialize the net::URLFetcher object.
-  const scoped_refptr<net::URLRequestContextGetter> url_context_getter_;
+  // This is used to initialize the network::SimpleURLLoader object.
+  const scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
 
   // The delegate to be notified of events.
   Delegate* const delegate_;
@@ -169,7 +175,7 @@
   std::string access_token_;
 
   // Helper to upload the data.
-  std::unique_ptr<net::URLFetcher> upload_fetcher_;
+  std::unique_ptr<network::SimpleURLLoader> url_loader_;
 
   // The data chunks to be uploaded.
   std::vector<std::unique_ptr<DataSegment>> data_segments_;
diff --git a/chrome/browser/chromeos/policy/upload_job_unittest.cc b/chrome/browser/chromeos/policy/upload_job_unittest.cc
index ba1a938..dbef3aa 100644
--- a/chrome/browser/chromeos/policy/upload_job_unittest.cc
+++ b/chrome/browser/chromeos/policy/upload_job_unittest.cc
@@ -27,8 +27,7 @@
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
-#include "net/url_request/url_request_test_util.h"
-#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/test/test_shared_url_loader_factory.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace policy {
@@ -183,8 +182,8 @@
 
   // testing::Test:
   void SetUp() override {
-    request_context_getter_ = new net::TestURLRequestContextGetter(
-        base::ThreadTaskRunnerHandle::Get());
+    url_loader_factory_ =
+        base::MakeRefCounted<network::TestSharedURLLoaderFactory>();
     oauth2_service_.AddAccount("robot@gmail.com");
     ASSERT_TRUE(test_server_.Start());
     // Set retry delay to prevent timeouts
@@ -201,9 +200,9 @@
       std::unique_ptr<UploadJobImpl::MimeBoundaryGenerator>
           mime_boundary_generator) {
     std::unique_ptr<UploadJob> upload_job(new UploadJobImpl(
-        GetServerURL(), kRobotAccountId, &oauth2_service_,
-        request_context_getter_.get(), this, std::move(mime_boundary_generator),
-        TRAFFIC_ANNOTATION_FOR_TESTS, base::ThreadTaskRunnerHandle::Get()));
+        GetServerURL(), kRobotAccountId, &oauth2_service_, url_loader_factory_,
+        this, std::move(mime_boundary_generator), TRAFFIC_ANNOTATION_FOR_TESTS,
+        base::ThreadTaskRunnerHandle::Get()));
 
     std::map<std::string, std::string> header_entries;
     header_entries.insert(std::make_pair(kCustomField1, "CUSTOM1"));
@@ -220,7 +219,7 @@
   content::TestBrowserThreadBundle test_browser_thread_bundle_;
   base::RunLoop run_loop_;
   net::EmbeddedTestServer test_server_;
-  scoped_refptr<net::TestURLRequestContextGetter> request_context_getter_;
+  scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
   MockOAuth2TokenService oauth2_service_;
 
   std::unique_ptr<UploadJob::ErrorCode> expected_error_;
diff --git a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc
index fdf6908..56c6a1df 100644
--- a/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc
+++ b/chrome/browser/chromeos/policy/user_policy_manager_factory_chromeos.cc
@@ -15,7 +15,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/power/cpu_data_collector.cc b/chrome/browser/chromeos/power/cpu_data_collector.cc
index 9a5dd8e..f322a43 100644
--- a/chrome/browser/chromeos/power/cpu_data_collector.cc
+++ b/chrome/browser/chromeos/power/cpu_data_collector.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/power/power_data_collector.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/chromeos/power/freezer_cgroup_process_manager.cc b/chrome/browser/chromeos/power/freezer_cgroup_process_manager.cc
index 71799e55..04bd9fb9 100644
--- a/chrome/browser/chromeos/power/freezer_cgroup_process_manager.cc
+++ b/chrome/browser/chromeos/power/freezer_cgroup_process_manager.cc
@@ -14,7 +14,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace chromeos {
diff --git a/chrome/browser/chromeos/power/ml/BUILD.gn b/chrome/browser/chromeos/power/ml/BUILD.gn
new file mode 100644
index 0000000..0bcddd4
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/BUILD.gn
@@ -0,0 +1,19 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("user_activity_ukm_logger_helpers") {
+  public = [
+    "user_activity_ukm_logger_helpers.h",
+  ]
+
+  sources = [
+    "user_activity_ukm_logger_helpers.cc",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome/browser/chromeos:user_activity_event_proto",
+    "//ui/base",
+  ]
+}
diff --git a/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc b/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc
index d93d6f9..e8554f84 100644
--- a/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc
+++ b/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_manager.cc
@@ -9,7 +9,7 @@
 
 #include "ash/public/cpp/ash_pref_names.h"
 #include "base/process/launch.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/clock.h"
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_ukm_logger_impl.cc b/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_ukm_logger_impl.cc
index e46062a..2ca685210 100644
--- a/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_ukm_logger_impl.cc
+++ b/chrome/browser/chromeos/power/ml/adaptive_screen_brightness_ukm_logger_impl.cc
@@ -4,11 +4,12 @@
 
 #include "chrome/browser/chromeos/power/ml/adaptive_screen_brightness_ukm_logger_impl.h"
 
+#include <array>
 #include <cmath>
 
 #include "base/logging.h"
 #include "chrome/browser/chromeos/power/ml/screen_brightness_event.pb.h"
-#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
@@ -21,20 +22,16 @@
 
 constexpr int kSecondsPerHour = 3600;
 
-constexpr UserActivityUkmLoggerImpl::Bucket kBatteryPercentBuckets[] = {
-    {100, 5}};
+constexpr std::array<Bucket, 1> kBatteryPercentBuckets = {{{100, 5}}};
 
-constexpr UserActivityUkmLoggerImpl::Bucket kUserInputEventBuckets[] = {
-    {100, 1},
-    {1000, 100},
-    {10000, 1000}};
+constexpr std::array<Bucket, 3> kUserInputEventBuckets = {
+    {{100, 1}, {1000, 100}, {10000, 1000}}};
 
-constexpr UserActivityUkmLoggerImpl::Bucket kRecentTimeActiveBuckets[] =
-    {{60, 1}, {600, 60}, {1200, 300}, {3600, 600}, {18000, 1800}};
+constexpr std::array<Bucket, 5> kRecentTimeActiveBuckets = {
+    {{60, 1}, {600, 60}, {1200, 300}, {3600, 600}, {18000, 1800}}};
 
-constexpr UserActivityUkmLoggerImpl::Bucket kTimeSinceLastEventBuckets[] = {
-    {60, 1},
-    {600, 60}};
+constexpr std::array<Bucket, 2> kTimeSinceLastEventBuckets = {
+    {{60, 1}, {600, 60}}};
 
 }  // namespace
 
@@ -64,31 +61,23 @@
   }
 
   if (activity_data.has_num_recent_mouse_events()) {
-    ukm_screen_brightness.SetNumRecentMouseEvents(
-        UserActivityUkmLoggerImpl::Bucketize(
-            activity_data.num_recent_mouse_events(), kUserInputEventBuckets,
-            base::size(kUserInputEventBuckets)));
+    ukm_screen_brightness.SetNumRecentMouseEvents(Bucketize(
+        activity_data.num_recent_mouse_events(), kUserInputEventBuckets));
   }
 
   if (activity_data.has_num_recent_key_events()) {
-    ukm_screen_brightness.SetNumRecentKeyEvents(
-        UserActivityUkmLoggerImpl::Bucketize(
-            activity_data.num_recent_key_events(), kUserInputEventBuckets,
-            base::size(kUserInputEventBuckets)));
+    ukm_screen_brightness.SetNumRecentKeyEvents(Bucketize(
+        activity_data.num_recent_key_events(), kUserInputEventBuckets));
   }
 
   if (activity_data.has_num_recent_stylus_events()) {
-    ukm_screen_brightness.SetNumRecentStylusEvents(
-        UserActivityUkmLoggerImpl::Bucketize(
-            activity_data.num_recent_stylus_events(), kUserInputEventBuckets,
-            base::size(kUserInputEventBuckets)));
+    ukm_screen_brightness.SetNumRecentStylusEvents(Bucketize(
+        activity_data.num_recent_stylus_events(), kUserInputEventBuckets));
   }
 
   if (activity_data.has_num_recent_touch_events()) {
-    ukm_screen_brightness.SetNumRecentTouchEvents(
-        UserActivityUkmLoggerImpl::Bucketize(
-            activity_data.num_recent_touch_events(), kUserInputEventBuckets,
-            base::size(kUserInputEventBuckets)));
+    ukm_screen_brightness.SetNumRecentTouchEvents(Bucketize(
+        activity_data.num_recent_touch_events(), kUserInputEventBuckets));
   }
 
   if (activity_data.has_last_activity_time_sec()) {
@@ -97,10 +86,8 @@
   }
 
   if (activity_data.has_recent_time_active_sec()) {
-    ukm_screen_brightness.SetRecentTimeActiveSec(
-        UserActivityUkmLoggerImpl::Bucketize(
-            activity_data.recent_time_active_sec(), kRecentTimeActiveBuckets,
-            base::size(kRecentTimeActiveBuckets)));
+    ukm_screen_brightness.SetRecentTimeActiveSec(Bucketize(
+        activity_data.recent_time_active_sec(), kRecentTimeActiveBuckets));
   }
 
   if (activity_data.has_is_video_playing()) {
@@ -114,10 +101,8 @@
   }
 
   if (env_data.has_battery_percent()) {
-    ukm_screen_brightness.SetBatteryPercent(
-        UserActivityUkmLoggerImpl::Bucketize(
-            std::floor(env_data.battery_percent()), kBatteryPercentBuckets,
-            base::size(kBatteryPercentBuckets)));
+    ukm_screen_brightness.SetBatteryPercent(Bucketize(
+        std::floor(env_data.battery_percent()), kBatteryPercentBuckets));
   }
 
   if (env_data.has_device_mode()) {
@@ -211,10 +196,8 @@
   }
 
   if (event.has_time_since_last_event_sec()) {
-    ukm_screen_brightness.SetTimeSinceLastEventSec(
-        UserActivityUkmLoggerImpl::Bucketize(
-            event.time_since_last_event_sec(), kTimeSinceLastEventBuckets,
-            base::size(kTimeSinceLastEventBuckets)));
+    ukm_screen_brightness.SetTimeSinceLastEventSec(Bucketize(
+        event.time_since_last_event_sec(), kTimeSinceLastEventBuckets));
   }
 
   ukm::UkmRecorder* const ukm_recorder = ukm::UkmRecorder::Get();
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn b/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn
new file mode 100644
index 0000000..5707ed85
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/BUILD.gn
@@ -0,0 +1,29 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+source_set("smart_dim") {
+  # Dependent targets should not include tf_native_inference.h directly.
+  public = [
+    "model.h",
+    "model_impl.h",
+  ]
+
+  sources = [
+    "model_impl.cc",
+    "tf_native_inference.cc",
+    "tf_native_inference.h",
+  ]
+
+  deps = [
+    "//base",
+    "//chrome/browser:resources",
+    "//chrome/browser/chromeos:user_activity_event_proto",
+    "//chrome/browser/chromeos/power/ml:user_activity_ukm_logger_helpers",
+    "//chrome/common:constants",
+    "//components/assist_ranker",
+    "//components/assist_ranker/proto",
+    "//components/sessions",
+    "//ui/base",
+  ]
+}
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/README.md b/chrome/browser/chromeos/power/ml/smart_dim/README.md
new file mode 100644
index 0000000..6b08c04
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/README.md
@@ -0,0 +1,59 @@
+# Smart Dim Model
+
+The Smart Dim Model is an experimental model used to predict whether an upcoming
+screen-dim should go ahead or be deferred. The prediction is based on whether
+the user is likely to remain inactive or reactivate following a screen-dim. If
+the user is likely to reactivate, the model would predict the dim should be
+deferred, otherwise, the model would predict the dim should go ahead.
+
+## Model prediction
+
+The input to the model is a list of features that would help predict user
+activity after the screen is dimmed. Example features are user related features
+(e.g. activity count) and environment features (e.g. time of day). The model
+takes in these features and calculates an inactivity-score: the higher the
+score, the more likely the user will remain inactive. If this inactivity-score
+is higher than or equal to a dim-threshold (set by an experiment), the model
+will predict the dim should go ahead; otherwise it will predict the dim should
+be deferred.
+
+The features used by the model are those metrics logged to UKM by
+`UserActivityUkmLoggerImpl`. These metrics and features do not contain any user
+personal data. They are aggregated when training the model.
+
+Using these metrics, we trained a
+[DNN](https://en.wikipedia.org/wiki/Deep_learning#Deep_neural_networks) model.
+The inferencing code in `tf_native_inference.cc` consists of the model weights
+generated by [TensorFlow](https://www.tensorflow.org/) and basic operations to
+execute the model over an example.
+
+## Example preprocessing
+
+The `tf_native_inference.cc` generated from a TensorFlow model expects input
+features to be represented as a vector of floats. This conversion is handled by
+AssistRanker based on the configuration
+provided in `example_preprocessor_config.pb`. The feature-to-float conversion
+depends on the type of the feature. For example, a numerical feature will be
+converted to a corresponding float (possibly normalized). Categorical features
+(e.g. enums or bucketized numerical features) will be converted via
+[One-hot encoding](https://en.wikipedia.org/wiki/One-hot). Missing features can
+also be handled, with configurations specified in the
+`example_preprocessor_config.pb`. The configuration can be examined with the
+`print_example_preprocessor_config.py` utility:
+
+```shell
+./components/assist_ranker/print_example_preprocessor_config.py \
+  out/Release \
+  chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb
+```
+
+## Smart dim model interface
+
+Example processing and inactivity-score calculation are all internal details of
+the model. The public interface of the model is `SmartDimModel::ShouldDim()`.
+`SmartDimModelImpl::ShouldDim()` provides the actual implementation. It takes
+prediction features (`UserActivityEvent::Features`) as input and returns
+`UserActivityEvent::ModelPrediction`. The returned prediction contains both
+model response (dim, no-dim or model-error) and quantized values of
+inactivity-score and dim-threshold. These two values are quantized in the
+returned result so that they can be logged when necessary.
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb b/chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb
new file mode 100644
index 0000000..94d19a0
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/example_preprocessor_config.pb
Binary files differ
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model.h b/chrome/browser/chromeos/power/ml/smart_dim/model.h
new file mode 100644
index 0000000..06eda232
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model.h
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_H_
+#define CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_H_
+
+#include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+// Interface to indicate whether an upcoming screen dim should go ahead based on
+// whether user will remain inactive if screen is dimmed now.
+class SmartDimModel {
+ public:
+  virtual ~SmartDimModel() = default;
+
+  // Returns a prediction whether an upcoming dim should go ahead based on input
+  // |features|.
+  virtual UserActivityEvent::ModelPrediction ShouldDim(
+      const UserActivityEvent::Features& features) = 0;
+};
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_H_
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc
new file mode 100644
index 0000000..0864cae
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.cc
@@ -0,0 +1,331 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/power/ml/smart_dim/model_impl.h"
+
+#include <cmath>
+#include <map>
+#include <string>
+
+#include "base/logging.h"
+#include "base/memory/ref_counted_memory.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/optional.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/grit/browser_resources.h"
+#include "components/assist_ranker/example_preprocessing.h"
+#include "components/assist_ranker/proto/example_preprocessor.pb.h"
+#include "components/assist_ranker/proto/ranker_example.pb.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+namespace {
+
+// Loads the preprocessor config protobuf, which will be used later to convert a
+// RankerExample to a vectorized float for inactivity score calculation. Returns
+// nullptr if cannot load or parse the config.
+std::unique_ptr<assist_ranker::ExamplePreprocessorConfig>
+LoadExamplePreprocessorConfig() {
+  auto config = std::make_unique<assist_ranker::ExamplePreprocessorConfig>();
+
+  scoped_refptr<base::RefCountedMemory> raw_config =
+      ui::ResourceBundle::GetSharedInstance().LoadDataResourceBytes(
+          IDR_SMART_DIM_EXAMPLE_PREPROCESSOR_CONFIG_PB);
+  if (!raw_config || !raw_config->front()) {
+    LOG(ERROR) << "Failed to load SmartDimModel example preprocessor config.";
+    return nullptr;
+  }
+
+  if (!config->ParseFromArray(raw_config->front(), raw_config->size())) {
+    LOG(ERROR) << "Failed to parse SmartDimModel example preprocessor config.";
+    return nullptr;
+  }
+
+  return config;
+}
+
+// Populates |example| using |features|. Returns true if no error occurred.
+bool PopulateRankerExample(const UserActivityEvent::Features& features,
+                           assist_ranker::RankerExample* example) {
+  CHECK(example);
+
+  // Some features are bucketized before being logged to UKM. Hence training
+  // examples use bucketized values. We need to bucketize them here to ensure
+  // consistency.
+  // It's ok if a feature is missing from |features|, and we will not return
+  // false. But if a feature exists in |features|, then we expect it to have
+  // a bucketized version in |buckets|. If its bucketized version is missing
+  // from |buckets| then we return false.
+  const std::map<std::string, int> buckets =
+      UserActivityUkmLoggerBucketizer::BucketizeUserActivityEventFeatures(
+          features);
+
+  auto& ranker_example_features = *example->mutable_features();
+
+  if (features.has_battery_percent()) {
+    const auto it = buckets.find(kBatteryPercent);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kBatteryPercent].set_int32_value(it->second);
+  }
+
+  if (features.has_device_management()) {
+    ranker_example_features["DeviceManagement"].set_int32_value(
+        features.device_management());
+  }
+
+  if (features.has_device_mode()) {
+    ranker_example_features["DeviceMode"].set_int32_value(
+        features.device_mode());
+  }
+
+  if (features.has_device_type()) {
+    ranker_example_features["DeviceType"].set_int32_value(
+        features.device_type());
+  }
+
+  if (features.has_key_events_in_last_hour()) {
+    const auto it = buckets.find(kKeyEventsInLastHour);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kKeyEventsInLastHour].set_int32_value(it->second);
+  }
+
+  if (features.has_last_activity_day()) {
+    ranker_example_features["LastActivityDay"].set_int32_value(
+        features.last_activity_day());
+  }
+
+  if (features.has_last_activity_time_sec()) {
+    const auto it = buckets.find(kLastActivityTime);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kLastActivityTime].set_int32_value(it->second);
+  }
+
+  if (features.has_last_user_activity_time_sec()) {
+    const auto it = buckets.find(kLastUserActivityTime);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kLastUserActivityTime].set_int32_value(it->second);
+  }
+
+  if (features.has_mouse_events_in_last_hour()) {
+    const auto it = buckets.find(kMouseEventsInLastHour);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kMouseEventsInLastHour].set_int32_value(it->second);
+  }
+
+  if (features.has_on_battery()) {
+    // This is an int value in the model.
+    ranker_example_features["OnBattery"].set_int32_value(features.on_battery());
+  }
+
+  ranker_example_features["PreviousNegativeActionsCount"].set_int32_value(
+      features.previous_negative_actions_count());
+  ranker_example_features["PreviousPositiveActionsCount"].set_int32_value(
+      features.previous_positive_actions_count());
+
+  ranker_example_features["RecentTimeActive"].set_int32_value(
+      features.recent_time_active_sec());
+
+  if (features.has_video_playing_time_sec()) {
+    const auto it = buckets.find(kRecentVideoPlayingTime);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kRecentVideoPlayingTime].set_int32_value(
+        it->second);
+  }
+
+  if (features.has_on_to_dim_sec()) {
+    ranker_example_features["ScreenDimDelay"].set_int32_value(
+        features.on_to_dim_sec());
+  }
+
+  if (features.has_dim_to_screen_off_sec()) {
+    ranker_example_features["ScreenDimToOffDelay"].set_int32_value(
+        features.dim_to_screen_off_sec());
+  }
+
+  if (features.has_time_since_last_key_sec()) {
+    ranker_example_features["TimeSinceLastKey"].set_int32_value(
+        features.time_since_last_key_sec());
+  }
+
+  if (features.has_time_since_last_mouse_sec()) {
+    ranker_example_features["TimeSinceLastMouse"].set_int32_value(
+        features.time_since_last_mouse_sec());
+  }
+
+  if (features.has_time_since_video_ended_sec()) {
+    const auto it = buckets.find(kTimeSinceLastVideoEnded);
+    if (it == buckets.end())
+      return false;
+    ranker_example_features[kTimeSinceLastVideoEnded].set_int32_value(
+        it->second);
+  }
+
+  if (features.has_engagement_score()) {
+    ranker_example_features["SiteEngagementScore"].set_int32_value(
+        features.engagement_score());
+  }
+
+  if (features.has_has_form_entry()) {
+    ranker_example_features["HasFormEntry"].set_bool_value(
+        features.has_form_entry());
+  }
+
+  if (features.has_tab_domain()) {
+    ranker_example_features["TabDomain"].set_string_value(
+        features.tab_domain());
+    ranker_example_features["HasTabs"].set_bool_value(true);
+  } else {
+    ranker_example_features["HasTabs"].set_bool_value(false);
+  }
+
+  return true;
+}
+
+// Squashes |score| into range [0, 1] using sigmoid, and scales it to [0,100]
+// so that values can be easily logged.
+int ScoreToProbability(float score) {
+  const float sigmoid = 1.0f / (1.0f + exp(-score));
+  const int prob = floor(sigmoid * 100);
+  return prob;
+}
+
+void LogPowerMLSmartDimModelResult(SmartDimModelResult result) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.SmartDimModel.Result", result);
+}
+
+void LogPowerMLSmartDimParameterResult(SmartDimParameterResult result) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.SmartDimParameter.Result", result);
+}
+
+// Returns "dim_threshold" from experiment parameter. Also logs status to UMA
+// (i.e. whether the parameter is undefined or cannot be parsed, or can be
+// parsed successfully.
+base::Optional<float> GetDimThreshold() {
+  const std::string dim_threshold_str = base::GetFieldTrialParamValueByFeature(
+      features::kUserActivityPrediction, "dim_threshold");
+  if (dim_threshold_str.empty()) {
+    LogPowerMLSmartDimParameterResult(SmartDimParameterResult::kUndefinedError);
+    return base::nullopt;
+  }
+
+  double dim_threshold_double;
+  if (!base::StringToDouble(dim_threshold_str, &dim_threshold_double)) {
+    LogPowerMLSmartDimParameterResult(SmartDimParameterResult::kParsingError);
+    return base::nullopt;
+  }
+
+  LogPowerMLSmartDimParameterResult(SmartDimParameterResult::kSuccess);
+  return base::Optional<float>(dim_threshold_double);
+}
+
+}  // namespace
+
+SmartDimModelImpl::SmartDimModelImpl() = default;
+
+SmartDimModelImpl::~SmartDimModelImpl() = default;
+
+SmartDimModelResult SmartDimModelImpl::CalculateInactivityScore(
+    const UserActivityEvent::Features& features,
+    float* inactivity_score_out) {
+  CHECK(inactivity_score_out);
+
+  LazyInitialize();
+  if (!preprocessor_config_) {
+    LogPowerMLSmartDimModelResult(
+        SmartDimModelResult::kPreprocessorInitializationFailed);
+    return SmartDimModelResult::kPreprocessorInitializationFailed;
+  }
+
+  assist_ranker::RankerExample ranker_example;
+  if (!PopulateRankerExample(features, &ranker_example)) {
+    LogPowerMLSmartDimModelResult(SmartDimModelResult::kOtherError);
+    return SmartDimModelResult::kOtherError;
+  }
+
+  int preprocessor_error = preprocessor_->Process(&ranker_example);
+  // kNoFeatureIndexFound can occur normally (e.g., when the domain name
+  // isn't known to the model or a rarely seen enum value is used).
+  if (preprocessor_error &&
+      preprocessor_error !=
+          assist_ranker::ExamplePreprocessor::kNoFeatureIndexFound) {
+    LogPowerMLSmartDimModelResult(SmartDimModelResult::kPreprocessorOtherError);
+    return SmartDimModelResult::kPreprocessorOtherError;
+  }
+
+  const auto& vectorized_features =
+      ranker_example.features()
+          .at(assist_ranker::ExamplePreprocessor::kVectorizedFeatureDefaultName)
+          .float_list()
+          .float_value();
+  CHECK_EQ(vectorized_features.size(), tfnative_model::FEATURES_SIZE);
+
+  if (!model_alloc_)
+    model_alloc_ = std::make_unique<tfnative_model::FixedAllocations>();
+
+  tfnative_model::Inference(vectorized_features.data(), inactivity_score_out,
+                            model_alloc_.get());
+
+  LogPowerMLSmartDimModelResult(SmartDimModelResult::kSuccess);
+  return SmartDimModelResult::kSuccess;
+}
+
+UserActivityEvent::ModelPrediction SmartDimModelImpl::ShouldDim(
+    const UserActivityEvent::Features& input_features) {
+  const base::Optional<float> dim_threshold = GetDimThreshold();
+
+  UserActivityEvent::ModelPrediction prediction;
+  if (!dim_threshold) {
+    prediction.set_response(UserActivityEvent::ModelPrediction::MODEL_ERROR);
+    return prediction;
+  }
+
+  float inactivity_score = 0;
+  const SmartDimModelResult result =
+      CalculateInactivityScore(input_features, &inactivity_score);
+
+  if (result != SmartDimModelResult::kSuccess) {
+    prediction.set_response(UserActivityEvent::ModelPrediction::MODEL_ERROR);
+    return prediction;
+  }
+
+  prediction.set_decision_threshold(ScoreToProbability(dim_threshold.value()));
+  prediction.set_inactivity_score(ScoreToProbability(inactivity_score));
+
+  if (inactivity_score >= dim_threshold.value()) {
+    prediction.set_response(UserActivityEvent::ModelPrediction::DIM);
+  } else {
+    prediction.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
+  }
+
+  return prediction;
+}
+
+void SmartDimModelImpl::LazyInitialize() {
+  if (preprocessor_config_)
+    return;
+
+  preprocessor_config_ = LoadExamplePreprocessorConfig();
+  if (preprocessor_config_) {
+    preprocessor_ = std::make_unique<assist_ranker::ExamplePreprocessor>(
+        *preprocessor_config_);
+  }
+}
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h
new file mode 100644
index 0000000..e9c34f4
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model_impl.h
@@ -0,0 +1,82 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_IMPL_H_
+#define CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_IMPL_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "chrome/browser/chromeos/power/ml/smart_dim/model.h"
+
+namespace assist_ranker {
+class ExamplePreprocessor;
+class ExamplePreprocessorConfig;
+}  // namespace assist_ranker
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+namespace tfnative_model {
+struct FixedAllocations;
+}  // namespace tfnative_model
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class SmartDimModelResult {
+  kSuccess = 0,
+  kPreprocessorInitializationFailed = 1,
+  kPreprocessorOtherError = 2,
+  kOtherError = 3,
+  kMaxValue = kOtherError
+};
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class SmartDimParameterResult {
+  kSuccess = 0,
+  kUndefinedError = 1,
+  kParsingError = 2,
+  kMaxValue = kParsingError
+};
+
+// Real implementation of SmartDimModel that predicts whether an upcoming screen
+// dim should go ahead based on user activity/inactivity following dim.
+class SmartDimModelImpl : public SmartDimModel {
+ public:
+  SmartDimModelImpl();
+  ~SmartDimModelImpl() override;
+
+  // chromeos::power::ml::SmartDimModel overrides:
+  UserActivityEvent::ModelPrediction ShouldDim(
+      const UserActivityEvent::Features& features) override;
+
+ private:
+  friend class SmartDimModelImplTest;
+  // Loads the preprocessor config if not already loaded.
+  void LazyInitialize();
+
+  // Calculates inactivity score and returns result status. Also logs the status
+  // to UMA.
+  SmartDimModelResult CalculateInactivityScore(
+      const UserActivityEvent::Features& features,
+      float* inactivity_score_out);
+
+  std::unique_ptr<assist_ranker::ExamplePreprocessorConfig>
+      preprocessor_config_;
+  std::unique_ptr<assist_ranker::ExamplePreprocessor> preprocessor_;
+
+  // Fixed-size working memory provided to the inferencing function. Lazily
+  // initialized once so it isn't reallocated for every inference.
+  std::unique_ptr<tfnative_model::FixedAllocations> model_alloc_;
+
+  DISALLOW_COPY_AND_ASSIGN(SmartDimModelImpl);
+};
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_IMPL_H_
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc b/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc
new file mode 100644
index 0000000..591b6172
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/model_unittest.cc
@@ -0,0 +1,135 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/power/ml/smart_dim/model_impl.h"
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/time/time.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
+#include "chrome/common/chrome_features.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/page_transition_types.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+class SmartDimModelImplTest : public testing::Test {
+ public:
+  SmartDimModelImplTest() {
+    // Bucketize to 95.
+    features_.set_battery_percent(96.0);
+    features_.set_device_management(UserActivityEvent::Features::UNMANAGED);
+    features_.set_device_mode(UserActivityEvent::Features::CLAMSHELL);
+    features_.set_device_type(UserActivityEvent::Features::CHROMEBOOK);
+    // Bucketize to 200.
+    features_.set_key_events_in_last_hour(290);
+    features_.set_last_activity_day(UserActivityEvent::Features::THU);
+    // Bucketize to 7.
+    features_.set_last_activity_time_sec(25920);
+    // Bucketize to 7.
+    features_.set_last_user_activity_time_sec(25920);
+    // Bucketize to 2000.
+    features_.set_mouse_events_in_last_hour(2600);
+    features_.set_on_battery(false);
+    features_.set_previous_negative_actions_count(3);
+    features_.set_previous_positive_actions_count(0);
+    features_.set_recent_time_active_sec(190);
+    features_.set_video_playing_time_sec(0);
+    features_.set_on_to_dim_sec(30);
+    features_.set_dim_to_screen_off_sec(10);
+    features_.set_time_since_last_key_sec(30);
+    features_.set_time_since_last_mouse_sec(688);
+    // Bucketize to 900.
+    features_.set_time_since_video_ended_sec(1100);
+    features_.set_has_form_entry(false);
+    features_.set_source_id(123);  // not used.
+    features_.set_engagement_score(40);
+    features_.set_tab_domain("//mail.google.com");
+  }
+
+  ~SmartDimModelImplTest() override = default;
+
+ protected:
+  float CalculateInactivityScore(const UserActivityEvent::Features& features) {
+    float inactivity_score;
+    SmartDimModelResult result =
+        smart_dim_model_.CalculateInactivityScore(features, &inactivity_score);
+    EXPECT_EQ(SmartDimModelResult::kSuccess, result);
+    return inactivity_score;
+  }
+
+  UserActivityEvent::Features features_;
+  SmartDimModelImpl smart_dim_model_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SmartDimModelImplTest);
+};
+
+TEST_F(SmartDimModelImplTest, Basic) {
+  const float inactivity_score = CalculateInactivityScore(features_);
+  // Score has been calculated outside of chrome.
+  EXPECT_FLOAT_EQ(-3.6615708, inactivity_score);
+}
+
+TEST_F(SmartDimModelImplTest, OptionalFeaturesMissing) {
+  features_.clear_battery_percent();
+  features_.clear_time_since_last_key_sec();
+  features_.clear_time_since_last_mouse_sec();
+  features_.clear_time_since_video_ended_sec();
+  features_.clear_source_id();
+  features_.clear_has_form_entry();
+  features_.clear_engagement_score();
+  features_.clear_tab_domain();
+
+  const float inactivity_score = CalculateInactivityScore(features_);
+  // Score has been calculated outside of chrome.
+  EXPECT_FLOAT_EQ(-1.9680425, inactivity_score);
+}
+
+TEST_F(SmartDimModelImplTest, ShouldNotDim) {
+  const std::map<std::string, std::string> params = {
+      {"dim_threshold", base::NumberToString(-0.1)}};
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kUserActivityPrediction, params);
+
+  const UserActivityEvent::ModelPrediction prediction =
+      smart_dim_model_.ShouldDim(features_);
+  EXPECT_EQ(UserActivityEvent::ModelPrediction::NO_DIM, prediction.response());
+  EXPECT_EQ(47, prediction.decision_threshold());
+  EXPECT_EQ(2, prediction.inactivity_score());
+}
+
+TEST_F(SmartDimModelImplTest, ShouldDim) {
+  const std::map<std::string, std::string> params = {
+      {"dim_threshold", base::NumberToString(-10)}};
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kUserActivityPrediction, params);
+
+  const UserActivityEvent::ModelPrediction prediction =
+      smart_dim_model_.ShouldDim(features_);
+  EXPECT_EQ(UserActivityEvent::ModelPrediction::DIM, prediction.response());
+  EXPECT_EQ(0, prediction.decision_threshold());
+  EXPECT_EQ(2, prediction.inactivity_score());
+}
+
+TEST_F(SmartDimModelImplTest, ModelError) {
+  // Model parameter is undefined, which would trigger a model error.
+  const UserActivityEvent::ModelPrediction prediction =
+      smart_dim_model_.ShouldDim(features_);
+  EXPECT_EQ(UserActivityEvent::ModelPrediction::MODEL_ERROR,
+            prediction.response());
+  EXPECT_FALSE(prediction.has_decision_threshold());
+  EXPECT_FALSE(prediction.has_inactivity_score());
+}
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.cc b/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.cc
new file mode 100644
index 0000000..ddbd80356
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.cc
@@ -0,0 +1,3061 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file was generated using tf.native from a neural network trained by
+// TensorFlow, then simplified and cleaned up by hand. Please do not edit except
+// when updating to a new model.
+
+#include "chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h"
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+
+#include "base/logging.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+namespace tfnative_model {
+namespace {
+
+// The size of a shape in terms of number of coefficients.
+inline int32_t ShapeSize(const int32_t rank, const int32_t* shape) {
+  int32_t size = 1;
+  for (int32_t i = 0; i < rank; ++i)
+    size *= shape[i];
+  return size;
+}
+
+template <typename T>
+void FullyConnected(const int32_t* __restrict input_shape,
+                    const T* __restrict input_values,
+                    const int32_t* __restrict weight_shape,
+                    const T* __restrict weight_values,
+                    const int32_t* __restrict bias_shape,
+                    const T* __restrict bias_values,
+                    T* __restrict output_values) {
+  const int32_t batch_size = input_shape[0];
+  const int32_t num_inputs = weight_shape[0];
+  const int32_t num_outputs = weight_shape[1];
+  CHECK_EQ(input_shape[1], num_inputs);
+  CHECK_EQ(bias_shape[0], num_outputs);
+  for (int32_t batch = 0; batch < batch_size; ++batch) {
+    for (int32_t out_i = 0; out_i < num_outputs; ++out_i) {
+      T value = 0;
+      for (int32_t in_i = 0; in_i < num_inputs; ++in_i) {
+        value += input_values[batch * num_inputs + in_i] *
+                 weight_values[in_i * num_outputs + out_i];
+      }
+      value += bias_values[out_i];
+      output_values[batch * num_outputs + out_i] = value;
+    }
+  }
+}
+
+// -----------------------------------------------------------------------------
+// Simple unary ops
+// -----------------------------------------------------------------------------
+
+template <typename T>
+void Relu(const int32_t rank,
+          const int32_t* __restrict input_shape,
+          const T* __restrict input_values,
+          T* __restrict output_values) {
+  const int32_t size = ShapeSize(rank, input_shape);
+  for (int32_t i = 0; i < size; ++i) {
+    const T value = input_values[i];
+    output_values[i] = std::max(value, static_cast<T>(0));
+  }
+}
+
+// -----------------------------------------------------------------------------
+// Dequantize ops
+// -----------------------------------------------------------------------------
+
+template <typename T>
+void DequantizeMinFirst(const int32_t rank,
+                        const int32_t* __restrict input_shape,
+                        const T* __restrict input_values,
+                        const float* __restrict min_range,
+                        const float* __restrict max_range,
+                        float* __restrict output_values) {
+  const int32_t size = ShapeSize(rank, input_shape);
+  const float range_scale = (max_range[0] - min_range[0]) /
+                            (static_cast<float>(std::numeric_limits<T>::max()) -
+                             std::numeric_limits<T>::min());
+  const float range_min_rounded =
+      (max_range[0] == min_range[0]
+           ? min_range[0]
+           : round(min_range[0] / range_scale) * range_scale);
+  for (int32_t i = 0; i < size; i++) {
+    output_values[i] = ((static_cast<int32_t>(input_values[i]) -
+                         std::numeric_limits<T>::min()) *
+                        range_scale) +
+                       range_min_rounded;
+  }
+}
+
+// -----------------------------------------------------------------------------
+// CONSTANTS
+// Note that for now, endianness of the target machine needs to match that of
+// the one training was performed on.
+// -----------------------------------------------------------------------------
+const int32_t dnn_logits_biases__2__cf__2_shape[1] = {1};
+const union {
+  uint8_t bytes[4];
+  float values[1];
+} dnn_logits_biases__2__cf__2 = {{
+    0xde, 0x82, 0x1e, 0x3d,
+}};
+
+const int32_t dnn_hiddenlayer_0_weights__1__cf__1_quantized_const_shape[2] = {
+    FEATURES_SIZE, DNN_BIASES_SIZE};
+const union {
+  uint8_t bytes[DNN_WEIGHTS_SIZE];
+  uint8_t values[DNN_WEIGHTS_SIZE];
+} dnn_hiddenlayer_0_weights__1__cf__1_quantized_const = {{
+    0x70, 0x7c, 0x66, 0x86, 0x7a, 0x79, 0x77, 0x77, 0x62, 0x75, 0x55, 0x70,
+    0x73, 0x6f, 0x72, 0x73, 0x79, 0x73, 0x79, 0x70, 0x74, 0x80, 0x6d, 0x2e,
+    0x6f, 0x71, 0x70, 0x75, 0x7a, 0x7f, 0x74, 0x80, 0x6e, 0x7e, 0x7c, 0x6f,
+    0x76, 0x7e, 0x70, 0x71, 0x9d, 0x7b, 0x73, 0x76, 0x5f, 0x78, 0x6d, 0x67,
+    0x76, 0x6b, 0x78, 0x71, 0x72, 0x6d, 0x69, 0x6e, 0x75, 0x81, 0x5d, 0x74,
+    0x66, 0x68, 0x83, 0x7d, 0xa3, 0x9d, 0x7b, 0x63, 0x8c, 0xb3, 0x8a, 0x77,
+    0x70, 0xad, 0x49, 0x67, 0x77, 0x77, 0x66, 0x73, 0x82, 0x76, 0xae, 0x6d,
+    0x99, 0x79, 0x6f, 0x4e, 0x73, 0x53, 0x84, 0x8c, 0x5e, 0x9c, 0x72, 0x79,
+    0x7f, 0x82, 0x77, 0x8a, 0xd3, 0x8d, 0x78, 0x51, 0x72, 0x87, 0x6c, 0x65,
+    0x7b, 0x83, 0x88, 0x8c, 0x83, 0x5f, 0x95, 0x79, 0x62, 0xe2, 0x9e, 0x5a,
+    0x4d, 0x55, 0x84, 0x72, 0x6e, 0x64, 0x79, 0x5e, 0x6c, 0x70, 0x7b, 0x68,
+    0x6c, 0x77, 0x69, 0x7d, 0x83, 0x61, 0x6d, 0x78, 0x6d, 0x79, 0x86, 0x76,
+    0x72, 0x66, 0x77, 0x55, 0x73, 0x72, 0x70, 0x78, 0x6b, 0x64, 0x7f, 0x71,
+    0x63, 0x6c, 0x71, 0x78, 0x8b, 0x6c, 0x6d, 0x64, 0x80, 0x71, 0x75, 0x74,
+    0x84, 0x6b, 0x77, 0x81, 0x6f, 0x5f, 0x5a, 0x61, 0x74, 0x6a, 0x81, 0x6e,
+    0x73, 0x6f, 0x78, 0x80, 0x74, 0x66, 0x61, 0x6b, 0x68, 0x72, 0x84, 0x79,
+    0x85, 0x89, 0x70, 0x79, 0x77, 0x79, 0x76, 0x80, 0x7a, 0x66, 0x79, 0x7a,
+    0x78, 0x76, 0x7e, 0x6e, 0x83, 0x79, 0x73, 0x7d, 0x7d, 0x77, 0x63, 0x6c,
+    0x6b, 0x7e, 0x70, 0x77, 0x89, 0x77, 0x79, 0x74, 0x7d, 0x7e, 0x79, 0x83,
+    0x71, 0x7e, 0x6f, 0x75, 0x7d, 0x7d, 0x72, 0x72, 0x66, 0x77, 0x86, 0x82,
+    0x66, 0x77, 0x6f, 0x79, 0x73, 0x76, 0x71, 0x74, 0x7b, 0x77, 0x6e, 0x72,
+    0x79, 0x75, 0x74, 0x72, 0x70, 0x7d, 0x6c, 0x74, 0x77, 0x6a, 0x80, 0x7d,
+    0x72, 0x79, 0x79, 0x74, 0x74, 0x77, 0x76, 0x73, 0x75, 0x75, 0x6e, 0x6a,
+    0x76, 0x7a, 0x70, 0x6e, 0x76, 0x79, 0x74, 0x7d, 0x75, 0x78, 0x87, 0x6f,
+    0x6c, 0x7b, 0x72, 0x70, 0x7c, 0x75, 0x60, 0x7d, 0x70, 0x85, 0x84, 0x72,
+    0x75, 0x4b, 0x71, 0x5f, 0x58, 0x7e, 0x62, 0x77, 0x65, 0x6a, 0x6c, 0x38,
+    0x41, 0x77, 0x9c, 0x6a, 0x6c, 0x79, 0x69, 0x3f, 0x92, 0x8e, 0x6f, 0x80,
+    0x5b, 0x6e, 0x8c, 0x69, 0xa2, 0x5c, 0x6b, 0x4f, 0x75, 0x73, 0x7c, 0x87,
+    0x98, 0x75, 0x4f, 0x7b, 0x73, 0x65, 0x8c, 0x80, 0x52, 0x79, 0x4e, 0x76,
+    0x5e, 0x8f, 0x55, 0x5b, 0x77, 0x78, 0x6e, 0x63, 0x49, 0x75, 0x3a, 0x73,
+    0x7a, 0x8f, 0x70, 0x96, 0x7c, 0x82, 0x6d, 0x8d, 0x50, 0x7a, 0x70, 0x6e,
+    0x96, 0x6c, 0x8d, 0x6e, 0x92, 0x6f, 0x61, 0x5e, 0x7d, 0x59, 0x65, 0x50,
+    0x81, 0x78, 0x7e, 0x79, 0x79, 0x67, 0x67, 0x76, 0x6f, 0x7e, 0x7d, 0x77,
+    0x79, 0x6b, 0x6c, 0x96, 0xb0, 0x3b, 0x6d, 0x77, 0x7c, 0x71, 0x95, 0x69,
+    0x63, 0x68, 0x78, 0x73, 0x6f, 0x57, 0x8c, 0x7f, 0x72, 0xb3, 0x7b, 0x84,
+    0x61, 0x6a, 0x60, 0x7b, 0x7e, 0x3e, 0x72, 0x70, 0x95, 0xa0, 0x89, 0x8c,
+    0x7e, 0x70, 0x75, 0x8f, 0x74, 0x78, 0x5e, 0x75, 0x75, 0x73, 0x9d, 0x5f,
+    0x8d, 0x85, 0x57, 0x4a, 0x65, 0x75, 0x76, 0x7b, 0x78, 0x4c, 0x6c, 0x7e,
+    0x68, 0x9f, 0x9a, 0x73, 0xc4, 0x80, 0x74, 0x7c, 0x93, 0x76, 0x50, 0x6f,
+    0x66, 0x89, 0x80, 0x67, 0x77, 0x54, 0x51, 0x78, 0x77, 0xe9, 0x87, 0x6b,
+    0x53, 0x76, 0x83, 0x83, 0x75, 0x75, 0x75, 0x74, 0x74, 0x70, 0x71, 0x7e,
+    0x83, 0x62, 0x6c, 0x75, 0x66, 0x78, 0x80, 0x7f, 0x7b, 0x62, 0x7e, 0x74,
+    0x7a, 0x77, 0x84, 0x6e, 0x6e, 0x6f, 0x6a, 0x79, 0x5f, 0x82, 0x6c, 0x7c,
+    0x65, 0x64, 0x79, 0x7a, 0x90, 0x82, 0x73, 0x76, 0x84, 0x75, 0x81, 0x80,
+    0x85, 0x6f, 0x73, 0x7b, 0x7c, 0x7b, 0x80, 0x6f, 0x61, 0x87, 0x78, 0x7e,
+    0x5c, 0xa5, 0x8d, 0x80, 0x65, 0x46, 0x68, 0x6f, 0x72, 0x9c, 0x90, 0x63,
+    0x77, 0x97, 0x84, 0x73, 0x7f, 0x82, 0x61, 0x71, 0x82, 0x80, 0xc4, 0x87,
+    0x58, 0x68, 0x81, 0x5b, 0x88, 0x75, 0x7c, 0x97, 0x78, 0x92, 0x61, 0x72,
+    0x63, 0x9c, 0x8e, 0x5f, 0xcb, 0x91, 0x84, 0x60, 0x71, 0x74, 0x6b, 0x81,
+    0x67, 0x64, 0x7e, 0x72, 0x88, 0x5d, 0x6b, 0x6f, 0x65, 0x6c, 0x59, 0x69,
+    0x74, 0x73, 0x6f, 0x79, 0x73, 0x73, 0x75, 0x75, 0x74, 0x73, 0x73, 0x76,
+    0x73, 0x72, 0x72, 0x75, 0x79, 0x72, 0x6b, 0x76, 0x6f, 0x74, 0x74, 0x72,
+    0x78, 0x73, 0x73, 0x76, 0x74, 0x74, 0x70, 0x74, 0x73, 0x71, 0x72, 0x78,
+    0x72, 0x6f, 0x6d, 0x75, 0x80, 0x71, 0x75, 0x6a, 0x79, 0x75, 0x69, 0x75,
+    0x73, 0x71, 0x73, 0x75, 0x79, 0x73, 0x78, 0x74, 0x77, 0x64, 0x78, 0x73,
+    0x7b, 0x6b, 0x67, 0x96, 0x80, 0x7a, 0x77, 0x79, 0x5b, 0x6e, 0x81, 0x6b,
+    0x6e, 0x6b, 0x73, 0x82, 0x6b, 0x73, 0x81, 0x6f, 0x70, 0x74, 0x62, 0x60,
+    0x70, 0x6f, 0x7e, 0x78, 0x74, 0x8a, 0x77, 0x7a, 0x6d, 0x7c, 0x7a, 0x6f,
+    0x70, 0x99, 0x79, 0x78, 0xa2, 0x4a, 0x71, 0x63, 0x7b, 0x6e, 0x7c, 0x57,
+    0x79, 0x6a, 0x75, 0x72, 0x77, 0x4c, 0x7e, 0x73, 0x78, 0x87, 0x6d, 0x7a,
+    0x66, 0x72, 0x71, 0x79, 0x7b, 0x59, 0x72, 0x79, 0x62, 0x71, 0x7d, 0x7b,
+    0x6c, 0x77, 0x7e, 0x73, 0x7b, 0x7b, 0x76, 0x75, 0x77, 0x7c, 0x7e, 0x70,
+    0x81, 0x70, 0x64, 0x6b, 0x6f, 0x71, 0x73, 0x72, 0x73, 0x6d, 0x81, 0x74,
+    0x6b, 0x7e, 0x78, 0x73, 0x92, 0x78, 0x72, 0x71, 0x77, 0x77, 0x86, 0x5a,
+    0x7f, 0x5f, 0x77, 0x75, 0x77, 0x60, 0x77, 0x76, 0x6c, 0x7a, 0x70, 0x79,
+    0x6b, 0x5d, 0x65, 0x7f, 0x83, 0x78, 0x7c, 0x60, 0x65, 0x6c, 0x65, 0x74,
+    0x84, 0x74, 0x54, 0x7b, 0x73, 0x6b, 0x57, 0x5e, 0x65, 0x42, 0x67, 0x7d,
+    0x6a, 0x78, 0x84, 0x65, 0x67, 0x71, 0x6f, 0x86, 0x74, 0x74, 0x3f, 0x36,
+    0x68, 0x64, 0x52, 0x7d, 0x63, 0x64, 0x5d, 0x69, 0x73, 0x6d, 0x5f, 0x5e,
+    0x79, 0x7c, 0x83, 0x71, 0x88, 0x6f, 0x75, 0x73, 0x61, 0x72, 0x69, 0x6e,
+    0x6f, 0x7d, 0x71, 0x87, 0x73, 0x61, 0x7d, 0x76, 0x5c, 0x65, 0x7c, 0x79,
+    0x86, 0x8b, 0x7a, 0x7c, 0x6f, 0x71, 0x85, 0x73, 0x65, 0x8e, 0x7b, 0x66,
+    0x67, 0x82, 0x7e, 0x71, 0x81, 0x7d, 0x6e, 0x6a, 0x77, 0x7e, 0x61, 0x6f,
+    0x7b, 0x89, 0x76, 0x77, 0xac, 0x75, 0x73, 0x73, 0x93, 0x8a, 0x89, 0x62,
+    0x6e, 0x5d, 0x70, 0x6f, 0x6f, 0x47, 0x87, 0x6e, 0x9a, 0xa5, 0x7e, 0x72,
+    0x76, 0x70, 0x70, 0x7e, 0x6c, 0x6e, 0x6c, 0x68, 0x78, 0x77, 0x93, 0x68,
+    0x82, 0x6f, 0x44, 0x78, 0x6b, 0x74, 0x6f, 0x7c, 0x71, 0x8d, 0x78, 0x80,
+    0x67, 0x74, 0x76, 0x6a, 0x72, 0x78, 0x75, 0x7d, 0x5d, 0x70, 0x76, 0x8d,
+    0x86, 0x7c, 0x6f, 0x70, 0x97, 0x85, 0x68, 0x74, 0x1d, 0x6f, 0x80, 0x62,
+    0x74, 0x72, 0x6a, 0x70, 0x76, 0x71, 0x7a, 0x6f, 0x73, 0x93, 0x7a, 0x5b,
+    0x76, 0x82, 0x59, 0x7a, 0x72, 0x56, 0x72, 0x72, 0x34, 0x6e, 0x63, 0x74,
+    0x71, 0x59, 0x90, 0x7a, 0x7a, 0x70, 0x75, 0x62, 0x64, 0x7c, 0x5c, 0x62,
+    0x72, 0x6f, 0x74, 0x79, 0x70, 0x6b, 0x75, 0x85, 0x75, 0x7a, 0x89, 0x7a,
+    0x7a, 0x75, 0x7f, 0x86, 0x95, 0x70, 0x65, 0x70, 0x81, 0x7e, 0x80, 0x62,
+    0x73, 0x79, 0x72, 0x6b, 0x72, 0x61, 0x7a, 0x76, 0x7a, 0x90, 0x6a, 0x69,
+    0x82, 0x63, 0x74, 0xa1, 0x5c, 0x4e, 0x4a, 0x65, 0x4d, 0x5f, 0x54, 0x62,
+    0x59, 0x68, 0xb8, 0x60, 0x94, 0x93, 0x47, 0x87, 0x69, 0x74, 0x67, 0x53,
+    0x5e, 0x8b, 0x88, 0x7d, 0x80, 0x84, 0x95, 0x75, 0x8f, 0x73, 0x5d, 0x68,
+    0x66, 0x69, 0x88, 0x91, 0xc7, 0x5b, 0x92, 0x87, 0x72, 0x74, 0x3c, 0x74,
+    0x6a, 0x7a, 0x6b, 0x61, 0x7e, 0x5d, 0x6e, 0x9b, 0x7b, 0xc5, 0x83, 0x89,
+    0x88, 0x7f, 0x59, 0x76, 0x98, 0x4d, 0x84, 0x7e, 0x8f, 0x89, 0x9b, 0x59,
+    0x5e, 0x4b, 0x8e, 0x9c, 0xac, 0x77, 0x58, 0x74, 0x54, 0x71, 0xbb, 0x79,
+    0x56, 0x79, 0x5f, 0x96, 0x6c, 0x7e, 0x62, 0x9c, 0x8a, 0x85, 0x76, 0x48,
+    0x62, 0x51, 0x93, 0x79, 0xca, 0x77, 0x45, 0x77, 0x84, 0x66, 0x54, 0x75,
+    0x66, 0x51, 0x8a, 0x73, 0x86, 0x5d, 0x79, 0x68, 0xaa, 0xe1, 0xa7, 0x88,
+    0x70, 0x63, 0x6d, 0x75, 0x7e, 0x67, 0x8b, 0x77, 0x63, 0x63, 0x6b, 0x6f,
+    0x76, 0x5c, 0x80, 0x96, 0x7b, 0x8e, 0x3a, 0x58, 0x65, 0x67, 0x64, 0x72,
+    0x57, 0x77, 0x82, 0x89, 0x87, 0x6b, 0x5e, 0x7e, 0x81, 0x71, 0x27, 0x7e,
+    0x58, 0x6d, 0x83, 0x6c, 0x85, 0x6b, 0x66, 0x7c, 0x8b, 0x6c, 0x6b, 0x69,
+    0x6f, 0x74, 0x89, 0x71, 0x81, 0x60, 0x71, 0x70, 0x88, 0x98, 0x5e, 0x8b,
+    0x78, 0x56, 0x5e, 0x93, 0x8a, 0x66, 0x8b, 0x83, 0xa5, 0x6c, 0x77, 0x7b,
+    0x5c, 0x43, 0x8e, 0x7d, 0x63, 0x9e, 0x5d, 0x69, 0x61, 0x3f, 0xaf, 0x79,
+    0x5f, 0x96, 0x71, 0x70, 0x7a, 0x6b, 0x5f, 0xa8, 0x6a, 0x5c, 0x53, 0x72,
+    0x6c, 0x59, 0x8f, 0x6f, 0xdc, 0x6e, 0x3e, 0x8d, 0x95, 0x84, 0x70, 0x86,
+    0x70, 0x56, 0x7a, 0x76, 0x84, 0x67, 0x60, 0x72, 0x83, 0xee, 0x5a, 0x9a,
+    0x77, 0x74, 0x70, 0x79, 0x73, 0x72, 0x71, 0x76, 0x71, 0x75, 0x72, 0x76,
+    0x7a, 0x75, 0x73, 0x6b, 0x73, 0x77, 0x71, 0x74, 0x74, 0x6f, 0x6d, 0x6e,
+    0x77, 0x7a, 0x70, 0x74, 0x73, 0x76, 0x70, 0x79, 0x6d, 0x73, 0x79, 0x7a,
+    0x76, 0x6b, 0x72, 0x7a, 0x7e, 0x70, 0x75, 0x73, 0x78, 0x74, 0x79, 0x75,
+    0x79, 0x6f, 0x76, 0x78, 0x79, 0x70, 0x79, 0x74, 0x7a, 0x80, 0x76, 0x72,
+    0x96, 0x62, 0x6b, 0x75, 0x78, 0x6b, 0x7f, 0x76, 0x7d, 0x86, 0x6e, 0x63,
+    0x67, 0x7e, 0x84, 0x7f, 0x8e, 0x8a, 0x68, 0x74, 0x7d, 0x66, 0x97, 0x93,
+    0x80, 0x8e, 0x6e, 0x5c, 0x91, 0x7a, 0x78, 0x90, 0x6e, 0x65, 0x54, 0x60,
+    0x64, 0x54, 0x73, 0x7c, 0xc4, 0x75, 0x8c, 0x93, 0x7c, 0x6d, 0x69, 0x54,
+    0x4c, 0x89, 0x73, 0x78, 0x9a, 0x5d, 0x67, 0x6f, 0x72, 0xcf, 0x6f, 0x86,
+    0x74, 0x70, 0x72, 0x74, 0x75, 0x75, 0x70, 0x75, 0x77, 0x77, 0x6f, 0x6b,
+    0x72, 0x6f, 0x75, 0x71, 0x73, 0x71, 0x73, 0x70, 0x71, 0x79, 0x70, 0x75,
+    0x6a, 0x74, 0x73, 0x73, 0x73, 0x6f, 0x70, 0x75, 0x70, 0x6f, 0x73, 0x74,
+    0x73, 0x70, 0x73, 0x75, 0x75, 0x75, 0x71, 0x75, 0x75, 0x77, 0x74, 0x73,
+    0x75, 0x71, 0x71, 0x71, 0x76, 0x6e, 0x75, 0x75, 0x74, 0x75, 0x70, 0x6f,
+    0x4d, 0x7d, 0x6c, 0x77, 0x85, 0x77, 0x66, 0x6c, 0x9b, 0x82, 0x7a, 0x73,
+    0x60, 0x58, 0xb0, 0x76, 0x47, 0x84, 0x81, 0x73, 0x84, 0x5c, 0xa6, 0x63,
+    0x8e, 0x65, 0x8c, 0x75, 0x79, 0x46, 0x7f, 0x91, 0x9b, 0x8a, 0x5e, 0x73,
+    0xa5, 0x53, 0x5c, 0x83, 0xd9, 0x77, 0x7f, 0x61, 0x90, 0x94, 0x7c, 0x8e,
+    0x66, 0x74, 0x88, 0x8d, 0x8b, 0x5b, 0x80, 0x79, 0x71, 0xde, 0x94, 0x8a,
+    0x73, 0x64, 0x6c, 0x77, 0x72, 0x6e, 0x80, 0x90, 0x6b, 0x73, 0x67, 0x66,
+    0x72, 0x6e, 0x75, 0x80, 0x70, 0x7a, 0x2a, 0x67, 0x4d, 0x73, 0x5c, 0x77,
+    0x61, 0x79, 0x7a, 0x7a, 0x7a, 0x7e, 0x65, 0x78, 0x7c, 0x6b, 0x56, 0x79,
+    0x6d, 0x78, 0x77, 0x79, 0x86, 0x6f, 0x68, 0x73, 0x83, 0x68, 0x6a, 0x6b,
+    0x76, 0x71, 0x79, 0x75, 0x80, 0x62, 0x6c, 0x73, 0x7d, 0x82, 0x5f, 0x89,
+    0x73, 0x76, 0x7e, 0x75, 0x77, 0x76, 0x78, 0x7d, 0x6e, 0x72, 0x69, 0x74,
+    0x6e, 0x70, 0x6a, 0x78, 0x61, 0x66, 0x6e, 0x71, 0x6d, 0x6e, 0x5a, 0x4b,
+    0x6f, 0x70, 0x70, 0x61, 0x76, 0x6c, 0x76, 0x5f, 0x70, 0x69, 0x7c, 0x76,
+    0x6d, 0x67, 0x67, 0x72, 0x81, 0x7c, 0x6d, 0x76, 0x67, 0x6d, 0x83, 0x75,
+    0x7f, 0x6d, 0x75, 0x7c, 0x79, 0x3f, 0x6b, 0x6b, 0x7d, 0x67, 0x71, 0x75,
+    0x70, 0x6c, 0x72, 0x79, 0x75, 0x74, 0x6f, 0x76, 0x6a, 0x6f, 0x6a, 0x78,
+    0x74, 0x78, 0x72, 0x7d, 0x71, 0x68, 0x22, 0x6e, 0x4a, 0x70, 0x6e, 0x77,
+    0x68, 0x78, 0x72, 0x76, 0x72, 0x70, 0x73, 0x7d, 0x7c, 0x71, 0x62, 0x6c,
+    0x74, 0x73, 0x75, 0x79, 0x81, 0x70, 0x70, 0x74, 0x81, 0x73, 0x72, 0x6b,
+    0x74, 0x71, 0x76, 0x74, 0x70, 0x63, 0x71, 0x75, 0x76, 0x7b, 0x73, 0x77,
+    0x75, 0x5f, 0x73, 0x85, 0x7a, 0x51, 0x77, 0x63, 0x69, 0x72, 0x87, 0x51,
+    0x7a, 0x78, 0x63, 0x75, 0x70, 0x78, 0x6c, 0x79, 0x7f, 0x7b, 0x7b, 0x75,
+    0x7f, 0x6c, 0x73, 0x61, 0x79, 0x61, 0x80, 0x81, 0x68, 0x72, 0x7e, 0x6d,
+    0x88, 0x7a, 0x64, 0x70, 0x8b, 0x7c, 0x74, 0x65, 0x25, 0x71, 0x7f, 0x6e,
+    0x70, 0x71, 0x6a, 0x76, 0x73, 0x53, 0x79, 0x77, 0x77, 0x85, 0x78, 0x73,
+    0x8b, 0x8d, 0x5d, 0x7a, 0x98, 0x61, 0x74, 0x6c, 0x87, 0x6b, 0x9c, 0x8c,
+    0x56, 0x63, 0x9a, 0x74, 0x65, 0x80, 0x52, 0x73, 0x83, 0x4f, 0xb7, 0x79,
+    0x8b, 0x8e, 0x77, 0x52, 0x8c, 0x7b, 0x6a, 0x83, 0x71, 0x57, 0x5e, 0x60,
+    0x5d, 0x4e, 0x80, 0x79, 0xc5, 0x7a, 0x6e, 0x8e, 0xba, 0x88, 0x61, 0x76,
+    0x6c, 0x8f, 0x85, 0x76, 0x6e, 0x5c, 0x66, 0x78, 0x7d, 0xd9, 0x8b, 0x77,
+    0x6c, 0x7c, 0x9a, 0x7b, 0x83, 0x88, 0x62, 0x7b, 0x84, 0x73, 0x87, 0x7e,
+    0x70, 0x8b, 0x4f, 0x94, 0x86, 0x6d, 0x7e, 0x5c, 0x76, 0x7e, 0xc6, 0x6b,
+    0x9b, 0x70, 0x74, 0x6c, 0x7d, 0x88, 0x6e, 0x8d, 0x75, 0x7f, 0xac, 0x7f,
+    0x78, 0x87, 0x94, 0x6e, 0xcc, 0x93, 0x89, 0x68, 0x8f, 0x76, 0x7f, 0x88,
+    0x5d, 0x55, 0x74, 0x92, 0x81, 0x5b, 0x86, 0x6e, 0x6e, 0x86, 0xab, 0x92,
+    0x6a, 0x86, 0x9d, 0x7c, 0x94, 0x93, 0x7b, 0x7f, 0x68, 0xa0, 0x84, 0x6e,
+    0x67, 0x7e, 0x73, 0x75, 0x7a, 0x6b, 0x8d, 0x7d, 0x76, 0x85, 0x9f, 0x5a,
+    0x62, 0x69, 0x79, 0x61, 0x71, 0x50, 0x80, 0x97, 0x5a, 0x84, 0x63, 0x7d,
+    0x8b, 0x8d, 0x86, 0x76, 0xd0, 0x6c, 0x8b, 0x95, 0x70, 0x86, 0x59, 0x87,
+    0x79, 0x82, 0x80, 0x85, 0x7d, 0x55, 0x97, 0x79, 0x52, 0xd8, 0x87, 0x68,
+    0x75, 0x71, 0x73, 0x7b, 0x76, 0x6a, 0x6e, 0x73, 0x67, 0x6b, 0x7e, 0x74,
+    0x72, 0x7a, 0x75, 0x79, 0x7d, 0x75, 0x77, 0x70, 0x6f, 0x7f, 0x75, 0x78,
+    0x7b, 0x6e, 0x79, 0x79, 0x71, 0x71, 0x77, 0x76, 0x71, 0x73, 0x75, 0x78,
+    0x74, 0x78, 0x73, 0x6f, 0x8f, 0x7d, 0x6f, 0x71, 0x80, 0x77, 0x82, 0x63,
+    0x76, 0x69, 0x76, 0x72, 0x74, 0x53, 0x80, 0x74, 0x79, 0x65, 0x75, 0x76,
+    0x6b, 0x73, 0x65, 0x79, 0x8f, 0x7d, 0x80, 0x8d, 0x88, 0x89, 0x87, 0x7f,
+    0x5f, 0x6c, 0x96, 0x92, 0x98, 0x8f, 0x79, 0x7a, 0x5a, 0x88, 0xb3, 0x92,
+    0x8d, 0x8f, 0x6c, 0x84, 0x84, 0x8a, 0x76, 0x87, 0xa0, 0x9e, 0x4b, 0x5a,
+    0x7d, 0x73, 0x93, 0x76, 0xcd, 0x82, 0x79, 0x8a, 0x75, 0x7d, 0x91, 0x8f,
+    0x5b, 0x61, 0x72, 0x68, 0x90, 0x62, 0x81, 0x90, 0x88, 0xd9, 0x7b, 0x80,
+    0x6f, 0x73, 0x72, 0x71, 0x71, 0x73, 0x74, 0x71, 0x72, 0x72, 0x71, 0x73,
+    0x72, 0x6f, 0x70, 0x74, 0x76, 0x70, 0x5f, 0x70, 0x71, 0x75, 0x6e, 0x72,
+    0x6d, 0x6e, 0x73, 0x73, 0x72, 0x70, 0x71, 0x6f, 0x6e, 0x71, 0x70, 0x71,
+    0x73, 0x74, 0x72, 0x71, 0x6e, 0x70, 0x72, 0x70, 0x6f, 0x71, 0x74, 0x70,
+    0x71, 0x71, 0x73, 0x76, 0x72, 0x71, 0x6f, 0x71, 0x74, 0x73, 0x71, 0x70,
+    0x70, 0x76, 0x75, 0x75, 0x69, 0x79, 0x72, 0x79, 0x71, 0x6d, 0x76, 0x5f,
+    0x78, 0x70, 0x6e, 0x6c, 0x6f, 0x7a, 0x76, 0x72, 0x71, 0x71, 0x6c, 0x76,
+    0x75, 0x77, 0x76, 0x6f, 0x71, 0x6e, 0x74, 0x74, 0x72, 0x7b, 0x78, 0x68,
+    0x74, 0x70, 0x61, 0x70, 0x71, 0x74, 0x72, 0x76, 0x71, 0x6b, 0x73, 0x75,
+    0x73, 0x7e, 0x74, 0x6d, 0x76, 0x66, 0x74, 0x71, 0x67, 0x76, 0x76, 0x77,
+    0x69, 0x72, 0x58, 0x80, 0x9a, 0xac, 0x85, 0x84, 0x75, 0x8a, 0x9c, 0x51,
+    0x8e, 0x5d, 0x68, 0x81, 0x78, 0x70, 0x7b, 0x76, 0x67, 0x72, 0x8b, 0x52,
+    0x66, 0x7c, 0x60, 0x4e, 0x75, 0x8b, 0x75, 0x94, 0x5d, 0x80, 0x4f, 0x6e,
+    0x89, 0x86, 0x84, 0x74, 0xcc, 0x8e, 0x80, 0x66, 0x99, 0x6d, 0x50, 0x93,
+    0x79, 0x78, 0x78, 0x99, 0x82, 0x5c, 0x91, 0xa5, 0x66, 0xc2, 0x67, 0x66,
+    0x63, 0x6d, 0x60, 0x77, 0x70, 0x77, 0x70, 0x62, 0x69, 0x8a, 0x7a, 0x75,
+    0x7d, 0x76, 0x73, 0x74, 0x6d, 0x6e, 0x73, 0x73, 0x6d, 0x77, 0x78, 0x4a,
+    0x6c, 0x71, 0x66, 0x53, 0x72, 0x72, 0x74, 0x71, 0x6d, 0x6d, 0x76, 0x74,
+    0x6f, 0x78, 0x69, 0x74, 0x75, 0x69, 0x73, 0x77, 0x6b, 0x64, 0x74, 0x77,
+    0x7d, 0x78, 0x7d, 0x7b, 0x66, 0x45, 0x7d, 0x79, 0x78, 0x71, 0x68, 0x7e,
+    0x6e, 0x87, 0x62, 0x7a, 0x80, 0x77, 0x67, 0x75, 0x7d, 0x9d, 0x7f, 0x59,
+    0x67, 0x75, 0x72, 0x8e, 0x62, 0x8c, 0x5f, 0x71, 0x91, 0x7e, 0xaf, 0x5d,
+    0x9c, 0x88, 0x91, 0x45, 0x78, 0x6f, 0x6b, 0x9f, 0x84, 0x84, 0x4b, 0x8c,
+    0x6a, 0x93, 0x98, 0x8a, 0xc9, 0x84, 0x7e, 0x63, 0x93, 0x74, 0x4b, 0x9b,
+    0x81, 0xa2, 0x62, 0x7d, 0x89, 0x65, 0x77, 0x6d, 0x66, 0xf1, 0x93, 0x82,
+    0x75, 0x78, 0x6b, 0x88, 0x7f, 0x77, 0x79, 0x73, 0x60, 0x78, 0x54, 0x6c,
+    0x67, 0x6e, 0x72, 0x76, 0x7a, 0x76, 0x7a, 0x6e, 0x71, 0x7d, 0x6a, 0x2e,
+    0x67, 0x75, 0x7b, 0x75, 0x7d, 0x80, 0x74, 0x7c, 0x72, 0x7a, 0x7c, 0x71,
+    0x65, 0x7f, 0x72, 0x70, 0x9f, 0x86, 0x75, 0x71, 0x6c, 0x73, 0x32, 0x78,
+    0x75, 0x6a, 0x75, 0x75, 0x6e, 0x71, 0x63, 0x68, 0x74, 0x84, 0x6a, 0x74,
+    0x71, 0x84, 0x6d, 0x83, 0x8f, 0x85, 0x4b, 0x58, 0x76, 0x75, 0x79, 0x4a,
+    0x89, 0x89, 0x72, 0x36, 0x64, 0x50, 0x6c, 0x99, 0x55, 0x6c, 0x88, 0x7f,
+    0x7c, 0x5f, 0x4e, 0x53, 0x54, 0x5b, 0x8b, 0x5e, 0x64, 0x6e, 0x7e, 0x6e,
+    0x8a, 0x7f, 0x6e, 0x84, 0x77, 0x85, 0x84, 0x6c, 0x6c, 0x80, 0x80, 0x82,
+    0x71, 0x81, 0x55, 0x82, 0x62, 0x7b, 0x7d, 0x7e, 0x66, 0x42, 0x71, 0x50,
+    0x79, 0x76, 0x63, 0x7e, 0x6d, 0x5a, 0x76, 0x78, 0x61, 0x71, 0x77, 0x73,
+    0x78, 0x73, 0x74, 0x79, 0x78, 0x74, 0x75, 0x73, 0x71, 0x79, 0x71, 0x67,
+    0x77, 0x75, 0x77, 0x73, 0x71, 0x73, 0x75, 0x70, 0x6f, 0x72, 0x7c, 0x71,
+    0x77, 0x7d, 0x74, 0x77, 0x97, 0x72, 0x71, 0x74, 0x70, 0x73, 0x83, 0x56,
+    0x75, 0x73, 0x72, 0x75, 0x77, 0x73, 0x7a, 0x76, 0x78, 0x79, 0x70, 0x77,
+    0x69, 0x81, 0x78, 0x82, 0x77, 0x60, 0x72, 0x6b, 0x6a, 0x79, 0x71, 0x67,
+    0x7e, 0x7c, 0x49, 0x72, 0x77, 0x72, 0x74, 0x6f, 0x81, 0x7f, 0x8a, 0x73,
+    0x7d, 0x76, 0x6d, 0x6e, 0x7b, 0x6c, 0x7a, 0x81, 0x7a, 0x76, 0x68, 0x74,
+    0x6d, 0x71, 0x75, 0x77, 0x8e, 0x6e, 0x75, 0x6e, 0x67, 0x78, 0x77, 0x58,
+    0x6e, 0x6e, 0x6b, 0x7a, 0x75, 0x7d, 0x6e, 0x79, 0x74, 0x82, 0x78, 0x70,
+    0x72, 0x77, 0x6d, 0x8a, 0x97, 0x8c, 0x42, 0x55, 0x81, 0x72, 0x83, 0x3e,
+    0x9b, 0x82, 0x69, 0x57, 0x52, 0x49, 0x7b, 0xa4, 0x58, 0x7c, 0x82, 0x78,
+    0x91, 0x4f, 0x57, 0x4f, 0x5d, 0x53, 0x84, 0x36, 0x5f, 0x74, 0x7b, 0x6c,
+    0x8a, 0x6a, 0x5e, 0x87, 0x7d, 0x8d, 0x97, 0x5a, 0x70, 0x84, 0x86, 0x80,
+    0x67, 0x85, 0x53, 0x94, 0x5f, 0x78, 0x78, 0x7a, 0x68, 0x58, 0x79, 0x60,
+    0x72, 0x70, 0x4a, 0x7b, 0x88, 0x7a, 0x72, 0x74, 0x7e, 0x74, 0x72, 0x61,
+    0x76, 0x6c, 0x7d, 0x71, 0x6d, 0x6e, 0x79, 0x8b, 0x7f, 0x6b, 0x80, 0x53,
+    0x69, 0x7a, 0x70, 0x60, 0x7e, 0x82, 0x89, 0x8b, 0x7d, 0x6b, 0x5f, 0x78,
+    0x89, 0x73, 0x68, 0x78, 0xb9, 0x82, 0x7d, 0x65, 0x75, 0x87, 0x57, 0x72,
+    0x67, 0x67, 0x7c, 0x7e, 0x7c, 0x3c, 0x5d, 0x6a, 0x76, 0xca, 0x7a, 0x65,
+    0x74, 0x76, 0x64, 0x7d, 0x70, 0x75, 0x7c, 0x74, 0x6e, 0x77, 0x75, 0x7a,
+    0x78, 0x6a, 0x71, 0x72, 0x74, 0x72, 0x6d, 0x6f, 0x78, 0x70, 0x7a, 0x7c,
+    0x79, 0x47, 0x70, 0x7c, 0x74, 0x81, 0x76, 0x72, 0x76, 0x74, 0x6b, 0x7d,
+    0x6d, 0x73, 0x7a, 0x74, 0x79, 0x76, 0x76, 0x6d, 0x7a, 0x70, 0x77, 0x71,
+    0x70, 0x71, 0x76, 0x71, 0x76, 0x68, 0x75, 0x78, 0x74, 0x77, 0x72, 0x75,
+    0x60, 0x7b, 0x6b, 0x74, 0xab, 0x95, 0x9f, 0x59, 0x6e, 0x6b, 0x75, 0x52,
+    0x64, 0x57, 0x97, 0x75, 0x7f, 0x64, 0x53, 0x66, 0x5a, 0x75, 0xa4, 0x60,
+    0x8b, 0x7e, 0x82, 0x99, 0x79, 0x91, 0x59, 0x89, 0x5a, 0x8a, 0x57, 0x6a,
+    0xaa, 0x5d, 0x7e, 0x7c, 0xe0, 0x56, 0x3c, 0x52, 0x75, 0x77, 0x71, 0x6f,
+    0x6c, 0x59, 0x8c, 0x79, 0x8d, 0x59, 0x6a, 0x84, 0x8e, 0xe6, 0x56, 0x6b,
+    0x80, 0x78, 0x68, 0x93, 0x73, 0x63, 0x72, 0x4f, 0x7c, 0x71, 0x84, 0x88,
+    0x58, 0x82, 0x9a, 0x8f, 0x61, 0x81, 0x84, 0x72, 0x7d, 0x7d, 0x8a, 0x65,
+    0x94, 0x7a, 0x6a, 0x7e, 0x7f, 0x8d, 0x82, 0xa5, 0x9d, 0x77, 0xa2, 0x67,
+    0x7a, 0x61, 0x79, 0x66, 0xce, 0x96, 0x8c, 0x9a, 0x71, 0x7e, 0x6b, 0x7c,
+    0x69, 0x63, 0x7b, 0x73, 0x7b, 0x6a, 0x5f, 0x98, 0x5c, 0x6d, 0x9d, 0xa7,
+    0x6f, 0x7c, 0x6d, 0x77, 0x7d, 0x74, 0x79, 0x7d, 0x7e, 0x72, 0x83, 0x71,
+    0x73, 0x73, 0x6e, 0x80, 0x79, 0x79, 0x74, 0x7d, 0x7a, 0x73, 0x7d, 0x69,
+    0x6c, 0x76, 0x72, 0x70, 0x7e, 0x74, 0x7e, 0x7e, 0x84, 0x6b, 0x6d, 0x70,
+    0x70, 0x71, 0x72, 0x80, 0xbd, 0x80, 0x7e, 0x67, 0x7b, 0x79, 0x71, 0x78,
+    0x75, 0x72, 0x82, 0x7a, 0x78, 0x6d, 0x73, 0x70, 0x6e, 0x6e, 0x7a, 0x77,
+    0x70, 0x70, 0x79, 0x72, 0x71, 0x7a, 0x76, 0x6e, 0x73, 0x6a, 0x70, 0x82,
+    0x89, 0x71, 0x74, 0x73, 0x5a, 0x79, 0x75, 0x85, 0x7a, 0x77, 0x8a, 0x71,
+    0x65, 0x7b, 0x72, 0x70, 0x6c, 0x83, 0x6a, 0x7e, 0x72, 0x82, 0x7a, 0x70,
+    0x77, 0x71, 0x6d, 0x79, 0x90, 0x82, 0x73, 0x77, 0x7f, 0x6f, 0x7a, 0x7f,
+    0x78, 0x70, 0x73, 0x76, 0x80, 0x7c, 0x87, 0x75, 0x6c, 0x7e, 0x76, 0x7e,
+    0x6b, 0x60, 0x6b, 0x71, 0x81, 0x68, 0x76, 0x73, 0x6e, 0x63, 0x6f, 0x69,
+    0x7c, 0x6e, 0x5f, 0x6b, 0x73, 0x6c, 0x71, 0x70, 0x73, 0x77, 0x64, 0x7c,
+    0x6c, 0x5d, 0x79, 0x70, 0x7c, 0x71, 0x75, 0x76, 0x6f, 0x6b, 0x6e, 0x71,
+    0x6b, 0x74, 0x77, 0x6d, 0x83, 0x83, 0x79, 0x6e, 0x7e, 0x69, 0x68, 0x6c,
+    0x78, 0x72, 0x6f, 0x7d, 0x77, 0x45, 0x74, 0x6e, 0x7e, 0x7a, 0x6d, 0x66,
+    0x73, 0x6f, 0x71, 0x71, 0x7a, 0x74, 0x6e, 0x76, 0x71, 0x6c, 0x71, 0x74,
+    0x75, 0x6d, 0x79, 0x73, 0x76, 0x6b, 0x75, 0x75, 0x71, 0x77, 0x6a, 0x74,
+    0x6e, 0x6a, 0x71, 0x74, 0x72, 0x7a, 0x72, 0x6a, 0x60, 0x70, 0x75, 0x6c,
+    0x74, 0x72, 0x7c, 0x72, 0x7a, 0x75, 0x67, 0x6f, 0x71, 0x75, 0x73, 0x73,
+    0x78, 0x72, 0x6f, 0x77, 0x79, 0x78, 0x74, 0x5c, 0x68, 0x7e, 0x72, 0x73,
+    0x7f, 0x79, 0x9a, 0x7a, 0x8d, 0x87, 0x48, 0x61, 0x89, 0x6e, 0x65, 0x51,
+    0x8a, 0x88, 0x72, 0x63, 0x61, 0x53, 0x7c, 0x64, 0x79, 0x80, 0xc2, 0x69,
+    0x97, 0x73, 0x71, 0x5f, 0x77, 0x55, 0x7c, 0x8a, 0x61, 0x73, 0x71, 0x91,
+    0x92, 0x93, 0x78, 0x81, 0xc8, 0x7c, 0x8e, 0x62, 0x75, 0x79, 0x8c, 0x89,
+    0x78, 0x81, 0x72, 0x8b, 0x73, 0x51, 0xa1, 0x95, 0x4d, 0x73, 0x97, 0x71,
+    0x71, 0x72, 0x76, 0x7c, 0x78, 0x78, 0x71, 0x75, 0x77, 0x77, 0x75, 0x76,
+    0x70, 0x73, 0x71, 0x7b, 0x78, 0x74, 0x6b, 0x76, 0x76, 0x73, 0x6f, 0x77,
+    0x7c, 0x70, 0x7a, 0x76, 0x76, 0x76, 0x74, 0x78, 0x72, 0x72, 0x78, 0x78,
+    0x69, 0x75, 0x73, 0x77, 0x85, 0x73, 0x77, 0x60, 0x77, 0x73, 0x6c, 0x77,
+    0x74, 0x75, 0x71, 0x7a, 0x7c, 0x74, 0x7b, 0x73, 0x76, 0x76, 0x7b, 0x76,
+    0x96, 0x71, 0x50, 0x70, 0x8b, 0x74, 0x98, 0x7e, 0x95, 0x77, 0x80, 0x54,
+    0x5b, 0x70, 0x84, 0x7c, 0x79, 0x8c, 0x73, 0x75, 0x6c, 0x72, 0xba, 0x77,
+    0x57, 0x9a, 0x92, 0x8d, 0x7d, 0x51, 0x81, 0x90, 0x72, 0x7f, 0x44, 0x82,
+    0x73, 0x90, 0x7d, 0x7b, 0xce, 0x7c, 0x64, 0x82, 0xa3, 0x88, 0x75, 0x74,
+    0x60, 0x77, 0x80, 0x6d, 0x9a, 0x56, 0x72, 0x86, 0x7f, 0xd0, 0x9c, 0x7f,
+    0x71, 0x75, 0x83, 0x77, 0x5d, 0x3b, 0x76, 0x6a, 0x79, 0x73, 0x79, 0x62,
+    0x6a, 0x64, 0x78, 0x78, 0x6d, 0x6b, 0x74, 0x74, 0x76, 0x6e, 0x78, 0x73,
+    0x76, 0x85, 0x7b, 0x7f, 0x6e, 0x73, 0x73, 0x73, 0x6d, 0x89, 0x77, 0x70,
+    0x7c, 0x7e, 0x76, 0x71, 0x7c, 0x6f, 0x6f, 0x77, 0x6f, 0x74, 0x74, 0x72,
+    0x78, 0x7b, 0x70, 0x75, 0x71, 0x68, 0x7a, 0x6c, 0x76, 0x82, 0x7e, 0x76,
+    0x75, 0x72, 0x7e, 0x79, 0x74, 0x71, 0x92, 0x77, 0x7f, 0x79, 0x78, 0x6a,
+    0x72, 0x7a, 0x7c, 0x76, 0x6c, 0x72, 0x63, 0x74, 0x7c, 0x77, 0x81, 0x6a,
+    0x71, 0x6a, 0x71, 0x75, 0x71, 0x6d, 0x71, 0x78, 0x73, 0x70, 0x81, 0x79,
+    0x7a, 0x75, 0x71, 0x74, 0x7b, 0x78, 0x6d, 0x90, 0x7c, 0x78, 0x7d, 0x69,
+    0x68, 0x7a, 0x70, 0x70, 0x69, 0x76, 0x53, 0x77, 0x71, 0x7c, 0x79, 0x78,
+    0x7d, 0x64, 0x78, 0x7e, 0x43, 0x82, 0x84, 0x6b, 0x76, 0x6d, 0x77, 0x81,
+    0x58, 0x63, 0x73, 0x8a, 0x7e, 0x7d, 0x7d, 0x64, 0x73, 0x4a, 0x6f, 0x4d,
+    0x5b, 0x7f, 0x67, 0x8a, 0x9e, 0x8f, 0x68, 0x78, 0x78, 0x77, 0x64, 0x4d,
+    0x67, 0x89, 0x77, 0x7d, 0xca, 0x59, 0x9a, 0x9d, 0x7a, 0x92, 0x71, 0x65,
+    0x65, 0x63, 0x85, 0x55, 0x6d, 0x59, 0x6e, 0x9f, 0x80, 0xda, 0x4e, 0x9e,
+    0x78, 0x66, 0x68, 0x82, 0x7a, 0x5c, 0x70, 0x71, 0x7a, 0x6b, 0x98, 0x6e,
+    0x7d, 0x8d, 0x60, 0x76, 0x78, 0x76, 0x6c, 0x74, 0x70, 0x81, 0x76, 0x7c,
+    0x7c, 0x72, 0x58, 0x69, 0x66, 0x7b, 0x7d, 0x7a, 0x6e, 0x7e, 0x7f, 0x85,
+    0x87, 0x7c, 0x66, 0x7a, 0x9e, 0x80, 0x68, 0x66, 0x3c, 0x6c, 0x7d, 0x6c,
+    0x75, 0x6c, 0x6d, 0x7d, 0x77, 0x52, 0x7d, 0x6d, 0x7d, 0x8d, 0x75, 0x5d,
+    0x61, 0x7a, 0x66, 0x7a, 0x6e, 0x89, 0x79, 0x7a, 0x73, 0x6c, 0x81, 0x85,
+    0x65, 0x59, 0x58, 0x85, 0x74, 0x7a, 0x89, 0x71, 0x2d, 0x60, 0xa5, 0x77,
+    0xb3, 0x6d, 0x7e, 0x8d, 0x79, 0x73, 0x82, 0xa0, 0x90, 0x7d, 0x5e, 0x7b,
+    0x6a, 0x86, 0x85, 0x67, 0xce, 0xa8, 0x6a, 0x84, 0x98, 0x6e, 0x74, 0x92,
+    0x7a, 0x4e, 0x7a, 0x89, 0x85, 0x57, 0x7a, 0x7a, 0x60, 0xe0, 0x73, 0x6f,
+    0x70, 0x70, 0x73, 0x7a, 0x75, 0x75, 0x72, 0x71, 0x6f, 0x74, 0x6f, 0x74,
+    0x77, 0x74, 0x72, 0x73, 0x7d, 0x75, 0x71, 0x72, 0x72, 0x75, 0x74, 0x74,
+    0x79, 0x68, 0x74, 0x78, 0x75, 0x75, 0x74, 0x72, 0x76, 0x71, 0x71, 0x77,
+    0x5f, 0x72, 0x6e, 0x76, 0x79, 0x73, 0x74, 0x6b, 0x7a, 0x72, 0x59, 0x73,
+    0x72, 0x70, 0x74, 0x70, 0x72, 0x74, 0x78, 0x77, 0x7a, 0x73, 0x71, 0x72,
+    0x89, 0x77, 0x5f, 0x79, 0x95, 0x62, 0x59, 0x82, 0x92, 0x7c, 0x97, 0x73,
+    0x91, 0x65, 0x7f, 0x78, 0x67, 0x85, 0x6c, 0x5a, 0x9a, 0x83, 0x95, 0x73,
+    0x63, 0x75, 0x6e, 0x95, 0x6c, 0x6e, 0x78, 0x80, 0x9c, 0x65, 0x93, 0x6b,
+    0x7b, 0x5b, 0x9c, 0x62, 0xda, 0x67, 0x74, 0x69, 0x72, 0x76, 0x72, 0x86,
+    0x7e, 0xa0, 0x76, 0x81, 0x74, 0x60, 0x63, 0x6f, 0x7d, 0x86, 0x6c, 0x73,
+    0x78, 0x66, 0x78, 0x76, 0x71, 0x75, 0x76, 0x71, 0x6d, 0x77, 0x77, 0x74,
+    0x6c, 0x78, 0x78, 0x79, 0x6f, 0x73, 0x7a, 0x79, 0x70, 0x6e, 0x76, 0x76,
+    0x69, 0x7b, 0x6d, 0x75, 0x73, 0x6a, 0x74, 0x79, 0x6e, 0x7d, 0x75, 0x76,
+    0x6b, 0x7d, 0x6c, 0x68, 0x81, 0x78, 0x72, 0x74, 0x77, 0x70, 0x7a, 0x79,
+    0x7c, 0x77, 0x73, 0x6e, 0x72, 0x67, 0x7a, 0x6b, 0x76, 0x6c, 0x73, 0x6b,
+    0x88, 0x70, 0x85, 0x78, 0x84, 0x81, 0x60, 0x65, 0x8d, 0x7d, 0x86, 0x7d,
+    0x6b, 0x92, 0x7b, 0x79, 0x7e, 0x6d, 0x94, 0x70, 0x92, 0x6e, 0xbf, 0x72,
+    0x61, 0x91, 0x5a, 0x4c, 0x71, 0x79, 0x73, 0x90, 0x85, 0x73, 0x5e, 0x7a,
+    0x99, 0x8c, 0x85, 0x9c, 0xd4, 0x9f, 0x96, 0x54, 0x70, 0x8b, 0x5d, 0x94,
+    0x7e, 0x8d, 0x7d, 0x7b, 0x8d, 0x57, 0x6c, 0x71, 0x5d, 0x81, 0x8d, 0x7a,
+    0x68, 0x74, 0x86, 0x7a, 0x79, 0x66, 0x77, 0x74, 0x7c, 0x79, 0x76, 0x75,
+    0x74, 0x73, 0x74, 0x78, 0x74, 0x7c, 0x6c, 0x75, 0x6d, 0x74, 0x72, 0x71,
+    0x75, 0x76, 0x76, 0x77, 0x78, 0x6c, 0x79, 0x76, 0x75, 0x6f, 0x72, 0x73,
+    0x6c, 0x7a, 0x6e, 0x79, 0x84, 0x74, 0x72, 0x73, 0x7c, 0x77, 0x6d, 0x7a,
+    0x70, 0x7c, 0x68, 0x72, 0x73, 0x7b, 0x79, 0x76, 0x72, 0x86, 0x77, 0x77,
+    0x7d, 0x6c, 0x7e, 0x9b, 0x59, 0x5f, 0x8f, 0x75, 0x5e, 0x71, 0x5d, 0x73,
+    0x66, 0x51, 0x6c, 0x8b, 0x81, 0x91, 0x4e, 0x75, 0x63, 0x59, 0x78, 0x5f,
+    0x68, 0x89, 0x7e, 0x90, 0x8a, 0x8a, 0x7b, 0xa7, 0xa8, 0x56, 0x69, 0x40,
+    0x74, 0x54, 0x96, 0x6f, 0xd4, 0x6b, 0x6b, 0x81, 0x74, 0x8e, 0x71, 0x57,
+    0x70, 0x76, 0x82, 0x67, 0x7d, 0x63, 0x7a, 0x91, 0xa0, 0x9b, 0x6d, 0xa0,
+    0x5d, 0x78, 0x76, 0x7b, 0xa7, 0xad, 0x79, 0x62, 0x7b, 0xa9, 0x87, 0x70,
+    0x95, 0x8a, 0x64, 0x81, 0x6f, 0x60, 0x71, 0x77, 0x7e, 0x8a, 0xbc, 0x62,
+    0x85, 0x92, 0x65, 0x84, 0x86, 0x4d, 0x76, 0xa9, 0x69, 0x85, 0x4f, 0x8c,
+    0x6e, 0x9f, 0x91, 0x6f, 0xcb, 0x96, 0x88, 0x74, 0x74, 0x78, 0x70, 0x83,
+    0x7c, 0x66, 0x84, 0x79, 0x7d, 0x5f, 0x9d, 0x6c, 0x59, 0xde, 0x94, 0x6e,
+    0x7c, 0x4a, 0x99, 0x7a, 0x86, 0x7d, 0x50, 0x79, 0x7b, 0x7e, 0x89, 0x56,
+    0x65, 0xa6, 0x58, 0x5f, 0x86, 0x5e, 0x72, 0x85, 0x74, 0x8b, 0xb1, 0x51,
+    0x7c, 0x69, 0x5c, 0x57, 0x6d, 0x61, 0x61, 0x8e, 0x6a, 0x73, 0x97, 0x6e,
+    0x5a, 0x91, 0x87, 0x7e, 0xd7, 0x96, 0x80, 0x7c, 0x76, 0x63, 0x99, 0x7c,
+    0x70, 0x40, 0x77, 0x85, 0x7c, 0x5e, 0x9a, 0x80, 0x5e, 0xde, 0x8c, 0x8f,
+    0x72, 0x76, 0x74, 0x6b, 0x71, 0x75, 0x6e, 0x76, 0x74, 0x72, 0x73, 0x70,
+    0x73, 0x6e, 0x71, 0x75, 0x76, 0x71, 0x75, 0x6f, 0x70, 0x75, 0x6c, 0x72,
+    0x6c, 0x6c, 0x6d, 0x74, 0x76, 0x73, 0x72, 0x6f, 0x6e, 0x70, 0x71, 0x6d,
+    0x6d, 0x74, 0x77, 0x75, 0x79, 0x76, 0x71, 0x6d, 0x71, 0x71, 0x76, 0x6e,
+    0x74, 0x70, 0x74, 0x74, 0x72, 0x64, 0x78, 0x78, 0x74, 0x71, 0x77, 0x72,
+    0x7b, 0x71, 0x7d, 0x76, 0x73, 0x70, 0x75, 0x74, 0x75, 0x72, 0x78, 0x6f,
+    0x68, 0x77, 0x78, 0x78, 0x68, 0x77, 0x79, 0x69, 0x76, 0x7c, 0x76, 0x6d,
+    0x85, 0x84, 0x75, 0x70, 0x75, 0x78, 0x71, 0x78, 0x6f, 0x75, 0x74, 0x71,
+    0x78, 0x79, 0x80, 0x6b, 0x7c, 0x77, 0x6e, 0x6f, 0x70, 0x79, 0x7f, 0x72,
+    0x82, 0x78, 0x6f, 0x6d, 0x6a, 0x7d, 0x56, 0x73, 0x7a, 0x71, 0x84, 0x71,
+    0x73, 0x63, 0x63, 0x7e, 0x92, 0x89, 0x71, 0x74, 0x86, 0x63, 0x92, 0x6f,
+    0x81, 0x84, 0x6a, 0x74, 0x58, 0x6b, 0x7d, 0x76, 0x76, 0x43, 0xac, 0x4c,
+    0x5e, 0x82, 0x70, 0x5e, 0x79, 0x8d, 0x75, 0xa4, 0x83, 0x80, 0x59, 0x61,
+    0x8b, 0x7f, 0x7c, 0x77, 0xc9, 0x91, 0x91, 0x6e, 0x80, 0x6d, 0x65, 0x5d,
+    0x62, 0x87, 0x79, 0x57, 0x7e, 0x4c, 0x7d, 0x82, 0x75, 0xd6, 0x87, 0x6b,
+    0x70, 0x77, 0x76, 0x79, 0x75, 0x7d, 0x78, 0x6d, 0x65, 0x75, 0x6b, 0x66,
+    0x79, 0x70, 0x4e, 0x78, 0x78, 0x74, 0x7a, 0x73, 0x77, 0x72, 0x82, 0x4e,
+    0x7a, 0x78, 0x69, 0x6b, 0x7a, 0x72, 0x75, 0x7b, 0x78, 0x73, 0x7d, 0x77,
+    0x67, 0x73, 0x78, 0x79, 0x8a, 0x71, 0x78, 0x72, 0x73, 0x71, 0x70, 0x71,
+    0x78, 0x74, 0x6d, 0x73, 0x72, 0x7b, 0x5d, 0x76, 0x75, 0x80, 0x72, 0x79,
+    0x79, 0x70, 0x75, 0x6c, 0x6f, 0x79, 0x7d, 0x75, 0x7a, 0x73, 0x79, 0x6a,
+    0x84, 0x75, 0x78, 0x6e, 0x64, 0x6f, 0x74, 0x6d, 0x71, 0x59, 0x84, 0x75,
+    0x70, 0x67, 0x65, 0x72, 0x72, 0x6d, 0x77, 0x79, 0x74, 0x68, 0x74, 0x66,
+    0x75, 0x7c, 0x7e, 0x77, 0x6e, 0x6f, 0x6d, 0x8c, 0x76, 0x70, 0x7d, 0x6f,
+    0x7c, 0x80, 0x76, 0x67, 0x6b, 0x73, 0x57, 0x7b, 0x6c, 0x78, 0x75, 0x76,
+    0x92, 0x3f, 0x53, 0xb9, 0x4c, 0x3b, 0x85, 0x76, 0x70, 0x59, 0x6b, 0x8e,
+    0x52, 0x40, 0x80, 0x8c, 0x78, 0xa1, 0x57, 0x31, 0x4c, 0x38, 0x5d, 0x61,
+    0x53, 0x79, 0x70, 0xb3, 0x82, 0x9d, 0x3f, 0x90, 0x6b, 0x4f, 0x32, 0x34,
+    0x4e, 0x37, 0x97, 0x3a, 0x8c, 0x48, 0x2b, 0x8a, 0xbf, 0x3c, 0x54, 0x3f,
+    0x85, 0x46, 0x63, 0x3f, 0x91, 0x57, 0x51, 0x6c, 0xa2, 0xe3, 0x44, 0xa5,
+    0x5d, 0x6c, 0x7c, 0x88, 0x96, 0x5a, 0x72, 0x7c, 0x4b, 0x71, 0x8c, 0x78,
+    0x61, 0x8f, 0x69, 0x82, 0x80, 0x7b, 0x7d, 0x7d, 0x6e, 0x7c, 0x6e, 0x47,
+    0x71, 0x69, 0x93, 0x81, 0x80, 0x75, 0x83, 0x7e, 0x7e, 0x85, 0x63, 0x72,
+    0x56, 0x7c, 0x88, 0x6d, 0xa6, 0x4a, 0x73, 0x80, 0x83, 0x63, 0x99, 0x66,
+    0x55, 0x54, 0x78, 0x81, 0x87, 0x4b, 0x69, 0x6a, 0x7f, 0x91, 0x6c, 0x67,
+    0x55, 0x79, 0x87, 0x74, 0x6a, 0x78, 0x7a, 0x72, 0x76, 0x74, 0x76, 0x7e,
+    0x86, 0x66, 0x68, 0x85, 0x63, 0x7d, 0x83, 0x7a, 0x7e, 0x7a, 0x7e, 0x80,
+    0x85, 0x91, 0x81, 0x7d, 0x6c, 0x71, 0x74, 0x83, 0x64, 0x84, 0x6f, 0x8a,
+    0x7f, 0x73, 0x6c, 0x72, 0x9c, 0x76, 0x73, 0x7f, 0x83, 0x75, 0x80, 0x76,
+    0x70, 0x78, 0x70, 0x80, 0x7d, 0x85, 0x7e, 0x72, 0x5c, 0x78, 0x78, 0x80,
+    0x5a, 0x54, 0x79, 0x81, 0x76, 0x80, 0x7e, 0x6b, 0x7f, 0x85, 0x7a, 0x89,
+    0x80, 0x7c, 0x6a, 0x76, 0x93, 0x7d, 0x6d, 0x8d, 0x76, 0x5a, 0x6d, 0x73,
+    0x8f, 0x7b, 0x84, 0x56, 0x5d, 0x7e, 0x69, 0x82, 0x60, 0x66, 0x6f, 0x7d,
+    0x74, 0x89, 0x7b, 0x78, 0x92, 0x63, 0x82, 0x75, 0x7d, 0x7e, 0x7d, 0x85,
+    0x7c, 0x69, 0x6d, 0x78, 0x77, 0x76, 0x74, 0x81, 0x7c, 0x8d, 0x7b, 0x77,
+    0x6c, 0x83, 0x57, 0x7d, 0x8f, 0x86, 0x6b, 0x86, 0xa5, 0xae, 0x91, 0x64,
+    0x94, 0x9c, 0x62, 0x92, 0x7a, 0x7e, 0x54, 0x72, 0x7d, 0x82, 0xa1, 0x89,
+    0x6d, 0x80, 0x8c, 0x7f, 0x89, 0x6c, 0x61, 0x91, 0x8c, 0x78, 0x63, 0x61,
+    0x6b, 0x90, 0x84, 0x66, 0xd7, 0x91, 0x77, 0x5a, 0x92, 0x7a, 0x72, 0x93,
+    0x6f, 0x8b, 0x7d, 0x7a, 0x9c, 0x5d, 0x9f, 0x6c, 0x83, 0xe0, 0x9a, 0x62,
+    0x74, 0x78, 0x6e, 0x72, 0x75, 0x7b, 0x4a, 0x60, 0x77, 0x73, 0x78, 0x6d,
+    0x79, 0x74, 0x70, 0x3f, 0x73, 0x69, 0x5e, 0x75, 0x62, 0x6e, 0x79, 0x75,
+    0x7e, 0x6c, 0x6c, 0x6f, 0x68, 0x6e, 0x7f, 0x67, 0x54, 0x75, 0x7c, 0x61,
+    0x72, 0x7f, 0x72, 0x7a, 0x73, 0x79, 0x7a, 0x7b, 0x71, 0x78, 0x7b, 0x76,
+    0x78, 0x78, 0x67, 0x7b, 0x6f, 0x75, 0x75, 0x7d, 0x6f, 0x5f, 0x7c, 0x54,
+    0x71, 0x9f, 0x96, 0x7b, 0x86, 0x85, 0x55, 0x6a, 0x82, 0x74, 0x73, 0x82,
+    0x79, 0x6f, 0x73, 0x74, 0x96, 0x7f, 0x87, 0x6c, 0x84, 0x80, 0xa3, 0x52,
+    0x80, 0x5c, 0x5c, 0x60, 0x84, 0x5e, 0x7d, 0x92, 0x7b, 0x70, 0x56, 0x9e,
+    0x72, 0x90, 0x7e, 0x9e, 0xd8, 0x7e, 0x78, 0x71, 0x83, 0x85, 0x8d, 0x8f,
+    0x88, 0x9d, 0x8b, 0x7b, 0x7c, 0x62, 0x84, 0x6e, 0x85, 0x72, 0x87, 0x69,
+    0x7f, 0x85, 0xb5, 0xa0, 0xac, 0xa3, 0x7a, 0x6e, 0x90, 0xb5, 0x98, 0x91,
+    0x78, 0x98, 0x82, 0x5f, 0xa2, 0x27, 0x79, 0xca, 0xb8, 0xcb, 0x5d, 0x91,
+    0x99, 0x70, 0x76, 0x5b, 0x70, 0x88, 0xc3, 0x76, 0x51, 0xd1, 0x7f, 0xad,
+    0xa3, 0x72, 0x84, 0x95, 0xa6, 0xae, 0xca, 0x88, 0x8c, 0x90, 0x73, 0x90,
+    0x7a, 0x88, 0x53, 0xaa, 0x4b, 0x69, 0xca, 0x82, 0x49, 0x7f, 0xb4, 0x7c,
+    0x75, 0x96, 0x89, 0x74, 0x89, 0x58, 0x6d, 0x60, 0x68, 0x5a, 0x83, 0x85,
+    0x85, 0x70, 0x7f, 0x88, 0x80, 0x6e, 0x85, 0x6f, 0x6f, 0x8c, 0x7d, 0x7b,
+    0x92, 0x6e, 0x72, 0x7c, 0x7b, 0x89, 0x6c, 0x74, 0x72, 0x7f, 0x9a, 0x90,
+    0x4f, 0x82, 0x7a, 0x8a, 0xa8, 0x55, 0x73, 0x80, 0x8c, 0x76, 0x88, 0x6c,
+    0x80, 0x67, 0x7c, 0x8d, 0x6a, 0x47, 0x63, 0x93, 0x80, 0xa5, 0x7e, 0x83,
+    0x96, 0x39, 0x48, 0xb5, 0x86, 0x37, 0x6a, 0x72, 0x97, 0x62, 0xa0, 0x7e,
+    0x50, 0x93, 0x74, 0x7f, 0x70, 0x76, 0x47, 0x46, 0x56, 0x42, 0xa8, 0x7c,
+    0x52, 0x75, 0x5c, 0xb0, 0x7a, 0x88, 0x58, 0x8d, 0x53, 0x56, 0x27, 0x5d,
+    0x86, 0x35, 0x71, 0x65, 0x82, 0x5d, 0x51, 0x68, 0x59, 0x3f, 0x5a, 0x6d,
+    0x77, 0x79, 0x9a, 0xa9, 0x7d, 0x4d, 0x4b, 0x75, 0x82, 0xdd, 0x33, 0x9c,
+    0x5f, 0x6f, 0x67, 0x78, 0x6e, 0x4d, 0x68, 0x6c, 0x7a, 0x6b, 0x76, 0x7d,
+    0x75, 0x83, 0x82, 0x74, 0x86, 0x62, 0x80, 0x72, 0x67, 0x5c, 0x7b, 0x6d,
+    0x6b, 0x6b, 0x6b, 0x7a, 0x77, 0x67, 0x73, 0x73, 0x6e, 0x72, 0x67, 0x62,
+    0x4f, 0x75, 0x72, 0x76, 0x7d, 0x7e, 0x82, 0x4d, 0x72, 0x6f, 0x5e, 0x89,
+    0x83, 0x6d, 0x72, 0x71, 0x78, 0x46, 0x5c, 0x77, 0x7a, 0x76, 0x84, 0x70,
+    0x72, 0x66, 0x7e, 0x88, 0x68, 0x5c, 0x74, 0x7c, 0x84, 0x7b, 0x7c, 0x74,
+    0x74, 0x61, 0x68, 0x82, 0x81, 0x81, 0x76, 0x75, 0x7b, 0x82, 0x90, 0x82,
+    0x59, 0x5a, 0x71, 0x74, 0x6e, 0x7d, 0x6e, 0x7d, 0x74, 0x69, 0x7f, 0x90,
+    0x6e, 0x78, 0x6a, 0x7a, 0xa5, 0x75, 0x7d, 0x73, 0x81, 0x6e, 0x83, 0x80,
+    0x7b, 0x75, 0x73, 0x7c, 0x7d, 0x67, 0x79, 0x7a, 0x79, 0x7c, 0x94, 0x83,
+    0x7e, 0x77, 0x66, 0x78, 0x6d, 0x76, 0x74, 0x70, 0x77, 0x7f, 0x6d, 0x7a,
+    0x2a, 0x7a, 0x70, 0x7b, 0x70, 0x73, 0x75, 0x6f, 0x5e, 0x72, 0x76, 0x81,
+    0x6d, 0x75, 0x5a, 0x7e, 0x77, 0x5c, 0x74, 0x76, 0x6b, 0x7a, 0x85, 0x7d,
+    0x76, 0x5a, 0x78, 0x73, 0x8e, 0x6c, 0x7e, 0x80, 0x28, 0x70, 0x33, 0x75,
+    0x78, 0x7d, 0x74, 0x69, 0x6c, 0x67, 0x6c, 0x7b, 0x7c, 0x77, 0x7e, 0x72,
+    0x75, 0x74, 0x7d, 0x7d, 0x78, 0x74, 0x74, 0x76, 0x70, 0x6f, 0x75, 0x78,
+    0x6a, 0x7a, 0x66, 0x76, 0x76, 0x73, 0x7a, 0x6c, 0x6a, 0x70, 0x78, 0x4b,
+    0x6b, 0x6f, 0x7a, 0x72, 0x72, 0x78, 0x6f, 0x74, 0x75, 0x79, 0x79, 0x77,
+    0x65, 0x74, 0x76, 0x73, 0x7b, 0x74, 0x74, 0x6e, 0x7e, 0x74, 0x79, 0x81,
+    0x77, 0x72, 0x7a, 0x71, 0x70, 0x73, 0x66, 0x75, 0x70, 0x71, 0x89, 0x7a,
+    0x82, 0x7c, 0x5f, 0x80, 0x85, 0x5c, 0x79, 0x6e, 0x8b, 0x6c, 0x88, 0x96,
+    0x90, 0x4c, 0x8f, 0x86, 0x7c, 0x8c, 0x4e, 0x5d, 0x90, 0x3b, 0x95, 0x65,
+    0x8d, 0x7c, 0x70, 0x7a, 0x83, 0x84, 0x73, 0x85, 0x8a, 0x58, 0x5a, 0x56,
+    0x91, 0x5c, 0x7b, 0x89, 0xc8, 0x58, 0x87, 0x83, 0x91, 0x75, 0x44, 0x70,
+    0x8b, 0x9d, 0x7f, 0x73, 0x79, 0x61, 0x5e, 0x82, 0x87, 0xdf, 0x8d, 0x7d,
+    0x6f, 0x77, 0x79, 0x71, 0x73, 0x74, 0x59, 0x6b, 0x71, 0x75, 0x79, 0x71,
+    0x74, 0x70, 0x6d, 0x56, 0x6d, 0x73, 0x55, 0x73, 0x54, 0x70, 0x77, 0x77,
+    0x79, 0x6c, 0x77, 0x73, 0x6d, 0x6d, 0x7b, 0x68, 0x63, 0x75, 0x6c, 0x66,
+    0x72, 0x77, 0x72, 0x7a, 0x6c, 0x6e, 0x74, 0x75, 0x71, 0x73, 0x7a, 0x77,
+    0x73, 0x74, 0x6e, 0x7a, 0x65, 0x7d, 0x71, 0x79, 0x71, 0x64, 0x7b, 0x57,
+    0x63, 0x74, 0x67, 0x86, 0x81, 0x77, 0x69, 0x75, 0x8b, 0x82, 0xa1, 0x4b,
+    0x5c, 0x96, 0x59, 0x7b, 0x79, 0x67, 0x72, 0x6e, 0x6e, 0x8b, 0x75, 0x77,
+    0x96, 0x4f, 0x85, 0x6d, 0x68, 0x6b, 0x55, 0x61, 0x2f, 0x75, 0x75, 0x8a,
+    0x7c, 0x6f, 0x5f, 0x83, 0x92, 0x74, 0x7c, 0x58, 0x2c, 0x6e, 0x80, 0x74,
+    0x79, 0x82, 0x82, 0x87, 0x86, 0x7a, 0x68, 0x6b, 0x5e, 0x66, 0x82, 0x5b,
+    0x73, 0x6f, 0x72, 0x70, 0x70, 0x75, 0x75, 0x72, 0x71, 0x70, 0x70, 0x6f,
+    0x72, 0x70, 0x70, 0x6b, 0x4a, 0x74, 0x35, 0x72, 0x71, 0x70, 0x6e, 0x74,
+    0x77, 0x6d, 0x73, 0x72, 0x70, 0x72, 0x72, 0x72, 0x72, 0x72, 0x6b, 0x73,
+    0x6f, 0x75, 0x74, 0x72, 0x70, 0x72, 0x71, 0x6e, 0x73, 0x71, 0x71, 0x73,
+    0x73, 0x74, 0x72, 0x6f, 0x74, 0x72, 0x72, 0x70, 0x6e, 0x6f, 0x70, 0x72,
+    0x72, 0x7c, 0x77, 0x81, 0x7b, 0x89, 0x57, 0x82, 0x7b, 0x94, 0x99, 0x7f,
+    0x76, 0x8c, 0x78, 0x77, 0x5d, 0x86, 0x79, 0x7f, 0x60, 0x6b, 0x98, 0x5c,
+    0x59, 0x66, 0x75, 0x69, 0x84, 0x5d, 0x73, 0x9a, 0x89, 0x91, 0x80, 0x78,
+    0x7f, 0x78, 0x8a, 0x8a, 0xbf, 0x73, 0x75, 0x88, 0x70, 0x81, 0x8d, 0x61,
+    0x6f, 0x84, 0x7f, 0x5e, 0x7e, 0x59, 0x59, 0x8c, 0x70, 0xdd, 0x7b, 0x7e,
+    0x65, 0x53, 0x6c, 0x71, 0x73, 0x6d, 0x89, 0x75, 0x53, 0x78, 0x4a, 0x76,
+    0x4a, 0x54, 0x8f, 0xaa, 0x8f, 0x9f, 0x49, 0x4a, 0x6f, 0x8d, 0x4a, 0x6f,
+    0x59, 0x86, 0x94, 0x8a, 0x9f, 0x9f, 0x51, 0x7e, 0x8d, 0x48, 0x3a, 0x6a,
+    0x67, 0x69, 0x8f, 0x4e, 0x7a, 0x71, 0x65, 0x89, 0x92, 0x70, 0x63, 0x5e,
+    0x6d, 0x7c, 0x8b, 0x66, 0x94, 0x5f, 0x62, 0x95, 0xa3, 0xa3, 0x15, 0x9c,
+    0x7f, 0x8e, 0x7b, 0x7d, 0x6e, 0x7e, 0x90, 0x77, 0x65, 0x6f, 0x7d, 0x73,
+    0x66, 0x96, 0x80, 0x7d, 0x7f, 0x72, 0x87, 0x68, 0x7f, 0x90, 0x88, 0x64,
+    0x77, 0x71, 0x5e, 0x88, 0x6a, 0x7f, 0x68, 0x7c, 0x72, 0x84, 0x83, 0x78,
+    0x78, 0x86, 0x5f, 0x81, 0x97, 0x7f, 0x75, 0x71, 0x8f, 0x60, 0x99, 0x6f,
+    0x80, 0x4d, 0x73, 0x71, 0x6e, 0x5e, 0x8e, 0x86, 0x77, 0x8f, 0x8a, 0x7f,
+    0x78, 0x74, 0x82, 0x7a, 0x79, 0x71, 0x76, 0x72, 0x5d, 0x54, 0x4e, 0x6a,
+    0x7d, 0x6a, 0x41, 0x7e, 0x74, 0x75, 0x71, 0x74, 0x6e, 0x73, 0x67, 0x36,
+    0x70, 0x75, 0x68, 0x6f, 0x75, 0x77, 0x73, 0x70, 0x6b, 0x70, 0x7c, 0x6e,
+    0x71, 0x81, 0x6f, 0x70, 0x87, 0x76, 0x75, 0x6d, 0x30, 0x73, 0x5f, 0x61,
+    0x7e, 0x75, 0x6d, 0x70, 0x77, 0x76, 0x7b, 0x70, 0x7c, 0x81, 0x62, 0x6e,
+    0x66, 0xac, 0x9a, 0x77, 0x8d, 0x66, 0x61, 0x8a, 0x8f, 0x78, 0x75, 0x80,
+    0x8f, 0x7b, 0x96, 0x92, 0xa5, 0x76, 0x3f, 0x77, 0x77, 0x99, 0xc9, 0x70,
+    0x7a, 0x8d, 0x83, 0x61, 0xa1, 0x7b, 0x70, 0x76, 0x91, 0x57, 0x7e, 0x8b,
+    0x9a, 0x85, 0x8e, 0x68, 0xd9, 0x9d, 0x8c, 0x7b, 0x72, 0x6d, 0x80, 0x7e,
+    0x67, 0xb8, 0x5d, 0x7e, 0x85, 0x5a, 0x64, 0x78, 0x90, 0xd9, 0x65, 0x63,
+    0x56, 0x3d, 0x81, 0x7c, 0x7a, 0x7e, 0x7a, 0x6f, 0x7f, 0x8c, 0x7e, 0x94,
+    0x79, 0x8a, 0x60, 0x83, 0x74, 0x77, 0x6f, 0x82, 0x7e, 0x77, 0x78, 0x76,
+    0x81, 0x71, 0x75, 0x5f, 0x79, 0x71, 0x6b, 0x7f, 0x6c, 0x72, 0x76, 0x8a,
+    0x7c, 0x80, 0x87, 0x84, 0x97, 0x6f, 0x7f, 0x75, 0x7b, 0x7d, 0x7f, 0x81,
+    0x82, 0x73, 0x70, 0x70, 0x76, 0x83, 0x6f, 0x7b, 0x6c, 0x91, 0x86, 0x7d,
+    0x6c, 0x81, 0x7c, 0x77, 0x93, 0x42, 0x8e, 0x6e, 0x7a, 0x83, 0x90, 0x7a,
+    0x74, 0x8f, 0x4c, 0x64, 0x6e, 0x62, 0x76, 0x5d, 0x77, 0x68, 0xa6, 0x57,
+    0x56, 0x81, 0x63, 0x5f, 0x7d, 0x84, 0x5c, 0x9c, 0x7a, 0x77, 0x95, 0x78,
+    0x9f, 0x94, 0x7a, 0x67, 0xc9, 0x85, 0x89, 0x56, 0x6f, 0x6a, 0xad, 0x7d,
+    0x73, 0x50, 0x76, 0x83, 0x85, 0x56, 0x91, 0x86, 0x76, 0xcb, 0x68, 0x94,
+    0x72, 0x79, 0x7c, 0x8d, 0x98, 0x52, 0x80, 0x71, 0x56, 0x73, 0x89, 0x77,
+    0x81, 0x84, 0x88, 0x6e, 0x8c, 0x85, 0x84, 0x72, 0x70, 0x75, 0x83, 0x7b,
+    0x7d, 0x75, 0x81, 0x6d, 0x73, 0x95, 0x69, 0x85, 0x6c, 0x7b, 0x7d, 0x78,
+    0x4f, 0x83, 0x86, 0x7e, 0xb1, 0x57, 0x7d, 0x74, 0x8e, 0x7c, 0x90, 0x7c,
+    0x58, 0x4b, 0x74, 0x71, 0x79, 0x4c, 0x7b, 0x7d, 0x77, 0xa8, 0x7f, 0x6a,
+    0x75, 0x7b, 0x73, 0x7e, 0x6d, 0x7e, 0x79, 0x72, 0x76, 0x7c, 0x78, 0x73,
+    0x5e, 0x69, 0x6d, 0x7a, 0x73, 0x77, 0x73, 0x74, 0x6e, 0x6d, 0x72, 0x77,
+    0x71, 0x71, 0x68, 0x6f, 0x72, 0x70, 0x74, 0x6d, 0x70, 0x73, 0x80, 0x77,
+    0x76, 0x75, 0x72, 0x73, 0x86, 0x6b, 0x75, 0x75, 0x46, 0x73, 0x3a, 0x70,
+    0x77, 0x7b, 0x72, 0x6d, 0x6f, 0x6a, 0x71, 0x7b, 0x79, 0x83, 0x81, 0x76,
+    0x4b, 0x69, 0x72, 0x80, 0x8c, 0x68, 0x7e, 0x7b, 0x7e, 0x6f, 0x79, 0x81,
+    0x7e, 0x79, 0x66, 0x74, 0x59, 0x75, 0x7b, 0x77, 0x78, 0x74, 0x76, 0x70,
+    0x5e, 0x85, 0x84, 0x7d, 0x73, 0x7c, 0x70, 0x8d, 0x59, 0x82, 0x7a, 0x79,
+    0x86, 0x6b, 0x41, 0x7c, 0x92, 0x85, 0x7d, 0x6f, 0x8b, 0x7e, 0x94, 0x7c,
+    0x74, 0x6e, 0x6d, 0x77, 0x78, 0x8a, 0x7c, 0x70, 0x68, 0x8a, 0x6d, 0x7c,
+    0x7a, 0x64, 0x6f, 0x8b, 0x7a, 0x5d, 0x72, 0x69, 0x77, 0x75, 0x7d, 0x51,
+    0x65, 0x75, 0x4f, 0x7a, 0x6e, 0x7b, 0x74, 0x7f, 0x78, 0x7d, 0x74, 0x79,
+    0x77, 0x67, 0x56, 0x58, 0x72, 0x63, 0x7d, 0x77, 0x68, 0x68, 0x7f, 0x68,
+    0x7c, 0x7b, 0x5d, 0x60, 0x92, 0x78, 0x71, 0x68, 0x25, 0x7e, 0x80, 0x6d,
+    0x77, 0x6c, 0x6b, 0x7f, 0x76, 0x4f, 0x7c, 0x72, 0x70, 0x83, 0x79, 0x6b,
+    0x67, 0x6d, 0xaa, 0x91, 0x6d, 0x54, 0x62, 0x51, 0x68, 0xa7, 0x83, 0x62,
+    0x8b, 0x76, 0x4c, 0x5f, 0x66, 0x56, 0x6a, 0x85, 0x80, 0x94, 0xab, 0x57,
+    0x86, 0x6c, 0x59, 0x53, 0x61, 0x89, 0x7b, 0x95, 0x6b, 0xa5, 0x5f, 0x8f,
+    0x97, 0xa7, 0x82, 0x84, 0xc4, 0x80, 0x91, 0x53, 0x71, 0x75, 0x75, 0x78,
+    0x7f, 0x4a, 0x73, 0x7e, 0x70, 0x6d, 0xaa, 0x7f, 0x67, 0xc9, 0x85, 0x75,
+    0x75, 0x73, 0x87, 0x71, 0x62, 0x5e, 0x75, 0x77, 0x7a, 0x83, 0x73, 0x56,
+    0x6f, 0x77, 0x7c, 0x78, 0x5a, 0x6e, 0x74, 0x79, 0x7d, 0x71, 0x80, 0x7c,
+    0x76, 0x79, 0x7c, 0x7c, 0x64, 0x6f, 0x75, 0x74, 0x71, 0x7a, 0x7a, 0x63,
+    0x72, 0x80, 0x6b, 0x76, 0x87, 0x74, 0x71, 0x6f, 0x73, 0x56, 0x76, 0x6d,
+    0x82, 0x7e, 0x70, 0x6c, 0x74, 0x6b, 0x79, 0x75, 0x63, 0x73, 0x73, 0x73,
+    0x68, 0x71, 0x79, 0x24, 0x8f, 0x56, 0x93, 0x6c, 0x6b, 0x7a, 0x79, 0x57,
+    0x7c, 0x76, 0x7d, 0x84, 0x82, 0x6a, 0x75, 0x84, 0x71, 0x8b, 0x95, 0x65,
+    0x68, 0x76, 0x77, 0x8f, 0x77, 0x79, 0x73, 0x58, 0x7c, 0x84, 0x75, 0x67,
+    0x77, 0x74, 0x81, 0x7b, 0x90, 0x61, 0x8f, 0x80, 0x96, 0x6e, 0x92, 0x6e,
+    0x6c, 0x53, 0x6a, 0x78, 0x89, 0x57, 0x5c, 0x97, 0x65, 0x8e, 0x86, 0x69,
+    0x79, 0x67, 0x71, 0x78, 0x78, 0x6a, 0x75, 0x72, 0x6e, 0x72, 0x77, 0x70,
+    0x70, 0x78, 0x77, 0x75, 0x75, 0x72, 0x74, 0x77, 0x73, 0x74, 0x72, 0x71,
+    0x70, 0x75, 0x75, 0x75, 0x73, 0x70, 0x72, 0x76, 0x6d, 0x79, 0x77, 0x75,
+    0x75, 0x7f, 0x72, 0x6f, 0x7b, 0x75, 0x75, 0x78, 0x75, 0x6b, 0x77, 0x79,
+    0x78, 0x77, 0x74, 0x72, 0x75, 0x6e, 0x79, 0x6e, 0x74, 0x75, 0x73, 0x71,
+    0x69, 0x73, 0x6f, 0x76, 0x7a, 0x6e, 0x5b, 0x73, 0x7d, 0x6d, 0x80, 0x78,
+    0x57, 0x7b, 0x76, 0x68, 0x78, 0x6c, 0x7a, 0x71, 0x79, 0x73, 0x7b, 0x75,
+    0x57, 0x71, 0x75, 0x78, 0x77, 0x74, 0x73, 0x6e, 0x7e, 0x6a, 0x73, 0x5e,
+    0x68, 0x26, 0x7c, 0x69, 0x86, 0x75, 0x73, 0x80, 0x53, 0x6c, 0x5d, 0x81,
+    0x6c, 0x6f, 0x7b, 0x75, 0x75, 0x6e, 0x57, 0x73, 0x6a, 0x74, 0x70, 0x6e,
+    0x78, 0xa5, 0x95, 0x75, 0x96, 0x84, 0x73, 0x80, 0x80, 0x7b, 0x77, 0x88,
+    0x87, 0x67, 0x7b, 0x66, 0x64, 0xa6, 0x7e, 0x80, 0x7b, 0x86, 0xc9, 0x6f,
+    0xb1, 0x75, 0x86, 0x56, 0x88, 0x66, 0x7a, 0x9a, 0x93, 0x58, 0x6f, 0x7f,
+    0x70, 0x6f, 0x6f, 0x74, 0xcf, 0x7f, 0x8f, 0x63, 0x98, 0x66, 0x73, 0x80,
+    0x73, 0x69, 0x82, 0x63, 0x86, 0x61, 0x6c, 0x79, 0x8c, 0x77, 0x96, 0x73,
+    0x5e, 0x7d, 0x71, 0x7f, 0x74, 0x61, 0x7e, 0x6c, 0x59, 0x76, 0x73, 0x7c,
+    0x68, 0x6a, 0x99, 0x63, 0x77, 0x77, 0x78, 0x67, 0x76, 0x89, 0x65, 0x5f,
+    0x84, 0x7f, 0x6b, 0x83, 0x6c, 0x83, 0x76, 0x87, 0x72, 0x6d, 0x7d, 0x7c,
+    0x80, 0x7b, 0x82, 0x63, 0x95, 0x66, 0x78, 0x6f, 0x88, 0x79, 0x92, 0x6a,
+    0x57, 0x6a, 0x78, 0x6d, 0x72, 0x71, 0x76, 0x79, 0x72, 0x6c, 0x84, 0x68,
+    0x80, 0x75, 0x51, 0x6e, 0x83, 0x6c, 0x68, 0x7b, 0x78, 0x9e, 0x7d, 0x60,
+    0x92, 0x6b, 0x73, 0x82, 0x83, 0x79, 0x74, 0x70, 0x70, 0x6f, 0x95, 0x64,
+    0x76, 0x76, 0x72, 0x64, 0x73, 0x7e, 0x88, 0x8c, 0x71, 0x7f, 0x6c, 0x64,
+    0x7d, 0x6e, 0x7a, 0x74, 0xb7, 0x71, 0x84, 0x6d, 0x7f, 0x6e, 0x70, 0x79,
+    0x70, 0x78, 0x88, 0x75, 0x83, 0x45, 0x6d, 0x70, 0x61, 0xc7, 0x74, 0x63,
+    0x88, 0x68, 0x5f, 0x78, 0x6c, 0x54, 0x64, 0x7e, 0x6e, 0x75, 0x64, 0x8b,
+    0x7a, 0x7a, 0x70, 0x83, 0x8b, 0x87, 0x44, 0x79, 0x7b, 0x56, 0x9f, 0x61,
+    0x5e, 0x8c, 0x7d, 0x93, 0x7f, 0x82, 0x7c, 0x95, 0x8e, 0x7b, 0x70, 0x51,
+    0x5f, 0x90, 0x84, 0x81, 0xbe, 0x79, 0x91, 0x85, 0x82, 0x73, 0x5e, 0x6a,
+    0x61, 0x96, 0x75, 0x7f, 0x7f, 0x5e, 0x67, 0x7b, 0x7e, 0xc4, 0x96, 0x6d,
+    0x8d, 0x62, 0x6f, 0x73, 0x89, 0x69, 0x82, 0x86, 0x75, 0x68, 0x99, 0x81,
+    0x93, 0x64, 0x6c, 0x90, 0x8e, 0x8d, 0x67, 0x7c, 0x5c, 0x89, 0x7c, 0x81,
+    0x61, 0x7c, 0x77, 0x64, 0x7b, 0x77, 0x60, 0x89, 0x8b, 0x66, 0x65, 0x6b,
+    0x63, 0x8f, 0x90, 0x6f, 0xd1, 0x62, 0x90, 0x9e, 0xab, 0x6d, 0x79, 0x5e,
+    0x79, 0x52, 0x7b, 0x72, 0xa7, 0x64, 0x6c, 0x74, 0x84, 0x85, 0x69, 0x8d,
+    0x71, 0x76, 0x50, 0x75, 0x79, 0x7b, 0x70, 0x74, 0x70, 0x63, 0x70, 0x72,
+    0x79, 0x78, 0x6e, 0x6f, 0x77, 0x75, 0x72, 0x6f, 0x72, 0x79, 0x75, 0x6c,
+    0x74, 0x70, 0x72, 0x6e, 0x75, 0x73, 0x71, 0x73, 0x73, 0x64, 0x6e, 0x79,
+    0x74, 0x5d, 0x76, 0x79, 0x81, 0x72, 0x74, 0x6f, 0x70, 0x75, 0x70, 0x74,
+    0x68, 0x6d, 0x75, 0x75, 0x73, 0x7c, 0x67, 0x76, 0x71, 0x7b, 0x7d, 0x75,
+    0x68, 0x56, 0x7f, 0x74, 0x7b, 0x64, 0x5e, 0x5a, 0x3d, 0x6a, 0x83, 0x6a,
+    0x56, 0x66, 0x65, 0x7d, 0x78, 0x71, 0x79, 0x7b, 0x72, 0x6a, 0x7d, 0x7d,
+    0x53, 0x7a, 0x65, 0x76, 0x6e, 0x73, 0x75, 0x7e, 0x6f, 0x6b, 0x5a, 0x6e,
+    0x8a, 0x7d, 0x6a, 0x64, 0x81, 0x71, 0x79, 0x63, 0x85, 0x6f, 0x68, 0x76,
+    0x82, 0x75, 0x78, 0x70, 0x69, 0x78, 0x71, 0x64, 0x88, 0x80, 0x81, 0x6b,
+    0x78, 0x74, 0x72, 0x7a, 0x6a, 0x72, 0x66, 0x73, 0x72, 0x71, 0x6c, 0x79,
+    0x73, 0x7e, 0x72, 0x75, 0x72, 0x5e, 0x1c, 0x74, 0x5a, 0x71, 0x77, 0x6d,
+    0x6f, 0x6b, 0x6e, 0x73, 0x6d, 0x74, 0x76, 0x7a, 0x71, 0x76, 0x6d, 0x70,
+    0x72, 0x74, 0x71, 0x7c, 0x82, 0x71, 0x74, 0x6f, 0x7a, 0x77, 0x73, 0x73,
+    0x78, 0x73, 0x6f, 0x79, 0x6c, 0x72, 0x73, 0x74, 0x6b, 0x77, 0x70, 0x78,
+    0x74, 0x71, 0x7e, 0x7d, 0x80, 0x70, 0x6e, 0x76, 0x77, 0x75, 0x6b, 0x73,
+    0x61, 0x70, 0x71, 0x74, 0x76, 0x74, 0x78, 0x6e, 0x5d, 0x76, 0x7a, 0x55,
+    0x6a, 0x74, 0x7d, 0x78, 0x72, 0x76, 0x6c, 0x7a, 0x71, 0x76, 0x75, 0x70,
+    0x6e, 0x78, 0x76, 0x6c, 0x78, 0x7e, 0x81, 0x75, 0x7f, 0x74, 0x2e, 0x82,
+    0x7b, 0x77, 0x77, 0x6c, 0x6d, 0x74, 0x6f, 0x79, 0x72, 0x75, 0x70, 0x7a,
+    0x71, 0x80, 0x77, 0x80, 0xbf, 0x99, 0x70, 0x63, 0x7e, 0x85, 0x7e, 0x6f,
+    0x7d, 0x98, 0x98, 0x4a, 0x53, 0x60, 0x59, 0x67, 0x89, 0x81, 0x92, 0x5c,
+    0xa0, 0x75, 0x67, 0x45, 0x70, 0x4e, 0x7e, 0x94, 0x5d, 0x76, 0xa3, 0x8f,
+    0x74, 0x9f, 0x70, 0x75, 0xd3, 0x91, 0x6c, 0x9b, 0x6a, 0x7a, 0x72, 0x87,
+    0x5f, 0x71, 0x87, 0x99, 0x93, 0x5b, 0x95, 0x82, 0x69, 0xe5, 0x88, 0x50,
+    0x79, 0x60, 0x69, 0x8a, 0x51, 0x6f, 0x6f, 0x74, 0x7b, 0x75, 0x82, 0x47,
+    0x79, 0x74, 0x4e, 0x77, 0x70, 0x6f, 0x6a, 0x82, 0x6d, 0x6b, 0x64, 0x68,
+    0x71, 0x6c, 0x68, 0x62, 0x6e, 0x79, 0x78, 0x66, 0x4d, 0x74, 0x7c, 0x84,
+    0x76, 0x72, 0x68, 0x6f, 0x8e, 0x88, 0x68, 0x5f, 0x14, 0x81, 0x80, 0x51,
+    0x75, 0x7d, 0x6c, 0x7c, 0x73, 0x5f, 0x74, 0x51, 0x8e, 0x71, 0x7a, 0x5d,
+    0x6f, 0x6d, 0x71, 0x88, 0x6e, 0x5e, 0x74, 0x5f, 0x86, 0x6c, 0x74, 0x72,
+    0x86, 0x6b, 0x83, 0x62, 0x62, 0x77, 0x6c, 0x66, 0x80, 0x50, 0x8a, 0x7f,
+    0x9c, 0x90, 0x97, 0x57, 0x7d, 0x82, 0x7a, 0xa0, 0x53, 0x77, 0x6d, 0x77,
+    0x9e, 0x93, 0x87, 0x88, 0xd1, 0x8b, 0x75, 0x6b, 0x4a, 0x83, 0x71, 0x6b,
+    0x73, 0x64, 0x77, 0x92, 0x91, 0x61, 0x5a, 0x87, 0x7d, 0x77, 0x62, 0x8f,
+    0x7b, 0x65, 0x6a, 0x79, 0x77, 0x6b, 0x77, 0x85, 0x53, 0x6f, 0x57, 0x8d,
+    0x95, 0x49, 0x8e, 0x88, 0x77, 0x86, 0x73, 0x81, 0x84, 0x94, 0x61, 0x52,
+    0x70, 0x8d, 0x7f, 0x95, 0x76, 0x8d, 0x7d, 0xa0, 0x93, 0x79, 0x79, 0x62,
+    0x80, 0x92, 0x93, 0x6a, 0xce, 0x5e, 0x8a, 0x9f, 0x56, 0x77, 0x7e, 0x64,
+    0x84, 0x66, 0x80, 0x8d, 0x93, 0x6b, 0x70, 0x8d, 0x86, 0x73, 0x67, 0x8f,
+    0x79, 0x65, 0x84, 0x89, 0x59, 0x48, 0x7a, 0x72, 0x89, 0x7b, 0x79, 0x83,
+    0x6c, 0x74, 0x51, 0x8b, 0x74, 0x77, 0x72, 0x7f, 0x7f, 0x5e, 0x82, 0x79,
+    0x7c, 0x72, 0x61, 0x75, 0x71, 0x7a, 0x75, 0x76, 0x78, 0x77, 0x8d, 0x72,
+    0x6f, 0x6e, 0x49, 0x7d, 0x9f, 0x6a, 0x6a, 0x6c, 0x88, 0x5a, 0x85, 0x7b,
+    0x6b, 0x6f, 0x74, 0x78, 0x78, 0x6b, 0x76, 0x78, 0x86, 0x89, 0x90, 0x87,
+    0x67, 0x88, 0xa5, 0x7e, 0x8d, 0x5b, 0x79, 0x6d, 0x7c, 0x6d, 0x9b, 0x3f,
+    0x64, 0x7f, 0x46, 0x79, 0x61, 0x8b, 0x7c, 0x60, 0x93, 0x68, 0xa2, 0x73,
+    0x5d, 0x83, 0x60, 0x5c, 0x7a, 0x81, 0x6d, 0xa1, 0x8c, 0x9d, 0x90, 0x7c,
+    0x82, 0xa6, 0x6f, 0x64, 0xd2, 0x8f, 0x91, 0x68, 0x70, 0x82, 0x72, 0x84,
+    0x86, 0x64, 0x70, 0x67, 0x87, 0x56, 0x85, 0x6b, 0x91, 0x78, 0x95, 0x8b,
+    0x77, 0x75, 0x83, 0x7c, 0x72, 0x73, 0x79, 0x72, 0x54, 0x4c, 0x4e, 0x6e,
+    0x77, 0x66, 0x43, 0x79, 0x75, 0x77, 0x72, 0x76, 0x6e, 0x72, 0x63, 0x3b,
+    0x71, 0x73, 0x6a, 0x74, 0x72, 0x75, 0x71, 0x6b, 0x6d, 0x77, 0x7d, 0x6d,
+    0x72, 0x81, 0x71, 0x74, 0x80, 0x73, 0x72, 0x6f, 0x38, 0x6c, 0x4d, 0x6d,
+    0x7d, 0x73, 0x6c, 0x70, 0x73, 0x6f, 0x7f, 0x73, 0x79, 0x7d, 0x6b, 0x74,
+    0x7d, 0x6d, 0x55, 0x76, 0x8b, 0x74, 0x81, 0x84, 0x6c, 0x95, 0x7e, 0x74,
+    0x94, 0x79, 0x77, 0x97, 0x89, 0x6f, 0x72, 0x7e, 0x6e, 0xa2, 0x96, 0x54,
+    0x95, 0x85, 0x78, 0x71, 0x74, 0x61, 0x7f, 0x87, 0x74, 0x71, 0x68, 0x83,
+    0x7d, 0x81, 0x7a, 0x85, 0xc0, 0x73, 0x7c, 0x73, 0x6e, 0x6d, 0x8f, 0x84,
+    0x6c, 0x8d, 0x77, 0x7b, 0x78, 0x4b, 0x6b, 0x6f, 0x7f, 0xd5, 0x84, 0x51,
+    0x7d, 0x6d, 0x68, 0x88, 0x4b, 0x68, 0x78, 0x73, 0x64, 0x73, 0x4d, 0x82,
+    0x6c, 0x25, 0x77, 0x62, 0x76, 0x6e, 0x84, 0x38, 0x6c, 0x3f, 0x5c, 0x6c,
+    0x72, 0x7d, 0x72, 0x72, 0x71, 0x71, 0x57, 0x5d, 0x3d, 0x53, 0x7f, 0x40,
+    0x76, 0x73, 0x67, 0x4f, 0x68, 0x77, 0x31, 0x74, 0x63, 0x64, 0x72, 0x71,
+    0x75, 0x76, 0x74, 0x60, 0x7f, 0x70, 0x61, 0x6e, 0x74, 0x6e, 0x71, 0x6a,
+    0x4b, 0x4d, 0x7a, 0xa6, 0x82, 0x52, 0x72, 0x8c, 0x5a, 0x61, 0x82, 0x83,
+    0x74, 0x78, 0x8b, 0x7f, 0x97, 0x7f, 0x80, 0x7b, 0x8d, 0x73, 0x8a, 0x72,
+    0x74, 0x6d, 0x82, 0x69, 0x79, 0x91, 0x6e, 0x7c, 0x78, 0x7f, 0x7c, 0x7c,
+    0x83, 0x75, 0x75, 0x67, 0xad, 0x3f, 0x6c, 0x72, 0x8b, 0x6f, 0x8d, 0x63,
+    0x60, 0x36, 0x68, 0x6f, 0x7f, 0x60, 0xa4, 0x98, 0x68, 0x9d, 0x7e, 0x75,
+    0x72, 0x6e, 0x5c, 0x78, 0x83, 0x80, 0x75, 0x67, 0x89, 0x8c, 0x70, 0x6f,
+    0x5c, 0x7b, 0x4e, 0x6d, 0x86, 0x74, 0x54, 0x82, 0x7f, 0x7d, 0xaf, 0x6c,
+    0x7b, 0x73, 0x6f, 0x8a, 0x76, 0x82, 0x7a, 0x89, 0x61, 0x8c, 0x7f, 0x7b,
+    0x74, 0x9d, 0x7a, 0x83, 0xce, 0x9d, 0x97, 0x76, 0x70, 0x7c, 0x72, 0x8b,
+    0x80, 0x50, 0x83, 0x8f, 0x87, 0x5a, 0xb0, 0x6f, 0x61, 0xb9, 0x89, 0x8b,
+    0x52, 0x5e, 0xb5, 0x7a, 0x91, 0xb9, 0x80, 0x73, 0x7c, 0xb1, 0x90, 0x64,
+    0x63, 0x64, 0x75, 0x93, 0x70, 0x8e, 0x96, 0x67, 0x74, 0x6b, 0xb6, 0x5e,
+    0x75, 0x7c, 0x6f, 0x4e, 0x94, 0x60, 0x7a, 0x8b, 0x74, 0x7a, 0x95, 0x7f,
+    0xa5, 0x82, 0x87, 0x6c, 0xd3, 0x85, 0x88, 0x55, 0x92, 0x83, 0x34, 0x7d,
+    0x75, 0x6a, 0x7a, 0x98, 0x83, 0x5e, 0x67, 0x73, 0x9a, 0x73, 0x9f, 0x73,
+    0x4d, 0x72, 0x71, 0x8f, 0x99, 0x77, 0x79, 0x6e, 0x9b, 0xa1, 0x87, 0x5a,
+    0x8d, 0xaa, 0x60, 0x7c, 0x4c, 0x4c, 0x63, 0x71, 0x8b, 0x90, 0xb1, 0x72,
+    0x8e, 0x6e, 0x63, 0x58, 0x76, 0x45, 0x76, 0x85, 0x5f, 0x88, 0x67, 0x63,
+    0x85, 0x5a, 0x74, 0x82, 0xcf, 0x93, 0x87, 0x7d, 0x70, 0x87, 0x72, 0x7e,
+    0x82, 0x54, 0x6f, 0x87, 0x7f, 0x55, 0x88, 0x75, 0x5a, 0x80, 0x8e, 0x5f,
+    0x76, 0x75, 0x76, 0x76, 0x76, 0x6f, 0x74, 0x73, 0x6f, 0x76, 0x75, 0x75,
+    0x7c, 0x6c, 0x75, 0x71, 0x69, 0x7a, 0x6a, 0x6f, 0x74, 0x73, 0x69, 0x74,
+    0x72, 0x74, 0x75, 0x75, 0x6d, 0x78, 0x6f, 0x70, 0x72, 0x76, 0x6c, 0x71,
+    0x71, 0x78, 0x6e, 0x73, 0x72, 0x72, 0x74, 0x6e, 0x72, 0x6e, 0x74, 0x74,
+    0x6c, 0x70, 0x74, 0x73, 0x70, 0x71, 0x77, 0x74, 0x6c, 0x6d, 0x79, 0x79,
+    0x64, 0x72, 0x73, 0x68, 0x56, 0x75, 0x71, 0x74, 0x7c, 0x74, 0x6d, 0x62,
+    0x61, 0x64, 0x7c, 0x71, 0x68, 0x7a, 0x83, 0x7f, 0x81, 0x77, 0x71, 0x6b,
+    0x73, 0x72, 0x6e, 0x75, 0x79, 0x6e, 0x7c, 0x69, 0x63, 0x73, 0x77, 0x80,
+    0x73, 0x75, 0x72, 0x63, 0x45, 0x7e, 0x7f, 0x72, 0x75, 0x78, 0x6e, 0x73,
+    0x58, 0x69, 0x67, 0x7d, 0x6a, 0x8b, 0x77, 0x71, 0x74, 0x7a, 0x6e, 0x5b,
+    0x74, 0x6d, 0x69, 0x8d, 0x6e, 0x5f, 0x75, 0x71, 0x54, 0x68, 0x48, 0x67,
+    0x53, 0x78, 0x77, 0x77, 0x76, 0x77, 0x7a, 0x79, 0x77, 0x6c, 0x73, 0x4b,
+    0x78, 0x76, 0x7a, 0x75, 0x7e, 0x84, 0x6d, 0x7e, 0x67, 0x82, 0x80, 0x77,
+    0x6e, 0x80, 0x7d, 0x76, 0x99, 0x6e, 0x76, 0x6e, 0x49, 0x72, 0x7e, 0x5f,
+    0x71, 0x72, 0x75, 0x7b, 0x78, 0x61, 0x75, 0x6b, 0x6d, 0x88, 0x6f, 0x67,
+    0x82, 0x72, 0xa5, 0x74, 0x96, 0x7d, 0x7c, 0x80, 0x82, 0x71, 0x8a, 0x5f,
+    0x74, 0x5d, 0x70, 0x86, 0x6f, 0x6b, 0x60, 0x71, 0x64, 0x82, 0xaf, 0x74,
+    0x56, 0x8d, 0x65, 0x67, 0x7a, 0x70, 0x68, 0x9e, 0x81, 0x7d, 0x8e, 0x63,
+    0x8b, 0x7d, 0xa2, 0x75, 0xbe, 0x5b, 0x87, 0x55, 0x0e, 0x7a, 0x72, 0x84,
+    0x58, 0x83, 0x79, 0x94, 0x7b, 0x5e, 0x87, 0x7d, 0x4e, 0xd9, 0x74, 0x7b,
+    0x75, 0x88, 0x97, 0x80, 0x88, 0x88, 0x85, 0x61, 0x82, 0x99, 0x84, 0x63,
+    0x7b, 0x74, 0x47, 0x6a, 0x7f, 0x67, 0x44, 0x75, 0x8e, 0x8c, 0xbe, 0x67,
+    0x7d, 0x9b, 0x72, 0x3b, 0x86, 0x67, 0x80, 0xad, 0x7c, 0x97, 0xa2, 0x8b,
+    0x93, 0x91, 0x7f, 0x7e, 0xc9, 0x93, 0x89, 0x69, 0x66, 0x7c, 0x2f, 0x75,
+    0x74, 0x4b, 0x75, 0x84, 0x7a, 0x59, 0xab, 0x8a, 0x50, 0xd4, 0x7e, 0x77,
+    0x6b, 0x92, 0x86, 0x80, 0x82, 0x89, 0x6d, 0x81, 0x75, 0xac, 0x80, 0x6c,
+    0x55, 0x94, 0x46, 0x92, 0x98, 0x7e, 0x7d, 0x78, 0x6c, 0xa1, 0xa2, 0x68,
+    0x96, 0x76, 0x8d, 0x84, 0x80, 0x5e, 0x7d, 0xa3, 0xa4, 0x92, 0x3c, 0xab,
+    0xb0, 0x82, 0x86, 0x71, 0xd3, 0x98, 0x85, 0x6d, 0x73, 0x78, 0x73, 0x5e,
+    0x5c, 0x5d, 0x6b, 0x75, 0x84, 0x63, 0x7e, 0x8c, 0x5a, 0xda, 0x66, 0x5f,
+    0x85, 0x7b, 0x9c, 0x71, 0x6f, 0x9e, 0x42, 0x4e, 0x7e, 0x8a, 0x93, 0x2a,
+    0x83, 0x9b, 0x40, 0x34, 0x81, 0x38, 0x86, 0xb6, 0x84, 0x9a, 0xa5, 0x92,
+    0xa0, 0x51, 0x5f, 0x77, 0x5e, 0x34, 0x92, 0x4e, 0x2a, 0x7e, 0xa8, 0xa8,
+    0x92, 0x7e, 0x65, 0x7b, 0x81, 0x93, 0xa4, 0x39, 0x5b, 0x72, 0xab, 0x83,
+    0x52, 0x7f, 0x42, 0x81, 0x65, 0xa3, 0x7e, 0x79, 0x2d, 0x29, 0x96, 0x62,
+    0x74, 0x64, 0x79, 0x83, 0x77, 0x70, 0x72, 0x6b, 0x71, 0x75, 0x7c, 0x81,
+    0x86, 0x7c, 0x70, 0x78, 0x74, 0x79, 0x79, 0x7d, 0x7a, 0x63, 0x7f, 0x7b,
+    0x80, 0x7b, 0x7b, 0x61, 0x7b, 0x6f, 0x74, 0x7c, 0x77, 0x7a, 0x6c, 0x77,
+    0x75, 0x7f, 0x72, 0x7a, 0x88, 0x7a, 0x76, 0x72, 0x80, 0x77, 0x75, 0x86,
+    0x70, 0x79, 0x71, 0x70, 0x82, 0x7c, 0x6a, 0x76, 0x57, 0x83, 0x80, 0x80,
+    0x73, 0x70, 0x70, 0x7a, 0x74, 0x74, 0x7a, 0x73, 0x69, 0x6f, 0x68, 0x76,
+    0x74, 0x7a, 0x75, 0x87, 0x76, 0x70, 0x26, 0x69, 0x2e, 0x7b, 0x69, 0x76,
+    0x58, 0x71, 0x74, 0x7a, 0x73, 0x76, 0x6d, 0x7d, 0x79, 0x71, 0x66, 0x77,
+    0x69, 0x76, 0x72, 0x7d, 0x83, 0x6d, 0x6d, 0x76, 0x82, 0x6f, 0x74, 0x6b,
+    0x77, 0x73, 0x7a, 0x70, 0x72, 0x71, 0x71, 0x73, 0x75, 0x7e, 0x67, 0x78,
+    0x71, 0x80, 0x78, 0x74, 0x7b, 0x77, 0x54, 0x5e, 0x77, 0x72, 0x7b, 0x6a,
+    0x7e, 0x7a, 0x70, 0x42, 0x6c, 0x64, 0x64, 0x7c, 0x3d, 0x73, 0x7a, 0x78,
+    0x78, 0x67, 0x6b, 0x6d, 0x60, 0x6c, 0x80, 0x69, 0x5b, 0x77, 0x7b, 0x68,
+    0x78, 0x76, 0x6e, 0x82, 0x71, 0x7b, 0x7c, 0x75, 0x70, 0x7a, 0x7c, 0x76,
+    0x74, 0x7b, 0x61, 0x7c, 0x6f, 0x7a, 0x7a, 0x80, 0x6f, 0x56, 0x78, 0x52,
+    0x76, 0x78, 0x7c, 0x7c, 0x75, 0x7d, 0x78, 0x75, 0x72, 0x77, 0x64, 0x68,
+    0x74, 0x7e, 0x68, 0x78, 0x79, 0x74, 0x76, 0x6e, 0x77, 0x77, 0x7c, 0x52,
+    0x73, 0x7b, 0x7a, 0x71, 0x68, 0x7a, 0x74, 0x77, 0x75, 0x73, 0x79, 0x65,
+    0x6e, 0x6b, 0x73, 0x74, 0x86, 0x72, 0x7b, 0x6e, 0x7a, 0x6d, 0x65, 0x79,
+    0x78, 0x6a, 0x75, 0x74, 0x74, 0x75, 0x66, 0x75, 0x71, 0x7d, 0x77, 0x7d,
+    0x78, 0x76, 0x71, 0x76, 0x6e, 0x79, 0x70, 0x79, 0x72, 0x72, 0x72, 0x75,
+    0x71, 0x75, 0x77, 0x75, 0x6f, 0x76, 0x6c, 0x72, 0x71, 0x6e, 0x70, 0x72,
+    0x75, 0x73, 0x73, 0x76, 0x6a, 0x76, 0x72, 0x70, 0x71, 0x70, 0x78, 0x74,
+    0x70, 0x7a, 0x67, 0x75, 0x79, 0x67, 0x71, 0x71, 0x70, 0x74, 0x74, 0x75,
+    0x74, 0x70, 0x74, 0x6c, 0x70, 0x7c, 0x73, 0x77, 0x66, 0x6b, 0x6d, 0x74,
+    0x7a, 0x89, 0x6a, 0x86, 0x96, 0x43, 0x88, 0x71, 0x5b, 0x96, 0x8f, 0x77,
+    0x81, 0x6f, 0x7d, 0xa2, 0x79, 0x6c, 0x63, 0x6f, 0x6b, 0x75, 0x70, 0x7c,
+    0x78, 0x76, 0x70, 0x6c, 0x7e, 0x48, 0x5f, 0x96, 0x8f, 0x77, 0x57, 0x57,
+    0x5f, 0x9d, 0x94, 0x82, 0xc6, 0x8f, 0x6f, 0x7c, 0xbb, 0x81, 0x5f, 0x54,
+    0x6c, 0x59, 0x85, 0x89, 0x8d, 0x60, 0x57, 0x76, 0x97, 0x9e, 0x56, 0x8e,
+    0x7a, 0x7b, 0x72, 0x7e, 0x74, 0x79, 0x79, 0x73, 0x55, 0x75, 0x69, 0x75,
+    0x6f, 0x6c, 0x58, 0x77, 0x79, 0x79, 0x76, 0x74, 0x6c, 0x6e, 0x73, 0x5a,
+    0x6e, 0x78, 0x78, 0x67, 0x72, 0x75, 0x76, 0x70, 0x72, 0x78, 0x7a, 0x78,
+    0x73, 0x72, 0x6f, 0x6c, 0x85, 0x75, 0x72, 0x78, 0x5d, 0x74, 0x5f, 0x7b,
+    0x74, 0x71, 0x6f, 0x6e, 0x71, 0x6d, 0x5f, 0x7a, 0x7a, 0x7d, 0x77, 0x70,
+    0x59, 0x7f, 0x72, 0x77, 0x7d, 0x7d, 0x85, 0x71, 0x76, 0x81, 0x80, 0x64,
+    0x79, 0x99, 0x66, 0x77, 0x67, 0x7f, 0x8e, 0x71, 0x6d, 0x6a, 0xae, 0x7a,
+    0x70, 0x80, 0x7f, 0x8a, 0x7f, 0x58, 0x7f, 0x99, 0x78, 0xa4, 0x91, 0x75,
+    0x92, 0xa9, 0x81, 0x77, 0xc9, 0x95, 0x86, 0x73, 0x79, 0x7a, 0x72, 0x7c,
+    0x76, 0x79, 0x6f, 0x72, 0x8f, 0x59, 0xb2, 0x61, 0x81, 0xa9, 0x9a, 0x87,
+    0x78, 0x99, 0x7d, 0x73, 0x7a, 0x81, 0x71, 0x66, 0x99, 0x93, 0x87, 0x4b,
+    0x8e, 0x67, 0x54, 0x87, 0x4c, 0x7a, 0x91, 0x92, 0x92, 0x98, 0x88, 0x7b,
+    0x71, 0xbd, 0x57, 0x42, 0x7d, 0x4b, 0x8a, 0x9d, 0x90, 0x80, 0x9b, 0x5f,
+    0x94, 0xa2, 0x81, 0x74, 0xc8, 0x74, 0x75, 0x51, 0x6e, 0x8e, 0x72, 0x55,
+    0x7b, 0x47, 0x78, 0x76, 0x83, 0x61, 0x9e, 0x7d, 0x6d, 0xd9, 0x99, 0x70,
+    0x71, 0x7d, 0x76, 0x77, 0x87, 0x77, 0x4d, 0x56, 0x74, 0x6c, 0x79, 0x6a,
+    0x84, 0x7d, 0x71, 0x4a, 0x69, 0x5a, 0x66, 0x7e, 0x54, 0x6b, 0x7a, 0x7a,
+    0x77, 0x67, 0x61, 0x6a, 0x62, 0x6f, 0x84, 0x5b, 0x61, 0x7b, 0x7b, 0x79,
+    0x81, 0x77, 0x57, 0x82, 0x74, 0x7c, 0x7e, 0x70, 0x71, 0x84, 0x7b, 0x7c,
+    0x78, 0x7a, 0x5d, 0x83, 0x69, 0x78, 0x7d, 0x80, 0x66, 0x5a, 0x74, 0x51,
+    0x8e, 0x85, 0x9a, 0x7f, 0x70, 0x70, 0x80, 0x6c, 0x73, 0x74, 0x83, 0x78,
+    0x7f, 0x8d, 0x6d, 0x92, 0x79, 0x83, 0x57, 0x63, 0x5a, 0x53, 0xb6, 0x5f,
+    0x5c, 0x97, 0x89, 0x84, 0x76, 0x76, 0x68, 0x7b, 0x86, 0x82, 0x74, 0x45,
+    0x83, 0x81, 0x9f, 0x85, 0xc9, 0x93, 0x8a, 0x74, 0x6d, 0x79, 0x5a, 0x67,
+    0x6a, 0x9b, 0x7e, 0x99, 0x7d, 0x60, 0x7c, 0x7d, 0x50, 0xe0, 0x57, 0x94,
+    0x77, 0x74, 0x76, 0x77, 0x74, 0x70, 0x70, 0x71, 0x78, 0x6f, 0x74, 0x6e,
+    0x79, 0x79, 0x77, 0x78, 0x5d, 0x7b, 0x7e, 0x71, 0x75, 0x77, 0x73, 0x71,
+    0x69, 0x83, 0x79, 0x6e, 0x77, 0x70, 0x71, 0x72, 0x71, 0x77, 0x79, 0x73,
+    0x7c, 0x77, 0x78, 0x73, 0x7a, 0x76, 0x73, 0x77, 0x6f, 0x6e, 0x83, 0x6f,
+    0x78, 0x76, 0x77, 0x7d, 0x77, 0x75, 0x73, 0x73, 0x6f, 0x78, 0x7d, 0x73,
+    0x8b, 0x88, 0x8d, 0x57, 0x76, 0x7b, 0x4c, 0x8e, 0x6c, 0x67, 0x72, 0x56,
+    0x7d, 0x6d, 0x9c, 0x66, 0x3b, 0x7b, 0x8d, 0x5a, 0x9e, 0x8c, 0x62, 0x6c,
+    0x5e, 0x74, 0x7b, 0x49, 0x96, 0x55, 0x68, 0x72, 0x79, 0x88, 0x63, 0x7c,
+    0x9f, 0x85, 0x6e, 0x42, 0x81, 0x81, 0x86, 0x96, 0x63, 0x70, 0x88, 0x67,
+    0x2d, 0x88, 0x5c, 0x71, 0x58, 0x91, 0x6c, 0x4c, 0x4c, 0x78, 0x67, 0x68,
+    0x74, 0x71, 0x5a, 0x7d, 0x80, 0x71, 0x6d, 0x67, 0x57, 0x64, 0x74, 0x6b,
+    0x75, 0x76, 0x7d, 0x75, 0x79, 0x6e, 0x78, 0x6d, 0x7e, 0x78, 0x61, 0x67,
+    0x84, 0x72, 0x84, 0x76, 0x63, 0x6b, 0x71, 0x6e, 0x6c, 0x7d, 0x7b, 0x73,
+    0x80, 0x82, 0x7f, 0x71, 0x99, 0x6b, 0x77, 0x78, 0x78, 0x70, 0x80, 0x60,
+    0x6b, 0x72, 0x7a, 0x6f, 0x7b, 0x72, 0x7b, 0x70, 0x7e, 0x84, 0x63, 0x7a,
+    0x70, 0x70, 0x61, 0x7c, 0x78, 0x7c, 0x79, 0x71, 0x5d, 0x60, 0x7c, 0x76,
+    0x78, 0x69, 0x76, 0x6f, 0x7c, 0x7a, 0x73, 0x6f, 0x6c, 0x6e, 0x59, 0x6a,
+    0x77, 0x59, 0x74, 0x70, 0x81, 0x7c, 0x73, 0x79, 0x74, 0x65, 0x6e, 0x7a,
+    0x83, 0x6c, 0x75, 0x81, 0x88, 0x78, 0x7a, 0x74, 0x7d, 0x72, 0x57, 0x7c,
+    0x69, 0x63, 0x71, 0x78, 0x66, 0x7d, 0x6d, 0x71, 0x77, 0x6e, 0x75, 0x73,
+    0x9d, 0x46, 0x4f, 0xd1, 0x55, 0x33, 0xaf, 0x92, 0x52, 0x4b, 0x62, 0xbd,
+    0x3e, 0x71, 0x92, 0x95, 0xc4, 0x89, 0x2f, 0x5c, 0x3c, 0x5d, 0x67, 0x44,
+    0x4d, 0xa0, 0x97, 0xab, 0x67, 0x99, 0x53, 0x98, 0xe2, 0x49, 0x4b, 0x48,
+    0x2d, 0x5b, 0x9f, 0x4b, 0xb1, 0x5b, 0x38, 0xac, 0xc3, 0x4b, 0x65, 0x31,
+    0xa6, 0x1b, 0x70, 0x37, 0x78, 0x44, 0x1c, 0x8a, 0x8b, 0xb6, 0x20, 0xa7,
+    0x4f, 0x7a, 0x84, 0x76, 0x6c, 0x72, 0x67, 0x75, 0x7f, 0x84, 0x7b, 0x7a,
+    0x7a, 0x63, 0x7a, 0x76, 0x5c, 0x72, 0x6e, 0x76, 0x77, 0x7e, 0x7d, 0x82,
+    0x61, 0x6b, 0x67, 0x77, 0x64, 0x7b, 0x70, 0x7a, 0x74, 0x91, 0x8a, 0x87,
+    0x64, 0x80, 0x69, 0x73, 0x87, 0x6e, 0x7a, 0x6e, 0x7d, 0x7a, 0x6c, 0x69,
+    0x7d, 0x7f, 0x6c, 0x5c, 0x7d, 0x67, 0x74, 0x87, 0x78, 0x7d, 0x78, 0x6f,
+    0x6b, 0x83, 0x3d, 0x71, 0x71, 0x80, 0x76, 0x76, 0x78, 0x76, 0x7b, 0x6a,
+    0x5f, 0x6f, 0x76, 0x79, 0x70, 0x7b, 0x78, 0x76, 0x7d, 0x79, 0x7c, 0x7b,
+    0x6f, 0x74, 0x74, 0x69, 0x6c, 0x69, 0x6e, 0x87, 0x75, 0x64, 0x5a, 0x7d,
+    0x74, 0x66, 0x69, 0x7c, 0x86, 0x75, 0x75, 0x6d, 0x61, 0x7a, 0x74, 0x77,
+    0x6e, 0x78, 0x78, 0x75, 0x79, 0x76, 0x50, 0x7b, 0x6e, 0x79, 0x73, 0x7e,
+    0x71, 0x65, 0x68, 0x7b, 0x84, 0x7c, 0x76, 0x6c, 0x7a, 0x73, 0x7d, 0x66,
+    0x74, 0x78, 0x7c, 0x72, 0x6f, 0x66, 0x71, 0x8a, 0x81, 0x7b, 0x9b, 0x46,
+    0x79, 0x7e, 0x68, 0x71, 0x73, 0x6f, 0x7d, 0x95, 0x80, 0x8e, 0x67, 0x6b,
+    0x7e, 0x79, 0x88, 0x89, 0xc0, 0x89, 0x6f, 0x64, 0x8c, 0x7b, 0x81, 0x76,
+    0x79, 0x81, 0x85, 0x76, 0x7e, 0x49, 0x8e, 0x65, 0x7a, 0xc4, 0x73, 0x5a,
+    0x74, 0x74, 0x75, 0x73, 0x74, 0x73, 0x71, 0x75, 0x74, 0x73, 0x72, 0x76,
+    0x76, 0x73, 0x71, 0x74, 0x6f, 0x72, 0x71, 0x71, 0x73, 0x73, 0x6f, 0x74,
+    0x75, 0x75, 0x72, 0x7a, 0x70, 0x75, 0x70, 0x72, 0x71, 0x72, 0x72, 0x71,
+    0x70, 0x75, 0x73, 0x72, 0x78, 0x70, 0x71, 0x78, 0x74, 0x71, 0x78, 0x73,
+    0x72, 0x70, 0x74, 0x72, 0x71, 0x7a, 0x75, 0x72, 0x70, 0x71, 0x6f, 0x73,
+    0x86, 0x8a, 0x6f, 0x90, 0x86, 0x7a, 0x88, 0x6d, 0x5f, 0x74, 0x69, 0x79,
+    0xb0, 0x70, 0x97, 0x61, 0x83, 0x72, 0x67, 0x5d, 0x8e, 0x6e, 0x5e, 0x58,
+    0x8a, 0x6f, 0x85, 0x5e, 0x84, 0x6f, 0x6d, 0x7b, 0x73, 0x8b, 0x72, 0x6b,
+    0x51, 0x87, 0x86, 0x7b, 0x9e, 0x60, 0x7b, 0x71, 0x5e, 0x73, 0x90, 0x66,
+    0x6f, 0x87, 0x7c, 0x5d, 0x67, 0x59, 0x5c, 0x76, 0x78, 0x92, 0x89, 0x82,
+    0x6b, 0x70, 0x7c, 0x6d, 0x85, 0x7a, 0x68, 0x76, 0x7d, 0x75, 0x7a, 0x71,
+    0x78, 0x83, 0x2f, 0x7f, 0x75, 0x6f, 0x5d, 0x72, 0x6e, 0x70, 0x6e, 0x73,
+    0x72, 0x64, 0x69, 0x78, 0x76, 0x7b, 0x6e, 0x71, 0x92, 0x75, 0x55, 0x67,
+    0x75, 0x71, 0x72, 0x7c, 0x3e, 0x67, 0x50, 0x72, 0x80, 0x77, 0x6b, 0x75,
+    0x61, 0x71, 0x66, 0x7a, 0x52, 0x8a, 0x79, 0x78, 0x74, 0x72, 0x75, 0x83,
+    0x60, 0x5d, 0xb3, 0x7f, 0x9a, 0x83, 0x70, 0x7b, 0x92, 0xad, 0x8f, 0x62,
+    0x5e, 0x64, 0x6f, 0x86, 0x5a, 0x63, 0x58, 0x6b, 0x84, 0x7a, 0xcc, 0x8d,
+    0x65, 0x78, 0x80, 0x4f, 0x8a, 0x55, 0x73, 0x90, 0x8b, 0x7d, 0x88, 0x8a,
+    0xb4, 0x7c, 0x71, 0x73, 0xcf, 0x81, 0x97, 0x41, 0x72, 0x72, 0x6a, 0x75,
+    0x9b, 0xad, 0x78, 0x7b, 0x93, 0x5a, 0xac, 0x6e, 0x5b, 0x73, 0xa4, 0x8b,
+    0x79, 0x84, 0x62, 0x7b, 0x7a, 0x81, 0x88, 0x7c, 0x86, 0x9f, 0x8d, 0x72,
+    0x88, 0x6f, 0x76, 0x89, 0x87, 0x68, 0x7c, 0x83, 0x8a, 0x73, 0xa2, 0x5b,
+    0x8c, 0x81, 0x88, 0x50, 0x74, 0x77, 0x88, 0x96, 0x89, 0x80, 0x6f, 0x80,
+    0x8c, 0x8e, 0x89, 0x8e, 0xb5, 0x7b, 0x73, 0x84, 0x83, 0x62, 0x59, 0x7a,
+    0x6b, 0x71, 0x78, 0x83, 0x7e, 0x54, 0x77, 0x74, 0x84, 0xd0, 0x8d, 0x59,
+    0x7b, 0x80, 0x73, 0x76, 0xa4, 0x8b, 0x84, 0x89, 0x51, 0x91, 0x97, 0x7c,
+    0x6f, 0x71, 0x81, 0x94, 0xa2, 0x70, 0x59, 0x79, 0x7c, 0x8d, 0x8d, 0x50,
+    0x8d, 0x87, 0x7f, 0x4a, 0x7a, 0x72, 0x8e, 0x98, 0x79, 0x63, 0x60, 0x7c,
+    0x87, 0x4b, 0x72, 0x75, 0xc6, 0x79, 0x79, 0x84, 0x50, 0x6b, 0x62, 0x6a,
+    0x65, 0x5c, 0x66, 0x76, 0x85, 0x55, 0x60, 0x6c, 0x6e, 0xcf, 0x88, 0x67,
+    0x7a, 0x80, 0x77, 0x79, 0x81, 0x53, 0x86, 0x85, 0x88, 0x6c, 0x9b, 0x85,
+    0x67, 0x63, 0x96, 0x8f, 0x82, 0xa2, 0x5b, 0x6d, 0x5e, 0x8e, 0xbc, 0x64,
+    0x5e, 0x96, 0x86, 0x73, 0x6c, 0x54, 0x78, 0x9a, 0x8a, 0x60, 0x61, 0x63,
+    0x66, 0x5d, 0x73, 0x78, 0xc5, 0x84, 0x6a, 0x8b, 0x71, 0x64, 0x72, 0x68,
+    0x8e, 0x5f, 0x6e, 0x75, 0x82, 0x5c, 0x9d, 0x88, 0x86, 0x79, 0x68, 0x91,
+    0x69, 0x90, 0x86, 0x7e, 0x96, 0x98, 0x7f, 0x74, 0x83, 0x90, 0x85, 0x82,
+    0x85, 0x92, 0x5e, 0x8c, 0x76, 0x6e, 0x79, 0x68, 0x55, 0x73, 0xa2, 0x56,
+    0x6e, 0x96, 0xa3, 0x5d, 0x6b, 0x5c, 0x81, 0x87, 0x6a, 0x72, 0x7a, 0x5f,
+    0x93, 0x8c, 0x8b, 0x97, 0xce, 0x7b, 0x9d, 0x8d, 0x70, 0x75, 0x65, 0x90,
+    0x87, 0x59, 0x6d, 0x8c, 0x7a, 0x56, 0x6f, 0x73, 0x4d, 0x71, 0x86, 0x63,
+    0x73, 0x74, 0x72, 0x76, 0x6d, 0x72, 0x74, 0x77, 0x73, 0x71, 0x72, 0x75,
+    0x70, 0x72, 0x74, 0x73, 0x72, 0x70, 0x6f, 0x71, 0x72, 0x71, 0x6d, 0x6f,
+    0x76, 0x73, 0x6f, 0x72, 0x72, 0x76, 0x72, 0x70, 0x71, 0x74, 0x72, 0x76,
+    0x70, 0x75, 0x72, 0x74, 0x79, 0x70, 0x6f, 0x74, 0x71, 0x74, 0x75, 0x71,
+    0x73, 0x6c, 0x72, 0x6f, 0x73, 0x7b, 0x6b, 0x73, 0x71, 0x67, 0x6b, 0x73,
+    0x71, 0x7a, 0x53, 0x78, 0x76, 0x71, 0x70, 0x73, 0x7d, 0x7a, 0x82, 0x6d,
+    0x55, 0x76, 0x74, 0x65, 0x7a, 0x73, 0x7c, 0x6d, 0x75, 0x75, 0x7c, 0x74,
+    0x71, 0x75, 0x74, 0x77, 0x74, 0x70, 0x77, 0x7e, 0x79, 0x66, 0x7b, 0x6f,
+    0x73, 0x52, 0x79, 0x71, 0x80, 0x76, 0x70, 0x74, 0x51, 0x6c, 0x62, 0x80,
+    0x74, 0x6e, 0x79, 0x76, 0x6f, 0x66, 0x43, 0x72, 0x6c, 0x5c, 0x5f, 0x75,
+    0x7c, 0x87, 0x5c, 0x78, 0x89, 0x69, 0x69, 0x6f, 0x63, 0xa7, 0x82, 0x78,
+    0x73, 0x71, 0x7e, 0x81, 0x6b, 0x7c, 0x69, 0x73, 0x77, 0x75, 0x96, 0x3d,
+    0x76, 0x73, 0x6e, 0x83, 0x81, 0x74, 0x80, 0x7f, 0x8d, 0x77, 0x73, 0x78,
+    0x98, 0x76, 0x6c, 0x76, 0xb8, 0x7a, 0x76, 0x6e, 0x74, 0x73, 0x90, 0x84,
+    0x77, 0x72, 0x7b, 0x87, 0x98, 0x4d, 0x6d, 0x75, 0x5e, 0xcf, 0x81, 0x60,
+    0x79, 0x5e, 0x7f, 0x77, 0x75, 0x65, 0x73, 0x76, 0x70, 0x78, 0x75, 0x76,
+    0x60, 0x73, 0x77, 0x75, 0x6d, 0x73, 0x77, 0x75, 0x6e, 0x72, 0x79, 0x74,
+    0x73, 0x79, 0x6f, 0x78, 0x70, 0x71, 0x75, 0x73, 0x6f, 0x7c, 0x80, 0x79,
+    0x6f, 0x7e, 0x69, 0x6b, 0x84, 0x79, 0x6d, 0x76, 0x79, 0x6b, 0x80, 0x73,
+    0x7a, 0x76, 0x74, 0x7a, 0x77, 0x64, 0x7b, 0x6c, 0x78, 0x77, 0x70, 0x72,
+    0x7c, 0x7c, 0xa4, 0x82, 0x81, 0x7b, 0x67, 0x76, 0x92, 0x73, 0x7c, 0x57,
+    0x82, 0x62, 0x6f, 0x83, 0x7a, 0x85, 0x8a, 0x70, 0x85, 0x75, 0xbc, 0x67,
+    0x8b, 0x8a, 0x6d, 0x63, 0x73, 0x55, 0x6b, 0xaf, 0x87, 0x72, 0x79, 0x80,
+    0x85, 0x98, 0x91, 0x73, 0xce, 0x87, 0x7f, 0x50, 0x84, 0x94, 0x62, 0xb3,
+    0x7c, 0x89, 0x6e, 0x76, 0xac, 0x57, 0x90, 0x93, 0x8a, 0x76, 0x94, 0x8c,
+    0x77, 0x6d, 0x73, 0x7d, 0x6c, 0x72, 0x78, 0x66, 0x71, 0x74, 0x78, 0x7a,
+    0x7b, 0x72, 0x6b, 0x6a, 0x6f, 0x72, 0x69, 0x7e, 0x7b, 0x5f, 0x71, 0x73,
+    0x6d, 0x79, 0x7c, 0x62, 0x69, 0x52, 0x73, 0x80, 0x7f, 0x70, 0x77, 0x89,
+    0x51, 0x6f, 0x7d, 0x59, 0x6e, 0x60, 0x6f, 0x7d, 0x74, 0x7f, 0x7f, 0x74,
+    0x72, 0x7c, 0x76, 0x83, 0x71, 0x71, 0x6a, 0x65, 0x63, 0x78, 0x71, 0x78,
+    0x7a, 0x89, 0x6e, 0x79, 0x76, 0x5f, 0x82, 0x7f, 0x8c, 0x99, 0x6f, 0x87,
+    0x79, 0x7b, 0x66, 0x67, 0x7e, 0x89, 0x69, 0x78, 0x86, 0x8b, 0xa5, 0x45,
+    0xad, 0x83, 0x69, 0x7d, 0x7d, 0x75, 0x6e, 0x8e, 0x70, 0x89, 0x8f, 0x8c,
+    0x8c, 0x5f, 0x94, 0x7e, 0xbe, 0x8b, 0x68, 0x4c, 0x72, 0x65, 0x6d, 0x83,
+    0x66, 0x6a, 0x7a, 0x97, 0x83, 0x4c, 0x82, 0x70, 0x91, 0xd7, 0x91, 0x82,
+    0x6e, 0x7d, 0x76, 0x76, 0x72, 0x7c, 0x7a, 0x70, 0x6e, 0x76, 0x72, 0x6e,
+    0x79, 0x6b, 0x5f, 0x76, 0x77, 0x74, 0x7a, 0x71, 0x7d, 0x75, 0x80, 0x44,
+    0x74, 0x74, 0x6d, 0x6a, 0x77, 0x70, 0x77, 0x7c, 0x73, 0x74, 0x66, 0x79,
+    0x62, 0x84, 0x6f, 0x77, 0x8f, 0x6f, 0x75, 0x6e, 0x71, 0x75, 0x67, 0x6a,
+    0x7b, 0x6e, 0x6f, 0x77, 0x79, 0x7c, 0x6a, 0x76, 0x75, 0x7b, 0x6c, 0x71,
+    0x70, 0x6b, 0x68, 0x80, 0x7c, 0x61, 0x74, 0x6e, 0x67, 0x7a, 0x95, 0x59,
+    0x80, 0x87, 0x40, 0x76, 0x68, 0x73, 0x76, 0x7b, 0x81, 0x7c, 0x7a, 0x6d,
+    0x7c, 0x6a, 0x6c, 0x6e, 0x7c, 0x72, 0x74, 0x7e, 0x75, 0x6c, 0x7e, 0x7b,
+    0x71, 0x73, 0x6f, 0x79, 0x92, 0x7e, 0x6f, 0x69, 0x37, 0x7c, 0x77, 0x68,
+    0x6e, 0x71, 0x68, 0x7c, 0x75, 0x51, 0x74, 0x76, 0x72, 0x83, 0x76, 0x77,
+    0x8a, 0x77, 0x3e, 0x91, 0x80, 0x64, 0x91, 0x5e, 0x61, 0x7c, 0x6c, 0x6a,
+    0x68, 0x84, 0x7a, 0x7f, 0x87, 0x64, 0x75, 0x6e, 0x6c, 0x7b, 0x7a, 0x6a,
+    0x87, 0x73, 0x7e, 0x74, 0x7f, 0x76, 0x69, 0x8a, 0x79, 0x7a, 0x94, 0x87,
+    0x5f, 0x96, 0x7a, 0x64, 0xac, 0x58, 0x76, 0x66, 0x67, 0x71, 0x96, 0x6f,
+    0x76, 0x5a, 0x68, 0x5b, 0x84, 0x64, 0x92, 0x82, 0x79, 0xb4, 0x8c, 0x90,
+    0x70, 0x7c, 0x77, 0x72, 0x6a, 0x89, 0x6c, 0x70, 0x72, 0x71, 0x6c, 0x73,
+    0x5f, 0x6f, 0x74, 0x8a, 0x65, 0x81, 0x67, 0x7d, 0x70, 0x58, 0x82, 0x70,
+    0x7b, 0x7a, 0x64, 0x60, 0x70, 0x51, 0x72, 0x6b, 0x76, 0x7f, 0x78, 0x7f,
+    0x68, 0x70, 0x77, 0x6f, 0x58, 0x53, 0x75, 0x67, 0x77, 0x72, 0x6e, 0x74,
+    0x70, 0x7d, 0x77, 0x7b, 0x65, 0x65, 0x71, 0x74, 0x6c, 0x75, 0x74, 0x6c,
+    0x63, 0x7d, 0x80, 0x7e, 0x7e, 0x66, 0x74, 0x8e, 0x94, 0x75, 0x95, 0x78,
+    0x75, 0x8e, 0x57, 0x69, 0x7a, 0x68, 0x59, 0x6e, 0x76, 0x85, 0xab, 0x72,
+    0x9e, 0x7f, 0x66, 0x49, 0x73, 0x79, 0x76, 0x92, 0x7b, 0x9e, 0x85, 0x7b,
+    0x8d, 0x95, 0x7a, 0x6d, 0xd4, 0x81, 0x88, 0x91, 0x72, 0x7d, 0x71, 0x81,
+    0x66, 0xa1, 0x84, 0x9e, 0x76, 0x5f, 0x9c, 0x71, 0x6b, 0x74, 0x87, 0x70,
+    0x5a, 0x5a, 0x78, 0x68, 0x7e, 0x75, 0x72, 0x77, 0x79, 0x8d, 0x7d, 0x89,
+    0x80, 0x60, 0x54, 0x87, 0x6e, 0x7e, 0x7f, 0x82, 0x7a, 0x85, 0x8e, 0x80,
+    0x8b, 0x8f, 0x78, 0x5e, 0x64, 0x83, 0x72, 0x84, 0x73, 0x63, 0x76, 0x90,
+    0x62, 0x7a, 0x75, 0x80, 0x93, 0x76, 0x7d, 0x80, 0x7e, 0x7c, 0x66, 0x83,
+    0x7b, 0x77, 0x6a, 0x6c, 0x84, 0x88, 0x78, 0x72, 0x5f, 0x78, 0x89, 0x89,
+    0x72, 0x6b, 0x6d, 0x7a, 0x5e, 0x57, 0x77, 0x7e, 0x7d, 0x76, 0x94, 0x52,
+    0x67, 0x6c, 0x43, 0x6e, 0x62, 0x70, 0x70, 0x81, 0x8a, 0x75, 0x77, 0x86,
+    0x5b, 0x6d, 0x42, 0x63, 0x6d, 0x68, 0x77, 0x77, 0x66, 0x71, 0x84, 0x75,
+    0x7d, 0x7d, 0x73, 0x6c, 0x9f, 0x7f, 0x6e, 0x59, 0x25, 0x6c, 0x85, 0x65,
+    0x7f, 0x72, 0x6c, 0x85, 0x73, 0x7e, 0x78, 0x66, 0x76, 0x8a, 0x75, 0x60,
+    0x67, 0x85, 0x6b, 0x7a, 0x85, 0x8b, 0x78, 0x7e, 0x68, 0xa4, 0x8e, 0x72,
+    0x98, 0x88, 0x71, 0x8a, 0x87, 0x6d, 0x47, 0x75, 0x61, 0x83, 0xaf, 0x9b,
+    0x95, 0x7f, 0x47, 0x71, 0x81, 0x56, 0x78, 0x7d, 0x89, 0x93, 0x5f, 0x8b,
+    0x91, 0x62, 0x82, 0x81, 0xce, 0x84, 0x5d, 0x3e, 0x70, 0x84, 0x78, 0x8c,
+    0x67, 0x94, 0x73, 0x8b, 0x70, 0x57, 0x85, 0x6f, 0x56, 0xd7, 0x7b, 0x62,
+    0x77, 0x75, 0x80, 0x79, 0x6f, 0x6d, 0x71, 0x70, 0x68, 0x64, 0x55, 0x72,
+    0x78, 0x69, 0x55, 0x79, 0x6f, 0x71, 0x6a, 0x71, 0x6e, 0x7d, 0x71, 0x5c,
+    0x78, 0x78, 0x6b, 0x6f, 0x78, 0x79, 0x71, 0x71, 0x6e, 0x67, 0x77, 0x71,
+    0x78, 0x86, 0x74, 0x6d, 0x85, 0x75, 0x72, 0x71, 0x6d, 0x6e, 0x65, 0x5b,
+    0x79, 0x71, 0x6e, 0x6d, 0x74, 0x70, 0x7b, 0x73, 0x79, 0x7d, 0x6a, 0x71,
+    0x68, 0x59, 0x80, 0x72, 0x82, 0x56, 0x89, 0x86, 0x58, 0x5a, 0x6d, 0x68,
+    0x5d, 0x40, 0x8b, 0x95, 0x89, 0x9d, 0x4c, 0x5b, 0x6e, 0x7c, 0x5a, 0x77,
+    0x4c, 0x9c, 0x95, 0x83, 0x9b, 0xa2, 0x4e, 0x82, 0x90, 0x71, 0x26, 0x7b,
+    0x51, 0x56, 0x84, 0x49, 0x88, 0x51, 0x57, 0x9c, 0x90, 0x59, 0x6e, 0x69,
+    0x7b, 0x72, 0x85, 0x71, 0x92, 0x67, 0x52, 0x7b, 0x94, 0xaf, 0x0e, 0x98,
+    0xb8, 0x54, 0x8b, 0x76, 0x53, 0x41, 0x8a, 0x89, 0x68, 0x68, 0x61, 0xcb,
+    0x3d, 0x5c, 0xd6, 0x93, 0xe4, 0x93, 0x45, 0x47, 0x66, 0x6a, 0x67, 0x48,
+    0x48, 0x9b, 0xa1, 0xd2, 0x9a, 0x9c, 0x4f, 0xc3, 0xd3, 0x72, 0x47, 0x4f,
+    0x3b, 0x92, 0xaf, 0x58, 0xff, 0x4b, 0x3a, 0xc2, 0xdb, 0x4e, 0x69, 0x41,
+    0x9e, 0x1c, 0x93, 0x48, 0xb0, 0x3f, 0x54, 0xb0, 0xb2, 0xcf, 0x53, 0xc5,
+    0x78, 0x97, 0x81, 0x7a, 0x7f, 0x76, 0x5d, 0x67, 0x76, 0x71, 0x78, 0x5f,
+    0x88, 0x73, 0x51, 0x76, 0x6b, 0x88, 0x56, 0x6e, 0x75, 0x85, 0xa5, 0x51,
+    0x56, 0x7d, 0x66, 0x4d, 0x79, 0x64, 0x7b, 0x93, 0x77, 0x82, 0x81, 0x7b,
+    0x99, 0x74, 0x94, 0x78, 0xc8, 0x7f, 0x91, 0x51, 0x70, 0x83, 0x4d, 0x6a,
+    0x6f, 0x51, 0x7b, 0x80, 0x77, 0x52, 0x90, 0x7f, 0x4e, 0xd6, 0x3e, 0x75,
+    0x7b, 0x83, 0x6c, 0x82, 0x6d, 0x76, 0x70, 0x58, 0x82, 0x79, 0x87, 0x78,
+    0x7c, 0x49, 0x59, 0x4f, 0x7d, 0x3f, 0x84, 0x86, 0x82, 0x70, 0x7c, 0x52,
+    0x80, 0x6b, 0x6b, 0x64, 0x5e, 0x6c, 0x86, 0x5f, 0x00, 0x71, 0x81, 0x7a,
+    0x81, 0x75, 0x80, 0x69, 0x7a, 0x7f, 0x7e, 0x74, 0x37, 0x77, 0x7d, 0x84,
+    0x7d, 0x75, 0x5c, 0x64, 0x6d, 0x8a, 0x71, 0x84, 0x63, 0x6b, 0x7c, 0x56,
+    0x7b, 0x85, 0xa5, 0x76, 0xa1, 0x9c, 0x32, 0x48, 0xa7, 0x9f, 0xb9, 0x5e,
+    0xb0, 0xa0, 0x77, 0x3e, 0x46, 0x7f, 0xa9, 0x97, 0x8a, 0x85, 0xa6, 0xbf,
+    0x86, 0x50, 0x30, 0x5e, 0x4e, 0x6b, 0x9e, 0x2e, 0x39, 0xb4, 0xe4, 0x92,
+    0x5e, 0x81, 0x74, 0x88, 0x75, 0x8b, 0x8d, 0x44, 0x6b, 0x7e, 0xba, 0x9f,
+    0x72, 0x87, 0x4a, 0x85, 0x31, 0x9c, 0x7c, 0x79, 0x55, 0x99, 0xc1, 0x55,
+    0x94, 0x84, 0x94, 0x80, 0x76, 0x7f, 0x75, 0x7e, 0x7d, 0x76, 0x8e, 0x64,
+    0x68, 0x94, 0x6d, 0x6f, 0x83, 0x90, 0x67, 0x7b, 0x6d, 0x79, 0xc8, 0x72,
+    0x5f, 0x78, 0x76, 0x4e, 0x67, 0x60, 0x7f, 0x93, 0xac, 0x74, 0x7a, 0x75,
+    0x83, 0x8d, 0x76, 0x8a, 0xc8, 0x79, 0x85, 0x7d, 0x6a, 0x79, 0xb7, 0x75,
+    0x74, 0x71, 0x81, 0x7b, 0x84, 0x5a, 0x99, 0x6c, 0x6c, 0x7c, 0x80, 0x86,
+    0x7f, 0x84, 0x56, 0x77, 0x8d, 0x74, 0x7f, 0x87, 0x8e, 0x9b, 0x85, 0x77,
+    0x88, 0x7a, 0x75, 0x5b, 0x51, 0x7b, 0x62, 0x6e, 0x80, 0x75, 0xa4, 0x75,
+    0xa6, 0x99, 0x86, 0x3a, 0x7d, 0x77, 0x78, 0x87, 0x70, 0x79, 0x6d, 0x76,
+    0x76, 0x7b, 0x83, 0x65, 0xc0, 0x84, 0x7e, 0x8f, 0x89, 0x66, 0x99, 0x8b,
+    0x79, 0xa5, 0x67, 0x68, 0x78, 0x49, 0x7c, 0x6f, 0x80, 0xd2, 0x88, 0x61,
+    0x62, 0x6b, 0x6c, 0x7f, 0x67, 0x6b, 0x72, 0x6e, 0x7c, 0x85, 0x7f, 0x6e,
+    0x6b, 0x70, 0x7c, 0x6c, 0x61, 0x6d, 0x6d, 0x65, 0x8d, 0x86, 0x71, 0x80,
+    0x66, 0x63, 0x82, 0x7c, 0x60, 0x6d, 0x7a, 0x7a, 0x67, 0x7a, 0x83, 0x87,
+    0x7f, 0x77, 0x70, 0x69, 0x83, 0x6d, 0x6f, 0x80, 0x6b, 0x7e, 0x71, 0x61,
+    0x64, 0x77, 0x72, 0x65, 0x6b, 0x6d, 0x8b, 0x79, 0x7b, 0x85, 0x87, 0x64,
+    0x73, 0x58, 0x78, 0x90, 0x7b, 0x6c, 0x77, 0x77, 0x59, 0x6c, 0x6f, 0x75,
+    0x79, 0x74, 0x7b, 0x69, 0x70, 0x6e, 0x81, 0x78, 0x7f, 0x79, 0x6c, 0x5a,
+    0x85, 0x77, 0x6d, 0x6c, 0x6f, 0x86, 0x71, 0x7b, 0x6d, 0x73, 0x81, 0x79,
+    0x6b, 0x8d, 0x76, 0x72, 0xac, 0x67, 0x75, 0x79, 0x86, 0x7e, 0x84, 0x59,
+    0x6f, 0x61, 0x77, 0x60, 0x7f, 0x4e, 0x72, 0x6c, 0x7a, 0x9b, 0x7d, 0x79,
+    0x71, 0x78, 0x41, 0x71, 0x75, 0x7a, 0x6c, 0x76, 0x6c, 0x65, 0x74, 0x72,
+    0x7d, 0x7e, 0x70, 0x6f, 0x78, 0x76, 0x74, 0x6f, 0x75, 0x7d, 0x73, 0x67,
+    0x78, 0x72, 0x74, 0x74, 0x7c, 0x78, 0x71, 0x72, 0x74, 0x5e, 0x6a, 0x70,
+    0x76, 0x4e, 0x75, 0x7b, 0x84, 0x7b, 0x73, 0x6e, 0x7a, 0x72, 0x6a, 0x74,
+    0x6b, 0x6f, 0x73, 0x76, 0x6f, 0x76, 0x61, 0x74, 0x72, 0x77, 0x7d, 0x77,
+    0x94, 0x45, 0x69, 0x9e, 0x52, 0x48, 0xa3, 0x8c, 0x8e, 0x68, 0x88, 0x83,
+    0x64, 0x50, 0xca, 0x96, 0x9e, 0xb4, 0x72, 0x4d, 0x50, 0x37, 0x68, 0x6b,
+    0x51, 0x93, 0x75, 0xac, 0xa0, 0x9c, 0x3f, 0x87, 0xab, 0x51, 0x62, 0x4e,
+    0x60, 0x58, 0xa4, 0x58, 0x8d, 0x67, 0x40, 0x8b, 0x76, 0x43, 0x6d, 0x79,
+    0x7b, 0x51, 0x73, 0x47, 0xa5, 0x58, 0x5c, 0xa1, 0x77, 0xca, 0x56, 0x9f,
+    0x73, 0x6b, 0x76, 0x81, 0x79, 0x5c, 0x6f, 0x79, 0x6f, 0x7c, 0x85, 0x6b,
+    0x77, 0x7b, 0x6a, 0x73, 0x6d, 0x73, 0x71, 0x6b, 0x84, 0x98, 0x80, 0x7c,
+    0x76, 0x6f, 0x6d, 0x67, 0x7a, 0x7d, 0x6f, 0x7e, 0x68, 0x70, 0x7b, 0x6b,
+    0x7d, 0x7f, 0x63, 0x76, 0x93, 0x78, 0x75, 0x63, 0x1c, 0x88, 0x84, 0x72,
+    0x7a, 0x6a, 0x6c, 0x86, 0x7e, 0x5b, 0x7c, 0x6d, 0x7a, 0x8a, 0x73, 0x59,
+    0x7a, 0x85, 0x65, 0x89, 0x7b, 0x6f, 0x6c, 0x74, 0x74, 0x7f, 0x66, 0x74,
+    0x77, 0x66, 0x59, 0x75, 0x79, 0x7a, 0x75, 0x74, 0x64, 0x7d, 0x70, 0x68,
+    0x61, 0x71, 0x6c, 0x8b, 0x7b, 0x5d, 0x71, 0x74, 0x77, 0x7a, 0x78, 0x6b,
+    0x7b, 0x6d, 0x71, 0x7b, 0xa0, 0x7d, 0x7d, 0x71, 0x5e, 0x69, 0x3f, 0x77,
+    0x76, 0x76, 0x79, 0x71, 0x72, 0x6c, 0x78, 0x77, 0x78, 0x90, 0x78, 0x7d,
+    0x72, 0x78, 0x7e, 0x78, 0x73, 0x80, 0x77, 0x73, 0x71, 0x76, 0x67, 0x70,
+    0x74, 0x70, 0x6e, 0x75, 0x76, 0x73, 0x7b, 0x72, 0x76, 0x71, 0x75, 0x4a,
+    0x75, 0x78, 0x72, 0x65, 0x70, 0x70, 0x73, 0x79, 0x6f, 0x74, 0x71, 0x77,
+    0x6f, 0x7d, 0x79, 0x7a, 0x8c, 0x72, 0x7a, 0x6d, 0x70, 0x73, 0x6d, 0x70,
+    0x78, 0x73, 0x73, 0x75, 0x76, 0x7b, 0x6b, 0x78, 0x77, 0x75, 0x80, 0x7b,
+    0x70, 0x75, 0x6f, 0x6f, 0x71, 0x71, 0x73, 0x73, 0x74, 0x71, 0x71, 0x70,
+    0x75, 0x72, 0x73, 0x72, 0x77, 0x72, 0x87, 0x72, 0x75, 0x73, 0x71, 0x6d,
+    0x6d, 0x6a, 0x73, 0x71, 0x74, 0x72, 0x71, 0x6c, 0x6f, 0x71, 0x73, 0x71,
+    0x79, 0x6f, 0x6f, 0x6f, 0x6d, 0x73, 0x70, 0x73, 0x70, 0x71, 0x74, 0x72,
+    0x75, 0x6e, 0x72, 0x6f, 0x6d, 0x73, 0x70, 0x74, 0x74, 0x6e, 0x70, 0x72,
+    0x7c, 0x76, 0x7e, 0x80, 0x6f, 0x78, 0x73, 0x6e, 0x76, 0x76, 0x77, 0x71,
+    0x6e, 0x70, 0x79, 0x77, 0x66, 0x74, 0x75, 0x79, 0x6d, 0x6b, 0x7a, 0x7a,
+    0x76, 0x74, 0x78, 0x79, 0x6a, 0x64, 0x74, 0x6e, 0x73, 0x7d, 0x7e, 0x78,
+    0x72, 0x86, 0x76, 0x68, 0x78, 0x75, 0x75, 0x75, 0x73, 0x72, 0x7a, 0x74,
+    0x7d, 0x76, 0x70, 0x6e, 0x75, 0x5d, 0x7b, 0x70, 0x78, 0x6d, 0x6e, 0x76,
+    0x59, 0x50, 0x83, 0x87, 0x6d, 0x65, 0x6f, 0x80, 0x7e, 0x78, 0x70, 0x85,
+    0x71, 0x4e, 0x50, 0x86, 0x74, 0x81, 0x74, 0x85, 0x78, 0x75, 0x8b, 0x83,
+    0x67, 0x88, 0x77, 0x6f, 0x67, 0x64, 0x79, 0x79, 0x76, 0x6e, 0x7f, 0x89,
+    0x62, 0x63, 0x6b, 0x84, 0x9f, 0x72, 0x70, 0x6d, 0x82, 0x75, 0x80, 0x81,
+    0x75, 0x7a, 0x6c, 0x79, 0x76, 0x7d, 0x80, 0x77, 0x6c, 0x78, 0x87, 0x80,
+    0x70, 0x73, 0x7c, 0x7a, 0x77, 0x77, 0x6f, 0x6c, 0x78, 0x72, 0x7b, 0x76,
+    0x73, 0x74, 0x75, 0x70, 0x5e, 0x72, 0x7a, 0x73, 0x76, 0x76, 0x6d, 0x77,
+    0x6d, 0x7a, 0x76, 0x72, 0x71, 0x7b, 0x71, 0x70, 0x6f, 0x77, 0x74, 0x75,
+    0x76, 0x73, 0x71, 0x72, 0x7e, 0x73, 0x76, 0x6c, 0x7a, 0x75, 0x3d, 0x79,
+    0x72, 0x71, 0x73, 0x78, 0x7a, 0x7a, 0x79, 0x72, 0x78, 0x81, 0x72, 0x73,
+    0x81, 0x6f, 0x6f, 0x68, 0x76, 0x73, 0x80, 0x7d, 0x7c, 0x7a, 0x6c, 0x74,
+    0x76, 0x71, 0x77, 0x6e, 0x72, 0x6c, 0x6a, 0x6b, 0x6c, 0x6b, 0x78, 0x72,
+    0x79, 0x72, 0x71, 0x71, 0x71, 0x5c, 0x6d, 0x69, 0x75, 0x70, 0x82, 0x76,
+    0x71, 0x7a, 0x70, 0x79, 0x7a, 0x7f, 0x70, 0x88, 0x76, 0x77, 0x80, 0x7e,
+    0x7b, 0x72, 0x72, 0x6f, 0x57, 0x75, 0x64, 0x7b, 0x61, 0x83, 0x71, 0x79,
+    0x76, 0x82, 0x4f, 0x7f, 0x76, 0x80, 0x61, 0x75, 0x60, 0x6b, 0x6d, 0x61,
+    0x83, 0x71, 0x84, 0x78, 0x78, 0x71, 0x7c, 0x76, 0x79, 0x5e, 0x6a, 0x61,
+    0x8c, 0x68, 0x76, 0x7c, 0x6b, 0x88, 0x68, 0x7b, 0x6b, 0x8d, 0x6d, 0x52,
+    0x5a, 0x86, 0x78, 0x66, 0xa0, 0x60, 0x63, 0x7c, 0x7f, 0x78, 0x84, 0x66,
+    0x7a, 0x54, 0x7b, 0x6c, 0x5b, 0x69, 0x65, 0x71, 0x75, 0x8b, 0x8b, 0x7d,
+    0x71, 0x6c, 0x70, 0x83, 0x7f, 0x6f, 0x73, 0x6b, 0x64, 0x74, 0x89, 0x35,
+    0x76, 0x7c, 0x5b, 0x74, 0x73, 0x76, 0x73, 0x76, 0x83, 0x83, 0x7b, 0x71,
+    0x7b, 0x6f, 0x6f, 0x61, 0x70, 0x62, 0x7b, 0x80, 0x6c, 0x70, 0x7c, 0x71,
+    0x86, 0x73, 0x66, 0x71, 0x91, 0x74, 0x77, 0x69, 0x33, 0x77, 0x80, 0x6d,
+    0x71, 0x77, 0x6e, 0x76, 0x7c, 0x4a, 0x7b, 0x71, 0x7b, 0x82, 0x75, 0x6a,
+    0x5c, 0x6a, 0x71, 0x89, 0x75, 0x75, 0x70, 0x70, 0x73, 0x6e, 0x70, 0x61,
+    0x81, 0x7f, 0x6f, 0x7b, 0x57, 0x77, 0x71, 0x82, 0x7e, 0x69, 0x85, 0x80,
+    0x70, 0x80, 0x7d, 0x53, 0x77, 0x6d, 0x71, 0x7f, 0x79, 0x84, 0x74, 0x70,
+    0x79, 0x6f, 0x7a, 0x75, 0x8a, 0x79, 0x76, 0x72, 0x82, 0x7b, 0x77, 0x7e,
+    0x77, 0x76, 0x71, 0x78, 0x79, 0x81, 0x75, 0x73, 0x63, 0x85, 0x7d, 0x85,
+    0x79, 0x86, 0x64, 0x7f, 0x78, 0x47, 0x7f, 0x74, 0x71, 0x66, 0x85, 0x6f,
+    0x96, 0x54, 0x68, 0x84, 0x8e, 0x8d, 0x49, 0x6b, 0x7d, 0x49, 0x9b, 0x63,
+    0x68, 0x6e, 0x82, 0x6d, 0x7b, 0x8d, 0x79, 0x9e, 0x87, 0x81, 0x57, 0x4e,
+    0x85, 0x48, 0x76, 0x6c, 0xc0, 0x7b, 0x5e, 0xa3, 0x96, 0x8a, 0x92, 0x83,
+    0x5d, 0x75, 0x6a, 0x86, 0x92, 0x53, 0x57, 0x79, 0x89, 0xce, 0x78, 0x9c,
+    0x67, 0xa7, 0x52, 0x98, 0x94, 0x43, 0x93, 0x90, 0x77, 0x60, 0x6b, 0x6a,
+    0xa1, 0xa6, 0x4c, 0x8f, 0x80, 0x97, 0x5e, 0x6b, 0x85, 0x85, 0x77, 0x83,
+    0xa2, 0x6a, 0x70, 0xb8, 0x68, 0x85, 0x6a, 0x8f, 0x8d, 0x92, 0x6e, 0x7b,
+    0x6d, 0x53, 0x70, 0x6f, 0xc1, 0xa4, 0x69, 0x6c, 0x97, 0x71, 0x97, 0x6d,
+    0x5c, 0x4f, 0x7e, 0x8d, 0x7d, 0x52, 0x67, 0x6f, 0x9c, 0xd9, 0x4a, 0x93,
+    0x69, 0x5b, 0x73, 0x7a, 0x83, 0x67, 0x9f, 0x88, 0x56, 0x71, 0x6f, 0x63,
+    0x66, 0x67, 0x84, 0x8a, 0x7f, 0x93, 0x36, 0x5d, 0x47, 0x5e, 0x5c, 0x72,
+    0x5e, 0x84, 0x89, 0x85, 0x8c, 0x6f, 0x58, 0x74, 0x87, 0x6a, 0x5c, 0x7a,
+    0x6c, 0x6b, 0x75, 0x65, 0x84, 0x6e, 0x62, 0x86, 0x85, 0x66, 0x64, 0x6c,
+    0x7b, 0x6e, 0x89, 0x67, 0x8a, 0x63, 0x68, 0x71, 0x8d, 0x8a, 0x65, 0x91,
+    0x63, 0x7e, 0x8b, 0x78, 0x80, 0x9d, 0x65, 0x6d, 0x93, 0x87, 0xa7, 0x6e,
+    0x81, 0x9f, 0xac, 0x5e, 0x66, 0x7b, 0x58, 0x61, 0x64, 0x4f, 0xb5, 0x85,
+    0x63, 0x8d, 0x79, 0x4b, 0x82, 0x74, 0x79, 0xaf, 0x88, 0x70, 0x59, 0x94,
+    0x96, 0x92, 0x7c, 0x76, 0xce, 0x82, 0x8c, 0x52, 0x69, 0x86, 0x7d, 0x70,
+    0x83, 0x84, 0x7c, 0x94, 0x97, 0x66, 0x6a, 0x74, 0x7c, 0xe5, 0x8c, 0x90,
+    0x78, 0x72, 0x73, 0x7c, 0x7a, 0x75, 0x71, 0x73, 0x75, 0x66, 0x72, 0x73,
+    0x85, 0x7a, 0x78, 0x69, 0x68, 0x6e, 0x7c, 0x6e, 0x74, 0x6f, 0x70, 0x7a,
+    0x46, 0x7e, 0x77, 0x70, 0x78, 0x6b, 0x6f, 0x6d, 0x73, 0x72, 0x79, 0x6d,
+    0x78, 0x78, 0x79, 0x76, 0x7a, 0x7c, 0x72, 0x70, 0x7b, 0x6e, 0x7c, 0x71,
+    0x73, 0x73, 0x7b, 0x7e, 0x6f, 0x6d, 0x81, 0x78, 0x6a, 0x78, 0x6f, 0x73,
+    0x7c, 0x71, 0x85, 0x7d, 0x75, 0x6b, 0x73, 0x79, 0x79, 0x72, 0x72, 0x7e,
+    0x6a, 0x7b, 0x6d, 0x72, 0x75, 0x74, 0x79, 0x72, 0x64, 0x64, 0x81, 0x88,
+    0x72, 0x79, 0x7a, 0x74, 0x6d, 0x7a, 0x6c, 0x6f, 0x75, 0x78, 0x79, 0x7a,
+    0x70, 0x83, 0x7f, 0x6f, 0x80, 0x68, 0x71, 0x7b, 0x78, 0x70, 0x61, 0x84,
+    0x69, 0x70, 0x7c, 0x71, 0x70, 0x6f, 0x73, 0x70, 0x6b, 0x73, 0x8a, 0x72,
+    0x81, 0x5a, 0x38, 0x8d, 0x73, 0x7d, 0x69, 0x53, 0x5a, 0x87, 0x69, 0x59,
+    0x7d, 0x4a, 0x91, 0x88, 0x82, 0x70, 0x5a, 0x59, 0x94, 0x7e, 0x51, 0x59,
+    0x88, 0x71, 0x5f, 0x73, 0x8a, 0x7f, 0x74, 0x72, 0x64, 0x7c, 0x65, 0x58,
+    0x85, 0x5c, 0x70, 0x6c, 0xc2, 0x48, 0x5a, 0x81, 0x94, 0x81, 0x91, 0x62,
+    0x64, 0x52, 0x78, 0x54, 0x85, 0x51, 0x6f, 0x70, 0x7a, 0xba, 0x96, 0x70,
+    0x6c, 0x6e, 0x81, 0x75, 0x7a, 0x63, 0x73, 0x70, 0x78, 0x6d, 0x82, 0x7a,
+    0x6d, 0x75, 0x74, 0x70, 0x72, 0x68, 0x76, 0x71, 0x73, 0x78, 0x71, 0x70,
+    0x7b, 0x75, 0x77, 0x74, 0x77, 0x7b, 0x73, 0x63, 0x77, 0x5e, 0x79, 0x6f,
+    0x71, 0x62, 0x77, 0x68, 0x83, 0x73, 0x72, 0x78, 0x4e, 0x70, 0x5b, 0x6e,
+    0x77, 0x6d, 0x79, 0x73, 0x77, 0x5d, 0x56, 0x74, 0x6a, 0x76, 0x63, 0x70,
+    0x6f, 0x72, 0x72, 0x6b, 0x6e, 0x6b, 0x75, 0x6e, 0x78, 0x6d, 0x6f, 0x70,
+    0x66, 0x73, 0x72, 0x72, 0x7a, 0x6a, 0x70, 0x6f, 0x70, 0x73, 0x7a, 0x6a,
+    0x75, 0x6c, 0x75, 0x66, 0x76, 0x70, 0x75, 0x73, 0x6d, 0x6c, 0x73, 0x70,
+    0x75, 0x72, 0x76, 0x70, 0x76, 0x73, 0x72, 0x66, 0x74, 0x78, 0x73, 0x6b,
+    0x76, 0x6f, 0x75, 0x72, 0x76, 0x59, 0x68, 0x72, 0x7a, 0x7a, 0x74, 0x71,
+    0x61, 0x9e, 0x68, 0x78, 0x89, 0x82, 0x7d, 0x6b, 0x80, 0xa9, 0x80, 0x4e,
+    0x8c, 0x88, 0x56, 0x73, 0x65, 0x81, 0xa6, 0x8a, 0xab, 0x95, 0xb0, 0x66,
+    0x98, 0x7c, 0x7d, 0x47, 0x8a, 0x9d, 0x78, 0xa1, 0x8e, 0x95, 0x88, 0x90,
+    0x9f, 0x91, 0x79, 0x73, 0xdb, 0x72, 0x86, 0x6b, 0x72, 0x81, 0x72, 0x84,
+    0x78, 0x4e, 0x8a, 0x83, 0x8e, 0x5d, 0x9a, 0x8e, 0x88, 0xd3, 0xa0, 0x66,
+    0x7b, 0x79, 0x73, 0x7d, 0x66, 0x74, 0x60, 0x72, 0x76, 0x75, 0x6f, 0x7d,
+    0x73, 0x7d, 0x73, 0x6f, 0x74, 0x52, 0x27, 0x78, 0x62, 0x75, 0x7d, 0x6b,
+    0x78, 0x66, 0x6c, 0x6e, 0x67, 0x6e, 0x7a, 0x7a, 0x69, 0x76, 0x70, 0x6f,
+    0x76, 0x73, 0x6c, 0x74, 0x84, 0x74, 0x7b, 0x72, 0x79, 0x79, 0x77, 0x75,
+    0x79, 0x74, 0x6a, 0x79, 0x5f, 0x66, 0x75, 0x78, 0x69, 0x72, 0x74, 0x78,
+    0x7e, 0x72, 0x85, 0x68, 0x74, 0x74, 0x75, 0x76, 0x7f, 0x77, 0x7e, 0x73,
+    0x66, 0x7b, 0x7a, 0x75, 0x71, 0x70, 0x7d, 0x6d, 0x69, 0x61, 0x81, 0x63,
+    0x68, 0x76, 0x75, 0x83, 0x70, 0x80, 0x6c, 0x69, 0x73, 0x84, 0x80, 0x63,
+    0x76, 0x6e, 0x7c, 0x75, 0x7f, 0x70, 0x77, 0x77, 0x89, 0x62, 0x3e, 0x73,
+    0x72, 0x81, 0x7d, 0x6f, 0x72, 0x6e, 0x83, 0x75, 0x67, 0x78, 0x80, 0x73,
+    0x6d, 0x82, 0x70, 0x7e, 0x89, 0xa0, 0x79, 0x88, 0x79, 0xa0, 0x73, 0x6b,
+    0x8d, 0x49, 0x6f, 0x8e, 0x6d, 0x88, 0x9b, 0x74, 0x7f, 0x90, 0xbb, 0x67,
+    0x7c, 0x71, 0x63, 0x54, 0x78, 0x70, 0x86, 0x99, 0x88, 0x92, 0x98, 0x87,
+    0x86, 0x99, 0x6d, 0x7d, 0xcc, 0x8b, 0x88, 0x60, 0x4e, 0x7a, 0x51, 0xa1,
+    0x63, 0x65, 0x83, 0x8e, 0x7c, 0x6e, 0x9a, 0x8f, 0x61, 0x7b, 0x71, 0x95,
+    0x6c, 0x7b, 0x1c, 0x6c, 0x7a, 0x7f, 0x6e, 0x6f, 0x74, 0x79, 0x7f, 0x77,
+    0x89, 0x7d, 0x78, 0x75, 0x73, 0x7e, 0x6a, 0x71, 0x71, 0x6e, 0x7d, 0x72,
+    0x78, 0x73, 0x6c, 0x6c, 0x6d, 0x7d, 0x6d, 0x74, 0x83, 0x60, 0x63, 0x63,
+    0x76, 0x51, 0x68, 0x71, 0x81, 0x85, 0x7a, 0x6c, 0x64, 0x74, 0x6d, 0x74,
+    0x6a, 0x63, 0x71, 0x73, 0x75, 0x76, 0x5b, 0x6b, 0x6b, 0x81, 0x8c, 0x81,
+    0x6a, 0x48, 0x88, 0x80, 0x72, 0x71, 0x6d, 0x7f, 0x7b, 0x7a, 0x78, 0x8a,
+    0x7c, 0x79, 0x53, 0x89, 0x75, 0x7b, 0x73, 0x7b, 0x80, 0x75, 0x85, 0x79,
+    0x73, 0x73, 0x77, 0x5d, 0x5c, 0x71, 0x6d, 0x75, 0x7a, 0x77, 0x7d, 0x7c,
+    0x56, 0x63, 0x61, 0x8d, 0x9e, 0x72, 0x78, 0x65, 0x83, 0x7b, 0x80, 0x7d,
+    0x72, 0x6d, 0x70, 0x72, 0x7b, 0x65, 0x7b, 0x77, 0x84, 0x7a, 0x82, 0x83,
+    0x58, 0x8c, 0x7e, 0x77, 0x8a, 0x74, 0x7a, 0x6a, 0x89, 0x9c, 0x84, 0x6c,
+    0x8d, 0x5a, 0x68, 0x63, 0x62, 0x5d, 0x57, 0x79, 0x69, 0x72, 0x97, 0x62,
+    0x8a, 0x6b, 0x5e, 0x52, 0x76, 0x7f, 0x83, 0x9d, 0x78, 0x7e, 0x93, 0x82,
+    0x75, 0x92, 0x80, 0x86, 0xcf, 0x92, 0x74, 0x85, 0x67, 0x7f, 0x73, 0x7f,
+    0x6f, 0x48, 0x83, 0x80, 0x6b, 0x4b, 0x8c, 0x68, 0x50, 0xd6, 0x9a, 0x67,
+    0x71, 0x6e, 0x71, 0x73, 0x72, 0x75, 0x75, 0x78, 0x69, 0x6e, 0x6f, 0x7a,
+    0x6e, 0x6f, 0x74, 0x85, 0x71, 0x70, 0x1e, 0x66, 0x55, 0x78, 0x71, 0x79,
+    0x73, 0x77, 0x70, 0x78, 0x79, 0x76, 0x6b, 0x79, 0x7a, 0x73, 0x61, 0x6a,
+    0x71, 0x71, 0x6f, 0x6a, 0x89, 0x72, 0x6d, 0x77, 0x7d, 0x75, 0x70, 0x6a,
+    0x6b, 0x71, 0x7d, 0x70, 0x74, 0x63, 0x6f, 0x75, 0x77, 0x85, 0x6c, 0x81,
+    0x73, 0x75, 0x71, 0x79, 0x77, 0x79, 0x7b, 0x73, 0x75, 0x70, 0x75, 0x73,
+    0x72, 0x75, 0x71, 0x70, 0x6e, 0x78, 0x7b, 0x74, 0x70, 0x7c, 0x75, 0x71,
+    0x76, 0x6f, 0x7b, 0x74, 0x74, 0x71, 0x73, 0x73, 0x72, 0x75, 0x78, 0x78,
+    0x6d, 0x78, 0x70, 0x76, 0x7c, 0x71, 0x74, 0x68, 0x75, 0x74, 0x62, 0x72,
+    0x78, 0x6f, 0x6f, 0x77, 0x7d, 0x75, 0x74, 0x76, 0x76, 0x7c, 0x75, 0x75,
+    0x76, 0x71, 0x9e, 0x7a, 0x8e, 0x63, 0x65, 0x71, 0x71, 0x82, 0x87, 0x5c,
+    0x77, 0x7d, 0x7e, 0x99, 0x69, 0x7b, 0x54, 0x7c, 0x8b, 0x74, 0xa6, 0x7e,
+    0x74, 0x6a, 0x85, 0x5c, 0x6b, 0x74, 0x7f, 0x84, 0x8f, 0x8d, 0x8e, 0x76,
+    0x79, 0x6e, 0x9b, 0x79, 0xc6, 0x81, 0x80, 0x60, 0x6d, 0x7e, 0x91, 0x85,
+    0x68, 0x59, 0x7c, 0x7e, 0x7e, 0x59, 0x85, 0x6f, 0x73, 0xd9, 0x5c, 0x75,
+    0x70, 0x6c, 0x78, 0x72, 0x73, 0x6e, 0x97, 0x7e, 0x6e, 0x56, 0x5f, 0x66,
+    0x66, 0x78, 0x77, 0x82, 0x7d, 0x8c, 0x2c, 0x5f, 0x25, 0x6a, 0x67, 0x78,
+    0x56, 0x81, 0x83, 0x83, 0x7a, 0x77, 0x61, 0x7a, 0x84, 0x6b, 0x5a, 0x67,
+    0x71, 0x66, 0x65, 0x77, 0x8e, 0x6d, 0x65, 0x73, 0x8b, 0x6e, 0x6b, 0x60,
+    0x6d, 0x72, 0x87, 0x69, 0x86, 0x5f, 0x76, 0x7f, 0x74, 0x8b, 0x61, 0x89,
+    0x63, 0x54, 0x5f, 0x83, 0x66, 0x45, 0x95, 0x66, 0x78, 0x62, 0x8c, 0x88,
+    0x5d, 0x58, 0xb0, 0x7f, 0x7c, 0x92, 0x59, 0x6b, 0x75, 0x65, 0x64, 0x71,
+    0x5f, 0xa5, 0x64, 0x83, 0x76, 0x8c, 0x60, 0xa1, 0x91, 0x6e, 0x63, 0x54,
+    0x68, 0x6b, 0x83, 0x8b, 0xc8, 0x58, 0x88, 0x71, 0x83, 0x44, 0x6d, 0x71,
+    0x73, 0x58, 0x73, 0x66, 0x77, 0x5b, 0x67, 0xa0, 0x8b, 0xe0, 0x65, 0x95,
+    0x73, 0x5f, 0x80, 0x6b, 0x70, 0x67, 0x72, 0x70, 0x77, 0x7b, 0x76, 0x76,
+    0x67, 0x6b, 0x77, 0x71, 0x69, 0x72, 0x78, 0x75, 0x70, 0x69, 0x77, 0x7a,
+    0x72, 0x79, 0x6b, 0x7c, 0x77, 0x6b, 0x79, 0x76, 0x70, 0x79, 0x7d, 0x6d,
+    0x6b, 0x7a, 0x5c, 0x74, 0x82, 0x78, 0x70, 0x73, 0x76, 0x6e, 0x77, 0x71,
+    0x7e, 0x7b, 0x70, 0x68, 0x7a, 0x57, 0x7f, 0x6e, 0x69, 0x66, 0x7a, 0x71,
+    0x4c, 0x6a, 0x7d, 0x9a, 0x69, 0x87, 0x78, 0x6a, 0x84, 0x79, 0x6c, 0x85,
+    0x76, 0x76, 0x61, 0x7f, 0x78, 0x7d, 0x70, 0x82, 0x7e, 0x5a, 0x7d, 0x78,
+    0x6b, 0x86, 0x81, 0x4f, 0x6a, 0x6b, 0x70, 0x7b, 0x6d, 0x72, 0x7f, 0x8f,
+    0x7e, 0x87, 0x7b, 0x6e, 0x90, 0x78, 0x78, 0x89, 0x75, 0x81, 0x85, 0x83,
+    0x6d, 0x70, 0x67, 0x72, 0x7f, 0x71, 0x7f, 0x7c, 0x6a, 0x74, 0x89, 0x82,
+    0x73, 0x52, 0x78, 0x86, 0x7a, 0x6d, 0x7a, 0x79, 0x7d, 0x6e, 0x81, 0x6d,
+    0x64, 0x7b, 0x62, 0x72, 0x7e, 0x72, 0x7f, 0x75, 0x73, 0x78, 0x71, 0x77,
+    0x81, 0x73, 0x71, 0x73, 0x77, 0x72, 0x79, 0x77, 0x7b, 0x6a, 0x6a, 0x67,
+    0x7b, 0x7e, 0x6d, 0x6d, 0x87, 0x64, 0x76, 0x67, 0x8c, 0x7c, 0x85, 0x6f,
+    0x7c, 0x64, 0x78, 0x77, 0x76, 0x42, 0x7a, 0x72, 0x6c, 0x8b, 0x76, 0x6b,
+    0x7e, 0x6f, 0x80, 0x77, 0x8c, 0xa3, 0x74, 0x78, 0x83, 0x85, 0x64, 0x76,
+    0x81, 0x6d, 0x45, 0x7c, 0x8e, 0x77, 0x5e, 0x81, 0x90, 0x68, 0x98, 0x74,
+    0x71, 0x8d, 0x67, 0x53, 0x98, 0x97, 0x89, 0x9e, 0x5f, 0x92, 0xa3, 0x69,
+    0x69, 0x7b, 0x9c, 0x85, 0xd7, 0x86, 0x93, 0x81, 0x72, 0x7c, 0x74, 0x61,
+    0x81, 0x4e, 0x81, 0x97, 0x86, 0x60, 0x95, 0x7c, 0x77, 0xdb, 0x51, 0x8c,
+    0x7c, 0x76, 0x68, 0x86, 0x96, 0x40, 0xa0, 0x6a, 0x7d, 0x6e, 0x9a, 0x86,
+    0x60, 0x8d, 0x79, 0x7f, 0x7e, 0x71, 0x5c, 0x64, 0x56, 0x3f, 0x89, 0x5f,
+    0x77, 0x9e, 0x62, 0x71, 0x75, 0x7a, 0x6b, 0x87, 0x98, 0x88, 0x6c, 0x48,
+    0x63, 0x52, 0xa0, 0x65, 0xb1, 0x51, 0x7d, 0x89, 0x81, 0x65, 0x71, 0x79,
+    0x90, 0x55, 0x6c, 0x78, 0x7c, 0x5e, 0x61, 0x84, 0x7d, 0xe5, 0x65, 0x9e,
+    0x7f, 0x72, 0x87, 0x5f, 0x73, 0x70, 0x68, 0x74, 0x7f, 0x75, 0x7b, 0x7a,
+    0x5b, 0x82, 0x81, 0x74, 0x70, 0x6f, 0x78, 0x72, 0x6d, 0x65, 0x7e, 0x68,
+    0x6a, 0x76, 0x7e, 0x7e, 0x71, 0x7d, 0x6b, 0x66, 0x79, 0x80, 0x78, 0x71,
+    0x75, 0x79, 0x78, 0x76, 0x84, 0x73, 0x75, 0x7d, 0x8b, 0x5a, 0x6a, 0x74,
+    0x69, 0x80, 0x80, 0x6c, 0x72, 0x6d, 0x83, 0x78, 0x6e, 0x65, 0x7b, 0x7b,
+    0x5a, 0x7a, 0x79, 0x7b, 0x8b, 0x86, 0x78, 0x64, 0x6d, 0x6b, 0x97, 0x5a,
+    0x94, 0x68, 0x6f, 0x79, 0x5c, 0x66, 0x8a, 0x83, 0x87, 0x6e, 0x8f, 0x8a,
+    0x7e, 0x6d, 0x57, 0x44, 0x70, 0x65, 0x77, 0x94, 0x86, 0x67, 0x97, 0x80,
+    0x80, 0x7d, 0x71, 0x8d, 0xd2, 0x8a, 0x87, 0x73, 0x81, 0x66, 0x5a, 0x6d,
+    0x65, 0x41, 0x79, 0x91, 0x7b, 0x5a, 0x93, 0x6c, 0x64, 0xd4, 0x7e, 0x72,
+    0x65, 0x85, 0x74, 0x93, 0x77, 0x4b, 0x72, 0x70, 0x59, 0x75, 0x65, 0x73,
+    0x66, 0x78, 0x57, 0x77, 0x7c, 0x7c, 0x73, 0x71, 0x77, 0x80, 0x5b, 0x3f,
+    0x67, 0x70, 0x88, 0x83, 0x7b, 0x82, 0x7c, 0x6b, 0x79, 0x76, 0x7d, 0x6e,
+    0x7a, 0x6a, 0x81, 0x70, 0xb0, 0x6e, 0x79, 0x62, 0x77, 0x5f, 0x7d, 0x66,
+    0x7a, 0x4f, 0x73, 0x6d, 0x6f, 0x46, 0x82, 0x7f, 0x5b, 0xa2, 0x78, 0x69,
+    0x6f, 0x6c, 0x6b, 0x60, 0x69, 0x6c, 0x6a, 0x6f, 0x6b, 0x6b, 0x64, 0x69,
+    0x6c, 0x68, 0x6c, 0x68, 0x6a, 0x6d, 0x67, 0x6f, 0x6c, 0x6b, 0x62, 0x6b,
+    0x6d, 0x6a, 0x6d, 0x6b, 0x6f, 0x6c, 0x6f, 0x6a, 0x6a, 0x6c, 0x65, 0x69,
+    0x69, 0x6a, 0x6b, 0x69, 0x4d, 0x6b, 0x6c, 0x6c, 0x61, 0x6f, 0x67, 0x6c,
+    0x70, 0x6f, 0x72, 0x6f, 0x6c, 0x6f, 0x6c, 0x6b, 0x6f, 0x5e, 0x64, 0x69,
+    0x54, 0x7c, 0x2f, 0x79, 0x7a, 0x71, 0x6c, 0x76, 0x72, 0x7c, 0x72, 0x6c,
+    0x5d, 0x83, 0x77, 0x79, 0x7b, 0x77, 0x7c, 0x73, 0x81, 0x78, 0x7e, 0x77,
+    0x6b, 0x75, 0x74, 0x6c, 0x6f, 0x72, 0x71, 0x85, 0x7c, 0x67, 0x51, 0x68,
+    0x68, 0x5a, 0x72, 0x79, 0x80, 0x77, 0x6f, 0x70, 0x5b, 0x81, 0x6d, 0x7b,
+    0x75, 0x77, 0x75, 0x7d, 0x78, 0x77, 0x50, 0x73, 0x6d, 0x76, 0x6b, 0x7e,
+    0x5e, 0x78, 0x69, 0x7e, 0x8c, 0x57, 0x86, 0x85, 0x6a, 0x99, 0x8a, 0x6a,
+    0x71, 0x7f, 0x63, 0x80, 0x6e, 0x85, 0x7f, 0x7c, 0x79, 0x79, 0xa2, 0x78,
+    0x8a, 0x6a, 0x5c, 0x53, 0x7a, 0x6c, 0x7f, 0x89, 0x75, 0x84, 0x78, 0x6b,
+    0x7a, 0x80, 0x96, 0x86, 0xc7, 0x79, 0x81, 0x69, 0x4f, 0x7e, 0x54, 0x81,
+    0x70, 0x7d, 0x74, 0x82, 0x6e, 0x4e, 0x80, 0x6e, 0x56, 0xd4, 0x79, 0x7d,
+    0x61, 0x6c, 0x6f, 0x60, 0x79, 0x5b, 0x7a, 0x66, 0x59, 0x79, 0x81, 0x90,
+    0x6b, 0x89, 0x6f, 0x77, 0x66, 0x6f, 0x67, 0x77, 0x74, 0x73, 0x85, 0x7b,
+    0x65, 0x6c, 0x7c, 0x72, 0x53, 0x6a, 0x85, 0x70, 0x87, 0x7a, 0x69, 0x71,
+    0x66, 0x6c, 0x60, 0x8c, 0x21, 0x5f, 0x81, 0x68, 0x6d, 0x73, 0x69, 0x6e,
+    0x5d, 0x6b, 0x5e, 0x6c, 0x80, 0x22, 0x6a, 0x38, 0x61, 0x4d, 0x74, 0x63,
+    0x95, 0x7c, 0x69, 0x93, 0x73, 0x57, 0x83, 0x6a, 0x55, 0x78, 0x89, 0x80,
+    0x64, 0x93, 0x88, 0x7a, 0x89, 0x6b, 0x8d, 0x7a, 0x89, 0x7a, 0x89, 0x60,
+    0x6a, 0x78, 0x6f, 0x80, 0x7c, 0x61, 0x73, 0x6b, 0x7e, 0x73, 0x93, 0x87,
+    0x90, 0x83, 0x74, 0x7e, 0xad, 0x46, 0x6e, 0x77, 0x9d, 0x6f, 0x86, 0x61,
+    0x66, 0x43, 0x7b, 0x78, 0x79, 0x47, 0x81, 0x94, 0x67, 0xab, 0x88, 0x89,
+    0x7d, 0x84, 0x4b, 0x7d, 0x81, 0x72, 0x81, 0x88, 0x76, 0x6b, 0x84, 0x71,
+    0x7b, 0x7e, 0x75, 0x85, 0x7d, 0x78, 0x70, 0x86, 0x74, 0x8b, 0x7c, 0x85,
+    0x83, 0x86, 0x7c, 0x45, 0x73, 0x69, 0x7d, 0x87, 0x73, 0x77, 0x6f, 0x79,
+    0x70, 0x5e, 0x6c, 0x82, 0xb1, 0x65, 0x77, 0x6d, 0x69, 0x70, 0x82, 0x85,
+    0x71, 0x54, 0x79, 0x83, 0x71, 0x41, 0x7c, 0x71, 0x81, 0xc3, 0x7f, 0x5d,
+    0x55, 0xaa, 0x92, 0x7b, 0xa2, 0x9b, 0x62, 0x6d, 0x83, 0x9e, 0x99, 0x65,
+    0x9a, 0x89, 0x61, 0x86, 0x8e, 0x64, 0x9a, 0x88, 0x8c, 0x8a, 0xc6, 0x6b,
+    0xb2, 0x7a, 0x68, 0x52, 0x83, 0x4c, 0x74, 0xa6, 0x7b, 0x8e, 0x9f, 0xa2,
+    0x9d, 0x94, 0xa2, 0x66, 0xd0, 0x82, 0x96, 0x4a, 0x6a, 0x86, 0x64, 0x9c,
+    0x7e, 0x5a, 0x7b, 0x8b, 0x8a, 0x5b, 0x84, 0x88, 0x7b, 0x73, 0xae, 0x75,
+    0x6a, 0x46, 0x79, 0x80, 0x77, 0x6c, 0xa2, 0x85, 0x65, 0x6c, 0x41, 0x75,
+    0x68, 0x64, 0x82, 0x9e, 0x80, 0x9a, 0x61, 0x5e, 0x69, 0x7d, 0x5e, 0x77,
+    0x4e, 0x92, 0x8b, 0x81, 0x95, 0x90, 0x45, 0x71, 0x7c, 0x6c, 0x25, 0x8a,
+    0x60, 0x7c, 0x74, 0x66, 0x83, 0x6a, 0x60, 0x7a, 0x8c, 0x61, 0x66, 0x54,
+    0x88, 0x6c, 0x8d, 0x6b, 0x91, 0x59, 0x70, 0x6f, 0x94, 0x97, 0x5f, 0x97,
+    0x6e, 0x73, 0x89, 0x76, 0x80, 0x7b, 0x82, 0xa3, 0x73, 0x6e, 0x7e, 0x86,
+    0x92, 0x68, 0x72, 0x8f, 0x8a, 0x79, 0x74, 0x81, 0x77, 0x80, 0xa9, 0x42,
+    0x75, 0x75, 0x73, 0x61, 0x7f, 0x60, 0x7e, 0x90, 0x72, 0x85, 0x8d, 0x5f,
+    0x7d, 0x84, 0x8a, 0x88, 0xc4, 0x8b, 0x86, 0x44, 0x95, 0x6a, 0x8e, 0x73,
+    0x74, 0x8f, 0x62, 0x74, 0x7a, 0x4a, 0x86, 0x71, 0x82, 0xdb, 0x7b, 0x70,
+    0x77, 0x60, 0x45, 0x90, 0x89, 0x5d, 0x77, 0x66, 0x65, 0x74, 0x67, 0x76,
+    0xad, 0x6d, 0x86, 0x67, 0x7c, 0x79, 0x77, 0x6b, 0x8d, 0x74, 0x56, 0x45,
+    0x8e, 0x63, 0x69, 0x7c, 0x73, 0x80, 0x66, 0x88, 0x70, 0x8a, 0x88, 0x67,
+    0x70, 0x6c, 0x95, 0x75, 0xa8, 0x38, 0x69, 0x84, 0x8e, 0x7f, 0x8b, 0x53,
+    0x5c, 0x74, 0x74, 0x55, 0x72, 0x43, 0x74, 0x7d, 0x80, 0xaa, 0x88, 0x8f,
+    0x79, 0x8a, 0x51, 0x9d, 0x7f, 0x63, 0x65, 0x65, 0x4a, 0x7b, 0x7a, 0x72,
+    0x95, 0x87, 0x7e, 0x72, 0x96, 0x69, 0x6d, 0x70, 0x6e, 0x72, 0x8b, 0x52,
+    0x77, 0x75, 0x77, 0x78, 0x83, 0x92, 0x7e, 0x6a, 0x74, 0x69, 0x67, 0x9c,
+    0x80, 0x86, 0x83, 0x76, 0xac, 0x4d, 0x76, 0x78, 0x96, 0x86, 0x8e, 0x6d,
+    0x6a, 0x54, 0x6e, 0x72, 0x86, 0x91, 0x91, 0x9c, 0x86, 0x9a, 0x8d, 0x83,
+    0x7f, 0x6f, 0x9d, 0x7c, 0xab, 0x93, 0x6c, 0x6f, 0x87, 0x69, 0xaa, 0x85,
+    0x85, 0x9a, 0x5a, 0x81, 0x7f, 0x79, 0x88, 0x66, 0x73, 0x60, 0xb6, 0x66,
+    0x5b, 0x7c, 0x65, 0x64, 0x76, 0x6d, 0x76, 0x9c, 0x7d, 0x80, 0x60, 0x7b,
+    0x90, 0x8f, 0x89, 0x7c, 0xbf, 0xa4, 0x5d, 0x6c, 0x70, 0x6c, 0x7a, 0x74,
+    0x65, 0x5f, 0x77, 0x83, 0x7e, 0x5e, 0x6f, 0x75, 0x8f, 0xd6, 0x7b, 0x7f,
+    0x65, 0x7e, 0x5a, 0x7b, 0x78, 0x91, 0x6b, 0x68, 0x6a, 0xad, 0x6e, 0x7d,
+    0x85, 0x76, 0x80, 0x57, 0x7c, 0x87, 0x6a, 0x7b, 0x88, 0x39, 0x96, 0x50,
+    0x84, 0x7f, 0x6e, 0x5c, 0x80, 0x4b, 0x7f, 0x84, 0x8e, 0x80, 0x68, 0x67,
+    0x69, 0x91, 0x8c, 0x6a, 0xcc, 0x84, 0x77, 0x90, 0x64, 0x6b, 0x72, 0x7f,
+    0x68, 0x3f, 0x65, 0x99, 0x7b, 0x54, 0x93, 0x76, 0x73, 0xc6, 0x8a, 0x5d,
+    0x6a, 0x88, 0x70, 0x96, 0x6b, 0x7c, 0x80, 0x69, 0x7d, 0x84, 0x8c, 0x71,
+    0x81, 0x8c, 0x74, 0x8d, 0x5f, 0x7c, 0x71, 0x5a, 0x80, 0x7e, 0xa9, 0xb9,
+    0x5e, 0x94, 0x64, 0x6e, 0x85, 0x84, 0x7e, 0x85, 0x82, 0x74, 0x79, 0x70,
+    0x7a, 0x83, 0x84, 0x6c, 0xd2, 0x7c, 0x6f, 0x5e, 0x72, 0x89, 0x72, 0x61,
+    0x81, 0x6e, 0x85, 0x72, 0x9d, 0x66, 0x6f, 0x77, 0x7a, 0x83, 0xa4, 0x9b,
+    0x70, 0x6a, 0x75, 0x86, 0x81, 0x49, 0x73, 0x74, 0x61, 0x76, 0x88, 0x7b,
+    0x62, 0x72, 0x72, 0x7c, 0x7d, 0x71, 0x7f, 0x79, 0x73, 0x86, 0x72, 0x6d,
+    0x81, 0x7d, 0x78, 0x75, 0x87, 0x7e, 0x71, 0x57, 0x78, 0x7b, 0x7c, 0x67,
+    0x77, 0x85, 0x70, 0x6a, 0x9c, 0x72, 0x68, 0x75, 0x88, 0x77, 0x8a, 0x74,
+    0x6e, 0x58, 0x70, 0x7a, 0x7e, 0x4b, 0x6f, 0x80, 0x7c, 0x94, 0x64, 0x75,
+    0x79, 0x69, 0x5b, 0x72, 0x70, 0x75, 0x6d, 0x76, 0x76, 0x65, 0x6d, 0x75,
+    0x65, 0x74, 0x78, 0x6a, 0x6e, 0x72, 0x72, 0x72, 0x72, 0x73, 0x6e, 0x6b,
+    0x39, 0x74, 0x78, 0x72, 0x72, 0x71, 0x73, 0x6f, 0x6c, 0x6a, 0x72, 0x69,
+    0x6e, 0x78, 0x6e, 0x70, 0x71, 0x75, 0x75, 0x73, 0x78, 0x77, 0x73, 0x70,
+    0x7c, 0x68, 0x73, 0x6d, 0x6b, 0x36, 0x73, 0x78, 0x73, 0x5a, 0x70, 0x6d,
+    0x6f, 0x7b, 0x42, 0x9a, 0x86, 0x5e, 0x8f, 0x7b, 0x6b, 0x7d, 0x6d, 0x66,
+    0x8c, 0x55, 0x93, 0x6b, 0x62, 0x68, 0x83, 0x5b, 0x8b, 0x56, 0x4d, 0x57,
+    0x74, 0x62, 0x6f, 0x59, 0x7b, 0x81, 0x6b, 0x7b, 0x79, 0x7a, 0x80, 0x5e,
+    0x8c, 0x6c, 0x8e, 0x52, 0xb7, 0x47, 0x68, 0x89, 0x8f, 0x65, 0x8b, 0x53,
+    0x7f, 0x89, 0x78, 0x61, 0x7f, 0x68, 0x84, 0x7f, 0x85, 0xae, 0x9a, 0x79,
+    0x69, 0x70, 0x63, 0x74, 0x77, 0x72, 0x79, 0x79, 0x7e, 0x78, 0x7e, 0x71,
+    0x64, 0x80, 0x7c, 0x6a, 0x75, 0x6d, 0x79, 0x71, 0x7c, 0x76, 0x7c, 0x69,
+    0x6a, 0x73, 0x74, 0x7c, 0x74, 0x75, 0x78, 0x7b, 0x7a, 0x6c, 0x78, 0x5a,
+    0x6d, 0x3e, 0x77, 0x6b, 0x87, 0x72, 0x6d, 0x74, 0x5a, 0x73, 0x6b, 0x7e,
+    0x6f, 0x69, 0x7a, 0x75, 0x73, 0x6b, 0x63, 0x79, 0x6a, 0x6a, 0x64, 0x74,
+    0x75, 0x72, 0x80, 0x7a, 0x73, 0x73, 0x74, 0x71, 0x65, 0x79, 0x4f, 0x75,
+    0x79, 0x65, 0x7e, 0x7b, 0x75, 0x75, 0x6e, 0x75, 0x73, 0x70, 0x63, 0x99,
+    0x73, 0x79, 0x75, 0x7e, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x7e, 0x72, 0x66,
+    0x7d, 0x7a, 0x77, 0x75, 0x81, 0x6c, 0x6f, 0x76, 0x88, 0x72, 0x55, 0x6d,
+    0x75, 0x7c, 0x72, 0x6a, 0x73, 0x6c, 0x80, 0x75, 0x7d, 0x78, 0x80, 0x77,
+    0x71, 0x6d, 0x6f, 0x67, 0x6a, 0x6f, 0x6c, 0x69, 0x6c, 0x6f, 0x66, 0x69,
+    0x6f, 0x6b, 0x6d, 0x58, 0x5c, 0x71, 0x6b, 0x74, 0x6e, 0x70, 0x68, 0x6c,
+    0x6f, 0x6d, 0x71, 0x6e, 0x72, 0x6f, 0x70, 0x6e, 0x6e, 0x6c, 0x69, 0x6d,
+    0x6e, 0x68, 0x69, 0x6a, 0x5a, 0x6f, 0x6b, 0x72, 0x68, 0x6f, 0x6d, 0x6d,
+    0x74, 0x71, 0x70, 0x6b, 0x72, 0x6e, 0x6e, 0x70, 0x70, 0x63, 0x68, 0x6f,
+    0x77, 0x73, 0x9d, 0x7e, 0x79, 0x93, 0x80, 0x64, 0x74, 0x9f, 0x87, 0x70,
+    0x8f, 0x66, 0x61, 0x88, 0x62, 0x71, 0x6c, 0x6d, 0x79, 0x85, 0x9f, 0x82,
+    0xa1, 0x69, 0x69, 0x5b, 0x71, 0x4f, 0x6b, 0x8e, 0x78, 0x99, 0x9b, 0x97,
+    0x8a, 0x9b, 0x75, 0x70, 0xce, 0x8c, 0x96, 0x68, 0x86, 0x83, 0xa4, 0x76,
+    0x62, 0x58, 0x85, 0x70, 0x7f, 0x5a, 0x89, 0x70, 0x51, 0x7b, 0x9a, 0x6f,
+    0x7a, 0x75, 0x70, 0x7a, 0x75, 0x75, 0x70, 0x78, 0x68, 0x76, 0x6d, 0x74,
+    0x76, 0x75, 0x71, 0x79, 0x63, 0x76, 0x76, 0x75, 0x70, 0x76, 0x71, 0x72,
+    0x75, 0x7b, 0x74, 0x72, 0x74, 0x71, 0x73, 0x7a, 0x76, 0x76, 0x71, 0x76,
+    0x78, 0x72, 0x70, 0x71, 0x7d, 0x75, 0x72, 0x5a, 0x73, 0x72, 0x70, 0x6b,
+    0x77, 0x6c, 0x76, 0x75, 0x72, 0x74, 0x74, 0x76, 0x70, 0x72, 0x77, 0x76,
+    0x55, 0x6b, 0x73, 0x73, 0x7e, 0x8b, 0x89, 0x82, 0x86, 0xa4, 0x8c, 0x54,
+    0x5f, 0xa8, 0x46, 0x91, 0x75, 0x90, 0x67, 0x74, 0x72, 0x73, 0xaa, 0x73,
+    0x58, 0x71, 0x76, 0x48, 0x74, 0x4f, 0x6d, 0x99, 0x91, 0x7b, 0x5b, 0x9e,
+    0x8b, 0x59, 0x7f, 0x76, 0xc6, 0x9f, 0x91, 0x5e, 0x72, 0x77, 0x73, 0xa6,
+    0x65, 0x55, 0x6d, 0x97, 0x8c, 0x5b, 0x89, 0x81, 0x7f, 0x81, 0x68, 0x6c,
+    0x8d, 0x5e, 0x56, 0x94, 0x94, 0x7f, 0x84, 0x71, 0x64, 0x99, 0xa3, 0x7b,
+    0x61, 0x81, 0x7c, 0x9d, 0x7e, 0x77, 0x3f, 0x63, 0x4b, 0x3b, 0x92, 0x79,
+    0x60, 0x6f, 0x9e, 0x92, 0x7e, 0xa1, 0x5e, 0x9a, 0x8b, 0x87, 0x35, 0x4e,
+    0x5b, 0x42, 0x86, 0x71, 0xc8, 0xb3, 0x5a, 0x83, 0xad, 0x5a, 0x54, 0x5b,
+    0x77, 0x50, 0x62, 0x9f, 0x96, 0x60, 0x61, 0x72, 0x97, 0xe6, 0x60, 0x97,
+    0x84, 0x70, 0x6b, 0x7d, 0x81, 0x7e, 0x8a, 0x6c, 0x83, 0x94, 0xaa, 0x7f,
+    0x8a, 0x80, 0x6a, 0x96, 0x95, 0x82, 0x58, 0x7c, 0x7b, 0x8f, 0xb0, 0x70,
+    0x9b, 0x9e, 0x6e, 0x6d, 0x7d, 0x85, 0x6b, 0x89, 0x79, 0xa2, 0x59, 0x6a,
+    0x91, 0x7f, 0x86, 0x8b, 0xcf, 0x94, 0x7b, 0x7f, 0x79, 0x80, 0x72, 0x84,
+    0x97, 0xb1, 0x84, 0x94, 0x81, 0x5e, 0xa8, 0xa2, 0x93, 0xd9, 0x85, 0x71,
+    0x65, 0x74, 0xa8, 0x84, 0x7d, 0x91, 0x81, 0x6b, 0x8e, 0x85, 0x98, 0x85,
+    0x7a, 0x84, 0x57, 0x74, 0x6b, 0x65, 0x8d, 0x80, 0x8c, 0x7a, 0xae, 0x6d,
+    0x98, 0x6b, 0x80, 0x59, 0x7f, 0x5a, 0x7b, 0x99, 0x78, 0x86, 0x91, 0x87,
+    0xa8, 0x97, 0x7d, 0x7b, 0xc9, 0x9c, 0x8b, 0xb0, 0x71, 0x74, 0x65, 0x64,
+    0x65, 0x59, 0x85, 0x8b, 0x7c, 0x5b, 0x96, 0x6e, 0x53, 0xcf, 0x6c, 0x83,
+    0x5c, 0x88, 0x90, 0x7b, 0x9a, 0x75, 0x60, 0x88, 0x9a, 0x9d, 0x98, 0x7c,
+    0x88, 0x8e, 0xa6, 0x77, 0x52, 0x73, 0x5e, 0x75, 0x9a, 0x8e, 0xbc, 0x66,
+    0x94, 0x71, 0x7a, 0x49, 0x96, 0x6c, 0x6f, 0x88, 0x8b, 0x97, 0x6f, 0x86,
+    0x8d, 0x90, 0x7f, 0x81, 0xc8, 0x8a, 0x86, 0x8d, 0x72, 0x6d, 0x77, 0x83,
+    0x65, 0x65, 0x7f, 0x84, 0x6f, 0x6d, 0xb8, 0x7a, 0x5b, 0xd4, 0x9c, 0x92,
+    0x66, 0x6f, 0x7f, 0x73, 0x7a, 0x75, 0x9a, 0x7d, 0x4a, 0x6d, 0x5c, 0x67,
+    0x67, 0x5c, 0x7d, 0x93, 0x7e, 0x95, 0x4b, 0x60, 0x46, 0x74, 0x66, 0x78,
+    0x43, 0x88, 0x89, 0x81, 0x83, 0x87, 0x54, 0x71, 0x81, 0x6c, 0x30, 0x75,
+    0x68, 0x71, 0x68, 0x77, 0x87, 0x69, 0x64, 0x7f, 0x8a, 0x5f, 0x6d, 0x6a,
+    0x68, 0x66, 0x8d, 0x69, 0x83, 0x65, 0x6f, 0x79, 0x86, 0x91, 0x5f, 0x8c,
+    0x71, 0x73, 0x75, 0x70, 0x73, 0x6f, 0x71, 0x77, 0x74, 0x70, 0x70, 0x72,
+    0x74, 0x69, 0x78, 0x76, 0x75, 0x6e, 0x70, 0x70, 0x6f, 0x74, 0x71, 0x6f,
+    0x70, 0x6f, 0x6d, 0x75, 0x71, 0x74, 0x74, 0x64, 0x6b, 0x70, 0x6b, 0x70,
+    0x73, 0x75, 0x74, 0x74, 0x75, 0x74, 0x6c, 0x6b, 0x76, 0x73, 0x75, 0x73,
+    0x77, 0x71, 0x72, 0x75, 0x75, 0x6f, 0x71, 0x79, 0x71, 0x75, 0x71, 0x70,
+    0x7d, 0x84, 0x72, 0x93, 0x7e, 0x56, 0x88, 0x59, 0x67, 0x6e, 0x6d, 0x6c,
+    0x77, 0x58, 0x86, 0x84, 0x89, 0x72, 0x6a, 0x73, 0x70, 0x73, 0x60, 0x5c,
+    0x4d, 0x6e, 0x62, 0x6e, 0x6c, 0x87, 0x7a, 0x83, 0x63, 0x72, 0x7c, 0x7e,
+    0x86, 0x88, 0x5c, 0x64, 0xae, 0x72, 0x76, 0x6e, 0x6a, 0x69, 0x98, 0x63,
+    0x73, 0x6d, 0x78, 0x6f, 0x7f, 0x46, 0x72, 0x77, 0x7a, 0x9d, 0x7c, 0x6f,
+    0x75, 0x4b, 0x84, 0x77, 0x7b, 0x74, 0x75, 0x7a, 0x7a, 0x7c, 0x74, 0x81,
+    0x7f, 0x7d, 0x5c, 0x88, 0x85, 0x83, 0x6f, 0x70, 0x80, 0x87, 0x88, 0x7f,
+    0x6c, 0x7c, 0x77, 0x70, 0x6a, 0x7b, 0x73, 0x82, 0x73, 0x79, 0x7f, 0x83,
+    0x5e, 0x6a, 0x50, 0x86, 0x93, 0x7f, 0x70, 0x58, 0x8a, 0x6f, 0x85, 0x7e,
+    0x5f, 0x61, 0x6d, 0x7b, 0x73, 0x73, 0x6d, 0x7a, 0x7f, 0x70, 0x8b, 0x82,
+    0x7f, 0x7a, 0x73, 0x7a, 0x62, 0x74, 0x62, 0x68, 0x7e, 0x73, 0x75, 0x84,
+    0x75, 0x7b, 0x75, 0x62, 0x7b, 0x20, 0x3f, 0x80, 0x76, 0x72, 0x83, 0x63,
+    0x82, 0x67, 0x65, 0x69, 0x60, 0x6f, 0x7d, 0x77, 0x5c, 0x7a, 0x7a, 0x6f,
+    0x75, 0x6c, 0x75, 0x6a, 0x83, 0x77, 0x87, 0x78, 0x6d, 0x77, 0x78, 0x7a,
+    0x7c, 0x74, 0x62, 0x79, 0x5d, 0x74, 0x73, 0x78, 0x6b, 0x71, 0x79, 0x78,
+    0x70, 0x2f, 0x81, 0x90, 0x78, 0x60, 0x76, 0x7a, 0x78, 0x71, 0x80, 0x76,
+    0x80, 0x77, 0x60, 0x6d, 0x6f, 0x69, 0x7e, 0x72, 0x7a, 0x96, 0x86, 0x74,
+    0x66, 0x79, 0x72, 0x69, 0x6f, 0x76, 0x75, 0x84, 0x79, 0x76, 0x71, 0x68,
+    0x7f, 0x77, 0x5a, 0x78, 0xa5, 0x80, 0x69, 0x70, 0x91, 0x68, 0x83, 0x79,
+    0x74, 0x5e, 0x72, 0x7c, 0x86, 0x47, 0x76, 0x73, 0x89, 0x8a, 0x8a, 0x78,
+    0x53, 0x91, 0xb8, 0x7a, 0x8f, 0x67, 0x6d, 0x88, 0x76, 0x94, 0x96, 0x57,
+    0x8c, 0x9c, 0x75, 0x89, 0x5c, 0x8f, 0x8d, 0x7f, 0x7d, 0x83, 0xc4, 0x63,
+    0x84, 0x6f, 0x77, 0x6e, 0x84, 0x79, 0x77, 0x9c, 0xa0, 0x85, 0x9f, 0x8a,
+    0x8c, 0x8d, 0x77, 0x75, 0xcc, 0x8c, 0x7d, 0x6b, 0x71, 0x78, 0x73, 0x80,
+    0x69, 0x57, 0x80, 0x86, 0x89, 0x65, 0x7a, 0x8e, 0x65, 0x72, 0xb2, 0x7b,
+    0x83, 0x6f, 0x5e, 0x7d, 0x7f, 0x67, 0x6c, 0x6b, 0x62, 0x9c, 0x85, 0x73,
+    0x59, 0x57, 0x5c, 0x6a, 0x78, 0x65, 0x5b, 0x68, 0x75, 0x71, 0xc5, 0x7c,
+    0x65, 0x83, 0x63, 0x74, 0x73, 0x6b, 0x7f, 0xa7, 0x8b, 0x99, 0x51, 0x72,
+    0x64, 0x8f, 0x70, 0x94, 0xc9, 0x84, 0x8b, 0x70, 0x67, 0x83, 0x8c, 0x7c,
+    0x7a, 0x64, 0x7f, 0x9d, 0xa0, 0x62, 0x74, 0x88, 0x82, 0xca, 0x8c, 0x8d,
+    0x78, 0x70, 0x71, 0x77, 0x76, 0x6f, 0x69, 0x77, 0x6e, 0x6e, 0x6b, 0x7d,
+    0x77, 0x7b, 0x70, 0x79, 0x6d, 0x63, 0x22, 0x71, 0x5c, 0x72, 0x71, 0x75,
+    0x61, 0x71, 0x73, 0x71, 0x6d, 0x71, 0x75, 0x7e, 0x78, 0x76, 0x65, 0x6f,
+    0x6d, 0x74, 0x7a, 0x79, 0x87, 0x6f, 0x71, 0x72, 0x7d, 0x70, 0x72, 0x6f,
+    0x75, 0x75, 0x73, 0x7b, 0x6c, 0x6e, 0x73, 0x74, 0x73, 0x77, 0x6b, 0x75,
+    0x72, 0x75, 0x77, 0x7c, 0x76, 0x73, 0x6c, 0x72, 0x70, 0x75, 0x73, 0x76,
+    0x78, 0x76, 0x72, 0x77, 0x7b, 0x77, 0x79, 0x73, 0x76, 0x76, 0x6d, 0x76,
+    0x78, 0x6e, 0x79, 0x76, 0x75, 0x75, 0x73, 0x76, 0x73, 0x75, 0x78, 0x71,
+    0x74, 0x77, 0x73, 0x73, 0x7f, 0x73, 0x76, 0x74, 0x78, 0x75, 0x61, 0x72,
+    0x6f, 0x73, 0x72, 0x73, 0x75, 0x73, 0x7a, 0x78, 0x7a, 0x56, 0x71, 0x76,
+    0x70, 0x61, 0x65, 0x8a, 0x8f, 0x7f, 0x81, 0x7b, 0x8c, 0x8f, 0x81, 0x81,
+    0x58, 0x59, 0xa4, 0x92, 0x6d, 0x87, 0x62, 0x6d, 0x7a, 0x58, 0xc4, 0x6d,
+    0x79, 0x6d, 0x6c, 0x8d, 0x7a, 0x7f, 0x6d, 0x96, 0x87, 0x9e, 0x6d, 0x78,
+    0x82, 0x7f, 0x77, 0x77, 0xc1, 0x77, 0x9a, 0x84, 0x90, 0x7a, 0x7b, 0x7b,
+    0x66, 0x80, 0x7f, 0x88, 0x87, 0x5b, 0x7a, 0x8d, 0x61, 0xe3, 0x64, 0x9a,
+    0x74, 0x71, 0x6d, 0x7e, 0x8f, 0x67, 0x70, 0x6f, 0x78, 0x77, 0x79, 0x6f,
+    0x6b, 0x85, 0x82, 0x87, 0x83, 0x70, 0x7b, 0x65, 0x79, 0x83, 0x86, 0x72,
+    0x79, 0x7b, 0x72, 0x71, 0x7e, 0x84, 0x75, 0x68, 0x7e, 0x74, 0x78, 0x78,
+    0x58, 0x8b, 0x6f, 0x80, 0xa1, 0x62, 0x7e, 0x7b, 0x87, 0x72, 0x7d, 0x6d,
+    0x7e, 0x58, 0x74, 0x6a, 0x7a, 0x4e, 0x7b, 0x81, 0x5d, 0x82, 0x8b, 0x86,
+    0x83, 0x6c, 0x6f, 0x7d, 0x8d, 0x6e, 0x85, 0x8e, 0x87, 0x77, 0x8c, 0x8a,
+    0x75, 0x54, 0xac, 0x87, 0x5b, 0x66, 0x6c, 0x7a, 0x78, 0x79, 0xa6, 0x7f,
+    0x8d, 0x8e, 0x77, 0x79, 0x7c, 0x7d, 0x93, 0x90, 0x8b, 0x9a, 0x51, 0x78,
+    0x5c, 0x70, 0x7b, 0x79, 0xd3, 0x5d, 0x8c, 0x9c, 0x71, 0x76, 0x71, 0x7a,
+    0x4e, 0x56, 0x7d, 0x62, 0x84, 0x4b, 0x8d, 0x7c, 0x68, 0xe2, 0x9a, 0x93,
+    0x69, 0x61, 0x44, 0x83, 0x6f, 0x67, 0x94, 0x92, 0x69, 0x6a, 0x4c, 0x7c,
+    0x56, 0x6b, 0x92, 0xab, 0x77, 0xa6, 0x41, 0x48, 0x74, 0x9a, 0x61, 0x80,
+    0x43, 0x98, 0x8d, 0x9a, 0xa0, 0xa0, 0x51, 0x79, 0x94, 0x5a, 0x48, 0x75,
+    0x6d, 0x3a, 0x8a, 0x5b, 0x86, 0x71, 0x5a, 0x8a, 0xa2, 0x65, 0x67, 0x46,
+    0x8a, 0x61, 0x87, 0x6b, 0x99, 0x58, 0x77, 0x8d, 0x9f, 0xa1, 0x7b, 0x94,
+    0x7d, 0x72, 0x74, 0x79, 0x76, 0x76, 0x65, 0x71, 0x73, 0x6f, 0x75, 0x71,
+    0x74, 0x77, 0x78, 0x6c, 0x6d, 0x67, 0x7b, 0x6d, 0x70, 0x75, 0x6c, 0x71,
+    0x66, 0x82, 0x6f, 0x71, 0x72, 0x75, 0x6e, 0x74, 0x71, 0x72, 0x82, 0x6f,
+    0x77, 0x70, 0x7e, 0x71, 0x7a, 0x7e, 0x70, 0x62, 0x7c, 0x6f, 0x6f, 0x72,
+    0x7d, 0x6d, 0x74, 0x6f, 0x6c, 0x72, 0x67, 0x77, 0x74, 0x7b, 0x72, 0x7a,
+    0x9c, 0x55, 0x61, 0x81, 0x92, 0x81, 0x57, 0x89, 0x91, 0x5b, 0x8c, 0x9f,
+    0x64, 0x6c, 0x81, 0x72, 0x72, 0x61, 0x4b, 0x61, 0x5d, 0x64, 0xa2, 0x70,
+    0x64, 0x9e, 0x62, 0x86, 0x82, 0x76, 0x7b, 0x86, 0x7c, 0x56, 0x7a, 0x75,
+    0x60, 0x4b, 0xa3, 0x7f, 0xcb, 0x78, 0x57, 0x84, 0xac, 0x74, 0x6b, 0x7d,
+    0x80, 0x8b, 0x82, 0x7d, 0x8a, 0x63, 0x60, 0x83, 0x5e, 0xcb, 0x8c, 0x7c,
+    0x84, 0x7a, 0x58, 0x7b, 0x74, 0x67, 0x6c, 0x63, 0x80, 0x6e, 0x91, 0x79,
+    0x5c, 0x9f, 0x83, 0x5e, 0x8d, 0x7e, 0x87, 0x61, 0x6c, 0x5e, 0xae, 0x74,
+    0x86, 0x63, 0x7a, 0x67, 0x83, 0x84, 0x5f, 0x84, 0x65, 0x9c, 0x70, 0x76,
+    0x90, 0x92, 0x6b, 0x76, 0xc6, 0x7b, 0x89, 0x8c, 0x70, 0x6b, 0x6a, 0x49,
+    0x77, 0x4d, 0x7f, 0x90, 0x7a, 0x58, 0x62, 0x8a, 0x68, 0xdc, 0x6a, 0x90,
+    0x76, 0x4d, 0x80, 0x7d, 0x77, 0x76, 0x70, 0x76, 0x80, 0x81, 0x76, 0x87,
+    0x76, 0x69, 0x47, 0x8b, 0x75, 0x7c, 0x7a, 0x80, 0x83, 0x64, 0x84, 0x84,
+    0x58, 0x8c, 0x84, 0x6c, 0x66, 0x73, 0x71, 0x78, 0x72, 0x68, 0x6f, 0x81,
+    0x79, 0x6f, 0x6d, 0x84, 0xa6, 0x6e, 0x80, 0x5d, 0x84, 0x7c, 0x76, 0x82,
+    0x6d, 0x77, 0x70, 0x77, 0x76, 0x85, 0x7e, 0x7a, 0x77, 0x72, 0x8c, 0x87,
+    0x61, 0x8a, 0xc0, 0x96, 0x99, 0x7c, 0x78, 0x52, 0x8c, 0x7b, 0x81, 0x5d,
+    0x99, 0x63, 0x81, 0x69, 0x46, 0x6d, 0x6f, 0x95, 0x77, 0x50, 0x9c, 0x4b,
+    0x98, 0x77, 0x7c, 0x3f, 0x70, 0x8a, 0x85, 0x89, 0x82, 0x85, 0x8a, 0x8a,
+    0x84, 0x9c, 0x73, 0x7e, 0xc4, 0x87, 0x7a, 0x4b, 0x6f, 0x94, 0x93, 0x63,
+    0x91, 0x44, 0x7d, 0x77, 0x6a, 0x5f, 0x9d, 0x7d, 0x85, 0xd5, 0x8b, 0x75,
+    0x7f, 0x4b, 0x88, 0x7f, 0x98, 0x87, 0x8e, 0x59, 0x8b, 0x87, 0x95, 0x65,
+    0xa2, 0x8c, 0x70, 0x53, 0x77, 0x7b, 0x55, 0x66, 0x78, 0x68, 0xa4, 0x72,
+    0x60, 0x76, 0x8d, 0x8f, 0x7f, 0x8d, 0x80, 0x91, 0x71, 0x7a, 0x6d, 0x8f,
+    0x9b, 0x98, 0x8a, 0x7a, 0xcf, 0x7f, 0x8c, 0x75, 0x59, 0x64, 0x67, 0x6d,
+    0x72, 0x4e, 0x71, 0x89, 0x8b, 0x5b, 0x85, 0x78, 0x7f, 0xcf, 0x87, 0x89,
+    0x7e, 0x7d, 0x6c, 0x8c, 0x7d, 0x78, 0x6a, 0x76, 0x76, 0x7d, 0x5e, 0x70,
+    0x6b, 0x67, 0x7f, 0x71, 0x78, 0x76, 0x77, 0x72, 0x6b, 0x74, 0x73, 0x6d,
+    0x6e, 0x70, 0x65, 0x8e, 0x73, 0x64, 0x7b, 0x78, 0x73, 0x79, 0x81, 0x71,
+    0x6b, 0x75, 0x7f, 0x75, 0x9f, 0x83, 0x74, 0x7c, 0x52, 0x75, 0x2b, 0x71,
+    0x75, 0x7c, 0x75, 0x74, 0x71, 0x73, 0x6e, 0x7f, 0x78, 0x8b, 0x80, 0x77,
+    0x6b, 0x70, 0x73, 0x6e, 0x6f, 0x71, 0x72, 0x72, 0x72, 0x75, 0x71, 0x6e,
+    0x6d, 0x6f, 0x73, 0x72, 0x63, 0x78, 0x71, 0x6f, 0x77, 0x6a, 0x76, 0x75,
+    0x71, 0x76, 0x73, 0x72, 0x74, 0x6c, 0x71, 0x74, 0x7b, 0x72, 0x74, 0x70,
+    0x6b, 0x75, 0x69, 0x72, 0x74, 0x71, 0x78, 0x74, 0x73, 0x70, 0x75, 0x72,
+    0x71, 0x6c, 0x76, 0x67, 0x6b, 0x5d, 0x71, 0x83, 0x78, 0x71, 0x70, 0x6c,
+    0x70, 0x71, 0x5d, 0x76, 0x76, 0x75, 0x75, 0x74, 0x71, 0x6c, 0x71, 0x72,
+    0x77, 0x73, 0x6d, 0x6f, 0x77, 0x73, 0x73, 0x70, 0x73, 0x75, 0x6f, 0x71,
+    0x79, 0x70, 0x74, 0x70, 0x79, 0x77, 0x73, 0x72, 0x76, 0x6d, 0x6c, 0x73,
+    0x77, 0x6c, 0x78, 0x76, 0x82, 0x74, 0x75, 0x6f, 0x72, 0x7a, 0x5b, 0x76,
+    0x69, 0x70, 0x72, 0x75, 0x72, 0x7b, 0x68, 0x75, 0x76, 0x76, 0x6d, 0x71,
+    0x8e, 0x83, 0x5d, 0x77, 0x70, 0x5d, 0x91, 0x83, 0x6e, 0x71, 0xae, 0x68,
+    0x55, 0x65, 0x99, 0x81, 0x5d, 0x82, 0x56, 0x5a, 0x78, 0x7b, 0xb4, 0x68,
+    0x93, 0xb5, 0x9c, 0x92, 0x76, 0x80, 0x7a, 0x95, 0x79, 0x4f, 0x62, 0x82,
+    0x64, 0x81, 0x79, 0x6b, 0xd1, 0x63, 0x8e, 0x85, 0xa7, 0x67, 0x6a, 0x67,
+    0x7f, 0x5f, 0x73, 0xaa, 0x87, 0x5d, 0x8c, 0x75, 0x91, 0xd2, 0x5e, 0x86,
+    0x82, 0x58, 0x5a, 0x7e, 0x90, 0x47, 0x89, 0x5e, 0xa0, 0x8d, 0xa2, 0x8e,
+    0x5b, 0x56, 0x71, 0x97, 0x76, 0x7f, 0x76, 0x51, 0x68, 0x47, 0xb8, 0x4b,
+    0x60, 0x6d, 0x7b, 0x77, 0x9a, 0x89, 0x6f, 0x93, 0x67, 0x4d, 0x40, 0x48,
+    0x56, 0x72, 0x96, 0x51, 0xc1, 0x95, 0x82, 0x80, 0x74, 0x5c, 0x5b, 0x7e,
+    0x81, 0x12, 0x6d, 0xaa, 0x7d, 0x5c, 0x60, 0x76, 0x5e, 0xe3, 0x87, 0x7c,
+    0x86, 0x69, 0x74, 0x76, 0x82, 0x5f, 0x6d, 0x6d, 0x71, 0x74, 0x7a, 0x59,
+    0x74, 0x73, 0x71, 0x86, 0x72, 0x72, 0x6b, 0x5b, 0x77, 0x7a, 0xa6, 0x9e,
+    0x6d, 0x70, 0x92, 0x58, 0x9a, 0x6e, 0x6a, 0xa0, 0x89, 0x84, 0x8e, 0x90,
+    0x7b, 0x8c, 0x93, 0x6e, 0xce, 0x94, 0x85, 0x7a, 0x67, 0x6b, 0x71, 0x75,
+    0x75, 0x57, 0x6c, 0x77, 0x86, 0x5c, 0x79, 0x76, 0x85, 0x74, 0x6c, 0x81,
+    0x73, 0x73, 0x70, 0x73, 0x74, 0x72, 0x6b, 0x74, 0x74, 0x6d, 0x73, 0x70,
+    0x69, 0x6d, 0x73, 0x71, 0x75, 0x71, 0x73, 0x71, 0x70, 0x72, 0x70, 0x6f,
+    0x78, 0x71, 0x71, 0x75, 0x76, 0x72, 0x72, 0x6e, 0x72, 0x74, 0x6e, 0x6a,
+    0x73, 0x6f, 0x72, 0x75, 0x73, 0x7a, 0x71, 0x6e, 0x71, 0x73, 0x77, 0x72,
+    0x71, 0x72, 0x75, 0x70, 0x6f, 0x62, 0x74, 0x77, 0x73, 0x71, 0x71, 0x71,
+    0x54, 0x75, 0x75, 0x7a, 0x7d, 0x76, 0x7f, 0x6c, 0xb0, 0x9a, 0x79, 0x79,
+    0xad, 0x81, 0x65, 0x63, 0x7b, 0x7f, 0x8a, 0x71, 0x8e, 0x7d, 0xb0, 0xad,
+    0x92, 0x7b, 0x68, 0x63, 0x75, 0x56, 0x64, 0x5f, 0x66, 0x8e, 0x68, 0x99,
+    0xb5, 0x83, 0x7f, 0x7e, 0xca, 0x98, 0x83, 0x46, 0x71, 0x7d, 0x84, 0x92,
+    0x94, 0x65, 0x7a, 0xa0, 0x90, 0x58, 0x98, 0x69, 0x87, 0x77, 0x95, 0x6e,
+    0x64, 0x67, 0x82, 0x7e, 0x93, 0x85, 0x64, 0x6b, 0x87, 0x88, 0x8b, 0x4e,
+    0x87, 0xa4, 0x61, 0x57, 0x79, 0x8f, 0x6c, 0x63, 0x8c, 0x90, 0x90, 0x7a,
+    0x96, 0x72, 0x59, 0x51, 0x74, 0x87, 0x78, 0x7f, 0xb7, 0x9a, 0x9a, 0x87,
+    0x85, 0x8b, 0x80, 0x69, 0xd0, 0x9d, 0x7d, 0x85, 0x71, 0x76, 0x72, 0x64,
+    0x87, 0x82, 0x7a, 0x83, 0x86, 0x61, 0xb1, 0x80, 0x76, 0xda, 0x77, 0x6f,
+    0x6b, 0x6b, 0x67, 0x7f, 0x89, 0x66, 0x7d, 0x5e, 0x6c, 0x80, 0x80, 0x67,
+    0x88, 0x6a, 0x85, 0x73, 0x73, 0x7e, 0x74, 0x6b, 0x87, 0x6e, 0x7b, 0x64,
+    0x9b, 0x71, 0x5e, 0x85, 0x7a, 0x73, 0x65, 0x8b, 0x6c, 0x8a, 0x7f, 0x60,
+    0x68, 0x6c, 0x8f, 0x5c, 0xa0, 0x7c, 0x6f, 0x7f, 0x85, 0x6f, 0x83, 0x67,
+    0x65, 0x55, 0x7b, 0x6f, 0x77, 0x45, 0x71, 0x76, 0x69, 0x86, 0x73, 0x61,
+    0x50, 0x80, 0x96, 0x7b, 0x91, 0x9d, 0x7d, 0x80, 0x77, 0xa9, 0x91, 0x7e,
+    0x8d, 0x88, 0x69, 0x8f, 0x97, 0x68, 0x7c, 0x76, 0x78, 0x96, 0x8b, 0x63,
+    0x90, 0x6b, 0x66, 0x52, 0x70, 0x79, 0x78, 0x94, 0x81, 0x96, 0x84, 0x99,
+    0x9b, 0xa1, 0x7b, 0x9a, 0xd3, 0x9e, 0x87, 0x52, 0x75, 0x69, 0x69, 0x6f,
+    0x78, 0x91, 0x91, 0x86, 0x82, 0x5a, 0x7e, 0x82, 0x75, 0xdc, 0xa7, 0x61,
+    0x72, 0x3d, 0x7a, 0x8a, 0x68, 0x5f, 0x73, 0x7c, 0x7e, 0x69, 0x7e, 0x6d,
+    0x7d, 0x72, 0x64, 0x6f, 0x7f, 0x79, 0x7d, 0x79, 0x73, 0x78, 0x76, 0x7c,
+    0x73, 0x75, 0x73, 0x70, 0x71, 0x74, 0x7c, 0x80, 0x79, 0x6e, 0x6f, 0x6e,
+    0x82, 0x80, 0x7a, 0x6e, 0x85, 0x7f, 0x73, 0x70, 0x8d, 0x76, 0x7c, 0x7c,
+    0x80, 0x6c, 0x6e, 0x7b, 0x7b, 0x62, 0x73, 0x77, 0x7a, 0x88, 0x7f, 0x7c,
+    0x65, 0x6e, 0x75, 0x7a, 0x93, 0xa7, 0x82, 0x84, 0x85, 0x9b, 0x8e, 0x7a,
+    0x93, 0x8e, 0x73, 0x6e, 0x5f, 0x64, 0x7f, 0x74, 0x76, 0x77, 0x60, 0x5f,
+    0xa5, 0x81, 0x7f, 0x64, 0x73, 0x57, 0x6f, 0x9c, 0x65, 0xa1, 0x8b, 0x85,
+    0x82, 0x91, 0x80, 0x6a, 0xc9, 0x80, 0x80, 0x51, 0x6d, 0x87, 0x9c, 0x8e,
+    0x89, 0x51, 0x6d, 0x85, 0x76, 0x53, 0x7c, 0x84, 0x5e, 0xd2, 0x81, 0x82,
+    0x72, 0x78, 0x78, 0x80, 0x6b, 0x6e, 0x80, 0x76, 0x76, 0x72, 0x80, 0x79,
+    0x77, 0x78, 0x72, 0x73, 0x6c, 0x6f, 0x6c, 0x71, 0x73, 0x6e, 0x7d, 0x72,
+    0x7b, 0x51, 0x4f, 0x74, 0x76, 0x6b, 0x72, 0x7b, 0x75, 0x6f, 0x80, 0x76,
+    0x6f, 0x7f, 0x7e, 0x73, 0x83, 0x7b, 0x73, 0x5f, 0x78, 0x70, 0x77, 0x7b,
+    0x70, 0x7f, 0x74, 0x6c, 0x73, 0x68, 0x72, 0x79, 0x67, 0x77, 0x74, 0x82,
+    0x83, 0x63, 0x7f, 0x82, 0x7a, 0x7b, 0x7a, 0x57, 0x7f, 0x8a, 0x83, 0x8e,
+    0x75, 0x77, 0x68, 0x8d, 0x73, 0x75, 0x63, 0x88, 0x75, 0x74, 0x6b, 0x7c,
+    0x80, 0x88, 0x78, 0x5a, 0x81, 0x6a, 0x69, 0x83, 0x75, 0x6a, 0x86, 0x8f,
+    0x73, 0x7f, 0x90, 0x7b, 0xad, 0x6d, 0x83, 0x5e, 0x83, 0x7f, 0x81, 0x88,
+    0x73, 0x71, 0x6b, 0x77, 0x70, 0x7c, 0x70, 0x79, 0x71, 0x80, 0x83, 0x89,
+    0x71, 0x68, 0x69, 0x77, 0x78, 0x68, 0x73, 0x6b, 0x72, 0x6b, 0x73, 0x73,
+    0x73, 0x65, 0x63, 0x6a, 0x78, 0x6f, 0x6c, 0x74, 0x70, 0x7a, 0x64, 0x7b,
+    0x72, 0x70, 0x74, 0x62, 0x74, 0x72, 0x71, 0x7b, 0x6d, 0x6e, 0x75, 0x70,
+    0x78, 0x6f, 0x75, 0x6b, 0x7b, 0x7d, 0x76, 0x6c, 0x7a, 0x6c, 0x69, 0x6c,
+    0x74, 0x76, 0x72, 0x78, 0x79, 0x5c, 0x76, 0x6f, 0x79, 0x7b, 0x66, 0x6b,
+    0x6e, 0x79, 0x71, 0x7c, 0x74, 0x77, 0x7a, 0x78, 0x74, 0x78, 0x72, 0x7a,
+    0x73, 0x6a, 0x70, 0x7a, 0x80, 0x76, 0x6c, 0x72, 0x74, 0x74, 0x76, 0x76,
+    0x73, 0x47, 0x70, 0x78, 0x76, 0x7b, 0x72, 0x73, 0x7b, 0x72, 0x72, 0x7e,
+    0x5e, 0x7a, 0x79, 0x75, 0x7f, 0x6f, 0x78, 0x73, 0x73, 0x74, 0x85, 0x79,
+    0x77, 0x74, 0x76, 0x70, 0x6d, 0x71, 0x78, 0x74, 0x75, 0x78, 0x77, 0x75,
+    0x68, 0x74, 0x64, 0x7a, 0x85, 0x8f, 0x84, 0x86, 0x6d, 0x7c, 0x7a, 0x5d,
+    0x91, 0x7a, 0x5f, 0x77, 0x74, 0x64, 0x5a, 0x50, 0x73, 0x82, 0xca, 0x7b,
+    0x9b, 0x68, 0x72, 0x4f, 0x87, 0x8a, 0x74, 0xbf, 0x78, 0x58, 0x5b, 0x75,
+    0x62, 0x5a, 0x86, 0x64, 0xc9, 0x9c, 0xa7, 0x79, 0x81, 0x8c, 0x4b, 0x97,
+    0x7f, 0x59, 0x74, 0x82, 0x75, 0x5d, 0x5a, 0x75, 0x5a, 0xdd, 0x93, 0x9e,
+    0x8d, 0x5b, 0x75, 0x89, 0xa6, 0x58, 0x8e, 0x63, 0x91, 0x91, 0xb9, 0x5d,
+    0x8a, 0x64, 0x71, 0x89, 0x5d, 0x8f, 0x61, 0x69, 0x82, 0x45, 0xbb, 0x66,
+    0x7e, 0xa5, 0x71, 0xac, 0x80, 0x9d, 0x84, 0x90, 0x90, 0x96, 0x65, 0x6a,
+    0x6d, 0x70, 0x7c, 0x5b, 0xcb, 0x8a, 0x81, 0x75, 0x72, 0x73, 0x72, 0x7d,
+    0x81, 0x70, 0x85, 0xa0, 0x87, 0x64, 0x84, 0x75, 0x90, 0x7a, 0xa1, 0x66,
+    0x4d, 0x5c, 0x8d, 0x7c, 0x7a, 0x7b, 0x76, 0x79, 0x73, 0x5c, 0x6e, 0x8d,
+    0x7f, 0x6a, 0x67, 0x70, 0x57, 0x7b, 0x8e, 0x87, 0x7a, 0x81, 0x7c, 0x7c,
+    0x7f, 0x8e, 0x8b, 0x7f, 0x67, 0x7c, 0x69, 0x76, 0x5e, 0x7a, 0x8c, 0x82,
+    0x88, 0x64, 0x7c, 0x78, 0x8d, 0x80, 0x6d, 0x82, 0x89, 0x5f, 0x7a, 0x8a,
+    0x6d, 0x68, 0x64, 0x78, 0x7b, 0x95, 0x89, 0x80, 0x5c, 0x86, 0x7f, 0x91,
+    0x58, 0x6e, 0x59, 0x80, 0x7f, 0x5d, 0x5c, 0x7e, 0x95, 0x7e, 0x9e, 0x68,
+    0x5c, 0x6b, 0x76, 0x82, 0x5a, 0x8e, 0x68, 0x77, 0x86, 0x7d, 0xa0, 0x52,
+    0x83, 0x97, 0x6a, 0x61, 0x77, 0x75, 0x6d, 0x8b, 0x8e, 0x67, 0x7e, 0x85,
+    0x91, 0x52, 0x8f, 0x54, 0xaa, 0x8f, 0x81, 0x95, 0x71, 0x45, 0x7a, 0x5e,
+    0x7d, 0x52, 0x7a, 0x8c, 0x8a, 0x61, 0x5f, 0x7d, 0x83, 0x95, 0x5e, 0x84,
+    0x79, 0x74, 0x70, 0x7a, 0x72, 0x77, 0x7b, 0x72, 0x71, 0x6d, 0x72, 0x6f,
+    0x7b, 0x7c, 0x7d, 0x78, 0x6e, 0x6f, 0x73, 0x6d, 0x76, 0x74, 0x70, 0x72,
+    0x6d, 0x74, 0x73, 0x74, 0x70, 0x6a, 0x6f, 0x73, 0x72, 0x74, 0x7f, 0x70,
+    0x78, 0x7e, 0x73, 0x6e, 0x7a, 0x7c, 0x70, 0x80, 0x71, 0x6f, 0x83, 0x7c,
+    0x7b, 0x73, 0x75, 0x76, 0x68, 0x77, 0x7f, 0x7b, 0x6f, 0x6e, 0x7c, 0x76,
+    0x7e, 0x59, 0x71, 0x77, 0x77, 0x77, 0x8c, 0x78, 0x95, 0x73, 0x88, 0x7a,
+    0x72, 0x78, 0x60, 0x80, 0x88, 0x73, 0x84, 0x68, 0x5c, 0x77, 0xa6, 0x53,
+    0x4c, 0x67, 0x83, 0x55, 0x83, 0x94, 0x6a, 0x8b, 0x7a, 0x92, 0x4c, 0x64,
+    0x71, 0x73, 0x9a, 0x67, 0xc0, 0x81, 0x64, 0x71, 0x99, 0x71, 0x47, 0x89,
+    0x84, 0x87, 0x76, 0x86, 0x83, 0x57, 0x89, 0x7f, 0x7e, 0xbd, 0x66, 0x91,
+    0x79, 0x76, 0x7a, 0x7a, 0x79, 0x75, 0x73, 0x71, 0x74, 0x73, 0x70, 0x70,
+    0x79, 0x76, 0x75, 0x71, 0x5d, 0x7a, 0x73, 0x76, 0x73, 0x75, 0x6c, 0x70,
+    0x66, 0x7f, 0x78, 0x72, 0x73, 0x79, 0x73, 0x75, 0x70, 0x78, 0x77, 0x74,
+    0x7b, 0x6d, 0x74, 0x74, 0x81, 0x76, 0x71, 0x7f, 0x74, 0x7b, 0x8b, 0x6e,
+    0x72, 0x71, 0x74, 0x72, 0x78, 0x77, 0x71, 0x73, 0x73, 0x79, 0x76, 0x72,
+    0x67, 0x8a, 0x94, 0x7f, 0x82, 0x86, 0x80, 0x5f, 0x95, 0x92, 0x95, 0x54,
+    0x95, 0x8f, 0x76, 0x83, 0x6a, 0x7b, 0x8b, 0x72, 0x7e, 0x7c, 0xb4, 0x64,
+    0x94, 0x67, 0x7d, 0x46, 0x84, 0x64, 0x76, 0x96, 0x83, 0x85, 0x76, 0x9c,
+    0x94, 0xa1, 0x97, 0x7f, 0xca, 0x98, 0x85, 0x4d, 0x2f, 0x76, 0x6a, 0x9e,
+    0x84, 0x81, 0x83, 0x78, 0x80, 0x5d, 0x95, 0x76, 0x5f, 0xdc, 0x78, 0x7c,
+    0x75, 0x6f, 0x79, 0x8d, 0x7a, 0x68, 0x78, 0x63, 0x63, 0x6b, 0x6e, 0x6a,
+    0x70, 0x71, 0x78, 0x7a, 0x73, 0x6f, 0x73, 0x81, 0x7d, 0x6c, 0x76, 0x4a,
+    0x7b, 0x79, 0x73, 0x69, 0x77, 0x8a, 0x77, 0x6c, 0x6c, 0x70, 0x87, 0x68,
+    0x7f, 0x7e, 0x69, 0x6d, 0xa4, 0x69, 0x68, 0x70, 0x77, 0x73, 0x87, 0x61,
+    0x6f, 0x71, 0x77, 0x6f, 0x71, 0x43, 0x7b, 0x6e, 0x79, 0x9d, 0x62, 0x81,
+    0x6e, 0x56, 0x61, 0x77, 0x35, 0x64, 0x72, 0x71, 0x6b, 0x6f, 0x6d, 0x78,
+    0x6e, 0x69, 0x69, 0x35, 0x73, 0x6a, 0x80, 0x5d, 0x6f, 0x53, 0x6f, 0x75,
+    0x76, 0x73, 0x75, 0x67, 0x7c, 0x6f, 0x71, 0x76, 0x67, 0x68, 0x77, 0x42,
+    0x76, 0x4d, 0x6e, 0x63, 0x69, 0x6c, 0x74, 0x76, 0x66, 0x3a, 0x6f, 0x64,
+    0x88, 0x71, 0x70, 0x5c, 0x44, 0x74, 0x6c, 0x7c, 0x69, 0x78, 0x59, 0x72,
+    0x6c, 0x85, 0x75, 0x7b, 0x81, 0x93, 0x78, 0x78, 0x7e, 0xb3, 0x8d, 0x70,
+    0x8a, 0x49, 0x70, 0x7e, 0x4b, 0x57, 0x78, 0x7f, 0x83, 0x57, 0xa5, 0x63,
+    0x7f, 0x9b, 0x95, 0x5e, 0x7d, 0x5e, 0x84, 0x97, 0x8d, 0x59, 0x9b, 0x8e,
+    0x90, 0x81, 0x7e, 0x79, 0xc5, 0x91, 0x82, 0x6c, 0xa4, 0x86, 0x70, 0x8d,
+    0x65, 0x7e, 0x8b, 0x7e, 0x7b, 0x64, 0x8b, 0x88, 0x42, 0xb8, 0x88, 0x9a,
+    0x6f, 0x79, 0x7d, 0x85, 0x75, 0x74, 0x70, 0x79, 0x7d, 0x6e, 0x73, 0x6e,
+    0x65, 0x72, 0x78, 0x78, 0x7c, 0x7a, 0x59, 0x70, 0x77, 0x75, 0x80, 0x79,
+    0x7f, 0x6b, 0x6d, 0x72, 0x71, 0x74, 0x71, 0x76, 0x79, 0x73, 0x7a, 0x82,
+    0x77, 0x83, 0x74, 0x73, 0x8f, 0x84, 0x70, 0x77, 0x7d, 0x73, 0x84, 0x7a,
+    0x6b, 0x7f, 0x73, 0x72, 0x78, 0x76, 0x67, 0x75, 0x77, 0x82, 0x85, 0x71,
+    0x70, 0x5e, 0x3d, 0x95, 0x7e, 0x5c, 0x84, 0x89, 0x69, 0x57, 0x4c, 0xab,
+    0x46, 0x58, 0xae, 0xa8, 0x9b, 0x95, 0x4c, 0x43, 0x90, 0x68, 0x49, 0x75,
+    0x24, 0x98, 0x7d, 0x98, 0x87, 0xbf, 0x64, 0x92, 0x95, 0x53, 0x44, 0x69,
+    0x6f, 0x6e, 0x90, 0x65, 0x9b, 0x6d, 0x51, 0x9b, 0xa4, 0x4c, 0x8d, 0x54,
+    0x7d, 0x54, 0xa0, 0x66, 0x80, 0x3d, 0x7e, 0xa4, 0xa4, 0x92, 0x57, 0x81,
+    0x78, 0x6f, 0x95, 0x7d, 0x8c, 0x6a, 0x6f, 0x65, 0x77, 0x71, 0x76, 0x6a,
+    0x8d, 0x88, 0x35, 0x68, 0x79, 0x50, 0x89, 0x7a, 0x7c, 0x93, 0x9e, 0x51,
+    0x93, 0x75, 0x86, 0x46, 0x74, 0x4b, 0x79, 0x98, 0x7c, 0x89, 0x71, 0x78,
+    0xa6, 0x7e, 0x84, 0x74, 0xce, 0xa0, 0x6c, 0x7c, 0x7e, 0x7d, 0x86, 0x65,
+    0x89, 0x4d, 0x6c, 0x87, 0x77, 0x57, 0x9b, 0x71, 0x58, 0xcf, 0x8f, 0x76,
+    0x7a, 0x72, 0x79, 0x77, 0x6d, 0x65, 0x87, 0x74, 0x7c, 0x70, 0x74, 0x70,
+    0x81, 0x77, 0x7a, 0x74, 0x67, 0x79, 0x64, 0x70, 0x7d, 0x6f, 0x7e, 0x7d,
+    0x7c, 0x66, 0x6f, 0x72, 0x72, 0x6d, 0x71, 0x74, 0x76, 0x75, 0x7b, 0x69,
+    0x72, 0x7f, 0x78, 0x78, 0x7b, 0x70, 0x74, 0x89, 0x7d, 0x74, 0x82, 0x7b,
+    0x71, 0x78, 0x71, 0x69, 0x5f, 0x73, 0x6b, 0x74, 0x73, 0x76, 0x78, 0x76,
+    0x86, 0x4e, 0x80, 0x8b, 0x4e, 0x5b, 0x7d, 0x65, 0x67, 0x76, 0x82, 0x73,
+    0x84, 0x7d, 0x71, 0x78, 0x7d, 0x76, 0x89, 0x70, 0x73, 0x8c, 0x8b, 0x82,
+    0x82, 0x76, 0x7f, 0x78, 0x70, 0x7a, 0x73, 0x80, 0x81, 0x78, 0x7b, 0x6d,
+    0x74, 0x71, 0x7c, 0x6c, 0xa8, 0x8a, 0x65, 0x73, 0x8a, 0x7d, 0x92, 0x5e,
+    0x67, 0x61, 0x6d, 0x6e, 0x8f, 0x4d, 0x73, 0x78, 0x5a, 0x9a, 0x6b, 0x76,
+    0x59, 0x73, 0x61, 0x79, 0x88, 0x5f, 0x70, 0x6a, 0x96, 0x6b, 0x7c, 0x8a,
+    0x98, 0x3b, 0x80, 0x7d, 0x81, 0x73, 0x84, 0x82, 0x96, 0x97, 0x94, 0x74,
+    0x75, 0x80, 0x6c, 0x8f, 0x76, 0x86, 0x61, 0x9f, 0x91, 0x78, 0x68, 0x69,
+    0x86, 0x5a, 0x7c, 0x7a, 0xcb, 0xb0, 0x7a, 0xac, 0x72, 0x93, 0x7a, 0x6c,
+    0x68, 0x56, 0x82, 0x8d, 0x87, 0x60, 0x88, 0x71, 0x51, 0xa3, 0xa7, 0xa3,
+    0x6c, 0x6c, 0x6e, 0x76, 0x76, 0x6c, 0x73, 0x6e, 0x6d, 0x70, 0x74, 0x74,
+    0x75, 0x6e, 0x6e, 0x70, 0x73, 0x6d, 0x72, 0x71, 0x72, 0x78, 0x64, 0x73,
+    0x71, 0x73, 0x77, 0x70, 0x74, 0x74, 0x71, 0x70, 0x70, 0x73, 0x6b, 0x71,
+    0x73, 0x6c, 0x75, 0x72, 0x74, 0x7c, 0x73, 0x70, 0x75, 0x6e, 0x6f, 0x6f,
+    0x78, 0x71, 0x72, 0x75, 0x74, 0x63, 0x74, 0x70, 0x7a, 0x71, 0x65, 0x70,
+    0x7e, 0xb2, 0x99, 0x54, 0xb1, 0x95, 0x21, 0x42, 0x98, 0x87, 0xc1, 0x12,
+    0x98, 0xd8, 0x3a, 0x58, 0x42, 0x30, 0xbd, 0xad, 0xa0, 0x7b, 0xd3, 0x9e,
+    0xb7, 0x1e, 0x31, 0x4f, 0x64, 0x33, 0xa0, 0x18, 0x52, 0x93, 0x70, 0xdd,
+    0x9b, 0x71, 0x4f, 0xe3, 0x61, 0x89, 0xb0, 0x2d, 0x55, 0x93, 0xbc, 0x93,
+    0x13, 0x7a, 0x80, 0x86, 0x2f, 0xae, 0x86, 0x39, 0x50, 0x1e, 0xca, 0x3d,
+    0x93, 0x4d, 0x66, 0x7b, 0x7c, 0xb6, 0x5e, 0x6e, 0xa3, 0x79, 0x78, 0x8b,
+    0x63, 0x61, 0xae, 0xb2, 0x8c, 0x92, 0x75, 0x62, 0x80, 0x78, 0x7b, 0x63,
+    0x5e, 0x7d, 0x5b, 0x94, 0x70, 0x7c, 0x5e, 0x95, 0x90, 0x6e, 0x85, 0x6b,
+    0x7d, 0x58, 0xae, 0x7e, 0xcd, 0xa8, 0x5e, 0x71, 0x93, 0x72, 0x6c, 0x6b,
+    0x61, 0x6c, 0x84, 0x8c, 0x66, 0x65, 0x82, 0x88, 0x4e, 0xd7, 0x65, 0x84,
+    0x77, 0x78, 0x69, 0x81, 0x72, 0x4e, 0x70, 0x76, 0x6a, 0x71, 0x7c, 0x74,
+    0x74, 0x71, 0x78, 0x7d, 0x74, 0x76, 0x72, 0x74, 0x70, 0x7f, 0x66, 0x66,
+    0x74, 0x64, 0x7a, 0x75, 0x71, 0x6c, 0x74, 0x65, 0x6c, 0x72, 0x75, 0x7d,
+    0x7f, 0x86, 0x75, 0x73, 0x96, 0x71, 0x6a, 0x6f, 0x6a, 0x6f, 0x83, 0x5f,
+    0x79, 0x6e, 0x73, 0x73, 0x71, 0x67, 0x80, 0x73, 0x7c, 0x83, 0x74, 0x7e,
+    0x73, 0x80, 0x76, 0x81, 0x6d, 0x75, 0x80, 0x73, 0x70, 0x7c, 0x7d, 0x6c,
+    0x62, 0x5d, 0x5d, 0x7a, 0x74, 0x76, 0x75, 0x71, 0x6a, 0x66, 0x73, 0x84,
+    0x70, 0x7d, 0x76, 0x77, 0x71, 0x7d, 0x7c, 0x6e, 0x76, 0x77, 0x8d, 0x76,
+    0x75, 0x7f, 0x64, 0x6e, 0x85, 0x6c, 0x6c, 0x73, 0x55, 0x77, 0x43, 0x71,
+    0x72, 0x73, 0x71, 0x74, 0x71, 0x70, 0x6b, 0x71, 0x80, 0x82, 0x85, 0x6a,
+    0x68, 0x7c, 0x6a, 0x80, 0x73, 0x71, 0x7a, 0x6f, 0x6d, 0x71, 0x82, 0x49,
+    0x7c, 0x66, 0x34, 0x74, 0x71, 0x74, 0x73, 0x73, 0x7d, 0x7b, 0x7d, 0x6f,
+    0x7d, 0x72, 0x6e, 0x61, 0x77, 0x6f, 0x7c, 0x78, 0x71, 0x73, 0x7f, 0x79,
+    0x79, 0x77, 0x6e, 0x7b, 0x8f, 0x78, 0x72, 0x6d, 0x32, 0x79, 0x75, 0x68,
+    0x74, 0x6f, 0x6b, 0x72, 0x77, 0x46, 0x78, 0x78, 0x77, 0x82, 0x6f, 0x77,
+    0x70, 0x72, 0x74, 0x73, 0x6f, 0x71, 0x73, 0x70, 0x72, 0x71, 0x70, 0x6a,
+    0x76, 0x6e, 0x75, 0x70, 0x74, 0x70, 0x76, 0x71, 0x73, 0x74, 0x73, 0x71,
+    0x6c, 0x73, 0x75, 0x76, 0x74, 0x68, 0x72, 0x74, 0x70, 0x73, 0x71, 0x6f,
+    0x73, 0x6e, 0x77, 0x70, 0x73, 0x71, 0x71, 0x76, 0x7a, 0x76, 0x74, 0x72,
+    0x74, 0x74, 0x74, 0x71, 0x75, 0x70, 0x71, 0x72, 0x74, 0x73, 0x75, 0x71,
+    0x89, 0x61, 0x78, 0x93, 0x5e, 0x55, 0x83, 0x7c, 0x60, 0x84, 0x78, 0x86,
+    0x6a, 0xa2, 0x89, 0x6d, 0x71, 0x76, 0x90, 0x53, 0x6d, 0x8c, 0x82, 0x77,
+    0x98, 0x76, 0x67, 0x6d, 0x78, 0x8e, 0x7a, 0x7e, 0x78, 0x87, 0x73, 0x7d,
+    0x82, 0x79, 0x65, 0x78, 0x83, 0x4b, 0x7f, 0x5a, 0x95, 0x64, 0x92, 0x65,
+    0x92, 0x5e, 0x6d, 0x7b, 0x8d, 0x5c, 0x69, 0x78, 0x6c, 0xb2, 0x93, 0x83,
+    0x6d, 0x4d, 0x71, 0x78, 0x7a, 0x6a, 0x9e, 0x8e, 0x66, 0x75, 0x5e, 0x67,
+    0x62, 0x66, 0x7d, 0x9c, 0x80, 0x93, 0x46, 0x5b, 0x56, 0x31, 0x4a, 0x74,
+    0x52, 0x89, 0x93, 0x91, 0x96, 0x7d, 0x53, 0x78, 0x82, 0x62, 0x2d, 0x73,
+    0x57, 0x63, 0x80, 0x76, 0x87, 0x6a, 0x58, 0x78, 0x8d, 0x61, 0x61, 0x65,
+    0x64, 0x63, 0x8b, 0x70, 0x8e, 0x6b, 0x71, 0x78, 0x8d, 0x8d, 0x65, 0x97,
+    0x69, 0x78, 0x83, 0x72, 0x63, 0x5b, 0x71, 0x78, 0x81, 0x86, 0x75, 0x78,
+    0x73, 0x73, 0x7b, 0x7a, 0x5b, 0x70, 0x7b, 0x83, 0x7c, 0x68, 0x7f, 0x7b,
+    0x67, 0x75, 0x59, 0x71, 0x63, 0x6f, 0x6d, 0x73, 0x6e, 0x7b, 0x7b, 0x5c,
+    0x6f, 0x87, 0x36, 0x72, 0x7c, 0x72, 0x7a, 0x6f, 0x72, 0x5f, 0x71, 0x6a,
+    0x80, 0x7f, 0x73, 0x60, 0x7b, 0x69, 0x7a, 0x80, 0x64, 0x70, 0x71, 0x78,
+    0x61, 0x71, 0x45, 0x7c, 0x7b, 0x7b, 0x73, 0x6f, 0x6e, 0x6d, 0x81, 0x6c,
+    0x77, 0x95, 0x94, 0x79, 0x80, 0x74, 0x83, 0x67, 0x7f, 0x89, 0x8b, 0x67,
+    0x53, 0x8e, 0x72, 0x55, 0x7e, 0x77, 0x6f, 0x92, 0x72, 0x7d, 0x8f, 0x75,
+    0x6c, 0x8b, 0x74, 0x63, 0x9c, 0x4d, 0x80, 0x84, 0x8c, 0x73, 0x8e, 0x79,
+    0x78, 0x5c, 0x6c, 0x7b, 0x7e, 0x57, 0x88, 0x8e, 0x6e, 0x85, 0x7a, 0x7b,
+    0x7f, 0x70, 0x82, 0x49, 0x73, 0x71, 0x70, 0x79, 0x85, 0x68, 0x88, 0x82,
+    0x6c, 0x83, 0x8e, 0x71, 0x72, 0x6f, 0x7b, 0x70, 0x70, 0x68, 0x82, 0x9a,
+    0x65, 0x7a, 0x73, 0x86, 0x74, 0x5e, 0x6a, 0x72, 0x75, 0x83, 0x7c, 0x69,
+    0x74, 0x7d, 0x7b, 0x7a, 0x84, 0x7f, 0x72, 0x83, 0x93, 0x63, 0x5a, 0x76,
+    0x70, 0x7d, 0x7c, 0x6f, 0x73, 0x74, 0x89, 0x79, 0x67, 0x6e, 0x15, 0x76,
+    0x5b, 0x96, 0x80, 0x7d, 0x83, 0xaa, 0x53, 0x6f, 0x88, 0x8d, 0x9b, 0x4d,
+    0xaa, 0x76, 0x50, 0x56, 0x61, 0x96, 0x7c, 0x68, 0x8e, 0x68, 0xb5, 0x66,
+    0x97, 0x77, 0x66, 0x6a, 0x6a, 0x4f, 0x78, 0x91, 0x86, 0x86, 0x98, 0x81,
+    0x93, 0x95, 0x77, 0x78, 0xcc, 0x8b, 0x98, 0x69, 0x5a, 0x79, 0x66, 0x5a,
+    0x7c, 0x58, 0x78, 0x8a, 0x8c, 0x51, 0x9f, 0x6a, 0x68, 0x73, 0xb3, 0x8d,
+    0x7f, 0x64, 0x7d, 0x80, 0x7a, 0x79, 0x79, 0x67, 0x7e, 0x88, 0x88, 0x80,
+    0x55, 0x63, 0x55, 0x97, 0x70, 0x55, 0x46, 0x68, 0x95, 0x64, 0xbe, 0x9d,
+    0x5e, 0x5c, 0x78, 0x6a, 0x6a, 0x82, 0x78, 0x8f, 0x6c, 0xa0, 0x67, 0x7f,
+    0x9a, 0x8b, 0x88, 0x76, 0xcb, 0x7e, 0x77, 0x86, 0x6e, 0x83, 0x72, 0x6e,
+    0x87, 0x9f, 0x8b, 0x93, 0x86, 0x61, 0x8b, 0x7a, 0x65, 0xda, 0x79, 0x7f,
+    0x71, 0x50, 0x78, 0x85, 0x61, 0x68, 0x6b, 0x78, 0x73, 0x62, 0x83, 0x75,
+    0x43, 0x84, 0x6d, 0x7e, 0x7f, 0x71, 0x83, 0x7a, 0x71, 0x79, 0x70, 0x73,
+    0x7d, 0x7a, 0x6f, 0x74, 0x78, 0x7a, 0x79, 0x77, 0x79, 0x6a, 0x7b, 0x6f,
+    0x75, 0x83, 0x72, 0x6e, 0x95, 0x66, 0x72, 0x77, 0x91, 0x76, 0x88, 0x66,
+    0x7f, 0x6a, 0x74, 0x77, 0x79, 0x45, 0x7f, 0x76, 0x78, 0x88, 0x7d, 0x76,
+    0x74, 0x72, 0x7e, 0x80, 0x76, 0x7c, 0x78, 0x75, 0x6d, 0x6f, 0x6d, 0x71,
+    0x73, 0x5d, 0x68, 0x75, 0x78, 0x76, 0x78, 0x73, 0x70, 0x70, 0x76, 0x43,
+    0x74, 0x77, 0x77, 0x71, 0x75, 0x78, 0x6f, 0x7b, 0x71, 0x76, 0x7e, 0x74,
+    0x6b, 0x78, 0x76, 0x75, 0x78, 0x72, 0x79, 0x71, 0x71, 0x70, 0x66, 0x7f,
+    0x78, 0x76, 0x74, 0x74, 0x70, 0x77, 0x64, 0x76, 0x71, 0x76, 0x70, 0x7a,
+    0x64, 0x81, 0x5e, 0x92, 0x71, 0x5c, 0x7f, 0x73, 0x6e, 0x70, 0x58, 0x85,
+    0x70, 0x75, 0x98, 0x6e, 0x5b, 0x78, 0x82, 0x6c, 0x6d, 0x5a, 0x76, 0x52,
+    0x78, 0x7a, 0x73, 0x68, 0x6f, 0x82, 0x78, 0x75, 0x6d, 0x7f, 0x6f, 0x7c,
+    0x70, 0x8b, 0x7d, 0x81, 0xa3, 0x67, 0x6b, 0x72, 0x81, 0x7e, 0x7a, 0x58,
+    0x75, 0x55, 0x78, 0x74, 0x6c, 0x72, 0x76, 0x6c, 0x7e, 0xa9, 0x7c, 0x64,
+    0x41, 0x56, 0x61, 0x47, 0x68, 0x6b, 0x73, 0x65, 0x65, 0x6b, 0x65, 0x76,
+    0x7c, 0x6d, 0x5c, 0x4e, 0x6f, 0x63, 0x72, 0x53, 0x67, 0x33, 0x68, 0x7a,
+    0x72, 0x72, 0x7e, 0x55, 0x73, 0x6a, 0x6e, 0x80, 0x63, 0x6b, 0x70, 0x36,
+    0x70, 0x58, 0x5e, 0x6b, 0x4f, 0x67, 0x6c, 0x6d, 0x53, 0x60, 0x69, 0x59,
+    0x87, 0x77, 0x79, 0x60, 0x70, 0x74, 0x6e, 0x78, 0x59, 0x72, 0x5a, 0x69,
+    0x8e, 0x7c, 0x83, 0x89, 0x97, 0x9d, 0x72, 0x89, 0x89, 0x6a, 0x95, 0x55,
+    0x9f, 0x75, 0x84, 0x71, 0x67, 0x79, 0x56, 0x79, 0x7f, 0x84, 0xb6, 0x5a,
+    0x89, 0x6c, 0x5e, 0x6e, 0x8f, 0x77, 0x6d, 0x83, 0x85, 0x97, 0x8d, 0x90,
+    0x9f, 0x8b, 0x81, 0x88, 0xcc, 0x9b, 0x9a, 0x6d, 0x77, 0x8a, 0x86, 0x65,
+    0x62, 0x55, 0x8d, 0x83, 0x96, 0x5f, 0xa0, 0x6c, 0x73, 0x7f, 0x9e, 0x6c,
+    0x69, 0x6c, 0x6f, 0x8f, 0x8a, 0x90, 0x7c, 0x66, 0x61, 0x6e, 0x5a, 0x81,
+    0x6b, 0x90, 0x68, 0x4e, 0x75, 0x90, 0x4b, 0x70, 0x59, 0x4b, 0x74, 0x88,
+    0x70, 0x9f, 0x8f, 0x61, 0x82, 0x7d, 0x72, 0x7e, 0x7d, 0x64, 0x6e, 0x47,
+    0x6f, 0x88, 0x91, 0x76, 0xd4, 0x82, 0x5d, 0x9c, 0x7e, 0x60, 0x72, 0x8d,
+    0x71, 0x61, 0x59, 0x81, 0xa8, 0x68, 0x69, 0x7d, 0x84, 0x74, 0x5a, 0xa9,
+    0x85, 0x71, 0x6e, 0x89, 0x92, 0x72, 0x81, 0x76, 0x49, 0x71, 0x7b, 0x76,
+    0x6f, 0x7f, 0x5f, 0x97, 0x99, 0x75, 0x48, 0x73, 0x80, 0x55, 0x76, 0x70,
+    0x7e, 0x78, 0x62, 0x86, 0x90, 0x7c, 0x6e, 0x92, 0x88, 0x6d, 0x55, 0x86,
+    0x8e, 0x73, 0x7d, 0x83, 0xd5, 0x89, 0x84, 0x71, 0x72, 0x76, 0x72, 0x8a,
+    0x92, 0x67, 0x82, 0x62, 0x82, 0x55, 0x8b, 0x71, 0x99, 0x76, 0x9a, 0x85,
+    0x6d, 0x62, 0x7c, 0x7b, 0x80, 0x60, 0x72, 0x73, 0x7d, 0x6e, 0x74, 0x6d,
+    0x6d, 0x76, 0x75, 0x76, 0x81, 0x73, 0x7d, 0x79, 0x79, 0x7b, 0x7c, 0x81,
+    0x6f, 0x71, 0x70, 0x7a, 0x7d, 0x77, 0x73, 0x73, 0x7c, 0x67, 0x70, 0x5d,
+    0x6c, 0x75, 0x77, 0x79, 0x91, 0x74, 0x71, 0x67, 0x82, 0x7b, 0x7d, 0x7b,
+    0x7e, 0x69, 0x73, 0x77, 0x75, 0x51, 0x76, 0x74, 0x67, 0x7f, 0x81, 0x77,
+    0x75, 0x7c, 0x6b, 0x81, 0x75, 0x7c, 0x74, 0x77, 0x5d, 0x77, 0x59, 0x6a,
+    0x54, 0x6c, 0x64, 0x74, 0x78, 0x74, 0x7a, 0x73, 0x72, 0x7b, 0x74, 0x34,
+    0x52, 0x6d, 0x7b, 0x77, 0x78, 0x7e, 0x70, 0x73, 0x6d, 0x7e, 0x7e, 0x69,
+    0x70, 0x85, 0x73, 0x75, 0x9c, 0x7d, 0x7a, 0x77, 0x5d, 0x74, 0x77, 0x62,
+    0x7c, 0x6a, 0x7a, 0x6f, 0x70, 0x6d, 0x71, 0x6d, 0x6d, 0x85, 0x56, 0x76,
+    0x68, 0x75, 0x7b, 0x7a, 0x79, 0x75, 0x70, 0x75, 0x71, 0x75, 0x73, 0x72,
+    0x71, 0x6e, 0x70, 0x78, 0x80, 0x79, 0x66, 0x74, 0x71, 0x72, 0x73, 0x77,
+    0x7b, 0x3e, 0x79, 0x79, 0x72, 0x71, 0x73, 0x7b, 0x77, 0x71, 0x6d, 0x74,
+    0x64, 0x78, 0x76, 0x72, 0x82, 0x6e, 0x75, 0x75, 0x7b, 0x70, 0x43, 0x73,
+    0x6f, 0x74, 0x75, 0x75, 0x76, 0x73, 0x75, 0x76, 0x76, 0x7f, 0x7c, 0x73,
+    0x73, 0x72, 0x71, 0x71, 0x70, 0x72, 0x77, 0x72, 0x71, 0x71, 0x6f, 0x6d,
+    0x6f, 0x6f, 0x6f, 0x74, 0x77, 0x70, 0x4c, 0x70, 0x70, 0x71, 0x70, 0x71,
+    0x6c, 0x69, 0x71, 0x72, 0x72, 0x70, 0x71, 0x71, 0x6d, 0x71, 0x6f, 0x6e,
+    0x71, 0x70, 0x6f, 0x71, 0x6e, 0x71, 0x71, 0x82, 0x70, 0x73, 0x6e, 0x71,
+    0x71, 0x6e, 0x74, 0x75, 0x70, 0x70, 0x72, 0x74, 0x73, 0x71, 0x71, 0x6f,
+    0x6c, 0x74, 0x5a, 0x70, 0x7b, 0x73, 0x6b, 0x75, 0x7d, 0x66, 0x74, 0x79,
+    0x80, 0x7d, 0x6d, 0x70, 0x6d, 0x73, 0x76, 0x72, 0x74, 0x79, 0x6c, 0x7a,
+    0x72, 0x74, 0x7c, 0x71, 0x78, 0x83, 0x6d, 0x74, 0x77, 0x65, 0x66, 0x71,
+    0x7f, 0x4f, 0x84, 0x76, 0x84, 0x76, 0x78, 0x7b, 0x85, 0x81, 0x5a, 0x6e,
+    0x64, 0x61, 0x73, 0x70, 0x6f, 0x7c, 0x67, 0x79, 0x74, 0x7e, 0x85, 0x6c,
+    0x71, 0x75, 0x75, 0x6e, 0x70, 0x77, 0x5f, 0x5f, 0x76, 0x76, 0x75, 0x69,
+    0x75, 0x78, 0x70, 0x4d, 0x6f, 0x6f, 0x58, 0x77, 0x61, 0x6b, 0x79, 0x79,
+    0x79, 0x72, 0x6c, 0x6d, 0x6c, 0x71, 0x79, 0x6b, 0x64, 0x78, 0x77, 0x65,
+    0x7d, 0x74, 0x76, 0x79, 0x70, 0x76, 0x74, 0x75, 0x71, 0x75, 0x78, 0x79,
+    0x75, 0x74, 0x6a, 0x7b, 0x67, 0x71, 0x75, 0x79, 0x72, 0x60, 0x75, 0x52,
+    0x78, 0x6f, 0x80, 0x79, 0x7e, 0x78, 0x6f, 0x70, 0x79, 0x74, 0x7e, 0x70,
+    0x7e, 0x73, 0x70, 0x84, 0x72, 0x75, 0x77, 0x78, 0x74, 0x75, 0x7b, 0x78,
+    0x7e, 0x79, 0x73, 0x6d, 0x7b, 0x7a, 0x71, 0x79, 0x77, 0x73, 0x6c, 0x73,
+    0x60, 0x80, 0x7e, 0x76, 0x94, 0x80, 0x76, 0x71, 0x80, 0x70, 0x7f, 0x7c,
+    0x63, 0x6b, 0x75, 0x73, 0x71, 0x49, 0x73, 0x7c, 0x6c, 0x64, 0x83, 0x79,
+    0x86, 0x70, 0x5e, 0x73, 0x66, 0x82, 0x77, 0x7c, 0x95, 0x7d, 0xb1, 0x6e,
+    0x62, 0x7f, 0x66, 0x8c, 0x6a, 0x6e, 0x54, 0x75, 0x81, 0x86, 0x9a, 0x7c,
+    0x9a, 0x93, 0x97, 0x7e, 0x87, 0x4e, 0x69, 0x94, 0x91, 0x78, 0x53, 0x7c,
+    0x66, 0x90, 0x98, 0x8d, 0xda, 0x85, 0x95, 0x99, 0x71, 0x87, 0x56, 0x85,
+    0x6b, 0x46, 0x77, 0x7a, 0x87, 0x5f, 0x77, 0x7b, 0x86, 0xea, 0x87, 0x9d,
+    0x8e, 0x59, 0xb1, 0x7a, 0x9f, 0x84, 0x76, 0x55, 0x85, 0x89, 0x8f, 0x66,
+    0x88, 0x8e, 0x4c, 0x64, 0x6d, 0x4f, 0x4d, 0x69, 0x7e, 0x8b, 0xb1, 0x6f,
+    0x7a, 0x61, 0x6c, 0x46, 0x76, 0x52, 0x7b, 0x87, 0x66, 0x95, 0x95, 0x91,
+    0x9d, 0x7e, 0x79, 0x89, 0xd8, 0xa2, 0x72, 0x67, 0x6f, 0x81, 0x72, 0x71,
+    0x6e, 0x68, 0x7b, 0x90, 0x87, 0x62, 0x85, 0x7d, 0x4e, 0x75, 0xa0, 0x7d,
+    0x55, 0x83, 0x6a, 0x7b, 0x88, 0x64, 0x52, 0x6e, 0x78, 0x74, 0x86, 0x78,
+    0x8d, 0x53, 0x58, 0x89, 0x6d, 0x74, 0x5f, 0x68, 0x81, 0x6e, 0xa6, 0x69,
+    0x7a, 0x83, 0x73, 0x81, 0x75, 0x66, 0x7f, 0x87, 0x85, 0x9f, 0x8e, 0x74,
+    0x90, 0x6b, 0x81, 0x9d, 0xbb, 0x9d, 0x7f, 0x39, 0x69, 0x82, 0x7f, 0x86,
+    0x77, 0x7f, 0x7d, 0x71, 0x90, 0x53, 0x93, 0x73, 0x78, 0xdd, 0x72, 0x83,
+    0x72, 0x75, 0x61, 0x78, 0x7a, 0x76, 0x71, 0x75, 0x6e, 0x69, 0x71, 0x76,
+    0x78, 0x6f, 0x6e, 0x72, 0x73, 0x71, 0x73, 0x71, 0x73, 0x70, 0x76, 0x76,
+    0x79, 0x72, 0x70, 0x69, 0x78, 0x73, 0x71, 0x73, 0x74, 0x72, 0x6c, 0x79,
+    0x7a, 0x6b, 0x71, 0x73, 0x82, 0x71, 0x70, 0x7f, 0x71, 0x79, 0x7f, 0x71,
+    0x6b, 0x6e, 0x73, 0x7a, 0x74, 0x7a, 0x69, 0x75, 0x76, 0x7b, 0x82, 0x74,
+    0x6c, 0x77, 0x71, 0x6c, 0x6c, 0x61, 0x77, 0x71, 0x66, 0x78, 0x78, 0x72,
+    0x77, 0x74, 0x69, 0x6e, 0x66, 0x78, 0x6f, 0x75, 0x77, 0x6c, 0x7a, 0x72,
+    0x6e, 0x77, 0x7d, 0x6e, 0x69, 0x6a, 0x70, 0x79, 0x7a, 0x78, 0x77, 0x7d,
+    0x6d, 0x71, 0x66, 0x75, 0x74, 0x75, 0x7c, 0x78, 0x75, 0x6a, 0x80, 0x74,
+    0x7a, 0x6c, 0x76, 0x63, 0x6a, 0x77, 0x73, 0x82, 0x6f, 0x74, 0x76, 0x78,
+    0x69, 0x63, 0x6a, 0x78, 0x76, 0x5a, 0x81, 0x5b, 0x72, 0x6b, 0x6f, 0x6c,
+    0x70, 0x77, 0x4d, 0x54, 0x75, 0x6a, 0x75, 0x77, 0x75, 0x6f, 0x64, 0x75,
+    0x6b, 0x6e, 0x71, 0x61, 0x7f, 0x79, 0x72, 0x80, 0x6f, 0x61, 0x6c, 0x64,
+    0x6f, 0x65, 0x78, 0x6d, 0x7b, 0x7f, 0x77, 0x5a, 0x81, 0x67, 0x65, 0x69,
+    0x6e, 0x7c, 0x6f, 0x83, 0x7a, 0x51, 0x7e, 0x73, 0x7a, 0x84, 0x6f, 0x6e,
+    0x76, 0x72, 0x7b, 0x79, 0x6e, 0x6a, 0x7a, 0x70, 0x71, 0x7a, 0x77, 0x73,
+    0x5e, 0x71, 0x78, 0x7a, 0x75, 0x75, 0x77, 0x78, 0x73, 0x77, 0x7e, 0x78,
+    0x6d, 0x7b, 0x6f, 0x72, 0x6f, 0x6c, 0x71, 0x77, 0x71, 0x7d, 0x7e, 0x6f,
+    0x72, 0x80, 0x70, 0x6f, 0x7d, 0x77, 0x70, 0x73, 0x70, 0x71, 0x7c, 0x71,
+    0x7d, 0x7a, 0x71, 0x73, 0x6f, 0x69, 0x79, 0x6e, 0x74, 0x72, 0x72, 0x75,
+    0x69, 0x6c, 0x73, 0x91, 0x79, 0x75, 0x67, 0x75, 0x69, 0x73, 0x90, 0x7d,
+    0x81, 0x87, 0x85, 0x7a, 0x75, 0x6f, 0x90, 0x70, 0x59, 0x9c, 0x82, 0x5a,
+    0x7a, 0x80, 0x55, 0x8d, 0x7e, 0x9c, 0x68, 0x7d, 0x7b, 0x6d, 0x7c, 0x50,
+    0x67, 0x87, 0x73, 0x76, 0xae, 0x35, 0x7a, 0x63, 0x6d, 0x67, 0x89, 0x7c,
+    0x97, 0x70, 0x68, 0x82, 0x58, 0x4c, 0x92, 0x71, 0x6d, 0xa7, 0x8d, 0x73,
+    0x76, 0x72, 0x6c, 0x8b, 0x6e, 0x62, 0x7a, 0x6f, 0x79, 0x7d, 0x92, 0x5b,
+    0x77, 0x7e, 0x45, 0x78, 0x6d, 0x67, 0x72, 0x77, 0x71, 0x97, 0x66, 0x77,
+    0x76, 0x6a, 0x4f, 0x73, 0x75, 0x7d, 0x6d, 0x6e, 0x61, 0x73, 0x80, 0x87,
+    0x81, 0x71, 0x5e, 0x85, 0x94, 0x82, 0x76, 0x6d, 0x25, 0x73, 0x82, 0x75,
+    0x59, 0x72, 0x72, 0x77, 0x75, 0x64, 0x7a, 0x6b, 0x53, 0x8f, 0x7d, 0x61,
+    0x76, 0x62, 0x7e, 0x5f, 0x41, 0x62, 0x86, 0x88, 0x6d, 0x72, 0x5b, 0x7d,
+    0x66, 0x73, 0x76, 0x8e, 0x77, 0x8c, 0x8b, 0x68, 0x7b, 0x80, 0x11, 0x5c,
+    0x6a, 0x7c, 0x76, 0x75, 0x82, 0x7e, 0x53, 0x8a, 0x8c, 0x73, 0x8e, 0x8b,
+    0x6e, 0x6c, 0x7b, 0x61, 0x6e, 0x65, 0x62, 0x6b, 0x6a, 0x68, 0x73, 0x64,
+    0x6d, 0x59, 0x89, 0x5b, 0x89, 0x73, 0x71, 0x43, 0x7a, 0x8d, 0x6d, 0x92,
+    0x63, 0x9e, 0x77, 0x80, 0x7c, 0x76, 0x77, 0x8c, 0x95, 0x7e, 0x7c, 0x78,
+    0x71, 0x99, 0x78, 0x85, 0x54, 0x74, 0x5c, 0x6f, 0x81, 0x88, 0x70, 0x7c,
+    0x6c, 0x9a, 0x53, 0x55, 0x81, 0x83, 0x7a, 0x85, 0x90, 0x83, 0x78, 0x88,
+    0x80, 0x6f, 0x7b, 0x74, 0xcf, 0x76, 0x71, 0x5a, 0x81, 0x84, 0x9d, 0x6f,
+    0x90, 0x59, 0x7c, 0x87, 0x75, 0x5a, 0x8d, 0x8b, 0x47, 0xda, 0xa7, 0x70,
+    0x75, 0x6e, 0x84, 0x7a, 0x71, 0x65, 0x7a, 0x70, 0x61, 0x67, 0x80, 0x7a,
+    0x69, 0x75, 0x6b, 0x78, 0x76, 0x6d, 0x6c, 0x6f, 0x71, 0x79, 0x6f, 0x59,
+    0x80, 0x74, 0x6f, 0x6c, 0x76, 0x76, 0x71, 0x61, 0x70, 0x63, 0x73, 0x77,
+    0x77, 0x7d, 0x73, 0x6b, 0x84, 0x73, 0x75, 0x73, 0x41, 0x75, 0x4a, 0x62,
+    0x7a, 0x70, 0x76, 0x79, 0x73, 0x71, 0x60, 0x6b, 0x75, 0x7a, 0x6c, 0x76,
+    0x67, 0x5d, 0x7a, 0x7e, 0x7b, 0x6e, 0x8f, 0x7e, 0x6a, 0x79, 0x45, 0x81,
+    0x60, 0x5e, 0x86, 0x95, 0x9d, 0xa0, 0x4e, 0x57, 0x4f, 0x67, 0x68, 0x78,
+    0x57, 0x9a, 0x93, 0x82, 0x89, 0x90, 0x4e, 0x7c, 0x95, 0x63, 0x2d, 0x6b,
+    0x55, 0x6c, 0x98, 0x6b, 0x8a, 0x6b, 0x63, 0x97, 0x8f, 0x64, 0x66, 0x58,
+    0x81, 0x66, 0x86, 0x63, 0x9a, 0x5c, 0x73, 0x78, 0x95, 0x9d, 0x60, 0x86,
+    0x77, 0x78, 0x6f, 0x8b, 0x6a, 0x61, 0x80, 0x6b, 0x56, 0x66, 0x7a, 0x70,
+    0x68, 0x72, 0x70, 0x78, 0x77, 0x6d, 0x7f, 0x76, 0x78, 0x7c, 0x75, 0x6a,
+    0x73, 0x72, 0x7a, 0x75, 0x78, 0x8a, 0x78, 0x75, 0x76, 0x7a, 0x78, 0x67,
+    0x83, 0x81, 0x77, 0x6a, 0x9a, 0x72, 0x6d, 0x6a, 0x7d, 0x7b, 0x86, 0x5c,
+    0x7c, 0x60, 0x74, 0x73, 0x75, 0x5c, 0x79, 0x6d, 0x6e, 0x7a, 0x6d, 0x79,
+    0x75, 0x6f, 0x73, 0x71, 0x70, 0x71, 0x73, 0x6e, 0x71, 0x6d, 0x6f, 0x70,
+    0x6e, 0x70, 0x72, 0x70, 0x31, 0x72, 0x4d, 0x71, 0x6c, 0x73, 0x71, 0x76,
+    0x7c, 0x81, 0x6f, 0x6f, 0x72, 0x73, 0x71, 0x72, 0x72, 0x73, 0x6a, 0x73,
+    0x63, 0x71, 0x76, 0x70, 0x70, 0x6d, 0x71, 0x67, 0x70, 0x6f, 0x73, 0x71,
+    0x76, 0x78, 0x74, 0x6c, 0x72, 0x6f, 0x75, 0x71, 0x6e, 0x68, 0x6f, 0x71,
+    0x74, 0x7f, 0x71, 0x7c, 0x83, 0x7d, 0x45, 0x5a, 0x7b, 0x72, 0x7f, 0x48,
+    0x88, 0x7e, 0x6d, 0x4c, 0x67, 0x55, 0x65, 0x87, 0x51, 0x6f, 0x7b, 0x75,
+    0x7f, 0x6c, 0x57, 0x63, 0x5f, 0x6c, 0x8d, 0x67, 0x5b, 0x7b, 0x77, 0x7b,
+    0x85, 0x80, 0x56, 0x82, 0x78, 0x81, 0x7b, 0x74, 0x6d, 0x80, 0x7e, 0x7c,
+    0x72, 0x7b, 0x58, 0x82, 0x62, 0x7e, 0x76, 0x7d, 0x64, 0x4b, 0x82, 0x53,
+    0x66, 0x7c, 0x73, 0x7d, 0x85, 0x91, 0x63, 0x64, 0x7e, 0x81, 0x73, 0x7e,
+    0x8b, 0x92, 0x61, 0x78, 0x91, 0x81, 0x78, 0x7f, 0x77, 0x80, 0x8a, 0x8e,
+    0x76, 0x81, 0x4c, 0x74, 0x83, 0x62, 0x7d, 0x90, 0x95, 0x80, 0x7b, 0x77,
+    0x82, 0xa0, 0x77, 0x83, 0xba, 0x6f, 0x72, 0x72, 0x57, 0x82, 0x97, 0x76,
+    0x87, 0x50, 0x7c, 0x78, 0x7a, 0x5b, 0x6d, 0x71, 0x6c, 0xd1, 0x8c, 0x6c,
+    0x78, 0x73, 0x66, 0x74, 0x75, 0x71, 0x73, 0x72, 0x6f, 0x70, 0x75, 0x74,
+    0x77, 0x72, 0x71, 0x72, 0x76, 0x72, 0x74, 0x73, 0x71, 0x76, 0x71, 0x70,
+    0x77, 0x73, 0x74, 0x71, 0x75, 0x70, 0x72, 0x72, 0x70, 0x73, 0x73, 0x73,
+    0x76, 0x71, 0x76, 0x74, 0x81, 0x72, 0x71, 0x73, 0x77, 0x75, 0x78, 0x75,
+    0x71, 0x71, 0x74, 0x77, 0x74, 0x76, 0x6f, 0x73, 0x75, 0x79, 0x75, 0x74,
+    0x57, 0x62, 0x8b, 0x8f, 0x69, 0x80, 0x67, 0x7d, 0x80, 0x76, 0x83, 0x87,
+    0x77, 0x72, 0x59, 0x86, 0x84, 0x7c, 0x7e, 0x71, 0x77, 0x55, 0x85, 0x7f,
+    0x82, 0x72, 0x71, 0x5a, 0x74, 0x6b, 0x72, 0x7c, 0x7e, 0x77, 0x82, 0x8b,
+    0x72, 0x77, 0x73, 0x95, 0x9b, 0x6b, 0x69, 0x78, 0x87, 0x7a, 0x8a, 0x6d,
+    0x7d, 0x5e, 0x75, 0x7d, 0x79, 0x6b, 0x77, 0x63, 0x6b, 0x74, 0x93, 0x85,
+    0x63, 0x7c, 0x6f, 0x81, 0x6a, 0x8e, 0x83, 0x6e, 0x8b, 0x7b, 0x66, 0x85,
+    0x80, 0x92, 0x72, 0x74, 0x7d, 0x82, 0x6e, 0x79, 0x82, 0x67, 0x80, 0x76,
+    0x97, 0x82, 0x8c, 0x49, 0x66, 0x74, 0x6a, 0x83, 0x6b, 0x78, 0x6e, 0x8e,
+    0x87, 0x8e, 0x5a, 0x77, 0x99, 0x6a, 0x75, 0x7a, 0x71, 0x7a, 0x73, 0x8a,
+    0x6f, 0x78, 0x74, 0x6d, 0x6e, 0x78, 0x7c, 0x86, 0x6e, 0x93, 0x86, 0x83,
+    0x72, 0x71, 0x73, 0x71, 0x73, 0x71, 0x3d, 0x74, 0x71, 0x71, 0x70, 0x71,
+    0x73, 0x74, 0x72, 0x72, 0x72, 0x73, 0x28, 0x71, 0x72, 0x71, 0x70, 0x72,
+    0x6c, 0x6d, 0x73, 0x71, 0x72, 0x74, 0x72, 0x77, 0x74, 0x6f, 0x75, 0x6e,
+    0x71, 0x71, 0x6d, 0x71, 0x6f, 0x73, 0x70, 0x6b, 0x72, 0x74, 0x6e, 0x71,
+    0x72, 0x73, 0x72, 0x76, 0x76, 0x74, 0x71, 0x74, 0x73, 0x74, 0x73, 0x72,
+    0x74, 0x59, 0x73, 0x84, 0x7d, 0x47, 0x7b, 0x7b, 0x75, 0x72, 0x81, 0x79,
+    0x55, 0x82, 0x76, 0x73, 0x82, 0x75, 0x89, 0x72, 0x78, 0x86, 0x6a, 0x76,
+    0x6a, 0x87, 0x75, 0x6e, 0x76, 0x7a, 0x7c, 0x7c, 0x75, 0x6e, 0x77, 0x73,
+    0x67, 0x80, 0x71, 0x5f, 0x9e, 0x7c, 0x78, 0x71, 0x8e, 0x70, 0x88, 0x82,
+    0x79, 0x74, 0x72, 0x5a, 0x66, 0x3d, 0x79, 0x7c, 0x76, 0x8b, 0x77, 0x75,
+    0x6f, 0x5f, 0x7b, 0x79, 0x78, 0x63, 0x70, 0x85, 0x76, 0x77, 0x7c, 0x75,
+    0x77, 0x7f, 0x7c, 0x78, 0x73, 0x65, 0x7a, 0x71, 0x87, 0x86, 0x77, 0x6f,
+    0x72, 0x79, 0x7a, 0x7b, 0x73, 0x76, 0x73, 0x6e, 0x78, 0x6c, 0x70, 0x74,
+    0x5e, 0x74, 0x7d, 0x75, 0x90, 0x67, 0x72, 0x7d, 0x7f, 0x7c, 0x7c, 0x72,
+    0x6b, 0x70, 0x75, 0x7b, 0x75, 0x44, 0x73, 0x6a, 0x7a, 0x90, 0x74, 0x67,
+    0x75, 0x70, 0x80, 0x82, 0x88, 0x7d, 0x72, 0x6c, 0x64, 0x7b, 0x82, 0x69,
+    0x4d, 0x80, 0x7b, 0x8e, 0x9d, 0x8f, 0x7b, 0x5e, 0x6c, 0x7d, 0x80, 0x86,
+    0x83, 0x6f, 0x4f, 0xaa, 0x6f, 0x76, 0x77, 0x89, 0x76, 0x9c, 0x76, 0x81,
+    0x6f, 0x78, 0x62, 0x7c, 0x9d, 0x44, 0x76, 0x7f, 0x92, 0x76, 0x86, 0x73,
+    0x7e, 0x4f, 0x64, 0x70, 0x73, 0x7c, 0x6f, 0x90, 0x78, 0x8c, 0x71, 0x77,
+    0x75, 0x72, 0x81, 0x75, 0x73, 0x6f, 0x6b, 0x73, 0x5d, 0x6e, 0x46, 0x6e,
+    0x76, 0x65, 0x50, 0x78, 0x75, 0x73, 0x71, 0x71, 0x71, 0x72, 0x67, 0x57,
+    0x74, 0x75, 0x6a, 0x71, 0x74, 0x74, 0x72, 0x70, 0x68, 0x6a, 0x72, 0x74,
+    0x6f, 0x7f, 0x72, 0x6f, 0x89, 0x77, 0x75, 0x71, 0x4f, 0x6c, 0x4e, 0x58,
+    0x77, 0x74, 0x71, 0x70, 0x76, 0x75, 0x76, 0x70, 0x79, 0x7d, 0x6c, 0x70,
+    0x6e, 0x7c, 0x74, 0x77, 0x6f, 0x72, 0x74, 0x6b, 0x6c, 0x73, 0x75, 0x6c,
+    0x7d, 0x7d, 0x5f, 0x75, 0x6f, 0x72, 0x76, 0x74, 0x76, 0x78, 0x83, 0x68,
+    0x7e, 0x7d, 0x6e, 0x6d, 0x78, 0x6f, 0x7b, 0x7e, 0x76, 0x74, 0x77, 0x7a,
+    0x7c, 0x6a, 0x6f, 0x7d, 0x91, 0x6d, 0x78, 0x6f, 0x66, 0x77, 0x73, 0x66,
+    0x79, 0x74, 0x6b, 0x74, 0x75, 0x84, 0x6f, 0x77, 0x79, 0x84, 0x76, 0x75,
+    0x64, 0x86, 0x72, 0x73, 0x85, 0x83, 0x2f, 0x64, 0x7f, 0x70, 0x8b, 0x2a,
+    0x90, 0x8e, 0x63, 0x4c, 0x7f, 0x3c, 0x81, 0xa5, 0x85, 0x88, 0x75, 0x7e,
+    0x81, 0x0d, 0x27, 0x6c, 0x44, 0x65, 0x8d, 0x22, 0x47, 0x69, 0xa6, 0x87,
+    0x80, 0x57, 0x57, 0x92, 0x87, 0x9e, 0xac, 0x3d, 0x6d, 0x86, 0x70, 0x93,
+    0x4f, 0x93, 0x4d, 0x81, 0x56, 0xa2, 0x72, 0x7c, 0x5f, 0x71, 0x8a, 0x69,
+    0x72, 0x96, 0xad, 0x8d, 0xa2, 0x84, 0x60, 0x5f, 0x80, 0x8a, 0x8f, 0x93,
+    0x67, 0x97, 0x42, 0x7d, 0x9b, 0x65, 0x98, 0x94, 0x80, 0x8f, 0x9f, 0x7c,
+    0x96, 0x68, 0x70, 0x55, 0x73, 0x6b, 0x7f, 0x9c, 0x83, 0x9a, 0x8d, 0xae,
+    0x98, 0xb7, 0x71, 0x96, 0xbf, 0x7a, 0x9b, 0x3d, 0x70, 0x95, 0x99, 0x77,
+    0x80, 0x43, 0x88, 0x88, 0x7c, 0x6e, 0x82, 0x99, 0x4f, 0xde, 0xc1, 0x7c,
+    0x77, 0x6f, 0x81, 0x7d, 0x79, 0x72, 0x6d, 0x78, 0x73, 0x71, 0x73, 0x7a,
+    0x69, 0x75, 0x5f, 0x73, 0x78, 0x75, 0x7b, 0x70, 0x66, 0x6b, 0x80, 0x66,
+    0x71, 0x77, 0x80, 0x73, 0x71, 0x79, 0x6c, 0x70, 0x77, 0x78, 0x79, 0x76,
+    0x69, 0x73, 0x76, 0x6d, 0x7e, 0x72, 0x77, 0x7a, 0x7d, 0x70, 0x58, 0x84,
+    0x74, 0x70, 0x78, 0x73, 0x75, 0x72, 0x6c, 0x71, 0x70, 0x75, 0x8c, 0x75,
+    0x7b, 0x5d, 0x7a, 0x86, 0x62, 0x78, 0x7e, 0x76, 0x7f, 0x6b, 0x89, 0x79,
+    0x5c, 0x79, 0x70, 0x77, 0x82, 0x74, 0x79, 0x7b, 0x70, 0x79, 0x63, 0x77,
+    0x6c, 0x76, 0x74, 0x7d, 0x7a, 0x70, 0x74, 0x6c, 0x7e, 0x6e, 0x7f, 0x6f,
+    0x84, 0x83, 0x56, 0x65, 0x7b, 0x63, 0x76, 0x6a, 0x8b, 0x6f, 0x84, 0x7e,
+    0x7c, 0x56, 0x6e, 0x76, 0x7f, 0x5d, 0x7b, 0x79, 0x64, 0x90, 0x6b, 0x74,
+    0x7d, 0x7b, 0x70, 0x71, 0x85, 0x72, 0x74, 0x68, 0x6b, 0x5a, 0x64, 0x65,
+    0x70, 0x63, 0x3c, 0x6b, 0x6e, 0x75, 0x61, 0x42, 0x67, 0x34, 0x40, 0x77,
+    0x70, 0x69, 0x75, 0x65, 0x6e, 0x6a, 0x47, 0x74, 0x4c, 0x36, 0x42, 0x6d,
+    0x64, 0x62, 0x7d, 0x55, 0x7b, 0x64, 0x24, 0x76, 0x72, 0x6a, 0x74, 0x6b,
+    0x7e, 0x76, 0x87, 0x6d, 0x7c, 0x78, 0x6a, 0x75, 0x71, 0x69, 0x6b, 0x6b,
+    0x66, 0x85, 0x84, 0x91, 0x7d, 0x84, 0x7d, 0x72, 0x61, 0x65, 0x7d, 0x68,
+    0x83, 0x77, 0x8d, 0x79, 0x8d, 0x86, 0x97, 0x71, 0x8b, 0x7a, 0x91, 0x58,
+    0x50, 0x72, 0x66, 0x6b, 0x68, 0x74, 0x69, 0x68, 0x83, 0x7c, 0x81, 0x7b,
+    0x72, 0x62, 0x91, 0x71, 0xa1, 0x69, 0x74, 0x62, 0xa6, 0x63, 0x8c, 0x5f,
+    0x7b, 0x70, 0x70, 0x97, 0x8d, 0x50, 0x79, 0x7e, 0x76, 0x98, 0x7f, 0x76,
+    0x69, 0x76, 0x48, 0x80, 0x76, 0x7d, 0x6e, 0x74, 0x75, 0x79, 0x78, 0x73,
+    0x5d, 0x7a, 0x75, 0x70, 0x79, 0x7c, 0x7f, 0x75, 0x76, 0x75, 0x81, 0x75,
+    0x52, 0x71, 0x70, 0x66, 0x70, 0x7a, 0x73, 0x86, 0x78, 0x65, 0x50, 0x84,
+    0x63, 0x65, 0x60, 0x73, 0x81, 0x80, 0x71, 0x69, 0x5f, 0x7d, 0x70, 0x7b,
+    0x67, 0x72, 0x76, 0x79, 0x7e, 0x74, 0x58, 0x7c, 0x60, 0x56, 0x6c, 0x7c,
+    0x66, 0x68, 0x88, 0x81, 0x85, 0xa3, 0x68, 0x69, 0x87, 0xb6, 0x9e, 0x59,
+    0x6f, 0x91, 0x92, 0x60, 0x53, 0x56, 0x5e, 0x69, 0x63, 0x75, 0xaa, 0x62,
+    0x83, 0x84, 0x89, 0x74, 0x79, 0x54, 0x76, 0x89, 0x61, 0x8e, 0xa2, 0x6d,
+    0x81, 0x95, 0x9a, 0x72, 0xd0, 0xa2, 0x93, 0x64, 0x58, 0x6e, 0x87, 0x8a,
+    0x75, 0x99, 0x68, 0x8f, 0x6f, 0x54, 0x7b, 0x70, 0x60, 0x73, 0xa9, 0x77,
+    0x87, 0x7f, 0xa4, 0x7a, 0xae, 0x85, 0x63, 0x7e, 0x7a, 0x87, 0x7d, 0x5d,
+    0x88, 0x76, 0x8c, 0x66, 0x8c, 0x78, 0x7d, 0x77, 0x74, 0x83, 0xba, 0x66,
+    0x7f, 0x81, 0x6d, 0x5b, 0x75, 0x84, 0x78, 0x8b, 0x60, 0xa1, 0x99, 0x75,
+    0x90, 0x9b, 0x91, 0x81, 0xca, 0x7f, 0x7f, 0x68, 0x6c, 0x76, 0x72, 0x73,
+    0x75, 0x4d, 0x75, 0x79, 0x88, 0x5a, 0x90, 0x6a, 0x5e, 0xe0, 0x8a, 0x6b,
+    0x71, 0x77, 0x7c, 0x7f, 0x7c, 0x74, 0x78, 0x76, 0x81, 0x7f, 0x78, 0x73,
+    0x75, 0x75, 0x7b, 0x73, 0x7d, 0x6c, 0x70, 0x74, 0x7a, 0x73, 0x7c, 0x7a,
+    0x78, 0x6a, 0x67, 0x6c, 0x7e, 0x74, 0x71, 0x78, 0x79, 0x66, 0x75, 0x6b,
+    0x6e, 0x73, 0x76, 0x7e, 0x8b, 0x7b, 0x75, 0x6a, 0x81, 0x76, 0x85, 0x7c,
+    0x77, 0x5d, 0x77, 0x77, 0x78, 0x48, 0x7a, 0x76, 0x64, 0x6e, 0x7f, 0x7a,
+    0x63, 0x79, 0x87, 0x7e, 0x89, 0x8e, 0x7a, 0x6f, 0x71, 0x80, 0x89, 0x72,
+    0x72, 0x70, 0x75, 0x80, 0x4b, 0x7a, 0x71, 0x8a, 0x86, 0x6d, 0x91, 0x67,
+    0x62, 0x80, 0x73, 0x44, 0x78, 0x6c, 0x82, 0x84, 0x75, 0x82, 0x81, 0x84,
+    0x6b, 0x69, 0x87, 0x75, 0xb7, 0x81, 0x81, 0x70, 0x4c, 0x80, 0x6e, 0x86,
+    0x7b, 0x6d, 0x79, 0x70, 0x7e, 0x50, 0x85, 0x71, 0x6c, 0xc4, 0x76, 0x84,
+    0x75, 0x75, 0x6d, 0x74, 0x75, 0x72, 0x70, 0x74, 0x70, 0x6d, 0x79, 0x72,
+    0x70, 0x76, 0x74, 0x77, 0x59, 0x6d, 0x7f, 0x6d, 0x70, 0x78, 0x72, 0x77,
+    0x6c, 0x78, 0x75, 0x72, 0x75, 0x75, 0x70, 0x74, 0x74, 0x76, 0x71, 0x74,
+    0x79, 0x7b, 0x73, 0x71, 0x7e, 0x75, 0x77, 0x48, 0x7a, 0x6d, 0x3f, 0x74,
+    0x7e, 0x6e, 0x75, 0x76, 0x74, 0x75, 0x78, 0x74, 0x74, 0x79, 0x70, 0x74,
+    0x7c, 0x6c, 0x5e, 0x6b, 0x66, 0x6d, 0x6d, 0x72, 0x6f, 0x48, 0x66, 0x72,
+    0x5e, 0x6b, 0x6e, 0x6b, 0x6e, 0x67, 0x68, 0x71, 0x6a, 0x74, 0x49, 0x57,
+    0x60, 0x6e, 0x70, 0x6b, 0x71, 0x6b, 0x70, 0x61, 0x60, 0x5f, 0x6c, 0x6b,
+    0x5e, 0x69, 0x61, 0x6e, 0x65, 0x6b, 0x72, 0x72, 0x52, 0x6e, 0x5b, 0x6d,
+    0x83, 0x69, 0x70, 0x6f, 0x68, 0x60, 0x60, 0x6f, 0x6b, 0x1e, 0x67, 0x66,
+    0x72, 0x68, 0x79, 0x83, 0x65, 0x78, 0x7b, 0x73, 0x7a, 0x77, 0x76, 0x70,
+    0x5c, 0x4d, 0x55, 0x73, 0x71, 0x74, 0x71, 0x67, 0x7e, 0x76, 0x80, 0x3a,
+    0x66, 0x71, 0x68, 0x8e, 0x65, 0x7c, 0x75, 0x6e, 0x7a, 0x75, 0x7b, 0x79,
+    0x81, 0x71, 0x80, 0x7a, 0x89, 0x4b, 0x7c, 0x64, 0x51, 0x72, 0x34, 0x79,
+    0x6e, 0x90, 0x7a, 0x73, 0x70, 0x6d, 0x73, 0x7d, 0x87, 0x87, 0x75, 0x79,
+    0x4d, 0x96, 0x96, 0x40, 0x9b, 0x87, 0x82, 0x96, 0x61, 0x76, 0xb9, 0x72,
+    0x9e, 0x56, 0x77, 0x97, 0x46, 0x77, 0x93, 0x82, 0x8e, 0x8e, 0x98, 0x69,
+    0x7e, 0x6d, 0x5d, 0x90, 0x61, 0x4e, 0x6b, 0xbc, 0xa2, 0x6d, 0xaa, 0x7f,
+    0x88, 0xb3, 0x50, 0x9b, 0x28, 0xb0, 0xa2, 0x6a, 0xaa, 0x84, 0x65, 0x83,
+    0x3a, 0x94, 0x76, 0x8e, 0x70, 0xb0, 0x8e, 0x3c, 0x83, 0x71, 0xaa, 0x70,
+    0x5d, 0x87, 0x91, 0x80, 0x87, 0x85, 0x4d, 0x57, 0x89, 0xa1, 0x8a, 0x57,
+    0x8e, 0x6a, 0x5d, 0x5a, 0x56, 0x64, 0x72, 0x78, 0x7b, 0x7d, 0xa7, 0x6a,
+    0x5b, 0x88, 0x6b, 0x41, 0x83, 0x72, 0x66, 0x81, 0x69, 0x88, 0xa4, 0x7b,
+    0x9c, 0x9b, 0x8d, 0x87, 0xd2, 0x99, 0x86, 0x4e, 0x7f, 0x75, 0x5c, 0xa7,
+    0x63, 0x8b, 0x8c, 0x82, 0x89, 0x59, 0xb4, 0x77, 0x53, 0x77, 0x92, 0x69,
+    0x5d, 0x84, 0x94, 0x8b, 0x85, 0x7f, 0x5d, 0x6d, 0x5b, 0x96, 0x83, 0x63,
+    0x81, 0x7c, 0x68, 0x5e, 0x75, 0x70, 0x63, 0x7b, 0x86, 0x92, 0xc5, 0x88,
+    0xa0, 0x72, 0x5b, 0x5e, 0x6c, 0x54, 0x68, 0x86, 0x57, 0x95, 0x99, 0x93,
+    0xa3, 0x9e, 0x7a, 0x78, 0xc1, 0x77, 0xa6, 0x77, 0x6f, 0x71, 0x91, 0x8b,
+    0x7f, 0x5a, 0x86, 0x7b, 0x7d, 0x6a, 0x76, 0x78, 0x60, 0xcd, 0x98, 0x6c,
+    0x70, 0x8c, 0x95, 0x7a, 0x8f, 0x73, 0x7b, 0x6a, 0x60, 0x92, 0x7d, 0x85,
+    0x87, 0x46, 0x76, 0x70, 0x72, 0x7f, 0x6c, 0x89, 0x8d, 0x99, 0xb9, 0x68,
+    0x64, 0x76, 0x67, 0x99, 0x8a, 0x87, 0x76, 0x84, 0x8a, 0x90, 0x51, 0xae,
+    0x8b, 0x8c, 0xa5, 0x98, 0xcd, 0x7f, 0x8e, 0x85, 0x72, 0x81, 0x58, 0x71,
+    0x69, 0x43, 0x9f, 0x73, 0x82, 0x5b, 0xaa, 0x87, 0x5d, 0xd6, 0x65, 0x8e,
+    0x83, 0x7e, 0x6b, 0x83, 0x96, 0x4d, 0x5f, 0x7a, 0x83, 0x8a, 0x87, 0x8f,
+    0x67, 0x68, 0x98, 0x72, 0x66, 0x6c, 0x88, 0x81, 0x5f, 0x78, 0xa8, 0x6e,
+    0x64, 0x7c, 0x6e, 0x60, 0x8a, 0x75, 0x5e, 0x99, 0x91, 0x4b, 0x58, 0x5e,
+    0x94, 0xa0, 0x8d, 0x4f, 0xd2, 0xb9, 0x78, 0x43, 0x6f, 0x6d, 0x7d, 0x84,
+    0x8b, 0x80, 0x75, 0x85, 0x92, 0x5a, 0x6c, 0x91, 0x64, 0xe2, 0x62, 0x79,
+    0x56, 0x81, 0x5d, 0x7a, 0x9b, 0x5a, 0x80, 0x88, 0x7c, 0x70, 0x7e, 0x7d,
+    0x60, 0x41, 0x60, 0x8e, 0x72, 0x68, 0x68, 0x83, 0x5c, 0x80, 0x9a, 0x69,
+    0x50, 0x76, 0x75, 0x5c, 0x74, 0x5b, 0x71, 0x93, 0x93, 0x96, 0x4c, 0x93,
+    0xa2, 0x6b, 0x86, 0x7d, 0xd7, 0x90, 0x7c, 0x83, 0x70, 0x6f, 0x6a, 0x7c,
+    0x4a, 0x5e, 0x6a, 0x78, 0x85, 0x53, 0x7f, 0x70, 0x70, 0xd8, 0x9a, 0x71,
+    0x75, 0x99, 0x7c, 0x8d, 0x5e, 0x52, 0x67, 0x7f, 0x7c, 0x7a, 0x74, 0x6a,
+    0x73, 0x82, 0x6a, 0x83, 0x85, 0x8c, 0x91, 0x7c, 0x73, 0x8e, 0xa4, 0x76,
+    0x83, 0x69, 0x73, 0x56, 0x8c, 0x8c, 0x72, 0x93, 0xae, 0x62, 0x8f, 0x94,
+    0x72, 0x8c, 0x73, 0x66, 0xd0, 0x89, 0x7d, 0x65, 0x88, 0x66, 0x7d, 0x7a,
+    0x73, 0x8b, 0x7f, 0x7e, 0x83, 0x6c, 0x68, 0x76, 0x69, 0xd0, 0x78, 0x7e,
+    0x6b, 0x7b, 0x70, 0x7f, 0x79, 0x73, 0x78, 0x6e, 0x6c, 0x76, 0x70, 0x64,
+    0x79, 0x7c, 0x62, 0x7a, 0x75, 0x75, 0x7a, 0x77, 0x78, 0x71, 0x7d, 0x6f,
+    0x7b, 0x75, 0x6b, 0x5c, 0x76, 0x69, 0x75, 0x7d, 0x76, 0x72, 0x6e, 0x7e,
+    0x79, 0x77, 0x74, 0x7b, 0x90, 0x7a, 0x76, 0x70, 0x69, 0x7c, 0x70, 0x6e,
+    0x7b, 0x75, 0x69, 0x78, 0x74, 0x80, 0x62, 0x76, 0x7d, 0x82, 0x64, 0x6c,
+    0x67, 0x80, 0x7b, 0x7f, 0x88, 0x6e, 0x79, 0x83, 0x7e, 0x81, 0x99, 0x88,
+    0x75, 0xa1, 0x5e, 0x6a, 0x87, 0x76, 0x7c, 0x79, 0x7c, 0x8b, 0xae, 0x79,
+    0x6e, 0x72, 0x60, 0x67, 0x73, 0x95, 0x79, 0x8c, 0x68, 0x83, 0x45, 0x86,
+    0x9a, 0x80, 0x81, 0x8a, 0xcd, 0x6c, 0x76, 0x93, 0x65, 0x82, 0x4f, 0x7c,
+    0x67, 0x4c, 0x80, 0x8c, 0x83, 0x51, 0x9b, 0x6a, 0x75, 0xd8, 0x9f, 0x68,
+    0x78, 0x59, 0x74, 0x82, 0x7b, 0x49, 0x77, 0x72, 0x6a, 0x73, 0x8c, 0x47,
+    0x76, 0x73, 0x67, 0x69, 0x67, 0x7a, 0x6d, 0x77, 0x78, 0x85, 0x7a, 0x79,
+    0x7c, 0x70, 0x70, 0x62, 0x73, 0x73, 0x7f, 0x7a, 0x6c, 0x76, 0x7d, 0x63,
+    0x84, 0x77, 0x6e, 0x55, 0x96, 0x79, 0x73, 0x60, 0x1f, 0x7b, 0x7f, 0x71,
+    0x6f, 0x6b, 0x66, 0x79, 0x77, 0x56, 0x78, 0x72, 0x7c, 0x84, 0x78, 0x6f,
+    0x69, 0x75, 0x9b, 0x73, 0x96, 0x7b, 0x62, 0x6a, 0x71, 0xae, 0x92, 0x69,
+    0x7e, 0xa4, 0x7d, 0x71, 0x67, 0x71, 0x76, 0x7e, 0x7f, 0x7d, 0xad, 0x5d,
+    0xa1, 0x93, 0x66, 0x5a, 0x87, 0x56, 0x7f, 0x98, 0x7f, 0x7a, 0x91, 0x96,
+    0x8d, 0xad, 0x8c, 0x68, 0xcd, 0x89, 0x8f, 0x65, 0x75, 0x83, 0x7f, 0x86,
+    0x7a, 0x61, 0x8a, 0x86, 0x6e, 0x5e, 0x8a, 0x7e, 0x7e, 0xd5, 0x9e, 0x72,
+    0x67, 0x6b, 0x7d, 0x84, 0x71, 0x5d, 0x75, 0x77, 0x7b, 0x66, 0x81, 0x71,
+    0x70, 0x74, 0x63, 0x6d, 0x7c, 0x74, 0x7f, 0x73, 0x75, 0x7a, 0x7c, 0x79,
+    0x6c, 0x75, 0x63, 0x64, 0x79, 0x6f, 0x7c, 0x89, 0x76, 0x79, 0x75, 0x63,
+    0x80, 0x78, 0x6c, 0x6a, 0x96, 0x79, 0x76, 0x77, 0x8f, 0x73, 0x83, 0x7a,
+    0x70, 0x60, 0x70, 0x78, 0x7e, 0x5f, 0x7a, 0x6c, 0x88, 0x7f, 0x85, 0x76,
+    0x80, 0x5b, 0x83, 0x8a, 0x67, 0xa0, 0x67, 0x66, 0x92, 0x8b, 0x90, 0x77,
+    0x7b, 0x67, 0x79, 0x87, 0x89, 0x68, 0x68, 0x70, 0x5d, 0x44, 0x9d, 0x5e,
+    0x65, 0x8b, 0x78, 0x66, 0x7f, 0x7e, 0x67, 0xb2, 0x93, 0x70, 0x4f, 0x57,
+    0x90, 0x90, 0xaa, 0x68, 0xcd, 0x96, 0x79, 0x83, 0x94, 0x7f, 0x75, 0x6c,
+    0x80, 0x6f, 0x76, 0x7e, 0x87, 0x5a, 0x70, 0x8a, 0x91, 0xe1, 0x82, 0x69,
+    0x86, 0x7e, 0x70, 0x8b, 0x65, 0x5f, 0x7a, 0x84, 0x5b, 0x6c, 0x6d, 0x6b,
+    0x96, 0x74, 0x7f, 0x69, 0x6b, 0x68, 0x62, 0x6b, 0x97, 0x8b, 0x5b, 0x4d,
+    0x81, 0x5f, 0x7c, 0x6b, 0x78, 0x83, 0x70, 0x7f, 0x6b, 0x7b, 0x55, 0x55,
+    0x8f, 0x76, 0x68, 0x6f, 0xb0, 0x66, 0x72, 0x7b, 0x72, 0x7c, 0x89, 0x62,
+    0x7a, 0x74, 0x78, 0x56, 0x6f, 0x97, 0x75, 0x7a, 0x6f, 0x8e, 0x68, 0x7f,
+    0x51, 0x4b, 0x8b, 0x7f, 0x7e, 0x5e, 0x6f, 0x7b, 0x78, 0x76, 0x7c, 0x88,
+    0x79, 0x6f, 0x65, 0x89, 0x5b, 0x78, 0x78, 0x73, 0x8b, 0x67, 0x8b, 0x82,
+    0x6f, 0x7f, 0x7a, 0x60, 0x6f, 0x5d, 0x73, 0x7a, 0x7c, 0x83, 0x7f, 0x90,
+    0x56, 0x69, 0x57, 0x80, 0x9b, 0x7b, 0x82, 0x70, 0x84, 0x7b, 0x80, 0x7e,
+    0x80, 0x7a, 0x6b, 0x78, 0x85, 0x85, 0x6f, 0x7a, 0x83, 0x77, 0x8d, 0x84,
+    0x71, 0x6d, 0x78, 0x67, 0x69, 0x6b, 0x83, 0x80, 0x77, 0x74, 0x74, 0x68,
+    0x65, 0x72, 0x75, 0x71, 0x73, 0x83, 0x69, 0x68, 0x7d, 0x78, 0x6c, 0x6e,
+    0x6e, 0x7d, 0x7b, 0x79, 0x7d, 0x76, 0x6f, 0x73, 0x7a, 0x72, 0x6d, 0x6a,
+    0x61, 0x73, 0x71, 0x6a, 0x6f, 0x67, 0x66, 0x6d, 0x74, 0x6a, 0x73, 0x70,
+    0x75, 0x6d, 0x7c, 0x65, 0x6b, 0x71, 0x70, 0x6a, 0x76, 0x7d, 0x74, 0x58,
+    0x6e, 0x74, 0x73, 0x6b, 0x71, 0x72, 0x6b, 0x6d, 0x73, 0x76, 0x77, 0x61,
+    0x6c, 0x75, 0x72, 0x60, 0x72, 0x7a, 0x53, 0x6f, 0x78, 0x6f, 0x73, 0x73,
+    0x75, 0x71, 0x7c, 0x6f, 0x78, 0x6e, 0x75, 0x68, 0x6a, 0x74, 0x6c, 0x5c,
+    0x6c, 0x76, 0x70, 0x73, 0x6f, 0x70, 0x6e, 0x73, 0x71, 0x74, 0x78, 0x73,
+    0x77, 0x73, 0x74, 0x74, 0x6c, 0x75, 0x76, 0x74, 0x74, 0x64, 0x78, 0x51,
+    0x52, 0x4e, 0x83, 0x66, 0x73, 0x64, 0x76, 0x7a, 0x7a, 0x6e, 0x76, 0x80,
+    0x7b, 0x6e, 0x5a, 0x80, 0x7f, 0x7e, 0x6f, 0x84, 0x7f, 0x6c, 0x94, 0x7c,
+    0x77, 0x7f, 0x74, 0x6d, 0x62, 0x73, 0x74, 0x7e, 0x77, 0x7b, 0x80, 0x82,
+    0x5d, 0x61, 0x65, 0x7a, 0x9f, 0x77, 0x6f, 0x70, 0x88, 0x73, 0x80, 0x7e,
+    0x6c, 0x80, 0x71, 0x73, 0x78, 0x7e, 0x76, 0x7a, 0x80, 0x6b, 0x88, 0x83,
+    0x6e, 0x75, 0x75, 0x6e, 0x74, 0x78, 0x63, 0x68, 0x75, 0x71, 0x77, 0x68,
+    0x73, 0x72, 0x71, 0x53, 0x76, 0x77, 0x49, 0x71, 0x6f, 0x69, 0x73, 0x78,
+    0x72, 0x75, 0x72, 0x6d, 0x72, 0x71, 0x77, 0x6c, 0x64, 0x75, 0x74, 0x77,
+    0x71, 0x7b, 0x6f, 0x6f, 0x73, 0x71, 0x77, 0x78, 0x74, 0x78, 0x78, 0x75,
+    0x6f, 0x74, 0x70, 0x74, 0x6e, 0x6c, 0x74, 0x79, 0x73, 0x5f, 0x79, 0x54,
+    0x53, 0x82, 0x3b, 0x80, 0x71, 0x80, 0x79, 0x78, 0x79, 0x72, 0x77, 0x6f,
+    0x60, 0x77, 0x74, 0x79, 0x71, 0x7a, 0x86, 0x76, 0x6c, 0x70, 0x82, 0x76,
+    0x79, 0x78, 0x73, 0x6f, 0x6f, 0x6e, 0x6a, 0x82, 0x75, 0x5f, 0x6a, 0x8e,
+    0x70, 0x6b, 0x76, 0x7a, 0x82, 0x79, 0x71, 0x67, 0x5a, 0x7a, 0x70, 0x7c,
+    0x6c, 0x72, 0x72, 0x7a, 0x73, 0x78, 0x63, 0x7c, 0x6b, 0x7d, 0x65, 0x7e,
+    0x7a, 0x48, 0x88, 0x76, 0x81, 0x74, 0x77, 0x73, 0x73, 0x90, 0x7b, 0x78,
+    0x78, 0x50, 0x40, 0x8b, 0x4a, 0x7a, 0x83, 0x86, 0x80, 0x88, 0x7e, 0x82,
+    0x8d, 0x8c, 0x6e, 0x5d, 0x6e, 0x75, 0x7c, 0x7f, 0x7a, 0x47, 0x7d, 0x8e,
+    0x6d, 0x65, 0x85, 0x7d, 0x99, 0x62, 0x7b, 0x79, 0x7d, 0x76, 0x7a, 0x83,
+    0x7e, 0x79, 0x6d, 0x82, 0x86, 0x8d, 0x7a, 0x7c, 0x77, 0x7d, 0x8e, 0x84,
+    0x6c, 0x71, 0x75, 0x6b, 0x6f, 0x73, 0x7a, 0x78, 0x77, 0x77, 0x76, 0x6a,
+    0x69, 0x74, 0x72, 0x63, 0x6e, 0x7f, 0x43, 0x6e, 0x75, 0x75, 0x70, 0x71,
+    0x76, 0x78, 0x78, 0x78, 0x79, 0x72, 0x73, 0x6b, 0x6f, 0x71, 0x6b, 0x69,
+    0x6d, 0x73, 0x73, 0x72, 0x71, 0x6c, 0x6b, 0x72, 0x6f, 0x6f, 0x76, 0x73,
+    0x75, 0x70, 0x76, 0x6d, 0x69, 0x6c, 0x70, 0x74, 0x74, 0x74, 0x76, 0x5c,
+    0x75, 0x82, 0x9a, 0x78, 0x85, 0xb3, 0x65, 0x70, 0x7b, 0x70, 0x7b, 0x6e,
+    0xa8, 0x85, 0x76, 0x91, 0x96, 0x97, 0x4e, 0x75, 0x89, 0x75, 0xaa, 0x68,
+    0x97, 0x7b, 0x6d, 0x5b, 0x80, 0x72, 0x73, 0x9a, 0x85, 0x97, 0x4a, 0x83,
+    0x84, 0x9a, 0x7e, 0x7c, 0xce, 0x86, 0x70, 0x40, 0xa3, 0x73, 0x70, 0x80,
+    0x7f, 0x61, 0x75, 0x8d, 0x87, 0x57, 0x78, 0x70, 0x60, 0xda, 0x98, 0x77,
+    0x78, 0x67, 0x87, 0x78, 0x73, 0x58, 0x63, 0x6d, 0x71, 0x6f, 0x77, 0x7b,
+    0x7d, 0x4e, 0x60, 0x7a, 0x6f, 0x7b, 0x7c, 0x86, 0x7d, 0x71, 0x74, 0x7e,
+    0x7c, 0x99, 0x8b, 0x71, 0x6a, 0x7c, 0x5e, 0x82, 0x70, 0x83, 0x76, 0x7f,
+    0x80, 0x54, 0x64, 0x70, 0x90, 0x8a, 0x77, 0x8a, 0x85, 0x7d, 0x80, 0x82,
+    0x73, 0x74, 0x6d, 0x78, 0x83, 0x98, 0x7d, 0x79, 0x63, 0xa1, 0x7a, 0x66,
+    0x67, 0x71, 0x70, 0x44, 0x70, 0x71, 0x6d, 0x6f, 0x6f, 0x73, 0x6b, 0x69,
+    0x71, 0x6c, 0x6e, 0x6e, 0x6e, 0x72, 0x6d, 0x6f, 0x70, 0x6b, 0x6e, 0x6e,
+    0x72, 0x6d, 0x6f, 0x6e, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x74, 0x6a, 0x6f,
+    0x72, 0x6f, 0x71, 0x6c, 0x27, 0x70, 0x6d, 0x70, 0x69, 0x71, 0x6b, 0x6f,
+    0x67, 0x72, 0x73, 0x70, 0x6f, 0x6f, 0x72, 0x6f, 0x72, 0x6e, 0x6b, 0x70,
+    0x7b, 0x63, 0x74, 0x73, 0x6c, 0x7c, 0x73, 0x79, 0x76, 0x57, 0x71, 0x71,
+    0x77, 0x74, 0x6e, 0x6d, 0x70, 0x71, 0x72, 0x74, 0x6f, 0x72, 0x59, 0x5f,
+    0x67, 0x76, 0x76, 0x74, 0x74, 0x70, 0x73, 0x6c, 0x69, 0x6e, 0x78, 0x70,
+    0x70, 0x73, 0x63, 0x74, 0x72, 0x73, 0x73, 0x74, 0x6e, 0x74, 0x6f, 0x70,
+    0x7d, 0x6a, 0x74, 0x75, 0x70, 0x38, 0x6d, 0x6d, 0x6f, 0x61, 0x71, 0x76,
+    0x77, 0x6e, 0x6e, 0x75, 0x6d, 0x71, 0x84, 0x8b, 0x56, 0x72, 0x69, 0x6e,
+    0x63, 0x59, 0x79, 0x87, 0x73, 0x81, 0x2b, 0x60, 0x66, 0x7a, 0x61, 0x81,
+    0x5c, 0x77, 0x77, 0x73, 0x7b, 0x7b, 0x5e, 0x7c, 0x7c, 0x6a, 0x4d, 0x62,
+    0x6b, 0x78, 0x72, 0x77, 0x82, 0x70, 0x70, 0x6e, 0x87, 0x69, 0x71, 0x62,
+    0x74, 0x6d, 0x85, 0x71, 0x79, 0x58, 0x6e, 0x72, 0x7e, 0x88, 0x56, 0x89,
+    0x74, 0x82, 0x6e, 0x78, 0x5e, 0x87, 0x65, 0x5b, 0x6e, 0xa9, 0x6f, 0x82,
+    0x66, 0x6d, 0x89, 0x70, 0x5a, 0x76, 0x9b, 0x6c, 0x9f, 0x6e, 0x6f, 0x5d,
+    0x8f, 0x78, 0x7a, 0x69, 0x80, 0x7d, 0x76, 0x9e, 0x75, 0x92, 0xa5, 0x7f,
+    0x79, 0x7a, 0x79, 0x6e, 0xc9, 0x6d, 0x78, 0x78, 0x72, 0x70, 0x89, 0x73,
+    0x69, 0x55, 0x6e, 0x75, 0x81, 0x6a, 0x99, 0x98, 0x8d, 0x79, 0x7c, 0x73,
+    0x76, 0x71, 0x77, 0x78, 0x78, 0x85, 0x85, 0x74, 0x79, 0x71, 0x79, 0x70,
+    0x68, 0x73, 0x7d, 0x71, 0x6e, 0x70, 0x63, 0x6f, 0x71, 0x7a, 0x73, 0x6f,
+    0x63, 0x6f, 0x6a, 0x70, 0x74, 0x68, 0x6f, 0x74, 0x71, 0x74, 0x81, 0x80,
+    0x7f, 0x7c, 0x71, 0x6d, 0x77, 0x7f, 0x66, 0x87, 0x71, 0x6e, 0x80, 0x6f,
+    0x79, 0x7d, 0x73, 0x77, 0x6a, 0x75, 0x65, 0x77, 0x69, 0x77, 0x7a, 0x76,
+    0x8a, 0x8c, 0x9d, 0x80, 0x92, 0x57, 0x52, 0x62, 0x8d, 0xaa, 0x83, 0x72,
+    0x64, 0x9b, 0x73, 0x66, 0x77, 0x83, 0x64, 0x72, 0x95, 0x7a, 0xd6, 0x85,
+    0x81, 0x62, 0x65, 0x57, 0x80, 0x4d, 0x82, 0x63, 0x6c, 0x81, 0x9d, 0x8e,
+    0x9c, 0x8c, 0x80, 0x85, 0xd0, 0x77, 0x75, 0x44, 0x6d, 0x7f, 0xb2, 0x82,
+    0x74, 0x5c, 0x84, 0x7d, 0x75, 0x60, 0x91, 0x72, 0x5c, 0x72, 0xae, 0x4f,
+    0x75, 0x6d, 0x7a, 0x83, 0x77, 0x7a, 0x6f, 0x74, 0x7d, 0x76, 0x75, 0x76,
+    0x67, 0x7d, 0x79, 0x7a, 0x77, 0x7a, 0x66, 0x6e, 0x6c, 0x4a, 0x7f, 0x76,
+    0x78, 0x7a, 0x75, 0x73, 0x76, 0x69, 0x69, 0x75, 0x78, 0x76, 0x79, 0x84,
+    0x76, 0x7f, 0x74, 0x76, 0x8b, 0x7c, 0x70, 0x75, 0x7c, 0x75, 0x84, 0x83,
+    0x6e, 0x7b, 0x71, 0x72, 0x69, 0x7b, 0x7c, 0x75, 0x62, 0x86, 0x7f, 0x72,
+    0x79, 0x77, 0x77, 0x70, 0x6f, 0x76, 0x6e, 0x78, 0x6f, 0x7a, 0x6d, 0x75,
+    0x5b, 0x75, 0x77, 0x76, 0x6d, 0x7b, 0x6f, 0x70, 0x71, 0x69, 0x77, 0x73,
+    0x75, 0x73, 0x71, 0x71, 0x6c, 0x75, 0x74, 0x70, 0x73, 0x70, 0x73, 0x6f,
+    0x76, 0x78, 0x68, 0x76, 0x6e, 0x63, 0x72, 0x74, 0x6f, 0x75, 0x71, 0x76,
+    0x70, 0x6f, 0x74, 0x6a, 0x68, 0x70, 0x71, 0x78, 0x64, 0x6f, 0x79, 0x78,
+    0x8a, 0x55, 0x53, 0xb1, 0x5f, 0x4a, 0x94, 0x7c, 0x8e, 0x62, 0x90, 0xa9,
+    0x5c, 0x56, 0xbe, 0xae, 0xbc, 0xaa, 0x4c, 0x42, 0x44, 0x35, 0x59, 0x64,
+    0x58, 0x83, 0x6e, 0xbc, 0x8a, 0x8f, 0x36, 0x8b, 0xab, 0x49, 0x5c, 0x51,
+    0x60, 0x4c, 0x9b, 0x4b, 0x83, 0x5a, 0x3a, 0x94, 0xa5, 0x43, 0x47, 0x56,
+    0x68, 0x4f, 0x5f, 0x4e, 0x9e, 0x61, 0x4e, 0xa6, 0xb7, 0xdd, 0x4e, 0xa7,
+    0x6c, 0x5a, 0x77, 0x80, 0x59, 0x56, 0x79, 0x76, 0x7b, 0x67, 0x82, 0x7f,
+    0x74, 0x6d, 0x4e, 0x91, 0x6e, 0x78, 0x83, 0x7f, 0x76, 0x7e, 0x85, 0x7b,
+    0x77, 0x83, 0x7a, 0x6e, 0x5d, 0x65, 0x79, 0x77, 0x71, 0x81, 0x83, 0x8b,
+    0x5f, 0x75, 0x4a, 0x6d, 0xa0, 0x74, 0x74, 0x60, 0x85, 0x77, 0x84, 0x7e,
+    0x72, 0x8b, 0x70, 0x70, 0x7f, 0x7f, 0x73, 0x81, 0x79, 0x92, 0x8a, 0x80,
+    0x81, 0x74, 0x7b, 0x81, 0x61, 0x69, 0x78, 0x8f, 0x5a, 0x7d, 0x8d, 0x7b,
+    0x6c, 0x81, 0x9c, 0x80, 0x69, 0x76, 0x6c, 0x7d, 0x63, 0x5d, 0x80, 0x79,
+    0x59, 0x64, 0x74, 0x75, 0x66, 0x74, 0x6d, 0x7a, 0x6e, 0x70, 0x63, 0x65,
+    0x80, 0x81, 0x7c, 0x71, 0x9a, 0x7b, 0x81, 0x82, 0x8a, 0x7a, 0x92, 0x63,
+    0x62, 0x7a, 0x6d, 0x77, 0x74, 0x55, 0x83, 0x79, 0x6f, 0x85, 0x92, 0x7d,
+    0x71, 0x76, 0x6d, 0x79, 0x76, 0x75, 0x75, 0x76, 0x77, 0x74, 0x70, 0x76,
+    0x72, 0x6d, 0x70, 0x79, 0x7f, 0x6f, 0x70, 0x74, 0x75, 0x76, 0x78, 0x77,
+    0x79, 0x6f, 0x77, 0x78, 0x75, 0x79, 0x76, 0x6f, 0x70, 0x76, 0x7c, 0x7b,
+    0x6f, 0x74, 0x72, 0x79, 0x80, 0x6d, 0x77, 0x60, 0x76, 0x77, 0x81, 0x77,
+    0x75, 0x74, 0x70, 0x6d, 0x73, 0x70, 0x7b, 0x74, 0x76, 0x7a, 0x6f, 0x78,
+    0x6a, 0x66, 0x73, 0x8a, 0x6e, 0x6c, 0x6f, 0x70, 0x79, 0x74, 0x92, 0x62,
+    0x85, 0x81, 0x46, 0x76, 0x5e, 0x6d, 0x6a, 0x7b, 0x6f, 0x80, 0x6b, 0x73,
+    0x6b, 0x74, 0x6b, 0x56, 0x75, 0x76, 0x80, 0x4a, 0x5b, 0x6c, 0x7e, 0x69,
+    0x7f, 0x75, 0x7b, 0x68, 0x92, 0x62, 0x6e, 0x7e, 0x2f, 0x82, 0x82, 0x6a,
+    0x76, 0x76, 0x6e, 0x76, 0x70, 0x69, 0x6d, 0x5d, 0x6f, 0x82, 0x74, 0x69,
+    0x70, 0x70, 0x71, 0x76, 0x76, 0x6c, 0x6a, 0x72, 0x75, 0x6e, 0x72, 0x71,
+    0x73, 0x6c, 0x6e, 0x72, 0x73, 0x71, 0x70, 0x72, 0x71, 0x7b, 0x6e, 0x74,
+    0x73, 0x75, 0x70, 0x74, 0x77, 0x77, 0x70, 0x77, 0x70, 0x73, 0x6a, 0x73,
+    0x73, 0x73, 0x75, 0x6c, 0x77, 0x73, 0x72, 0x74, 0x75, 0x6e, 0x73, 0x72,
+    0x74, 0x73, 0x71, 0x73, 0x73, 0x70, 0x76, 0x73, 0x72, 0x6f, 0x5b, 0x6e,
+    0x5f, 0x76, 0x81, 0x82, 0x8e, 0xa0, 0x76, 0x6e, 0x90, 0xb8, 0x7c, 0x8b,
+    0x86, 0x55, 0x78, 0x6f, 0x64, 0x79, 0x9d, 0x81, 0x95, 0x8a, 0xc4, 0x62,
+    0x81, 0x94, 0x8b, 0xa7, 0x86, 0x69, 0x87, 0xa9, 0xa5, 0x87, 0x69, 0x79,
+    0x62, 0x8b, 0x6a, 0x5c, 0xd3, 0xa1, 0x9d, 0x76, 0x74, 0x8a, 0x73, 0x88,
+    0x6f, 0x64, 0x8a, 0x93, 0x99, 0x60, 0xa3, 0x76, 0x52, 0x78, 0x9b, 0x5f,
+    0x79, 0x63, 0xaa, 0x83, 0x9f, 0x85, 0x7a, 0x76, 0xa6, 0xa2, 0x9f, 0x7e,
+    0x8d, 0x76, 0x6b, 0x72, 0x7f, 0x73, 0x8a, 0x72, 0x8e, 0x6d, 0xa3, 0x7d,
+    0x72, 0x70, 0x79, 0x6a, 0x72, 0x55, 0x65, 0xa4, 0x7a, 0x80, 0x83, 0x91,
+    0x81, 0xa4, 0x83, 0x8f, 0xc2, 0x8a, 0x79, 0x53, 0x6c, 0x83, 0x57, 0x86,
+    0x64, 0x8c, 0x79, 0x92, 0x82, 0x5a, 0x71, 0x73, 0x6a, 0x89, 0x8d, 0x77,
+    0x85, 0x7f, 0x67, 0x70, 0x9f, 0x81, 0x92, 0x63, 0x72, 0xa8, 0x84, 0x56,
+    0x85, 0x73, 0x6f, 0x82, 0x7f, 0x6f, 0x58, 0x73, 0x6f, 0x5f, 0x89, 0x8c,
+    0x67, 0x6d, 0x8d, 0x51, 0x83, 0x5c, 0x7b, 0x92, 0x90, 0x8a, 0x84, 0x79,
+    0x8c, 0x82, 0xa0, 0x6e, 0xce, 0x7d, 0x7c, 0x83, 0x90, 0x7f, 0x96, 0x82,
+    0x7c, 0x92, 0x83, 0x81, 0x7f, 0x60, 0x97, 0x73, 0x9b, 0x78, 0x8c, 0x7a,
+    0x78, 0x79, 0x4b, 0x72, 0x6d, 0x3f, 0x71, 0x67, 0x76, 0x57, 0x72, 0x73,
+    0x5f, 0x6e, 0x72, 0x75, 0x78, 0x6d, 0x6d, 0x6f, 0x71, 0x79, 0x6b, 0x58,
+    0x75, 0x6f, 0x6e, 0x6f, 0x74, 0x6e, 0x6e, 0x77, 0x6b, 0x6c, 0x6e, 0x77,
+    0x6a, 0x73, 0x73, 0x72, 0x6e, 0x69, 0x77, 0x74, 0x74, 0x6e, 0x6d, 0x73,
+    0x77, 0x7a, 0x71, 0x70, 0x6f, 0x61, 0x6a, 0x77, 0x64, 0x5e, 0x6f, 0x68,
+    0x7f, 0x75, 0x83, 0x84, 0x80, 0x88, 0x75, 0x68, 0x5d, 0x6c, 0x76, 0x61,
+    0x50, 0x63, 0x95, 0x71, 0x70, 0x6f, 0x60, 0x6a, 0x78, 0x7d, 0x5e, 0x56,
+    0x57, 0x76, 0x86, 0x6c, 0x61, 0x7c, 0x7a, 0x83, 0x66, 0x80, 0x94, 0x6c,
+    0x4b, 0x89, 0x70, 0x56, 0xbe, 0x47, 0x6b, 0x86, 0x8f, 0x74, 0x83, 0x58,
+    0x69, 0x6a, 0x6f, 0x77, 0x8d, 0x4d, 0x84, 0x82, 0x81, 0xa6, 0x71, 0x87,
+    0x4e, 0x4e, 0x75, 0x7c, 0x8b, 0x6f, 0xa3, 0x62, 0x8a, 0x6d, 0x91, 0x80,
+    0x5b, 0x95, 0x70, 0x7d, 0x90, 0x74, 0x64, 0x68, 0x3c, 0x44, 0xa7, 0x62,
+    0x57, 0x7f, 0x73, 0x83, 0x90, 0x9b, 0x4d, 0x95, 0x8f, 0x7d, 0x4f, 0x61,
+    0x57, 0x93, 0x7f, 0x81, 0xc4, 0x89, 0x47, 0x78, 0xa8, 0x52, 0x60, 0x68,
+    0x5e, 0x8a, 0x68, 0x93, 0x83, 0x5d, 0x5f, 0x73, 0xa4, 0xf1, 0x38, 0x8d,
+    0x78, 0x7b, 0x6c, 0x8b, 0x7b, 0x76, 0x78, 0x73, 0x6a, 0x7b, 0x68, 0x6e,
+    0x6b, 0x6a, 0x83, 0x79, 0x76, 0x77, 0x77, 0x71, 0x66, 0x7b, 0x78, 0x78,
+    0x73, 0x71, 0x6c, 0x80, 0x7d, 0x74, 0x75, 0x76, 0x73, 0x76, 0x6f, 0x70,
+    0x71, 0x7a, 0x6f, 0x6e, 0x9f, 0x87, 0x73, 0x70, 0x59, 0x74, 0x3b, 0x77,
+    0x6e, 0x6c, 0x77, 0x72, 0x6e, 0x73, 0x6e, 0x6d, 0x76, 0x89, 0x7e, 0x79,
+    0x74, 0x76, 0x76, 0x7b, 0x74, 0x74, 0x7a, 0x76, 0x75, 0x74, 0x70, 0x74,
+    0x74, 0x72, 0x73, 0x74, 0x4e, 0x77, 0x79, 0x76, 0x77, 0x77, 0x73, 0x77,
+    0x74, 0x72, 0x75, 0x73, 0x74, 0x75, 0x73, 0x74, 0x72, 0x76, 0x76, 0x78,
+    0x79, 0x79, 0x6f, 0x76, 0x7c, 0x76, 0x76, 0x5e, 0x7c, 0x72, 0x5f, 0x74,
+    0x72, 0x68, 0x6f, 0x76, 0x76, 0x76, 0x78, 0x76, 0x75, 0x71, 0x70, 0x75,
+    0x70, 0x77, 0x6b, 0x98, 0x7a, 0x5e, 0x69, 0x74, 0x54, 0x70, 0x7a, 0x6f,
+    0x72, 0x6e, 0x75, 0x71, 0x77, 0x78, 0x7b, 0x75, 0x79, 0x7e, 0x6f, 0x7d,
+    0x6f, 0x71, 0x7d, 0x75, 0x75, 0x85, 0x70, 0x7a, 0x72, 0x73, 0x77, 0x68,
+    0x77, 0x83, 0x78, 0x73, 0xa1, 0x5e, 0x70, 0x73, 0x73, 0x75, 0x81, 0x60,
+    0x82, 0x6d, 0x76, 0x7b, 0x77, 0x63, 0x84, 0x6f, 0x75, 0x84, 0x7b, 0x7e,
+    0x72, 0x72, 0x71, 0x71, 0x72, 0x71, 0x71, 0x70, 0x72, 0x71, 0x6d, 0x74,
+    0x73, 0x71, 0x72, 0x72, 0x76, 0x70, 0x6a, 0x72, 0x72, 0x6e, 0x70, 0x6e,
+    0x71, 0x71, 0x72, 0x6c, 0x72, 0x71, 0x70, 0x6f, 0x6f, 0x6f, 0x6f, 0x73,
+    0x74, 0x73, 0x70, 0x70, 0x71, 0x71, 0x72, 0x6f, 0x6e, 0x71, 0x73, 0x70,
+    0x73, 0x71, 0x72, 0x72, 0x6f, 0x72, 0x6f, 0x71, 0x75, 0x71, 0x71, 0x70,
+    0x62, 0x6e, 0x75, 0x74, 0x86, 0x51, 0x73, 0x62, 0x7e, 0x72, 0x82, 0x70,
+    0x5c, 0x61, 0x7d, 0x6e, 0x7c, 0x78, 0x6f, 0x88, 0x77, 0x77, 0x9e, 0x39,
+    0x83, 0x73, 0x6e, 0x4d, 0x7f, 0x57, 0x83, 0x93, 0x72, 0x89, 0x71, 0x76,
+    0x7b, 0x87, 0x84, 0x77, 0xb8, 0x6e, 0x74, 0x66, 0x79, 0x83, 0x7d, 0x7b,
+    0x6d, 0x6f, 0x7e, 0x6b, 0x6f, 0x3b, 0x82, 0x69, 0x61, 0xc6, 0x6f, 0x5f,
+    0x79, 0x79, 0x63, 0x7f, 0x6b, 0x7a, 0x72, 0x73, 0x57, 0x72, 0x54, 0x70,
+    0x73, 0x72, 0x54, 0x75, 0x78, 0x77, 0x71, 0x76, 0x72, 0x78, 0x6e, 0x64,
+    0x75, 0x77, 0x7b, 0x6d, 0x71, 0x74, 0x74, 0x72, 0x73, 0x78, 0x7b, 0x78,
+    0x6b, 0x75, 0x73, 0x77, 0x93, 0x74, 0x73, 0x7a, 0x61, 0x6e, 0x7e, 0x62,
+    0x71, 0x72, 0x73, 0x76, 0x72, 0x77, 0x70, 0x78, 0x72, 0x7d, 0x5b, 0x76,
+    0x7b, 0x72, 0x6b, 0x7e, 0x82, 0x5c, 0x5d, 0x86, 0x76, 0x91, 0x7e, 0x67,
+    0x7b, 0x52, 0x71, 0x92, 0x5c, 0x83, 0x72, 0x6a, 0x76, 0x83, 0xae, 0x6b,
+    0x6c, 0x75, 0x80, 0x7f, 0x63, 0x5d, 0x7f, 0x86, 0x8f, 0x86, 0x54, 0x6e,
+    0x70, 0x95, 0x78, 0x7e, 0xc6, 0x80, 0x78, 0x78, 0x7b, 0x73, 0xb2, 0x92,
+    0x71, 0x8c, 0x83, 0x83, 0x9b, 0x50, 0x78, 0x6e, 0x69, 0xd3, 0x7e, 0x95,
+    0x79, 0x8d, 0x80, 0x71, 0x8d, 0x76, 0x6b, 0x39, 0x80, 0xaa, 0x99, 0x4d,
+    0x98, 0xab, 0x33, 0x45, 0x1b, 0x64, 0xb6, 0xbb, 0x90, 0x99, 0xae, 0x9f,
+    0xba, 0x13, 0x2a, 0x65, 0x5f, 0x59, 0xb1, 0x34, 0x2d, 0xa5, 0xc4, 0x9b,
+    0x92, 0x97, 0x76, 0x79, 0x7a, 0x9c, 0xa4, 0x69, 0x7a, 0x97, 0xac, 0x8d,
+    0x4b, 0x85, 0x62, 0x7d, 0x4d, 0xae, 0x9c, 0x69, 0x5b, 0x79, 0xc0, 0x33,
+    0x77, 0x48, 0x60, 0x76, 0x8b, 0x4a, 0x84, 0x82, 0x80, 0x6d, 0x9f, 0x87,
+    0x64, 0x3f, 0x39, 0x92, 0x74, 0x7d, 0x77, 0x6e, 0x7d, 0x6e, 0x77, 0x6d,
+    0x8f, 0x81, 0x5e, 0x62, 0x73, 0x80, 0x66, 0x85, 0x7f, 0x8a, 0x97, 0x69,
+    0x80, 0x7d, 0x86, 0x50, 0xcd, 0x69, 0x85, 0x58, 0x96, 0x6f, 0x8c, 0x6d,
+    0x70, 0x67, 0x72, 0x66, 0x7f, 0x56, 0x70, 0x9d, 0x6a, 0xda, 0x7a, 0x93,
+    0x6b, 0x71, 0x6c, 0x7c, 0x90, 0x9a, 0x87, 0x66, 0x7f, 0x91, 0x99, 0x6c,
+    0x9a, 0x96, 0x58, 0x87, 0x5b, 0x5c, 0x6e, 0x6c, 0x71, 0x5b, 0x8f, 0x5a,
+    0x65, 0x8e, 0x69, 0x5e, 0x78, 0x7b, 0x6a, 0xa7, 0x90, 0x81, 0x6c, 0x7c,
+    0xa2, 0x93, 0x83, 0x8f, 0xca, 0xb0, 0x79, 0x5c, 0x72, 0x80, 0x7a, 0x74,
+    0x83, 0x8d, 0x79, 0x77, 0x99, 0x5a, 0x8b, 0x89, 0x63, 0xda, 0x73, 0x90,
+    0x91, 0x71, 0x91, 0x78, 0x6f, 0x6c, 0x6e, 0x75, 0x92, 0x66, 0x77, 0x7c,
+    0x77, 0x46, 0x90, 0x82, 0x57, 0x68, 0x61, 0x71, 0x82, 0x71, 0x90, 0x62,
+    0x89, 0x74, 0x78, 0x87, 0x6d, 0x62, 0x83, 0x89, 0x78, 0x9d, 0x5d, 0x86,
+    0x7f, 0x69, 0x8a, 0x91, 0xb7, 0x9d, 0x5c, 0x93, 0x7d, 0x8b, 0x73, 0x73,
+    0x60, 0x72, 0x81, 0x6b, 0x82, 0x54, 0x7f, 0x74, 0x5b, 0xc9, 0x68, 0x76,
+    0x71, 0x79, 0x8a, 0x7f, 0x80, 0x66, 0x7a, 0x7e, 0x96, 0x95, 0x9f, 0x85,
+    0x83, 0x85, 0x66, 0x7d, 0x88, 0x72, 0x75, 0x64, 0x79, 0x87, 0xab, 0x70,
+    0x53, 0x72, 0x88, 0x48, 0x75, 0x7d, 0x71, 0x9a, 0x77, 0x8e, 0x9e, 0x71,
+    0x9e, 0xaa, 0x81, 0x7e, 0xc6, 0x8b, 0x8a, 0x62, 0x72, 0x65, 0x73, 0x75,
+    0x5d, 0x58, 0x76, 0x68, 0x7f, 0x59, 0xa7, 0x70, 0x5b, 0xdd, 0x6a, 0x6a,
+    0x6e, 0x6b, 0x84, 0x86, 0x7a, 0x87, 0x82, 0x7e, 0x7e, 0x48, 0x9f, 0x7e,
+    0x8d, 0x7b, 0x72, 0x8d, 0x71, 0x7c, 0x78, 0x8c, 0x82, 0x91, 0x9e, 0x6a,
+    0x71, 0x74, 0x8f, 0x86, 0x58, 0x8e, 0x7b, 0x95, 0x79, 0x7e, 0x8a, 0x87,
+    0x64, 0x81, 0x56, 0x9c, 0x91, 0x80, 0x7d, 0x7b, 0x6e, 0x6c, 0xa1, 0x77,
+    0x81, 0x85, 0x75, 0x74, 0x81, 0xa5, 0x65, 0x50, 0x65, 0x88, 0x6f, 0x89,
+    0x7c, 0x70, 0x5e, 0x79, 0x7d, 0x64, 0x92, 0x7d, 0x83, 0x64, 0x8b, 0x82,
+    0x5c, 0x9c, 0x55, 0x92, 0x9e, 0x80, 0x50, 0x5b, 0x4a, 0x7e, 0x9f, 0x72,
+    0x5e, 0x75, 0x78, 0x6a, 0x90, 0x59, 0x77, 0x9f, 0x93, 0x83, 0x6e, 0x64,
+    0x68, 0x66, 0xa2, 0x7d, 0xcf, 0x83, 0x5d, 0x66, 0x52, 0x77, 0x74, 0x6f,
+    0x84, 0x7d, 0x78, 0x91, 0x7c, 0x5b, 0x7e, 0x7d, 0x8e, 0xe1, 0x74, 0x90,
+    0x83, 0x6b, 0x69, 0x7d, 0x7e, 0x64, 0x70, 0x7e, 0x70, 0x6d, 0x7e, 0x8f,
+    0x60, 0x8d, 0x75, 0x8b, 0xa5, 0x61, 0x6c, 0x69, 0x7b, 0x74, 0x72, 0x65,
+    0x6f, 0x6a, 0x6c, 0x6b, 0x7d, 0x90, 0x74, 0x94, 0x95, 0x90, 0x5a, 0x5a,
+    0x60, 0x76, 0x94, 0x7d, 0xce, 0x8f, 0x85, 0x79, 0x81, 0x79, 0x5d, 0x63,
+    0x80, 0x68, 0x7d, 0x70, 0x77, 0x5d, 0x82, 0x7c, 0x72, 0x95, 0x57, 0x8f,
+    0x70, 0x6f, 0x6e, 0x68, 0x6c, 0x6e, 0x69, 0x72, 0x70, 0x6f, 0x6c, 0x66,
+    0x6a, 0x6c, 0x71, 0x6c, 0x6b, 0x72, 0x69, 0x71, 0x6e, 0x6c, 0x67, 0x66,
+    0x6e, 0x6a, 0x66, 0x6f, 0x6e, 0x6f, 0x70, 0x5c, 0x6d, 0x6d, 0x67, 0x6a,
+    0x6d, 0x6c, 0x6f, 0x6b, 0x5c, 0x6f, 0x6e, 0x70, 0x69, 0x71, 0x68, 0x6f,
+    0x65, 0x6e, 0x6f, 0x72, 0x6e, 0x6f, 0x6e, 0x69, 0x72, 0x5e, 0x68, 0x6d,
+    0x74, 0x67, 0x72, 0x8a, 0x78, 0x76, 0x76, 0x6f, 0x72, 0x77, 0x77, 0x71,
+    0x7a, 0x4c, 0x7b, 0x62, 0x62, 0x68, 0x69, 0x7f, 0x5b, 0x85, 0x6e, 0x76,
+    0x6b, 0x72, 0x7c, 0x61, 0x6f, 0x76, 0x6b, 0x6c, 0x76, 0x75, 0x70, 0x61,
+    0x7f, 0x77, 0x81, 0x45, 0x76, 0x77, 0x70, 0x7b, 0x79, 0x81, 0x74, 0x74,
+    0x71, 0x8b, 0x6f, 0x8a, 0x7a, 0x69, 0x6a, 0x4f, 0x6e, 0x6f, 0x75, 0x7c,
+    0x79, 0x57, 0x7d, 0x8d, 0x7c, 0x77, 0x6a, 0x71, 0x68, 0x68, 0x81, 0x72,
+    0x69, 0x79, 0x6e, 0x74, 0x75, 0x6e, 0x77, 0x74, 0x77, 0x7d, 0x79, 0x6e,
+    0x7b, 0x75, 0x76, 0x79, 0x7a, 0x7e, 0x76, 0x79, 0x79, 0x79, 0x7a, 0x6a,
+    0x70, 0x7a, 0x7a, 0x73, 0xa2, 0x77, 0x6a, 0x73, 0x90, 0x76, 0x8b, 0x60,
+    0x73, 0x67, 0x75, 0x7c, 0x7c, 0x4a, 0x78, 0x71, 0x6f, 0x7d, 0x7a, 0x75,
+    0x73, 0x61, 0x69, 0x6d, 0x7c, 0x6c, 0x91, 0x8a, 0x62, 0x70, 0x60, 0x6a,
+    0x6b, 0x70, 0x83, 0x9a, 0x77, 0x95, 0x4f, 0x55, 0x7c, 0x7d, 0x5a, 0x75,
+    0x44, 0x86, 0x8e, 0x87, 0x9a, 0x81, 0x56, 0x72, 0x81, 0x63, 0x60, 0x55,
+    0x59, 0x70, 0x6f, 0x6b, 0x88, 0x71, 0x63, 0x7f, 0x89, 0x59, 0x6e, 0x65,
+    0x70, 0x69, 0x83, 0x68, 0x88, 0x54, 0x69, 0x77, 0x8b, 0x9e, 0x55, 0x8e,
+    0x6f, 0x68, 0x7b, 0x76, 0x7b, 0x67, 0x6f, 0x77, 0x7f, 0x71, 0x7a, 0x6e,
+    0x6a, 0x77, 0x7d, 0x7c, 0x77, 0x77, 0x77, 0x78, 0x73, 0x7d, 0x7e, 0x7b,
+    0x71, 0x72, 0x6f, 0x74, 0x79, 0x7c, 0x74, 0x77, 0x78, 0x6f, 0x78, 0x67,
+    0x7b, 0x7e, 0x78, 0x70, 0x90, 0x79, 0x6f, 0x78, 0x81, 0x78, 0x7f, 0x77,
+    0x79, 0x63, 0x74, 0x79, 0x75, 0x41, 0x74, 0x73, 0x70, 0x73, 0x74, 0x73,
+    0x64, 0x99, 0x6e, 0x70, 0x94, 0x48, 0x93, 0x7c, 0x6b, 0x7e, 0xa8, 0x7a,
+    0x78, 0x87, 0x62, 0x85, 0x71, 0x83, 0x63, 0x75, 0x60, 0x6b, 0xa4, 0x6c,
+    0x9a, 0x8f, 0x6f, 0x89, 0x88, 0x59, 0x6e, 0x97, 0x84, 0x65, 0x60, 0x80,
+    0x7e, 0x69, 0x7f, 0x5d, 0xd0, 0x6e, 0x84, 0x79, 0x72, 0x67, 0x67, 0x86,
+    0x86, 0x56, 0x84, 0x67, 0x96, 0x63, 0x63, 0x7e, 0x8e, 0xa0, 0x83, 0x6e,
+    0x71, 0x99, 0x8a, 0x7d, 0x87, 0x90, 0x7b, 0x72, 0x73, 0x78, 0xa2, 0x78,
+    0x8e, 0x84, 0x7f, 0x47, 0x5b, 0x8a, 0x6f, 0x60, 0x86, 0x7e, 0xcd, 0x5b,
+    0x93, 0x6b, 0x6c, 0x4b, 0x72, 0x6e, 0x82, 0x7a, 0x6f, 0x80, 0x8d, 0x68,
+    0x8f, 0x81, 0x77, 0x7f, 0xd4, 0xad, 0x94, 0x96, 0x78, 0x7a, 0x60, 0x8f,
+    0x6f, 0x56, 0x84, 0x73, 0x96, 0x5b, 0x83, 0x72, 0x57, 0x76, 0x8d, 0x79,
+    0x71, 0x7e, 0x46, 0x75, 0x79, 0x73, 0x7a, 0x75, 0x74, 0x70, 0x79, 0x73,
+    0x78, 0x73, 0x70, 0x74, 0x70, 0x74, 0x74, 0x6f, 0x6e, 0x7e, 0x6c, 0x71,
+    0x66, 0x5f, 0x7f, 0x6e, 0x6f, 0x7e, 0x70, 0x73, 0x75, 0x65, 0x76, 0x7b,
+    0x72, 0x70, 0x77, 0x71, 0x8d, 0x71, 0x75, 0x70, 0x77, 0x80, 0x62, 0x6e,
+    0x6d, 0x6b, 0x75, 0x77, 0x77, 0x75, 0x63, 0x70, 0x74, 0x79, 0x78, 0x70,
+    0x61, 0x7b, 0x71, 0x7b, 0x77, 0x95, 0x58, 0x71, 0x7e, 0x92, 0x7c, 0x71,
+    0x91, 0x4e, 0x8d, 0x67, 0x7a, 0x8e, 0x41, 0x77, 0x76, 0x61, 0xae, 0x84,
+    0x81, 0x5f, 0x59, 0x9a, 0x78, 0x6d, 0x69, 0x7c, 0xa1, 0x7f, 0xa3, 0x9d,
+    0x72, 0x7a, 0xa3, 0x59, 0xdb, 0x9a, 0x98, 0x51, 0x71, 0x6c, 0x89, 0x8a,
+    0x88, 0x71, 0x78, 0x99, 0x7f, 0x60, 0x8a, 0x71, 0x73, 0x74, 0x89, 0x7e,
+    0x73, 0x9a, 0x3b, 0x80, 0x80, 0x7b, 0x63, 0x85, 0x4c, 0x76, 0x6a, 0x66,
+    0x7d, 0x49, 0x92, 0x74, 0x86, 0x77, 0x77, 0x5b, 0x86, 0x7e, 0x55, 0x4c,
+    0x66, 0x6b, 0x69, 0x80, 0x7c, 0x6e, 0x58, 0x78, 0x6d, 0x90, 0x77, 0x6a,
+    0x58, 0x81, 0x7e, 0x70, 0x9f, 0x49, 0x67, 0x7c, 0x86, 0x76, 0x85, 0x70,
+    0x78, 0x5a, 0x6f, 0x62, 0x79, 0x4e, 0x80, 0x82, 0x7b, 0x88, 0xa1, 0x67,
+    0x5e, 0x8e, 0x84, 0x91, 0x97, 0x53, 0x7d, 0x6f, 0x57, 0x70, 0x70, 0x74,
+    0x73, 0x6d, 0x94, 0x8a, 0x7c, 0x6b, 0x80, 0x76, 0x64, 0x78, 0x7a, 0x47,
+    0x6a, 0x8e, 0x8e, 0x70, 0x64, 0x77, 0x66, 0x8f, 0x75, 0x83, 0x90, 0x97,
+    0x6e, 0x7f, 0x84, 0x74, 0xb5, 0x75, 0x79, 0x63, 0x9b, 0x72, 0x90, 0x79,
+    0x78, 0x70, 0x6e, 0x7d, 0x77, 0x6c, 0x61, 0x77, 0x7b, 0xa4, 0x83, 0x76,
+    0x6e, 0x6d, 0x7e, 0x7c, 0x7f, 0x76, 0x75, 0x79, 0x7f, 0x77, 0x77, 0x6b,
+    0x69, 0x79, 0x7a, 0x78, 0x7f, 0x71, 0x71, 0x76, 0x77, 0x79, 0x73, 0x75,
+    0x6e, 0x77, 0x72, 0x72, 0x7c, 0x77, 0x77, 0x67, 0x7a, 0x6c, 0x78, 0x68,
+    0x75, 0x83, 0x74, 0x6b, 0x91, 0x68, 0x6c, 0x78, 0x7d, 0x74, 0x7f, 0x77,
+    0x7d, 0x63, 0x74, 0x76, 0x71, 0x43, 0x74, 0x74, 0x61, 0x78, 0x70, 0x74,
+    0x5c, 0x6b, 0x70, 0x82, 0x92, 0x92, 0x79, 0x61, 0x87, 0x9b, 0x93, 0x5a,
+    0xb3, 0x92, 0x6b, 0x5d, 0x43, 0x70, 0x6b, 0x79, 0x86, 0x60, 0xb4, 0x94,
+    0x8c, 0x6f, 0x65, 0x63, 0x78, 0x71, 0x72, 0x97, 0x77, 0x85, 0xa5, 0x87,
+    0xa2, 0xac, 0x7f, 0x87, 0xd5, 0x7b, 0x72, 0x6f, 0x72, 0x86, 0x6c, 0x7f,
+    0x79, 0x49, 0x7e, 0x7e, 0x8a, 0x59, 0x8c, 0x69, 0x70, 0x77, 0x9f, 0x7f,
+    0x79, 0x54, 0x6f, 0x86, 0x77, 0x7b, 0x7a, 0x84, 0x77, 0x82, 0x76, 0x81,
+    0x86, 0x7c, 0x63, 0x6e, 0x71, 0x6f, 0x66, 0x6a, 0x7a, 0x83, 0x86, 0x7e,
+    0x61, 0x78, 0x63, 0x7e, 0x8e, 0x76, 0x7d, 0x7d, 0x80, 0x6e, 0x72, 0x71,
+    0x43, 0x5d, 0x74, 0x82, 0xa6, 0x82, 0x81, 0x72, 0x8e, 0x6d, 0x7f, 0x76,
+    0x62, 0x7a, 0x6b, 0x7b, 0x6a, 0x45, 0x76, 0x65, 0x64, 0x8b, 0x60, 0x7c,
+    0x96, 0x5c, 0x75, 0x74, 0x6e, 0x57, 0x91, 0x96, 0x4f, 0x5c, 0x88, 0xa4,
+    0x38, 0x65, 0xa0, 0x9f, 0x97, 0x99, 0x3b, 0x52, 0x65, 0x8f, 0x74, 0x5d,
+    0x79, 0x8d, 0x7e, 0x98, 0x9b, 0xb7, 0x50, 0x94, 0xa3, 0x42, 0x39, 0x6e,
+    0x2c, 0x92, 0x7a, 0x59, 0xa1, 0x3e, 0x54, 0x98, 0xa3, 0x62, 0x84, 0x67,
+    0x94, 0x78, 0x9c, 0x57, 0x83, 0x3b, 0x40, 0x80, 0x97, 0x8f, 0x1c, 0x87,
+    0x73, 0x73, 0x70, 0x6f, 0x6f, 0x71, 0x6f, 0x72, 0x74, 0x73, 0x71, 0x6f,
+    0x70, 0x6c, 0x71, 0x71, 0x6e, 0x76, 0x71, 0x72, 0x71, 0x6e, 0x73, 0x74,
+    0x75, 0x71, 0x70, 0x72, 0x76, 0x72, 0x72, 0x71, 0x78, 0x71, 0x6f, 0x72,
+    0x75, 0x75, 0x70, 0x73, 0x73, 0x73, 0x74, 0x74, 0x72, 0x6d, 0x74, 0x72,
+    0x70, 0x71, 0x75, 0x6a, 0x72, 0x5d, 0x72, 0x82, 0x76, 0x6d, 0x72, 0x6f,
+    0x76, 0x7d, 0x6a, 0x7b, 0x73, 0x7c, 0x74, 0x76, 0x5d, 0x74, 0x52, 0x71,
+    0x70, 0x71, 0x4b, 0x78, 0x78, 0x75, 0x75, 0x75, 0x74, 0x72, 0x70, 0x4b,
+    0x77, 0x7a, 0x76, 0x67, 0x72, 0x72, 0x75, 0x75, 0x71, 0x77, 0x7c, 0x78,
+    0x70, 0x78, 0x6c, 0x70, 0x92, 0x71, 0x74, 0x7b, 0x58, 0x69, 0x73, 0x6c,
+    0x78, 0x70, 0x70, 0x78, 0x73, 0x70, 0x68, 0x78, 0x7a, 0x7e, 0x6d, 0x71,
+    0x75, 0x54, 0x7c, 0x82, 0x8d, 0x63, 0x6e, 0x83, 0x90, 0x70, 0x9a, 0x69,
+    0x6a, 0x5e, 0x53, 0x7a, 0x87, 0x69, 0x71, 0x63, 0x71, 0x74, 0xb6, 0x73,
+    0x5f, 0x7f, 0x75, 0x7b, 0x6d, 0x7f, 0x7c, 0x95, 0x8f, 0x76, 0x62, 0x58,
+    0x64, 0x5f, 0x7b, 0x74, 0xd1, 0x9b, 0x8e, 0x79, 0x92, 0x73, 0x70, 0x6f,
+    0x83, 0x5c, 0x87, 0x7e, 0x74, 0x59, 0x7e, 0x72, 0x73, 0x73, 0x64, 0x87,
+    0x5c, 0x63, 0x77, 0x79, 0x77, 0x65, 0x6e, 0x81, 0x7b, 0x80, 0x83, 0x77,
+    0x60, 0x8c, 0x8b, 0x84, 0x69, 0x72, 0x71, 0x69, 0x6d, 0x8e, 0x87, 0x7b,
+    0x62, 0x7d, 0x67, 0x70, 0x77, 0x85, 0x6d, 0x76, 0x82, 0x8b, 0x65, 0x64,
+    0x79, 0x8b, 0x72, 0x86, 0x99, 0x7b, 0x7e, 0x8c, 0x8e, 0x5c, 0x87, 0x65,
+    0x7f, 0x5b, 0x75, 0x63, 0x65, 0x4a, 0x5f, 0x7a, 0x69, 0x96, 0x80, 0x67,
+    0x50, 0x5b, 0x83, 0x89, 0x74, 0x6d, 0x76, 0x68, 0x7b, 0x77, 0x7e, 0x61,
+    0x7c, 0x56, 0x47, 0x90, 0x84, 0x73, 0x72, 0x7f, 0x72, 0x76, 0x8d, 0x7c,
+    0x86, 0x7e, 0x77, 0x6b, 0x6c, 0x7a, 0x7e, 0x73, 0x7e, 0x75, 0x8d, 0x9c,
+    0x77, 0x62, 0x6b, 0x73, 0xa7, 0x7b, 0x6e, 0x60, 0x85, 0x77, 0x8d, 0x7c,
+    0x75, 0x73, 0x76, 0x81, 0x7e, 0x7e, 0x73, 0x7f, 0x71, 0x81, 0x7a, 0x82,
+    0x91, 0x54, 0x69, 0x71, 0x87, 0xae, 0x7d, 0x79, 0x7f, 0x67, 0x7e, 0x87,
+    0x6b, 0x80, 0x9a, 0x97, 0x8b, 0x85, 0x71, 0x5b, 0x6b, 0x59, 0x98, 0x66,
+    0x65, 0x98, 0x90, 0x76, 0x6f, 0x81, 0x79, 0x8f, 0x85, 0x66, 0x64, 0x62,
+    0x68, 0x63, 0x8d, 0x75, 0xd1, 0x63, 0x87, 0x7a, 0x6f, 0x73, 0x72, 0x65,
+    0x77, 0x71, 0x83, 0x9b, 0xae, 0x5d, 0x64, 0x7f, 0x6d, 0x7e, 0x55, 0x94,
+    0x6f, 0x68, 0x72, 0x76, 0x77, 0x74, 0x78, 0x7f, 0x6c, 0x6a, 0x63, 0x59,
+    0x64, 0x82, 0x73, 0x85, 0x73, 0x72, 0x26, 0x66, 0x57, 0x74, 0x67, 0x74,
+    0x6d, 0x7b, 0x7e, 0x7b, 0x79, 0x78, 0x6b, 0x81, 0x7f, 0x6f, 0x5d, 0x6f,
+    0x6c, 0x6a, 0x74, 0x77, 0x83, 0x6a, 0x67, 0x7c, 0x81, 0x74, 0x72, 0x67,
+    0x73, 0x77, 0x7c, 0x73, 0x79, 0x70, 0x71, 0x73, 0x7e, 0x84, 0x67, 0x7d,
+    0x55, 0x8e, 0x68, 0x63, 0x98, 0x6c, 0x6c, 0x6a, 0x27, 0x72, 0x24, 0x4d,
+    0x74, 0x78, 0x46, 0x8f, 0x82, 0x77, 0x5a, 0x6d, 0x5b, 0x60, 0x2a, 0x3d,
+    0x6e, 0x62, 0x38, 0x5b, 0x3e, 0x5b, 0x78, 0x88, 0x8d, 0x6a, 0x91, 0x3a,
+    0x64, 0x97, 0x76, 0x69, 0x6b, 0x38, 0xa5, 0x6b, 0x8e, 0x55, 0x4a, 0x42,
+    0x5e, 0x8b, 0x60, 0x83, 0x9b, 0x28, 0x51, 0x5f, 0x70, 0x71, 0xa1, 0x92,
+    0x83, 0x86, 0x98, 0x78, 0x90, 0x9d, 0x56, 0x61, 0x86, 0x90, 0x80, 0x97,
+    0x99, 0xa1, 0x60, 0x79, 0x7b, 0x53, 0xa4, 0x7b, 0x8c, 0x7f, 0xc6, 0x67,
+    0x58, 0x6f, 0x75, 0x66, 0x8a, 0xa6, 0x6c, 0xab, 0x83, 0x90, 0x78, 0x96,
+    0x99, 0x9f, 0x75, 0x9a, 0xd0, 0x9b, 0x8d, 0x41, 0x6a, 0x8d, 0x74, 0x73,
+    0x74, 0xb4, 0x7e, 0x92, 0x9c, 0x62, 0x5f, 0x72, 0x4e, 0x73, 0x8b, 0x80,
+    0x68, 0x79, 0x76, 0x7b, 0x6d, 0x71, 0x79, 0x77, 0x75, 0x79, 0x7e, 0x70,
+    0x85, 0x6f, 0x6c, 0x70, 0x6c, 0x7f, 0x6b, 0x72, 0x70, 0x77, 0x7d, 0x78,
+    0x7c, 0x6f, 0x6b, 0x79, 0x7b, 0x77, 0x78, 0x74, 0x79, 0x6d, 0x60, 0x7e,
+    0x6d, 0x70, 0x75, 0x75, 0x7d, 0x6f, 0x73, 0x76, 0x73, 0x76, 0x7c, 0x74,
+    0x74, 0x78, 0x6f, 0x6d, 0x7a, 0x72, 0x71, 0x79, 0x61, 0x6f, 0x81, 0x75,
+    0x75, 0x7c, 0x66, 0x8d, 0x80, 0x7c, 0x74, 0x7d, 0x70, 0x79, 0x65, 0x71,
+    0x7d, 0x4e, 0x7f, 0x71, 0x79, 0x78, 0x75, 0x70, 0x7a, 0x69, 0x7f, 0x4d,
+    0x75, 0x70, 0x73, 0x68, 0x7a, 0x63, 0x77, 0x6f, 0x76, 0x70, 0x77, 0x71,
+    0x7d, 0x6f, 0x7b, 0x78, 0xa2, 0x6c, 0x7a, 0x77, 0x4e, 0x77, 0x5c, 0x78,
+    0x73, 0x87, 0x77, 0x79, 0x73, 0x6a, 0x78, 0x83, 0x71, 0x8f, 0x6b, 0x7c,
+    0x58, 0x6e, 0xab, 0x80, 0x85, 0x7b, 0x54, 0x61, 0xae, 0x89, 0x95, 0x6a,
+    0xad, 0xa4, 0x96, 0x70, 0x6f, 0x66, 0x8e, 0xaa, 0x84, 0x71, 0x95, 0x5f,
+    0x9d, 0x64, 0x62, 0x5c, 0x6c, 0x67, 0x8b, 0x62, 0x72, 0x87, 0x71, 0xce,
+    0x67, 0x96, 0x59, 0x99, 0x80, 0xa3, 0x7e, 0x68, 0x70, 0x97, 0x73, 0xa6,
+    0x65, 0x63, 0x41, 0x85, 0x88, 0xbe, 0x8c, 0x60, 0x6b, 0x61, 0xb7, 0x53,
+    0x75, 0x89, 0x76, 0x7a, 0x9b, 0x7e, 0x6b, 0x61, 0x79, 0xa4, 0x91, 0x75,
+    0x67, 0x68, 0x7c, 0x68, 0x6a, 0x81, 0x4c, 0x88, 0x7d, 0x87, 0x9e, 0x53,
+    0xac, 0x89, 0x7c, 0x78, 0x78, 0x80, 0x6c, 0x8f, 0x6c, 0x5d, 0x7a, 0x84,
+    0x7e, 0x64, 0x84, 0x7c, 0xc6, 0x82, 0x8d, 0x76, 0xa3, 0x7f, 0x6f, 0x7e,
+    0x69, 0x63, 0x82, 0x5c, 0x88, 0x53, 0x63, 0x77, 0x62, 0xd7, 0x5f, 0x5e,
+    0x67, 0x89, 0x8a, 0x7d, 0x74, 0x82, 0x7d, 0x82, 0x84, 0x8c, 0x8d, 0x86,
+    0x7b, 0x7b, 0x6d, 0x7e, 0x74, 0x72, 0x97, 0x83, 0x68, 0x82, 0xc1, 0x70,
+    0xa4, 0x83, 0x61, 0x5a, 0x75, 0x6f, 0x74, 0x93, 0x61, 0x74, 0x65, 0xa6,
+    0x9d, 0x8a, 0x89, 0x77, 0xcd, 0x92, 0x71, 0x7a, 0x8f, 0x87, 0xb4, 0x84,
+    0x7c, 0x7f, 0x86, 0x82, 0x78, 0x64, 0x76, 0x76, 0x62, 0x70, 0x6c, 0x6f,
+    0x70, 0x53, 0x7d, 0x6c, 0x77, 0x68, 0x83, 0x71, 0x80, 0x71, 0x80, 0x69,
+    0x81, 0x87, 0x7c, 0x72, 0x79, 0x67, 0x73, 0x78, 0x75, 0x72, 0x86, 0x5f,
+    0x78, 0x6c, 0x6f, 0x77, 0x80, 0x85, 0x77, 0x7e, 0x84, 0x6d, 0x71, 0x7e,
+    0x83, 0x86, 0x7e, 0x62, 0x8a, 0x6d, 0x70, 0x7b, 0x8c, 0x79, 0x80, 0x63,
+    0x78, 0x6c, 0x74, 0x6d, 0x72, 0x54, 0x6f, 0x76, 0x59, 0x8b, 0x74, 0x6d,
+    0x77, 0x73, 0x7f, 0x82, 0x76, 0x73, 0x70, 0x6e, 0x78, 0x72, 0x79, 0x78,
+    0x7b, 0x7c, 0x6c, 0x79, 0x74, 0x7a, 0x75, 0x7b, 0x79, 0x54, 0x7c, 0x76,
+    0x6c, 0x74, 0x77, 0x6a, 0x7f, 0x73, 0x74, 0x7c, 0x7c, 0x74, 0x6b, 0x70,
+    0x69, 0x7c, 0x76, 0x7e, 0x91, 0x77, 0x71, 0x63, 0x80, 0x74, 0x7a, 0x81,
+    0x66, 0x71, 0x74, 0x7b, 0x71, 0x74, 0x74, 0x76, 0x64, 0x76, 0x7f, 0x80,
+    0x5f, 0x6d, 0x9a, 0x99, 0x96, 0x96, 0x6e, 0x5c, 0x9a, 0x74, 0x83, 0x4b,
+    0x9f, 0x8f, 0x76, 0x78, 0x65, 0x7a, 0x82, 0x69, 0x89, 0x82, 0xc5, 0x77,
+    0x7b, 0x77, 0x98, 0x5a, 0x89, 0x8d, 0x6a, 0x91, 0x73, 0x89, 0x9b, 0x80,
+    0x76, 0x9e, 0x8e, 0x73, 0xd1, 0x93, 0x79, 0x4d, 0x9d, 0x79, 0x72, 0x7f,
+    0x8b, 0x61, 0x74, 0x62, 0x76, 0x62, 0xba, 0x70, 0x56, 0x72, 0x5d, 0x9e,
+    0x66, 0x6d, 0x5f, 0x7c, 0x77, 0x79, 0x94, 0x5b, 0x9a, 0x6c, 0x85, 0x7f,
+    0x67, 0x52, 0x5e, 0xb1, 0x7b, 0x6f, 0x65, 0x7b, 0x75, 0x75, 0x7a, 0x5b,
+    0x64, 0x86, 0x79, 0x46, 0x72, 0x69, 0x61, 0x85, 0x97, 0x7e, 0x95, 0x75,
+    0x7a, 0x74, 0x7e, 0x52, 0xce, 0x94, 0x8c, 0x7a, 0x7f, 0x6b, 0x71, 0x56,
+    0x6e, 0x87, 0x6a, 0x98, 0x76, 0x5d, 0x9c, 0x90, 0x91, 0x71, 0x5d, 0xa6,
+    0x77, 0x73, 0x76, 0x7a, 0x72, 0x78, 0x6c, 0x77, 0x70, 0x77, 0x75, 0x75,
+    0x77, 0x73, 0x70, 0x78, 0x6f, 0x71, 0x71, 0x76, 0x79, 0x70, 0x6c, 0x76,
+    0x78, 0x78, 0x75, 0x75, 0x72, 0x79, 0x70, 0x76, 0x75, 0x73, 0x70, 0x72,
+    0x7b, 0x6f, 0x74, 0x77, 0x81, 0x6e, 0x76, 0x6c, 0x7c, 0x73, 0x6c, 0x74,
+    0x70, 0x70, 0x75, 0x75, 0x6e, 0x73, 0x7a, 0x78, 0x77, 0x7d, 0x72, 0x73,
+    0x75, 0x57, 0xa7, 0x7c, 0x9c, 0xaa, 0x83, 0x5f, 0x87, 0x7a, 0x90, 0x78,
+    0x71, 0x52, 0x84, 0x7a, 0x58, 0x89, 0x65, 0x6e, 0x6d, 0x52, 0x8f, 0x53,
+    0x5b, 0x67, 0x80, 0x6a, 0x8c, 0x9c, 0x73, 0x9b, 0x94, 0x8b, 0x7e, 0x56,
+    0x56, 0x71, 0x81, 0x74, 0xbd, 0x8f, 0x83, 0x5c, 0x83, 0x77, 0x84, 0x62,
+    0x77, 0x75, 0x70, 0x79, 0x85, 0x53, 0x89, 0x70, 0x54, 0xc8, 0x5c, 0x75,
+    0x71, 0x9b, 0x8b, 0x78, 0xb8, 0x76, 0xa9, 0x8e, 0x7f, 0xc3, 0x84, 0x67,
+    0x80, 0xa7, 0x7a, 0x58, 0x73, 0x7e, 0x83, 0x78, 0xa5, 0x87, 0xae, 0x72,
+    0xa7, 0x8d, 0x7f, 0x86, 0x70, 0x62, 0x76, 0x9d, 0x7e, 0x8b, 0x7f, 0x7c,
+    0x63, 0x5e, 0x8b, 0x84, 0xd6, 0x81, 0x54, 0x8d, 0x71, 0x81, 0x73, 0x83,
+    0x70, 0x4f, 0x75, 0x73, 0x82, 0x58, 0x90, 0x70, 0x5f, 0x87, 0x72, 0x52,
+    0x5a, 0x68, 0x7a, 0x77, 0x8e, 0x84, 0x75, 0x73, 0x88, 0x81, 0x7f, 0x70,
+    0x74, 0xac, 0x82, 0x6c, 0x6d, 0x86, 0x55, 0x7c, 0x76, 0x62, 0xb6, 0x5d,
+    0x91, 0x6e, 0x6f, 0x6b, 0x7b, 0x5f, 0x6d, 0x8e, 0x7a, 0x7f, 0x66, 0x66,
+    0x8d, 0x90, 0x8e, 0x7c, 0xce, 0x81, 0x7d, 0x6c, 0x63, 0x73, 0x85, 0x8a,
+    0x79, 0x90, 0x82, 0x7c, 0x86, 0x61, 0xa8, 0x70, 0x54, 0xdc, 0x80, 0x87,
+    0x7a, 0x76, 0x5e, 0x70, 0x9a, 0x8a, 0x72, 0x62, 0x77, 0x7c, 0x86, 0x7a,
+    0x61, 0x5b, 0x60, 0x72, 0x80, 0x66, 0x7f, 0x69, 0x4f, 0x81, 0xb9, 0x4e,
+    0x80, 0x80, 0x71, 0x74, 0x8e, 0x5b, 0x60, 0x8b, 0x8c, 0x71, 0x56, 0x73,
+    0x78, 0x62, 0x96, 0x84, 0xcc, 0xae, 0x89, 0x85, 0x71, 0x85, 0x68, 0x72,
+    0x81, 0x5a, 0x7c, 0x7c, 0x7e, 0x5d, 0x99, 0x97, 0x7c, 0xe9, 0x6f, 0x75,
+    0x76, 0x70, 0x7e, 0x7a, 0x6e, 0x6a, 0x73, 0x73, 0x63, 0x6b, 0x76, 0x73,
+    0x7a, 0x69, 0x77, 0x78, 0x71, 0x70, 0x71, 0x71, 0x6b, 0x78, 0x6b, 0x77,
+    0x77, 0x76, 0x6c, 0x6d, 0x74, 0x78, 0x72, 0x6b, 0x67, 0x63, 0x75, 0x77,
+    0x78, 0x89, 0x74, 0x70, 0x86, 0x74, 0x75, 0x6f, 0x4c, 0x71, 0x5b, 0x57,
+    0x7b, 0x74, 0x73, 0x74, 0x74, 0x74, 0x6d, 0x71, 0x7a, 0x7b, 0x60, 0x72,
+    0x6d, 0x77, 0x2b, 0x72, 0x77, 0x71, 0x65, 0x75, 0x7a, 0x73, 0x78, 0x71,
+    0x5c, 0x7e, 0x77, 0x67, 0x7e, 0x7b, 0x74, 0x72, 0x77, 0x7f, 0x81, 0x71,
+    0x67, 0x74, 0x72, 0x72, 0x6c, 0x75, 0x78, 0x81, 0x79, 0x6b, 0x62, 0x6e,
+    0x64, 0x57, 0x66, 0x71, 0x88, 0x7f, 0x72, 0x72, 0x5b, 0x6f, 0x51, 0x81,
+    0x6f, 0x70, 0x77, 0x75, 0x74, 0x6f, 0x57, 0x7c, 0x67, 0x75, 0x70, 0x77,
+    0x72, 0x75, 0x75, 0x7c, 0x77, 0x77, 0x6a, 0x6e, 0x6c, 0x73, 0x73, 0x73,
+    0x72, 0x73, 0x74, 0x76, 0x4b, 0x74, 0x75, 0x72, 0x72, 0x77, 0x6e, 0x74,
+    0x72, 0x7c, 0x77, 0x72, 0x6d, 0x77, 0x72, 0x73, 0x74, 0x75, 0x72, 0x72,
+    0x7d, 0x6c, 0x72, 0x72, 0x81, 0x72, 0x72, 0x64, 0x76, 0x75, 0x60, 0x73,
+    0x78, 0x71, 0x77, 0x77, 0x78, 0x74, 0x76, 0x72, 0x77, 0x76, 0x76, 0x74,
+    0x7b, 0x7b, 0xa9, 0x81, 0x85, 0x7f, 0x61, 0x8d, 0x8e, 0x9b, 0x9c, 0x58,
+    0x8e, 0xa9, 0x67, 0x7d, 0x78, 0x77, 0x8b, 0x7a, 0x77, 0x94, 0xbd, 0x8c,
+    0x97, 0x6c, 0x6a, 0x77, 0x71, 0x5b, 0x77, 0x96, 0x61, 0x9a, 0x6b, 0x9b,
+    0x8e, 0xa3, 0x7b, 0x7a, 0xcf, 0x81, 0x76, 0x47, 0x70, 0x76, 0x7f, 0x9b,
+    0x64, 0xa3, 0x7c, 0x7f, 0x7f, 0x61, 0x89, 0x72, 0x62, 0x70, 0x77, 0x6e,
+    0x5b, 0x81, 0x3b, 0x86, 0x6c, 0x7f, 0x81, 0x76, 0x74, 0x60, 0x80, 0x72,
+    0x5a, 0x7c, 0x7e, 0x73, 0x6b, 0x79, 0x80, 0x77, 0x6e, 0x6c, 0x7a, 0x77,
+    0x79, 0x75, 0x7c, 0x7d, 0x6b, 0x72, 0x66, 0x81, 0x66, 0x4c, 0x6c, 0x92,
+    0x88, 0x33, 0x6e, 0x83, 0x77, 0x77, 0x78, 0x6f, 0x65, 0x7a, 0x61, 0x7a,
+    0x71, 0x74, 0x70, 0x7c, 0x70, 0x7e, 0x66, 0x76, 0x66, 0x82, 0x74, 0x74,
+    0x75, 0x71, 0x6e, 0x73, 0x71, 0x74, 0x75, 0x6f, 0x78, 0x6f, 0x6d, 0x70,
+    0x63, 0x74, 0x74, 0x72, 0x75, 0x70, 0x73, 0x70, 0x73, 0x73, 0x77, 0x66,
+    0x76, 0x76, 0x70, 0x67, 0x75, 0x6f, 0x75, 0x70, 0x70, 0x6d, 0x75, 0x77,
+    0x75, 0x70, 0x78, 0x70, 0x75, 0x70, 0x70, 0x6a, 0x76, 0x76, 0x76, 0x68,
+    0x76, 0x76, 0x74, 0x77, 0x72, 0x6d, 0x67, 0x72, 0x78, 0x76, 0x69, 0x73,
+    0x6b, 0x76, 0x6c, 0x75, 0x6d, 0x76, 0x74, 0x72, 0x66, 0x6e, 0x72, 0x6b,
+    0x74, 0x79, 0x72, 0x76, 0x6f, 0x7b, 0x76, 0x7e, 0x74, 0x6c, 0x6d, 0x75,
+    0x75, 0x7b, 0x73, 0x62, 0x72, 0x71, 0x74, 0x78, 0x7a, 0x77, 0x72, 0x78,
+    0x71, 0x70, 0x68, 0x6e, 0x7a, 0x74, 0x6d, 0x77, 0x6f, 0x6c, 0x70, 0x79,
+    0x6c, 0x81, 0x71, 0x6d, 0x75, 0x6b, 0x72, 0x78, 0x53, 0x76, 0x79, 0x76,
+    0x57, 0x88, 0x8f, 0x7b, 0x9b, 0x89, 0x98, 0x67, 0x94, 0x86, 0x85, 0x79,
+    0x9f, 0x72, 0x78, 0x8c, 0x85, 0x71, 0x6d, 0x79, 0x67, 0x7f, 0x8b, 0x65,
+    0xbb, 0x9d, 0x76, 0x7e, 0x7b, 0x58, 0x83, 0xa1, 0xa0, 0x6f, 0x97, 0x81,
+    0x83, 0x75, 0x99, 0x71, 0xcf, 0x89, 0x8c, 0x82, 0x71, 0x7d, 0x84, 0x77,
+    0x6b, 0x62, 0x83, 0x7d, 0x82, 0x73, 0x98, 0x7f, 0x68, 0x7a, 0x93, 0x68,
+    0x6f, 0x76, 0x77, 0x7d, 0x78, 0x65, 0x77, 0x6e, 0x71, 0x82, 0x7d, 0x73,
+    0x80, 0x88, 0x77, 0x93, 0x7a, 0x6a, 0x6d, 0x69, 0x6c, 0x8d, 0x78, 0x71,
+    0x72, 0x79, 0x7a, 0x84, 0x76, 0x6d, 0x7a, 0x6a, 0x70, 0x78, 0x90, 0x6e,
+    0x46, 0x71, 0x71, 0x6c, 0xa0, 0x72, 0x7c, 0x7e, 0x84, 0x68, 0x8d, 0x6a,
+    0x79, 0x5c, 0x75, 0x7a, 0x84, 0x50, 0x7b, 0x67, 0x5a, 0x80, 0x7c, 0x7c,
+    0x74, 0x74, 0x83, 0x81, 0x7a, 0x78, 0x71, 0x7a, 0x71, 0x6a, 0x6e, 0x74,
+    0x7a, 0x64, 0x6f, 0x70, 0x77, 0x75, 0x70, 0x72, 0x6a, 0x74, 0x81, 0x7f,
+    0x52, 0x6c, 0x79, 0x6a, 0x6f, 0x77, 0x6f, 0x71, 0x72, 0x79, 0x81, 0x72,
+    0x6e, 0x78, 0x7a, 0x75, 0x75, 0x71, 0x79, 0x78, 0x80, 0x72, 0x66, 0x81,
+    0x72, 0x66, 0x78, 0x6c, 0x70, 0x76, 0x65, 0x7b, 0x70, 0x73, 0x7c, 0x7f,
+    0x65, 0x6d, 0x60, 0x7d, 0x94, 0x6d, 0x79, 0x70, 0x93, 0x84, 0x8f, 0x86,
+    0xac, 0x76, 0x59, 0x65, 0x90, 0x9a, 0x94, 0x80, 0x79, 0x6d, 0xc4, 0x87,
+    0x76, 0x60, 0x68, 0x75, 0x83, 0x9f, 0x5b, 0xa8, 0x84, 0x86, 0x94, 0xa4,
+    0x9c, 0x92, 0x79, 0x74, 0xd1, 0x93, 0x81, 0x71, 0x60, 0x75, 0xb8, 0x6f,
+    0x89, 0x6c, 0x7f, 0x80, 0x82, 0x62, 0x90, 0x88, 0x80, 0x7f, 0x81, 0x6a,
+    0x7b, 0x5c, 0x62, 0x71, 0x78, 0x96, 0x6b, 0x77, 0x89, 0x9b, 0x85, 0x6c,
+    0x84, 0x7c, 0x80, 0x6f, 0x5f, 0x6b, 0x7e, 0x7a, 0x84, 0x9d, 0xa4, 0x6c,
+    0x6f, 0x65, 0x76, 0x77, 0x88, 0x52, 0x72, 0x98, 0x9a, 0x89, 0x7f, 0x6b,
+    0x89, 0x86, 0x74, 0x65, 0x98, 0x7f, 0x8a, 0x66, 0x80, 0x7c, 0xa8, 0x8c,
+    0x75, 0x7b, 0x7e, 0x62, 0xa1, 0x50, 0x7a, 0x80, 0x6f, 0xd1, 0x7e, 0x79,
+    0x7f, 0x83, 0x6b, 0x8a, 0x7e, 0x76, 0x75, 0x7a, 0x76, 0x80, 0x63, 0x74,
+    0x66, 0x70, 0x61, 0x71, 0x7e, 0x7a, 0x78, 0x75, 0x64, 0x70, 0x74, 0x74,
+    0x75, 0x76, 0x5a, 0x8d, 0x76, 0x67, 0x79, 0x76, 0x70, 0x7b, 0x7c, 0x6d,
+    0x6b, 0x6f, 0x78, 0x70, 0xa4, 0x81, 0x7a, 0x72, 0x50, 0x76, 0x39, 0x76,
+    0x73, 0x7c, 0x75, 0x6f, 0x6f, 0x6d, 0x6f, 0x81, 0x71, 0x87, 0x7b, 0x7c,
+    0x7c, 0x6c, 0x7d, 0x8c, 0x78, 0x73, 0x72, 0x77, 0x6e, 0x64, 0x74, 0x7e,
+    0x92, 0x9e, 0x8f, 0x7e, 0x87, 0x7c, 0x6f, 0x76, 0x6e, 0x7b, 0x90, 0x47,
+    0x7b, 0x5e, 0x8b, 0x93, 0x74, 0x76, 0x6d, 0x86, 0x7f, 0x81, 0x77, 0x6c,
+    0x56, 0x85, 0x89, 0x81, 0xb1, 0x4c, 0x70, 0x77, 0x9a, 0x7e, 0x8f, 0x7c,
+    0x65, 0x5c, 0x64, 0x8f, 0x7e, 0x48, 0x8b, 0x96, 0x6f, 0x9c, 0x82, 0x7c,
+    0x7a, 0x70, 0x77, 0x71, 0x86, 0x5a, 0x76, 0x6a, 0x8d, 0x87, 0x86, 0x79,
+    0x92, 0x7d, 0x73, 0x8d, 0x6b, 0x6b, 0x79, 0x82, 0x7c, 0x8a, 0x9b, 0x54,
+    0x8d, 0x86, 0x6f, 0x5f, 0x72, 0x60, 0x7a, 0x8f, 0x78, 0x74, 0x73, 0x77,
+    0x87, 0x8e, 0x9e, 0x84, 0xc8, 0x7a, 0x7b, 0x7b, 0x6e, 0x75, 0xc9, 0x7d,
+    0x78, 0x50, 0x76, 0x79, 0x80, 0x58, 0x82, 0x7a, 0x65, 0xd7, 0x68, 0x5c,
+    0x75, 0x65, 0x70, 0x72, 0x7b, 0x73, 0x87, 0x88, 0x65, 0x67, 0x6c, 0x5f,
+    0x71, 0x53, 0x74, 0x88, 0x76, 0x87, 0x27, 0x62, 0x64, 0x75, 0x66, 0x79,
+    0x63, 0x7b, 0x7d, 0x77, 0x7c, 0x74, 0x5e, 0x7b, 0x80, 0x69, 0x56, 0x55,
+    0x65, 0x65, 0x80, 0x75, 0x89, 0x6c, 0x6f, 0x73, 0x82, 0x61, 0x6f, 0x67,
+    0x70, 0x6c, 0x82, 0x6e, 0x83, 0x5d, 0x72, 0x77, 0x7a, 0x8b, 0x65, 0x81,
+    0x88, 0x91, 0x62, 0x82, 0x85, 0x59, 0x80, 0x6e, 0x7b, 0x67, 0x61, 0x7f,
+    0x56, 0x4e, 0x7c, 0x7e, 0x64, 0x6f, 0x48, 0x67, 0x5a, 0x73, 0x6d, 0x5b,
+    0x71, 0x91, 0x81, 0x97, 0x6a, 0x7e, 0x5d, 0x8c, 0xa0, 0x56, 0x5e, 0x86,
+    0x5a, 0x7e, 0x96, 0x48, 0x9d, 0x67, 0x85, 0x8e, 0xbc, 0x55, 0x79, 0x5a,
+    0x79, 0x54, 0x78, 0x94, 0x7d, 0x62, 0x5d, 0x8d, 0x6c, 0x94, 0x92, 0x8e,
+    0x6c, 0xa5, 0x81, 0x67, 0xa1, 0x9a, 0x5f, 0x63, 0x93, 0x89, 0x9a, 0x5f,
+    0x97, 0x74, 0x6f, 0x6d, 0x65, 0x6b, 0xb7, 0xab, 0xa3, 0x9a, 0x7e, 0x71,
+    0x94, 0x6b, 0x60, 0x6a, 0x6d, 0x6d, 0xac, 0x60, 0x71, 0x96, 0xb6, 0xa5,
+    0x91, 0x9b, 0x6e, 0xa4, 0x68, 0xa7, 0xaa, 0x6f, 0x71, 0xa2, 0x73, 0xa9,
+    0x6b, 0x9b, 0x5e, 0xa0, 0x6a, 0x93, 0x8f, 0x6f, 0x6b, 0x6d, 0xaf, 0x6f,
+    0x7a, 0x51, 0x71, 0x6a, 0x8e, 0x72, 0x66, 0x6f, 0x4e, 0x6b, 0x71, 0x77,
+    0x78, 0x65, 0x46, 0x7b, 0x6c, 0x6e, 0x72, 0x8c, 0x7b, 0x74, 0x89, 0x67,
+    0x68, 0x66, 0x5a, 0x46, 0x8e, 0x80, 0x7a, 0x71, 0x7f, 0x69, 0x71, 0x7a,
+    0x79, 0x6f, 0x7b, 0x65, 0x89, 0x7f, 0x6d, 0x59, 0x59, 0x6f, 0x76, 0x7f,
+    0x7c, 0x4a, 0x5e, 0x76, 0x7d, 0x75, 0x5e, 0x8d, 0x71, 0x81, 0x79, 0x6a,
+    0x76, 0x70, 0x62, 0x78, 0x77, 0x70, 0x74, 0x73, 0x74, 0x81, 0x40, 0x72,
+    0x77, 0x56, 0x7a, 0x7a, 0x75, 0x72, 0x74, 0x73, 0x75, 0x70, 0x61, 0x5d,
+    0x70, 0x72, 0x79, 0x7b, 0x70, 0x64, 0x75, 0x6e, 0x71, 0x87, 0x77, 0x70,
+    0x6d, 0x72, 0x74, 0x72, 0x84, 0x65, 0x71, 0x7c, 0x60, 0x72, 0x59, 0x6f,
+    0x6d, 0x7d, 0x73, 0x71, 0x74, 0x6c, 0x85, 0x76, 0x79, 0x76, 0x7d, 0x72,
+    0x7f, 0x91, 0x8a, 0x83, 0x82, 0x6a, 0x7e, 0x69, 0xac, 0x97, 0x89, 0x6c,
+    0x75, 0x67, 0x76, 0x5d, 0x59, 0x77, 0x6c, 0x67, 0x71, 0x6c, 0xa9, 0x6d,
+    0xa1, 0x8b, 0x8d, 0x7b, 0x61, 0x71, 0x72, 0x91, 0x86, 0x71, 0x56, 0x59,
+    0x9b, 0x80, 0x84, 0x6e, 0xce, 0x63, 0x7d, 0x80, 0x5a, 0x67, 0x73, 0x8f,
+    0x7d, 0x7a, 0x67, 0x6a, 0x92, 0x53, 0x6b, 0x7e, 0x8b, 0xca, 0x87, 0x84,
+    0x76, 0x87, 0x78, 0x7b, 0x8b, 0x67, 0x7e, 0x77, 0x98, 0x8d, 0x97, 0x76,
+    0x75, 0x5c, 0x8c, 0x87, 0x71, 0x75, 0x64, 0x85, 0x8b, 0x77, 0xa8, 0x6b,
+    0x6b, 0x67, 0x89, 0x51, 0x70, 0x7f, 0x78, 0x9c, 0x90, 0x65, 0x59, 0x6f,
+    0x59, 0x7c, 0x9a, 0x8e, 0xc1, 0x9b, 0x8d, 0x8e, 0xa3, 0x66, 0x68, 0x6e,
+    0x62, 0x45, 0x75, 0x62, 0x79, 0x55, 0x58, 0x7a, 0x5c, 0xd9, 0x44, 0x75,
+    0x9f, 0x48, 0x45, 0x91, 0x52, 0x34, 0x92, 0xa2, 0x55, 0x5b, 0x60, 0x9e,
+    0x64, 0x64, 0xa6, 0xa4, 0xa5, 0x89, 0x29, 0x17, 0x4f, 0x72, 0x7e, 0x62,
+    0x3b, 0x9d, 0xbb, 0x9d, 0x84, 0xac, 0x39, 0x8d, 0xa6, 0x3c, 0x35, 0x38,
+    0x30, 0x75, 0x95, 0x6d, 0x99, 0x17, 0x51, 0x93, 0xaa, 0x66, 0x48, 0x36,
+    0x8a, 0x59, 0x8b, 0x29, 0x7f, 0x47, 0x30, 0x72, 0x77, 0x9f, 0x45, 0xae,
+    0x61, 0x6f, 0xac, 0x80, 0x9e, 0x70, 0x4e, 0x5c, 0xa4, 0x7e, 0x88, 0x6d,
+    0x9a, 0xa2, 0x40, 0x99, 0x7e, 0x58, 0x8a, 0x65, 0x89, 0x7b, 0xc5, 0x6a,
+    0x84, 0x73, 0x53, 0x57, 0x6f, 0x57, 0x74, 0x7c, 0x8f, 0x8b, 0x83, 0x74,
+    0x87, 0xa9, 0x82, 0x78, 0xd0, 0x92, 0x80, 0x5b, 0x70, 0x75, 0x72, 0x7c,
+    0x7b, 0x5b, 0x7d, 0x8c, 0x81, 0x69, 0x91, 0x70, 0x75, 0x86, 0xa3, 0x88,
+    0x6e, 0x5e, 0x71, 0x84, 0x7b, 0x6a, 0x73, 0x6c, 0x6f, 0x78, 0x8c, 0x66,
+    0x81, 0x7d, 0x61, 0x6f, 0x71, 0x77, 0x74, 0x7a, 0x76, 0x7e, 0x78, 0x66,
+    0x82, 0x71, 0x6d, 0x68, 0x77, 0x6e, 0x7c, 0x7e, 0x6f, 0x6f, 0x7a, 0x75,
+    0x7f, 0x78, 0x6d, 0x76, 0x90, 0x79, 0x74, 0x6e, 0x2d, 0x82, 0x7b, 0x63,
+    0x6d, 0x6e, 0x6b, 0x71, 0x79, 0x57, 0x71, 0x78, 0x75, 0x7b, 0x6c, 0x70,
+    0x73, 0x74, 0x6f, 0x74, 0x72, 0x74, 0x73, 0x73, 0x79, 0x6f, 0x6f, 0x72,
+    0x6a, 0x73, 0x74, 0x74, 0x74, 0x6f, 0x73, 0x71, 0x74, 0x6f, 0x6d, 0x6e,
+    0x72, 0x6e, 0x73, 0x70, 0x74, 0x73, 0x73, 0x6f, 0x6e, 0x6e, 0x71, 0x73,
+    0x72, 0x74, 0x77, 0x6e, 0x78, 0x6f, 0x70, 0x73, 0x74, 0x74, 0x78, 0x6e,
+    0x73, 0x73, 0x73, 0x75, 0x72, 0x78, 0x6c, 0x72, 0x75, 0x70, 0x6f, 0x6f,
+    0x62, 0x71, 0x81, 0x7e, 0x7d, 0x8d, 0x9f, 0x85, 0x97, 0x94, 0x84, 0x8b,
+    0x87, 0x7e, 0x70, 0x6e, 0x8a, 0x7d, 0x9f, 0x73, 0x7b, 0x57, 0x97, 0x5a,
+    0x82, 0x8e, 0x62, 0x4f, 0x72, 0x5c, 0x73, 0x92, 0x86, 0x93, 0x87, 0x85,
+    0x77, 0x88, 0x8f, 0x89, 0xbe, 0x74, 0x77, 0x6a, 0x6f, 0x7f, 0x65, 0x6e,
+    0x6e, 0x6c, 0x89, 0x89, 0x94, 0x62, 0x83, 0x74, 0x57, 0xca, 0x95, 0x87,
+    0x6b, 0x97, 0x75, 0x76, 0x98, 0x95, 0x27, 0x49, 0x87, 0x6a, 0x8c, 0x34,
+    0x91, 0x8e, 0x5e, 0x6b, 0x73, 0x49, 0x7f, 0x8f, 0x95, 0x81, 0xa1, 0x95,
+    0x8b, 0x5d, 0x50, 0x72, 0x59, 0x5b, 0x93, 0x1e, 0x5e, 0x6f, 0x97, 0x81,
+    0x7b, 0x76, 0x58, 0x86, 0x75, 0x90, 0x9a, 0x6c, 0x75, 0x87, 0xa1, 0x68,
+    0x6f, 0x6e, 0x4f, 0x82, 0x50, 0x98, 0x72, 0x74, 0x2e, 0x59, 0x8e, 0x5f,
+    0x68, 0x6f, 0x74, 0x97, 0x76, 0x54, 0x84, 0x70, 0x75, 0x6d, 0x89, 0x7e,
+    0x8d, 0x76, 0x72, 0x71, 0x70, 0x84, 0x71, 0x67, 0x83, 0xa4, 0x86, 0x68,
+    0x9b, 0x7f, 0x6d, 0x7a, 0x7b, 0x54, 0x6a, 0x6e, 0x73, 0x6e, 0x78, 0x62,
+    0x76, 0x82, 0x85, 0x88, 0xaf, 0x80, 0x7e, 0x88, 0x93, 0x6f, 0x88, 0x6a,
+    0x64, 0x7c, 0x76, 0x6e, 0x8b, 0x61, 0x80, 0x84, 0x8a, 0x9c, 0x78, 0x74,
+    0x79, 0x6c, 0x85, 0x7c, 0x82, 0x86, 0x6a, 0x86, 0x77, 0x7d, 0x83, 0x88,
+    0x57, 0x48, 0x8b, 0x7a, 0x74, 0x7d, 0x69, 0x83, 0x8b, 0x77, 0xa2, 0x5a,
+    0x90, 0x83, 0x70, 0x7e, 0x79, 0x83, 0x7d, 0x88, 0xab, 0x55, 0x33, 0x7c,
+    0x9b, 0x89, 0x81, 0x76, 0xc2, 0x9c, 0x7c, 0x4e, 0x72, 0x75, 0x6f, 0x7f,
+    0x36, 0x5f, 0x71, 0x89, 0x9a, 0x57, 0x8b, 0x7d, 0x8a, 0xc1, 0x8e, 0x75,
+    0x6e, 0x7d, 0x78, 0x7e, 0x6d, 0x7a, 0x77, 0x74, 0x6b, 0x74, 0x6c, 0x76,
+    0x74, 0x70, 0x62, 0x78, 0x79, 0x73, 0x79, 0x6f, 0x70, 0x76, 0x7c, 0x54,
+    0x75, 0x7b, 0x6b, 0x6d, 0x72, 0x7b, 0x73, 0x78, 0x72, 0x77, 0x72, 0x78,
+    0x6e, 0x6f, 0x72, 0x72, 0x8b, 0x76, 0x74, 0x6f, 0x73, 0x73, 0x6f, 0x7d,
+    0x76, 0x72, 0x75, 0x75, 0x76, 0x74, 0x6b, 0x7b, 0x77, 0x75, 0x77, 0x78,
+    0x7c, 0x64, 0x85, 0x86, 0x93, 0x60, 0x83, 0x69, 0x6a, 0x6b, 0x83, 0x6e,
+    0x8d, 0x6b, 0x79, 0x84, 0x68, 0x7a, 0x7a, 0x85, 0x73, 0x7c, 0x8f, 0x81,
+    0x8e, 0x8c, 0x7a, 0x75, 0x8e, 0x85, 0x67, 0x7f, 0x8f, 0x7b, 0x7c, 0x9c,
+    0x8b, 0x93, 0x62, 0x86, 0xba, 0x83, 0x74, 0x7d, 0x95, 0x6a, 0x97, 0x70,
+    0x8b, 0x70, 0x62, 0x78, 0x7f, 0x5b, 0x6f, 0x90, 0x84, 0x99, 0x8d, 0x73,
+    0x6d, 0x64, 0x6e, 0x76, 0x6f, 0x6c, 0x88, 0x73, 0x62, 0x6a, 0x6b, 0x70,
+    0x73, 0x69, 0x77, 0x8a, 0x6d, 0x7e, 0x2e, 0x67, 0x58, 0x77, 0x6c, 0x74,
+    0x3b, 0x7f, 0x7b, 0x7c, 0x85, 0x78, 0x61, 0x6f, 0x85, 0x6d, 0x54, 0x82,
+    0x6a, 0x75, 0x6f, 0x66, 0x86, 0x6a, 0x5e, 0x7a, 0x83, 0x72, 0x69, 0x68,
+    0x69, 0x68, 0x7f, 0x72, 0x80, 0x66, 0x75, 0x72, 0x7b, 0x96, 0x5c, 0x80,
+    0x7a, 0x75, 0x71, 0x77, 0x77, 0x6b, 0x79, 0x72, 0x63, 0x72, 0x52, 0x70,
+    0x79, 0x75, 0x68, 0x78, 0x77, 0x78, 0x74, 0x73, 0x75, 0x74, 0x67, 0x5e,
+    0x75, 0x77, 0x6e, 0x78, 0x6b, 0x70, 0x71, 0x5c, 0x6e, 0x7c, 0x7c, 0x65,
+    0x70, 0x80, 0x77, 0x73, 0x80, 0x73, 0x71, 0x51, 0x67, 0x72, 0x64, 0x74,
+    0x7b, 0x6e, 0x70, 0x71, 0x73, 0x71, 0x76, 0x77, 0x7b, 0x7f, 0x7e, 0x78,
+    0x79, 0x67, 0x77, 0x80, 0x7a, 0x67, 0x76, 0x7b, 0x72, 0x71, 0x7c, 0x74,
+    0x68, 0x77, 0x7a, 0x79, 0x7a, 0x71, 0x78, 0x6f, 0x76, 0x7e, 0x79, 0x71,
+    0x7a, 0x67, 0x79, 0x69, 0x77, 0x71, 0x7a, 0x6f, 0x74, 0x6c, 0x73, 0x64,
+    0x75, 0x85, 0x6a, 0x6f, 0x92, 0x74, 0x70, 0x6b, 0x7f, 0x73, 0x82, 0x6c,
+    0x75, 0x71, 0x77, 0x77, 0x76, 0x35, 0x78, 0x79, 0x71, 0x66, 0x70, 0x74,
+    0x7a, 0x6e, 0x80, 0x78, 0x73, 0x73, 0x71, 0x78, 0x4c, 0x81, 0x51, 0x6f,
+    0x79, 0x6c, 0x7f, 0x7a, 0x73, 0x72, 0x70, 0x71, 0x71, 0x6e, 0x5b, 0x60,
+    0x76, 0x6a, 0x76, 0x7d, 0x78, 0x5b, 0x79, 0x67, 0x6f, 0x7d, 0x78, 0x6a,
+    0x75, 0x71, 0x73, 0x74, 0x84, 0x6d, 0x70, 0x71, 0x7f, 0x72, 0x4a, 0x6f,
+    0x71, 0x7b, 0x71, 0x70, 0x73, 0x6f, 0x82, 0x79, 0x77, 0x78, 0x78, 0x70,
+    0x97, 0x48, 0x6a, 0xa5, 0x4e, 0x49, 0x90, 0x72, 0x75, 0x6e, 0x51, 0x88,
+    0x66, 0x57, 0xbe, 0xae, 0x8e, 0x8a, 0x5d, 0x48, 0x5a, 0x3c, 0x6a, 0x6b,
+    0x57, 0x83, 0x70, 0x85, 0x94, 0x8e, 0x38, 0x99, 0x97, 0x5b, 0x5f, 0x4d,
+    0x68, 0x60, 0x89, 0x4c, 0x7b, 0x4f, 0x3d, 0x9b, 0xb5, 0x40, 0x89, 0x41,
+    0x93, 0x49, 0x63, 0x4a, 0x74, 0x57, 0x6b, 0xbf, 0xad, 0xf9, 0x59, 0xac,
+    0x66, 0x69, 0x78, 0x74, 0x7b, 0x75, 0x78, 0x85, 0x60, 0x6a, 0x69, 0x69,
+    0x6d, 0x6e, 0x74, 0x87, 0x6f, 0x74, 0x2f, 0x62, 0x59, 0x70, 0x6e, 0x7c,
+    0x6e, 0x7d, 0x78, 0x7b, 0x7b, 0x6a, 0x63, 0x81, 0x7d, 0x76, 0x5a, 0x76,
+    0x71, 0x68, 0x67, 0x76, 0x8e, 0x6d, 0x69, 0x78, 0x85, 0x70, 0x6e, 0x65,
+    0x6e, 0x70, 0x81, 0x71, 0x75, 0x67, 0x6d, 0x70, 0x7b, 0x80, 0x63, 0x88,
+    0x7c, 0x5c, 0x73, 0x75, 0x6b, 0x75, 0x79, 0x76, 0x74, 0x7c, 0x49, 0x73,
+    0x7d, 0x60, 0x61, 0x78, 0x70, 0x6e, 0x6d, 0x6f, 0x79, 0x73, 0x6d, 0x7f,
+    0x6c, 0x7a, 0x83, 0x64, 0x7b, 0x75, 0x75, 0x6f, 0x70, 0x8a, 0x6b, 0x71,
+    0x70, 0x79, 0x7c, 0x79, 0x82, 0x4a, 0x72, 0x80, 0xa1, 0x74, 0x81, 0x72,
+    0x70, 0x76, 0x72, 0x72, 0x71, 0x6f, 0x85, 0x74, 0x72, 0x7d, 0x7e, 0x6f,
+    0x7a, 0x7d, 0x6b, 0x7e, 0x71, 0x7c, 0x7a, 0x6e, 0x76, 0x7d, 0x78, 0x71,
+    0x69, 0x5e, 0x6c, 0x7c, 0x7d, 0x78, 0x75, 0x73, 0x69, 0x65, 0x72, 0x7c,
+    0x6d, 0x70, 0x77, 0x70, 0x76, 0x75, 0x76, 0x70, 0x77, 0x6f, 0x76, 0x76,
+    0x7c, 0x7f, 0x6a, 0x6d, 0x8c, 0x65, 0x76, 0x73, 0x4f, 0x74, 0x50, 0x74,
+    0x6d, 0x77, 0x72, 0x70, 0x71, 0x69, 0x6d, 0x79, 0x78, 0x7e, 0x7e, 0x74,
+    0x74, 0x63, 0x74, 0x75, 0x6e, 0x71, 0x7d, 0x79, 0x6e, 0x71, 0x70, 0x73,
+    0x74, 0x72, 0x76, 0x70, 0x63, 0x78, 0x67, 0x7a, 0x6d, 0x66, 0x6f, 0x73,
+    0x75, 0x71, 0x72, 0x73, 0x6e, 0x70, 0x6e, 0x6f, 0x74, 0x77, 0x6b, 0x6f,
+    0x72, 0x76, 0x77, 0x7a, 0x6e, 0x73, 0x74, 0x74, 0x71, 0x68, 0x73, 0x73,
+    0x6a, 0x77, 0x74, 0x73, 0x63, 0x70, 0x7d, 0x6d, 0x6e, 0x80, 0x6f, 0x78,
+    0x68, 0x6b, 0x9a, 0x87, 0xa3, 0x92, 0x83, 0x73, 0x81, 0x67, 0xa2, 0x9c,
+    0x86, 0xa3, 0x6a, 0x7f, 0x65, 0x6e, 0x55, 0x67, 0x6f, 0x81, 0x9e, 0x61,
+    0x8e, 0x73, 0x78, 0x62, 0x76, 0x4d, 0x6a, 0x9b, 0x7c, 0x86, 0x65, 0x7c,
+    0x67, 0xa8, 0x83, 0x7a, 0xd5, 0x78, 0x81, 0xa2, 0x72, 0x6a, 0xb5, 0xa1,
+    0x65, 0x6f, 0x82, 0x8b, 0x87, 0x67, 0x80, 0x94, 0x79, 0xe6, 0x99, 0x7e,
+    0x73, 0x6d, 0x62, 0x8a, 0x8c, 0x69, 0x7b, 0x5c, 0x79, 0x7d, 0xb1, 0x89,
+    0x6d, 0x80, 0x8f, 0x7f, 0xa8, 0x68, 0x58, 0x5d, 0x80, 0x5e, 0x80, 0xa9,
+    0xa1, 0x8e, 0x5f, 0x95, 0x74, 0x84, 0x64, 0x8e, 0x8c, 0x69, 0x61, 0x92,
+    0x9d, 0x5f, 0x95, 0x6e, 0xc4, 0x9f, 0x8b, 0x67, 0x6c, 0x77, 0x72, 0x81,
+    0x74, 0x71, 0x70, 0x8d, 0x60, 0x5c, 0x67, 0x7a, 0x4a, 0x7e, 0x7b, 0x98,
+    0x6a, 0x7e, 0x69, 0x76, 0x74, 0x70, 0x73, 0x6f, 0x64, 0x77, 0x7f, 0x60,
+    0x7c, 0x71, 0x63, 0x72, 0x71, 0x76, 0x75, 0x78, 0x7a, 0x78, 0x7f, 0x62,
+    0x7b, 0x74, 0x64, 0x66, 0x76, 0x6a, 0x7a, 0x7c, 0x76, 0x6b, 0x7b, 0x76,
+    0x80, 0x71, 0x70, 0x7b, 0x92, 0x72, 0x74, 0x6d, 0x62, 0x77, 0x74, 0x5d,
+    0x76, 0x73, 0x6b, 0x75, 0x78, 0x82, 0x71, 0x7a, 0x77, 0x86, 0x70, 0x76,
+    0x6a, 0x72, 0x82, 0x7a, 0x6d, 0x7f, 0x7b, 0x77, 0x78, 0x70, 0x83, 0x74,
+    0x77, 0x6e, 0x77, 0x7b, 0x68, 0x7a, 0x62, 0x71, 0x7e, 0x7e, 0x85, 0x78,
+    0x69, 0x66, 0x6f, 0x70, 0x76, 0x79, 0x75, 0x73, 0x73, 0x6e, 0x6c, 0x71,
+    0x7b, 0x7d, 0x7d, 0x6c, 0x82, 0x7c, 0x67, 0x81, 0x78, 0x70, 0x83, 0x71,
+    0x6a, 0x81, 0x75, 0x71, 0x6e, 0x72, 0x71, 0x79, 0x67, 0x75, 0x7f, 0x71,
+    0x67, 0x6b, 0x68, 0x82, 0x96, 0x6f, 0x85, 0x73, 0x82, 0x87, 0x74, 0x8f,
+    0x98, 0x45, 0x6b, 0x8e, 0x86, 0x90, 0x6e, 0x7d, 0x75, 0x8c, 0xa2, 0x96,
+    0x6c, 0x5d, 0x67, 0x8e, 0x76, 0x81, 0x83, 0x8d, 0x91, 0xa4, 0x43, 0x5d,
+    0x93, 0x70, 0x73, 0x7e, 0xb9, 0x87, 0x71, 0x5a, 0x96, 0x80, 0x65, 0x6e,
+    0x69, 0x79, 0x8f, 0x6c, 0x74, 0x5a, 0x7e, 0x6a, 0x5c, 0xd2, 0x78, 0x7d,
+    0x71, 0x78, 0x56, 0x75, 0x74, 0x77, 0x70, 0x75, 0x6d, 0x67, 0x75, 0x72,
+    0x76, 0x74, 0x6f, 0x72, 0x78, 0x77, 0x75, 0x6d, 0x73, 0x77, 0x70, 0x6c,
+    0x79, 0x70, 0x76, 0x72, 0x76, 0x77, 0x74, 0x6f, 0x74, 0x66, 0x6f, 0x76,
+    0x74, 0x67, 0x78, 0x79, 0x84, 0x71, 0x76, 0x74, 0x75, 0x76, 0x7c, 0x78,
+    0x68, 0x6f, 0x72, 0x77, 0x72, 0x7e, 0x68, 0x76, 0x73, 0x7c, 0x70, 0x76,
+    0x6a, 0x7a, 0x78, 0x76, 0x73, 0x7b, 0x7c, 0x74, 0x65, 0x78, 0x6a, 0x6d,
+    0x79, 0x58, 0x5f, 0x73, 0x74, 0x74, 0x7a, 0x76, 0x79, 0x77, 0x73, 0x6d,
+    0x7b, 0x75, 0x5e, 0x5f, 0x75, 0x6c, 0x77, 0x74, 0x74, 0x6f, 0x72, 0x7c,
+    0x6d, 0x77, 0x77, 0x7d, 0x8f, 0x6e, 0x75, 0x73, 0x70, 0x79, 0x6f, 0x61,
+    0x80, 0x72, 0x6c, 0x6e, 0x73, 0x7c, 0x68, 0x77, 0x77, 0x76, 0x77, 0x7a,
+    0x65, 0x71, 0x6f, 0x44, 0x70, 0x70, 0x6e, 0x6f, 0x6e, 0x72, 0x6b, 0x69,
+    0x72, 0x6d, 0x6e, 0x6e, 0x6e, 0x72, 0x6d, 0x6f, 0x71, 0x6a, 0x6e, 0x6e,
+    0x73, 0x6e, 0x6f, 0x6e, 0x71, 0x71, 0x6e, 0x70, 0x71, 0x73, 0x6b, 0x6f,
+    0x72, 0x70, 0x72, 0x6d, 0x28, 0x6f, 0x6b, 0x6f, 0x69, 0x70, 0x6b, 0x6f,
+    0x66, 0x72, 0x73, 0x70, 0x70, 0x6e, 0x71, 0x70, 0x72, 0x6e, 0x6b, 0x6f,
+    0x77, 0x77, 0x75, 0x7c, 0x78, 0x6f, 0x76, 0x73, 0x77, 0x78, 0x69, 0x76,
+    0x70, 0x74, 0x6d, 0x78, 0x68, 0x6e, 0x6f, 0x6e, 0x7b, 0x69, 0x7f, 0x7e,
+    0x70, 0x55, 0x6e, 0x78, 0x6f, 0x78, 0x76, 0x79, 0x75, 0x72, 0x79, 0x72,
+    0x6d, 0x82, 0x79, 0x73, 0x86, 0x6e, 0x71, 0x69, 0x7f, 0x73, 0x73, 0x7e,
+    0x6e, 0x79, 0x75, 0x70, 0x70, 0x71, 0x7a, 0x78, 0x66, 0x87, 0x6c, 0x7c,
+    0x5d, 0x4a, 0x74, 0x86, 0x82, 0x7b, 0x78, 0x74, 0x86, 0x94, 0x72, 0x9d,
+    0x7c, 0x72, 0x35, 0x96, 0x6d, 0x82, 0x6d, 0x85, 0x81, 0x7b, 0x7b, 0x78,
+    0x5f, 0x83, 0x67, 0x4e, 0x6c, 0x70, 0x74, 0x72, 0x70, 0x67, 0x6c, 0x96,
+    0x70, 0x8d, 0x8b, 0x86, 0xa6, 0x74, 0x7a, 0x90, 0x7f, 0x6c, 0x76, 0x79,
+    0x76, 0x6f, 0x6e, 0x82, 0x81, 0x7d, 0x72, 0x7b, 0x70, 0x8b, 0x8c, 0x8a,
+    0x6a, 0x6e, 0x91, 0x7c, 0x97, 0x9c, 0x67, 0x66, 0x8d, 0xa0, 0x9e, 0x73,
+    0x71, 0x7f, 0x4d, 0x6c, 0x6c, 0x65, 0xa4, 0x7a, 0x8d, 0x6d, 0xb4, 0x64,
+    0x7f, 0x8d, 0x62, 0x51, 0x73, 0x4e, 0x79, 0xaa, 0x68, 0x94, 0x63, 0x77,
+    0xad, 0x9f, 0x7b, 0x70, 0xcf, 0x90, 0x9a, 0x39, 0x7d, 0x7b, 0x75, 0x7f,
+    0x60, 0x8f, 0x71, 0x88, 0x7c, 0x5d, 0x99, 0x6d, 0x53, 0x76, 0x98, 0x53,
+    0x87, 0x7d, 0x70, 0x83, 0x9e, 0x58, 0x70, 0x6c, 0x6c, 0x7e, 0x70, 0x79,
+    0x6b, 0x98, 0x79, 0x7f, 0x97, 0x81, 0x89, 0x77, 0x7d, 0x73, 0x83, 0x76,
+    0x84, 0x71, 0x85, 0x82, 0x88, 0x73, 0x6e, 0x74, 0x7b, 0x67, 0x83, 0x86,
+    0x86, 0x81, 0x81, 0x6f, 0xa2, 0x86, 0x80, 0x8d, 0x78, 0x64, 0x8b, 0x55,
+    0x67, 0x56, 0x6c, 0x5f, 0x78, 0x6e, 0x77, 0x90, 0x5b, 0x9e, 0x70, 0x77,
+    0x77, 0x6e, 0x74, 0x7a, 0x73, 0x7a, 0x76, 0x6f, 0x75, 0x6f, 0x68, 0x74,
+    0x77, 0x83, 0x6f, 0x72, 0x77, 0x6f, 0x73, 0x73, 0x6c, 0x84, 0x50, 0x6f,
+    0x77, 0x73, 0x71, 0x70, 0x73, 0x76, 0x71, 0x74, 0x37, 0x6d, 0x77, 0x63,
+    0x79, 0x70, 0x72, 0x2d, 0x77, 0x70, 0x5b, 0x6e, 0x70, 0x77, 0x6f, 0x71,
+    0x71, 0x77, 0x6e, 0x7f, 0x77, 0x7b, 0x74, 0x55, 0x72, 0x74, 0x75, 0x77,
+    0x87, 0x57, 0xc8, 0x70, 0x7f, 0x5a, 0x75, 0x48, 0xa8, 0x68, 0x8d, 0xa5,
+    0x7e, 0x93, 0x77, 0x71, 0x7f, 0x5e, 0x6f, 0x6e, 0x64, 0x57, 0xa0, 0x79,
+    0x92, 0x89, 0x6d, 0x82, 0x6d, 0x93, 0x55, 0x80, 0x67, 0x88, 0x7f, 0x59,
+    0x6d, 0x91, 0xb4, 0x83, 0xb9, 0x6d, 0x85, 0x60, 0x60, 0x7c, 0x82, 0x62,
+    0x6c, 0x79, 0x83, 0x7e, 0x7c, 0x59, 0x58, 0x84, 0x7e, 0xda, 0x64, 0x94,
+    0x7b, 0x91, 0x88, 0x76, 0x80, 0x9c, 0x73, 0x60, 0x79, 0x69, 0x54, 0x77,
+    0x90, 0x67, 0x89, 0x97, 0x5d, 0x72, 0x7e, 0x7b, 0x8a, 0x7f, 0x96, 0x65,
+    0x81, 0x83, 0x7a, 0x82, 0x6f, 0x4e, 0x80, 0x9d, 0x74, 0x98, 0x5d, 0x77,
+    0x9f, 0x86, 0x82, 0x7b, 0xbd, 0x7c, 0x64, 0x6c, 0x63, 0x90, 0x64, 0x77,
+    0x6a, 0x44, 0x76, 0x82, 0x83, 0x65, 0x85, 0x75, 0x5c, 0xd8, 0x8a, 0x79,
+    0x4e, 0x79, 0xba, 0x75, 0x74, 0x7b, 0x83, 0x6a, 0x7e, 0x8c, 0x68, 0x7f,
+    0xaa, 0x93, 0x68, 0x8a, 0x81, 0x81, 0x47, 0x77, 0x7c, 0x7c, 0xb3, 0x6f,
+    0x7a, 0x88, 0x72, 0x6a, 0x86, 0x80, 0x7b, 0xa5, 0x92, 0x87, 0xae, 0x7d,
+    0x98, 0xa6, 0x72, 0x83, 0xcb, 0xb3, 0x68, 0x85, 0x72, 0x84, 0x89, 0x5b,
+    0x68, 0x6a, 0x75, 0x80, 0x91, 0x51, 0x8e, 0x7b, 0x7b, 0xd8, 0x9e, 0x92,
+    0x7e, 0xa2, 0xa7, 0x5c, 0x91, 0x89, 0x1f, 0x64, 0xa7, 0x9e, 0xb2, 0x33,
+    0xa0, 0xa5, 0x79, 0x3d, 0x27, 0x54, 0xb0, 0x96, 0x86, 0x83, 0xab, 0x9b,
+    0x85, 0x12, 0x5e, 0x38, 0x44, 0x7c, 0x8f, 0x15, 0x3b, 0xa4, 0xb4, 0xa4,
+    0x86, 0x9e, 0x3d, 0xb8, 0x75, 0x7f, 0x98, 0x25, 0x53, 0x6c, 0xc1, 0x94,
+    0x2a, 0x7f, 0x49, 0x81, 0x25, 0x8f, 0x8e, 0x66, 0x33, 0x32, 0xa3, 0x2f,
+    0x88, 0x68, 0x6c, 0x7d, 0x7e, 0x57, 0x99, 0x62, 0x85, 0x71, 0x98, 0x7d,
+    0x66, 0x77, 0x86, 0x6c, 0x7e, 0x69, 0x58, 0x6f, 0x4d, 0x7c, 0xba, 0x70,
+    0x8d, 0x9c, 0x67, 0x5a, 0x6e, 0x48, 0x7b, 0x8b, 0x92, 0xa6, 0x86, 0x56,
+    0x68, 0x8a, 0x83, 0x86, 0xd2, 0x9c, 0x90, 0x85, 0x91, 0x7e, 0x70, 0x8e,
+    0x88, 0x80, 0x84, 0xa0, 0x7f, 0x5b, 0x91, 0x71, 0x6f, 0x84, 0x8c, 0x8e,
+    0x62, 0x7d, 0x79, 0x78, 0x75, 0x73, 0x63, 0x5c, 0x7a, 0x96, 0x88, 0x92,
+    0x6a, 0x9b, 0x46, 0x6a, 0x8f, 0x77, 0x93, 0x6c, 0x72, 0x73, 0x8b, 0x74,
+    0x74, 0x79, 0x63, 0x59, 0x77, 0x7d, 0x7c, 0x8e, 0x72, 0x6c, 0x8b, 0x68,
+    0xa2, 0xa2, 0x7b, 0x87, 0xd0, 0x7c, 0x91, 0x91, 0x77, 0x79, 0x6a, 0x6f,
+    0x69, 0x91, 0x74, 0x9a, 0x70, 0x66, 0x70, 0x9b, 0x5b, 0x79, 0xa7, 0x97,
+    0x79, 0x54, 0x5f, 0x96, 0x6f, 0x8a, 0x84, 0x72, 0x77, 0x7f, 0xa8, 0x50,
+    0x83, 0x9a, 0x57, 0x88, 0x78, 0x89, 0x5a, 0x84, 0x74, 0x83, 0xa0, 0x76,
+    0x6b, 0x78, 0x5c, 0x81, 0x6f, 0x58, 0x55, 0x6f, 0x66, 0x71, 0x6d, 0x81,
+    0x8f, 0x7d, 0x56, 0x84, 0x98, 0x76, 0x7d, 0x33, 0x34, 0x62, 0x72, 0x65,
+    0x56, 0x78, 0x6a, 0x6c, 0x61, 0x5c, 0x7a, 0x4f, 0x76, 0x5f, 0x82, 0x4d,
+    0x6e, 0x77, 0x48, 0x77, 0x76, 0x7e, 0x71, 0x71, 0x6f, 0x5e, 0x71, 0x71,
+    0x79, 0x75, 0x6c, 0x73, 0x77, 0x77, 0x74, 0x6f, 0x71, 0x76, 0x70, 0x72,
+    0x79, 0x6c, 0x71, 0x6c, 0x76, 0x71, 0x73, 0x6f, 0x74, 0x59, 0x6e, 0x76,
+    0x76, 0x5e, 0x73, 0x75, 0x82, 0x72, 0x77, 0x69, 0x68, 0x76, 0x65, 0x74,
+    0x69, 0x67, 0x75, 0x78, 0x72, 0x7a, 0x40, 0x74, 0x72, 0x7d, 0x7b, 0x77,
+    0x73, 0x7a, 0x77, 0x86, 0x5f, 0x78, 0x73, 0x70, 0x74, 0x80, 0x86, 0x77,
+    0x7b, 0x7e, 0x81, 0x89, 0x75, 0x80, 0x6d, 0x73, 0x78, 0x68, 0x7d, 0x7f,
+    0x79, 0x63, 0x88, 0x70, 0x6b, 0x5a, 0x73, 0x6f, 0x7a, 0x7d, 0x89, 0x7b,
+    0x6f, 0x66, 0x71, 0x78, 0x85, 0x81, 0x79, 0x69, 0x77, 0x7d, 0x73, 0x7f,
+    0x6a, 0x92, 0x75, 0x89, 0x6d, 0x68, 0x74, 0x69, 0x79, 0x80, 0x6b, 0x8d,
+    0x51, 0x7a, 0x7b, 0x77, 0x8e, 0x9a, 0x70, 0x69, 0x6c, 0x7e, 0x80, 0x62,
+    0x87, 0x5a, 0x4b, 0x85, 0x4c, 0x7d, 0x80, 0x90, 0x7e, 0x73, 0xa9, 0x5c,
+    0x93, 0x8b, 0x6e, 0x49, 0x75, 0x4a, 0x78, 0xae, 0x7e, 0x85, 0x8c, 0x68,
+    0x86, 0x72, 0x6f, 0x80, 0xcc, 0x83, 0x83, 0x65, 0x90, 0x96, 0x6d, 0x83,
+    0x83, 0x55, 0x6d, 0x9e, 0x80, 0x5b, 0x85, 0x7d, 0x5f, 0x8b, 0x8e, 0x5d,
+    0x5f, 0x7f, 0x99, 0x73, 0x7e, 0x6f, 0x74, 0x66, 0x8f, 0xa1, 0x84, 0x59,
+    0x9b, 0x5d, 0x6c, 0x74, 0x67, 0x7b, 0x92, 0x76, 0x76, 0x6a, 0xa4, 0x50,
+    0xa2, 0x8b, 0x82, 0x39, 0x71, 0x68, 0x82, 0x8e, 0x76, 0x72, 0x69, 0x5c,
+    0x8a, 0x79, 0x81, 0x91, 0xd4, 0x8b, 0x7b, 0x89, 0x71, 0x7b, 0x7d, 0x79,
+    0x6a, 0x4c, 0x7d, 0x77, 0x73, 0x56, 0x8b, 0x7f, 0x5b, 0xbf, 0x92, 0x85,
+    0x75, 0x74, 0x7e, 0x80, 0x77, 0x7a, 0x70, 0x73, 0x6a, 0x6c, 0x6e, 0x72,
+    0x72, 0x70, 0x5f, 0x76, 0x78, 0x75, 0x7c, 0x6f, 0x6b, 0x6a, 0x77, 0x61,
+    0x6c, 0x74, 0x7a, 0x76, 0x74, 0x72, 0x6f, 0x71, 0x70, 0x76, 0x5f, 0x6f,
+    0x5d, 0x72, 0x75, 0x73, 0x78, 0x75, 0x7b, 0x6d, 0x80, 0x73, 0x50, 0x80,
+    0x71, 0x73, 0x78, 0x73, 0x6c, 0x6e, 0x53, 0x78, 0x6b, 0x7c, 0x7d, 0x7a,
+    0x75, 0x5f, 0x43, 0x84, 0x7f, 0x64, 0x8a, 0x75, 0x52, 0x89, 0x66, 0x72,
+    0x78, 0x6a, 0x94, 0x6f, 0x7b, 0x51, 0x70, 0x64, 0x8e, 0x75, 0x5f, 0x67,
+    0x82, 0x8b, 0x5d, 0x7b, 0x84, 0x6a, 0x72, 0x83, 0x81, 0x77, 0xa5, 0x87,
+    0x4b, 0x88, 0x7b, 0x5f, 0x94, 0x76, 0x6f, 0x98, 0x8f, 0x7b, 0x8c, 0x64,
+    0x76, 0x82, 0x70, 0x5a, 0x71, 0x53, 0x84, 0x80, 0x74, 0x96, 0x6d, 0x7c,
+    0x7c, 0x71, 0x83, 0x78, 0x70, 0x73, 0x78, 0x74, 0x66, 0x6c, 0x44, 0x70,
+    0x79, 0x62, 0x66, 0x78, 0x75, 0x72, 0x72, 0x75, 0x72, 0x70, 0x63, 0x72,
+    0x7a, 0x76, 0x69, 0x7e, 0x74, 0x6e, 0x72, 0x6a, 0x70, 0x83, 0x78, 0x6e,
+    0x78, 0x78, 0x73, 0x71, 0x7f, 0x7d, 0x6f, 0x77, 0x74, 0x73, 0x37, 0x71,
+    0x77, 0x70, 0x6f, 0x6c, 0x74, 0x71, 0x74, 0x77, 0x78, 0x76, 0x7f, 0x71,
+    0x6e, 0x6d, 0x66, 0x61, 0x70, 0x71, 0x6f, 0x7e, 0x71, 0x67, 0x6e, 0x71,
+    0x65, 0x6e, 0x71, 0x7f, 0x81, 0x6a, 0x65, 0x63, 0x69, 0x5a, 0x62, 0x72,
+    0x6b, 0x6f, 0x67, 0x69, 0x69, 0x6e, 0x6f, 0x6b, 0x69, 0x73, 0x64, 0x6a,
+    0x66, 0x7a, 0x77, 0x6f, 0x57, 0x6a, 0x73, 0x67, 0x63, 0x70, 0x5f, 0x6d,
+    0x69, 0x69, 0x78, 0x7a, 0x4e, 0x75, 0x6d, 0x69, 0x71, 0x6b, 0x69, 0x57,
+    0x6b, 0x68, 0x64, 0x75, 0x7c, 0x62, 0x93, 0x8d, 0x52, 0x73, 0x67, 0x62,
+    0x66, 0x68, 0x77, 0x8f, 0x82, 0x8c, 0x46, 0x59, 0x59, 0x70, 0x5f, 0x78,
+    0x47, 0x8b, 0x78, 0x83, 0x91, 0x80, 0x55, 0x7b, 0x85, 0x67, 0x58, 0x7a,
+    0x64, 0x6c, 0x6b, 0x6f, 0x88, 0x72, 0x6b, 0x7c, 0x88, 0x72, 0x6c, 0x65,
+    0x71, 0x6b, 0x84, 0x6c, 0x80, 0x69, 0x6a, 0x7d, 0x7b, 0x8f, 0x69, 0x8e,
+    0x54, 0x6b, 0x70, 0x7b, 0x72, 0x89, 0x90, 0x60, 0x6f, 0x8d, 0x79, 0x80,
+    0x88, 0x60, 0x4b, 0x6a, 0x6d, 0x7d, 0x96, 0x7a, 0x73, 0x73, 0x7e, 0x7c,
+    0x78, 0x6d, 0x7f, 0x5a, 0x6e, 0x84, 0x5d, 0x9e, 0x5a, 0x7a, 0x73, 0x98,
+    0x8c, 0x5b, 0x69, 0x87, 0x94, 0x6e, 0x7f, 0x6b, 0x83, 0x85, 0x7f, 0x59,
+    0x7d, 0x79, 0x72, 0x68, 0x7d, 0x9b, 0x8a, 0x72, 0x57, 0x90, 0x8c, 0x71,
+    0x7a, 0x70, 0x88, 0x76, 0x7b, 0x76, 0x73, 0x78, 0x78, 0x74, 0x7b, 0x7d,
+    0x72, 0x6d, 0x73, 0x75, 0x75, 0x75, 0x7b, 0x6e, 0x67, 0x69, 0x81, 0x77,
+    0x6b, 0x7a, 0x73, 0x7a, 0x71, 0x7b, 0x6a, 0x6c, 0x70, 0x78, 0x7a, 0x71,
+    0x6f, 0x7e, 0x7b, 0x74, 0x7f, 0x69, 0x77, 0x7a, 0x7d, 0x69, 0x6d, 0x7a,
+    0x70, 0x76, 0x7c, 0x6f, 0x71, 0x65, 0x83, 0x73, 0x6e, 0x6d, 0x7f, 0x72,
+    0x84, 0x85, 0x8a, 0x84, 0x94, 0x6a, 0x70, 0x6f, 0x77, 0x93, 0x85, 0x7b,
+    0x84, 0x6b, 0x87, 0x7f, 0x68, 0x85, 0x86, 0x76, 0x70, 0x77, 0x93, 0x7a,
+    0x95, 0x82, 0x68, 0x68, 0x84, 0x78, 0x74, 0x95, 0xa4, 0x7b, 0x6f, 0x52,
+    0x91, 0x95, 0x8d, 0x83, 0xc7, 0x78, 0x70, 0x72, 0x8a, 0x6d, 0x76, 0x50,
+    0x7d, 0x62, 0x6f, 0x79, 0x89, 0x6c, 0x9e, 0x6f, 0x72, 0x7f, 0xa8, 0x61,
+    0x74, 0x6e, 0x63, 0x7e, 0x7f, 0x5d, 0x73, 0x71, 0x78, 0x7b, 0x89, 0x46,
+    0x70, 0x71, 0x6d, 0x70, 0x5a, 0x73, 0x67, 0x83, 0x79, 0x92, 0x87, 0x76,
+    0x7c, 0x6f, 0x6b, 0x66, 0x82, 0x82, 0x6b, 0x79, 0x65, 0x73, 0x7b, 0x84,
+    0x7f, 0x85, 0x66, 0x63, 0xa1, 0x80, 0x67, 0x6e, 0x22, 0x81, 0x82, 0x77,
+    0x74, 0x67, 0x69, 0x87, 0x70, 0x66, 0x7c, 0x77, 0x7c, 0x73, 0x7a, 0x6b,
+    0x6c, 0x73, 0x74, 0x6e, 0x6c, 0x67, 0x78, 0x73, 0x6e, 0x76, 0x71, 0x6d,
+    0x68, 0x6d, 0x6d, 0x71, 0x68, 0x7b, 0x6c, 0x71, 0x79, 0x6a, 0x7b, 0x76,
+    0x72, 0x7a, 0x74, 0x75, 0x72, 0x6d, 0x71, 0x7c, 0x7b, 0x76, 0x6d, 0x7e,
+    0x6d, 0x7a, 0x5d, 0x75, 0x77, 0x6e, 0x79, 0x7b, 0x75, 0x6a, 0x77, 0x71,
+    0x75, 0x6b, 0x76, 0x68, 0x67, 0x68, 0x6d, 0x80, 0x74, 0x69, 0x75, 0x63,
+    0x5f, 0x82, 0x84, 0x78, 0x90, 0x71, 0x7a, 0x70, 0x85, 0x85, 0x65, 0x6c,
+    0x87, 0x7d, 0x78, 0x75, 0x65, 0x67, 0x65, 0x8e, 0x7c, 0x7e, 0x93, 0x6a,
+    0x87, 0x7d, 0x68, 0x3a, 0x75, 0x4d, 0x85, 0x8e, 0x4b, 0x78, 0x7c, 0x87,
+    0x82, 0x89, 0x7b, 0x6b, 0xc0, 0x7f, 0x7b, 0x7e, 0x64, 0x72, 0x69, 0x80,
+    0x70, 0x8a, 0x7e, 0x72, 0x8c, 0x50, 0x79, 0x7a, 0x7e, 0xcd, 0x69, 0x69,
+    0x62, 0x7e, 0x82, 0x7b, 0x7f, 0x66, 0x4e, 0x7d, 0x79, 0x86, 0x80, 0x54,
+    0x5c, 0x69, 0x82, 0x75, 0x55, 0x68, 0x88, 0x64, 0x8d, 0x86, 0x96, 0x6e,
+    0x85, 0x88, 0x61, 0x40, 0x75, 0x6e, 0x7d, 0x81, 0x8d, 0x8e, 0x5c, 0x79,
+    0xa4, 0x97, 0x6e, 0x72, 0xcd, 0x6c, 0x7d, 0x59, 0x61, 0x80, 0x73, 0x8a,
+    0x62, 0x63, 0x7d, 0x5e, 0x90, 0x5e, 0x94, 0x7b, 0x5e, 0xc7, 0x76, 0x59,
+    0x75, 0x81, 0x71, 0x8e, 0x8e, 0x5a, 0x6c, 0x78, 0x52, 0x68, 0x89, 0x6a,
+    0x6b, 0x84, 0x70, 0x8a, 0x6b, 0x76, 0x88, 0x7a, 0x78, 0x6e, 0x6f, 0x7b,
+    0x58, 0x6d, 0x8a, 0x73, 0x6f, 0x88, 0x74, 0x7e, 0x80, 0x77, 0x4a, 0x50,
+    0x71, 0x82, 0x82, 0x61, 0xa6, 0x74, 0x64, 0x48, 0x84, 0x63, 0x8d, 0x5f,
+    0x7d, 0x57, 0x75, 0x6a, 0x89, 0x64, 0x9b, 0x8c, 0x5b, 0x7d, 0x59, 0x65,
+    0x80, 0x8c, 0x77, 0x6e, 0x58, 0x7a, 0x65, 0x6e, 0x74, 0x7f, 0x6d, 0x6a,
+    0x67, 0x7b, 0x71, 0x7d, 0x7b, 0x7f, 0x70, 0x80, 0x77, 0x52, 0x7d, 0x6b,
+    0x76, 0x77, 0x6e, 0x62, 0x63, 0x54, 0x6f, 0x6a, 0x7d, 0x75, 0x63, 0x79,
+    0x74, 0x6f, 0x65, 0x75, 0x72, 0x4a, 0x65, 0x77, 0x71, 0x7a, 0x70, 0x72,
+    0x68, 0x70, 0x71, 0x78, 0x68, 0x5f, 0x6f, 0x75, 0x7c, 0x7a, 0x78, 0x79,
+    0x75, 0x6a, 0x79, 0x76, 0x81, 0x5b, 0x77, 0x78, 0x7e, 0x75, 0x7c, 0x77,
+    0x6f, 0x7b, 0x7d, 0x75, 0x78, 0x72, 0x79, 0x77, 0x74, 0x84, 0x77, 0x77,
+    0x79, 0x6c, 0x69, 0x78, 0x7c, 0x7c, 0x71, 0x74, 0x77, 0x6d, 0x78, 0x5a,
+    0x73, 0x81, 0x74, 0x72, 0x92, 0x75, 0x70, 0x72, 0x7e, 0x7a, 0x80, 0x69,
+    0x77, 0x71, 0x72, 0x75, 0x77, 0x39, 0x72, 0x79, 0x6b, 0x7e, 0x67, 0x6d,
+    0xa1, 0x53, 0x66, 0xa7, 0x66, 0x54, 0x79, 0x80, 0x89, 0x6c, 0x56, 0xa7,
+    0x69, 0x46, 0xa9, 0x9f, 0xa7, 0x8b, 0x60, 0x4a, 0x46, 0x39, 0x9e, 0x88,
+    0x5d, 0x7d, 0x83, 0x9c, 0x7e, 0xb4, 0x37, 0x83, 0xc1, 0x5d, 0x63, 0x57,
+    0x6a, 0x52, 0x97, 0x4a, 0x94, 0x5d, 0x43, 0xaa, 0x7f, 0x50, 0x6b, 0x68,
+    0x91, 0x68, 0x6f, 0x4b, 0xac, 0x63, 0x63, 0xb2, 0xa8, 0xe8, 0x60, 0xb5,
+    0x67, 0x7a, 0x63, 0x7b, 0x6c, 0x68, 0x75, 0x72, 0x71, 0x76, 0x79, 0x67,
+    0x7e, 0x77, 0x64, 0x6f, 0x72, 0x74, 0x76, 0x75, 0x80, 0x7b, 0x84, 0x6f,
+    0x82, 0x76, 0x6c, 0x69, 0x75, 0x72, 0x7b, 0x7e, 0x75, 0x70, 0x79, 0x78,
+    0x75, 0x74, 0x6f, 0x7c, 0x90, 0x6e, 0x72, 0x6c, 0x36, 0x76, 0x75, 0x61,
+    0x76, 0x76, 0x6c, 0x7a, 0x79, 0x74, 0x74, 0x7a, 0x75, 0x83, 0x6d, 0x76,
+    0x63, 0x73, 0x87, 0x69, 0x65, 0x58, 0x74, 0x75, 0x7e, 0x82, 0x77, 0x46,
+    0x6f, 0x53, 0x7b, 0x7f, 0x40, 0x6d, 0x76, 0x77, 0x79, 0x6b, 0x83, 0x79,
+    0x6e, 0x72, 0x6c, 0x7e, 0x5b, 0x80, 0x7c, 0x7c, 0x72, 0x7b, 0x7c, 0x7a,
+    0x61, 0x88, 0x66, 0x71, 0x8e, 0x69, 0x6a, 0x62, 0x75, 0x6c, 0x71, 0x68,
+    0x81, 0x79, 0x6c, 0x6e, 0x6c, 0x72, 0x78, 0x81, 0x61, 0x76, 0x75, 0x7a,
+    0x6a, 0x75, 0x76, 0x7c, 0x77, 0x75, 0x70, 0x75, 0x74, 0x73, 0x77, 0x75,
+    0x74, 0x76, 0x6e, 0x78, 0x78, 0x71, 0x79, 0x72, 0x72, 0x7a, 0x71, 0x7b,
+    0x7b, 0x6c, 0x7d, 0x73, 0x76, 0x77, 0x74, 0x77, 0x78, 0x73, 0x6f, 0x71,
+    0x72, 0x74, 0x71, 0x70, 0x80, 0x73, 0x76, 0x71, 0x79, 0x75, 0x48, 0x71,
+    0x71, 0x74, 0x71, 0x75, 0x76, 0x76, 0x7b, 0x75, 0x76, 0x79, 0x73, 0x71,
+    0x7e, 0x72, 0x70, 0x7c, 0x74, 0x78, 0x73, 0x70, 0x69, 0x73, 0x74, 0x6e,
+    0x6f, 0x72, 0x77, 0x6e, 0x6d, 0x6c, 0x7b, 0x73, 0x6c, 0x76, 0x6f, 0x73,
+    0x6b, 0x7a, 0x72, 0x70, 0x73, 0x7e, 0x70, 0x76, 0x71, 0x74, 0x70, 0x6f,
+    0x7a, 0x77, 0x76, 0x6f, 0x7c, 0x71, 0x70, 0x67, 0x7a, 0x71, 0x57, 0x77,
+    0x79, 0x69, 0x74, 0x73, 0x70, 0x78, 0x6e, 0x76, 0x76, 0x7e, 0x6a, 0x74,
+    0x67, 0x77, 0x76, 0x7b, 0x77, 0x72, 0x66, 0x72, 0x74, 0x77, 0x78, 0x75,
+    0x72, 0x6d, 0x71, 0x7e, 0x77, 0x7b, 0x68, 0x77, 0x6e, 0x79, 0x79, 0x7c,
+    0x78, 0x69, 0x81, 0x75, 0x72, 0x74, 0x78, 0x76, 0x6c, 0x70, 0x70, 0x78,
+    0x6c, 0x78, 0x75, 0x79, 0x82, 0x6f, 0x73, 0x69, 0x7d, 0x74, 0x54, 0x71,
+    0x74, 0x73, 0x6a, 0x70, 0x7c, 0x70, 0x7c, 0x73, 0x76, 0x81, 0x7c, 0x76,
+    0x76, 0x7a, 0x9c, 0x78, 0x7c, 0x95, 0x4d, 0x50, 0x96, 0x78, 0x7c, 0x6b,
+    0x8b, 0x96, 0x8a, 0x68, 0x65, 0x6a, 0x57, 0x71, 0x7e, 0x5c, 0xb4, 0x64,
+    0x70, 0x70, 0x94, 0x70, 0x76, 0x68, 0x70, 0x98, 0x96, 0x85, 0x77, 0x73,
+    0x87, 0x6c, 0x86, 0x76, 0xcb, 0x8d, 0x87, 0x67, 0x80, 0x7e, 0x92, 0x72,
+    0x8c, 0x5c, 0x71, 0x8d, 0x7d, 0x55, 0x71, 0x6c, 0x7b, 0x75, 0x9a, 0x84,
+    0x70, 0x67, 0x6e, 0x65, 0x65, 0x6f, 0x6b, 0x6e, 0x6f, 0x6e, 0x69, 0x6d,
+    0x6d, 0x69, 0x6b, 0x64, 0x69, 0x6d, 0x6f, 0x72, 0x6b, 0x6c, 0x68, 0x6e,
+    0x6f, 0x6d, 0x6b, 0x6c, 0x6e, 0x70, 0x6e, 0x65, 0x66, 0x6d, 0x4e, 0x6b,
+    0x69, 0x60, 0x6b, 0x6c, 0x50, 0x70, 0x64, 0x6a, 0x5e, 0x71, 0x72, 0x6e,
+    0x72, 0x67, 0x75, 0x6f, 0x60, 0x71, 0x71, 0x6f, 0x71, 0x60, 0x57, 0x61,
+    0x60, 0x6f, 0x7b, 0x77, 0x76, 0x6f, 0x7a, 0x75, 0x7c, 0x6e, 0x78, 0x84,
+    0x81, 0x52, 0x6a, 0x6f, 0x64, 0x75, 0x7d, 0x89, 0x78, 0x6e, 0x7e, 0x70,
+    0x74, 0x79, 0x7a, 0x5b, 0x75, 0x77, 0x67, 0x7f, 0x5f, 0x7b, 0x72, 0x72,
+    0x76, 0x65, 0x79, 0x7b, 0x93, 0x7b, 0x7c, 0x5d, 0x7f, 0x85, 0x6f, 0x5a,
+    0x79, 0x6c, 0x73, 0x71, 0x80, 0x87, 0x7c, 0x75, 0x69, 0x84, 0x87, 0x81,
+}};
+
+const union {
+  uint8_t bytes[4];
+  float values[1];
+} dnn_hiddenlayer_0_weights__1__cf__1_quantized_min = {{
+    0x77, 0xe6, 0x47, 0xc1,
+}};
+
+const int32_t dnn_logits_weights__3__cf__3_shape[2] = {DNN_BIASES_SIZE, 1};
+const union {
+  uint8_t bytes[2 * 2 * DNN_BIASES_SIZE];
+  float values[DNN_BIASES_SIZE];
+} dnn_logits_weights__3__cf__3 = {{
+    0xef, 0x68, 0x61, 0xbd, 0xe0, 0x99, 0x5a, 0x3d, 0x5a, 0x63, 0xb4, 0x3d,
+    0x87, 0x88, 0x26, 0xbe, 0x71, 0x95, 0x75, 0x3d, 0x88, 0x5b, 0x46, 0x3d,
+    0x35, 0x40, 0x47, 0xbd, 0xdd, 0x36, 0x62, 0xbd, 0x4d, 0x0e, 0x8e, 0x3d,
+    0x0f, 0x5e, 0x69, 0x3d, 0x94, 0x0d, 0xd4, 0x3d, 0x2d, 0xc7, 0x8b, 0xbd,
+    0xe1, 0x18, 0x52, 0x3d, 0x54, 0xbd, 0xb3, 0x3d, 0x15, 0x2e, 0xbf, 0xbd,
+    0xf7, 0xae, 0xb3, 0xbd, 0x0f, 0x85, 0x77, 0xbd, 0xdd, 0x25, 0xad, 0xbd,
+    0x15, 0xac, 0x06, 0x3e, 0x61, 0xc3, 0x9a, 0x3d, 0xc4, 0xca, 0x6a, 0x3d,
+    0xe7, 0x15, 0x7a, 0x3d, 0xf6, 0xd5, 0xbb, 0x3d, 0x73, 0x68, 0xb4, 0x3d,
+    0x4f, 0xea, 0x65, 0x3d, 0x82, 0x9f, 0x11, 0xbd, 0xc0, 0x41, 0x56, 0xbd,
+    0x6a, 0x7b, 0x8b, 0xbd, 0x00, 0xb4, 0x75, 0xbd, 0x1d, 0x7e, 0x3a, 0xbd,
+    0x6a, 0x66, 0xaa, 0x3d, 0x2f, 0x8c, 0xa8, 0xbd, 0x43, 0xfb, 0xd5, 0xbd,
+    0xcd, 0x19, 0x9d, 0x3d, 0xa3, 0x23, 0x0a, 0x3e, 0x19, 0xfa, 0x2a, 0x3d,
+    0x86, 0x8e, 0xf7, 0x3c, 0xcc, 0x5e, 0x81, 0x3d, 0xde, 0x0a, 0x55, 0xbd,
+    0x68, 0x3d, 0x85, 0x3d, 0x0f, 0x91, 0x4d, 0xbe, 0xe5, 0x67, 0x87, 0x3d,
+    0x9d, 0xf3, 0x89, 0x3d, 0xeb, 0x10, 0x76, 0xbd, 0x6a, 0xaf, 0x77, 0xbe,
+    0x8b, 0x90, 0x39, 0x3d, 0xbb, 0x92, 0x0f, 0x3e, 0xab, 0x86, 0x56, 0x3d,
+    0x43, 0xa0, 0x3b, 0xbd, 0xc0, 0xd0, 0x6e, 0x3d, 0x44, 0xf3, 0xc4, 0xbd,
+    0xc9, 0xa8, 0x1d, 0x3d, 0xe7, 0xd9, 0x6a, 0xbd, 0xfe, 0x78, 0x46, 0x3d,
+    0x57, 0x98, 0x86, 0x3d, 0x05, 0xb3, 0xa2, 0xbd, 0x13, 0xaa, 0x37, 0xbd,
+    0xd2, 0x77, 0x8e, 0xbd, 0xfa, 0x3e, 0xc3, 0x3d, 0x62, 0x28, 0xcb, 0xbd,
+}};
+
+const union {
+  uint8_t bytes[4];
+  float values[1];
+} dnn_hiddenlayer_0_weights__1__cf__1_quantized_max = {{
+    0x33, 0x8b, 0x75, 0x41,
+}};
+
+const int32_t dnn_hiddenlayer_0_biases__0__cf__0_shape[1] = {DNN_BIASES_SIZE};
+const union {
+  uint8_t bytes[2 * 2 * DNN_BIASES_SIZE];
+  float values[DNN_BIASES_SIZE];
+} dnn_hiddenlayer_0_biases__0__cf__0 = {{
+    0xc9, 0x07, 0xbd, 0xbe, 0xa3, 0xf2, 0x2d, 0xbf, 0x33, 0x91, 0x43, 0xbf,
+    0x03, 0xfc, 0x00, 0xc0, 0xb7, 0x9e, 0x82, 0xbf, 0x6a, 0xd2, 0x0c, 0xbf,
+    0x4e, 0x99, 0x64, 0xbf, 0x7f, 0xfc, 0xe6, 0xbe, 0x11, 0xed, 0x3b, 0xbf,
+    0x50, 0xf0, 0x34, 0xbf, 0xcd, 0xbc, 0xbb, 0xbf, 0x80, 0xdb, 0x73, 0xbf,
+    0x82, 0x41, 0x3d, 0xbf, 0xee, 0xd3, 0x8c, 0xbf, 0xa1, 0x42, 0x28, 0xbf,
+    0x34, 0xb4, 0x87, 0xbf, 0x70, 0x7e, 0x51, 0xbf, 0x55, 0xce, 0x08, 0xbf,
+    0x2e, 0xf1, 0x9b, 0xbf, 0x8e, 0xc4, 0xa3, 0xbe, 0x13, 0x63, 0x39, 0xbf,
+    0xbf, 0x11, 0x41, 0xbf, 0xdb, 0xc7, 0xe1, 0xbf, 0x4e, 0x84, 0x31, 0xbf,
+    0xc9, 0xa0, 0x1f, 0xbf, 0xf4, 0x51, 0x4b, 0xbf, 0xf6, 0xb6, 0x21, 0xbf,
+    0x5a, 0x73, 0x4c, 0xbf, 0x14, 0xac, 0xb6, 0xbe, 0x9a, 0x26, 0x28, 0xbf,
+    0x8f, 0x03, 0xcf, 0xbe, 0x0a, 0x7c, 0x61, 0xbf, 0x4c, 0x6a, 0x52, 0xbf,
+    0x1c, 0x11, 0x3b, 0xbf, 0x5c, 0xe5, 0xbe, 0xbf, 0xb0, 0xfa, 0x76, 0xbf,
+    0xce, 0x1f, 0x5b, 0xbf, 0xe1, 0x69, 0x66, 0xbf, 0x34, 0x39, 0x51, 0xbf,
+    0xdb, 0xc0, 0x68, 0xbf, 0xca, 0x5a, 0x7d, 0xc0, 0x6a, 0xe3, 0x41, 0xbf,
+    0x30, 0x7b, 0x38, 0xbf, 0x7a, 0x50, 0x1d, 0xbf, 0x19, 0x17, 0xef, 0xbf,
+    0x30, 0xdc, 0xce, 0xbe, 0x67, 0x8e, 0xa7, 0xbf, 0x2e, 0x03, 0x35, 0xbf,
+    0xbb, 0x71, 0x89, 0xbe, 0x78, 0xae, 0xbb, 0xbe, 0xf3, 0xd1, 0x97, 0xbc,
+    0xf0, 0xbe, 0xc1, 0xbe, 0x92, 0x6d, 0x34, 0xbf, 0xde, 0xc5, 0xc3, 0xbe,
+    0xe2, 0x48, 0x30, 0xbf, 0x69, 0x13, 0x25, 0xbf, 0x91, 0xea, 0xb6, 0xbe,
+    0x35, 0xea, 0x11, 0xc0, 0x9d, 0xa5, 0xc5, 0xbf, 0xb5, 0xe4, 0x82, 0xbf,
+}};
+
+}  // anonymous namespace
+
+// -----------------------------------------------------------------------------
+// INFERENCE
+// -----------------------------------------------------------------------------
+
+void Inference(const float* __restrict features /* shape: 1,FEATURES_SIZE */
+               ,
+               float* __restrict prediction /* shape: 1,1 */
+               ,
+               FixedAllocations* __restrict fixed) {
+  const int32_t features_shape[] = {1, FEATURES_SIZE};
+
+  // dnn/hiddenlayer_0/weights/_1__cf__1
+  DequantizeMinFirst<uint8_t>(
+      2, dnn_hiddenlayer_0_weights__1__cf__1_quantized_const_shape,
+      dnn_hiddenlayer_0_weights__1__cf__1_quantized_const.values,
+      dnn_hiddenlayer_0_weights__1__cf__1_quantized_min.values,
+      dnn_hiddenlayer_0_weights__1__cf__1_quantized_max.values, fixed->alloc0);
+
+  fixed->alloc0_shape[0] = FEATURES_SIZE;
+  fixed->alloc0_shape[1] = DNN_BIASES_SIZE;
+
+  // dnn/hiddenlayer_0/MatMul_merged_with_dnn/hiddenlayer_0/BiasAdd
+  FullyConnected<float>(features_shape, features, fixed->alloc0_shape,
+                        fixed->alloc0, dnn_hiddenlayer_0_biases__0__cf__0_shape,
+                        dnn_hiddenlayer_0_biases__0__cf__0.values,
+                        fixed->alloc1);
+  fixed->alloc1_shape[0] = 1;
+  fixed->alloc1_shape[1] = DNN_BIASES_SIZE;
+
+  // dnn/hiddenlayer_0/hiddenlayer_0/Relu
+  Relu<float>(2,  // rank
+              fixed->alloc1_shape, fixed->alloc1, fixed->alloc0);
+  fixed->alloc0_shape[0] = 1;
+  fixed->alloc0_shape[1] = DNN_BIASES_SIZE;
+
+  // dnn/logits/MatMul_merged_with_dnn/logits/BiasAdd
+  FullyConnected<float>(
+      fixed->alloc0_shape, fixed->alloc0, dnn_logits_weights__3__cf__3_shape,
+      dnn_logits_weights__3__cf__3.values, dnn_logits_biases__2__cf__2_shape,
+      dnn_logits_biases__2__cf__2.values, prediction);
+}
+
+}  // namespace tfnative_model
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h b/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h
new file mode 100644
index 0000000..c7a6858
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/smart_dim/tf_native_inference.h
@@ -0,0 +1,43 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file was generated using tf.native from a neural network trained by
+// TensorFlow, then cleaned up by hand. Please do not edit except to update
+// the constants for a new model.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_TF_NATIVE_INFERENCE_H_
+#define CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_TF_NATIVE_INFERENCE_H_
+
+#include <cstdint>
+
+namespace chromeos {
+namespace power {
+namespace ml {
+namespace tfnative_model {
+
+constexpr int DNN_WEIGHTS_SIZE = 33900;
+constexpr int DNN_RANK = 2;
+constexpr int FEATURES_SIZE = 565;
+constexpr int DNN_BIASES_SIZE = 60;
+
+struct alignas(16) FixedAllocations {
+  float alloc0[DNN_WEIGHTS_SIZE];
+  int32_t alloc0_shape[DNN_RANK];
+  float alloc1[DNN_BIASES_SIZE];
+  int32_t alloc1_shape[DNN_RANK];
+};
+
+void Inference(
+    /* size: FEATURES_SIZE */
+    const float* __restrict features,
+    /* size: 1 */
+    float* __restrict prediction,
+    FixedAllocations* __restrict fixed);
+
+}  // namespace tfnative_model
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_TF_NATIVE_INFERENCE_H_
diff --git a/chrome/browser/chromeos/power/ml/smart_dim_model.h b/chrome/browser/chromeos/power/ml/smart_dim_model.h
deleted file mode 100644
index 4e29cf08..0000000
--- a/chrome/browser/chromeos/power/ml/smart_dim_model.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_H_
-#define CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_H_
-
-#include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
-
-namespace chromeos {
-namespace power {
-namespace ml {
-
-// Interface to indicate whether an upcoming screen dim should go ahead based on
-// whether user will remain inactive if screen is dimmed now.
-class SmartDimModel {
- public:
-  virtual ~SmartDimModel() = default;
-
-  // Returns whether an upcoming dim should go ahead based on input |features|.
-  // If |inactive_probability_out| and |threshold_out| are non-null, also
-  // returns model confidence (probability that user will remain inactive if
-  // screen is dimmed now) and threshold: if probability >= threshold then model
-  // will return true for this function. Both |inactive_probability_out| and
-  // |threshold_out| are expected to be in the range of [0, 1.0] so that they
-  // can be logged as model results.
-  virtual bool ShouldDim(const UserActivityEvent::Features& features,
-                         float* inactive_probability_out,
-                         float* threshold_out) = 0;
-};
-
-}  // namespace ml
-}  // namespace power
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_H_
diff --git a/chrome/browser/chromeos/power/ml/smart_dim_model_impl.cc b/chrome/browser/chromeos/power/ml/smart_dim_model_impl.cc
deleted file mode 100644
index 2cf18654..0000000
--- a/chrome/browser/chromeos/power/ml/smart_dim_model_impl.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/power/ml/smart_dim_model_impl.h"
-
-namespace chromeos {
-namespace power {
-namespace ml {
-
-SmartDimModelImpl::SmartDimModelImpl() = default;
-
-SmartDimModelImpl::~SmartDimModelImpl() = default;
-
-// TODO(jiameng): add impl.
-bool SmartDimModelImpl::ShouldDim(const UserActivityEvent::Features& features,
-                                  float* inactive_probability_out,
-                                  float* threshold_out) {
-  // Let dim go ahead before we have a model implementation in place.
-  if (inactive_probability_out) {
-    *inactive_probability_out = 1.0;
-  }
-  if (threshold_out) {
-    *threshold_out = 0.0;
-  }
-  return true;
-}
-
-}  // namespace ml
-}  // namespace power
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/smart_dim_model_impl.h b/chrome/browser/chromeos/power/ml/smart_dim_model_impl.h
deleted file mode 100644
index d1387de..0000000
--- a/chrome/browser/chromeos/power/ml/smart_dim_model_impl.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_IMPL_H_
-#define CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_IMPL_H_
-
-#include "base/macros.h"
-#include "chrome/browser/chromeos/power/ml/smart_dim_model.h"
-
-namespace chromeos {
-namespace power {
-namespace ml {
-
-// Real implementation of SmartDimModel that predicts whether an upcoming screen
-// dim should go ahead based on user activity/inactivity following dim.
-class SmartDimModelImpl : public SmartDimModel {
- public:
-  SmartDimModelImpl();
-  ~SmartDimModelImpl() override;
-
-  // chromeos::power::ml::SmartDimModel overrides:
-  bool ShouldDim(const UserActivityEvent::Features& features,
-                 float* inactive_probability_out,
-                 float* threshold_out) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SmartDimModelImpl);
-};
-
-}  // namespace ml
-}  // namespace power
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_SMART_DIM_MODEL_IMPL_H_
diff --git a/chrome/browser/chromeos/power/ml/user_activity_controller.h b/chrome/browser/chromeos/power/ml/user_activity_controller.h
index 80b7ba66..e1c3325 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_controller.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_controller.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "chrome/browser/chromeos/power/ml/idle_event_notifier.h"
-#include "chrome/browser/chromeos/power/ml/smart_dim_model_impl.h"
+#include "chrome/browser/chromeos/power/ml/smart_dim/model_impl.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_manager.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h"
 
diff --git a/chrome/browser/chromeos/power/ml/user_activity_event.proto b/chrome/browser/chromeos/power/ml/user_activity_event.proto
index 8664f80..4add9eb 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_event.proto
+++ b/chrome/browser/chromeos/power/ml/user_activity_event.proto
@@ -179,14 +179,33 @@
     optional int32 previous_positive_actions_count = 30;
   }  // next id = 31
 
+  // All fields except |model_applied| in ModelPrediction are populated by the
+  // model. |model_applied| is populated by the UserActivityManager when
+  // deciding whether to apply the model decision.
   message ModelPrediction {
-    // If |inactivity_score| < |decision_threshold| then dim will be deferred.
+    enum Response {
+      // Dim should go ahead.
+      DIM = 0;
+      // Dim should be deferred.
+      NO_DIM = 1;
+      // Model could fail to make a prediction due to various reasons, e.g. it
+      // could fail to load the preprocessor or process the features for
+      // inference.
+      MODEL_ERROR = 2;
+    }
+
+    // Both |inactivity_score| and |decision_threshold| are in the range of
+    // [0,100]. These values are the quantized versions of actual values used in
+    // making a model prediction, so that they can be logged later. If
+    // |inactivity_score| < |decision_threshold| then dim will be deferred.
     optional int32 decision_threshold = 1;
     // How likely user will remain inactive if screen is dimmed.
     optional int32 inactivity_score = 2;
     // Whether model decision (regardless if dim is to be deferred) is
-    // taken by powerd.
+    // taken by powerd. It is false if model response is MODEL_ERROR or if dim
+    // was deferred last time dim imminent occurred.
     optional bool model_applied = 3;
+    optional Response response = 4;
   }
 
   optional ModelParams params = 1;
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.cc b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
index 04a0f8a..32194a9b 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.cc
@@ -27,9 +27,53 @@
 namespace ml {
 
 namespace {
+
 void LogPowerMLPreviousEventLoggingResult(PreviousEventLoggingResult result) {
   UMA_HISTOGRAM_ENUMERATION("PowerML.PreviousEventLogging.Result", result);
 }
+
+void LogPowerMLDimImminentAction(DimImminentAction action) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.DimImminent.Action", action);
+}
+
+void LogPowerMLNonModelDimResult(FinalResult result) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.NonModelDim.Result", result);
+}
+
+void LogPowerMLModelDimResult(FinalResult result) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.ModelDim.Result", result);
+}
+
+void LogPowerMLModelNoDimResult(FinalResult result) {
+  UMA_HISTOGRAM_ENUMERATION("PowerML.ModelNoDim.Result", result);
+}
+
+void LogMetricsToUMA(const UserActivityEvent& event) {
+  const FinalResult result =
+      event.event().type() == UserActivityEvent::Event::REACTIVATE
+          ? FinalResult::kReactivation
+          : FinalResult::kOff;
+  if (!event.has_model_prediction() ||
+      !event.model_prediction().model_applied()) {
+    LogPowerMLDimImminentAction(DimImminentAction::kModelIgnored);
+    LogPowerMLNonModelDimResult(result);
+    return;
+  }
+
+  if (event.model_prediction().response() ==
+      UserActivityEvent::ModelPrediction::DIM) {
+    LogPowerMLDimImminentAction(DimImminentAction::kModelDim);
+    LogPowerMLModelDimResult(result);
+    return;
+  }
+
+  CHECK_EQ(UserActivityEvent::ModelPrediction::NO_DIM,
+           event.model_prediction().response());
+
+  LogPowerMLDimImminentAction(DimImminentAction::kModelNoDim);
+  LogPowerMLModelNoDimResult(result);
+}
+
 }  // namespace
 
 struct UserActivityManager::PreviousIdleEventData {
@@ -193,30 +237,27 @@
   ExtractFeatures(activity_data);
   if (base::FeatureList::IsEnabled(features::kUserActivityPrediction) &&
       smart_dim_model_) {
-    float inactivity_probability = -1;
-    float threshold = -1;
-    const bool should_dim = smart_dim_model_->ShouldDim(
-        features_, &inactivity_probability, &threshold);
-    DCHECK(inactivity_probability >= 0 && inactivity_probability <= 1.0)
-        << inactivity_probability;
-    DCHECK(threshold >= 0 && threshold <= 1.0) << threshold;
-
-    UserActivityEvent::ModelPrediction model_prediction;
-    // If previous dim was deferred, then model decision will not be applied
-    // to this event.
-    model_prediction.set_model_applied(!dim_deferred_);
-    model_prediction.set_decision_threshold(round(threshold * 100));
-    model_prediction.set_inactivity_score(round(inactivity_probability * 100));
-    model_prediction_ = model_prediction;
+    // Decide whether to defer the imminent screen dim.
+    UserActivityEvent::ModelPrediction model_prediction =
+        smart_dim_model_->ShouldDim(features_);
 
     // Only defer the dim if the model predicts so and also if the dim was not
     // previously deferred.
-    if (should_dim || dim_deferred_) {
-      dim_deferred_ = false;
-    } else {
+    if (model_prediction.response() ==
+            UserActivityEvent::ModelPrediction::NO_DIM &&
+        !dim_deferred_) {
       power_manager_client_->DeferScreenDim();
       dim_deferred_ = true;
+      model_prediction.set_model_applied(true);
+    } else {
+      // Either model predicts dim or model fails, or it was previously dimmed.
+      dim_deferred_ = false;
+      model_prediction.set_model_applied(
+          model_prediction.response() ==
+              UserActivityEvent::ModelPrediction::DIM &&
+          !dim_deferred_);
     }
+    model_prediction_ = model_prediction;
   }
   waiting_for_final_action_ = true;
 }
@@ -431,6 +472,7 @@
 
   // Log to metrics.
   ukm_logger_->LogActivity(activity_event);
+  LogMetricsToUMA(activity_event);
 
   // If there's an earlier idle event that has not received its own event, log
   // it here too.
@@ -445,6 +487,7 @@
     *activity_event.mutable_model_prediction() =
         previous_idle_event_data_->model_prediction;
     ukm_logger_->LogActivity(activity_event);
+    LogMetricsToUMA(activity_event);
   }
 
   // Update the counters for next event logging.
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager.h b/chrome/browser/chromeos/power/ml/user_activity_manager.h
index dd9c021e..737c27fb 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager.h
@@ -12,7 +12,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
 #include "chrome/browser/chromeos/power/ml/idle_event_notifier.h"
-#include "chrome/browser/chromeos/power/ml/smart_dim_model.h"
+#include "chrome/browser/chromeos/power/ml/smart_dim/model.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger.h"
 #include "chrome/browser/resource_coordinator/tab_metrics_event.pb.h"
@@ -57,6 +57,20 @@
   bool has_form_entry;
 };
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// What happens after a screen dim imminent is received.
+enum class DimImminentAction {
+  kModelIgnored = 0,
+  kModelDim = 1,
+  kModelNoDim = 2,
+  kMaxValue = kModelNoDim
+};
+
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class FinalResult { kReactivation = 0, kOff = 1, kMaxValue = kOff };
+
 // Logs user activity after an idle event is observed.
 // TODO(renjieliu): Add power-related activity as well.
 class UserActivityManager : public ui::UserActivityObserver,
diff --git a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
index ad4f21c..2705128 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_manager_unittest.cc
@@ -16,7 +16,7 @@
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/chromeos/power/ml/fake_boot_clock.h"
 #include "chrome/browser/chromeos/power/ml/idle_event_notifier.h"
-#include "chrome/browser/chromeos/power/ml/smart_dim_model.h"
+#include "chrome/browser/chromeos/power/ml/smart_dim/model.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger.h"
 #include "chrome/browser/engagement/site_engagement_service.h"
@@ -63,12 +63,19 @@
 void EqualModelPrediction(
     const UserActivityEvent::ModelPrediction& expected_prediction,
     const UserActivityEvent::ModelPrediction& result_prediction) {
-  EXPECT_EQ(expected_prediction.decision_threshold(),
-            result_prediction.decision_threshold());
-  EXPECT_EQ(expected_prediction.inactivity_score(),
-            result_prediction.inactivity_score());
   EXPECT_EQ(expected_prediction.model_applied(),
             result_prediction.model_applied());
+  EXPECT_EQ(expected_prediction.response(), result_prediction.response());
+  if (expected_prediction.response() !=
+      UserActivityEvent::ModelPrediction::MODEL_ERROR) {
+    EXPECT_EQ(expected_prediction.decision_threshold(),
+              result_prediction.decision_threshold());
+    EXPECT_EQ(expected_prediction.inactivity_score(),
+              result_prediction.inactivity_score());
+  } else {
+    EXPECT_FALSE(result_prediction.has_decision_threshold());
+    EXPECT_FALSE(result_prediction.has_inactivity_score());
+  }
 }
 
 // Testing UKM logger.
@@ -96,26 +103,42 @@
   FakeSmartDimModel() = default;
   ~FakeSmartDimModel() override = default;
 
-  void set_inactive_probability(const float inactive_probability) {
-    inactive_probability_ = inactive_probability;
+  void set_inactivity_score(const int inactivity_score) {
+    inactivity_score_ = inactivity_score;
   }
 
-  void set_threshold(const float threshold) { threshold_ = threshold; }
+  void set_decision_threshold(const int decision_threshold) {
+    decision_threshold_ = decision_threshold;
+  }
 
   // SmartDimModel overrides:
-  bool ShouldDim(const UserActivityEvent::Features& features,
-                 float* inactive_probability_out,
-                 float* threshold_out) override {
-    DCHECK(inactive_probability_out);
-    DCHECK(threshold_out);
-    *inactive_probability_out = inactive_probability_;
-    *threshold_out = threshold_;
-    return inactive_probability_ >= threshold_;
+  UserActivityEvent::ModelPrediction ShouldDim(
+      const UserActivityEvent::Features& features) override {
+    UserActivityEvent::ModelPrediction model_prediction;
+    // If either of these two values are set outside of the legal range [0,100],
+    // return an error code.
+    // The |model_applied| field is not filled by the model but by
+    // UserActivityManager.
+    if (inactivity_score_ < 0 || inactivity_score_ > 100 ||
+        decision_threshold_ < 0 || decision_threshold_ > 100) {
+      model_prediction.set_response(
+          UserActivityEvent::ModelPrediction::MODEL_ERROR);
+      return model_prediction;
+    }
+    model_prediction.set_decision_threshold(decision_threshold_);
+    model_prediction.set_inactivity_score(inactivity_score_);
+    if (inactivity_score_ < decision_threshold_) {
+      model_prediction.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
+    } else {
+      model_prediction.set_response(UserActivityEvent::ModelPrediction::DIM);
+    }
+    return model_prediction;
   }
 
  private:
-  float inactive_probability_ = 0;
-  float threshold_ = 0;
+  int inactivity_score_ = -1;
+  int decision_threshold_ = -1;
+
   DISALLOW_COPY_AND_ASSIGN(FakeSmartDimModel);
 };
 
@@ -853,8 +876,8 @@
   scoped_feature_list.InitAndEnableFeatureWithParameters(
       features::kUserActivityPrediction, params);
 
-  model_.set_inactive_probability(0.6);
-  model_.set_threshold(0.651);
+  model_.set_inactivity_score(60);
+  model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
   ReportIdleEvent(data);
@@ -877,6 +900,7 @@
   expected_prediction.set_decision_threshold(65);
   expected_prediction.set_inactivity_score(60);
   expected_prediction.set_model_applied(true);
+  expected_prediction.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
   EqualModelPrediction(expected_prediction, events[0].model_prediction());
 }
 
@@ -887,8 +911,8 @@
   scoped_feature_list.InitAndEnableFeatureWithParameters(
       features::kUserActivityPrediction, params);
 
-  model_.set_inactive_probability(0.6);
-  model_.set_threshold(0.651);
+  model_.set_inactivity_score(60);
+  model_.set_decision_threshold(65);
 
   const IdleEventNotifier::ActivityData data;
   ReportIdleEvent(data);
@@ -905,8 +929,8 @@
   scoped_feature_list.InitAndEnableFeatureWithParameters(
       features::kUserActivityPrediction, params);
 
-  model_.set_inactive_probability(0.6);
-  model_.set_threshold(0.5);
+  model_.set_inactivity_score(60);
+  model_.set_decision_threshold(50);
 
   const IdleEventNotifier::ActivityData data;
   ReportIdleEvent(data);
@@ -920,6 +944,8 @@
   expected_prediction.set_decision_threshold(50);
   expected_prediction.set_inactivity_score(60);
   expected_prediction.set_model_applied(true);
+  expected_prediction.set_response(UserActivityEvent::ModelPrediction::DIM);
+
   EqualModelPrediction(expected_prediction, events[0].model_prediction());
 }
 
@@ -929,10 +955,10 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeatureWithParameters(
       features::kUserActivityPrediction, params);
-  model_.set_threshold(0.5);
+  model_.set_decision_threshold(50);
 
   // 1st ScreenDimImminent gets deferred
-  model_.set_inactive_probability(0.4);
+  model_.set_inactivity_score(40);
 
   const IdleEventNotifier::ActivityData data;
   ReportIdleEvent(data);
@@ -943,7 +969,7 @@
                 base::TimeDelta::FromSeconds(3));
 
   // 2nd ScreenDimImminent is not deferred despite model score says so.
-  model_.set_inactive_probability(0.2);
+  model_.set_inactivity_score(20);
   GetTaskRunner()->FastForwardBy(base::TimeDelta::FromSeconds(10));
   ReportIdleEvent(data);
   EXPECT_EQ(1, GetNumberOfDeferredDims());
@@ -970,6 +996,8 @@
   expected_prediction1.set_decision_threshold(50);
   expected_prediction1.set_inactivity_score(40);
   expected_prediction1.set_model_applied(true);
+  expected_prediction1.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
+
   EqualModelPrediction(expected_prediction1, events[0].model_prediction());
 
   // The second screen dim imminent event.
@@ -986,6 +1014,7 @@
   expected_prediction2.set_decision_threshold(50);
   expected_prediction2.set_inactivity_score(20);
   expected_prediction2.set_model_applied(false);
+  expected_prediction2.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
   EqualModelPrediction(expected_prediction2, events[1].model_prediction());
 }
 
@@ -995,16 +1024,16 @@
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeatureWithParameters(
       features::kUserActivityPrediction, params);
-  model_.set_threshold(0.5);
+  model_.set_decision_threshold(50);
 
   // 1st ScreenDimImminent gets deferred
-  model_.set_inactive_probability(0.4);
+  model_.set_inactivity_score(40);
   const IdleEventNotifier::ActivityData data;
   ReportIdleEvent(data);
   EXPECT_EQ(1, GetNumberOfDeferredDims());
 
   // 2nd ScreenDimImminent is not deferred despite model score says so.
-  model_.set_inactive_probability(0.2);
+  model_.set_inactivity_score(20);
   GetTaskRunner()->FastForwardBy(base::TimeDelta::FromSeconds(10));
   ReportIdleEvent(data);
   EXPECT_EQ(1, GetNumberOfDeferredDims());
@@ -1031,6 +1060,8 @@
   expected_prediction1.set_decision_threshold(50);
   expected_prediction1.set_inactivity_score(20);
   expected_prediction1.set_model_applied(false);
+  expected_prediction1.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
+
   EqualModelPrediction(expected_prediction1, events[0].model_prediction());
 
   // The earlier idle event is logged afterwards.
@@ -1042,9 +1073,46 @@
   expected_prediction2.set_decision_threshold(50);
   expected_prediction2.set_inactivity_score(40);
   expected_prediction2.set_model_applied(true);
+  expected_prediction2.set_response(UserActivityEvent::ModelPrediction::NO_DIM);
+
   EqualModelPrediction(expected_prediction2, events[1].model_prediction());
 }
 
+TEST_F(UserActivityManagerTest, ModelError) {
+  const std::map<std::string, std::string> params = {
+      {"dim_threshold", "0.651"}};
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kUserActivityPrediction, params);
+
+  // This value will trigger a model error.
+  model_.set_inactivity_score(160);
+  model_.set_decision_threshold(65);
+
+  const IdleEventNotifier::ActivityData data;
+  ReportIdleEvent(data);
+  ReportUserActivity(nullptr);
+  EXPECT_EQ(0, GetNumberOfDeferredDims());
+
+  const std::vector<UserActivityEvent>& events = delegate_.events();
+  ASSERT_EQ(1U, events.size());
+
+  UserActivityEvent::Event expected_event;
+  expected_event.set_type(UserActivityEvent::Event::REACTIVATE);
+  expected_event.set_reason(UserActivityEvent::Event::USER_ACTIVITY);
+  expected_event.set_log_duration_sec(0);
+  expected_event.set_screen_dim_occurred(false);
+  expected_event.set_screen_off_occurred(false);
+  expected_event.set_screen_lock_occurred(false);
+  EqualEvent(expected_event, events[0].event());
+
+  UserActivityEvent::ModelPrediction expected_prediction;
+  expected_prediction.set_model_applied(false);
+  expected_prediction.set_response(
+      UserActivityEvent::ModelPrediction::MODEL_ERROR);
+  EqualModelPrediction(expected_prediction, events[0].model_prediction());
+}
+
 TEST_F(UserActivityManagerTest, BasicTabs) {
   std::unique_ptr<Browser> browser =
       CreateTestBrowser(true /* is_visible */, true /* is_focused */);
diff --git a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.cc b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.cc
new file mode 100644
index 0000000..1a1994eb
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.cc
@@ -0,0 +1,94 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h"
+
+#include <array>
+
+#include "base/stl_util.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+namespace {
+
+constexpr std::array<Bucket, 1> kBatteryPercentBuckets = {{{100, 5}}};
+
+constexpr std::array<Bucket, 3> kEventLogDurationBuckets = {
+    {{600, 1}, {1200, 10}, {1800, 20}}};
+
+constexpr std::array<Bucket, 3> kUserInputEventBuckets = {
+    {{100, 1}, {1000, 100}, {10000, 1000}}};
+
+constexpr std::array<Bucket, 4> kRecentVideoPlayingTimeBuckets = {
+    {{60, 1}, {1200, 300}, {3600, 600}, {18000, 1800}}};
+
+constexpr std::array<Bucket, 5> kTimeSinceLastVideoEndedBuckets = {
+    {{60, 1}, {600, 60}, {1200, 300}, {3600, 600}, {18000, 1800}}};
+
+}  // namespace
+
+std::map<std::string, int>
+UserActivityUkmLoggerBucketizer::BucketizeUserActivityEventFeatures(
+    const UserActivityEvent::Features& features) {
+  std::map<std::string, int> buckets;
+
+  if (features.has_battery_percent()) {
+    buckets[kBatteryPercent] = Bucketize(std::floor(features.battery_percent()),
+                                         kBatteryPercentBuckets);
+  }
+
+  if (features.has_key_events_in_last_hour()) {
+    buckets[kKeyEventsInLastHour] =
+        Bucketize(features.key_events_in_last_hour(), kUserInputEventBuckets);
+  }
+
+  buckets[kLastActivityTime] =
+      std::floor(features.last_activity_time_sec() / 3600);
+
+  if (features.has_last_user_activity_time_sec()) {
+    buckets[kLastUserActivityTime] =
+        std::floor(features.last_user_activity_time_sec() / 3600);
+  }
+
+  if (features.has_mouse_events_in_last_hour()) {
+    buckets[kMouseEventsInLastHour] =
+        Bucketize(features.mouse_events_in_last_hour(), kUserInputEventBuckets);
+  }
+
+  if (features.has_video_playing_time_sec()) {
+    buckets[kRecentVideoPlayingTime] = Bucketize(
+        features.video_playing_time_sec(), kRecentVideoPlayingTimeBuckets);
+  }
+
+  if (features.has_time_since_video_ended_sec()) {
+    buckets[kTimeSinceLastVideoEnded] = Bucketize(
+        features.time_since_video_ended_sec(), kTimeSinceLastVideoEndedBuckets);
+  }
+
+  if (features.has_touch_events_in_last_hour()) {
+    buckets[kTouchEventsInLastHour] =
+        Bucketize(features.touch_events_in_last_hour(), kUserInputEventBuckets);
+  }
+
+  return buckets;
+}
+
+std::map<std::string, int>
+UserActivityUkmLoggerBucketizer::BucketizeUserActivityEventData(
+    const UserActivityEvent& event) {
+  std::map<std::string, int> buckets =
+      BucketizeUserActivityEventFeatures(event.features());
+
+  if (event.event().has_log_duration_sec()) {
+    buckets[kEventLogDuration] =
+        Bucketize(event.event().log_duration_sec(), kEventLogDurationBuckets);
+  }
+  return buckets;
+}
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h
new file mode 100644
index 0000000..6a14d8f
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h
@@ -0,0 +1,84 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CHROMEOS_POWER_ML_USER_ACTIVITY_UKM_LOGGER_HELPERS_H_
+#define CHROME_BROWSER_CHROMEOS_POWER_ML_USER_ACTIVITY_UKM_LOGGER_HELPERS_H_
+
+#include "base/logging.h"
+#include "base/macros.h"
+
+#include <map>
+#include <string>
+
+#include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+// Metrics below are bucketized.
+constexpr char kBatteryPercent[] = "BatteryPercent";
+constexpr char kEventLogDuration[] = "EventLogDuration";
+constexpr char kKeyEventsInLastHour[] = "KeyEventsInLastHour";
+constexpr char kLastActivityTime[] = "LastActivityTime";
+constexpr char kLastUserActivityTime[] = "LastUserActivityTime";
+constexpr char kMouseEventsInLastHour[] = "MouseEventsInLastHour";
+constexpr char kRecentVideoPlayingTime[] = "RecentVideoPlayingTime";
+constexpr char kTimeSinceLastVideoEnded[] = "TimeSinceLastVideoEnded";
+constexpr char kTouchEventsInLastHour[] = "TouchEventsInLastHour";
+
+// TODO(jiameng): both Bucket and Bucketize are meant for user activity logging,
+// but it's currently used by adaptive brightness. Need to refactor by either
+// moving these two items to a more common lib or having a helper file for
+// adaptive brightness as the two projects are likely to diverge.
+
+// Both |boundary_end| and |rounding| must be positive.
+struct Bucket {
+  int boundary_end;
+  int rounding;
+};
+
+// Bucketize |original_value| using given |buckets|, which is an array of
+// Bucket and must be sorted in ascending order of |boundary_end|.
+// |original_value| must be non-negative. An example of |buckets| is
+// {{60, 1}, {300, 10}, {600, 20}}. This function rounds |original_value| down
+// to the nearest |bucket.rounding|, where |bucket| is the first entry in
+// |buckets| with |bucket.boundary_end| > |original_value|.
+// If |original_value| is greater than all |boundary_end|, the function
+// returns the largest |boundary_end|. Using the above |buckets| example, the
+// function will return 30 if |original_value| = 30, and 290 if
+// |original_value| = 299.
+template <size_t N>
+int Bucketize(int original_value, const std::array<Bucket, N>& buckets) {
+  DCHECK_GE(original_value, 0);
+  DCHECK(!buckets.empty());
+  for (const auto& bucket : buckets) {
+    if (original_value < bucket.boundary_end) {
+      return bucket.rounding * (original_value / bucket.rounding);
+    }
+  }
+  return buckets.back().boundary_end;
+}
+
+class UserActivityUkmLoggerBucketizer {
+ public:
+  // Bucketizes features if they are present. Returns a
+  // feature->bucketized_value map.
+  static std::map<std::string, int> BucketizeUserActivityEventFeatures(
+      const UserActivityEvent::Features& features);
+
+  // Bucketizes features and also EventLogDuration.
+  static std::map<std::string, int> BucketizeUserActivityEventData(
+      const UserActivityEvent& event);
+
+ private:
+  UserActivityUkmLoggerBucketizer() = delete;
+  DISALLOW_COPY_AND_ASSIGN(UserActivityUkmLoggerBucketizer);
+};
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_CHROMEOS_POWER_ML_USER_ACTIVITY_UKM_LOGGER_HELPERS_H_
diff --git a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers_unittest.cc
new file mode 100644
index 0000000..fa89933
--- /dev/null
+++ b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers_unittest.cc
@@ -0,0 +1,92 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h"
+
+#include <array>
+#include <memory>
+
+#include "base/stl_util.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chromeos {
+namespace power {
+namespace ml {
+
+TEST(UserActivityUkmLoggerBucketizerTest, BucketEveryFivePercents) {
+  constexpr std::array<int, 4> original_values = {{0, 14, 15, 100}};
+  constexpr std::array<int, 4> results = {{0, 10, 15, 100}};
+  constexpr std::array<Bucket, 1> buckets = {{{100, 5}}};
+
+  for (size_t i = 0; i < original_values.size(); ++i) {
+    EXPECT_EQ(results[i], Bucketize(original_values[i], buckets));
+  }
+}
+
+TEST(UserActivityUkmLoggerBucketizerTest, Bucketize) {
+  constexpr std::array<int, 14> original_values = {
+      {0, 18, 59, 60, 62, 69, 72, 299, 300, 306, 316, 599, 600, 602}};
+  constexpr std::array<int, 14> results = {
+      {0, 18, 59, 60, 60, 60, 70, 290, 300, 300, 300, 580, 600, 600}};
+  constexpr std::array<Bucket, 3> buckets = {{{60, 1}, {300, 10}, {600, 20}}};
+  for (size_t i = 0; i < original_values.size(); ++i) {
+    EXPECT_EQ(results[i], Bucketize(original_values[i], buckets));
+  }
+}
+
+TEST(UserActivityUkmLoggerBucketizerTest, BucketizeUserActivityEventData) {
+  UserActivityEvent user_activity_event;
+  UserActivityEvent::Event& event = *user_activity_event.mutable_event();
+  event.set_log_duration_sec(395);
+  event.set_reason(UserActivityEvent::Event::USER_ACTIVITY);
+  event.set_type(UserActivityEvent::Event::REACTIVATE);
+  event.set_screen_dim_occurred(true);
+  event.set_screen_off_occurred(true);
+  event.set_screen_lock_occurred(true);
+
+  // In the order of metrics names in ukm.
+  UserActivityEvent::Features& features =
+      *user_activity_event.mutable_features();
+  features.set_battery_percent(96.0);
+  features.set_device_management(UserActivityEvent::Features::UNMANAGED);
+  features.set_device_mode(UserActivityEvent::Features::CLAMSHELL);
+  features.set_device_type(UserActivityEvent::Features::CHROMEBOOK);
+  features.set_last_activity_day(UserActivityEvent::Features::MON);
+  features.set_last_activity_time_sec(7300);
+  features.set_last_user_activity_time_sec(3800);
+  features.set_key_events_in_last_hour(20000);
+  features.set_recent_time_active_sec(10);
+  features.set_previous_negative_actions_count(2);
+  features.set_previous_positive_actions_count(1);
+  features.set_video_playing_time_sec(800);
+  features.set_on_to_dim_sec(100);
+  features.set_dim_to_screen_off_sec(200);
+  features.set_screen_dimmed_initially(false);
+  features.set_screen_locked_initially(false);
+  features.set_screen_off_initially(false);
+  features.set_time_since_last_mouse_sec(100);
+  features.set_time_since_last_touch_sec(311);
+  features.set_time_since_video_ended_sec(400);
+  features.set_mouse_events_in_last_hour(89);
+  features.set_touch_events_in_last_hour(1890);
+
+  std::map<std::string, int> buckets =
+      UserActivityUkmLoggerBucketizer::BucketizeUserActivityEventData(
+          user_activity_event);
+  EXPECT_EQ(9u, buckets.size());
+  EXPECT_EQ(95, buckets["BatteryPercent"]);
+  EXPECT_EQ(395, buckets["EventLogDuration"]);
+  EXPECT_EQ(10000, buckets["KeyEventsInLastHour"]);
+  EXPECT_EQ(2, buckets["LastActivityTime"]);
+  EXPECT_EQ(1, buckets["LastUserActivityTime"]);
+  EXPECT_EQ(89, buckets["MouseEventsInLastHour"]);
+  EXPECT_EQ(600, buckets["RecentVideoPlayingTime"]);
+  EXPECT_EQ(360, buckets["TimeSinceLastVideoEnded"]);
+  EXPECT_EQ(1000, buckets["TouchEventsInLastHour"]);
+}
+
+}  // namespace ml
+}  // namespace power
+}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.cc b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.cc
index c4808af..b403ceb 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.cc
@@ -6,6 +6,7 @@
 
 #include "chrome/browser/chromeos/power/ml/user_activity_event.pb.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_manager.h"
+#include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_helpers.h"
 #include "chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h"
 #include "content/public/browser/web_contents.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
@@ -15,52 +16,17 @@
 namespace power {
 namespace ml {
 
-namespace {
-
-constexpr UserActivityUkmLoggerImpl::Bucket kBatteryPercentBuckets[] = {
-    {100, 5}};
-
-constexpr UserActivityUkmLoggerImpl::Bucket kEventLogDurationBuckets[] = {
-    {600, 1},
-    {1200, 10},
-    {1800, 20}};
-
-constexpr UserActivityUkmLoggerImpl::Bucket kUserInputEventBuckets[] = {
-    {100, 1},
-    {1000, 100},
-    {10000, 1000}};
-
-constexpr UserActivityUkmLoggerImpl::Bucket kRecentVideoPlayingTimeBuckets[] = {
-    {60, 1},
-    {1200, 300},
-    {3600, 600},
-    {18000, 1800}};
-
-constexpr UserActivityUkmLoggerImpl::Bucket kTimeSinceLastVideoEndedBuckets[] =
-    {{60, 1}, {600, 60}, {1200, 300}, {3600, 600}, {18000, 1800}};
-
-}  // namespace
-
-int UserActivityUkmLoggerImpl::Bucketize(int original_value,
-                                         const Bucket* buckets,
-                                         size_t num_buckets) {
-  DCHECK_GE(original_value, 0);
-  DCHECK(buckets);
-  for (size_t i = 0; i < num_buckets; ++i) {
-    const Bucket& bucket = buckets[i];
-    if (original_value < bucket.boundary_end) {
-      return bucket.rounding * (original_value / bucket.rounding);
-    }
-  }
-  return buckets[num_buckets - 1].boundary_end;
-}
-
 UserActivityUkmLoggerImpl::UserActivityUkmLoggerImpl()
     : ukm_recorder_(ukm::UkmRecorder::Get()) {}
 
 UserActivityUkmLoggerImpl::~UserActivityUkmLoggerImpl() = default;
 
 void UserActivityUkmLoggerImpl::LogActivity(const UserActivityEvent& event) {
+  // Bucketize the features defined in UserActivityUkmLoggerBucketizer if
+  // present.
+  std::map<std::string, int> buckets =
+      UserActivityUkmLoggerBucketizer::BucketizeUserActivityEventData(event);
+
   DCHECK(ukm_recorder_);
   ukm::SourceId source_id = ukm_recorder_->GetNewSourceID();
   ukm::builders::UserActivity user_activity(source_id);
@@ -70,17 +36,13 @@
   user_activity.SetSequenceId(next_sequence_id_++)
       .SetDeviceMode(features.device_mode())
       .SetDeviceType(features.device_type())
-      .SetEventLogDuration(Bucketize(event.event().log_duration_sec(),
-                                     kEventLogDurationBuckets,
-                                     base::size(kEventLogDurationBuckets)))
+      .SetEventLogDuration(buckets[kEventLogDuration])
       .SetEventReason(event.event().reason())
       .SetEventType(event.event().type())
       .SetLastActivityDay(features.last_activity_day())
-      .SetLastActivityTime(std::floor(features.last_activity_time_sec() / 3600))
+      .SetLastActivityTime(buckets[kLastActivityTime])
       .SetRecentTimeActive(features.recent_time_active_sec())
-      .SetRecentVideoPlayingTime(Bucketize(
-          features.video_playing_time_sec(), kRecentVideoPlayingTimeBuckets,
-          base::size(kRecentVideoPlayingTimeBuckets)))
+      .SetRecentVideoPlayingTime(buckets[kRecentVideoPlayingTime])
       .SetScreenDimmedInitially(features.screen_dimmed_initially())
       .SetScreenDimOccurred(event.event().screen_dim_occurred())
       .SetScreenLockedInitially(features.screen_locked_initially())
@@ -96,8 +58,7 @@
   }
 
   if (features.has_last_user_activity_time_sec()) {
-    user_activity.SetLastUserActivityTime(
-        std::floor(features.last_user_activity_time_sec() / 3600));
+    user_activity.SetLastUserActivityTime(buckets[kLastUserActivityTime]);
   }
   if (features.has_time_since_last_key_sec()) {
     user_activity.SetTimeSinceLastKey(features.time_since_last_key_sec());
@@ -114,9 +75,7 @@
   }
 
   if (features.has_battery_percent()) {
-    user_activity.SetBatteryPercent(
-        Bucketize(std::floor(features.battery_percent()),
-                  kBatteryPercentBuckets, base::size(kBatteryPercentBuckets)));
+    user_activity.SetBatteryPercent(buckets[kBatteryPercent]);
   }
 
   if (features.has_device_management()) {
@@ -124,27 +83,19 @@
   }
 
   if (features.has_time_since_video_ended_sec()) {
-    user_activity.SetTimeSinceLastVideoEnded(Bucketize(
-        features.time_since_video_ended_sec(), kTimeSinceLastVideoEndedBuckets,
-        base::size(kTimeSinceLastVideoEndedBuckets)));
+    user_activity.SetTimeSinceLastVideoEnded(buckets[kTimeSinceLastVideoEnded]);
   }
 
   if (features.has_key_events_in_last_hour()) {
-    user_activity.SetKeyEventsInLastHour(
-        Bucketize(features.key_events_in_last_hour(), kUserInputEventBuckets,
-                  base::size(kUserInputEventBuckets)));
+    user_activity.SetKeyEventsInLastHour(buckets[kKeyEventsInLastHour]);
   }
 
   if (features.has_mouse_events_in_last_hour()) {
-    user_activity.SetMouseEventsInLastHour(
-        Bucketize(features.mouse_events_in_last_hour(), kUserInputEventBuckets,
-                  base::size(kUserInputEventBuckets)));
+    user_activity.SetMouseEventsInLastHour(buckets[kMouseEventsInLastHour]);
   }
 
   if (features.has_touch_events_in_last_hour()) {
-    user_activity.SetTouchEventsInLastHour(
-        Bucketize(features.touch_events_in_last_hour(), kUserInputEventBuckets,
-                  base::size(kUserInputEventBuckets)));
+    user_activity.SetTouchEventsInLastHour(buckets[kTouchEventsInLastHour]);
   }
 
   user_activity
@@ -156,9 +107,16 @@
   if (event.has_model_prediction()) {
     const UserActivityEvent::ModelPrediction& model_prediction =
         event.model_prediction();
-    user_activity.SetModelApplied(model_prediction.model_applied())
-        .SetModelDecisionThreshold(model_prediction.decision_threshold())
-        .SetModelInactivityScore(model_prediction.inactivity_score());
+    user_activity.SetModelResponse(model_prediction.response())
+        .SetModelApplied(model_prediction.model_applied());
+    if (model_prediction.response() ==
+            UserActivityEvent::ModelPrediction::DIM ||
+        model_prediction.response() ==
+            UserActivityEvent::ModelPrediction::NO_DIM) {
+      user_activity
+          .SetModelDecisionThreshold(model_prediction.decision_threshold())
+          .SetModelInactivityScore(model_prediction.inactivity_score());
+    }
   }
 
   user_activity.Record(ukm_recorder_);
diff --git a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h
index 31525b3..2974291 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h
+++ b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_impl.h
@@ -17,25 +17,6 @@
 
 class UserActivityUkmLoggerImpl : public UserActivityUkmLogger {
  public:
-  // Both |boundary_end| and |rounding| must be positive.
-  struct Bucket {
-    int boundary_end;
-    int rounding;
-  };
-
-  // Bucketize |original_value| using given |buckets|, which is an array of
-  // Bucket and must be sorted in ascending order of |boundary_end|.
-  // |original_value| must be non-negative. An example of |buckets| is
-  // {{60, 1}, {300, 10}, {600, 20}}. This function looks for the first
-  // |boundary_end| > |original_value| and bucket it to the nearest |rounding|.
-  // If |original_value| is greater than all |boundary_end|, the function
-  // returns the largest |boundary_end|. Using the above |buckets| example, the
-  // function will return 30 if |original_value| = 30, and 290 if
-  // |original_value| = 299.
-  static int Bucketize(int original_value,
-                       const Bucket* buckets,
-                       size_t num_buckets);
-
   UserActivityUkmLoggerImpl();
   ~UserActivityUkmLoggerImpl() override;
 
diff --git a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_unittest.cc b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_unittest.cc
index 840ddda9..cd333aff 100644
--- a/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_unittest.cc
+++ b/chrome/browser/chromeos/power/ml/user_activity_ukm_logger_unittest.cc
@@ -64,6 +64,7 @@
     prediction->set_decision_threshold(50);
     prediction->set_inactivity_score(60);
     prediction->set_model_applied(true);
+    prediction->set_response(UserActivityEvent::ModelPrediction::NO_DIM);
 
     user_activity_logger_delegate_ukm_.ukm_recorder_ = &recorder_;
   }
@@ -99,6 +100,7 @@
                                 UserActivity::kModelDecisionThresholdName, 50);
     recorder_.ExpectEntryMetric(entry, UserActivity::kModelInactivityScoreName,
                                 60);
+    recorder_.ExpectEntryMetric(entry, UserActivity::kModelResponseName, 1);
     recorder_.ExpectEntryMetric(entry, UserActivity::kMouseEventsInLastHourName,
                                 89);
     EXPECT_FALSE(recorder_.EntryHasMetric(entry, UserActivity::kOnBatteryName));
@@ -147,30 +149,6 @@
   DISALLOW_COPY_AND_ASSIGN(UserActivityUkmLoggerTest);
 };
 
-TEST_F(UserActivityUkmLoggerTest, BucketEveryFivePercents) {
-  const std::vector<int> original_values = {0, 14, 15, 100};
-  const std::vector<int> results = {0, 10, 15, 100};
-  constexpr UserActivityUkmLoggerImpl::Bucket buckets[] = {{100, 5}};
-
-  for (size_t i = 0; i < original_values.size(); ++i) {
-    EXPECT_EQ(results[i], UserActivityUkmLoggerImpl::Bucketize(
-                              original_values[i], buckets, arraysize(buckets)));
-  }
-}
-
-TEST_F(UserActivityUkmLoggerTest, Bucketize) {
-  const std::vector<int> original_values = {0,   18,  59,  60,  62,  69,  72,
-                                            299, 300, 306, 316, 599, 600, 602};
-  constexpr UserActivityUkmLoggerImpl::Bucket buckets[] = {
-      {60, 1}, {300, 10}, {600, 20}};
-  const std::vector<int> results = {0,   18,  59,  60,  60,  60,  70,
-                                    290, 300, 300, 300, 580, 600, 600};
-  for (size_t i = 0; i < original_values.size(); ++i) {
-    EXPECT_EQ(results[i], UserActivityUkmLoggerImpl::Bucketize(
-                              original_values[i], buckets, arraysize(buckets)));
-  }
-}
-
 TEST_F(UserActivityUkmLoggerTest, BasicLogging) {
   auto user_activity_event = user_activity_event_;
   UserActivityEvent::Features* features =
@@ -238,6 +216,11 @@
   features->set_dim_to_screen_off_sec(20);
   features->set_time_since_last_mouse_sec(200);
 
+  UserActivityEvent::ModelPrediction* prediction =
+      user_activity_event2.mutable_model_prediction();
+  prediction->set_model_applied(false);
+  prediction->set_response(UserActivityEvent::ModelPrediction::MODEL_ERROR);
+
   LogActivity(user_activity_event_);
   LogActivity(user_activity_event2);
 
@@ -277,6 +260,12 @@
       recorder_.EntryHasMetric(entry1, UserActivity::kTimeSinceLastKeyName));
   recorder_.ExpectEntryMetric(entry1, UserActivity::kTimeSinceLastMouseName,
                               200);
+  recorder_.ExpectEntryMetric(entry1, UserActivity::kModelResponseName, 2);
+  recorder_.ExpectEntryMetric(entry1, UserActivity::kModelAppliedName, 0);
+  EXPECT_FALSE(recorder_.EntryHasMetric(
+      entry1, UserActivity::kModelDecisionThresholdName));
+  EXPECT_FALSE(recorder_.EntryHasMetric(
+      entry1, UserActivity::kModelInactivityScoreName));
 
   EXPECT_EQ(0u, recorder_.GetEntriesByName(UserActivityId::kEntryName).size());
 }
diff --git a/chrome/browser/chromeos/power/power_prefs.h b/chrome/browser/chromeos/power/power_prefs.h
deleted file mode 100644
index 9d1b25d..0000000
--- a/chrome/browser/chromeos/power/power_prefs.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_CHROMEOS_POWER_POWER_PREFS_H_
-#define CHROME_BROWSER_CHROMEOS_POWER_POWER_PREFS_H_
-
-#include <memory>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/scoped_observer.h"
-#include "base/time/tick_clock.h"
-#include "chromeos/dbus/power_manager_client.h"
-#include "content/public/browser/notification_observer.h"
-#include "content/public/browser/notification_registrar.h"
-
-class PrefChangeRegistrar;
-class Profile;
-
-namespace power_manager {
-class ScreenIdleState;
-}
-
-namespace user_prefs {
-class PrefRegistrySyncable;
-}
-
-namespace chromeos {
-
-class PowerPolicyController;
-
-// Sends an updated power policy to the |power_policy_controller| whenever one
-// of the power-related prefs changes.
-class PowerPrefs : public PowerManagerClient::Observer,
-                   public content::NotificationObserver {
- public:
-  PowerPrefs(PowerPolicyController* power_policy_controller,
-             PowerManagerClient* power_manager_client);
-  ~PowerPrefs() override;
-
-  // Register power prefs with default values applicable to a user profile.
-  static void RegisterUserProfilePrefs(
-      user_prefs::PrefRegistrySyncable* registry);
-
-  // Register power prefs with default values applicable to the login profile.
-  static void RegisterLoginProfilePrefs(
-      user_prefs::PrefRegistrySyncable* registry);
-
-  void set_tick_clock_for_test(const base::TickClock* clock) {
-    tick_clock_ = clock;
-  }
-
-  // PowerManagerClient::Observer:
-  void ScreenIdleStateChanged(
-      const power_manager::ScreenIdleState& proto) override;
-
-  // content::NotificationObserver:
-  void Observe(int type,
-               const content::NotificationSource& source,
-               const content::NotificationDetails& details) override;
-
-  void UpdatePowerPolicyFromPrefs();
-
- private:
-  friend class PowerPrefsTest;
-
-  // Register power prefs whose default values are the same in user profiles and
-  // the login profile.
-  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
-
-  void SetProfile(Profile* profile);
-
-  PowerPolicyController* power_policy_controller_;  // Not owned.
-
-  content::NotificationRegistrar notification_registrar_;
-
-  ScopedObserver<PowerManagerClient, PowerManagerClient::Observer>
-      power_manager_client_observer_;
-
-  Profile* profile_ = nullptr;  // Not owned.
-  std::unique_ptr<PrefChangeRegistrar> pref_change_registrar_;
-
-  const base::TickClock* tick_clock_;  // Not owned.
-
-  // Time at which the screen was locked. Unset if the screen is unlocked.
-  base::TimeTicks screen_lock_time_;
-
-  // Time at which the screen was last turned off due to user inactivity.
-  // Unset if the screen isn't currently turned off due to user inactivity.
-  base::TimeTicks screen_idle_off_time_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerPrefs);
-};
-
-}  // namespace chromeos
-
-#endif  // CHROME_BROWSER_CHROMEOS_POWER_POWER_PREFS_H_
diff --git a/chrome/browser/chromeos/power/power_prefs_unittest.cc b/chrome/browser/chromeos/power/power_prefs_unittest.cc
deleted file mode 100644
index 3c70363..0000000
--- a/chrome/browser/chromeos/power/power_prefs_unittest.cc
+++ /dev/null
@@ -1,421 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/power/power_prefs.h"
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
-#include "base/memory/ref_counted.h"
-#include "base/test/simple_test_tick_clock.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
-#include "chrome/browser/chromeos/profiles/profile_helper.h"
-#include "chrome/browser/extensions/extension_special_storage_policy.h"
-#include "chrome/browser/prefs/browser_prefs.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/common/chrome_constants.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
-#include "chrome/test/base/testing_profile_manager.h"
-#include "chromeos/dbus/fake_power_manager_client.h"
-#include "chromeos/dbus/power_manager/idle.pb.h"
-#include "chromeos/dbus/power_manager/policy.pb.h"
-#include "chromeos/dbus/power_policy_controller.h"
-#include "components/account_id/account_id.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/prefs/pref_service.h"
-#include "components/sync_preferences/pref_service_syncable.h"
-#include "components/sync_preferences/testing_pref_service_syncable.h"
-#include "components/user_manager/scoped_user_manager.h"
-#include "content/public/browser/notification_details.h"
-#include "content/public/browser/notification_service.h"
-#include "content/public/browser/notification_source.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace chromeos {
-
-class PowerPrefsTest : public testing::Test {
- protected:
-  // Screen lock state that determines which delays are used by
-  // GetExpectedPowerPolicyForProfile().
-  enum ScreenLockState {
-    LOCKED,
-    UNLOCKED,
-  };
-
-  PowerPrefsTest();
-
-  // testing::Test:
-  void SetUp() override;
-  void TearDown() override;
-
-  const Profile* GetProfile() const;
-
-  std::string GetExpectedPowerPolicyForProfile(
-      Profile* profile,
-      ScreenLockState screen_lock_state) const;
-  std::string GetCurrentPowerPolicy() const;
-  bool GetExpectedAllowScreenWakeLocksForProfile(Profile* profile) const;
-  bool GetCurrentAllowScreenWakeLocks() const;
-
-  // Notify |power_prefs_| about various events.
-  void NotifySessionStarted();
-  void NotifyProfileDestroyed(Profile* profile);
-  void NotifyLockStateChanged(Profile* profile, ScreenLockState state);
-  void NotifyLoginOrLockScreenShown();
-  void NotifyScreenIdleOffChanged(bool off);
-
-  content::TestBrowserThreadBundle thread_bundle_;
-  TestingProfileManager profile_manager_;
-  PowerPolicyController* power_policy_controller_ = nullptr;  // Not owned.
-  std::unique_ptr<FakePowerManagerClient> fake_power_manager_client_;
-  base::SimpleTestTickClock tick_clock_;
-
-  std::unique_ptr<PowerPrefs> power_prefs_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerPrefsTest);
-};
-
-PowerPrefsTest::PowerPrefsTest()
-    : profile_manager_(TestingBrowserProcess::GetGlobal()),
-      fake_power_manager_client_(std::make_unique<FakePowerManagerClient>()) {}
-
-void PowerPrefsTest::SetUp() {
-  testing::Test::SetUp();
-
-  PowerPolicyController::Initialize(fake_power_manager_client_.get());
-  power_policy_controller_ = PowerPolicyController::Get();
-
-  ASSERT_TRUE(profile_manager_.SetUp());
-
-  power_prefs_ = std::make_unique<PowerPrefs>(power_policy_controller_,
-                                              fake_power_manager_client_.get());
-
-  // Advance the clock an arbitrary amount of time so it won't report zero.
-  tick_clock_.Advance(base::TimeDelta::FromSeconds(1));
-  power_prefs_->set_tick_clock_for_test(&tick_clock_);
-
-  EXPECT_FALSE(GetProfile());
-  EXPECT_EQ(PowerPolicyController::GetPolicyDebugString(
-                power_manager::PowerManagementPolicy()),
-            GetCurrentPowerPolicy());
-}
-
-void PowerPrefsTest::TearDown() {
-  power_prefs_.reset();
-  PowerPolicyController::Shutdown();
-  testing::Test::TearDown();
-}
-
-const Profile* PowerPrefsTest::GetProfile() const {
-  return power_prefs_->profile_;
-}
-
-std::string PowerPrefsTest::GetExpectedPowerPolicyForProfile(
-    Profile* profile,
-    ScreenLockState screen_lock_state) const {
-  const PrefService* prefs = profile->GetPrefs();
-  power_manager::PowerManagementPolicy expected_policy;
-  expected_policy.mutable_ac_delays()->set_screen_dim_ms(prefs->GetInteger(
-      screen_lock_state == LOCKED ? prefs::kPowerLockScreenDimDelayMs
-                                  : prefs::kPowerAcScreenDimDelayMs));
-  expected_policy.mutable_ac_delays()->set_screen_off_ms(prefs->GetInteger(
-      screen_lock_state == LOCKED ? prefs::kPowerLockScreenOffDelayMs
-                                  : prefs::kPowerAcScreenOffDelayMs));
-  expected_policy.mutable_ac_delays()->set_screen_lock_ms(
-      prefs->GetInteger(prefs::kPowerAcScreenLockDelayMs));
-  expected_policy.mutable_ac_delays()->set_idle_warning_ms(
-      prefs->GetInteger(prefs::kPowerAcIdleWarningDelayMs));
-  expected_policy.mutable_ac_delays()->set_idle_ms(
-      prefs->GetInteger(prefs::kPowerAcIdleDelayMs));
-  expected_policy.mutable_battery_delays()->set_screen_dim_ms(prefs->GetInteger(
-      screen_lock_state == LOCKED ? prefs::kPowerLockScreenDimDelayMs
-                                  : prefs::kPowerBatteryScreenDimDelayMs));
-  expected_policy.mutable_battery_delays()->set_screen_off_ms(prefs->GetInteger(
-      screen_lock_state == LOCKED ? prefs::kPowerLockScreenOffDelayMs
-                                  : prefs::kPowerBatteryScreenOffDelayMs));
-  expected_policy.mutable_battery_delays()->set_screen_lock_ms(
-      prefs->GetInteger(prefs::kPowerBatteryScreenLockDelayMs));
-  expected_policy.mutable_battery_delays()->set_idle_warning_ms(
-      prefs->GetInteger(prefs::kPowerBatteryIdleWarningDelayMs));
-  expected_policy.mutable_battery_delays()->set_idle_ms(
-      prefs->GetInteger(prefs::kPowerBatteryIdleDelayMs));
-  expected_policy.set_ac_idle_action(
-      static_cast<power_manager::PowerManagementPolicy_Action>(
-          prefs->GetInteger(prefs::kPowerAcIdleAction)));
-  expected_policy.set_battery_idle_action(
-      static_cast<power_manager::PowerManagementPolicy_Action>(
-          prefs->GetInteger(prefs::kPowerBatteryIdleAction)));
-  expected_policy.set_lid_closed_action(
-      static_cast<power_manager::PowerManagementPolicy_Action>(
-          prefs->GetInteger(prefs::kPowerLidClosedAction)));
-  expected_policy.set_use_audio_activity(
-      prefs->GetBoolean(prefs::kPowerUseAudioActivity));
-  expected_policy.set_use_video_activity(
-      prefs->GetBoolean(prefs::kPowerUseVideoActivity));
-  expected_policy.set_presentation_screen_dim_delay_factor(
-      prefs->GetDouble(prefs::kPowerPresentationScreenDimDelayFactor));
-  expected_policy.set_user_activity_screen_dim_delay_factor(
-      prefs->GetDouble(prefs::kPowerUserActivityScreenDimDelayFactor));
-  expected_policy.set_wait_for_initial_user_activity(
-      prefs->GetBoolean(prefs::kPowerWaitForInitialUserActivity));
-  expected_policy.set_force_nonzero_brightness_for_user_activity(
-      prefs->GetBoolean(prefs::kPowerForceNonzeroBrightnessForUserActivity));
-  expected_policy.set_reason("Prefs");
-  return PowerPolicyController::GetPolicyDebugString(expected_policy);
-}
-
-std::string PowerPrefsTest::GetCurrentPowerPolicy() const {
-  return PowerPolicyController::GetPolicyDebugString(
-      fake_power_manager_client_->policy());
-}
-
-bool PowerPrefsTest::GetCurrentAllowScreenWakeLocks() const {
-  return power_policy_controller_->honor_screen_wake_locks_;
-}
-
-bool PowerPrefsTest::GetExpectedAllowScreenWakeLocksForProfile(
-    Profile* profile) const {
-  return profile->GetPrefs()->GetBoolean(prefs::kPowerAllowScreenWakeLocks);
-}
-
-void PowerPrefsTest::NotifySessionStarted() {
-  power_prefs_->Observe(chrome::NOTIFICATION_SESSION_STARTED,
-                        content::Source<PowerPrefsTest>(this),
-                        content::NotificationService::NoDetails());
-}
-
-void PowerPrefsTest::NotifyProfileDestroyed(Profile* profile) {
-  power_prefs_->Observe(chrome::NOTIFICATION_PROFILE_DESTROYED,
-                        content::Source<Profile>(profile),
-                        content::NotificationService::NoDetails());
-}
-
-void PowerPrefsTest::NotifyLockStateChanged(Profile* profile,
-                                            ScreenLockState state) {
-  bool locked = (state == LOCKED);
-  power_prefs_->Observe(chrome::NOTIFICATION_SCREEN_LOCK_STATE_CHANGED,
-                        content::Source<Profile>(profile),
-                        content::Details<bool>(&locked));
-}
-
-void PowerPrefsTest::NotifyLoginOrLockScreenShown() {
-  power_prefs_->Observe(chrome::NOTIFICATION_LOGIN_OR_LOCK_WEBUI_VISIBLE,
-                        content::Source<PowerPrefsTest>(this),
-                        content::NotificationService::NoDetails());
-}
-
-void PowerPrefsTest::NotifyScreenIdleOffChanged(bool off) {
-  power_manager::ScreenIdleState proto;
-  proto.set_off(off);
-  fake_power_manager_client_->SendScreenIdleStateChanged(proto);
-}
-
-TEST_F(PowerPrefsTest, LoginScreen) {
-  // Set up login profile.
-  std::unique_ptr<sync_preferences::TestingPrefServiceSyncable>
-      login_profile_prefs(new sync_preferences::TestingPrefServiceSyncable);
-  RegisterLoginProfilePrefs(login_profile_prefs->registry());
-  TestingProfile::Builder builder;
-  builder.SetPath(
-      profile_manager_.profiles_dir().AppendASCII(chrome::kInitialProfile));
-  builder.SetPrefService(std::move(login_profile_prefs));
-  TestingProfile* login_profile = builder.BuildIncognito(
-      profile_manager_.CreateTestingProfile(chrome::kInitialProfile));
-
-  // Inform power_prefs_ that the login screen is being shown.
-  NotifyLoginOrLockScreenShown();
-  EXPECT_EQ(login_profile, GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
-            GetCurrentPowerPolicy());
-  EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(login_profile),
-            GetCurrentAllowScreenWakeLocks());
-
-  TestingProfile* other_profile =
-      profile_manager_.CreateTestingProfile("other");
-
-  // Inform power_prefs_ that an unrelated profile has been destroyed and verify
-  // that the login profile's power prefs are still being used.
-  NotifyProfileDestroyed(other_profile);
-  EXPECT_EQ(login_profile, GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
-            GetCurrentPowerPolicy());
-  EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(login_profile),
-            GetCurrentAllowScreenWakeLocks());
-
-  // Lock the screen and check that the expected delays are used.
-  NotifyLockStateChanged(login_profile, LOCKED);
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, LOCKED),
-            GetCurrentPowerPolicy());
-
-  // Unlock the screen.
-  NotifyLockStateChanged(login_profile, UNLOCKED);
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
-            GetCurrentPowerPolicy());
-
-  // Inform power_prefs_ that the login profile has been destroyed.
-  // The login profile's prefs should still be used.
-  NotifyProfileDestroyed(login_profile);
-  EXPECT_FALSE(GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(login_profile, UNLOCKED),
-            GetCurrentPowerPolicy());
-}
-
-class PowerPrefsUserSessionTest : public PowerPrefsTest {
- public:
-  PowerPrefsUserSessionTest();
-
- protected:
-  // PowerPrefsTest:
-  void SetUp() override;
-
-  std::vector<power_manager::PowerManagementPolicy_Action>
-  GetCurrentPowerPolicyActions() const {
-    return {fake_power_manager_client_->policy().ac_idle_action(),
-            fake_power_manager_client_->policy().battery_idle_action(),
-            fake_power_manager_client_->policy().lid_closed_action()};
-  }
-
-  TestingProfile* user_profile_ = nullptr;
-  TestingProfile* second_user_profile_ = nullptr;
-
- private:
-  FakeChromeUserManager* user_manager_;
-  user_manager::ScopedUserManager user_manager_enabler_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerPrefsUserSessionTest);
-};
-
-PowerPrefsUserSessionTest::PowerPrefsUserSessionTest()
-    : user_manager_(new FakeChromeUserManager),
-      user_manager_enabler_(base::WrapUnique(user_manager_)) {}
-
-void PowerPrefsUserSessionTest::SetUp() {
-  PowerPrefsTest::SetUp();
-
-  const char test_user1[] = "test-user1@example.com";
-  const AccountId test_account_id1(AccountId::FromUserEmail(test_user1));
-  user_manager_->AddUser(test_account_id1);
-  user_manager_->LoginUser(test_account_id1);
-  user_profile_ =
-      profile_manager_.CreateTestingProfile(test_account_id1.GetUserEmail());
-
-  const char test_user2[] = "test-user2@example.com";
-  const AccountId test_account_id2(AccountId::FromUserEmail(test_user2));
-  user_manager_->AddUser(test_account_id2);
-  user_manager_->LoginUser(test_account_id2);
-  second_user_profile_ =
-      profile_manager_.CreateTestingProfile(test_account_id2.GetUserEmail());
-
-  profile_manager_.SetLoggedIn(true);
-}
-
-TEST_F(PowerPrefsUserSessionTest, Basic) {
-  NotifySessionStarted();
-
-  EXPECT_EQ(user_profile_, GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-  EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile_),
-            GetCurrentAllowScreenWakeLocks());
-
-  // Inform power_prefs_ that an unrelated profile has been destroyed.
-  NotifyProfileDestroyed(second_user_profile_);
-
-  // Verify that the user profile's power prefs are still being used.
-  EXPECT_EQ(user_profile_, GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-  EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile_),
-            GetCurrentAllowScreenWakeLocks());
-
-  // Simulate the login screen coming up as part of screen locking.
-  NotifyLoginOrLockScreenShown();
-
-  // Verify that power policy didn't revert to login screen settings.
-  EXPECT_EQ(user_profile_, GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-  EXPECT_EQ(GetExpectedAllowScreenWakeLocksForProfile(user_profile_),
-            GetCurrentAllowScreenWakeLocks());
-
-  // Inform power_prefs_ that the session has ended and the user profile has
-  // been destroyed.
-  NotifyProfileDestroyed(user_profile_);
-
-  // The user profile's prefs should still be used.
-  EXPECT_FALSE(GetProfile());
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-}
-
-TEST_F(PowerPrefsUserSessionTest, AvoidLockDelaysAfterInactivity) {
-  NotifySessionStarted();
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-
-  // If the screen was already off due to inactivity when it was locked, we
-  // should continue using the unlocked delays.
-  NotifyScreenIdleOffChanged(true);
-  tick_clock_.Advance(base::TimeDelta::FromSeconds(5));
-  NotifyLockStateChanged(user_profile_, LOCKED);
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-
-  // If the screen turns on while still locked, we should switch to the locked
-  // delays.
-  tick_clock_.Advance(base::TimeDelta::FromSeconds(5));
-  NotifyScreenIdleOffChanged(false);
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, LOCKED),
-            GetCurrentPowerPolicy());
-
-  tick_clock_.Advance(base::TimeDelta::FromSeconds(5));
-  NotifyLockStateChanged(user_profile_, UNLOCKED);
-  EXPECT_EQ(GetExpectedPowerPolicyForProfile(user_profile_, UNLOCKED),
-            GetCurrentPowerPolicy());
-}
-
-TEST_F(PowerPrefsUserSessionTest, DisabledLockScreen) {
-  NotifySessionStarted();
-  EXPECT_EQ(user_profile_, GetProfile());
-
-  // Verify that the power policy actions are set to default values initially.
-  EXPECT_EQ(std::vector<power_manager::PowerManagementPolicy_Action>(
-                3, power_manager::PowerManagementPolicy_Action_SUSPEND),
-            GetCurrentPowerPolicyActions());
-
-  // The automatic screen locking is enabled, but, as the lock screen is
-  // allowed, the power policy actions still have the default values.
-  user_profile_->GetPrefs()->SetBoolean(prefs::kEnableAutoScreenLock, true);
-  EXPECT_EQ(std::vector<power_manager::PowerManagementPolicy_Action>(
-                3, power_manager::PowerManagementPolicy_Action_SUSPEND),
-            GetCurrentPowerPolicyActions());
-
-  // The lock screen is disabled, but, as automatic screen locking is not
-  // enabled, the power policy actions still have the default values.
-  user_profile_->GetPrefs()->ClearPref(prefs::kEnableAutoScreenLock);
-  user_profile_->GetPrefs()->SetBoolean(prefs::kAllowScreenLock, false);
-  EXPECT_EQ(std::vector<power_manager::PowerManagementPolicy_Action>(
-                3, power_manager::PowerManagementPolicy_Action_SUSPEND),
-            GetCurrentPowerPolicyActions());
-
-  // The automatic screen locking is enabled and the lock screen is disabled, so
-  // the power policy actions are set now to stop the user session.
-  user_profile_->GetPrefs()->SetBoolean(prefs::kEnableAutoScreenLock, true);
-  EXPECT_EQ(std::vector<power_manager::PowerManagementPolicy_Action>(
-                3, power_manager::PowerManagementPolicy_Action_STOP_SESSION),
-            GetCurrentPowerPolicyActions());
-}
-
-}  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/process_data_collector.cc b/chrome/browser/chromeos/power/process_data_collector.cc
index 7040e3e..449cfdc 100644
--- a/chrome/browser/chromeos/power/process_data_collector.cc
+++ b/chrome/browser/chromeos/power/process_data_collector.cc
@@ -29,7 +29,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/power/process_data_collector_unittest.cc b/chrome/browser/chromeos/power/process_data_collector_unittest.cc
index cb1f4fb1b..c10a08e 100644
--- a/chrome/browser/chromeos/power/process_data_collector_unittest.cc
+++ b/chrome/browser/chromeos/power/process_data_collector_unittest.cc
@@ -25,7 +25,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
index 25c14bf..14d4c79 100644
--- a/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
+++ b/chrome/browser/chromeos/printing/cups_print_job_manager_impl.cc
@@ -17,7 +17,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/timer/timer.h"
diff --git a/chrome/browser/chromeos/printing/external_printers.cc b/chrome/browser/chromeos/printing/external_printers.cc
index 2fad8933..c2219689 100644
--- a/chrome/browser/chromeos/printing/external_printers.cc
+++ b/chrome/browser/chromeos/printing/external_printers.cc
@@ -13,7 +13,7 @@
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
diff --git a/chrome/browser/chromeos/printing/printer_info_cups.cc b/chrome/browser/chromeos/printing/printer_info_cups.cc
index 4c0d571d..4b5bc8f7 100644
--- a/chrome/browser/chromeos/printing/printer_info_cups.cc
+++ b/chrome/browser/chromeos/printing/printer_info_cups.cc
@@ -11,8 +11,8 @@
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/version.h"
 #include "printing/backend/cups_jobs.h"
diff --git a/chrome/browser/chromeos/printing/printer_info_stub.cc b/chrome/browser/chromeos/printing/printer_info_stub.cc
index 474c4049..7b752319 100644
--- a/chrome/browser/chromeos/printing/printer_info_stub.cc
+++ b/chrome/browser/chromeos/printing/printer_info_stub.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/chromeos/printing/printer_info.h"
 
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace chromeos {
 
diff --git a/chrome/browser/chromeos/printing/printers_sync_bridge.cc b/chrome/browser/chromeos/printing/printers_sync_bridge.cc
index 538e1942..1d18aa6 100644
--- a/chrome/browser/chromeos/printing/printers_sync_bridge.cc
+++ b/chrome/browser/chromeos/printing/printers_sync_bridge.cc
@@ -13,7 +13,7 @@
 #include "base/bind.h"
 #include "base/optional.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/printing/specifics_translation.h"
 #include "components/sync/base/report_unrecoverable_error.h"
 #include "components/sync/model/model_type_change_processor.h"
diff --git a/chrome/browser/chromeos/settings/device_oauth2_token_service_unittest.cc b/chrome/browser/chromeos/settings/device_oauth2_token_service_unittest.cc
index 7d336f1..4839bffe 100644
--- a/chrome/browser/chromeos/settings/device_oauth2_token_service_unittest.cc
+++ b/chrome/browser/chromeos/settings/device_oauth2_token_service_unittest.cc
@@ -11,7 +11,7 @@
 #include <utility>
 
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/policy/device_policy_builder.h"
 #include "chrome/browser/chromeos/settings/cros_settings.h"
diff --git a/chrome/browser/chromeos/settings/session_manager_operation.cc b/chrome/browser/chromeos/settings/session_manager_operation.cc
index 7445f20..94c77af 100644
--- a/chrome/browser/chromeos/settings/session_manager_operation.cc
+++ b/chrome/browser/chromeos/settings/session_manager_operation.cc
@@ -11,8 +11,8 @@
 #include "base/files/file_path.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "chrome/browser/net/nss_context.h"
 #include "components/ownership/owner_key_util.h"
diff --git a/chrome/browser/chromeos/smb_client/smb_file_system.cc b/chrome/browser/chromeos/smb_client/smb_file_system.cc
index 36b2ac4..bed0087c 100644
--- a/chrome/browser/chromeos/smb_client/smb_file_system.cc
+++ b/chrome/browser/chromeos/smb_client/smb_file_system.cc
@@ -10,7 +10,7 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "base/posix/eintr_wrapper.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/file_system_provider/service.h"
 #include "chrome/browser/chromeos/smb_client/smb_errors.h"
 #include "chrome/browser/chromeos/smb_client/smb_file_system_id.h"
diff --git a/chrome/browser/chromeos/smb_client/smb_service.cc b/chrome/browser/chromeos/smb_client/smb_service.cc
index cd12480..8161061b 100644
--- a/chrome/browser/chromeos/smb_client/smb_service.cc
+++ b/chrome/browser/chromeos/smb_client/smb_service.cc
@@ -7,7 +7,7 @@
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/browser/chromeos/smb_client/discovery/mdns_host_locator.h"
diff --git a/chrome/browser/chromeos/system/automatic_reboot_manager.cc b/chrome/browser/chromeos/system/automatic_reboot_manager.cc
index 3f2378f..9cf1c733 100644
--- a/chrome/browser/chromeos/system/automatic_reboot_manager.cc
+++ b/chrome/browser/chromeos/system/automatic_reboot_manager.cc
@@ -24,7 +24,7 @@
 #include "base/path_service.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/tick_clock.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc b/chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc
index 17ee6fe..a1729291 100644
--- a/chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc
+++ b/chrome/browser/chromeos/system/automatic_reboot_manager_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/test/test_mock_time_task_runner.h"
diff --git a/chrome/browser/chromeos/system_logs/command_line_log_source.cc b/chrome/browser/chromeos/system_logs/command_line_log_source.cc
index cca41b9..5277a11 100644
--- a/chrome/browser/chromeos/system_logs/command_line_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/command_line_log_source.cc
@@ -16,7 +16,7 @@
 #include "base/logging.h"
 #include "base/process/launch.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 
 using content::BrowserThread;
diff --git a/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc b/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc
index 6dd557bd..1dc9a99 100644
--- a/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc
@@ -15,7 +15,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/profiles/profile_helper.h"
 #include "chrome/common/chrome_switches.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
diff --git a/chrome/browser/chromeos/system_logs/debug_log_writer.cc b/chrome/browser/chromeos/system_logs/debug_log_writer.cc
index c7f6721..c4c07ad 100644
--- a/chrome/browser/chromeos/system_logs/debug_log_writer.cc
+++ b/chrome/browser/chromeos/system_logs/debug_log_writer.cc
@@ -16,8 +16,8 @@
 #include "base/process/kill.h"
 #include "base/process/launch.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
 #include "chrome/common/logging_chrome.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/debug_daemon_client.h"
diff --git a/chrome/browser/chromeos/system_logs/iwlwifi_dump_log_source.cc b/chrome/browser/chromeos/system_logs/iwlwifi_dump_log_source.cc
index 6d404c89..0230163 100644
--- a/chrome/browser/chromeos/system_logs/iwlwifi_dump_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/iwlwifi_dump_log_source.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/chromeos/system_logs/iwlwifi_dump_log_source.h"
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/browser/chromeos/system_logs/single_log_file_log_source.cc b/chrome/browser/chromeos/system_logs/single_log_file_log_source.cc
index 8046436..1810875 100644
--- a/chrome/browser/chromeos/system_logs/single_log_file_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/single_log_file_log_source.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/process/process_info.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/chromeos/system_logs/touch_log_source.cc b/chrome/browser/chromeos/system_logs/touch_log_source.cc
index 28c31e0..1af1a5ef 100644
--- a/chrome/browser/chromeos/system_logs/touch_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/touch_log_source.cc
@@ -16,7 +16,7 @@
 #include "base/json/json_string_value_serializer.h"
 #include "base/logging.h"
 #include "base/process/launch.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browser_process_platform_part_chromeos.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/chromeos/tpm_firmware_update.cc b/chrome/browser/chromeos/tpm_firmware_update.cc
index da1532d4..04ede59 100644
--- a/chrome/browser/chromeos/tpm_firmware_update.cc
+++ b/chrome/browser/chromeos/tpm_firmware_update.cc
@@ -14,7 +14,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
diff --git a/chrome/browser/component_updater/component_patcher_operation_browsertest.cc b/chrome/browser/component_updater/component_patcher_operation_browsertest.cc
index 490c4eba..a7c8508 100644
--- a/chrome/browser/component_updater/component_patcher_operation_browsertest.cc
+++ b/chrome/browser/component_updater/component_patcher_operation_browsertest.cc
@@ -13,8 +13,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "components/services/patch/public/cpp/patch.h"
diff --git a/chrome/browser/component_updater/crl_set_component_installer.cc b/chrome/browser/component_updater/crl_set_component_installer.cc
index 3e8d00f..eaf4f0a 100644
--- a/chrome/browser/component_updater/crl_set_component_installer.cc
+++ b/chrome/browser/component_updater/crl_set_component_installer.cc
@@ -11,7 +11,7 @@
 #include "base/bind.h"
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/component_updater/component_installer.h"
 #include "components/component_updater/component_updater_service.h"
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.cc b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
index 721835d..8272a83 100644
--- a/chrome/browser/component_updater/cros_component_installer_chromeos.cc
+++ b/chrome/browser/component_updater/cros_component_installer_chromeos.cc
@@ -11,7 +11,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/component_updater/component_installer_errors.h"
 #include "chrome/browser/component_updater/metadata_table_chromeos.h"
@@ -230,8 +231,8 @@
     LoadInternal(name, std::move(load_callback));
   } else {
     // A compatible component is installed, do not load it.
-    base::PostTask(FROM_HERE,
-                   base::BindOnce(std::move(load_callback),
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(load_callback),
                                   ReportError(Error::NONE), base::FilePath()));
   }
 }
@@ -298,8 +299,8 @@
                                    LoadCallback load_callback) {
   const ComponentConfig* config = FindConfig(name);
   if (!config) {
-    base::PostTask(FROM_HERE,
-                   base::BindOnce(std::move(load_callback),
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(load_callback),
                                   ReportError(Error::UNKNOWN_COMPONENT),
                                   base::FilePath()));
     return;
@@ -327,15 +328,15 @@
                                          LoadCallback load_callback,
                                          update_client::Error error) {
   if (error != update_client::Error::NONE) {
-    base::PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(load_callback),
                        ReportError(Error::INSTALL_FAILURE), base::FilePath()));
   } else if (mount_policy == MountPolicy::kMount) {
     LoadInternal(name, std::move(load_callback));
   } else {
-    base::PostTask(FROM_HERE,
-                   base::BindOnce(std::move(load_callback),
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(load_callback),
                                   ReportError(Error::NONE), base::FilePath()));
   }
 }
@@ -354,7 +355,7 @@
                            base::Unretained(this), std::move(load_callback),
                            base::TimeTicks::Now(), name));
   } else {
-    base::PostTask(
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(load_callback),
                        ReportError(Error::COMPATIBILITY_CHECK_FAILED),
@@ -370,13 +371,14 @@
   UMA_HISTOGRAM_LONG_TIMES("ComponentUpdater.ChromeOS.MountTime",
                            base::TimeTicks::Now() - start_time);
   if (!result.has_value()) {
-    base::PostTask(FROM_HERE, base::BindOnce(std::move(load_callback),
-                                             ReportError(Error::MOUNT_FAILURE),
-                                             base::FilePath()));
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(std::move(load_callback),
+                       ReportError(Error::MOUNT_FAILURE), base::FilePath()));
   } else {
     metadata_table_->AddComponentForCurrentUser(name);
-    base::PostTask(FROM_HERE,
-                   base::BindOnce(std::move(load_callback),
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(load_callback),
                                   ReportError(Error::NONE), result.value()));
   }
 }
diff --git a/chrome/browser/component_updater/cros_component_installer_chromeos.h b/chrome/browser/component_updater/cros_component_installer_chromeos.h
index 412360a..4164897 100644
--- a/chrome/browser/component_updater/cros_component_installer_chromeos.h
+++ b/chrome/browser/component_updater/cros_component_installer_chromeos.h
@@ -113,6 +113,7 @@
   void SetDelegate(Delegate* delegate);
 
   // Installs a component and keeps it up-to-date.
+  // The |load_callback| is run on the calling thread.
   void Load(const std::string& name,
             MountPolicy mount_policy,
             UpdatePolicy update_policy,
diff --git a/chrome/browser/component_updater/file_type_policies_component_installer.cc b/chrome/browser/component_updater/file_type_policies_component_installer.cc
index eef4b5c..d5ed6efd 100644
--- a/chrome/browser/component_updater/file_type_policies_component_installer.cc
+++ b/chrome/browser/component_updater/file_type_policies_component_installer.cc
@@ -16,7 +16,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "chrome/common/safe_browsing/file_type_policies.h"
 #include "components/component_updater/component_updater_paths.h"
diff --git a/chrome/browser/component_updater/mei_preload_component_installer.cc b/chrome/browser/component_updater/mei_preload_component_installer.cc
index aff0876..a36bda5 100644
--- a/chrome/browser/component_updater/mei_preload_component_installer.cc
+++ b/chrome/browser/component_updater/mei_preload_component_installer.cc
@@ -16,7 +16,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "chrome/browser/media/media_engagement_preloaded_list.h"
 #include "components/component_updater/component_updater_paths.h"
diff --git a/chrome/browser/component_updater/optimization_hints_component_installer.cc b/chrome/browser/component_updater/optimization_hints_component_installer.cc
index 10871319..7e051da 100644
--- a/chrome/browser/component_updater/optimization_hints_component_installer.cc
+++ b/chrome/browser/component_updater/optimization_hints_component_installer.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/component_updater/pepper_flash_component_installer.cc b/chrome/browser/component_updater/pepper_flash_component_installer.cc
index e5f0d91..7eb598bd 100644
--- a/chrome/browser/component_updater/pepper_flash_component_installer.cc
+++ b/chrome/browser/component_updater/pepper_flash_component_installer.cc
@@ -25,7 +25,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "build/build_config.h"
 #include "chrome/browser/component_updater/component_installer_errors.h"
diff --git a/chrome/browser/component_updater/pnacl_component_installer.cc b/chrome/browser/component_updater/pnacl_component_installer.cc
index 83f0ac7..339eb50 100644
--- a/chrome/browser/component_updater/pnacl_component_installer.cc
+++ b/chrome/browser/component_updater/pnacl_component_installer.cc
@@ -23,7 +23,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
diff --git a/chrome/browser/component_updater/recovery_component_installer.cc b/chrome/browser/component_updater/recovery_component_installer.cc
index 07a112c85..201999dd 100644
--- a/chrome/browser/component_updater/recovery_component_installer.cc
+++ b/chrome/browser/component_updater/recovery_component_installer.cc
@@ -18,7 +18,7 @@
 #include "base/files/file_util.h"
 #include "base/json/json_file_value_serializer.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #if defined(OS_MACOSX)
 #include "base/mac/authorization_util.h"
 #include "base/mac/scoped_authorizationref.h"
diff --git a/chrome/browser/component_updater/ssl_error_assistant_component_installer.cc b/chrome/browser/component_updater/ssl_error_assistant_component_installer.cc
index 57a0e59..3f885d4 100644
--- a/chrome/browser/component_updater/ssl_error_assistant_component_installer.cc
+++ b/chrome/browser/component_updater/ssl_error_assistant_component_installer.cc
@@ -11,7 +11,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/ssl/ssl_error_handler.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/component_updater/sth_set_component_installer.cc b/chrome/browser/component_updater/sth_set_component_installer.cc
index 295e9a6..fa3963b4 100644
--- a/chrome/browser/component_updater/sth_set_component_installer.cc
+++ b/chrome/browser/component_updater/sth_set_component_installer.cc
@@ -16,7 +16,7 @@
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
diff --git a/chrome/browser/component_updater/supervised_user_whitelist_installer.cc b/chrome/browser/component_updater/supervised_user_whitelist_installer.cc
index 1168ac8d..19610bf 100644
--- a/chrome/browser/component_updater/supervised_user_whitelist_installer.cc
+++ b/chrome/browser/component_updater/supervised_user_whitelist_installer.cc
@@ -26,8 +26,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/value_conversions.h"
 #include "base/values.h"
diff --git a/chrome/browser/component_updater/vr_assets_component_installer.cc b/chrome/browser/component_updater/vr_assets_component_installer.cc
index 016d8b7..1fdd69b 100644
--- a/chrome/browser/component_updater/vr_assets_component_installer.cc
+++ b/chrome/browser/component_updater/vr_assets_component_installer.cc
@@ -16,7 +16,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "build/build_config.h"
 #include "chrome/browser/vr/assets_loader.h"
diff --git a/chrome/browser/component_updater/widevine_cdm_component_installer.cc b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
index cf27f20d..3ba612a9 100644
--- a/chrome/browser/component_updater/widevine_cdm_component_installer.cc
+++ b/chrome/browser/component_updater/widevine_cdm_component_installer.cc
@@ -26,7 +26,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "components/component_updater/component_installer.h"
diff --git a/chrome/browser/conflicts/enumerate_input_method_editors_win.cc b/chrome/browser/conflicts/enumerate_input_method_editors_win.cc
index a4cadc7..45883b6 100644
--- a/chrome/browser/conflicts/enumerate_input_method_editors_win.cc
+++ b/chrome/browser/conflicts/enumerate_input_method_editors_win.cc
@@ -16,7 +16,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/win/registry.h"
 #include "chrome/browser/conflicts/module_info_util_win.h"
diff --git a/chrome/browser/conflicts/enumerate_shell_extensions_win.cc b/chrome/browser/conflicts/enumerate_shell_extensions_win.cc
index 9e878c6..d59c93b6 100644
--- a/chrome/browser/conflicts/enumerate_shell_extensions_win.cc
+++ b/chrome/browser/conflicts/enumerate_shell_extensions_win.cc
@@ -12,8 +12,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string16.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/win/registry.h"
diff --git a/chrome/browser/conflicts/module_blacklist_cache_updater_win.cc b/chrome/browser/conflicts/module_blacklist_cache_updater_win.cc
index a5e5bae..b646d71 100644
--- a/chrome/browser/conflicts/module_blacklist_cache_updater_win.cc
+++ b/chrome/browser/conflicts/module_blacklist_cache_updater_win.cc
@@ -18,7 +18,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/sha1.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/time/time.h"
 #include "base/win/registry.h"
diff --git a/chrome/browser/conflicts/module_database_win.cc b/chrome/browser/conflicts/module_database_win.cc
index e31d10f..53350cd 100644
--- a/chrome/browser/conflicts/module_database_win.cc
+++ b/chrome/browser/conflicts/module_database_win.cc
@@ -14,7 +14,7 @@
 
 #if defined(GOOGLE_CHROME_BUILD)
 #include "base/feature_list.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/conflicts/incompatible_applications_updater_win.h"
 #include "chrome/browser/conflicts/module_load_attempt_log_listener_win.h"
diff --git a/chrome/browser/conflicts/module_database_win_unittest.cc b/chrome/browser/conflicts/module_database_win_unittest.cc
index 5cf5978e..4ba3bdb 100644
--- a/chrome/browser/conflicts/module_database_win_unittest.cc
+++ b/chrome/browser/conflicts/module_database_win_unittest.cc
@@ -9,8 +9,8 @@
 #include <vector>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/conflicts/module_event_sink_impl_win.cc b/chrome/browser/conflicts/module_event_sink_impl_win.cc
index 6904a3fa..9c116e8 100644
--- a/chrome/browser/conflicts/module_event_sink_impl_win.cc
+++ b/chrome/browser/conflicts/module_event_sink_impl_win.cc
@@ -16,7 +16,7 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/conflicts/module_database_win.h"
 #include "chrome/common/conflicts/module_watcher_win.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/conflicts/module_inspector_win.cc b/chrome/browser/conflicts/module_inspector_win.cc
index f6b7471..c678c457 100644
--- a/chrome/browser/conflicts/module_inspector_win.cc
+++ b/chrome/browser/conflicts/module_inspector_win.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "chrome/browser/after_startup_task_utils.h"
 
diff --git a/chrome/browser/conflicts/module_inspector_win.h b/chrome/browser/conflicts/module_inspector_win.h
index 2e8b658..92ad77b 100644
--- a/chrome/browser/conflicts/module_inspector_win.h
+++ b/chrome/browser/conflicts/module_inspector_win.h
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/conflicts/module_info_win.h"
 
diff --git a/chrome/browser/conflicts/module_load_attempt_log_listener_win.cc b/chrome/browser/conflicts/module_load_attempt_log_listener_win.cc
index df2a8a91..1fd45e5 100644
--- a/chrome/browser/conflicts/module_load_attempt_log_listener_win.cc
+++ b/chrome/browser/conflicts/module_load_attempt_log_listener_win.cc
@@ -15,7 +15,7 @@
 #include "base/sha1.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "chrome/browser/conflicts/module_blacklist_cache_util_win.h"
 #include "chrome_elf/third_party_dlls/logging_api.h"
diff --git a/chrome/browser/conflicts/third_party_conflicts_manager_win.cc b/chrome/browser/conflicts/third_party_conflicts_manager_win.cc
index df4d0ca..5784dfc 100644
--- a/chrome/browser/conflicts/third_party_conflicts_manager_win.cc
+++ b/chrome/browser/conflicts/third_party_conflicts_manager_win.cc
@@ -16,7 +16,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_service.cc b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_service.cc
index 6a134106..de12e51 100644
--- a/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_service.cc
+++ b/chrome/browser/data_use_measurement/page_load_capping/page_load_capping_service.cc
@@ -8,7 +8,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/default_clock.h"
 #include "chrome/browser/data_use_measurement/page_load_capping/chrome_page_load_capping_features.h"
 #include "chrome/browser/data_use_measurement/page_load_capping/page_load_capping_blacklist.h"
diff --git a/chrome/browser/dbus/dbus_thread_linux.cc b/chrome/browser/dbus/dbus_thread_linux.cc
index 1ac4b4f..9cadf747 100644
--- a/chrome/browser/dbus/dbus_thread_linux.cc
+++ b/chrome/browser/dbus/dbus_thread_linux.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/dbus/dbus_thread_linux.h"
 
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 
 namespace chrome {
 
diff --git a/chrome/browser/devtools/device/android_device_manager.cc b/chrome/browser/devtools/device/android_device_manager.cc
index 43db7ac..3a8443b 100644
--- a/chrome/browser/devtools/device/android_device_manager.cc
+++ b/chrome/browser/devtools/device/android_device_manager.cc
@@ -16,7 +16,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
diff --git a/chrome/browser/devtools/devtools_file_helper.cc b/chrome/browser/devtools/devtools_file_helper.cc
index b0f4cca..0cc55275 100644
--- a/chrome/browser/devtools/devtools_file_helper.cc
+++ b/chrome/browser/devtools/devtools_file_helper.cc
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/md5.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/value_conversions.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/devtools/devtools_file_system_indexer.cc b/chrome/browser/devtools/devtools_file_system_indexer.cc
index dc69e66..f682861 100644
--- a/chrome/browser/devtools/devtools_file_system_indexer.cc
+++ b/chrome/browser/devtools/devtools_file_system_indexer.cc
@@ -19,8 +19,8 @@
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
 
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/devtools/devtools_file_watcher.cc b/chrome/browser/devtools/devtools_file_watcher.cc
index e69a4aa..55f5c13b 100644
--- a/chrome/browser/devtools/devtools_file_watcher.cc
+++ b/chrome/browser/devtools/devtools_file_watcher.cc
@@ -16,7 +16,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
index a70501c..eb3cdcd5 100644
--- a/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
+++ b/chrome/browser/dom_distiller/dom_distiller_service_factory.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/dom_distiller/content/browser/distiller_page_web_contents.h"
diff --git a/chrome/browser/downgrade/user_data_downgrade.cc b/chrome/browser/downgrade/user_data_downgrade.cc
index 2bc0c404..647dee76 100644
--- a/chrome/browser/downgrade/user_data_downgrade.cc
+++ b/chrome/browser/downgrade/user_data_downgrade.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/version.h"
 #include "base/win/registry.h"
diff --git a/chrome/browser/downgrade/user_data_downgrade_browsertest.cc b/chrome/browser/downgrade/user_data_downgrade_browsertest.cc
index 675cb744..a4dfa27 100644
--- a/chrome/browser/downgrade/user_data_downgrade_browsertest.cc
+++ b/chrome/browser/downgrade/user_data_downgrade_browsertest.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/test_reg_util_win.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/version.h"
diff --git a/chrome/browser/download/chrome_download_manager_delegate.cc b/chrome/browser/download/chrome_download_manager_delegate.cc
index fe4dfa9..c2132c3 100644
--- a/chrome/browser/download/chrome_download_manager_delegate.cc
+++ b/chrome/browser/download/chrome_download_manager_delegate.cc
@@ -17,7 +17,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/download/download_commands.cc b/chrome/browser/download/download_commands.cc
index fe19dca..da1cc938 100644
--- a/chrome/browser/download/download_commands.cc
+++ b/chrome/browser/download/download_commands.cc
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/download/download_crx_util.h"
diff --git a/chrome/browser/download/download_path_reservation_tracker.cc b/chrome/browser/download/download_path_reservation_tracker.cc
index 28e3b04..79d822b 100644
--- a/chrome/browser/download/download_path_reservation_tracker.cc
+++ b/chrome/browser/download/download_path_reservation_tracker.cc
@@ -21,8 +21,8 @@
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/third_party/icu/icu_utf.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/download/download_service_factory.cc b/chrome/browser/download/download_service_factory.cc
index e3e9784..619e5f7 100644
--- a/chrome/browser/download/download_service_factory.cc
+++ b/chrome/browser/download/download_service_factory.cc
@@ -12,8 +12,8 @@
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/background_fetch/background_fetch_download_client.h"
 #include "chrome/browser/download/download_task_scheduler_impl.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc
index 937c33b..9f7c7dd 100644
--- a/chrome/browser/download/download_target_determiner.cc
+++ b/chrome/browser/download/download_target_determiner.cc
@@ -11,7 +11,7 @@
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/download/download_task_scheduler_impl.cc b/chrome/browser/download/download_task_scheduler_impl.cc
index 9df6b41..325ae9b 100644
--- a/chrome/browser/download/download_task_scheduler_impl.cc
+++ b/chrome/browser/download/download_task_scheduler_impl.cc
@@ -7,8 +7,8 @@
 #include "base/bind.h"
 #include "base/cancelable_callback.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "chrome/browser/download/download_service_factory.h"
diff --git a/chrome/browser/download/image_thumbnail_request.cc b/chrome/browser/download/image_thumbnail_request.cc
index 24b8751..8c82a9c 100644
--- a/chrome/browser/download/image_thumbnail_request.cc
+++ b/chrome/browser/download/image_thumbnail_request.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
 #include "skia/ext/image_operations.h"
diff --git a/chrome/browser/download/notification/download_item_notification.cc b/chrome/browser/download/notification/download_item_notification.cc
index cac3328..79823d26 100644
--- a/chrome/browser/download/notification/download_item_notification.cc
+++ b/chrome/browser/download/notification/download_item_notification.cc
@@ -11,7 +11,7 @@
 #include "base/files/file_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/note_taking_helper.h"
diff --git a/chrome/browser/extensions/activity_log/activity_log_task_runner.cc b/chrome/browser/extensions/activity_log/activity_log_task_runner.cc
index 7d943c6..33b31cf 100644
--- a/chrome/browser/extensions/activity_log/activity_log_task_runner.cc
+++ b/chrome/browser/extensions/activity_log/activity_log_task_runner.cc
@@ -5,8 +5,8 @@
 #include "chrome/browser/extensions/activity_log/activity_log_task_runner.h"
 
 #include "base/single_thread_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/single_thread_task_runner_thread_mode_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
 
 namespace extensions {
 
diff --git a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
index ff450ea..5d6b31d 100644
--- a/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
+++ b/chrome/browser/extensions/api/bookmarks/bookmarks_api.cc
@@ -21,7 +21,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/bookmarks/bookmark_html_writer.h"
diff --git a/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc b/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
index 0936ad4..04e43c13 100644
--- a/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
+++ b/chrome/browser/extensions/api/braille_display_private/braille_controller_brlapi.cc
@@ -15,7 +15,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/extensions/api/braille_display_private/brlapi_connection.h"
 #include "chrome/browser/extensions/api/braille_display_private/brlapi_keycode_map.h"
diff --git a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
index 0309e0e..c08b846 100644
--- a/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
+++ b/chrome/browser/extensions/api/browsing_data/browsing_data_api.cc
@@ -14,7 +14,7 @@
 #include "base/values.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
 #include "chrome/browser/plugins/plugin_data_remover_helper.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
index 11947f5c..60f93b72 100644
--- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
+++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -242,7 +242,7 @@
     content::RenderFrameHost* const main_frame = web_contents()->GetMainFrame();
     result = content::DesktopStreamsRegistry::GetInstance()->RegisterStream(
         main_frame->GetProcess()->GetID(), main_frame->GetRoutingID(), origin_,
-        source, extension()->name());
+        source, extension()->name(), content::kRegistryStreamTypeDesktop);
   }
 
   Options options;
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index fcb8d29..2e7539d 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/extensions/api/developer_private/developer_private_mangle.h"
 #include "chrome/browser/extensions/api/developer_private/entry_picker.h"
diff --git a/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc b/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc
index 1daf4f5..72e1f640 100644
--- a/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc
+++ b/chrome/browser/extensions/api/easy_unlock_private/easy_unlock_private_api.cc
@@ -13,7 +13,7 @@
 #include "base/lazy_instance.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
index 92cefd0..22830d6 100644
--- a/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/image_writer_utility_client_browsertest.cc
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/extensions/api/image_writer_private/operation.h"
 #include "chrome/services/removable_storage_writer/public/mojom/removable_storage_writer.mojom.h"
diff --git a/chrome/browser/extensions/api/image_writer_private/operation.cc b/chrome/browser/extensions/api/image_writer_private/operation.cc
index ee3af79..2532e8e 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation.cc
+++ b/chrome/browser/extensions/api/image_writer_private/operation.cc
@@ -8,7 +8,7 @@
 
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
 #include "chrome/browser/extensions/api/image_writer_private/operation_manager.h"
diff --git a/chrome/browser/extensions/api/image_writer_private/operation.h b/chrome/browser/extensions/api/image_writer_private/operation.h
index 57d7cd9..a8e181c 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation.h
+++ b/chrome/browser/extensions/api/image_writer_private/operation.h
@@ -16,7 +16,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h"
 #include "chrome/common/extensions/api/image_writer_private.h"
diff --git a/chrome/browser/extensions/api/image_writer_private/operation_chromeos.cc b/chrome/browser/extensions/api/image_writer_private/operation_chromeos.cc
index 56b8332..af24359 100644
--- a/chrome/browser/extensions/api/image_writer_private/operation_chromeos.cc
+++ b/chrome/browser/extensions/api/image_writer_private/operation_chromeos.cc
@@ -8,6 +8,7 @@
 #include "chrome/browser/extensions/api/image_writer_private/operation.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/image_burner_client.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc
index 8a93e3e..a0f60c4 100644
--- a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc
+++ b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider.cc
@@ -5,7 +5,7 @@
 
 #include "chrome/browser/extensions/api/image_writer_private/removable_storage_provider.h"
 #include "base/lazy_instance.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc
index c359977..525557c 100644
--- a/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc
+++ b/chrome/browser/extensions/api/image_writer_private/removable_storage_provider_chromeos.cc
@@ -3,6 +3,8 @@
 // found in the LICENSE file.
 
 #include "chrome/browser/extensions/api/image_writer_private/removable_storage_provider.h"
+
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 
 namespace extensions {
@@ -10,6 +12,7 @@
 const char kUnknownSDDiskModel[] = "SD Card";
 const char kUnknownUSBDiskModel[] = "USB Drive";
 
+using chromeos::disks::Disk;
 using chromeos::disks::DiskMountManager;
 
 // The Chrome OS implementation takes advantage of the Chrome OS
@@ -26,7 +29,7 @@
   for (DiskMountManager::DiskMap::const_iterator iter = disks.begin();
        iter != disks.end();
        ++iter) {
-    const DiskMountManager::Disk& disk = *iter->second;
+    const Disk& disk = *iter->second;
     if (disk.is_parent() && !disk.on_boot_device() && disk.has_media() &&
         (disk.device_type() == chromeos::DEVICE_TYPE_USB ||
          disk.device_type() == chromeos::DEVICE_TYPE_SD)) {
diff --git a/chrome/browser/extensions/api/image_writer_private/test_utils.cc b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
index a18e4420..ede1dee6 100644
--- a/chrome/browser/extensions/api/image_writer_private/test_utils.cc
+++ b/chrome/browser/extensions/api/image_writer_private/test_utils.cc
@@ -9,7 +9,7 @@
 
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
@@ -18,6 +18,7 @@
 #if defined(OS_CHROMEOS)
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_image_burner_client.h"
+#include "chromeos/disks/disk.h"
 #endif
 
 namespace extensions {
diff --git a/chrome/browser/extensions/api/image_writer_private/unzip_helper.cc b/chrome/browser/extensions/api/image_writer_private/unzip_helper.cc
index 63d7cf9d..41f1ecc 100644
--- a/chrome/browser/extensions/api/image_writer_private/unzip_helper.cc
+++ b/chrome/browser/extensions/api/image_writer_private/unzip_helper.cc
@@ -8,7 +8,7 @@
 
 #include "base/files/file_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
 #include "third_party/zlib/google/zip_reader.h"
 
diff --git a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
index 8aeb9ec..76c89a15 100644
--- a/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
+++ b/chrome/browser/extensions/api/image_writer_private/write_from_url_operation_unittest.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/extensions/api/image_writer_private/write_from_url_operation.h"
 
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/extensions/api/image_writer_private/error_messages.h"
 #include "chrome/browser/extensions/api/image_writer_private/test_utils.h"
 #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/extensions/api/management/management_browsertest.cc b/chrome/browser/extensions/api/management/management_browsertest.cc
index ea8c514..8650617 100644
--- a/chrome/browser/extensions/api/management/management_browsertest.cc
+++ b/chrome/browser/extensions/api/management/management_browsertest.cc
@@ -11,7 +11,7 @@
 #include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_management.h"
diff --git a/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc b/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc
index cc5023ed..ce32314 100644
--- a/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc
+++ b/chrome/browser/extensions/api/messaging/native_message_host_chromeos.cc
@@ -16,8 +16,8 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/extensions/api/messaging/native_message_process_host.cc b/chrome/browser/extensions/api/messaging/native_message_process_host.cc
index 96dc9bc..953eb29 100644
--- a/chrome/browser/extensions/api/messaging/native_message_process_host.cc
+++ b/chrome/browser/extensions/api/messaging/native_message_process_host.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/process/kill.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h"
 #include "chrome/browser/extensions/api/messaging/native_process_launcher.h"
diff --git a/chrome/browser/extensions/api/messaging/native_process_launcher.cc b/chrome/browser/extensions/api/messaging/native_process_launcher.cc
index 5d125be1..eda727af 100644
--- a/chrome/browser/extensions/api/messaging/native_process_launcher.cc
+++ b/chrome/browser/extensions/api/messaging/native_process_launcher.cc
@@ -15,7 +15,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/api/messaging/native_messaging_host_manifest.h"
 #include "chrome/common/chrome_paths.h"
diff --git a/chrome/browser/extensions/api/music_manager_private/device_id.h b/chrome/browser/extensions/api/music_manager_private/device_id.h
index b63f599..623a00b 100644
--- a/chrome/browser/extensions/api/music_manager_private/device_id.h
+++ b/chrome/browser/extensions/api/music_manager_private/device_id.h
@@ -10,7 +10,7 @@
 #include <string>
 
 #include "base/bind.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 
 namespace extensions {
 namespace api {
diff --git a/chrome/browser/extensions/api/music_manager_private/device_id_linux.cc b/chrome/browser/extensions/api/music_manager_private/device_id_linux.cc
index 115cb94..a31cba28 100644
--- a/chrome/browser/extensions/api/music_manager_private/device_id_linux.cc
+++ b/chrome/browser/extensions/api/music_manager_private/device_id_linux.cc
@@ -20,7 +20,7 @@
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/extensions/api/music_manager_private/device_id_mac.cc b/chrome/browser/extensions/api/music_manager_private/device_id_mac.cc
index 16516f8f..2081b232 100644
--- a/chrome/browser/extensions/api/music_manager_private/device_id_mac.cc
+++ b/chrome/browser/extensions/api/music_manager_private/device_id_mac.cc
@@ -21,7 +21,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/extensions/api/music_manager_private/device_id_win.cc b/chrome/browser/extensions/api/music_manager_private/device_id_win.cc
index 4f07d90e..151fa8fdf 100644
--- a/chrome/browser/extensions/api/music_manager_private/device_id_win.cc
+++ b/chrome/browser/extensions/api/music_manager_private/device_id_win.cc
@@ -22,7 +22,7 @@
 #include "base/scoped_native_library.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/win/windows_version.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc b/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc
index 10b9297..1c1d786 100644
--- a/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc
+++ b/chrome/browser/extensions/api/networking_cast_private/chrome_networking_cast_private_delegate.cc
@@ -13,7 +13,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h"
 #include "chrome/browser/extensions/api/networking_private/networking_private_crypto.h"
diff --git a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc
index 166a78f..f01292f 100644
--- a/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc
+++ b/chrome/browser/extensions/api/networking_private/networking_private_credentials_getter_browsertest.cc
@@ -6,7 +6,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/extensions/api/networking_private/networking_private_credentials_getter.h"
 #include "chrome/services/wifi_util_win/public/mojom/wifi_credentials_getter.mojom.h"
 #include "chrome/test/base/in_process_browser_test.h"
diff --git a/chrome/browser/extensions/api/page_capture/page_capture_api.cc b/chrome/browser/extensions/api/page_capture/page_capture_api.cc
index 1dbc76da..3574ce5 100644
--- a/chrome/browser/extensions/api/page_capture/page_capture_api.cc
+++ b/chrome/browser/extensions/api/page_capture/page_capture_api.cc
@@ -10,7 +10,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
diff --git a/chrome/browser/extensions/api/sessions/sessions_apitest.cc b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
index 6b5dc75..20644c9 100644
--- a/chrome/browser/extensions/api/sessions/sessions_apitest.cc
+++ b/chrome/browser/extensions/api/sessions/sessions_apitest.cc
@@ -268,7 +268,7 @@
   std::unique_ptr<syncer::DataTypeActivationResponse> activation_response;
   base::RunLoop loop;
   ProfileSyncServiceFactory::GetForProfile(browser_->profile())
-      ->GetSessionSyncControllerDelegateOnUIThread()
+      ->GetSessionSyncControllerDelegate()
       ->OnSyncStarting(
           request, base::BindLambdaForTesting(
                        [&](std::unique_ptr<syncer::DataTypeActivationResponse>
diff --git a/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc b/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc
index ebd90652..03dfef7 100644
--- a/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc
+++ b/chrome/browser/extensions/api/sync_file_system/sync_file_system_browsertest.cc
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/apps/platform_apps/app_browsertest_util.h"
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
index c4a61aabd..52b033eb 100644
--- a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
+++ b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
@@ -321,7 +321,7 @@
   if (main_frame) {
     device_id = content::DesktopStreamsRegistry::GetInstance()->RegisterStream(
         main_frame->GetProcess()->GetID(), main_frame->GetRoutingID(), origin,
-        source, extension_name);
+        source, extension_name, content::kRegistryStreamTypeTab);
   }
 
   return device_id;
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
index 6dbd04f..f3076f7 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -53,7 +53,7 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_utils.h"
 #include "chrome/browser/ui/window_sizer/window_sizer.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/api/tabs.h"
 #include "chrome/common/extensions/api/windows.h"
@@ -593,7 +593,7 @@
     create_params.initial_bounds = window_bounds;
   } else {
     create_params = Browser::CreateParams::CreateForApp(
-        web_app::GenerateApplicationNameFromExtensionId(extension_id),
+        web_app::GenerateApplicationNameFromAppId(extension_id),
         false /* trusted_source */, window_bounds, window_profile,
         user_gesture());
   }
diff --git a/chrome/browser/extensions/api/terminal/terminal_private_api.cc b/chrome/browser/extensions/api/terminal/terminal_private_api.cc
index 258d086..b550c6a0 100644
--- a/chrome/browser/extensions/api/terminal/terminal_private_api.cc
+++ b/chrome/browser/extensions/api/terminal/terminal_private_api.cc
@@ -12,7 +12,7 @@
 #include "base/command_line.h"
 #include "base/json/json_writer.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/extensions/api/terminal/terminal_extension_helper.h"
 #include "chrome/browser/extensions/extension_service.h"
diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
index cfdeeeb..d14a433 100644
--- a/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
+++ b/chrome/browser/extensions/api/web_navigation/web_navigation_apitest.cc
@@ -246,9 +246,18 @@
 }
 
 IN_PROC_BROWSER_TEST_F(WebNavigationApiTest, ServerRedirectSingleProcess) {
-  // TODO(lukasza): https://crbug.com/671734: Investigate why this test fails
-  // with --site-per-process.
-  if (content::AreAllSitesIsolatedForTesting())
+  // TODO(lukasza): https://crbug.com/671734: In the long-term, //chrome-layer
+  // tests should only be run with site-per-process - remove the early return
+  // below when fixing https://crbug.com/870761 and removing the
+  // not_site_per_process_browser_tests step.
+  //
+  // This test has its expectations in
+  // serverRedirectSingleProcess/test_serverRedirectSingleProcess.js.  The
+  // expectations include exact |processId| ("exact" meaning that one cannot use
+  // a wildcard - the verification is done via chrome.test.checkDeepEq).
+  // Inclusion of |processId| means that the expectation change in
+  // site-per-process mode.
+  if (!content::AreAllSitesIsolatedForTesting())
     return;
 
   ASSERT_TRUE(StartEmbeddedTestServer());
diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
index 086ddfa..959390fa 100644
--- a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
+++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -13,6 +13,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/test/scoped_command_line.h"
 #include "base/test/scoped_feature_list.h"
+#include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
@@ -23,6 +24,9 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
+#include "components/policy/core/browser/browser_policy_connector.h"
+#include "components/policy/core/common/mock_configuration_policy_provider.h"
+#include "components/policy/policy_constants.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/webrtc_event_logger.h"
@@ -76,7 +80,6 @@
 class WebrtcLoggingPrivateApiTest : public extensions::ExtensionApiTest {
  protected:
   void SetUp() override {
-    scoped_feature_list_.InitAndEnableFeature(features::kWebRtcRemoteEventLog);
     extensions::ExtensionApiTest::SetUp();
     extension_ = extensions::ExtensionBuilder("Test").Build();
   }
@@ -361,30 +364,6 @@
   scoped_refptr<Extension> extension_;
 };
 
-class WebrtcLoggingPrivateApiTestDisabledRemoteLogging
-    : public WebrtcLoggingPrivateApiTest {
- protected:
-  void SetUp() override {
-    scoped_feature_list_.InitAndDisableFeature(features::kWebRtcRemoteEventLog);
-    extensions::ExtensionApiTest::SetUp();
-    extension_ = extensions::ExtensionBuilder("Test").Build();
-  }
-};
-
-class WebrtcLoggingPrivateApiTestInIncognitoMode
-    : public WebrtcLoggingPrivateApiTest {
- protected:
-  Browser* GetBrowser() override {
-    if (!browser_) {
-      browser_ = CreateIncognitoBrowser();
-    }
-    return browser_;
-  }
-
- private:
-  Browser* browser_{nullptr};  // Does not own the object.
-};
-
 // Helper class to temporarily tell the uploader to save the multipart buffer to
 // a test string instead of uploading.
 class ScopedOverrideUploadBuffer {
@@ -644,8 +623,71 @@
   ASSERT_TRUE(StartAudioDebugRecordings(1));
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTest,
-                       StartEventLoggingForKnownPeerConnectionSucceeds) {
+#if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+
+// Fixture for various tests over StartEventLogging. Intended to be sub-classed
+// to test different scenarios.
+class WebrtcLoggingPrivateApiStartEventLoggingTestBase
+    : public WebrtcLoggingPrivateApiTest {
+ public:
+  ~WebrtcLoggingPrivateApiStartEventLoggingTestBase() override = default;
+
+ protected:
+  void SetUp() override {
+    auto const webrtc_remote_event_logging = features::kWebRtcRemoteEventLog;
+    if (WebRtcEventLogCollectionFeature()) {
+      scoped_feature_list_.InitAndEnableFeature(webrtc_remote_event_logging);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(webrtc_remote_event_logging);
+    }
+    WebrtcLoggingPrivateApiTest::SetUp();
+  }
+
+  void SetUpInProcessBrowserTestFixture() override {
+    EXPECT_CALL(provider_, IsInitializationComplete(testing::_))
+        .WillRepeatedly(testing::Return(true));
+
+    policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
+    policy::PolicyMap values;
+
+    values.Set(policy::key::kWebRtcEventLogCollectionAllowed,
+               policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+               policy::POLICY_SOURCE_ENTERPRISE_DEFAULT,
+               std::make_unique<base::Value>(WebRtcEventLogCollectionPolicy()),
+               nullptr);
+
+    provider_.UpdateChromePolicy(values);
+  }
+
+  // Whether the test should have WebRTC remote-bound event logging generally
+  // enabled (default behavior), or disabled (Finch kill-switch engaged).
+  virtual bool WebRtcEventLogCollectionFeature() const = 0;
+
+  // Whether the test should simulate running on a user profile which
+  // has the kWebRtcEventLogCollectionAllowed policy configured or not.
+  virtual bool WebRtcEventLogCollectionPolicy() const = 0;
+
+ private:
+  policy::MockConfigurationPolicyProvider provider_;
+};
+
+// Test StartEventLogging's behavior when the feature is active (kill-switch
+// from Finch *not* engaged, working in a profile where the policy is
+// configured).
+class WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled
+    : public WebrtcLoggingPrivateApiStartEventLoggingTestBase {
+ public:
+  ~WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled()
+      override = default;
+
+  bool WebRtcEventLogCollectionFeature() const override { return true; }
+
+  bool WebRtcEventLogCollectionPolicy() const override { return true; }
+};
+
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
+    StartEventLoggingForKnownPeerConnectionSucceeds) {
   const std::string peer_connection_id = "id";
   SetUpPeerConnection(peer_connection_id);
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
@@ -653,8 +695,9 @@
   StartEventLogging(peer_connection_id, max_size_bytes, expect_success);
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTest,
-                       StartEventLoggingWithUnlimitedSizeFails) {
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
+    StartEventLoggingWithUnlimitedSizeFails) {
   const std::string peer_connection_id = "id";
   SetUpPeerConnection(peer_connection_id);
   const int max_size_bytes = kWebRtcEventLogManagerUnlimitedFileSize;
@@ -665,8 +708,9 @@
                     error_message);
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTest,
-                       StartEventLoggingWithExcessiveMaxSizeFails) {
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
+    StartEventLoggingWithExcessiveMaxSizeFails) {
   const std::string peer_connection_id = "id";
   SetUpPeerConnection(peer_connection_id);
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes + 1;
@@ -676,8 +720,9 @@
                     error_message);
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTest,
-                       StartEventLoggingForNeverAddedPeerConnectionFails) {
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
+    StartEventLoggingForNeverAddedPeerConnectionFails) {
   // Note that manager->PeerConnectionAdded() is not called.
   const std::string peer_connection_id = "id";
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
@@ -688,8 +733,9 @@
                     error_message);
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTest,
-                       StartEventLoggingForWrongPeerConnectionIdFails) {
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
+    StartEventLoggingForWrongPeerConnectionIdFails) {
   const std::string peer_connection_id_1 = "id1";
   const std::string peer_connection_id_2 = "id2";
 
@@ -702,8 +748,9 @@
                     error_message);
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTest,
-                       StartEventLoggingForAlreadyLoggedPeerConnectionFails) {
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureAndPolicyEnabled,
+    StartEventLoggingForAlreadyLoggedPeerConnectionFails) {
   const std::string peer_connection_id = "id";
   SetUpPeerConnection(peer_connection_id);
 
@@ -724,8 +771,34 @@
   }
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTestDisabledRemoteLogging,
-                       StartEventLoggingFails) {
+// Testing with either the feature or the policy disabled (not both).
+class WebrtcLoggingPrivateApiStartEventLoggingTestFeatureOrPolicyDisabled
+    : public WebrtcLoggingPrivateApiStartEventLoggingTestBase,
+      public ::testing::WithParamInterface<bool> {
+ public:
+  WebrtcLoggingPrivateApiStartEventLoggingTestFeatureOrPolicyDisabled()
+      : feature_enabled_(GetParam()), policy_enabled_(!feature_enabled_) {}
+
+  ~WebrtcLoggingPrivateApiStartEventLoggingTestFeatureOrPolicyDisabled()
+      override = default;
+
+ protected:
+  bool WebRtcEventLogCollectionFeature() const override {
+    return feature_enabled_;
+  }
+
+  bool WebRtcEventLogCollectionPolicy() const override {
+    return policy_enabled_;
+  }
+
+ private:
+  const bool feature_enabled_;
+  const bool policy_enabled_;
+};
+
+IN_PROC_BROWSER_TEST_P(
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureOrPolicyDisabled,
+    StartEventLoggingFails) {
   const std::string peer_connection_id = "id";
   SetUpPeerConnection(peer_connection_id);
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
@@ -735,8 +808,38 @@
                     error_message);
 }
 
-IN_PROC_BROWSER_TEST_F(WebrtcLoggingPrivateApiTestInIncognitoMode,
-                       StartEventLoggingFails) {
+INSTANTIATE_TEST_CASE_P(
+    FeatureEnabled,
+    WebrtcLoggingPrivateApiStartEventLoggingTestFeatureOrPolicyDisabled,
+    ::testing::Bool());
+
+// Make sure that, even if both the feature and the policy enable remote-bound
+// event logging, it will be blocked for incognito sessions.
+class WebrtcLoggingPrivateApiStartEventLoggingTestInIncognitoMode
+    : public WebrtcLoggingPrivateApiStartEventLoggingTestBase {
+ public:
+  ~WebrtcLoggingPrivateApiStartEventLoggingTestInIncognitoMode() override =
+      default;
+
+ protected:
+  Browser* GetBrowser() override {
+    if (!browser_) {
+      browser_ = CreateIncognitoBrowser();
+    }
+    return browser_;
+  }
+
+  bool WebRtcEventLogCollectionFeature() const override { return true; }
+
+  bool WebRtcEventLogCollectionPolicy() const override { return true; }
+
+ private:
+  Browser* browser_{nullptr};  // Does not own the object.
+};
+
+IN_PROC_BROWSER_TEST_F(
+    WebrtcLoggingPrivateApiStartEventLoggingTestInIncognitoMode,
+    StartEventLoggingFails) {
   const std::string peer_connection_id = "id";
   SetUpPeerConnection(peer_connection_id);
   const int max_size_bytes = kMaxRemoteLogFileSizeBytes;
@@ -745,3 +848,5 @@
   StartEventLogging(peer_connection_id, max_size_bytes, expect_success,
                     error_message);
 }
+
+#endif  // !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
diff --git a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
index f59c8a2..5dc6a3e 100644
--- a/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
+++ b/chrome/browser/extensions/api/webstore_private/webstore_private_apitest.cc
@@ -28,6 +28,7 @@
 #include "content/public/browser/gpu_data_manager.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/browser/api/management/management_api.h"
 #include "extensions/browser/extension_dialog_auto_confirm.h"
@@ -187,34 +188,39 @@
 };
 
 // Test cases for webstore origin frame blocking.
-// TODO(mkwst): Disabled until new X-Frame-Options behavior rolls into
-// Chromium, see crbug.com/226018.
 IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest,
-                       DISABLED_FrameWebstorePageBlocked) {
-  base::string16 expected_title = base::UTF8ToUTF16("PASS: about:blank");
-  base::string16 failure_title = base::UTF8ToUTF16("FAIL");
-  content::TitleWatcher watcher(GetWebContents(), expected_title);
-  watcher.AlsoWaitForTitle(failure_title);
+                       FrameWebstorePageBlocked) {
   GURL url = embedded_test_server()->GetURL(
       "/extensions/api_test/webstore_private/noframe.html");
+  content::WebContents* web_contents = GetWebContents();
   ui_test_utils::NavigateToURL(browser(), url);
-  base::string16 final_title = watcher.WaitAndGetTitle();
-  EXPECT_EQ(expected_title, final_title);
+  ASSERT_TRUE(content::ExecuteScript(web_contents, "dropFrame()"));
+  WaitForLoadStop(web_contents);
+  content::RenderFrameHost* subframe =
+      content::ChildFrameAt(web_contents->GetMainFrame(), 0);
+  ASSERT_TRUE(subframe);
+  // The subframe load should fail due to XFO. Currently that results in
+  // loading a blank page with the URL "data:,", but this check will need to
+  // change when XFO failures result in an error page - see
+  // https://crbug.com/870815.
+  EXPECT_EQ(GURL("data:,"), subframe->GetLastCommittedURL());
 }
 
-// TODO(mkwst): Disabled until new X-Frame-Options behavior rolls into
-// Chromium, see crbug.com/226018.
-IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest,
-                       DISABLED_FrameErrorPageBlocked) {
-  base::string16 expected_title = base::UTF8ToUTF16("PASS: about:blank");
-  base::string16 failure_title = base::UTF8ToUTF16("FAIL");
-  content::TitleWatcher watcher(GetWebContents(), expected_title);
-  watcher.AlsoWaitForTitle(failure_title);
+IN_PROC_BROWSER_TEST_F(ExtensionWebstorePrivateApiTest, FrameErrorPageBlocked) {
   GURL url = embedded_test_server()->GetURL(
       "/extensions/api_test/webstore_private/noframe2.html");
+  content::WebContents* web_contents = GetWebContents();
   ui_test_utils::NavigateToURL(browser(), url);
-  base::string16 final_title = watcher.WaitAndGetTitle();
-  EXPECT_EQ(expected_title, final_title);
+  ASSERT_TRUE(content::ExecuteScript(web_contents, "dropFrame()"));
+  WaitForLoadStop(web_contents);
+  content::RenderFrameHost* subframe =
+      content::ChildFrameAt(web_contents->GetMainFrame(), 0);
+  ASSERT_TRUE(subframe);
+  // The subframe load should fail due to XFO. Currently that results in
+  // loading a blank page with the URL "data:,", but this check will need to
+  // change when XFO failures result in an error page - see
+  // https://crbug.com/870815.
+  EXPECT_EQ(GURL("data:,"), subframe->GetLastCommittedURL());
 }
 
 // Test cases where the user accepts the install confirmation dialog.
diff --git a/chrome/browser/extensions/bookmark_app_helper.cc b/chrome/browser/extensions/bookmark_app_helper.cc
index 2677ea8..18a69668 100644
--- a/chrome/browser/extensions/bookmark_app_helper.cc
+++ b/chrome/browser/extensions/bookmark_app_helper.cc
@@ -779,13 +779,11 @@
       base::Time::Now());
 
   Browser* browser = chrome::FindBrowserWithWebContents(contents_);
-  if (!browser) {
-    // The browser can be null in tests.
-    callback_.Run(extension, web_app_info_);
-    return;
-  }
+  // If there is no browser, it means that the app is being installed in the
+  // background. We skip some steps in this case.
+  const bool silent_install = !browser;
 
-  if (banners::AppBannerManagerDesktop::IsEnabled() &&
+  if (!silent_install && banners::AppBannerManagerDesktop::IsEnabled() &&
       web_app_info_.open_as_window) {
     banners::AppBannerManagerDesktop::FromWebContents(contents_)->OnInstall(
         false /* is_native app */, blink::kWebDisplayModeStandalone);
@@ -812,20 +810,24 @@
   web_app::CreateShortcuts(web_app::SHORTCUT_CREATION_BY_USER,
                            creation_locations, current_profile, extension);
 #else
-  ChromeLauncherController::instance()->shelf_model()->PinAppWithID(
-      extension->id());
+  // ChromeLauncherController does not exist in unit tests.
+  if (ChromeLauncherController::instance()) {
+    ChromeLauncherController::instance()->shelf_model()->PinAppWithID(
+        extension->id());
+  }
 #endif  // !defined(OS_CHROMEOS)
 
   // Reparent the tab into an app window immediately when opening as a window.
-  if (base::FeatureList::IsEnabled(::features::kDesktopPWAWindowing) &&
+  if (!silent_install &&
+      base::FeatureList::IsEnabled(::features::kDesktopPWAWindowing) &&
       launch_type == LAUNCH_TYPE_WINDOW && !profile_->IsOffTheRecord()) {
     ReparentWebContentsIntoAppBrowser(contents_, extension);
   }
 #endif  // !defined(OS_MACOSX)
 
 #if defined(OS_MACOSX)
-  if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
-          ::switches::kDisableHostedAppShimCreation)) {
+  if (!silent_install && !base::CommandLine::ForCurrentProcess()->HasSwitch(
+                             ::switches::kDisableHostedAppShimCreation)) {
     web_app::RevealAppShimInFinderForApp(current_profile, extension);
   }
 #endif
diff --git a/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc b/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc
index 4dd5db6a..73a3a875 100644
--- a/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc
+++ b/chrome/browser/extensions/bookmark_app_navigation_throttle_browsertest.cc
@@ -19,7 +19,7 @@
 #include "chrome/browser/ui/extensions/app_launch_params.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -1417,7 +1417,7 @@
 
   const Extension* app =
       ExtensionRegistry::Get(profile())->enabled_extensions().GetByID(
-          web_app::GetExtensionIdFromApplicationName(app_browser->app_name()));
+          web_app::GetAppIdFromApplicationName(app_browser->app_name()));
   EXPECT_EQ(GetAppName(), app->name());
 }
 #endif  // OS_CHROMEOS
diff --git a/chrome/browser/extensions/bookmark_app_navigation_throttle_utils.cc b/chrome/browser/extensions/bookmark_app_navigation_throttle_utils.cc
index 9466a41..d5f6e5e3 100644
--- a/chrome/browser/extensions/bookmark_app_navigation_throttle_utils.cc
+++ b/chrome/browser/extensions/bookmark_app_navigation_throttle_utils.cc
@@ -11,7 +11,7 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/navigation_handle.h"
@@ -51,7 +51,7 @@
     return nullptr;
 
   const Extension* app = ExtensionRegistry::Get(context)->GetExtensionById(
-      web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+      web_app::GetAppIdFromApplicationName(browser->app_name()),
       extensions::ExtensionRegistry::ENABLED);
 
   if (!IsWindowedBookmarkApp(app, context))
diff --git a/chrome/browser/extensions/browsertest_util.cc b/chrome/browser/extensions/browsertest_util.cc
index 7a917e00..2d832f9e 100644
--- a/chrome/browser/extensions/browsertest_util.cc
+++ b/chrome/browser/extensions/browsertest_util.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/extensions/app_launch_params.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/web_application_info.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/test/test_utils.h"
@@ -80,8 +80,8 @@
 
   Browser* browser = chrome::FindLastActive();
   bool is_correct_app_browser =
-      browser && web_app::GetExtensionIdFromApplicationName(
-                     browser->app_name()) == extension_app->id();
+      browser && web_app::GetAppIdFromApplicationName(browser->app_name()) ==
+                     extension_app->id();
   EXPECT_TRUE(is_correct_app_browser);
 
   return is_correct_app_browser ? browser : nullptr;
diff --git a/chrome/browser/extensions/chrome_url_request_util.cc b/chrome/browser/extensions/chrome_url_request_util.cc
index ad50817f..69c0131b 100644
--- a/chrome/browser/extensions/chrome_url_request_util.cc
+++ b/chrome/browser/extensions/chrome_url_request_util.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/extensions/chrome_manifest_url_handlers.h"
 #include "content/public/browser/resource_request_info.h"
diff --git a/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc b/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc
index 43ef768..dedda35 100644
--- a/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc
+++ b/chrome/browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc
@@ -320,11 +320,6 @@
   // Installs test extension that is copied from the webstore with actual
   // signatures.
   testing::AssertionResult InstallExtension(ExtensionType type) {
-    // Install the interceptor at the very beginning of the tests' execution
-    // flow, so that it catches all URLLoaderFactory creations.
-    if (!hash_fetching_disabled_ && !InstallInterceptor())
-      return testing::AssertionFailure() << "Failed to install interceptor.";
-
     // This observer will make sure content hash read and computed_hashes.json
     // writing is complete before we proceed.
     VerifierObserver verifier_observer;
@@ -348,8 +343,8 @@
 
     info_ = std::make_unique<ExtensionInfo>(extension, type);
 
-    // Set up the data needed by the interceptor functor.
-    if (!hash_fetching_disabled_ && !SetUpInterceptorData())
+    // Set up the interceptor functor and data needed by it.
+    if (!hash_fetching_disabled_ && !InstallInterceptor())
       return testing::AssertionFailure() << "Failed to install interceptor.";
 
     return testing::AssertionSuccess();
@@ -361,6 +356,8 @@
       return false;
     }
 
+    SetUpInterceptorData();
+
     auto interceptor_function =
         [](GURL* fetch_url, base::FilePath* file_path,
            content::URLLoaderInterceptor::RequestParams* params) {
diff --git a/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc b/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc
new file mode 100644
index 0000000..a90f753
--- /dev/null
+++ b/chrome/browser/extensions/cross_origin_read_blocking_browsertest.cc
@@ -0,0 +1,132 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_action_runner.h"
+
+#include "base/files/file_path.h"
+#include "base/json/json_reader.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_browsertest.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/extensions/tab_helper.h"
+#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/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "extensions/browser/browsertest_util.h"
+#include "extensions/test/test_extension_dir.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "url/gurl.h"
+#include "url/origin.h"
+
+namespace extensions {
+
+class CrossOriginReadBlockingExtensionTest : public ExtensionBrowserTest {
+ public:
+  CrossOriginReadBlockingExtensionTest() = default;
+
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+
+    host_resolver()->AddRule("*", "127.0.0.1");
+    content::SetupCrossSiteRedirector(embedded_test_server());
+    ASSERT_TRUE(embedded_test_server()->Start());
+  }
+
+ protected:
+  void InstallExtension() {
+    const char kManifest[] = R"(
+        {
+          "name": "CrossOriginReadBlockingTest",
+          "version": "1.0",
+          "manifest_version": 2,
+          "permissions": ["tabs", "*://*/*"],
+          "background": {"scripts": ["script.js"]}
+        } )";
+    dir_.WriteManifest(kManifest);
+    dir_.WriteFile(FILE_PATH_LITERAL("script.js"), "");
+    extension_ = LoadExtension(dir_.UnpackedPath());
+  }
+
+  // Injects (into |web_contents|) a content_script that performs a fetch of
+  // |url|. Returns the body of the response.
+  //
+  // The method below uses "programmatic" (rather than "declarative") way to
+  // inject a content script, but the behavior and permissions of the conecnt
+  // script should be the same in both cases.  See also
+  // https://developer.chrome.com/extensions/content_scripts#programmatic.
+  std::string FetchViaContentScript(const GURL& url,
+                                    content::WebContents* web_contents) {
+    content::DOMMessageQueue message_queue;
+
+    // Inject a content script that performs a cross-origin XHR to bar.com.
+    const char kXhrScriptTemplate[] = R"(
+      fetch($1)
+        .then(response => response.text())
+        .then(text => domAutomationController.send(text))
+        .catch(err => domAutomationController.send("error: " + err));
+    )";
+    std::string xhr_script = content::JsReplace(kXhrScriptTemplate, url.spec());
+    EXPECT_TRUE(ExecuteContentScript(web_contents, xhr_script));
+
+    // Wait until the message comes back and extract result from the message.
+    std::string json;
+    EXPECT_TRUE(message_queue.WaitForMessage(&json));
+    base::JSONReader reader(base::JSON_ALLOW_TRAILING_COMMAS);
+    std::unique_ptr<base::Value> value = reader.ReadToValue(json);
+    std::string result;
+    EXPECT_TRUE(value->GetAsString(&result));
+    return result;
+  }
+
+ private:
+  // Asks the test |extension_| to inject |content_script| into |web_contents|.
+  // Returns true if the content script injection succeeded.
+  bool ExecuteContentScript(content::WebContents* web_contents,
+                            const std::string& content_script) {
+    int tab_id = ExtensionTabUtil::GetTabId(web_contents);
+    std::string background_script = content::JsReplace(
+        "chrome.tabs.executeScript($1, { code: $2 });", tab_id, content_script);
+    return browsertest_util::ExecuteScriptInBackgroundPageNoWait(
+        browser()->profile(), extension_->id(), background_script);
+  }
+
+  TestExtensionDir dir_;
+  const Extension* extension_ = nullptr;
+
+  DISALLOW_COPY_AND_ASSIGN(CrossOriginReadBlockingExtensionTest);
+};
+
+// Test that verifies the current, baked-in (but not necessarily desirable
+// behavior) where an extension that has permission to inject a content script
+// to any page can also XHR (without CORS!) any cross-origin resource.
+// See also https://crbug.com/846346.
+IN_PROC_BROWSER_TEST_F(CrossOriginReadBlockingExtensionTest, SimpleTest) {
+  InstallExtension();
+
+  // Navigate to a foo.com page.
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  GURL page_url(embedded_test_server()->GetURL("foo.com", "/title1.html"));
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetMainFrame()->GetLastCommittedURL());
+  EXPECT_EQ(url::Origin::Create(page_url),
+            web_contents->GetMainFrame()->GetLastCommittedOrigin());
+
+  // Inject a content script that performs a cross-origin XHR to bar.com.
+  // Verify that it returned the right response (one that wasn't blocked by
+  // CORB).
+  GURL cross_site_resource(
+      embedded_test_server()->GetURL("bar.com", "/nosniff.xml"));
+  EXPECT_EQ("nosniff.xml - body\n",
+            FetchViaContentScript(cross_site_resource, web_contents));
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc
index 0835a36..2d90540c 100644
--- a/chrome/browser/extensions/extension_browsertest.cc
+++ b/chrome/browser/extensions/extension_browsertest.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/extensions/bookmark_app_helper.h"
diff --git a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
index e5698bdf..07f3b0d 100644
--- a/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
+++ b/chrome/browser/extensions/extension_disabled_ui_browsertest.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_path.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ptr_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/extensions/extension_service.h"
diff --git a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
index c6e14eb..f14183e4 100644
--- a/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
+++ b/chrome/browser/extensions/extension_gcm_app_handler_unittest.cc
@@ -22,7 +22,7 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc
index 1de7d0dd..f39888b 100644
--- a/chrome/browser/extensions/extension_service.cc
+++ b/chrome/browser/extensions/extension_service.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/extensions/external_pref_loader.cc b/chrome/browser/extensions/external_pref_loader.cc
index 7c0dbe5..dadabbc9 100644
--- a/chrome/browser/extensions/external_pref_loader.cc
+++ b/chrome/browser/extensions/external_pref_loader.cc
@@ -18,7 +18,7 @@
 #include "base/scoped_observer.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "build/build_config.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/prefs/pref_service_syncable_util.h"
diff --git a/chrome/browser/extensions/external_registry_loader_win.cc b/chrome/browser/extensions/external_registry_loader_win.cc
index 23d4547b..6e2b210 100644
--- a/chrome/browser/extensions/external_registry_loader_win.cc
+++ b/chrome/browser/extensions/external_registry_loader_win.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "base/values.h"
diff --git a/chrome/browser/extensions/startup_helper.cc b/chrome/browser/extensions/startup_helper.cc
index 78eb529..a972dc92 100644
--- a/chrome/browser/extensions/startup_helper.cc
+++ b/chrome/browser/extensions/startup_helper.cc
@@ -12,7 +12,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/chrome_extensions_client.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/extensions/tab_helper.cc b/chrome/browser/extensions/tab_helper.cc
index a60a823..e31baeb 100644
--- a/chrome/browser/extensions/tab_helper.cc
+++ b/chrome/browser/extensions/tab_helper.cc
@@ -29,7 +29,7 @@
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/api/webstore/webstore_api_constants.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
@@ -293,7 +293,7 @@
     Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
     if (browser && browser->is_app()) {
       const Extension* extension = registry->GetExtensionById(
-          web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+          web_app::GetAppIdFromApplicationName(browser->app_name()),
           ExtensionRegistry::EVERYTHING);
       if (extension && AppLaunchInfo::GetFullLaunchURL(extension).is_valid())
         SetExtensionApp(extension);
diff --git a/chrome/browser/extensions/unpacked_installer.cc b/chrome/browser/extensions/unpacked_installer.cc
index 3488119..146973a 100644
--- a/chrome/browser/extensions/unpacked_installer.cc
+++ b/chrome/browser/extensions/unpacked_installer.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/extensions/extension_management.h"
 #include "chrome/browser/extensions/extension_service.h"
diff --git a/chrome/browser/extensions/updater/extension_cache_impl.cc b/chrome/browser/extensions/updater/extension_cache_impl.cc
index 8993b4d9..712df2a0 100644
--- a/chrome/browser/extensions/updater/extension_cache_impl.cc
+++ b/chrome/browser/extensions/updater/extension_cache_impl.cc
@@ -12,7 +12,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/crx_installer.h"
 #include "chrome/browser/extensions/updater/extension_cache_delegate.h"
diff --git a/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc b/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc
index 95bd0c5d..24c37a8a 100644
--- a/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc
+++ b/chrome/browser/extensions/updater/extension_update_client_base_browsertest.cc
@@ -6,7 +6,7 @@
 
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/chrome_browser_main.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
diff --git a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
index 43fedde..6c96312f 100644
--- a/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
+++ b/chrome/browser/extensions/updater/local_extension_cache_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc
index 206dfed..a6d6335 100644
--- a/chrome/browser/extensions/webstore_installer.cc
+++ b/chrome/browser/extensions/webstore_installer.cc
@@ -24,7 +24,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/favicon/favicon_utils.cc b/chrome/browser/favicon/favicon_utils.cc
index ce8f0b4..ab5f635 100644
--- a/chrome/browser/favicon/favicon_utils.cc
+++ b/chrome/browser/favicon/favicon_utils.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/favicon/favicon_utils.h"
 
 #include "chrome/browser/favicon/favicon_service_factory.h"
-#include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/search.h"
 #include "chrome/common/url_constants.h"
@@ -39,8 +38,6 @@
   return ContentFaviconDriver::CreateForWebContents(
       web_contents,
       FaviconServiceFactory::GetForProfile(original_profile,
-                                           ServiceAccessType::IMPLICIT_ACCESS),
-      HistoryServiceFactory::GetForProfile(original_profile,
                                            ServiceAccessType::IMPLICIT_ACCESS));
 }
 
diff --git a/chrome/browser/favicon/large_icon_service_factory.cc b/chrome/browser/favicon/large_icon_service_factory.cc
index 6e5ee13..bf53df7 100644
--- a/chrome/browser/favicon/large_icon_service_factory.cc
+++ b/chrome/browser/favicon/large_icon_service_factory.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/favicon/large_icon_service_factory.h"
 
 #include "base/memory/singleton.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/favicon/favicon_service_factory.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/feature_engagement/tracker_factory.cc b/chrome/browser/feature_engagement/tracker_factory.cc
index 8538e35..684c77ff 100644
--- a/chrome/browser/feature_engagement/tracker_factory.cc
+++ b/chrome/browser/feature_engagement/tracker_factory.cc
@@ -8,7 +8,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_constants.h"
diff --git a/chrome/browser/feedback/feedback_profile_observer.cc b/chrome/browser/feedback/feedback_profile_observer.cc
index 1720187..5d7648a 100644
--- a/chrome/browser/feedback/feedback_profile_observer.cc
+++ b/chrome/browser/feedback/feedback_profile_observer.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/feedback/feedback_profile_observer.h"
 
 #include "base/callback.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/feedback/feedback_uploader_chrome.h"
 #include "chrome/browser/feedback/feedback_uploader_factory_chrome.h"
diff --git a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
index 4aa5d26f..dfe0f29 100644
--- a/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
+++ b/chrome/browser/feedback/system_logs/log_sources/chrome_internal_log_source.cc
@@ -11,7 +11,7 @@
 #include "base/json/json_string_value_serializer.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/google/google_brand.h"
diff --git a/chrome/browser/file_select_helper.cc b/chrome/browser/file_select_helper.cc
index 23970b69..e69763c8 100644
--- a/chrome/browser/file_select_helper.cc
+++ b/chrome/browser/file_select_helper.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/platform_util.h"
diff --git a/chrome/browser/first_run/first_run_internal_win.cc b/chrome/browser/first_run/first_run_internal_win.cc
index 4c9857e..f19d3ef 100644
--- a/chrome/browser/first_run/first_run_internal_win.cc
+++ b/chrome/browser/first_run/first_run_internal_win.cc
@@ -17,8 +17,8 @@
 #include "base/process/kill.h"
 #include "base/process/launch.h"
 #include "base/process/process.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 6aabe42..9f11d40 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1562,14 +1562,6 @@
     "Predicts the finger's future position during scrolls allowing time to "
     "render the frame before the finger is there.";
 
-const char kSecondaryUiMd[] =
-    "Material Design in the rest of the browser's native UI";
-const char kSecondaryUiMdDescription[] =
-    "Extends the --top-chrome-md setting to secondary UI (bubbles, dialogs, "
-    "etc.). On Mac, this enables MacViews, which uses toolkit-views for native "
-    "browser dialogs. If --top-chrome-md is effectively Material Design "
-    "refresh, this option is enabled.";
-
 const char kServiceWorkerPaymentAppsName[] = "Service Worker payment apps";
 const char kServiceWorkerPaymentAppsDescription[] =
     "Enable Service Worker applications to integrate as payment apps";
@@ -2587,6 +2579,12 @@
 const char kOfflinePagesSharingDescription[] =
     "Enables the saved offline pages to be shared via other applications.";
 
+const char kOfflinePagesLivePageSharingName[] =
+    "Enables live page sharing of offline pages";
+const char kOfflinePagesLivePageSharingDescription[] =
+    "Enables to share current loaded page as offline page by saving as MHTML "
+    "first.";
+
 const char kOfflinePagesShowAlternateDinoPageName[] =
     "Enable alternate dino page with more user capabilities.";
 const char kOfflinePagesShowAlternateDinoPageDescription[] =
@@ -2935,10 +2933,6 @@
 const char kMacViewsTaskManagerDescription[] =
     "Controls whether to use the Toolkit-Views based Task Manager.";
 
-const char kSuggestedTextTouchBarName[] = "Suggested Text Touch Bar";
-const char kSuggestedTextTouchBarDescription[] =
-    "Enable suggested text touch bar for textfields.";
-
 const char kTabDetachingInFullscreenName[] =
     "Allow tab detaching in fullscreen";
 const char kTabDetachingInFullscreenDescription[] =
@@ -2948,6 +2942,10 @@
 const char kTabStripKeyboardFocusDescription[] =
     "Enable keyboard focus for the tabs in the tab strip.";
 
+const char kTextSuggestionsTouchBarName[] = "Text Suggestions Touch Bar";
+const char kTextSuggestionsTouchBarDescription[] =
+    "Enable text suggestions touch bar for textfields.";
+
 #endif
 
 // Chrome OS -------------------------------------------------------------------
@@ -3366,10 +3364,6 @@
     "If enabled, user can monitor system information at "
     "chrome://sys-internals.";
 
-const char kTapVisualizerAppName[] = "Show taps with mojo app";
-const char kTapVisualizerAppDescription[] =
-    "Use an out-of-process mojo app to show touch points.";
-
 const char kDisableTeamDrivesName[] = "Disable Team Drives Integration";
 const char kDisableTeamDrivesDescription[] =
     "If disabled, files under Team Drives will no longer appear in the Files "
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 63d2853..e61b7639 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -953,9 +953,6 @@
 extern const char kScrollPredictionName[];
 extern const char kScrollPredictionDescription[];
 
-extern const char kSecondaryUiMd[];
-extern const char kSecondaryUiMdDescription[];
-
 extern const char kServiceWorkerPaymentAppsName[];
 extern const char kServiceWorkerPaymentAppsDescription[];
 
@@ -1562,6 +1559,9 @@
 extern const char kOfflinePagesSharingName[];
 extern const char kOfflinePagesSharingDescription[];
 
+extern const char kOfflinePagesLivePageSharingName[];
+extern const char kOfflinePagesLivePageSharingDescription[];
+
 extern const char kOfflinePagesShowAlternateDinoPageName[];
 extern const char kOfflinePagesShowAlternateDinoPageDescription[];
 
@@ -1777,15 +1777,15 @@
 extern const char kMacViewsTaskManagerName[];
 extern const char kMacViewsTaskManagerDescription[];
 
-extern const char kSuggestedTextTouchBarName[];
-extern const char kSuggestedTextTouchBarDescription[];
-
 extern const char kTabDetachingInFullscreenName[];
 extern const char kTabDetachingInFullscreenDescription[];
 
 extern const char kTabStripKeyboardFocusName[];
 extern const char kTabStripKeyboardFocusDescription[];
 
+extern const char kTextSuggestionsTouchBarName[];
+extern const char kTextSuggestionsTouchBarDescription[];
+
 // Non-Mac --------------------------------------------------------------------
 
 #else  // !defined(OS_MACOSX)
@@ -2052,9 +2052,6 @@
 extern const char kSmartTextSelectionName[];
 extern const char kSmartTextSelectionDescription[];
 
-extern const char kTapVisualizerAppName[];
-extern const char kTapVisualizerAppDescription[];
-
 extern const char kUiShowCompositedLayerBordersName[];
 extern const char kUiShowCompositedLayerBordersDescription[];
 extern const char kUiShowCompositedLayerBordersRenderPass[];
diff --git a/chrome/browser/gcm/gcm_profile_service_factory.cc b/chrome/browser/gcm/gcm_profile_service_factory.cc
index 9aefab60..2890eb1 100644
--- a/chrome/browser/gcm/gcm_profile_service_factory.cc
+++ b/chrome/browser/gcm/gcm_profile_service_factory.cc
@@ -6,7 +6,7 @@
 #include <memory>
 
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/gcm/gcm_profile_service_unittest.cc b/chrome/browser/gcm/gcm_profile_service_unittest.cc
index 5b80d462..7c72d74 100644
--- a/chrome/browser/gcm/gcm_profile_service_unittest.cc
+++ b/chrome/browser/gcm/gcm_profile_service_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/gcm/gcm_product_util.h"
 #include "chrome/browser/gcm/gcm_profile_service_factory.h"
diff --git a/chrome/browser/google/google_brand_chromeos.cc b/chrome/browser/google/google_brand_chromeos.cc
index c0eb964..c42aab9 100644
--- a/chrome/browser/google/google_brand_chromeos.cc
+++ b/chrome/browser/google/google_brand_chromeos.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/common/pref_names.h"
 #include "chromeos/system/statistics_provider.h"
diff --git a/chrome/browser/google/google_update_settings_posix.cc b/chrome/browser/google/google_update_settings_posix.cc
index aeebc6a..9d65e55 100644
--- a/chrome/browser/google/google_update_settings_posix.cc
+++ b/chrome/browser/google/google_update_settings_posix.cc
@@ -10,7 +10,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "build/build_config.h"
 #include "chrome/common/chrome_paths.h"
 
diff --git a/chrome/browser/google/google_update_win.cc b/chrome/browser/google/google_update_win.cc
index 3aa0196..e602b36 100644
--- a/chrome/browser/google/google_update_win.cc
+++ b/chrome/browser/google/google_update_win.cc
@@ -28,8 +28,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/version.h"
diff --git a/chrome/browser/history/top_sites_factory.cc b/chrome/browser/history/top_sites_factory.cc
index 07b6c1e..a8746a8 100644
--- a/chrome/browser/history/top_sites_factory.cc
+++ b/chrome/browser/history/top_sites_factory.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/history/history_utils.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
-#include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/locale_settings.h"
@@ -33,7 +32,6 @@
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/ntp_tiles/constants.h"
 #include "components/pref_registry/pref_registry_syncable.h"
-#include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/gurl.h"
@@ -68,16 +66,12 @@
 #endif
 
 void InitializePrepopulatedPageList(
-    PrefService* prefs,
     history::PrepopulatedPageList* prepopulated_pages) {
 #if !defined(OS_ANDROID)
   DCHECK(prepopulated_pages);
-  bool hide_web_store_icon = prefs->GetBoolean(prefs::kHideWebStoreIcon);
   prepopulated_pages->reserve(arraysize(kRawPrepopulatedPages));
   for (size_t i = 0; i < arraysize(kRawPrepopulatedPages); ++i) {
     const RawPrepopulatedPage& page = kRawPrepopulatedPages[i];
-    if (hide_web_store_icon && page.url_id == IDS_WEBSTORE_URL)
-      continue;
     prepopulated_pages->push_back(history::PrepopulatedPage(
         GURL(l10n_util::GetStringUTF8(page.url_id)),
         l10n_util::GetStringUTF16(page.title_id),
@@ -122,6 +116,7 @@
   history::HistoryService* history_service =
       HistoryServiceFactory::GetForProfile(profile,
                                            ServiceAccessType::EXPLICIT_ACCESS);
+
   scoped_refptr<history::TopSitesImpl> top_sites(new history::TopSitesImpl(
       profile->GetPrefs(), history_service,
       CreateTopSitesProvider(profile, history_service), prepopulated_page_list,
@@ -147,8 +142,7 @@
 scoped_refptr<RefcountedKeyedService> TopSitesFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
   history::PrepopulatedPageList prepopulated_pages;
-  InitializePrepopulatedPageList(
-      Profile::FromBrowserContext(context)->GetPrefs(), &prepopulated_pages);
+  InitializePrepopulatedPageList(&prepopulated_pages);
   return BuildTopSites(context, prepopulated_pages);
 }
 
diff --git a/chrome/browser/icon_loader.cc b/chrome/browser/icon_loader.cc
index 6dccd97..25f6bb2 100644
--- a/chrome/browser/icon_loader.cc
+++ b/chrome/browser/icon_loader.cc
@@ -7,8 +7,8 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/icon_loader.h b/chrome/browser/icon_loader.h
index 4a56df0..bb105be 100644
--- a/chrome/browser/icon_loader.h
+++ b/chrome/browser/icon_loader.h
@@ -12,7 +12,7 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
 #include "ui/gfx/image/image.h"
diff --git a/chrome/browser/icon_loader_mac.mm b/chrome/browser/icon_loader_mac.mm
index 78ee502..243f36a 100644
--- a/chrome/browser/icon_loader_mac.mm
+++ b/chrome/browser/icon_loader_mac.mm
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "ui/gfx/image/image_skia.h"
 #include "ui/gfx/image/image_skia_util_mac.h"
diff --git a/chrome/browser/icon_loader_win.cc b/chrome/browser/icon_loader_win.cc
index c1097f4..09b43e89 100644
--- a/chrome/browser/icon_loader_win.cc
+++ b/chrome/browser/icon_loader_win.cc
@@ -8,7 +8,7 @@
 #include <shellapi.h>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/display/win/dpi.h"
diff --git a/chrome/browser/importer/importer_list.cc b/chrome/browser/importer/importer_list.cc
index 77d8d3a..c8b1156c 100644
--- a/chrome/browser/importer/importer_list.cc
+++ b/chrome/browser/importer/importer_list.cc
@@ -7,8 +7,8 @@
 #include <stdint.h>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/shell_integration.h"
diff --git a/chrome/browser/intranet_redirect_detector.h b/chrome/browser/intranet_redirect_detector.h
index 498b2d9..7fce5d95 100644
--- a/chrome/browser/intranet_redirect_detector.h
+++ b/chrome/browser/intranet_redirect_detector.h
@@ -12,9 +12,9 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "content/public/browser/notification_observer.h"
 #include "content/public/browser/notification_registrar.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "url/gurl.h"
 
 namespace network {
@@ -40,7 +40,7 @@
 // return a value at all times (even during startup or in unittest mode).  If no
 // redirection is in place, the returned GURL will be empty.
 class IntranetRedirectDetector
-    : public content::NetworkConnectionTracker::NetworkConnectionObserver {
+    : public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   // Only the main browser process loop should call this, when setting up
   // g_browser_process->intranet_redirect_detector_.  No code other than the
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc
index 04f7608c..7ac138b 100644
--- a/chrome/browser/io_thread.cc
+++ b/chrome/browser/io_thread.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
diff --git a/chrome/browser/lifetime/browser_shutdown.cc b/chrome/browser/lifetime/browser_shutdown.cc
index 55aac7b..d76d300 100644
--- a/chrome/browser/lifetime/browser_shutdown.cc
+++ b/chrome/browser/lifetime/browser_shutdown.cc
@@ -17,7 +17,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/local_discovery/service_discovery_client_mdns.cc b/chrome/browser/local_discovery/service_discovery_client_mdns.cc
index 6dda0c1..41d46d69 100644
--- a/chrome/browser/local_discovery/service_discovery_client_mdns.cc
+++ b/chrome/browser/local_discovery/service_discovery_client_mdns.cc
@@ -13,7 +13,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/local_discovery/service_discovery_client_impl.h"
diff --git a/chrome/browser/local_discovery/service_discovery_shared_client.cc b/chrome/browser/local_discovery/service_discovery_shared_client.cc
index 64eacc4..f87b1e9 100644
--- a/chrome/browser/local_discovery/service_discovery_shared_client.cc
+++ b/chrome/browser/local_discovery/service_discovery_shared_client.cc
@@ -14,7 +14,7 @@
 #include "base/files/file_path.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/timer/elapsed_timer.h"
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/firewall_manager_win.h"
diff --git a/chrome/browser/mac/keystone_glue.mm b/chrome/browser/mac/keystone_glue.mm
index a474375..9058d97 100644
--- a/chrome/browser/mac/keystone_glue.mm
+++ b/chrome/browser/mac/keystone_glue.mm
@@ -22,7 +22,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "build/build_config.h"
 #import "chrome/browser/mac/keystone_registration.h"
diff --git a/chrome/browser/media/android/cdm/media_drm_license_manager.cc b/chrome/browser/media/android/cdm/media_drm_license_manager.cc
index b6c8eef..cb435e0 100644
--- a/chrome/browser/media/android/cdm/media_drm_license_manager.cc
+++ b/chrome/browser/media/android/cdm/media_drm_license_manager.cc
@@ -7,7 +7,7 @@
 #include <vector>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/unguessable_token.h"
 #include "components/cdm/browser/media_drm_storage_impl.h"
diff --git a/chrome/browser/media/cast_mirroring_service_host.cc b/chrome/browser/media/cast_mirroring_service_host.cc
index 3da2353c..48fea05 100644
--- a/chrome/browser/media/cast_mirroring_service_host.cc
+++ b/chrome/browser/media/cast_mirroring_service_host.cc
@@ -8,10 +8,11 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/media/cast_remoting_connector.h"
 #include "chrome/browser/net/default_network_context_params.h"
 #include "components/mirroring/browser/single_client_video_capture_host.h"
+#include "content/public/browser/audio_loopback_stream_creator.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/browser/render_frame_host.h"
@@ -111,7 +112,36 @@
     mojom::AudioStreamCreatorClientPtr client,
     const media::AudioParameters& params,
     uint32_t total_segments) {
-  // TODO(xjz): Implementation will be added in a later CL.
+  content::WebContents* source_web_contents = nullptr;
+  if (source_media_id_.type == content::DesktopMediaID::TYPE_WEB_CONTENTS) {
+    source_web_contents = content::WebContents::FromRenderFrameHost(
+        content::RenderFrameHost::FromID(
+            source_media_id_.web_contents_id.render_process_id,
+            source_media_id_.web_contents_id.main_render_frame_id));
+    if (!source_web_contents) {
+      VLOG(1) << "Failed to create audio stream: Invalid source.";
+      return;
+    }
+  }
+
+  if (!audio_stream_creator_) {
+    audio_stream_creator_ = content::AudioLoopbackStreamCreator::
+        CreateInProcessAudioLoopbackStreamCreator();
+  }
+  audio_stream_creator_->CreateLoopbackStream(
+      source_web_contents, params, total_segments,
+      base::BindRepeating(
+          [](mojom::AudioStreamCreatorClientPtr client,
+             media::mojom::AudioInputStreamPtr stream,
+             media::mojom::AudioInputStreamClientRequest client_request,
+             media::mojom::ReadOnlyAudioDataPipePtr data_pipe) {
+            // TODO(xjz): Remove |initially_muted| argument from
+            // mojom::AudioStreamCreatorClient::StreamCreated().
+            client->StreamCreated(std::move(stream), std::move(client_request),
+                                  std::move(data_pipe),
+                                  false /* initially_muted */);
+          },
+          base::Passed(&client)));
 }
 
 void CastMirroringServiceHost::ConnectToRemotingSource(
diff --git a/chrome/browser/media/cast_mirroring_service_host.h b/chrome/browser/media/cast_mirroring_service_host.h
index b054587..04cd50b 100644
--- a/chrome/browser/media/cast_mirroring_service_host.h
+++ b/chrome/browser/media/cast_mirroring_service_host.h
@@ -10,6 +10,10 @@
 #include "components/mirroring/mojom/resource_provider.mojom.h"
 #include "content/public/browser/desktop_media_id.h"
 
+namespace content {
+class AudioLoopbackStreamCreator;
+}  // namespace content
+
 namespace mirroring {
 
 // CastMirroringServiceHost starts/stops a mirroring session through Mirroring
@@ -19,6 +23,7 @@
 class CastMirroringServiceHost final : public mojom::MirroringServiceHost,
                                        public mojom::ResourceProvider {
  public:
+  // |source_media_id| indicates the mirroring source.
   explicit CastMirroringServiceHost(content::DesktopMediaID source_media_id);
 
   ~CastMirroringServiceHost() override;
@@ -30,6 +35,8 @@
              mojom::CastMessageChannelRequest inbound_channel) override;
 
  private:
+  friend class CastMirroringServiceHostBrowserTest;
+
   // ResourceProvider implementation.
   void GetVideoCaptureHost(
       media::mojom::VideoCaptureHostRequest request) override;
@@ -45,6 +52,8 @@
   // Describes the media source for this mirroring session.
   const content::DesktopMediaID source_media_id_;
 
+  std::unique_ptr<content::AudioLoopbackStreamCreator> audio_stream_creator_;
+
   DISALLOW_COPY_AND_ASSIGN(CastMirroringServiceHost);
 };
 
diff --git a/chrome/browser/media/cast_mirroring_service_host_browsertest.cc b/chrome/browser/media/cast_mirroring_service_host_browsertest.cc
index 82a892ea..1110a21 100644
--- a/chrome/browser/media/cast_mirroring_service_host_browsertest.cc
+++ b/chrome/browser/media/cast_mirroring_service_host_browsertest.cc
@@ -109,12 +109,16 @@
 
 }  // namespace
 
-class CastMirroringServiceHostBrowserTest : public InProcessBrowserTest,
-                                            public mojom::SessionObserver,
-                                            public mojom::CastMessageChannel {
+class CastMirroringServiceHostBrowserTest
+    : public InProcessBrowserTest,
+      public mojom::SessionObserver,
+      public mojom::CastMessageChannel,
+      public mojom::AudioStreamCreatorClient {
  public:
   CastMirroringServiceHostBrowserTest()
-      : observer_binding_(this), outbound_channel_binding_(this) {}
+      : observer_binding_(this),
+        outbound_channel_binding_(this),
+        audio_client_binding_(this) {}
   ~CastMirroringServiceHostBrowserTest() override {}
 
  protected:
@@ -152,12 +156,14 @@
   }
 
   void StopMirroring() {
-    base::RunLoop run_loop;
-    EXPECT_CALL(*video_frame_receiver_,
-                OnStateChanged(media::mojom::VideoCaptureState::ENDED))
-        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
-    video_frame_receiver_->Stop();
-    run_loop.Run();
+    if (video_frame_receiver_) {
+      base::RunLoop run_loop;
+      EXPECT_CALL(*video_frame_receiver_,
+                  OnStateChanged(media::mojom::VideoCaptureState::ENDED))
+          .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+      video_frame_receiver_->Stop();
+      run_loop.Run();
+    }
     host_.reset();
   }
 
@@ -169,6 +175,22 @@
     run_loop.Run();
   }
 
+  void CreateAudioLoopbackStream() {
+    constexpr int kTotalSegments = 1;
+    constexpr int kAudioTimebase = 48000;
+    media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                  media::CHANNEL_LAYOUT_STEREO, kAudioTimebase,
+                                  kAudioTimebase / 100);
+    mojom::AudioStreamCreatorClientPtr audio_client_ptr;
+    audio_client_binding_.Bind(mojo::MakeRequest(&audio_client_ptr));
+    base::RunLoop run_loop;
+    EXPECT_CALL(*this, OnAudioStreamCreated())
+        .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit));
+    host_->CreateAudioStream(std::move(audio_client_ptr), params,
+                             kTotalSegments);
+    run_loop.Run();
+  }
+
   // InProcessBrowserTest override.
   void SetUp() override {
 #if defined(OS_CHROMEOS)
@@ -186,13 +208,27 @@
   // mojom::CastMessageChannel mocks.
   MOCK_METHOD1(Send, void(mojom::CastMessagePtr));
 
+  // mojom::AudioStreamCreatorClient mocks.
+  MOCK_METHOD0(OnAudioStreamCreated, void());
+  void StreamCreated(media::mojom::AudioInputStreamPtr stream,
+                     media::mojom::AudioInputStreamClientRequest client_request,
+                     media::mojom::ReadOnlyAudioDataPipePtr data_pipe,
+                     bool initially_muted) override {
+    EXPECT_TRUE(stream);
+    EXPECT_TRUE(client_request);
+    EXPECT_TRUE(data_pipe);
+    OnAudioStreamCreated();
+  }
+
 #if defined(OS_CHROMEOS)
   base::test::ScopedFeatureList scoped_feature_list_;
 #endif
 
   mojo::Binding<mojom::SessionObserver> observer_binding_;
   mojo::Binding<mojom::CastMessageChannel> outbound_channel_binding_;
+  mojo::Binding<mojom::AudioStreamCreatorClient> audio_client_binding_;
   mojom::CastMessageChannelPtr inbound_channel_;
+
   std::unique_ptr<CastMirroringServiceHost> host_;
   std::unique_ptr<MockVideoCaptureObserver> video_frame_receiver_;
 
@@ -207,4 +243,10 @@
   StopMirroring();
 }
 
+IN_PROC_BROWSER_TEST_F(CastMirroringServiceHostBrowserTest, CaptureTabAudio) {
+  StartTabMirroring();
+  CreateAudioLoopbackStream();
+  StopMirroring();
+}
+
 }  // namespace mirroring
diff --git a/chrome/browser/media/encrypted_media_browsertest.cc b/chrome/browser/media/encrypted_media_browsertest.cc
index e1968ce..f99fc69e 100644
--- a/chrome/browser/media/encrypted_media_browsertest.cc
+++ b/chrome/browser/media/encrypted_media_browsertest.cc
@@ -453,8 +453,7 @@
   void TestPolicyCheck() {
 // TODO(crbug.com/847591): ChromeOS Widevine CDM does not support policy check
 // API yet. Remove this condition when the CDM is updated.
-// TODO(crbug.com/851027): Reenable this test on Windows after bug is fixed.
-#if defined(WIDEVINE_CDM_AVAILABLE) && (defined(OS_CHROMEOS) || defined(OS_WIN))
+#if defined(WIDEVINE_CDM_AVAILABLE) && defined(OS_CHROMEOS)
     if (IsWidevine(CurrentKeySystem())) {
       DVLOG(0) << "Skipping test due to HDCP policy check related bugs.";
       return;
diff --git a/chrome/browser/media/router/discovery/BUILD.gn b/chrome/browser/media/router/discovery/BUILD.gn
index d4cb50e..ef7a335 100644
--- a/chrome/browser/media/router/discovery/BUILD.gn
+++ b/chrome/browser/media/router/discovery/BUILD.gn
@@ -17,6 +17,7 @@
     "//components/version_info",
     "//content/public/browser",
     "//content/public/common",
+    "//services/network/public/cpp",
   ]
   sources = [
     "dial/device_description_fetcher.cc",
diff --git a/chrome/browser/media/router/discovery/dial/dial_registry.cc b/chrome/browser/media/router/discovery/dial/dial_registry.cc
index 42aba4eb..9cb3142 100644
--- a/chrome/browser/media/router/discovery/dial/dial_registry.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_registry.cc
@@ -66,7 +66,7 @@
 }
 
 void DialRegistry::SetNetworkConnectionTracker(
-    content::NetworkConnectionTracker* tracker) {
+    network::NetworkConnectionTracker* tracker) {
   network_connection_tracker_ = tracker;
   network_connection_tracker_->AddLeakyNetworkConnectionObserver(this);
   // If there are no observers yet, it won't actually start.
@@ -158,7 +158,7 @@
     OnDialError(DIAL_NETWORK_DISCONNECTED);
     return false;
   }
-  if (content::NetworkConnectionTracker::IsConnectionCellular(type)) {
+  if (network::NetworkConnectionTracker::IsConnectionCellular(type)) {
     OnDialError(DIAL_CELLULAR_NETWORK);
     return false;
   }
diff --git a/chrome/browser/media/router/discovery/dial/dial_registry.h b/chrome/browser/media/router/discovery/dial/dial_registry.h
index 4b2b4c4..9b1fdf7 100644
--- a/chrome/browser/media/router/discovery/dial/dial_registry.h
+++ b/chrome/browser/media/router/discovery/dial/dial_registry.h
@@ -19,7 +19,7 @@
 #include "base/timer/timer.h"
 #include "chrome/browser/media/router/discovery/dial/dial_service.h"
 #include "chrome/browser/profiles/profile.h"
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 namespace base {
 class Clock;
@@ -37,7 +37,7 @@
 // DialRegistry lives on the IO thread.
 class DialRegistry
     : public DialService::Observer,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver {
+      public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   using DeviceList = std::vector<DialDeviceData>;
 
@@ -120,7 +120,7 @@
   ~DialRegistry() override;
 
   // Called when we've gotten the NetworkConnectionTracker from the UI thread.
-  void SetNetworkConnectionTracker(content::NetworkConnectionTracker* tracker);
+  void SetNetworkConnectionTracker(network::NetworkConnectionTracker* tracker);
 
   // DialService::Observer:
   void OnDiscoveryRequest(DialService* service) override;
@@ -130,7 +130,7 @@
   void OnError(DialService* service,
                const DialService::DialServiceErrorCode& code) override;
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver:
+  // network::NetworkConnectionTracker::NetworkConnectionObserver:
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   // Notify all observers about DialDeviceEvent or DialError.
@@ -206,7 +206,7 @@
   // Set just after construction, only used on the IO thread.
   net::NetLog* net_log_ = nullptr;
 
-  content::NetworkConnectionTracker* network_connection_tracker_ = nullptr;
+  network::NetworkConnectionTracker* network_connection_tracker_ = nullptr;
 
   base::Clock* clock_;
 
diff --git a/chrome/browser/media/router/discovery/dial/dial_service.cc b/chrome/browser/media/router/discovery/dial/dial_service.cc
index 7ff62ff..9f68149 100644
--- a/chrome/browser/media/router/discovery/dial/dial_service.cc
+++ b/chrome/browser/media/router/discovery/dial/dial_service.cc
@@ -15,7 +15,7 @@
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/media/router/discovery/dial/dial_device_data.h"
diff --git a/chrome/browser/media/router/discovery/discovery_network_monitor.cc b/chrome/browser/media/router/discovery/discovery_network_monitor.cc
index 2bc178d..a7074b9 100644
--- a/chrome/browser/media/router/discovery/discovery_network_monitor.cc
+++ b/chrome/browser/media/router/discovery/discovery_network_monitor.cc
@@ -13,9 +13,10 @@
 #include "base/sha1.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/time/default_tick_clock.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/media/router/discovery/discovery_network_list.h"
 #include "chrome/browser/media/router/discovery/discovery_network_monitor_metric_observer.h"
 #include "net/base/network_interfaces.h"
@@ -104,7 +105,10 @@
           std::make_unique<DiscoveryNetworkMonitorMetrics>())) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
   AddObserver(metric_observer_.get());
-  net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
+
+  g_browser_process->network_connection_tracker()
+      ->AddLeakyNetworkConnectionObserver(this);
+
   task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(
@@ -113,8 +117,7 @@
 }
 
 DiscoveryNetworkMonitor::~DiscoveryNetworkMonitor() {
-  net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
-  RemoveObserver(metric_observer_.get());
+  // Never gets called.
 }
 
 void DiscoveryNetworkMonitor::SetNetworkInfoFunctionForTest(
@@ -122,8 +125,8 @@
   network_info_function_ = strategy;
 }
 
-void DiscoveryNetworkMonitor::OnNetworkChanged(
-    net::NetworkChangeNotifier::ConnectionType) {
+void DiscoveryNetworkMonitor::OnConnectionChanged(
+    network::mojom::ConnectionType type) {
   task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(
diff --git a/chrome/browser/media/router/discovery/discovery_network_monitor.h b/chrome/browser/media/router/discovery/discovery_network_monitor.h
index e4eb37c..43c7d03 100644
--- a/chrome/browser/media/router/discovery/discovery_network_monitor.h
+++ b/chrome/browser/media/router/discovery/discovery_network_monitor.h
@@ -13,10 +13,10 @@
 #include "base/macros.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/sequence_checker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/media/router/discovery/discovery_network_info.h"
 #include "net/base/ip_address.h"
-#include "net/base/network_change_notifier.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 namespace media_router {
 
@@ -33,7 +33,7 @@
 // called from the IO thread.  All observers will be notified of network changes
 // on the thread from which they registered.
 class DiscoveryNetworkMonitor
-    : public net::NetworkChangeNotifier::NetworkChangeObserver {
+    : public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   using NetworkInfoFunction = std::vector<DiscoveryNetworkInfo> (*)();
   using NetworkIdCallback = base::OnceCallback<void(const std::string&)>;
@@ -71,6 +71,8 @@
   void GetNetworkId(NetworkIdCallback callback);
 
  private:
+  friend class CastMediaSinkServiceImplTest;
+  friend class DiscoveryNetworkMonitorTest;
   friend struct std::default_delete<DiscoveryNetworkMonitor>;
   friend struct base::LazyInstanceTraitsBase<DiscoveryNetworkMonitor>;
 
@@ -80,9 +82,8 @@
 
   void SetNetworkInfoFunctionForTest(NetworkInfoFunction strategy);
 
-  // net::NetworkChangeNotifier::NetworkChangeObserver
-  void OnNetworkChanged(
-      net::NetworkChangeNotifier::ConnectionType type) override;
+  // network::NetworkConnectionTracker::NetworkConnectionObserver overrides.
+  void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   std::string GetNetworkIdOnSequence() const;
   std::string UpdateNetworkInfo();
diff --git a/chrome/browser/media/router/discovery/discovery_network_monitor_unittest.cc b/chrome/browser/media/router/discovery/discovery_network_monitor_unittest.cc
index 89ab1d3e..f8a443e 100644
--- a/chrome/browser/media/router/discovery/discovery_network_monitor_unittest.cc
+++ b/chrome/browser/media/router/discovery/discovery_network_monitor_unittest.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "base/memory/ptr_util.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -38,6 +38,10 @@
     return fake_network_info;
   }
 
+  void ChangeConnectionType(network::mojom::ConnectionType connection_type) {
+    discovery_network_monitor->OnConnectionChanged(connection_type);
+  }
+
   base::test::ScopedTaskEnvironment scoped_task_environment;
   MockDiscoveryObserver mock_observer;
 
@@ -47,9 +51,6 @@
       {DiscoveryNetworkInfo{std::string("wlp3s0"), std::string("wifi1")},
        DiscoveryNetworkInfo{std::string("wlp3s1"), std::string("wifi2")}}};
 
-  std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier =
-      base::WrapUnique(net::NetworkChangeNotifier::CreateMock());
-
   static std::vector<DiscoveryNetworkInfo> fake_network_info;
   std::unique_ptr<DiscoveryNetworkMonitor> discovery_network_monitor;
 };
@@ -70,8 +71,7 @@
   EXPECT_CALL(mock_observer, OnNetworksChanged(_))
       .WillOnce(Invoke(capture_network_id));
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   scoped_task_environment.RunUntilIdle();
 
   std::string ethernet_network_id = current_network_id;
@@ -80,16 +80,14 @@
   EXPECT_CALL(mock_observer, OnNetworksChanged(_))
       .WillOnce(Invoke(capture_network_id));
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   scoped_task_environment.RunUntilIdle();
 
   fake_network_info = fake_wifi_info;
   EXPECT_CALL(mock_observer, OnNetworksChanged(_))
       .WillOnce(Invoke(capture_network_id));
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   scoped_task_environment.RunUntilIdle();
 
   std::string wifi_network_id = current_network_id;
@@ -97,8 +95,7 @@
   EXPECT_CALL(mock_observer, OnNetworksChanged(_))
       .WillOnce(Invoke(capture_network_id));
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   scoped_task_environment.RunUntilIdle();
 
   EXPECT_EQ(ethernet_network_id, current_network_id);
@@ -113,15 +110,13 @@
   discovery_network_monitor->AddObserver(&mock_observer);
   EXPECT_CALL(mock_observer, OnNetworksChanged(_));
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   scoped_task_environment.RunUntilIdle();
 
   discovery_network_monitor->RemoveObserver(&mock_observer);
   fake_network_info.clear();
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   scoped_task_environment.RunUntilIdle();
 }
 
@@ -184,8 +179,7 @@
   discovery_network_monitor->AddObserver(&mock_observer);
   EXPECT_CALL(mock_observer, OnNetworksChanged(_));
 
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   scoped_task_environment.RunUntilIdle();
 
   std::string current_network_id;
diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
index d0fecea..47ffa101 100644
--- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
+++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service_impl_unittest.cc
@@ -98,6 +98,10 @@
     media_sink_service_impl_.OpenChannels(cast_sinks, sink_source);
   }
 
+  void ChangeConnectionType(network::mojom::ConnectionType connection_type) {
+    discovery_network_monitor_->OnConnectionChanged(connection_type);
+  }
+
  protected:
   void ExpectOpenSocketInternal(cast_channel::CastSocket* socket) {
     EXPECT_CALL(*mock_cast_socket_service_,
@@ -120,8 +124,6 @@
 
   const content::TestBrowserThreadBundle thread_bundle_;
   scoped_refptr<base::TestMockTimeTaskRunner> mock_time_task_runner_;
-  std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_ =
-      base::WrapUnique(net::NetworkChangeNotifier::CreateMock());
   std::unique_ptr<DiscoveryNetworkMonitor> discovery_network_monitor_ =
       DiscoveryNetworkMonitor::CreateInstanceForTest(&FakeGetNetworkInfo);
 
@@ -762,14 +764,12 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, sink1);
@@ -789,8 +789,7 @@
   // Reconnecting to the previous ethernet network should restore the same sinks
   // from the cache and attempt to resolve them.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -799,8 +798,7 @@
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint2, _, _));
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -834,14 +832,12 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, sink1);
@@ -860,8 +856,7 @@
   // Reconnecting to the previous ethernet network should restore only |sink1|,
   // since |sink2| failed to resolve.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -871,8 +866,7 @@
               OpenSocketInternal(ip_endpoint2, _, _))
       .Times(0);
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -901,14 +895,12 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -927,15 +919,13 @@
   // since the only sink to resolve successfully, |sink1|, later had a channel
   // error.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(_, _, _)).Times(0);
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -949,8 +939,7 @@
   media_sink_service_impl_.retry_params_.max_retry_attempts = 0;
 
   fake_network_info_ = fake_unknown_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_UNKNOWN);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_UNKNOWN);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -974,8 +963,7 @@
 
   // Network is reported as disconnected but discover a new device.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, sink1);
@@ -996,15 +984,13 @@
   // cache items from another unknown network.
   EXPECT_CALL(*mock_cast_socket_service_, OpenSocketInternal(_, _, _)).Times(0);
   fake_network_info_ = fake_unknown_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   // Similarly, disconnecting from the network shouldn't pull any cache items.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -1037,14 +1023,12 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, sink1);
@@ -1064,8 +1048,7 @@
   // Reconnecting to the previous ethernet network should restore the same sinks
   // from the cache and attempt to resolve them.  |sink3| is also lost.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -1077,8 +1060,7 @@
   ExpectOpenSocketInternal(&socket1);
   ExpectOpenSocketInternal(&socket2);
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -1096,8 +1078,7 @@
 
   // Disconnect from the network and lose sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint4, sink4);
@@ -1106,8 +1087,7 @@
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint4, _, _));
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -1151,14 +1131,12 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, sink1_cast);
@@ -1187,8 +1165,7 @@
   // Reconnecting to the previous ethernet network should restore the same sinks
   // from the cache and attempt to resolve them.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
@@ -1197,8 +1174,7 @@
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint2, _, _));
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -1240,14 +1216,12 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1_cast, sink1_cast);
@@ -1267,16 +1241,14 @@
   // Reconnecting to the previous ethernet network should restore the same sinks
   // from the cache and attempt to resolve them.
   fake_network_info_.clear();
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_NONE);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_NONE);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint1_cast, _, _));
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
@@ -1309,8 +1281,7 @@
 
   // Connect to a new network with different sinks.
   fake_network_info_ = fake_wifi_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_WIFI);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_WIFI);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
   media_sink_service_impl_.OnChannelOpenFailed(ip_endpoint1, sink1);
@@ -1334,8 +1305,7 @@
   EXPECT_CALL(*mock_cast_socket_service_,
               OpenSocketInternal(ip_endpoint2, _, _));
   fake_network_info_ = fake_ethernet_info_;
-  net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
-      net::NetworkChangeNotifier::CONNECTION_ETHERNET);
+  ChangeConnectionType(network::mojom::ConnectionType::CONNECTION_ETHERNET);
   content::RunAllTasksUntilIdle();
   mock_time_task_runner_->FastForwardUntilNoTasksRemain();
 }
diff --git a/chrome/browser/media/router/mojo/media_route_provider_util_win.cc b/chrome/browser/media/router/mojo/media_route_provider_util_win.cc
index 4fa3677d..2666ce9 100644
--- a/chrome/browser/media/router/mojo/media_route_provider_util_win.cc
+++ b/chrome/browser/media/router/mojo/media_route_provider_util_win.cc
@@ -8,7 +8,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "chrome/installer/util/browser_distribution.h"
 #include "chrome/installer/util/firewall_manager_win.h"
diff --git a/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc b/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc
index e9b20a4..044ebb0 100644
--- a/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc
+++ b/chrome/browser/media/webrtc/audio_debug_recordings_handler.cc
@@ -11,7 +11,7 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "components/webrtc_logging/browser/log_list.h"
 #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
index 8061f241..09a3b40 100644
--- a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
+++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -420,7 +420,8 @@
         content::DesktopStreamsRegistry::GetInstance()->RequestMediaForStreamId(
             request.requested_video_device_id,
             main_frame->GetProcess()->GetID(), main_frame->GetRoutingID(),
-            request.security_origin, &original_extension_name);
+            request.security_origin, &original_extension_name,
+            content::kRegistryStreamTypeDesktop);
   }
 
   // Received invalid device id.
diff --git a/chrome/browser/media/webrtc/native_desktop_media_list.cc b/chrome/browser/media/webrtc/native_desktop_media_list.cc
index 456f429..798b4d7 100644
--- a/chrome/browser/media/webrtc/native_desktop_media_list.cc
+++ b/chrome/browser/media/webrtc/native_desktop_media_list.cc
@@ -6,7 +6,7 @@
 
 #include "base/hash.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/media/webrtc/desktop_media_list_observer.h"
 #include "chrome/grit/generated_resources.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/media/webrtc/tab_desktop_media_list.cc b/chrome/browser/media/webrtc/tab_desktop_media_list.cc
index b78fdae..9b5c32889 100644
--- a/chrome/browser/media/webrtc/tab_desktop_media_list.cc
+++ b/chrome/browser/media/webrtc/tab_desktop_media_list.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/media/webrtc/tab_desktop_media_list.h"
 
 #include "base/hash.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_list.h"
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
index 8e4f51d2..4a58431 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.cc
@@ -4,10 +4,13 @@
 
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/common/pref_names.h"
+#include "components/prefs/pref_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
@@ -47,7 +50,24 @@
   }
 };
 
-const BrowserContext* GetBrowserContext(int render_process_id) {
+// Check whether remote-bound logging is generally allowed, although not
+// necessarily for any given user profile.
+// 1. Certain platforms (mobile) are blocked from remote-bound logging.
+// 2. There is a Finch-controlled kill-switch for the feature.
+bool IsRemoteLoggingFeatureEnabled() {
+#if defined(OS_ANDROID)
+  bool enabled = false;
+#else
+  bool enabled = base::FeatureList::IsEnabled(features::kWebRtcRemoteEventLog);
+#endif
+
+  VLOG(1) << "WebRTC remote-bound event logging "
+          << (enabled ? "enabled" : "disabled") << ".";
+
+  return enabled;
+}
+
+BrowserContext* GetBrowserContext(int render_process_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   RenderProcessHost* const host = RenderProcessHost::FromID(render_process_id);
   return host ? host->GetBrowserContext() : nullptr;
@@ -83,21 +103,17 @@
 }
 
 WebRtcEventLogManager::WebRtcEventLogManager()
-    : local_logs_observer_(nullptr),
+    : task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
+      remote_logging_feature_enabled_(IsRemoteLoggingFeatureEnabled()),
+      local_logs_observer_(nullptr),
       remote_logs_observer_(nullptr),
       local_logs_manager_(this),
+      remote_logs_manager_(this, task_runner_),
       pc_tracker_proxy_(new PeerConnectionTrackerProxyImpl),
-      first_browser_context_initializations_done_(false),
-      task_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
-           base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {
+      first_browser_context_initializations_done_(false) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-
-  if (IsRemoteLoggingEnabled()) {
-    remote_logs_manager_ =
-        std::make_unique<WebRtcRemoteEventLogManager>(this, task_runner_);
-  }
-
   DCHECK(!g_webrtc_event_log_manager);
   g_webrtc_event_log_manager = this;
 }
@@ -113,8 +129,10 @@
   g_webrtc_event_log_manager = nullptr;
 }
 
+// TODO(crbug.com/775415): If a BrowserContext had the policy as active in
+// the past, but no longer does, purge pending log files from before.
 void WebRtcEventLogManager::EnableForBrowserContext(
-    const BrowserContext* browser_context,
+    BrowserContext* browser_context,
     base::OnceClosure reply) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(browser_context);
@@ -125,29 +143,39 @@
     first_browser_context_initializations_done_ = true;
   }
 
+  StartListeningForPrefChangeForBrowserContext(browser_context);
+
+  if (!IsRemoteLoggingAllowedForBrowserContext(browser_context)) {
+    MaybeReply(FROM_HERE, std::move(reply));
+    return;
+  }
+
   // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
   // will not be dereferenced after destruction.
   task_runner_->PostTask(
       FROM_HERE,
-      base::BindOnce(&WebRtcEventLogManager::EnableForBrowserContextInternal,
-                     base::Unretained(this),
-                     GetBrowserContextId(browser_context),
-                     browser_context->GetPath(), std::move(reply)));
+      base::BindOnce(
+          &WebRtcEventLogManager::EnableRemoteBoundLoggingForBrowserContext,
+          base::Unretained(this), GetBrowserContextId(browser_context),
+          browser_context->GetPath(), std::move(reply)));
 }
 
 void WebRtcEventLogManager::DisableForBrowserContext(
-    const content::BrowserContext* browser_context,
+    content::BrowserContext* browser_context,
     base::OnceClosure reply) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(browser_context);
 
+  StopListeningForPrefChangeForBrowserContext(browser_context);
+
   // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
   // will not be dereferenced after destruction.
   task_runner_->PostTask(
       FROM_HERE,
-      base::BindOnce(&WebRtcEventLogManager::DisableForBrowserContextInternal,
-                     base::Unretained(this),
-                     GetBrowserContextId(browser_context), std::move(reply)));
+      base::BindOnce(
+          &WebRtcEventLogManager::DisableRemoteBoundLoggingForBrowserContext,
+          base::Unretained(this), GetBrowserContextId(browser_context),
+          std::move(reply)));
 }
 
 void WebRtcEventLogManager::PeerConnectionAdded(
@@ -269,8 +297,6 @@
   const auto browser_context_id = GetBrowserContextId(browser_context);
   DCHECK_NE(browser_context_id, kNullBrowserContextId);
 
-  const bool remote_logging_allowed = !browser_context->IsOffTheRecord();
-
   // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
   // will not be dereferenced after destruction.
   task_runner_->PostTask(
@@ -279,7 +305,7 @@
           &WebRtcEventLogManager::OnWebRtcEventLogWriteInternal,
           base::Unretained(this),
           PeerConnectionKey(render_process_id, lid, browser_context_id),
-          remote_logging_allowed, message, std::move(reply)));
+          message, std::move(reply)));
 }
 
 void WebRtcEventLogManager::StartRemoteLogging(
@@ -291,14 +317,14 @@
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(reply);
 
-  const BrowserContext* browser_context = GetBrowserContext(render_process_id);
+  BrowserContext* browser_context = GetBrowserContext(render_process_id);
   const char* error = nullptr;
 
-  if (!remote_logs_manager_) {
-    error = kStartRemoteLoggingFailureFeatureDisabled;
-  } else if (!browser_context) {
+  if (!browser_context) {
     // RPH died before processing of this notification.
     error = kStartRemoteLoggingFailureGeneric;
+  } else if (!IsRemoteLoggingAllowedForBrowserContext(browser_context)) {
+    error = kStartRemoteLoggingFailureFeatureDisabled;
   } else if (browser_context->IsOffTheRecord()) {
     // Feature disable in incognito. Since the feature can be disabled for
     // non-incognito sessions, this should not expose incognito mode.
@@ -367,40 +393,35 @@
                      base::Unretained(this), observer, std::move(reply)));
 }
 
-bool WebRtcEventLogManager::IsRemoteLoggingEnabled() const {
+bool WebRtcEventLogManager::IsRemoteLoggingAllowedForBrowserContext(
+    BrowserContext* browser_context) const {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(browser_context);
 
-#if defined(OS_ANDROID)
-  bool enabled = false;
-#else
-  // TODO(crbug.com/775415): Even when the feature is generally enabled, it
-  // should only be active for sessions where the appropriate policy is set.
-  bool enabled = base::FeatureList::IsEnabled(features::kWebRtcRemoteEventLog);
-#endif
+  if (!remote_logging_feature_enabled_) {
+    return false;
+  }
 
-  VLOG(1) << "WebRTC remote-bound event logging "
-          << (enabled ? "enabled" : "disabled") << ".";
-
-  return enabled;
+  const Profile* profile = Profile::FromBrowserContext(browser_context);
+  DCHECK(profile);
+  return profile->GetPrefs()->GetBoolean(
+      prefs::kWebRtcEventLogCollectionAllowed);
 }
 
 std::unique_ptr<LogFileWriter::Factory>
 WebRtcEventLogManager::CreateRemoteLogFileWriterFactory() {
-#if defined(OS_ANDROID)
-  NOTREACHED();
-  return nullptr;  // Appease compiler.
-#else
   if (remote_log_file_writer_factory_for_testing_) {
     return std::move(remote_log_file_writer_factory_for_testing_);
+#if !defined(OS_ANDROID)
   } else if (base::FeatureList::IsEnabled(
                  features::kWebRtcRemoteEventLogGzipped)) {
     return std::make_unique<GzippedLogFileWriterFactory>(
         std::make_unique<GzipLogCompressorFactory>(
             std::make_unique<DefaultGzippedSizeEstimator::Factory>()));
+#endif
   } else {
     return std::make_unique<BaseLogFileWriterFactory>();
   }
-#endif
 }
 
 void WebRtcEventLogManager::RenderProcessExited(
@@ -480,14 +501,14 @@
 void WebRtcEventLogManager::OnLoggingTargetStarted(LoggingTarget target,
                                                    PeerConnectionKey key) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
-  auto it = peer_connections_with_event_logging_enabled_.find(key);
-  if (it != peer_connections_with_event_logging_enabled_.end()) {
+  auto it = peer_connections_with_event_logging_enabled_in_webrtc_.find(key);
+  if (it != peer_connections_with_event_logging_enabled_in_webrtc_.end()) {
     DCHECK_EQ((it->second & target), 0u);
     it->second |= target;
   } else {
     // This is the first client for WebRTC event logging - let WebRTC know
     // that it should start informing us of events.
-    peer_connections_with_event_logging_enabled_.emplace(key, target);
+    peer_connections_with_event_logging_enabled_in_webrtc_.emplace(key, target);
     pc_tracker_proxy_->SetWebRtcEventLoggingState(key, true);
   }
 }
@@ -497,27 +518,96 @@
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   // Record that we're no longer performing this type of logging for this PC.
-  auto it = peer_connections_with_event_logging_enabled_.find(key);
-  CHECK(it != peer_connections_with_event_logging_enabled_.end());
+  auto it = peer_connections_with_event_logging_enabled_in_webrtc_.find(key);
+  CHECK(it != peer_connections_with_event_logging_enabled_in_webrtc_.end());
   DCHECK_NE(it->second, 0u);
   it->second &= ~target;
 
   // If we're not doing any other type of logging for this peer connection,
   // it's time to stop receiving notifications for it from WebRTC.
   if (it->second == 0u) {
-    peer_connections_with_event_logging_enabled_.erase(it);
+    peer_connections_with_event_logging_enabled_in_webrtc_.erase(it);
     pc_tracker_proxy_->SetWebRtcEventLoggingState(key, false);
   }
 }
 
+void WebRtcEventLogManager::StartListeningForPrefChangeForBrowserContext(
+    BrowserContext* browser_context) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(first_browser_context_initializations_done_);
+  CHECK(!browser_context->IsOffTheRecord());
+
+  const auto browser_context_id = GetBrowserContextId(browser_context);
+  auto it = pref_change_registrars_.emplace(std::piecewise_construct,
+                                            std::make_tuple(browser_context_id),
+                                            std::make_tuple());
+  DCHECK(it.second) << "Already listening.";
+  PrefChangeRegistrar& registrar = it.first->second;
+
+  Profile* profile = Profile::FromBrowserContext(browser_context);
+  DCHECK(profile);
+  registrar.Init(profile->GetPrefs());
+
+  // * |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+  //   will not be dereferenced after destruction.
+  // * base::Unretained(browser_context) is safe, because |browser_context|
+  //   stays alive until Chrome shut-down, at which point we'll stop listening
+  //   as part of its (BrowserContext's) tear-down process.
+  registrar.Add(prefs::kWebRtcEventLogCollectionAllowed,
+                base::BindRepeating(&WebRtcEventLogManager::OnPrefChange,
+                                    base::Unretained(this),
+                                    base::Unretained(browser_context)));
+}
+
+void WebRtcEventLogManager::StopListeningForPrefChangeForBrowserContext(
+    BrowserContext* browser_context) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  const auto browser_context_id = GetBrowserContextId(browser_context);
+
+  size_t erased_count = pref_change_registrars_.erase(browser_context_id);
+  DCHECK_EQ(erased_count, 1u);
+}
+
+void WebRtcEventLogManager::OnPrefChange(BrowserContext* browser_context) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  DCHECK(first_browser_context_initializations_done_);
+
+  const Profile* profile = Profile::FromBrowserContext(browser_context);
+  DCHECK(profile);
+
+  const bool enabled =
+      profile->GetPrefs()->GetBoolean(prefs::kWebRtcEventLogCollectionAllowed);
+
+  if (!enabled) {
+    // Dynamic refresh of the policy to DISABLED; stop ongoing logs, remove
+    // pending log files and stop any active uploads.
+    ClearCacheForBrowserContext(browser_context, base::Time::Min(),
+                                base::Time::Max(), base::DoNothing());
+  }
+
+  // |this| is destroyed by ~BrowserProcessImpl(), so base::Unretained(this)
+  // will not be dereferenced after destruction.
+  base::OnceClosure task;
+  if (enabled) {
+    task = base::BindOnce(
+        &WebRtcEventLogManager::EnableRemoteBoundLoggingForBrowserContext,
+        base::Unretained(this), GetBrowserContextId(browser_context),
+        browser_context->GetPath(), base::OnceClosure());
+  } else {
+    task = base::BindOnce(
+        &WebRtcEventLogManager::DisableRemoteBoundLoggingForBrowserContext,
+        base::Unretained(this), GetBrowserContextId(browser_context),
+        base::OnceClosure());
+  }
+
+  task_runner_->PostTask(FROM_HERE, std::move(task));
+}
+
 void WebRtcEventLogManager::OnFirstBrowserContextLoaded() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  if (!remote_logs_manager_) {
-    return;
-  }
-
-  content::NetworkConnectionTracker* network_connection_tracker =
+  network::NetworkConnectionTracker* network_connection_tracker =
       g_browser_process->network_connection_tracker();
   DCHECK(network_connection_tracker);
 
@@ -545,43 +635,40 @@
 }
 
 void WebRtcEventLogManager::OnFirstBrowserContextLoadedInternal(
-    content::NetworkConnectionTracker* network_connection_tracker,
+    network::NetworkConnectionTracker* network_connection_tracker,
     net::URLRequestContextGetter* url_request_context_getter,
     std::unique_ptr<LogFileWriter::Factory> log_file_writer_factory) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(network_connection_tracker);
   DCHECK(url_request_context_getter);
   DCHECK(log_file_writer_factory);
-  DCHECK(remote_logs_manager_);
-  remote_logs_manager_->SetNetworkConnectionTracker(network_connection_tracker);
-  remote_logs_manager_->SetUrlRequestContextGetter(url_request_context_getter);
-  remote_logs_manager_->SetLogFileWriterFactory(
+  remote_logs_manager_.SetNetworkConnectionTracker(network_connection_tracker);
+  remote_logs_manager_.SetUrlRequestContextGetter(url_request_context_getter);
+  remote_logs_manager_.SetLogFileWriterFactory(
       std::move(log_file_writer_factory));
 }
 
-void WebRtcEventLogManager::EnableForBrowserContextInternal(
+void WebRtcEventLogManager::EnableRemoteBoundLoggingForBrowserContext(
     BrowserContextId browser_context_id,
     const base::FilePath& browser_context_dir,
     base::OnceClosure reply) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK_NE(browser_context_id, kNullBrowserContextId);
 
-  if (remote_logs_manager_) {
-    remote_logs_manager_->EnableForBrowserContext(browser_context_id,
-                                                  browser_context_dir);
-  }
+  remote_logs_manager_.EnableForBrowserContext(browser_context_id,
+                                               browser_context_dir);
 
   MaybeReply(FROM_HERE, std::move(reply));
 }
 
-void WebRtcEventLogManager::DisableForBrowserContextInternal(
+void WebRtcEventLogManager::DisableRemoteBoundLoggingForBrowserContext(
     BrowserContextId browser_context_id,
     base::OnceClosure reply) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
-  if (remote_logs_manager_) {
-    remote_logs_manager_->DisableForBrowserContext(browser_context_id);
-  }
+  // Note that the BrowserContext might never have been enabled in the
+  // remote-bound manager; that's not a problem.
+  remote_logs_manager_.DisableForBrowserContext(browser_context_id);
 
   MaybeReply(FROM_HERE, std::move(reply));
 }
@@ -593,12 +680,9 @@
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   const bool local_result = local_logs_manager_.PeerConnectionAdded(key);
-
-  if (remote_logs_manager_) {
-    const bool remote_result =
-        remote_logs_manager_->PeerConnectionAdded(key, peer_connection_id);
-    DCHECK_EQ(local_result, remote_result);
-  }
+  const bool remote_result =
+      remote_logs_manager_.PeerConnectionAdded(key, peer_connection_id);
+  DCHECK_EQ(local_result, remote_result);
 
   MaybeReply(FROM_HERE, std::move(reply), local_result);
 }
@@ -609,10 +693,8 @@
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   const bool local_result = local_logs_manager_.PeerConnectionRemoved(key);
-  if (remote_logs_manager_) {
-    const bool remote_result = remote_logs_manager_->PeerConnectionRemoved(key);
-    DCHECK_EQ(local_result, remote_result);
-  }
+  const bool remote_result = remote_logs_manager_.PeerConnectionRemoved(key);
+  DCHECK_EQ(local_result, remote_result);
 
   MaybeReply(FROM_HERE, std::move(reply), local_result);
 }
@@ -640,16 +722,12 @@
 
 void WebRtcEventLogManager::OnWebRtcEventLogWriteInternal(
     PeerConnectionKey key,
-    bool remote_logging_allowed,
     const std::string& message,
     base::OnceCallback<void(std::pair<bool, bool>)> reply) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
 
   const bool local_result = local_logs_manager_.EventLogWrite(key, message);
-  const bool remote_result =
-      (remote_logging_allowed && remote_logs_manager_)
-          ? remote_logs_manager_->EventLogWrite(key, message)
-          : false;
+  const bool remote_result = remote_logs_manager_.EventLogWrite(key, message);
 
   MaybeReply(FROM_HERE, std::move(reply),
              std::make_pair(local_result, remote_result));
@@ -667,7 +745,7 @@
 
   std::string log_id;
   std::string error_message;
-  const bool result = remote_logs_manager_->StartRemoteLogging(
+  const bool result = remote_logs_manager_.StartRemoteLogging(
       render_process_id, browser_context_id, peer_connection_id,
       browser_context_dir, max_file_size_bytes, &log_id, &error_message);
 
@@ -685,19 +763,14 @@
     const base::Time& delete_begin,
     const base::Time& delete_end) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
-
-  if (remote_logs_manager_) {
-    remote_logs_manager_->ClearCacheForBrowserContext(browser_context_id,
-                                                      delete_begin, delete_end);
-  }
+  remote_logs_manager_.ClearCacheForBrowserContext(browser_context_id,
+                                                   delete_begin, delete_end);
 }
 
 void WebRtcEventLogManager::RenderProcessExitedInternal(int render_process_id) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   local_logs_manager_.RenderProcessHostExitedDestroyed(render_process_id);
-  if (remote_logs_manager_) {
-    remote_logs_manager_->RenderProcessHostExitedDestroyed(render_process_id);
-  }
+  remote_logs_manager_.RenderProcessHostExitedDestroyed(render_process_id);
 }
 
 void WebRtcEventLogManager::SetLocalLogsObserverInternal(
@@ -767,15 +840,14 @@
     std::unique_ptr<WebRtcEventLogUploader::Factory> uploader_factory,
     base::OnceClosure reply) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(remote_logs_manager_);  // The test would otherwise be meaningless.
   DCHECK(reply);
 
   auto task =
       [](WebRtcEventLogManager* manager,
          std::unique_ptr<WebRtcEventLogUploader::Factory> uploader_factory,
          base::OnceClosure reply) {
-        auto* remote_logs_manager = manager->remote_logs_manager_.get();
-        remote_logs_manager->SetWebRtcEventLogUploaderFactoryForTesting(
+        auto& remote_logs_manager = manager->remote_logs_manager_;
+        remote_logs_manager.SetWebRtcEventLogUploaderFactoryForTesting(
             std::move(uploader_factory));
 
         BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, std::move(reply));
@@ -799,12 +871,13 @@
 void WebRtcEventLogManager::UploadConditionsHoldForTesting(
     base::OnceCallback<void(bool)> callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(remote_logs_manager_);
+  // Unit tests block until |callback| is sent back, so the use
+  // of base::Unretained(&remote_logs_manager_) is safe.
   task_runner_->PostTask(
       FROM_HERE,
       base::BindOnce(
           &WebRtcRemoteEventLogManager::UploadConditionsHoldForTesting,
-          base::Unretained(remote_logs_manager_.get()), std::move(callback)));
+          base::Unretained(&remote_logs_manager_), std::move(callback)));
 }
 
 scoped_refptr<base::SequencedTaskRunner>&
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager.h b/chrome/browser/media/webrtc/webrtc_event_log_manager.h
index 5604a9b..8903e26 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager.h
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager.h
@@ -19,6 +19,7 @@
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_common.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_local.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h"
+#include "components/prefs/pref_change_registrar.h"
 #include "content/public/browser/render_process_host_observer.h"
 #include "content/public/browser/webrtc_event_logger.h"
 
@@ -70,10 +71,10 @@
 
   ~WebRtcEventLogManager() override;
 
-  void EnableForBrowserContext(const content::BrowserContext* browser_context,
+  void EnableForBrowserContext(content::BrowserContext* browser_context,
                                base::OnceClosure reply) override;
 
-  void DisableForBrowserContext(const content::BrowserContext* browser_context,
+  void DisableForBrowserContext(content::BrowserContext* browser_context,
                                 base::OnceClosure reply) override;
 
   void PeerConnectionAdded(int render_process_id,
@@ -168,8 +169,8 @@
 
   WebRtcEventLogManager();
 
-  // Checks whether remote-bound logging is enabled.
-  bool IsRemoteLoggingEnabled() const;
+  bool IsRemoteLoggingAllowedForBrowserContext(
+      content::BrowserContext* browser_context) const;
 
   // Determines the exact subclass of LogFileWriter::Factory to be used for
   // producing remote-bound logs.
@@ -198,6 +199,13 @@
   void OnLoggingTargetStarted(LoggingTarget target, PeerConnectionKey key);
   void OnLoggingTargetStopped(LoggingTarget target, PeerConnectionKey key);
 
+  void StartListeningForPrefChangeForBrowserContext(
+      content::BrowserContext* browser_context);
+  void StopListeningForPrefChangeForBrowserContext(
+      content::BrowserContext* browser_context);
+
+  void OnPrefChange(content::BrowserContext* browser_context);
+
   // network_connection_tracker() and system_request_context() are not available
   // during instantiation; we get them when the first profile is loaded, which
   // is also the earliest time when they could be needed.
@@ -207,16 +215,18 @@
   // OnFirstBrowserContextLoadedInternal() is the task sent to |task_runner_|.
   void OnFirstBrowserContextLoaded();
   void OnFirstBrowserContextLoadedInternal(
-      content::NetworkConnectionTracker* network_connection_tracker,
+      network::NetworkConnectionTracker* network_connection_tracker,
       net::URLRequestContextGetter* url_request_context_getter,
       std::unique_ptr<LogFileWriter::Factory> log_file_writer_factory);
 
-  void EnableForBrowserContextInternal(
+  void EnableRemoteBoundLoggingForBrowserContext(
       BrowserContextId browser_context_id,
       const base::FilePath& browser_context_dir,
       base::OnceClosure reply);
-  void DisableForBrowserContextInternal(BrowserContextId browser_context_id,
-                                        base::OnceClosure reply);
+
+  void DisableRemoteBoundLoggingForBrowserContext(
+      BrowserContextId browser_context_id,
+      base::OnceClosure reply);
 
   void PeerConnectionAddedInternal(PeerConnectionKey key,
                                    const std::string& peer_connection_id,
@@ -231,7 +241,6 @@
 
   void OnWebRtcEventLogWriteInternal(
       PeerConnectionKey key,
-      bool remote_logging_allowed,
       const std::string& message,
       base::OnceCallback<void(std::pair<bool, bool>)> reply);
 
@@ -296,6 +305,16 @@
 
   static WebRtcEventLogManager* g_webrtc_event_log_manager;
 
+  // The main logic will run sequentially on this runner, on which blocking
+  // tasks are allowed.
+  scoped_refptr<base::SequencedTaskRunner> task_runner_;
+
+  // Indicates whether remote-bound logging is generally allowed, although
+  // possibly not for all profiles. This makes it possible for remote-bound to
+  // be disabled through Finch.
+  // TODO(crbug.com/775415): Remove this kill-switch.
+  const bool remote_logging_feature_enabled_;
+
   // Observer which will be informed whenever a local log file is started or
   // stopped. Its callbacks are called synchronously from |task_runner_|,
   // so the observer needs to be able to either run from any (sequenced) runner.
@@ -311,18 +330,18 @@
   WebRtcLocalEventLogManager local_logs_manager_;
 
   // Manages remote-bound logs - logs which will be sent to a remote server.
-  // This is only possible when a command line flag is present.
-  // Creation and destruction (or reset) only on the UI thread, and therefore
-  // checking for emptiness allowed on the UI thread.
-  // Everything else (dereferencing and calling methods) only on |task_runner_|.
-  // TODO(eladalon): Remove the command-line flag and the unique_ptr.
-  // https://crbug.com/775415
-  std::unique_ptr<WebRtcRemoteEventLogManager> remote_logs_manager_;
+  // This is only possible when the appropriate Chrome policy is configured.
+  WebRtcRemoteEventLogManager remote_logs_manager_;
+
+  // Each loaded BrowserContext is mapped to a PrefChangeRegistrar, which keeps
+  // us informed about preference changes, thereby allowing as to support
+  // dynamic refresh.
+  std::map<BrowserContextId, PrefChangeRegistrar> pref_change_registrars_;
 
   // This keeps track of which peer connections have event logging turned on
   // in WebRTC, and for which client(s).
   std::map<PeerConnectionKey, LoggingTargetBitmap>
-      peer_connections_with_event_logging_enabled_;
+      peer_connections_with_event_logging_enabled_in_webrtc_;
 
   // The set of RenderProcessHosts with which the manager is registered for
   // observation. Allows us to register for each RPH only once, and get notified
@@ -345,10 +364,6 @@
   std::unique_ptr<LogFileWriter::Factory>
       remote_log_file_writer_factory_for_testing_;
 
-  // The main logic will run sequentially on this runner, on which blocking
-  // tasks are allowed.
-  scoped_refptr<base::SequencedTaskRunner> task_runner_;
-
   DISALLOW_COPY_AND_ASSIGN(WebRtcEventLogManager);
 };
 
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
index 7087ec0..fcd8318 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.cc
@@ -155,7 +155,7 @@
 }
 
 void WebRtcRemoteEventLogManager::SetNetworkConnectionTracker(
-    content::NetworkConnectionTracker* network_connection_tracker) {
+    network::NetworkConnectionTracker* network_connection_tracker) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   DCHECK(network_connection_tracker);
   DCHECK(!network_connection_tracker_);
@@ -217,10 +217,10 @@
     return;
   }
 
-  AddPendingLogs(browser_context_id, remote_bound_logs_dir);
-
   enabled_browser_contexts_.insert(browser_context_id);
 
+  AddPendingLogs(browser_context_id, remote_bound_logs_dir);
+
   if (!proactive_prune_scheduling_delta_.is_zero() &&
       !proactive_prune_scheduling_started_) {
     proactive_prune_scheduling_started_ = true;
@@ -228,7 +228,6 @@
   }
 }
 
-// TODO(crbug.com/775415): Add unit tests.
 void WebRtcRemoteEventLogManager::DisableForBrowserContext(
     BrowserContextId browser_context_id) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
@@ -240,8 +239,14 @@
   enabled_browser_contexts_.erase(browser_context_id);
 
 #if DCHECK_IS_ON()
-  // All of the RPHs associated with this BrowserContext must already have
-  // exited, which should have implicitly stopped all active logs.
+  // DisableForBrowserContext() is called in one of two cases:
+  // 1. If Chrome is shutting down. In that case, all the RPHs associated with
+  //    this BrowserContext must already have exited, which should have
+  //    implicitly stopped all active logs.
+  // 2. Remote-bound logging is no longer allowed for this BrowserContext.
+  //    In that case, some peer connections associated with this BrowserContext
+  //    might still be active, or become active at a later time, but all
+  //    logs must have already been stopped.
   auto pred = [browser_context_id](decltype(active_logs_)::value_type& log) {
     return log.first.browser_context_id == browser_context_id;
   };
@@ -249,7 +254,6 @@
 #endif
 
   // Pending logs for this BrowserContext are no longer eligible for upload.
-  // (Active uploads, if any, are not affected.)
   for (auto it = pending_logs_.begin(); it != pending_logs_.end();) {
     if (it->browser_context_id == browser_context_id) {
       it = pending_logs_.erase(it);
@@ -258,6 +262,9 @@
     }
   }
 
+  // Active uploads of logs associated with this BrowserContext must be stopped.
+  MaybeCancelUpload(base::Time::Min(), base::Time::Max(), browser_context_id);
+
   // Active logs may have been removed, which could remove upload suppression,
   // or pending logs which were about to be uploaded may have been removed,
   // so uploading may no longer be possible.
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
index d8fa61a..9a0fb638 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_remote.h
@@ -13,7 +13,7 @@
 #include "base/time/time.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_common.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_uploader.h"
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 // TODO(crbug.com/775415): Avoid uploading logs when Chrome shutdown imminent.
 
@@ -22,7 +22,7 @@
 }  // namespace net
 
 class WebRtcRemoteEventLogManager final
-    : public content::NetworkConnectionTracker::NetworkConnectionObserver {
+    : public network::NetworkConnectionTracker::NetworkConnectionObserver {
   using BrowserContextId = WebRtcEventLogPeerConnectionKey::BrowserContextId;
   using LogFilesMap =
       std::map<WebRtcEventLogPeerConnectionKey, std::unique_ptr<LogFileWriter>>;
@@ -34,12 +34,12 @@
       scoped_refptr<base::SequencedTaskRunner> task_runner);
   ~WebRtcRemoteEventLogManager() override;
 
-  // Sets a content::NetworkConnectionTracker which will be used to track
+  // Sets a network::NetworkConnectionTracker which will be used to track
   // network connectivity.
   // Must not be called more than once.
   // Must be called before any call to EnableForBrowserContext().
   void SetNetworkConnectionTracker(
-      content::NetworkConnectionTracker* network_connection_tracker);
+      network::NetworkConnectionTracker* network_connection_tracker);
 
   // Sets a net::URLRequestContextGetter which will be used for uploads.
   // Must not be called more than once.
@@ -57,12 +57,18 @@
   // peer connections associated with this BrowserContext, in the
   // BrowserContext's user-data directory, becomes possible.
   // This method would typically be called when a BrowserContext is initialized.
+  // Enabling for the same BrowserContext twice in a row, without disabling
+  // in between, is an error.
   void EnableForBrowserContext(BrowserContextId browser_context_id,
                                const base::FilePath& browser_context_dir);
 
-  // Enables remote-bound logging for a given BrowserContext. Pending logs from
-  // earlier (while it was enabled) may still be uploaded, but no additional
-  // logs will be created.
+  // Disables remote-bound logging for a given BrowserContext. Pending logs from
+  // earlier (while it was enabled) may no longer be uploaded, additional
+  // logs will not be created, and any active uploads associated with the
+  // BrowserContext will be cancelled.
+  // Disabling for a BrowserContext which was not enabled is not an error,
+  // because the caller is not required to know whether a previous call
+  // to EnableForBrowserContext() was successful.
   void DisableForBrowserContext(BrowserContextId browser_context_id);
 
   // Called to inform |this| of peer connections being added/removed.
@@ -136,7 +142,7 @@
   // were associated with the renderer process.
   void RenderProcessHostExitedDestroyed(int render_process_id);
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver implementation
+  // network::NetworkConnectionTracker::NetworkConnectionObserver implementation
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   // Unit tests may use this to inject null uploaders, or ones which are
@@ -355,7 +361,7 @@
   std::unique_ptr<WebRtcEventLogUploader> uploader_;
 
   // Provides notifications of network changes.
-  content::NetworkConnectionTracker* network_connection_tracker_;
+  network::NetworkConnectionTracker* network_connection_tracker_;
 
   // Whether the network we are currently connected to, if any, is one over
   // which we may upload.
diff --git a/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc b/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
index 48caeef..f49eb7bb 100644
--- a/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
+++ b/chrome/browser/media/webrtc/webrtc_event_log_manager_unittest.cc
@@ -37,23 +37,24 @@
 #include "build/build_config.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_common.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager_unittest_helpers.h"
+#include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
+#include "chrome/common/pref_names.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/mock_network_connection_tracker.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+#include "components/prefs/testing_pref_store.h"
+#include "components/sync_preferences/pref_service_mock_factory.h"
+#include "components/sync_preferences/pref_service_syncable.h"
 #include "content/public/test/mock_render_process_host.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "net/url_request/url_request_test_util.h"
+#include "services/network/test/test_network_connection_tracker.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/zlib/google/compression_utils.h"
 
-// TODO(crbug.com/775415): Add unit tests for incognito mode.
-// TODO(crbug.com/775415): Migrate to being based on Profiles rather than on
-// BrowserContexts.
-
 #if defined(OS_WIN)
 #define IntToStringType base::IntToString16
 #else
@@ -149,20 +150,33 @@
 
   class Factory : public WebRtcEventLogUploader::Factory {
    public:
-    explicit Factory(bool cancellation_expected)
-        : cancellation_expected_(cancellation_expected) {}
+    Factory(bool cancellation_expected,
+            base::Optional<size_t> expected_instance_count =
+                base::Optional<size_t>())
+        : cancellation_expected_(cancellation_expected),
+          expected_instance_count_(expected_instance_count),
+          instance_count_(0) {}
 
-    ~Factory() override = default;
+    ~Factory() override {
+      if (expected_instance_count_.has_value()) {
+        EXPECT_EQ(instance_count_, expected_instance_count_.value());
+      }
+    }
 
     std::unique_ptr<WebRtcEventLogUploader> Create(
         const WebRtcLogFileInfo& log_file,
         UploadResultCallback callback) override {
+      if (expected_instance_count_.has_value()) {
+        EXPECT_LE(++instance_count_, expected_instance_count_.value());
+      }
       return std::make_unique<NullWebRtcEventLogUploader>(
           log_file, cancellation_expected_);
     }
 
    private:
     const bool cancellation_expected_;
+    const base::Optional<size_t> expected_instance_count_;
+    size_t instance_count_;
   };
 
  private:
@@ -197,8 +211,7 @@
         run_loop_(std::make_unique<base::RunLoop>()),
         uploader_run_loop_(std::make_unique<base::RunLoop>()),
         browser_context_(nullptr),
-        browser_context_id_(GetBrowserContextId(browser_context_)),
-        upload_suppressing_browser_context_(nullptr) {
+        browser_context_id_(GetBrowserContextId(browser_context_.get())) {
     TestingBrowserProcess::GetGlobal()->SetSystemRequestContext(
         url_request_context_getter_.get());
 
@@ -230,16 +243,16 @@
   }
 
   void SetUp() override {
-    SetUp(std::make_unique<content::MockNetworkConnectionTracker>(
+    SetUp(std::make_unique<network::TestNetworkConnectionTracker>(
         true, network::mojom::ConnectionType::CONNECTION_ETHERNET));
   }
 
-  void SetUp(std::unique_ptr<content::NetworkConnectionTracker> tracker) {
+  void SetUp(std::unique_ptr<network::NetworkConnectionTracker> tracker) {
     TestingBrowserProcess::GetGlobal()->SetNetworkConnectionTracker(
         std::move(tracker));
     SetLocalLogsObserver(&local_observer_);
     SetRemoteLogsObserver(&remote_observer_);
-    LoadProfiles();
+    LoadMainTestProfile();
   }
 
   void CreateWebRtcEventLogManager(
@@ -261,21 +274,17 @@
     }
   }
 
-  void LoadProfiles() {
-    testing_profile_manager_ = std::make_unique<TestingProfileManager>(
-        TestingBrowserProcess::GetGlobal());
-    EXPECT_TRUE(testing_profile_manager_->SetUp(profiles_dir_.GetPath()));
+  void LoadMainTestProfile() {
     browser_context_ = CreateBrowserContext("browser_context_");
-    browser_context_id_ = GetBrowserContextId(browser_context_);
-    rph_ = std::make_unique<MockRenderProcessHost>(browser_context_);
+    browser_context_id_ = GetBrowserContextId(browser_context_.get());
+    rph_ = std::make_unique<MockRenderProcessHost>(browser_context_.get());
   }
 
-  void UnloadProfiles() {
-    browser_context_ = nullptr;
-    browser_context_id_ = GetBrowserContextId(browser_context_);
+  void UnloadMainTestProfile() {
     rph_.reset();
+    browser_context_.reset();
+    browser_context_id_ = GetBrowserContextId(browser_context_.get());
     EXPECT_FALSE(upload_suppressing_rph_);
-    testing_profile_manager_.reset();  // Make sure we only have one at a time.
   }
 
   void WaitForReply() {
@@ -333,33 +342,33 @@
                           output_str1, output_str2);
   }
 
-  bool PeerConnectionAdded(int render_process_id,
-                           int lid,
+  bool PeerConnectionAdded(const PeerConnectionKey& key,
                            std::string peer_connection_id = std::string()) {
     if (peer_connection_id.empty()) {
       // If the test does not specify an explicit peer connection ID, then that
       // is not the focus of the test, and any unique identifier would do.
-      peer_connection_id = GetUniqueId(render_process_id, lid);
+      peer_connection_id = GetUniqueId(key.render_process_id, key.lid);
     }
 
     bool result;
-    event_log_manager_->PeerConnectionAdded(
-        render_process_id, lid, peer_connection_id, ReplyClosure(&result));
+    event_log_manager_->PeerConnectionAdded(key.render_process_id, key.lid,
+                                            peer_connection_id,
+                                            ReplyClosure(&result));
     WaitForReply();
     return result;
   }
 
-  bool PeerConnectionRemoved(int render_process_id, int lid) {
+  bool PeerConnectionRemoved(const PeerConnectionKey& key) {
     bool result;
-    event_log_manager_->PeerConnectionRemoved(render_process_id, lid,
+    event_log_manager_->PeerConnectionRemoved(key.render_process_id, key.lid,
                                               ReplyClosure(&result));
     WaitForReply();
     return result;
   }
 
-  bool PeerConnectionStopped(int render_process_id, int lid) {
+  bool PeerConnectionStopped(const PeerConnectionKey& key) {
     bool result;
-    event_log_manager_->PeerConnectionStopped(render_process_id, lid,
+    event_log_manager_->PeerConnectionStopped(key.render_process_id, key.lid,
                                               ReplyClosure(&result));
     WaitForReply();
     return result;
@@ -426,6 +435,19 @@
                               error_message_output);
   }
 
+  bool StartRemoteLogging(const PeerConnectionKey& key,
+                          std::string* log_id_output = nullptr,
+                          std::string* error_message_output = nullptr) {
+    return StartRemoteLogging(key.render_process_id, GetUniqueId(key),
+                              kMaxRemoteLogFileSizeBytes, log_id_output,
+                              error_message_output);
+  }
+
+  bool StartRemoteLogging(const PeerConnectionKey& key, size_t max_size_bytes) {
+    return StartRemoteLogging(key.render_process_id, GetUniqueId(key),
+                              max_size_bytes);
+  }
+
   void ClearCacheForBrowserContext(
       const content::BrowserContext* browser_context,
       const base::Time& delete_begin,
@@ -452,12 +474,11 @@
     WaitForReply();
   }
 
-  std::pair<bool, bool> OnWebRtcEventLogWrite(int render_process_id,
-                                              int lid,
+  std::pair<bool, bool> OnWebRtcEventLogWrite(const PeerConnectionKey& key,
                                               const std::string& message) {
     std::pair<bool, bool> result;
-    event_log_manager_->OnWebRtcEventLogWrite(render_process_id, lid, message,
-                                              ReplyClosure(&result));
+    event_log_manager_->OnWebRtcEventLogWrite(key.render_process_id, key.lid,
+                                              message, ReplyClosure(&result));
     WaitForReply();
     return result;
   }
@@ -471,18 +492,17 @@
     WaitForReply();
   }
 
-  void SetWebRtcEventLoggingState(PeerConnectionKey key,
+  void SetWebRtcEventLoggingState(const PeerConnectionKey& key,
                                   bool event_logging_enabled) {
     webrtc_state_change_instructions_.emplace(key, event_logging_enabled);
   }
 
-  void ExpectWebRtcStateChangeInstruction(int render_process_id,
-                                          int lid,
+  void ExpectWebRtcStateChangeInstruction(const PeerConnectionKey& key,
                                           bool enabled) {
     ASSERT_FALSE(webrtc_state_change_instructions_.empty());
     auto& instruction = webrtc_state_change_instructions_.front();
-    EXPECT_EQ(instruction.key.render_process_id, render_process_id);
-    EXPECT_EQ(instruction.key.lid, lid);
+    EXPECT_EQ(instruction.key.render_process_id, key.render_process_id);
+    EXPECT_EQ(instruction.key.lid, key.lid);
     EXPECT_EQ(instruction.enabled, enabled);
     webrtc_state_change_instructions_.pop();
   }
@@ -495,20 +515,55 @@
     WaitForReply();
   }
 
-  // |testing_profile_manager_| maintains ownership of the created objects.
-  // This allows either creating a TestingProfile with a predetermined name
+  // Allows either creating a TestingProfile with a predetermined name
   // (useful when trying to "reload" a profile), or one with an arbitrary name.
-  TestingProfile* CreateBrowserContext(const std::string& profile_name = "") {
-    static size_t index = 0;
-    TestingProfile* browser_context;
+  virtual std::unique_ptr<TestingProfile> CreateBrowserContext() {
+    return CreateBrowserContext("");
+  }
+  virtual std::unique_ptr<TestingProfile> CreateBrowserContext(
+      std::string profile_name) {
+    return CreateBrowserContext(profile_name, true);
+  }
+  virtual std::unique_ptr<TestingProfile> CreateBrowserContext(
+      std::string profile_name,
+      bool policy_allows_remote_logging) {
+    // If profile name not specified, select a unique name.
     if (profile_name.empty()) {
-      browser_context = testing_profile_manager_->CreateTestingProfile(
-          std::to_string(++index));
-    } else {
-      browser_context =
-          testing_profile_manager_->CreateTestingProfile(profile_name);
+      static size_t index = 0;
+      profile_name = std::to_string(++index);
     }
 
+    // Set a directory for the profile, derived from its name, so that
+    // recreating the profile will get the same directory.
+    const base::FilePath profile_path =
+        profiles_dir_.GetPath().AppendASCII(profile_name);
+    if (base::PathExists(profile_path)) {
+      EXPECT_TRUE(base::DirectoryExists(profile_path));
+    } else {
+      EXPECT_TRUE(base::CreateDirectory(profile_path));
+    }
+
+    // Prepare to specify preferences for the profile.
+    sync_preferences::PrefServiceMockFactory factory;
+    factory.set_user_prefs(base::WrapRefCounted(new TestingPrefStore()));
+    scoped_refptr<user_prefs::PrefRegistrySyncable> registry(
+        new user_prefs::PrefRegistrySyncable);
+    sync_preferences::PrefServiceSyncable* regular_prefs =
+        factory.CreateSyncable(registry.get()).release();
+
+    // Set the preference associated with the policy for WebRTC remote-bound
+    // event logging.
+    RegisterUserProfilePrefs(registry.get());
+    regular_prefs->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                              policy_allows_remote_logging);
+
+    // Build the profile.
+    TestingProfile::Builder profile_builder;
+    profile_builder.SetProfileName(profile_name);
+    profile_builder.SetPath(profile_path);
+    profile_builder.SetPrefService(base::WrapUnique(regular_prefs));
+    std::unique_ptr<TestingProfile> browser_context = profile_builder.Build();
+
     // Blocks on the unit under test's task runner, so that we won't proceed
     // with the test (e.g. check that files were created) before finished
     // processing this even (which is signaled to it from
@@ -551,14 +606,15 @@
     }
     DCHECK(!upload_suppressing_rph_) << "Uploading already suppressed.";
     upload_suppressing_rph_ = std::make_unique<MockRenderProcessHost>(
-        upload_suppressing_browser_context_);
+        upload_suppressing_browser_context_.get());
     const auto key = GetPeerConnectionKey(upload_suppressing_rph_.get(), 0);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
   }
 
   void UnsuppressUploading() {
     DCHECK(upload_suppressing_rph_) << "Uploading not suppressed.";
-    ASSERT_TRUE(PeerConnectionRemoved(upload_suppressing_rph_->GetID(), 0));
+    const auto key = GetPeerConnectionKey(upload_suppressing_rph_.get(), 0);
+    ASSERT_TRUE(PeerConnectionRemoved(key));
     upload_suppressing_rph_.reset();
   }
 
@@ -639,23 +695,19 @@
   // The directory which will contain all profiles.
   base::ScopedTempDir profiles_dir_;
 
-  // Constructs (and owns) profiles.
-  std::unique_ptr<TestingProfileManager> testing_profile_manager_;
-
   // Default BrowserContext and RenderProcessHost, to be used by tests which
   // do not require anything fancy (such as seeding the BrowserContext with
   // pre-existing logs files from a previous session, or working with multiple
   // BrowserContext objects).
 
-  TestingProfile* browser_context_;  // Owned by testing_profile_manager_.
+  std::unique_ptr<TestingProfile> browser_context_;
   BrowserContextId browser_context_id_;
   std::unique_ptr<MockRenderProcessHost> rph_;
 
   // Used for suppressing the upload of finished files, by creating an active
   // remote-bound log associated with an independent BrowserContext which
   // does not otherwise interfere with the test.
-  // upload_suppressing_browser_context_ is owned by testing_profile_manager_.
-  TestingProfile* upload_suppressing_browser_context_;
+  std::unique_ptr<TestingProfile> upload_suppressing_browser_context_;
   std::unique_ptr<MockRenderProcessHost> upload_suppressing_rph_;
 
   // The directory where we'll save local log files.
@@ -709,7 +761,7 @@
   void SetUp() override {
     CreateWebRtcEventLogManager(Compression::GZIP_PERFECT_ESTIMATION);
 
-    auto tracker = std::make_unique<content::MockNetworkConnectionTracker>(
+    auto tracker = std::make_unique<network::TestNetworkConnectionTracker>(
         true, network::mojom::ConnectionType::CONNECTION_ETHERNET);
     WebRtcEventLogManagerTestBase::SetUp(std::move(tracker));
 
@@ -743,17 +795,19 @@
     }
   }
 
+  void ClearPendingLogFiles() { pending_logs_.clear(); }
+
   base::Optional<base::FilePath> CreateRemoteLogFile(
       const PeerConnectionKey& key,
       bool pending) {
     base::Optional<base::FilePath> file_path;
     ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
         .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
-    EXPECT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-    EXPECT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+    EXPECT_TRUE(PeerConnectionAdded(key));
+    EXPECT_TRUE(StartRemoteLogging(key));
     if (pending) {
       // Transition from ACTIVE to PENDING.
-      EXPECT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+      EXPECT_TRUE(PeerConnectionRemoved(key));
     }
     return file_path;
   }
@@ -793,22 +847,60 @@
 const base::TimeDelta WebRtcEventLogManagerTestCacheClearing::kEpsion =
     base::TimeDelta::FromHours(1);
 
-class WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled
+class WebRtcEventLogManagerTestWithRemoteLoggingDisabled
     : public WebRtcEventLogManagerTestBase,
       public ::testing::WithParamInterface<bool> {
  public:
-  WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled() {
-    // Show that the feature is not active if not explicitly ENABLED.
-    const bool disable = GetParam();
-    if (disable) {  // Otherwise, left to default value.
+  WebRtcEventLogManagerTestWithRemoteLoggingDisabled()
+      : feature_enabled_(GetParam()), policy_enabled_(!feature_enabled_) {
+    if (feature_enabled_) {
+      scoped_feature_list_.InitAndEnableFeature(
+          features::kWebRtcRemoteEventLog);
+    } else {
       scoped_feature_list_.InitAndDisableFeature(
           features::kWebRtcRemoteEventLog);
     }
     CreateWebRtcEventLogManager();
   }
 
-  ~WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled() override =
-      default;
+  ~WebRtcEventLogManagerTestWithRemoteLoggingDisabled() override = default;
+
+  // Override CreateBrowserContext() to use policy_enabled_.
+  std::unique_ptr<TestingProfile> CreateBrowserContext() override {
+    return CreateBrowserContext("");
+  }
+  std::unique_ptr<TestingProfile> CreateBrowserContext(
+      std::string profile_name) override {
+    return CreateBrowserContext(profile_name, policy_enabled_);
+  }
+  std::unique_ptr<TestingProfile> CreateBrowserContext(
+      std::string profile_name,
+      bool policy_allows_remote_logging) override {
+    DCHECK_EQ(policy_enabled_, policy_allows_remote_logging);
+    return WebRtcEventLogManagerTestBase::CreateBrowserContext(
+        profile_name, policy_allows_remote_logging);
+  }
+
+ private:
+  const bool feature_enabled_;  // Whether the Finch kill-switch is engaged.
+  const bool policy_enabled_;  // Whether the policy is enabled for the profile.
+};
+
+class WebRtcEventLogManagerTestPolicy : public WebRtcEventLogManagerTestBase {
+ public:
+  WebRtcEventLogManagerTestPolicy() {
+    scoped_feature_list_.InitAndEnableFeature(features::kWebRtcRemoteEventLog);
+
+    // Avoid proactive pruning; it has the potential to mess up tests, as well
+    // as keep pendings tasks around with a dangling reference to the unit
+    // under test. (Zero is a sentinel value for disabling proactive pruning.)
+    scoped_command_line_.GetProcessCommandLine()->AppendSwitchASCII(
+        ::switches::kWebRtcRemoteEventLogUploadDelayMs, "0");
+
+    event_log_manager_ = WebRtcEventLogManager::CreateSingletonInstance();
+  }
+
+  ~WebRtcEventLogManagerTestPolicy() override = default;
 };
 
 class WebRtcEventLogManagerTestUploadSuppressionDisablingFlag
@@ -862,8 +954,9 @@
 
     // Unload the profile, but remember where it stores its files (for sanity).
     browser_context_path_ = browser_context_->GetPath();
-    const base::FilePath remote_logs_dir = RemoteBoundLogsDir(browser_context_);
-    UnloadProfiles();
+    const base::FilePath remote_logs_dir =
+        RemoteBoundLogsDir(browser_context_.get());
+    UnloadMainTestProfile();
 
     // Seed the remote logs' directory with one log file, simulating the
     // creation of logs in a previous session.
@@ -894,7 +987,7 @@
 class WebRtcEventLogManagerTestUploadDelay
     : public WebRtcEventLogManagerTestBase {
  public:
-  WebRtcEventLogManagerTestUploadDelay() {}
+  ~WebRtcEventLogManagerTestUploadDelay() override = default;
 
   void SetUp() override {
     // Intercept and block the call to SetUp(). The test body will call
@@ -913,8 +1006,6 @@
     WebRtcEventLogManagerTestBase::SetUp();
   }
 
-  ~WebRtcEventLogManagerTestUploadDelay() override = default;
-
   // There's a trade-off between the test runtime and the likelihood of a
   // false-positive (lowered when the time is increased).
   // Since false-positives can be caught handled even if only manifesting
@@ -933,6 +1024,9 @@
   WebRtcEventLogManagerTestCompression() {
     scoped_feature_list_.InitAndEnableFeature(features::kWebRtcRemoteEventLog);
 
+    // Avoid proactive pruning; it has the potential to mess up tests, as well
+    // as keep pendings tasks around with a dangling reference to the unit
+    // under test. (Zero is a sentinel value for disabling proactive pruning.)
     scoped_command_line_.GetProcessCommandLine()->AppendSwitchASCII(
         ::switches::kWebRtcRemoteEventLogUploadDelayMs, "0");
   }
@@ -947,12 +1041,40 @@
                 base::Optional<WebRtcEventLogCompression>()) {
     CreateWebRtcEventLogManager(remote_compression);
 
-    auto tracker = std::make_unique<content::MockNetworkConnectionTracker>(
+    auto tracker = std::make_unique<network::TestNetworkConnectionTracker>(
         true, network::mojom::ConnectionType::CONNECTION_ETHERNET);
     WebRtcEventLogManagerTestBase::SetUp(std::move(tracker));
   }
 };
 
+class WebRtcEventLogManagerTestIncognito
+    : public WebRtcEventLogManagerTestBase {
+ public:
+  WebRtcEventLogManagerTestIncognito() : incognito_profile_(nullptr) {
+    scoped_feature_list_.InitAndEnableFeature(features::kWebRtcRemoteEventLog);
+    CreateWebRtcEventLogManager();
+  }
+
+  ~WebRtcEventLogManagerTestIncognito() override {
+    incognito_rph_.reset();
+    if (incognito_profile_) {
+      DCHECK(browser_context_);
+      browser_context_->DestroyOffTheRecordProfile();
+    }
+  }
+
+  void SetUp() override {
+    WebRtcEventLogManagerTestBase::SetUp();
+
+    incognito_profile_ = browser_context_->GetOffTheRecordProfile();
+    incognito_rph_ =
+        std::make_unique<MockRenderProcessHost>(incognito_profile_);
+  }
+
+  Profile* incognito_profile_;
+  std::unique_ptr<MockRenderProcessHost> incognito_rph_;
+};
+
 namespace {
 
 class PeerConnectionTrackerProxyForTesting
@@ -1001,7 +1123,7 @@
         EXPECT_FALSE(true);  // More files uploaded than expected.
       } else {
         EXPECT_EQ(log_file.path, expected_files_.front().path);
-        // Because LoadProfiles() and UnloadProfiles() mess up the
+        // Because LoadMainTestProfile() and UnloadMainTestProfile() mess up the
         // BrowserContextId in ways that would not happen in production,
         // we cannot verify |log_file.browser_context_id| is correct.
         // This is unimportant to the test.
@@ -1052,33 +1174,35 @@
 }  // namespace
 
 TEST_F(WebRtcEventLogManagerTest, PeerConnectionAddedReturnsTrue) {
-  EXPECT_TRUE(PeerConnectionAdded(rph_->GetID(), kLid));
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  EXPECT_TRUE(PeerConnectionAdded(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        PeerConnectionAddedReturnsFalseIfAlreadyAdded) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  EXPECT_FALSE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_FALSE(PeerConnectionAdded(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest, PeerConnectionRemovedReturnsTrue) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  EXPECT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_TRUE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        PeerConnectionRemovedReturnsFalseIfNeverAdded) {
-  EXPECT_FALSE(PeerConnectionRemoved(rph_->GetID(), kLid));
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  EXPECT_FALSE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        PeerConnectionRemovedReturnsFalseIfAlreadyRemoved) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
-  EXPECT_FALSE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  EXPECT_FALSE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest, EnableLocalLoggingReturnsTrue) {
@@ -1110,9 +1234,8 @@
        OnWebRtcEventLogWriteReturnsFalseAndFalseWhenAllLoggingDisabled) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   // Note that EnableLocalLogging() and StartRemoteLogging() weren't called.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(false, false));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -1120,36 +1243,32 @@
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   ASSERT_TRUE(EnableLocalLogging());
   // Note that PeerConnectionAdded() wasn't called.
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(false, false));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnWebRtcEventLogWriteReturnsLocalTrueWhenPcKnownAndLocalLoggingOn) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(true, false));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(true, false));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnWebRtcEventLogWriteReturnsRemoteTrueWhenPcKnownAndRemoteLogging) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(false, true));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, true));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnWebRtcEventLogWriteReturnsTrueAndTrueeWhenAllLoggingEnabled) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(true, true));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(true, true));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -1169,7 +1288,7 @@
        OnLocalLogStartedCalledForPeerConnectionAddedAndLocalLoggingEnabled) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
 }
 
@@ -1178,14 +1297,14 @@
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnLocalLogStoppedCalledAfterLocalLoggingDisabled) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
   ASSERT_TRUE(DisableLocalLogging());
 }
@@ -1194,9 +1313,9 @@
        OnLocalLogStoppedCalledAfterPeerConnectionRemoved) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest, LocalLogCreatesEmptyFileWhenStarted) {
@@ -1206,12 +1325,12 @@
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(*file_path, "");
 }
@@ -1224,16 +1343,15 @@
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   const std::string log = "To strive, to seek, to find, and not to yield.";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(true, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(true, false));
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(*file_path, log);
 }
@@ -1246,7 +1364,7 @@
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
@@ -1255,12 +1373,11 @@
                               "Some work of noble note, may yet be done,",
                               "Not unbecoming men that strove with Gods."};
   for (const std::string& log : logs) {
-    ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-              std::make_pair(true, false));
+    ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(true, false));
   }
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(
       *file_path,
@@ -1278,18 +1395,17 @@
   const size_t file_size_limit_bytes = log.length() / 2;
 
   ASSERT_TRUE(EnableLocalLogging(file_size_limit_bytes));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   // Failure is reported, because not everything could be written. The file
   // will also be closed.
   EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(false, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, false));
 
   // Additional calls to Write() have no effect.
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "ignored"),
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, "ignored"),
             std::make_pair(false, false));
 
   ExpectLocalFileContents(*file_path, "");
@@ -1303,19 +1419,17 @@
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
   ASSERT_TRUE(EnableLocalLogging(kWebRtcEventLogManagerUnlimitedFileSize));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   const std::string log1 = "Who let the dogs out?";
   const std::string log2 = "Woof, woof, woof, woof, woof!";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log1),
-            std::make_pair(true, false));
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log2),
-            std::make_pair(true, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log1), std::make_pair(true, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log2), std::make_pair(true, false));
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(*file_path, log1 + log2);
 }
@@ -1328,18 +1442,18 @@
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   const std::string log_before = "log_before_stop";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log_before),
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log_before),
             std::make_pair(true, false));
   EXPECT_CALL(local_observer_, OnLocalLogStopped(key)).Times(1);
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   const std::string log_after = "log_after_stop";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log_after),
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log_after),
             std::make_pair(false, false));
 
   ExpectLocalFileContents(*file_path, log_before);
@@ -1351,8 +1465,7 @@
   // Calls to Write() before the log was started are ignored.
   EXPECT_CALL(local_observer_, OnLocalLogStarted(_, _)).Times(0);
   const std::string log1 = "The lights begin to twinkle from the rocks:";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log1),
-            std::make_pair(false, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log1), std::make_pair(false, false));
   ASSERT_TRUE(base::IsDirectoryEmpty(local_logs_base_dir_.GetPath()));
 
   base::Optional<base::FilePath> file_path;
@@ -1361,18 +1474,17 @@
       .WillOnce(Invoke(SaveFilePathTo(&file_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   // Calls after the log started have an effect. The calls to Write() from
   // before the log started are not remembered.
   const std::string log2 = "The long day wanes: the slow moon climbs: the deep";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log2),
-            std::make_pair(true, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log2), std::make_pair(true, false));
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(*file_path, log2);
 }
@@ -1386,7 +1498,7 @@
   std::vector<base::Optional<PeerConnectionKey>> keys(logs.size());
   std::vector<base::Optional<base::FilePath>> file_paths(logs.size());
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   for (size_t i = 0; i < logs.size(); ++i) {
     ON_CALL(local_observer_, OnLocalLogStarted(_, _))
@@ -1396,8 +1508,7 @@
     ASSERT_EQ(*keys[i], key);
     ASSERT_TRUE(file_paths[i]);
     ASSERT_FALSE(file_paths[i]->empty());
-    ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, logs[i]),
-              std::make_pair(true, false));
+    ASSERT_EQ(OnWebRtcEventLogWrite(key, logs[i]), std::make_pair(true, false));
     ASSERT_TRUE(DisableLocalLogging());
   }
 
@@ -1411,7 +1522,7 @@
 
   std::list<MockRenderProcessHost> rphs;
   for (size_t i = 0; i < 3; ++i) {
-    rphs.emplace_back(browser_context_);
+    rphs.emplace_back(browser_context_.get());  // (MockRenderProcessHost ctor)
   }
 
   std::vector<PeerConnectionKey> keys;
@@ -1423,7 +1534,7 @@
   for (size_t i = 0; i < keys.size(); ++i) {
     ON_CALL(local_observer_, OnLocalLogStarted(keys[i], _))
         .WillByDefault(Invoke(SaveFilePathTo(&file_paths[i])));
-    ASSERT_TRUE(PeerConnectionAdded(keys[i].render_process_id, keys[i].lid));
+    ASSERT_TRUE(PeerConnectionAdded(keys[i]));
     ASSERT_TRUE(file_paths[i]);
     ASSERT_FALSE(file_paths[i]->empty());
   }
@@ -1431,9 +1542,8 @@
   std::vector<std::string> logs;
   for (size_t i = 0; i < keys.size(); ++i) {
     logs.emplace_back(std::to_string(rph_->GetID()) + std::to_string(kLid));
-    ASSERT_EQ(
-        OnWebRtcEventLogWrite(keys[i].render_process_id, keys[i].lid, logs[i]),
-        std::make_pair(true, false));
+    ASSERT_EQ(OnWebRtcEventLogWrite(keys[i], logs[i]),
+              std::make_pair(true, false));
   }
 
   // Make sure the file woulds be closed, so that we could safely read them.
@@ -1452,11 +1562,12 @@
   for (int i = 0; i < kMaxLocalLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
     EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
   }
 
   EXPECT_CALL(local_observer_, OnLocalLogStarted(_, _)).Times(0);
-  ASSERT_TRUE(PeerConnectionAdded(rph_->GetID(), kMaxLocalLogFiles));
+  const auto last_key = GetPeerConnectionKey(rph_.get(), kMaxLocalLogFiles);
+  ASSERT_TRUE(PeerConnectionAdded(last_key));
 }
 
 // When a log reaches its maximum size limit, it is closed, and no longer
@@ -1470,18 +1581,19 @@
   for (int i = 0; i < kMaxLocalLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
     EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
   }
 
   // By writing to one of the logs, we fill it and end up closing it, allowing
   // an additional log to be written.
-  EXPECT_EQ(OnWebRtcEventLogWrite(rph_->GetID(), 0, log),
+  const auto removed_key = GetPeerConnectionKey(rph_.get(), 0);
+  EXPECT_EQ(OnWebRtcEventLogWrite(removed_key, log),
             std::make_pair(true, false));
 
   // We now have room for one additional log.
   const auto last_key = GetPeerConnectionKey(rph_.get(), kMaxLocalLogFiles);
   EXPECT_CALL(local_observer_, OnLocalLogStarted(last_key, _)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(last_key.render_process_id, last_key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(last_key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -1493,20 +1605,19 @@
   for (int i = 0; i < kMaxLocalLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
     EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _)).Times(1);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
   }
 
   // When one peer connection is removed, one log is stopped, thereby allowing
   // an additional log to be opened.
-  EXPECT_CALL(local_observer_,
-              OnLocalLogStopped(GetPeerConnectionKey(rph_.get(), 0)))
-      .Times(1);
-  ASSERT_TRUE(PeerConnectionRemoved(rph_->GetID(), 0));
+  const auto removed_key = GetPeerConnectionKey(rph_.get(), 0);
+  EXPECT_CALL(local_observer_, OnLocalLogStopped(removed_key)).Times(1);
+  ASSERT_TRUE(PeerConnectionRemoved(removed_key));
 
   // We now have room for one additional log.
   const auto last_key = GetPeerConnectionKey(rph_.get(), kMaxLocalLogFiles);
   EXPECT_CALL(local_observer_, OnLocalLogStarted(last_key, _)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(last_key.render_process_id, last_key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(last_key));
 }
 
 TEST_F(WebRtcEventLogManagerTest, LocalLogIllegalPath) {
@@ -1514,7 +1625,8 @@
   EXPECT_CALL(local_observer_, OnLocalLogStarted(_, _)).Times(0);
   EXPECT_CALL(local_observer_, OnLocalLogStopped(_)).Times(0);
 
-  ASSERT_TRUE(PeerConnectionAdded(rph_->GetID(), kLid));
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   // See the documentation of the function for why |true| is expected despite
   // the path being illegal.
@@ -1533,7 +1645,7 @@
   EXPECT_CALL(local_observer_, OnLocalLogStopped(_)).Times(0);
 
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   // See the documentation of the function for why |true| is expected despite
   // the path being illegal.
@@ -1542,8 +1654,7 @@
   EXPECT_TRUE(base::IsDirectoryEmpty(local_logs_base_dir_.GetPath()));
 
   // Write() has no effect (but is handled gracefully).
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid,
-                                  "Why did the chicken cross the road?"),
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "Why did the chicken cross the road?"),
             std::make_pair(false, false));
   EXPECT_TRUE(base::IsDirectoryEmpty(local_logs_base_dir_.GetPath()));
 
@@ -1566,13 +1677,12 @@
   ON_CALL(local_observer_, OnLocalLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   for (size_t i = 0; i < logs.size(); ++i) {
-    ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, logs[i]),
-              std::make_pair(true, false));
+    ASSERT_EQ(OnWebRtcEventLogWrite(key, logs[i]), std::make_pair(true, false));
   }
   ASSERT_TRUE(DisableLocalLogging());
 
@@ -1608,7 +1718,7 @@
       local_logs_base_dir_.GetPath().Append(user_defined);
 
   ASSERT_TRUE(EnableLocalLogging(local_logs_base_path));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
@@ -1655,7 +1765,7 @@
       local_logs_base_dir_.GetPath().Append(user_defined_portion);
 
   ASSERT_TRUE(EnableLocalLogging(local_logs_base_path));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(file_path_1);
   ASSERT_FALSE(file_path_1->empty());
 
@@ -1687,38 +1797,40 @@
 TEST_F(WebRtcEventLogManagerTest,
        OnRemoteLogStartedNotCalledIfRemoteLoggingNotEnabled) {
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(_, _)).Times(0);
-  ASSERT_TRUE(PeerConnectionAdded(rph_->GetID(), kLid));
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnRemoteLogStoppedNotCalledIfRemoteLoggingNotEnabled) {
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(_)).Times(0);
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnRemoteLogStartedCalledIfRemoteLoggingEnabled) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        OnRemoteLogStoppedCalledIfRemoteLoggingEnabledThenPcRemoved) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        BrowserContextInitializationCreatesDirectoryForRemoteLogs) {
-  auto* browser_context = CreateBrowserContext();
-  const base::FilePath remote_logs_path = RemoteBoundLogsDir(browser_context);
+  auto browser_context = CreateBrowserContext();
+  const base::FilePath remote_logs_path =
+      RemoteBoundLogsDir(browser_context.get());
   EXPECT_TRUE(base::DirectoryExists(remote_logs_path));
   EXPECT_TRUE(base::IsDirectoryEmpty(remote_logs_path));
 }
@@ -1736,7 +1848,7 @@
 TEST_F(WebRtcEventLogManagerTest,
        StartRemoteLoggingReturnsFalseIfUnknownPeerConnectionId) {
   const auto key = GetPeerConnectionKey(rph_.get(), 0);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, "real_id"));
+  ASSERT_TRUE(PeerConnectionAdded(key, "real_id"));
   std::string error_message;
   EXPECT_FALSE(StartRemoteLogging(key.render_process_id, "wrong_id", nullptr,
                                   &error_message));
@@ -1748,7 +1860,7 @@
        StartRemoteLoggingReturnsTrueIfKnownPeerConnection) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
   EXPECT_TRUE(StartRemoteLogging(key.render_process_id, id));
 }
 
@@ -1756,7 +1868,7 @@
        StartRemoteLoggingReturnsFalseIfRestartAttempt) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
   ASSERT_TRUE(StartRemoteLogging(key.render_process_id, id));
   std::string error_message;
   EXPECT_FALSE(
@@ -1768,7 +1880,7 @@
        StartRemoteLoggingReturnsFalseIfUnlimitedFileSize) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
   std::string error_message;
   EXPECT_FALSE(StartRemoteLogging(key.render_process_id, id,
                                   kWebRtcEventLogManagerUnlimitedFileSize,
@@ -1780,7 +1892,7 @@
        StartRemoteLoggingReturnsTrueIfFileSizeAtOrBelowLimit) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
   EXPECT_TRUE(StartRemoteLogging(key.render_process_id, id,
                                  kMaxRemoteLogFileSizeBytes));
 }
@@ -1793,7 +1905,7 @@
 
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
   std::string error_message;
   EXPECT_FALSE(StartRemoteLogging(key.render_process_id, id, min_size - 1,
                                   nullptr, &error_message));
@@ -1804,7 +1916,7 @@
        StartRemoteLoggingReturnsFalseIfExcessivelyLargeFileSize) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
   std::string error_message;
   EXPECT_FALSE(StartRemoteLogging(key.render_process_id, id,
                                   kMaxRemoteLogFileSizeBytes + 1, nullptr,
@@ -1816,8 +1928,8 @@
        StartRemoteLoggingReturnsFalseIfPeerConnectionAlreadyClosed) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string id = "id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, id));
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key, id));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
   std::string error_message;
   EXPECT_FALSE(
       StartRemoteLogging(key.render_process_id, id, nullptr, &error_message));
@@ -1829,8 +1941,8 @@
        StartRemoteLoggingDoesNotReturnIdWhenUnsuccessful) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string pc_id = "pc_id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, pc_id));
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key, pc_id));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   std::string log_id;
   ASSERT_FALSE(StartRemoteLogging(key.render_process_id, pc_id, &log_id));
@@ -1842,7 +1954,7 @@
        StartRemoteLoggingReturnsLegalIdWhenSuccessful) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   const std::string pc_id = "pc_id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, pc_id));
+  ASSERT_TRUE(PeerConnectionAdded(key, pc_id));
 
   std::string log_id;
   ASSERT_TRUE(StartRemoteLogging(key.render_process_id, pc_id, &log_id));
@@ -1860,7 +1972,7 @@
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
   const std::string pc_id = "pc_id";  // For explicitness' sake.
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid, pc_id));
+  ASSERT_TRUE(PeerConnectionAdded(key, pc_id));
 
   std::string log_id;
   ASSERT_TRUE(StartRemoteLogging(key.render_process_id, pc_id, &log_id));
@@ -1879,11 +1991,11 @@
       .Times(1)
       .WillOnce(Invoke(SaveFilePathTo(&file_path)));
 
-  ASSERT_TRUE(PeerConnectionAdded(rph_->GetID(), kLid));
-  ASSERT_TRUE(StartRemoteLogging(rph_->GetID(), GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
 
   // Close file before examining its contents.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectRemoteFileContents(*file_path, "");
 }
@@ -1891,12 +2003,12 @@
 TEST_F(WebRtcEventLogManagerTest, RemoteLogFileCreatedInCorrectDirectory) {
   // Set up separate browser contexts; each one will get one log.
   constexpr size_t kLogsNum = 3;
-  TestingProfile* browser_contexts[kLogsNum];
+  std::unique_ptr<TestingProfile> browser_contexts[kLogsNum];
   std::vector<std::unique_ptr<MockRenderProcessHost>> rphs;
   for (size_t i = 0; i < kLogsNum; ++i) {
-    auto* const browser_context = CreateBrowserContext();
-    browser_contexts[i] = browser_context;
-    rphs.emplace_back(std::make_unique<MockRenderProcessHost>(browser_context));
+    browser_contexts[i] = CreateBrowserContext();
+    rphs.emplace_back(
+        std::make_unique<MockRenderProcessHost>(browser_contexts[i].get()));
   }
 
   // Prepare to store the logs' paths in distinct memory locations.
@@ -1911,8 +2023,8 @@
   // Start one log for each browser context.
   for (const auto& rph : rphs) {
     const auto key = GetPeerConnectionKey(&*rph, kLid);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-    ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+    ASSERT_TRUE(PeerConnectionAdded(key));
+    ASSERT_TRUE(StartRemoteLogging(key));
   }
 
   // All log files must be created in their own context's directory.
@@ -1925,8 +2037,8 @@
 TEST_F(WebRtcEventLogManagerTest,
        StartRemoteLoggingSanityIfDuplicateIdsInDifferentRendererProcesses) {
   std::unique_ptr<MockRenderProcessHost> rphs[2] = {
-      std::make_unique<MockRenderProcessHost>(browser_context_),
-      std::make_unique<MockRenderProcessHost>(browser_context_),
+      std::make_unique<MockRenderProcessHost>(browser_context_.get()),
+      std::make_unique<MockRenderProcessHost>(browser_context_.get()),
   };
 
   PeerConnectionKey keys[2] = {GetPeerConnectionKey(rphs[0].get(), 0),
@@ -1935,8 +2047,8 @@
   // The ID is shared, but that's not a problem, because the renderer process
   // are different.
   const std::string id = "shared_id";
-  ASSERT_TRUE(PeerConnectionAdded(keys[0].render_process_id, keys[0].lid, id));
-  ASSERT_TRUE(PeerConnectionAdded(keys[1].render_process_id, keys[1].lid, id));
+  ASSERT_TRUE(PeerConnectionAdded(keys[0], id));
+  ASSERT_TRUE(PeerConnectionAdded(keys[1], id));
 
   // Make sure the logs get written to separate files.
   base::Optional<base::FilePath> file_paths[2];
@@ -1962,22 +2074,21 @@
       .Times(1)
       .WillOnce(Invoke(SaveFilePathTo(&file_path)));
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
 
   const char* const log = "1 + 1 = 3";
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(false, true));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, true));
 
   // Close file before examining its contents.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectRemoteFileContents(*file_path, log);
 }
 
 TEST_F(WebRtcEventLogManagerTest, WriteToBothLocalAndRemoteFiles) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   base::Optional<base::FilePath> local_path;
   EXPECT_CALL(local_observer_, OnLocalLogStarted(key, _))
@@ -1990,7 +2101,7 @@
       .WillOnce(Invoke(SaveFilePathTo(&remote_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(StartRemoteLogging(key));
 
   ASSERT_TRUE(local_path);
   ASSERT_FALSE(local_path->empty());
@@ -1998,11 +2109,10 @@
   ASSERT_FALSE(remote_path->empty());
 
   const char* const log = "logloglog";
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(true, true));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(true, true));
 
   // Ensure the flushing of the file to disk before attempting to read them.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(*local_path, log);
   ExpectRemoteFileContents(*remote_path, log);
@@ -2015,19 +2125,18 @@
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   const std::string logs[] = {"ABC", "DEF", "XYZ"};
   for (const std::string& log : logs) {
-    ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-              std::make_pair(false, true));
+    ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, true));
   }
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectRemoteFileContents(
       *file_path,
@@ -2043,18 +2152,16 @@
 
   const std::string log = "tpyo";
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                 GzippedSize(log) - 1));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log) - 1));
 
   // Failure is reported, because not everything could be written. The file
   // will also be closed.
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1);
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(false, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, false));
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   // No partial writes occurred.
   ExpectRemoteFileContents(*file_path, "");
@@ -2070,19 +2177,16 @@
   const std::string log1 = "abcabc";
   const std::string log2 = "defghijklmnopqrstuvwxyz";
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                 1 + GzippedSize(log1)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key, 1 + GzippedSize(log1)));
 
   // First write works.
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log1),
-            std::make_pair(false, true));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log1), std::make_pair(false, true));
 
   // On the second write, failure is reported, because not everything could be
   // written. The file will also be closed.
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1);
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log2),
-            std::make_pair(false, false));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, log2), std::make_pair(false, false));
 
   ExpectRemoteFileContents(*file_path, log1);
 }
@@ -2097,9 +2201,8 @@
   for (size_t i = 0; i < keys.size(); ++i) {
     ON_CALL(remote_observer_, OnRemoteLogStarted(keys[i], _))
         .WillByDefault(Invoke(SaveFilePathTo(&file_paths[i])));
-    ASSERT_TRUE(PeerConnectionAdded(keys[i].render_process_id, keys[i].lid));
-    ASSERT_TRUE(
-        StartRemoteLogging(keys[i].render_process_id, GetUniqueId(keys[i])));
+    ASSERT_TRUE(PeerConnectionAdded(keys[i]));
+    ASSERT_TRUE(StartRemoteLogging(keys[i]));
     ASSERT_TRUE(file_paths[i]);
     ASSERT_FALSE(file_paths[i]->empty());
   }
@@ -2107,14 +2210,13 @@
   std::vector<std::string> logs;
   for (size_t i = 0; i < keys.size(); ++i) {
     logs.emplace_back(std::to_string(rph_->GetID()) + std::to_string(i));
-    ASSERT_EQ(
-        OnWebRtcEventLogWrite(keys[i].render_process_id, keys[i].lid, logs[i]),
-        std::make_pair(false, true));
+    ASSERT_EQ(OnWebRtcEventLogWrite(keys[i], logs[i]),
+              std::make_pair(false, true));
   }
 
   // Make sure the file woulds be closed, so that we could safely read them.
   for (auto& key : keys) {
-    ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionRemoved(key));
   }
 
   for (size_t i = 0; i < keys.size(); ++i) {
@@ -2125,12 +2227,12 @@
 TEST_F(WebRtcEventLogManagerTest,
        LogMultipleActiveRemoteLogsDifferentBrowserContexts) {
   constexpr size_t kLogsNum = 3;
-  TestingProfile* browser_contexts[kLogsNum];
+  std::unique_ptr<TestingProfile> browser_contexts[kLogsNum];
   std::vector<std::unique_ptr<MockRenderProcessHost>> rphs;
   for (size_t i = 0; i < kLogsNum; ++i) {
-    TestingProfile* const browser_context = CreateBrowserContext();
-    browser_contexts[i] = browser_context;
-    rphs.emplace_back(std::make_unique<MockRenderProcessHost>(browser_context));
+    browser_contexts[i] = CreateBrowserContext();
+    rphs.emplace_back(
+        std::make_unique<MockRenderProcessHost>(browser_contexts[i].get()));
   }
 
   std::vector<PeerConnectionKey> keys;
@@ -2142,9 +2244,8 @@
   for (size_t i = 0; i < keys.size(); ++i) {
     ON_CALL(remote_observer_, OnRemoteLogStarted(keys[i], _))
         .WillByDefault(Invoke(SaveFilePathTo(&file_paths[i])));
-    ASSERT_TRUE(PeerConnectionAdded(keys[i].render_process_id, keys[i].lid));
-    ASSERT_TRUE(
-        StartRemoteLogging(keys[i].render_process_id, GetUniqueId(keys[i])));
+    ASSERT_TRUE(PeerConnectionAdded(keys[i]));
+    ASSERT_TRUE(StartRemoteLogging(keys[i]));
     ASSERT_TRUE(file_paths[i]);
     ASSERT_FALSE(file_paths[i]->empty());
   }
@@ -2152,14 +2253,13 @@
   std::vector<std::string> logs;
   for (size_t i = 0; i < keys.size(); ++i) {
     logs.emplace_back(std::to_string(rph_->GetID()) + std::to_string(i));
-    ASSERT_EQ(
-        OnWebRtcEventLogWrite(keys[i].render_process_id, keys[i].lid, logs[i]),
-        std::make_pair(false, true));
+    ASSERT_EQ(OnWebRtcEventLogWrite(keys[i], logs[i]),
+              std::make_pair(false, true));
   }
 
   // Make sure the file woulds be closed, so that we could safely read them.
   for (auto& key : keys) {
-    ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionRemoved(key));
   }
 
   for (size_t i = 0; i < keys.size(); ++i) {
@@ -2178,18 +2278,16 @@
   }
 
   for (size_t i = 0; i < keys.size(); ++i) {
-    ASSERT_TRUE(PeerConnectionAdded(keys[i].render_process_id, keys[i].lid));
-    ASSERT_TRUE(StartRemoteLogging(keys[i].render_process_id,
-                                   GetUniqueId(keys[i]), GzippedSize(logs[i])));
+    ASSERT_TRUE(PeerConnectionAdded(keys[i]));
+    ASSERT_TRUE(StartRemoteLogging(keys[i], GzippedSize(logs[i])));
   }
 
   for (size_t i = 0; i < keys.size(); ++i) {
-    // The write is successful, but the file closed, indicating that the maximum
-    // file size has been reached.
+    // The write is successful, but the file closed, indicating that the
+    // maximum file size has been reached.
     EXPECT_CALL(remote_observer_, OnRemoteLogStopped(keys[i])).Times(1);
-    ASSERT_EQ(
-        OnWebRtcEventLogWrite(keys[i].render_process_id, keys[i].lid, logs[i]),
-        std::make_pair(false, true));
+    ASSERT_EQ(OnWebRtcEventLogWrite(keys[i], logs[i]),
+              std::make_pair(false, true));
     ASSERT_TRUE(file_paths[i]);
     ExpectRemoteFileContents(*file_paths[i], logs[i]);
   }
@@ -2203,14 +2301,12 @@
 
   const std::string log = "Let X equal X.";
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                 GzippedSize(log)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log)));
   ASSERT_TRUE(file_path);
 
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1);
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(false, true));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, true));
 }
 
 #if defined(OS_POSIX)
@@ -2219,42 +2315,41 @@
 TEST_F(WebRtcEventLogManagerTest,
        FailureToCreateRemoteLogsDirHandledGracefully) {
   const base::FilePath browser_context_dir = browser_context_->GetPath();
-  const base::FilePath remote_logs_path = RemoteBoundLogsDir(browser_context_);
+  const base::FilePath remote_logs_path =
+      RemoteBoundLogsDir(browser_context_.get());
 
   // Unload the profile, delete its remove logs directory, and remove write
   // permissions from it, thereby preventing it from being created again.
-  UnloadProfiles();
+  UnloadMainTestProfile();
   ASSERT_TRUE(base::DeleteFile(remote_logs_path, /*recursive=*/true));
   RemoveWritePermissions(browser_context_dir);
 
   // Graceful handling by BrowserContext::EnableForBrowserContext, despite
   // failing to create the remote logs' directory..
-  LoadProfiles();
+  LoadMainTestProfile();
   EXPECT_FALSE(base::DirectoryExists(remote_logs_path));
 
   // Graceful handling of PeerConnectionAdded: True returned because the
   // remote-logs' manager can still safely reason about the state of peer
   // connections even if one of its browser contexts is defective.)
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  EXPECT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  EXPECT_TRUE(PeerConnectionAdded(key));
 
   // Graceful handling of StartRemoteLogging: False returned because it's
   // impossible to write the log to a file.
   std::string error_message;
-  EXPECT_FALSE(StartRemoteLogging(rph_->GetID(), GetUniqueId(key), nullptr,
-                                  &error_message));
+  EXPECT_FALSE(StartRemoteLogging(key, nullptr, &error_message));
   EXPECT_EQ(error_message, kStartRemoteLoggingFailureGeneric);
 
   // Graceful handling of OnWebRtcEventLogWrite: False returned because the
   // log could not be written at all, let alone in its entirety.
   const char* const log = "This is not a log.";
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(false, false));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, false));
 
   // Graceful handling of PeerConnectionRemoved: True returned because the
   // remote-logs' manager can still safely reason about the state of peer
   // connections even if one of its browser contexts is defective.
-  EXPECT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  EXPECT_TRUE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest, GracefullyHandleFailureToStartRemoteLogFile) {
@@ -2263,39 +2358,38 @@
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(_)).Times(0);
 
   // Remove write permissions from the directory.
-  const base::FilePath remote_logs_path = RemoteBoundLogsDir(browser_context_);
+  const base::FilePath remote_logs_path =
+      RemoteBoundLogsDir(browser_context_.get());
   ASSERT_TRUE(base::DirectoryExists(remote_logs_path));
   RemoveWritePermissions(remote_logs_path);
 
   // StartRemoteLogging() will now fail.
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   std::string error_message;
-  EXPECT_FALSE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                  nullptr, &error_message));
+  EXPECT_FALSE(StartRemoteLogging(key, nullptr, &error_message));
   EXPECT_EQ(error_message, kStartRemoteLoggingFailureGeneric);
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "abc"),
-            std::make_pair(false, false));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "abc"), std::make_pair(false, false));
   EXPECT_TRUE(base::IsDirectoryEmpty(remote_logs_path));
 }
 #endif  // defined(OS_POSIX)
 
 TEST_F(WebRtcEventLogManagerTest, RemoteLogLimitActiveLogFiles) {
   for (int i = 0; i < kMaxActiveRemoteLogFiles + 1; ++i) {
-    ASSERT_TRUE(PeerConnectionAdded(rph_->GetID(), i));
+    const auto key = GetPeerConnectionKey(rph_.get(), i);
+    ASSERT_TRUE(PeerConnectionAdded(key));
   }
 
   for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
     EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _)).Times(1);
-    ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+    ASSERT_TRUE(StartRemoteLogging(key));
   }
 
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(_, _)).Times(0);
   const auto new_key =
       GetPeerConnectionKey(rph_.get(), kMaxActiveRemoteLogFiles);
-  EXPECT_FALSE(
-      StartRemoteLogging(new_key.render_process_id, GetUniqueId(new_key)));
+  EXPECT_FALSE(StartRemoteLogging(new_key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -2304,46 +2398,45 @@
 
   for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
     EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _)).Times(1);
-    ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                   GzippedSize(log)));
+    ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log)));
   }
 
   // By writing to one of the logs until it reaches capacity, we fill it,
   // causing it to close, therefore allowing an additional log.
-  EXPECT_EQ(OnWebRtcEventLogWrite(rph_->GetID(), 0, log),
+  const auto removed_key = GetPeerConnectionKey(rph_.get(), 0);
+  EXPECT_EQ(OnWebRtcEventLogWrite(removed_key, log),
             std::make_pair(false, true));
 
   // We now have room for one additional log.
   const auto new_key =
       GetPeerConnectionKey(rph_.get(), kMaxActiveRemoteLogFiles);
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(new_key, _)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(new_key.render_process_id, new_key.lid));
-  ASSERT_TRUE(
-      StartRemoteLogging(new_key.render_process_id, GetUniqueId(new_key)));
+  ASSERT_TRUE(PeerConnectionAdded(new_key));
+  ASSERT_TRUE(StartRemoteLogging(new_key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        RemoteLogForRemovedPeerConnectionNotCountedTowardsLogsLimit) {
   for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
     EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _)).Times(1);
-    ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+    ASSERT_TRUE(StartRemoteLogging(key));
   }
 
   // By removing a peer connection associated with one of the logs, we allow
   // an additional log.
-  ASSERT_TRUE(PeerConnectionRemoved(rph_->GetID(), 0));
+  const auto removed_key = GetPeerConnectionKey(rph_.get(), 0);
+  ASSERT_TRUE(PeerConnectionRemoved(removed_key));
 
   // We now have room for one additional log.
   const auto last_key =
       GetPeerConnectionKey(rph_.get(), kMaxActiveRemoteLogFiles);
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(last_key, _)).Times(1);
-  ASSERT_TRUE(PeerConnectionAdded(last_key.render_process_id, last_key.lid));
-  ASSERT_TRUE(
-      StartRemoteLogging(last_key.render_process_id, GetUniqueId(last_key)));
+  ASSERT_TRUE(PeerConnectionAdded(last_key));
+  ASSERT_TRUE(StartRemoteLogging(last_key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -2353,9 +2446,9 @@
   // Produce kMaxPendingRemoteLogFiles pending logs.
   for (int i = 0; i < kMaxPendingRemoteLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rph_.get(), i);
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-    ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-    ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+    ASSERT_TRUE(PeerConnectionAdded(key));
+    ASSERT_TRUE(StartRemoteLogging(key));
+    ASSERT_TRUE(PeerConnectionRemoved(key));
   }
 
   // It is now impossible to start another *active* log for that BrowserContext,
@@ -2363,11 +2456,9 @@
   // once completed).
   const auto forbidden =
       GetPeerConnectionKey(rph_.get(), kMaxPendingRemoteLogFiles);
-  ASSERT_TRUE(PeerConnectionAdded(forbidden.render_process_id, forbidden.lid));
+  ASSERT_TRUE(PeerConnectionAdded(forbidden));
   std::string error_message;
-  EXPECT_FALSE(StartRemoteLogging(forbidden.render_process_id,
-                                  GetUniqueId(forbidden), nullptr,
-                                  &error_message));
+  EXPECT_FALSE(StartRemoteLogging(forbidden, nullptr, &error_message));
   EXPECT_EQ(error_message, kStartRemoteLoggingFailureGeneric);
 }
 
@@ -2376,45 +2467,45 @@
   SuppressUploading();
 
   // Create additional BrowserContexts for the test.
-  TestingProfile* browser_contexts[2] = {CreateBrowserContext(),
-                                         CreateBrowserContext()};
+  std::unique_ptr<TestingProfile> browser_contexts[2] = {
+      CreateBrowserContext(), CreateBrowserContext()};
   std::unique_ptr<MockRenderProcessHost> rphs[2] = {
-      std::make_unique<MockRenderProcessHost>(browser_contexts[0]),
-      std::make_unique<MockRenderProcessHost>(browser_contexts[1])};
+      std::make_unique<MockRenderProcessHost>(browser_contexts[0].get()),
+      std::make_unique<MockRenderProcessHost>(browser_contexts[1].get())};
 
   // Allowed to start kMaxPendingRemoteLogFiles for each BrowserContext.
   // Specifically, we can do it for the first BrowserContext.
   for (int i = 0; i < kMaxPendingRemoteLogFiles; ++i) {
     const auto key = GetPeerConnectionKey(rphs[0].get(), i);
     // The log could be opened:
-    ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-    ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+    ASSERT_TRUE(PeerConnectionAdded(key));
+    ASSERT_TRUE(StartRemoteLogging(key));
     // The log changes state from ACTIVE to PENDING:
-    EXPECT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+    EXPECT_TRUE(PeerConnectionRemoved(key));
   }
 
   // Not allowed to start any more remote-bound logs for the BrowserContext on
   // which the limit was reached.
   const auto key0 =
       GetPeerConnectionKey(rphs[0].get(), kMaxPendingRemoteLogFiles);
-  ASSERT_TRUE(PeerConnectionAdded(key0.render_process_id, key0.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key0));
   std::string error_message;
-  EXPECT_FALSE(StartRemoteLogging(key0.render_process_id, GetUniqueId(key0),
-                                  nullptr, &error_message));
+  EXPECT_FALSE(StartRemoteLogging(key0, nullptr, &error_message));
   EXPECT_EQ(error_message, kStartRemoteLoggingFailureGeneric);
 
   // Other BrowserContexts aren't limit by the previous one's limit.
   const auto key1 = GetPeerConnectionKey(rphs[1].get(), 0);
-  ASSERT_TRUE(PeerConnectionAdded(key1.render_process_id, key1.lid));
-  EXPECT_TRUE(StartRemoteLogging(key1.render_process_id, GetUniqueId(key1)));
+  ASSERT_TRUE(PeerConnectionAdded(key1));
+  EXPECT_TRUE(StartRemoteLogging(key1));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
        LogsFromPreviousSessionBecomePendingLogsWhenBrowserContextInitialized) {
   // Unload the profile, but remember where it stores its files.
   const base::FilePath browser_context_path = browser_context_->GetPath();
-  const base::FilePath remote_logs_dir = RemoteBoundLogsDir(browser_context_);
-  UnloadProfiles();
+  const base::FilePath remote_logs_dir =
+      RemoteBoundLogsDir(browser_context_.get());
+  UnloadMainTestProfile();
 
   // Seed the remote logs' directory with log files, simulating the
   // creation of logs in a previous session.
@@ -2440,7 +2531,7 @@
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &expected_files, true, &run_loop));
 
-  LoadProfiles();
+  LoadMainTestProfile();
   ASSERT_EQ(browser_context_->GetPath(), browser_context_path);
 
   WaitForPendingTasks(&run_loop);
@@ -2453,8 +2544,9 @@
        LogsCapturedPreviouslyMadePendingEvenIfDifferentExtensionUsed) {
   // Unload the profile, but remember where it stores its files.
   const base::FilePath browser_context_path = browser_context_->GetPath();
-  const base::FilePath remote_logs_dir = RemoteBoundLogsDir(browser_context_);
-  UnloadProfiles();
+  const base::FilePath remote_logs_dir =
+      RemoteBoundLogsDir(browser_context_.get());
+  UnloadMainTestProfile();
 
   // Seed the remote logs' directory with log files, simulating the
   // creation of logs in a previous session.
@@ -2487,7 +2579,7 @@
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &expected_files, true, &run_loop));
 
-  LoadProfiles();
+  LoadMainTestProfile();
   ASSERT_EQ(browser_context_->GetPath(), browser_context_path);
 
   WaitForPendingTasks(&run_loop);
@@ -2503,8 +2595,8 @@
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(log_file);
 
   base::RunLoop run_loop;
@@ -2515,11 +2607,12 @@
           &expected_files, upload_result, &run_loop));
 
   // Peer connection removal triggers next upload.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   WaitForPendingTasks(&run_loop);
 
-  EXPECT_TRUE(base::IsDirectoryEmpty(RemoteBoundLogsDir(browser_context_)));
+  EXPECT_TRUE(
+      base::IsDirectoryEmpty(RemoteBoundLogsDir(browser_context_.get())));
 }
 
 TEST_P(WebRtcEventLogManagerTest, DestroyedRphTriggersLogUpload) {
@@ -2531,8 +2624,8 @@
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(log_file);
 
   base::RunLoop run_loop;
@@ -2547,7 +2640,8 @@
 
   WaitForPendingTasks(&run_loop);
 
-  EXPECT_TRUE(base::IsDirectoryEmpty(RemoteBoundLogsDir(browser_context_)));
+  EXPECT_TRUE(
+      base::IsDirectoryEmpty(RemoteBoundLogsDir(browser_context_.get())));
 }
 
 // Note that SuppressUploading() and UnSuppressUploading() use the behavior
@@ -2557,22 +2651,21 @@
   const auto tracked = GetPeerConnectionKey(rph_.get(), 1);
 
   // Suppresses the uploading of the "tracked" peer connection's log.
-  ASSERT_TRUE(PeerConnectionAdded(untracked.render_process_id, untracked.lid));
+  ASSERT_TRUE(PeerConnectionAdded(untracked));
 
   // The tracked peer connection's log is not uploaded when finished, because
   // another peer connection is still active.
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(tracked, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(tracked.render_process_id, tracked.lid));
-  ASSERT_TRUE(
-      StartRemoteLogging(tracked.render_process_id, GetUniqueId(tracked)));
+  ASSERT_TRUE(PeerConnectionAdded(tracked));
+  ASSERT_TRUE(StartRemoteLogging(tracked));
   ASSERT_TRUE(log_file);
-  ASSERT_TRUE(PeerConnectionRemoved(tracked.render_process_id, tracked.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(tracked));
 
   // Perform another action synchronously, so that we may be assured that the
   // observer's lack of callbacks was not a timing fluke.
-  OnWebRtcEventLogWrite(untracked.render_process_id, untracked.lid, "Ook!");
+  OnWebRtcEventLogWrite(untracked, "Ook!");
 
   // Having been convinced that |tracked|'s log was not uploded while
   // |untracked| was active, close |untracked| and see that |tracked|'s log
@@ -2583,8 +2676,7 @@
   SetWebRtcEventLogUploaderFactoryForTesting(
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &expected_uploads, true, &run_loop));
-  ASSERT_TRUE(
-      PeerConnectionRemoved(untracked.render_process_id, untracked.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(untracked));
 
   WaitForPendingTasks(&run_loop);
 }
@@ -2595,15 +2687,17 @@
 
   // Create profiles. This creates their directories.
   base::FilePath remote_logs_dirs[kProfilesNum];
-  BrowserContext* browser_contexts[kProfilesNum];
+  std::unique_ptr<BrowserContext> browser_contexts[kProfilesNum];
   for (size_t i = 0; i < kProfilesNum; ++i) {
     browser_contexts[i] = CreateBrowserContext(profile_names[i]);
-    remote_logs_dirs[i] = RemoteBoundLogsDir(browser_contexts[i]);
+    remote_logs_dirs[i] = RemoteBoundLogsDir(browser_contexts[i].get());
   }
 
   // Unload the profiles, so that whatever files we add into their directory
   // could be discovered by EnableForBrowserContext when we reload them.
-  UnloadProfiles();
+  for (size_t i = 0; i < kProfilesNum; ++i) {
+    browser_contexts[i].reset();
+  }
 
   // Seed the directories with log files.
   base::FilePath file_paths[kProfilesNum];
@@ -2635,17 +2729,16 @@
     mod_time += base::TimeDelta::FromSeconds(1);  // Back to the future.
     const base::FilePath& path = file_paths[permutation[i]];
     ASSERT_TRUE(base::TouchFile(path, shared_last_accessed, mod_time));
-    expected_files.emplace_back(GetBrowserContextId(browser_contexts[i]), path,
-                                GetLastModificationTime(path));
+    expected_files.emplace_back(GetBrowserContextId(browser_contexts[i].get()),
+                                path, GetLastModificationTime(path));
   }
 
   // Recognize the files as pending files by initializing their BrowserContexts.
   // We keep uploading suppressed so as to avoid them being uploaded in order of
   // loading, rather than in order of date.
-  LoadProfiles();
   SuppressUploading();
   for (size_t i = 0; i < kProfilesNum; ++i) {
-    CreateBrowserContext(profile_names[i]);  // Owned by the profile manager.
+    browser_contexts[i] = CreateBrowserContext(profile_names[i]);
   }
 
   // Show that the files are uploaded by order of modification.
@@ -2665,9 +2758,10 @@
   DCHECK_GE(kMaxPendingRemoteBoundWebRtcEventLogs, 2u)
       << "Please restructure the test to use separate browser contexts.";
 
-  const base::FilePath remote_logs_dir = RemoteBoundLogsDir(browser_context_);
+  const base::FilePath remote_logs_dir =
+      RemoteBoundLogsDir(browser_context_.get());
 
-  UnloadProfiles();
+  UnloadMainTestProfile();
 
   base::FilePath file_paths[2];
   for (size_t i = 0; i < 2; ++i) {
@@ -2702,13 +2796,14 @@
           &expected_files, true, &run_loop));
 
   // Recognize the files as pending by initializing their BrowserContext.
-  LoadProfiles();
+  LoadMainTestProfile();
 
   WaitForPendingTasks(&run_loop);
 
   // Both the uploaded file as well as the expired file have no been removed
   // from local disk.
-  EXPECT_TRUE(base::IsDirectoryEmpty(RemoteBoundLogsDir(browser_context_)));
+  EXPECT_TRUE(
+      base::IsDirectoryEmpty(RemoteBoundLogsDir(browser_context_.get())));
 }
 
 // TODO(crbug.com/775415): Add a test showing that a file expiring while another
@@ -2726,16 +2821,15 @@
 
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
   for (size_t i = 0; i < logs.size(); ++i) {
-    ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, logs[i]),
-              std::make_pair(false, true));
+    ASSERT_EQ(OnWebRtcEventLogWrite(key, logs[i]), std::make_pair(false, true));
   }
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectRemoteFileContents(
       *file_path,
@@ -2745,11 +2839,12 @@
 #if defined(OS_POSIX)
 TEST_F(WebRtcEventLogManagerTest,
        UnopenedRemoteLogFilesNotCountedTowardsActiveLogsLimit) {
-  TestingProfile* browser_contexts[2];
+  std::unique_ptr<TestingProfile> browser_contexts[2];
   std::unique_ptr<MockRenderProcessHost> rphs[2];
   for (size_t i = 0; i < 2; ++i) {
     browser_contexts[i] = CreateBrowserContext();
-    rphs[i] = std::make_unique<MockRenderProcessHost>(browser_contexts[i]);
+    rphs[i] =
+        std::make_unique<MockRenderProcessHost>(browser_contexts[i].get());
   }
 
   constexpr size_t without_permissions = 0;
@@ -2757,29 +2852,24 @@
 
   // Remove write permissions from one directory.
   const base::FilePath permissions_lacking_remote_logs_path =
-      RemoteBoundLogsDir(browser_contexts[without_permissions]);
+      RemoteBoundLogsDir(browser_contexts[without_permissions].get());
   ASSERT_TRUE(base::DirectoryExists(permissions_lacking_remote_logs_path));
   RemoveWritePermissions(permissions_lacking_remote_logs_path);
 
   // Fail to start a log associated with the permission-lacking directory.
   const auto without_permissions_key =
       GetPeerConnectionKey(rphs[without_permissions].get(), 0);
-  ASSERT_TRUE(PeerConnectionAdded(without_permissions_key.render_process_id,
-                                  without_permissions_key.lid));
-  std::string error_message;
-  ASSERT_FALSE(StartRemoteLogging(without_permissions_key.render_process_id,
-                                  GetUniqueId(without_permissions_key), nullptr,
-                                  &error_message));
-  EXPECT_EQ(error_message, kStartRemoteLoggingFailureGeneric);
+  ASSERT_TRUE(PeerConnectionAdded(without_permissions_key));
+  std::string error;
+  ASSERT_FALSE(StartRemoteLogging(without_permissions_key, nullptr, &error));
+  EXPECT_EQ(error, kStartRemoteLoggingFailureGeneric);
 
   // Show that this was not counted towards the limit of active files.
   for (int i = 0; i < kMaxActiveRemoteLogFiles; ++i) {
     const auto with_permissions_key =
         GetPeerConnectionKey(rphs[with_permissions].get(), i);
-    ASSERT_TRUE(PeerConnectionAdded(with_permissions_key.render_process_id,
-                                    with_permissions_key.lid));
-    EXPECT_TRUE(StartRemoteLogging(with_permissions_key.render_process_id,
-                                   GetUniqueId(with_permissions_key)));
+    ASSERT_TRUE(PeerConnectionAdded(with_permissions_key));
+    EXPECT_TRUE(StartRemoteLogging(with_permissions_key));
   }
 }
 #endif  // defined(OS_POSIX)
@@ -2797,7 +2887,7 @@
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   EXPECT_TRUE(webrtc_state_change_instructions_.empty());
 }
 
@@ -2807,8 +2897,8 @@
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ExpectWebRtcStateChangeInstruction(key, true);
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -2816,9 +2906,9 @@
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ExpectWebRtcStateChangeInstruction(key, true);
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -2826,9 +2916,9 @@
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ExpectWebRtcStateChangeInstruction(key, true);
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -2838,13 +2928,13 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
   ASSERT_TRUE(DisableLocalLogging());
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, false);
+  ExpectWebRtcStateChangeInstruction(key, false);
 }
 
 // #1 - Local logging was the cause of the logs.
@@ -2855,13 +2945,13 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, false);
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  ExpectWebRtcStateChangeInstruction(key, false);
 }
 
 // #2 - Remote logging was the cause of the logs.
@@ -2872,13 +2962,13 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, false);
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  ExpectWebRtcStateChangeInstruction(key, false);
 }
 
 // #1 - Local logging added first.
@@ -2889,12 +2979,12 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(StartRemoteLogging(key));
   EXPECT_TRUE(webrtc_state_change_instructions_.empty());
 }
 
@@ -2906,9 +2996,9 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
   ASSERT_TRUE(EnableLocalLogging());
@@ -2922,18 +3012,18 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
   ASSERT_TRUE(DisableLocalLogging());
   EXPECT_TRUE(webrtc_state_change_instructions_.empty());
 
   // Cleanup
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, false);
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  ExpectWebRtcStateChangeInstruction(key, false);
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -2943,14 +3033,14 @@
   // Setup
   SetPeerConnectionTrackerProxyForTesting(
       std::make_unique<PeerConnectionTrackerProxyForTesting>(this));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, true);
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ExpectWebRtcStateChangeInstruction(key, true);
 
   // Test
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
-  ExpectWebRtcStateChangeInstruction(key.render_process_id, key.lid, false);
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  ExpectWebRtcStateChangeInstruction(key, false);
   ASSERT_TRUE(DisableLocalLogging());
   EXPECT_TRUE(webrtc_state_change_instructions_.empty());
 }
@@ -2961,12 +3051,12 @@
 TEST_F(WebRtcEventLogManagerTest, SanityOverRecreatingTheSamePeerConnection) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log1");
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  OnWebRtcEventLogWrite(rph_->GetID(), kLid, "log2");
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  OnWebRtcEventLogWrite(key, "log1");
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  OnWebRtcEventLogWrite(key, "log2");
 }
 
 // The logs would typically be binary. However, the other tests only cover ASCII
@@ -2983,8 +3073,8 @@
       .WillByDefault(Invoke(SaveFilePathTo(&remote_log_file_path)));
 
   ASSERT_TRUE(EnableLocalLogging());
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(local_log_file_path);
   ASSERT_FALSE(local_log_file_path->empty());
   ASSERT_TRUE(remote_log_file_path);
@@ -2994,11 +3084,10 @@
   for (size_t i = 0; i < 256; ++i) {
     all_chars += static_cast<uint8_t>(i);
   }
-  ASSERT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, all_chars),
-            std::make_pair(true, true));
+  ASSERT_EQ(OnWebRtcEventLogWrite(key, all_chars), std::make_pair(true, true));
 
   // Make sure the file would be closed, so that we could safely read it.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   ExpectLocalFileContents(*local_log_file_path, all_chars);
   ExpectRemoteFileContents(*remote_log_file_path, all_chars);
@@ -3006,7 +3095,7 @@
 
 TEST_F(WebRtcEventLogManagerTest, LocalLogsClosedWhenRenderProcessHostExits) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
 
   // The expectation for OnLocalLogStopped() will be saturated by this
@@ -3018,8 +3107,8 @@
 
 TEST_F(WebRtcEventLogManagerTest, RemoteLogsClosedWhenRenderProcessHostExits) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
 
   // The expectation for OnRemoteLogStopped() will be saturated by this
   // destruction of the RenderProcessHost, which triggers an implicit
@@ -3039,9 +3128,9 @@
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&file_path)));
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
   ASSERT_TRUE(file_path);
   ASSERT_FALSE(file_path->empty());
 
@@ -3064,9 +3153,9 @@
 
 TEST_F(WebRtcEventLogManagerTest,
        PeerConnectionAddedOverDestroyedRphReturnsFalse) {
-  const int render_process_id = rph_->GetID();
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
   rph_.reset();
-  EXPECT_FALSE(PeerConnectionAdded(render_process_id, kLid));
+  EXPECT_FALSE(PeerConnectionAdded(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -3074,11 +3163,11 @@
   // Setup - make sure the |false| returned by the function being tested is
   // related to the RPH being dead, and not due other restrictions.
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   // Test
   rph_.reset();
-  EXPECT_FALSE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  EXPECT_FALSE(PeerConnectionRemoved(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -3086,11 +3175,11 @@
   // Setup - make sure the |false| returned by the function being tested is
   // related to the RPH being dead, and not due other restrictions.
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   // Test
   rph_.reset();
-  EXPECT_FALSE(PeerConnectionStopped(key.render_process_id, key.lid));
+  EXPECT_FALSE(PeerConnectionStopped(key));
 }
 
 TEST_F(WebRtcEventLogManagerTest,
@@ -3098,13 +3187,12 @@
   // Setup - make sure the |false| returned by the function being tested is
   // related to the RPH being dead, and not due other restrictions.
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
 
   // Test
   rph_.reset();
   std::string error_message;
-  EXPECT_FALSE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                  nullptr, &error_message));
+  EXPECT_FALSE(StartRemoteLogging(key, nullptr, &error_message));
   EXPECT_EQ(error_message, kStartRemoteLoggingFailureGeneric);
 }
 
@@ -3113,13 +3201,31 @@
   // Setup - make sure the |false| returned by the function being tested is
   // related to the RPH being dead, and not due other restrictions.
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
 
   // Test
   rph_.reset();
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(false, false));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
+}
+
+TEST_F(WebRtcEventLogManagerTest, DifferentProfilesCanHaveDifferentPolicies) {
+  auto policy_disabled_profile = CreateBrowserContext("disabled", false);
+  auto policy_disabled_rph =
+      std::make_unique<MockRenderProcessHost>(policy_disabled_profile.get());
+  const auto disabled_key =
+      GetPeerConnectionKey(policy_disabled_rph.get(), kLid);
+
+  auto policy_enabled_profile = CreateBrowserContext("enabled", true);
+  auto policy_enabled_rph =
+      std::make_unique<MockRenderProcessHost>(policy_enabled_profile.get());
+  const auto enabled_key = GetPeerConnectionKey(policy_enabled_rph.get(), kLid);
+
+  ASSERT_TRUE(PeerConnectionAdded(disabled_key));
+  ASSERT_TRUE(PeerConnectionAdded(enabled_key));
+
+  EXPECT_FALSE(StartRemoteLogging(disabled_key));
+  EXPECT_TRUE(StartRemoteLogging(enabled_key));
 }
 
 INSTANTIATE_TEST_CASE_P(UploadCompleteResult,
@@ -3130,18 +3236,20 @@
        ClearCacheForBrowserContextRemovesPendingFilesInRange) {
   SuppressUploading();
 
-  auto* const browser_context = CreateBrowserContext("name");
-  CreatePendingLogFiles(browser_context);
-  auto& elements = *(pending_logs_[browser_context]);
+  auto browser_context = CreateBrowserContext("name");
+  CreatePendingLogFiles(browser_context.get());
+  auto& elements = *(pending_logs_[browser_context.get()]);
 
   const base::Time earliest_mod = pending_earliest_mod_ - kEpsion;
   const base::Time latest_mod = pending_latest_mod_ + kEpsion;
 
   // Test - ClearCacheForBrowserContext() removed all of the files in the range.
-  ClearCacheForBrowserContext(browser_context, earliest_mod, latest_mod);
+  ClearCacheForBrowserContext(browser_context.get(), earliest_mod, latest_mod);
   for (size_t i = 0; i < elements.file_paths.size(); ++i) {
     EXPECT_FALSE(base::PathExists(*elements.file_paths[i]));
   }
+
+  ClearPendingLogFiles();
 }
 
 TEST_F(WebRtcEventLogManagerTestCacheClearing,
@@ -3150,19 +3258,19 @@
 
   // Setup
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   base::Optional<base::FilePath> file_path;
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .Times(1)
       .WillOnce(Invoke(SaveFilePathTo(&file_path)));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(file_path);
   ASSERT_TRUE(base::PathExists(*file_path));
 
   // Test
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(key)).Times(1);
   ClearCacheForBrowserContext(
-      browser_context_, base::Time::Now() - base::TimeDelta::FromHours(1),
+      browser_context_.get(), base::Time::Now() - base::TimeDelta::FromHours(1),
       base::Time::Now() + base::TimeDelta::FromHours(1));
   EXPECT_FALSE(base::PathExists(*file_path));
 }
@@ -3186,7 +3294,7 @@
 
   // Main part of test - the expectation set up in the the uploader factory
   // should now be satisfied.
-  ClearCacheForBrowserContext(browser_context_, mod_time - kEpsion,
+  ClearCacheForBrowserContext(browser_context_.get(), mod_time - kEpsion,
                               mod_time + kEpsion);
 }
 
@@ -3194,9 +3302,9 @@
        ClearCacheForBrowserContextDoesNotRemovePendingFilesOutOfRange) {
   SuppressUploading();
 
-  auto* const browser_context = CreateBrowserContext("name");
-  CreatePendingLogFiles(browser_context);
-  auto& elements = *(pending_logs_[browser_context]);
+  auto browser_context = CreateBrowserContext("name");
+  CreatePendingLogFiles(browser_context.get());
+  auto& elements = *(pending_logs_[browser_context.get()]);
 
   // Get a range whose intersection with the files' range is empty.
   const base::Time earliest_mod =
@@ -3207,10 +3315,12 @@
 
   // Test - ClearCacheForBrowserContext() does not remove files not in range.
   // (Range chosen to be earlier than the oldest file
-  ClearCacheForBrowserContext(browser_context, earliest_mod, latest_mod);
+  ClearCacheForBrowserContext(browser_context.get(), earliest_mod, latest_mod);
   for (size_t i = 0; i < elements.file_paths.size(); ++i) {
     EXPECT_TRUE(base::PathExists(*elements.file_paths[i]));
   }
+
+  ClearPendingLogFiles();
 }
 
 TEST_F(WebRtcEventLogManagerTestCacheClearing,
@@ -3219,19 +3329,19 @@
 
   // Setup
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   base::Optional<base::FilePath> file_path;
   EXPECT_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .Times(1)
       .WillOnce(Invoke(SaveFilePathTo(&file_path)));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(file_path);
   ASSERT_TRUE(base::PathExists(*file_path));
 
   // Test
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(_)).Times(0);
   ClearCacheForBrowserContext(
-      browser_context_, base::Time::Now() - base::TimeDelta::FromHours(2),
+      browser_context_.get(), base::Time::Now() - base::TimeDelta::FromHours(2),
       base::Time::Now() - base::TimeDelta::FromHours(1));
   EXPECT_TRUE(base::PathExists(*file_path));
 }
@@ -3253,7 +3363,7 @@
   // Main part of test - the expectation set up in the the uploader factory,
   // that the upload will not be cancelled, should be shown to hold true.
   // should now be satisfied.
-  ClearCacheForBrowserContext(browser_context_, mod_time + kEpsion,
+  ClearCacheForBrowserContext(browser_context_.get(), mod_time + kEpsion,
                               mod_time + 2 * kEpsion);
 }
 
@@ -3261,13 +3371,13 @@
        ClearCacheForBrowserContextDoesNotRemovePendingFilesFromOtherProfiles) {
   SuppressUploading();
 
-  auto* const cleared_browser_context = CreateBrowserContext("cleared");
-  CreatePendingLogFiles(cleared_browser_context);
-  auto& cleared_elements = *(pending_logs_[cleared_browser_context]);
+  auto cleared_browser_context = CreateBrowserContext("cleared");
+  CreatePendingLogFiles(cleared_browser_context.get());
+  auto& cleared_elements = *(pending_logs_[cleared_browser_context.get()]);
 
-  auto* const uncleared_browser_context = CreateBrowserContext("pristine");
-  CreatePendingLogFiles(uncleared_browser_context);
-  auto& uncleared_elements = *(pending_logs_[uncleared_browser_context]);
+  auto const uncleared_browser_context = CreateBrowserContext("pristine");
+  CreatePendingLogFiles(uncleared_browser_context.get());
+  auto& uncleared_elements = *(pending_logs_[uncleared_browser_context.get()]);
 
   ASSERT_EQ(cleared_elements.file_paths.size(),
             uncleared_elements.file_paths.size());
@@ -3278,12 +3388,14 @@
 
   // Test - ClearCacheForBrowserContext() only removes the files which belong
   // to the cleared context.
-  ClearCacheForBrowserContext(cleared_browser_context, earliest_mod,
+  ClearCacheForBrowserContext(cleared_browser_context.get(), earliest_mod,
                               latest_mod);
   for (size_t i = 0; i < kFileCount; ++i) {
     EXPECT_FALSE(base::PathExists(*cleared_elements.file_paths[i]));
     EXPECT_TRUE(base::PathExists(*uncleared_elements.file_paths[i]));
   }
+
+  ClearPendingLogFiles();
 }
 
 TEST_F(WebRtcEventLogManagerTestCacheClearing,
@@ -3291,17 +3403,17 @@
   SuppressUploading();
 
   // Remote-bound active log file that *will* be cleared.
-  auto* const cleared_browser_context = CreateBrowserContext("cleared");
+  auto cleared_browser_context = CreateBrowserContext("cleared");
   auto cleared_rph =
-      std::make_unique<MockRenderProcessHost>(cleared_browser_context);
+      std::make_unique<MockRenderProcessHost>(cleared_browser_context.get());
   const auto cleared_key = GetPeerConnectionKey(cleared_rph.get(), kLid);
   base::Optional<base::FilePath> cleared_file_path =
       CreateActiveRemoteLogFile(cleared_key);
 
   // Remote-bound active log file that will *not* be cleared.
-  auto* const uncleared_browser_context = CreateBrowserContext("pristine");
+  auto uncleared_browser_context = CreateBrowserContext("pristine");
   auto uncleared_rph =
-      std::make_unique<MockRenderProcessHost>(uncleared_browser_context);
+      std::make_unique<MockRenderProcessHost>(uncleared_browser_context.get());
   const auto uncleared_key = GetPeerConnectionKey(uncleared_rph.get(), kLid);
   base::Optional<base::FilePath> uncleared_file_path =
       CreateActiveRemoteLogFile(uncleared_key);
@@ -3310,7 +3422,7 @@
   // to the cleared context.
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(cleared_key)).Times(1);
   EXPECT_CALL(remote_observer_, OnRemoteLogStopped(uncleared_key)).Times(0);
-  ClearCacheForBrowserContext(cleared_browser_context, base::Time::Min(),
+  ClearCacheForBrowserContext(cleared_browser_context.get(), base::Time::Min(),
                               base::Time::Max());
   EXPECT_FALSE(base::PathExists(*cleared_file_path));
   EXPECT_TRUE(base::PathExists(*uncleared_file_path));
@@ -3337,9 +3449,9 @@
   // Main part of test - the expectation set up in the the uploader factory,
   // that the upload will not be cancelled, should be shown to hold true.
   // should now be satisfied.
-  const auto* const different_browser_context = CreateBrowserContext();
-  ClearCacheForBrowserContext(different_browser_context, mod_time - kEpsion,
-                              mod_time + kEpsion);
+  auto const different_browser_context = CreateBrowserContext();
+  ClearCacheForBrowserContext(different_browser_context.get(),
+                              mod_time - kEpsion, mod_time + kEpsion);
 }
 
 // Show that clearing browser cache, while it removes remote-bound logs, does
@@ -3361,7 +3473,7 @@
 
   // Test focus - local logging is uninterrupted.
   EXPECT_CALL(local_observer_, OnLocalLogStopped(_)).Times(0);
-  ClearCacheForBrowserContext(browser_context_, base::Time::Min(),
+  ClearCacheForBrowserContext(browser_context_.get(), base::Time::Min(),
                               base::Time::Max());
   EXPECT_TRUE(base::PathExists(*local_log));
 
@@ -3385,9 +3497,9 @@
   // Create the not-deleted file under a different profile, to easily make sure
   // it does not fit in the ClearCacheForBrowserContext range (less fiddly than
   // a time range).
-  auto* other_browser_context = CreateBrowserContext();
+  auto other_browser_context = CreateBrowserContext();
   auto other_rph =
-      std::make_unique<MockRenderProcessHost>(other_browser_context);
+      std::make_unique<MockRenderProcessHost>(other_browser_context.get());
   const auto key = GetPeerConnectionKey(other_rph.get(), kLid);
   base::Optional<base::FilePath> other_file = CreatePendingRemoteLogFile(key);
   ASSERT_TRUE(other_file);
@@ -3396,83 +3508,191 @@
   // new file, which is not deleted, is uploaded.
   base::RunLoop run_loop;
   std::list<WebRtcLogFileInfo> expected_files = {
-      WebRtcLogFileInfo(GetBrowserContextId(other_browser_context), *other_file,
-                        GetLastModificationTime(*other_file))};
+      WebRtcLogFileInfo(GetBrowserContextId(other_browser_context.get()),
+                        *other_file, GetLastModificationTime(*other_file))};
   SetWebRtcEventLogUploaderFactoryForTesting(
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &expected_files, true, &run_loop));
 
   // Clearing the cache for the first profile, should now trigger the upload
   // of the last remaining unclear pending log file - |other_file|.
-  ClearCacheForBrowserContext(browser_context_, base::Time::Min(),
+  ClearCacheForBrowserContext(browser_context_.get(), base::Time::Min(),
                               base::Time::Max());
   WaitForPendingTasks(&run_loop);
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityPeerConnectionAdded) {
-  EXPECT_TRUE(PeerConnectionAdded(rph_->GetID(), kLid));
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  EXPECT_TRUE(PeerConnectionAdded(key));
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityPeerConnectionRemoved) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  EXPECT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_TRUE(PeerConnectionRemoved(key));
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityPeerConnectionStopped) {
-  PeerConnectionStopped(rph_->GetID(), kLid);  // No crash.
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  PeerConnectionStopped(key);  // No crash.
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityEnableLocalLogging) {
-  ASSERT_TRUE(PeerConnectionAdded(rph_->GetID(), kLid));
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
   ASSERT_TRUE(EnableLocalLogging());
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityDisableLocalLogging) {
   ASSERT_TRUE(EnableLocalLogging());
   EXPECT_TRUE(DisableLocalLogging());
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityStartRemoteLogging) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key));
   std::string error_message;
-  EXPECT_FALSE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                  nullptr, &error_message));
+  EXPECT_FALSE(StartRemoteLogging(key, nullptr, &error_message));
   EXPECT_EQ(error_message, kStartRemoteLoggingFailureFeatureDisabled);
 }
 
-TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
+TEST_P(WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
        SanityOnWebRtcEventLogWrite) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_FALSE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, "log"),
-            std::make_pair(false, false));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_FALSE(StartRemoteLogging(key));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
 }
 
-INSTANTIATE_TEST_CASE_P(
-    ExplicitlyDisable,
-    WebRtcEventLogManagerTestWithRemoteLoggingDisabledOrNotEnabled,
-    ::testing::Bool());
+INSTANTIATE_TEST_CASE_P(,
+                        WebRtcEventLogManagerTestWithRemoteLoggingDisabled,
+                        ::testing::Bool());
 
-TEST_F(WebRtcEventLogManagerTestUploadSuppressionDisablingFlag,
-       UploadingNotSuppressedByActivePeerConnections) {
-  SuppressUploading();
+// This test is redundant; it is provided for completeness; see following tests.
+TEST_F(WebRtcEventLogManagerTestPolicy, StartsEnabledAllowsRemoteLogging) {
+  const bool allow_remote_logging = true;
+  auto browser_context = CreateBrowserContext("name", allow_remote_logging);
 
-  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
+  auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
+}
+
+// This test is redundant; it is provided for completeness; see following tests.
+TEST_F(WebRtcEventLogManagerTestPolicy, StartsDisabledRejectsRemoteLogging) {
+  const bool allow_remote_logging = false;
+  auto browser_context = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(browser_context.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
+}
+
+// #1 and #2 differ in the order of AddPeerConnection and the changing of
+// the pref value.
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsEnabledThenDisabledRejectsRemoteLogging1) {
+  bool allow_remote_logging = true;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
+}
+
+// #1 and #2 differ in the order of AddPeerConnection and the changing of
+// the pref value.
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsEnabledThenDisabledRejectsRemoteLogging2) {
+  bool allow_remote_logging = true;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+
+  EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
+}
+
+// #1 and #2 differ in the order of AddPeerConnection and the changing of
+// the pref value.
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsDisabledThenEnabledAllowsRemoteLogging1) {
+  bool allow_remote_logging = false;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
+}
+
+// #1 and #2 differ in the order of AddPeerConnection and the changing of
+// the pref value.
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsDisabledThenEnabledAllowsRemoteLogging2) {
+  bool allow_remote_logging = false;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+
+  EXPECT_EQ(StartRemoteLogging(key), allow_remote_logging);
+}
+
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsDisabledThenEnabledUploadsPendingLogFiles) {
+  bool allow_remote_logging = false;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
 
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(allow_remote_logging)
+      << "Must turn on before StartRemoteLogging, to test the right thing.";
+  ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
   ASSERT_TRUE(log_file);
 
   base::RunLoop run_loop;
@@ -3482,22 +3702,161 @@
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &expected_files, true, &run_loop));
 
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+
+  WaitForPendingTasks(&run_loop);
+}
+
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsEnabledThenDisabledDoesNotUploadPendingLogFiles) {
+  SuppressUploading();
+
+  std::list<WebRtcLogFileInfo> empty_list;
+  base::RunLoop run_loop;
+  SetWebRtcEventLogUploaderFactoryForTesting(
+      std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
+          &empty_list, true, &run_loop));
+
+  bool allow_remote_logging = true;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(allow_remote_logging)
+      << "Must turn off after StartRemoteLogging, to test the right thing.";
+  ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  UnsuppressUploading();
+
+  WaitForPendingTasks(&run_loop);
+}
+
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsEnabledThenDisabledDeletesPendingLogFiles) {
+  SuppressUploading();
+
+  std::list<WebRtcLogFileInfo> empty_list;
+  base::RunLoop run_loop;
+  SetWebRtcEventLogUploaderFactoryForTesting(
+      std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
+          &empty_list, true, &run_loop));
+
+  bool allow_remote_logging = true;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  base::Optional<base::FilePath> log_file;
+  ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
+      .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(allow_remote_logging)
+      << "Must turn off after StartRemoteLogging, to test the right thing.";
+  ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
+  ASSERT_TRUE(log_file);
+
+  // Make the file PENDING.
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+  ASSERT_TRUE(base::PathExists(*log_file));  // Test sanity; exists before.
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  WaitForPendingTasks(&run_loop);
+
+  // Test focus - file deleted without being uploaded.
+  EXPECT_FALSE(base::PathExists(*log_file));
+
+  // Still not uploaded.
+  UnsuppressUploading();
+  WaitForPendingTasks();
+}
+
+TEST_F(WebRtcEventLogManagerTestPolicy,
+       StartsEnabledThenDisabledCancelsAndDeletesCurrentlyUploadedLogFile) {
+  // This factory expects exactly one log to be created, then cancelled.
+  SetWebRtcEventLogUploaderFactoryForTesting(
+      std::make_unique<NullWebRtcEventLogUploader::Factory>(true, 1));
+
+  bool allow_remote_logging = true;
+  auto profile = CreateBrowserContext("name", allow_remote_logging);
+
+  auto rph = std::make_unique<MockRenderProcessHost>(profile.get());
+  const auto key = GetPeerConnectionKey(rph.get(), kLid);
+
+  base::Optional<base::FilePath> log_file;
+  ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
+      .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(allow_remote_logging)
+      << "Must turn off after StartRemoteLogging, to test the right thing.";
+  ASSERT_EQ(StartRemoteLogging(key), allow_remote_logging);
+  ASSERT_TRUE(log_file);
+
+  // Log file's upload commences.
+  ASSERT_TRUE(PeerConnectionRemoved(key));
+
+  ASSERT_TRUE(base::PathExists(*log_file));  // Test sanity; exists before.
+
+  allow_remote_logging = !allow_remote_logging;
+  profile->GetPrefs()->SetBoolean(prefs::kWebRtcEventLogCollectionAllowed,
+                                  allow_remote_logging);
+
+  WaitForPendingTasks();
+
+  // Test focus - file deleted without being uploaded.
+  // When the test terminates, the NullWebRtcEventLogUploader::Factory's
+  // expectation that one log file was uploaded, and that the upload was
+  // cancelled, is enforced.
+  // Deletion of the file not performed by NullWebRtcEventLogUploader; instead,
+  // WebRtcEventLogUploaderImplTest.CancelOnOngoingUploadDeletesFile tests that.
+}
+
+TEST_F(WebRtcEventLogManagerTestUploadSuppressionDisablingFlag,
+       UploadingNotSuppressedByActivePeerConnections) {
+  SuppressUploading();
+
+  const auto key = GetPeerConnectionKey(rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+
+  base::Optional<base::FilePath> log_file;
+  ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
+      .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
+  ASSERT_TRUE(StartRemoteLogging(key));
+  ASSERT_TRUE(log_file);
+
+  base::RunLoop run_loop;
+  std::list<WebRtcLogFileInfo> expected_files = {WebRtcLogFileInfo(
+      browser_context_id_, *log_file, GetLastModificationTime(*log_file))};
+  SetWebRtcEventLogUploaderFactoryForTesting(
+      std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
+          &expected_files, true, &run_loop));
+
+  ASSERT_TRUE(PeerConnectionRemoved(key));
   WaitForPendingTasks(&run_loop);
 }
 
 TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
        DoNotUploadPendingLogsIfConnectedToUnsupportedNetworkType) {
   WebRtcEventLogManagerTestBase::SetUp(
-      std::make_unique<content::MockNetworkConnectionTracker>(
+      std::make_unique<network::TestNetworkConnectionTracker>(
           get_conn_type_is_sync_, unsupported_type_));
 
   const auto key = GetPeerConnectionKey(rph_.get(), 1);
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(log_file);
 
   std::list<WebRtcLogFileInfo> empty_expected_files_list;
@@ -3507,7 +3866,7 @@
           &empty_expected_files_list, true, &run_loop));
 
   // Peer connection removal MAY trigger upload, depending on network.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   WaitForPendingTasks(&run_loop);
 }
@@ -3515,15 +3874,15 @@
 TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
        UploadPendingLogsIfConnectedToSupportedNetworkType) {
   WebRtcEventLogManagerTestBase::SetUp(
-      std::make_unique<content::MockNetworkConnectionTracker>(
+      std::make_unique<network::TestNetworkConnectionTracker>(
           get_conn_type_is_sync_, supported_type_));
 
   const auto key = GetPeerConnectionKey(rph_.get(), 1);
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(log_file);
 
   base::RunLoop run_loop;
@@ -3534,29 +3893,29 @@
           &expected_files, true, &run_loop));
 
   // Peer connection removal MAY trigger upload, depending on network.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   WaitForPendingTasks(&run_loop);
 }
 
 TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
        UploadPendingLogsIfConnectionTypeChangesFromUnsupportedToSupported) {
-  auto tracker = std::make_unique<content::MockNetworkConnectionTracker>(
+  auto tracker = std::make_unique<network::TestNetworkConnectionTracker>(
       get_conn_type_is_sync_, unsupported_type_);
-  content::MockNetworkConnectionTracker* mock = tracker.get();
+  network::TestNetworkConnectionTracker* mock = tracker.get();
   WebRtcEventLogManagerTestBase::SetUp(std::move(tracker));
 
   const auto key = GetPeerConnectionKey(rph_.get(), 1);
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(log_file);
 
   // That a peer connection upload is not initiated by this point, is verified
   // by previous tests.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
   WaitForPendingTasks();
 
   // Test focus - an upload will be initiated after changing the network type.
@@ -3574,7 +3933,7 @@
 TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
        DoNotUploadPendingLogsAtStartupIfConnectedToUnsupportedNetworkType) {
   WebRtcEventLogManagerTestBase::SetUp(
-      std::make_unique<content::MockNetworkConnectionTracker>(
+      std::make_unique<network::TestNetworkConnectionTracker>(
           get_conn_type_is_sync_, unsupported_type_));
 
   UnloadProfileAndSeedPendingLog();
@@ -3587,7 +3946,7 @@
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &empty_expected_files_list, true, &run_loop));
 
-  LoadProfiles();
+  LoadMainTestProfile();
   ASSERT_EQ(browser_context_->GetPath(), browser_context_path_);
 
   WaitForPendingTasks(&run_loop);
@@ -3596,7 +3955,7 @@
 TEST_P(WebRtcEventLogManagerTestForNetworkConnectivity,
        UploadPendingLogsAtStartupIfConnectedToSupportedNetworkType) {
   WebRtcEventLogManagerTestBase::SetUp(
-      std::make_unique<content::MockNetworkConnectionTracker>(
+      std::make_unique<network::TestNetworkConnectionTracker>(
           get_conn_type_is_sync_, supported_type_));
 
   UnloadProfileAndSeedPendingLog();
@@ -3608,7 +3967,7 @@
       std::make_unique<FileListExpectingWebRtcEventLogUploader::Factory>(
           &expected_files_, true, &run_loop));
 
-  LoadProfiles();
+  LoadMainTestProfile();
   ASSERT_EQ(browser_context_->GetPath(), browser_context_path_);
 
   WaitForPendingTasks(&run_loop);
@@ -3631,8 +3990,8 @@
   SetUp(kIntentionallyExcessiveDelayMs);
 
   const auto key = GetPeerConnectionKey(rph_.get(), 1);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
 
   std::list<WebRtcLogFileInfo> empty_list;
   base::RunLoop run_loop;
@@ -3641,7 +4000,7 @@
           &empty_list, true, &run_loop));
 
   // Change log file from ACTIVE to PENDING.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   // Wait a bit and see that the upload was not initiated. (Due to technical
   // constraints, we cannot wait forever.)
@@ -3662,8 +4021,8 @@
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
   ASSERT_TRUE(log_file);
 
   base::RunLoop run_loop;
@@ -3674,7 +4033,7 @@
           &expected_files, true, &run_loop));
 
   // Change log file from ACTIVE to PENDING.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   WaitForPendingTasks(&run_loop);
 }
@@ -3686,8 +4045,8 @@
   const auto key1 = GetPeerConnectionKey(rph_.get(), 1);
   const auto key2 = GetPeerConnectionKey(rph_.get(), 2);
 
-  ASSERT_TRUE(PeerConnectionAdded(key1.render_process_id, key1.lid));
-  ASSERT_TRUE(StartRemoteLogging(key1.render_process_id, GetUniqueId(key1)));
+  ASSERT_TRUE(PeerConnectionAdded(key1));
+  ASSERT_TRUE(StartRemoteLogging(key1));
 
   std::list<WebRtcLogFileInfo> empty_list;
   base::RunLoop run_loop;
@@ -3696,13 +4055,13 @@
           &empty_list, true, &run_loop));
 
   // Change log file from ACTIVE to PENDING.
-  ASSERT_TRUE(PeerConnectionRemoved(key1.render_process_id, key1.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key1));
 
   // Test focus - after adding a peer connection, the conditions for the upload
   // are no longer considered to hold.
   // (Test implemented with a glimpse into the black box due to technical
   // limitations and the desire to avoid flakiness.)
-  ASSERT_TRUE(PeerConnectionAdded(key2.render_process_id, key2.lid));
+  ASSERT_TRUE(PeerConnectionAdded(key2));
   EXPECT_FALSE(UploadConditionsHold());
 
   WaitForPendingTasks(&run_loop);
@@ -3714,8 +4073,8 @@
 
   const auto key = GetPeerConnectionKey(rph_.get(), 1);
 
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key));
 
   std::list<WebRtcLogFileInfo> empty_list;
   base::RunLoop run_loop;
@@ -3724,14 +4083,14 @@
           &empty_list, true, &run_loop));
 
   // Change log file from ACTIVE to PENDING.
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   // Test focus - after clearing browser cache, the conditions for the upload
   // are no longer considered to hold, because the file about to be uploaded
   // was deleted.
   // (Test implemented with a glimpse into the black box due to technical
   // limitations and the desire to avoid flakiness.)
-  ClearCacheForBrowserContext(browser_context_, base::Time::Min(),
+  ClearCacheForBrowserContext(browser_context_.get(), base::Time::Min(),
                               base::Time::Max());
   EXPECT_FALSE(UploadConditionsHold());
 
@@ -3748,9 +4107,8 @@
   base::Optional<base::FilePath> log_file;
   ON_CALL(remote_observer_, OnRemoteLogStarted(key, _))
       .WillByDefault(Invoke(SaveFilePathTo(&log_file)));
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  ASSERT_TRUE(StartRemoteLogging(key.render_process_id, GetUniqueId(key),
-                                 GzippedSize(log) - 1));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_TRUE(StartRemoteLogging(key, GzippedSize(log) - 1));
   ASSERT_TRUE(log_file);
 
   std::list<WebRtcLogFileInfo> empty_list;
@@ -3760,8 +4118,7 @@
           &empty_list, true, &run_loop));
 
   // Writing fails because the budget is exceeded.
-  EXPECT_EQ(OnWebRtcEventLogWrite(key.render_process_id, key.lid, log),
-            std::make_pair(false, false));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, log), std::make_pair(false, false));
 
   // The file was deleted due to the error we've instigated (by using an
   // intentionally over-optimistic estimation).
@@ -3769,11 +4126,43 @@
 
   // If the file is incorrectly still eligible for an upload, this will trigger
   // the upload (which will be a test failure).
-  ASSERT_TRUE(PeerConnectionRemoved(key.render_process_id, key.lid));
+  ASSERT_TRUE(PeerConnectionRemoved(key));
 
   WaitForPendingTasks(&run_loop);
 }
 
+TEST_F(WebRtcEventLogManagerTestIncognito,
+       NoRemoteBoundLogsDirectoryCreatedWhenProfileLoaded) {
+  const base::FilePath remote_logs_path =
+      RemoteBoundLogsDir(incognito_profile_);
+  EXPECT_FALSE(base::DirectoryExists(remote_logs_path));
+}
+
+TEST_F(WebRtcEventLogManagerTestIncognito, StartRemoteLoggingFails) {
+  const auto key = GetPeerConnectionKey(incognito_rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_FALSE(StartRemoteLogging(key));
+}
+
+TEST_F(WebRtcEventLogManagerTestIncognito,
+       StartRemoteLoggingDoesNotCreateDirectoryOrFiles) {
+  const auto key = GetPeerConnectionKey(incognito_rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_FALSE(StartRemoteLogging(key));
+
+  const base::FilePath remote_logs_path =
+      RemoteBoundLogsDir(incognito_profile_);
+  EXPECT_FALSE(base::DirectoryExists(remote_logs_path));
+}
+
+TEST_F(WebRtcEventLogManagerTestIncognito,
+       OnWebRtcEventLogWriteReturnsFalseForRemotePart) {
+  const auto key = GetPeerConnectionKey(incognito_rph_.get(), kLid);
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  ASSERT_FALSE(StartRemoteLogging(key));
+  EXPECT_EQ(OnWebRtcEventLogWrite(key, "log"), std::make_pair(false, false));
+}
+
 #else  // defined(OS_ANDROID)
 
 class WebRtcEventLogManagerTestOnMobileDevices
@@ -3789,8 +4178,8 @@
 
 TEST_F(WebRtcEventLogManagerTestOnMobileDevices, RemoteBoundLoggingDisabled) {
   const auto key = GetPeerConnectionKey(rph_.get(), kLid);
-  ASSERT_TRUE(PeerConnectionAdded(key.render_process_id, key.lid));
-  EXPECT_FALSE(StartRemoteLogging(key.render_process_id, GetUniqueId(key)));
+  ASSERT_TRUE(PeerConnectionAdded(key));
+  EXPECT_FALSE(StartRemoteLogging(key));
 }
 
 #endif
diff --git a/chrome/browser/media/webrtc/webrtc_log_uploader.cc b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
index 2e15711..8da49240 100644
--- a/chrome/browser/media/webrtc/webrtc_log_uploader.cc
+++ b/chrome/browser/media/webrtc/webrtc_log_uploader.cc
@@ -14,7 +14,7 @@
 #include "base/pickle.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/media/webrtc/webrtc_log_util.cc b/chrome/browser/media/webrtc/webrtc_log_util.cc
index a438d88e..5a7ffe0c 100644
--- a/chrome/browser/media/webrtc/webrtc_log_util.cc
+++ b/chrome/browser/media/webrtc/webrtc_log_util.cc
@@ -6,7 +6,7 @@
 
 #include <vector>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_attributes_entry.h"
diff --git a/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc b/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc
index acc0ce6..8182bd2b 100644
--- a/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc
+++ b/chrome/browser/media/webrtc/webrtc_logging_handler_host.cc
@@ -11,7 +11,7 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/bad_message.h"
 #include "chrome/browser/media/webrtc/webrtc_event_log_manager.h"
diff --git a/chrome/browser/media/webrtc/webrtc_rtp_dump_handler.cc b/chrome/browser/media/webrtc/webrtc_rtp_dump_handler.cc
index 80ec501..66aded9 100644
--- a/chrome/browser/media/webrtc/webrtc_rtp_dump_handler.cc
+++ b/chrome/browser/media/webrtc/webrtc_rtp_dump_handler.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/media/webrtc/webrtc_rtp_dump_writer.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc b/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc
index 3c551da5..f1a28ed4 100644
--- a/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc
+++ b/chrome/browser/media/webrtc/webrtc_rtp_dump_handler_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/media/webrtc/webrtc_rtp_dump_writer.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc b/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc
index d4a1c63..6a21ee87 100644
--- a/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc
+++ b/chrome/browser/media/webrtc/webrtc_rtp_dump_writer.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "third_party/zlib/zlib.h"
 
diff --git a/chrome/browser/media/webrtc/webrtc_text_log_handler.cc b/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
index 4320bec..534e2ce 100644
--- a/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
+++ b/chrome/browser/media/webrtc/webrtc_text_log_handler.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/media/webrtc/webrtc_log_uploader.h"
 #include "chrome/common/channel_info.h"
diff --git a/chrome/browser/media_galleries/chromeos/mtp_device_delegate_impl_chromeos.cc b/chrome/browser/media_galleries/chromeos/mtp_device_delegate_impl_chromeos.cc
index a78500c..f4c690c 100644
--- a/chrome/browser/media_galleries/chromeos/mtp_device_delegate_impl_chromeos.cc
+++ b/chrome/browser/media_galleries/chromeos/mtp_device_delegate_impl_chromeos.cc
@@ -23,8 +23,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/media_galleries/chromeos/mtp_device_task_helper_map_service.h"
 #include "chrome/browser/media_galleries/chromeos/snapshot_file_details.h"
diff --git a/chrome/browser/media_galleries/chromeos/mtp_read_file_worker.cc b/chrome/browser/media_galleries/chromeos/mtp_read_file_worker.cc
index 3fcde349f..323fd330 100644
--- a/chrome/browser/media_galleries/chromeos/mtp_read_file_worker.cc
+++ b/chrome/browser/media_galleries/chromeos/mtp_read_file_worker.cc
@@ -10,8 +10,8 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/numerics/safe_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/media_galleries/chromeos/snapshot_file_details.h"
 #include "components/storage_monitor/storage_monitor.h"
diff --git a/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc b/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc
index ad7655c5..a3a795f 100644
--- a/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc
+++ b/chrome/browser/media_galleries/fileapi/av_scanning_file_validator.cc
@@ -17,7 +17,7 @@
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
index fb42866..812338f 100644
--- a/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
+++ b/chrome/browser/media_galleries/fileapi/media_file_system_backend.cc
@@ -16,7 +16,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc b/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc
index 04b190bd..3cad8e5 100644
--- a/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc
+++ b/chrome/browser/media_galleries/fileapi/media_file_validator_browsertest.cc
@@ -14,8 +14,8 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/media_galleries/fileapi/supported_audio_video_checker.cc b/chrome/browser/media_galleries/fileapi/supported_audio_video_checker.cc
index 6c31e284..1710ea3 100644
--- a/chrome/browser/media_galleries/fileapi/supported_audio_video_checker.cc
+++ b/chrome/browser/media_galleries/fileapi/supported_audio_video_checker.cc
@@ -16,8 +16,8 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/services/media_gallery_util/public/cpp/safe_audio_video_checker.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc b/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc
index 40475a9..eb7b132 100644
--- a/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc
+++ b/chrome/browser/media_galleries/fileapi/supported_image_type_validator.cc
@@ -15,8 +15,8 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/image_decoder.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/media_galleries/gallery_watch_manager.cc b/chrome/browser/media_galleries/gallery_watch_manager.cc
index 4cc12e4..e8021fe 100644
--- a/chrome/browser/media_galleries/gallery_watch_manager.cc
+++ b/chrome/browser/media_galleries/gallery_watch_manager.cc
@@ -13,8 +13,8 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/media_galleries/media_galleries_preferences.cc b/chrome/browser/media_galleries/media_galleries_preferences.cc
index 9ec0981..af64d12 100644
--- a/chrome/browser/media_galleries/media_galleries_preferences.cc
+++ b/chrome/browser/media_galleries/media_galleries_preferences.cc
@@ -18,8 +18,8 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/memory_details.cc b/chrome/browser/memory_details.cc
index 4c8e1c1..e4cfd5b0 100644
--- a/chrome/browser/memory_details.cc
+++ b/chrome/browser/memory_details.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/nacl/common/nacl_process_type.h"
diff --git a/chrome/browser/metrics/antivirus_metrics_provider_win.cc b/chrome/browser/metrics/antivirus_metrics_provider_win.cc
index 1fbe2ee..1b937f0 100644
--- a/chrome/browser/metrics/antivirus_metrics_provider_win.cc
+++ b/chrome/browser/metrics/antivirus_metrics_provider_win.cc
@@ -27,7 +27,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/version.h"
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
index 73295e6..732ccfd 100644
--- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
+++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics.cc
@@ -14,8 +14,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/sparse_histogram.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/about_flags.h"
diff --git a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm
index 37d67f0..582bd46 100644
--- a/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm
+++ b/chrome/browser/metrics/chrome_browser_main_extra_parts_metrics_mac.mm
@@ -11,7 +11,7 @@
 
 // The possible values of the setting "Screens Have Separate Spaces".
 enum ScreenSpacesConfiguration {
-  SCREENS_CANNOT_HAVE_SEPARATE_SPACES = 0,
+  SCREENS_CANNOT_HAVE_SEPARATE_SPACES_DEPRECATED = 0,
   SCREENS_HAVE_SEPARATE_SPACES = 1,
   SCREENS_HAVE_SHARED_SPACES = 2,
   SCREEN_SPACES_CONFIGURATION_COUNT = 3
@@ -21,14 +21,8 @@
 
 void ChromeBrowserMainExtraPartsMetrics::RecordMacMetrics() {
   ScreenSpacesConfiguration separate_spaces =
-      SCREENS_CANNOT_HAVE_SEPARATE_SPACES;
-
-  if ([NSScreen respondsToSelector:@selector(screensHaveSeparateSpaces)]) {
-    BOOL screens_have_separate_spaces = [NSScreen screensHaveSeparateSpaces];
-    separate_spaces = screens_have_separate_spaces
-                          ? SCREENS_HAVE_SEPARATE_SPACES
-                          : SCREENS_HAVE_SHARED_SPACES;
-  }
+      [NSScreen screensHaveSeparateSpaces] ? SCREENS_HAVE_SEPARATE_SPACES
+                                           : SCREENS_HAVE_SHARED_SPACES;
   UMA_HISTOGRAM_ENUMERATION("OSX.Settings.ScreensHaveSeparateSpaces",
                             separate_spaces,
                             SCREEN_SPACES_CONFIGURATION_COUNT);
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc
index b08a768..a0f6ff69 100644
--- a/chrome/browser/metrics/chrome_metrics_service_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -26,8 +26,8 @@
 #include "base/rand_util.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
index f31adbc..714c4f2 100644
--- a/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
+++ b/chrome/browser/metrics/chrome_metrics_services_manager_client.cc
@@ -8,7 +8,7 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
diff --git a/chrome/browser/metrics/chromeos_metrics_provider.cc b/chrome/browser/metrics/chromeos_metrics_provider.cc
index 7b0f4f2..9d84261 100644
--- a/chrome/browser/metrics/chromeos_metrics_provider.cc
+++ b/chrome/browser/metrics/chromeos_metrics_provider.cc
@@ -14,8 +14,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
diff --git a/chrome/browser/metrics/google_update_metrics_provider_win.cc b/chrome/browser/metrics/google_update_metrics_provider_win.cc
index 1e94626..f19ff2a8 100644
--- a/chrome/browser/metrics/google_update_metrics_provider_win.cc
+++ b/chrome/browser/metrics/google_update_metrics_provider_win.cc
@@ -6,7 +6,7 @@
 
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "third_party/metrics_proto/system_profile.pb.h"
 
diff --git a/chrome/browser/metrics/oom/out_of_memory_reporter_unittest.cc b/chrome/browser/metrics/oom/out_of_memory_reporter_unittest.cc
index 31ca354f..b59eed7 100644
--- a/chrome/browser/metrics/oom/out_of_memory_reporter_unittest.cc
+++ b/chrome/browser/metrics/oom/out_of_memory_reporter_unittest.cc
@@ -19,7 +19,7 @@
 #include "base/path_service.h"
 #include "base/process/kill.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "build/build_config.h"
 #include "chrome/common/chrome_paths.h"
diff --git a/chrome/browser/metrics/perf/perf_output.cc b/chrome/browser/metrics/perf/perf_output.cc
index 4420445..7739e90 100644
--- a/chrome/browser/metrics/perf/perf_output.cc
+++ b/chrome/browser/metrics/perf/perf_output.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/metrics/perf/perf_output.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/debug_daemon_client.h"
 
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc
index 2783570..560f52f 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -38,6 +38,7 @@
 namespace {
 
 const char kEffectiveSize[] = "effective_size";
+const char kSize[] = "size";
 const char kAllocatedObjectsSize[] = "allocated_objects_size";
 const bool kLargeMetric = true;
 
@@ -117,18 +118,18 @@
      kLargeMetric, kEffectiveSize, EmitTo::kUkmAndUmaAsSize,
      &Memory_Experimental::SetPartitionAlloc_AllocatedObjects},
     {"partition_alloc/partitions/array_buffer",
-     "PartitionAlloc.Partitions.ArrayBuffer", kLargeMetric, kEffectiveSize,
+     "PartitionAlloc.Partitions.ArrayBuffer", kLargeMetric, kSize,
      EmitTo::kUkmAndUmaAsSize,
      &Memory_Experimental::SetPartitionAlloc_Partitions_ArrayBuffer},
     {"partition_alloc/partitions/buffer", "PartitionAlloc.Partitions.Buffer",
-     kLargeMetric, kEffectiveSize, EmitTo::kUkmAndUmaAsSize,
+     kLargeMetric, kSize, EmitTo::kUkmAndUmaAsSize,
      &Memory_Experimental::SetPartitionAlloc_Partitions_Buffer},
     {"partition_alloc/partitions/fast_malloc",
-     "PartitionAlloc.Partitions.FastMalloc", kLargeMetric, kEffectiveSize,
+     "PartitionAlloc.Partitions.FastMalloc", kLargeMetric, kSize,
      EmitTo::kUkmAndUmaAsSize,
      &Memory_Experimental::SetPartitionAlloc_Partitions_FastMalloc},
     {"partition_alloc/partitions/layout", "PartitionAlloc.Partitions.Layout",
-     kLargeMetric, kEffectiveSize, EmitTo::kUkmAndUmaAsSize,
+     kLargeMetric, kSize, EmitTo::kUkmAndUmaAsSize,
      &Memory_Experimental::SetPartitionAlloc_Partitions_Layout},
     {"site_storage", "SiteStorage", kLargeMetric, kEffectiveSize,
      EmitTo::kUkmAndUmaAsSize, &Memory_Experimental::SetSiteStorage},
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc b/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc
index 7136d8c..75428c4 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter_unittest.cc
@@ -189,7 +189,7 @@
   SetAllocatorDumpMetric(pmd, "blink_objects/Node", "object_count",
                          metrics_mb_or_count["NumberOfNodes"]);
   SetAllocatorDumpMetric(
-      pmd, "partition_alloc/partitions/array_buffer", "effective_size",
+      pmd, "partition_alloc/partitions/array_buffer", "size",
       metrics_mb_or_count["PartitionAlloc.Partitions.ArrayBuffer"] * 1024 *
           1024);
 
diff --git a/chrome/browser/metrics/ukm_browsertest.cc b/chrome/browser/metrics/ukm_browsertest.cc
index 4882373..eb54a749 100644
--- a/chrome/browser/metrics/ukm_browsertest.cc
+++ b/chrome/browser/metrics/ukm_browsertest.cc
@@ -204,23 +204,20 @@
             GetFakeServer()->AsWeakPtr()));
 
     std::string username;
-    std::string gaia_id;
 #if defined(OS_CHROMEOS)
     // In browser tests, the profile may already by authenticated with stub
     // account |user_manager::kStubUserEmail|.
     AccountInfo info = SigninManagerFactory::GetForProfile(profile)
                            ->GetAuthenticatedAccountInfo();
     username = info.email;
-    gaia_id = info.gaia;
 #endif
     if (username.empty()) {
       username = "user@gmail.com";
-      gaia_id = "123456789";
     }
 
     std::unique_ptr<ProfileSyncServiceHarness> harness =
         ProfileSyncServiceHarness::Create(
-            profile, username, gaia_id, "unused" /* password */,
+            profile, username, "unused" /* password */,
             ProfileSyncServiceHarness::SigninType::FAKE_SIGNIN);
     EXPECT_TRUE(harness->SetupSync());
     return harness;
diff --git a/chrome/browser/net/file_downloader.cc b/chrome/browser/net/file_downloader.cc
index 180fe7c..c50a3ff 100644
--- a/chrome/browser/net/file_downloader.cc
+++ b/chrome/browser/net/file_downloader.cc
@@ -8,8 +8,8 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/net/load_timing_browsertest.cc b/chrome/browser/net/load_timing_browsertest.cc
index 4287c84..5d69892 100644
--- a/chrome/browser/net/load_timing_browsertest.cc
+++ b/chrome/browser/net/load_timing_browsertest.cc
@@ -10,7 +10,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/net/profile_network_context_service.h"
 #include "chrome/browser/net/profile_network_context_service_factory.h"
diff --git a/chrome/browser/net/network_connection_tracker_browsertest.cc b/chrome/browser/net/network_connection_tracker_browsertest.cc
index 5ce5fac..4038f2d 100644
--- a/chrome/browser/net/network_connection_tracker_browsertest.cc
+++ b/chrome/browser/net/network_connection_tracker_browsertest.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "content/public/browser/browser_context.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/common/service_manager_connection.h"
 #include "content/public/common/service_names.mojom.h"
@@ -23,17 +22,17 @@
 #include "content/public/test/browser_test_utils.h"
 #include "net/base/network_change_notifier.h"
 #include "services/network/public/cpp/features.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/network/public/mojom/network_service_test.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
-namespace content {
-
 namespace {
 
 class TestNetworkConnectionObserver
-    : public NetworkConnectionTracker::NetworkConnectionObserver {
+    : public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
-  explicit TestNetworkConnectionObserver(NetworkConnectionTracker* tracker)
+  explicit TestNetworkConnectionObserver(
+      network::NetworkConnectionTracker* tracker)
       : num_notifications_(0),
         tracker_(tracker),
         run_loop_(std::make_unique<base::RunLoop>()),
@@ -73,7 +72,7 @@
 
  private:
   size_t num_notifications_;
-  NetworkConnectionTracker* tracker_;
+  network::NetworkConnectionTracker* tracker_;
   std::unique_ptr<base::RunLoop> run_loop_;
   network::mojom::ConnectionType connection_type_;
 
@@ -96,8 +95,10 @@
     if (network_service_enabled_ &&
         !content::IsNetworkServiceRunningInProcess()) {
       network::mojom::NetworkServiceTestPtr network_service_test;
-      ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
-          mojom::kNetworkServiceName, &network_service_test);
+      content::ServiceManagerConnection::GetForProcess()
+          ->GetConnector()
+          ->BindInterface(content::mojom::kNetworkServiceName,
+                          &network_service_test);
       base::RunLoop run_loop;
       network_service_test->SimulateNetworkChange(
           type, base::Bind([](base::RunLoop* run_loop) { run_loop->Quit(); },
@@ -125,7 +126,7 @@
   if (network_service_enabled())
     return;
 #endif
-  NetworkConnectionTracker* tracker =
+  network::NetworkConnectionTracker* tracker =
       g_browser_process->network_connection_tracker();
   EXPECT_NE(nullptr, tracker);
   // Issue a GetConnectionType() request to make sure NetworkService has been
@@ -160,7 +161,7 @@
   if (!network_service_enabled())
     return;
 
-  NetworkConnectionTracker* tracker =
+  network::NetworkConnectionTracker* tracker =
       g_browser_process->network_connection_tracker();
   EXPECT_NE(nullptr, tracker);
 
@@ -221,5 +222,3 @@
 
   EXPECT_EQ(2u, network_connection_observer.num_notifications());
 }
-
-}  // namespace content
diff --git a/chrome/browser/net/trial_comparison_cert_verifier.cc b/chrome/browser/net/trial_comparison_cert_verifier.cc
index 665919c5f..b856e3d7 100644
--- a/chrome/browser/net/trial_comparison_cert_verifier.cc
+++ b/chrome/browser/net/trial_comparison_cert_verifier.cc
@@ -12,7 +12,7 @@
 #include "base/location.h"
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile_manager.h"
diff --git a/chrome/browser/notifications/OWNERS b/chrome/browser/notifications/OWNERS
index 242983b3..82f60d8f 100644
--- a/chrome/browser/notifications/OWNERS
+++ b/chrome/browser/notifications/OWNERS
@@ -5,9 +5,6 @@
 stevenjb@chromium.org
 yoshiki@chromium.org
 
-# Android files
-per-file *_android*=awdf@chromium.org
-
 # Mac files
 per-file *_mac*=rsesek@chromium.org
 
diff --git a/chrome/browser/notifications/notification_channels_provider_android_unittest.cc b/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
index 34b7fa78..000787d 100644
--- a/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
+++ b/chrome/browser/notifications/notification_channels_provider_android_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_clock.h"
 #include "base/time/clock.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_linux.cc b/chrome/browser/notifications/notification_platform_bridge_linux.cc
index 1948939..321e5053 100644
--- a/chrome/browser/notifications/notification_platform_bridge_linux.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_linux.cc
@@ -24,7 +24,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/dbus/dbus_thread_linux.h"
diff --git a/chrome/browser/notifications/notification_platform_bridge_win.cc b/chrome/browser/notifications/notification_platform_bridge_win.cc
index 6ef2d08..58a7c03 100644
--- a/chrome/browser/notifications/notification_platform_bridge_win.cc
+++ b/chrome/browser/notifications/notification_platform_bridge_win.cc
@@ -19,7 +19,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/win/core_winrt_util.h"
 #include "base/win/registry.h"
 #include "base/win/scoped_hstring.h"
diff --git a/chrome/browser/notifications/message_center_notifications_browsertest.cc b/chrome/browser/notifications/notification_ui_manager_browsertest.cc
similarity index 89%
rename from chrome/browser/notifications/message_center_notifications_browsertest.cc
rename to chrome/browser/notifications/notification_ui_manager_browsertest.cc
index a0b7e94..1e8c1b51 100644
--- a/chrome/browser/notifications/message_center_notifications_browsertest.cc
+++ b/chrome/browser/notifications/notification_ui_manager_browsertest.cc
@@ -15,8 +15,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/notifications/message_center_notification_manager.h"
-#include "chrome/browser/notifications/notification_ui_manager.h"
+#include "chrome/browser/notifications/notification_ui_manager_impl.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_features.h"
@@ -31,14 +30,14 @@
 
 using message_center::Notification;
 
-class MessageCenterNotificationsTest : public InProcessBrowserTest {
+class NotificationUIManagerBrowserTest : public InProcessBrowserTest {
  public:
-  MessageCenterNotificationsTest() {
+  NotificationUIManagerBrowserTest() {
     feature_list_.InitAndDisableFeature(features::kNativeNotifications);
   }
 
-  MessageCenterNotificationManager* manager() {
-    return static_cast<MessageCenterNotificationManager*>(
+  NotificationUIManagerImpl* manager() {
+    return static_cast<NotificationUIManagerImpl*>(
         g_browser_process->notification_ui_manager());
   }
 
@@ -117,12 +116,12 @@
   base::test::ScopedFeatureList feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationsTest, RetrieveBaseParts) {
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest, RetrieveBaseParts) {
   EXPECT_TRUE(manager());
   EXPECT_TRUE(message_center());
 }
 
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationsTest, BasicAddCancel) {
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest, BasicAddCancel) {
   // Someone may create system notifications like "you're in multi-profile
   // mode..." or something which may change the expectation.
   // TODO(mukai): move this to SetUpOnMainThread() after fixing the side-effect
@@ -134,7 +133,7 @@
   EXPECT_EQ(0u, message_center()->NotificationCount());
 }
 
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationsTest, BasicDelegate) {
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest, BasicDelegate) {
   TestDelegate* delegate;
   manager()->Add(CreateTestNotification("hey", &delegate), profile());
   manager()->CancelById("hey", NotificationUIManager::GetProfileID(profile()));
@@ -143,7 +142,8 @@
   delegate->Release();
 }
 
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationsTest, ButtonClickedDelegate) {
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest,
+                       ButtonClickedDelegate) {
   TestDelegate* delegate;
   manager()->Add(CreateTestNotification("n", &delegate), profile());
   const std::string notification_id =
@@ -154,7 +154,7 @@
   delegate->Release();
 }
 
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationsTest,
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest,
                        UpdateExistingNotification) {
   TestDelegate* delegate;
   manager()->Add(CreateTestNotification("n", &delegate), profile());
@@ -168,7 +168,7 @@
   delegate2->Release();
 }
 
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationsTest, VerifyKeepAlives) {
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerBrowserTest, VerifyKeepAlives) {
   EXPECT_FALSE(KeepAliveRegistry::GetInstance()->IsOriginRegistered(
       KeepAliveOrigin::NOTIFICATION));
 
diff --git a/chrome/browser/notifications/notification_ui_manager_desktop.cc b/chrome/browser/notifications/notification_ui_manager_desktop.cc
deleted file mode 100644
index 9a2ddf0..0000000
--- a/chrome/browser/notifications/notification_ui_manager_desktop.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/notifications/notification_ui_manager.h"
-
-#include <memory>
-#include <utility>
-
-#include "chrome/browser/notifications/message_center_notification_manager.h"
-#include "ui/message_center/message_center.h"
-
-// static
-NotificationUIManager* NotificationUIManager::Create() {
-  // If there's no MessageCenter, there should be no NotificationUIManager to
-  // manage it.
-  if (!message_center::MessageCenter::Get())
-    return nullptr;
-
-  return new MessageCenterNotificationManager();
-}
diff --git a/chrome/browser/notifications/message_center_notification_manager.cc b/chrome/browser/notifications/notification_ui_manager_impl.cc
similarity index 84%
rename from chrome/browser/notifications/message_center_notification_manager.cc
rename to chrome/browser/notifications/notification_ui_manager_impl.cc
index 16654e5c..9108c98 100644
--- a/chrome/browser/notifications/message_center_notification_manager.cc
+++ b/chrome/browser/notifications/notification_ui_manager_impl.cc
@@ -1,8 +1,7 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright 2014 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-
-#include "chrome/browser/notifications/message_center_notification_manager.h"
+#include "chrome/browser/notifications/notification_ui_manager_impl.h"
 
 #include <memory>
 #include <utility>
@@ -30,7 +29,17 @@
 using message_center::MessageCenter;
 using message_center::NotifierId;
 
-MessageCenterNotificationManager::MessageCenterNotificationManager()
+// static
+NotificationUIManager* NotificationUIManager::Create() {
+  // If there's no MessageCenter, there should be no NotificationUIManager to
+  // manage it.
+  if (!message_center::MessageCenter::Get())
+    return nullptr;
+
+  return new NotificationUIManagerImpl();
+}
+
+NotificationUIManagerImpl::NotificationUIManagerImpl()
     : system_observer_(this),
       popups_only_ui_controller_(std::make_unique<PopupsOnlyUiController>(
           PopupsOnlyUiController::CreateDelegate())) {
@@ -43,7 +52,7 @@
       std::make_unique<FullscreenNotificationBlocker>(message_center));
 }
 
-MessageCenterNotificationManager::~MessageCenterNotificationManager() {
+NotificationUIManagerImpl::~NotificationUIManagerImpl() {
   // The message center may have already been shut down (on Chrome OS).
   if (MessageCenter::Get())
     MessageCenter::Get()->RemoveObserver(this);
@@ -54,7 +63,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 // NotificationUIManager
 
-void MessageCenterNotificationManager::Add(
+void NotificationUIManagerImpl::Add(
     const message_center::Notification& notification,
     Profile* profile) {
   // We won't have time to process and act on this notification.
@@ -79,7 +88,7 @@
           profile_notification->notification()));
 }
 
-bool MessageCenterNotificationManager::Update(
+bool NotificationUIManagerImpl::Update(
     const message_center::Notification& notification,
     Profile* profile) {
   const std::string profile_id = ProfileNotification::GetProfileNotificationId(
@@ -126,7 +135,7 @@
   return false;
 }
 
-const message_center::Notification* MessageCenterNotificationManager::FindById(
+const message_center::Notification* NotificationUIManagerImpl::FindById(
     const std::string& id,
     ProfileID profile_id) const {
   std::string profile_notification_id =
@@ -137,8 +146,8 @@
   return &(iter->second->notification());
 }
 
-bool MessageCenterNotificationManager::CancelById(const std::string& id,
-                                                  ProfileID profile_id) {
+bool NotificationUIManagerImpl::CancelById(const std::string& id,
+                                           ProfileID profile_id) {
   std::string profile_notification_id =
       ProfileNotification::GetProfileNotificationId(id, profile_id);
   // See if this ID hasn't been shown yet.
@@ -153,7 +162,7 @@
   return true;
 }
 
-std::set<std::string> MessageCenterNotificationManager::GetAllIdsByProfile(
+std::set<std::string> NotificationUIManagerImpl::GetAllIdsByProfile(
     ProfileID profile_id) {
   std::set<std::string> original_ids;
   for (const auto& pair : profile_notifications_) {
@@ -164,8 +173,7 @@
   return original_ids;
 }
 
-bool MessageCenterNotificationManager::CancelAllBySourceOrigin(
-    const GURL& source) {
+bool NotificationUIManagerImpl::CancelAllBySourceOrigin(const GURL& source) {
   // Same pattern as CancelById, but more complicated than the above
   // because there may be multiple notifications from the same source.
   bool removed = false;
@@ -183,8 +191,7 @@
   return removed;
 }
 
-bool MessageCenterNotificationManager::CancelAllByProfile(
-    ProfileID profile_id) {
+bool NotificationUIManagerImpl::CancelAllByProfile(ProfileID profile_id) {
   // Same pattern as CancelAllBySourceOrigin.
   bool removed = false;
 
@@ -201,12 +208,12 @@
   return removed;
 }
 
-void MessageCenterNotificationManager::CancelAll() {
+void NotificationUIManagerImpl::CancelAll() {
   MessageCenter::Get()->RemoveAllNotifications(
       false /* by_user */, message_center::MessageCenter::RemoveType::ALL);
 }
 
-void MessageCenterNotificationManager::StartShutdown() {
+void NotificationUIManagerImpl::StartShutdown() {
   is_shutdown_started_ = true;
   CancelAll();
   popups_only_ui_controller_.reset();
@@ -215,18 +222,16 @@
 ////////////////////////////////////////////////////////////////////////////////
 // MessageCenter::Observer
 
-void MessageCenterNotificationManager::OnNotificationRemoved(
-    const std::string& id,
-    bool by_user) {
+void NotificationUIManagerImpl::OnNotificationRemoved(const std::string& id,
+                                                      bool by_user) {
   RemoveProfileNotification(id);
 }
 
-void MessageCenterNotificationManager::ResetUiControllerForTest() {
+void NotificationUIManagerImpl::ResetUiControllerForTest() {
   popups_only_ui_controller_.reset();
 }
 
-std::string
-MessageCenterNotificationManager::GetMessageCenterNotificationIdForTest(
+std::string NotificationUIManagerImpl::GetMessageCenterNotificationIdForTest(
     const std::string& id,
     Profile* profile) {
   return ProfileNotification::GetProfileNotificationId(id,
@@ -236,7 +241,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 // private
 
-void MessageCenterNotificationManager::AddProfileNotification(
+void NotificationUIManagerImpl::AddProfileNotification(
     std::unique_ptr<ProfileNotification> profile_notification) {
   const message_center::Notification& notification =
       profile_notification->notification();
@@ -246,7 +251,7 @@
   profile_notifications_[id] = std::move(profile_notification);
 }
 
-void MessageCenterNotificationManager::RemoveProfileNotification(
+void NotificationUIManagerImpl::RemoveProfileNotification(
     const std::string& notification_id) {
   auto it = profile_notifications_.find(notification_id);
   if (it == profile_notifications_.end())
@@ -267,7 +272,7 @@
   profile_notifications_.erase(it);
 }
 
-ProfileNotification* MessageCenterNotificationManager::FindProfileNotification(
+ProfileNotification* NotificationUIManagerImpl::FindProfileNotification(
     const std::string& id) const {
   auto iter = profile_notifications_.find(id);
   if (iter == profile_notifications_.end())
diff --git a/chrome/browser/notifications/message_center_notification_manager.h b/chrome/browser/notifications/notification_ui_manager_impl.h
similarity index 84%
rename from chrome/browser/notifications/message_center_notification_manager.h
rename to chrome/browser/notifications/notification_ui_manager_impl.h
index d9aaf5f..7289ad436 100644
--- a/chrome/browser/notifications/message_center_notification_manager.h
+++ b/chrome/browser/notifications/notification_ui_manager_impl.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_NOTIFICATION_MANAGER_H_
-#define CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_NOTIFICATION_MANAGER_H_
+#ifndef CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_UI_MANAGER_IMPL_H_
+#define CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_UI_MANAGER_IMPL_H_
 
 #include <map>
 #include <memory>
@@ -29,17 +29,16 @@
 class Notification;
 class NotificationBlocker;
 FORWARD_DECLARE_TEST(NotificationTrayTest, ManuallyCloseMessageCenter);
-}
+}  // namespace message_center
 
-// This class extends NotificationUIManagerImpl and delegates actual display
+// This class extends NotificationUIManager and delegates actual display
 // of notifications to MessageCenter, doing necessary conversions. This is only
 // used on platforms that support non-native notifications.
-class MessageCenterNotificationManager
-    : public NotificationUIManager,
-      public message_center::MessageCenterObserver {
+class NotificationUIManagerImpl : public NotificationUIManager,
+                                  public message_center::MessageCenterObserver {
  public:
-  MessageCenterNotificationManager();
-  ~MessageCenterNotificationManager() override;
+  NotificationUIManagerImpl();
+  ~NotificationUIManagerImpl() override;
 
   // NotificationUIManager
   void Add(const message_center::Notification& notification,
@@ -67,7 +66,8 @@
   // Returns the notification id which this manager will use to add to message
   // center, for this combination of delegate id and profile.
   std::string GetMessageCenterNotificationIdForTest(
-      const std::string& delegate_id, Profile* profile);
+      const std::string& delegate_id,
+      Profile* profile);
 
   // Returns true if the popup bubbles are currently visible.
   bool popups_visible() const { return popups_visible_; }
@@ -104,7 +104,7 @@
   // Tracks the current visibility status of the popup bubbles.
   bool popups_visible_ = false;
 
-  DISALLOW_COPY_AND_ASSIGN(MessageCenterNotificationManager);
+  DISALLOW_COPY_AND_ASSIGN(NotificationUIManagerImpl);
 };
 
-#endif  // CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_NOTIFICATION_MANAGER_H_
+#endif  // CHROME_BROWSER_NOTIFICATIONS_NOTIFICATION_UI_MANAGER_IMPL_H_
diff --git a/chrome/browser/notifications/message_center_notification_manager_interactive_uitest.cc b/chrome/browser/notifications/notification_ui_manager_interactive_uitest.cc
similarity index 91%
rename from chrome/browser/notifications/message_center_notification_manager_interactive_uitest.cc
rename to chrome/browser/notifications/notification_ui_manager_interactive_uitest.cc
index a29b061..53222544 100644
--- a/chrome/browser/notifications/message_center_notification_manager_interactive_uitest.cc
+++ b/chrome/browser/notifications/notification_ui_manager_interactive_uitest.cc
@@ -28,11 +28,10 @@
 
 }  // namespace
 
-class MessageCenterNotificationManagerBrowserTest
-    : public InProcessBrowserTest {
+class NotificationUIManagerInteractiveUITest : public InProcessBrowserTest {
  public:
-  MessageCenterNotificationManagerBrowserTest() = default;
-  ~MessageCenterNotificationManagerBrowserTest() override = default;
+  NotificationUIManagerInteractiveUITest() = default;
+  ~NotificationUIManagerInteractiveUITest() override = default;
 
   // InProcessBrowserTest overrides.
   void SetUp() override {
@@ -82,12 +81,12 @@
 
   std::unique_ptr<net::EmbeddedTestServer> https_server_;
 
-  DISALLOW_COPY_AND_ASSIGN(MessageCenterNotificationManagerBrowserTest);
+  DISALLOW_COPY_AND_ASSIGN(NotificationUIManagerInteractiveUITest);
 };
 
 // Make sure that clicks go through on web notifications. Regression test for
 // crbug.com/767868
-IN_PROC_BROWSER_TEST_F(MessageCenterNotificationManagerBrowserTest,
+IN_PROC_BROWSER_TEST_F(NotificationUIManagerInteractiveUITest,
                        CloseDisplayedPersistentNotification) {
   GrantNotificationPermissionForTest();
 
diff --git a/chrome/browser/notifications/message_center_notifications_unittest.cc b/chrome/browser/notifications/notification_ui_manager_unittest.cc
similarity index 84%
rename from chrome/browser/notifications/message_center_notifications_unittest.cc
rename to chrome/browser/notifications/notification_ui_manager_unittest.cc
index a796fc4..d5dba81 100644
--- a/chrome/browser/notifications/message_center_notifications_unittest.cc
+++ b/chrome/browser/notifications/notification_ui_manager_unittest.cc
@@ -9,8 +9,8 @@
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-#include "chrome/browser/notifications/message_center_notification_manager.h"
 #include "chrome/browser/notifications/notification_test_util.h"
+#include "chrome/browser/notifications/notification_ui_manager_impl.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
@@ -25,9 +25,9 @@
 
 namespace message_center {
 
-class MessageCenterNotificationManagerTest : public BrowserWithTestWindowTest {
+class NotificationUIManagerTest : public BrowserWithTestWindowTest {
  public:
-  MessageCenterNotificationManagerTest() {}
+  NotificationUIManagerTest() {}
 
  protected:
   void SetUp() override {
@@ -43,8 +43,8 @@
     MessageCenter::Shutdown();
   }
 
-  MessageCenterNotificationManager* notification_manager() {
-    return (MessageCenterNotificationManager*)
+  NotificationUIManagerImpl* notification_manager() {
+    return (NotificationUIManagerImpl*)
         g_browser_process->notification_ui_manager();
   }
 
@@ -64,12 +64,12 @@
   MessageCenter* message_center_;
 };
 
-TEST_F(MessageCenterNotificationManagerTest, SetupNotificationManager) {
+TEST_F(NotificationUIManagerTest, SetupNotificationManager) {
   TestingProfile profile;
   notification_manager()->Add(GetANotification("test"), &profile);
 }
 
-TEST_F(MessageCenterNotificationManagerTest, AddNotificationOnShutdown) {
+TEST_F(NotificationUIManagerTest, AddNotificationOnShutdown) {
   TestingProfile profile;
   EXPECT_TRUE(message_center()->NotificationCount() == 0);
   notification_manager()->Add(GetANotification("test"), &profile);
@@ -83,7 +83,7 @@
   EXPECT_TRUE(message_center()->NotificationCount() == 0);
 }
 
-TEST_F(MessageCenterNotificationManagerTest, UpdateNotification) {
+TEST_F(NotificationUIManagerTest, UpdateNotification) {
   TestingProfile profile;
   EXPECT_TRUE(message_center()->NotificationCount() == 0);
   notification_manager()->Add(GetANotification("test"), &profile);
@@ -94,7 +94,7 @@
 }
 
 // Regression test for crbug.com/767868
-TEST_F(MessageCenterNotificationManagerTest, GetAllIdsReturnsOriginalId) {
+TEST_F(NotificationUIManagerTest, GetAllIdsReturnsOriginalId) {
   TestingProfile profile;
   EXPECT_TRUE(message_center()->NotificationCount() == 0);
   notification_manager()->Add(GetANotification("test"), &profile);
diff --git a/chrome/browser/notifications/platform_notification_service_impl.cc b/chrome/browser/notifications/platform_notification_service_impl.cc
index 9cad57c1..3ede0a5 100644
--- a/chrome/browser/notifications/platform_notification_service_impl.cc
+++ b/chrome/browser/notifications/platform_notification_service_impl.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/notifications/win/notification_image_retainer.cc b/chrome/browser/notifications/win/notification_image_retainer.cc
index 3a4b481b..9bbfb11 100644
--- a/chrome/browser/notifications/win/notification_image_retainer.cc
+++ b/chrome/browser/notifications/win/notification_image_retainer.cc
@@ -10,7 +10,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc
index 3d173ced..3e54e8e 100644
--- a/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc
+++ b/chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <utility>
+
 #include "chrome/browser/ntp_snippets/contextual_content_suggestions_service_factory.h"
 
 #include "base/files/file_path.h"
@@ -11,6 +13,8 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search/suggestions/image_decoder_impl.h"
+#include "chrome/browser/signin/unified_consent_helper.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
 #include "components/image_fetcher/core/image_decoder.h"
 #include "components/image_fetcher/core/image_fetcher.h"
 #include "components/image_fetcher/core/image_fetcher_impl.h"
@@ -79,6 +83,7 @@
     : BrowserContextKeyedServiceFactory(
           "ContextualContentSuggestionsService",
           BrowserContextDependencyManager::GetInstance()) {
+  DependsOn(ProfileSyncServiceFactory::GetInstance());
 }
 
 ContextualContentSuggestionsServiceFactory::
@@ -96,10 +101,20 @@
   PrefService* pref_service = profile->GetPrefs();
   content::StoragePartition* storage_partition =
       content::BrowserContext::GetDefaultStoragePartition(context);
+  std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>
+      consent_helper;
+  if (IsUnifiedConsentEnabled(profile)) {
+    consent_helper = unified_consent::UrlKeyedDataCollectionConsentHelper::
+        NewPersonalizedDataCollectionConsentHelper(
+            true, /*is_unified_consent_enabled*/
+            ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(
+                profile));
+  }
+
   auto contextual_suggestions_fetcher =
       std::make_unique<ContextualSuggestionsFetcherImpl>(
           storage_partition->GetURLLoaderFactoryForBrowserProcess(),
-          g_browser_process->GetApplicationLocale());
+          std::move(consent_helper), g_browser_process->GetApplicationLocale());
   const base::FilePath::CharType kDatabaseFolder[] =
       FILE_PATH_LITERAL("contextualSuggestionsDatabase");
   base::FilePath database_dir(profile->GetPath().Append(kDatabaseFolder));
diff --git a/chrome/browser/offline_pages/android/evaluation/offline_page_evaluation_bridge.cc b/chrome/browser/offline_pages/android/evaluation/offline_page_evaluation_bridge.cc
index 5364211..6dde0e0d2 100644
--- a/chrome/browser/offline_pages/android/evaluation/offline_page_evaluation_bridge.cc
+++ b/chrome/browser/offline_pages/android/evaluation/offline_page_evaluation_bridge.cc
@@ -15,7 +15,7 @@
 #include "base/android/jni_string.h"
 #include "base/bind.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service.h"
 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service_factory.h"
 #include "chrome/browser/offline_pages/android/background_scheduler_bridge.h"
diff --git a/chrome/browser/offline_pages/android/offline_page_bridge.cc b/chrome/browser/offline_pages/android/offline_page_bridge.cc
index 3fded3c..17bb27c 100644
--- a/chrome/browser/offline_pages/android/offline_page_bridge.cc
+++ b/chrome/browser/offline_pages/android/offline_page_bridge.cc
@@ -21,7 +21,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/offline_pages/offline_page_mhtml_archiver.h"
@@ -576,8 +576,7 @@
 
   OfflinePageUtils::SelectPagesForURL(
       browser_context_, GURL(ConvertJavaStringToUTF8(env, j_online_url)),
-      URLSearchMode::SEARCH_BY_ALL_URLS, tab_id,
-      base::Bind(&SelectPageCallback, j_callback_ref));
+      tab_id, base::BindOnce(&SelectPageCallback, j_callback_ref));
 }
 
 void OfflinePageBridge::SavePage(JNIEnv* env,
diff --git a/chrome/browser/offline_pages/android/offline_page_model_factory.cc b/chrome/browser/offline_pages/android/offline_page_model_factory.cc
index da0224a..17e3ad89 100644
--- a/chrome/browser/offline_pages/android/offline_page_model_factory.cc
+++ b/chrome/browser/offline_pages/android/offline_page_model_factory.cc
@@ -10,7 +10,7 @@
 #include "base/memory/singleton.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/default_clock.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/offline_pages/android/cct_origin_observer.h"
diff --git a/chrome/browser/offline_pages/android/request_coordinator_factory.cc b/chrome/browser/offline_pages/android/request_coordinator_factory.cc
index 10e5cd61..3cd1a3b 100644
--- a/chrome/browser/offline_pages/android/request_coordinator_factory.cc
+++ b/chrome/browser/offline_pages/android/request_coordinator_factory.cc
@@ -8,7 +8,7 @@
 
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service.h"
 #include "chrome/browser/net/nqe/ui_network_quality_estimator_service_factory.h"
 #include "chrome/browser/offline_pages/android/background_scheduler_bridge.h"
diff --git a/chrome/browser/offline_pages/offline_page_mhtml_archiver.cc b/chrome/browser/offline_pages/offline_page_mhtml_archiver.cc
index 0f3c14d..fa5486c4 100644
--- a/chrome/browser/offline_pages/offline_page_mhtml_archiver.cc
+++ b/chrome/browser/offline_pages/offline_page_mhtml_archiver.cc
@@ -12,7 +12,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/strings/string16.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/offline_pages/offline_page_utils.h"
 #include "chrome/browser/ssl/security_state_tab_helper.h"
diff --git a/chrome/browser/offline_pages/offline_page_request_handler.cc b/chrome/browser/offline_pages/offline_page_request_handler.cc
index de5a9e9..fa65338 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler.cc
+++ b/chrome/browser/offline_pages/offline_page_request_handler.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/offline_pages/offline_page_request_handler.h"
 
-#include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/files/file_path.h"
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
@@ -415,10 +415,9 @@
   }
 
   OfflinePageUtils::SelectPagesForURL(
-      web_contents->GetBrowserContext(), url, URLSearchMode::SEARCH_BY_ALL_URLS,
-      tab_id,
-      base::Bind(&SelectPagesForURLDone, url, offline_header, network_state,
-                 job, web_contents_getter));
+      web_contents->GetBrowserContext(), url, tab_id,
+      base::BindOnce(&SelectPagesForURLDone, url, offline_header, network_state,
+                     job, web_contents_getter));
 }
 
 // Do all the things needed to be done on UI thread after a trusted offline
@@ -967,7 +966,7 @@
 }
 
 void OfflinePageRequestHandler::DidSeekForServing(int64_t result) {
-  DCHECK(result <= 0);
+  DCHECK_LE(result, 0);
 
   ReportSeekResult(result);
 
diff --git a/chrome/browser/offline_pages/offline_page_request_handler.h b/chrome/browser/offline_pages/offline_page_request_handler.h
index c1b70ac..d504cf7 100644
--- a/chrome/browser/offline_pages/offline_page_request_handler.h
+++ b/chrome/browser/offline_pages/offline_page_request_handler.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_OFFLINE_PAGES_OFFLINE_PAGE_REQUEST_HANDLER_H_
 
 #include <memory>
+#include <string>
 #include <vector>
 
 #include "base/memory/ref_counted.h"
diff --git a/chrome/browser/offline_pages/offline_page_tab_helper.cc b/chrome/browser/offline_pages/offline_page_tab_helper.cc
index 90d48bde..49732b62 100644
--- a/chrome/browser/offline_pages/offline_page_tab_helper.cc
+++ b/chrome/browser/offline_pages/offline_page_tab_helper.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/offline_pages/offline_page_tab_helper.h"
 
+#include <utility>
+
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/guid.h"
@@ -282,10 +284,9 @@
   }
 
   OfflinePageUtils::SelectPagesForURL(
-      web_contents()->GetBrowserContext(), navigation_handle->GetURL(),
-      URLSearchMode::SEARCH_BY_ALL_URLS, tab_id,
-      base::Bind(&OfflinePageTabHelper::SelectPagesForURLDone,
-                 weak_ptr_factory_.GetWeakPtr()));
+      web_contents()->GetBrowserContext(), navigation_handle->GetURL(), tab_id,
+      base::BindOnce(&OfflinePageTabHelper::SelectPagesForURLDone,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void OfflinePageTabHelper::SelectPagesForURLDone(
diff --git a/chrome/browser/offline_pages/offline_page_tab_helper.h b/chrome/browser/offline_pages/offline_page_tab_helper.h
index d328de5..6b96422 100644
--- a/chrome/browser/offline_pages/offline_page_tab_helper.h
+++ b/chrome/browser/offline_pages/offline_page_tab_helper.h
@@ -5,6 +5,10 @@
 #ifndef CHROME_BROWSER_OFFLINE_PAGES_OFFLINE_PAGE_TAB_HELPER_H_
 #define CHROME_BROWSER_OFFLINE_PAGES_OFFLINE_PAGE_TAB_HELPER_H_
 
+#include <memory>
+#include <string>
+#include <vector>
+
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
diff --git a/chrome/browser/offline_pages/offline_page_utils.cc b/chrome/browser/offline_pages/offline_page_utils.cc
index 373bb37..f351c53c 100644
--- a/chrome/browser/offline_pages/offline_page_utils.cc
+++ b/chrome/browser/offline_pages/offline_page_utils.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -60,7 +60,7 @@
     const GURL& url,
     int tab_id,
     const std::vector<std::string>& namespaces_to_show_in_original_tab,
-    const base::Callback<void(const std::vector<OfflinePageItem>&)>& callback,
+    base::OnceCallback<void(const std::vector<OfflinePageItem>&)> callback,
     const MultipleOfflinePageItemResult& pages) {
   std::vector<OfflinePageItem> selected_pages;
   std::string tab_id_str = base::IntToString(tab_id);
@@ -79,7 +79,7 @@
   std::sort(selected_pages.begin(), selected_pages.end(),
             OfflinePageComparer());
 
-  callback.Run(selected_pages);
+  std::move(callback).Run(selected_pages);
 }
 
 bool IsSupportedByDownload(content::BrowserContext* browser_context,
@@ -201,24 +201,22 @@
 void OfflinePageUtils::SelectPagesForURL(
     content::BrowserContext* browser_context,
     const GURL& url,
-    URLSearchMode url_search_mode,
     int tab_id,
-    const base::Callback<void(const std::vector<OfflinePageItem>&)>& callback) {
+    base::OnceCallback<void(const std::vector<OfflinePageItem>&)> callback) {
   OfflinePageModel* offline_page_model =
       OfflinePageModelFactory::GetForBrowserContext(browser_context);
   if (!offline_page_model) {
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::Bind(callback, std::vector<OfflinePageItem>()));
+        FROM_HERE,
+        base::BindOnce(std::move(callback), std::vector<OfflinePageItem>()));
     return;
   }
 
   offline_page_model->GetPagesByURL(
-      url,
-      url_search_mode,
-      base::Bind(&OnGetPagesByURLDone, url, tab_id,
-                 offline_page_model->GetPolicyController()
-                     ->GetNamespacesRestrictedToOriginalTab(),
-                 callback));
+      url, base::BindOnce(&OnGetPagesByURLDone, url, tab_id,
+                          offline_page_model->GetPolicyController()
+                              ->GetNamespacesRestrictedToOriginalTab(),
+                          std::move(callback)));
 }
 
 const OfflinePageItem* OfflinePageUtils::GetOfflinePageFromWebContents(
@@ -329,8 +327,7 @@
   };
 
   offline_page_model->GetPagesByURL(
-      url, URLSearchMode::SEARCH_BY_ALL_URLS,
-      base::Bind(continuation, browser_context, url, callback));
+      url, base::BindOnce(continuation, browser_context, url, callback));
 }
 
 // static
diff --git a/chrome/browser/offline_pages/offline_page_utils.h b/chrome/browser/offline_pages/offline_page_utils.h
index 25d8f30a7..396a1f3a 100644
--- a/chrome/browser/offline_pages/offline_page_utils.h
+++ b/chrome/browser/offline_pages/offline_page_utils.h
@@ -60,18 +60,17 @@
   // Callback to inform the duplicate checking result.
   using DuplicateCheckCallback = base::Callback<void(DuplicateCheckResult)>;
 
-  // Returns via callback all offline pages related to |url|. The offline page
-  // captured from last visit in the tab will be excluded if its tab id does not
-  // match the provided |tab_id|. The returned list is sorted based creation
-  // date in descending order. That is, the most recently created offline will
-  // appear as the first element of the list.
+  // Returns via callback all offline pages related to |url|. The provided URL
+  // is matched both against the original and the actual URL fields (they
+  // sometimes differ because of possible redirects). If |tab_id| is provided
+  // with a valid ID, offline pages bound to that tab will also be included in
+  // the search. The returned list is sorted by descending creation date so that
+  // the most recent offline page will be the first element of the list.
   static void SelectPagesForURL(
       content::BrowserContext* browser_context,
       const GURL& url,
-      URLSearchMode url_search_mode,
       int tab_id,
-      const base::Callback<void(const std::vector<OfflinePageItem>&)>&
-          callback);
+      base::OnceCallback<void(const std::vector<OfflinePageItem>&)> callback);
 
   // Gets the offline page corresponding to the given web contents.  The
   // returned pointer is owned by the web_contents and may be deleted by user
diff --git a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
index bad1e5e6..fdff845 100644
--- a/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
+++ b/chrome/browser/offline_pages/prefetch/prefetch_service_factory.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/download/download_service_factory.h"
 #include "chrome/browser/ntp_snippets/content_suggestions_service_factory.h"
 #include "chrome/browser/offline_pages/offline_page_model_factory.h"
diff --git a/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc b/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc
index 023e42b..b3719d5a 100644
--- a/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc
+++ b/chrome/browser/page_load_metrics/observers/use_counter/ukm_features.cc
@@ -50,6 +50,10 @@
           WebFeature::kPolymerV1Detected, WebFeature::kPolymerV2Detected,
           WebFeature::kFullscreenSecureOrigin,
           WebFeature::kFullscreenInsecureOrigin,
+          WebFeature::kPrefixedVideoEnterFullscreen,
+          WebFeature::kPrefixedVideoExitFullscreen,
+          WebFeature::kPrefixedVideoEnterFullScreen,
+          WebFeature::kPrefixedVideoExitFullScreen,
       }));
   return opt_in_features.count(feature);
 }
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
index 64abf40..83a19566 100644
--- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
+++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -194,8 +194,8 @@
 
     EXPECT_CALL(*mock_sync_service, IsFirstSetupComplete())
         .WillRepeatedly(Return(true));
-    EXPECT_CALL(*mock_sync_service, GetState())
-        .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+    EXPECT_CALL(*mock_sync_service, GetTransportState())
+        .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
     return mock_sync_service;
   }
 
diff --git a/chrome/browser/password_manager/native_backend_gnome_x.cc b/chrome/browser/password_manager/native_backend_gnome_x.cc
index 50486026..4e0a5eb 100644
--- a/chrome/browser/password_manager/native_backend_gnome_x.cc
+++ b/chrome/browser/password_manager/native_backend_gnome_x.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/password_manager/password_manager_util_linux.h"
 #include "components/autofill/core/common/password_form.h"
diff --git a/chrome/browser/password_manager/native_backend_kwallet_x.cc b/chrome/browser/password_manager/native_backend_kwallet_x.cc
index b2f8bf75..75ec1c8 100644
--- a/chrome/browser/password_manager/native_backend_kwallet_x.cc
+++ b/chrome/browser/password_manager/native_backend_kwallet_x.cc
@@ -19,7 +19,7 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/dbus/dbus_thread_linux.h"
 #include "chrome/grit/chromium_strings.h"
diff --git a/chrome/browser/password_manager/password_manager_util_win.cc b/chrome/browser/password_manager/password_manager_util_win.cc
index 316750dc..7b5f09f 100644
--- a/chrome/browser/password_manager/password_manager_util_win.cc
+++ b/chrome/browser/password_manager/password_manager_util_win.cc
@@ -26,7 +26,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/win/win_util.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/pepper_flash_settings_manager.cc b/chrome/browser/pepper_flash_settings_manager.cc
index 0606974..40c9bbf 100644
--- a/chrome/browser/pepper_flash_settings_manager.cc
+++ b/chrome/browser/pepper_flash_settings_manager.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/sequenced_task_runner_helpers.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/platform_util.cc b/chrome/browser/platform_util.cc
index 1a178a3..136d196 100644
--- a/chrome/browser/platform_util.cc
+++ b/chrome/browser/platform_util.cc
@@ -7,7 +7,7 @@
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/platform_util_internal.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/chrome/browser/platform_util_linux.cc b/chrome/browser/platform_util_linux.cc
index d2a2f70..ed9d182 100644
--- a/chrome/browser/platform_util_linux.cc
+++ b/chrome/browser/platform_util_linux.cc
@@ -11,7 +11,7 @@
 #include "base/process/launch.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "chrome/browser/platform_util_internal.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/platform_util_win.cc b/chrome/browser/platform_util_win.cc
index 09a59537..fc3a619d 100644
--- a/chrome/browser/platform_util_win.cc
+++ b/chrome/browser/platform_util_win.cc
@@ -20,7 +20,7 @@
 #include "base/macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/win/registry.h"
 #include "base/win/scoped_co_mem.h"
diff --git a/chrome/browser/policy/browser_dm_token_storage.cc b/chrome/browser/policy/browser_dm_token_storage.cc
index 33198a4..756638f 100644
--- a/chrome/browser/policy/browser_dm_token_storage.cc
+++ b/chrome/browser/policy/browser_dm_token_storage.cc
@@ -16,7 +16,7 @@
 #include "base/no_destructor.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/policy/browser_dm_token_storage_linux.cc b/chrome/browser/policy/browser_dm_token_storage_linux.cc
index 4e6eff2..d84e893 100644
--- a/chrome/browser/policy/browser_dm_token_storage_linux.cc
+++ b/chrome/browser/policy/browser_dm_token_storage_linux.cc
@@ -20,7 +20,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/syslog_logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/chrome/browser/policy/browser_dm_token_storage_mac.mm b/chrome/browser/policy/browser_dm_token_storage_mac.mm
index b0ee2a4..e4c6d0e 100644
--- a/chrome/browser/policy/browser_dm_token_storage_mac.mm
+++ b/chrome/browser/policy/browser_dm_token_storage_mac.mm
@@ -24,7 +24,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/syslog_logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/chrome/browser/policy/browser_dm_token_storage_win.cc b/chrome/browser/policy/browser_dm_token_storage_win.cc
index 4c4f20a3..00083133 100644
--- a/chrome/browser/policy/browser_dm_token_storage_win.cc
+++ b/chrome/browser/policy/browser_dm_token_storage_win.cc
@@ -25,7 +25,7 @@
 #include "base/no_destructor.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/win/registry.h"
diff --git a/chrome/browser/policy/chrome_browser_policy_connector.cc b/chrome/browser/policy/chrome_browser_policy_connector.cc
index 4922eec..939e8dcb 100644
--- a/chrome/browser/policy/chrome_browser_policy_connector.cc
+++ b/chrome/browser/policy/chrome_browser_policy_connector.cc
@@ -11,7 +11,7 @@
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/policy/configuration_policy_handler_list_factory.h"
 #include "chrome/browser/policy/device_management_service_configuration.h"
diff --git a/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc b/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
index 7619b831..9e93450 100644
--- a/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
+++ b/chrome/browser/policy/cloud/machine_level_user_cloud_policy_browsertest.cc
@@ -13,7 +13,7 @@
 #include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -81,14 +81,11 @@
     }
     EXPECT_EQ(should_succeed_, succeeded);
     is_finished_ = true;
-    if (run_loop_)
-      run_loop_->Quit();
     g_browser_process->browser_policy_connector()
         ->machine_level_user_cloud_policy_controller()
         ->RemoveObserver(this);
   }
 
-  void SetRunLoop(base::RunLoop* run_loop) { run_loop_ = run_loop; }
   void SetShouldSucceed(bool should_succeed) {
     should_succeed_ = should_succeed;
   }
@@ -96,7 +93,6 @@
   bool IsFinished() { return is_finished_; }
 
  private:
-  base::RunLoop* run_loop_ = nullptr;
   bool is_finished_ = false;
   bool should_succeed_ = false;
 };
@@ -400,17 +396,40 @@
     histogram_tester_.ExpectTotalCount(kEnrollmentResultMetrics, 0);
   }
 
+  void TearDownInProcessBrowserTestFixture() override {
+    // Test body is skipped if enrollment failed as Chrome quit early.
+    // Verify the enrollment result in the tear down instead.
+    if (!is_enrollment_token_valid()) {
+      VerifyEnrollmentResult();
+    }
+  }
+
   void CreatedBrowserMainParts(content::BrowserMainParts* parts) override {
     static_cast<ChromeBrowserMainParts*>(parts)->AddParts(
         new ChromeBrowserExtraSetUp(&observer_));
   }
 
-  void WaitForPolicyRegisterFinished() {
-    if (!observer_.IsFinished()) {
-      base::RunLoop run_loop;
-      observer_.SetRunLoop(&run_loop);
-      run_loop.Run();
+  void VerifyEnrollmentResult() {
+    EXPECT_EQ(is_enrollment_token_valid() ? "fake_device_management_token"
+                                          : std::string(),
+              BrowserDMTokenStorage::Get()->RetrieveDMToken());
+
+    // Verify the enrollment result.
+    MachineLevelUserCloudPolicyEnrollmentResult expected_result;
+    if (is_enrollment_token_valid() && storage_enabled()) {
+      expected_result = MachineLevelUserCloudPolicyEnrollmentResult::kSuccess;
+    } else if (is_enrollment_token_valid() && !storage_enabled()) {
+      expected_result =
+          MachineLevelUserCloudPolicyEnrollmentResult::kFailedToStore;
+    } else {
+      expected_result =
+          MachineLevelUserCloudPolicyEnrollmentResult::kFailedToFetch;
     }
+
+    // Verify the metrics.
+    histogram_tester_.ExpectBucketCount(kEnrollmentResultMetrics,
+                                        expected_result, 1);
+    histogram_tester_.ExpectTotalCount(kEnrollmentResultMetrics, 1);
   }
 
  protected:
@@ -428,37 +447,18 @@
 };
 
 IN_PROC_BROWSER_TEST_P(MachineLevelUserCloudPolicyEnrollmentTest, Test) {
-  WaitForPolicyRegisterFinished();
+  // Test body is ran only if enrollment is succeeded.
+  EXPECT_TRUE(is_enrollment_token_valid());
 
-  EXPECT_EQ(is_enrollment_token_valid() ? "fake_device_management_token"
-                                        : std::string(),
-            BrowserDMTokenStorage::Get()->RetrieveDMToken());
+  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
 
-  // Verify the enrollment result.
-  MachineLevelUserCloudPolicyEnrollmentResult expected_result;
-  if (is_enrollment_token_valid() && storage_enabled()) {
-    expected_result = MachineLevelUserCloudPolicyEnrollmentResult::kSuccess;
-  } else if (is_enrollment_token_valid() && !storage_enabled()) {
-    expected_result =
-        MachineLevelUserCloudPolicyEnrollmentResult::kFailedToStore;
-  } else {
-    expected_result =
-        MachineLevelUserCloudPolicyEnrollmentResult::kFailedToFetch;
-  }
-
-  // Verify the metrics.
-  histogram_tester_.ExpectBucketCount(kEnrollmentResultMetrics, expected_result,
-                                      1);
-  histogram_tester_.ExpectTotalCount(kEnrollmentResultMetrics, 1);
-
+  VerifyEnrollmentResult();
 #if defined(OS_MACOSX)
   // Verify the last mericis of launch is recorded in
   // applicationDidFinishNotification.
-  if (is_enrollment_token_valid()) {
-    EXPECT_EQ(1u, histogram_tester_
-                      .GetAllSamples("Startup.OSX.DockIconWillFinishBouncing")
-                      .size());
-  }
+  EXPECT_EQ(1u, histogram_tester_
+                    .GetAllSamples("Startup.OSX.DockIconWillFinishBouncing")
+                    .size());
 #endif
 }
 
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index bc878e2..2a73c28 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -491,6 +491,11 @@
   { key::kWebRtcUdpPortRange,
     prefs::kWebRTCUDPPortRange,
     base::Value::Type::STRING },
+#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
+  { key::kWebRtcEventLogCollectionAllowed,
+    prefs::kWebRtcEventLogCollectionAllowed,
+    base::Value::Type::BOOLEAN },
+#endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   { key::kSecurityKeyPermitAttestation,
     prefs::kSecurityKeyPermitAttestation,
diff --git a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc b/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
index 2d74747..699de1d 100644
--- a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
+++ b/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
@@ -12,7 +12,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc
index 4ce40a1..95e7b325 100644
--- a/chrome/browser/policy/policy_browsertest.cc
+++ b/chrome/browser/policy/policy_browsertest.cc
@@ -36,7 +36,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_file_util.h"
@@ -71,6 +71,7 @@
 #include "chrome/browser/media/router/media_router_feature.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_devices_controller.h"
+#include "chrome/browser/media/webrtc/webrtc_event_log_manager.h"
 #include "chrome/browser/net/default_network_context_params.h"
 #include "chrome/browser/net/prediction_options.h"
 #include "chrome/browser/net/url_request_mock_util.h"
@@ -97,8 +98,6 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h"
-#include "chrome/browser/ui/search/instant_test_utils.h"
-#include "chrome/browser/ui/search/local_ntp_test_utils.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/toolbar/component_toolbar_actions_factory.h"
 #include "chrome/browser/ui/toolbar/media_router_action_controller.h"
@@ -115,9 +114,7 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/common/url_constants.h"
 #include "chrome/common/web_application_info.h"
-#include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
-#include "chrome/grit/locale_settings.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/testing_profile.h"
@@ -357,14 +354,6 @@
       base::PathService::Get(chrome::DIR_TEST_DATA, test_data_directory));
 }
 
-content::RenderFrameHost* GetMostVisitedIframe(content::WebContents* tab) {
-  for (content::RenderFrameHost* frame : tab->GetAllFrames()) {
-    if (frame->GetFrameName() == "mv-single")
-      return frame;
-  }
-  return nullptr;
-}
-
 // Filters requests to the hosts in |urls| and redirects them to the test data
 // dir through URLRequestMockHTTPJobs.
 void RedirectHostsToTestData(const char* const urls[], size_t size) {
@@ -610,16 +599,6 @@
   return result;
 }
 
-bool ContainsWebstoreTile(content::RenderFrameHost* iframe) {
-  int num_webstore_tiles = 0;
-  EXPECT_TRUE(instant_test_utils::GetIntFromJS(
-      iframe,
-      "document.querySelectorAll(\".md-tile[href='" +
-          l10n_util::GetStringUTF8(IDS_WEBSTORE_URL) + "']\").length",
-      &num_webstore_tiles));
-  return num_webstore_tiles == 1;
-}
-
 #if defined(OS_CHROMEOS)
 class TestAudioObserver : public chromeos::CrasAudioHandler::AudioObserver {
  public:
@@ -2059,30 +2038,12 @@
   EXPECT_TRUE(is_toggle_dev_mode_checkbox_disabled);
 }
 
-IN_PROC_BROWSER_TEST_F(PolicyTest, NTPWebStoreIconShown) {
-  // This test is to verify that the web store icons is shown when no policy
-  // applies. See WebStoreIconPolicyTest.NTPWebStoreIconHidden for verification
-  // when a policy is in effect.
+// TODO(samarth): remove along with rest of NTP4 code.
+IN_PROC_BROWSER_TEST_F(PolicyTest, DISABLED_WebStoreIconHidden) {
+  // Verifies that the web store icons can be hidden from the new tab page.
 
   // Open new tab page and look for the web store icons.
-  content::WebContents* active_tab =
-      local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
-  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
-
-  content::RenderFrameHost* iframe = GetMostVisitedIframe(active_tab);
-
-  // Look though all the tiles and see whether there is a webstore icon.
-  // Make sure that there is one web store icon.
-  EXPECT_TRUE(ContainsWebstoreTile(iframe));
-}
-
-IN_PROC_BROWSER_TEST_F(PolicyTest, AppsWebStoreIconHidden) {
-  // Verifies that the web store icon can be hidden from the chrome://apps
-  // page. A policy change takes immediate effect on the apps page for the
-  // current profile. Browser restart is not required.
-
-  // Open new tab page and look for the web store icons.
-  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAppsURL));
+  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
   content::WebContents* contents =
     browser()->tab_strip_model()->GetActiveWebContents();
 
@@ -2104,7 +2065,7 @@
   UpdateProviderPolicy(policies);
 
   // The web store icons should now be hidden.
-  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIAppsURL));
+  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
   EXPECT_FALSE(ContainsVisibleElement(contents,
                                       "ahfgeienlihckogmohjhadlkjgocpleb"));
   EXPECT_FALSE(ContainsVisibleElement(contents, "chrome-web-store-link"));
@@ -4102,43 +4063,6 @@
   EXPECT_GT(samples->GetCount(82), 0);
 }
 
-// Similar to PolicyTest, but applies the HideWebStoreIcon policy before
-// the browser is started. This is required because the list that includes the
-// WebStoreIcon on the NTP is initialized at browser start.
-class PolicyWebStoreIconTest : public PolicyTest {
- public:
-  PolicyWebStoreIconTest() {}
-  ~PolicyWebStoreIconTest() override {}
-
-  void SetUpInProcessBrowserTestFixture() override {
-    PolicyTest::SetUpInProcessBrowserTestFixture();
-    PolicyMap policies;
-    policies.Set(key::kHideWebStoreIcon, POLICY_LEVEL_MANDATORY,
-                 POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
-                 std::make_unique<base::Value>(true), nullptr);
-    provider_.UpdateChromePolicy(policies);
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PolicyWebStoreIconTest);
-};
-
-IN_PROC_BROWSER_TEST_F(PolicyWebStoreIconTest, NTPWebStoreIconHidden) {
-  // Verifies that the web store icon can be hidden from the new tab page. Check
-  // to see NTPWebStoreIconShown for behavior when the policy is not applied.
-
-  // Open new tab page and look for the web store icon
-  content::WebContents* active_tab =
-      local_ntp_test_utils::OpenNewTab(browser(), GURL("about:blank"));
-  local_ntp_test_utils::NavigateToNTPAndWaitUntilLoaded(browser());
-
-  content::RenderFrameHost* iframe = GetMostVisitedIframe(active_tab);
-
-  // Applying the policy before the browser started, the web store icon should
-  // now be hidden.
-  EXPECT_FALSE(ContainsWebstoreTile(iframe));
-}
-
 class MediaStreamDevicesControllerBrowserTest
     : public PolicyTest,
       public testing::WithParamInterface<bool> {
@@ -6262,6 +6186,102 @@
                                           BooleanPolicy::kFalse,
                                           BooleanPolicy::kTrue));
 
+class WebRtcEventLogCollectionAllowedPolicyTest
+    : public PolicyTest,
+      public testing::WithParamInterface<BooleanPolicy> {
+ public:
+  ~WebRtcEventLogCollectionAllowedPolicyTest() override = default;
+
+  void SetUpInProcessBrowserTestFixture() override {
+    PolicyTest::SetUpInProcessBrowserTestFixture();
+    PolicyMap policies;
+
+    const BooleanPolicy policy = GetParam();
+    if (policy == BooleanPolicy::kFalse || policy == BooleanPolicy::kTrue) {
+      const bool policy_bool = (policy == BooleanPolicy::kTrue);
+      policies.Set(policy::key::kWebRtcEventLogCollectionAllowed,
+                   policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
+                   policy::POLICY_SOURCE_ENTERPRISE_DEFAULT,
+                   std::make_unique<base::Value>(policy_bool), nullptr);
+    }
+
+    provider_.UpdateChromePolicy(policies);
+  }
+
+  const PrefService::Preference* GetPreference() const {
+    auto* service = user_prefs::UserPrefs::Get(browser()->profile());
+    return service->FindPreference(prefs::kWebRtcEventLogCollectionAllowed);
+  }
+
+  base::OnceCallback<void(bool)> BlockingBoolExpectingReply(
+      base::RunLoop* run_loop,
+      bool expected_value) {
+    return base::BindOnce(
+        [](base::RunLoop* run_loop, bool expected_value, bool value) {
+          EXPECT_EQ(expected_value, value);
+          run_loop->Quit();
+        },
+        run_loop, expected_value);
+  }
+
+  // The "extras" in question are the ID and error (only one of which may
+  // be non-null), which this test ignores (tested elsewhere).
+  base::OnceCallback<void(bool, const std::string&, const std::string&)>
+  BlockingBoolExpectingReplyWithExtras(base::RunLoop* run_loop,
+                                       bool expected_value) {
+    return base::BindOnce(
+        [](base::RunLoop* run_loop, bool expected_value, bool value,
+           const std::string& ignored_log_id,
+           const std::string& ignored_error) {
+          EXPECT_EQ(expected_value, value);
+          run_loop->Quit();
+        },
+        run_loop, expected_value);
+  }
+};
+
+IN_PROC_BROWSER_TEST_P(WebRtcEventLogCollectionAllowedPolicyTest, RunTest) {
+  const PrefService::Preference* const pref = GetPreference();
+  const bool remote_logging_allowed = (GetParam() == BooleanPolicy::kTrue);
+  ASSERT_EQ(pref->GetValue()->GetBool(), remote_logging_allowed);
+
+  auto* webrtc_event_log_manager = WebRtcEventLogManager::GetInstance();
+  ASSERT_TRUE(webrtc_event_log_manager);
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  int render_process_id = web_contents->GetMainFrame()->GetProcess()->GetID();
+
+  constexpr int kLid = 123;
+  const std::string kPeerConnectionId = "id";
+
+  {
+    base::RunLoop run_loop;
+    webrtc_event_log_manager->PeerConnectionAdded(
+        render_process_id, kLid, kPeerConnectionId,
+        BlockingBoolExpectingReply(&run_loop, true));
+    run_loop.Run();
+  }
+
+  {
+    constexpr size_t kMaxFileSizeBytes = 1000 * 1000;
+    base::RunLoop run_loop;
+
+    // Test focus - remote-bound logging allowed if and only if the policy
+    // is configured to allow it.
+    webrtc_event_log_manager->StartRemoteLogging(
+        render_process_id, kPeerConnectionId, kMaxFileSizeBytes,
+        BlockingBoolExpectingReplyWithExtras(&run_loop,
+                                             remote_logging_allowed));
+    run_loop.Run();
+  }
+}
+
+INSTANTIATE_TEST_CASE_P(,
+                        WebRtcEventLogCollectionAllowedPolicyTest,
+                        ::testing::Values(BooleanPolicy::kNotConfigured,
+                                          BooleanPolicy::kFalse,
+                                          BooleanPolicy::kTrue));
 #endif  // !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
 
 }  // namespace policy
diff --git a/chrome/browser/predictors/predictor_database_factory.cc b/chrome/browser/predictors/predictor_database_factory.cc
index 2e105f7..c65d344 100644
--- a/chrome/browser/predictors/predictor_database_factory.cc
+++ b/chrome/browser/predictors/predictor_database_factory.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/predictors/predictor_database.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc
index 989bb01..d0cbf3c9 100644
--- a/chrome/browser/prefs/browser_prefs.cc
+++ b/chrome/browser/prefs/browser_prefs.cc
@@ -71,6 +71,7 @@
 #include "chrome/browser/ui/tabs/pinned_tab_codec.h"
 #include "chrome/browser/ui/webui/flags_ui.h"
 #include "chrome/browser/ui/webui/ntp/new_tab_ui.h"
+#include "chrome/browser/ui/webui/print_preview/policy_settings.h"
 #include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h"
@@ -598,6 +599,7 @@
 #endif
 
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
+  printing::PolicySettings::RegisterProfilePrefs(registry);
   printing::StickySettings::RegisterProfilePrefs(registry);
 #endif
 
diff --git a/chrome/browser/prefs/incognito_mode_prefs.cc b/chrome/browser/prefs/incognito_mode_prefs.cc
index b9439bc..8ae5e753 100644
--- a/chrome/browser/prefs/incognito_mode_prefs.cc
+++ b/chrome/browser/prefs/incognito_mode_prefs.cc
@@ -10,7 +10,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/prefs/pref_service_incognito_whitelist.cc b/chrome/browser/prefs/pref_service_incognito_whitelist.cc
index ce3199f..63e904d 100644
--- a/chrome/browser/prefs/pref_service_incognito_whitelist.cc
+++ b/chrome/browser/prefs/pref_service_incognito_whitelist.cc
@@ -49,8 +49,6 @@
 #include "ash/public/cpp/ash_pref_names.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
 #include "chromeos/chromeos_pref_names.h"
-#include "components/arc/arc_prefs.h"
-#include "components/cryptauth/pref_names.h"
 #include "components/drive/drive_pref_names.h"
 #include "ui/base/ime/chromeos/extension_ime_util.h"
 #include "ui/chromeos/events/pref_names.h"
@@ -518,14 +516,12 @@
     prefs::kServerBackedDeviceState, prefs::kCustomizationDefaultWallpaperURL,
     prefs::kLogoutStartedLast,
     // prefs::kConsumerManagementStage,
-    prefs::kIsBootstrappingSlave, prefs::kReportArcStatusEnabled,
-    prefs::kNetworkThrottlingEnabled, prefs::kPowerMetricsDailySample,
-    prefs::kPowerMetricsIdleScreenDimCount,
+    prefs::kIsBootstrappingSlave, prefs::kNetworkThrottlingEnabled,
+    prefs::kPowerMetricsDailySample, prefs::kPowerMetricsIdleScreenDimCount,
     prefs::kPowerMetricsIdleScreenOffCount,
     prefs::kPowerMetricsIdleSuspendCount,
     prefs::kPowerMetricsLidClosedSuspendCount, prefs::kReportingUsers,
-    prefs::kArcAppInstallEventLoggingEnabled, prefs::kRemoveUsersRemoteCommand,
-    prefs::kCameraMediaConsolidated,
+    prefs::kRemoveUsersRemoteCommand, prefs::kCameraMediaConsolidated,
 #endif  // defined(OS_CHROMEOS)
 
     prefs::kClearPluginLSODataEnabled, prefs::kPepperFlashSettingsEnabled,
@@ -633,8 +629,8 @@
     prefs::kQuickCheckEnabled, prefs::kPacHttpsUrlStrippingEnabled,
     prefs::kBrowserGuestModeEnabled, prefs::kBrowserAddPersonEnabled,
 
-    prefs::kCryptAuthDeviceId, prefs::kEasyUnlockHardlockState,
-    prefs::kEasyUnlockLocalStateTpmKeys, prefs::kEasyUnlockLocalStateUserPrefs,
+    prefs::kEasyUnlockHardlockState, prefs::kEasyUnlockLocalStateTpmKeys,
+    prefs::kEasyUnlockLocalStateUserPrefs,
 
     prefs::kRecoveryComponentNeedsElevation,
 #if BUILDFLAG(ENABLE_BACKGROUND_MODE)
@@ -748,29 +744,6 @@
     chromeos::prefs::kQuirksClientLastServerCheck,
 #endif  // defined(OS_CHROMEOS)
 
-// components/arc/arc_prefs.h
-#if defined(OS_CHROMEOS)
-    arc::prefs::kArcActiveDirectoryPlayUserId, arc::prefs::kArcApps,
-    arc::prefs::kArcBackupRestoreEnabled, arc::prefs::kArcDataRemoveRequested,
-    arc::prefs::kArcEnabled, arc::prefs::kArcFastAppReinstallPackages,
-    arc::prefs::kArcFastAppReinstallStarted,
-    arc::prefs::kArcInitialSettingsPending,
-    arc::prefs::kArcPolicyComplianceReported, arc::prefs::kArcTermsAccepted,
-    arc::prefs::kArcTermsShownInOobe, arc::prefs::kArcLocationServiceEnabled,
-    arc::prefs::kArcPackages, arc::prefs::kArcPaiStarted,
-    arc::prefs::kArcPushInstallAppsRequested,
-    arc::prefs::kArcPushInstallAppsPending,
-    arc::prefs::kArcSetNotificationsEnabledDeferred, arc::prefs::kArcSignedIn,
-    arc::prefs::kArcSkippedReportingNotice,
-    arc::prefs::kArcSupervisionTransition,
-    arc::prefs::kArcCompatibleFilesystemChosen,
-    arc::prefs::kArcVoiceInteractionValuePropAccepted,
-    arc::prefs::kEcryptfsMigrationStrategy,
-    arc::prefs::kVoiceInteractionEnabled,
-    arc::prefs::kVoiceInteractionContextEnabled,
-    arc::prefs::kVoiceInteractionHotwordEnabled,
-#endif  // defined(OS_CHROMEOS)
-
     // components/bookmarks/common/bookmark_pref_names.h
     bookmarks::prefs::kBookmarkEditorExpandedNodes,
     bookmarks::prefs::kEditBookmarksEnabled,
@@ -789,20 +762,6 @@
     // components/consent_auditor/pref_names.h
     consent_auditor::prefs::kLocalConsentsDictionary,
 
-// components/cryptauth/pref_names.h
-#if defined(CHROMEOS)
-    cryptauth::prefs::kCryptAuthDeviceSyncLastSyncTimeSeconds,
-    cryptauth::prefs::kCryptAuthDeviceSyncIsRecoveringFromFailure,
-    cryptauth::prefs::kCryptAuthDeviceSyncReason,
-    cryptauth::prefs::kCryptAuthDeviceSyncUnlockKeys,
-    cryptauth::prefs::kCryptAuthEnrollmentIsRecoveringFromFailure,
-    cryptauth::prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds,
-    cryptauth::prefs::kCryptAuthEnrollmentReason,
-    cryptauth::prefs::kCryptAuthEnrollmentUserPublicKey,
-    cryptauth::prefs::kCryptAuthEnrollmentUserPrivateKey,
-    cryptauth::prefs::kCryptAuthGCMRegistrationId,
-#endif  // defined(CHROMEOS)
-
     // components/dom_distiller/core/pref_names.h
     dom_distiller::prefs::kFont, dom_distiller::prefs::kTheme,
     dom_distiller::prefs::kFontScale,
diff --git a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
index eaec806..0a9ae1a9 100644
--- a/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
+++ b/chrome/browser/prerender/prerender_nostate_prefetch_browsertest.cc
@@ -12,7 +12,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/threading/platform_thread.h"
diff --git a/chrome/browser/previews/previews_service.cc b/chrome/browser/previews/previews_service.cc
index b76e684..a00d730 100644
--- a/chrome/browser/previews/previews_service.cc
+++ b/chrome/browser/previews/previews_service.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/previews/previews_lite_page_decider.h"
 #include "chrome/common/chrome_constants.h"
 #include "components/blacklist/opt_out_blacklist/opt_out_blacklist_data.h"
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
index 796cdcd..d241f91 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/sys_byteorder.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/printing/cloud_print/privet_traffic_detector.h b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
index 2d7e1e0..f8153442 100644
--- a/chrome/browser/printing/cloud_print/privet_traffic_detector.h
+++ b/chrome/browser/printing/cloud_print/privet_traffic_detector.h
@@ -11,10 +11,10 @@
 #include "base/cancelable_callback.h"
 #include "base/macros.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/base/address_family.h"
 #include "net/base/ip_endpoint.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/network/public/mojom/udp_socket.mojom.h"
 
 namespace content {
@@ -31,7 +31,7 @@
     : public base::RefCountedThreadSafe<
           PrivetTrafficDetector,
           content::BrowserThread::DeleteOnIOThread>,
-      private content::NetworkConnectionTracker::NetworkConnectionObserver,
+      private network::NetworkConnectionTracker::NetworkConnectionObserver,
       public network::mojom::UDPSocketReceiver {
  public:
   PrivetTrafficDetector(net::AddressFamily address_family,
@@ -64,7 +64,7 @@
   void OnJoinGroupComplete(int rv);
   void ResetConnection();
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver:
+  // network::NetworkConnectionTracker::NetworkConnectionObserver:
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   // network::mojom::UDPSocketReceiver implementation
diff --git a/chrome/browser/printing/cloud_print/privet_url_fetcher.cc b/chrome/browser/printing/cloud_print/privet_url_fetcher.cc
index 3bd58ce..2dca4afc 100644
--- a/chrome/browser/printing/cloud_print/privet_url_fetcher.cc
+++ b/chrome/browser/printing/cloud_print/privet_url_fetcher.cc
@@ -17,7 +17,7 @@
 #include "base/location.h"
 #include "base/rand_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/printing/cloud_print/privet_constants.h"
diff --git a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
index 6253f92..db00ff9 100644
--- a/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
+++ b/chrome/browser/printing/cloud_print/test/cloud_print_proxy_process_browsertest.cc
@@ -22,7 +22,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/multiprocess_test.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
diff --git a/chrome/browser/printing/pdf_to_emf_converter.cc b/chrome/browser/printing/pdf_to_emf_converter.cc
index 1c1e5d4d..fe66ece 100644
--- a/chrome/browser/printing/pdf_to_emf_converter.cc
+++ b/chrome/browser/printing/pdf_to_emf_converter.cc
@@ -19,7 +19,7 @@
 #include "base/memory/ref_counted_delete_on_sequence.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/printing/print_dialog_cloud_win.cc b/chrome/browser/printing/print_dialog_cloud_win.cc
index fc1ad0f9..f1cc30c 100644
--- a/chrome/browser/printing/print_dialog_cloud_win.cc
+++ b/chrome/browser/printing/print_dialog_cloud_win.cc
@@ -17,7 +17,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/printing/print_job.cc b/chrome/browser/printing/print_job.cc
index 6841c9a..31998e5 100644
--- a/chrome/browser/printing/print_job.cc
+++ b/chrome/browser/printing/print_job.cc
@@ -13,7 +13,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc
index 321278d..6408efc 100644
--- a/chrome/browser/printing/print_view_manager_base.cc
+++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -16,7 +16,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/printing/printer_manager_dialog_linux.cc b/chrome/browser/printing/printer_manager_dialog_linux.cc
index dbc8208..47a23f44 100644
--- a/chrome/browser/printing/printer_manager_dialog_linux.cc
+++ b/chrome/browser/printing/printer_manager_dialog_linux.cc
@@ -12,7 +12,7 @@
 #include "base/nix/xdg_util.h"
 #include "base/process/kill.h"
 #include "base/process/launch.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 
 namespace {
diff --git a/chrome/browser/printing/printer_manager_dialog_win.cc b/chrome/browser/printing/printer_manager_dialog_win.cc
index c71f9ae..6659071d8c 100644
--- a/chrome/browser/printing/printer_manager_dialog_win.cc
+++ b/chrome/browser/printing/printer_manager_dialog_win.cc
@@ -10,7 +10,7 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 
 namespace {
diff --git a/chrome/browser/profile_resetter/profile_resetter.cc b/chrome/browser/profile_resetter/profile_resetter.cc
index 81b219bc..5ab27b5 100644
--- a/chrome/browser/profile_resetter/profile_resetter.cc
+++ b/chrome/browser/profile_resetter/profile_resetter.cc
@@ -11,8 +11,8 @@
 
 #include "base/macros.h"
 #include "base/synchronization/cancellation_flag.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/browsing_data/browsing_data_helper.h"
diff --git a/chrome/browser/profile_resetter/resettable_settings_snapshot.cc b/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
index 025b94f..dcc0460 100644
--- a/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
+++ b/chrome/browser/profile_resetter/resettable_settings_snapshot.cc
@@ -12,8 +12,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/cancellation_flag.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/profiles/profile_attributes_storage.cc b/chrome/browser/profiles/profile_attributes_storage.cc
index a0268678..dadb7ef 100644
--- a/chrome/browser/profiles/profile_attributes_storage.cc
+++ b/chrome/browser/profiles/profile_attributes_storage.cc
@@ -14,7 +14,7 @@
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile_avatar_downloader.h"
diff --git a/chrome/browser/profiles/profile_browsertest.cc b/chrome/browser/profiles/profile_browsertest.cc
index dce4c7e..3cea5f0e 100644
--- a/chrome/browser/profiles/profile_browsertest.cc
+++ b/chrome/browser/profiles/profile_browsertest.cc
@@ -21,7 +21,7 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/chrome/browser/profiles/profile_impl.cc b/chrome/browser/profiles/profile_impl.cc
index 7f30f029..caf28c4ab 100644
--- a/chrome/browser/profiles/profile_impl.cc
+++ b/chrome/browser/profiles/profile_impl.cc
@@ -27,8 +27,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/trace_event/trace_event.h"
 #include "base/version.h"
@@ -133,6 +133,7 @@
 #include "ppapi/buildflags/buildflags.h"
 #include "printing/buildflags/buildflags.h"
 #include "services/identity/identity_service.h"
+#include "services/identity/public/cpp/identity_manager.h"
 #include "services/identity/public/mojom/constants.mojom.h"
 #include "services/network/public/cpp/features.h"
 #include "services/preferences/public/cpp/in_process_service_factory.h"
@@ -782,10 +783,10 @@
 }
 
 std::string ProfileImpl::GetProfileUserName() const {
-  const SigninManagerBase* signin_manager =
-      SigninManagerFactory::GetForProfileIfExists(this);
-  if (signin_manager)
-    return signin_manager->GetAuthenticatedAccountInfo().email;
+  const identity::IdentityManager* identity_manager =
+      IdentityManagerFactory::GetForProfileIfExists(this);
+  if (identity_manager)
+    return identity_manager->GetPrimaryAccountInfo().email;
 
   return std::string();
 }
diff --git a/chrome/browser/profiles/profile_impl_io_data.cc b/chrome/browser/profiles/profile_impl_io_data.cc
index 14ae808..bf70099 100644
--- a/chrome/browser/profiles/profile_impl_io_data.cc
+++ b/chrome/browser/profiles/profile_impl_io_data.cc
@@ -20,8 +20,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/default_clock.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/profiles/profile_info_cache.cc b/chrome/browser/profiles/profile_info_cache.cc
index b7adec11..5e92e898 100644
--- a/chrome/browser/profiles/profile_info_cache.cc
+++ b/chrome/browser/profiles/profile_info_cache.cc
@@ -15,7 +15,7 @@
 #include "base/macros.h"
 #include "base/stl_util.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/profiles/profile_io_data.cc b/chrome/browser/profiles/profile_io_data.cc
index fa476ddd..44f5ed4 100644
--- a/chrome/browser/profiles/profile_io_data.cc
+++ b/chrome/browser/profiles/profile_io_data.cc
@@ -22,7 +22,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/profiles/profile_manager.cc b/chrome/browser/profiles/profile_manager.cc
index ae7ade8..675efeca 100644
--- a/chrome/browser/profiles/profile_manager.cc
+++ b/chrome/browser/profiles/profile_manager.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/trace_event/trace_event.h"
 #include "base/value_conversions.h"
diff --git a/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc b/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc
index a37dc576..93538e07c 100644
--- a/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc
+++ b/chrome/browser/profiles/profile_shortcut_manager_unittest_win.cc
@@ -9,7 +9,7 @@
 #include "base/location.h"
 #include "base/path_service.h"
 #include "base/strings/string16.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/test/scoped_path_override.h"
 #include "base/test/test_shortcut_win.h"
diff --git a/chrome/browser/profiles/profile_shortcut_manager_win.cc b/chrome/browser/profiles/profile_shortcut_manager_win.cc
index 490b0e36..8ca940a 100644
--- a/chrome/browser/profiles/profile_shortcut_manager_win.cc
+++ b/chrome/browser/profiles/profile_shortcut_manager_win.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/win/shortcut.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/profiling_host/background_profiling_triggers.cc b/chrome/browser/profiling_host/background_profiling_triggers.cc
index dad525bd..cc4a594 100644
--- a/chrome/browser/profiling_host/background_profiling_triggers.cc
+++ b/chrome/browser/profiling_host/background_profiling_triggers.cc
@@ -6,7 +6,7 @@
 
 #include "base/rand_util.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/metrics/chrome_metrics_service_accessor.h"
diff --git a/chrome/browser/profiling_host/profiling_process_host.cc b/chrome/browser/profiling_host/profiling_process_host.cc
index e1d80240..613499d 100644
--- a/chrome/browser/profiling_host/profiling_process_host.cc
+++ b/chrome/browser/profiling_host/profiling_process_host.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_log.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index fcd295ec..9d24a18 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -64,7 +64,7 @@
 #include "chrome/browser/ui/exclusive_access/keyboard_lock_controller.h"
 #include "chrome/browser/ui/tab_contents/core_tab_helper.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_render_frame.mojom.h"
@@ -1196,9 +1196,8 @@
 
   int open_in_app_string_id;
   const Browser* browser = GetBrowser();
-  if (browser &&
-      browser->app_name() ==
-          web_app::GenerateApplicationNameFromExtensionId(pwa->id())) {
+  if (browser && browser->app_name() ==
+                     web_app::GenerateApplicationNameFromAppId(pwa->id())) {
     open_in_app_string_id = IDS_CONTENT_CONTEXT_OPENLINKBOOKMARKAPP_SAMEAPP;
   } else {
     open_in_app_string_id = IDS_CONTENT_CONTEXT_OPENLINKBOOKMARKAPP;
diff --git a/chrome/browser/renderer_host/chrome_extension_message_filter.cc b/chrome/browser/renderer_host/chrome_extension_message_filter.cc
index 0160a859..d96ca959 100644
--- a/chrome/browser/renderer_host/chrome_extension_message_filter.cc
+++ b/chrome/browser/renderer_host/chrome_extension_message_filter.cc
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/activity_log/activity_action_constants.h"
diff --git a/chrome/browser/renderer_host/pepper/device_id_fetcher.cc b/chrome/browser/renderer_host/pepper/device_id_fetcher.cc
index 4f4bc45f..d2015629 100644
--- a/chrome/browser/renderer_host/pepper/device_id_fetcher.cc
+++ b/chrome/browser/renderer_host/pepper/device_id_fetcher.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/pref_names.h"
diff --git a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
index dcc1868..53bcd4ac 100644
--- a/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
+++ b/chrome/browser/renderer_host/render_process_host_chrome_browsertest.cc
@@ -32,6 +32,7 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_test_utils.h"
+#include "content/public/test/test_utils.h"
 #include "media/base/media_switches.h"
 #include "net/base/filename_util.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -155,7 +156,7 @@
     const extensions::Extension* extension =
         LoadExtension(test_data_dir_.AppendASCII("options_page"));
 
-    // Change the first tab to be the omnibox page (TYPE_WEBUI).
+    // Change the first tab to be the omnibox page (WebUI).
     GURL omnibox(chrome::kChromeUIOmniboxURL);
     ui_test_utils::NavigateToURL(browser(), omnibox);
     EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
@@ -164,7 +165,7 @@
     EXPECT_EQ(omnibox, tab1->GetURL());
     EXPECT_EQ(host_count, RenderProcessHostCount());
 
-    // Create a new TYPE_TABBED tab.  It should be in its own process.
+    // Create a new normal tab with a data URL. It should be in its own process.
     GURL page1("data:text/html,hello world1");
 
     ui_test_utils::WindowedTabAddedNotificationObserver observer1(
@@ -181,23 +182,30 @@
     EXPECT_EQ(host_count, RenderProcessHostCount());
     EXPECT_NE(rph1, rph2);
 
-    // Create another TYPE_TABBED tab.  It should share the previous process.
+    // Create another data URL tab.  With Site Isolation, this will require its
+    // own process, but without Site Isolation, it can share the previous
+    // process.
     GURL page2("data:text/html,hello world2");
     ui_test_utils::WindowedTabAddedNotificationObserver observer2(
         content::NotificationService::AllSources());
     ::ShowSingletonTab(browser(), page2);
     observer2.Wait();
     tab_count++;
+    if (content::AreAllSitesIsolatedForTesting())
+      host_count++;
     EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
     tab2 = browser()->tab_strip_model()->GetWebContentsAt(tab_count - 1);
     EXPECT_EQ(tab2->GetURL(), page2);
     EXPECT_EQ(host_count, RenderProcessHostCount());
-    EXPECT_EQ(tab2->GetMainFrame()->GetProcess(), rph2);
+    if (content::AreAllSitesIsolatedForTesting())
+      EXPECT_NE(tab2->GetMainFrame()->GetProcess(), rph2);
+    else
+      EXPECT_EQ(tab2->GetMainFrame()->GetProcess(), rph2);
 
-    // Create another TYPE_WEBUI tab.  It should share the process with omnibox.
-    // Note: intentionally create this tab after the TYPE_TABBED tabs to
-    // exercise bug 43448 where extension and WebUI tabs could get combined into
-    // normal renderers.
+    // Create another WebUI tab.  It should share the process with omnibox.
+    // Note: intentionally create this tab after the normal tabs to exercise bug
+    // 43448 where extension and WebUI tabs could get combined into normal
+    // renderers.
     GURL history(chrome::kChromeUIHistoryURL);
     ui_test_utils::WindowedTabAddedNotificationObserver observer3(
         content::NotificationService::AllSources());
@@ -210,7 +218,7 @@
     EXPECT_EQ(host_count, RenderProcessHostCount());
     EXPECT_EQ(tab2->GetMainFrame()->GetProcess(), rph1);
 
-    // Create a TYPE_EXTENSION tab.  It should be in its own process.
+    // Create an extension tab.  It should be in its own process.
     GURL extension_url("chrome-extension://" + extension->id());
     ui_test_utils::WindowedTabAddedNotificationObserver observer4(
         content::NotificationService::AllSources());
@@ -256,13 +264,13 @@
   int tab_count = 1;
   int host_count = 1;
 
-  // Change the first tab to be the new tab page (TYPE_WEBUI).
+  // Change the first tab to be a WebUI page.
   GURL omnibox(chrome::kChromeUIOmniboxURL);
   ui_test_utils::NavigateToURL(browser(), omnibox);
   EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
   EXPECT_EQ(host_count, RenderProcessHostCount());
 
-  // Create a new TYPE_TABBED tab.  It should be in its own process.
+  // Create a new normal tab with a data URL.  It should be in its own process.
   GURL page1("data:text/html,hello world1");
   ui_test_utils::WindowedTabAddedNotificationObserver observer1(
       content::NotificationService::AllSources());
@@ -273,13 +281,16 @@
   EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
   EXPECT_EQ(host_count, RenderProcessHostCount());
 
-  // Create another TYPE_TABBED tab.  It should share the previous process.
+  // Create another data URL tab.  With Site Isolation, this will require its
+  // own process, but without Site Isolation, it can share the previous process.
   GURL page2("data:text/html,hello world2");
   ui_test_utils::WindowedTabAddedNotificationObserver observer2(
       content::NotificationService::AllSources());
   ::ShowSingletonTab(browser(), page2);
   observer2.Wait();
   tab_count++;
+  if (content::AreAllSitesIsolatedForTesting())
+    host_count++;
   EXPECT_EQ(tab_count, browser()->tab_strip_model()->count());
   EXPECT_EQ(host_count, RenderProcessHostCount());
 
diff --git a/chrome/browser/resource_coordinator/intervention_policy_database.cc b/chrome/browser/resource_coordinator/intervention_policy_database.cc
index 1d3b31f..4f9b7a83 100644
--- a/chrome/browser/resource_coordinator/intervention_policy_database.cc
+++ b/chrome/browser/resource_coordinator/intervention_policy_database.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/resource_coordinator/intervention_policy_database.h"
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/values.h"
 #include "chrome/browser/resource_coordinator/utils.h"
diff --git a/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.h b/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.h
index 00f8dd2..3e95165 100644
--- a/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.h
+++ b/chrome/browser/resource_coordinator/leveldb_site_characteristics_database.h
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/resource_coordinator/local_site_characteristics_database.h"
 #include "third_party/leveldatabase/src/include/leveldb/db.h"
 
diff --git a/chrome/browser/resource_coordinator/performance_measurement_manager_unittest.cc b/chrome/browser/resource_coordinator/performance_measurement_manager_unittest.cc
index 10872c6..ac26aa28a 100644
--- a/chrome/browser/resource_coordinator/performance_measurement_manager_unittest.cc
+++ b/chrome/browser/resource_coordinator/performance_measurement_manager_unittest.cc
@@ -18,7 +18,6 @@
 
 class LenientMockRenderProcessProbe : public RenderProcessProbe {
  public:
-  MOCK_METHOD0(StartGatherCycle, void());
   MOCK_METHOD0(StartSingleGather, void());
 };
 using MockRenderProcessProbe =
diff --git a/chrome/browser/resource_coordinator/render_process_probe.cc b/chrome/browser/resource_coordinator/render_process_probe.cc
index baf5d3d..d3dbc751 100644
--- a/chrome/browser/resource_coordinator/render_process_probe.cc
+++ b/chrome/browser/resource_coordinator/render_process_probe.cc
@@ -22,13 +22,6 @@
 
 namespace resource_coordinator {
 
-namespace {
-
-constexpr base::TimeDelta kDefaultMeasurementInterval =
-    base::TimeDelta::FromMinutes(10);
-
-}  // namespace
-
 constexpr base::TimeDelta RenderProcessProbeImpl::kUninitializedCPUTime;
 
 // static
@@ -42,49 +35,24 @@
   // Check that service_manager is active, GRC is enabled,
   // and render process CPU profiling is enabled.
   return content::ServiceManagerConnection::GetForProcess() != nullptr &&
-         resource_coordinator::IsResourceCoordinatorEnabled() &&
-         base::FeatureList::IsEnabled(features::kGRCRenderProcessCPUProfiling);
+         resource_coordinator::IsResourceCoordinatorEnabled();
 }
 
 RenderProcessProbeImpl::RenderProcessInfo::RenderProcessInfo() = default;
 
 RenderProcessProbeImpl::RenderProcessInfo::~RenderProcessInfo() = default;
 
-RenderProcessProbeImpl::RenderProcessProbeImpl()
-    : interval_(kDefaultMeasurementInterval) {
-  UpdateWithFieldTrialParams();
-}
+RenderProcessProbeImpl::RenderProcessProbeImpl() {}
 
 RenderProcessProbeImpl::~RenderProcessProbeImpl() = default;
 
-void RenderProcessProbeImpl::StartGatherCycle() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  // TODO(siggi): It irks me to have this bit of policy embedded here.
-  //     I feel this should be moved to the caller...
-  if (!RenderProcessProbeImpl::IsEnabled()) {
-    return;
-  }
-
-  DCHECK(!is_gather_cycle_started_);
-
-  is_gather_cycle_started_ = true;
-  if (!is_gathering_) {
-    timer_.Start(
-        FROM_HERE, base::TimeDelta(), this,
-        &RenderProcessProbeImpl::RegisterAliveRenderProcessesOnUIThread);
-  }
-}
-
 void RenderProcessProbeImpl::StartSingleGather() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (is_gathering_)
     return;
 
-  // If the gather cycle is started this measurement will go through early,
-  // and the interval between measurements will be shortened.
-  timer_.Start(FROM_HERE, base::TimeDelta(), this,
-               &RenderProcessProbeImpl::RegisterAliveRenderProcessesOnUIThread);
+  RegisterAliveRenderProcessesOnUIThread();
 }
 
 void RenderProcessProbeImpl::RegisterAliveRenderProcessesOnUIThread() {
@@ -230,28 +198,19 @@
   UMA_HISTOGRAM_TIMES("ResourceCoordinator.Measurement.Duration",
                       batch->batch_ended_time - batch->batch_started_time);
 
-  // TODO(siggi): UMA record measurement time.
-  bool should_restart = DispatchMetrics(std::move(batch));
   content::BrowserThread::PostTask(
       content::BrowserThread::UI, FROM_HERE,
       base::BindOnce(&RenderProcessProbeImpl::FinishCollectionOnUIThread,
-                     base::Unretained(this), should_restart));
+                     base::Unretained(this), std::move(batch)));
 }
 
-void RenderProcessProbeImpl::FinishCollectionOnUIThread(bool restart_cycle) {
+void RenderProcessProbeImpl::FinishCollectionOnUIThread(
+    mojom::ProcessResourceMeasurementBatchPtr batch) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(is_gathering_);
   is_gathering_ = false;
 
-  if (restart_cycle && is_gather_cycle_started_) {
-    timer_.Start(
-        FROM_HERE, interval_, this,
-        &RenderProcessProbeImpl::RegisterAliveRenderProcessesOnUIThread);
-  } else {
-    is_gather_cycle_started_ = false;
-  }
-
-  AfterFinishCollectionOnUIThread();
+  DispatchMetricsOnUIThread(std::move(batch));
 }
 
 void RenderProcessProbeImpl::RegisterRenderProcesses() {
@@ -302,14 +261,6 @@
   return info.process.Pid();
 }
 
-void RenderProcessProbeImpl::UpdateWithFieldTrialParams() {
-  int64_t interval_ms = GetGRCRenderProcessCPUProfilingIntervalInMs();
-
-  if (interval_ms > 0) {
-    interval_ = base::TimeDelta::FromMilliseconds(interval_ms);
-  }
-}
-
 SystemResourceCoordinator*
 RenderProcessProbeImpl::EnsureSystemResourceCoordinator() {
   if (!system_resource_coordinator_) {
@@ -324,16 +275,14 @@
   return system_resource_coordinator_.get();
 }
 
-bool RenderProcessProbeImpl::DispatchMetrics(
+void RenderProcessProbeImpl::DispatchMetricsOnUIThread(
     mojom::ProcessResourceMeasurementBatchPtr batch) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   SystemResourceCoordinator* system_resource_coordinator =
       EnsureSystemResourceCoordinator();
 
   if (system_resource_coordinator && !batch->measurements.empty())
     system_resource_coordinator->DistributeMeasurementBatch(std::move(batch));
-
-  return true;
 }
 
 }  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/render_process_probe.h b/chrome/browser/resource_coordinator/render_process_probe.h
index f2f89b8..5e5478f6 100644
--- a/chrome/browser/resource_coordinator/render_process_probe.h
+++ b/chrome/browser/resource_coordinator/render_process_probe.h
@@ -35,20 +35,13 @@
 
   virtual ~RenderProcessProbe() = default;
 
-  // Starts the automatic, timed process metrics collection cycle.
-  // Can only be invoked from the UI thread.
-  virtual void StartGatherCycle() = 0;
-
-  // Starts a single immediate collection cycle, if a cycle is not already
-  // in progress. If the timed gather cycle is running, this will preempt the
-  // next cycle and reset the metronome.
+  // Starts a single collection cycle if a cycle is not already in progress.
+  // If a cycle is already in progress, this method will simply return.
   virtual void StartSingleGather() = 0;
 };
 
 class RenderProcessProbeImpl : public RenderProcessProbe {
  public:
-  void StartGatherCycle() override;
-
   void StartSingleGather() override;
 
  protected:
@@ -91,45 +84,31 @@
       base::TimeTicks collection_start_time,
       bool success,
       std::unique_ptr<memory_instrumentation::GlobalMemoryDump> dump);
-  // (4) Initiate the next render process metrics collection cycle if the
-  // cycle has been started and |restart_cycle| is true, which consists of a
-  // delayed call to perform (1) via a timer.
-  void FinishCollectionOnUIThread(bool restart_cycle);
+  // (4) Finish the collection cycle on the UI thread.
+  void FinishCollectionOnUIThread(
+      mojom::ProcessResourceMeasurementBatchPtr batch);
 
   // Test seams.
-  virtual void AfterFinishCollectionOnUIThread() {}
   virtual void RegisterRenderProcesses();
   virtual void StartMemoryMeasurement(base::TimeTicks collection_start_time);
   virtual base::ProcessId GetProcessId(int host_id,
                                        const RenderProcessInfo& info);
 
-  // Allows FieldTrial parameters to override defaults.
-  void UpdateWithFieldTrialParams();
-
   SystemResourceCoordinator* EnsureSystemResourceCoordinator();
 
-  // Dispatch the collected metrics, return true if the cycle should restart.
+  // Dispatch the collected metrics.
   // Virtual for testing.
-  virtual bool DispatchMetrics(mojom::ProcessResourceMeasurementBatchPtr batch);
+  virtual void DispatchMetricsOnUIThread(
+      mojom::ProcessResourceMeasurementBatchPtr batch);
 
   // A map of currently running render process host IDs to process.
   // This map is accessed alternatively from the UI thread and the IO thread,
   // but only one of the two at a time.
   RenderProcessInfoMap render_process_info_map_;
 
-  // Time duration between measurements.
-  base::TimeDelta interval_;
-
-  // Timer to signal the |RenderProcessProbe| instance
-  // to conduct its measurements as a regular interval;
-  base::OneShotTimer timer_;
-
   // Number of measurements collected so far.
   size_t current_gather_cycle_ = 0u;
 
-  // True if StartGatherCycle has been called.
-  bool is_gather_cycle_started_ = false;
-
   // True while a gathering cycle is underways on a background thread.
   bool is_gathering_ = false;
 
diff --git a/chrome/browser/resource_coordinator/render_process_probe_browsertest.cc b/chrome/browser/resource_coordinator/render_process_probe_browsertest.cc
index 0bb7aaa..0ac473ed 100644
--- a/chrome/browser/resource_coordinator/render_process_probe_browsertest.cc
+++ b/chrome/browser/resource_coordinator/render_process_probe_browsertest.cc
@@ -34,14 +34,10 @@
   TestingRenderProcessProbe() = default;
   ~TestingRenderProcessProbe() override = default;
 
-  bool DispatchMetrics(
+  void DispatchMetricsOnUIThread(
       mojom::ProcessResourceMeasurementBatchPtr batch) override {
     last_measurement_batch_ = std::move(batch);
 
-    return false;
-  }
-
-  void AfterFinishCollectionOnUIThread() override {
     current_run_loop_->QuitWhenIdle();
   }
 
@@ -69,7 +65,6 @@
   }
 
   size_t current_gather_cycle() const { return current_gather_cycle_; }
-  bool is_gather_cycle_started() const { return is_gather_cycle_started_; }
 
   void WaitForGather() {
     base::RunLoop run_loop;
@@ -80,8 +75,8 @@
     current_run_loop_ = nullptr;
   }
 
-  void StartGatherCycleAndWait() {
-    StartGatherCycle();
+  void StartSingleGatherAndWait() {
+    StartSingleGather();
     WaitForGather();
   }
 
@@ -124,9 +119,7 @@
 #endif
   // Ensure that the |resource_coordinator| service is enabled.
   base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({features::kGlobalResourceCoordinator,
-                                 features::kGRCRenderProcessCPUProfiling},
-                                {});
+  feature_list.InitWithFeatures({features::kGlobalResourceCoordinator}, {});
 
   TestingRenderProcessProbe probe;
 
@@ -134,7 +127,7 @@
   EXPECT_EQ(0u, probe.current_gather_cycle());
 
   // A tab is already open when the test begins.
-  probe.StartGatherCycleAndWait();
+  probe.StartSingleGatherAndWait();
   EXPECT_EQ(1u, probe.current_gather_cycle());
   size_t initial_size = probe.render_process_info_map().size();
   EXPECT_LE(1u, initial_size);
@@ -164,7 +157,7 @@
       WindowOpenDisposition::NEW_FOREGROUND_TAB,
       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB |
           ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
-  probe.StartGatherCycleAndWait();
+  probe.StartSingleGatherAndWait();
   EXPECT_EQ(2u, probe.current_gather_cycle());
   EXPECT_EQ(initial_size + 1u, probe.render_process_info_map().size());
   EXPECT_EQ(initial_size + 1u,
@@ -181,7 +174,7 @@
   }
 
   size_t info_map_size = info_map.size();
-  probe.StartGatherCycleAndWait();
+  probe.StartSingleGatherAndWait();
   // Verify that CPU usage is monotonically increasing, though the measurement
   // granulatity is such on some OSes that a zero difference is almost certain.
   for (const auto& measurement : probe.last_measurement_batch()->measurements) {
@@ -207,53 +200,11 @@
                   ->GetMainFrame()
                   ->GetProcess()
                   ->FastShutdownIfPossible());
-  probe.StartGatherCycleAndWait();
+  probe.StartSingleGatherAndWait();
   EXPECT_EQ(4u, probe.current_gather_cycle());
   EXPECT_EQ(initial_size, probe.render_process_info_map().size());
   EXPECT_EQ(initial_size, probe.last_measurement_batch()->measurements.size());
   EXPECT_TRUE(probe.AllMeasurementsAreAtCurrentCycle());
 }
 
-IN_PROC_BROWSER_TEST_F(RenderProcessProbeBrowserTest, StartSingleGather) {
-  // Ensure that the |resource_coordinator| service is enabled.
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitWithFeatures({features::kGlobalResourceCoordinator,
-                                 features::kGRCRenderProcessCPUProfiling},
-                                {});
-
-  TestingRenderProcessProbe probe;
-
-  // Test the gather cycle state.
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  probe.StartGatherCycle();
-  EXPECT_TRUE(probe.is_gather_cycle_started());
-  probe.WaitForGather();
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  EXPECT_EQ(1u, probe.current_gather_cycle());
-
-  // Test a single gather while the gather cycle is disabled.
-  probe.StartSingleGather();
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  probe.WaitForGather();
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  EXPECT_EQ(2u, probe.current_gather_cycle());
-
-  // Test a single gather followed by starting the gather cycle.
-  probe.StartSingleGather();
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  probe.StartGatherCycle();
-  EXPECT_TRUE(probe.is_gather_cycle_started());
-  probe.WaitForGather();
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  EXPECT_EQ(3u, probe.current_gather_cycle());
-
-  // And now a single gather after the cycle is started.
-  probe.StartGatherCycle();
-  EXPECT_TRUE(probe.is_gather_cycle_started());
-  probe.StartSingleGather();
-  probe.WaitForGather();
-  EXPECT_FALSE(probe.is_gather_cycle_started());
-  EXPECT_EQ(4u, probe.current_gather_cycle());
-}
-
 }  // namespace resource_coordinator
diff --git a/chrome/browser/resource_coordinator/tab_memory_metrics_reporter_unittest.cc b/chrome/browser/resource_coordinator/tab_memory_metrics_reporter_unittest.cc
index 59d06f5..52652fc 100644
--- a/chrome/browser/resource_coordinator/tab_memory_metrics_reporter_unittest.cc
+++ b/chrome/browser/resource_coordinator/tab_memory_metrics_reporter_unittest.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/resource_coordinator/tab_memory_metrics_reporter.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/test/test_mock_time_task_runner.h"
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
index 5043a42..4d8d766 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/desktop_automation_handler.js
@@ -248,6 +248,14 @@
                    target, Dir.FORWARD, AutomationPredicate.object) ||
           target;
     }
+
+    while (target && !AutomationPredicate.object(target))
+      target = target.parent;
+
+
+    if (!target)
+      return;
+
     if (ChromeVoxState.instance.currentRange &&
         target == ChromeVoxState.instance.currentRange.start.node)
       return;
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
index 31fc466..ab21c9e 100644
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
@@ -573,6 +573,7 @@
           @describe_index($posInSet, $setSize)
           @describe_depth($hierarchicalLevel)`
     },
+    unknown: {speak: ``},
     window: {
       enter: `@describe_window($name)`,
       speak: `@describe_window($name) $earcon(OBJECT_OPEN)`
@@ -1766,10 +1767,16 @@
     var parentRole = (Output.ROLE_INFO_[node.role] || {}).inherits;
     var parentRoleBlock = eventBlock[parentRole || ''] || {};
 
-    var format =
-        roleBlock.speak || parentRoleBlock.speak || eventBlock['default'].speak;
-    if (this.formatOptions_.braille)
-      format = roleBlock.braille || parentRoleBlock.braille || format;
+    var format = roleBlock.speak !== undefined ?
+        roleBlock.speak :
+        parentRoleBlock.speak !== undefined ? parentRoleBlock.speak :
+                                              eventBlock['default'].speak;
+    if (this.formatOptions_.braille) {
+      format = roleBlock.braille !== undefined ?
+          roleBlock.braille :
+          parentRoleBlock.braille !== undefined ? parentRoleBlock.braille :
+                                                  format;
+    }
 
     this.format_(node, format, buff, prevNode);
 
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 9e19183..125d2aa 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_am.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">የሬዲዮ አዝራር ቡድን</translation>
 <translation id="2471138580042810658">ርዕስ 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{ኮከቢት}one{# ኮከቢቶች}other{# ኮከቢቶች}}</translation>
+<translation id="249330843868392562">የጽሑፍ-ወደ-ንግግር ቅንብሮችን ክፈት</translation>
 <translation id="2523609930580546572">ChromeVox አጋዥ ሥልጠና</translation>
 <translation id="2525706221823668172">የChromebook ቁልፍ ሰሌዳ አቋራጮች</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> ዳግም እንዲጀምር ተደርጓል።</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">ረጅም ማብራሪያ በአዲስ ትር ይክፈቱ</translation>
 <translation id="7248671827512403053">መተግበሪያ</translation>
 <translation id="725969808843520477">ቀጣይ የሬዲዮ አዝራር</translation>
+<translation id="7261612856573623172">የስርዓት ጽሑፍ-ወደ-ንግግር ድምጽ</translation>
 <translation id="7269119382257320590">ምንም ስርዓተ ነጥብ የለም</translation>
 <translation id="7273174640290488576">ባዶ</translation>
 <translation id="7274770952766771364">ማስታወሻ ማጣቀሻ</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 8ade484..3f3f62b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ar.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">مجموعة أزرار الاختيار</translation>
 <translation id="2471138580042810658">العنوان السادس</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{علامة نجمة واحدة}zero{# asterisks}two{علامتا نجمة (#)}few{# علامات نجمة}many{# علامة نجمة}other{# من علامات النجمة}}</translation>
+<translation id="249330843868392562">فتح إعدادات تحويل النص إلى كلام</translation>
 <translation id="2523609930580546572">‏برنامج ChromeVox التعليمي</translation>
 <translation id="2525706221823668172">‏اختصارات لوحة المفاتيح لـ Chromebook</translation>
 <translation id="2549392850788122959">تمت إعادة تعيين <ph name="KEY" />.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">فتح الوصف المطول في علامة تبويب جديدة</translation>
 <translation id="7248671827512403053">تطبيق</translation>
 <translation id="725969808843520477">زر الاختيار التالي</translation>
+<translation id="7261612856573623172">صوت تحويل النص إلى كلام في النظام</translation>
 <translation id="7269119382257320590">بدون علامات ترقيم</translation>
 <translation id="7273174640290488576">فارغ</translation>
 <translation id="7274770952766771364">ملاحظة مرجعية</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 5daee4e6..ec5b872 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_bg.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Група бутони за избор</translation>
 <translation id="2471138580042810658">Заглавие от шесто ниво</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{звездичка}other{# звездички}}</translation>
+<translation id="249330843868392562">Отваряне на настройките за синтезиран говор</translation>
 <translation id="2523609930580546572">Урок за ChromeVox</translation>
 <translation id="2525706221823668172">Клавишни комбинации на Chromebook</translation>
 <translation id="2549392850788122959">Върнахте се към първоначалната клавиатурна подредба „<ph name="KEY" />“.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Отваряне на дългото описание в нов раздел</translation>
 <translation id="7248671827512403053">Приложение</translation>
 <translation id="725969808843520477">Следващият бутон за избор</translation>
+<translation id="7261612856573623172">Системен глас за синтезиран говор</translation>
 <translation id="7269119382257320590">Без препинателни знаци</translation>
 <translation id="7273174640290488576">Празно</translation>
 <translation id="7274770952766771364">Препратка към бележка</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 962b7c07..a9ae309ce2 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ca.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Grup de botons d'opció</translation>
 <translation id="2471138580042810658">Capçalera 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisc}other{# asteriscos}}</translation>
+<translation id="249330843868392562">Obre la configuració de síntesi de veu</translation>
 <translation id="2523609930580546572">Tutorial de ChromeVox</translation>
 <translation id="2525706221823668172">Tecles de drecera de Chromebook</translation>
 <translation id="2549392850788122959">S'ha restablert <ph name="KEY" />.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Obre la descripció llarga en una pestanya nova.</translation>
 <translation id="7248671827512403053">Aplicació</translation>
 <translation id="725969808843520477">Botó d'opció següent</translation>
+<translation id="7261612856573623172">Veu del sistema síntesi de veu</translation>
 <translation id="7269119382257320590">Sense cap signe de puntuació.</translation>
 <translation id="7273174640290488576">En blanc</translation>
 <translation id="7274770952766771364">Referència de la nota</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 418872f..ce1597d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_da.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Gruppe af alternativknapper</translation>
 <translation id="2471138580042810658">Overskrift 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{stjerne}one{# stjerner}other{# stjerner}}</translation>
+<translation id="249330843868392562">Åbn indstillinger for oplæsning</translation>
 <translation id="2523609930580546572">ChromeVox-selvstudie</translation>
 <translation id="2525706221823668172">Tastaturgenveje på Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> er blevet nulstillet.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Åbn lang beskrivelse i en ny fane</translation>
 <translation id="7248671827512403053">Applikation</translation>
 <translation id="725969808843520477">Næste alternativknap</translation>
+<translation id="7261612856573623172">Systemstemme for oplæsning</translation>
 <translation id="7269119382257320590">Ingen tegnsætning</translation>
 <translation id="7273174640290488576">Tom</translation>
 <translation id="7274770952766771364">Reference i noter</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 a20ef77..df93c23b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_de.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Optionsfeldgruppe</translation>
 <translation id="2471138580042810658">Überschrift 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{Sternchen}other{# Sternchen}}</translation>
+<translation id="249330843868392562">Einstellungen für Sprachausgabe öffnen</translation>
 <translation id="2523609930580546572">ChromeVox-Anleitung</translation>
 <translation id="2525706221823668172">Tastenkombinationen auf Chromebooks</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> wurde zurückgesetzt.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Ausführliche Beschreibung in neuem Tab öffnen</translation>
 <translation id="7248671827512403053">App</translation>
 <translation id="725969808843520477">Nächstes Optionsfeld</translation>
+<translation id="7261612856573623172">Sprachausgabe-Stimme des Systems</translation>
 <translation id="7269119382257320590">Keine Satzzeichen</translation>
 <translation id="7273174640290488576">Leer</translation>
 <translation id="7274770952766771364">Hinweisreferenz</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 9fc01db..db67f90 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_el.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Ομάδα κουμπιών επιλογής</translation>
 <translation id="2471138580042810658">Επικεφαλίδα 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{αστερίσκος}other{# αστερίσκοι}}</translation>
+<translation id="249330843868392562">Άνοιγμα ρυθμίσεων μετατροπής κειμένου σε ομιλία</translation>
 <translation id="2523609930580546572">Οδηγός ChromeVox</translation>
 <translation id="2525706221823668172">Συντομεύσεις πληκτρολογίου Chromebook</translation>
 <translation id="2549392850788122959">Έγινε επαναφορά του πλήκτρου <ph name="KEY" />.</translation>
@@ -754,6 +755,7 @@
 <translation id="7241683698754534149">Άνοιγμα εκτενούς περιγραφής σε νέα καρτέλα</translation>
 <translation id="7248671827512403053">Εφαρμογή</translation>
 <translation id="725969808843520477">Επόμενο κουμπί επιλογής</translation>
+<translation id="7261612856573623172">Φωνή συστήματος μετατροπής κειμένου σε ομιλία</translation>
 <translation id="7269119382257320590">Χωρίς σημεία στίξης</translation>
 <translation id="7273174640290488576">Κενό</translation>
 <translation id="7274770952766771364">Παραπομπή</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 f96e447..74f2b2d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grupo de botones de opción</translation>
 <translation id="2471138580042810658">Título 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisco}other{# asteriscos}}</translation>
+<translation id="249330843868392562">Abrir configuración de la síntesis de voz</translation>
 <translation id="2523609930580546572">Tutorial de ChromeVox</translation>
 <translation id="2525706221823668172">Combinaciones de teclas de Chromebook</translation>
 <translation id="2549392850788122959">Se ha restablecido <ph name="KEY" />.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Abre descripción larga en una pestaña nueva</translation>
 <translation id="7248671827512403053">Aplicación</translation>
 <translation id="725969808843520477">Siguiente botón de opción</translation>
+<translation id="7261612856573623172">Nombre de la síntesis de voz del sistema</translation>
 <translation id="7269119382257320590">Ningún signo de puntuación</translation>
 <translation id="7273174640290488576">Línea vacía</translation>
 <translation id="7274770952766771364">Referencia de nota</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 471e5d4..2175852 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_et.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Raadionuppude rühm</translation>
 <translation id="2471138580042810658">6. pealkiri</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{tärn}other{# tärni}}</translation>
+<translation id="249330843868392562">Ava kõnesünteesi seaded</translation>
 <translation id="2523609930580546572">ChromeVoxi õpetused</translation>
 <translation id="2525706221823668172">Chromebooki klaviatuuri otseteed</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> on lähtestatud.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Avab pika kirjelduse uuel vahelehel</translation>
 <translation id="7248671827512403053">Rakendus</translation>
 <translation id="725969808843520477">Järgmine raadionupp</translation>
+<translation id="7261612856573623172">Süsteemi kõnesünteesi hääl</translation>
 <translation id="7269119382257320590">Kirjavahemärkideta</translation>
 <translation id="7273174640290488576">Tühi</translation>
 <translation id="7274770952766771364">Märkuse viide</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 e075b1a..d256242 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fa.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">گروه دکمه رادیویی</translation>
 <translation id="2471138580042810658">عنوان ۶</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{ستاره}one{# ستاره}other{# ستاره}}</translation>
+<translation id="249330843868392562">باز کردن تنظیمات نوشتار به گفتار</translation>
 <translation id="2523609930580546572">‏آموزش گام‌به‌گام ChromeVox</translation>
 <translation id="2525706221823668172">‏میان‌برهای صفحه‌کلید Chromebook</translation>
 <translation id="2549392850788122959">کلید <ph name="KEY" /> بازنشانی شد.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">باز کردن شرح طولانی در یک برگه جدید</translation>
 <translation id="7248671827512403053">برنامه کاربردی</translation>
 <translation id="725969808843520477">دکمه رادیویی بعدی</translation>
+<translation id="7261612856573623172">صدای سیستم نوشتار به گفتار</translation>
 <translation id="7269119382257320590">بدون علائم سجاوندی</translation>
 <translation id="7273174640290488576">خالی</translation>
 <translation id="7274770952766771364">مرجع یادداشت</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 b885e6be..162f3b4 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fi.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Valintanappiryhmä</translation>
 <translation id="2471138580042810658">Otsikko 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asteriski}other{# asteriskia}}</translation>
+<translation id="249330843868392562">Avaa Tekstistä puheeksi ‑asetukset</translation>
 <translation id="2523609930580546572">ChromeVox-opetusohjelma</translation>
 <translation id="2525706221823668172">Chromebookin pikanäppäimet</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> on nollattu.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Avaa pitkä kuvaus uudessa välilehdessä</translation>
 <translation id="7248671827512403053">Sovellus</translation>
 <translation id="725969808843520477">Seuraava valintanappi</translation>
+<translation id="7261612856573623172">Järjestelmän Tekstistä puheeksi ‑ääni</translation>
 <translation id="7269119382257320590">Ei välimerkkejä</translation>
 <translation id="7273174640290488576">Tyhjä</translation>
 <translation id="7274770952766771364">Muistiinpanoviittaus</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 e61dac8..e9f45fa3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Pangkat ng radio button</translation>
 <translation id="2471138580042810658">Heading 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisk}one{# asterisk}other{# na asterisk}}</translation>
+<translation id="249330843868392562">Buksan ang mga setting ng text-to-speech</translation>
 <translation id="2523609930580546572">Tutorial sa ChromeVox</translation>
 <translation id="2525706221823668172">Mga keyboard shortcut sa Chromebook</translation>
 <translation id="2549392850788122959">Na-reset ang <ph name="KEY" />.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Magbukas ng mahabang paglalarawan sa isang bagong tab</translation>
 <translation id="7248671827512403053">Application</translation>
 <translation id="725969808843520477">Susunod na radio button</translation>
+<translation id="7261612856573623172">Text-to-Speech voice ng system</translation>
 <translation id="7269119382257320590">Walang bantas</translation>
 <translation id="7273174640290488576">Blangko</translation>
 <translation id="7274770952766771364">Sanggunian sa tala</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 29d86098..3700cdc7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fr.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Groupe de cases d'option</translation>
 <translation id="2471138580042810658">Titre 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{astérisque}one{# astérisque}other{# astérisques}}</translation>
+<translation id="249330843868392562">Ouvrir les paramètres de synthèse vocale</translation>
 <translation id="2523609930580546572">Didacticiel ChromeVox</translation>
 <translation id="2525706221823668172">Raccourcis clavier dans Chromebook</translation>
 <translation id="2549392850788122959">Le mappage du clavier <ph name="KEY" /> a été réinitialisé.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Ouvrir les descriptions longues dans un nouvel onglet</translation>
 <translation id="7248671827512403053">Application</translation>
 <translation id="725969808843520477">Case d'option suivante</translation>
+<translation id="7261612856573623172">Voix de la synthèse vocale du système</translation>
 <translation id="7269119382257320590">Aucun signe de ponctuation</translation>
 <translation id="7273174640290488576">Vide</translation>
 <translation id="7274770952766771364">Référence de note</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 84bafc8e..9e0a0a9 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_gu.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">રેડિઓ બટન જૂથ</translation>
 <translation id="2471138580042810658">મથાળું 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{તારક ચિહ્ન}one{# તારક ચિહ્ન}other{# તારક ચિહ્ન}}</translation>
+<translation id="249330843868392562">ટેક્સ્ટ-ટૂ-સ્પીચ સેટિંગ ખોલો</translation>
 <translation id="2523609930580546572">ChromeVox ટયૂટૉરિઅલ</translation>
 <translation id="2525706221823668172">Chromebook કીબોર્ડ શૉર્ટકટ્સ</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> ને ફરીથી સેટ કરવામાં આવી છે.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">નવા ટેબમાં લાંબું વર્ણન ખોલો</translation>
 <translation id="7248671827512403053">ઍપ્લિકેશન</translation>
 <translation id="725969808843520477">આગલું રેડિયો બટન</translation>
+<translation id="7261612856573623172">સિસ્ટમ ટેક્સ્ટ-ટુ-સ્પીચ વૉઇસ</translation>
 <translation id="7269119382257320590">કોઈ વિરામચિહ્ન નથી</translation>
 <translation id="7273174640290488576">ખાલી</translation>
 <translation id="7274770952766771364">નોંધ સંદર્ભ</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 38ffa66c..7583bd40 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hi.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">रेडियो बटन समूह</translation>
 <translation id="2471138580042810658">शीर्षक 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{तारा चिह्न}one{# तारा चिह्न}other{# तारा चिह्न}}</translation>
+<translation id="249330843868392562">लिखाई को बोली में बदलने की सेटिंग खोलें</translation>
 <translation id="2523609930580546572">ChromeVox ट्यूटोरियल</translation>
 <translation id="2525706221823668172">Chromebook कीबोर्ड शॉर्टकट</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> को रीसेट कर दिया गया है.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">बड़ा विवरण नए टैब में खोलें</translation>
 <translation id="7248671827512403053">ऐप्स </translation>
 <translation id="725969808843520477">अगला रेडियो बटन</translation>
+<translation id="7261612856573623172">लिखाई को बोली में बदलने वाली सिस्टम की आवाज़</translation>
 <translation id="7269119382257320590">कोई विराम चिह्न नहीं</translation>
 <translation id="7273174640290488576">खाली</translation>
 <translation id="7274770952766771364">नोट संदर्भ</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 53bb1c0..24d54a51 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hr.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grupa izbornog gumba</translation>
 <translation id="2471138580042810658">Naslov 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{zvjezdica}one{# zvjezdica}few{# zvjezdice}other{# zvjezdica}}</translation>
+<translation id="249330843868392562">Otvori postavke pretvaranja teksta u govor</translation>
 <translation id="2523609930580546572">Vodič za ChromeVox</translation>
 <translation id="2525706221823668172">Tipkovni prečaci na Chromebooku</translation>
 <translation id="2549392850788122959">Tipka <ph name="KEY" /> poništena je.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Otvaranje dugačkih opisa u novoj kartici</translation>
 <translation id="7248671827512403053">Aplikacija</translation>
 <translation id="725969808843520477">Sljedeći izborni gumb</translation>
+<translation id="7261612856573623172">Glas sustava za pretvaranje teksta u govor</translation>
 <translation id="7269119382257320590">Bez interpunkcije</translation>
 <translation id="7273174640290488576">Prazno</translation>
 <translation id="7274770952766771364">Referenca bilješke</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 fe75c65d..efbac30 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_hu.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Választógombcsoport</translation>
 <translation id="2471138580042810658">6-os címsor</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{csillag}other{# csillag}}</translation>
+<translation id="249330843868392562">A szövegfelolvasóhoz tartozó beállítások megnyitása</translation>
 <translation id="2523609930580546572">ChromeVox-útmutató</translation>
 <translation id="2525706221823668172">Chromebook-billentyűparancsok</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> visszaállítva.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Hosszú leírás megnyitása új lapon</translation>
 <translation id="7248671827512403053">Alkalmazás</translation>
 <translation id="725969808843520477">Következő választógomb</translation>
+<translation id="7261612856573623172">Alapértelmezett szövegfelolvasó hang</translation>
 <translation id="7269119382257320590">Írásjelek mellőzése</translation>
 <translation id="7273174640290488576">Üres</translation>
 <translation id="7274770952766771364">Jegyzethivatkozás</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 5fc0279e..4a479280 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_id.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grup tombol radio</translation>
 <translation id="2471138580042810658">Judul 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{tanda bintang}other{# tanda bintang}}</translation>
+<translation id="249330843868392562">Buka setelan text-to-speech</translation>
 <translation id="2523609930580546572">Tutorial ChromeVox</translation>
 <translation id="2525706221823668172">Pintasan keyboard Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> telah disetel ulang.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Membuka deskripsi panjang di tab baru</translation>
 <translation id="7248671827512403053">Aplikasi</translation>
 <translation id="725969808843520477">Tombol radio berikutnya</translation>
+<translation id="7261612856573623172">Suara Text-to-Speech sistem</translation>
 <translation id="7269119382257320590">Tanpa tanda baca</translation>
 <translation id="7273174640290488576">Kosong</translation>
 <translation id="7274770952766771364">Referensi catatan</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 aa5612fc..c1ce0e66 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_it.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Gruppo pulsanti di opzione</translation>
 <translation id="2471138580042810658">Intestazione 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisco}other{# asterischi}}</translation>
+<translation id="249330843868392562">Apri impostazioni di sintesi vocale</translation>
 <translation id="2523609930580546572">Tutorial di ChromeVox</translation>
 <translation id="2525706221823668172">Scorciatoie da tastiera di Chromebook</translation>
 <translation id="2549392850788122959">Il tasto <ph name="KEY" /> è stato reimpostato.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Apri descrizione lunga in una nuova scheda</translation>
 <translation id="7248671827512403053">Applicazione</translation>
 <translation id="725969808843520477">Pulsante di opzione successivo</translation>
+<translation id="7261612856573623172">Voce del sistema per la sintesi vocale</translation>
 <translation id="7269119382257320590">Nessuna punteggiatura</translation>
 <translation id="7273174640290488576">Vuota</translation>
 <translation id="7274770952766771364">Riferimento note</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 80efecd2..16431d4e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_iw.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">קבוצת לחצני בחירה</translation>
 <translation id="2471138580042810658">כותרת 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{כוכבית}two{# סימני כוכבית}many{# סימני כוכבית}other{# סימני כוכבית}}</translation>
+<translation id="249330843868392562">פתיחת ההגדרות של המרת טקסט לדיבור</translation>
 <translation id="2523609930580546572">‏מדריך של ChromeVox</translation>
 <translation id="2525706221823668172">‏מקשי קיצור ב-Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> אופס.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">פתח תיאור ארוך בכרטיסייה חדשה</translation>
 <translation id="7248671827512403053">יישום</translation>
 <translation id="725969808843520477">לחצן הבחירה הבא</translation>
+<translation id="7261612856573623172">קול ברירת המחדל של המרת טקסט לדיבור</translation>
 <translation id="7269119382257320590">אין סימני פיסוק</translation>
 <translation id="7273174640290488576">ריקה</translation>
 <translation id="7274770952766771364">הפניה להערה</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 a7a43762..09ba896 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ja.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">ラジオボタン グループ</translation>
 <translation id="2471138580042810658">見出し 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{アスタリスク}other{# 個のアスタリスク}}</translation>
+<translation id="249330843868392562">テキスト読み上げの設定を開く</translation>
 <translation id="2523609930580546572">ChromeVox チュートリアル</translation>
 <translation id="2525706221823668172">Chromebook のキーボード ショートカット</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> がリセットされました。</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">長い説明を新しいタブで開きます</translation>
 <translation id="7248671827512403053">アプリケーション</translation>
 <translation id="725969808843520477">次のラジオボタン</translation>
+<translation id="7261612856573623172">システムのテキスト読み上げの音声</translation>
 <translation id="7269119382257320590">句読点を読み上げません</translation>
 <translation id="7273174640290488576">空白</translation>
 <translation id="7274770952766771364">備考</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 d28b886..f2c43b7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_kn.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">ರೇಡಿಯೊ ಬಟನ್ ಗುಂಪು</translation>
 <translation id="2471138580042810658">ಶೀರ್ಷಿಕೆ 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{ನಕ್ಷತ್ರ ಚಿಹ್ನೆ}one{# ನಕ್ಷತ್ರ ಚಿಹ್ನೆಗಳು}other{# ನಕ್ಷತ್ರ ಚಿಹ್ನೆಗಳು}}</translation>
+<translation id="249330843868392562">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="2523609930580546572">ChromeVox ಟ್ಯುಟೋರಿಯಲ್</translation>
 <translation id="2525706221823668172">Chromebook ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳು</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> ಅನ್ನು ಮರುಹೊಂದಿಸಲಾಗಿದೆ.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ದೀರ್ಘ ವಿವರಣೆಯನ್ನು ತೆರೆಯಿರಿ</translation>
 <translation id="7248671827512403053">ಅಪ್ಲಿಕೇಶನ್</translation>
 <translation id="725969808843520477">ಮುಂದಿನ ರೇಡಿಯೊ ಬಟನ್</translation>
+<translation id="7261612856573623172">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ವೈಶಿಷ್ಟ್ಯಕ್ಕಾಗಿ ಸಿಸ್ಟಂ ಧ್ವನಿ</translation>
 <translation id="7269119382257320590">ವಿರಾಮಚಿಹ್ನೆಗಳಿಲ್ಲ</translation>
 <translation id="7273174640290488576">ಖಾಲಿ</translation>
 <translation id="7274770952766771364">ಸೂಚನೆ ಉಲ್ಲೇಖ</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 fa335ab..9144509 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ko.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">라디오 버튼 그룹</translation>
 <translation id="2471138580042810658">제목 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{별표}other{별표 #개}}</translation>
+<translation id="249330843868392562">TTS(텍스트 음성 변환) 설정 열기</translation>
 <translation id="2523609930580546572">ChromeVox 가이드</translation>
 <translation id="2525706221823668172">Chromebook 단축키</translation>
 <translation id="2549392850788122959"><ph name="KEY" />이(가) 재설정되었습니다.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">새 탭에서 자세한 설명 열기</translation>
 <translation id="7248671827512403053">애플리케이션</translation>
 <translation id="725969808843520477">다음 라디오 버튼</translation>
+<translation id="7261612856573623172">시스템 TTS(텍스트 음성 변환) 음성</translation>
 <translation id="7269119382257320590">구두점을 읽지 않음</translation>
 <translation id="7273174640290488576">비어 있음</translation>
 <translation id="7274770952766771364">참고 자료</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 75257ed..38f8ef0b 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_lv.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Radiopogu grupa</translation>
 <translation id="2471138580042810658">6. līmeņa virsraksts</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{zvaigznīte}zero{# zvaigznīšu}one{# zvaigznīte}other{# zvaigznītes}}</translation>
+<translation id="249330843868392562">Atvērt teksta pārvēršanas runā iestatījumus</translation>
 <translation id="2523609930580546572">ChromeVox mācības</translation>
 <translation id="2525706221823668172">Īsinājumtaustiņi Chromebook datorā</translation>
 <translation id="2549392850788122959">Taustiņš <ph name="KEY" /> ir atiestatīts.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Atvērt garo aprakstu jaunā cilnē</translation>
 <translation id="7248671827512403053">Lietojumprogramma</translation>
 <translation id="725969808843520477">Nākamā radiopoga</translation>
+<translation id="7261612856573623172">Sistēmas Teksta pārvēršanas runā iestatījumi</translation>
 <translation id="7269119382257320590">Bez pieturzīmēm</translation>
 <translation id="7273174640290488576">Tukša</translation>
 <translation id="7274770952766771364">Vēres atsauce</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 bda036d..deee2bb 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">റേഡിയോ ബട്ടൺ ഗ്രൂപ്പ്</translation>
 <translation id="2471138580042810658">ശീർഷകം 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{നക്ഷത്രചിഹ്നം}other{# നക്ഷത്രചിഹ്നങ്ങൾ}}</translation>
+<translation id="249330843868392562">ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണം തുറക്കുക</translation>
 <translation id="2523609930580546572">ChromeVox ട്യൂട്ടോറിയൽ</translation>
 <translation id="2525706221823668172">Chromebook കീബോർഡ് കുറുക്കുവഴികൾ</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> പുനഃസജ്ജമാക്കി.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">ദൈർഘ്യമേറിയ വിവരണം പുതിയ ടാബിൽ തുറക്കുക</translation>
 <translation id="7248671827512403053">അപ്ലിക്കേഷന്‍</translation>
 <translation id="725969808843520477">അടുത്ത റേഡിയോ ബട്ടൺ</translation>
+<translation id="7261612856573623172">സിസ്‌റ്റം ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ശബ്‌ദം</translation>
 <translation id="7269119382257320590">ചിഹ്നനങ്ങളൊന്നുമില്ല</translation>
 <translation id="7273174640290488576">ശൂന്യം</translation>
 <translation id="7274770952766771364">കുറിപ്പ് റെഫറൻസ്</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 936b2bfd..6af129d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ms.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Kumpulan butang radio</translation>
 <translation id="2471138580042810658">Tajuk 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisk}other{# asterisk}}</translation>
+<translation id="249330843868392562">Buka tetapan teks ke pertuturan</translation>
 <translation id="2523609930580546572">Tutorial ChromeVox</translation>
 <translation id="2525706221823668172">Pintasan papan kekunci Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> telah ditetapkan semula.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Buka huraian panjang dalam tab baharu</translation>
 <translation id="7248671827512403053">Aplikasi</translation>
 <translation id="725969808843520477">Butang radio seterusnya</translation>
+<translation id="7261612856573623172">Suara Teks ke Pertuturan Sistem</translation>
 <translation id="7269119382257320590">Tiada tanda baca</translation>
 <translation id="7273174640290488576">Kosong</translation>
 <translation id="7274770952766771364">Rujukan nota</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 d5ee52d..23989606 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_nl.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Groep met keuzerondjes</translation>
 <translation id="2471138580042810658">Kop 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{sterretje}other{# sterretjes}}</translation>
+<translation id="249330843868392562">Tekst-naar-spraak-instellingen openen</translation>
 <translation id="2523609930580546572">ChromeVox-handleiding</translation>
 <translation id="2525706221823668172">Sneltoetsen op de Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> is opnieuw ingesteld.</translation>
@@ -751,6 +752,7 @@
 <translation id="7241683698754534149">Lange beschrijving openen op een nieuw tabblad</translation>
 <translation id="7248671827512403053">Applicatie</translation>
 <translation id="725969808843520477">Volgend keuzerondje</translation>
+<translation id="7261612856573623172">Systeemstem voor tekst-naar-spraak</translation>
 <translation id="7269119382257320590">Geen interpunctie</translation>
 <translation id="7273174640290488576">Leeg</translation>
 <translation id="7274770952766771364">Opmerkingsreferentie</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 718114d2..0eb69b6d 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Gruppe med alternativknapper</translation>
 <translation id="2471138580042810658">Overskrift 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisk}other{# asterisker}}</translation>
+<translation id="249330843868392562">Åpne innstillinger for tekst til tale</translation>
 <translation id="2523609930580546572">ChromeVox-veiledning</translation>
 <translation id="2525706221823668172">Hurtigtaster på Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> er tilbakestilt.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Åpne lange beskrivelser i en ny fane</translation>
 <translation id="7248671827512403053">App</translation>
 <translation id="725969808843520477">Neste alternativknapp</translation>
+<translation id="7261612856573623172">System teskt til tale stemme</translation>
 <translation id="7269119382257320590">Ingen tegnsetting</translation>
 <translation id="7273174640290488576">Tom</translation>
 <translation id="7274770952766771364">Kommentarreferanse</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 ab1ff330..b296bb3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_pl.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grupa przycisków radiowych</translation>
 <translation id="2471138580042810658">Nagłówek 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{gwiazdka}few{# znaki gwiazdki}many{# znaków gwiazdki}other{# asterisks}}</translation>
+<translation id="249330843868392562">Otwórz ustawienia zamiany tekstu na mowę</translation>
 <translation id="2523609930580546572">Samouczek ChromeVox</translation>
 <translation id="2525706221823668172">Skróty klawiszowe na Chromebooku</translation>
 <translation id="2549392850788122959">Klawisz <ph name="KEY" /> został zresetowany.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Otwórz długi opis na nowej karcie</translation>
 <translation id="7248671827512403053">Aplikacja</translation>
 <translation id="725969808843520477">Następny przycisk opcji</translation>
+<translation id="7261612856573623172">Systemowy głos zamiany tekstu na mowę</translation>
 <translation id="7269119382257320590">Bez interpunkcji</translation>
 <translation id="7273174640290488576">Pusty</translation>
 <translation id="7274770952766771364">Odsyłacz</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 c9f6b412..8a79353a 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
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grupo de botões de opção</translation>
 <translation id="2471138580042810658">Cabeçalho 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisco}one{# asteriscos}other{# asteriscos}}</translation>
+<translation id="249330843868392562">Abrir configurações de conversão de texto em voz</translation>
 <translation id="2523609930580546572">Tutorial do ChromeVox</translation>
 <translation id="2525706221823668172">Atalhos do teclado do Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> foi redefinido.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Abrir descrição longa em uma nova página</translation>
 <translation id="7248671827512403053">Aplicativo</translation>
 <translation id="725969808843520477">Próximo botão de opção</translation>
+<translation id="7261612856573623172">Voz do sistema da conversão de texto em voz</translation>
 <translation id="7269119382257320590">Sem pontuação</translation>
 <translation id="7273174640290488576">Em branco</translation>
 <translation id="7274770952766771364">Referência de nota</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 36067e9..d12c7b5 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
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grupo de botões de opção</translation>
 <translation id="2471138580042810658">Título 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisco}other{# asteriscos}}</translation>
+<translation id="249330843868392562">Abrir definições da síntese de voz</translation>
 <translation id="2523609930580546572">Tutorial do ChromeVox</translation>
 <translation id="2525706221823668172">Atalhos de teclado do Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> foi reposto.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Abrir descrição longa num novo separador</translation>
 <translation id="7248671827512403053">Aplicação</translation>
 <translation id="725969808843520477">Botão de opção seguinte</translation>
+<translation id="7261612856573623172">Voz da síntese de voz do sistema</translation>
 <translation id="7269119382257320590">Sem pontuação</translation>
 <translation id="7273174640290488576">Em branco</translation>
 <translation id="7274770952766771364">Referência de nota</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 0301202..e315162 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ro.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Grup buton radio</translation>
 <translation id="2471138580042810658">Titlu 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisc}few{# asteriscuri}other{# de asteriscuri}}</translation>
+<translation id="249330843868392562">Deschide setările redării vocale a textului</translation>
 <translation id="2523609930580546572">Tutorial ChromeVox</translation>
 <translation id="2525706221823668172">Comenzile rapide de la tastatură pentru Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> a fost resetată.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Deschideți descrierea lungă într-o filă nouă</translation>
 <translation id="7248671827512403053">Aplicație</translation>
 <translation id="725969808843520477">Butonul radio următor</translation>
+<translation id="7261612856573623172">Vocea sistemului de redare vocală a textului</translation>
 <translation id="7269119382257320590">Niciun semn de punctuație</translation>
 <translation id="7273174640290488576">Necompletată</translation>
 <translation id="7274770952766771364">Trimitere la notă</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 28704140..68e5c83 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Группа переключателей</translation>
 <translation id="2471138580042810658">Заголовок шестого уровня.</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{звездочка}one{# звездочка}few{# звездочки}many{# звездочек}other{# asterisks}}</translation>
+<translation id="249330843868392562">Открыть настройки озвучивания текста</translation>
 <translation id="2523609930580546572">Руководство по ChromeVox</translation>
 <translation id="2525706221823668172">Быстрые клавиши Chromebook</translation>
 <translation id="2549392850788122959">Сброс до состояния по умолчанию для клавиши <ph name="KEY" /> выполнен.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Открыть подробное описание в новой вкладке</translation>
 <translation id="7248671827512403053">Приложение</translation>
 <translation id="725969808843520477">Перейти к следующему переключателю</translation>
+<translation id="7261612856573623172">Голос для озвучивания текста по умолчанию</translation>
 <translation id="7269119382257320590">Без знаков препинания.</translation>
 <translation id="7273174640290488576">Пусто</translation>
 <translation id="7274770952766771364">Ссылка на примечание</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 cbf6177..02e7af3 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sl.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Skupina izbirnih gumbov</translation>
 <translation id="2471138580042810658">Naslov 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{zvezdica}one{# zvezdica}two{# zvezdici}few{# zvezdice}other{# zvezdic}}</translation>
+<translation id="249330843868392562">Odpri nastavitve pretvorbe besedila v govor</translation>
 <translation id="2523609930580546572">Vadnica za ChromeVox</translation>
 <translation id="2525706221823668172">Bližnjične tipke za Chromebook</translation>
 <translation id="2549392850788122959">Tipka <ph name="KEY" /> je ponastavljena.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Odpiranje dolgega opisa na novem zavihku</translation>
 <translation id="7248671827512403053">Aplikacija</translation>
 <translation id="725969808843520477">Naslednji izbirni gumb</translation>
+<translation id="7261612856573623172">Sistemski glas pretvorbe besedila v govor</translation>
 <translation id="7269119382257320590">Ni ločil</translation>
 <translation id="7273174640290488576">Prazno</translation>
 <translation id="7274770952766771364">Sklicevanje na opombo</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 6d533e00..eae8f2a 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sr.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Група дугмади за избор</translation>
 <translation id="2471138580042810658">Заглавље 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{звездица}one{# звездица}few{# звездице}other{# звездица}}</translation>
+<translation id="249330843868392562">Отвори подешавања претварања текста у говор</translation>
 <translation id="2523609930580546572">Водич за ChromeVox</translation>
 <translation id="2525706221823668172">Тастерске пречице за Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> је ресетован.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Отварање дугог описа на новој картици</translation>
 <translation id="7248671827512403053">Апликација</translation>
 <translation id="725969808843520477">Следеће дугме за избор</translation>
+<translation id="7261612856573623172">Системски глас за претварање текста у говор</translation>
 <translation id="7269119382257320590">Без интерпункције</translation>
 <translation id="7273174640290488576">Празно</translation>
 <translation id="7274770952766771364">Референца напомене</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 84ae67b..bed1442 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sv.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Alternativknappsgrupp</translation>
 <translation id="2471138580042810658">Rubrik 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{asterisk}other{# asterisker}}</translation>
+<translation id="249330843868392562">Öppna inställningarna för text till tal</translation>
 <translation id="2523609930580546572">Självstudier för ChromeVox</translation>
 <translation id="2525706221823668172">Chromebook-kortkommandon</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> har återställts.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Öppna lång beskrivning på ny flik</translation>
 <translation id="7248671827512403053">Program</translation>
 <translation id="725969808843520477">Nästa alternativknapp</translation>
+<translation id="7261612856573623172">Systemets röst för text till tal</translation>
 <translation id="7269119382257320590">Inga skiljetecken</translation>
 <translation id="7273174640290488576">Tom</translation>
 <translation id="7274770952766771364">Referensnot</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 8899cab..772b0446 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_sw.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Vitufe kadhaa vya mviringo</translation>
 <translation id="2471138580042810658">Kichwa 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{nyota}other{nyota #}}</translation>
+<translation id="249330843868392562">Fungua mipangilio ya ubadilishaji wa maandishi kwenda usemi</translation>
 <translation id="2523609930580546572">Mafunzo ya ChromeVox</translation>
 <translation id="2525706221823668172">Njia ya mikato ya kibodi kwenye Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> imewekwa upya.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Fungua maelezo marefu katika kichupo kipya</translation>
 <translation id="7248671827512403053">Programu</translation>
 <translation id="725969808843520477">Kitufe cha mviringo kinachofuata</translation>
+<translation id="7261612856573623172">Sauti ya mfumo wa Ubadilishaji wa Maandishi kwenda Usemi</translation>
 <translation id="7269119382257320590">Hakuna vituo  vya maandishi</translation>
 <translation id="7273174640290488576">Mtupu</translation>
 <translation id="7274770952766771364">Marejeleo ya dokezo</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 f65dee1d..390f4f8e 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">ரேடியோ பொத்தான் குழு</translation>
 <translation id="2471138580042810658">தலைப்பு 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{உடுக்குறி}other{# உடுக்குறிகள்}}</translation>
+<translation id="249330843868392562">‘உரையிலிருந்து பேச்சு’ அமைப்புகளைத் திற</translation>
 <translation id="2523609930580546572">ChromeVox பயிற்சி</translation>
 <translation id="2525706221823668172">Chromebook விசைப்பலகைக் குறுக்குவழிகள்</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> மீட்டமைக்கப்பட்டுள்ளது.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">நீண்ட விளக்கத்தைப் புதிய தாவலில் திறக்கவும்</translation>
 <translation id="7248671827512403053">பயன்பாடு</translation>
 <translation id="725969808843520477">அடுத்த ரேடியோ பொத்தான்</translation>
+<translation id="7261612856573623172">சாதனத்தின் இயல்பு ‘உரையிலிருந்து பேச்சுக்கான' குரல்</translation>
 <translation id="7269119382257320590">நிறுத்தற்குறி இல்லை</translation>
 <translation id="7273174640290488576">வெற்று</translation>
 <translation id="7274770952766771364">குறிப்பு மேற்கோள்</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 248f01b..bd351c7 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_th.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">กลุ่มปุ่มตัวเลือก</translation>
 <translation id="2471138580042810658">ส่วนหัวระดับ 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{เครื่องหมายดอกจัน}other{# เครื่องหมายดอกจัน}}</translation>
+<translation id="249330843868392562">เปิดการตั้งค่าการอ่านออกเสียงข้อความ</translation>
 <translation id="2523609930580546572">บทแนะนำ ChromeVox</translation>
 <translation id="2525706221823668172">แป้นพิม์ลัด Chromebook</translation>
 <translation id="2549392850788122959">รีเซ็ต <ph name="KEY" /> แล้ว</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">เปิดคำอธิบายแบบยาวในแท็บใหม่</translation>
 <translation id="7248671827512403053">แอปพลิเคชัน</translation>
 <translation id="725969808843520477">ปุ่มตัวเลือกถัดไป</translation>
+<translation id="7261612856573623172">เสียงการอ่านออกเสียงข้อความของระบบ</translation>
 <translation id="7269119382257320590">ไม่มีเครื่องหมายวรรคตอน</translation>
 <translation id="7273174640290488576">ว่าง</translation>
 <translation id="7274770952766771364">ข้อมูลอ้างอิงหมายเหตุ</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 16a3320..0d745625 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_tr.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Radyo düğmesi grubu</translation>
 <translation id="2471138580042810658">Başlık 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{yıldız işareti}other{# yıldız işareti}}</translation>
+<translation id="249330843868392562">Metin okuma ayarlarını aç</translation>
 <translation id="2523609930580546572">ChromeVox Eğiticisi</translation>
 <translation id="2525706221823668172">Chromebook klavye kısayolları</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> sıfırlandı.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Uzun açıklamayı yeni sekmede aç</translation>
 <translation id="7248671827512403053">Uygulama</translation>
 <translation id="725969808843520477">Sonraki radyo düğmesi</translation>
+<translation id="7261612856573623172">Sistem Metin Okuma sesi</translation>
 <translation id="7269119382257320590">Noktalama işareti yok</translation>
 <translation id="7273174640290488576">Boş</translation>
 <translation id="7274770952766771364">Not referansı</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 2d0e30d..f7da537 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_uk.xtb
@@ -155,6 +155,7 @@
 <translation id="2462626033734746142">Група перемикачів</translation>
 <translation id="2471138580042810658">Заголовок 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{зірочка}one{# зірочка}few{# зірочки}many{# зірочок}other{# asterisks}}</translation>
+<translation id="249330843868392562">Відкрити налаштування синтезу мовлення</translation>
 <translation id="2523609930580546572">Навчальний посібник ChromeVox</translation>
 <translation id="2525706221823668172">Комбінації клавіш Chromebook</translation>
 <translation id="2549392850788122959">Налаштування клавіші <ph name="KEY" /> скинуто.</translation>
@@ -752,6 +753,7 @@
 <translation id="7241683698754534149">Відкрити докладний опис у новій вкладці</translation>
 <translation id="7248671827512403053">Додаток</translation>
 <translation id="725969808843520477">Наступний перемикач</translation>
+<translation id="7261612856573623172">Системний голос для синтезу мовлення</translation>
 <translation id="7269119382257320590">Без розділових знаків</translation>
 <translation id="7273174640290488576">Порожньо</translation>
 <translation id="7274770952766771364">Посилання на примітку</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 b70bdd38..ee2189a19 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_vi.xtb
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">Nhóm nút radio</translation>
 <translation id="2471138580042810658">Tiêu đề 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{dấu hoa thị}other{# dấu hoa thị}}</translation>
+<translation id="249330843868392562">Mở tùy chọn cài đặt chuyển văn bản sang lời nói</translation>
 <translation id="2523609930580546572">Hướng dẫn về ChromeVox</translation>
 <translation id="2525706221823668172">Phím tắt Chromebook</translation>
 <translation id="2549392850788122959"><ph name="KEY" /> đã được đặt lại.</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">Mở mô tả dài trong tab mới</translation>
 <translation id="7248671827512403053">Ứng dụng</translation>
 <translation id="725969808843520477">Nút radio tiếp theo</translation>
+<translation id="7261612856573623172">Giọng nói của tính năng chuyển văn bản sang lời nói trong hệ thống</translation>
 <translation id="7269119382257320590">Không có dấu câu</translation>
 <translation id="7273174640290488576">Trống</translation>
 <translation id="7274770952766771364">Tham chiếu chú thích</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 8f9cc2fc..cbbab816 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
@@ -156,6 +156,7 @@
 <translation id="2462626033734746142">圓形按鈕群組</translation>
 <translation id="2471138580042810658">標題 6</translation>
 <translation id="248982282205370495">{COUNT,plural, =1{星號}other{# 個星號}}</translation>
+<translation id="249330843868392562">開啟文字轉語音設定</translation>
 <translation id="2523609930580546572">ChromeVox 教學課程</translation>
 <translation id="2525706221823668172">Chromebook 鍵盤快速鍵</translation>
 <translation id="2549392850788122959">「<ph name="KEY" />」已重設。</translation>
@@ -753,6 +754,7 @@
 <translation id="7241683698754534149">在新分頁中開啟詳細說明</translation>
 <translation id="7248671827512403053">應用程式</translation>
 <translation id="725969808843520477">下一個圓形按鈕</translation>
+<translation id="7261612856573623172">系統預設文字轉語音聲音</translation>
 <translation id="7269119382257320590">無標點符號</translation>
 <translation id="7273174640290488576">空白行</translation>
 <translation id="7274770952766771364">附註參考資料</translation>
diff --git a/chrome/browser/resources/chromeos/login/demo_setup.html b/chrome/browser/resources/chromeos/login/demo_setup.html
index 5eaa914..fab9a8e 100644
--- a/chrome/browser/resources/chromeos/login/demo_setup.html
+++ b/chrome/browser/resources/chromeos/login/demo_setup.html
@@ -27,29 +27,6 @@
     <link rel="stylesheet" href="demo_setup.css">
     <link rel="stylesheet" href="oobe_flex_layout.css">
 
-    <oobe-dialog id="demoSetupSettingsDialog" role="dialog" has-buttons>
-      <h1 slot="title">Choose demo mode settings</h1>
-      <div slot="footer" class="flex layout vertical">
-        <paper-radio-group id="setupGroup"
-            selectable="cr-radio-button" selected="onlineSetup">
-          <cr-radio-button name="onlineSetup"
-              class="options-list-item flex layout horizontal center">
-            <div>Online setup</div>
-          </cr-radio-button>
-          <template is="dom-if" if="[[offlineDemoModeEnabled_]]">
-            <cr-radio-button name="offlineSetup"
-                class="options-list-item flex layout horizontal center">
-              <div>Offline setup</div>
-            </cr-radio-button>
-          </template>
-        </paper-radio-group>
-      </div>
-      <div slot="bottom-buttons" class="layout horizontal justified">
-        <oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
-        <oobe-next-button inverse on-tap="onNextClicked_"></oobe-next-button>
-      </div>
-    </oobe-dialog>
-
     <oobe-dialog id="demoSetupProgressDialog" role="dialog" has-buttons hidden>
       <hd-iron-icon slot="oobe-icon"
           icon1x="demo-setup-32:computer" icon2x="demo-setup-64:computer">
@@ -77,7 +54,7 @@
       </div>
       <div slot="bottom-buttons" class="layout horizontal justified">
         <oobe-back-button inverse on-tap="onCloseClicked_"></oobe-back-button>
-        <oobe-text-button inverse on-tap="startSetup_">
+        <oobe-text-button inverse on-tap="onRetryClicked_">
           <div>
             [[i18nDynamic(locale, 'demoSetupErrorScreenRetryButtonLabel')]]
           </div>
diff --git a/chrome/browser/resources/chromeos/login/demo_setup.js b/chrome/browser/resources/chromeos/login/demo_setup.js
index 3ac6c04..224580f5 100644
--- a/chrome/browser/resources/chromeos/login/demo_setup.js
+++ b/chrome/browser/resources/chromeos/login/demo_setup.js
@@ -13,40 +13,20 @@
   behaviors: [I18nBehavior, OobeDialogHostBehavior],
 
   properties: {
-    /**
-     * Whether offline demo mode is enabled. If it is disabled offline setup
-     * option will not be shown in UI.
-     */
-    offlineDemoModeEnabled_: {
-      type: Boolean,
-      value: false,
-    },
-
-    /**
-     * Whether offline demo setup was selected. Available setup types: online
-     * and offline.
-     */
-    isOfflineSetup_: {
-      type: Boolean,
-      value: false,
-    },
-
     /** Ordered array of screen ids that are a part of demo setup flow. */
     screens_: {
       type: Array,
       readonly: true,
       value: function() {
-        return [
-          'demoSetupSettingsDialog', 'demoSetupProgressDialog',
-          'demoSetupErrorDialog'
-        ];
+        return ['demoSetupProgressDialog', 'demoSetupErrorDialog'];
       },
     },
   },
 
-  /** Resets demo setup flow to the initial screen. */
+  /** Resets demo setup flow to the initial screen and starts setup. */
   reset: function() {
-    this.showScreen_(this.screens_[0]);
+    this.showScreen_('demoSetupProgressDialog');
+    chrome.send('login.DemoSetupScreen.userActed', ['start-setup']);
   },
 
   /** Called after resources are updated. */
@@ -75,19 +55,6 @@
   },
 
   /**
-   * Shows progress dialog and starts demo setup.
-   * @private
-   */
-  startSetup_: function() {
-    this.showScreen_('demoSetupProgressDialog');
-    if (this.isOfflineSetup_) {
-      chrome.send('login.DemoSetupScreen.userActed', ['offline-setup']);
-    } else {
-      chrome.send('login.DemoSetupScreen.userActed', ['online-setup']);
-    }
-  },
-
-  /**
    * Shows screen with the given id.
    * @param {string} id Screen id.
    * @private
@@ -114,21 +81,11 @@
   },
 
   /**
-   * Next button click handler.
-   * @private
-   */
-  onNextClicked_: function() {
-    const selected = this.$.setupGroup.selected;
-    this.isOfflineSetup_ = (selected == 'offlineSetup');
-    this.startSetup_();
-  },
-
-  /**
    * Retry button click handler.
    * @private
    */
   onRetryClicked_: function() {
-    this.startSetup_();
+    this.reset();
   },
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js b/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js
index 360b5e70f..28498dc 100644
--- a/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js
+++ b/chrome/browser/resources/chromeos/login/oobe_screen_demo_setup.js
@@ -10,26 +10,31 @@
   return {
     EXTERNAL_API: ['onSetupFinished'],
 
+    /**
+     * Demo setup module.
+     * @private
+     */
+    demoSetupModule_: null,
+
+
     /** @override */
     decorate: function() {
-      var demoSetupScreen = $('demo-setup-content');
-      demoSetupScreen.offlineDemoModeEnabled_ =
-          loadTimeData.getValue('offlineDemoModeEnabled');
+      this.demoSetupModule_ = $('demo-setup-content');
     },
 
     /** Returns a control which should receive an initial focus. */
     get defaultControl() {
-      return $('demo-setup-content');
+      return this.demoSetupModule_;
     },
 
     /** Called after resources are updated. */
     updateLocalizedContent: function() {
-      $('demo-setup-content').updateLocalizedContent();
+      this.demoSetupModule_.updateLocalizedContent();
     },
 
     /** @override */
-    onBeforeShow: function(data) {
-      $('demo-setup-content').reset();
+    onBeforeShow: function() {
+      this.demoSetupModule_.reset();
     },
 
     /**
@@ -39,7 +44,7 @@
      *  populated if setup finished with an error.
      */
     onSetupFinished: function(isSuccess, message) {
-      $('demo-setup-content').onSetupFinished(isSuccess, message);
+      this.demoSetupModule_.onSetupFinished(isSuccess, message);
     },
   };
 });
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_am.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_am.xtb
index 0af3ab6..284b142 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_am.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
+<translation id="111880247472081232">የእርስዎ ለመናገር-ይምረጡ የጽሑፍ-ወደ-ንግግር ቅንብሮች ወደ ሁለገቡ የጽሑፍ-ወደ-ንግግር ቅንብሮች ተሸጋግሯል።</translation>
 <translation id="1197088940767939838">ብርቱካናማ</translation>
+<translation id="1273314450961659276">የጽሑፍ ወደ ንግግር ቅንብሮች</translation>
+<translation id="1498542103351704084">የለመናገር-ይምረጡ ቅንብሮች ተዘምነዋል</translation>
 <translation id="1555130319947370107">ሰማያዊ</translation>
 <translation id="1666326070478924810">ለመናገር ቅንብሮችን ይምረጡ</translation>
 <translation id="1966649499058910679">እያንዳንዱ ቃል ሲነገር ማድመቅ</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">ጨለማ ጀርባ</translation>
 <translation id="27349076983469322">ፈዛዝ ያለ ጀርባ</translation>
 <translation id="335581015389089642">ንግግር</translation>
+<translation id="3784184786832188702">አሁን ለመናገር ይምረጡ ሁለገብ የጽሑፍ-ወደ-ንግግር ቅንብሮችን ነው የሚጠቀመው።</translation>
 <translation id="5901630391730855834">ቢጫ</translation>
 <translation id="6017514345406065928">አረንጓዴ</translation>
 <translation id="6475604559827479857">የቃል ድምቀቶች ቀለም፦</translation>
 <translation id="6837853484260746864">ድምፅ ይምረጡ፦</translation>
+<translation id="7261612856573623172">የስርዓት ጽሑፍ-ወደ-ንግግር ድምጽ</translation>
 <translation id="7768784765476638775">ለመናገር-ይምረጡ</translation>
 <translation id="7914870167134465181">ማድመቅ</translation>
+<translation id="8324974933005349667">የጽሑፍ-ወደ-ንግግር ቅንብሮችን ግላዊነት አላብስ</translation>
 <translation id="992256792861109788">ሮዝ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb
index d291e4b..774477b 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ar.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
+<translation id="111880247472081232">تم ترحيل إعداداتك لتحويل النص إلى كلام لخدمة سماع الاختيار إلى الإعدادات العامة لتحويل النص إلى كلام.</translation>
 <translation id="1197088940767939838">برتقالي</translation>
+<translation id="1273314450961659276">إعدادات تحويل النص إلى كلام</translation>
+<translation id="1498542103351704084">تم تحديث إعدادات الكلام لخدمة سماع الاختيار</translation>
 <translation id="1555130319947370107">أزرق</translation>
 <translation id="1666326070478924810">إعدادات "سماع الاختيار"</translation>
 <translation id="1966649499058910679">تحديد كل كلمة أثناء نطقها</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">خلفية معتمة</translation>
 <translation id="27349076983469322">خلفية فاتحة</translation>
 <translation id="335581015389089642">الحديث</translation>
+<translation id="3784184786832188702">تستخدم الآن خدمة سماع الاختيار الإعدادات العامة لتحويل النص إلى كلام.</translation>
 <translation id="5901630391730855834">أصفر</translation>
 <translation id="6017514345406065928">أخضر</translation>
 <translation id="6475604559827479857">لون لتمييز الكلمة:</translation>
 <translation id="6837853484260746864">تحديد صوت:</translation>
+<translation id="7261612856573623172">صوت تحويل النص إلى كلام في النظام</translation>
 <translation id="7768784765476638775">سماع الاختيار</translation>
 <translation id="7914870167134465181">التمييز</translation>
+<translation id="8324974933005349667">تخصيص إعدادات تحويل النص إلى كلام</translation>
 <translation id="992256792861109788">وردي</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_bg.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_bg.xtb
index 8bb89309..0a9e914 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_bg.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
+<translation id="111880247472081232">Настройките ви за синтезиран говор за функцията Прочитане на глас бяха зададени и като глобални настройки за синтезиран говор.</translation>
 <translation id="1197088940767939838">оранжево</translation>
+<translation id="1273314450961659276">Настройки за синтезиран говор</translation>
+<translation id="1498542103351704084">Настройките за говора за функцията Прочитане на глас са актуализирани</translation>
 <translation id="1555130319947370107">синьо</translation>
 <translation id="1666326070478924810">Настройки на функцията Прочитане на глас</translation>
 <translation id="1966649499058910679">Открояване на всяка дума, докато се изговаря</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Тъмен фон</translation>
 <translation id="27349076983469322">Светъл фон</translation>
 <translation id="335581015389089642">Speech</translation>
+<translation id="3784184786832188702">За функцията Прочитане на глас вече се използват глобалните настройки за синтезиран говор.</translation>
 <translation id="5901630391730855834">жълто</translation>
 <translation id="6017514345406065928">зелено</translation>
 <translation id="6475604559827479857">Цвят за открояване на думи:</translation>
 <translation id="6837853484260746864">Изберете глас:</translation>
+<translation id="7261612856573623172">Системен глас за синтезиран говор</translation>
 <translation id="7768784765476638775">Прочитане на глас</translation>
 <translation id="7914870167134465181">Открояване</translation>
+<translation id="8324974933005349667">Персонализиране на настройките за синтезиран говор</translation>
 <translation id="992256792861109788">розово</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ca.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ca.xtb
index 46cc7721..ea85552 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ca.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
+<translation id="111880247472081232">La configuració de síntesi de veu del servei Escolta la selecció s'ha migrat a la configuració global de síntesi de veu.</translation>
 <translation id="1197088940767939838">Taronja</translation>
+<translation id="1273314450961659276">Configuració de síntesi de veu</translation>
+<translation id="1498542103351704084">S'ha actualitzat la configuració de veu del servei Escolta la selecció</translation>
 <translation id="1555130319947370107">Blau</translation>
 <translation id="1666326070478924810">Configuració d'Escolta la selecció</translation>
 <translation id="1966649499058910679">Destaca cada paraula a mesura que es digui</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Fons fosc</translation>
 <translation id="27349076983469322">Fons clar</translation>
 <translation id="335581015389089642">Veu</translation>
+<translation id="3784184786832188702">Ara el servei Escolta la selecció utilitza la configuració global de síntesi de veu.</translation>
 <translation id="5901630391730855834">Groc</translation>
 <translation id="6017514345406065928">Verd</translation>
 <translation id="6475604559827479857">Color per destacar paraules:</translation>
 <translation id="6837853484260746864">Selecciona una veu:</translation>
+<translation id="7261612856573623172">Veu del sistema síntesi de veu</translation>
 <translation id="7768784765476638775">Escolta la selecció</translation>
 <translation id="7914870167134465181">Opcions per destacar</translation>
+<translation id="8324974933005349667">Personalitza la configuració de síntesi de veu</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_da.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_da.xtb
index d516e1b..f8ce96f 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_da.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
+<translation id="111880247472081232">Dine indstillinger for tekstoplæsning blev migreret til globale indstillinger for oplæsning.</translation>
 <translation id="1197088940767939838">Orange</translation>
+<translation id="1273314450961659276">Indstillinger for oplæsning</translation>
+<translation id="1498542103351704084">Indstillinger for tekstoplæsning er opdateret</translation>
 <translation id="1555130319947370107">Blå</translation>
 <translation id="1666326070478924810">Indstillinger for Tekstoplæsning</translation>
 <translation id="1966649499058910679">Fremhæv hvert ord, når det siges</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Mørk baggrund</translation>
 <translation id="27349076983469322">Lys baggrund</translation>
 <translation id="335581015389089642">Tale</translation>
+<translation id="3784184786832188702">Tekstoplæsning bruger nu de globale indstillinger for oplæsning.</translation>
 <translation id="5901630391730855834">Gul</translation>
 <translation id="6017514345406065928">Grøn</translation>
 <translation id="6475604559827479857">Farve til markering af ord:</translation>
 <translation id="6837853484260746864">Vælg en stemme:</translation>
+<translation id="7261612856573623172">Systemstemme for oplæsning</translation>
 <translation id="7768784765476638775">Tekstoplæsning</translation>
 <translation id="7914870167134465181">Fremhævning</translation>
+<translation id="8324974933005349667">Tilpas indstillinger for tekstoplæsning</translation>
 <translation id="992256792861109788">Lyserød</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb
index faca198..b6150b2 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_de.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
+<translation id="111880247472081232">Ihre Sprachausgabe-Einstellungen für die Funktion "Vorlesen" wurden zu den globalen Sprachausgabe-Einstellungen migriert.</translation>
 <translation id="1197088940767939838">Orange</translation>
+<translation id="1273314450961659276">Einstellungen für Sprachausgabe</translation>
+<translation id="1498542103351704084">Spracheinstellungen der Funktion "Vorlesen" wurden aktualisiert</translation>
 <translation id="1555130319947370107">Blau</translation>
 <translation id="1666326070478924810">Einstellungen für "Vorlesen"</translation>
 <translation id="1966649499058910679">Jedes Wort hervorheben, das gerade gesprochen wird</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Dunkler Hintergrund</translation>
 <translation id="27349076983469322">Heller Hintergrund</translation>
 <translation id="335581015389089642">Sprachausgabe</translation>
+<translation id="3784184786832188702">Für die Funktion "Vorlesen" werden jetzt globale Sprachausgabe-Einstellungen verwendet.</translation>
 <translation id="5901630391730855834">Gelb</translation>
 <translation id="6017514345406065928">Grün</translation>
 <translation id="6475604559827479857">Farbe zum Hervorheben von Wörtern:</translation>
 <translation id="6837853484260746864">Stimme auswählen:</translation>
+<translation id="7261612856573623172">Sprachausgabe-Stimme des Systems</translation>
 <translation id="7768784765476638775">Vorlesen</translation>
 <translation id="7914870167134465181">Hervorhebung</translation>
+<translation id="8324974933005349667">Einstellungen für Sprachausgabe personalisieren</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_el.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_el.xtb
index a3f1eef..f622b86291 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_el.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
+<translation id="111880247472081232">Οι ρυθμίσεις μετατροπής κειμένου σε ομιλία της λειτουργίας "Επιλέξτε για αυτόματη ανάγνωση" μεταφέρθηκαν στις καθολικές ρυθμίσεις μετατροπής κειμένου σε ομιλία.</translation>
 <translation id="1197088940767939838">Πορτοκαλί</translation>
+<translation id="1273314450961659276">Ρυθμίσεις μετατροπής κειμένου σε ομιλία</translation>
+<translation id="1498542103351704084">Οι ρυθμίσεις της λειτουργίας "Επιλέξτε για αυτόματη ανάγνωση" ενημερώθηκαν</translation>
 <translation id="1555130319947370107">Μπλε</translation>
 <translation id="1666326070478924810">Ρυθμίσεις υπηρεσίας "Επιλέξτε για εκφώνηση"</translation>
 <translation id="1966649499058910679">Επισημάνετε κάθε λέξη καθώς εκφωνείται</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Σκούρο φόντο</translation>
 <translation id="27349076983469322">Ανοιχτόχρωμο φόντο</translation>
 <translation id="335581015389089642">Ομιλία</translation>
+<translation id="3784184786832188702">Η λειτουργία "Επιλέξτε για αυτόματη ανάγνωση" χρησιμοποιεί πλέον καθολικές ρυθμίσεις μετατροπής κειμένου σε ομιλία.</translation>
 <translation id="5901630391730855834">Κίτρινο</translation>
 <translation id="6017514345406065928">Πράσινο</translation>
 <translation id="6475604559827479857">Χρώμα επισήμανσης λέξεων:</translation>
 <translation id="6837853484260746864">Επιλογή φωνής:</translation>
+<translation id="7261612856573623172">Φωνή συστήματος μετατροπής κειμένου σε ομιλία</translation>
 <translation id="7768784765476638775">Επιλέξτε για εκφώνηση</translation>
 <translation id="7914870167134465181">Επισήμανση</translation>
+<translation id="8324974933005349667">Εξατομίκευση ρυθμίσεων μετατροπής κειμένου σε ομιλία</translation>
 <translation id="992256792861109788">Ροζ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es.xtb
index cecc4c5..c734d0b2 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_es.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
+<translation id="111880247472081232">La configuración de síntesis de voz de Enunciar Selección se ha migrado a la configuración de síntesis de voz global.</translation>
 <translation id="1197088940767939838">Naranja</translation>
+<translation id="1273314450961659276">Configuración de síntesis de voz</translation>
+<translation id="1498542103351704084">La configuración de síntesis de voz de Enunciar Selección se ha actualizado</translation>
 <translation id="1555130319947370107">Azul</translation>
 <translation id="1666326070478924810">Configuración de Enunciar Selección</translation>
 <translation id="1966649499058910679">Destacar cada palabra cuando se pronuncia</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Fondo oscuro</translation>
 <translation id="27349076983469322">Fondo claro</translation>
 <translation id="335581015389089642">Voz</translation>
+<translation id="3784184786832188702">Enunciar Selección ahora utiliza la configuración de síntesis de voz global.</translation>
 <translation id="5901630391730855834">Amarillo</translation>
 <translation id="6017514345406065928">Verde</translation>
 <translation id="6475604559827479857">Color para destacar palabras:</translation>
 <translation id="6837853484260746864">Selecciona una voz:</translation>
+<translation id="7261612856573623172">Nombre de la síntesis de voz del sistema</translation>
 <translation id="7768784765476638775">Enunciar Selección</translation>
 <translation id="7914870167134465181">Destacar</translation>
+<translation id="8324974933005349667">Personalizar la configuración de síntesis de voz</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_et.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_et.xtb
index fd4fa78..38b19ba 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_et.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
+<translation id="111880247472081232">Teie funktsiooni Vali ja kuula kõnesünteesi seaded teisaldati kõnesünteesi üldseadete jaotisesse.</translation>
 <translation id="1197088940767939838">Oranž</translation>
+<translation id="1273314450961659276">Kõnesünteesi seaded</translation>
+<translation id="1498542103351704084">Funktsiooni Vali ja kuula kõneseadeid värskendati</translation>
 <translation id="1555130319947370107">Sinine</translation>
 <translation id="1666326070478924810">Funktsiooni Vali ja kuula seaded</translation>
 <translation id="1966649499058910679">Tõsta iga sõna selle kõnelemisel esile</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Tume taust</translation>
 <translation id="27349076983469322">Hele taust</translation>
 <translation id="335581015389089642">Kõne</translation>
+<translation id="3784184786832188702">Funktsioon Vali ja kuula kasutab nüüd kõnesünteesi üldseadeid.</translation>
 <translation id="5901630391730855834">Kollane</translation>
 <translation id="6017514345406065928">Roheline</translation>
 <translation id="6475604559827479857">Sõna esiletõstude värv:</translation>
 <translation id="6837853484260746864">Valige hääl:</translation>
+<translation id="7261612856573623172">Süsteemi kõnesünteesi hääl</translation>
 <translation id="7768784765476638775">Vali ja kuula</translation>
 <translation id="7914870167134465181">Esiletõstmine</translation>
+<translation id="8324974933005349667">Isikupärastage kõnesünteesi seadeid</translation>
 <translation id="992256792861109788">Roosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fa.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fa.xtb
index 891e97c0..efe8076 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fa.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
+<translation id="111880247472081232">تنظیمات «انتخاب برای شنیدن» «نوشتار به گفتار» در تنظیمات کلی «نوشتار به گفتار» ادغام شده‌اند.</translation>
 <translation id="1197088940767939838">نارنجی</translation>
+<translation id="1273314450961659276">تنظیمات نوشتار به گفتار</translation>
+<translation id="1498542103351704084">تنظیمات گفتار «انتخاب برای شنیدن» به‌روزرسانی شد</translation>
 <translation id="1555130319947370107">آبی</translation>
 <translation id="1666326070478924810">تنظیمات «انتخاب کنید تا بتوانید صحبت کنید»</translation>
 <translation id="1966649499058910679">وقتی کلمه‌ای گفته می‌شود، برجسته شود</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">پس‌زمینه تیره</translation>
 <translation id="27349076983469322">پس‌زمینه روشن</translation>
 <translation id="335581015389089642">صدا</translation>
+<translation id="3784184786832188702">اکنون «انتخاب برای شنیدن» از تنظیمات کلی «نوشتار به گفتار» استفاده می‌کند.</translation>
 <translation id="5901630391730855834">زرد</translation>
 <translation id="6017514345406065928">سبز</translation>
 <translation id="6475604559827479857">رنگ برای برجسته کردن کلمه‌:</translation>
 <translation id="6837853484260746864">انتخاب صدا:</translation>
+<translation id="7261612856573623172">صدای سیستم نوشتار به گفتار</translation>
 <translation id="7768784765476638775">انتخاب برای صحبت کردن</translation>
 <translation id="7914870167134465181">برجسته کردن</translation>
+<translation id="8324974933005349667">شخصی کردن تنظیمات «نوشتار به گفتار»</translation>
 <translation id="992256792861109788">صورتی</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fi.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fi.xtb
index 37de489..d686a70 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fi.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
+<translation id="111880247472081232">Teksti puhuttuna- ja Tekstistä puheeksi ‑asetuksesi yhdistettiin yleisiksi Tekstistä puheeksi ‑asetuksiksi.</translation>
 <translation id="1197088940767939838">Oranssi</translation>
+<translation id="1273314450961659276">Tekstistä puheeksi ‑asetukset</translation>
+<translation id="1498542103351704084">Teksti puhuttuna ‑asetukset päivitetty</translation>
 <translation id="1555130319947370107">Sininen</translation>
 <translation id="1666326070478924810">Teksti puhuttuna ‑asetukset</translation>
 <translation id="1966649499058910679">Korosta jokainen sana kun se lausutaan</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Tumma tausta</translation>
 <translation id="27349076983469322">Vaalea tausta</translation>
 <translation id="335581015389089642">Puhe</translation>
+<translation id="3784184786832188702">Teksti puhuttuna käyttää nyt yleisiä Tekstistä puheeksi ‑asetuksia.</translation>
 <translation id="5901630391730855834">Keltainen</translation>
 <translation id="6017514345406065928">Vihreä</translation>
 <translation id="6475604559827479857">Sanojen korostusväri:</translation>
 <translation id="6837853484260746864">Valitse ääni:</translation>
+<translation id="7261612856573623172">Järjestelmän Tekstistä puheeksi ‑ääni</translation>
 <translation id="7768784765476638775">Teksti puhuttuna</translation>
 <translation id="7914870167134465181">Korostus</translation>
+<translation id="8324974933005349667">Personoi Tekstistä puheeksi ‑asetukset</translation>
 <translation id="992256792861109788">Vaaleanpunainen</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fil.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fil.xtb
index 71c5655..93ab886 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fil.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
+<translation id="111880247472081232">Na-migrate ang iyong mga setting ng Select-to-Speak Text-to-Speech sa mga pangkalahatang setting ng Text-to-Speech.</translation>
 <translation id="1197088940767939838">Orange</translation>
+<translation id="1273314450961659276">Mga setting ng Text-to-Speech</translation>
+<translation id="1498542103351704084">Na-update ang mga setting ng Select-to-Speak speech</translation>
 <translation id="1555130319947370107">Asul</translation>
 <translation id="1666326070478924810">Mga Setting ng Select to Speak</translation>
 <translation id="1966649499058910679">I-highlight ang bawat salita habang binibigkas ito</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Madilim na background</translation>
 <translation id="27349076983469322">Maliwanag na background</translation>
 <translation id="335581015389089642">Pananalita</translation>
+<translation id="3784184786832188702">Gumagamit na ng mga pandaigdigang setting ng Text-to-Speech ang Select to speak.</translation>
 <translation id="5901630391730855834">Dilaw</translation>
 <translation id="6017514345406065928">Berde</translation>
 <translation id="6475604559827479857">Kulay para sa mga pag-highlight ng salita:</translation>
 <translation id="6837853484260746864">Pumili ng boses:</translation>
+<translation id="7261612856573623172">Text-to-Speech voice ng system</translation>
 <translation id="7768784765476638775">Select to Speak</translation>
 <translation id="7914870167134465181">Pag-highlight</translation>
+<translation id="8324974933005349667">I-personalize ang mga setting ng Text-to-Speech</translation>
 <translation id="992256792861109788">Pink</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fr.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fr.xtb
index 4073d63..52aa1a6 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_fr.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
+<translation id="111880247472081232">Les paramètres de synthèse vocale du service Sélectionner pour prononcer se trouvent désormais dans les paramètres de synthèse vocale généraux.</translation>
 <translation id="1197088940767939838">Orange</translation>
+<translation id="1273314450961659276">Paramètres de synthèse vocale</translation>
+<translation id="1498542103351704084">Paramètres de synthèse vocale du service Sélectionner pour prononcer mis à jour</translation>
 <translation id="1555130319947370107">Bleu</translation>
 <translation id="1666326070478924810">Paramètres de "Sélectionner pour prononcer"</translation>
 <translation id="1966649499058910679">Mettre en évidence les mots à mesure qu'ils sont énoncés</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Arrière-plan sombre</translation>
 <translation id="27349076983469322">Arrière-plan clair</translation>
 <translation id="335581015389089642">Voix</translation>
+<translation id="3784184786832188702">Le service Sélectionner pour prononcer utilise désormais les paramètres de synthèse vocale généraux.</translation>
 <translation id="5901630391730855834">Jaune</translation>
 <translation id="6017514345406065928">Vert</translation>
 <translation id="6475604559827479857">Couleur pour la mise en surbrillance des mots :</translation>
 <translation id="6837853484260746864">Sélectionner une voix :</translation>
+<translation id="7261612856573623172">Voix de la synthèse vocale du système</translation>
 <translation id="7768784765476638775">Sélectionner pour prononcer</translation>
 <translation id="7914870167134465181">Mise en surbrillance</translation>
+<translation id="8324974933005349667">Personnaliser les paramètres de synthèse vocale</translation>
 <translation id="992256792861109788">Rose</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_gu.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_gu.xtb
index e656a1d..f964e939 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_gu.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
+<translation id="111880247472081232">તમારી 'ટેક્સ્ટ-ટૂ-સ્પીચ' 'સાંભળવા માટે પસંદ કરો' સેટિંગને વૈશ્વિક 'ટેક્સ્ટ-ટૂ-સ્પીચ' સેટિંગ પર સ્થાનાંતર કરવામાં આવી છે.</translation>
 <translation id="1197088940767939838">નારંગી</translation>
+<translation id="1273314450961659276">'ટેક્સ્ટ-ટૂ-સ્પીચ' સેટિંગ</translation>
+<translation id="1498542103351704084">'સાંભળવા માટે પસંદ કરો' વાણી સેટિંગ અપડેટ કરવામાં આવી</translation>
 <translation id="1555130319947370107">વાદળી</translation>
 <translation id="1666326070478924810">સાંભળવા માટે પસંદ કરોના સેટિંગ</translation>
 <translation id="1966649499058910679">દરેક શબ્દને બોલવાની રીત પ્રમાણે હાઇલાઇટ કરો</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">ઘાટું બૅકગ્રાઉન્ડ</translation>
 <translation id="27349076983469322">આછું બૅકગ્રાઉન્ડ</translation>
 <translation id="335581015389089642">ભાષા</translation>
+<translation id="3784184786832188702">'સાંભળવા માટે પસંદ કરો' હવે વૈશ્વિક 'ટેક્સ્ટ-ટૂ-સ્પીચ' સેટિંગનો ઉપયોગ કરે છે.</translation>
 <translation id="5901630391730855834">પીળો</translation>
 <translation id="6017514345406065928">લીલો</translation>
 <translation id="6475604559827479857">શબ્દ હાઇલાઇટ કરવા માટેનો રંગ:</translation>
 <translation id="6837853484260746864">વૉઇસ પસંદ કરો:</translation>
+<translation id="7261612856573623172">સિસ્ટમ ટેક્સ્ટ-ટુ-સ્પીચ વૉઇસ</translation>
 <translation id="7768784765476638775">સાંભળવા માટે પસંદ કરો</translation>
 <translation id="7914870167134465181">હાઇલાઇટિંગ</translation>
+<translation id="8324974933005349667">'ટેક્સ્ટ-ટૂ-સ્પીચ' સેટિંગને વ્યક્તિગત કરો</translation>
 <translation id="992256792861109788">ગુલાબી</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb
index 767860f..4337c13 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hi.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
+<translation id="111880247472081232">आपकी 'चुनें और सुनें' सेवा की लिखाई को बोली में बदलने की सेटिंग, लिखाई को बोली में बदलने की वैश्विक सेटिंग में माइग्रेट की गई हैं.</translation>
 <translation id="1197088940767939838">नारंगी</translation>
+<translation id="1273314450961659276">लिखाई को बोली में बदलने की सेटिंग</translation>
+<translation id="1498542103351704084">'चुनें और चुनें' सेवा की बोली सेटिंग अपडेट की गईं</translation>
 <translation id="1555130319947370107">नीला</translation>
 <translation id="1666326070478924810">चुनें और सुनें सेटिंग</translation>
 <translation id="1966649499058910679">जैसे-जैसे हर शब्द बोला जाए, उसे हाइलाइट करें</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">गहरा बैकग्राउंड</translation>
 <translation id="27349076983469322">हल्का बैकग्राउंड</translation>
 <translation id="335581015389089642">बोली</translation>
+<translation id="3784184786832188702">'चुनें और सुनें' सेवा अब लिखाई को बोली में बदलने की वैश्विक सेटिंग का इस्तेमाल करती है.</translation>
 <translation id="5901630391730855834">पीला</translation>
 <translation id="6017514345406065928">हरा</translation>
 <translation id="6475604559827479857">शब्द हाइलाइट करने का रंग:</translation>
 <translation id="6837853484260746864">एक ध्वनि चुनें:</translation>
+<translation id="7261612856573623172">लिखाई को बोली में बदलने वाली सिस्टम की आवाज़</translation>
 <translation id="7768784765476638775">चुनें और सुनें</translation>
 <translation id="7914870167134465181">हाइलाइट करना</translation>
+<translation id="8324974933005349667">लिखाई को बोली में बदलने की सेटिंग पसंद के मुताबिक बनाएं</translation>
 <translation id="992256792861109788">गुलाबी</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hr.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hr.xtb
index d596056..a6a73df 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hr.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
+<translation id="111880247472081232">Vaše postavke pretvaranja teksta u govor za značajku Odabir za govor premještene su u globalne postavke pretvaranja teksta u govor.</translation>
 <translation id="1197088940767939838">Narančasta</translation>
+<translation id="1273314450961659276">Postavke pretvaranja teksta u govor</translation>
+<translation id="1498542103351704084">Ažurirane su postavke govora značajke Odabir za govor</translation>
 <translation id="1555130319947370107">Plava</translation>
 <translation id="1666326070478924810">Postavke Odabira za govor</translation>
 <translation id="1966649499058910679">Istakni svaku riječ dok se izgovara</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Tamna pozadina</translation>
 <translation id="27349076983469322">Svijetla pozadina</translation>
 <translation id="335581015389089642">Govor</translation>
+<translation id="3784184786832188702">Odabir za govor sada upotrebljava globalne postavke pretvaranja teksta u govor.</translation>
 <translation id="5901630391730855834">Žuta</translation>
 <translation id="6017514345406065928">Zelena</translation>
 <translation id="6475604559827479857">Boja za isticanja riječi:</translation>
 <translation id="6837853484260746864">Odaberite glas:</translation>
+<translation id="7261612856573623172">Glas sustava za pretvaranje teksta u govor</translation>
 <translation id="7768784765476638775">Odabir za govor</translation>
 <translation id="7914870167134465181">Isticanje</translation>
+<translation id="8324974933005349667">Prilagodite postavke pretvaranja teksta u govor</translation>
 <translation id="992256792861109788">Ružičasta</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hu.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hu.xtb
index ea99c94..240ae3c 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_hu.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
+<translation id="111880247472081232">A Felolvasás szövegfelolvasó funkciójához tartozó beállításokat a szövegfelolvasó globális beállításai közé migráltuk.</translation>
 <translation id="1197088940767939838">Narancssárga</translation>
+<translation id="1273314450961659276">A szövegfelolvasó beállításai</translation>
+<translation id="1498542103351704084">A Felolvasáshoz tartozó beszédbeállítások frissítése megtörtént</translation>
 <translation id="1555130319947370107">Kék</translation>
 <translation id="1666326070478924810">Felolvasási beállítások</translation>
 <translation id="1966649499058910679">Szavak kiemelése a beszédtempóval egyező ütemben</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Sötét háttér</translation>
 <translation id="27349076983469322">Világos háttér</translation>
 <translation id="335581015389089642">Beszéd</translation>
+<translation id="3784184786832188702">A felolvasás mostantól a szövegfelolvasó globális beállításait használja.</translation>
 <translation id="5901630391730855834">Sárga</translation>
 <translation id="6017514345406065928">Zöld</translation>
 <translation id="6475604559827479857">Szókiemeléshez tartozó szín:</translation>
 <translation id="6837853484260746864">Válasszon hangot:</translation>
+<translation id="7261612856573623172">Alapértelmezett szövegfelolvasó hang</translation>
 <translation id="7768784765476638775">Felolvasás</translation>
 <translation id="7914870167134465181">Kiemelés</translation>
+<translation id="8324974933005349667">A szövegfelolvasóhoz tartozó beállítások személyre szabása</translation>
 <translation id="992256792861109788">Rózsaszín</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_id.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_id.xtb
index 2de74b0..5840be4 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_id.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
+<translation id="111880247472081232">Setelan Text-to-Speech Klik untuk Diucapkan dimigrasikan ke setelan Text-to-Speech global.</translation>
 <translation id="1197088940767939838">Oranye</translation>
+<translation id="1273314450961659276">Setelan Text-to-Speech</translation>
+<translation id="1498542103351704084">Setelan ucapan Klik untuk Diucapkan diupdate</translation>
 <translation id="1555130319947370107">Biru</translation>
 <translation id="1666326070478924810">Setelan Klik untuk Diucapkan</translation>
 <translation id="1966649499058910679">Soroti setiap kata saat kata tersebut diucapkan</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Latar belakang gelap</translation>
 <translation id="27349076983469322">Latar belakang terang</translation>
 <translation id="335581015389089642">Ucapan</translation>
+<translation id="3784184786832188702">Fitur Klik untuk Diucapkan kini menggunakan setelan Text-to-Speech global.</translation>
 <translation id="5901630391730855834">Kuning</translation>
 <translation id="6017514345406065928">Hijau</translation>
 <translation id="6475604559827479857">Warna untuk highlight kata:</translation>
 <translation id="6837853484260746864">Pilih suara:</translation>
+<translation id="7261612856573623172">Suara Text-to-Speech sistem</translation>
 <translation id="7768784765476638775">Klik untuk diucapkan</translation>
 <translation id="7914870167134465181">Menyoroti</translation>
+<translation id="8324974933005349667">Personalisasi setelan Text-to-Speech</translation>
 <translation id="992256792861109788">Pink</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_it.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_it.xtb
index 0befade..1baeaa6 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_it.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
+<translation id="111880247472081232">È stata eseguita la migrazione delle tue impostazioni dei servizi Seleziona per ascoltare e Sintesi vocale alle impostazioni globali di sintesi vocale.</translation>
 <translation id="1197088940767939838">Arancione</translation>
+<translation id="1273314450961659276">Impostazioni di sintesi vocale</translation>
+<translation id="1498542103351704084">Impostazioni di sintesi vocale aggiornate</translation>
 <translation id="1555130319947370107">Blu</translation>
 <translation id="1666326070478924810">Impostazioni Seleziona per ascoltare</translation>
 <translation id="1966649499058910679">Evidenzia ogni parola mentre viene pronunciata</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Sfondo scuro</translation>
 <translation id="27349076983469322">Sfondo chiaro</translation>
 <translation id="335581015389089642">Voce</translation>
+<translation id="3784184786832188702">La sintesi vocale ora utilizza impostazioni globali di sintesi vocale.</translation>
 <translation id="5901630391730855834">Giallo</translation>
 <translation id="6017514345406065928">Verde</translation>
 <translation id="6475604559827479857">Colore di evidenziazione delle parole</translation>
 <translation id="6837853484260746864">Seleziona una voce:</translation>
+<translation id="7261612856573623172">Voce del sistema per la sintesi vocale</translation>
 <translation id="7768784765476638775">Seleziona per ascoltare</translation>
 <translation id="7914870167134465181">Evidenziazione</translation>
+<translation id="8324974933005349667">Personalizza le impostazioni di sintesi vocale</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_iw.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_iw.xtb
index 73c4c667..5ec99e6 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_iw.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
+<translation id="111880247472081232">ההגדרות של המרת טקסט לדיבור הקשורות להקראה הועברו להגדרות הכלליות של המרת טקסט לדיבור.</translation>
 <translation id="1197088940767939838">כתום</translation>
+<translation id="1273314450961659276">ההגדרות של המרת טקסט לדיבור</translation>
+<translation id="1498542103351704084">המערכת עדכנה את הגדרות הדיבור של ההקראה</translation>
 <translation id="1555130319947370107">כחול</translation>
 <translation id="1666326070478924810">הגדרות הקראה</translation>
 <translation id="1966649499058910679">הדגשה של כל מילה בזמן שהן נאמרות</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">רקע כהה</translation>
 <translation id="27349076983469322">רקע בהיר</translation>
 <translation id="335581015389089642">דיבור</translation>
+<translation id="3784184786832188702">תכונת ההקראה משתמשת עכשיו בהגדרות הכלליות של המרת טקסט לדיבור.</translation>
 <translation id="5901630391730855834">צהוב</translation>
 <translation id="6017514345406065928">ירוק</translation>
 <translation id="6475604559827479857">הצבע של הדגשת המילים:</translation>
 <translation id="6837853484260746864">בחר קול:</translation>
+<translation id="7261612856573623172">קול ברירת המחדל של המרת טקסט לדיבור</translation>
 <translation id="7768784765476638775">הקראה</translation>
 <translation id="7914870167134465181">הדגשה</translation>
+<translation id="8324974933005349667">התאמת ההגדרות של המרת טקסט לדיבור</translation>
 <translation id="992256792861109788">ורוד</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ja.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ja.xtb
index 9e2d994c..c77ddf28 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ja.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ja">
+<translation id="111880247472081232">「選択して読み上げ」機能のテキスト読み上げの設定は、全般設定のテキスト読み上げの設定に統合されました。</translation>
 <translation id="1197088940767939838">オレンジ</translation>
+<translation id="1273314450961659276">テキスト読み上げの設定</translation>
+<translation id="1498542103351704084">「選択して読み上げ」の設定が更新されました</translation>
 <translation id="1555130319947370107">青</translation>
 <translation id="1666326070478924810">「選択して読み上げ」の設定</translation>
 <translation id="1966649499058910679">話されている単語を強調表示する</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">暗い背景</translation>
 <translation id="27349076983469322">明るい背景</translation>
 <translation id="335581015389089642">スピーチ</translation>
+<translation id="3784184786832188702">「選択して読み上げ」機能で、全般設定のテキスト読み上げの設定が使用されるようになりました。</translation>
 <translation id="5901630391730855834">黄</translation>
 <translation id="6017514345406065928">緑</translation>
 <translation id="6475604559827479857">次の色で単語をハイライト表示:</translation>
 <translation id="6837853484260746864">音声を選択:</translation>
+<translation id="7261612856573623172">システムのテキスト読み上げの音声</translation>
 <translation id="7768784765476638775">選択して読み上げ</translation>
 <translation id="7914870167134465181">強調表示</translation>
+<translation id="8324974933005349667">テキスト読み上げの設定をカスタマイズする</translation>
 <translation id="992256792861109788">ピンク</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb
index 129efe95..8c54dd8 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_kn.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
+<translation id="111880247472081232">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಷ್ಟ್ಯದಲ್ಲಿ ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಜಾಗತಿಕ ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಗೆ ರವಾನಿಸಲಾಗಿದೆ.</translation>
 <translation id="1197088940767939838">ಕಿತ್ತಳೆ</translation>
+<translation id="1273314450961659276">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
+<translation id="1498542103351704084">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಷ್ಟ್ಯದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="1555130319947370107">ನೀಲಿ</translation>
 <translation id="1666326070478924810">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="1966649499058910679">ಪ್ರತಿ ಪದವನ್ನು ಮಾತನಾಡುವ ರೀತಿಯಲ್ಲೇ ಹೈಲೈಟ್ ಮಾಡಿ</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">ದಟ್ಟ ಬೆಳಕಿನ ಹಿನ್ನೆಲೆ</translation>
 <translation id="27349076983469322">ಮಂದ ಬೆಳಕಿನ ಹಿನ್ನೆಲೆ</translation>
 <translation id="335581015389089642">ಧ್ವನಿ</translation>
+<translation id="3784184786832188702">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ ವೈಶಿಶ್ಟ್ಯವು ಈಗ ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಜಾಗತಿಕ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಬಳಸುತ್ತದೆ.</translation>
 <translation id="5901630391730855834">ಹಳದಿ</translation>
 <translation id="6017514345406065928">ಹಸಿರು</translation>
 <translation id="6475604559827479857">ಪದಗಳ ಹೈಲೈಟ್‌ಗಳಿಗಾಗಿ ಬಣ್ಣ:</translation>
 <translation id="6837853484260746864">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ:</translation>
+<translation id="7261612856573623172">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ವೈಶಿಷ್ಟ್ಯಕ್ಕಾಗಿ ಸಿಸ್ಟಂ ಧ್ವನಿ</translation>
 <translation id="7768784765476638775">ಧ್ವನಿ ಆಯ್ಕೆ ಮಾಡಿ</translation>
 <translation id="7914870167134465181">ಹೈಲೈಟ್ ಮಾಡುವಿಕೆ</translation>
+<translation id="8324974933005349667">ಪಠ್ಯದಿಂದ ಧ್ವನಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ವೈಯಕ್ತೀಕರಿಸಿ</translation>
 <translation id="992256792861109788">ಗುಲಾಬಿ ಬಣ್ಣ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ko.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ko.xtb
index 071a6308..10c56c2 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ko.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
+<translation id="111880247472081232">텍스트 읽어주기 TTS(텍스트 음성 변환) 설정이 전체 TTS 설정으로 이전되었습니다.</translation>
 <translation id="1197088940767939838">오렌지색</translation>
+<translation id="1273314450961659276">TTS(텍스트 음성 변환) 설정</translation>
+<translation id="1498542103351704084">텍스트 읽어주기 음성 설정이 업데이트됨</translation>
 <translation id="1555130319947370107">파란색</translation>
 <translation id="1666326070478924810">텍스트 읽어주기 설정</translation>
 <translation id="1966649499058910679">각 단어를 읽을 때 강조표시</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">어두운 배경</translation>
 <translation id="27349076983469322">밝은 배경</translation>
 <translation id="335581015389089642">음성</translation>
+<translation id="3784184786832188702">이제 텍스트 읽어주기에서 전체 TTS(텍스트 음성 변환) 설정을 사용합니다.</translation>
 <translation id="5901630391730855834">노란색</translation>
 <translation id="6017514345406065928">녹색</translation>
 <translation id="6475604559827479857">단어 하이라이트 색상:</translation>
 <translation id="6837853484260746864">음성 선택:</translation>
+<translation id="7261612856573623172">시스템 TTS(텍스트 음성 변환) 음성</translation>
 <translation id="7768784765476638775">텍스트 읽어주기</translation>
 <translation id="7914870167134465181">강조표시</translation>
+<translation id="8324974933005349667">TTS(텍스트 음성 변환) 설정 맞춤설정</translation>
 <translation id="992256792861109788">분홍색</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_lv.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_lv.xtb
index ab859b2..b72c20a 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_lv.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
+<translation id="111880247472081232">Pakalpojumu Atlasīt, lai izrunātu un Teksta pārvēršana runā iestatījumi tika migrēti uz globālajiem pakalpojuma Teksta pārvēršana runā iestatījumiem.</translation>
 <translation id="1197088940767939838">Oranža</translation>
+<translation id="1273314450961659276">Pakalpojuma Teksta pārvēršana runā iestatījumi</translation>
+<translation id="1498542103351704084">Pakalpojuma Atlasīt, lai izrunātu runas iestatījumi ir atjaunināti</translation>
 <translation id="1555130319947370107">Zila</translation>
 <translation id="1666326070478924810">Funkcijas “Atlasīt, lai izrunātu” iestatījumi</translation>
 <translation id="1966649499058910679">Iezīmēt katru vārdu, kad tas tiek izrunāts</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Tumšs fons</translation>
 <translation id="27349076983469322">Gaišs fons</translation>
 <translation id="335581015389089642">Runa</translation>
+<translation id="3784184786832188702">Pakalpojums Atlasīt, lai izrunātu tagad izmanto globālos pakalpojuma Teksta pārvēršana runā iestatījumus.</translation>
 <translation id="5901630391730855834">Dzeltena</translation>
 <translation id="6017514345406065928">Zaļa</translation>
 <translation id="6475604559827479857">Krāsa vārdu izcelšanai:</translation>
 <translation id="6837853484260746864">Atlasiet balsi:</translation>
+<translation id="7261612856573623172">Sistēmas Teksta pārvēršanas runā iestatījumi</translation>
 <translation id="7768784765476638775">Atlasīt, lai izrunātu</translation>
 <translation id="7914870167134465181">Iezīmēšana</translation>
+<translation id="8324974933005349667">Personalizēt pakalpojuma Teksta pārvēršana runā iestatījumus</translation>
 <translation id="992256792861109788">Rozā</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ml.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ml.xtb
index ab657e5c..d5d98c1e 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ml.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
+<translation id="111880247472081232">നിങ്ങളുടെ 'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക', ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണം എന്നിവ ആഗോള ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണത്തിലേക്ക് മൈഗ്രേറ്റ് ചെയ്‌തു.</translation>
 <translation id="1197088940767939838">ഓറഞ്ച്</translation>
+<translation id="1273314450961659276">ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണം</translation>
+<translation id="1498542103351704084">'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക' സംഭാഷണ ക്രമീകരണം അപ്‌ഡേറ്റ് ചെയ്‌തു</translation>
 <translation id="1555130319947370107">നീല</translation>
 <translation id="1666326070478924810">'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക' ക്രമീകരണം</translation>
 <translation id="1966649499058910679">ഓരോ വാക്കും പറഞ്ഞത് പോലെ ഹൈലൈറ്റ് ചെയ്യുക</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">ഇരുണ്ട പശ്ചാത്തലം</translation>
 <translation id="27349076983469322">ലൈറ്റ് പശ്ചാത്തലം</translation>
 <translation id="335581015389089642">സംഭാഷണം</translation>
+<translation id="3784184786832188702">'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക' ഇപ്പോൾ ആഗോള ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണം ഉപയോഗിക്കുന്നു.</translation>
 <translation id="5901630391730855834">മഞ്ഞ</translation>
 <translation id="6017514345406065928">പച്ച</translation>
 <translation id="6475604559827479857">പദ ഹൈലൈറ്റുകളുടെ നിറം:</translation>
 <translation id="6837853484260746864">ഒരു ശബ്‌ദം തിരഞ്ഞെടുക്കുക:</translation>
+<translation id="7261612856573623172">സിസ്‌റ്റം ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ശബ്‌ദം</translation>
 <translation id="7768784765476638775">വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="7914870167134465181">ഹൈലൈറ്റ് ചെയ്യുന്നു</translation>
+<translation id="8324974933005349667">ടെക്‌സ്‌റ്റ്-ടു-സ്‌പീച്ച് ക്രമീകരണം വ്യക്തിപരമാക്കുക</translation>
 <translation id="992256792861109788">പിങ്ക്</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ms.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ms.xtb
index 7910953f..e63e0c9 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ms.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
+<translation id="111880247472081232">Tetapan Teks ke Pertuturan Pilih untuk Bercakap telah dipindahkan ke tetapan Teks ke Pertuturan global.</translation>
 <translation id="1197088940767939838">Oren</translation>
+<translation id="1273314450961659276">Tetapan Teks ke Pertuturan</translation>
+<translation id="1498542103351704084">Tetapan pertuturan Pilih untuk Bercakap dikemas kini</translation>
 <translation id="1555130319947370107">Biru</translation>
 <translation id="1666326070478924810">Tetapan Pilih untuk bercakap</translation>
 <translation id="1966649499058910679">Serlahkan setiap perkataan seperti yang dituturkan</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Latar belakang gelap</translation>
 <translation id="27349076983469322">Latar belakang cerah</translation>
 <translation id="335581015389089642">Pertuturan</translation>
+<translation id="3784184786832188702">Kini Pilih untuk bercakap menggunakan tetapan Teks ke Pertuturan global.</translation>
 <translation id="5901630391730855834">Kuning</translation>
 <translation id="6017514345406065928">Hijau</translation>
 <translation id="6475604559827479857">Warna untuk serlahan perkataan:</translation>
 <translation id="6837853484260746864">Pilih suara:</translation>
+<translation id="7261612856573623172">Suara Teks ke Pertuturan Sistem</translation>
 <translation id="7768784765476638775">Pilih untuk bercakap</translation>
 <translation id="7914870167134465181">Penyerlahan</translation>
+<translation id="8324974933005349667">Peribadikan tetapan Teks ke Pertuturan</translation>
 <translation id="992256792861109788">Merah Jambu</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_nl.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_nl.xtb
index fb606d48..b33dc5c 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_nl.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
+<translation id="111880247472081232">Je tekst-naar-spraak-instellingen voor 'Selecteer om uitgesproken te worden' zijn gemigreerd naar algemene tekst-naar-spraak-instellingen.</translation>
 <translation id="1197088940767939838">Oranje</translation>
+<translation id="1273314450961659276">Tekst-naar-spraak-instellingen</translation>
+<translation id="1498542103351704084">Spraakinstellingen voor 'Selecteer om uitgesproken te worden' geüpdatet</translation>
 <translation id="1555130319947370107">Blauw</translation>
 <translation id="1666326070478924810">Instellingen voor 'Selecteer om uitgesproken te worden'</translation>
 <translation id="1966649499058910679">Markeer elk woord terwijl het wordt uitgesproken</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Donkere achtergrond</translation>
 <translation id="27349076983469322">Lichte achtergrond</translation>
 <translation id="335581015389089642">Spraak</translation>
+<translation id="3784184786832188702">'Selecteer om uitgesproken te worden' maakt nu gebruik van algemene tekst-naar-spraak-instellingen.</translation>
 <translation id="5901630391730855834">Geel</translation>
 <translation id="6017514345406065928">Groen</translation>
 <translation id="6475604559827479857">Kleur voor woordmarkeringen:</translation>
 <translation id="6837853484260746864">Een stem selecteren:</translation>
+<translation id="7261612856573623172">Systeemstem voor tekst-naar-spraak</translation>
 <translation id="7768784765476638775">Selecteer om uitgesproken te worden</translation>
 <translation id="7914870167134465181">Markeren</translation>
+<translation id="8324974933005349667">Tekst-naar-spraak-instellingen personaliseren</translation>
 <translation id="992256792861109788">Roze</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb
index b605bc52..1a9119a 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_no.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
+<translation id="111880247472081232">Innstillingene for tekstopplesning og tekst til tale ble migrert til de globale test til tale innstillingene.</translation>
 <translation id="1197088940767939838">Oransje</translation>
+<translation id="1273314450961659276">Innstillinger for tekst til tale</translation>
+<translation id="1498542103351704084">Innstillinger for tekstopplesing oppdatert</translation>
 <translation id="1555130319947370107">Blå</translation>
 <translation id="1666326070478924810">Innstillinger for Tekstopplesing</translation>
 <translation id="1966649499058910679">Fremhev enkeltord når de uttales</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Mørk bakgrunn</translation>
 <translation id="27349076983469322">Lys bakgrunn</translation>
 <translation id="335581015389089642">Tale</translation>
+<translation id="3784184786832188702">Tekstopplesning bruker nå globale tekst til tale innstillinger.</translation>
 <translation id="5901630391730855834">Gul</translation>
 <translation id="6017514345406065928">Grønn</translation>
 <translation id="6475604559827479857">Farge for fremheving av ord:</translation>
 <translation id="6837853484260746864">Velg en stemme:</translation>
+<translation id="7261612856573623172">System teskt til tale stemme</translation>
 <translation id="7768784765476638775">Tekstopplesing</translation>
 <translation id="7914870167134465181">Fremheving</translation>
+<translation id="8324974933005349667">Gi innstillingen for tekst til tale et personlig preg</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pl.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pl.xtb
index e53ddc4..04171eb 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pl.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
+<translation id="111880247472081232">Twoje ustawienia zamiany tekstu na mowę w Przeczytaj na głos zostały przeniesione do globalnych ustawień zamiany tekstu na mowę.</translation>
 <translation id="1197088940767939838">Pomarańczowy</translation>
+<translation id="1273314450961659276">Ustawienia zamiany tekstu na mowę</translation>
+<translation id="1498542103351704084">Ustawienia zamiany tekstu na mowę w Przeczytaj na głos zostały zaktualizowane</translation>
 <translation id="1555130319947370107">Niebieski</translation>
 <translation id="1666326070478924810">Ustawienia funkcji Przeczytaj na głos</translation>
 <translation id="1966649499058910679">Zaznacz słowo, gdy jest wymawiane</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Ciemne tło</translation>
 <translation id="27349076983469322">Jasne tło</translation>
 <translation id="335581015389089642">Mowa</translation>
+<translation id="3784184786832188702">Przeczytaj na głos używa teraz globalnych ustawień zamiany tekstu na mowę.</translation>
 <translation id="5901630391730855834">Żółty</translation>
 <translation id="6017514345406065928">Zielony</translation>
 <translation id="6475604559827479857">Kolor zaznaczenia słów:</translation>
 <translation id="6837853484260746864">Wybierz głos:</translation>
+<translation id="7261612856573623172">Systemowy głos zamiany tekstu na mowę</translation>
 <translation id="7768784765476638775">Przeczytaj na głos</translation>
 <translation id="7914870167134465181">Zaznaczanie</translation>
+<translation id="8324974933005349667">Dostosuj ustawienia zamiany tekstu na mowę</translation>
 <translation id="992256792861109788">Różowy</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-BR.xtb
index 578e2a5..7149867 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-BR.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
+<translation id="111880247472081232">Suas configurações de conversão de texto em voz do Selecionar para ouvir foram migradas para as configurações globais da conversão de texto em voz.</translation>
 <translation id="1197088940767939838">Laranja</translation>
+<translation id="1273314450961659276">Configurações da conversão de texto em voz</translation>
+<translation id="1498542103351704084">Configurações de fala do "Selecionar para ouvir" atualizadas</translation>
 <translation id="1555130319947370107">Azul</translation>
 <translation id="1666326070478924810">Configurações de Selecionar para ouvir</translation>
 <translation id="1966649499058910679">Destaque cada palavra à medida que for falada</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Plano de fundo escuro</translation>
 <translation id="27349076983469322">Plano de fundo claro</translation>
 <translation id="335581015389089642">Voz</translation>
+<translation id="3784184786832188702">Agora, o Selecionar para ouvir usa configurações globais da conversão de texto em voz.</translation>
 <translation id="5901630391730855834">Amarelo</translation>
 <translation id="6017514345406065928">Verde</translation>
 <translation id="6475604559827479857">Cor para destaque de palavras:</translation>
 <translation id="6837853484260746864">Selecione uma voz:</translation>
+<translation id="7261612856573623172">Voz do sistema da conversão de texto em voz</translation>
 <translation id="7768784765476638775">Selecionar para ouvir</translation>
 <translation id="7914870167134465181">Destaque</translation>
+<translation id="8324974933005349667">Personalizar configurações de conversão de texto em voz</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-PT.xtb
index 38449548..220b54e 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_pt-PT.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
+<translation id="111880247472081232">As definições da síntese de voz de Selecionar para falar foram migradas para as definições globais da síntese de voz.</translation>
 <translation id="1197088940767939838">Laranja</translation>
+<translation id="1273314450961659276">Definições da síntese de voz</translation>
+<translation id="1498542103351704084">Definições de voz de Selecionar para falar atualizadas</translation>
 <translation id="1555130319947370107">Azul</translation>
 <translation id="1666326070478924810">Definições de Selecionar para ativar voz</translation>
 <translation id="1966649499058910679">Realçar cada palavra conforme é falada</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Fundo escuro</translation>
 <translation id="27349076983469322">Fundo claro</translation>
 <translation id="335581015389089642">Voz</translation>
+<translation id="3784184786832188702">Selecionar para falar utiliza agora as definições globais da síntese de voz.</translation>
 <translation id="5901630391730855834">Amarelo</translation>
 <translation id="6017514345406065928">Verde</translation>
 <translation id="6475604559827479857">Cor para os realces das palavras:</translation>
 <translation id="6837853484260746864">Selecionar uma voz:</translation>
+<translation id="7261612856573623172">Voz da síntese de voz do sistema</translation>
 <translation id="7768784765476638775">Selecionar para ativar voz</translation>
 <translation id="7914870167134465181">Realce</translation>
+<translation id="8324974933005349667">Personalizar as definições da síntese de voz</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ro.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ro.xtb
index 150e861..4af2056b 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ro.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
+<translation id="111880247472081232">Setările redării vocale a textului pentru Selectați și ascultați au fost migrate la setările globale pentru redarea vocală a textului.</translation>
 <translation id="1197088940767939838">Portocaliu</translation>
+<translation id="1273314450961659276">Setări pentru redarea vocală a textului</translation>
+<translation id="1498542103351704084">Setările de vorbire pentru Selectați și ascultați au fost actualizate</translation>
 <translation id="1555130319947370107">Albastru</translation>
 <translation id="1666326070478924810">Setări „Selectează și ascultă”</translation>
 <translation id="1966649499058910679">Evidențiază fiecare cuvânt când este rostit</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Fundal întunecat</translation>
 <translation id="27349076983469322">Fundal deschis</translation>
 <translation id="335581015389089642">Voce</translation>
+<translation id="3784184786832188702">Selectați și ascultați folosește acum setările globale pentru redarea vocală a textului.</translation>
 <translation id="5901630391730855834">Galben</translation>
 <translation id="6017514345406065928">Verde</translation>
 <translation id="6475604559827479857">Culoare pentru evidențierea cuvintelor:</translation>
 <translation id="6837853484260746864">Selectează o voce:</translation>
+<translation id="7261612856573623172">Vocea sistemului de redare vocală a textului</translation>
 <translation id="7768784765476638775">Selectează și ascultă</translation>
 <translation id="7914870167134465181">Evidențiere</translation>
+<translation id="8324974933005349667">Personalizează setările redării vocale a textului</translation>
 <translation id="992256792861109788">Roz</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ru.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ru.xtb
index d02062f..28b9da0 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ru.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
+<translation id="111880247472081232">Настройки озвучивания при нажатии были перенесены в общие настройки озвучивания текста.</translation>
 <translation id="1197088940767939838">Оранжевый</translation>
+<translation id="1273314450961659276">Настройки озвучивания текста</translation>
+<translation id="1498542103351704084">Настройки озвучивания при нажатии изменены</translation>
 <translation id="1555130319947370107">Синий</translation>
 <translation id="1666326070478924810">Настройки озвучивания при нажатии</translation>
 <translation id="1966649499058910679">Выделять слова по мере озвучивания</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Темный фон</translation>
 <translation id="27349076983469322">Светлый фон</translation>
 <translation id="335581015389089642">Озвучить</translation>
+<translation id="3784184786832188702">Для озвучивания при нажатии теперь используются общие настройки озвучивания текста.</translation>
 <translation id="5901630391730855834">Желтый</translation>
 <translation id="6017514345406065928">Зеленый</translation>
 <translation id="6475604559827479857">Цвет, которым будут выделяться слова:</translation>
 <translation id="6837853484260746864">Голос:</translation>
+<translation id="7261612856573623172">Голос для озвучивания текста по умолчанию</translation>
 <translation id="7768784765476638775">Озвучивание при нажатии</translation>
 <translation id="7914870167134465181">Выделение</translation>
+<translation id="8324974933005349667">Открыть настройки озвучивания текста</translation>
 <translation id="992256792861109788">Розовый</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sl.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sl.xtb
index 33f9d34..afbfcf9 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sl.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
+<translation id="111880247472081232">Nastavitve pretvorbe besedila v govor v storitvi Izberite in poslušajte so bile premaknjene v globalne nastavitve pretvorbe besedila v govor.</translation>
 <translation id="1197088940767939838">Oranžna</translation>
+<translation id="1273314450961659276">Nastavitve pretvorbe besedila v govor</translation>
+<translation id="1498542103351704084">Posodobljene nastavitve storitve Izberite in poslušajte</translation>
 <translation id="1555130319947370107">Modra</translation>
 <translation id="1666326070478924810">Nastavitve storitve Izberite in poslušajte</translation>
 <translation id="1966649499058910679">Označite vsako besedo, ko je izgovorjena</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Temno ozadje</translation>
 <translation id="27349076983469322">Svetlo ozadje</translation>
 <translation id="335581015389089642">Speech</translation>
+<translation id="3784184786832188702">Storitev Izberite in poslušajte zdaj uporablja globalne nastavitve pretvorbe besedila v govor.</translation>
 <translation id="5901630391730855834">Rumena</translation>
 <translation id="6017514345406065928">Zelena</translation>
 <translation id="6475604559827479857">Barva za označevanje besed:</translation>
 <translation id="6837853484260746864">Izberite glas:</translation>
+<translation id="7261612856573623172">Sistemski glas pretvorbe besedila v govor</translation>
 <translation id="7768784765476638775">Izberite in poslušajte</translation>
 <translation id="7914870167134465181">Označevanje</translation>
+<translation id="8324974933005349667">Prilagajanje nastavitev pretvorbe besedila v govor</translation>
 <translation id="992256792861109788">Rožnata</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sr.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sr.xtb
index e0bac23..17d41adb 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sr.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
+<translation id="111880247472081232">Подешавања претварања текста у говор за функцију Изаберите за говор премештене су у глобална подешавања претварања текста у говор.</translation>
 <translation id="1197088940767939838">Наранџаста</translation>
+<translation id="1273314450961659276">Подешавања претварања текста у говор</translation>
+<translation id="1498542103351704084">Подешавања говора функције Изаберите за говор су ажурирана</translation>
 <translation id="1555130319947370107">Плава</translation>
 <translation id="1666326070478924810">Подешавања услуге Изаберите за говор</translation>
 <translation id="1966649499058910679">Истакните сваку реч док се изгововара</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Тамна позадина</translation>
 <translation id="27349076983469322">Светла позадина</translation>
 <translation id="335581015389089642">Говор</translation>
+<translation id="3784184786832188702">Функција Изаберите за говор сада користи глобална подешавања претварања текста у говор.</translation>
 <translation id="5901630391730855834">Жута</translation>
 <translation id="6017514345406065928">Зелена</translation>
 <translation id="6475604559827479857">Боја за истицање речи:</translation>
 <translation id="6837853484260746864">Изаберите глас:</translation>
+<translation id="7261612856573623172">Системски глас за претварање текста у говор</translation>
 <translation id="7768784765476638775">Изаберите за говор</translation>
 <translation id="7914870167134465181">Истицање</translation>
+<translation id="8324974933005349667">Персонализујте подешавања претварања текста у говор</translation>
 <translation id="992256792861109788">Ружичаста</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sv.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sv.xtb
index e6d0c9e0..a53ce53 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sv.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
+<translation id="111880247472081232">Inställningarna för text-till-tal under Textuppläsning har migrerats till de övergripande inställningarna för text till tal.</translation>
 <translation id="1197088940767939838">Orange</translation>
+<translation id="1273314450961659276">Inställningar för text till tal</translation>
+<translation id="1498542103351704084">Talinställningarna för Textuppläsning har uppdaterats</translation>
 <translation id="1555130319947370107">Blå</translation>
 <translation id="1666326070478924810">Inställningar för Textuppläsning</translation>
 <translation id="1966649499058910679">Markera orden allt eftersom de läses upp</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Mörk bakgrund</translation>
 <translation id="27349076983469322">Ljus bakgrund</translation>
 <translation id="335581015389089642">Tal</translation>
+<translation id="3784184786832188702">Nu används de övergripande inställningarna för text till tal med Textuppläsning.</translation>
 <translation id="5901630391730855834">Gul</translation>
 <translation id="6017514345406065928">Grön</translation>
 <translation id="6475604559827479857">Markera ord med färgen:</translation>
 <translation id="6837853484260746864">Välj en röst:</translation>
+<translation id="7261612856573623172">Systemets röst för text till tal</translation>
 <translation id="7768784765476638775">Textuppläsning</translation>
 <translation id="7914870167134465181">Markeringar</translation>
+<translation id="8324974933005349667">Anpassa inställningarna för text till tal</translation>
 <translation id="992256792861109788">Rosa</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sw.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sw.xtb
index 9e3ac7e51..f373e097 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_sw.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
+<translation id="111880247472081232">Mipangilio yako ya Chagua ili Izungumze ya Ubadilishaji wa Maandishi kwenda Usemi imehamishiwa kwenye mipangilio ya jumla ya Ubadilishaji wa Maandishi kwenda Usemi.</translation>
 <translation id="1197088940767939838">Rangi ya machungwa</translation>
+<translation id="1273314450961659276">Mipangilio ya Ubadilishaji wa Maandishi kwenda Usemi</translation>
+<translation id="1498542103351704084">Imesasisha mipangilio ya kipengele cha Chagua ili Izungumze</translation>
 <translation id="1555130319947370107">Samawati</translation>
 <translation id="1666326070478924810">Mipangilio ya Chagua ili Izungumze</translation>
 <translation id="1966649499058910679">Angazia kila neno wakati linatamkwa</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Mandhari-nyuma meusi</translation>
 <translation id="27349076983469322">Mandhari-nyuma meupe</translation>
 <translation id="335581015389089642">Usemi</translation>
+<translation id="3784184786832188702">Sasa kipengele cha Chagua ili Izungumze kinatumia mipangilio ya jumla ya Ubadilishaji wa Maandishi kwenda Usemi.</translation>
 <translation id="5901630391730855834">Manjano</translation>
 <translation id="6017514345406065928">Kijani</translation>
 <translation id="6475604559827479857">Rangi ya maneno yanayoangaziwa:</translation>
 <translation id="6837853484260746864">Chagua sauti:</translation>
+<translation id="7261612856573623172">Sauti ya mfumo wa Ubadilishaji wa Maandishi kwenda Usemi</translation>
 <translation id="7768784765476638775">Chagua ili uzungumze</translation>
 <translation id="7914870167134465181">Kuangazia</translation>
+<translation id="8324974933005349667">Weka mapendeleo kwenye mipangilio ya Ubadilishaji wa Maandishi kwenda Usemi</translation>
 <translation id="992256792861109788">Waridi</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ta.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ta.xtb
index 53d12225..e408494 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_ta.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
+<translation id="111880247472081232">உங்கள் ‘பேசும் திரை' அம்சத்தின் ‘உரையிலிருந்து பேச்சு' அமைப்புகள், பொதுவான ‘உரையிலிருந்து பேச்சு' அமைப்புகளுக்கு மாற்றப்பட்டன.</translation>
 <translation id="1197088940767939838">ஆரஞ்சு</translation>
+<translation id="1273314450961659276">’உரையிலிருந்து பேச்சு' அமைப்புகள்</translation>
+<translation id="1498542103351704084">‘பேசும் திரை’ அம்சத்தின் பேச்சு அமைப்புகள் புதுப்பிக்கப்பட்டன</translation>
 <translation id="1555130319947370107">நீலம்</translation>
 <translation id="1666326070478924810">பேசும் திரை அமைப்புகள்</translation>
 <translation id="1966649499058910679">ஒவ்வொரு சொல்லையும் கூறும்போது தனிப்படுத்திக் காட்டு</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">அடர்த்தியான பின்புலம்</translation>
 <translation id="27349076983469322">வெளிர் பின்புலம்</translation>
 <translation id="335581015389089642">பேச்சு</translation>
+<translation id="3784184786832188702">‘பேசும் திரை' அம்சம் இப்போது பொதுவான ‘உரையிலிருந்து பேச்சு’ அமைப்புகளைப் பயன்படுத்துகிறது.</translation>
 <translation id="5901630391730855834">மஞ்சள்</translation>
 <translation id="6017514345406065928">பச்சை</translation>
 <translation id="6475604559827479857">சொல்லைத் தனிப்படுத்திக் காட்டுவதற்கான வண்ணம்:</translation>
 <translation id="6837853484260746864">குரலைத் தேர்ந்தெடுக்கவும்:</translation>
+<translation id="7261612856573623172">சாதனத்தின் இயல்பு ‘உரையிலிருந்து பேச்சுக்கான' குரல்</translation>
 <translation id="7768784765476638775">பேசும் திரை</translation>
 <translation id="7914870167134465181">தனிப்படுத்திக் காட்டுதல்</translation>
+<translation id="8324974933005349667">’உரையிலிருந்து பேச்சு’ அமைப்புகளைத் தனிப்பயனாக்கவும்</translation>
 <translation id="992256792861109788">பிங்க்</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_th.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_th.xtb
index 08bea4a..8a0373f 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_th.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
+<translation id="111880247472081232">การตั้งค่าการอ่านออกเสียงข้อความของ "เลือกเพื่อให้อ่าน" ได้ย้ายไปอยู่ที่การตั้งค่าการอ่านออกเสียงข้อความส่วนกลางแล้ว</translation>
 <translation id="1197088940767939838">สีส้ม</translation>
+<translation id="1273314450961659276">การตั้งค่าการอ่านออกเสียงข้อความ</translation>
+<translation id="1498542103351704084">อัปเดตการตั้งค่าการอ่านออกเสียงข้อความของ "เลือกเพื่อให้อ่าน" แล้ว</translation>
 <translation id="1555130319947370107">สีน้ำเงิน</translation>
 <translation id="1666326070478924810">การตั้งค่าการเลือกเพื่อให้อ่าน</translation>
 <translation id="1966649499058910679">ไฮไลต์แต่ละคำในขณะที่พูด</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">พื้นหลังสีเข้ม</translation>
 <translation id="27349076983469322">พื้นหลังสีสว่าง</translation>
 <translation id="335581015389089642">คำพูด</translation>
+<translation id="3784184786832188702">ตอนนี้คุณจะใช้การตั้งค่าการอ่านออกเสียงข้อความส่วนกลางแทน "เลือกเพื่อให้อ่าน"</translation>
 <translation id="5901630391730855834">สีเหลือง</translation>
 <translation id="6017514345406065928">สีเขียว</translation>
 <translation id="6475604559827479857">สีสำหรับการไฮไลต์คำ:</translation>
 <translation id="6837853484260746864">เลือกเสียง:</translation>
+<translation id="7261612856573623172">เสียงการอ่านออกเสียงข้อความของระบบ</translation>
 <translation id="7768784765476638775">เลือกเพื่อให้อ่าน</translation>
 <translation id="7914870167134465181">การไฮไลต์</translation>
+<translation id="8324974933005349667">ปรับเปลี่ยนการตั้งค่าการอ่านออกเสียงข้อความในแบบของคุณ</translation>
 <translation id="992256792861109788">สีชมพู</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb
index 4c91c39..a6dec1e 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_tr.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
+<translation id="111880247472081232">Seç ve Dinle Metin Okuma ayarlarınız genel Metin Okuma ayarlarına taşınmıştır.</translation>
 <translation id="1197088940767939838">Turuncu</translation>
+<translation id="1273314450961659276">Metin Okuma ayarları</translation>
+<translation id="1498542103351704084">Seç ve Dinle konuşma ayarları güncellendi</translation>
 <translation id="1555130319947370107">Mavi</translation>
 <translation id="1666326070478924810">Seç ve Dinle Ayarları</translation>
 <translation id="1966649499058910679">Her kelimeyi söylenirken vurgula</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Koyu renkli arka plan</translation>
 <translation id="27349076983469322">Açık renkli arka plan</translation>
 <translation id="335581015389089642">Konuşma</translation>
+<translation id="3784184786832188702">Seç ve dinle artık genel Metin Okuma ayarlarını kullanıyor.</translation>
 <translation id="5901630391730855834">Sarı</translation>
 <translation id="6017514345406065928">Yeşil</translation>
 <translation id="6475604559827479857">Kelime vurgulama rengi:</translation>
 <translation id="6837853484260746864">Sesi seçin:</translation>
+<translation id="7261612856573623172">Sistem Metin Okuma sesi</translation>
 <translation id="7768784765476638775">Seç ve Dinle</translation>
 <translation id="7914870167134465181">Vurgulama</translation>
+<translation id="8324974933005349667">Metin Okuma ayarlarını kişiselleştir</translation>
 <translation id="992256792861109788">Pembe</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_uk.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_uk.xtb
index 4f4845a..342ebb7c 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_uk.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
+<translation id="111880247472081232">Ваші налаштування синтезу мовлення для функції читання з екрана перенесено до загальних налаштувань.</translation>
 <translation id="1197088940767939838">Оранжевий</translation>
+<translation id="1273314450961659276">Налаштування синтезу мовлення</translation>
+<translation id="1498542103351704084">Налаштування синтезу мовлення оновлено</translation>
 <translation id="1555130319947370107">Синій</translation>
 <translation id="1666326070478924810">Налаштування служби Читання з екрана</translation>
 <translation id="1966649499058910679">Виділяти кожне слово, яке озвучується</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Темний фон</translation>
 <translation id="27349076983469322">Світлий фон</translation>
 <translation id="335581015389089642">Speech</translation>
+<translation id="3784184786832188702">Функція читання з екрана зараз використовує загальні налаштування синтезу мовлення.</translation>
 <translation id="5901630391730855834">Жовтий</translation>
 <translation id="6017514345406065928">Зелений</translation>
 <translation id="6475604559827479857">Колір виділеного слова:</translation>
 <translation id="6837853484260746864">Виберіть голос:</translation>
+<translation id="7261612856573623172">Системний голос для синтезу мовлення</translation>
 <translation id="7768784765476638775">Читання з екрана</translation>
 <translation id="7914870167134465181">Виділення</translation>
+<translation id="8324974933005349667">Персоналізувати налаштування синтезу мовлення</translation>
 <translation id="992256792861109788">Рожевий</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb
index ce60731..fbd4357 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_vi.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
+<translation id="111880247472081232">Tùy chọn cài đặt Văn bản sang lời nói của tính năng Chọn để nói đã được chuyển sang tùy chọn cài đặt Văn bản sang lời nói chung.</translation>
 <translation id="1197088940767939838">Màu cam</translation>
+<translation id="1273314450961659276">Tùy chọn cài đặt Văn bản sang lời nói</translation>
+<translation id="1498542103351704084">Đã cập nhật tùy chọn cài đặt giọng nói của tính năng Chọn để nói</translation>
 <translation id="1555130319947370107">Xanh lam</translation>
 <translation id="1666326070478924810">Cài đặt chọn để nói</translation>
 <translation id="1966649499058910679">Đánh đấu từng từ khi từ được đọc</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">Nền tối</translation>
 <translation id="27349076983469322">Nền sáng</translation>
 <translation id="335581015389089642">Giọng nói</translation>
+<translation id="3784184786832188702">Tính năng Chọn để nói hiện sử dụng tùy chọn cài đặt Văn bản sang lời nói chung.</translation>
 <translation id="5901630391730855834">Vàng</translation>
 <translation id="6017514345406065928">Xanh lục</translation>
 <translation id="6475604559827479857">Màu đánh dấu cho từ:</translation>
 <translation id="6837853484260746864">Chọn một giọng nói:</translation>
+<translation id="7261612856573623172">Giọng nói của tính năng chuyển văn bản sang lời nói trong hệ thống</translation>
 <translation id="7768784765476638775">Chọn để nói</translation>
 <translation id="7914870167134465181">Đánh dấu</translation>
+<translation id="8324974933005349667">Cá nhân hóa các tùy chọn cài đặt Văn bản sang lời nói</translation>
 <translation id="992256792861109788">Màu hồng</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_zh-TW.xtb
index 3331095..c308940d 100644
--- a/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings_zh-TW.xtb
@@ -1,7 +1,10 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
+<translation id="111880247472081232">你的隨選朗讀文字轉語音設定已轉移至全域文字轉語音設定。</translation>
 <translation id="1197088940767939838">橘色</translation>
+<translation id="1273314450961659276">文字轉語音設定</translation>
+<translation id="1498542103351704084">隨選朗讀語音設定已更新</translation>
 <translation id="1555130319947370107">藍色</translation>
 <translation id="1666326070478924810">隨選朗讀設定</translation>
 <translation id="1966649499058910679">醒目顯示每個朗讀的字詞</translation>
@@ -9,11 +12,14 @@
 <translation id="2714180132046334502">深色背景</translation>
 <translation id="27349076983469322">淺色背景</translation>
 <translation id="335581015389089642">語音</translation>
+<translation id="3784184786832188702">隨選朗讀功能現在使用全域文字轉語音設定。</translation>
 <translation id="5901630391730855834">黃色</translation>
 <translation id="6017514345406065928">綠色</translation>
 <translation id="6475604559827479857">文字醒目顯示顏色:</translation>
 <translation id="6837853484260746864">選擇語音:</translation>
+<translation id="7261612856573623172">系統預設文字轉語音聲音</translation>
 <translation id="7768784765476638775">隨選朗讀</translation>
 <translation id="7914870167134465181">醒目顯示</translation>
+<translation id="8324974933005349667">個人化文字轉語音設定</translation>
 <translation id="992256792861109788">粉紅色</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.css b/chrome/browser/resources/local_ntp/custom_backgrounds.css
index 89b55e7a..2ade069 100644
--- a/chrome/browser/resources/local_ntp/custom_backgrounds.css
+++ b/chrome/browser/resources/local_ntp/custom_backgrounds.css
@@ -46,6 +46,7 @@
 #edit-bg-gear {
   background: url(../../../../ui/webui/resources/images/icon_settings.svg) no-repeat center;
   background-size: 16px 16px;
+  cursor: pointer;
   height: 100%;
   width: 100%;
 }
@@ -144,7 +145,7 @@
   width: 100%;
 }
 
-#custom-link-restore-default .bg-option-img {
+#custom-links-restore-default .bg-option-img {
   background: rgb(241, 243, 244) url(icons/link_gray.svg) no-repeat center;
   border-radius: 50%;
 }
@@ -189,7 +190,9 @@
   position: absolute;
   right: 0;
   top: 0;
-  width: 516px;
+  /* Suitable for 3 columns of tiles on all platforms, accounting for larger
+   * scrollbar width on Windows.*/
+  width: 517px;
   z-index: 10000;
 }
 
diff --git a/chrome/browser/resources/local_ntp/custom_backgrounds.js b/chrome/browser/resources/local_ntp/custom_backgrounds.js
index b3ba39d..b18d9b69 100644
--- a/chrome/browser/resources/local_ntp/custom_backgrounds.js
+++ b/chrome/browser/resources/local_ntp/custom_backgrounds.js
@@ -8,6 +8,45 @@
 let customBackgrounds = {};
 
 /**
+ * The browser embeddedSearch.newTabPage object.
+ * @type {Object}
+ */
+var ntpApiHandle;
+
+/**
+ * The different types of events that are logged from the NTP. This enum is
+ * used to transfer information from the NTP JavaScript to the renderer and is
+ * not used as a UMA enum histogram's logged value.
+ * Note: Keep in sync with common/ntp_logging_events.h
+ * @enum {number}
+ * @const
+ */
+var BACKGROUND_CUSTOMIZATION_LOG_TYPE = {
+  // The 'Chrome backgrounds' menu item was clicked.
+  NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED: 40,
+  // The 'Upload an image' menu item was clicked.
+  NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED: 41,
+  // The 'Restore default background' menu item was clicked.
+  NTP_CUSTOMIZE_RESTORE_BACKGROUND_CLICKED: 42,
+  // The attribution link on a customized background image was clicked.
+  NTP_CUSTOMIZE_ATTRIBUTION_CLICKED: 43,
+  // The 'Restore default shortcuts' menu item was clicked.
+  NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED: 46,
+  // A collection was selected in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION: 47,
+  // An image was selected in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE: 48,
+  // 'Cancel' was clicked in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL: 49,
+  // 'Done' was clicked in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_DONE: 50,
+  // 'Cancel' was clicked in the 'Upload an image' dialog.
+  NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL: 51,
+  // 'Done' was clicked in the 'Upload an image' dialog.
+  NTP_CUSTOMIZE_LOCAL_IMAGE_DONE: 52,
+};
+
+/**
  * Enum for key codes.
  * @enum {int}
  * @const
@@ -210,6 +249,8 @@
     attributionBox.classList.add(customBackgrounds.CLASSES.ATTR_LINK);
     attributionBox.onclick = function() {
       window.open(attributionActionUrl, '_blank');
+      ntpApiHandle.logEvent(
+          BACKGROUND_CUSTOMIZATION_LOG_TYPE.NTP_CUSTOMIZE_ATTRIBUTION_CLICKED);
     };
     attributionBox.style.cursor = 'pointer';
   }
@@ -238,7 +279,7 @@
   customBackgrounds.selectedTile = null;
 };
 
-/* Close the collection selection dailog and cleanup the state
+/* Close the collection selection dialog and cleanup the state
  * @param {dialog} menu The dialog to be closed
  */
 customBackgrounds.closeCollectionDialog = function(menu) {
@@ -255,6 +296,8 @@
   customBackgrounds.closeCollectionDialog($(customBackgrounds.IDS.MENU));
   window.chrome.embeddedSearch.newTabPage.setBackgroundURLWithAttributions(
       url, attributionLine1, attributionLine2, attributionActionUrl);
+  ntpApiHandle.logEvent(
+      BACKGROUND_CUSTOMIZATION_LOG_TYPE.NTP_CUSTOMIZE_CHROME_BACKGROUND_DONE);
 };
 
 /**
@@ -399,6 +442,9 @@
       if (sourceIsChromeBackgrounds) {
         imgScript.src = 'chrome-search://local-ntp/ntp-background-images.js?' +
             'collection_type=background&collection_id=' + tile.dataset.id;
+        ntpApiHandle.logEvent(
+            BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                .NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION);
       } else {
         imgScript.src = 'chrome-search://local-ntp/ntp-background-images.js?' +
             'collection_type=album&album_id=' + tile.dataset.id +
@@ -591,6 +637,8 @@
       $(customBackgrounds.IDS.REFRESH_TOGGLE).children[0].checked = false;
       $(customBackgrounds.IDS.DONE)
           .classList.add(customBackgrounds.CLASSES.DONE_AVAILABLE);
+      ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                                .NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE);
     };
 
     tile.onclick = function(event) {
@@ -710,6 +758,7 @@
  * menu items. Set the text and event handlers for the various elements.
  */
 customBackgrounds.init = function() {
+  ntpApiHandle = window.chrome.embeddedSearch.newTabPage;
   let editDialog = $(customBackgrounds.IDS.EDIT_BG_DIALOG);
   let menu = $(customBackgrounds.IDS.MENU);
 
@@ -723,6 +772,8 @@
   // Edit gear icon interaction events.
   let editBackgroundInteraction = function() {
     editDialog.showModal();
+    ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                              .NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED);
   };
   $(customBackgrounds.IDS.EDIT_BG).onclick = function(event) {
     editDialog.classList.add(customBackgrounds.CLASSES.MOUSE_NAV);
@@ -796,6 +847,8 @@
   let customLinksRestoreDefaultInteraction = function() {
     editDialog.close();
     window.chrome.embeddedSearch.newTabPage.resetCustomLinks();
+    ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                              .NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED);
   };
   $(customBackgrounds.IDS.CUSTOM_LINKS_RESTORE_DEFAULT).onclick =
       customLinksRestoreDefaultInteraction;
@@ -862,6 +915,8 @@
   // Interactions with the "Upload an image" option.
   var uploadImageInteraction = function(event) {
     window.chrome.embeddedSearch.newTabPage.selectLocalBackgroundImage();
+    ntpApiHandle.logEvent(
+        BACKGROUND_CUSTOMIZATION_LOG_TYPE.NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED);
   };
 
   $(customBackgrounds.IDS.UPLOAD_IMAGE).onclick = uploadImageInteraction;
@@ -888,6 +943,8 @@
     editDialog.close();
     customBackgrounds.clearAttribution();
     window.chrome.embeddedSearch.newTabPage.setBackgroundURL('');
+    ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                              .NTP_CUSTOMIZE_RESTORE_BACKGROUND_CLICKED);
   };
   $(customBackgrounds.IDS.RESTORE_DEFAULT).onclick = restoreDefaultInteraction;
   $(customBackgrounds.IDS.RESTORE_DEFAULT).onkeyup = function(event) {
@@ -996,10 +1053,14 @@
   // Interactions with the cancel button on the background picker dialog.
   $(customBackgrounds.IDS.CANCEL).onclick = function(event) {
     customBackgrounds.closeCollectionDialog(menu);
+    ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                              .NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL);
   };
   $(customBackgrounds.IDS.CANCEL).onkeyup = function(event) {
     if (event.keyCode === customBackgrounds.KEYCODES.ENTER) {
       customBackgrounds.closeCollectionDialog(menu);
+      ntpApiHandle.logEvent(BACKGROUND_CUSTOMIZATION_LOG_TYPE
+                                .NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL);
     }
   };
 
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.css b/chrome/browser/resources/local_ntp/custom_links_edit.css
index b07f963..83d0b42 100644
--- a/chrome/browser/resources/local_ntp/custom_links_edit.css
+++ b/chrome/browser/resources/local_ntp/custom_links_edit.css
@@ -2,8 +2,8 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
-#edit-link-dialog::backdrop {
-  background-color: rgba(255, 255, 255, .75);
+body {
+  overflow: hidden;
 }
 
 #edit-link-dialog {
@@ -21,6 +21,10 @@
   z-index: 10000;
 }
 
+#edit-link-dialog::backdrop {
+  background: transparent;
+}
+
 #edit-link-dialog > div {
   width: 100%;
 }
@@ -64,6 +68,10 @@
   width: calc(100% - 16px);
 }
 
+#url-field:not(.text-modified) {
+  color: rgba(32, 33, 36, 0.38);
+}
+
 .underline {
   border-bottom: 2px solid rgb(26, 115, 232);
   bottom: 0;
@@ -132,15 +140,15 @@
   transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
 }
 
+button:disabled {
+  transition: none;
+}
+
 button.primary {
   background-color: rgb(26, 115, 232);
   color: white;
 }
 
-button:focus:not(:active) {
-  box-shadow: 0 0 0 2px rgba(26, 115, 232, 0.4);
-}
-
 button.primary:disabled {
   background-color: rgb(241, 243, 244);
   color: rgb(128, 134, 139);
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.html b/chrome/browser/resources/local_ntp/custom_links_edit.html
index 56df26a..208ebe0b 100644
--- a/chrome/browser/resources/local_ntp/custom_links_edit.html
+++ b/chrome/browser/resources/local_ntp/custom_links_edit.html
@@ -17,15 +17,15 @@
         <label id="title-field-name" class="field-title"></label>
         <div class="input-container">
           <input id="title-field" class="field-input" type="text"
-              autocomplete="no" tabindex="0" required></input>
+              autocomplete="off" tabindex="0" required></input>
           <div class="underline"></div>
         </div>
       </div>
       <div id="url" class="field-container">
         <label id="url-field-name" class="field-title"></label>
         <div class="input-container">
-          <input id="url-field" class="field-input" type="text"
-              autocomplete="url" tabindex="0" required></input>
+          <input id="url-field" class="field-input" type="text" value="https://"
+              autocomplete="off" tabindex="0" required></input>
           <div class="underline"></div>
         </div>
         <div id="invalid-url" class="error-msg"></div>
diff --git a/chrome/browser/resources/local_ntp/custom_links_edit.js b/chrome/browser/resources/local_ntp/custom_links_edit.js
index ccf299a1..1f0e8124 100644
--- a/chrome/browser/resources/local_ntp/custom_links_edit.js
+++ b/chrome/browser/resources/local_ntp/custom_links_edit.js
@@ -36,6 +36,28 @@
 
 
 /**
+ * Enum for classes.
+ * @enum {string}
+ * @const
+ */
+const CLASSES = {
+  // Applied if the input field has been modified.
+  TEXT_MODIFIED: 'text-modified',
+};
+
+
+/**
+ * Enum for key codes.
+ * @enum {int}
+ * @const
+ */
+const KEYCODES = {
+  ENTER: 13,
+  ESC: 27,
+};
+
+
+/**
  * The origin of this request, i.e. 'https://www.google.TLD' for the remote NTP,
  * or 'chrome-search://local-ntp' for the local NTP.
  * @const {string}
@@ -62,6 +84,27 @@
 
 
 /**
+ * The title of the dialog when adding a link.
+ * @type {string}
+ */
+let addLinkTitle = '';
+
+
+/**
+ * The title of the dialog when editing a link.
+ * @type {string}
+ */
+let editLinkTitle = '';
+
+
+/**
+ * The accessibility title of remove link button.
+ * @type {string}
+ */
+let deleteLinkTitle = '';
+
+
+/**
  * True if the provided url is valid.
  * @type {string}
  */
@@ -91,6 +134,12 @@
   prepopulatedLink.rid = rid;
   $(IDS.TITLE_FIELD).value = prepopulatedLink.title = data.title;
   $(IDS.URL_FIELD).value = prepopulatedLink.url = data.url;
+  $(IDS.URL_FIELD).classList.add(CLASSES.TEXT_MODIFIED);
+
+  // Set accessibility names.
+  $(IDS.DELETE).name = deleteLinkTitle + ' ' + data.title;
+  $(IDS.DONE).name = editLinkTitle + ' ' + data.title;
+  $(IDS.DONE).title = editLinkTitle;
 }
 
 
@@ -123,9 +172,8 @@
 /**
  * Send a message to close the edit dialog. Called when the edit flow has been
  * completed. If the fields were unchanged, does not update the link data.
- * @param {!Event} event The click event.
  */
-function finishEditLink(event) {
+function finishEditLink() {
   // Show error message for invalid urls.
   if (!isValidURL($(IDS.URL_FIELD).value)) {
     showInvalidUrlUntilTextInput();
@@ -135,17 +183,17 @@
 
   let newUrl = '';
   let newTitle = '';
-  if ($(IDS.URL_FIELD).value != prepopulatedLink.url)
+  if ($(IDS.URL_FIELD).value != prepopulatedLink.url &&
+      $(IDS.URL_FIELD).value != 'https://')
     newUrl = $(IDS.URL_FIELD).value;
   if ($(IDS.TITLE_FIELD).value != prepopulatedLink.title)
     newTitle = $(IDS.TITLE_FIELD).value;
 
-  // Do not update link if fields were unchanged.
-  if (!newUrl && !newTitle)
-    return;
-
-  chrome.embeddedSearch.newTabPage.updateCustomLink(
-      prepopulatedLink.rid, newUrl, newTitle);
+  // Update the link only if a field was changed.
+  if (!!newUrl || !!newTitle) {
+    chrome.embeddedSearch.newTabPage.updateCustomLink(
+        prepopulatedLink.rid, newUrl, newTitle);
+  }
   closeDialog();
 }
 
@@ -166,13 +214,17 @@
  */
 function closeDialog() {
   window.parent.postMessage({cmd: 'closeDialog'}, DOMAIN_ORIGIN);
-  $(IDS.FORM).reset();
-  $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid');
-  $(IDS.DELETE).disabled = false;
-  $(IDS.DONE).disabled = false;
-  prepopulatedLink.rid = -1;
-  prepopulatedLink.title = '';
-  prepopulatedLink.url = '';
+  // Small delay to allow the dialog close before cleaning up.
+  window.setTimeout(function() {
+    $(IDS.FORM).reset();
+    $(IDS.URL_FIELD_CONTAINER).classList.remove('invalid');
+    $(IDS.URL_FIELD).classList.remove(CLASSES.TEXT_MODIFIED);
+    $(IDS.DELETE).disabled = false;
+    $(IDS.DONE).disabled = false;
+    prepopulatedLink.rid = -1;
+    prepopulatedLink.title = '';
+    prepopulatedLink.url = '';
+  }, 10);
 }
 
 
@@ -185,16 +237,39 @@
   let args = event.data;
   if (cmd === 'linkData') {
     if (args.tid) {  // We are editing a link, prepopulate the link data.
+      $(IDS.DIALOG_TITLE).textContent = editLinkTitle;
       prepopulateFields(args.tid);
     } else {  // We are adding a link, disable the delete button.
+      $(IDS.DIALOG_TITLE).textContent = addLinkTitle;
       $(IDS.DELETE).disabled = true;
       disableSubmitUntilTextInput();
+      // Set accessibility names.
+      $(IDS.DONE).name = $(IDS.DONE).title = addLinkTitle;
     }
   }
 }
 
 
 /**
+ * Disables the focus outline for |element| on mousedown.
+ * @param {Element} element The element to remove the focus outline from.
+ */
+function disableOutlineOnMouseClick(element) {
+  element.addEventListener('mousedown', (event) => {
+    element.style.outline = 'none';
+    let resetOutline = (event) => {
+      // Clear current focus to prevent the outline from reappearing when the
+      // user switches windows.
+      document.activeElement.blur();
+      element.style.outline = '';
+      element.removeEventListener('blur', resetOutline);
+    };
+    element.addEventListener('blur', resetOutline);
+  });
+}
+
+
+/**
  * Does some initialization and shows the dialog window.
  */
 function init() {
@@ -216,24 +291,46 @@
   }
 
   // Populate text content.
-  $(IDS.DIALOG_TITLE).textContent = queryArgs['title'];
+  addLinkTitle = queryArgs['addTitle'];
+  editLinkTitle = queryArgs['editTitle'];
+  deleteLinkTitle = queryArgs['linkRemove'];
+  $(IDS.DIALOG_TITLE).textContent = addLinkTitle;
   $(IDS.TITLE_FIELD_NAME).textContent = queryArgs['nameField'];
   $(IDS.TITLE_FIELD_NAME).name = queryArgs['nameField'];
   $(IDS.URL_FIELD_NAME).textContent = queryArgs['urlField'];
   $(IDS.URL_FIELD_NAME).name = queryArgs['urlField'];
-  $(IDS.DELETE).textContent = queryArgs['linkRemove'];
-  $(IDS.CANCEL).textContent = queryArgs['linkCancel'];
-  $(IDS.DONE).textContent = queryArgs['linkDone'];
+  $(IDS.DELETE).textContent = $(IDS.DELETE).title = queryArgs['linkRemove'];
+  $(IDS.CANCEL).textContent = $(IDS.CANCEL).title = $(IDS.CANCEL).name =
+      queryArgs['linkCancel'];
+  $(IDS.DONE).textContent = $(IDS.DONE).title = queryArgs['linkDone'];
   $(IDS.INVALID_URL).textContent = queryArgs['invalidUrl'];
 
   // Set up event listeners.
+  $(IDS.URL_FIELD).addEventListener('input', (event) => {
+    if (!$(IDS.URL_FIELD).classList.contains(CLASSES.TEXT_MODIFIED))
+      $(IDS.URL_FIELD).classList.add(CLASSES.TEXT_MODIFIED);
+  });
   $(IDS.DELETE).addEventListener('click', deleteLink);
   $(IDS.CANCEL).addEventListener('click', closeDialog);
   $(IDS.FORM).addEventListener('submit', (event) => {
     // Prevent the form from submitting and modifying the URL.
     event.preventDefault();
-    finishEditLink(event);
+    finishEditLink();
   });
+  $(IDS.FORM).onkeyup = (event) => {
+    if (event.keyCode === KEYCODES.ENTER) {
+      event.preventDefault();
+      if ($(IDS.DONE).disabled)
+        closeDialog();
+      else
+        finishEditLink();
+    } else if (event.keyCode === KEYCODES.ESC) {
+      closeDialog();
+    }
+  };
+  disableOutlineOnMouseClick($(IDS.DELETE));
+  disableOutlineOnMouseClick($(IDS.CANCEL));
+  disableOutlineOnMouseClick($(IDS.DONE));
 
   // Change input field name to blue on input field focus.
   let changeColor = (fieldTitle) => {
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 6d7a3a6b..5c96cc1d 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -75,10 +75,6 @@
   display: block;
 }
 
-body.hidden {
-  overflow: hidden;
-}
-
 /* Button defaults vary by platform. Reset CSS so that the NTP can use buttons
  * as a kind of clickable div. */
 button {
@@ -284,7 +280,7 @@
 }
 
 #fakebox-container {
-  margin: 0 auto 8px auto;
+  margin: 0 auto 0 auto;
   width: var(--content-width);
 }
 
@@ -676,14 +672,26 @@
   width: 100%;
 }
 
+#custom-links-edit-dialog {
+  background: transparent;
+  border: none;
+  height: 100%;
+  padding: 0;
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+#custom-links-edit-dialog::backdrop {
+  background-color: rgba(255, 255, 255, .75);
+}
+
 #custom-links-edit {
   border: none;
-  display: none;
   height: 100%;
   position: absolute;
   top: 0;
   width: 100%;
-  z-index: 10000;
 }
 
 #custom-links-edit.show {
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index ecfdc01e..e17edfe 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -110,6 +110,7 @@
   ATTRIBUTION: 'attribution',
   ATTRIBUTION_TEXT: 'attribution-text',
   CUSTOM_LINKS_EDIT_IFRAME: 'custom-links-edit',
+  CUSTOM_LINKS_EDIT_IFRAME_DIALOG: 'custom-links-edit-dialog',
   FAKEBOX: 'fakebox',
   FAKEBOX_INPUT: 'fakebox-input',
   FAKEBOX_TEXT: 'fakebox-text',
@@ -173,6 +174,22 @@
 
   // The One Google Bar was shown.
   NTP_ONE_GOOGLE_BAR_SHOWN: 37,
+
+  // The background has been customized.
+  NTP_BACKGROUND_CUSTOMIZED: 38,
+  // Shortcuts have been customized.
+  NTP_SHORTCUT_CUSTOMIZED: 39,
+  // 'Remove' was clicked in the 'Edit shortcut' dialog.
+  NTP_CUSTOMIZE_SHORTCUT_REMOVE: 53,
+  // 'Cancel' was clicked in the 'Edit shortcut' dialog.
+
+  NTP_CUSTOMIZE_SHORTCUT_CANCEL: 54,
+  // 'Done' was clicked in the 'Edit shortcut' dialog.
+  NTP_CUSTOMIZE_SHORTCUT_DONE: 55,
+  // 'Undo' was clicked in the message pop-up.
+  NTP_CUSTOMIZE_SHORTCUT_UNDO: 56,
+  // 'Restore default shortcuts' was clicked in the message pop-up.
+  NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL: 57,
 };
 
 
@@ -321,6 +338,7 @@
   setCustomThemeStyle(info);
 
   if (info.customBackgroundConfigured) {
+    ntpApiHandle.logEvent(LOG_TYPE.NTP_BACKGROUND_CUSTOMIZED);
     var imageWithOverlay = [
       customBackgrounds.CUSTOM_BACKGROUND_OVERLAY, 'url(' + info.imageUrl + ')'
     ].join(',').trim();
@@ -353,6 +371,8 @@
       .classList.toggle(
           customBackgrounds.CLASSES.OPTION_DISABLED,
           !info.customBackgroundConfigured);
+  $(customBackgrounds.IDS.RESTORE_DEFAULT).tabIndex =
+      (info.customBackgroundConfigured ? 0 : -1);
 
   if (configData.isGooglePage) {
     // Hide the settings menu or individual options if the related features are
@@ -543,6 +563,7 @@
  */
 function onAddCustomLinkDone(success) {
   showNotification(configData.translatedStrings.linkAddedMsg);
+  ntpApiHandle.logEvent(LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_DONE);
 }
 
 
@@ -554,6 +575,7 @@
  */
 function onUpdateCustomLinkDone(success) {
   showNotification(configData.translatedStrings.linkEditedMsg);
+  ntpApiHandle.logEvent(LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_DONE);
 }
 
 
@@ -565,6 +587,7 @@
  */
 function onDeleteCustomLinkDone(success) {
   showNotification(configData.translatedStrings.linkRemovedMsg);
+  ntpApiHandle.logEvent(LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_REMOVE);
 }
 
 
@@ -631,10 +654,12 @@
  */
 function onUndo() {
   hideNotification();
-  if (configData.isCustomLinksEnabled)
+  if (configData.isCustomLinksEnabled) {
     ntpApiHandle.undoCustomLinkAction();
-  else if (lastBlacklistedTile != null)
+    ntpApiHandle.logEvent(LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_UNDO);
+  } else if (lastBlacklistedTile != null) {
     ntpApiHandle.undoMostVisitedDeletion(lastBlacklistedTile);
+  }
 }
 
 
@@ -644,10 +669,12 @@
  */
 function onRestoreAll() {
   hideNotification();
-  if (configData.isCustomLinksEnabled)
+  if (configData.isCustomLinksEnabled) {
     ntpApiHandle.resetCustomLinks();
-  else
+    ntpApiHandle.logEvent(LOG_TYPE.NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL);
+  } else {
     ntpApiHandle.undoAllMostVisitedDeletions();
+  }
 }
 
 
@@ -715,17 +742,6 @@
 
 
 /**
- * @param {boolean} show True if do show the edit custom link dialog and disable
- *  scrolling.
- */
-function setEditCustomLinkDialogVisibility(show) {
-  $(IDS.CUSTOM_LINKS_EDIT_IFRAME)
-      .classList.toggle(CLASSES.SHOW_EDIT_DIALOG, show);
-  document.body.classList.toggle(CLASSES.HIDE_BODY_OVERFLOW, show);
-}
-
-
-/**
  * @param {!Element} element The element to register the handler for.
  * @param {number} keycode The keycode of the key to register.
  * @param {!Function} handler The key handler to register.
@@ -761,10 +777,15 @@
       };
     }
     if (configData.isCustomLinksEnabled) {
+      if (args.showRestoreDefault) {
+        ntpApiHandle.logEvent(LOG_TYPE.NTP_SHORTCUT_CUSTOMIZED);
+      }
       $(customBackgrounds.IDS.CUSTOM_LINKS_RESTORE_DEFAULT)
           .classList.toggle(
               customBackgrounds.CLASSES.OPTION_DISABLED,
               !args.showRestoreDefault);
+      $(customBackgrounds.IDS.CUSTOM_LINKS_RESTORE_DEFAULT).tabIndex =
+          (args.showRestoreDefault ? 0 : -1);
     }
   } else if (cmd === 'tileBlacklisted') {
     if (configData.isCustomLinksEnabled) {
@@ -787,9 +808,12 @@
   } else if (cmd === 'startEditLink') {
     $(IDS.CUSTOM_LINKS_EDIT_IFRAME)
         .contentWindow.postMessage({cmd: 'linkData', tid: args.tid}, '*');
-    setEditCustomLinkDialogVisibility(true);
+    // Small delay to allow the dialog to finish setting up before displaying.
+    window.setTimeout(function() {
+      $(IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG).showModal();
+    }, 10);
   } else if (cmd === 'closeDialog') {
-    setEditCustomLinkDialogVisibility(false);
+    $(IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG).close();
   }
 }
 
@@ -880,6 +904,26 @@
   }
 }
 
+
+/**
+ * Disables the focus outline for |element| on mousedown.
+ * @param {Element} element The element to remove the focus outline from.
+ */
+function disableOutlineOnMouseClick(element) {
+  element.addEventListener('mousedown', (event) => {
+    element.style.outline = 'none';
+    let resetOutline = (event) => {
+      // Clear current focus to prevent the outline from reappearing when the
+      // user switches windows.
+      document.activeElement.blur();
+      element.style.outline = '';
+      element.removeEventListener('blur', resetOutline);
+    };
+    element.addEventListener('blur', resetOutline);
+  });
+}
+
+
 /**
  * Prepares the New Tab Page by adding listeners, the most visited pages
  * section, and Google-specific elements for a Google-provided page.
@@ -997,6 +1041,7 @@
     inputbox.ondragleave = function() {
       setFakeboxDragFocus(false);
     };
+    disableOutlineOnMouseClick($(IDS.FAKEBOX_MICROPHONE));
 
     // Update the fakebox style to match the current key capturing state.
     setFakeboxFocus(searchboxApiHandle.isKeyCaptureEnabled);
@@ -1109,7 +1154,10 @@
       clArgs.push('rtl=1');
 
     clArgs.push(
-        'title=' +
+        'addTitle=' +
+        encodeURIComponent(configData.translatedStrings.addLinkTitle));
+    clArgs.push(
+        'editTitle=' +
         encodeURIComponent(configData.translatedStrings.editLinkTitle));
     clArgs.push(
         'nameField=' +
@@ -1136,7 +1184,10 @@
     clIframe.name = IDS.CUSTOM_LINKS_EDIT_IFRAME;
     clIframe.title = configData.translatedStrings.editLinkTitle;
     clIframe.src = 'chrome-search://most-visited/edit.html?' + clArgs.join('&');
-    document.body.appendChild(clIframe);
+    let clIframeDialog = document.createElement('dialog');
+    clIframeDialog.id = IDS.CUSTOM_LINKS_EDIT_IFRAME_DIALOG;
+    clIframeDialog.appendChild(clIframe);
+    document.body.appendChild(clIframeDialog);
   }
 
   window.addEventListener('message', handlePostMessage);
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.css b/chrome/browser/resources/local_ntp/most_visited_single.css
index bcffbbf..7375b7d 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.css
+++ b/chrome/browser/resources/local_ntp/most_visited_single.css
@@ -375,14 +375,12 @@
   display: none;
 }
 
-.md-tile {
+.md-tile-container {
   border-radius: 4px;
   box-sizing: border-box;
-  cursor: pointer;
   height: var(--md-tile-height);
   margin-bottom: var(--md-tile-margin);
   opacity: 1;
-  padding: var(--md-tile-padding-vertical) var(--md-tile-padding-horizontal);
   position: relative;
   transition-property:
       background, background-color, border-color, box-shadow, opacity,
@@ -390,29 +388,34 @@
   width: var(--md-tile-width);
 }
 
+.md-tile {
+  cursor: pointer;
+  padding: var(--md-tile-padding-vertical) var(--md-tile-padding-horizontal);
+}
+
 .md-empty-tile {
   display: none;
 }
 
-.md-tile:hover {
+.md-tile-container:hover {
   background-color: rgba(33, 32, 36, 0.06);
 }
 
-body.dark-theme .md-tile:hover {
+body.dark-theme .md-tile-container:hover {
   background-color: rgba(255, 255, 255, 0.1);
 }
 
-.md-tile:hover > .md-menu {
+.md-tile-container:hover .md-menu {
   opacity: 1;
   transition-delay: 500ms;
 }
 
-body.dark-theme .md-tile:active .md-menu::after {
-  background-color: rgba(33, 32, 36, 0.71);
-  transition-delay: 500ms;
+body.dark-theme .md-tile-container:active + .md-menu::after {
+  background-color: rgb(189, 193, 198);
+  transition-delay: 0ms;
 }
 
-.md-tile.blacklisted {
+.md-tile-container.blacklisted {
   margin: 0;
   padding: 0;
   transform: scale(0, 0);
@@ -426,20 +429,10 @@
   display: flex;
   flex-flow: column nowrap;
   height: 100%;
-  position: relative;
   width: 100%;
   z-index: -1;
 }
 
-.md-link {
-  height: 100%;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-  width: 100%;
-}
-
 .md-icon {
   margin-bottom: var(--md-icon-margin-bottom);
 }
@@ -508,7 +501,6 @@
 body.using-theme .md-title-container {
   background-color: white;
   border-radius: 12px;
-  height: 24px;
   padding: 4px;
 }
 
diff --git a/chrome/browser/resources/local_ntp/most_visited_single.js b/chrome/browser/resources/local_ntp/most_visited_single.js
index cea6402e..f48dda0a 100644
--- a/chrome/browser/resources/local_ntp/most_visited_single.js
+++ b/chrome/browser/resources/local_ntp/most_visited_single.js
@@ -30,15 +30,15 @@
   MD_FALLBACK_BACKGROUND: 'md-fallback-background',
   MD_FALLBACK_LETTER: 'md-fallback-letter',
   MD_FAVICON: 'md-favicon',
-  MD_LINK: 'md-link',
   MD_ICON: 'md-icon',
   MD_ICON_BACKGROUND: 'md-icon-background',
   MD_ADD_ICON: 'md-add-icon',
   MD_ADD_BACKGROUND: 'md-add-background',
   MD_MENU: 'md-menu',
   MD_EDIT_MENU: 'md-edit-menu',
-  MD_TILE: 'md-tile',
+  MD_TILE: 'md-tile-container',
   MD_TILE_INNER: 'md-tile-inner',
+  MD_TILE_LINK: 'md-tile',
   MD_TITLE: 'md-title',
   MD_TITLE_CONTAINER: 'md-title-container',
 };
@@ -60,6 +60,11 @@
   // before the actual DOM elements have loaded (in particular the thumbnail
   // images).
   NTP_ALL_TILES_RECEIVED: 12,
+
+  // The 'Add shortcut' link was clicked.
+  NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED: 44,
+  // The 'Edit shortcut' link was clicked.
+  NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED: 45,
 };
 
 
@@ -454,6 +459,25 @@
 
 
 /**
+ * Disables the focus outline for |element| on mousedown.
+ * @param {Element} element The element to remove the focus outline from.
+ */
+function disableOutlineOnMouseClick(element) {
+  element.addEventListener('mousedown', (event) => {
+    element.style.outline = 'none';
+    let resetOutline = (event) => {
+      // Clear current focus to prevent the outline from reappearing when the
+      // user switches windows.
+      document.activeElement.blur();
+      element.style.outline = '';
+      element.removeEventListener('blur', resetOutline);
+    };
+    element.addEventListener('blur', resetOutline);
+  });
+}
+
+
+/**
  * Renders a MostVisited tile to the DOM.
  * @param {object} data Object containing rid, url, title, favicon, thumbnail,
  *     and optionally isAddButton. isAddButton is true if you want to construct
@@ -628,12 +652,14 @@
  * @return {Element}
  */
 function renderMaterialDesignTile(data) {
-  let mdTile = document.createElement('a');
+  let mdTile = document.createElement('div');
+  mdTile.role = 'none';
 
   if (data == null) {
     mdTile.className = CLASSES.MD_EMPTY_TILE;
     return mdTile;
   }
+  mdTile.className = CLASSES.MD_TILE;
 
   if (data.isCustomLink)
     tilesAreCustomLinks = true;
@@ -643,25 +669,28 @@
   // This is set in the load/error event for the favicon image.
   let tileType = TileVisualType.NONE;
 
-  mdTile.className = CLASSES.MD_TILE;
-  mdTile.setAttribute('data-tid', data.tid);
-  mdTile.setAttribute('data-pos', position);
+  let mdTileLink = document.createElement('a');
+  mdTileLink.className = CLASSES.MD_TILE_LINK;
+  mdTileLink.tabIndex = 0;
+  mdTileLink.setAttribute('data-tid', data.tid);
+  mdTileLink.setAttribute('data-pos', position);
   if (isSchemeAllowed(data.url)) {
-    mdTile.href = data.url;
+    mdTileLink.href = data.url;
   }
-  mdTile.setAttribute('aria-label', data.title);
-  mdTile.title = data.title;
+  mdTileLink.setAttribute('aria-label', data.title);
+  mdTileLink.title = data.title;
 
-  mdTile.addEventListener('click', function(ev) {
+  mdTileLink.addEventListener('click', function(ev) {
     if (data.isAddButton) {
       editCustomLink();
+      logEvent(LOG_TYPE.NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED);
     } else {
       logMostVisitedNavigation(
           position, data.tileTitleSource, data.tileSource, tileType,
           data.dataGenerationTime);
     }
   });
-  mdTile.addEventListener('keydown', function(event) {
+  mdTileLink.addEventListener('keydown', function(event) {
     if ((event.keyCode == 46 /* DELETE */ ||
          event.keyCode == 8 /* BACKSPACE */) &&
         !data.isAddButton) {
@@ -673,14 +702,18 @@
       event.preventDefault();
       this.click();
     } else if (event.keyCode == 37 /* LEFT */) {
-      const tiles = document.querySelectorAll('#mv-tiles .' + CLASSES.MD_TILE);
-      tiles[Math.max(this.getAttribute('data-pos') - 1, 0)].focus();
+      const tiles =
+          document.querySelectorAll('#mv-tiles .' + CLASSES.MD_TILE_LINK);
+      tiles[Math.max(Number(this.getAttribute('data-pos')) - 1, 0)].focus();
     } else if (event.keyCode == 39 /* RIGHT */) {
-      const tiles = document.querySelectorAll('#mv-tiles .' + CLASSES.MD_TILE);
-      tiles[Math.min(this.getAttribute('data-pos') + 1, tiles.length - 1)]
+      const tiles =
+          document.querySelectorAll('#mv-tiles .' + CLASSES.MD_TILE_LINK);
+      tiles[Math.min(
+                Number(this.getAttribute('data-pos')) + 1, tiles.length - 1)]
           .focus();
     }
   });
+  disableOutlineOnMouseClick(mdTileLink);
 
   let mdTileInner = document.createElement('div');
   mdTileInner.className = CLASSES.MD_TILE_INNER;
@@ -754,7 +787,8 @@
   mdTitle.style.direction = data.direction || 'ltr';
   mdTitleContainer.appendChild(mdTitle);
   mdTileInner.appendChild(mdTitleContainer);
-  mdTile.appendChild(mdTileInner);
+  mdTileLink.appendChild(mdTileInner);
+  mdTile.appendChild(mdTileLink);
 
   if (!data.isAddButton) {
     let mdMenu = document.createElement('button');
@@ -762,25 +796,29 @@
     if (isCustomLinksEnabled) {
       mdMenu.classList.add(CLASSES.MD_EDIT_MENU);
       mdMenu.title = queryArgs['editLinkTooltip'] || '';
+      mdMenu.name = (queryArgs['editLinkTooltip'] || '') + ' ' + data.title;
       mdMenu.addEventListener('click', function(ev) {
         editCustomLink(data.tid);
         ev.preventDefault();
         ev.stopPropagation();
+        logEvent(LOG_TYPE.NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED);
       });
     } else {
       mdMenu.title = queryArgs['removeTooltip'] || '';
+      mdMenu.name = (queryArgs['removeTooltip'] || '') + ' ' + data.title;
       mdMenu.addEventListener('click', function(ev) {
         removeAllOldTiles();
-        blacklistTile(mdTile);
+        blacklistTile(mdTileLink);
         ev.preventDefault();
         ev.stopPropagation();
       });
     }
     // Don't allow the event to bubble out to the containing tile, as that would
     // trigger navigation to the tile URL.
-    mdMenu.addEventListener('keydown', function(event) {
+    mdMenu.addEventListener('keydown', function(ev) {
       event.stopPropagation();
     });
+    disableOutlineOnMouseClick(mdMenu);
 
     mdTile.appendChild(mdMenu);
   }
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
index ce3ceb1..cb45f58f 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.css
@@ -14,11 +14,6 @@
   width: var(--non-navigation-icon-size);
 }
 
-#cast-mode-list {
-  padding-bottom: 12px;
-  padding-top: 4px;
-}
-
 #container-header {
   position: fixed;
   width: 100%;
@@ -127,21 +122,36 @@
   --cr-checkbox-ripple-opacity: 0.25;
 }
 
-paper-item {
+.selectable-item {
+  -webkit-appearance: none;
+  align-items: center;
+  background: none;
+  border: none;
   cursor: pointer;
+  display: flex;
+  font-family: inherit;
   font-size: 1.0em;
   line-height: 0;
   min-height: 0;
+  outline: 0;
   padding: 12px 0;
+  text-align: initial;
+  width: 100%;
 }
 
-paper-item:hover {
+.selectable-item:hover,
+.selectable-item:focus {
   background-color: rgb(238, 238, 238);
   border: 0;
 }
 
-paper-listbox {
+.selectable-item.iron-selected {
+  font-weight: bold;
+}
+
+iron-selector {
   color: rgba(0, 0, 0, 0.87);
+  display: block;
   overflow-x: hidden;
   overflow-y: auto;
   padding-bottom: 0;
@@ -149,6 +159,11 @@
   user-select: none;
 }
 
+iron-selector#cast-mode-list {
+  padding-bottom: 12px;
+  padding-top: 4px;
+}
+
 #search-input-container {
   flex-grow: 1;
 }
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
index 3be58dc..50075c1 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.html
@@ -3,8 +3,7 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
 <link rel="import" href="chrome://resources/html/i18n_behavior.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-item/paper-item.html">
-<link rel="import" href="chrome://resources/polymer/v1_0/paper-listbox/paper-listbox.html">
+<link rel="import" href="chrome://resources/polymer/v1_0/iron-selector/iron-selector.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-spinner/paper-spinner-lite.html">
 <link rel="import" href="../media_router_header/media_router_header.html">
 <link rel="import" href="../route_details/route_details.html">
@@ -52,16 +51,17 @@
     </media-router-header>
     <div id="content">
       <template is="dom-if" if="[[!computeCastModeListHidden_(currentView_)]]">
-        <paper-listbox id="cast-mode-list" role="presentation"
-            selectable="paper-item" selected="{{selectedCastModeMenuItem_}}">
+        <iron-selector id="cast-mode-list" role="presentation"
+            selectable=".selectable-item"
+            selected="{{selectedCastModeMenuItem_}}">
           <template is="dom-repeat" id="presentationCastModeList"
               items="[[computePresentationCastModeList_(castModeList)]]">
-            <paper-item on-tap="onCastModeClick_">
+            <button class="selectable-item" on-click="onCastModeClick_">
               <iron-icon class="cast-mode-icon"
                   icon="[[computeCastModeIcon_(item)]]">
               </iron-icon>
               <div><span>[[item.host]]</span></div>
-            </paper-item>
+            </button>
           </template>
           <div id="share-screen-text" class="subheading-text"
               hidden$="[[computeShareScreenSubheadingHidden_(castModeList)]]">
@@ -69,12 +69,12 @@
           </div>
           <template is="dom-repeat" id="shareScreenCastModeList"
               items="[[computeShareScreenCastModeList_(castModeList)]]">
-            <paper-item on-tap="onCastModeClick_">
+            <button class="selectable-item" on-click="onCastModeClick_">
               <iron-icon class="cast-mode-icon"
                   icon="[[computeCastModeIcon_(item)]]">
               </iron-icon>
               <div><span>[[item.description]]</span></div>
-            </paper-item>
+            </button>
           </template>
           <div id="cast-local-media-text" class="subheading-text"
               hidden$="[[computeLocalMediaSubheadingHidden_(castModeList)]]">
@@ -82,14 +82,14 @@
           </div>
           <template is="dom-repeat" id="localMediaCastModeList"
               items="[[computeLocalMediaCastModeList_(castModeList)]]">
-            <paper-item on-tap="onCastModeClick_">
+            <button class="selectable-item" on-click="onCastModeClick_">
               <iron-icon class="cast-mode-icon"
                   icon="[[computeCastModeIcon_(item)]]">
               </iron-icon>
               <div><span>[[item.description]]</span></div>
-            </paper-item>
+            </button>
           </template>
-        </paper-listbox>
+        </iron-selector>
       </template>
       <template is="dom-if"
           if="[[!computeRouteDetailsHidden_(currentView_, issue)]]">
@@ -116,9 +116,10 @@
         </div>
         <template is="dom-if" if="[[!computeSinkListHidden_(sinksToShow_)]]">
           <div id="sink-list" hidden$="[[hideSinkListForAnimation_]]">
-            <paper-listbox id="sink-list-paper-menu" role="presentation">
+            <iron-selector id="sink-list-paper-menu" role="presentation"
+                selectable=".selectable-item">
               <template is="dom-repeat" id="sinkList" items="[[sinksToShow_]]">
-                <paper-item on-tap="onSinkClick_">
+                <button class="selectable-item" on-click="onSinkClick_">
                   <div class="sink-content">
                     <div>
                       <iron-icon icon="[[computeSinkIcon_(item)]]"
@@ -151,9 +152,9 @@
                       </template>
                     </div>
                   </div>
-                </paper-item>
+                </button>
               </template>
-            </paper-listbox>
+            </iron-selector>
           </div>
         </template>
         <template is="dom-if" if="[[searchEnabled_]]">
@@ -177,11 +178,12 @@
             </div>
             <div id="search-results"
                 hidden$="[[computeSearchResultsHidden_(searchResultsToShow_, isSearchListHidden_)]]">
-              <paper-listbox id="search-results-paper-menu" selected="0"
-                  role="presentation">
+              <iron-selector id="search-results-paper-menu" selected="0"
+                  role="presentation" selectable=".selectable-item">
                 <template is="dom-repeat" id="searchResults"
                     items="[[searchResultsToShow_]]">
-                  <paper-item class="search-item" on-tap="onSinkClick_">
+                  <button class="search-item selectable-item"
+                      on-click="onSinkClick_">
                     <div class="sink-content">
                       <div>
                         <iron-icon icon="[[computeSinkIcon_(item.sinkItem)]]"
@@ -217,9 +219,9 @@
                         </template>
                       </div>
                     </div>
-                  </paper-item>
+                  </button>
                 </template>
-              </paper-listbox>
+              </iron-selector>
             </div>
           </div>
         </template>
diff --git a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
index d10960c..5068766 100644
--- a/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
+++ b/chrome/browser/resources/media_router/elements/media_router_container/media_router_container.js
@@ -1395,9 +1395,10 @@
    * @private
    */
   maybeUpdateFocusOnFilterViewExit_: function() {
-    var searchSinks = this.$$('#search-results').querySelectorAll('paper-item');
+    var searchSinks =
+        this.$$('#search-results').querySelectorAll('.selectable-item');
     var focusedElem = Array.prototype.find.call(searchSinks, function(sink) {
-      return sink.focused;
+      return sink.matches(':focus');
     });
     if (!focusedElem) {
       return;
diff --git a/chrome/browser/resources/media_router/media_router.css b/chrome/browser/resources/media_router/media_router.css
index 4b3904a..6b6092e 100644
--- a/chrome/browser/resources/media_router/media_router.css
+++ b/chrome/browser/resources/media_router/media_router.css
@@ -2,6 +2,11 @@
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
+html {
+  /* Remove 300ms delay for 'click' event, when using touch interface. */
+  touch-action: manipulation;
+}
+
 body {
   font-size: 0.75em;
   margin: 0;
diff --git a/chrome/browser/resources/print_preview/native_layer.js b/chrome/browser/resources/print_preview/native_layer.js
index 021f981..e95d046 100644
--- a/chrome/browser/resources/print_preview/native_layer.js
+++ b/chrome/browser/resources/print_preview/native_layer.js
@@ -38,6 +38,7 @@
  *   documentHasSelection: boolean,
  *   shouldPrintSelectionOnly: boolean,
  *   printerName: string,
+ *   forceEnableHeaderFooter: ?boolean,
  *   serializedAppStateStr: ?string,
  *   serializedDefaultDestinationSelectionRulesStr: ?string,
  * }}
diff --git a/chrome/browser/resources/print_preview/new/app.js b/chrome/browser/resources/print_preview/new/app.js
index 9995f2d..11cc5a7 100644
--- a/chrome/browser/resources/print_preview/new/app.js
+++ b/chrome/browser/resources/print_preview/new/app.js
@@ -325,6 +325,7 @@
     this.notifyPath('documentInfo_.title');
     this.notifyPath('documentInfo_.pageCount');
     this.$.model.setStickySettings(settings.serializedAppStateStr);
+    this.$.model.setPolicySettings(settings.forceEnableHeaderFooter);
     this.measurementSystem_ = new print_preview.MeasurementSystem(
         settings.thousandsDelimeter, settings.decimalDelimeter,
         settings.unitType);
diff --git a/chrome/browser/resources/print_preview/new/model.js b/chrome/browser/resources/print_preview/new/model.js
index 4e73435..12d79f76 100644
--- a/chrome/browser/resources/print_preview/new/model.js
+++ b/chrome/browser/resources/print_preview/new/model.js
@@ -96,6 +96,7 @@
             unavailableValue: [],
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
           copies: {
@@ -103,6 +104,7 @@
             unavailableValue: '1',
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
           collate: {
@@ -110,6 +112,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isCollateEnabled',
           },
           layout: {
@@ -117,6 +120,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isLandscapeEnabled',
           },
           color: {
@@ -124,6 +128,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isColorEnabled',
           },
           mediaSize: {
@@ -134,6 +139,7 @@
             unavailableValue: {},
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'mediaSize',
           },
           margins: {
@@ -142,6 +148,7 @@
                 print_preview.ticket_items.MarginsTypeValue.DEFAULT,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'marginsType',
           },
           customMargins: {
@@ -154,6 +161,7 @@
             unavailableValue: {},
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'customMargins',
           },
           dpi: {
@@ -161,6 +169,7 @@
             unavailableValue: {},
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'dpi',
           },
           fitToPage: {
@@ -168,6 +177,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isFitToPageEnabled',
           },
           scaling: {
@@ -175,6 +185,7 @@
             unavailableValue: '100',
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'scaling',
           },
           duplex: {
@@ -182,6 +193,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isDuplexEnabled',
           },
           cssBackground: {
@@ -189,6 +201,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isCssBackgroundEnabled',
           },
           selectionOnly: {
@@ -196,6 +209,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
           headerFooter: {
@@ -203,6 +217,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'isHeaderFooterEnabled',
           },
           rasterize: {
@@ -210,6 +225,7 @@
             unavailableValue: false,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
           vendorItems: {
@@ -217,6 +233,7 @@
             unavailableValue: {},
             valid: true,
             available: true,
+            setByPolicy: false,
             key: 'vendorOptions',
           },
           pagesPerSheet: {
@@ -224,6 +241,7 @@
             unavailableValue: 1,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
           // This does not represent a real setting value, and is used only to
@@ -233,6 +251,7 @@
             unavailableValue: null,
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
           // This does not represent a real settings value, but is used to
@@ -242,6 +261,7 @@
             unavailableValue: [],
             valid: true,
             available: true,
+            setByPolicy: false,
             key: '',
           },
         };
@@ -469,12 +489,12 @@
   updateSettingsValues_: function(caps) {
     if (this.settings.mediaSize.available) {
       const defaultOption = caps.media_size.option.find(o => !!o.is_default);
-      this.set('settings.mediaSize.value', defaultOption);
+      this.setSetting('mediaSize', defaultOption);
     }
 
     if (this.settings.dpi.available) {
       const defaultOption = caps.dpi.option.find(o => !!o.is_default);
-      this.set('settings.dpi.value', defaultOption);
+      this.setSetting('dpi', defaultOption);
     } else if (
         caps && caps.dpi && caps.dpi.option && caps.dpi.option.length > 0) {
       this.set('settings.dpi.unavailableValue', caps.dpi.option[0]);
@@ -483,8 +503,8 @@
     if (this.settings.color.available) {
       const defaultOption = this.destination.defaultColorOption;
       if (defaultOption) {
-        this.set(
-            'settings.color.value',
+        this.setSetting(
+            'color',
             !['STANDARD_MONOCHROME', 'CUSTOM_MONOCHROME'].includes(
                 defaultOption.type));
       }
@@ -518,7 +538,7 @@
         if (defaultValue != null)
           vendorSettings[item.id] = defaultValue;
       }
-      this.set('settings.vendorItems.value', vendorSettings);
+      this.setSetting('vendorItems', vendorSettings);
     }
   },
 
@@ -561,6 +581,18 @@
   },
 
   /**
+   * @param {string} settingName
+   * @param {*} value
+   * @private
+   */
+  setPolicy_: function(settingName, value) {
+    if (value === undefined)
+      return;
+    this.setSetting(settingName, value);
+    this.set(`settings.${settingName}.setByPolicy`, true);
+  },
+
+  /**
    * Caches the sticky settings and sets up the recent destinations. Sticky
    * settings will be applied when destinaton capabilities have been retrieved.
    * @param {?string} savedSettingsStr The sticky settings from native layer
@@ -591,13 +623,23 @@
     this.stickySettings_ = savedSettings;
   },
 
+  /**
+   * Sets settings in accordance to policies from native code, and prevents
+   * those settings from being changed via other means.
+   * @param {?boolean} forceEnableHeaderFooter Whether to force the
+   *     header/footer to display, or undefined if there is no policy.
+   */
+  setPolicySettings: function(forceEnableHeaderFooter) {
+    this.setPolicy_('headerFooter', forceEnableHeaderFooter);
+  },
+
   applyStickySettings: function() {
     if (this.stickySettings_) {
       STICKY_SETTING_NAMES.forEach(settingName => {
         const setting = this.get(settingName, this.settings);
         const value = this.stickySettings_[setting.key];
         if (value != undefined)
-          this.set(`settings.${settingName}.value`, value);
+          this.setSetting(settingName, value);
       });
     }
     this.initialized_ = true;
diff --git a/chrome/browser/resources/print_preview/new/other_options_settings.html b/chrome/browser/resources/print_preview/new/other_options_settings.html
index d5ee2d5..e164225c 100644
--- a/chrome/browser/resources/print_preview/new/other_options_settings.html
+++ b/chrome/browser/resources/print_preview/new/other_options_settings.html
@@ -19,7 +19,7 @@
         <label hidden$="[[!settings.headerFooter.available]]"
             aria-live="polite">
           <input type="checkbox" id="headerFooter"
-              disabled$="[[disabled]]"
+              disabled$="[[headerFooterCheckboxDisabled_]]"
               on-change="onHeaderFooterChange_"
               checked$="[[settings.headerFooter.value]]">
           <span>$i18n{optionHeaderFooter}</span>
diff --git a/chrome/browser/resources/print_preview/new/other_options_settings.js b/chrome/browser/resources/print_preview/new/other_options_settings.js
index 783dde11..afe7b43 100644
--- a/chrome/browser/resources/print_preview/new/other_options_settings.js
+++ b/chrome/browser/resources/print_preview/new/other_options_settings.js
@@ -9,6 +9,13 @@
 
   properties: {
     disabled: Boolean,
+
+    /** @private */
+    headerFooterCheckboxDisabled_: {
+      type: Boolean,
+      computed: 'computeHeaderFooterCheckboxDisabled_(disabled, ' +
+          'settings.headerFooter.setByPolicy)'
+    },
   },
 
   observers: [
@@ -47,6 +54,16 @@
   },
 
   /**
+   * @param {boolean} globallyDisabled Value of the |disabled| property.
+   * @param {boolean} setByPolicy Value of |settings.headerFooter.setByPolicy|.
+   * @return {boolean} New value for |headerFooterCheckboxDisabled_|.
+   * @private
+   */
+  computeHeaderFooterCheckboxDisabled_(globallyDisabled, setByPolicy) {
+    return globallyDisabled || setByPolicy;
+  },
+
+  /**
    * @param {boolean} value The new value of the header footer setting.
    * @private
    */
diff --git a/chrome/browser/resources/print_preview/new/settings_behavior.js b/chrome/browser/resources/print_preview/new/settings_behavior.js
index d5976f1b..71ee009e 100644
--- a/chrome/browser/resources/print_preview/new/settings_behavior.js
+++ b/chrome/browser/resources/print_preview/new/settings_behavior.js
@@ -12,6 +12,7 @@
  *   unavailableValue: *,
  *   valid: boolean,
  *   available: boolean,
+ *   setByPolicy: boolean,
  *   key: string,
  * }}
  */
@@ -74,11 +75,12 @@
 
   /**
    * @param {string} settingName Name of the setting to set
-   * @param {boolean | string | number | Array | Object} value The value to set
-   *     the setting to.
+   * @param {*} value The value to set the setting to.
    */
   setSetting: function(settingName, value) {
     const setting = this.getSetting(settingName);
+    if (setting.setByPolicy)
+      return;
     this.set(`settings.${settingName}.value`, value);
   },
 
diff --git a/chrome/browser/resources/settings/downloads_page/BUILD.gn b/chrome/browser/resources/settings/downloads_page/BUILD.gn
index 66fb53901..d912d03 100644
--- a/chrome/browser/resources/settings/downloads_page/BUILD.gn
+++ b/chrome/browser/resources/settings/downloads_page/BUILD.gn
@@ -48,6 +48,7 @@
     ":smb_browser_proxy",
     "..:page_visibility",
     "..:route",
+    "../prefs:prefs_behavior",
     "//ui/webui/resources/js:cr",
     "//ui/webui/resources/js:load_time_data",
     "//ui/webui/resources/js:util",
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.js b/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.js
index 88c41db..0ce7ea252 100644
--- a/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.js
+++ b/chrome/browser/resources/settings/downloads_page/downloads_browser_proxy.js
@@ -8,6 +8,13 @@
     initializeDownloads() {}
     selectDownloadLocation() {}
     resetAutoOpenFileTypes() {}
+    // <if expr="chromeos">
+    /**
+     * @param {string} path path to sanitze.
+     * @return {!Promise<string>} string to display in UI.
+     */
+    getDownloadLocationText(path) {}
+    // </if>
   }
 
   /**
@@ -28,6 +35,13 @@
     resetAutoOpenFileTypes() {
       chrome.send('resetAutoOpenFileTypes');
     }
+
+    // <if expr="chromeos">
+    /** @override */
+    getDownloadLocationText(path) {
+      return cr.sendWithPromise('getDownloadLocationText', path);
+    }
+    // </if>
   }
 
   cr.addSingletonGetter(DownloadsBrowserProxyImpl);
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.html b/chrome/browser/resources/settings/downloads_page/downloads_page.html
index 86bc093..a44f3c5 100644
--- a/chrome/browser/resources/settings/downloads_page/downloads_page.html
+++ b/chrome/browser/resources/settings/downloads_page/downloads_page.html
@@ -4,6 +4,7 @@
 <link rel="import" href="chrome://resources/html/web_ui_listener_behavior.html">
 <link rel="import" href="../controls/controlled_button.html">
 <link rel="import" href="../controls/settings_toggle_button.html">
+<link rel="import" href="../prefs/prefs_behavior.html">
 <link rel="import" href="../route.html">
 <link rel="import" href="../settings_shared_css.html">
 <link rel="import" href="downloads_browser_proxy.html">
@@ -29,7 +30,7 @@
             [[prefs.download.default_directory.value]]
 </if>
 <if expr="chromeos">
-            [[getDownloadLocation_(prefs.download.default_directory.value)]]
+            [[downloadLocation_]]
 </if>
           </div>
         </div>
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.js b/chrome/browser/resources/settings/downloads_page/downloads_page.js
index 4c8a6cb..11c89e7c 100644
--- a/chrome/browser/resources/settings/downloads_page/downloads_page.js
+++ b/chrome/browser/resources/settings/downloads_page/downloads_page.js
@@ -18,7 +18,7 @@
 Polymer({
   is: 'settings-downloads-page',
 
-  behaviors: [WebUIListenerBehavior],
+  behaviors: [WebUIListenerBehavior, PrefsBehavior],
 
   properties: {
     /**
@@ -53,6 +53,11 @@
       },
       readOnly: true,
     },
+
+    /**
+     * The download location string that is suitable to display in the UI.
+     */
+    downloadLocation_: String,
     // </if>
 
     /** @private {!Map<string, string>} */
@@ -73,13 +78,22 @@
 
   },
 
+  // <if expr="chromeos">
+  observers: [
+    'handleDownloadLocationChanged_(prefs.download.default_directory.value)'
+  ],
+  // </if>
+
   /** @private {?settings.DownloadsBrowserProxy} */
   browserProxy_: null,
 
   /** @override */
-  attached: function() {
+  created: function() {
     this.browserProxy_ = settings.DownloadsBrowserProxyImpl.getInstance();
+  },
 
+  /** @override */
+  ready: function() {
     this.addWebUIListener('auto-open-downloads-changed', autoOpen => {
       this.autoOpenDownloads_ = autoOpen;
     });
@@ -99,32 +113,17 @@
   onTapSmbShares_: function() {
     settings.navigateTo(settings.routes.SMB_SHARES);
   },
-  // </if>
 
-
-  // <if expr="chromeos">
   /**
-   * @param {string} path
-   * @return {string} The download location string that is suitable to display
-   *     in the UI.
    * @private
    */
-  getDownloadLocation_: function(path) {
-    // Replace /special/drive-<hash>/root with "Google Drive" for remote files,
-    // /home/chronos/user/Downloads or /home/chronos/u-<hash>/Downloads with
-    // "Downloads" for local paths, /run/arc/sdcard/write/emulated/0 with
-    // "Play files" for Android files, and '/' with ' \u203a '
-    // (angled quote sign) everywhere. It is used only for display purpose.
-    // TODO(fukino): Move the logic of converting these special paths to
-    // something else to C++ side so that UI side does not depend on these
-    // hard-coded paths.
-    path = path.replace(/^\/special\/drive[^\/]*\/root/, 'Google Drive');
-    path = path.replace(/^\/home\/chronos\/(user|u-[^\/]*)\//, '');
-    path = path.replace(
-        /^\/run\/arc\/sdcard\/write\/emulated\/0/,
-        loadTimeData.getString('downloadsAndroidFilesRootLabel'));
-    path = path.replace(/\//g, ' \u203a ');
-    return path;
+  handleDownloadLocationChanged_: function() {
+    this.browserProxy_
+        .getDownloadLocationText(/** @type {string} */ (
+            this.getPref('download.default_directory').value))
+        .then(text => {
+          this.downloadLocation_ = text;
+        });
   },
   // </if>
 
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd
index f0e12e2..c01ff77 100644
--- a/chrome/browser/resources/settings/settings_resources.grd
+++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -567,6 +567,7 @@
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_DOWNLOADS_BROWSER_PROXY_JS"
                  file="downloads_page/downloads_browser_proxy.js"
+                 preprocess="true"
                  type="chrome_html" />
       <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_HTML"
                  file="downloads_page/downloads_page.html"
diff --git a/chrome/browser/resources/task_scheduler_internals/OWNERS b/chrome/browser/resources/task_scheduler_internals/OWNERS
index ffc802c1..495a17c 100644
--- a/chrome/browser/resources/task_scheduler_internals/OWNERS
+++ b/chrome/browser/resources/task_scheduler_internals/OWNERS
@@ -1 +1 @@
-file://base/task_scheduler/OWNERS
+file://base/task/task_scheduler/OWNERS
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc
index bdef6b24..f348c96b 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win.cc
@@ -18,8 +18,8 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win_unittest.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win_unittest.cc
index 3ff567c..a667129 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_controller_impl_win_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/multiprocess_test.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win.cc
index 7637c45..37c2b21 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_fetcher_win.cc
@@ -22,7 +22,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/time/time.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_runner_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_runner_win.cc
index 03e0d1d..88f97432 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_runner_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/chrome_cleaner_runner_win.cc
@@ -15,7 +15,7 @@
 #include "base/path_service.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_client_info_win.h"
 #include "chrome/browser/safe_browsing/chrome_cleaner/srt_field_trial_win.h"
 #include "chrome/installer/util/install_util.h"
diff --git a/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_win.cc b/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_win.cc
index 1801b060b..9bd69e99 100644
--- a/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_win.cc
+++ b/chrome/browser/safe_browsing/chrome_cleaner/reporter_runner_win.cc
@@ -27,8 +27,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/win/registry.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc b/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
index 384e3af..c7b61e3 100644
--- a/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/check_client_download_request.cc
@@ -9,7 +9,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/history/history_service_factory.h"
 #include "chrome/browser/policy/chrome_browser_policy_connector.h"
diff --git a/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc
index df99e3e..faebfe47 100644
--- a/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_feedback_service_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/safe_browsing/download_protection/download_feedback.h"
 #include "components/download/public/common/mock_download_item.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc
index 313a4f79..8d4d942 100644
--- a/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_feedback_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/safe_browsing/download_protection/two_phase_uploader.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
index 4d8cc5b..a754c42 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service.cc
@@ -7,8 +7,8 @@
 #include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sha1.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router.h"
 #include "chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_factory.h"
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
index 02ce12b..4f19a76 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_unittest.cc
@@ -26,7 +26,7 @@
 #include "base/sha1.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/bind_test_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc b/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc
index 10d4e9f..e8f1efd3 100644
--- a/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/two_phase_uploader_unittest.cc
@@ -12,8 +12,8 @@
 #include "base/files/file_path.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/safe_browsing/local_two_phase_testserver.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
index 9d40b26..5ea33f6 100644
--- a/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/download_metadata_manager.cc
@@ -20,8 +20,8 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "components/download/public/common/download_item.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "content/public/browser/browser_context.h"
diff --git a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
index fea37ab..7f6aaaa8 100644
--- a/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
+++ b/chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.cc
@@ -18,8 +18,8 @@
 #include "base/process/process_info.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/safe_browsing/local_database_manager.cc b/chrome/browser/safe_browsing/local_database_manager.cc
index e7b62d0..ce92557 100644
--- a/chrome/browser/safe_browsing/local_database_manager.cc
+++ b/chrome/browser/safe_browsing/local_database_manager.cc
@@ -18,7 +18,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/prerender/prerender_field_trial.h"
diff --git a/chrome/browser/search/background/ntp_background_data.cc b/chrome/browser/search/background/ntp_background_data.cc
index 24eddd8c..4625101 100644
--- a/chrome/browser/search/background/ntp_background_data.cc
+++ b/chrome/browser/search/background/ntp_background_data.cc
@@ -4,6 +4,17 @@
 
 #include "chrome/browser/search/background/ntp_background_data.h"
 
+namespace {
+// The options to be added to a thumbnail image URL, specifying resolution,
+// cropping, etc. Options appear on an image URL after the '=' character. This
+// resolution matches the height an width of bg-sel-tile.
+constexpr char kThumbnailImageOptions[] = "=w156-h117-p-k-no-nd-mv";
+}  // namespace
+
+std::string GetThumbnailImageOptionsForTesting() {
+  return kThumbnailImageOptions;
+}
+
 CollectionInfo::CollectionInfo() = default;
 CollectionInfo::CollectionInfo(const CollectionInfo&) = default;
 CollectionInfo::CollectionInfo(CollectionInfo&&) = default;
@@ -29,7 +40,11 @@
   collection_info.collection_name = collection.collection_name();
   // Use the first preview image as the representative one for the collection.
   if (collection.preview_size() > 0 && collection.preview(0).has_image_url()) {
-    collection_info.preview_image_url = GURL(collection.preview(0).image_url());
+    collection_info.preview_image_url =
+        GURL(collection.preview(0).image_url() +
+             ((collection.preview(0).image_url().find('=') == std::string::npos)
+                  ? kThumbnailImageOptions
+                  : std::string("")));
   }
 
   return collection_info;
@@ -63,7 +78,10 @@
   collection_image.collection_id = collection_id;
   collection_image.asset_id = image.asset_id();
   // Without options added to the image, it is 512x512.
-  collection_image.thumbnail_image_url = GURL(image.image_url());
+  collection_image.thumbnail_image_url = GURL(
+      image.image_url() + ((image.image_url().find('=') == std::string::npos)
+                               ? kThumbnailImageOptions
+                               : std::string("")));
   // TODO(ramyan): Request resolution from service, instead of setting it here.
   collection_image.image_url = GURL(
       image.image_url() + ((image.image_url().find('=') == std::string::npos)
diff --git a/chrome/browser/search/background/ntp_background_data.h b/chrome/browser/search/background/ntp_background_data.h
index d61bd34b..edf7e2a 100644
--- a/chrome/browser/search/background/ntp_background_data.h
+++ b/chrome/browser/search/background/ntp_background_data.h
@@ -24,6 +24,8 @@
   AUTH_ERROR
 };
 
+std::string GetThumbnailImageOptionsForTesting();
+
 // Background images are organized into collections, according to a theme. This
 // struct contains the data required to display information about a collection,
 // including a representative image. The complete set of CollectionImages must
diff --git a/chrome/browser/search/background/ntp_background_service_unittest.cc b/chrome/browser/search/background/ntp_background_service_unittest.cc
index 07d9547..1d49856 100644
--- a/chrome/browser/search/background/ntp_background_service_unittest.cc
+++ b/chrome/browser/search/background/ntp_background_service_unittest.cc
@@ -131,7 +131,8 @@
   CollectionInfo collection_info;
   collection_info.collection_id = collection.collection_id();
   collection_info.collection_name = collection.collection_name();
-  collection_info.preview_image_url = GURL(collection.preview(0).image_url());
+  collection_info.preview_image_url = GURL(
+      collection.preview(0).image_url() + GetThumbnailImageOptionsForTesting());
 
   EXPECT_FALSE(service()->collection_info().empty());
   EXPECT_THAT(service()->collection_info().at(0), Eq(collection_info));
@@ -186,7 +187,8 @@
   CollectionImage collection_image;
   collection_image.collection_id = "shapes";
   collection_image.asset_id = image.asset_id();
-  collection_image.thumbnail_image_url = GURL(image.image_url());
+  collection_image.thumbnail_image_url =
+      GURL(image.image_url() + GetThumbnailImageOptionsForTesting());
   collection_image.image_url = GURL(image.image_url() + kImageOptions);
   collection_image.attribution.push_back(image.attribution(0).text());
   collection_image.attribution_action_url = GURL(image.action_url());
@@ -233,12 +235,14 @@
   CollectionInfo collection_info;
   collection_info.collection_id = collection.collection_id();
   collection_info.collection_name = collection.collection_name();
-  collection_info.preview_image_url = GURL(collection.preview(0).image_url());
+  collection_info.preview_image_url = GURL(
+      collection.preview(0).image_url() + GetThumbnailImageOptionsForTesting());
 
   CollectionImage collection_image;
   collection_image.collection_id = "shapes";
   collection_image.asset_id = image.asset_id();
-  collection_image.thumbnail_image_url = GURL(image.image_url());
+  collection_image.thumbnail_image_url =
+      GURL(image.image_url() + GetThumbnailImageOptionsForTesting());
   collection_image.image_url = GURL(image.image_url() + kImageOptions);
   collection_image.attribution.push_back(image.attribution(0).text());
 
diff --git a/chrome/browser/search/instant_service.cc b/chrome/browser/search/instant_service.cc
index 2f7b706a..73d8ea8 100644
--- a/chrome/browser/search/instant_service.cc
+++ b/chrome/browser/search/instant_service.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/path_service.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/ntp_tiles/chrome_most_visited_sites_factory.h"
diff --git a/chrome/browser/search/local_files_ntp_source.cc b/chrome/browser/search/local_files_ntp_source.cc
index 185dd230..fc00f42 100644
--- a/chrome/browser/search/local_files_ntp_source.cc
+++ b/chrome/browser/search/local_files_ntp_source.cc
@@ -15,7 +15,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc
index 51ccdfdd..b9e07cb 100644
--- a/chrome/browser/search/local_ntp_source.cc
+++ b/chrome/browser/search/local_ntp_source.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
@@ -193,14 +193,14 @@
               IDS_NTP_CUSTOM_BG_PHOTO_SELECTED);
 
     // Custom Links
-    AddString(translated_strings.get(), "addLink",
+    AddString(translated_strings.get(), "addLinkTitle",
               IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TITLE);
     AddString(translated_strings.get(), "addLinkTooltip",
               IDS_NTP_CUSTOM_LINKS_ADD_SHORTCUT_TOOLTIP);
-    AddString(translated_strings.get(), "editLinkTooltip",
-              IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT_TOOLTIP);
     AddString(translated_strings.get(), "editLinkTitle",
               IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT);
+    AddString(translated_strings.get(), "editLinkTooltip",
+              IDS_NTP_CUSTOM_LINKS_EDIT_SHORTCUT_TOOLTIP);
     AddString(translated_strings.get(), "nameField", IDS_NTP_CUSTOM_LINKS_NAME);
     AddString(translated_strings.get(), "urlField", IDS_NTP_CUSTOM_LINKS_URL);
     AddString(translated_strings.get(), "linkRemove",
diff --git a/chrome/browser/search/suggestions/suggestions_service_factory.cc b/chrome/browser/search/suggestions/suggestions_service_factory.cc
index 1422840..e7ab084c 100644
--- a/chrome/browser/search/suggestions/suggestions_service_factory.cc
+++ b/chrome/browser/search/suggestions/suggestions_service_factory.cc
@@ -8,7 +8,7 @@
 #include <utility>
 
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/default_tick_clock.h"
 #include "chrome/browser/profiles/incognito_helpers.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/service_process/service_process_control.cc b/chrome/browser/service_process/service_process_control.cc
index 17db525..70ef37d 100644
--- a/chrome/browser/service_process/service_process_control.cc
+++ b/chrome/browser/service_process/service_process_control.cc
@@ -19,7 +19,7 @@
 #include "base/process/launch.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/sessions/tab_loader_delegate.cc b/chrome/browser/sessions/tab_loader_delegate.cc
index 1925d53..4c6bb81b 100644
--- a/chrome/browser/sessions/tab_loader_delegate.cc
+++ b/chrome/browser/sessions/tab_loader_delegate.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/resource_coordinator/tab_manager_features.h"
 #include "chrome/browser/sessions/session_restore_observer.h"
 #include "components/variations/variations_associated_data.h"
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 namespace {
 
@@ -30,7 +30,7 @@
 
 class TabLoaderDelegateImpl
     : public TabLoaderDelegate,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver {
+      public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   explicit TabLoaderDelegateImpl(TabLoaderCallback* callback);
   ~TabLoaderDelegateImpl() override;
@@ -58,7 +58,7 @@
   // TabLoaderDelegate:
   void NotifyTabLoadStarted() override { policy_.NotifyTabLoadStarted(); }
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver:
+  // network::NetworkConnectionTracker::NetworkConnectionObserver:
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
  private:
diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc
index ddd7921..eff52db8 100644
--- a/chrome/browser/shell_integration.cc
+++ b/chrome/browser/shell_integration.cc
@@ -12,10 +12,10 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/single_thread_task_runner_thread_mode_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/policy/policy_path_parser.h"
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc
index eb0b804..d021d755 100644
--- a/chrome/browser/shell_integration_win.cc
+++ b/chrome/browser/shell_integration_win.cc
@@ -31,7 +31,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
 #include "base/win/registry.h"
@@ -41,7 +41,6 @@
 #include "chrome/browser/policy/policy_path_parser.h"
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
 #include "chrome/browser/win/settings_app_monitor.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths_internal.h"
@@ -133,9 +132,8 @@
     app_name = base::UTF8ToUTF16(web_app::GenerateApplicationNameFromURL(
         GURL(command_line.GetSwitchValueASCII(switches::kApp))));
   } else if (command_line.HasSwitch(switches::kAppId)) {
-    app_name = base::UTF8ToUTF16(
-        web_app::GenerateApplicationNameFromExtensionId(
-            command_line.GetSwitchValueASCII(switches::kAppId)));
+    app_name = base::UTF8ToUTF16(web_app::GenerateApplicationNameFromAppId(
+        command_line.GetSwitchValueASCII(switches::kAppId)));
   } else if (command_line.HasSwitch(switches::kShowAppList)) {
     app_name = GetAppListAppName();
   } else {
diff --git a/chrome/browser/shell_integration_win_unittest.cc b/chrome/browser/shell_integration_win_unittest.cc
index 42d14dc..d19f328 100644
--- a/chrome/browser/shell_integration_win_unittest.cc
+++ b/chrome/browser/shell_integration_win_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/test_shortcut_win.h"
 #include "base/win/scoped_com_initializer.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths_internal.h"
 #include "chrome/install_static/install_util.h"
@@ -68,8 +68,8 @@
 
     extension_id_ = L"chromiumexampleappidforunittests";
     base::string16 app_name =
-        base::UTF8ToUTF16(web_app::GenerateApplicationNameFromExtensionId(
-        base::UTF16ToUTF8(extension_id_)));
+        base::UTF8ToUTF16(web_app::GenerateApplicationNameFromAppId(
+            base::UTF16ToUTF8(extension_id_)));
     extension_app_id_ = GetAppModelIdForProfile(app_name, default_profile_path);
     non_default_profile_extension_app_id_ = GetAppModelIdForProfile(
         app_name, default_user_data_dir.Append(non_default_profile_));
diff --git a/chrome/browser/signin/chrome_signin_client.h b/chrome/browser/signin/chrome_signin_client.h
index 520a6c1c..80a0a84 100644
--- a/chrome/browser/signin/chrome_signin_client.h
+++ b/chrome/browser/signin/chrome_signin_client.h
@@ -19,7 +19,7 @@
 #include "services/network/public/mojom/network_change_manager.mojom.h"
 
 #if !defined(OS_CHROMEOS)
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #endif
 
 #if !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
@@ -30,7 +30,7 @@
 class ChromeSigninClient
     : public SigninClient,
 #if !defined(OS_CHROMEOS)
-      public content::NetworkConnectionTracker::NetworkConnectionObserver,
+      public network::NetworkConnectionTracker::NetworkConnectionObserver,
 #endif
       public SigninErrorController::Observer,
       public gaia::GaiaOAuthClient::Delegate,
@@ -99,7 +99,7 @@
                          const GoogleServiceAuthError& error) override;
 
 #if !defined(OS_CHROMEOS)
-  // content::NetworkConnectionTracker::NetworkConnectionObserver
+  // network::NetworkConnectionTracker::NetworkConnectionObserver
   // implementation.
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 #endif
diff --git a/chrome/browser/signin/chrome_signin_client_unittest.cc b/chrome/browser/signin/chrome_signin_client_unittest.cc
index 49046ce..e39a4fef 100644
--- a/chrome/browser/signin/chrome_signin_client_unittest.cc
+++ b/chrome/browser/signin/chrome_signin_client_unittest.cc
@@ -20,9 +20,9 @@
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/signin/core/browser/profile_management_switches.h"
-#include "content/public/browser/network_connection_tracker.h"
-#include "content/public/test/mock_network_connection_tracker.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
+#include "services/network/test/test_network_connection_tracker.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -62,7 +62,7 @@
  public:
   ChromeSigninClientTest() {}
 
-  void Initialize(std::unique_ptr<content::NetworkConnectionTracker> tracker) {
+  void Initialize(std::unique_ptr<network::NetworkConnectionTracker> tracker) {
     TestingBrowserProcess::GetGlobal()->SetNetworkConnectionTracker(
         std::move(tracker));
     // Create a signed-in profile.
@@ -82,7 +82,7 @@
 };
 
 TEST_F(ChromeSigninClientTest, DelayNetworkCallRunsImmediatelyWithNetwork) {
-  Initialize(std::make_unique<content::MockNetworkConnectionTracker>(
+  Initialize(std::make_unique<network::TestNetworkConnectionTracker>(
       true, network::mojom::ConnectionType::CONNECTION_3G));
   CallbackTester tester;
   signin_client()->DelayNetworkCall(
@@ -91,7 +91,7 @@
 }
 
 TEST_F(ChromeSigninClientTest, DelayNetworkCallRunsAfterGetConnectionType) {
-  auto tracker = std::make_unique<content::MockNetworkConnectionTracker>(
+  auto tracker = std::make_unique<network::TestNetworkConnectionTracker>(
       false, network::mojom::ConnectionType::CONNECTION_3G);
   Initialize(std::move(tracker));
 
@@ -106,9 +106,9 @@
 }
 
 TEST_F(ChromeSigninClientTest, DelayNetworkCallRunsAfterNetworkChange) {
-  auto tracker = std::make_unique<content::MockNetworkConnectionTracker>(
+  auto tracker = std::make_unique<network::TestNetworkConnectionTracker>(
       true, network::mojom::ConnectionType::CONNECTION_NONE);
-  content::MockNetworkConnectionTracker* mock = tracker.get();
+  network::TestNetworkConnectionTracker* mock = tracker.get();
   Initialize(std::move(tracker));
 
   base::RunLoop run_loop;
diff --git a/chrome/browser/signin/dice_response_handler_unittest.cc b/chrome/browser/signin/dice_response_handler_unittest.cc
index 7cee70c..693bf680 100644
--- a/chrome/browser/signin/dice_response_handler_unittest.cc
+++ b/chrome/browser/signin/dice_response_handler_unittest.cc
@@ -283,7 +283,8 @@
   // Simulate GaiaAuthFetcher success.
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
-                                          false /* is_child_account */));
+                                          false /* is_child_account */,
+                                          false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
   EXPECT_TRUE(auth_error_email_.empty());
@@ -342,7 +343,8 @@
   ASSERT_THAT(signin_client_.consumer_, testing::IsNull());
   // Simulate GaiaAuthFetcher success for the first request.
   consumer->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
-      "refresh_token", "access_token", 10, false /* is_child_account */));
+      "refresh_token", "access_token", 10, false /* is_child_account */,
+      false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
 }
@@ -378,12 +380,14 @@
   ASSERT_THAT(consumer_2, testing::NotNull());
   // Simulate GaiaAuthFetcher success for the first request.
   consumer_1->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
-      "refresh_token", "access_token", 10, false /* is_child_account */));
+      "refresh_token", "access_token", 10, false /* is_child_account */,
+      false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id_1));
   // Simulate GaiaAuthFetcher success for the second request.
   consumer_2->OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
-      "refresh_token", "access_token", 10, false /* is_child_account */));
+      "refresh_token", "access_token", 10, false /* is_child_account */,
+      false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id_2));
   // Check that the reconcilor was blocked and unblocked exactly once.
@@ -407,7 +411,8 @@
   // Simulate GaiaAuthFetcher success.
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
-                                          false /* is_child_account */));
+                                          false /* is_child_account */,
+                                          false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
   // Check that delegate was not called to enable sync.
@@ -446,7 +451,8 @@
   // Simulate GaiaAuthFetcher success.
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
-                                          false /* is_child_account */));
+                                          false /* is_child_account */,
+                                          false /* is_advanced_protection*/));
   // Check that the token has been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
   // Check that delegate was called to enable sync.
@@ -669,7 +675,8 @@
   // Allow the remaining fetcher to complete.
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
-                                          false /* is_child_account */));
+                                          false /* is_child_account */,
+                                          false /* is_advanced_protection*/));
   EXPECT_EQ(
       0u, dice_response_handler_->GetPendingDiceTokenFetchersCountForTesting());
   // Check that the right token is available.
@@ -717,7 +724,8 @@
   // Simulate GaiaAuthFetcher success.
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
-                                          false /* is_child_account */));
+                                          false /* is_child_account */,
+                                          false /* is_advanced_protection*/));
   // Check that the token has not been inserted in the token service.
   EXPECT_FALSE(token_service_.RefreshTokenIsAvailable(account_id));
 }
@@ -750,7 +758,8 @@
   // Simulate GaiaAuthFetcher success.
   signin_client_.consumer_->OnClientOAuthSuccess(
       GaiaAuthConsumer::ClientOAuthResult("refresh_token", "access_token", 10,
-                                          false /* is_child_account */));
+                                          false /* is_child_account */,
+                                          false /* is_advanced_protection*/));
   // Check that the token has not been inserted in the token service.
   EXPECT_TRUE(token_service_.RefreshTokenIsAvailable(account_id));
   EXPECT_TRUE(token_service_observer->token_received());
diff --git a/chrome/browser/signin/force_signin_verifier.h b/chrome/browser/signin/force_signin_verifier.h
index 6a6c050..9d72c7a 100644
--- a/chrome/browser/signin/force_signin_verifier.h
+++ b/chrome/browser/signin/force_signin_verifier.h
@@ -11,9 +11,9 @@
 #include "base/macros.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "google_apis/gaia/oauth2_token_service.h"
 #include "net/base/backoff_entry.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 class Profile;
 class SigninManager;
@@ -27,7 +27,7 @@
 // error.
 class ForceSigninVerifier
     : public OAuth2TokenService::Consumer,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver {
+      public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   explicit ForceSigninVerifier(Profile* profile);
   ~ForceSigninVerifier() override;
@@ -39,7 +39,7 @@
   void OnGetTokenFailure(const OAuth2TokenService::Request* request,
                          const GoogleServiceAuthError& error) override;
 
-  // override content::NetworkConnectionTracker::NetworkConnectionObserver
+  // override network::NetworkConnectionTracker::NetworkConnectionObserver
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   // Cancel any pending or ongoing verification.
diff --git a/chrome/browser/signin/identity_manager_factory.cc b/chrome/browser/signin/identity_manager_factory.cc
index 6c3241a..265cd4a 100644
--- a/chrome/browser/signin/identity_manager_factory.cc
+++ b/chrome/browser/signin/identity_manager_factory.cc
@@ -53,9 +53,10 @@
 
 // static
 identity::IdentityManager* IdentityManagerFactory::GetForProfileIfExists(
-    Profile* profile) {
+    const Profile* profile) {
   return static_cast<IdentityManagerWrapper*>(
-      GetInstance()->GetServiceForBrowserContext(profile, false));
+      GetInstance()->GetServiceForBrowserContext(const_cast<Profile*>(profile),
+                                                 false));
 }
 
 // static
diff --git a/chrome/browser/signin/identity_manager_factory.h b/chrome/browser/signin/identity_manager_factory.h
index 4bf10a9..86489e87 100644
--- a/chrome/browser/signin/identity_manager_factory.h
+++ b/chrome/browser/signin/identity_manager_factory.h
@@ -19,7 +19,8 @@
 class IdentityManagerFactory : public BrowserContextKeyedServiceFactory {
  public:
   static identity::IdentityManager* GetForProfile(Profile* profile);
-  static identity::IdentityManager* GetForProfileIfExists(Profile* profile);
+  static identity::IdentityManager* GetForProfileIfExists(
+      const Profile* profile);
 
   // Returns an instance of the IdentityManagerFactory singleton.
   static IdentityManagerFactory* GetInstance();
diff --git a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h
index 9df7cd20e..49f488c4 100644
--- a/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h
+++ b/chrome/browser/signin/mutable_profile_oauth2_token_service_delegate.h
@@ -17,9 +17,9 @@
 #include "components/signin/core/browser/signin_error_controller.h"
 #include "components/webdata/common/web_data_service_base.h"
 #include "components/webdata/common/web_data_service_consumer.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "google_apis/gaia/oauth2_token_service_delegate.h"
 #include "net/base/backoff_entry.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 namespace user_prefs {
 class PrefRegistrySyncable;
@@ -28,7 +28,7 @@
 class MutableProfileOAuth2TokenServiceDelegate
     : public OAuth2TokenServiceDelegate,
       public WebDataServiceConsumer,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver {
+      public network::NetworkConnectionTracker::NetworkConnectionObserver {
  public:
   MutableProfileOAuth2TokenServiceDelegate(
       SigninClient* client,
diff --git a/chrome/browser/signin/signin_error_notifier_ash_unittest.cc b/chrome/browser/signin/signin_error_notifier_ash_unittest.cc
index 6d51bf149..50b0c73 100644
--- a/chrome/browser/signin/signin_error_notifier_ash_unittest.cc
+++ b/chrome/browser/signin/signin_error_notifier_ash_unittest.cc
@@ -14,16 +14,13 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/users/mock_user_manager.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
-#include "chrome/browser/signin/fake_signin_manager_builder.h"
 #include "chrome/browser/signin/signin_error_controller_factory.h"
 #include "chrome/browser/signin/signin_error_notifier_factory_ash.h"
-#include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "components/signin/core/browser/fake_auth_status_provider.h"
 #include "components/signin/core/browser/signin_error_controller.h"
-#include "components/signin/core/browser/signin_manager.h"
 #include "components/user_manager/scoped_user_manager.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -54,10 +51,6 @@
         std::make_unique<NotificationDisplayServiceTester>(profile());
   }
 
-  TestingProfile::TestingFactories GetTestingFactories() override {
-    return {{SigninManagerFactory::GetInstance(), BuildFakeSigninManagerBase}};
-  }
-
  protected:
   SigninErrorController* error_controller_;
   std::unique_ptr<NotificationDisplayServiceTester> display_service_;
diff --git a/chrome/browser/speech/tts_linux.cc b/chrome/browser/speech/tts_linux.cc
index d37b3c5..53a39f0e 100644
--- a/chrome/browser/speech/tts_linux.cc
+++ b/chrome/browser/speech/tts_linux.cc
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/singleton.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/speech/tts_platform.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
diff --git a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
index 54bfdea..b55d20b4 100644
--- a/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
+++ b/chrome/browser/spellchecker/spellcheck_custom_dictionary.cc
@@ -16,7 +16,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/common/chrome_constants.h"
diff --git a/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc b/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc
index d685112..57eacc9 100644
--- a/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc
+++ b/chrome/browser/spellchecker/spellcheck_hunspell_dictionary.cc
@@ -14,7 +14,7 @@
 #include "base/logging.h"
 #include "base/path_service.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/browser/ssl/ssl_error_controller_client.cc b/chrome/browser/ssl/ssl_error_controller_client.cc
index 90138dd..7b9fbad 100644
--- a/chrome/browser/ssl/ssl_error_controller_client.cc
+++ b/chrome/browser/ssl/ssl_error_controller_client.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/process/launch.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/interstitials/chrome_metrics_helper.h"
diff --git a/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc b/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc
index 2c8809ef..e71d43e 100644
--- a/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc
+++ b/chrome/browser/supervised_user/experimental/supervised_user_blacklist.cc
@@ -10,7 +10,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/memory_mapped_file.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "url/gurl.h"
 
 namespace {
diff --git a/chrome/browser/supervised_user/supervised_user_service.cc b/chrome/browser/supervised_user/supervised_user_service.cc
index 356ed48..343f965 100644
--- a/chrome/browser/supervised_user/supervised_user_service.cc
+++ b/chrome/browser/supervised_user/supervised_user_service.cc
@@ -14,7 +14,7 @@
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/supervised_user/supervised_user_site_list.cc b/chrome/browser/supervised_user/supervised_user_site_list.cc
index 1c7bca1..8185ae7 100644
--- a/chrome/browser/supervised_user/supervised_user_site_list.cc
+++ b/chrome/browser/supervised_user/supervised_user_site_list.cc
@@ -11,7 +11,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "url/gurl.h"
 
diff --git a/chrome/browser/supervised_user/supervised_user_url_filter.cc b/chrome/browser/supervised_user/supervised_user_url_filter.cc
index 27a7135a..72aeba0 100644
--- a/chrome/browser/supervised_user/supervised_user_url_filter.cc
+++ b/chrome/browser/supervised_user/supervised_user_url_filter.cc
@@ -20,7 +20,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/supervised_user/experimental/supervised_user_blacklist.h"
diff --git a/chrome/browser/sync/chrome_sync_client.cc b/chrome/browser/sync/chrome_sync_client.cc
index 1f97100..19b6a7a 100644
--- a/chrome/browser/sync/chrome_sync_client.cc
+++ b/chrome/browser/sync/chrome_sync_client.cc
@@ -584,7 +584,7 @@
   switch (type) {
     case syncer::DEVICE_INFO:
       return ProfileSyncServiceFactory::GetForProfile(profile_)
-          ->GetDeviceInfoSyncControllerDelegateOnUIThread();
+          ->GetDeviceInfoSyncControllerDelegate();
     case syncer::READING_LIST:
       // Reading List is only supported on iOS at the moment.
       NOTREACHED();
@@ -593,12 +593,12 @@
       return autofill::AutocompleteSyncBridge::FromWebDataService(
                  profile_web_data_service_.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::AUTOFILL_PROFILE:
       return autofill::AutofillProfileSyncBridge::FromWebDataService(
                  profile_web_data_service_.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::AUTOFILL_WALLET_DATA: {
       // TODO(feuunk): This doesn't allow switching which database to use at
       // runtime. This should be fixed as part of the USS migration for
@@ -608,7 +608,7 @@
       return autofill::AutofillWalletSyncBridge::FromWebDataService(
                  service.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     }
     case syncer::AUTOFILL_WALLET_METADATA: {
       // TODO(feuunk): This doesn't allow switching which database to use at
@@ -619,7 +619,7 @@
       return autofill::AutofillWalletMetadataSyncBridge::FromWebDataService(
                  service.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     }
 #if defined(OS_CHROMEOS)
     case syncer::PRINTERS:
@@ -627,7 +627,7 @@
                  profile_)
           ->GetSyncBridge()
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
 #endif  // defined(OS_CHROMEOS)
     case syncer::TYPED_URLS:
       // TypedURLModelTypeController doesn't exercise this function.
@@ -635,19 +635,19 @@
       return base::WeakPtr<syncer::ModelTypeControllerDelegate>();
     case syncer::USER_CONSENTS:
       return ConsentAuditorFactory::GetForProfile(profile_)
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::USER_EVENTS:
       return browser_sync::UserEventServiceFactory::GetForProfile(profile_)
           ->GetSyncBridge()
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::SESSIONS: {
       return ProfileSyncServiceFactory::GetForProfile(profile_)
-          ->GetSessionSyncControllerDelegateOnUIThread();
+          ->GetSessionSyncControllerDelegate();
     }
     case syncer::BOOKMARKS: {
       return BookmarkSyncServiceFactory::GetForProfile(profile_)
-          ->GetBookmarkSyncControllerDelegateOnUIThread();
+          ->GetBookmarkSyncControllerDelegate();
     }
     default:
       NOTREACHED();
diff --git a/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index bcb3193..5787c643 100644
--- a/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -10,7 +10,7 @@
 
 #include "base/command_line.h"
 #include "base/feature_list.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "chrome/common/buildflags.h"
 #include "chrome/test/base/testing_profile.h"
diff --git a/chrome/browser/sync/sync_startup_tracker_unittest.cc b/chrome/browser/sync/sync_startup_tracker_unittest.cc
index aa84504..d174ce4d 100644
--- a/chrome/browser/sync/sync_startup_tracker_unittest.cc
+++ b/chrome/browser/sync/sync_startup_tracker_unittest.cc
@@ -50,8 +50,9 @@
     ON_CALL(*mock_pss_, GetAuthError()).WillByDefault(ReturnRef(no_error_));
     ON_CALL(*mock_pss_, GetDisableReasons())
         .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
-    ON_CALL(*mock_pss_, GetState())
-        .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+    ON_CALL(*mock_pss_, GetTransportState())
+        .WillByDefault(
+            Return(syncer::SyncService::TransportState::INITIALIZING));
   }
 
   content::TestBrowserThreadBundle thread_bundle_;
@@ -64,8 +65,8 @@
 TEST_F(SyncStartupTrackerTest, SyncAlreadyInitialized) {
   ON_CALL(*mock_pss_, GetDisableReasons())
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
   EXPECT_CALL(observer_, SyncStartupCompleted());
   SyncStartupTracker tracker(profile_.get(), &observer_);
 }
@@ -75,8 +76,8 @@
   // in.
   ON_CALL(*mock_pss_, GetDisableReasons())
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN));
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::DISABLED));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::DISABLED));
   EXPECT_CALL(observer_, SyncStartupFailed());
   SyncStartupTracker tracker(profile_.get(), &observer_);
 }
@@ -86,8 +87,8 @@
   // error.
   ON_CALL(*mock_pss_, GetDisableReasons())
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::INITIALIZING));
   GoogleServiceAuthError error(
       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
   ON_CALL(*mock_pss_, GetAuthError()).WillByDefault(ReturnRef(error));
@@ -103,8 +104,8 @@
   SyncStartupTracker tracker(profile_.get(), &observer_);
   Mock::VerifyAndClearExpectations(&observer_);
   // Now, mark the PSS as initialized.
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
   EXPECT_CALL(observer_, SyncStartupCompleted());
   tracker.OnStateChanged(mock_pss_);
 }
@@ -121,8 +122,8 @@
   // Now, mark the PSS as having an auth error.
   ON_CALL(*mock_pss_, GetDisableReasons())
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::INITIALIZING));
   GoogleServiceAuthError error(
       GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS);
   ON_CALL(*mock_pss_, GetAuthError()).WillByDefault(ReturnRef(error));
@@ -143,8 +144,8 @@
   ON_CALL(*mock_pss_, GetDisableReasons())
       .WillByDefault(
           Return(syncer::SyncService::DISABLE_REASON_UNRECOVERABLE_ERROR));
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::DISABLED));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::DISABLED));
   EXPECT_CALL(observer_, SyncStartupFailed());
   tracker.OnStateChanged(mock_pss_);
 }
diff --git a/chrome/browser/sync/sync_ui_util_unittest.cc b/chrome/browser/sync/sync_ui_util_unittest.cc
index f70b3ada..3886fd1 100644
--- a/chrome/browser/sync/sync_ui_util_unittest.cc
+++ b/chrome/browser/sync/sync_ui_util_unittest.cc
@@ -132,8 +132,8 @@
     case STATUS_CASE_AUTHENTICATING: {
       EXPECT_CALL(*service, IsFirstSetupComplete())
           .WillRepeatedly(Return(true));
-      EXPECT_CALL(*service, GetState())
-          .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+      EXPECT_CALL(*service, GetTransportState())
+          .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
       EXPECT_CALL(*service, IsPassphraseRequired())
           .WillRepeatedly(Return(false));
       syncer::SyncEngine::Status status;
@@ -147,8 +147,8 @@
     case STATUS_CASE_AUTH_ERROR: {
       EXPECT_CALL(*service, IsFirstSetupComplete())
           .WillRepeatedly(Return(true));
-      EXPECT_CALL(*service, GetState())
-          .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+      EXPECT_CALL(*service, GetTransportState())
+          .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
       EXPECT_CALL(*service, IsPassphraseRequired())
           .WillRepeatedly(Return(false));
       syncer::SyncEngine::Status status;
@@ -168,8 +168,8 @@
     case STATUS_CASE_PROTOCOL_ERROR: {
       EXPECT_CALL(*service, IsFirstSetupComplete())
           .WillRepeatedly(Return(true));
-      EXPECT_CALL(*service, GetState())
-          .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+      EXPECT_CALL(*service, GetTransportState())
+          .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
       EXPECT_CALL(*service, IsPassphraseRequired())
           .WillRepeatedly(Return(false));
       syncer::SyncProtocolError protocolError;
@@ -195,8 +195,8 @@
     case STATUS_CASE_PASSPHRASE_ERROR: {
       EXPECT_CALL(*service, IsFirstSetupComplete())
           .WillRepeatedly(Return(true));
-      EXPECT_CALL(*service, GetState())
-          .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+      EXPECT_CALL(*service, GetTransportState())
+          .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
       syncer::SyncEngine::Status status;
       EXPECT_CALL(*service, QueryDetailedSyncStatus(_))
           .WillRepeatedly(DoAll(SetArgPointee<0>(status), Return(false)));
@@ -211,8 +211,8 @@
     case STATUS_CASE_SYNCED: {
       EXPECT_CALL(*service, IsFirstSetupComplete())
           .WillRepeatedly(Return(true));
-      EXPECT_CALL(*service, GetState())
-          .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+      EXPECT_CALL(*service, GetTransportState())
+          .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
       EXPECT_CALL(*service, IsPassphraseRequired())
           .WillRepeatedly(Return(false));
       syncer::SyncEngine::Status status;
@@ -230,8 +230,9 @@
               Return(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY));
       EXPECT_CALL(*service, IsFirstSetupComplete())
           .WillRepeatedly(Return(false));
-      EXPECT_CALL(*service, GetState())
-          .WillRepeatedly(Return(syncer::SyncService::State::DISABLED));
+      EXPECT_CALL(*service, GetTransportState())
+          .WillRepeatedly(
+              Return(syncer::SyncService::TransportState::DISABLED));
       EXPECT_CALL(*service, IsPassphraseRequired())
           .WillRepeatedly(Return(false));
       syncer::SyncEngine::Status status;
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 ee1ecfe..995c8456 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.cc
@@ -16,6 +16,7 @@
 #include "base/test/bind_test_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
 #include "chrome/browser/signin/signin_manager_factory.h"
 #include "chrome/browser/signin/unified_consent_helper.h"
 #include "chrome/browser/sync/profile_sync_service_factory.h"
@@ -38,6 +39,7 @@
 #include "components/unified_consent/unified_consent_service.h"
 #include "google_apis/gaia/gaia_constants.h"
 #include "services/identity/public/cpp/identity_manager.h"
+#include "services/identity/public/cpp/identity_test_utils.h"
 
 using browser_sync::ProfileSyncService;
 using syncer::SyncCycleSnapshot;
@@ -80,13 +82,13 @@
       : SingleClientStatusChangeChecker(service) {}
 
   bool IsExitConditionSatisfied() override {
-    syncer::SyncService::State state = service()->GetState();
-    if (state == syncer::SyncService::State::ACTIVE)
+    syncer::SyncService::TransportState state = service()->GetTransportState();
+    if (state == syncer::SyncService::TransportState::ACTIVE)
       return true;
     // Sync is blocked by an auth error.
     if (HasAuthError(service()))
       return true;
-    if (state != syncer::SyncService::State::CONFIGURING)
+    if (state != syncer::SyncService::TransportState::CONFIGURING)
       return false;
     // Sync is blocked because a custom passphrase is required.
     if (service()->passphrase_required_reason_for_test() ==
@@ -106,23 +108,20 @@
 std::unique_ptr<ProfileSyncServiceHarness> ProfileSyncServiceHarness::Create(
     Profile* profile,
     const std::string& username,
-    const std::string& gaia_id,
     const std::string& password,
     SigninType signin_type) {
-  return base::WrapUnique(new ProfileSyncServiceHarness(
-      profile, username, gaia_id, password, signin_type));
+  return base::WrapUnique(
+      new ProfileSyncServiceHarness(profile, username, password, signin_type));
 }
 
 ProfileSyncServiceHarness::ProfileSyncServiceHarness(
     Profile* profile,
     const std::string& username,
-    const std::string& gaia_id,
     const std::string& password,
     SigninType signin_type)
     : profile_(profile),
       service_(ProfileSyncServiceFactory::GetForProfile(profile)),
       username_(username),
-      gaia_id_(gaia_id),
       password_(password),
       signin_type_(signin_type),
       oauth2_refesh_token_number_(0),
@@ -153,6 +152,57 @@
   return result;
 }
 
+bool ProfileSyncServiceHarness::SignIn() {
+  // TODO(crbug.com/871221): This function should distinguish primary account
+  // (aka sync account) from secondary accounts (content area signin). Let's
+  // migrate tests that exercise transport-only sync to secondary accounts.
+  DCHECK(!username_.empty());
+
+  switch (signin_type_) {
+    case SigninType::UI_SIGNIN: {
+      Browser* browser = chrome::FindBrowserWithProfile(profile_);
+      DCHECK(browser);
+      if (!login_ui_test_utils::SignInWithUI(browser, username_, password_)) {
+        LOG(ERROR) << "Could not sign in to GAIA servers.";
+        return false;
+      }
+      return true;
+    }
+
+    case SigninType::FAKE_SIGNIN: {
+      identity::IdentityManager* identity_manager =
+          IdentityManagerFactory::GetForProfile(profile_);
+      ProfileOAuth2TokenService* token_service =
+          ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
+
+      // Verify HasPrimaryAccount() separately because
+      // MakePrimaryAccountAvailable() below DCHECK fails if there is already
+      // an authenticated account.
+      if (identity_manager->HasPrimaryAccount()) {
+        DCHECK_EQ(identity_manager->GetPrimaryAccountInfo().email, username_);
+        // Don't update the refresh token if we already have one. The reason is
+        // that doing so causes Sync (ServerConnectionManager in particular) to
+        // mark the current access token as invalid. Since tests typically
+        // always hand out the same access token string, any new access token
+        // acquired later would also be considered invalid.
+        if (!identity_manager->HasPrimaryAccountWithRefreshToken()) {
+          identity::SetRefreshTokenForPrimaryAccount(token_service,
+                                                     identity_manager);
+        }
+      } else {
+        // Authenticate sync client using GAIA credentials.
+        identity::MakePrimaryAccountAvailable(
+            SigninManagerFactory::GetForProfile(profile_), token_service,
+            identity_manager, username_);
+      }
+      return true;
+    }
+  }
+
+  NOTREACHED();
+  return false;
+}
+
 bool ProfileSyncServiceHarness::SetupSync(syncer::ModelTypeSet synced_datatypes,
                                           bool skip_passphrase_verification) {
   DCHECK(!profile_->IsLegacySupervised())
@@ -168,35 +218,8 @@
   // until we've finished configuration.
   sync_blocker_ = service()->GetSetupInProgressHandle();
 
-  DCHECK(!username_.empty());
-  if (signin_type_ == SigninType::UI_SIGNIN) {
-    Browser* browser = chrome::FindBrowserWithProfile(profile_);
-    DCHECK(browser);
-    if (!login_ui_test_utils::SignInWithUI(browser, username_, password_)) {
-      LOG(ERROR) << "Could not sign in to GAIA servers.";
-      return false;
-    }
-  } else if (signin_type_ == SigninType::FAKE_SIGNIN) {
-    identity::IdentityManager* identity_manager =
-        IdentityManagerFactory::GetForProfile(profile_);
-    if (identity_manager->HasPrimaryAccountWithRefreshToken()) {
-      // Don't sign in again if we're already signed in. The reason is that
-      // changing the refresh token causes Sync (ServerConnectionManager in
-      // particular) to mark the current access token as invalid. Since tests
-      // typically always hand out the same access token string, any new access
-      // token acquired later would also be considered invalid.
-      DCHECK_EQ(identity_manager->GetPrimaryAccountInfo().gaia, gaia_id_);
-      DCHECK_EQ(identity_manager->GetPrimaryAccountInfo().email, username_);
-    } else {
-      // Authenticate sync client using GAIA credentials.
-      // TODO(https://crbug.com/814307): This ideally should go through
-      // identity_test_utils.h (and in the long run IdentityTestEnvironment),
-      // but making that change is complex for reasons described in the bug.
-      identity_manager->SetPrimaryAccountSynchronouslyForTests(
-          gaia_id_, username_, GenerateFakeOAuth2RefreshTokenString());
-    }
-  } else {
-    LOG(ERROR) << "Unsupported profile signin type.";
+  if (!SignIn()) {
+    return false;
   }
 
   // Now that auth is completed, request that sync actually start.
@@ -280,7 +303,7 @@
   DVLOG(1) << "Requesting start for service";
   service()->RequestStart();
 
-  if (!AwaitEngineInitialization(/*skip_passphrase_verification=*/false)) {
+  if (!AwaitEngineInitialization()) {
     LOG(ERROR) << "AwaitEngineInitialization failed.";
     return false;
   }
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 5d58ca4..babc031 100644
--- a/chrome/browser/sync/test/integration/profile_sync_service_harness.h
+++ b/chrome/browser/sync/test/integration/profile_sync_service_harness.h
@@ -39,12 +39,15 @@
   static std::unique_ptr<ProfileSyncServiceHarness> Create(
       Profile* profile,
       const std::string& username,
-      const std::string& gaia_id,
       const std::string& password,
       SigninType signin_type);
   virtual ~ProfileSyncServiceHarness();
 
   // Creates a ProfileSyncService for the profile passed at construction and
+  // signs in without actually enabling sync the feature.
+  bool SignIn();
+
+  // Creates a ProfileSyncService for the profile passed at construction and
   // enables sync for all available datatypes. Returns true only after sync has
   // been fully initialized and authenticated, and we are ready to process
   // changes.
@@ -114,7 +117,7 @@
   // (e.g., auth error) is reached. Returns true if and only if the engine
   // initialized successfully. See ProfileSyncService's IsEngineInitialized()
   // method for the definition of engine initialization.
-  bool AwaitEngineInitialization(bool skip_passphrase_verification);
+  bool AwaitEngineInitialization(bool skip_passphrase_verification = false);
 
   // Blocks the caller until sync setup is complete. Returns true if and only
   // if sync setup completed successfully. See syncer::SyncService's
@@ -160,7 +163,6 @@
  private:
   ProfileSyncServiceHarness(Profile* profile,
                             const std::string& username,
-                            const std::string& gaia_id,
                             const std::string& password,
                             SigninType signin_type);
 
@@ -182,7 +184,6 @@
 
   // Credentials used for GAIA authentication.
   std::string username_;
-  std::string gaia_id_;
   std::string password_;
 
   // Used to decide what method of profile signin to use.
diff --git a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
index 4782372..549c6f3 100644
--- a/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
+++ b/chrome/browser/sync/test/integration/quiesce_status_change_checker.cc
@@ -16,18 +16,15 @@
 
 namespace {
 
-// Returns true if this service is disabled.
-bool IsSyncDisabled(browser_sync::ProfileSyncService* service) {
-  return !service->IsSetupInProgress() && !service->IsFirstSetupComplete();
-}
-
 // Returns true if these services have matching progress markers.
 bool ProgressMarkersMatch(const browser_sync::ProfileSyncService* service1,
                           const browser_sync::ProfileSyncService* service2) {
   // GetActiveDataTypes() is always empty during configuration, so progress
   // markers cannot be compared.
-  if (service1->GetState() != syncer::SyncService::State::ACTIVE ||
-      service2->GetState() != syncer::SyncService::State::ACTIVE) {
+  if (service1->GetTransportState() !=
+          syncer::SyncService::TransportState::ACTIVE ||
+      service2->GetTransportState() !=
+          syncer::SyncService::TransportState::ACTIVE) {
     return false;
   }
 
@@ -101,10 +98,6 @@
   // Check that all progress markers are up to date.
   std::vector<browser_sync::ProfileSyncService*> enabled_services;
   for (const auto& checker : checkers_) {
-    if (IsSyncDisabled(checker->service())) {
-      continue;  // Skip disabled services.
-    }
-
     enabled_services.push_back(checker->service());
 
     if (!checker->IsExitConditionSatisfied()) {
diff --git a/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc b/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
index 4777416..39f59f3 100644
--- a/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_app_list_sync_test.cc
@@ -127,7 +127,7 @@
   // Default apps: chrome + web store + internal apps.
   const size_t kNumDefaultApps =
       2u + app_list::GetNumberOfInternalAppsShowInLauncherForTest(
-               /*apps_name=*/nullptr);
+               /*apps_name=*/nullptr, GetProfile(0)->IsGuestSession());
   ASSERT_EQ(kNumApps + kNumDefaultApps, service->GetNumSyncItemsForTest());
 
   ASSERT_TRUE(UpdatedProgressMarkerChecker(GetSyncService(0)).Wait());
diff --git a/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc b/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
index ad196c3..fe3eb1aa 100644
--- a/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
+++ b/chrome/browser/sync/test/integration/single_client_user_consents_sync_test.cc
@@ -31,7 +31,7 @@
   // impossible to discover otherwise.
   return "user@gmail.com";
 #else
-  return "gaia-id-user@gmail.com";
+  return "gaia_id_for_user@gmail.com";
 #endif
 }
 
@@ -135,7 +135,7 @@
 
 IN_PROC_BROWSER_TEST_F(
     SingleClientUserConsentsSyncTest,
-    ShouldPreserveConsentsOnDisableSyncAndResubmitWhenReneabled) {
+    ShouldPreserveConsentsOnDisableSyncAndResubmitWhenReenabled) {
   SetSyncUserConsentSeparateTypeFeature(true);
 
   UserConsentSpecifics specifics;
@@ -159,4 +159,46 @@
   EXPECT_TRUE(ExpectUserConsents({specifics}));
 }
 
+// ChromeOS does not support late signin after profile creation, so the test
+// below does not apply, at least in the current form.
+#if !defined(OS_CHROMEOS)
+IN_PROC_BROWSER_TEST_F(SingleClientUserConsentsSyncTest,
+                       ShouldSubmitIfSignedInAlthoughFullSyncNotEnabled) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitWithFeatures(
+      // Enabled.
+      {switches::kSyncStandaloneTransport,
+       switches::kSyncUserConsentSeparateType},
+      // Disabled.
+      {});
+
+  // We avoid calling SetupSync(), because we don't want to turn on full sync,
+  // only sign in such that the standalone transport starts.
+  ASSERT_TRUE(SetupClients());
+  ASSERT_TRUE(GetClient(0)->SignIn());
+  ASSERT_TRUE(GetClient(0)->AwaitEngineInitialization());
+  ASSERT_TRUE(AwaitQuiescence());
+  ASSERT_FALSE(GetSyncService(0)->IsSyncActive())
+      << "Full sync should be disabled";
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            GetSyncService(0)->GetTransportState());
+  ASSERT_TRUE(
+      GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_CONSENTS));
+
+  SyncConsent sync_consent;
+  sync_consent.set_confirmation_grd_id(1);
+  sync_consent.set_status(UserConsentTypes::GIVEN);
+
+  ConsentAuditorFactory::GetForProfile(GetProfile(0))
+      ->RecordSyncConsent(GetAccountId(), sync_consent);
+
+  UserConsentSpecifics specifics;
+  specifics.set_confirmation_grd_id(1);
+  // Account id may be compared to the synced account, thus, we need them to
+  // match.
+  specifics.set_account_id(GetAccountId());
+  EXPECT_TRUE(ExpectUserConsents({specifics}));
+}
+#endif  // !defined(OS_CHROMEOS)
+
 }  // namespace
diff --git a/chrome/browser/sync/test/integration/sync_errors_test.cc b/chrome/browser/sync/test/integration/sync_errors_test.cc
index c6288bf3..1842d9f 100644
--- a/chrome/browser/sync/test/integration/sync_errors_test.cc
+++ b/chrome/browser/sync/test/integration/sync_errors_test.cc
@@ -258,8 +258,7 @@
   // Make server return SUCCESS so that sync can initialize.
   EXPECT_TRUE(GetFakeServer()->TriggerError(sync_pb::SyncEnums::SUCCESS));
 
-  ASSERT_TRUE(GetClient(0)->AwaitEngineInitialization(
-      /*skip_passphrase_verification=*/false));
+  ASSERT_TRUE(GetClient(0)->AwaitEngineInitialization());
 
   // Ensure cache_guid changed.
   GetSyncService(0)->QueryDetailedSyncStatus(&status);
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc
index 0084f72..6f6577e 100644
--- a/chrome/browser/sync/test/integration/sync_test.cc
+++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -546,8 +546,12 @@
       LOG(FATAL) << "Could not create Gaia account.";
   }
 
+  auto* cl = base::CommandLine::ForCurrentProcess();
+  if (!cl->HasSwitch(switches::kSyncDeferredStartupTimeoutSeconds)) {
+    cl->AppendSwitchASCII(switches::kSyncDeferredStartupTimeoutSeconds, "1");
+  }
+
 #if defined(OS_CHROMEOS)
-  const auto* cl = base::CommandLine::ForCurrentProcess();
   // ARC_PACKAGE do not support supervised users, switches::kSupervisedUserId
   // need to be set in SetUpCommandLine() when a test will use supervise users.
   if (!cl->HasSwitch(switches::kSupervisedUserId)) {
@@ -622,8 +626,7 @@
 
   DCHECK(!clients_[index]);
   clients_[index] = ProfileSyncServiceHarness::Create(
-      GetProfile(index), username_, "gaia-id-" + username_, password_,
-      singin_type);
+      GetProfile(index), username_, password_, singin_type);
   EXPECT_NE(nullptr, GetClient(index)) << "Could not create Client " << index;
   InitializeInvalidations(index);
 }
diff --git a/chrome/browser/sync/test/integration/two_client_uss_sync_test.cc b/chrome/browser/sync/test/integration/two_client_uss_sync_test.cc
index 1745341..450e43e 100644
--- a/chrome/browser/sync/test/integration/two_client_uss_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_uss_sync_test.cc
@@ -55,8 +55,7 @@
       syncer::ModelType type) override {
     return type == syncer::PREFERENCES
                ? static_cast<base::WeakPtr<ModelTypeControllerDelegate>>(
-                     bridge_->change_processor()
-                         ->GetControllerDelegateOnUIThread())
+                     bridge_->change_processor()->GetControllerDelegate())
                : ChromeSyncClient::GetControllerDelegateForModelType(type);
   }
 
diff --git a/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc b/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
index 94f8c0d..3738826 100644
--- a/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
+++ b/chrome/browser/sync/test/integration/updated_progress_marker_checker.cc
@@ -32,12 +32,11 @@
   //    GetLastCycleSnapshot() prior to the first sync cycle).
   // 2. Our last sync cycle committed no changes (because commits are followed
   //    by the test-only 'self-notify' cycle).
-  // 3. Sync is still active (e.g. no failures).
-  // 4. No pending local changes (which will ultimately generate new progress
+  // 3. No pending local changes (which will ultimately generate new progress
   //    markers once submitted to the server).
   return !snap.download_progress_markers().empty() &&
          snap.model_neutral_state().num_successful_commits == 0 &&
-         service()->IsSyncActive() && !has_unsynced_items_.value();
+         !has_unsynced_items_.value();
 }
 
 void UpdatedProgressMarkerChecker::GotHasUnsyncedItems(
diff --git a/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc b/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
index 90b301e..de65292 100644
--- a/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_backend/drive_backend_sync_unittest.cc
@@ -13,8 +13,8 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/sync_file_system/drive_backend/callback_helper.h"
 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine.cc b/chrome/browser/sync_file_system/drive_backend/sync_engine.cc
index 028be41..8228ee8 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine.cc
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine.cc
@@ -10,7 +10,7 @@
 #include "base/bind.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine.h b/chrome/browser/sync_file_system/drive_backend/sync_engine.h
index 0c23742..e843e9f0 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine.h
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine.h
@@ -21,7 +21,7 @@
 #include "components/drive/drive_notification_observer.h"
 #include "components/drive/service/drive_service_interface.h"
 #include "components/signin/core/browser/signin_manager_base.h"
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
 class OAuth2TokenService;
@@ -69,7 +69,7 @@
       public LocalChangeProcessor,
       public drive::DriveNotificationObserver,
       public drive::DriveServiceObserver,
-      public content::NetworkConnectionTracker::NetworkConnectionObserver,
+      public network::NetworkConnectionTracker::NetworkConnectionObserver,
       public SigninManagerBase::Observer {
  public:
   typedef RemoteFileSyncService::Observer SyncServiceObserver;
@@ -146,7 +146,7 @@
   void OnReadyToSendRequests() override;
   void OnRefreshTokenInvalid() override;
 
-  // content::NetworkConnectionTracker::NetworkConnectionObserver overrides.
+  // network::NetworkConnectionTracker::NetworkConnectionObserver overrides.
   void OnConnectionChanged(network::mojom::ConnectionType type) override;
 
   // SigninManagerBase::Observer overrides.
diff --git a/chrome/browser/sync_file_system/drive_backend/sync_engine_unittest.cc b/chrome/browser/sync_file_system/drive_backend/sync_engine_unittest.cc
index 0c378f5..f5693dea 100644
--- a/chrome/browser/sync_file_system/drive_backend/sync_engine_unittest.cc
+++ b/chrome/browser/sync_file_system/drive_backend/sync_engine_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/sync_file_system/drive_backend/callback_helper.h"
 #include "chrome/browser/sync_file_system/drive_backend/fake_sync_worker.h"
diff --git a/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc b/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc
index dcc3bc7..ba44efb7 100644
--- a/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc
+++ b/chrome/browser/sync_file_system/local/local_file_sync_service_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc b/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc
index 03f494d..1ec907b7 100644
--- a/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc
+++ b/chrome/browser/sync_file_system/sync_file_system_service_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/sync_file_system/local/canned_syncable_file_system.h"
 #include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
diff --git a/chrome/browser/task_manager/sampling/shared_sampler_win_unittest.cc b/chrome/browser/task_manager/sampling/shared_sampler_win_unittest.cc
index be37f98..93e8bf5 100644
--- a/chrome/browser/task_manager/sampling/shared_sampler_win_unittest.cc
+++ b/chrome/browser/task_manager/sampling/shared_sampler_win_unittest.cc
@@ -15,7 +15,7 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "chrome/browser/task_manager/sampling/shared_sampler_win_defines.h"
 #include "chrome/browser/task_manager/task_manager_observer.h"
diff --git a/chrome/browser/task_manager/sampling/task_manager_impl.cc b/chrome/browser/task_manager/sampling/task_manager_impl.cc
index 33413eb..8639716 100644
--- a/chrome/browser/task_manager/sampling/task_manager_impl.cc
+++ b/chrome/browser/task_manager/sampling/task_manager_impl.cc
@@ -12,7 +12,7 @@
 
 #include "base/command_line.h"
 #include "base/containers/adapters.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/task_manager/providers/browser_process_task_provider.h"
 #include "chrome/browser/task_manager/providers/child_process_task_provider.h"
diff --git a/chrome/browser/themes/browser_theme_pack.cc b/chrome/browser/themes/browser_theme_pack.cc
index 7cb36f1..0d341863 100644
--- a/chrome/browser/themes/browser_theme_pack.cc
+++ b/chrome/browser/themes/browser_theme_pack.cc
@@ -11,9 +11,11 @@
 #include <memory>
 #include <utility>
 
+#include "base/containers/flat_set.h"
 #include "base/files/file.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted_memory.h"
+#include "base/no_destructor.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -51,7 +53,7 @@
 // theme packs that aren't int-equal to this. Increment this number if you
 // change default theme assets or if you need themes to recreate their generated
 // images (which are cached).
-const int kThemePackVersion = 55;
+const int kThemePackVersion = 56;
 
 // IDs that are in the DataPack won't clash with the positive integer
 // uint16_t. kHeaderID should always have the maximum value because we want the
@@ -785,13 +787,30 @@
 }
 
 bool BrowserThemePack::GetColor(int id, SkColor* color) const {
+  static const base::NoDestructor<
+      base::flat_set<ThemeProperties::OverwritableByUserThemeProperty>>
+      kOpaqueColors({
+          // Background tabs must be opaque since the tabstrip expects to be
+          // able to render text opaquely atop them.
+          ThemeProperties::COLOR_BACKGROUND_TAB,
+          ThemeProperties::COLOR_BACKGROUND_TAB_INACTIVE,
+          ThemeProperties::COLOR_BACKGROUND_TAB_INCOGNITO,
+          ThemeProperties::COLOR_BACKGROUND_TAB_INCOGNITO_INACTIVE,
+          // The frame colors will be used for background tabs when not
+          // otherwise overridden and thus must be opaque as well.
+          ThemeProperties::COLOR_FRAME, ThemeProperties::COLOR_FRAME_INACTIVE,
+          ThemeProperties::COLOR_FRAME_INCOGNITO,
+          ThemeProperties::COLOR_FRAME_INCOGNITO_INACTIVE,
+          // The toolbar is used as the foreground tab color, so it must be
+          // opaque just like background tabs.
+          ThemeProperties::COLOR_TOOLBAR,
+      });
+
   if (colors_) {
     for (size_t i = 0; i < kColorTableLength; ++i) {
       if (colors_[i].id == id) {
         *color = colors_[i].color;
-        // The theme provider is intentionally made to ignore alpha for toolbar
-        // color, as we don't want to allow transparent toolbars.
-        if (id == ThemeProperties::COLOR_TOOLBAR)
+        if (base::ContainsKey(*kOpaqueColors, id))
           *color = SkColorSetA(*color, SK_AlphaOPAQUE);
         return true;
       }
diff --git a/chrome/browser/themes/custom_theme_supplier.cc b/chrome/browser/themes/custom_theme_supplier.cc
index e6df2774..015a7c26 100644
--- a/chrome/browser/themes/custom_theme_supplier.cc
+++ b/chrome/browser/themes/custom_theme_supplier.cc
@@ -6,7 +6,7 @@
 
 #include "base/memory/ref_counted_memory.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/gfx/color_utils.h"
 #include "ui/gfx/image/image.h"
 
diff --git a/chrome/browser/themes/theme_service.cc b/chrome/browser/themes/theme_service.cc
index 1f824b8..2d6cf18e 100644
--- a/chrome/browser/themes/theme_service.cc
+++ b/chrome/browser/themes/theme_service.cc
@@ -17,7 +17,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "chrome/browser/chrome_notification_types.h"
diff --git a/chrome/browser/themes/theme_service_browsertest.cc b/chrome/browser/themes/theme_service_browsertest.cc
index 4bc11be..d15d8b0f 100644
--- a/chrome/browser/themes/theme_service_browsertest.cc
+++ b/chrome/browser/themes/theme_service_browsertest.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/themes/theme_service.h"
 
 #include "base/macros.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/component_loader.h"
diff --git a/chrome/browser/thumbnails/thumbnail_tab_helper.cc b/chrome/browser/thumbnails/thumbnail_tab_helper.cc
index 4f6ec90..7fa3a32 100644
--- a/chrome/browser/thumbnails/thumbnail_tab_helper.cc
+++ b/chrome/browser/thumbnails/thumbnail_tab_helper.cc
@@ -6,8 +6,8 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/thumbnails/thumbnail_service.h"
 #include "chrome/browser/thumbnails/thumbnail_service_factory.h"
diff --git a/chrome/browser/tracing/crash_service_uploader.cc b/chrome/browser/tracing/crash_service_uploader.cc
index 30ca2ad4..b965c11 100644
--- a/chrome/browser/tracing/crash_service_uploader.cc
+++ b/chrome/browser/tracing/crash_service_uploader.cc
@@ -14,7 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 05586080..13b4291 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -525,8 +525,8 @@
       "cocoa/toolbar/toolbar_view_cocoa.mm",
       "cocoa/touchbar/credit_card_autofill_touch_bar_controller.h",
       "cocoa/touchbar/credit_card_autofill_touch_bar_controller.mm",
-      "cocoa/touchbar/suggested_text_touch_bar_controller.h",
-      "cocoa/touchbar/suggested_text_touch_bar_controller.mm",
+      "cocoa/touchbar/text_suggestions_touch_bar_controller.h",
+      "cocoa/touchbar/text_suggestions_touch_bar_controller.mm",
       "cocoa/touchbar/web_textfield_touch_bar_controller.h",
       "cocoa/touchbar/web_textfield_touch_bar_controller.mm",
       "cocoa/translate/translate_bubble_bridge_views.h",
@@ -1452,6 +1452,7 @@
       "search/new_tab_page_navigation_throttle.h",
       "search/ntp_user_data_logger.cc",
       "search/ntp_user_data_logger.h",
+      "search/ntp_user_data_types.h",
       "search/search_ipc_router.cc",
       "search/search_ipc_router.h",
       "search/search_ipc_router_policy_impl.cc",
@@ -2201,10 +2202,6 @@
     ]
     allow_circular_includes_from += [ "//chrome/browser/chromeos" ]
 
-    if (enable_rlz) {
-      deps += [ "//chrome/browser:rlz" ]
-    }
-
     if (!is_official_build) {
       sources += [
         "webui/chromeos/emulator/device_emulator_message_handler.cc",
@@ -3948,6 +3945,8 @@
       "webui/print_preview/extension_printer_handler.h",
       "webui/print_preview/pdf_printer_handler.cc",
       "webui/print_preview/pdf_printer_handler.h",
+      "webui/print_preview/policy_settings.cc",
+      "webui/print_preview/policy_settings.h",
       "webui/print_preview/print_preview_handler.cc",
       "webui/print_preview/print_preview_handler.h",
       "webui/print_preview/print_preview_ui.cc",
diff --git a/chrome/browser/ui/app_list/app_context_menu_unittest.cc b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
index 4cab9032..7975b53 100644
--- a/chrome/browser/ui/app_list/app_context_menu_unittest.cc
+++ b/chrome/browser/ui/app_list/app_context_menu_unittest.cc
@@ -708,7 +708,8 @@
 
 // Tests that internal app's context menu is correct.
 TEST_P(AppContextMenuTest, InternalAppMenu) {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     if (!internal_app.show_in_launcher)
       continue;
 
diff --git a/chrome/browser/ui/app_list/arc/arc_app_icon.cc b/chrome/browser/ui/app_list/arc/arc_app_icon.cc
index 4bcad92..e124736b 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_icon.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_icon.cc
@@ -15,7 +15,7 @@
 #include "base/files/file_util.h"
 #include "base/lazy_instance.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/image_decoder.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
index 4133099..400811a3 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_list_prefs.cc
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
 #include "chrome/browser/chromeos/arc/arc_util.h"
diff --git a/chrome/browser/ui/app_list/arc/arc_app_utils.cc b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
index ae06d05..fa0ae0a 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_utils.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_utils.cc
@@ -85,10 +85,11 @@
 constexpr char kAndroidClockAppId[] = "ddmmnabaeomoacfpfjgghfpocfolhjlg";
 constexpr char kAndroidFilesAppId[] = "gmiohhmfhgfclpeacmdfancbipocempm";
 constexpr char kAndroidCameraAppId[] = "goamfaniemdfcajgcmmflhchgkmbngka";
+constexpr char kAndroidLegacyCameraAppId[] = "obfofkigjfamlldmipdegnjlcpincibc";
 
 constexpr char const* kAppIdsHiddenInLauncher[] = {
-    kAndroidClockAppId, kSettingsAppId, kAndroidFilesAppId,
-    kAndroidCameraAppId};
+    kAndroidClockAppId, kSettingsAppId, kAndroidFilesAppId, kAndroidCameraAppId,
+    kAndroidLegacyCameraAppId};
 
 // Returns true if |event_flags| came from a mouse or touch event.
 bool IsMouseOrTouchEventFromFlags(int event_flags) {
diff --git a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
index cfba664..e2ec208 100644
--- a/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
+++ b/chrome/browser/ui/app_list/arc/arc_default_app_list.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_enumerator.h"
 #include "base/json/json_file_value_serializer.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/extensions/extension_service.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
 #include "chrome/browser/ui/app_list/arc/arc_app_utils.h"
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc b/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc
index 5d7ce64..e2d09411 100644
--- a/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_icon.cc
@@ -15,7 +15,7 @@
 #include "base/files/file_util.h"
 #include "base/macros.h"
 #include "base/no_destructor.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service.h"
 #include "chrome/browser/chromeos/crostini/crostini_registry_service_factory.h"
 #include "chrome/browser/chromeos/crostini/crostini_util.h"
diff --git a/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc
index ab9d9ae..491c4707 100644
--- a/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc
+++ b/chrome/browser/ui/app_list/crostini/crostini_app_model_builder.cc
@@ -69,8 +69,20 @@
   for (const std::string& app_id : removed_apps)
     RemoveApp(app_id, unsynced_change);
   for (const std::string& app_id : updated_apps) {
-    RemoveApp(app_id, unsynced_change);
-    InsertCrostiniAppItem(registry_service, app_id);
+    crostini::CrostiniRegistryService::Registration registration =
+        *registry_service->GetRegistration(app_id);
+    if (registration.NoDisplay()) {
+      RemoveApp(app_id, unsynced_change);
+      continue;
+    }
+
+    CrostiniAppItem* app_item =
+        static_cast<CrostiniAppItem*>(GetAppItem(app_id));
+    if (!app_item) {
+      InsertCrostiniAppItem(registry_service, app_id);
+      continue;
+    }
+    app_item->SetName(registration.Name());
   }
   for (const std::string& app_id : inserted_apps) {
     // If the app has been installed before and has not been cleaned up
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
index e6f9d94a..3f9b48c 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.cc
@@ -46,45 +46,45 @@
 namespace {
 constexpr char kChromeCameraAppId[] = "hfhhnacclhffhdffklopdkcgdhifgngh";
 constexpr char kAndroidCameraAppId[] = "goamfaniemdfcajgcmmflhchgkmbngka";
+constexpr char kAndroidLegacyCameraAppId[] = "obfofkigjfamlldmipdegnjlcpincibc";
 }  // namespace
 
-const std::vector<InternalApp>& GetInternalAppList() {
-  static const base::NoDestructor<std::vector<InternalApp>> internal_app_list(
+const std::vector<InternalApp>& GetInternalAppList(bool is_guest_mode) {
+  base::NoDestructor<std::vector<InternalApp>> internal_app_list(
       {{kInternalAppIdKeyboardShortcutViewer,
         IDS_INTERNAL_APP_KEYBOARD_SHORTCUT_VIEWER, IDR_SHORTCUT_VIEWER_LOGO_192,
         /*recommendable=*/false,
         /*searchable=*/true,
-        /*show_in_launcher=*/false,
-        InternalAppName::kKeyboardShortcutViewer,
+        /*show_in_launcher=*/false, InternalAppName::kKeyboardShortcutViewer,
         IDS_LAUNCHER_SEARCHABLE_KEYBOARD_SHORTCUT_VIEWER},
 
        {kInternalAppIdSettings, IDS_INTERNAL_APP_SETTINGS,
         IDR_SETTINGS_LOGO_192,
         /*recommendable=*/true,
         /*searchable=*/true,
-        /*show_in_launcher=*/true,
-        InternalAppName::kSettings,
+        /*show_in_launcher=*/true, InternalAppName::kSettings,
         /*searchable_string_resource_id=*/0},
 
        {kInternalAppIdContinueReading, IDS_INTERNAL_APP_CONTINUOUS_READING,
         IDR_PRODUCT_LOGO_256,
         /*recommendable=*/true,
         /*searchable=*/false,
-        /*show_in_launcher=*/false,
-        InternalAppName::kContinueReading,
-        /*searchable_string_resource_id=*/0},
-
-       {kInternalAppIdCamera, IDS_INTERNAL_APP_CAMERA, IDR_CAMERA_LOGO_192,
-        /*recommendable=*/true,
-        /*searchable=*/true,
-        /*show_in_launcher=*/true,
-        InternalAppName::kCamera,
+        /*show_in_launcher=*/false, InternalAppName::kContinueReading,
         /*searchable_string_resource_id=*/0}});
+
+  if (!is_guest_mode) {
+    internal_app_list->push_back(
+        {kInternalAppIdCamera, IDS_INTERNAL_APP_CAMERA, IDR_CAMERA_LOGO_192,
+         /*recommendable=*/true,
+         /*searchable=*/true,
+         /*show_in_launcher=*/true, InternalAppName::kCamera,
+         /*searchable_string_resource_id=*/0});
+  }
   return *internal_app_list;
 }
 
 const InternalApp* FindInternalApp(const std::string& app_id) {
-  for (const auto& app : GetInternalAppList()) {
+  for (const auto& app : GetInternalAppList(false)) {
     if (app_id == app.app_id)
       return &app;
   }
@@ -121,9 +121,13 @@
   AppListClientImpl* controller = AppListClientImpl::GetInstance();
   if (arc_enabled && (!extension || media_consolidated)) {
     // Open ARC++ camera app.
-    arc::LaunchApp(profile, kAndroidCameraAppId, event_flags,
-                   arc::UserInteractionType::APP_STARTED_FROM_LAUNCHER,
-                   controller->GetAppListDisplayId());
+    if (!arc::LaunchApp(profile, kAndroidCameraAppId, event_flags,
+                        arc::UserInteractionType::APP_STARTED_FROM_LAUNCHER,
+                        controller->GetAppListDisplayId())) {
+      arc::LaunchApp(profile, kAndroidLegacyCameraAppId, event_flags,
+                     arc::UserInteractionType::APP_STARTED_FROM_LAUNCHER,
+                     controller->GetAppListDisplayId());
+    }
   } else if (extension) {
     // Open Chrome camera app.
     AppLaunchParams params = CreateAppLaunchParamsWithEventFlags(
@@ -230,10 +234,11 @@
   return app->internal_app_name;
 }
 
-size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name) {
+size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name,
+                                                    bool is_guest_mode) {
   size_t num_of_internal_apps_show_in_launcher = 0u;
   std::vector<std::string> internal_apps_name;
-  for (const auto& app : GetInternalAppList()) {
+  for (const auto& app : GetInternalAppList(is_guest_mode)) {
     if (app.show_in_launcher) {
       ++num_of_internal_apps_show_in_launcher;
       if (apps_name) {
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h
index 4b56fe97..120b324 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_metadata.h
@@ -52,7 +52,7 @@
 };
 
 // Returns a list of Chrome OS internal apps, which are searchable in launcher.
-const std::vector<InternalApp>& GetInternalAppList();
+const std::vector<InternalApp>& GetInternalAppList(bool is_guest_mode);
 
 // Returns InternalApp by |app_id|.
 // Returns nullptr if |app_id| does not correspond to an internal app.
@@ -95,7 +95,8 @@
 // Returns the number of internal apps which can show in launcher.
 // If |apps_name| is not nullptr, it will be the concatenated string of these
 // internal apps' name.
-size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name);
+size_t GetNumberOfInternalAppsShowInLauncherForTest(std::string* apps_name,
+                                                    bool is_guest_mode);
 
 }  // namespace app_list
 
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc
index 37021a7..fb6c89f 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/app_list/internal_app/internal_app_model_builder.h"
 
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_item.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
@@ -13,7 +14,8 @@
     : AppListModelBuilder(controller, InternalAppItem::kItemType) {}
 
 void InternalAppModelBuilder::BuildModel() {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     if (!internal_app.show_in_launcher)
       continue;
 
diff --git a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc
index 26a7f00..338a0015 100644
--- a/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc
+++ b/chrome/browser/ui/app_list/internal_app/internal_app_model_builder_unittest.cc
@@ -6,11 +6,13 @@
 
 #include "base/macros.h"
 #include "base/strings/string_util.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_test_util.h"
 #include "chrome/browser/ui/app_list/chrome_app_list_item.h"
 #include "chrome/browser/ui/app_list/internal_app/internal_app_metadata.h"
 #include "chrome/browser/ui/app_list/test/fake_app_list_model_updater.h"
 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h"
+#include "chrome/test/base/testing_profile.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -33,7 +35,6 @@
   // AppListTestBase:
   void SetUp() override {
     AppListTestBase::SetUp();
-    CreateBuilder();
   }
 
   void TearDown() override {
@@ -42,19 +43,20 @@
   }
 
  protected:
-  std::unique_ptr<FakeAppListModelUpdater> model_updater_;
-
- private:
   // Creates a new builder, destroying any existing one.
-  void CreateBuilder() {
+  void CreateBuilder(bool guest_mode) {
     ResetBuilder();  // Destroy any existing builder in the correct order.
 
+    testing_profile()->SetGuestSession(guest_mode);
     model_updater_ = std::make_unique<FakeAppListModelUpdater>();
     controller_ = std::make_unique<test::TestAppListControllerDelegate>();
     builder_ = std::make_unique<InternalAppModelBuilder>(controller_.get());
     builder_->Initialize(nullptr, profile(), model_updater_.get());
   }
 
+  std::unique_ptr<FakeAppListModelUpdater> model_updater_;
+
+ private:
   void ResetBuilder() {
     builder_.reset();
     controller_.reset();
@@ -71,8 +73,20 @@
   // The internal apps list is provided by GetInternalAppList() in
   // internal_app_metadata.cc. Only count the apps can display in launcher.
   std::string internal_apps_name;
+  CreateBuilder(false);
   EXPECT_EQ(app_list::GetNumberOfInternalAppsShowInLauncherForTest(
-                &internal_apps_name),
+                &internal_apps_name, profile()->IsGuestSession()),
+            model_updater_->ItemCount());
+  EXPECT_EQ(internal_apps_name, GetModelContent(model_updater_.get()));
+}
+
+TEST_F(InternalAppModelBuilderTest, BuildGuestMode) {
+  // The internal apps list is provided by GetInternalAppList() in
+  // internal_app_metadata.cc. Only count the apps can display in launcher.
+  std::string internal_apps_name;
+  CreateBuilder(true);
+  EXPECT_EQ(app_list::GetNumberOfInternalAppsShowInLauncherForTest(
+                &internal_apps_name, profile()->IsGuestSession()),
             model_updater_->ItemCount());
   EXPECT_EQ(internal_apps_name, GetModelContent(model_updater_.get()));
 }
diff --git a/chrome/browser/ui/app_list/search/app_search_provider.cc b/chrome/browser/ui/app_list/search/app_search_provider.cc
index 374a3df5..44302fe 100644
--- a/chrome/browser/ui/app_list/search/app_search_provider.cc
+++ b/chrome/browser/ui/app_list/search/app_search_provider.cc
@@ -370,7 +370,8 @@
   // AppSearchProvider::DataSource overrides:
   void AddApps(AppSearchProvider::Apps* apps) override {
     const base::Time time;
-    for (const auto& internal_app : GetInternalAppList()) {
+    for (const auto& internal_app :
+         GetInternalAppList(profile()->IsGuestSession())) {
       if (!std::strcmp(internal_app.app_id, kInternalAppIdContinueReading) &&
           !features::IsContinueReadingEnabled()) {
         continue;
diff --git a/chrome/browser/ui/app_list/search/dictionary_data_store.cc b/chrome/browser/ui/app_list/search/dictionary_data_store.cc
index df6a9d4f..3a9af160 100644
--- a/chrome/browser/ui/app_list/search/dictionary_data_store.cc
+++ b/chrome/browser/ui/app_list/search/dictionary_data_store.cc
@@ -14,7 +14,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/values.h"
 
diff --git a/chrome/browser/ui/ash/ash_util.cc b/chrome/browser/ui/ash/ash_util.cc
index f085853..d13dcaf 100644
--- a/chrome/browser/ui/ash/ash_util.cc
+++ b/chrome/browser/ui/ash/ash_util.cc
@@ -21,10 +21,6 @@
 
 namespace ash_util {
 
-bool ShouldOpenAshOnStartup() {
-  return features::IsAshInBrowserProcess();
-}
-
 bool IsAcceleratorDeprecated(const ui::Accelerator& accelerator) {
   // When running in mash the browser doesn't handle ash accelerators.
   if (!features::IsAshInBrowserProcess())
diff --git a/chrome/browser/ui/ash/ash_util.h b/chrome/browser/ui/ash/ash_util.h
index f4474217..3bd9991 100644
--- a/chrome/browser/ui/ash/ash_util.h
+++ b/chrome/browser/ui/ash/ash_util.h
@@ -20,9 +20,6 @@
 
 namespace ash_util {
 
-// Returns true if Ash should be run at startup.
-bool ShouldOpenAshOnStartup();
-
 // Returns true if the given |accelerator| has been deprecated and hence can
 // be consumed by web contents if needed.
 bool IsAcceleratorDeprecated(const ui::Accelerator& accelerator);
diff --git a/chrome/browser/ui/ash/assistant/assistant_setup.cc b/chrome/browser/ui/ash/assistant/assistant_setup.cc
index e8c591e..9458884 100644
--- a/chrome/browser/ui/ash/assistant/assistant_setup.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_setup.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/ash/assistant/assistant_setup.h"
 
+#include "ash/public/cpp/vector_icons/vector_icons.h"
 #include "ash/public/interfaces/assistant_controller.mojom.h"
 #include "ash/public/interfaces/constants.mojom.h"
 #include "base/metrics/histogram_macros.h"
@@ -18,14 +19,17 @@
 #include "components/prefs/pref_service.h"
 #include "services/service_manager/public/cpp/connector.h"
 #include "ui/base/l10n/l10n_util.h"
+#include "ui/gfx/paint_vector_icon.h"
 #include "ui/message_center/public/cpp/notification.h"
 #include "ui/message_center/public/cpp/notification_delegate.h"
 
 namespace {
 
+constexpr char kAssistantDisplaySource[] = "Assistant";
 constexpr char kAssistantSubPage[] = "googleAssistant";
 constexpr char kHotwordNotificationId[] = "assistant/hotword";
 constexpr char kNotifierAssistant[] = "assistant";
+constexpr int kAssistantIconSize = 24;
 
 // Delegate for assistant hotword notification.
 class AssistantHotwordNotificationDelegate
@@ -111,7 +115,8 @@
 
   const base::string16 title =
       l10n_util::GetStringUTF16(IDS_ASSISTANT_HOTWORD_NOTIFICATION_TITLE);
-  const base::string16 display_source = base::UTF8ToUTF16(kNotifierAssistant);
+  const base::string16 display_source =
+      base::UTF8ToUTF16(kAssistantDisplaySource);
 
   message_center::Notification notification(
       message_center::NOTIFICATION_TYPE_SIMPLE, kHotwordNotificationId, title,
@@ -120,6 +125,10 @@
                                  kNotifierAssistant),
       {}, base::MakeRefCounted<AssistantHotwordNotificationDelegate>(profile));
 
+  gfx::Image image(CreateVectorIcon(ash::kNotificationAssistantIcon,
+                                    kAssistantIconSize, gfx::kGoogleBlue700));
+  notification.set_small_image(image);
+
   NotificationDisplayService::GetForProfile(profile)->Display(
       NotificationHandler::Type::TRANSIENT, notification);
 }
diff --git a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
index f5acb29f..a2f7efb 100644
--- a/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
+++ b/chrome/browser/ui/ash/chrome_screenshot_grabber.cc
@@ -23,7 +23,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/syslog_logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
index 49814059c..415bd19 100644
--- a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
@@ -305,3 +305,17 @@
   EXPECT_EQ(controller->GetStateForTest(),
             keyboard::KeyboardControllerState::SHOWN);
 }
+
+// See crbug.com/755354.
+IN_PROC_BROWSER_TEST_F(VirtualKeyboardStateTest,
+                       DisablingKeyboardGoesToInitialState) {
+  auto* controller = keyboard::KeyboardController::Get();
+
+  controller->LoadKeyboardWindowInBackground();
+  EXPECT_EQ(controller->GetStateForTest(),
+            keyboard::KeyboardControllerState::LOADING_EXTENSION);
+
+  controller->DisableKeyboard();
+  EXPECT_EQ(controller->GetStateForTest(),
+            keyboard::KeyboardControllerState::INITIAL);
+}
diff --git a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
index b5054d5..8bb9952 100644
--- a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc
@@ -24,7 +24,7 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
@@ -284,7 +284,7 @@
     const extensions::Extension* browser_extension =
         ExtensionRegistry::Get(browser->profile())
             ->GetExtensionById(
-                web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+                web_app::GetAppIdFromApplicationName(browser->app_name()),
                 ExtensionRegistry::EVERYTHING);
     return browser_extension == extension;
   }
diff --git a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
index 5c57d574..f7774c8f 100644
--- a/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
+++ b/chrome/browser/ui/ash/launcher/browser_shortcut_launcher_item_controller.cc
@@ -24,7 +24,7 @@
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/theme_resources.h"
@@ -361,8 +361,7 @@
       return false;
 
     // V1 App popup windows may have their own item.
-    ash::ShelfID id(
-        web_app::GetExtensionIdFromApplicationName(browser->app_name()));
+    ash::ShelfID id(web_app::GetAppIdFromApplicationName(browser->app_name()));
     if (ChromeLauncherController::instance()->GetItem(id) != nullptr)
       return false;
   }
diff --git a/chrome/browser/ui/ash/launcher/browser_status_monitor.cc b/chrome/browser/ui/ash/launcher/browser_status_monitor.cc
index da36018..c7092de 100644
--- a/chrome/browser/ui/ash/launcher/browser_status_monitor.cc
+++ b/chrome/browser/ui/ash/launcher/browser_status_monitor.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -191,7 +191,7 @@
   DCHECK(initialized_);
 
   std::string app_id =
-      web_app::GetExtensionIdFromApplicationName(browser->app_name());
+      web_app::GetAppIdFromApplicationName(browser->app_name());
   if (!app_id.empty()) {
     if (!IsV1AppInShelfWithAppId(app_id))
       launcher_controller_->SetV1AppStatus(app_id, ash::STATUS_RUNNING);
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index 2b13eb0..07f94b4c 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -59,7 +59,7 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chromium_strings.h"
 #include "chrome/grit/generated_resources.h"
@@ -1093,8 +1093,7 @@
     Browser* browser = *it;
     if (!browser->is_type_tabbed() && browser->is_type_popup() &&
         browser->is_app() &&
-        app_id ==
-            web_app::GetExtensionIdFromApplicationName(browser->app_name()) &&
+        app_id == web_app::GetAppIdFromApplicationName(browser->app_name()) &&
         profile == browser->profile()) {
       browser_to_close.push_back(browser);
     }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
index 0bc3636..516b2d1 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_browsertest.cc
@@ -50,7 +50,7 @@
 #include "chrome/browser/ui/settings_window_manager_chromeos.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/test/test_app_window_icon_observer.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -109,7 +109,7 @@
 Browser* FindBrowserForApp(const std::string& app_name) {
   for (auto* browser : *BrowserList::GetInstance()) {
     std::string browser_app_name =
-        web_app::GetExtensionIdFromApplicationName(browser->app_name());
+        web_app::GetAppIdFromApplicationName(browser->app_name());
     if (browser_app_name == app_name)
       return browser;
   }
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index ed9bbc7..63baeb4a 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -4306,7 +4306,8 @@
   InitLauncherController();
 
   // Only test the first internal app. The others should be the same.
-  const auto& internal_app = app_list::GetInternalAppList().front();
+  const auto& internal_app =
+      app_list::GetInternalAppList(profile()->IsGuestSession()).front();
   const std::string app_id = internal_app.app_id;
   const ash::ShelfID shelf_id(app_id);
   EXPECT_FALSE(launcher_controller_->GetItem(shelf_id));
@@ -4337,7 +4338,8 @@
   InitLauncherController();
 
   // Only test the first internal app. The others should be the same.
-  const auto& internal_app = app_list::GetInternalAppList().front();
+  const auto& internal_app =
+      app_list::GetInternalAppList(profile()->IsGuestSession()).front();
   std::string app_id;
   ash::ShelfID shelf_id;
   EXPECT_FALSE(launcher_controller_->GetItem(shelf_id));
diff --git a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
index 142a120..af35871 100644
--- a/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_context_menu_unittest.cc
@@ -462,7 +462,8 @@
 
 // Tests that the context menu of internal app  is correct.
 TEST_F(LauncherContextMenuTest, InternalAppShelfContextMenu) {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     if (!internal_app.show_in_launcher)
       continue;
 
@@ -492,7 +493,8 @@
 
 // Tests that the number of context menu options of internal app is correct.
 TEST_F(LauncherContextMenuTest, InternalAppShelfContextMenuOptionsNumber) {
-  for (const auto& internal_app : app_list::GetInternalAppList()) {
+  for (const auto& internal_app :
+       app_list::GetInternalAppList(profile()->IsGuestSession())) {
     const std::string app_id = internal_app.app_id;
     const ash::ShelfID shelf_id(app_id);
     // Pin internal app.
diff --git a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
index dbfa764f..7b9ebed1 100644
--- a/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
+++ b/chrome/browser/ui/ash/launcher/launcher_controller_helper.cc
@@ -27,7 +27,7 @@
 #include "chrome/browser/ui/extensions/app_launch_params.h"
 #include "chrome/browser/ui/extensions/application_launch.h"
 #include "chrome/browser/ui/extensions/extension_enable_flow.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "components/arc/arc_util.h"
 #include "components/arc/metrics/arc_metrics_constants.h"
@@ -61,7 +61,7 @@
   // use the tab's url for app tabs.
   if (browser && browser->is_app()) {
     return registry->GetExtensionById(
-        web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+        web_app::GetAppIdFromApplicationName(browser->app_name()),
         extensions::ExtensionRegistry::EVERYTHING);
   }
 
diff --git a/chrome/browser/ui/ash/tab_scrubber.cc b/chrome/browser/ui/ash/tab_scrubber.cc
index 8e3f15df..48dc98b 100644
--- a/chrome/browser/ui/ash/tab_scrubber.cc
+++ b/chrome/browser/ui/ash/tab_scrubber.cc
@@ -52,7 +52,7 @@
 
   // Start the swipe where the tab contents start/end.  This provides a small
   // amount of slop inside the tab before a swipe will change tabs.
-  auto contents_insets = Tab::GetContentsInsets();
+  auto contents_insets = tab->GetContentsInsets();
   int left = contents_insets.left();
   int right = contents_insets.right();
 
diff --git a/chrome/browser/ui/ash/wallpaper_policy_handler.cc b/chrome/browser/ui/ash/wallpaper_policy_handler.cc
index 2436718..836f827 100644
--- a/chrome/browser/ui/ash/wallpaper_policy_handler.cc
+++ b/chrome/browser/ui/ash/wallpaper_policy_handler.cc
@@ -9,7 +9,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/customization/customization_wallpaper_downloader.h"
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index 4f3e85a..1a4f12d8 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -165,13 +165,19 @@
   return security_info.security_level;
 }
 
-void ChromeAutofillClient::ShowAutofillSettings() {
+void ChromeAutofillClient::ShowAutofillSettings(
+    bool show_credit_card_settings) {
 #if defined(OS_ANDROID)
   chrome::android::PreferencesLauncher::ShowAutofillSettings(web_contents());
 #else
   Browser* browser = chrome::FindBrowserWithWebContents(web_contents());
-  if (browser)
-    chrome::ShowSettingsSubPage(browser, chrome::kAutofillSubPage);
+  if (browser) {
+    if (show_credit_card_settings) {
+      chrome::ShowSettingsSubPage(browser, chrome::kPaymentsSubPage);
+    } else {
+      chrome::ShowSettingsSubPage(browser, chrome::kAutofillSubPage);
+    }
+  }
 #endif  // #if defined(OS_ANDROID)
 }
 
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index d77383e..57ceaaf8 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -57,7 +57,7 @@
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  void ShowAutofillSettings() override;
+  void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         UnmaskCardReason reason,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
diff --git a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
index f7184b1..cb0f83a2 100644
--- a/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
+++ b/chrome/browser/ui/autofill/save_card_bubble_controller_impl.cc
@@ -364,7 +364,7 @@
   // TODO(crbug/855186): Implement metrics for sign-in promo.
   chrome::ShowSettingsSubPage(
       chrome::FindBrowserWithWebContents(web_contents()),
-      chrome::kAutofillSubPage);
+      chrome::kPaymentsSubPage);
 }
 
 void SaveCardBubbleControllerImpl::OnBubbleClosed() {
diff --git a/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc b/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc
index 966ffdb..90977a1e 100644
--- a/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc
+++ b/chrome/browser/ui/blocked_content/popup_opener_tab_helper_unittest.cc
@@ -18,7 +18,6 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/engagement/site_engagement_service.h"
 #include "chrome/browser/infobars/infobar_service.h"
 #include "chrome/browser/ui/blocked_content/list_item_position.h"
 #include "chrome/browser/ui/blocked_content/popup_tracker.h"
@@ -51,7 +50,6 @@
 constexpr char kPopupToTabUnder[] = "Tab.TabUnder.PopupToTabUnderTime";
 constexpr char kTabUnderActionOTR[] = "Tab.TabUnderAction.OTR";
 constexpr char kTabUnderActionNonOTR[] = "Tab.TabUnderAction.NonOTR";
-constexpr char kEngagementScore[] = "Tab.TabUnder.EngagementScore";
 
 class PopupOpenerTabHelperTest : public ChromeRenderViewHostTestHarness {
  public:
@@ -687,50 +685,6 @@
   EXPECT_EQ(main_rfh(), candidate_navigation->GetFinalRenderFrameHost());
 }
 
-TEST_F(BlockTabUnderTest, SiteEngagement_None) {
-  EXPECT_TRUE(NavigateAndCommitWithoutGesture(GURL("https://first.test/")));
-  SimulatePopup();
-  const GURL blocked_url("https://example.test/");
-  EXPECT_FALSE(NavigateAndCommitWithoutGesture(blocked_url));
-  ExpectUIShown(true);
-  histogram_tester()->ExpectUniqueSample(kEngagementScore, 0, 1);
-}
-
-TEST_F(BlockTabUnderTest, SiteEngagement_Some) {
-  EXPECT_TRUE(NavigateAndCommitWithoutGesture(GURL("https://first.test/")));
-  SimulatePopup();
-  const GURL blocked_url("https://example.test/");
-
-  auto* site_engagement_service = SiteEngagementService::Get(profile());
-  site_engagement_service->AddPointsForTesting(blocked_url, 1);
-
-  EXPECT_TRUE(NavigateAndCommitWithoutGesture(blocked_url));
-  ExpectUIShown(false);
-  histogram_tester()->ExpectTotalCount(kEngagementScore, 1);
-  auto samples = histogram_tester()->GetAllSamples(kEngagementScore);
-  EXPECT_LT(0, samples[0].min);
-}
-
-TEST_F(BlockTabUnderTest, SiteEngagementNoThreshold_Blocks) {
-  base::test::ScopedFeatureList scoped_features;
-  scoped_features.InitAndEnableFeatureWithParameters(
-      TabUnderNavigationThrottle::kBlockTabUnders,
-      {{"engagement_threshold", "-1"}});
-
-  EXPECT_TRUE(NavigateAndCommitWithoutGesture(GURL("https://first.test/")));
-  SimulatePopup();
-  const GURL blocked_url("https://example.test/");
-
-  auto* site_engagement_service = SiteEngagementService::Get(profile());
-  site_engagement_service->AddPointsForTesting(blocked_url, 1);
-
-  EXPECT_FALSE(NavigateAndCommitWithoutGesture(blocked_url));
-  ExpectUIShown(true);
-  histogram_tester()->ExpectTotalCount(kEngagementScore, 1);
-  auto samples = histogram_tester()->GetAllSamples(kEngagementScore);
-  EXPECT_LT(0, samples[0].min);
-}
-
 // Ensure that even though the *redirect* occurred in the background, if the
 // navigation started in the foreground there is no blocking.
 TEST_F(BlockTabUnderTest,
diff --git a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc
index ada13c3..7fdb8f9 100644
--- a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc
+++ b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.cc
@@ -19,7 +19,6 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/engagement/site_engagement_service.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/blocked_content/list_item_position.h"
 #include "chrome/browser/ui/blocked_content/popup_opener_tab_helper.h"
@@ -52,8 +51,6 @@
 
 namespace {
 
-constexpr char kEngagementThreshold[] = "engagement_threshold";
-
 void LogAction(TabUnderNavigationThrottle::Action action, bool off_the_record) {
   UMA_HISTOGRAM_ENUMERATION("Tab.TabUnderAction", action,
                             TabUnderNavigationThrottle::Action::kCount);
@@ -129,10 +126,6 @@
 TabUnderNavigationThrottle::TabUnderNavigationThrottle(
     content::NavigationHandle* handle)
     : content::NavigationThrottle(handle),
-      engagement_threshold_(
-          base::GetFieldTrialParamByFeatureAsInt(kBlockTabUnders,
-                                                 kEngagementThreshold,
-                                                 0 /* default_value */)),
       off_the_record_(
           handle->GetWebContents()->GetBrowserContext()->IsOffTheRecord()),
       block_(base::FeatureList::IsEnabled(kBlockTabUnders)),
@@ -176,19 +169,6 @@
       previous_main_frame_url.SchemeIs(extensions::kExtensionScheme)) {
     return false;
   }
-
-  // This metric should be logged as the last check before a site would be
-  // blocked, to give an accurate sense of what scores tab-under destinations
-  // typically have.
-  DCHECK_EQ(100, SiteEngagementService::GetMaxPoints());
-  auto* site_engagement_service = SiteEngagementService::Get(
-      Profile::FromBrowserContext(contents->GetBrowserContext()));
-  double engagement_score = site_engagement_service->GetScore(target_url);
-  UMA_HISTOGRAM_COUNTS_100("Tab.TabUnder.EngagementScore",
-                           std::ceil(engagement_score));
-  if (engagement_score > engagement_threshold_ && engagement_threshold_ != -1)
-    return false;
-
   return true;
 }
 
diff --git a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.h b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.h
index cfce5a0d5..8a4f438a 100644
--- a/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.h
+++ b/chrome/browser/ui/blocked_content/tab_under_navigation_throttle.h
@@ -28,9 +28,7 @@
 //    a. It has no user gesture.
 //    b. It is renderer-initiated.
 //    c. It is cross site to the last committed URL in the tab.
-//    d. The target site has a Site Engagement score below some threshold (by
-//       default, a score of 0).
-//    e. The navigation started in the background.
+//    d. The navigation started in the background.
 // 2. The tab has opened a popup and hasn't received a user gesture since then.
 //    This information is tracked by the PopupOpenerTabHelper.
 //
@@ -98,12 +96,6 @@
       override;
   const char* GetNameForLogging() override;
 
-  // Threshold for a site's engagement score to be considered non-suspicious.
-  // Any tab-under target URL with engagement > |engagement_threshold_| will not
-  // be considered a suspicious redirect. If this member is -1, this threshold
-  // will not apply and all sites will be candidates for blocking.
-  const int engagement_threshold_ = 0;
-
   // Store whether we're off the record as a member to avoid looking it up all
   // the time.
   const bool off_the_record_ = false;
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index eff931f9..31e080a 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -150,7 +150,7 @@
 #include "chrome/browser/ui/window_sizer/window_sizer.h"
 #include "chrome/browser/upgrade_detector.h"
 #include "chrome/browser/vr/vr_tab_helper.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/custom_handlers/protocol_handler.h"
@@ -296,7 +296,7 @@
 MaybeCreateHostedAppController(Browser* browser) {
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   const std::string extension_id =
-      web_app::GetExtensionIdFromApplicationName(browser->app_name());
+      web_app::GetAppIdFromApplicationName(browser->app_name());
   const Extension* extension =
       extensions::ExtensionRegistry::Get(browser->profile())
           ->GetExtensionById(extension_id,
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc
index c2a74e4..1627ad27 100644
--- a/chrome/browser/ui/browser_browsertest.cc
+++ b/chrome/browser/ui/browser_browsertest.cc
@@ -987,11 +987,6 @@
 // http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab will not
 // fork a new renderer process.
 IN_PROC_BROWSER_TEST_F(BrowserTest, OtherRedirectsDontForkProcess) {
-  // TODO(lukasza): https://crbug.com/824962: Investigate why this test fails
-  // with --site-per-process.
-  if (content::AreAllSitesIsolatedForTesting())
-    return;
-
   base::CommandLine::ForCurrentProcess()->AppendSwitch(
       switches::kDisablePopupBlocking);
 
@@ -1009,8 +1004,7 @@
   WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
   content::RenderProcessHost* process = oldtab->GetMainFrame()->GetProcess();
 
-  // Now open a tab to a blank page, set its opener to null, and redirect it
-  // cross-site.
+  // Now open a tab to a blank page and redirect it cross-site.
   std::string dont_fork_popup = "w=window.open();";
   dont_fork_popup += "w.document.location=\"";
   dont_fork_popup += https_url.spec();
@@ -1036,10 +1030,14 @@
   EXPECT_EQ(https_url.spec(),
             newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
 
-  // Popup window should still be in the opener's process.
+  // Process of the (cross-site) popup window depends on whether
+  // site-per-process mode is enabled or not.
   content::RenderProcessHost* popup_process =
       newtab->GetMainFrame()->GetProcess();
-  EXPECT_EQ(process, popup_process);
+  if (content::AreAllSitesIsolatedForTesting())
+    EXPECT_NE(process, popup_process);
+  else
+    EXPECT_EQ(process, popup_process);
 
   // Same thing if the current tab tries to navigate itself.
   std::string navigate_str = "document.location=\"";
@@ -1056,10 +1054,18 @@
   EXPECT_EQ(https_url.spec(),
             oldtab->GetController().GetLastCommittedEntry()->GetURL().spec());
 
-  // Original window should still be in the original process.
+  // Whether original stays in the original process (when navigating to a
+  // cross-site url) depends on whether site-per-process mode is enabled or not.
   content::RenderProcessHost* new_process =
       newtab->GetMainFrame()->GetProcess();
-  EXPECT_EQ(process, new_process);
+  if (content::AreAllSitesIsolatedForTesting()) {
+    EXPECT_NE(process, new_process);
+
+    // site-per-process should reuse the process for the https site.
+    EXPECT_EQ(popup_process, new_process);
+  } else {
+    EXPECT_EQ(process, new_process);
+  }
 }
 
 // Test that get_process_idle_time() returns reasonable values when compared
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index ef0f25a..e3c9b46 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -101,7 +101,7 @@
 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
 #include "chrome/browser/extensions/tab_helper.h"
 #include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/extension_metrics.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "extensions/browser/extension_registry.h"
@@ -492,7 +492,7 @@
     const extensions::Extension* extension =
         extensions::ExtensionRegistry::Get(browser->profile())
             ->GetExtensionById(
-                web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+                web_app::GetAppIdFromApplicationName(browser->app_name()),
                 extensions::ExtensionRegistry::EVERYTHING);
     if (!extension)
       return;
diff --git a/chrome/browser/ui/browser_navigator.cc b/chrome/browser/ui/browser_navigator.cc
index 9624ba68..7d3ebdaa 100644
--- a/chrome/browser/ui/browser_navigator.cc
+++ b/chrome/browser/ui/browser_navigator.cc
@@ -57,7 +57,7 @@
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/browser/extensions/extension_util.h"
 #include "chrome/browser/extensions/tab_helper.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_set.h"
@@ -146,7 +146,7 @@
         profile, params.url, extensions::LAUNCH_CONTAINER_WINDOW);
     if (app) {
       std::string app_name =
-          web_app::GenerateApplicationNameFromExtensionId(app->id());
+          web_app::GenerateApplicationNameFromAppId(app->id());
       return {
           new Browser(Browser::CreateParams::CreateForApp(
               app_name,
@@ -201,15 +201,15 @@
       std::string app_name;
 #if BUILDFLAG(ENABLE_EXTENSIONS)
       if (!params.extension_app_id.empty()) {
-        app_name = web_app::GenerateApplicationNameFromExtensionId(
-            params.extension_app_id);
+        app_name =
+            web_app::GenerateApplicationNameFromAppId(params.extension_app_id);
       } else if (params.browser && !params.browser->app_name().empty()) {
         app_name = params.browser->app_name();
       } else if (params.source_contents) {
         extensions::TabHelper* extensions_tab_helper =
             extensions::TabHelper::FromWebContents(params.source_contents);
         if (extensions_tab_helper && extensions_tab_helper->is_app()) {
-          app_name = web_app::GenerateApplicationNameFromExtensionId(
+          app_name = web_app::GenerateApplicationNameFromAppId(
               extensions_tab_helper->extension_app()->id());
         }
       }
diff --git a/chrome/browser/ui/browser_ui_prefs.cc b/chrome/browser/ui/browser_ui_prefs.cc
index edb6476..a2ab09ef 100644
--- a/chrome/browser/ui/browser_ui_prefs.cc
+++ b/chrome/browser/ui/browser_ui_prefs.cc
@@ -90,6 +90,7 @@
   registry->RegisterStringPref(prefs::kWebRTCIPHandlingPolicy,
                                content::kWebRTCIPHandlingDefault);
   registry->RegisterStringPref(prefs::kWebRTCUDPPortRange, std::string());
+  registry->RegisterBooleanPref(prefs::kWebRtcEventLogCollectionAllowed, false);
 
   // Dictionaries to keep track of default tasks in the file browser.
   registry->RegisterDictionaryPref(
diff --git a/chrome/browser/ui/certificate_dialogs.cc b/chrome/browser/ui/certificate_dialogs.cc
index 8903075..780867d 100644
--- a/chrome/browser/ui/certificate_dialogs.cc
+++ b/chrome/browser/ui/certificate_dialogs.cc
@@ -16,7 +16,7 @@
 #include "base/bind.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "chrome/common/net/x509_certificate_model_nss.h"
diff --git a/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
index 6c90f72..15db131 100644
--- a/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/app_menu/app_menu_controller_unittest.mm
@@ -159,8 +159,8 @@
   }
 
   void EnableSync() {
-    EXPECT_CALL(*mock_sync_service_, GetState())
-        .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+    EXPECT_CALL(*mock_sync_service_, GetTransportState())
+        .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
     EXPECT_CALL(*mock_sync_service_, GetDisableReasons())
         .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE));
     EXPECT_CALL(*mock_sync_service_, IsFirstSetupComplete())
diff --git a/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.cc b/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.cc
index 42fdfa05..68d864b 100644
--- a/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.cc
+++ b/chrome/browser/ui/cocoa/apps/quit_with_apps_controller_mac.cc
@@ -17,7 +17,7 @@
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/chrome_unscaled_resources.h"
@@ -140,7 +140,7 @@
 
       ExtensionRegistry* registry = ExtensionRegistry::Get(browser->profile());
       const extensions::Extension* extension = registry->GetExtensionById(
-          web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+          web_app::GetAppIdFromApplicationName(browser->app_name()),
           ExtensionRegistry::ENABLED);
       if (extension->is_hosted_app()) {
         hosted_apps_open = true;
diff --git a/chrome/browser/ui/cocoa/bubble_anchor_helper_views_unittest.mm b/chrome/browser/ui/cocoa/bubble_anchor_helper_views_unittest.mm
index 9abad449..8228d70 100644
--- a/chrome/browser/ui/cocoa/bubble_anchor_helper_views_unittest.mm
+++ b/chrome/browser/ui/cocoa/bubble_anchor_helper_views_unittest.mm
@@ -59,10 +59,6 @@
 // Test that KeepBubbleAnchored(..) actually keeps the bubble anchored upon a
 // resize of the parent window.
 TEST_F(BubbleAnchorHelperViewsTest, AnchoringFixed) {
-  // Use MD anchoring since the arithmetic is simpler (no arrows).
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kSecondaryUiMd);
-
   // Released when closed.
   NSRect parent_frame = NSMakeRect(100, 200, 300, 400);
   NSWindow* parent =
@@ -125,10 +121,6 @@
 // Test that KeepBubbleAnchored(..) actually keeps the bubble anchored upon
 // resizing the child window.
 TEST_F(BubbleAnchorHelperViewsTest, AnchoringChildResize) {
-  // Use MD anchoring since the arithmetic is simpler (no arrows).
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kSecondaryUiMd);
-
   NSRect parent_frame = NSMakeRect(100, 200, 300, 400);
   // Released when closed.
   NSWindow* parent =
diff --git a/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm b/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm
deleted file mode 100644
index ee057eb..0000000
--- a/chrome/browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm
+++ /dev/null
@@ -1,288 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/macros.h"
-#include "base/test/scoped_feature_list.h"
-#include "chrome/browser/ui/browser_window.h"
-#import "chrome/browser/ui/cocoa/browser_window_controller.h"
-#import "chrome/browser/ui/cocoa/extensions/browser_action_button.h"
-#import "chrome/browser/ui/cocoa/extensions/browser_actions_controller.h"
-#import "chrome/browser/ui/cocoa/extensions/toolbar_actions_bar_bubble_mac.h"
-#import "chrome/browser/ui/cocoa/test/run_loop_testing.h"
-#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h"
-#include "chrome/browser/ui/extensions/extension_message_bubble_browsertest.h"
-#include "chrome/browser/ui/extensions/settings_api_bubble_helpers.h"
-#include "chrome/test/views/scoped_macviews_browser_mode.h"
-#include "ui/base/cocoa/cocoa_base_utils.h"
-#include "ui/base/ui_base_features.h"
-#include "ui/events/test/cocoa_test_event_utils.h"
-
-namespace {
-
-// Returns the ToolbarController for the given browser.
-ToolbarController* ToolbarControllerForBrowser(Browser* browser) {
-  return [[BrowserWindowController browserWindowControllerForWindow:
-             browser->window()->GetNativeWindow()] toolbarController];
-}
-
-ToolbarActionsBarBubbleMac* GetBubbleForBrowser(Browser* browser) {
-  ToolbarController* toolbarController = ToolbarControllerForBrowser(browser);
-  BrowserActionsController* actionsController =
-      [toolbarController browserActionsController];
-  return [actionsController activeBubble];
-}
-
-void ClickInView(NSView* view) {
-  ASSERT_TRUE(view);
-  std::pair<NSEvent*, NSEvent*> events =
-      cocoa_test_event_utils::MouseClickInView(view, 1);
-  [NSApp postEvent:events.second atStart:YES];
-  [NSApp sendEvent:events.first];
-  chrome::testing::NSRunLoopRunAllPending();
-}
-
-// Checks that the |bubble| is using the |expectedReferenceView|, and is in
-// approximately the correct position.
-void CheckBubbleAndReferenceView(ToolbarActionsBarBubbleMac* bubble,
-                                 NSView* expectedReferenceView) {
-  ASSERT_TRUE(bubble);
-  ASSERT_TRUE(expectedReferenceView);
-
-  // Do a rough check that the bubble is in the right place.
-  // A window's frame (like the bubble's) is already in screen coordinates.
-  NSRect bubbleFrame = [[bubble window] frame];
-
-  // Unfortunately, it's more tedious to get the reference view's screen
-  // coordinates (since -[NSWindow convertRectToScreen is in OSX 10.7).
-  NSRect referenceFrame = [expectedReferenceView bounds];
-  referenceFrame =
-      [expectedReferenceView convertRect:referenceFrame toView:nil];
-  NSWindow* window = [expectedReferenceView window];
-  CGFloat refLowY = [expectedReferenceView isFlipped] ?
-      NSMaxY(referenceFrame) : NSMinY(referenceFrame);
-  NSPoint refLowerLeft = NSMakePoint(NSMinX(referenceFrame), refLowY);
-  NSPoint refLowerLeftInScreen =
-      ui::ConvertPointFromWindowToScreen(window, refLowerLeft);
-  NSPoint refLowerRight = NSMakePoint(NSMaxX(referenceFrame), refLowY);
-  NSPoint refLowerRightInScreen =
-      ui::ConvertPointFromWindowToScreen(window, refLowerRight);
-
-  // The bubble should be below the reference view, but not too far below.
-  EXPECT_LE(NSMaxY(bubbleFrame), refLowerLeftInScreen.y);
-  // "Too far below" is kind of ambiguous. The exact logic of where a bubble
-  // is positioned with respect to its anchor view should be tested as part of
-  // the bubble logic, but we still want to make sure we didn't accidentally
-  // place it somewhere crazy (which can happen if we draw it, and then
-  // animate or reposition the reference view).
-  const int kFudgeFactor = 50;
-  EXPECT_LE(NSMaxY(bubbleFrame), refLowerLeftInScreen.y + kFudgeFactor);
-
-  // The bubble should intersect the reference view somewhere along the x-axis.
-  EXPECT_LE(refLowerLeftInScreen.x, NSMaxX(bubbleFrame));
-  EXPECT_LE(NSMinX(bubbleFrame), refLowerRightInScreen.x);
-
-  // And, of course, the bubble should be visible.
-  EXPECT_TRUE([[bubble window] isVisible]);
-}
-
-}  // namespace
-
-class ExtensionMessageBubbleBrowserTestMac
-    : public ExtensionMessageBubbleBrowserTest {
- public:
-  ExtensionMessageBubbleBrowserTestMac() {}
-
-  // ExtensionMessageBubbleBrowserTest:
-  void SetUp() override {
-    // This file only tests Cocoa UI and can be deleted when kSecondaryUiMd is
-    // default.
-    scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd);
-    ExtensionMessageBubbleBrowserTest::SetUp();
-  }
-  void SetUpCommandLine(base::CommandLine* command_line) override;
-
- private:
-  // ExtensionMessageBubbleBrowserTest:
-  void CheckBubbleNative(Browser* browser, AnchorPosition anchor) override;
-  void CloseBubbleNative(Browser* browser) override;
-  void CheckBubbleIsNotPresentNative(Browser* browser) override;
-  void ClickLearnMoreButton(Browser* browser) override;
-  void ClickActionButton(Browser* browser) override;
-  void ClickDismissButton(Browser* browser) override;
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-
-  test::ScopedMacViewsBrowserMode cocoa_browser_mode_{false};
-
-  DISALLOW_COPY_AND_ASSIGN(ExtensionMessageBubbleBrowserTestMac);
-};
-
-void ExtensionMessageBubbleBrowserTestMac::SetUpCommandLine(
-    base::CommandLine* command_line) {
-  ExtensionMessageBubbleBrowserTest::SetUpCommandLine(command_line);
-  [ToolbarActionsBarBubbleMac setAnimationEnabledForTesting:NO];
-}
-
-void ExtensionMessageBubbleBrowserTestMac::CheckBubbleNative(
-    Browser* browser,
-    AnchorPosition anchor) {
-  ToolbarController* toolbarController = ToolbarControllerForBrowser(browser);
-  BrowserActionsController* actionsController =
-      [toolbarController browserActionsController];
-  NSView* anchorView = nil;
-  ToolbarActionsBarBubbleMac* bubble = [actionsController activeBubble];
-  switch (anchor) {
-    case ANCHOR_BROWSER_ACTION:
-      anchorView = [actionsController buttonWithIndex:0];
-      break;
-    case ANCHOR_APP_MENU:
-      anchorView = [toolbarController appMenuButton];
-      break;
-  }
-  CheckBubbleAndReferenceView(bubble, anchorView);
-}
-
-void ExtensionMessageBubbleBrowserTestMac::CloseBubbleNative(Browser* browser) {
-  BrowserActionsController* controller =
-      [ToolbarControllerForBrowser(browser) browserActionsController];
-  ToolbarActionsBarBubbleMac* bubble = [controller activeBubble];
-  ASSERT_TRUE(bubble);
-  [bubble close];
-  EXPECT_EQ(nil, [controller activeBubble]);
-}
-
-void ExtensionMessageBubbleBrowserTestMac::CheckBubbleIsNotPresentNative(
-    Browser* browser) {
-  EXPECT_EQ(
-      nil,
-      [[ToolbarControllerForBrowser(browser) browserActionsController]
-          activeBubble]);
-}
-
-void ExtensionMessageBubbleBrowserTestMac::ClickLearnMoreButton(
-    Browser* browser) {
-  ToolbarActionsBarBubbleMac* bubble = GetBubbleForBrowser(browser);
-  ClickInView([bubble link]);
-}
-
-void ExtensionMessageBubbleBrowserTestMac::ClickActionButton(Browser* browser) {
-  ToolbarActionsBarBubbleMac* bubble = GetBubbleForBrowser(browser);
-  ClickInView([bubble actionButton]);
-}
-
-void ExtensionMessageBubbleBrowserTestMac::ClickDismissButton(
-    Browser* browser) {
-  ToolbarActionsBarBubbleMac* bubble = GetBubbleForBrowser(browser);
-  ClickInView([bubble dismissButton]);
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       ExtensionBubbleAnchoredToExtensionAction) {
-  TestBubbleAnchoredToExtensionAction();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       ExtensionBubbleAnchoredToAppMenu) {
-  TestBubbleAnchoredToAppMenu();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       ExtensionBubbleAnchoredToAppMenuWithOtherAction) {
-  TestBubbleAnchoredToAppMenuWithOtherAction();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       PRE_ExtensionBubbleShowsOnStartup) {
-  PreBubbleShowsOnStartup();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       ExtensionBubbleShowsOnStartup) {
-  TestBubbleShowsOnStartup();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestUninstallDangerousExtension) {
-  TestUninstallDangerousExtension();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestDevModeBubbleIsntShownTwice) {
-  TestDevModeBubbleIsntShownTwice();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestBubbleWithMultipleWindows) {
-  TestBubbleWithMultipleWindows();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestClickingLearnMoreButton) {
-  TestClickingLearnMoreButton();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestClickingActionButton) {
-  TestClickingActionButton();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestClickingDismissButton) {
-  TestClickingDismissButton();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestControlledHomeMessageBubble) {
-  TestControlledHomeBubbleShown();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestControlledSearchMessageBubble) {
-  TestControlledSearchBubbleShown();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       PRE_TestControlledStartupMessageBubble) {
-  PreTestControlledStartupBubbleShown();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestControlledStartupMessageBubble) {
-  TestControlledStartupBubbleShown();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       PRE_TestControlledStartupNotShownOnRestart) {
-  PreTestControlledStartupNotShownOnRestart();
-}
-
-IN_PROC_BROWSER_TEST_F(ExtensionMessageBubbleBrowserTestMac,
-                       TestControlledStartupNotShownOnRestart) {
-  TestControlledStartupNotShownOnRestart();
-}
-
-// The NTP bubble is currently disabled on Mac. Enable it for testing purposes.
-class NtpBubbleBrowserTestMac : public ExtensionMessageBubbleBrowserTestMac {
- public:
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    ExtensionMessageBubbleBrowserTestMac::SetUpCommandLine(command_line);
-    extensions::SetNtpBubbleEnabledForTesting(true);
-  }
-
-  void TearDownOnMainThread() override {
-    extensions::SetNtpBubbleEnabledForTesting(false);
-    ExtensionMessageBubbleBrowserTestMac::TearDownOnMainThread();
-  }
-};
-
-IN_PROC_BROWSER_TEST_F(NtpBubbleBrowserTestMac,
-                       TestControlledNewTabPageMessageBubble) {
-  TestControlledNewTabPageBubbleShown(false);
-}
-
-// Flaky crashes on Mac 10.10. See crbug.com/851655
-IN_PROC_BROWSER_TEST_F(NtpBubbleBrowserTestMac,
-                       DISABLED_TestBubbleClosedAfterExtensionUninstall) {
-  TestBubbleClosedAfterExtensionUninstall();
-}
diff --git a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm
index 1958f248..0167848 100644
--- a/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm
+++ b/chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.mm
@@ -5,7 +5,6 @@
 #import "chrome/browser/ui/cocoa/fullscreen/fullscreen_toolbar_controller_views.h"
 
 #include "chrome/browser/ui/views/frame/browser_view.h"
-#include "ui/views/cocoa/bridged_content_view.h"
 #include "ui/views/cocoa/bridged_native_widget.h"
 #include "ui/views/widget/native_widget_mac.h"
 
diff --git a/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm b/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm
index 06d5091bb..ae7e33c0 100644
--- a/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm
+++ b/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm
@@ -26,6 +26,7 @@
 #include "content/public/test/test_utils.h"
 #include "ui/base/ui_base_features.h"
 
+// TODO(crbug.com/630357): Remove parameterized testing for this class.
 class ZoomDecorationTest : public InProcessBrowserTest,
                            public ::testing::WithParamInterface<bool> {
  protected:
@@ -34,17 +35,6 @@
         should_quit_on_zoom_(false) {
   }
 
-  // InProcessBrowserTest:
-  void SetUp() override {
-    // TODO(crbug.com/630357): Remove parameterized testing for this class when
-    // secondary-ui-md is enabled by default on all platforms.
-    if (GetParam())
-      scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd);
-    else
-      scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd);
-    InProcessBrowserTest::SetUp();
-  }
-
   void SetUpOnMainThread() override {
     zoom_subscription_ = content::HostZoomMap::GetDefaultForBrowserContext(
         browser()->profile())->AddZoomLevelChangedCallback(
diff --git a/chrome/browser/ui/cocoa/location_bar/zoom_decoration_unittest.mm b/chrome/browser/ui/cocoa/location_bar/zoom_decoration_unittest.mm
index 7c94c2e..2977838 100644
--- a/chrome/browser/ui/cocoa/location_bar/zoom_decoration_unittest.mm
+++ b/chrome/browser/ui/cocoa/location_bar/zoom_decoration_unittest.mm
@@ -13,24 +13,13 @@
 
 namespace {
 
+// TODO(crbug.com/630357): Remove parameterized testing for this class.
 class ZoomDecorationTest : public ChromeRenderViewHostTestHarness,
                            public ::testing::WithParamInterface<bool> {
  public:
   ZoomDecorationTest() {}
   ~ZoomDecorationTest() override {}
 
- protected:
-  // ChromeRenderViewHostTestHarness:
-  void SetUp() override {
-    // TODO(crbug.com/630357): Remove parameterized testing for this class when
-    // secondary-ui-md is enabled by default on all platforms.
-    if (GetParam())
-      scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd);
-    else
-      scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd);
-    ChromeRenderViewHostTestHarness::SetUp();
-  }
-
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 
diff --git a/chrome/browser/ui/cocoa/page_info/page_info_bubble_views_mac_browsertest.mm b/chrome/browser/ui/cocoa/page_info/page_info_bubble_views_mac_browsertest.mm
index 212a2ae..9fb583b 100644
--- a/chrome/browser/ui/cocoa/page_info/page_info_bubble_views_mac_browsertest.mm
+++ b/chrome/browser/ui/cocoa/page_info/page_info_bubble_views_mac_browsertest.mm
@@ -83,12 +83,6 @@
 // switches via keyboard shortcuts.
 IN_PROC_BROWSER_TEST_P(PageInfoBubbleViewsMacTest,
                        BubbleClosesOnKeyboardTabSwitch) {
-  // Always use PageInfoBubbleView for this test rather than Cocoa UI.
-  base::test::ScopedFeatureList enable_md;
-  enable_md.InitWithFeatures(
-      {features::kSecondaryUiMd, features::kShowAllDialogsWithViewsToolkit},
-      {});
-
   ui_test_utils::NavigateToURL(browser(), GURL(GetParam().url));
   // Add a second tab, but make sure the first is selected.
   AddTabAtIndex(1, GURL("https://test_url.com"),
diff --git a/chrome/browser/ui/cocoa/permission_bubble/permission_bubble_cocoa_interactive_uitest.mm b/chrome/browser/ui/cocoa/permission_bubble/permission_bubble_cocoa_interactive_uitest.mm
index 09b3bae..aaeeed7 100644
--- a/chrome/browser/ui/cocoa/permission_bubble/permission_bubble_cocoa_interactive_uitest.mm
+++ b/chrome/browser/ui/cocoa/permission_bubble/permission_bubble_cocoa_interactive_uitest.mm
@@ -30,11 +30,10 @@
 
 enum class UiMode {
   VIEWS,
-  COCOA,
 };
 
 std::string UiModeToString(const ::testing::TestParamInfo<UiMode>& info) {
-  return info.param == UiMode::VIEWS ? "Views" : "Cocoa";
+  return "Views";
 }
 
 }  // namespace
@@ -58,6 +57,7 @@
 
 }  // namespace test
 
+// TODO(crbug.com/630357): Remove parameterized testing for this class.
 class PermissionBubbleInteractiveUITest
     : public InProcessBrowserTest,
       public ::testing::WithParamInterface<UiMode> {
@@ -94,15 +94,6 @@
         [NSApp keyWindow], keycode, control, shift, alt, command);
   }
 
-  // InProcessBrowserTest:
-  void SetUp() override {
-    if (GetParam() == UiMode::VIEWS)
-      scoped_feature_list_.InitAndEnableFeature(features::kSecondaryUiMd);
-    else
-      scoped_feature_list_.InitAndDisableFeature(features::kSecondaryUiMd);
-    InProcessBrowserTest::SetUp();
-  }
-
   void SetUpOnMainThread() override {
     // Make the browser active (ensures the app can receive key events).
     EXPECT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
@@ -225,5 +216,5 @@
 
 INSTANTIATE_TEST_CASE_P(,
                         PermissionBubbleInteractiveUITest,
-                        ::testing::Values(UiMode::VIEWS, UiMode::COCOA),
+                        ::testing::Values(UiMode::VIEWS),
                         &UiModeToString);
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.h
similarity index 89%
rename from chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h
rename to chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.h
index 4c4f5e2..e8fa21c 100644
--- a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h
+++ b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.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_COCOA_TOUCHBAR_SUGGESTED_TEXT_TOUCH_BAR_CONTROLLER_H_
-#define CHROME_BROWSER_UI_COCOA_TOUCHBAR_SUGGESTED_TEXT_TOUCH_BAR_CONTROLLER_H_
+#ifndef CHROME_BROWSER_UI_COCOA_TOUCHBAR_TEXT_SUGGESTIONS_TOUCH_BAR_CONTROLLER_H_
+#define CHROME_BROWSER_UI_COCOA_TOUCHBAR_TEXT_SUGGESTIONS_TOUCH_BAR_CONTROLLER_H_
 
 #import <Cocoa/Cocoa.h>
 
@@ -23,7 +23,7 @@
 class Range;
 }  // namespace gfx
 
-@interface SuggestedTextTouchBarController
+@interface TextSuggestionsTouchBarController
     : NSObject<NSTouchBarDelegate, NSCandidateListTouchBarItemDelegate>
 
 - (instancetype)initWithWebContents:(content::WebContents*)webContents
@@ -60,7 +60,7 @@
 
 @end
 
-@interface SuggestedTextTouchBarController (ExposedForTesting)
+@interface TextSuggestionsTouchBarController (ExposedForTesting)
 
 - (void)setText:(NSString*)text;
 - (NSString*)text;
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.mm
similarity index 92%
rename from chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm
rename to chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.mm
index 7895679e..19acc5c 100644
--- a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.mm
+++ b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.mm
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h"
+#import "chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.h"
 
 #include "base/i18n/break_iterator.h"
 #include "base/strings/sys_string_conversions.h"
@@ -14,17 +14,17 @@
 
 namespace {
 // Touch bar identifier.
-NSString* const kSuggestedTextTouchBarId = @"suggested-text";
+NSString* const kTextSuggestionsTouchBarId = @"text-suggestions";
 
 // Touch bar item identifiers.
-NSString* const kSuggestedTextItemsTouchId = @"SUGGESTED-TEXT-ITEMS";
+NSString* const kTextSuggestionsItemsTouchId = @"TEXT-SUGGESTIONS-ITEMS";
 }  // namespace
 
 namespace text_observer {
 class WebContentsTextObserver : public content::WebContentsObserver {
  public:
   WebContentsTextObserver(content::WebContents* web_contents,
-                          SuggestedTextTouchBarController* owner)
+                          TextSuggestionsTouchBarController* owner)
       : WebContentsObserver(web_contents), owner_(owner) {}
 
   void UpdateWebContents(content::WebContents* web_contents) {
@@ -42,11 +42,11 @@
   }
 
  private:
-  SuggestedTextTouchBarController* owner_;  // weak
+  TextSuggestionsTouchBarController* owner_;  // weak
 };
 }  // namespace text_observer
 
-@interface SuggestedTextTouchBarController () {
+@interface TextSuggestionsTouchBarController () {
   // An observer for text selection changes.
   std::unique_ptr<text_observer::WebContentsTextObserver> observer_;
 
@@ -75,7 +75,7 @@
 }
 @end
 
-@implementation SuggestedTextTouchBarController
+@implementation TextSuggestionsTouchBarController
 
 - (BOOL)isTextfieldFocused {
   return webContents_ && webContents_->IsFocusedElementEditable();
@@ -100,16 +100,16 @@
 
   base::scoped_nsobject<NSTouchBar> touchBar([[ui::NSTouchBar() alloc] init]);
   [touchBar
-      setCustomizationIdentifier:ui::GetTouchBarId(kSuggestedTextTouchBarId)];
+      setCustomizationIdentifier:ui::GetTouchBarId(kTextSuggestionsTouchBarId)];
   [touchBar setDelegate:self];
 
-  [touchBar setDefaultItemIdentifiers:@[ kSuggestedTextItemsTouchId ]];
+  [touchBar setDefaultItemIdentifiers:@[ kTextSuggestionsItemsTouchId ]];
   return touchBar.autorelease();
 }
 
 - (NSTouchBarItem*)touchBar:(NSTouchBar*)touchBar
       makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier {
-  if (![identifier hasSuffix:kSuggestedTextItemsTouchId])
+  if (![identifier hasSuffix:kTextSuggestionsItemsTouchId])
     return nil;
 
   return [self createCandidateListItem];
@@ -118,7 +118,7 @@
 - (NSCandidateListTouchBarItem*)createCandidateListItem {
   NSCandidateListTouchBarItem* candidateListItem =
       [[NSCandidateListTouchBarItem alloc]
-          initWithIdentifier:kSuggestedTextItemsTouchId];
+          initWithIdentifier:kTextSuggestionsItemsTouchId];
 
   [candidateListItem setCandidates:suggestions_
                   forSelectedRange:selectionRange_
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_browsertest.mm b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_browsertest.mm
similarity index 86%
rename from chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_browsertest.mm
rename to chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_browsertest.mm
index e9d7c70..2ef837e 100644
--- a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_browsertest.mm
+++ b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_browsertest.mm
@@ -11,7 +11,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/ui/browser.h"
 #import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
-#import "chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h"
+#import "chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.h"
 #include "chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -46,11 +46,12 @@
 
 @end
 
-@interface MockSuggestedTextTouchBarController : SuggestedTextTouchBarController
+@interface MockTextSuggestionsTouchBarController
+    : TextSuggestionsTouchBarController
 - (NSString*)firstSuggestion;
 @end
 
-@implementation MockSuggestedTextTouchBarController
+@implementation MockTextSuggestionsTouchBarController
 
 - (void)requestSuggestions {
   [self setSuggestions:@[ [self text] ]];
@@ -65,18 +66,18 @@
 
 namespace {
 
-class SuggestedTextTouchBarControllerBrowserTest : public InProcessBrowserTest {
+class TextSuggestionsTouchBarControllerTest : public InProcessBrowserTest {
  public:
   void SetUp() override {
     InProcessBrowserTest::SetUp();
-    feature_list_.InitAndEnableFeature(features::kSuggestedTextTouchBar);
+    feature_list_.InitAndEnableFeature(features::kTextSuggestionsTouchBar);
   }
 
   void SetUpOnMainThread() override {
     web_textfield_controller_.reset(
         [[MockWebTextfieldTouchBarController alloc] init]);
     [web_textfield_controller_ resetNumInvalidations];
-    touch_bar_controller_.reset([[MockSuggestedTextTouchBarController alloc]
+    touch_bar_controller_.reset([[MockTextSuggestionsTouchBarController alloc]
         initWithWebContents:GetActiveWebContents()
                  controller:web_textfield_controller_]);
   }
@@ -98,16 +99,15 @@
 
   base::scoped_nsobject<MockWebTextfieldTouchBarController>
       web_textfield_controller_;
-  base::scoped_nsobject<MockSuggestedTextTouchBarController>
+  base::scoped_nsobject<MockTextSuggestionsTouchBarController>
       touch_bar_controller_;
   base::test::ScopedFeatureList feature_list_;
 };
 
 // Tests to check if the touch bar shows up properly.
-IN_PROC_BROWSER_TEST_F(SuggestedTextTouchBarControllerBrowserTest,
-                       TouchBarTest) {
+IN_PROC_BROWSER_TEST_F(TextSuggestionsTouchBarControllerTest, MakeTouchBar) {
   if (@available(macOS 10.12.2, *)) {
-    NSString* const kSuggestedTextTouchBarId = @"suggested-text";
+    NSString* const kTextSuggestionsTouchBarId = @"text-suggestions";
 
     // Touch bar shouldn't appear if the focused element is not a textfield.
     UnfocusTextfield();
@@ -118,13 +118,13 @@
     NSTouchBar* touch_bar = [touch_bar_controller_ makeTouchBar];
     EXPECT_TRUE(touch_bar);
     EXPECT_TRUE([[touch_bar customizationIdentifier]
-        isEqual:ui::GetTouchBarId(kSuggestedTextTouchBarId)]);
+        isEqual:ui::GetTouchBarId(kTextSuggestionsTouchBarId)]);
   }
 }
 
 // Tests that a change in text selection is handled properly.
-IN_PROC_BROWSER_TEST_F(SuggestedTextTouchBarControllerBrowserTest,
-                       UpdateTextSelectionTest) {
+IN_PROC_BROWSER_TEST_F(TextSuggestionsTouchBarControllerTest,
+                       UpdateTextSelection) {
   NSString* const kText = @"text";
   NSString* const kEmptyText = @"";
   const gfx::Range kRange = gfx::Range(0, 4);
@@ -175,8 +175,7 @@
 }
 
 // Tests that a change in WebContents is handled properly.
-IN_PROC_BROWSER_TEST_F(SuggestedTextTouchBarControllerBrowserTest,
-                       SetWebContentsTest) {
+IN_PROC_BROWSER_TEST_F(TextSuggestionsTouchBarControllerTest, SetWebContents) {
   NSString* const kText = @"text";
   const gfx::Range kRange = gfx::Range(1, 1);
 
diff --git a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_unittest.mm
similarity index 84%
rename from chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm
rename to chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_unittest.mm
index 590ae073..4b8448b 100644
--- a/chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm
+++ b/chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_unittest.mm
@@ -7,7 +7,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/metrics/histogram_tester.h"
 #import "chrome/browser/ui/cocoa/test/cocoa_test_helper.h"
-#import "chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h"
+#import "chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #import "ui/base/cocoa/touch_bar_util.h"
 #include "ui/gfx/range/range.h"
@@ -19,11 +19,11 @@
 const base::string16 kMultipleWords(base::ASCIIToUTF16("hello world"));
 const base::string16 kWhitespace(base::ASCIIToUTF16("     "));
 
-class SuggestedTextTouchBarControllerUnitTest : public CocoaTest {
+class TextSuggestionsTouchBarControllerTest : public CocoaTest {
  public:
   void SetUp() override {
     CocoaTest::SetUp();
-    controller_.reset([[SuggestedTextTouchBarController alloc] init]);
+    controller_.reset([[TextSuggestionsTouchBarController alloc] init]);
   }
 
   gfx::Range GetEditingWordRange(const base::string16& text, size_t cursor) {
@@ -32,10 +32,10 @@
     return gfx::Range(range);
   }
 
-  base::scoped_nsobject<SuggestedTextTouchBarController> controller_;
+  base::scoped_nsobject<TextSuggestionsTouchBarController> controller_;
 };
 
-TEST_F(SuggestedTextTouchBarControllerUnitTest, CollapsedCandidateListTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest, CollapsedCandidateList) {
   if (@available(macOS 10.12.2, *)) {
     base::scoped_nsobject<NSCandidateListTouchBarItem> item;
 
@@ -51,25 +51,23 @@
 
 // Tests that the editing word range is simply the cursor position if there
 // is no text.
-TEST_F(SuggestedTextTouchBarControllerUnitTest, EmptyTextEditingWordRangeTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest, EmptyTextEditingWordRange) {
   EXPECT_EQ(gfx::Range(0, 0), GetEditingWordRange(kEmptyText, 0));
 }
 
 // Tests that the editing word range contains the full word as the cursor
 // moves through a word without breaks.
-TEST_F(SuggestedTextTouchBarControllerUnitTest, WordEditingWordRangeTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest, WordEditingWordRange) {
   EXPECT_EQ(gfx::Range(0, 0), GetEditingWordRange(kWord, 0));
   EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 1));
   EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 2));
   EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 3));
   EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 4));
-  EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWord, 5));
 }
 
 // Tests that the editing word range is properly calculated as the cursor moves
 // through non-word characters.
-TEST_F(SuggestedTextTouchBarControllerUnitTest,
-       WhitespaceEditingWordRangeTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest, WhitespaceEditingWordRange) {
   EXPECT_EQ(gfx::Range(0, 5), GetEditingWordRange(kWhitespace, 0));
   EXPECT_EQ(gfx::Range(1, 5), GetEditingWordRange(kWhitespace, 1));
   EXPECT_EQ(gfx::Range(2, 5), GetEditingWordRange(kWhitespace, 2));
@@ -80,8 +78,8 @@
 
 // Tests that the editing word range changes properly as the cursor moves
 // from word to non-word characters.
-TEST_F(SuggestedTextTouchBarControllerUnitTest,
-       TrailingWhitespaceEditingWordRangeTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest,
+       TrailingWhitespaceEditingWordRange) {
   EXPECT_EQ(gfx::Range(0, 0),
             GetEditingWordRange(kWordWithTrailingWhitespace, 0));
   EXPECT_EQ(gfx::Range(0, 6),
@@ -100,8 +98,8 @@
 
 // Tests that the editing word range changes properly as the cursor moves
 // from non-word to word characters.
-TEST_F(SuggestedTextTouchBarControllerUnitTest,
-       LeadingWhitespaceEditingWordRangeTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest,
+       LeadingWhitespaceEditingWordRange) {
   EXPECT_EQ(gfx::Range(0, 1),
             GetEditingWordRange(kWordWithLeadingWhitespace, 0));
   EXPECT_EQ(gfx::Range(1, 1),
@@ -120,8 +118,7 @@
 
 // Tests that the editing word range is properly calculated as the cursor moves
 // from word to non-word and back to word characters.
-TEST_F(SuggestedTextTouchBarControllerUnitTest,
-       MultipleWordsEditingWordRangeTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest, MultipleWordsEditingWordRange) {
   EXPECT_EQ(gfx::Range(0, 0), GetEditingWordRange(kMultipleWords, 0));
   EXPECT_EQ(gfx::Range(0, 6), GetEditingWordRange(kMultipleWords, 1));
   EXPECT_EQ(gfx::Range(0, 6), GetEditingWordRange(kMultipleWords, 2));
@@ -136,7 +133,7 @@
   EXPECT_EQ(gfx::Range(6, 11), GetEditingWordRange(kMultipleWords, 11));
 }
 
-TEST_F(SuggestedTextTouchBarControllerUnitTest, TouchBarMetricTest) {
+TEST_F(TextSuggestionsTouchBarControllerTest, TouchBarMetrics) {
   if (@available(macOS 10.12.2, *)) {
     base::HistogramTester histogram_tester;
     [controller_ candidateListTouchBarItem:nil endSelectingCandidateAtIndex:1];
diff --git a/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h b/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h
index dbca4d7e..02bbf329 100644
--- a/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h
+++ b/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.h
@@ -14,7 +14,7 @@
 
 @class BrowserWindowTouchBarController;
 @class CreditCardAutofillTouchBarController;
-@class SuggestedTextTouchBarController;
+@class TextSuggestionsTouchBarController;
 @class TabContentsController;
 
 namespace autofill {
@@ -31,8 +31,8 @@
   BrowserWindowTouchBarController* controller_;  // weak.
   base::scoped_nsobject<CreditCardAutofillTouchBarController>
       autofillTouchBarController_;
-  base::scoped_nsobject<SuggestedTextTouchBarController>
-      suggestedTextTouchBarController_;
+  base::scoped_nsobject<TextSuggestionsTouchBarController>
+      textSuggestionsTouchBarController_;
 }
 
 + (WebTextfieldTouchBarController*)controllerForWindow:(NSWindow*)window;
diff --git a/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.mm b/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.mm
index f51d0af6..5b2b8c6b 100644
--- a/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.mm
+++ b/chrome/browser/ui/cocoa/touchbar/web_textfield_touch_bar_controller.mm
@@ -12,7 +12,7 @@
 #import "chrome/browser/ui/cocoa/tab_contents/tab_contents_controller.h"
 #import "chrome/browser/ui/cocoa/touchbar/browser_window_touch_bar_controller.h"
 #import "chrome/browser/ui/cocoa/touchbar/credit_card_autofill_touch_bar_controller.h"
-#import "chrome/browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller.h"
+#import "chrome/browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller.h"
 #include "chrome/browser/ui/views/frame/browser_frame_mac.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/common/chrome_features.h"
@@ -44,9 +44,9 @@
   if ((self = [super init])) {
     controller_ = controller;
 
-    if (base::FeatureList::IsEnabled(features::kSuggestedTextTouchBar)) {
-      suggestedTextTouchBarController_.reset(
-          [[SuggestedTextTouchBarController alloc]
+    if (base::FeatureList::IsEnabled(features::kTextSuggestionsTouchBar)) {
+      textSuggestionsTouchBarController_.reset(
+          [[TextSuggestionsTouchBarController alloc]
               initWithWebContents:[controller_ webContents]
                        controller:self]);
     }
@@ -74,7 +74,7 @@
 }
 
 - (void)updateWebContents:(content::WebContents*)contents {
-  [suggestedTextTouchBarController_ setWebContents:contents];
+  [textSuggestionsTouchBarController_ setWebContents:contents];
 }
 
 - (void)invalidateTouchBar {
@@ -85,8 +85,8 @@
   if (autofillTouchBarController_)
     return [autofillTouchBarController_ makeTouchBar];
 
-  if (suggestedTextTouchBarController_)
-    return [suggestedTextTouchBarController_ makeTouchBar];
+  if (textSuggestionsTouchBarController_)
+    return [textSuggestionsTouchBarController_ makeTouchBar];
 
   return nil;
 }
diff --git a/chrome/browser/ui/extensions/application_launch.cc b/chrome/browser/ui/extensions/application_launch.cc
index a52f4c1..1164820e 100644
--- a/chrome/browser/ui/extensions/application_launch.cc
+++ b/chrome/browser/ui/extensions/application_launch.cc
@@ -32,7 +32,6 @@
 #include "chrome/browser/ui/extensions/hosted_app_browser_controller.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/browser/web_contents.h"
@@ -345,7 +344,7 @@
   if (!params.override_app_name.empty())
     app_name = params.override_app_name;
   else if (extension)
-    app_name = web_app::GenerateApplicationNameFromExtensionId(extension->id());
+    app_name = web_app::GenerateApplicationNameFromAppId(extension->id());
   else
     app_name = web_app::GenerateApplicationNameFromURL(url);
 
@@ -457,7 +456,7 @@
   DCHECK(!profile->IsOffTheRecord());
 
   Browser::CreateParams browser_params(Browser::CreateParams::CreateForApp(
-      web_app::GenerateApplicationNameFromExtensionId(extension->id()),
+      web_app::GenerateApplicationNameFromAppId(extension->id()),
       true /* trusted_source */, gfx::Rect(), profile,
       true /* user_gesture */));
   Browser* target_browser = new Browser(browser_params);
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
index c34c9ca..ad6d623 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/location_bar/location_bar.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/extensions/api/url_handlers/url_handlers_parser.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
@@ -143,8 +143,7 @@
 HostedAppBrowserController::HostedAppBrowserController(Browser* browser)
     : SiteEngagementObserver(SiteEngagementService::Get(browser->profile())),
       browser_(browser),
-      extension_id_(
-          web_app::GetExtensionIdFromApplicationName(browser->app_name())),
+      extension_id_(web_app::GetAppIdFromApplicationName(browser->app_name())),
       // If a bookmark app has a URL handler, then it is a PWA.
       // TODO(https://crbug.com/774918): Replace once there is a more explicit
       // indicator of a Bookmark App for an installable website.
@@ -233,8 +232,14 @@
   ExtensionRegistry* registry = ExtensionRegistry::Get(browser_->profile());
   const Extension* extension =
       registry->GetExtensionById(extension_id_, ExtensionRegistry::EVERYTHING);
-  if (extension)
-    return AppThemeColorInfo::GetThemeColor(extension);
+  if (extension) {
+    const base::Optional<SkColor> color =
+        AppThemeColorInfo::GetThemeColor(extension);
+    if (color) {
+      // The frame/tabstrip code expects an opaque color.
+      return SkColorSetA(*color, SK_AlphaOPAQUE);
+    }
+  }
   return base::nullopt;
 }
 
diff --git a/chrome/browser/ui/extensions/hosted_app_browsertest.cc b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
index 3e120b6..c7fd49e 100644
--- a/chrome/browser/ui/extensions/hosted_app_browsertest.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browsertest.cc
@@ -37,7 +37,7 @@
 #include "chrome/browser/ui/page_info/page_info_dialog.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/toolbar/app_menu_model.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/common/chrome_switches.h"
 #include "chrome/common/web_application_info.h"
@@ -854,10 +854,9 @@
     const extensions::Extension* app = InstallBookmarkApp(web_app_info);
     Browser* app_browser = LaunchAppBrowser(app);
 
-    EXPECT_EQ(
-        web_app::GetExtensionIdFromApplicationName(app_browser->app_name()),
-        app->id());
-    EXPECT_EQ(web_app_info.theme_color,
+    EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser->app_name()),
+              app->id());
+    EXPECT_EQ(SkColorSetA(*web_app_info.theme_color, SK_AlphaOPAQUE),
               app_browser->hosted_app_controller()->GetThemeColor().value());
   }
   {
@@ -868,9 +867,8 @@
     const extensions::Extension* app = InstallBookmarkApp(web_app_info);
     Browser* app_browser = LaunchAppBrowser(app);
 
-    EXPECT_EQ(
-        web_app::GetExtensionIdFromApplicationName(app_browser->app_name()),
-        app->id());
+    EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser->app_name()),
+              app->id());
     EXPECT_FALSE(
         app_browser->hosted_app_controller()->GetThemeColor().has_value());
   }
@@ -1277,7 +1275,7 @@
   NavigateToURLAndWait(app_browser, GURL(kExampleURL));
 
   // Test shortcut launch.
-  EXPECT_EQ(web_app::GetExtensionIdFromApplicationName(app_browser->app_name()),
+  EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser->app_name()),
             app->id());
 
   histograms.ExpectUniqueSample(
@@ -1320,7 +1318,7 @@
   const extensions::Extension* app = InstallBookmarkApp(web_app_info);
   Browser* app_browser = LaunchAppBrowser(app);
 
-  EXPECT_EQ(web_app::GetExtensionIdFromApplicationName(app_browser->app_name()),
+  EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser->app_name()),
             app->id());
 
   histograms.ExpectTotalCount(extensions::kPwaWindowEngagementTypeHistogram, 0);
@@ -1353,15 +1351,12 @@
   Browser* app_browser2 = LaunchAppBrowser(app1);
   Browser* app_browser3 = LaunchAppBrowser(app2);
 
-  EXPECT_EQ(
-      web_app::GetExtensionIdFromApplicationName(app_browser1->app_name()),
-      app1->id());
-  EXPECT_EQ(
-      web_app::GetExtensionIdFromApplicationName(app_browser2->app_name()),
-      app1->id());
-  EXPECT_EQ(
-      web_app::GetExtensionIdFromApplicationName(app_browser3->app_name()),
-      app2->id());
+  EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser1->app_name()),
+            app1->id());
+  EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser2->app_name()),
+            app1->id());
+  EXPECT_EQ(web_app::GetAppIdFromApplicationName(app_browser3->app_name()),
+            app2->id());
 
   histograms.ExpectUniqueSample(
       extensions::kPwaWindowEngagementTypeHistogram,
diff --git a/chrome/browser/ui/hung_renderer/hung_renderer_core.cc b/chrome/browser/ui/hung_renderer/hung_renderer_core.cc
index 9f721476..bc2ff477 100644
--- a/chrome/browser/ui/hung_renderer/hung_renderer_core.cc
+++ b/chrome/browser/ui/hung_renderer/hung_renderer_core.cc
@@ -45,7 +45,11 @@
     if (frame->GetProcess() == hung_process)
       return frame->GetLastCommittedURL();
   }
-  NOTREACHED();
+
+  // If a frame is attempting to commit a navigation into a hung renderer
+  // process, then its |frame->GetProcess()| will still return the process
+  // hosting the previously committed navigation.  In such case, the loop above
+  // might not find any matching frame.
   return GURL();
 }
 
@@ -63,9 +67,15 @@
   std::copy_if(AllTabContentses().begin(), AllTabContentses().end(),
                std::back_inserter(result), is_hung);
 
-  // Move |hung_web_contents| to the front.
+  // Move |hung_web_contents| to the front.  It might be missing from the
+  // initial |results| when it hasn't yet committed a navigation into the hung
+  // process.
   auto first = std::find(result.begin(), result.end(), hung_web_contents);
-  std::rotate(result.begin(), first, std::next(first));
+  if (first != result.end())
+    std::rotate(result.begin(), first, std::next(first));
+  else
+    result.insert(result.begin(), hung_web_contents);
+
   return result;
 }
 
@@ -87,6 +97,8 @@
     return page_title;
 
   GURL hung_url = GetURLOfAnyHungFrame(affected_web_contents, hung_process);
+  if (!hung_url.is_valid() || !hung_url.has_host())
+    return page_title;
 
   // N.B. using just the host here is OK since this is a notification and the
   // user doesn't need to make a security critical decision about the page in
diff --git a/chrome/browser/ui/libgtkui/app_indicator_icon.cc b/chrome/browser/ui/libgtkui/app_indicator_icon.cc
index 0bb324bd..762a55174 100644
--- a/chrome/browser/ui/libgtkui/app_indicator_icon.cc
+++ b/chrome/browser/ui/libgtkui/app_indicator_icon.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/ui/libgtkui/app_indicator_icon_menu.h"
 #include "content/public/browser/browser_thread.h"
 #include "third_party/skia/include/core/SkBitmap.h"
diff --git a/chrome/browser/ui/libgtkui/gtk_ui.cc b/chrome/browser/ui/libgtkui/gtk_ui.cc
index 2e95ea2..3ce27a594 100644
--- a/chrome/browser/ui/libgtkui/gtk_ui.cc
+++ b/chrome/browser/ui/libgtkui/gtk_ui.cc
@@ -1067,6 +1067,11 @@
   colors_[ThemeProperties::COLOR_TOOLBAR] = tab_color;
   colors_[ThemeProperties::COLOR_CONTROL_BACKGROUND] = tab_color;
 
+  colors_[ThemeProperties::COLOR_BACKGROUND_TAB] =
+      color_utils::HSLShift(tab_color, kDefaultTintBackgroundTab);
+  colors_[ThemeProperties::COLOR_BACKGROUND_TAB_INCOGNITO] =
+      color_utils::HSLShift(tab_color, kDefaultTintBackgroundTabIncognito);
+
   colors_[ThemeProperties::COLOR_NTP_LINK] = native_theme_->GetSystemColor(
       ui::NativeTheme::kColorId_TextfieldSelectionBackgroundFocused);
 
diff --git a/chrome/browser/ui/libgtkui/gtk_util.cc b/chrome/browser/ui/libgtkui/gtk_util.cc
index 96f8c0e..39bf49c 100644
--- a/chrome/browser/ui/libgtkui/gtk_util.cc
+++ b/chrome/browser/ui/libgtkui/gtk_util.cc
@@ -60,11 +60,13 @@
 
 namespace libgtkui {
 
-// TODO(erg): ThemeService has a whole interface just for reading default
-// constants. Figure out what to do with that more long term; for now, just
-// copy the constants themselves here.
+// TODO(thomasanderson): ThemeService has a whole interface just for reading
+// default constants. Figure out what to do with that more long term; for now,
+// just copy the constants themselves here.
 const color_utils::HSL kDefaultTintFrameIncognito = {-1, 0.2f, 0.35f};
 const color_utils::HSL kDefaultTintFrameIncognitoInactive = {-1, 0.3f, 0.6f};
+const color_utils::HSL kDefaultTintBackgroundTab = {-1, -1, 0.42975};
+const color_utils::HSL kDefaultTintBackgroundTabIncognito = {-1, -1, 0.34375};
 
 // Theme colors returned by GetSystemColor().
 const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128);
diff --git a/chrome/browser/ui/libgtkui/gtk_util.h b/chrome/browser/ui/libgtkui/gtk_util.h
index 665ec57..d9f24507 100644
--- a/chrome/browser/ui/libgtkui/gtk_util.h
+++ b/chrome/browser/ui/libgtkui/gtk_util.h
@@ -35,6 +35,10 @@
 extern const color_utils::HSL kDefaultTintFrameIncognito;
 extern const color_utils::HSL kDefaultTintFrameIncognitoInactive;
 
+// Default background tab tints
+extern const color_utils::HSL kDefaultTintBackgroundTab;
+extern const color_utils::HSL kDefaultTintBackgroundTabIncognito;
+
 extern const SkColor kInvalidColorIdColor;
 extern const SkColor kURLTextColor;
 
diff --git a/chrome/browser/ui/libgtkui/print_dialog_gtk.cc b/chrome/browser/ui/libgtkui/print_dialog_gtk.cc
index 89b1492d..e95664c 100644
--- a/chrome/browser/ui/libgtkui/print_dialog_gtk.cc
+++ b/chrome/browser/ui/libgtkui/print_dialog_gtk.cc
@@ -19,7 +19,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/ui/libgtkui/gtk_util.h"
 #include "chrome/browser/ui/libgtkui/printing_gtk_util.h"
diff --git a/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk_unittest.cc b/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk_unittest.cc
index 59e0ba82..ddd01834 100644
--- a/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk_unittest.cc
+++ b/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk_unittest.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "chrome/browser/ui/chrome_select_file_policy.h"
 #include "chrome/browser/ui/libgtkui/gtk_ui.h"
 #include "chrome/test/base/scoped_testing_local_state.h"
diff --git a/chrome/browser/ui/libgtkui/select_file_dialog_impl_kde.cc b/chrome/browser/ui/libgtkui/select_file_dialog_impl_kde.cc
index ffb0d2a..a4c1d4d 100644
--- a/chrome/browser/ui/libgtkui/select_file_dialog_impl_kde.cc
+++ b/chrome/browser/ui/libgtkui/select_file_dialog_impl_kde.cc
@@ -21,8 +21,8 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/ui/libgtkui/select_file_dialog_impl.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/ui/media_router/media_router_file_dialog.cc b/chrome/browser/ui/media_router/media_router_file_dialog.cc
index 33d13a02..3a3f11a 100644
--- a/chrome/browser/ui/media_router/media_router_file_dialog.cc
+++ b/chrome/browser/ui/media_router/media_router_file_dialog.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/task/cancelable_task_tracker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/media/router/media_router_metrics.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
diff --git a/chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc b/chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc
index 6ad3449..0ff2006 100644
--- a/chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc
+++ b/chrome/browser/ui/media_router/media_router_file_dialog_unittest.cc
@@ -8,7 +8,7 @@
 
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/common/media_router/issue.h"
 #include "chrome/grit/generated_resources.h"
diff --git a/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc b/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc
index 3662c57..52bd8f6 100644
--- a/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc
+++ b/chrome/browser/ui/media_router/presentation_receiver_window_controller_browsertest.cc
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/elapsed_timer.h"
 #include "chrome/browser/media/router/presentation/local_presentation_manager.h"
diff --git a/chrome/browser/ui/omnibox/omnibox_theme.cc b/chrome/browser/ui/omnibox/omnibox_theme.cc
index 536b0a4f..92ee7304 100644
--- a/chrome/browser/ui/omnibox/omnibox_theme.cc
+++ b/chrome/browser/ui/omnibox/omnibox_theme.cc
@@ -249,8 +249,12 @@
       // The spec calls for transparent black (or white) overlays for hover (8%)
       // and select (6%), which can overlap (for 14%). Pre-blend these with the
       // background for the best text AA result.
+      // High contrast mode needs a darker base - Grey 800 with 14% white
+      // overlaid on it (see below) is hard to produce good contrast ratios
+      // against with colors other than white.
       return color_utils::BlendTowardOppositeLuma(
-          dark ? gfx::kGoogleGrey800 : SK_ColorWHITE,
+          dark ? (high_contrast ? gfx::kGoogleGrey900 : gfx::kGoogleGrey800)
+               : SK_ColorWHITE,
           gfx::ToRoundedInt(GetOmniboxStateAlpha(state) * 0xff));
     case OmniboxPart::LOCATION_BAR_TEXT_DEFAULT:
     case OmniboxPart::RESULTS_TEXT_DEFAULT:
@@ -270,6 +274,8 @@
     case OmniboxPart::RESULTS_TEXT_POSITIVE:
       return dark ? gfx::kGoogleGreenDark600 : gfx::kGoogleGreen600;
     case OmniboxPart::RESULTS_TEXT_URL:
+      if (high_contrast)
+        return dark ? gfx::kGoogleBlue300 : gfx::kGoogleBlue700;
       return dark ? gfx::kGoogleBlueDark600 : gfx::kGoogleBlue600;
 
     case OmniboxPart::LOCATION_BAR_BUBBLE_OUTLINE:
diff --git a/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc b/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
index e57ff7eb..804f1ef 100644
--- a/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_bubble_model_unittest.cc
@@ -83,7 +83,9 @@
 
   // FakeSyncService:
   int GetDisableReasons() const override { return DISABLE_REASON_NONE; }
-  State GetState() const override { return State::ACTIVE; }
+  TransportState GetTransportState() const override {
+    return TransportState::ACTIVE;
+  }
   bool IsFirstSetupComplete() const override { return true; }
   syncer::ModelTypeSet GetActiveDataTypes() const override {
     switch (synced_types_) {
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.cc b/chrome/browser/ui/search/ntp_user_data_logger.cc
index 99fb090..80205108 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger.cc
+++ b/chrome/browser/ui/search/ntp_user_data_logger.cc
@@ -10,8 +10,11 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "chrome/browser/after_startup_task_utils.h"
-#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/ntp_features.h"
 #include "chrome/browser/search/search.h"
+#include "chrome/browser/themes/theme_service.h"
+#include "chrome/browser/themes/theme_service_factory.h"
+#include "chrome/browser/ui/search/ntp_user_data_types.h"
 #include "chrome/common/url_constants.h"
 #include "components/ntp_tiles/metrics.h"
 #include "content/public/browser/navigation_details.h"
@@ -82,6 +85,125 @@
   VOICE_ERROR_MAX
 };
 
+// Logs BackgroundCustomization availability on the NTP,
+void LogBackgroundCustomizationAvailability(
+    BackgroundCustomization availability) {
+  UMA_HISTOGRAM_ENUMERATION("NewTabPage.CustomizationAvailability.Backgrounds",
+                            availability);
+}
+
+// Logs ShortcutCustomization availability on the NTP,
+void LogShortcutCustomizationAvailability(ShortcutCustomization availability) {
+  UMA_HISTOGRAM_ENUMERATION("NewTabPage.CustomizationAvailability.Shortcuts",
+                            availability);
+}
+
+// Converts |NTPLoggingEventType| to a |CustomizedFeature|.
+CustomizedFeature LoggingEventToCustomizedFeature(NTPLoggingEventType event) {
+  switch (event) {
+    case NTP_BACKGROUND_CUSTOMIZED:
+      return CustomizedFeature::CUSTOMIZED_FEATURE_BACKGROUND;
+    case NTP_SHORTCUT_CUSTOMIZED:
+      return CustomizedFeature::CUSTOMIZED_FEATURE_SHORTCUT;
+    default:
+      break;
+  }
+
+  NOTREACHED();
+  return CustomizedFeature::CUSTOMIZED_FEATURE_BACKGROUND;
+}
+
+// Converts |NTPLoggingEventType| to a |CustomizeAction|.
+CustomizeAction LoggingEventToCustomizeAction(NTPLoggingEventType event) {
+  switch (event) {
+    case NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_CHROME_BACKGROUNDS;
+    case NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_LOCAL_IMAGE;
+    case NTP_CUSTOMIZE_RESTORE_BACKGROUND_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_RESTORE_BACKGROUND;
+    case NTP_CUSTOMIZE_ATTRIBUTION_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_ATTRIBUTION;
+    case NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_ADD_SHORTCUT;
+    case NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_EDIT_SHORTCUT;
+    case NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED:
+      return CustomizeAction::CUSTOMIZE_ACTION_RESTORE_SHORTCUT;
+    default:
+      break;
+  }
+
+  NOTREACHED();
+  return CustomizeAction::CUSTOMIZE_ACTION_CHROME_BACKGROUNDS;
+}
+
+// Converts |NTPLoggingEventType| to a |CustomizeChromeBackgroundAction|.
+CustomizeChromeBackgroundAction LoggingEventToCustomizeChromeBackgroundAction(
+    NTPLoggingEventType event) {
+  switch (event) {
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION:
+      return CustomizeChromeBackgroundAction::
+          CUSTOMIZE_CHROME_BACKGROUND_ACTION_SELECT_COLLECTION;
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE:
+      return CustomizeChromeBackgroundAction::
+          CUSTOMIZE_CHROME_BACKGROUND_ACTION_SELECT_IMAGE;
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL:
+      return CustomizeChromeBackgroundAction::
+          CUSTOMIZE_CHROME_BACKGROUND_ACTION_CANCEL;
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_DONE:
+      return CustomizeChromeBackgroundAction::
+          CUSTOMIZE_CHROME_BACKGROUND_ACTION_DONE;
+    default:
+      break;
+  }
+
+  NOTREACHED();
+  return CustomizeChromeBackgroundAction::
+      CUSTOMIZE_CHROME_BACKGROUND_ACTION_SELECT_COLLECTION;
+}
+
+// Converts |NTPLoggingEventType| to a |CustomizeLocalImageBackgroundAction|.
+CustomizeLocalImageBackgroundAction
+LoggingEventToCustomizeLocalImageBackgroundAction(NTPLoggingEventType event) {
+  switch (event) {
+    case NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL:
+      return CustomizeLocalImageBackgroundAction::
+          CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_CANCEL;
+    case NTP_CUSTOMIZE_LOCAL_IMAGE_DONE:
+      return CustomizeLocalImageBackgroundAction::
+          CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_DONE;
+    default:
+      break;
+  }
+
+  NOTREACHED();
+  return CustomizeLocalImageBackgroundAction::
+      CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_CANCEL;
+}
+
+// Converts |NTPLoggingEventType| to a |CustomizeShortcutAction|.
+CustomizeShortcutAction LoggingEventToCustomizeShortcutAction(
+    NTPLoggingEventType event) {
+  switch (event) {
+    case NTP_CUSTOMIZE_SHORTCUT_REMOVE:
+      return CustomizeShortcutAction::CUSTOMIZE_SHORTCUT_ACTION_REMOVE;
+    case NTP_CUSTOMIZE_SHORTCUT_CANCEL:
+      return CustomizeShortcutAction::CUSTOMIZE_SHORTCUT_ACTION_CANCEL;
+    case NTP_CUSTOMIZE_SHORTCUT_DONE:
+      return CustomizeShortcutAction::CUSTOMIZE_SHORTCUT_ACTION_DONE;
+    case NTP_CUSTOMIZE_SHORTCUT_UNDO:
+      return CustomizeShortcutAction::CUSTOMIZE_SHORTCUT_ACTION_UNDO;
+    case NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL:
+      return CustomizeShortcutAction::CUSTOMIZE_SHORTCUT_ACTION_RESTORE_ALL;
+    default:
+      break;
+  }
+
+  NOTREACHED();
+  return CustomizeShortcutAction::CUSTOMIZE_SHORTCUT_ACTION_REMOVE;
+}
+
 // Converts |NTPLoggingEventType| to a |VoiceError|, if the value
 // is an error value. Otherwise, |VOICE_ERROR_MAX| is returned.
 VoiceError LoggingEventToVoiceError(NTPLoggingEventType event) {
@@ -193,6 +315,7 @@
     logger->ntp_url_ = entry->GetURL();
   }
 
+  logger->profile_ = Profile::FromBrowserContext(content->GetBrowserContext());
   return logger;
 }
 
@@ -252,6 +375,43 @@
     case NTP_ONE_GOOGLE_BAR_SHOWN:
       UMA_HISTOGRAM_LOAD_TIME("NewTabPage.OneGoogleBar.ShownTime", time);
       break;
+    case NTP_BACKGROUND_CUSTOMIZED:
+    case NTP_SHORTCUT_CUSTOMIZED:
+      UMA_HISTOGRAM_ENUMERATION("NewTabPage.Customized",
+                                LoggingEventToCustomizedFeature(event));
+      break;
+    case NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED:
+    case NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED:
+    case NTP_CUSTOMIZE_RESTORE_BACKGROUND_CLICKED:
+    case NTP_CUSTOMIZE_ATTRIBUTION_CLICKED:
+    case NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED:
+    case NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED:
+    case NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED:
+      UMA_HISTOGRAM_ENUMERATION("NewTabPage.CustomizeAction",
+                                LoggingEventToCustomizeAction(event));
+      break;
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION:
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE:
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL:
+    case NTP_CUSTOMIZE_CHROME_BACKGROUND_DONE:
+      UMA_HISTOGRAM_ENUMERATION(
+          "NewTabPage.CustomizeChromeBackgroundAction",
+          LoggingEventToCustomizeChromeBackgroundAction(event));
+      break;
+    case NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL:
+    case NTP_CUSTOMIZE_LOCAL_IMAGE_DONE:
+      UMA_HISTOGRAM_ENUMERATION(
+          "NewTabPage.CustomizeLocalImageBackgroundAction",
+          LoggingEventToCustomizeLocalImageBackgroundAction(event));
+      break;
+    case NTP_CUSTOMIZE_SHORTCUT_REMOVE:
+    case NTP_CUSTOMIZE_SHORTCUT_CANCEL:
+    case NTP_CUSTOMIZE_SHORTCUT_DONE:
+    case NTP_CUSTOMIZE_SHORTCUT_UNDO:
+    case NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL:
+      UMA_HISTOGRAM_ENUMERATION("NewTabPage.CustomizeShortcutAction",
+                                LoggingEventToCustomizeShortcutAction(event));
+      break;
   }
 }
 
@@ -300,9 +460,12 @@
 }
 
 bool NTPUserDataLogger::DefaultSearchProviderIsGoogle() const {
-  Profile* profile =
-      Profile::FromBrowserContext(web_contents()->GetBrowserContext());
-  return search::DefaultSearchProviderIsGoogle(profile);
+  return search::DefaultSearchProviderIsGoogle(profile_);
+}
+
+bool NTPUserDataLogger::ThemeIsConfigured() const {
+  ThemeService* theme_service = ThemeServiceFactory::GetForProfile(profile_);
+  return !theme_service->GetThemeID().empty();
 }
 
 void NTPUserDataLogger::EmitNtpStatistics(base::TimeDelta load_time) {
@@ -350,6 +513,7 @@
   // since the page load started. That's unlikely enough to not warrant special
   // handling.
   bool is_google = DefaultSearchProviderIsGoogle();
+  bool is_theme_configured = ThemeIsConfigured();
 
   // Split between Web and Local.
   if (ntp_url_.SchemeIsHTTPOrHTTPS()) {
@@ -385,6 +549,39 @@
     UMA_HISTOGRAM_LOAD_TIME("NewTabPage.LoadTime.NewTab", load_time);
   }
 
+  if (features::IsCustomBackgroundsEnabled()) {
+    if (!is_google) {
+      // TODO(crbug.com/869931): This is only emitted upon search engine change.
+      LogBackgroundCustomizationAvailability(
+          BackgroundCustomization::
+              BACKGROUND_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER);
+    } else if (is_theme_configured) {
+      LogBackgroundCustomizationAvailability(
+          BackgroundCustomization::BACKGROUND_CUSTOMIZATION_UNAVAILABLE_THEME);
+    } else {
+      LogBackgroundCustomizationAvailability(
+          BackgroundCustomization::BACKGROUND_CUSTOMIZATION_AVAILABLE);
+    }
+  } else {
+    LogBackgroundCustomizationAvailability(
+        BackgroundCustomization::BACKGROUND_CUSTOMIZATION_UNAVAILABLE_FEATURE);
+  }
+
+  if (features::IsCustomLinksEnabled()) {
+    if (!is_google) {
+      // TODO(crbug.com/869931): This is only emitted upon search engine change.
+      LogShortcutCustomizationAvailability(
+          ShortcutCustomization::
+              SHORTCUT_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER);
+    } else {
+      LogShortcutCustomizationAvailability(
+          ShortcutCustomization::SHORTCUT_CUSTOMIZATION_AVAILABLE);
+    }
+  } else {
+    LogShortcutCustomizationAvailability(
+        ShortcutCustomization::SHORTCUT_CUSTOMIZATION_UNAVAILABLE_FEATURE);
+  }
+
   has_emitted_ = true;
   during_startup_ = false;
 }
diff --git a/chrome/browser/ui/search/ntp_user_data_logger.h b/chrome/browser/ui/search/ntp_user_data_logger.h
index 53926838..305e8b5 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger.h
+++ b/chrome/browser/ui/search/ntp_user_data_logger.h
@@ -14,6 +14,7 @@
 #include "base/optional.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/common/search/ntp_logging_events.h"
 #include "components/ntp_tiles/ntp_tile_impression.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -78,6 +79,9 @@
   // for testing.
   virtual bool DefaultSearchProviderIsGoogle() const;
 
+  // Returns whether a theme is configured. Virtual for testing.
+  virtual bool ThemeIsConfigured() const;
+
   // Logs a number of statistics regarding the NTP. Called when an NTP tab is
   // about to be deactivated (be it by switching tabs, losing focus or closing
   // the tab/shutting down Chrome), or when the user navigates to a URL.
@@ -113,6 +117,9 @@
   // The URL of this New Tab Page - varies based on NTP version.
   GURL ntp_url_;
 
+  // The profile in which this New Tab Page was loaded.
+  Profile* profile_;
+
   DISALLOW_COPY_AND_ASSIGN(NTPUserDataLogger);
 };
 
diff --git a/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc b/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
index 0600100ec..3a22ec71 100644
--- a/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
+++ b/chrome/browser/ui/search/ntp_user_data_logger_unittest.cc
@@ -10,7 +10,10 @@
 
 #include "base/metrics/histogram.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
+#include "chrome/browser/search/ntp_features.h"
+#include "chrome/browser/ui/search/ntp_user_data_types.h"
 #include "chrome/common/search/ntp_logging_events.h"
 #include "chrome/common/url_constants.h"
 #include "components/favicon_base/favicon_types.h"
@@ -62,7 +65,28 @@
 
   bool DefaultSearchProviderIsGoogle() const override { return is_google_; }
 
+  bool ThemeIsConfigured() const override { return is_theme_configured_; }
+
   bool is_google_ = true;
+  bool is_theme_configured_ = false;
+};
+
+class NTPUserDataLoggerTest : public testing::Test {
+ public:
+  NTPUserDataLoggerTest() = default;
+  ~NTPUserDataLoggerTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/{features::kNtpBackgrounds},
+        /*disabled_features=*/{});
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(NTPUserDataLoggerTest);
 };
 
 MATCHER_P3(IsBucketBetween, lower_bound, upper_bound, count, "") {
@@ -71,7 +95,7 @@
 
 }  // namespace
 
-TEST(NTPUserDataLoggerTest, ShouldRecordNumberOfTiles) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordNumberOfTiles) {
   base::HistogramTester histogram_tester;
 
   // Ensure non-zero statistics.
@@ -103,7 +127,7 @@
               ElementsAre(Bucket(0, 1), Bucket(8, 1)));
 }
 
-TEST(NTPUserDataLoggerTest, ShouldNotRecordImpressionsBeforeAllTilesLoaded) {
+TEST_F(NTPUserDataLoggerTest, ShouldNotRecordImpressionsBeforeAllTilesLoaded) {
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
 
   base::HistogramTester histogram_tester;
@@ -139,7 +163,7 @@
               IsEmpty());
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordImpressions) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordImpressions) {
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
 
   base::HistogramTester histogram_tester;
@@ -223,7 +247,7 @@
       ElementsAre(Bucket(kMetaTagTitleSource, 1)));
 }
 
-TEST(NTPUserDataLoggerTest, ShouldNotRecordRepeatedImpressions) {
+TEST_F(NTPUserDataLoggerTest, ShouldNotRecordRepeatedImpressions) {
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
 
   base::HistogramTester histogram_tester;
@@ -286,7 +310,7 @@
               IsEmpty());
 }
 
-TEST(NTPUserDataLoggerTest, ShouldNotRecordImpressionsForBinsBeyondEight) {
+TEST_F(NTPUserDataLoggerTest, ShouldNotRecordImpressionsForBinsBeyondEight) {
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
 
   base::HistogramTester histogram_tester;
@@ -334,7 +358,7 @@
               IsEmpty());
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordImpressionsAgainAfterNavigating) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordImpressionsAgainAfterNavigating) {
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
 
   // Record some previous tile impressions.
@@ -412,7 +436,7 @@
       IsEmpty());
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordNavigations) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordNavigations) {
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
 
   {
@@ -587,7 +611,7 @@
   }
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordLoadTime) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTime) {
   base::HistogramTester histogram_tester;
 
   TestNTPUserDataLogger logger(GURL("chrome://newtab/"));
@@ -679,7 +703,7 @@
                                          delta_tiles_loaded2, 1);
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordLoadTimeLocalNTPGoogle) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTimeLocalNTPGoogle) {
   base::HistogramTester histogram_tester;
 
   TestNTPUserDataLogger logger((GURL(chrome::kChromeSearchLocalNtpUrl)));
@@ -712,9 +736,17 @@
                                          delta_tiles_loaded, 1);
   histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.LocalNTP.Google",
                                          delta_tiles_loaded, 1);
+
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples(
+          "NewTabPage.CustomizationAvailability.Backgrounds"),
+      ElementsAre(Bucket(
+          static_cast<int>(
+              BackgroundCustomization::BACKGROUND_CUSTOMIZATION_AVAILABLE),
+          1)));
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordLoadTimeLocalNTPOther) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTimeLocalNTPOther) {
   base::HistogramTester histogram_tester;
 
   TestNTPUserDataLogger logger((GURL(chrome::kChromeSearchLocalNtpUrl)));
@@ -747,9 +779,17 @@
                                          delta_tiles_loaded, 1);
   histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.LocalNTP.Other",
                                          delta_tiles_loaded, 1);
+
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  "NewTabPage.CustomizationAvailability.Backgrounds"),
+              ElementsAre(Bucket(
+                  static_cast<int>(
+                      BackgroundCustomization::
+                          BACKGROUND_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER),
+                  1)));
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordLoadTimeRemoteNTPGoogle) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTimeRemoteNTPGoogle) {
   base::HistogramTester histogram_tester;
 
   TestNTPUserDataLogger logger(GURL("https://www.google.com/_/chrome/newtab"));
@@ -780,9 +820,17 @@
                                          delta_tiles_loaded, 1);
   histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.Web.Google",
                                          delta_tiles_loaded, 1);
+
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples(
+          "NewTabPage.CustomizationAvailability.Backgrounds"),
+      ElementsAre(Bucket(
+          static_cast<int>(
+              BackgroundCustomization::BACKGROUND_CUSTOMIZATION_AVAILABLE),
+          1)));
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordLoadTimeRemoteNTPOther) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordLoadTimeRemoteNTPOther) {
   base::HistogramTester histogram_tester;
 
   TestNTPUserDataLogger logger(GURL("https://www.notgoogle.com/newtab"));
@@ -813,9 +861,17 @@
                                          delta_tiles_loaded, 1);
   histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.Web.Other",
                                          delta_tiles_loaded, 1);
+
+  EXPECT_THAT(histogram_tester.GetAllSamples(
+                  "NewTabPage.CustomizationAvailability.Backgrounds"),
+              ElementsAre(Bucket(
+                  static_cast<int>(
+                      BackgroundCustomization::
+                          BACKGROUND_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER),
+                  1)));
 }
 
-TEST(NTPUserDataLoggerTest, ShouldRecordImpressionsAge) {
+TEST_F(NTPUserDataLoggerTest, ShouldRecordImpressionsAge) {
   base::HistogramTester histogram_tester;
 
   // Ensure non-zero statistics.
@@ -839,3 +895,47 @@
                   (kSuggestionAge + kBucketTolerance).InSeconds(),
                   /*count=*/1)));
 }
+
+TEST_F(NTPUserDataLoggerTest,
+       ShouldRecordCustomizationUnavailabilityWithTheme) {
+  base::HistogramTester histogram_tester;
+
+  TestNTPUserDataLogger logger((GURL(chrome::kChromeSearchLocalNtpUrl)));
+  logger.is_theme_configured_ = true;
+
+  base::TimeDelta delta_tiles_received = base::TimeDelta::FromMilliseconds(10);
+  base::TimeDelta delta_tiles_loaded = base::TimeDelta::FromMilliseconds(100);
+
+  // Send the ALL_TILES_RECEIVED event.
+  logger.LogEvent(NTP_ALL_TILES_RECEIVED, delta_tiles_received);
+
+  // Send the ALL_TILES_LOADED event, this should trigger emitting histograms.
+  logger.LogEvent(NTP_ALL_TILES_LOADED, delta_tiles_loaded);
+
+  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime"), SizeIs(1));
+  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP"),
+              SizeIs(1));
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP.Google"),
+      SizeIs(1));
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples("NewTabPage.LoadTime.LocalNTP.Other"),
+      IsEmpty());
+  EXPECT_THAT(histogram_tester.GetAllSamples("NewTabPage.LoadTime.Web"),
+              IsEmpty());
+
+  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime",
+                                         delta_tiles_loaded, 1);
+  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.LocalNTP",
+                                         delta_tiles_loaded, 1);
+  histogram_tester.ExpectTimeBucketCount("NewTabPage.LoadTime.LocalNTP.Google",
+                                         delta_tiles_loaded, 1);
+
+  EXPECT_THAT(
+      histogram_tester.GetAllSamples(
+          "NewTabPage.CustomizationAvailability.Backgrounds"),
+      ElementsAre(Bucket(
+          static_cast<int>(BackgroundCustomization::
+                               BACKGROUND_CUSTOMIZATION_UNAVAILABLE_THEME),
+          1)));
+}
diff --git a/chrome/browser/ui/search/ntp_user_data_types.h b/chrome/browser/ui/search/ntp_user_data_types.h
new file mode 100644
index 0000000..936e9d8
--- /dev/null
+++ b/chrome/browser/ui/search/ntp_user_data_types.h
@@ -0,0 +1,91 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_SEARCH_NTP_USER_DATA_TYPES_H_
+#define CHROME_BROWSER_UI_SEARCH_NTP_USER_DATA_TYPES_H_
+
+// This enum must match the numbering for NTPBackgroundCustomizationAvailability
+// in enums.xml. Do not reorder or remove items, only add new items before
+// BACKGROUND_CUSTOMIZATION_MAX.
+enum class BackgroundCustomization {
+  BACKGROUND_CUSTOMIZATION_AVAILABLE = 0,
+  BACKGROUND_CUSTOMIZATION_UNAVAILABLE_FEATURE = 1,
+  BACKGROUND_CUSTOMIZATION_UNAVAILABLE_THEME = 2,
+  BACKGROUND_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER = 3,
+
+  kMaxValue = BACKGROUND_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER
+};
+
+// This enum must match the numbering for NTPShortcutCustomizationAvailability
+// in enums.xml. Do not reorder or remove items, only add new items before
+// SHORTCUT_CUSTOMIZATION_MAX.
+enum class ShortcutCustomization {
+  SHORTCUT_CUSTOMIZATION_AVAILABLE = 0,
+  SHORTCUT_CUSTOMIZATION_UNAVAILABLE_FEATURE = 1,
+  SHORTCUT_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER = 2,
+
+  kMaxValue = SHORTCUT_CUSTOMIZATION_UNAVAILABLE_SEARCH_PROVIDER
+};
+
+// This enum must match the numbering for NTPCustomizedFeatures in
+// enums.xml. Do not reorder or remove items, only add new items before
+// CUSTOMIZED_FEATURE_MAX.
+enum class CustomizedFeature {
+  CUSTOMIZED_FEATURE_BACKGROUND = 0,
+  CUSTOMIZED_FEATURE_SHORTCUT = 1,
+
+  kMaxValue = CUSTOMIZED_FEATURE_SHORTCUT
+};
+
+// This enum must match the numbering for NTPCustomizeAction in
+// enums.xml. Do not reorder or remove items, and only add new items before
+// CUSTOMIZE_ACTION_MAX.
+enum class CustomizeAction {
+  CUSTOMIZE_ACTION_CHROME_BACKGROUNDS = 0,
+  CUSTOMIZE_ACTION_LOCAL_IMAGE = 1,
+  CUSTOMIZE_ACTION_RESTORE_BACKGROUND = 2,
+  CUSTOMIZE_ACTION_ATTRIBUTION = 3,
+  CUSTOMIZE_ACTION_ADD_SHORTCUT = 4,
+  CUSTOMIZE_ACTION_EDIT_SHORTCUT = 5,
+  CUSTOMIZE_ACTION_RESTORE_SHORTCUT = 6,
+
+  kMaxValue = CUSTOMIZE_ACTION_RESTORE_SHORTCUT
+};
+
+// This enum must match the numbering for NTPCustomizeChromeBackgroundAction in
+// enums.xml. Do not reorder or remove items, and only add new items before
+// CUSTOMIZE_CHROME_BACKGROUND_ACTION_MAX.
+enum class CustomizeChromeBackgroundAction {
+  CUSTOMIZE_CHROME_BACKGROUND_ACTION_SELECT_COLLECTION = 0,
+  CUSTOMIZE_CHROME_BACKGROUND_ACTION_SELECT_IMAGE = 1,
+  CUSTOMIZE_CHROME_BACKGROUND_ACTION_CANCEL = 2,
+  CUSTOMIZE_CHROME_BACKGROUND_ACTION_DONE = 3,
+
+  kMaxValue = CUSTOMIZE_CHROME_BACKGROUND_ACTION_DONE
+};
+
+// This enum must match the numbering for NTPCustomizeLocalImageBackgroundAction
+// in enums.xml. Do not reorder or remove items, and only add new items before
+// CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_MAX.
+enum class CustomizeLocalImageBackgroundAction {
+  CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_CANCEL = 0,
+  CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_DONE = 1,
+
+  kMaxValue = CUSTOMIZE_LOCAL_IMAGE_BACKGROUND_ACTION_DONE
+};
+
+// This enum must match the numbering for NTPCustomizeShortcutAction in
+// enums.xml. Do not reorder or remove items, and only add new items before
+// CUSTOMIZE_SHORTCUT_ACTION_MAX.
+enum class CustomizeShortcutAction {
+  CUSTOMIZE_SHORTCUT_ACTION_REMOVE = 0,
+  CUSTOMIZE_SHORTCUT_ACTION_CANCEL = 1,
+  CUSTOMIZE_SHORTCUT_ACTION_DONE = 2,
+  CUSTOMIZE_SHORTCUT_ACTION_UNDO = 3,
+  CUSTOMIZE_SHORTCUT_ACTION_RESTORE_ALL = 4,
+
+  kMaxValue = CUSTOMIZE_SHORTCUT_ACTION_RESTORE_ALL
+};
+
+#endif  // CHROME_BROWSER_UI_SEARCH_NTP_USER_DATA_TYPES_H_
diff --git a/chrome/browser/ui/search/search_tab_helper.cc b/chrome/browser/ui/search/search_tab_helper.cc
index ff6a827..5c59c70 100644
--- a/chrome/browser/ui/search/search_tab_helper.cc
+++ b/chrome/browser/ui/search/search_tab_helper.cc
@@ -405,14 +405,26 @@
 void SearchTabHelper::FileSelected(const base::FilePath& path,
                                    int index,
                                    void* params) {
-  if (instant_service_)
+  if (instant_service_) {
+    profile()->set_last_selected_directory(path.DirName());
     instant_service_->SelectLocalBackgroundImage(path);
+  }
 
   select_file_dialog_ = nullptr;
+  // File selection can happen at any time after NTP load, and is not logged
+  // with the event.
+  NTPUserDataLogger::GetOrCreateFromWebContents(web_contents())
+      ->LogEvent(NTP_CUSTOMIZE_LOCAL_IMAGE_DONE,
+                 base::TimeDelta::FromSeconds(0));
 }
 
 void SearchTabHelper::FileSelectionCanceled(void* params) {
   select_file_dialog_ = nullptr;
+  // File selection can happen at any time after NTP load, and is not logged
+  // with the event.
+  NTPUserDataLogger::GetOrCreateFromWebContents(web_contents())
+      ->LogEvent(NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL,
+                 base::TimeDelta::FromSeconds(0));
 }
 
 void SearchTabHelper::OnSelectLocalBackgroundImage() {
diff --git a/chrome/browser/ui/startup/startup_browser_creator.cc b/chrome/browser/ui/startup/startup_browser_creator.cc
index aa3030f..411e7e1f 100644
--- a/chrome/browser/ui/startup/startup_browser_creator.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator.cc
@@ -25,7 +25,7 @@
 #include "base/metrics/statistics_recorder.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_tokenizer.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index f100e90eb..dc3e5f17 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -20,7 +20,7 @@
 #include "base/optional.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/apps/platform_apps/install_chrome_app.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc b/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc
index 088103e..4ea452e2 100644
--- a/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc
+++ b/chrome/browser/ui/sync/one_click_signin_sync_observer_unittest.cc
@@ -69,7 +69,7 @@
 
   int GetDisableReasons() const override { return DISABLE_REASON_NONE; }
 
-  State GetState() const override { return state_; }
+  TransportState GetTransportState() const override { return state_; }
 
   void set_first_setup_complete(bool complete) {
     first_setup_complete_ = complete;
@@ -79,18 +79,18 @@
     setup_in_progress_ = in_progress;
   }
 
-  void set_state(State state) { state_ = state; }
+  void set_state(TransportState state) { state_ = state; }
 
  private:
   explicit OneClickTestProfileSyncService(InitParams init_params)
       : browser_sync::TestProfileSyncService(std::move(init_params)),
         first_setup_complete_(false),
         setup_in_progress_(false),
-        state_(State::INITIALIZING) {}
+        state_(TransportState::INITIALIZING) {}
 
   bool first_setup_complete_;
   bool setup_in_progress_;
-  State state_;
+  TransportState state_;
 
   DISALLOW_COPY_AND_ASSIGN(OneClickTestProfileSyncService);
 };
@@ -208,7 +208,7 @@
   CreateSyncObserver(kContinueUrl);
   sync_service_->set_first_setup_complete(true);
   sync_service_->set_setup_in_progress(false);
-  sync_service_->set_state(syncer::SyncService::State::ACTIVE);
+  sync_service_->set_state(syncer::SyncService::TransportState::ACTIVE);
 
   EXPECT_CALL(*web_contents_observer_, DidStartNavigation(_));
   sync_service_->NotifyObservers();
@@ -222,7 +222,7 @@
   CreateSyncObserver(kContinueUrl);
   sync_service_->set_first_setup_complete(true);
   sync_service_->set_setup_in_progress(false);
-  sync_service_->set_state(syncer::SyncService::State::INITIALIZING);
+  sync_service_->set_state(syncer::SyncService::TransportState::INITIALIZING);
 
   EXPECT_CALL(*web_contents_observer_, DidStartNavigation(_)).Times(0);
   sync_service_->NotifyObservers();
@@ -236,7 +236,7 @@
   CreateSyncObserver(kContinueUrl);
   sync_service_->set_first_setup_complete(false);
   sync_service_->set_setup_in_progress(true);
-  sync_service_->set_state(syncer::SyncService::State::INITIALIZING);
+  sync_service_->set_state(syncer::SyncService::TransportState::INITIALIZING);
 
   EXPECT_CALL(*web_contents_observer_, DidStartNavigation(_)).Times(0);
   sync_service_->NotifyObservers();
@@ -256,7 +256,7 @@
   CreateSyncObserver(continue_url.spec());
   sync_service_->set_first_setup_complete(true);
   sync_service_->set_setup_in_progress(false);
-  sync_service_->set_state(syncer::SyncService::State::ACTIVE);
+  sync_service_->set_state(syncer::SyncService::TransportState::ACTIVE);
 
   EXPECT_CALL(*web_contents_observer_, DidStartNavigation(_)).Times(0);
   sync_service_->NotifyObservers();
diff --git a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
index 2b22dfef..00d31508 100644
--- a/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
+++ b/chrome/browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc
@@ -202,8 +202,8 @@
     EXPECT_CALL(*mock_sync_service_, GetDisableReasons())
         .WillRepeatedly(
             Return(syncer::SyncService::DISABLE_REASON_USER_CHOICE));
-    EXPECT_CALL(*mock_sync_service_, GetState())
-        .WillRepeatedly(Return(syncer::SyncService::State::DISABLED));
+    EXPECT_CALL(*mock_sync_service_, GetTransportState())
+        .WillRepeatedly(Return(syncer::SyncService::TransportState::DISABLED));
     EXPECT_CALL(*mock_sync_service_, IsDataTypeControllerRunning(_))
         .WillRepeatedly(Return(false));
     EXPECT_CALL(*mock_sync_service_, GetOpenTabsUIDelegateMock())
@@ -213,8 +213,8 @@
   void EnableSync() {
     EXPECT_CALL(*mock_sync_service_, GetDisableReasons())
         .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE));
-    EXPECT_CALL(*mock_sync_service_, GetState())
-        .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+    EXPECT_CALL(*mock_sync_service_, GetTransportState())
+        .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
     EXPECT_CALL(*mock_sync_service_, IsFirstSetupComplete())
         .WillRepeatedly(Return(true));
     EXPECT_CALL(*mock_sync_service_,
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
index 12a20b0f..171bd783 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_aura.cc
@@ -11,7 +11,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/ui/views/apps/app_window_easy_resize_window_targeter.h"
 #include "chrome/browser/ui/views/apps/shaped_app_window_targeter.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "ui/aura/client/aura_constants.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_observer.h"
@@ -57,8 +57,8 @@
     views::Widget::InitParams* init_params,
     views::Widget* widget) {
 #if defined(USE_X11)
-  std::string app_name = web_app::GenerateApplicationNameFromExtensionId(
-      app_window()->extension_id());
+  std::string app_name =
+      web_app::GenerateApplicationNameFromAppId(app_window()->extension_id());
   // Set up a custom WM_CLASS for app windows. This allows task switchers in
   // X11 environments to distinguish them from main browser windows.
   init_params->wm_class_name =
diff --git a/chrome/browser/ui/views/apps/chrome_native_app_window_views_win.cc b/chrome/browser/ui/views/apps/chrome_native_app_window_views_win.cc
index e714f743..f9d0803 100644
--- a/chrome/browser/ui/views/apps/chrome_native_app_window_views_win.cc
+++ b/chrome/browser/ui/views/apps/chrome_native_app_window_views_win.cc
@@ -12,7 +12,7 @@
 #include "chrome/browser/shell_integration_win.h"
 #include "chrome/browser/ui/views/apps/app_window_desktop_native_widget_aura_win.h"
 #include "chrome/browser/ui/views/apps/glass_app_window_frame_view_win.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
 #include "chrome/common/chrome_switches.h"
 #include "content/public/browser/browser_thread.h"
@@ -64,7 +64,7 @@
     return;
 
   std::string app_name =
-      web_app::GenerateApplicationNameFromExtensionId(extension->id());
+      web_app::GenerateApplicationNameFromAppId(extension->id());
   base::string16 app_name_wide = base::UTF8ToWide(app_name);
   HWND hwnd = GetNativeAppWindowHWND();
   Profile* profile =
diff --git a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
index 3c620f50..21e8bb34 100644
--- a/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
+++ b/chrome/browser/ui/views/autofill/save_card_bubble_views.cc
@@ -282,7 +282,8 @@
   set_margins(ChromeLayoutProvider::Get()->GetDialogInsetsForContentType(
       controller_->GetExplanatoryMessage().empty() ? views::CONTROL
                                                    : views::TEXT,
-      views::CONTROL));
+      GetDialogButtons() == ui::DIALOG_BUTTON_NONE ? views::TEXT
+                                                   : views::CONTROL));
   AddChildView(CreateMainContentView().release());
 }
 
diff --git a/chrome/browser/ui/views/chrome_views_delegate_win.cc b/chrome/browser/ui/views/chrome_views_delegate_win.cc
index db3627f..d65be83 100644
--- a/chrome/browser/ui/views/chrome_views_delegate_win.cc
+++ b/chrome/browser/ui/views/chrome_views_delegate_win.cc
@@ -7,7 +7,7 @@
 #include <dwmapi.h>
 #include <shellapi.h>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/win/windows_version.h"
 #include "chrome/browser/ui/views/native_widget_factory.h"
 #include "chrome/browser/win/app_icon.h"
diff --git a/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc b/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc
index c366c1d4..0a638a6 100644
--- a/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc
+++ b/chrome/browser/ui/views/crostini/crostini_browser_test_util.cc
@@ -4,10 +4,10 @@
 
 #include "chrome/browser/ui/views/crostini/crostini_browser_test_util.h"
 
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/chrome_browser_main.h"
 #include "chrome/browser/chrome_browser_main_extra_parts.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
+#include "chrome/browser/chromeos/crostini/crostini_util.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/common/chrome_features.h"
 #include "components/prefs/pref_service.h"
@@ -57,7 +57,7 @@
 }
 
 void CrostiniDialogBrowserTest::SetUp() {
-  scoped_feature_list_.InitAndEnableFeature(features::kExperimentalCrostiniUI);
+  SetCrostiniUIAllowedForTesting(true);
   DialogBrowserTest::SetUp();
 }
 
diff --git a/chrome/browser/ui/views/crostini/crostini_browser_test_util.h b/chrome/browser/ui/views/crostini/crostini_browser_test_util.h
index 0d69153..c51030b 100644
--- a/chrome/browser/ui/views/crostini/crostini_browser_test_util.h
+++ b/chrome/browser/ui/views/crostini/crostini_browser_test_util.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_BROWSER_TEST_UTIL_H_
 #define CHROME_BROWSER_UI_VIEWS_CROSTINI_CROSTINI_BROWSER_TEST_UTIL_H_
 
-#include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "net/base/network_change_notifier.h"
 
@@ -31,8 +30,6 @@
   ChromeBrowserMainExtraPartsNetFactoryInstaller* extra_parts_ = nullptr;
 
  private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-
   DISALLOW_COPY_AND_ASSIGN(CrostiniDialogBrowserTest);
 };
 
diff --git a/chrome/browser/ui/views/crostini/crostini_installer_view.cc b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
index 9f99b87..3d2b0db 100644
--- a/chrome/browser/ui/views/crostini/crostini_installer_view.cc
+++ b/chrome/browser/ui/views/crostini/crostini_installer_view.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/crostini/crostini_manager.h"
 #include "chrome/browser/chromeos/crostini/crostini_pref_names.h"
diff --git a/chrome/browser/ui/views/elevation_icon_setter.cc b/chrome/browser/ui/views/elevation_icon_setter.cc
index 7db9149..39fd43f 100644
--- a/chrome/browser/ui/views/elevation_icon_setter.cc
+++ b/chrome/browser/ui/views/elevation_icon_setter.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/views/elevation_icon_setter.h"
 
 #include "base/callback.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "ui/views/controls/button/label_button.h"
 
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
index a6802dd1..0a35803a 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.cc
@@ -108,6 +108,10 @@
   return gfx::CreateVectorIcon(kIncognitoIcon, icon_color);
 }
 
+SkColor BrowserNonClientFrameView::GetFrameColor() const {
+  return GetFrameColor(ShouldPaintAsActive());
+}
+
 SkColor BrowserNonClientFrameView::GetToolbarTopSeparatorColor() const {
   const int color_id =
       ShouldPaintAsActive()
@@ -288,10 +292,6 @@
              : gfx::ImageSkia();
 }
 
-SkColor BrowserNonClientFrameView::GetFrameColor() const {
-  return GetFrameColor(ShouldPaintAsActive());
-}
-
 gfx::ImageSkia BrowserNonClientFrameView::GetFrameImage() const {
   return GetFrameImage(ShouldPaintAsActive());
 }
@@ -367,8 +367,12 @@
 
 void BrowserNonClientFrameView::PaintToolbarTopStroke(
     gfx::Canvas* canvas) const {
-  if (TabStrip::ShouldDrawStrokes()) {
+  if (browser_view()->tabstrip()->ShouldDrawStrokes()) {
     gfx::Rect toolbar_bounds(browser_view()->GetToolbarBounds());
+    gfx::Point toolbar_origin(toolbar_bounds.origin());
+    ConvertPointToTarget(browser_view(), this, &toolbar_origin);
+    toolbar_bounds.set_origin(toolbar_origin);
+
     gfx::Rect tabstrip_bounds =
         GetMirroredRect(GetBoundsForTabStrip(browser_view()->tabstrip()));
 
@@ -377,8 +381,8 @@
 
     const gfx::Rect separator_rect(toolbar_bounds.x(), tabstrip_bounds.bottom(),
                                    toolbar_bounds.width(), 0);
-    BrowserView::Paint1pxHorizontalLine(canvas, GetToolbarTopSeparatorColor(),
-                                        separator_rect, true);
+    BrowserView::PaintToolbarTopSeparator(canvas, GetToolbarTopSeparatorColor(),
+                                          separator_rect);
   }
 }
 
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
index 947ab27d..323b739 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view.h
@@ -81,6 +81,10 @@
   // Retrieves the icon to use in the frame to indicate an incognito window.
   gfx::ImageSkia GetIncognitoAvatarIcon() const;
 
+  // Returns the color of the browser frame, which is also the color of the
+  // tabstrip background.
+  SkColor GetFrameColor() const;
+
   // Returns COLOR_TOOLBAR_TOP_SEPARATOR[,_INACTIVE] depending on the activation
   // state of the window.
   SkColor GetToolbarTopSeparatorColor() const;
@@ -150,7 +154,6 @@
 
   // Convenience versions of the above which use ShouldPaintAsActive() for
   // |active|.
-  SkColor GetFrameColor() const;
   gfx::ImageSkia GetFrameImage() const;
   gfx::ImageSkia GetFrameOverlayImage() const;
 
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
index 5e58e7f..b3db9e8c 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.cc
@@ -964,8 +964,6 @@
   base::Optional<SkColor> theme_color =
       browser->hosted_app_controller()->GetThemeColor();
   if (theme_color) {
-    theme_color = SkColorSetA(*theme_color, SK_AlphaOPAQUE);
-
     // Not necessary in Mash as the frame colors are set in OnThemeChanged().
     if (!IsMash()) {
       frame()->GetNativeWindow()->SetProperty(
@@ -996,12 +994,9 @@
     inactive_color = GetFrameColor(false);
   } else if (extensions::HostedAppBrowserController::
                  IsForExperimentalHostedAppBrowser(browser_view()->browser())) {
-    base::Optional<SkColor> theme_color =
+    active_color =
         browser_view()->browser()->hosted_app_controller()->GetThemeColor();
-    window->SetProperty(ash::kFrameIsThemedByHostedAppKey, !!theme_color);
-
-    if (theme_color)
-      active_color = SkColorSetA(*theme_color, SK_AlphaOPAQUE);
+    window->SetProperty(ash::kFrameIsThemedByHostedAppKey, !!active_color);
   } else {
     active_color = kMdWebUiFrameColor;
   }
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
index 2a8487b..604917b8 100644
--- a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
+++ b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h
@@ -35,7 +35,7 @@
 class DefaultFrameHeader;
 class FrameCaptionButton;
 class FrameCaptionButtonContainerView;
-}
+}  // namespace ash
 
 // Provides the BrowserNonClientFrameView for Chrome OS.
 class BrowserNonClientFrameViewAsh
@@ -146,7 +146,7 @@
                            AvatarDisplayOnTeleportedWindow);
   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
                            HeaderVisibilityInOverviewAndSplitview);
-  FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshTest,
+  FRIEND_TEST_ALL_PREFIXES(NonHomeLauncherBrowserNonClientFrameViewAshTest,
                            HeaderHeightForSnappedBrowserInSplitView);
   FRIEND_TEST_ALL_PREFIXES(BrowserNonClientFrameViewAshBackButtonTest,
                            V1BackButton);
diff --git a/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc b/chrome/browser/ui/views/frame/browser_non_client_frame_view_ash_browsertest.cc
index f6e05ef5..970f1bf 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
@@ -400,17 +400,17 @@
       ash::Shell::Get()->tablet_mode_controller();
   tablet_mode_controller->EnableTabletModeWindowManager(true);
   tablet_mode_controller->FlushForTesting();
-  ash::FrameCaptionButtonContainerView::TestApi test(frame_view->
-                                                     caption_button_container_);
+  ash::FrameCaptionButtonContainerView::TestApi test(
+      frame_view->caption_button_container_);
   test.EndAnimations();
-  const gfx::Rect during_maximize = frame_view->caption_button_container_->
-      bounds();
+  const gfx::Rect during_maximize =
+      frame_view->caption_button_container_->bounds();
   EXPECT_GT(initial.width(), during_maximize.width());
   tablet_mode_controller->EnableTabletModeWindowManager(false);
   tablet_mode_controller->FlushForTesting();
   test.EndAnimations();
-  const gfx::Rect after_restore = frame_view->caption_button_container_->
-      bounds();
+  const gfx::Rect after_restore =
+      frame_view->caption_button_container_->bounds();
   EXPECT_EQ(initial, after_restore);
 }
 
@@ -866,7 +866,7 @@
 // Tests that a web app's theme color is set.
 IN_PROC_BROWSER_TEST_P(HostedAppNonClientFrameViewAshTest, ThemeColor) {
   aura::Window* window = browser_view_->GetWidget()->GetNativeWindow();
-  EXPECT_EQ(GetThemeColor(),window->GetProperty(ash::kFrameActiveColorKey));
+  EXPECT_EQ(GetThemeColor(), window->GetProperty(ash::kFrameActiveColorKey));
   EXPECT_EQ(GetThemeColor(), window->GetProperty(ash::kFrameInactiveColorKey));
   EXPECT_EQ(SK_ColorWHITE, GetActiveColor());
 }
@@ -1201,42 +1201,6 @@
   EXPECT_FALSE(frame_view2->caption_button_container_->visible());
 }
 
-// Tests that the header of a snapped browser window in splitview mode uses
-// the same header height of a maximized window.
-IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest,
-                       HeaderHeightForSnappedBrowserInSplitView) {
-  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
-  Widget* widget = browser_view->GetWidget();
-  BrowserNonClientFrameViewAsh* frame_view = GetFrameViewAsh(browser_view);
-
-  widget->GetNativeWindow()->SetProperty(
-      aura::client::kResizeBehaviorKey,
-      ui::mojom::kResizeBehaviorCanMaximize |
-          ui::mojom::kResizeBehaviorCanResize);
-
-  // Maximize the widget and store its frame header height.
-  widget->Maximize();
-  const int expected_height = frame_view->frame_header_->GetHeaderHeight();
-  widget->Restore();
-
-  ash::Shell* shell = ash::Shell::Get();
-  ash::SplitViewController* split_view_controller =
-      shell->split_view_controller();
-  split_view_controller->BindRequest(
-      mojo::MakeRequest(&frame_view->split_view_controller_));
-  split_view_controller->AddObserver(
-      frame_view->CreateInterfacePtrForTesting());
-  frame_view->split_view_controller_.FlushForTesting();
-
-  shell->tablet_mode_controller()->EnableTabletModeWindowManager(true);
-  shell->window_selector_controller()->ToggleOverview();
-  split_view_controller->SnapWindow(widget->GetNativeWindow(),
-                                    ash::SplitViewController::LEFT);
-  frame_view->split_view_controller_.FlushForTesting();
-  EXPECT_TRUE(frame_view->caption_button_container_->visible());
-  EXPECT_EQ(expected_height, frame_view->frame_header_->GetHeaderHeight());
-}
-
 IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest,
                        ImmersiveModeTopViewInset) {
   browser()->window()->Close();
@@ -1311,6 +1275,31 @@
   DISALLOW_COPY_AND_ASSIGN(HomeLauncherBrowserNonClientFrameViewAshTest);
 };
 
+class NonHomeLauncherBrowserNonClientFrameViewAshTest
+    : public TopChromeMdParamTest<InProcessBrowserTest> {
+ public:
+  NonHomeLauncherBrowserNonClientFrameViewAshTest() = default;
+  ~NonHomeLauncherBrowserNonClientFrameViewAshTest() override = default;
+
+  void SetUpDefaultCommandLine(base::CommandLine* command_line) override {
+    TopChromeMdParamTest<InProcessBrowserTest>::SetUpDefaultCommandLine(
+        command_line);
+
+    command_line->AppendSwitch(ash::switches::kAshEnableTabletMode);
+  }
+
+  void SetUp() override {
+    scoped_feature_list_.InitAndDisableFeature(
+        app_list::features::kEnableHomeLauncher);
+    TopChromeMdParamTest<InProcessBrowserTest>::SetUp();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+
+  DISALLOW_COPY_AND_ASSIGN(NonHomeLauncherBrowserNonClientFrameViewAshTest);
+};
+
 }  // namespace
 
 IN_PROC_BROWSER_TEST_P(HomeLauncherBrowserNonClientFrameViewAshTest,
@@ -1371,6 +1360,44 @@
   EXPECT_TRUE(frame_view->caption_button_container_->visible());
 }
 
+// Tests that the header of a snapped browser window in splitview mode uses
+// the same header height of a maximized window. The test will fail when home
+// launcher is enabled, because caption button container is made invisible
+// intentionally.
+IN_PROC_BROWSER_TEST_P(NonHomeLauncherBrowserNonClientFrameViewAshTest,
+                       HeaderHeightForSnappedBrowserInSplitView) {
+  BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
+  Widget* widget = browser_view->GetWidget();
+  BrowserNonClientFrameViewAsh* frame_view = GetFrameViewAsh(browser_view);
+
+  widget->GetNativeWindow()->SetProperty(
+      aura::client::kResizeBehaviorKey,
+      ui::mojom::kResizeBehaviorCanMaximize |
+          ui::mojom::kResizeBehaviorCanResize);
+
+  // Maximize the widget and store its frame header height.
+  widget->Maximize();
+  const int expected_height = frame_view->frame_header_->GetHeaderHeight();
+  widget->Restore();
+
+  ash::Shell* shell = ash::Shell::Get();
+  ash::SplitViewController* split_view_controller =
+      shell->split_view_controller();
+  split_view_controller->BindRequest(
+      mojo::MakeRequest(&frame_view->split_view_controller_));
+  split_view_controller->AddObserver(
+      frame_view->CreateInterfacePtrForTesting());
+  frame_view->split_view_controller_.FlushForTesting();
+
+  shell->tablet_mode_controller()->EnableTabletModeWindowManager(true);
+  shell->window_selector_controller()->ToggleOverview();
+  split_view_controller->SnapWindow(widget->GetNativeWindow(),
+                                    ash::SplitViewController::LEFT);
+  frame_view->split_view_controller_.FlushForTesting();
+  EXPECT_TRUE(frame_view->caption_button_container_->visible());
+  EXPECT_EQ(expected_height, frame_view->frame_header_->GetHeaderHeight());
+}
+
 #define INSTANTIATE_TEST_CASE(name)                                   \
   INSTANTIATE_TEST_CASE_P(                                            \
       , name,                                                         \
@@ -1384,3 +1411,4 @@
 INSTANTIATE_TEST_CASE(HostedAppNonClientFrameViewAshTest);
 INSTANTIATE_TEST_CASE(BrowserNonClientFrameViewAshBackButtonTest);
 INSTANTIATE_TEST_CASE(HomeLauncherBrowserNonClientFrameViewAshTest);
+INSTANTIATE_TEST_CASE(NonHomeLauncherBrowserNonClientFrameViewAshTest);
diff --git a/chrome/browser/ui/views/frame/browser_root_view.cc b/chrome/browser/ui/views/frame/browser_root_view.cc
index 404a7d1b..d4d56c7 100644
--- a/chrome/browser/ui/views/frame/browser_root_view.cc
+++ b/chrome/browser/ui/views/frame/browser_root_view.cc
@@ -8,7 +8,7 @@
 #include <string>
 
 #include "base/metrics/user_metrics.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/autocomplete/autocomplete_classifier_factory.h"
 #include "chrome/browser/defaults.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 0d4523d..23809f72 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -488,6 +488,25 @@
 }
 
 // static
+void BrowserView::PaintToolbarTopSeparator(gfx::Canvas* canvas,
+                                           SkColor color,
+                                           const gfx::Rect& bounds) {
+  const float thickness = ui::MaterialDesignController::IsRefreshUi()
+                              ? 1.f
+                              : 1 / canvas->image_scale();
+  cc::PaintFlags flags;
+  flags.setColor(color);
+  flags.setStyle(cc::PaintFlags::kFill_Style);
+  canvas->sk_canvas()->drawRect(
+      RectFToSkRect(gfx::RectF(bounds.x(),
+                               bounds.bottom() -
+                                   GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP) -
+                                   thickness,
+                               bounds.width(), thickness)),
+      flags);
+}
+
+// static
 void BrowserView::SetDisableRevealerDelayForTesting(bool disable) {
   g_disable_revealer_delay_for_testing = disable;
 }
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h
index edcb618..6f2ce0d 100644
--- a/chrome/browser/ui/views/frame/browser_view.h
+++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -132,6 +132,13 @@
                                      const gfx::Rect& bounds,
                                      bool at_bottom);
 
+  // Paints a horizontal line TABSTRIP_TOOLBAR_OVERLAP points above the bottom
+  // of |bounds|.  The thickness of the line is 1pt on refresh and 1px
+  // otherwise.
+  static void PaintToolbarTopSeparator(gfx::Canvas* canvas,
+                                       SkColor color,
+                                       const gfx::Rect& bounds);
+
   // After calling RevealTabStripIfNeeded(), there is normally a delay before
   // the tabstrip is hidden. Tests can use this function to disable that delay
   // (and hide immediately).
diff --git a/chrome/browser/ui/views/frame/browser_window_property_manager_win.cc b/chrome/browser/ui/views/frame/browser_window_property_manager_win.cc
index e3a0025..05571c7 100644
--- a/chrome/browser/ui/views/frame/browser_window_property_manager_win.cc
+++ b/chrome/browser/ui/views/frame/browser_window_property_manager_win.cc
@@ -13,7 +13,7 @@
 #include "chrome/browser/profiles/profile_shortcut_manager_win.h"
 #include "chrome/browser/shell_integration_win.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
@@ -65,7 +65,7 @@
   if (browser->is_app()) {
     ExtensionRegistry* registry = ExtensionRegistry::Get(profile);
     const extensions::Extension* extension = registry->GetExtensionById(
-        web_app::GetExtensionIdFromApplicationName(browser->app_name()),
+        web_app::GetAppIdFromApplicationName(browser->app_name()),
         ExtensionRegistry::EVERYTHING);
     if (extension) {
       ui::win::SetAppIdForWindow(app_id, hwnd_);
diff --git a/chrome/browser/ui/views/frame/taskbar_decorator_win.cc b/chrome/browser/ui/views/frame/taskbar_decorator_win.cc
index 3312d149..0f2ccaa 100644
--- a/chrome/browser/ui/views/frame/taskbar_decorator_win.cc
+++ b/chrome/browser/ui/views/frame/taskbar_decorator_win.cc
@@ -10,7 +10,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/win/scoped_gdi_object.h"
 #include "chrome/browser/profiles/profile_avatar_icon_util.h"
 #include "skia/ext/image_operations.h"
diff --git a/chrome/browser/ui/views/harmony/layout_provider_unittest.cc b/chrome/browser/ui/views/harmony/layout_provider_unittest.cc
index 5bdc2b5..6c8cf8e 100644
--- a/chrome/browser/ui/views/harmony/layout_provider_unittest.cc
+++ b/chrome/browser/ui/views/harmony/layout_provider_unittest.cc
@@ -291,10 +291,6 @@
 TEST_F(LayoutProviderTest, TypographyLineHeight) {
   constexpr int kStyle = views::style::STYLE_PRIMARY;
 
-  // Only MD overrides the default line spacing.
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kSecondaryUiMd);
-
   std::unique_ptr<views::LayoutProvider> layout_provider =
       ChromeLayoutProvider::CreateLayoutProvider();
 
@@ -328,9 +324,6 @@
 // Harmony spec. This test will only run if it detects that the current machine
 // has the default OS configuration.
 TEST_F(LayoutProviderTest, ExplicitTypographyLineHeight) {
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(features::kSecondaryUiMd);
-
   std::unique_ptr<views::LayoutProvider> layout_provider =
       ChromeLayoutProvider::CreateLayoutProvider();
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
index 882c3f77..01c0d70 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
@@ -1327,6 +1327,22 @@
       }
       break;
 
+    case ui::VKEY_SPACE:
+      if (!(control || alt || shift))
+      {
+        size_t start, end;
+        GetSelectionBounds(&start, &end);
+        end = std::max(start, end);
+        if (end == text().size() &&
+            model()->popup_model()->SelectedLineHasTabMatch() &&
+            model()->popup_model()->selected_line_state() ==
+                OmniboxPopupModel::TAB_SWITCH) {
+          popup_view_->OpenMatch(WindowOpenDisposition::SWITCH_TO_TAB);
+          return true;
+        }
+      }
+      break;
+
     default:
       break;
   }
diff --git a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
index 3ceed66..d318ae7 100644
--- a/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
+++ b/chrome/browser/ui/views/outdated_upgrade_bubble_view.cc
@@ -6,7 +6,7 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/ui/browser_dialogs.h"
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
index b3762c3..5d2bb849 100644
--- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -617,7 +617,7 @@
   } else if (sender == credit_cards_button_) {
     base::RecordAction(
         base::UserMetricsAction("ProfileChooser_PaymentsClicked"));
-    chrome::ShowSettingsSubPage(browser_, chrome::kAutofillSubPage);
+    chrome::ShowSettingsSubPage(browser_, chrome::kPaymentsSubPage);
   } else if (sender == addresses_button_) {
     base::RecordAction(
         base::UserMetricsAction("ProfileChooser_AddressesClicked"));
diff --git a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
index 8e71337..d4b67b9e 100644
--- a/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
+++ b/chrome/browser/ui/views/sync/profile_signin_confirmation_dialog_views.cc
@@ -21,13 +21,16 @@
 #include "components/constrained_window/constrained_window_views.h"
 #include "components/signin/core/browser/profile_management_switches.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/vector_icons/vector_icons.h"
 #include "content/public/browser/web_contents.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/ui_features.h"
+#include "ui/gfx/color_palette.h"
 #include "ui/gfx/font.h"
 #include "ui/gfx/native_widget_types.h"
+#include "ui/gfx/paint_vector_icon.h"
 #include "ui/gfx/range/range.h"
 #include "ui/views/background.h"
 #include "ui/views/border.h"
@@ -158,6 +161,13 @@
       ui::GetSigninConfirmationPromptBarColor(
           GetNativeTheme(), ui::kSigninConfirmationPromptBarBackgroundAlpha);
 
+  // Create business icon.
+  int business_icon_size = 20;
+  views::ImageView* business_icon = new views::ImageView();
+  business_icon->SetImage(gfx::CreateVectorIcon(gfx::IconDescription(
+      vector_icons::kBusinessIcon, business_icon_size, gfx::kChromeIconGrey,
+      base::TimeDelta(), gfx::kNoneIcon)));
+
   // Create the prompt label.
   size_t offset;
   const base::string16 domain =
@@ -217,11 +227,22 @@
       views::CreateEmptyBorder(ChromeLayoutProvider::Get()->GetInsetsMetric(
           views::INSETS_DIALOG_SUBSECTION)));
   constexpr int kPromptBarColumnSetId = 0;
-  prompt_layout->AddColumnSet(kPromptBarColumnSetId)
-      ->AddColumn(views::GridLayout::FILL, views::GridLayout::CENTER, 1.0,
-                  views::GridLayout::USE_PREF, 0, 0);
+  auto* prompt_columnset = prompt_layout->AddColumnSet(kPromptBarColumnSetId);
+  prompt_columnset->AddColumn(
+      views::GridLayout::FILL, views::GridLayout::CENTER,
+      views::GridLayout::kFixedSize, views::GridLayout::USE_PREF, 0, 0);
+  prompt_columnset->AddPaddingColumn(
+      views::GridLayout::kFixedSize,
+      ChromeLayoutProvider::Get()->GetDistanceMetric(
+          views::DISTANCE_TEXTFIELD_HORIZONTAL_TEXT_PADDING));
+  prompt_columnset->AddColumn(views::GridLayout::FILL,
+                              views::GridLayout::CENTER, 1.0,
+                              views::GridLayout::USE_PREF, 0, 0);
+
   prompt_layout->StartRow(views::GridLayout::kFixedSize, kPromptBarColumnSetId);
+  prompt_layout->AddView(business_icon);
   prompt_layout->AddView(prompt_label);
+
   // Use a column set with no padding.
   dialog_layout->AddColumnSet(0)->AddColumn(views::GridLayout::FILL,
                                             views::GridLayout::FILL, 1.0,
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
index c737a92..0d8d70e 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.cc
@@ -382,6 +382,10 @@
   immersive_reveal_lock_.reset();
 }
 
+SkColor BrowserTabStripController::GetFrameColor() const {
+  return GetFrameView()->GetFrameColor();
+}
+
 SkColor BrowserTabStripController::GetToolbarTopSeparatorColor() const {
   return GetFrameView()->GetToolbarTopSeparatorColor();
 }
diff --git a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
index af169c3a..2b8c0b36 100644
--- a/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/browser_tab_strip_controller.h
@@ -75,6 +75,7 @@
   bool IsSingleTabModeAvailable() override;
   void OnStartedDraggingTabs() override;
   void OnStoppedDraggingTabs() override;
+  SkColor GetFrameColor() const override;
   SkColor GetToolbarTopSeparatorColor() const override;
   SkColor GetTabSeparatorColor() const override;
   SkColor GetTabBackgroundColor(TabState active) const override;
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
index 143b9e9..e05a787 100644
--- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
+++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.cc
@@ -146,12 +146,16 @@
 void FakeBaseTabStripController::OnStoppedDraggingTabs() {
 }
 
+SkColor FakeBaseTabStripController::GetFrameColor() const {
+  return gfx::kPlaceholderColor;
+}
+
 SkColor FakeBaseTabStripController::GetToolbarTopSeparatorColor() const {
-  return SK_ColorBLACK;
+  return gfx::kPlaceholderColor;
 }
 
 SkColor FakeBaseTabStripController::GetTabSeparatorColor() const {
-  return SK_ColorBLACK;
+  return gfx::kPlaceholderColor;
 }
 
 SkColor FakeBaseTabStripController::GetTabBackgroundColor(
diff --git a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
index c2bcdf2..e5fafd7 100644
--- a/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h
@@ -51,6 +51,7 @@
   bool IsSingleTabModeAvailable() override;
   void OnStartedDraggingTabs() override;
   void OnStoppedDraggingTabs() override;
+  SkColor GetFrameColor() const override;
   SkColor GetToolbarTopSeparatorColor() const override;
   SkColor GetTabSeparatorColor() const override;
   SkColor GetTabBackgroundColor(TabState state) const override;
diff --git a/chrome/browser/ui/views/tabs/new_tab_button.cc b/chrome/browser/ui/views/tabs/new_tab_button.cc
index 54d9829..0b619643 100644
--- a/chrome/browser/ui/views/tabs/new_tab_button.cc
+++ b/chrome/browser/ui/views/tabs/new_tab_button.cc
@@ -455,7 +455,8 @@
     if (has_custom_image && !new_tab_promo_observer_.IsObservingSources()) {
       // For non-refresh touch UI, the background is that of the active tab, so
       // the positioning must match that in Tab::PaintTab().
-      const int offset_y = non_refresh_touch_ui ? -Tab::GetStrokeHeight() : 0;
+      const int offset_y =
+          non_refresh_touch_ui ? -tab_strip_->GetStrokeThickness() : 0;
       // The new tab background is mirrored in RTL mode, but the theme
       // background should never be mirrored. Mirror it here to compensate.
       float x_scale = 1.0f;
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index 363b545..58a4c7db 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -156,17 +156,18 @@
 
 // Scales |bounds| by scale and aligns so that adjacent tabs meet up exactly
 // during painting.
-const gfx::RectF ScaleAndAlignBounds(const gfx::Rect& bounds, float scale) {
+const gfx::RectF ScaleAndAlignBounds(const gfx::Rect& bounds,
+                                     float scale,
+                                     float stroke_thickness) {
   // Convert to layout bounds.  We must inset the width such that the right edge
   // of one tab's layout bounds is the same as the left edge of the next tab's;
   // this way the two tabs' separators will be drawn at the same coordinate.
   gfx::RectF aligned_bounds(bounds);
-  const int stroke_height = Tab::GetStrokeHeight();
   const int corner_radius = Tab::GetCornerRadius();
   // Note: This intentionally doesn't subtract TABSTRIP_TOOLBAR_OVERLAP from the
   // bottom inset, because we want to pixel-align the bottom of the stroke, not
   // the bottom of the overlap.
-  gfx::InsetsF layout_insets(stroke_height, corner_radius, stroke_height,
+  gfx::InsetsF layout_insets(stroke_thickness, corner_radius, stroke_thickness,
                              corner_radius + Tab::kSeparatorThickness);
   aligned_bounds.Inset(layout_insets);
 
@@ -218,11 +219,16 @@
 
 // The refresh-specific implementation of GetInteriorPath() (see below).
 gfx::Path GetRefreshInteriorPath(float scale,
+                                 float stroke_thickness,
                                  const gfx::Rect& bounds,
                                  const gfx::InsetsF& insets) {
-  // TODO(pkasting): Fix this to work better with stroke heights > 0.
+  const gfx::RectF aligned_bounds =
+      ScaleAndAlignBounds(bounds, scale, stroke_thickness);
 
-  const float radius = GetTopCornerRadiusForWidth(bounds.width()) * scale;
+  stroke_thickness *= scale;
+
+  const float outer_radius = GetTopCornerRadiusForWidth(bounds.width()) * scale;
+  const float inner_radius = std::max(outer_radius - stroke_thickness, 0.f);
 
   // Compute |extension| as the width outside the separators.  This is a fixed
   // value equal to the normal corner radius.
@@ -230,12 +236,11 @@
 
   // When the radius shrinks, it leaves a gap between the bottom (outer) corners
   // and the edge of the tab.
-  const float corner_gap = extension - radius;
+  const float corner_gap = extension - outer_radius;
 
-  const gfx::RectF aligned_bounds = ScaleAndAlignBounds(bounds, scale);
-  const float left = aligned_bounds.x();
-  const float top = aligned_bounds.y() + Tab::GetStrokeHeight();
-  const float right = aligned_bounds.right();
+  const float left = aligned_bounds.x() + stroke_thickness;
+  const float top = aligned_bounds.y() + stroke_thickness;
+  const float right = aligned_bounds.right() - stroke_thickness;
   const float extended_bottom = aligned_bounds.bottom();
   const float bottom_extension =
       GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP) * scale;
@@ -250,15 +255,17 @@
   gfx::Path right_path;
   right_path.moveTo(right - corner_gap, extended_bottom);
   right_path.rLineTo(0, -bottom_extension);
-  right_path.arcTo(radius, radius, 0, SkPath::kSmall_ArcSize,
-                   SkPath::kCW_Direction, right - extension, bottom - radius);
+  right_path.arcTo(outer_radius, outer_radius, 0, SkPath::kSmall_ArcSize,
+                   SkPath::kCW_Direction, right - extension,
+                   bottom - outer_radius);
 
   // Right vertical.
-  right_path.lineTo(right - extension, top + radius);
+  right_path.lineTo(right - extension, top + inner_radius);
 
   // Top right.
-  right_path.arcTo(radius, radius, 0, SkPath::kSmall_ArcSize,
-                   SkPath::kCCW_Direction, right - extension - radius, top);
+  right_path.arcTo(inner_radius, inner_radius, 0, SkPath::kSmall_ArcSize,
+                   SkPath::kCCW_Direction, right - extension - inner_radius,
+                   top);
 
   // Top/bottom edges of right side.
   right_path.lineTo(left, top);
@@ -267,15 +274,15 @@
 
   // Top left.
   gfx::Path left_path;
-  left_path.moveTo(left + extension + radius, top);
-  left_path.arcTo(radius, radius, 0, SkPath::kSmall_ArcSize,
-                  SkPath::kCCW_Direction, left + extension, top + radius);
+  left_path.moveTo(left + extension + inner_radius, top);
+  left_path.arcTo(inner_radius, inner_radius, 0, SkPath::kSmall_ArcSize,
+                  SkPath::kCCW_Direction, left + extension, top + inner_radius);
 
   // Left vertical.
-  left_path.lineTo(left + extension, bottom - radius);
+  left_path.lineTo(left + extension, bottom - outer_radius);
 
   // Bottom left.
-  left_path.arcTo(radius, radius, 0, SkPath::kSmall_ArcSize,
+  left_path.arcTo(outer_radius, outer_radius, 0, SkPath::kSmall_ArcSize,
                   SkPath::kCW_Direction, left + corner_gap, bottom);
   left_path.lineTo(left + corner_gap, extended_bottom);
 
@@ -298,10 +305,11 @@
 // trying to clip favicons to match the overall tab shape but be inset from the
 // edge.
 gfx::Path GetInteriorPath(float scale,
+                          float stroke_thickness,
                           const gfx::Rect& bounds,
                           const gfx::InsetsF& insets = gfx::InsetsF()) {
   if (MD::IsRefreshUi())
-    return GetRefreshInteriorPath(scale, bounds, insets);
+    return GetRefreshInteriorPath(scale, stroke_thickness, bounds, insets);
 
   const float right = bounds.width() * scale;
   // The bottom of the tab needs to be pixel-aligned or else when we call
@@ -344,17 +352,18 @@
                                bool extend_to_top,
                                float scale,
                                float stroke_thickness) {
-  // TODO(pkasting): Fix this to work better with stroke heights > 0.
+  const gfx::RectF aligned_bounds =
+      ScaleAndAlignBounds(bounds, scale, stroke_thickness);
 
-  const float radius = GetTopCornerRadiusForWidth(bounds.width()) * scale;
+  stroke_thickness *= scale;
+
+  const float outer_radius = GetTopCornerRadiusForWidth(bounds.width()) * scale;
+  const float inner_radius = std::max(outer_radius - stroke_thickness, 0.f);
 
   // See comments in GetRefreshInteriorPath().
   const float extension = Tab::GetCornerRadius() * scale;
-  const float outer_radius = std::max(radius - stroke_thickness, 0.f);
-  const float inner_radius = radius * 2 - outer_radius;
   const float corner_gap = extension - outer_radius;
 
-  const gfx::RectF aligned_bounds = ScaleAndAlignBounds(bounds, scale);
   const float left = aligned_bounds.x();
   const float top = aligned_bounds.y();
   const float right = aligned_bounds.right();
@@ -369,9 +378,9 @@
   path.rLineTo(0, -bottom_extension);
   path.rLineTo(0, -stroke_thickness);
   path.rLineTo(corner_gap, 0);
-  path.arcTo(outer_radius, outer_radius, 0, SkPath::kSmall_ArcSize,
+  path.arcTo(inner_radius, inner_radius, 0, SkPath::kSmall_ArcSize,
              SkPath::kCCW_Direction, left + extension,
-             bottom - stroke_thickness - outer_radius);
+             bottom - stroke_thickness - inner_radius);
 
   if (extend_to_top) {
     // Left vertical.
@@ -381,27 +390,26 @@
     path.lineTo(right - extension, top);
   } else {
     // Left vertical.
-    path.lineTo(left + extension, top + inner_radius);
+    path.lineTo(left + extension, top + outer_radius);
 
     // Top left.
-    path.arcTo(inner_radius, inner_radius, 0, SkPath::kSmall_ArcSize,
-               SkPath::kCW_Direction, left + extension + inner_radius, top);
+    path.arcTo(outer_radius, outer_radius, 0, SkPath::kSmall_ArcSize,
+               SkPath::kCW_Direction, left + extension + outer_radius, top);
 
     // Top edge.
-    path.lineTo(right - extension - inner_radius, top);
+    path.lineTo(right - extension - outer_radius, top);
 
     // Top right.
-    path.arcTo(inner_radius, inner_radius, 0, SkPath::kSmall_ArcSize,
-               SkPath::kCW_Direction, right - extension, top + inner_radius);
+    path.arcTo(outer_radius, outer_radius, 0, SkPath::kSmall_ArcSize,
+               SkPath::kCW_Direction, right - extension, top + outer_radius);
   }
 
   // Right vertical.
-  path.lineTo(right - extension, bottom - stroke_thickness - outer_radius);
+  path.lineTo(right - extension, bottom - stroke_thickness - inner_radius);
 
   // Bottom right.
-  path.arcTo(outer_radius, outer_radius, 0, SkPath::kSmall_ArcSize,
-             SkPath::kCCW_Direction, right - corner_gap,
-             bottom - stroke_thickness);
+  path.arcTo(inner_radius, inner_radius, 0, SkPath::kSmall_ArcSize,
+             SkPath::kCCW_Direction, right, bottom - stroke_thickness);
   path.rLineTo(corner_gap, 0);
   path.rLineTo(0, stroke_thickness);
   path.rLineTo(0, bottom_extension);
@@ -424,11 +432,10 @@
 // tab bounds.  The caller uses this for Fitts' Law purposes in
 // maximized/fullscreen mode.
 gfx::Path GetBorderPath(float scale,
+                        float stroke_thickness,
                         bool unscale_at_end,
                         bool extend_to_top,
                         const gfx::Rect& bounds) {
-  const float stroke_thickness = Tab::GetStrokeHeight();
-
   gfx::Path path;
   if (MD::IsRefreshUi()) {
     path = GetRefreshBorderPath(bounds, extend_to_top, scale, stroke_thickness);
@@ -610,8 +617,9 @@
   // edge of the screen to select a tab. Ditto for immersive fullscreen.
   const views::Widget* widget = GetWidget();
   *mask = GetBorderPath(
-      GetWidget()->GetCompositor()->device_scale_factor(), true,
-      widget && (widget->IsMaximized() || widget->IsFullscreen()), bounds());
+      GetWidget()->GetCompositor()->device_scale_factor(), GetStrokeThickness(),
+      true, widget && (widget->IsMaximized() || widget->IsFullscreen()),
+      bounds());
   return true;
 }
 
@@ -943,8 +951,9 @@
   constexpr float kChildClipPadding = 2.5f;
   const gfx::InsetsF padding(0, kChildClipPadding + opacities.left, 0,
                              kChildClipPadding + opacities.right);
-  clip_recorder.ClipPathWithAntiAliasing(
-      GetInteriorPath(paint_recording_scale, bounds(), padding));
+  clip_recorder.ClipPathWithAntiAliasing(GetInteriorPath(
+      paint_recording_scale, paint_recording_scale * GetStrokeThickness(),
+      bounds(), padding));
   View::PaintChildren(info);
 }
 
@@ -957,8 +966,8 @@
   gfx::Path clip;
   if (!controller_->ShouldPaintTab(
           this,
-          base::BindRepeating(&GetBorderPath, canvas->image_scale(), true,
-                              false),
+          base::BindRepeating(&GetBorderPath, canvas->image_scale(),
+                              GetStrokeThickness(), true, false),
           &clip))
     return;
 
@@ -1122,6 +1131,12 @@
   SchedulePaint();
 }
 
+float Tab::GetStrokeThickness(bool should_paint_as_active) const {
+  return !MD::IsRefreshUi() || IsActive() || should_paint_as_active
+             ? controller_->GetStrokeThickness()
+             : 0;
+}
+
 int Tab::GetWidthOfLargestSelectableRegion() const {
   // Assume the entire region to the left of the alert indicator and/or close
   // buttons is available for click-to-select.  If neither are visible, the
@@ -1134,10 +1149,24 @@
   return std::min(indicator_left, close_button_left);
 }
 
+gfx::Insets Tab::GetContentsInsets() const {
+  const float stroke_thickness = GetStrokeThickness();
+  return GetContentsHorizontalInsets() +
+         gfx::Insets(
+             stroke_thickness, 0,
+             stroke_thickness + GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP), 0);
+}
+
+// static
+gfx::Insets Tab::GetContentsHorizontalInsets() {
+  return gfx::Insets(0, MD::IsRefreshUi() ? (GetCornerRadius() * 2)
+                                          : GetTabEndcapWidthForLayout());
+}
+
 // static
 int Tab::GetMinimumInactiveWidth() {
   if (!MD::IsRefreshUi())
-    return GetContentsInsets().width();
+    return GetContentsHorizontalInsets().width();
 
   // Allow tabs to shrink until they appear to be 16 DIP wide excluding outer
   // corners.
@@ -1149,7 +1178,7 @@
 
 // static
 int Tab::GetMinimumActiveWidth() {
-  return TabCloseButton::GetWidth() + GetContentsInsets().width();
+  return TabCloseButton::GetWidth() + GetContentsHorizontalInsets().width();
 }
 
 // static
@@ -1163,12 +1192,7 @@
 // static
 int Tab::GetPinnedWidth() {
   constexpr int kTabPinnedContentWidth = 23;
-  return kTabPinnedContentWidth + GetContentsInsets().width();
-}
-
-// static
-int Tab::GetStrokeHeight() {
-  return TabStrip::ShouldDrawStrokes() ? 1 : 0;
+  return kTabPinnedContentWidth + GetContentsHorizontalInsets().width();
 }
 
 // static
@@ -1197,16 +1221,6 @@
 }
 
 // static
-gfx::Insets Tab::GetContentsInsets() {
-  const int endcap_width = MD::IsRefreshUi() ? (GetCornerRadius() * 2)
-                                             : GetTabEndcapWidthForLayout();
-  return gfx::Insets(
-      GetStrokeHeight(), endcap_width,
-      GetStrokeHeight() + GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP),
-      endcap_width);
-}
-
-// static
 int Tab::GetDragInset() {
   return MD::IsRefreshUi() ? GetCornerRadius() : GetTabEndcapWidthForLayout();
 }
@@ -1246,7 +1260,7 @@
   int active_tab_y_inset = 0;
   if (GetThemeProvider()->HasCustomImage(IDR_THEME_TOOLBAR)) {
     active_tab_fill_id = IDR_THEME_TOOLBAR;
-    active_tab_y_inset = GetStrokeHeight();
+    active_tab_y_inset = GetStrokeThickness(true);
   }
 
   if (IsActive()) {
@@ -1304,13 +1318,15 @@
   // tabs draw with slightly different offsets so as to pixel-align the layout
   // rect (see ScaleAndAlignBounds()).
   const float scale = canvas->image_scale();
+  const float stroke_thickness = GetStrokeThickness(active);
   if (fill_id || paint_hover_effect ||
       (MD::IsRefreshUi() && (std::trunc(scale) != scale))) {
-    gfx::Path fill_path = GetInteriorPath(scale, bounds());
+    gfx::Path fill_path = GetInteriorPath(scale, stroke_thickness, bounds());
     PaintTabBackgroundFill(canvas, fill_path, active, paint_hover_effect,
                            active_color, inactive_color, fill_id, y_inset);
-    if (TabStrip::ShouldDrawStrokes()) {
-      gfx::Path stroke_path = GetBorderPath(scale, false, false, bounds());
+    if (stroke_thickness > 0) {
+      gfx::Path stroke_path =
+          GetBorderPath(scale, stroke_thickness, false, false, bounds());
       gfx::ScopedCanvas scoped_canvas(clip ? canvas : nullptr);
       if (clip)
         canvas->sk_canvas()->clipPath(*clip, SkClipOp::kDifference, true);
@@ -1321,9 +1337,10 @@
     BackgroundCache& cache =
         active ? background_active_cache_ : background_inactive_cache_;
     if (!cache.CacheKeyMatches(scale, size(), active_color, inactive_color,
-                               stroke_color)) {
-      gfx::Path fill_path = GetInteriorPath(scale, bounds());
-      gfx::Path stroke_path = GetBorderPath(scale, false, false, bounds());
+                               stroke_color, stroke_thickness)) {
+      gfx::Path fill_path = GetInteriorPath(scale, stroke_thickness, bounds());
+      gfx::Path stroke_path =
+          GetBorderPath(scale, stroke_thickness, false, false, bounds());
       cc::PaintRecorder recorder;
 
       {
@@ -1334,7 +1351,7 @@
                                fill_id, y_inset);
         cache.fill_record = recorder.finishRecordingAsPicture();
       }
-      if (TabStrip::ShouldDrawStrokes()) {
+      if (stroke_thickness > 0) {
         gfx::Canvas cache_canvas(
             recorder.beginRecording(size().width(), size().height()), scale);
         PaintTabBackgroundStroke(&cache_canvas, fill_path, stroke_path, active,
@@ -1343,11 +1360,11 @@
       }
 
       cache.SetCacheKey(scale, size(), active_color, inactive_color,
-                        stroke_color);
+                        stroke_color, stroke_thickness);
     }
 
     canvas->sk_canvas()->drawPicture(cache.fill_record);
-    if (TabStrip::ShouldDrawStrokes()) {
+    if (stroke_thickness > 0) {
       gfx::ScopedCanvas scoped_canvas(clip ? canvas : nullptr);
       if (clip)
         canvas->sk_canvas()->clipPath(*clip, SkClipOp::kDifference, true);
@@ -1423,7 +1440,8 @@
   gfx::ScopedCanvas scoped_canvas(canvas);
   const float scale = canvas->UndoDeviceScaleFactor();
 
-  const gfx::RectF aligned_bounds = ScaleAndAlignBounds(bounds(), scale);
+  const gfx::RectF aligned_bounds =
+      ScaleAndAlignBounds(bounds(), scale, GetStrokeThickness());
   const int corner_radius = GetCornerRadius();
   const float separator_height = GetTabSeparatorHeight() * scale;
   gfx::RectF leading_separator_bounds(
diff --git a/chrome/browser/ui/views/tabs/tab.h b/chrome/browser/ui/views/tabs/tab.h
index 200f69af..8068e7a 100644
--- a/chrome/browser/ui/views/tabs/tab.h
+++ b/chrome/browser/ui/views/tabs/tab.h
@@ -174,10 +174,22 @@
 
   bool mouse_hovered() const { return mouse_hovered_; }
 
+  // Returns the thickness of the stroke drawn around the tab.  If
+  // |should_paint_as_active| is true, the tab is treated as an active tab
+  // regardless of its true current state; this affects Refresh, which never
+  // paints strokes on inactive tabs.
+  float GetStrokeThickness(bool should_paint_as_active = false) const;
+
   // Returns the width of the largest part of the tab that is available for the
   // user to click to select/activate the tab.
   int GetWidthOfLargestSelectableRegion() const;
 
+  // Returns the insets to use for laying out tab contents.
+  gfx::Insets GetContentsInsets() const;
+
+  // Returns the horizontal insets to use for laying out tab contents.
+  static gfx::Insets GetContentsHorizontalInsets();
+
   // Returns the minimum possible width of a single unselected Tab.
   static int GetMinimumInactiveWidth();
 
@@ -193,10 +205,6 @@
   // Returns the width for pinned tabs. Pinned tabs always have this width.
   static int GetPinnedWidth();
 
-  // Returns the height of any area reserved for a stroke at the top and bottom
-  // of the tab, in DIP.
-  static int GetStrokeHeight();
-
   // Returns the height of the separator between tabs.
   static int GetTabSeparatorHeight();
 
@@ -212,9 +220,6 @@
   // Returns the radius of the outer corners of the tab shape.
   static int GetCornerRadius();
 
-  // Returns the insets to use for laying out tab contents.
-  static gfx::Insets GetContentsInsets();
-
   // Returns an offset into the leading edge of the tab which delineates the
   // "main body" of the tab from the user's perspective; dragging based on this
   // point feels better than dragging based on the tab's actual leading edge.
@@ -387,22 +392,27 @@
                          const gfx::Size& size,
                          SkColor active_color,
                          SkColor inactive_color,
-                         SkColor stroke_color) {
+                         SkColor stroke_color,
+                         float stroke_thickness) {
       return scale_ == scale && size_ == size &&
              active_color_ == active_color &&
-             inactive_color_ == inactive_color && stroke_color_ == stroke_color;
+             inactive_color_ == inactive_color &&
+             stroke_color_ == stroke_color &&
+             stroke_thickness_ == stroke_thickness;
     }
 
     void SetCacheKey(float scale,
                      const gfx::Size& size,
                      SkColor active_color,
                      SkColor inactive_color,
-                     SkColor stroke_color) {
+                     SkColor stroke_color,
+                     float stroke_thickness) {
       scale_ = scale;
       size_ = size;
       active_color_ = active_color;
       inactive_color_ = inactive_color;
       stroke_color_ = stroke_color;
+      stroke_thickness_ = stroke_thickness;
     }
 
     // The PaintRecords being cached based on the input parameters.
@@ -416,6 +426,12 @@
     SkColor active_color_ = 0;
     SkColor inactive_color_ = 0;
     SkColor stroke_color_ = 0;
+
+    // The stroke thickness needs to be recorded because tabs may switch between
+    // a zero and non-zero stroke thickness depending on their state.  This
+    // changes the "stroke_thickness > 0" logic in tab.cc which changes if
+    // |stroke_record| gets recorded.
+    float stroke_thickness_ = 0.f;
   };
 
   // Cache of the paint output for tab backgrounds.
diff --git a/chrome/browser/ui/views/tabs/tab_controller.h b/chrome/browser/ui/views/tabs/tab_controller.h
index 53dc1fc..b2d1753 100644
--- a/chrome/browser/ui/views/tabs/tab_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_controller.h
@@ -132,6 +132,10 @@
           border_callback,
       gfx::Path* clip) = 0;
 
+  // Returns the thickness of the stroke around all tabs (for pre-refresh) or
+  // the active tab (for refresh) in DIP.  Returns 0 if there is no stroke.
+  virtual int GetStrokeThickness() const = 0;
+
   // Returns true if tab loading throbbers can be painted to a composited layer.
   // This can only be done when the TabController can guarantee that nothing
   // in the same window will redraw on top of the the favicon area of any tab.
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc
index 3e563dc..ed07e0a 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -302,11 +302,6 @@
 }
 
 // static
-bool TabStrip::ShouldDrawStrokes() {
-  return !MD::IsRefreshUi();
-}
-
-// static
 int TabStrip::GetPinnedToNonPinnedOffset() {
   return MD::IsRefreshUi() ? 0 : kPinnedToNonPinnedOffset;
 }
@@ -852,6 +847,17 @@
     DoLayout();
 }
 
+bool TabStrip::ShouldDrawStrokes() const {
+  if (!MD::IsRefreshUi())
+    return true;
+
+  // Refresh normally avoids strokes and relies on the active tab contrasting
+  // sufficiently with the frame background.  When there isn't enough contrast,
+  // fall back to a stroke.
+  return color_utils::GetContrastRatio(GetTabBackgroundColor(TAB_ACTIVE),
+                                       controller_->GetFrameColor()) < 1.3;
+}
+
 const ui::ListSelectionModel& TabStrip::GetSelectionModel() const {
   return controller_->GetSelectionModel();
 }
@@ -1137,6 +1143,10 @@
   return true;
 }
 
+int TabStrip::GetStrokeThickness() const {
+  return ShouldDrawStrokes() ? 1 : 0;
+}
+
 bool TabStrip::CanPaintThrobberToLayer() const {
   // Disable layer-painting of throbbers if dragging, if any tab animation is in
   // progress, or if stacked tabs are enabled. Also disable in fullscreen: when
@@ -1341,8 +1351,8 @@
           gfx::RectToSkRect(active_tab->GetMirroredBounds()),
           SkClipOp::kDifference);
     }
-    BrowserView::Paint1pxHorizontalLine(canvas, GetToolbarTopSeparatorColor(),
-                                        GetLocalBounds(), true);
+    BrowserView::PaintToolbarTopSeparator(canvas, GetToolbarTopSeparatorColor(),
+                                          GetLocalBounds());
   }
 }
 
diff --git a/chrome/browser/ui/views/tabs/tab_strip.h b/chrome/browser/ui/views/tabs/tab_strip.h
index b4519df..0554dbbb 100644
--- a/chrome/browser/ui/views/tabs/tab_strip.h
+++ b/chrome/browser/ui/views/tabs/tab_strip.h
@@ -67,9 +67,6 @@
   explicit TabStrip(std::unique_ptr<TabStripController> controller);
   ~TabStrip() override;
 
-  // Returns whether or not strokes should be drawn around and under the tabs.
-  static bool ShouldDrawStrokes();
-
   // Returns the gap size between the pinned tabs and the non-pinned tabs.
   static int GetPinnedToNonPinnedOffset();
 
@@ -218,6 +215,9 @@
   // ongoing this does a layout.
   void StopAnimating(bool layout);
 
+  // Returns whether or not strokes should be drawn around and under the tabs.
+  bool ShouldDrawStrokes() const;
+
   // TabController:
   const ui::ListSelectionModel& GetSelectionModel() const override;
   bool SupportsMultipleSelection() override;
@@ -256,6 +256,7 @@
       const base::RepeatingCallback<gfx::Path(const gfx::Rect&)>&
           border_callback,
       gfx::Path* clip) override;
+  int GetStrokeThickness() const override;
   bool CanPaintThrobberToLayer() const override;
   SkColor GetToolbarTopSeparatorColor() const override;
   SkColor GetTabSeparatorColor() const override;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_controller.h b/chrome/browser/ui/views/tabs/tab_strip_controller.h
index 417d302..c64cf0d 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_controller.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_controller.h
@@ -116,6 +116,10 @@
   // from this tabstrip but the user is still dragging the tabs.
   virtual void OnStoppedDraggingTabs() = 0;
 
+  // Returns the color of the browser frame, which is also the color of the
+  // tabstrip background.
+  virtual SkColor GetFrameColor() const = 0;
+
   // Returns COLOR_TOOLBAR_TOP_SEPARATOR[,_INACTIVE] depending on the activation
   // state of the window.
   virtual SkColor GetToolbarTopSeparatorColor() const = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc
index ade807b9..44eba68c 100644
--- a/chrome/browser/ui/views/tabs/tab_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -80,6 +80,7 @@
       gfx::Path* clip) override {
     return true;
   }
+  int GetStrokeThickness() const override { return 0; }
   bool CanPaintThrobberToLayer() const override {
     return paint_throbber_to_layer_;
   }
@@ -602,7 +603,7 @@
   controller.set_active_tab(false);
   Tab tab(&controller, nullptr);
   widget.GetContentsView()->AddChildView(&tab);
-  const int width = Tab::GetContentsInsets().width() +
+  const int width = Tab::GetContentsHorizontalInsets().width() +
                     Tab::kMinimumContentsWidthForCloseButtons;
   tab.SetBounds(0, 0, width, 50);
   const views::View* close = GetCloseButton(tab);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index a3f89214..8a3ec440 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -35,6 +35,7 @@
 #include "chrome/browser/ui/views/extensions/extension_popup.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/location_bar/star_view.h"
+#include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/browser/ui/views/toolbar/browser_actions_container.h"
 #include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h"
 #include "chrome/browser/ui/views/toolbar/home_button.h"
@@ -618,7 +619,7 @@
         GetMirroredX() + browser_view_->GetMirroredX() +
         browser_view_->frame()->GetFrameView()->GetThemeBackgroundXInset();
     const int y_offset = GetLayoutConstant(TAB_HEIGHT) -
-                         Tab::GetStrokeHeight() -
+                         browser_view_->tabstrip()->GetStrokeThickness() -
                          GetLayoutConstant(TABSTRIP_TOOLBAR_OVERLAP);
     canvas->TileImageInt(*tp->GetImageSkiaNamed(IDR_THEME_TOOLBAR), x_offset,
                          y_offset, 0, 0, width(), height());
diff --git a/chrome/browser/ui/webui/about_ui.cc b/chrome/browser/ui/webui/about_ui.cc
index 66c1e084..0496388b 100644
--- a/chrome/browser/ui/webui/about_ui.cc
+++ b/chrome/browser/ui/webui/about_ui.cc
@@ -31,7 +31,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
diff --git a/chrome/browser/ui/webui/browsing_history_handler_unittest.cc b/chrome/browser/ui/webui/browsing_history_handler_unittest.cc
index 94a73fcdb..e73ade2e 100644
--- a/chrome/browser/ui/webui/browsing_history_handler_unittest.cc
+++ b/chrome/browser/ui/webui/browsing_history_handler_unittest.cc
@@ -61,9 +61,9 @@
   explicit TestSyncService(Profile* profile)
       : browser_sync::TestProfileSyncService(
             CreateProfileSyncServiceParamsForTest(profile)),
-        state_(State::ACTIVE) {}
+        state_(TransportState::ACTIVE) {}
 
-  State GetState() const override { return state_; }
+  TransportState GetTransportState() const override { return state_; }
 
   int GetDisableReasons() const override { return DISABLE_REASON_NONE; }
 
@@ -73,13 +73,13 @@
     return syncer::ModelTypeSet::All();
   }
 
-  void SetState(State state) {
+  void SetTransportState(TransportState state) {
     state_ = state;
     NotifyObservers();
   }
 
  private:
-  State state_;
+  TransportState state_;
 
   DISALLOW_COPY_AND_ASSIGN(TestSyncService);
 };
@@ -173,7 +173,8 @@
   // BrowsingHistoryHandler is informed about WebHistoryService history
   // deletions.
   {
-    sync_service()->SetState(syncer::SyncService::State::ACTIVE);
+    sync_service()->SetTransportState(
+        syncer::SyncService::TransportState::ACTIVE);
     BrowsingHistoryHandlerWithWebUIForTesting handler(web_ui());
     handler.RegisterMessages();
 
@@ -188,10 +189,12 @@
   // BrowsingHistoryHandler will be informed about WebHistoryService deletions
   // even if history sync is activated later.
   {
-    sync_service()->SetState(syncer::SyncService::State::INITIALIZING);
+    sync_service()->SetTransportState(
+        syncer::SyncService::TransportState::INITIALIZING);
     BrowsingHistoryHandlerWithWebUIForTesting handler(web_ui());
     handler.RegisterMessages();
-    sync_service()->SetState(syncer::SyncService::State::ACTIVE);
+    sync_service()->SetTransportState(
+        syncer::SyncService::TransportState::ACTIVE);
 
     web_history_service()->ExpireHistoryBetween(
         std::set<GURL>(), base::Time(), base::Time::Max(), callback,
@@ -204,7 +207,8 @@
   // BrowsingHistoryHandler does not fire historyDeleted while a web history
   // delete request is happening.
   {
-    sync_service()->SetState(syncer::SyncService::State::ACTIVE);
+    sync_service()->SetTransportState(
+        syncer::SyncService::TransportState::ACTIVE);
     BrowsingHistoryHandlerWithWebUIForTesting handler(web_ui());
     handler.RegisterMessages();
 
@@ -226,7 +230,8 @@
   // deletions. The WebHistoryService object still exists (because it's a
   // BrowserContextKeyedService), but is not visible to BrowsingHistoryHandler.
   {
-    sync_service()->SetState(syncer::SyncService::State::INITIALIZING);
+    sync_service()->SetTransportState(
+        syncer::SyncService::TransportState::INITIALIZING);
     BrowsingHistoryHandlerWithWebUIForTesting handler(web_ui());
     handler.RegisterMessages();
 
diff --git a/chrome/browser/ui/webui/certificates_handler.cc b/chrome/browser/ui/webui/certificates_handler.cc
index 2870885..ee0188b 100644
--- a/chrome/browser/ui/webui/certificates_handler.cc
+++ b/chrome/browser/ui/webui/certificates_handler.cc
@@ -21,8 +21,8 @@
 #include "base/posix/safe_strerror.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
index 3b8b464c..4b6af57 100644
--- a/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/drive_internals_ui.cc
@@ -19,7 +19,7 @@
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/chromeos/drive/debug_info_collector.h"
 #include "chrome/browser/chromeos/drive/drive_integration_service.h"
 #include "chrome/browser/chromeos/drive/file_system_util.h"
diff --git a/chrome/browser/ui/webui/chromeos/image_source.cc b/chrome/browser/ui/webui/chromeos/image_source.cc
index a2d124c..9145713 100644
--- a/chrome/browser/ui/webui/chromeos/image_source.cc
+++ b/chrome/browser/ui/webui/chromeos/image_source.cc
@@ -15,8 +15,8 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/chromeos/login/users/avatar/user_image_loader.h"
 #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
index dfd1bba9..c5b5f838 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.cc
@@ -4,13 +4,9 @@
 
 #include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
 
-#include "base/command_line.h"
-#include "base/values.h"
 #include "chrome/browser/chromeos/login/oobe_screen.h"
 #include "chrome/browser/chromeos/login/screens/demo_setup_screen.h"
-#include "chrome/browser/chromeos/login/wizard_controller.h"
 #include "chrome/grit/generated_resources.h"
-#include "chromeos/chromeos_switches.h"
 #include "components/login/localized_values_builder.h"
 
 namespace {
@@ -61,12 +57,4 @@
                IDS_OOBE_DEMO_SETUP_ERROR_SCREEN_RETRY_BUTTON_LABEL);
 }
 
-void DemoSetupScreenHandler::GetAdditionalParameters(
-    base::DictionaryValue* dict) {
-  const bool is_offline_demo_mode_enabled =
-      base::CommandLine::ForCurrentProcess()->HasSwitch(
-          switches::kEnableOfflineDemoMode);
-  dict->SetBoolean("offlineDemoModeEnabled", is_offline_demo_mode_enabled);
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
index 2acc8e0..46c6c14e 100644
--- a/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h
@@ -30,7 +30,6 @@
   void Initialize() override;
   void DeclareLocalizedValues(
       ::login::LocalizedValuesBuilder* builder) override;
-  void GetAdditionalParameters(base::DictionaryValue* dict) override;
 
  private:
   DemoSetupScreen* screen_ = nullptr;
diff --git a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
index dba28ff..f217e67 100644
--- a/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/encryption_migration_screen_handler.cc
@@ -14,7 +14,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/tick_clock.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
index 87d6dec..de20a45 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -19,7 +19,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/language_preferences.h"
diff --git a/chrome/browser/ui/webui/chromeos/login/l10n_util.cc b/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
index b0964d67..9761fa5 100644
--- a/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
+++ b/chrome/browser/ui/webui/chromeos/login/l10n_util.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.h b/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.h
index 5e68078..4a21bba 100644
--- a/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.h
+++ b/chrome/browser/ui/webui/chromeos/sys_internals/sys_internals_message_handler.h
@@ -9,7 +9,7 @@
 
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "content/public/browser/web_ui_message_handler.h"
 
diff --git a/chrome/browser/ui/webui/help/version_updater_win.cc b/chrome/browser/ui/webui/help/version_updater_win.cc
index a1d3cfa..f094833c 100644
--- a/chrome/browser/ui/webui/help/version_updater_win.cc
+++ b/chrome/browser/ui/webui/help/version_updater_win.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/webui/help/version_updater_win.h"
 
 #include "base/memory/weak_ptr.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/win/win_util.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/first_run/upgrade_util.h"
diff --git a/chrome/browser/ui/webui/nacl_ui.cc b/chrome/browser/ui/webui/nacl_ui.cc
index a6fde93..c4f9b9d653 100644
--- a/chrome/browser/ui/webui/nacl_ui.cc
+++ b/chrome/browser/ui/webui/nacl_ui.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
diff --git a/chrome/browser/ui/webui/policy_tool_ui_browsertest.cc b/chrome/browser/ui/webui/policy_tool_ui_browsertest.cc
index 6b04f9e0..24cbd0b 100644
--- a/chrome/browser/ui/webui/policy_tool_ui_browsertest.cc
+++ b/chrome/browser/ui/webui/policy_tool_ui_browsertest.cc
@@ -8,8 +8,8 @@
 #include "base/path_service.h"
 #include "base/strings/strcat.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
diff --git a/chrome/browser/ui/webui/policy_tool_ui_handler.cc b/chrome/browser/ui/webui/policy_tool_ui_handler.cc
index d6a96211..c1f1a36 100644
--- a/chrome/browser/ui/webui/policy_tool_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy_tool_ui_handler.cc
@@ -9,7 +9,7 @@
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/policy/schema_registry_service.h"
diff --git a/chrome/browser/ui/webui/policy_ui_handler.cc b/chrome/browser/ui/webui/policy_ui_handler.cc
index 56fe091..db5f1afe 100644
--- a/chrome/browser/ui/webui/policy_ui_handler.cc
+++ b/chrome/browser/ui/webui/policy_ui_handler.cc
@@ -18,8 +18,8 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string16.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
index fa96391..3cdb186 100644
--- a/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/extension_printer_handler.cc
@@ -13,7 +13,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/printing/pwg_raster_converter.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/print_preview/print_preview_utils.h"
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
index 23fc644e..9c5c7b9a 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_chromeos.cc
@@ -11,7 +11,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "chrome/browser/chromeos/printing/cups_print_job_manager.h"
 #include "chrome/browser/chromeos/printing/cups_print_job_manager_factory.h"
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
index 60da3a8..3e3353c 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -9,7 +9,7 @@
 
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/ui/webui/print_preview/print_preview_utils.h"
 #include "components/printing/common/printer_capabilities.h"
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
index e7ea6df..0130244 100644
--- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
@@ -13,7 +13,7 @@
 #include "base/i18n/file_util_icu.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
diff --git a/chrome/browser/ui/webui/print_preview/policy_settings.cc b/chrome/browser/ui/webui/print_preview/policy_settings.cc
new file mode 100644
index 0000000..d383a42
--- /dev/null
+++ b/chrome/browser/ui/webui/print_preview/policy_settings.cc
@@ -0,0 +1,19 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/webui/print_preview/policy_settings.h"
+
+#include "chrome/common/pref_names.h"
+#include "components/pref_registry/pref_registry_syncable.h"
+
+namespace printing {
+
+// static
+void PolicySettings::RegisterProfilePrefs(
+    user_prefs::PrefRegistrySyncable* registry) {
+  registry->RegisterIntegerPref(prefs::kPrintHeaderFooter,
+                                HeaderFooterEnforcement::kNotEnforced);
+}
+
+}  // namespace printing
diff --git a/chrome/browser/ui/webui/print_preview/policy_settings.h b/chrome/browser/ui/webui/print_preview/policy_settings.h
new file mode 100644
index 0000000..2cfc741
--- /dev/null
+++ b/chrome/browser/ui/webui/print_preview/policy_settings.h
@@ -0,0 +1,38 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_POLICY_SETTINGS_H_
+#define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_POLICY_SETTINGS_H_
+
+#include "base/macros.h"
+
+namespace user_prefs {
+class PrefRegistrySyncable;
+}
+
+namespace printing {
+
+// Possible enforcement modes for the 'printing.print_header_footer' pref.
+//
+// DO NOT change existing enum values, to ensure compatibility with old
+// pref/policy values.
+enum HeaderFooterEnforcement {
+  kNotEnforced = 0,
+  kForceDisable = 1,
+  kForceEnable = 2
+};
+
+// Registers the enterprise policy prefs that should be enforced in print
+// preview. These settings override other settings, and cannot be controlled by
+// the user.
+class PolicySettings {
+ public:
+  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
+
+  DISALLOW_IMPLICIT_CONSTRUCTORS(PolicySettings);
+};
+
+}  // namespace printing
+
+#endif  // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_POLICY_SETTINGS_H_
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
index 7ce766e..c576997 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -45,6 +45,7 @@
 #include "chrome/browser/ui/chrome_pages.h"
 #include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
 #include "chrome/browser/ui/webui/print_preview/pdf_printer_handler.h"
+#include "chrome/browser/ui/webui/print_preview/policy_settings.h"
 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
 #include "chrome/browser/ui/webui/print_preview/printer_handler.h"
 #include "chrome/browser/ui/webui/print_preview/sticky_settings.h"
@@ -262,6 +263,9 @@
 // Name of a dictionary field holding the default destination selection rules.
 const char kDefaultDestinationSelectionRules[] =
     "serializedDefaultDestinationSelectionRulesStr";
+// Name of a dictionary field holding the header/footer enterprise policy, if
+// any.
+const char kForceEnableHeaderFooter[] = "forceEnableHeaderFooter";
 
 // Get the print job settings dictionary from |json_str|. Returns NULL on
 // failure.
@@ -411,6 +415,18 @@
   return g_sticky_settings.Pointer();
 }
 
+base::Optional<bool> GetHeaderFooterPolicy(const PrefService* prefs) {
+  const int enforcement = prefs->GetInteger(prefs::kPrintHeaderFooter);
+  switch (enforcement) {
+    case printing::HeaderFooterEnforcement::kForceEnable:
+      return true;
+    case printing::HeaderFooterEnforcement::kForceDisable:
+      return false;
+    default:
+      return base::nullopt;
+  }
+}
+
 }  // namespace
 
 class PrintPreviewHandler::AccessTokenService
@@ -599,6 +615,12 @@
   return web_ui()->GetWebContents();
 }
 
+PrefService* PrintPreviewHandler::GetPrefs() const {
+  return Profile::FromBrowserContext(
+             preview_web_contents()->GetBrowserContext())
+      ->GetPrefs();
+}
+
 PrintPreviewUI* PrintPreviewHandler::print_preview_ui() const {
   return static_cast<PrintPreviewUI*>(web_ui()->GetController());
 }
@@ -869,8 +891,7 @@
   printing::StickySettings* sticky_settings = GetStickySettings();
   if (args->GetString(0, &data_to_save) && !data_to_save.empty())
     sticky_settings->StoreAppState(data_to_save);
-  sticky_settings->SaveInPrefs(Profile::FromBrowserContext(
-      preview_web_contents()->GetBrowserContext())->GetPrefs());
+  sticky_settings->SaveInPrefs(GetPrefs());
 }
 
 // |args| is expected to contain a string with representing the callback id
@@ -1025,8 +1046,7 @@
                               print_preview_ui()->source_has_selection());
   initial_settings.SetBoolean(printing::kSettingShouldPrintSelectionOnly,
                               print_preview_ui()->print_selection_only());
-  PrefService* prefs = Profile::FromBrowserContext(
-      preview_web_contents()->GetBrowserContext())->GetPrefs();
+  PrefService* prefs = GetPrefs();
   printing::StickySettings* sticky_settings = GetStickySettings();
   sticky_settings->RestoreFromPrefs(prefs);
   if (sticky_settings->printer_app_state()) {
@@ -1036,6 +1056,11 @@
     initial_settings.SetKey(kAppState, base::Value());
   }
 
+  base::Optional<bool> policy = GetHeaderFooterPolicy(prefs);
+  if (policy) {
+    initial_settings.SetBoolean(kForceEnableHeaderFooter, policy.value());
+  }
+
   base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess();
   initial_settings.SetBoolean(kIsInKioskAutoPrintMode,
                               cmdline->HasSwitch(switches::kKioskModePrinting));
@@ -1110,9 +1135,7 @@
 }
 
 void PrintPreviewHandler::SendCloudPrintEnabled() {
-  Profile* profile = Profile::FromBrowserContext(
-      preview_web_contents()->GetBrowserContext());
-  PrefService* prefs = profile->GetPrefs();
+  PrefService* prefs = GetPrefs();
   if (prefs->GetBoolean(prefs::kCloudPrintSubmitEnabled) &&
       !base::FeatureList::IsEnabled(features::kCloudPrinterHandler)) {
     FireWebUIListener(
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.h b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
index a6b34ca..aed9afb3 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler.h
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.h
@@ -144,7 +144,13 @@
   FRIEND_TEST_ALL_PREFIXES(PrintPreviewPdfGeneratedBrowserTest,
                            MANUAL_DummyTest);
   friend class PrintPreviewHandlerTest;
-  FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, InitialSettings);
+  FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, InitialSettingsSimple);
+  FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+                           InitialSettingsDontEnforceHeaderFooter);
+  FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+                           InitialSettingsForceHeaderFooter);
+  FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest,
+                           InitialSettingsForceNoHeaderFooter);
   FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, GetPrinters);
   FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, GetPrinterCapabilities);
   FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, Print);
@@ -156,6 +162,8 @@
 
   PrintPreviewUI* print_preview_ui() const;
 
+  PrefService* GetPrefs() const;
+
   // Whether the the handler should be receiving messages from the renderer to
   // forward to the Print Preview JS in response to preview request with id
   // |request_id|. Kills the renderer if the handler should not be receiving
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
index 7e4bffc..e1b41665 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -10,6 +10,7 @@
 
 #include "base/base64.h"
 #include "base/containers/flat_set.h"
+#include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/string16.h"
@@ -18,10 +19,14 @@
 #include "base/values.h"
 #include "chrome/browser/printing/print_test_utils.h"
 #include "chrome/browser/printing/print_view_manager.h"
+#include "chrome/browser/ui/webui/print_preview/policy_settings.h"
 #include "chrome/browser/ui/webui/print_preview/print_preview_ui.h"
 #include "chrome/browser/ui/webui/print_preview/printer_handler.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/prefs/pref_service.h"
 #include "components/printing/common/print_messages.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_ui_controller.h"
@@ -318,14 +323,16 @@
 
   // Validates the initial settings structure in the response matches the
   // print_preview.NativeInitialSettings type in
-  // chrome/browser/resources/print_preview/native_layer.js. Checks that
-  // |default_printer_name| is the printer name returned and that
-  // |initiator_title| is the initiator title returned and validates that
-  // delimeters are correct for "en" locale (set in Initialize()). Assumes
-  // "test-callback-id-0" was used as the callback id.
+  // chrome/browser/resources/print_preview/native_layer.js. Checks that:
+  //   - |default_printer_name| is the printer name returned
+  //   - |initiator_title| is the initiator title returned
+  //   - |policy| is the header/footer policy returned
+  // Also validates that delimeters are correct for "en" locale (set in
+  // Initialize()).  Assumes "test-callback-id-0" was used as the callback id.
   void ValidateInitialSettings(const content::TestWebUI::CallData& data,
                                const std::string& default_printer_name,
-                               const std::string& initiator_title) {
+                               const std::string& initiator_title,
+                               printing::HeaderFooterEnforcement policy) {
     CheckWebUIResponse(data, "test-callback-id-0", true);
     const base::Value* settings = data.arg3();
     ASSERT_TRUE(settings->FindKeyOfType("isInKioskAutoPrintMode",
@@ -358,6 +365,22 @@
         settings->FindKeyOfType("printerName", base::Value::Type::STRING);
     ASSERT_TRUE(printer);
     EXPECT_EQ(default_printer_name, printer->GetString());
+
+    const base::Value* force = settings->FindKeyOfType(
+        "forceEnableHeaderFooter", base::Value::Type::BOOLEAN);
+    switch (policy) {
+      case printing::HeaderFooterEnforcement::kNotEnforced:
+        EXPECT_FALSE(force);
+        break;
+      case printing::HeaderFooterEnforcement::kForceEnable:
+        ASSERT_TRUE(force);
+        EXPECT_TRUE(force->GetBool());
+        break;
+      case printing::HeaderFooterEnforcement::kForceDisable:
+        ASSERT_TRUE(force);
+        EXPECT_FALSE(force->GetBool());
+        break;
+    }
   }
 
   IPC::TestSink& initiator_sink() {
@@ -385,6 +408,7 @@
   }
 
   const Profile* profile() { return profile_.get(); }
+  PrefService* prefs() { return profile_->GetPrefs(); }
   content::TestWebUI* web_ui() { return web_ui_.get(); }
   printing::TestPrintPreviewHandler* handler() { return handler_; }
   printing::TestPrinterHandler* printer_handler() { return printer_handler_; }
@@ -404,18 +428,52 @@
   DISALLOW_COPY_AND_ASSIGN(PrintPreviewHandlerTest);
 };
 
-TEST_F(PrintPreviewHandlerTest, InitialSettings) {
+TEST_F(PrintPreviewHandlerTest, InitialSettingsSimple) {
   Initialize();
 
   // Verify initial settings were sent.
   ValidateInitialSettings(*web_ui()->call_data().back(),
                           printing::kDummyPrinterName,
-                          printing::kDummyInitiatorName);
+                          printing::kDummyInitiatorName,
+                          printing::HeaderFooterEnforcement::kNotEnforced);
 
   // Check that the use-cloud-print event got sent
   AssertWebUIEventFired(*web_ui()->call_data().front(), "use-cloud-print");
 }
 
+TEST_F(PrintPreviewHandlerTest, InitialSettingsDontEnforceHeaderFooter) {
+  // Set a policy that should take priority over StickySettings.
+  prefs()->SetInteger(prefs::kPrintHeaderFooter,
+                      printing::HeaderFooterEnforcement::kNotEnforced);
+  Initialize();
+  ValidateInitialSettings(*web_ui()->call_data().back(),
+                          printing::kDummyPrinterName,
+                          printing::kDummyInitiatorName,
+                          printing::HeaderFooterEnforcement::kNotEnforced);
+}
+
+TEST_F(PrintPreviewHandlerTest, InitialSettingsForceHeaderFooter) {
+  // Set a policy that should take priority over StickySettings.
+  prefs()->SetInteger(prefs::kPrintHeaderFooter,
+                      printing::HeaderFooterEnforcement::kForceEnable);
+  Initialize();
+  ValidateInitialSettings(*web_ui()->call_data().back(),
+                          printing::kDummyPrinterName,
+                          printing::kDummyInitiatorName,
+                          printing::HeaderFooterEnforcement::kForceEnable);
+}
+
+TEST_F(PrintPreviewHandlerTest, InitialSettingsForceNoHeaderFooter) {
+  // Set a policy that should take priority over StickySettings.
+  prefs()->SetInteger(prefs::kPrintHeaderFooter,
+                      printing::HeaderFooterEnforcement::kForceDisable);
+  Initialize();
+  ValidateInitialSettings(*web_ui()->call_data().back(),
+                          printing::kDummyPrinterName,
+                          printing::kDummyInitiatorName,
+                          printing::HeaderFooterEnforcement::kForceDisable);
+}
+
 TEST_F(PrintPreviewHandlerTest, GetPrinters) {
   Initialize();
 
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 89d6450..6a9eb97 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -20,7 +20,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index b2f9d592..cb6f001 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -15,7 +15,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
index 2c2ef3d..cf29c54 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler.cc
@@ -11,7 +11,7 @@
 
 #include "base/files/file_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/browsing_data/browsing_data_appcache_helper.h"
 #include "chrome/browser/browsing_data/browsing_data_cache_storage_helper.h"
diff --git a/chrome/browser/ui/webui/settings/downloads_handler.cc b/chrome/browser/ui/webui/settings/downloads_handler.cc
index 4e45994..61d2128 100644
--- a/chrome/browser/ui/webui/settings/downloads_handler.cc
+++ b/chrome/browser/ui/webui/settings/downloads_handler.cc
@@ -18,6 +18,10 @@
 #include "content/public/browser/web_ui.h"
 #include "ui/base/l10n/l10n_util.h"
 
+#if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/file_manager/path_util.h"
+#endif
+
 using base::UserMetricsAction;
 
 namespace settings {
@@ -44,6 +48,12 @@
       "selectDownloadLocation",
       base::BindRepeating(&DownloadsHandler::HandleSelectDownloadLocation,
                           base::Unretained(this)));
+#if defined(OS_CHROMEOS)
+  web_ui()->RegisterMessageCallback(
+      "getDownloadLocationText",
+      base::BindRepeating(&DownloadsHandler::HandleGetDownloadLocationText,
+                          base::Unretained(this)));
+#endif
 }
 
 void DownloadsHandler::OnJavascriptAllowed() {
@@ -105,4 +115,20 @@
   pref_service->SetFilePath(prefs::kSaveFileDefaultDirectory, path);
 }
 
+#if defined(OS_CHROMEOS)
+void DownloadsHandler::HandleGetDownloadLocationText(
+    const base::ListValue* args) {
+  AllowJavascript();
+  CHECK_EQ(2U, args->GetSize());
+  std::string callback_id;
+  std::string path;
+  CHECK(args->GetString(0, &callback_id));
+  CHECK(args->GetString(1, &path));
+
+  ResolveJavascriptCallback(
+      base::Value(callback_id),
+      base::Value(file_manager::util::GetDownloadLocationText(profile_, path)));
+}
+#endif
+
 }  // namespace settings
diff --git a/chrome/browser/ui/webui/settings/downloads_handler.h b/chrome/browser/ui/webui/settings/downloads_handler.h
index 289cf74..5034556 100644
--- a/chrome/browser/ui/webui/settings/downloads_handler.h
+++ b/chrome/browser/ui/webui/settings/downloads_handler.h
@@ -51,6 +51,13 @@
                     int index,
                     void* params) override;
 
+#if defined(OS_CHROMEOS)
+  // Callback for the "getDownloadLocationText" message.  Converts actual
+  // paths in chromeos to values suitable to display to users.
+  // E.g. /home/chronos/u-<hash>/Downloads => "Downloads".
+  void HandleGetDownloadLocationText(const base::ListValue* args);
+#endif
+
   Profile* profile_;
 
   PrefChangeRegistrar pref_registrar_;
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
index c1c0f0c..b1287f6 100644
--- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -835,8 +835,6 @@
      IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_UNSUPPORTED_DEVICE_MESSAGE},
     {"smbShareAddedMountExistsMessage",
      IDS_SETTINGS_DOWNLOADS_SHARE_ADDED_MOUNT_EXISTS_MESSAGE},
-    {"downloadsAndroidFilesRootLabel",
-     IDS_FILE_BROWSER_ANDROID_FILES_ROOT_LABEL}
 #endif
   };
   AddLocalizedStringsBulk(html_source, localized_strings,
diff --git a/chrome/browser/ui/webui/settings/people_handler_unittest.cc b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
index 7355f1f..4bad29f5 100644
--- a/chrome/browser/ui/webui/settings/people_handler_unittest.cc
+++ b/chrome/browser/ui/webui/settings/people_handler_unittest.cc
@@ -253,8 +253,8 @@
     // An initialized ProfileSyncService will have already completed sync setup
     // and will have an initialized sync engine.
     ASSERT_TRUE(mock_signin_->IsInitialized());
-    ON_CALL(*mock_pss_, GetState())
-        .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+    ON_CALL(*mock_pss_, GetTransportState())
+        .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
   }
 
   void ExpectPageStatusResponse(const std::string& expected_status) {
@@ -397,8 +397,8 @@
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
   ON_CALL(*mock_pss_, IsFirstSetupComplete()).WillByDefault(Return(false));
   error_ = GoogleServiceAuthError::AuthErrorNone();
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::INITIALIZING));
   EXPECT_CALL(*mock_pss_, RequestStart());
 
   // We're simulating a user setting up sync, which would cause the engine to
@@ -424,9 +424,9 @@
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
   error_ = GoogleServiceAuthError::AuthErrorNone();
   // Sync engine is stopped initially, and will start up.
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(
-          Return(syncer::SyncService::State::WAITING_FOR_START_REQUEST));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(
+          syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST));
   EXPECT_CALL(*mock_pss_, RequestStart());
   SetDefaultExpectationsForConfigPage();
 
@@ -438,8 +438,8 @@
   Mock::VerifyAndClearExpectations(mock_pss_);
   // Now, act as if the ProfileSyncService has started up.
   SetDefaultExpectationsForConfigPage();
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
   error_ = GoogleServiceAuthError::AuthErrorNone();
   ON_CALL(*mock_pss_, GetAuthError()).WillByDefault(ReturnRef(error_));
   handler_->SyncStartupCompleted();
@@ -464,9 +464,9 @@
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
   ON_CALL(*mock_pss_, IsFirstSetupComplete()).WillByDefault(Return(false));
   error_ = GoogleServiceAuthError::AuthErrorNone();
-  EXPECT_CALL(*mock_pss_, GetState())
-      .WillOnce(Return(syncer::SyncService::State::INITIALIZING))
-      .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+  EXPECT_CALL(*mock_pss_, GetTransportState())
+      .WillOnce(Return(syncer::SyncService::TransportState::INITIALIZING))
+      .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
   EXPECT_CALL(*mock_pss_, RequestStart());
   SetDefaultExpectationsForConfigPage();
   handler_->HandleShowSetupUI(nullptr);
@@ -488,8 +488,8 @@
       .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
   ON_CALL(*mock_pss_, IsFirstSetupComplete()).WillByDefault(Return(false));
   error_ = GoogleServiceAuthError::AuthErrorNone();
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::INITIALIZING));
   EXPECT_CALL(*mock_pss_, RequestStart());
 
   handler_->HandleShowSetupUI(nullptr);
@@ -509,8 +509,8 @@
 // Tests that signals not related to user intention to configure sync don't
 // trigger sync engine start.
 TEST_F(PeopleHandlerTest, OnlyStartEngineWhenConfiguringSync) {
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::INITIALIZING));
   EXPECT_CALL(*mock_pss_, RequestStart()).Times(0);
   NotifySyncStateChanged();
 }
@@ -774,8 +774,8 @@
   ON_CALL(*mock_pss_, IsPassphraseRequired()).WillByDefault(Return(false));
   ON_CALL(*mock_pss_, IsUsingSecondaryPassphrase())
       .WillByDefault(Return(false));
-  ON_CALL(*mock_pss_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+  ON_CALL(*mock_pss_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::INITIALIZING));
 
 #if defined(OS_CHROMEOS)
   // On ChromeOS, auth errors are ignored - instead we just try to start the
diff --git a/chrome/browser/ui/webui/settings_utils_linux.cc b/chrome/browser/ui/webui/settings_utils_linux.cc
index 0dafa2f..45c9b3a1 100644
--- a/chrome/browser/ui/webui/settings_utils_linux.cc
+++ b/chrome/browser/ui/webui/settings_utils_linux.cc
@@ -11,7 +11,7 @@
 #include "base/files/file_util.h"
 #include "base/nix/xdg_util.h"
 #include "base/process/launch.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "chrome/browser/tab_contents/tab_util.h"
diff --git a/chrome/browser/ui/webui/settings_utils_win.cc b/chrome/browser/ui/webui/settings_utils_win.cc
index a9564371..46a7ca8 100644
--- a/chrome/browser/ui/webui/settings_utils_win.cc
+++ b/chrome/browser/ui/webui/settings_utils_win.cc
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
index 2d510d1..e756f45 100644
--- a/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
+++ b/chrome/browser/ui/webui/signin/dice_turn_sync_on_helper_unittest.cc
@@ -259,8 +259,8 @@
     EXPECT_CALL(*sync_service_mock, GetSetupInProgressHandle()).Times(1);
     ON_CALL(*sync_service_mock, GetDisableReasons())
         .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
-    ON_CALL(*sync_service_mock, GetState())
-        .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+    ON_CALL(*sync_service_mock, GetTransportState())
+        .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
   }
 
   void SetExpectationsForSyncStartupPending() {
@@ -269,8 +269,9 @@
     EXPECT_CALL(*sync_service_mock, GetSetupInProgressHandle()).Times(1);
     ON_CALL(*sync_service_mock, GetDisableReasons())
         .WillByDefault(Return(syncer::SyncService::DISABLE_REASON_NONE));
-    ON_CALL(*sync_service_mock, GetState())
-        .WillByDefault(Return(syncer::SyncService::State::INITIALIZING));
+    ON_CALL(*sync_service_mock, GetTransportState())
+        .WillByDefault(
+            Return(syncer::SyncService::TransportState::INITIALIZING));
     ON_CALL(*sync_service_mock, GetAuthError())
         .WillByDefault(ReturnRef(kNoAuthError));
   }
diff --git a/chrome/browser/ui/webui/signin/login_ui_service.cc b/chrome/browser/ui/webui/signin/login_ui_service.cc
index ae28c3e..4195b7f 100644
--- a/chrome/browser/ui/webui/signin/login_ui_service.cc
+++ b/chrome/browser/ui/webui/signin/login_ui_service.cc
@@ -77,6 +77,10 @@
     // signed out of Gmail).
     if (token_service->RefreshTokenHasError(
             signin_manager->GetAuthenticatedAccountId())) {
+      unified_consent::UnifiedConsentService* consent_service =
+          UnifiedConsentServiceFactory::GetForProfile(profile_);
+      consent_service->RecordConsentBumpSuppressReason(
+          unified_consent::ConsentBumpSuppressReason::kSyncPaused);
       return;
     }
 
@@ -112,7 +116,8 @@
     unified_consent::UnifiedConsentService* consent_service =
         UnifiedConsentServiceFactory::GetForProfile(profile_);
 
-    consent_service->MarkMigrationComplete();
+    consent_service->MarkMigrationComplete(
+        unified_consent::ConsentBumpSuppressReason::kNone);
 
     switch (result) {
       case LoginUIService::CONFIGURE_SYNC_FIRST:
diff --git a/chrome/browser/ui/webui/sync_internals_browsertest.js b/chrome/browser/ui/webui/sync_internals_browsertest.js
index 48eff41..51cf439a 100644
--- a/chrome/browser/ui/webui/sync_internals_browsertest.js
+++ b/chrome/browser/ui/webui/sync_internals_browsertest.js
@@ -261,20 +261,23 @@
 GEN('#if defined(OS_CHROMEOS)');
 TEST_F('SyncInternalsWebUITestWithStandaloneTransport', 'SignedIn', function() {
   assertNotEquals(null, chrome.sync.aboutInfo);
-  expectTrue(this.hasInDetails(true, 'Summary', 'Initializing'));
+  expectTrue(this.hasInDetails(true, 'Transport State', 'Initializing'));
+  expectTrue(this.hasInDetails(true, 'Disable Reasons', 'None'));
   expectTrue(this.hasInDetails(true, 'Username', 'stub-user@example.com'));
 });
 TEST_F(
     'SyncInternalsWebUITestWithoutStandaloneTransport', 'SignedIn', function() {
       assertNotEquals(null, chrome.sync.aboutInfo);
-      expectTrue(
-          this.hasInDetails(true, 'Summary', 'Waiting for start request'));
+      expectTrue(this.hasInDetails(
+          true, 'Transport State', 'Waiting for start request'));
+      expectTrue(this.hasInDetails(true, 'Disable Reasons', 'None'));
       expectTrue(this.hasInDetails(true, 'Username', 'stub-user@example.com'));
     });
 GEN('#else');
 TEST_F('SyncInternalsWebUITest', 'SignedOut', function() {
   assertNotEquals(null, chrome.sync.aboutInfo);
-  expectTrue(this.hasInDetails(true, 'Summary', 'Disabled (Not signed in)'));
+  expectTrue(this.hasInDetails(true, 'Transport State', 'Disabled'));
+  expectTrue(this.hasInDetails(true, 'Disable Reasons', 'Not signed in'));
   expectTrue(this.hasInDetails(true, 'Username', ''));
 });
 GEN('#endif  // defined(OS_CHROMEOS)');
diff --git a/chrome/browser/ui/webui/task_scheduler_internals/OWNERS b/chrome/browser/ui/webui/task_scheduler_internals/OWNERS
index ffc802c1..495a17c 100644
--- a/chrome/browser/ui/webui/task_scheduler_internals/OWNERS
+++ b/chrome/browser/ui/webui/task_scheduler_internals/OWNERS
@@ -1 +1 @@
-file://base/task_scheduler/OWNERS
+file://base/task/task_scheduler/OWNERS
diff --git a/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc b/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
index 79f4396f8..a00370d 100644
--- a/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
+++ b/chrome/browser/ui/webui/task_scheduler_internals/task_scheduler_internals_ui.cc
@@ -11,7 +11,7 @@
 #include "base/metrics/histogram_base.h"
 #include "base/metrics/histogram_samples.h"
 #include "base/numerics/safe_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/values.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/url_constants.h"
diff --git a/chrome/browser/ui/webui/version_handler.cc b/chrome/browser/ui/webui/version_handler.cc
index c48a0165..e9de3a8 100644
--- a/chrome/browser/ui/webui/version_handler.cc
+++ b/chrome/browser/ui/webui/version_handler.cc
@@ -12,7 +12,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "chrome/browser/plugins/plugin_prefs.h"
 #include "chrome/browser/profiles/profile.h"
diff --git a/chrome/browser/ui/webui/version_handler_chromeos.cc b/chrome/browser/ui/webui/version_handler_chromeos.cc
index 05cd31d5..c877fabe 100644
--- a/chrome/browser/ui/webui/version_handler_chromeos.cc
+++ b/chrome/browser/ui/webui/version_handler_chromeos.cc
@@ -5,7 +5,7 @@
 #include "chrome/browser/ui/webui/version_handler_chromeos.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/web_ui.h"
 
 VersionHandlerChromeOS::VersionHandlerChromeOS() : weak_factory_(this) {}
diff --git a/chrome/browser/upgrade_detector_impl.cc b/chrome/browser/upgrade_detector_impl.cc
index c202bf0..bd7dd30 100644
--- a/chrome/browser/upgrade_detector_impl.cc
+++ b/chrome/browser/upgrade_detector_impl.cc
@@ -19,8 +19,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/chrome/browser/vr/assets_loader.cc b/chrome/browser/vr/assets_loader.cc
index bc29da5d..3d59b26 100644
--- a/chrome/browser/vr/assets_loader.cc
+++ b/chrome/browser/vr/assets_loader.cc
@@ -7,8 +7,8 @@
 #include "base/files/file_util.h"
 #include "base/memory/singleton.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/browser/vr/metrics/metrics_helper.h"
diff --git a/chrome/browser/vr/test/vr_browser_tests.md b/chrome/browser/vr/test/vr_browser_tests.md
deleted file mode 100644
index 3301697..0000000
--- a/chrome/browser/vr/test/vr_browser_tests.md
+++ /dev/null
@@ -1,42 +0,0 @@
-# VR Browser Tests
-
-## Introduction
-
-This documentation concerns `vr_browser_test.h`, `vr_browser_test.cc`, and files
-that use them.
-
-These files port the framework used by VR instrumentation tests (located in
-`//chrome/android/javatests/src/org/chromium/chrome/browser/vr/` and
-documented in
-`//chrome/android/javatests/src/org/chromium/chrome/browser/vr/*.md`) for
-use in browser tests in order to test VR features on desktop platforms.
-
-This is pretty much a direct port, with the same JavaScript/HTML files being
-used for both and the Java/C++ code being functionally equivalent to each other,
-so the instrumentation test's documentation on writing tests using the framework
-is applicable here, too. As such, this documentation covers any notable
-differences between the two implementations.
-
-## Restrictions
-
-Both the instrumentation tests and browser tests have hardware/software
-restrictions - in the case of browser tests, VR is only supported on Windows 8
-and later (or Windows 7 with a non-standard patch applied) with a GPU that
-supports DirectX 11.1.
-
-Instrumentation tests handle restrictions with the `@Restriction` annotation,
-but browser tests don't have any equivalent functionality. Instead, test names
-should be wrapped in the REQUIRES_GPU macro defined in `vr_browser_test.h`,
-which simply disables the test by default. We then explicitly run tests that
-inherit from `VrBrowserTest` and enable the running of disabled tests on bots
-that meet the requirements.
-
-## Command Line Switches
-
-Instrumentation tests are able to add and remove command line switches on a
-per-test-case basis using `@CommandLine` annotations, but equivalent
-functionality does not exist in browser tests.
-
-Instead, if different command line flags are needed, a new class will need to
-be created that extends `VrBrowserTest` and overrides the flags that are set
-in its `SetUp` function.
\ No newline at end of file
diff --git a/chrome/browser/vr/test/webvr_browser_test.cc b/chrome/browser/vr/test/webvr_browser_test.cc
index 22d420f..0e1cca73 100644
--- a/chrome/browser/vr/test/webvr_browser_test.cc
+++ b/chrome/browser/vr/test/webvr_browser_test.cc
@@ -19,25 +19,25 @@
   // ExecuteScript runs with a user gesture, so we can just directly call
   // requestPresent instead of having to do the hacky workaround the
   // instrumentation tests use of actually sending a click event to the canvas.
-  EXPECT_TRUE(content::ExecuteScript(web_contents, "onVrRequestPresent()"));
+  RunJavaScriptOrFail("onVrRequestPresent()", web_contents);
 }
 
 void WebVrBrowserTestBase::EnterSessionWithUserGestureOrFail(
     content::WebContents* web_contents) {
   EnterSessionWithUserGesture(web_contents);
-  EXPECT_TRUE(PollJavaScriptBoolean("vrDisplay.isPresenting", kPollTimeoutLong,
-                                    web_contents));
+  PollJavaScriptBooleanOrFail("vrDisplay.isPresenting", kPollTimeoutLong,
+                              web_contents);
 }
 
 void WebVrBrowserTestBase::EndSession(content::WebContents* web_contents) {
-  EXPECT_TRUE(content::ExecuteScript(web_contents, "vrDisplay.exitPresent()"));
+  RunJavaScriptOrFail("vrDisplay.exitPresent()", web_contents);
 }
 
 void WebVrBrowserTestBase::EndSessionOrFail(
     content::WebContents* web_contents) {
   EndSession(web_contents);
-  EXPECT_TRUE(PollJavaScriptBoolean("vrDisplay.isPresenting == false",
-                                    kPollTimeoutLong, web_contents));
+  PollJavaScriptBooleanOrFail("vrDisplay.isPresenting == false",
+                              kPollTimeoutLong, web_contents);
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/test/webxr_browser_test.cc b/chrome/browser/vr/test/webxr_browser_test.cc
index 9441da2..d043b14 100644
--- a/chrome/browser/vr/test/webxr_browser_test.cc
+++ b/chrome/browser/vr/test/webxr_browser_test.cc
@@ -11,6 +11,12 @@
   return RunJavaScriptAndExtractBoolOrFail("xrDevice != null", web_contents);
 }
 
+void WebXrBrowserTestBase::EnterSessionWithUserGestureAndWait(
+    content::WebContents* web_contents) {
+  EnterSessionWithUserGesture(web_contents);
+  WaitOnJavaScriptStep(web_contents);
+}
+
 bool WebXrBrowserTestBase::XrDeviceFound() {
   return XrDeviceFound(GetFirstTabWebContents());
 }
@@ -19,12 +25,6 @@
   EnterSessionWithUserGesture(GetFirstTabWebContents());
 }
 
-void WebXrBrowserTestBase::EnterSessionWithUserGestureAndWait(
-    content::WebContents* web_contents) {
-  EnterSessionWithUserGesture(web_contents);
-  WaitOnJavaScriptStep(web_contents);
-}
-
 void WebXrBrowserTestBase::EnterSessionWithUserGestureAndWait() {
   EnterSessionWithUserGestureAndWait(GetFirstTabWebContents());
 }
diff --git a/chrome/browser/vr/test/webxr_browser_test.h b/chrome/browser/vr/test/webxr_browser_test.h
index 2979b87..810a7bc1 100644
--- a/chrome/browser/vr/test/webxr_browser_test.h
+++ b/chrome/browser/vr/test/webxr_browser_test.h
@@ -16,47 +16,47 @@
   // Checks whether an XRDevice was actually found.
   virtual bool XrDeviceFound(content::WebContents* web_contents);
 
-  // Convenience function for calling XrDeviceFound with the return value of
-  // GetFirstTabWebContents.
-  bool XrDeviceFound();
-
   // Enters a WebXR or WebVR session of some kind.
   virtual void EnterSessionWithUserGesture(
       content::WebContents* web_contents) = 0;
 
-  // Convenience function for calling EnterSessionWithUserGesture with the
-  // return value of GetFirstTabWebContents.
-  void EnterSessionWithUserGesture();
-
   // Enters a WebXR or WebVR session of some kind and waits until the page
   // page reports it is finished with its JavaScript step.
   void EnterSessionWithUserGestureAndWait(content::WebContents* web_contents);
 
-  // Convenience function for calling EnterSessionWithUserGestureAndWait with
-  // the return value of GetFirstTabWebContents.
-  void EnterSessionWithUserGestureAndWait();
-
   // Attempts to enter a WebXR or WebVR session of some kind, failing if it is
   // unable to.
   virtual void EnterSessionWithUserGestureOrFail(
       content::WebContents* web_contents) = 0;
 
-  // Convenience function for calling EnterSessionWithUserGestureOrFail with the
-  // return value of GetFirstTabWebContents.
-  void EnterSessionWithUserGestureOrFail();
-
   // Ends whatever type of session a subclass enters with
   // EnterSessionWithUserGesture.
   virtual void EndSession(content::WebContents* web_contents) = 0;
 
-  // Convenience function for calling EndSession with the return value of
-  // GetFirstTabWebContents.
-  void EndSession();
-
   // Attempts to end whatever type of session a subclass enters with
   // EnterSessionWithUserGesture, failing if it is unable to.
   virtual void EndSessionOrFail(content::WebContents* web_contents) = 0;
 
+  // Convenience function for calling XrDeviceFound with the return value of
+  // GetFirstTabWebContents.
+  bool XrDeviceFound();
+
+  // Convenience function for calling EnterSessionWithUserGesture with the
+  // return value of GetFirstTabWebContents.
+  void EnterSessionWithUserGesture();
+
+  // Convenience function for calling EnterSessionWithUserGestureAndWait with
+  // the return value of GetFirstTabWebContents.
+  void EnterSessionWithUserGestureAndWait();
+
+  // Convenience function for calling EnterSessionWithUserGestureOrFail with the
+  // return value of GetFirstTabWebContents.
+  void EnterSessionWithUserGestureOrFail();
+
+  // Convenience function for calling EndSession with the return value of
+  // GetFirstTabWebContents.
+  void EndSession();
+
   // Convenience function for calling EndSessionOrFail with the return value of
   // GetFirstTabWebContents.
   void EndSessionOrFail();
diff --git a/chrome/browser/vr/test/webxr_vr_browser_test.cc b/chrome/browser/vr/test/webxr_vr_browser_test.cc
index 72c05ce8..a210d39d 100644
--- a/chrome/browser/vr/test/webxr_vr_browser_test.cc
+++ b/chrome/browser/vr/test/webxr_vr_browser_test.cc
@@ -15,29 +15,29 @@
   // ExecuteScript runs with a user gesture, so we can just directly call
   // requestSession instead of having to do the hacky workaround the
   // instrumentation tests use of actually sending a click event to the canvas.
-  EXPECT_TRUE(content::ExecuteScript(web_contents, "onRequestSession()"));
+  RunJavaScriptOrFail("onRequestSession()", web_contents);
 }
 
 void WebXrVrBrowserTestBase::EnterSessionWithUserGestureOrFail(
     content::WebContents* web_contents) {
   EnterSessionWithUserGesture(web_contents);
-  EXPECT_TRUE(PollJavaScriptBoolean(
+  PollJavaScriptBooleanOrFail(
       "sessionInfos[sessionTypes.IMMERSIVE].currentSession != null",
-      kPollTimeoutLong, web_contents));
+      kPollTimeoutLong, web_contents);
 }
 
 void WebXrVrBrowserTestBase::EndSession(content::WebContents* web_contents) {
-  EXPECT_TRUE(content::ExecuteScript(
-      web_contents,
-      "sessionInfos[sessionTypes.IMMERSIVE].currentSession.end()"));
+  RunJavaScriptOrFail(
+      "sessionInfos[sessionTypes.IMMERSIVE].currentSession.end()",
+      web_contents);
 }
 
 void WebXrVrBrowserTestBase::EndSessionOrFail(
     content::WebContents* web_contents) {
   EndSession(web_contents);
-  EXPECT_TRUE(PollJavaScriptBoolean(
+  PollJavaScriptBooleanOrFail(
       "sessionInfos[sessionTypes.IMMERSIVE].currentSession == null",
-      kPollTimeoutLong, web_contents));
+      kPollTimeoutLong, web_contents);
 }
 
 }  // namespace vr
diff --git a/chrome/browser/vr/test/xr_browser_test.cc b/chrome/browser/vr/test/xr_browser_test.cc
index 99b8a6d..34910d7 100644
--- a/chrome/browser/vr/test/xr_browser_test.cc
+++ b/chrome/browser/vr/test/xr_browser_test.cc
@@ -43,7 +43,7 @@
 
 // We need an std::string that is an absolute file path, which requires
 // platform-specific logic since Windows uses std::wstring instead of
-// std::string for FilePaths, but SetVar only accepts std::string
+// std::string for FilePaths, but SetVar only accepts std::string.
 #ifdef OS_WIN
 #define MAKE_ABSOLUTE(x) \
   base::WideToUTF8(      \
@@ -54,13 +54,16 @@
 
 void XrBrowserTestBase::SetUp() {
   // Set the environment variable to use the mock OpenVR client.
-  EXPECT_TRUE(env_->SetVar(kVrOverrideEnvVar, MAKE_ABSOLUTE(kVrOverrideVal)));
+  EXPECT_TRUE(env_->SetVar(kVrOverrideEnvVar, MAKE_ABSOLUTE(kVrOverrideVal)))
+      << "Failed to set OpenVR mock client location environment variable";
   EXPECT_TRUE(
-      env_->SetVar(kVrConfigPathEnvVar, MAKE_ABSOLUTE(kVrConfigPathVal)));
-  EXPECT_TRUE(env_->SetVar(kVrLogPathEnvVar, MAKE_ABSOLUTE(kVrLogPathVal)));
+      env_->SetVar(kVrConfigPathEnvVar, MAKE_ABSOLUTE(kVrConfigPathVal)))
+      << "Failed to set OpenVR config location environment variable";
+  EXPECT_TRUE(env_->SetVar(kVrLogPathEnvVar, MAKE_ABSOLUTE(kVrLogPathVal)))
+      << "Failed to set OpenVR log location environment variable";
 
   // Set any command line flags that subclasses have set, e.g. enabling WebVR
-  // and OpenVR support
+  // and OpenVR support.
   for (const auto& switch_string : append_switches_) {
     base::CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
   }
@@ -73,11 +76,11 @@
   return ui_test_utils::GetTestUrl(
       base::FilePath(FILE_PATH_LITERAL("xr/e2e_test_files/html")),
 #ifdef OS_WIN
-      base::FilePath(base::UTF8ToWide(test_name + ".html")
+      base::FilePath(base::UTF8ToWide(test_name + ".html"))
 #else
       base::FilePath(test_name + ".html")
 #endif
-                         ));
+          );
 }
 
 content::WebContents* XrBrowserTestBase::GetFirstTabWebContents() {
@@ -92,6 +95,127 @@
       << "Timed out waiting for JavaScript test initialization.";
 }
 
+void XrBrowserTestBase::RunJavaScriptOrFail(
+    const std::string& js_expression,
+    content::WebContents* web_contents) {
+  EXPECT_TRUE(content::ExecuteScript(web_contents, js_expression))
+      << "Failed to run given JavaScript: " << js_expression;
+}
+
+bool XrBrowserTestBase::RunJavaScriptAndExtractBoolOrFail(
+    const std::string& js_expression,
+    content::WebContents* web_contents) {
+  bool result;
+  DLOG(ERROR) << "Run JavaScript: " << js_expression;
+  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
+      web_contents,
+      "window.domAutomationController.send(" + js_expression + ")", &result))
+      << "Failed to run given JavaScript for bool: " << js_expression;
+  return result;
+}
+
+std::string XrBrowserTestBase::RunJavaScriptAndExtractStringOrFail(
+    const std::string& js_expression,
+    content::WebContents* web_contents) {
+  std::string result;
+  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
+      web_contents,
+      "window.domAutomationController.send(" + js_expression + ")", &result))
+      << "Failed to run given JavaScript for string: " << js_expression;
+  return result;
+}
+
+bool XrBrowserTestBase::PollJavaScriptBoolean(
+    const std::string& bool_expression,
+    const base::TimeDelta& timeout,
+    content::WebContents* web_contents) {
+  // Lambda used because otherwise BindRepeating gets confused about which
+  // version of RunJavaScriptAndExtractBoolOrFail to use.
+  return BlockOnConditionUnsafe(
+      base::BindRepeating(
+          [](XrBrowserTestBase* base, std::string expression,
+             content::WebContents* contents) {
+            return base->RunJavaScriptAndExtractBoolOrFail(expression,
+                                                           contents);
+          },
+          this, bool_expression, web_contents),
+      timeout);
+}
+
+void XrBrowserTestBase::PollJavaScriptBooleanOrFail(
+    const std::string& bool_expression,
+    const base::TimeDelta& timeout,
+    content::WebContents* web_contents) {
+  EXPECT_TRUE(PollJavaScriptBoolean(bool_expression, timeout, web_contents))
+      << "Timed out polling boolean expression: " << bool_expression;
+}
+
+bool XrBrowserTestBase::BlockOnConditionUnsafe(
+    base::RepeatingCallback<bool()> condition,
+    const base::TimeDelta& timeout,
+    const base::TimeDelta& period) {
+  base::Time start = base::Time::Now();
+  bool successful = false;
+  while (base::Time::Now() - start < timeout) {
+    successful = condition.Run();
+    if (successful) {
+      break;
+    }
+    base::PlatformThread::Sleep(period);
+  }
+  return successful;
+}
+
+void XrBrowserTestBase::WaitOnJavaScriptStep(
+    content::WebContents* web_contents) {
+  // Make sure we aren't trying to wait on a JavaScript test step without the
+  // code to do so.
+  bool code_available = RunJavaScriptAndExtractBoolOrFail(
+      "typeof javascriptDone !== 'undefined'", web_contents);
+  EXPECT_TRUE(code_available) << "Attempted to wait on a JavaScript test step "
+                              << "without the code to do so. You either forgot "
+                              << "to import webvr_e2e.js or "
+                              << "are incorrectly using a C++ function.";
+
+  // Actually wait for the step to finish.
+  bool success =
+      PollJavaScriptBoolean("javascriptDone", kPollTimeoutLong, web_contents);
+
+  // Check what state we're in to make sure javascriptDone wasn't called
+  // because the test failed.
+  XrBrowserTestBase::TestStatus test_status = CheckTestStatus(web_contents);
+  if (!success || test_status == XrBrowserTestBase::TestStatus::STATUS_FAILED) {
+    // Failure states: Either polling failed or polling succeeded, but because
+    // the test failed.
+    std::string reason;
+    if (!success) {
+      reason = "Polling JavaScript boolean javascriptDone timed out.";
+    } else {
+      reason =
+          "Polling JavaScript boolean javascriptDone succeeded, but test "
+          "failed.";
+    }
+
+    std::string result_string =
+        RunJavaScriptAndExtractStringOrFail("resultString", web_contents);
+    if (result_string == "") {
+      reason += " Did not obtain specific reason from testharness.";
+    } else {
+      reason += " Testharness reported failure: " + result_string;
+    }
+    FAIL() << reason;
+  }
+
+  // Reset the synchronization boolean.
+  RunJavaScriptOrFail("javascriptDone = false", web_contents);
+}
+
+void XrBrowserTestBase::ExecuteStepAndWait(const std::string& step_function,
+                                           content::WebContents* web_contents) {
+  RunJavaScriptOrFail(step_function, web_contents);
+  WaitOnJavaScriptStep(web_contents);
+}
+
 XrBrowserTestBase::TestStatus XrBrowserTestBase::CheckTestStatus(
     content::WebContents* web_contents) {
   std::string result_string =
@@ -133,131 +257,8 @@
   }
 }
 
-bool XrBrowserTestBase::PollJavaScriptBoolean(
-    const std::string& bool_expression,
-    const base::TimeDelta& timeout,
-    content::WebContents* web_contents) {
-  // Lambda used because otherwise BindRepeating gets confused about which
-  // version of RunJavaScriptAndExtractBoolOrFail to use.
-  return BlockOnConditionUnsafe(
-      base::BindRepeating(
-          [](XrBrowserTestBase* base, std::string expression,
-             content::WebContents* contents) {
-            return base->RunJavaScriptAndExtractBoolOrFail(expression,
-                                                           contents);
-          },
-          this, bool_expression, web_contents),
-      timeout);
-}
-
-void XrBrowserTestBase::WaitOnJavaScriptStep(
-    content::WebContents* web_contents) {
-  // Make sure we aren't trying to wait on a JavaScript test step without the
-  // code to do so.
-  bool code_available = RunJavaScriptAndExtractBoolOrFail(
-      "typeof javascriptDone !== 'undefined'", web_contents);
-  EXPECT_TRUE(code_available) << "Attempted to wait on a JavaScript test step "
-                              << "without the code to do so. You either forgot "
-                              << "to import webvr_e2e.js or "
-                              << "are incorrectly using a C++ function.";
-
-  // Actually wait for the step to finish
-  bool success =
-      PollJavaScriptBoolean("javascriptDone", kPollTimeoutLong, web_contents);
-
-  // Check what state we're in to make sure javascriptDone wasn't called
-  // because the test failed.
-  XrBrowserTestBase::TestStatus test_status = CheckTestStatus(web_contents);
-  if (!success || test_status == XrBrowserTestBase::TestStatus::STATUS_FAILED) {
-    // Failure states: Either polling failed or polling succeeded, but because
-    // the test failed.
-    std::string reason;
-    if (!success) {
-      reason = "Polling JavaScript boolean javascriptDone timed out.";
-    } else {
-      reason =
-          "Polling JavaScript boolean javascriptDone succeeded, but test "
-          "failed.";
-    }
-
-    std::string result_string =
-        RunJavaScriptAndExtractStringOrFail("resultString", web_contents);
-    if (result_string == "") {
-      reason += " Did not obtain specific reason from testharness.";
-    } else {
-      reason += " Testharness reported failure: " + result_string;
-    }
-    FAIL() << reason;
-  }
-
-  // Reset the synchronization boolean
-  EXPECT_TRUE(content::ExecuteScript(web_contents, "javascriptDone = false"));
-}
-
-void XrBrowserTestBase::ExecuteStepAndWait(const std::string& step_function,
-                                           content::WebContents* web_contents) {
-  EXPECT_TRUE(content::ExecuteScript(web_contents, step_function));
-  WaitOnJavaScriptStep(web_contents);
-}
-
-bool XrBrowserTestBase::BlockOnConditionUnsafe(
-    base::RepeatingCallback<bool()> condition,
-    const base::TimeDelta& timeout,
-    const base::TimeDelta& period) {
-  base::Time start = base::Time::Now();
-  bool successful = false;
-  while (base::Time::Now() - start < timeout) {
-    successful = condition.Run();
-    if (successful) {
-      break;
-    }
-    base::PlatformThread::Sleep(period);
-  }
-  return successful;
-}
-
-bool XrBrowserTestBase::RunJavaScriptAndExtractBoolOrFail(
-    const std::string& js_expression,
-    content::WebContents* web_contents) {
-  bool result;
-  DLOG(ERROR) << "Run javascript: " << js_expression;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
-      web_contents,
-      "window.domAutomationController.send(" + js_expression + ")", &result));
-  return result;
-}
-
-std::string XrBrowserTestBase::RunJavaScriptAndExtractStringOrFail(
-    const std::string& js_expression,
-    content::WebContents* web_contents) {
-  std::string result;
-  EXPECT_TRUE(content::ExecuteScriptAndExtractString(
-      web_contents,
-      "window.domAutomationController.send(" + js_expression + ")", &result));
-  return result;
-}
-
-void XrBrowserTestBase::EndTest() {
-  EndTest(GetFirstTabWebContents());
-}
-
-void XrBrowserTestBase::AssertNoJavaScriptErrors() {
-  AssertNoJavaScriptErrors(GetFirstTabWebContents());
-}
-
-bool XrBrowserTestBase::PollJavaScriptBoolean(
-    const std::string& bool_expression,
-    const base::TimeDelta& timeout) {
-  return PollJavaScriptBoolean(bool_expression, timeout,
-                               GetFirstTabWebContents());
-}
-
-void XrBrowserTestBase::WaitOnJavaScriptStep() {
-  WaitOnJavaScriptStep(GetFirstTabWebContents());
-}
-
-void XrBrowserTestBase::ExecuteStepAndWait(const std::string& step_function) {
-  ExecuteStepAndWait(step_function, GetFirstTabWebContents());
+void XrBrowserTestBase::RunJavaScriptOrFail(const std::string& js_expression) {
+  RunJavaScriptOrFail(js_expression, GetFirstTabWebContents());
 }
 
 bool XrBrowserTestBase::RunJavaScriptAndExtractBoolOrFail(
@@ -272,4 +273,34 @@
                                              GetFirstTabWebContents());
 }
 
+bool XrBrowserTestBase::PollJavaScriptBoolean(
+    const std::string& bool_expression,
+    const base::TimeDelta& timeout) {
+  return PollJavaScriptBoolean(bool_expression, timeout,
+                               GetFirstTabWebContents());
+}
+
+void XrBrowserTestBase::PollJavaScriptBooleanOrFail(
+    const std::string& bool_expression,
+    const base::TimeDelta& timeout) {
+  PollJavaScriptBooleanOrFail(bool_expression, timeout,
+                              GetFirstTabWebContents());
+}
+
+void XrBrowserTestBase::WaitOnJavaScriptStep() {
+  WaitOnJavaScriptStep(GetFirstTabWebContents());
+}
+
+void XrBrowserTestBase::ExecuteStepAndWait(const std::string& step_function) {
+  ExecuteStepAndWait(step_function, GetFirstTabWebContents());
+}
+
+void XrBrowserTestBase::EndTest() {
+  EndTest(GetFirstTabWebContents());
+}
+
+void XrBrowserTestBase::AssertNoJavaScriptErrors() {
+  AssertNoJavaScriptErrors(GetFirstTabWebContents());
+}
+
 }  // namespace vr
diff --git a/chrome/browser/vr/test/xr_browser_test.h b/chrome/browser/vr/test/xr_browser_test.h
index b6571cc..213ab3839 100644
--- a/chrome/browser/vr/test/xr_browser_test.h
+++ b/chrome/browser/vr/test/xr_browser_test.h
@@ -36,6 +36,8 @@
       base::TimeDelta::FromMilliseconds(1000);
   static constexpr base::TimeDelta kPollTimeoutLong =
       base::TimeDelta::FromMilliseconds(10000);
+  // Still considered XR-wide instead of VR-specific since OpenVR can be used
+  // for passthrough AR with certain headsets.
   static constexpr char kVrOverrideEnvVar[] = "VR_OVERRIDE";
   static constexpr char kVrOverrideVal[] = "./mock_vr_clients/";
   static constexpr char kVrConfigPathEnvVar[] = "VR_CONFIG_PATH";
@@ -53,8 +55,8 @@
 
   void SetUp() override;
 
-  // Returns a GURL to the VR test HTML file of the given name, e.g.
-  // GetHtmlTestFile("foo") returns a GURL for the foo.html file in the VR
+  // Returns a GURL to the XR test HTML file of the given name, e.g.
+  // GetHtmlTestFile("foo") returns a GURL for the foo.html file in the XR
   // test HTML directory.
   GURL GetHtmlTestFile(const std::string& test_name);
 
@@ -66,6 +68,57 @@
   // signalled that pre-test initialization is complete.
   void LoadUrlAndAwaitInitialization(const GURL& url);
 
+  // Convenience function for ensuring the given JavaScript runs successfully
+  // without having to always surround in EXPECT_TRUE.
+  void RunJavaScriptOrFail(const std::string& js_expression,
+                           content::WebContents* web_contents);
+
+  // Convenience function for ensuring ExecuteScriptAndExtractBool runs
+  // successfully and for directly getting the result instead of needing to pass
+  // a pointer to be filled.
+  bool RunJavaScriptAndExtractBoolOrFail(const std::string& js_expression,
+                                         content::WebContents* web_contents);
+
+  // Convenience function for ensuring ExecuteScripteAndExtractString runs
+  // successfully and for directly getting the result instead of needing to pass
+  // a pointer to be filled.
+  std::string RunJavaScriptAndExtractStringOrFail(
+      const std::string& js_expression,
+      content::WebContents* web_contents);
+
+  // Blocks until the given JavaScript expression evaluates to true or the
+  // timeout is reached. Returns true if the expression evaluated to true or
+  // false on timeout.
+  bool PollJavaScriptBoolean(const std::string& bool_expression,
+                             const base::TimeDelta& timeout,
+                             content::WebContents* web_contents);
+
+  // Polls the provided JavaScript boolean expression, failing the test if it
+  // does not evaluate to true within the provided timeout.
+  void PollJavaScriptBooleanOrFail(const std::string& bool_expression,
+                                   const base::TimeDelta& timeout,
+                                   content::WebContents* web_contents);
+
+  // Blocks until the given callback returns true or the timeout is reached.
+  // Returns true if the condition successfully resolved or false on timeout.
+  // This is unsafe because it relies on the provided callback checking a result
+  // from a different thread. This isn't an issue when blocking on some
+  // JavaScript condition to be true, but could be problematic if forced into
+  // use elsewhere.
+  bool BlockOnConditionUnsafe(
+      base::RepeatingCallback<bool()> condition,
+      const base::TimeDelta& timeout = kPollTimeoutLong,
+      const base::TimeDelta& period = kPollCheckIntervalLong);
+
+  // Blocks until the JavaScript in the given WebContents signals that it is
+  // finished.
+  void WaitOnJavaScriptStep(content::WebContents* web_contents);
+
+  // Executes the given step/JavaScript expression and blocks until JavaScript
+  // signals that it is finished.
+  void ExecuteStepAndWait(const std::string& step_function,
+                          content::WebContents* web_contents);
+
   // Retrieves the current status of the JavaScript test and returns an enum
   // corresponding to it.
   TestStatus CheckTestStatus(content::WebContents* web_contents);
@@ -80,79 +133,46 @@
   // JavaScript errors were encountered.
   void AssertNoJavaScriptErrors(content::WebContents* web_contents);
 
-  // Blocks until the given JavaScript expression evaluates to true or the
-  // timeout is reached. Returns true if the expression evaluated to true or
-  // false on timeout.
-  bool PollJavaScriptBoolean(const std::string& bool_expression,
-                             const base::TimeDelta& timeout,
-                             content::WebContents* web_contents);
-
-  // Blocks until the JavaScript in the given WebContents signals that it is
-  // finished.
-  void WaitOnJavaScriptStep(content::WebContents* web_contents);
-
-  // Executes the given step/JavaScript expression and blocks until JavaScript
-  // signals that it is finished.
-  void ExecuteStepAndWait(const std::string& step_function,
-                          content::WebContents* web_contents);
-
-  // Blocks until the given callback returns true or the timeout is reached.
-  // Returns true if the condition successfully resolved or false on timeout.
-  // This is unsafe because it relies on the provided callback checking a result
-  // from a different thread. This isn't an issue when blocking on some
-  // JavaScript condition to be true, but could be problematic if forced into
-  // use elsewhere.
-  bool BlockOnConditionUnsafe(
-      base::RepeatingCallback<bool()> condition,
-      const base::TimeDelta& timeout = kPollTimeoutLong,
-      const base::TimeDelta& period = kPollCheckIntervalLong);
-
-  // Convenience function for ensuring ExecuteScriptAndExtractBool runs
-  // successfully and for directly getting the result instead of needing to pass
-  // a pointer to be filled.
-  bool RunJavaScriptAndExtractBoolOrFail(const std::string& js_expression,
-                                         content::WebContents* web_contents);
-
-  // Convenience function for ensuring ExecuteScripteAndExtractString runs
-  // successfully and for directly getting the result instead of needing to pass
-  // a pointer to be filled.
-  std::string RunJavaScriptAndExtractStringOrFail(
-      const std::string& js_expression,
-      content::WebContents* web_contents);
-
   Browser* browser() { return InProcessBrowserTest::browser(); }
 
-  // Convenience function for running the static EndTest with the return value
+  // Convenience function for running RunJavaScriptOrFail with the return value
   // of GetFirstTabWebContents.
-  void EndTest();
+  void RunJavaScriptOrFail(const std::string& js_expression);
 
-  // Convenience function for running the static AssertNoJavaScriptErrors with
-  // the return value of GetFirstTabWebContents.
-  void AssertNoJavaScriptErrors();
-
-  // Convenience function for running the static PollJavaScriptBoolean with the
+  // Convenience function for running RunJavaScriptAndExtractBoolOrFail with the
   // return value of GetFirstTabWebContents.
+  bool RunJavaScriptAndExtractBoolOrFail(const std::string& js_expression);
+
+  // Convenience function for running RunJavaScriptAndExtractStringOrFail with
+  // the return value of GetFirstTabWebContents.
+  std::string RunJavaScriptAndExtractStringOrFail(
+      const std::string& js_expression);
+
+  // Convenience function for running PollJavaScriptBoolean with the return
+  // value of GetFirstTabWebContents.
   bool PollJavaScriptBoolean(const std::string& bool_expression,
                              const base::TimeDelta& timeout);
 
-  // Convenience function for running the static WaitOnJavaScriptStep with the
+  // Convenience function for running PollJavaScriptBooleanOrFail with the
   // return value of GetFirstTabWebContents.
+  void PollJavaScriptBooleanOrFail(const std::string& bool_expression,
+                                   const base::TimeDelta& timeout);
+
+  // Convenience function for running WaitOnJavaScriptStep with the return value
+  // of GetFirstTabWebContents.
   void WaitOnJavaScriptStep();
 
-  // Convenience function for running the static ExecuteStepAndWait with the
-  // return value of GetFirstTabWebContents.
+  // Convenience function for running ExecuteStepAndWait with the return value
+  // of GetFirstTabWebContents.
   void ExecuteStepAndWait(const std::string& step_function);
 
-  // Convenience function for running the static
-  // RunJavaScriptAndExtractBoolOrFail with the return value of
+  // Convenience function for running EndTest with the return value of
   // GetFirstTabWebContents.
-  bool RunJavaScriptAndExtractBoolOrFail(const std::string& js_expression);
+  void EndTest();
 
-  // Convenience function for running the static
-  // RunJavaScriptAndExtractStringOrFail with the return value of
-  // GetFirstTabWebContents.
-  std::string RunJavaScriptAndExtractStringOrFail(
-      const std::string& js_expression);
+  // Convenience function for running AssertNoJavaScriptErrors with the return
+  // value of GetFirstTabWebContents.
+  void AssertNoJavaScriptErrors();
 
  protected:
   std::unique_ptr<base::Environment> env_;
diff --git a/chrome/browser/vr/test/xr_browser_tests.md b/chrome/browser/vr/test/xr_browser_tests.md
new file mode 100644
index 0000000..993250b1
--- /dev/null
+++ b/chrome/browser/vr/test/xr_browser_tests.md
@@ -0,0 +1,59 @@
+# XR Browser Tests
+
+## Introduction
+
+This documentation concerns `xr_browser_test.h`, `xr_browser_test.cc`, and files
+that use them or their subclasses.
+
+These files port the framework used by XR instrumentation tests (located in
+[`//chrome/android/javatests/src/org/chromium/chrome/browser/vr/`][1] and
+documented in
+`//chrome/android/javatests/src/org/chromium/chrome/browser/vr/*.md`) for
+use in browser tests in order to test XR features on desktop platforms.
+
+This is pretty much a direct port, with the same JavaScript/HTML files being
+used for both and the Java/C++ code being functionally equivalent to each other,
+so the instrumentation test's documentation on writing tests using the framework
+is applicable here, too. As such, this documentation only covers any notable
+differences between the two implementations.
+
+## Restrictions
+
+Both the instrumentation tests and browser tests have hardware/software
+restrictions - in the case of browser tests, XR is only supported on Windows 8
+and later (or Windows 7 with a non-standard patch applied) with a GPU that
+supports DirectX 11.1.
+
+Instrumentation tests handle restrictions with the `@Restriction` annotation,
+but browser tests don't have any equivalent functionality. Instead, test names
+should be wrapped in the `REQUIRES_GPU` macro defined in `xr_browser_test.h`,
+which simply disables the test by default. We then explicitly run tests that
+inherit from `XrBrowserTestBase` and enable the running of disabled tests on
+bots that meet the requirements.
+
+## Command Line Switches
+
+Instrumentation tests are able to add and remove command line switches on a
+per-test-case basis using `@CommandLine` annotations, but equivalent
+functionality does not exist in browser tests.
+
+Instead, if different command line flags are needed, a new class will need to
+be created that extends the correct type of `*BrowserTestBase` and overrides the
+flags that are set in its `SetUp` function.
+
+## Compiling And Running
+
+The tests are compiled as part of the standard `browser_tests` target, although
+the files are currently only included on Windows.
+
+Once compiled, the tests can be run using the following command line, which
+ensures that only the XR browser tests are run:
+
+`browser_tests.exe --enable-gpu --test-launcher-jobs=1
+--gtest_filter=WebVrBrowserTest*:WebXrVrBrowserTest*
+--enable-pixel-output-in-tests --gtest_also_run_disabled_tests`
+
+Note that this must be run from your output directory, e.g. `out/Debug`, as
+otherwise the setup code to use the mock OpenVR client will fail.
+
+[1]: https://chromium.googlesource.com/chromium/src/+/master/chrome/android/javatests/src/org/chromium/chrome/browser/vr
\ No newline at end of file
diff --git a/chrome/browser/vr/testapp/vr_testapp.cc b/chrome/browser/vr/testapp/vr_testapp.cc
index 5844391..5615de0b 100644
--- a/chrome/browser/vr/testapp/vr_testapp.cc
+++ b/chrome/browser/vr/testapp/vr_testapp.cc
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "chrome/browser/vr/testapp/gl_renderer.h"
diff --git a/chrome/browser/vr/webvr_frame_pose_browser_test.cc b/chrome/browser/vr/webxr_vr_frame_pose_browser_test.cc
similarity index 89%
rename from chrome/browser/vr/webvr_frame_pose_browser_test.cc
rename to chrome/browser/vr/webxr_vr_frame_pose_browser_test.cc
index 6b3e247..79a99ae2 100644
--- a/chrome/browser/vr/webvr_frame_pose_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_frame_pose_browser_test.cc
@@ -81,7 +81,8 @@
     wait_loop_ = nullptr;
   }
 
-  EXPECT_TRUE(has_last_immersive_frame_data_);
+  EXPECT_TRUE(has_last_immersive_frame_data_)
+      << "Frame submitted without any frame data provided";
 
   // We expect a waitGetPoses, then 2 submits (one for each eye), so after 2
   // submitted frames don't use the same frame_data again.
@@ -148,7 +149,7 @@
   t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
   t->EnterSessionWithUserGestureOrFail();
 
-  // Wait for javascript to submit at least one frame.
+  // Wait for JavaScript to submit at least one frame.
   EXPECT_TRUE(
       t->PollJavaScriptBoolean("hasPresentedFrame", t->kPollTimeoutShort))
       << "No frame submitted";
@@ -180,28 +181,32 @@
     // Validate that each frame is only seen once for each eye.
     DLOG(ERROR) << "Frame id: " << frame_id;
     if (data.left_eye) {
-      EXPECT_TRUE(seen_left.find(frame_id) == seen_left.end());
+      EXPECT_TRUE(seen_left.find(frame_id) == seen_left.end())
+          << "Frame for left eye submitted more than once";
       seen_left.insert(frame_id);
     } else {
-      EXPECT_TRUE(seen_right.find(frame_id) == seen_right.end());
+      EXPECT_TRUE(seen_right.find(frame_id) == seen_right.end())
+          << "Frame for right eye submitted more than once";
       seen_right.insert(frame_id);
     }
 
     // Validate that frames arrive in order.
-    EXPECT_TRUE(frame_id >= max_frame_id);
+    EXPECT_TRUE(frame_id >= max_frame_id) << "Frame received out of order";
     max_frame_id = std::max(frame_id, max_frame_id);
 
-    // Validate that the javascript-side cache of frames contains our submitted
+    // Validate that the JavaScript-side cache of frames contains our submitted
     // frame.
     EXPECT_TRUE(t->RunJavaScriptAndExtractBoolOrFail(
-        base::StringPrintf("checkFrameOccurred(%d)", frame_id)));
+        base::StringPrintf("checkFrameOccurred(%d)", frame_id)))
+        << "JavaScript-side frame cache does not contain submitted frame";
 
-    // Validate that the javascript-side cache of frames has the correct pose.
+    // Validate that the JavaScript-side cache of frames has the correct pose.
     EXPECT_TRUE(t->RunJavaScriptAndExtractBoolOrFail(base::StringPrintf(
-        "checkFramePose(%d, %s)", frame_id, GetPoseAsString(frame).c_str())));
+        "checkFramePose(%d, %s)", frame_id, GetPoseAsString(frame).c_str())))
+        << "JavaScript-side frame cache has incorrect pose";
   }
 
-  // Tell javascript that it is done with the test.
+  // Tell JavaScript that it is done with the test.
   t->ExecuteStepAndWait("finishTest()");
   t->EndTest();
 }
diff --git a/chrome/browser/vr/webvr_input_browser_test.cc b/chrome/browser/vr/webxr_vr_input_browser_test.cc
similarity index 94%
rename from chrome/browser/vr/webvr_input_browser_test.cc
rename to chrome/browser/vr/webxr_vr_input_browser_test.cc
index 959492e..019339d9 100644
--- a/chrome/browser/vr/webvr_input_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_input_browser_test.cc
@@ -7,7 +7,7 @@
 
 // Browser test equivalent of
 // chrome/android/javatests/src/.../browser/vr/WebXrVrInputTest.java.
-// End-to-end tests for user input interaction with WebVR.
+// End-to-end tests for user input interaction with WebXR/WebVR.
 
 namespace vr {
 
diff --git a/chrome/browser/vr/webvr_pixel_browser_test.cc b/chrome/browser/vr/webxr_vr_pixel_browser_test.cc
similarity index 79%
rename from chrome/browser/vr/webvr_pixel_browser_test.cc
rename to chrome/browser/vr/webxr_vr_pixel_browser_test.cc
index c68a319..325a5115 100644
--- a/chrome/browser/vr/webvr_pixel_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_pixel_browser_test.cc
@@ -56,22 +56,26 @@
   t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
   t->EnterSessionWithUserGestureOrFail();
 
-  // Wait for javascript to submit at least one frame.
+  // Wait for JavaScript to submit at least one frame.
   EXPECT_TRUE(
       t->PollJavaScriptBoolean("hasPresentedFrame", t->kPollTimeoutShort))
       << "No frame submitted";
 
-  // Tell javascript that it is done with the test.
+  // Tell JavaScript that it is done with the test.
   t->ExecuteStepAndWait("finishTest()");
   t->EndTest();
 
   my_mock.WaitForFrame();
 
   device::Color expected = {0, 0, 255, 255};
-  EXPECT_EQ(expected.r, my_mock.last_submitted_color_.r);
-  EXPECT_EQ(expected.g, my_mock.last_submitted_color_.g);
-  EXPECT_EQ(expected.b, my_mock.last_submitted_color_.b);
-  EXPECT_EQ(expected.a, my_mock.last_submitted_color_.a);
+  EXPECT_EQ(expected.r, my_mock.last_submitted_color_.r)
+      << "Red channel of submitted color does not match expectation";
+  EXPECT_EQ(expected.g, my_mock.last_submitted_color_.g)
+      << "Green channel of submitted color does not match expectation";
+  EXPECT_EQ(expected.b, my_mock.last_submitted_color_.b)
+      << "Blue channel of submitted color does not match expectation";
+  EXPECT_EQ(expected.a, my_mock.last_submitted_color_.a)
+      << "Alpha channel of submitted color does not match expectation";
 }
 
 IN_PROC_BROWSER_TEST_F(WebVrBrowserTestStandard,
diff --git a/chrome/browser/vr/webvr_tab_browser_test.cc b/chrome/browser/vr/webxr_vr_tab_browser_test.cc
similarity index 93%
rename from chrome/browser/vr/webvr_tab_browser_test.cc
rename to chrome/browser/vr/webxr_vr_tab_browser_test.cc
index e5f4725a..a9c41c0e 100644
--- a/chrome/browser/vr/webvr_tab_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_tab_browser_test.cc
@@ -10,11 +10,11 @@
 
 // Browser test equivalent of
 // chrome/android/javatests/src/.../browser/vr/WebXrVrTabTest.java.
-// End-to-end tests for testing WebVR's interaction with multiple tabss.
+// End-to-end tests for testing WebXR/WebVR's interaction with multiple tabs.
 
 namespace vr {
 
-// Tests that non-focused tabs cannot get pose information from WebVR/WebXR
+// Tests that non-focused tabs cannot get pose information from WebVR/WebXR.
 void TestPoseDataUnfocusedTabImpl(WebXrVrBrowserTestBase* t,
                                   std::string filename) {
   t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
diff --git a/chrome/browser/vr/webvr_transition_browser_test.cc b/chrome/browser/vr/webxr_vr_transition_browser_test.cc
similarity index 94%
rename from chrome/browser/vr/webvr_transition_browser_test.cc
rename to chrome/browser/vr/webxr_vr_transition_browser_test.cc
index 2ce6d77..fda129fb 100644
--- a/chrome/browser/vr/webvr_transition_browser_test.cc
+++ b/chrome/browser/vr/webxr_vr_transition_browser_test.cc
@@ -8,17 +8,18 @@
 
 // Browser test equivalent of
 // chrome/android/javatests/src/.../browser/vr/WebXrVrTransitionTest.java.
-// End-to-end tests for transitioning between WebVR's magic window and
-// presentation modes.
+// End-to-end tests for transitioning between immersive and non-immersive
+// sessions.
 
 namespace vr {
 
 // Tests that a successful requestPresent or requestSession call enters
-// presentation.
+// an immersive session.
 void TestPresentationEntryImpl(WebXrVrBrowserTestBase* t,
                                std::string filename) {
   t->LoadUrlAndAwaitInitialization(t->GetHtmlTestFile(filename));
   t->EnterSessionWithUserGestureOrFail();
+  t->AssertNoJavaScriptErrors();
 }
 
 IN_PROC_BROWSER_TEST_F(WebVrBrowserTestStandard,
@@ -80,7 +81,8 @@
 IN_PROC_BROWSER_TEST_F(WebVrBrowserTestOpenVrDisabled,
                        TestWebVrNoDevicesWithoutOpenVr) {
   LoadUrlAndAwaitInitialization(GetHtmlTestFile("generic_webvr_page"));
-  EXPECT_FALSE(XrDeviceFound());
+  EXPECT_FALSE(XrDeviceFound())
+      << "Found a VRDisplay even with OpenVR disabled";
   AssertNoJavaScriptErrors();
 }
 
@@ -95,7 +97,7 @@
 }
 
 // Tests that window.requestAnimationFrame continues to fire when we have a
-// non-immersive WebXR session
+// non-immersive WebXR session.
 IN_PROC_BROWSER_TEST_F(
     WebXrVrBrowserTestStandard,
     REQUIRES_GPU(TestWindowRafFiresDuringNonImmersiveSession)) {
diff --git a/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc b/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc
index b240ab9..25784c0 100644
--- a/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc
+++ b/chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager_unittest.cc
@@ -39,6 +39,10 @@
   TestPendingAppManager() = default;
   ~TestPendingAppManager() override = default;
 
+  void Install(
+      AppInfo app_to_install,
+      PendingAppManager::InstallCallback callback) override {}
+
   void ProcessAppOperations(std::vector<AppInfo> apps_to_install) override {
     last_apps_to_install_ = std::move(apps_to_install);
   }
diff --git a/chrome/browser/web_applications/components/pending_app_manager.h b/chrome/browser/web_applications/components/pending_app_manager.h
index 665b908..94191403 100644
--- a/chrome/browser/web_applications/components/pending_app_manager.h
+++ b/chrome/browser/web_applications/components/pending_app_manager.h
@@ -7,6 +7,7 @@
 
 #include <vector>
 
+#include "base/callback_forward.h"
 #include "base/macros.h"
 #include "url/gurl.h"
 
@@ -20,6 +21,8 @@
 // should wait for the update request to finish before uninstalling the app.
 class PendingAppManager {
  public:
+  using InstallCallback = base::OnceCallback<void(bool)>;
+
   // How the app will be launched after installation.
   enum class LaunchContainer {
     kTab,
@@ -42,7 +45,16 @@
   PendingAppManager();
   virtual ~PendingAppManager();
 
-  // Starts the installation of |apps_to_install|.
+  // Queues an installation operation with the highest priority. Essentially
+  // installing the app immediately if there are no ongoing operations or
+  // installing the app right after the current operation finishes.
+  //
+  // Fails if the same operation has been queued before. Should only be used in
+  // response to a user action e.g. the user clicked an install button.
+  virtual void Install(AppInfo app_to_install,
+                       InstallCallback callback) = 0;
+
+  // Adds |apps_to_install| to the queue of operations.
   virtual void ProcessAppOperations(std::vector<AppInfo> apps_to_install) = 0;
 
   DISALLOW_COPY_AND_ASSIGN(PendingAppManager);
diff --git a/chrome/browser/web_applications/components/web_app_shortcut.cc b/chrome/browser/web_applications/components/web_app_shortcut.cc
index b7624e6..5dfaeb5 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut.cc
+++ b/chrome/browser/web_applications/components/web_app_shortcut.cc
@@ -6,8 +6,8 @@
 
 #include "base/i18n/file_util_icu.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/chrome_constants.h"
diff --git a/chrome/browser/web_applications/components/web_app_shortcut_mac.mm b/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
index 63d9fd8..137d5fcd 100644
--- a/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
+++ b/chrome/browser/web_applications/components/web_app_shortcut_mac.mm
@@ -31,7 +31,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/version.h"
 #import "chrome/browser/mac/dock.h"
diff --git a/chrome/browser/web_applications/extensions/BUILD.gn b/chrome/browser/web_applications/extensions/BUILD.gn
index a6800e8..ff5c39a5 100644
--- a/chrome/browser/web_applications/extensions/BUILD.gn
+++ b/chrome/browser/web_applications/extensions/BUILD.gn
@@ -18,8 +18,6 @@
     "bookmark_app_shortcut_installation_task.h",
     "pending_bookmark_app_manager.cc",
     "pending_bookmark_app_manager.h",
-    "web_app_extension_helpers.cc",
-    "web_app_extension_helpers.h",
     "web_app_extension_shortcut.cc",
     "web_app_extension_shortcut.h",
     "web_app_extension_shortcut_mac.h",
@@ -43,6 +41,7 @@
     "bookmark_app_data_retriever_unittest.cc",
     "bookmark_app_installation_task_unittest.cc",
     "bookmark_app_installer_unittest.cc",
+    "pending_bookmark_app_manager_unittest.cc",
   ]
 
   deps = [
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h
index 7576e4b2..1e9902a 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h
+++ b/chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h
@@ -30,8 +30,8 @@
   explicit BookmarkAppShortcutInstallationTask(Profile* profile);
   ~BookmarkAppShortcutInstallationTask() override;
 
-  void InstallFromWebContents(content::WebContents* web_contents,
-                              ResultCallback callback);
+  virtual void InstallFromWebContents(content::WebContents* web_contents,
+                                      ResultCallback callback);
 
  private:
   void OnGetWebApplicationInfo(
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
index 6adbcf3..4bef8222 100644
--- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
@@ -4,15 +4,127 @@
 
 #include "chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h"
 
+#include <memory>
+#include <utility>
 #include <vector>
 
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/navigation_controller.h"
+
 namespace extensions {
 
-PendingBookmarkAppManager::PendingBookmarkAppManager() = default;
+namespace {
+
+std::unique_ptr<content::WebContents> WebContentsCreateWrapper(
+    Profile* profile) {
+  return content::WebContents::Create(
+      content::WebContents::CreateParams(profile));
+}
+
+std::unique_ptr<BookmarkAppInstallationTask> InstallationTaskCreateWrapper(
+    Profile* profile) {
+  // TODO(crbug.com/864904): Use an installation task that can install Web Apps
+  // and Web Shortcuts.
+  return std::make_unique<BookmarkAppShortcutInstallationTask>(profile);
+}
+
+}  // namespace
+
+PendingBookmarkAppManager::PendingBookmarkAppManager(Profile* profile)
+    : profile_(profile),
+      web_contents_factory_(base::BindRepeating(&WebContentsCreateWrapper)),
+      task_factory_(base::BindRepeating(&InstallationTaskCreateWrapper)) {}
 
 PendingBookmarkAppManager::~PendingBookmarkAppManager() = default;
 
+void PendingBookmarkAppManager::Install(AppInfo app_to_install,
+                                        InstallCallback callback) {
+  // The app is already being installed.
+  if (current_install_info_ && *current_install_info_ == app_to_install) {
+    std::move(callback).Run(false);
+    return;
+  }
+
+  current_install_info_ = std::make_unique<AppInfo>(std::move(app_to_install));
+  current_install_callback_ = std::move(callback);
+
+  CreateWebContentsIfNecessary();
+  Observe(web_contents_.get());
+
+  content::NavigationController::LoadURLParams load_params(
+      current_install_info_->url);
+  load_params.transition_type = ui::PAGE_TRANSITION_GENERATED;
+  web_contents_->GetController().LoadURLWithParams(load_params);
+}
+
 void PendingBookmarkAppManager::ProcessAppOperations(
-    std::vector<web_app::PendingAppManager::AppInfo> apps_to_install) {}
+    std::vector<AppInfo> apps_to_install) {}
+
+void PendingBookmarkAppManager::SetFactoriesForTesting(
+    WebContentsFactory web_contents_factory,
+    TaskFactory task_factory) {
+  web_contents_factory_ = std::move(web_contents_factory);
+  task_factory_ = std::move(task_factory);
+}
+
+void PendingBookmarkAppManager::CreateWebContentsIfNecessary() {
+  if (!web_contents_)
+    web_contents_ = web_contents_factory_.Run(profile_);
+}
+
+void PendingBookmarkAppManager::DidFinishLoad(
+    content::RenderFrameHost* render_frame_host,
+    const GURL& validated_url) {
+  if (web_contents_->GetMainFrame() != render_frame_host) {
+    return;
+  }
+
+  if (validated_url != current_install_info_->url) {
+    std::move(current_install_callback_).Run(false);
+    return;
+  }
+
+  Observe(nullptr);
+  current_installation_task_ = task_factory_.Run(profile_);
+  static_cast<BookmarkAppShortcutInstallationTask*>(
+      current_installation_task_.get())
+      ->InstallFromWebContents(
+          web_contents_.get(),
+          base::BindOnce(&PendingBookmarkAppManager::OnInstalled,
+                         // Safe because the installation task will not run its
+                         // callback after being deleted and this class owns the
+                         // task.
+                         base::Unretained(this)));
+}
+
+void PendingBookmarkAppManager::DidFailLoad(
+    content::RenderFrameHost* render_frame_host,
+    const GURL& validated_url,
+    int error_code,
+    const base::string16& error_description) {
+  if (web_contents_->GetMainFrame() != render_frame_host) {
+    return;
+  }
+
+  Observe(nullptr);
+  // TODO(crbug.com/864904): Only destroy the WebContents if there are no
+  // queued installation requests.
+  web_contents_.reset();
+  current_install_info_.reset();
+
+  std::move(current_install_callback_).Run(false);
+}
+
+void PendingBookmarkAppManager::OnInstalled(
+    BookmarkAppInstallationTask::Result result) {
+  // TODO(crbug.com/864904): Only destroy the WebContents if there are no
+  // queued installation requests.
+  web_contents_.reset();
+  current_install_info_.reset();
+  std::move(current_install_callback_)
+      .Run(result == BookmarkAppInstallationTask::Result::kSuccess);
+}
 
 }  // namespace extensions
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h
index e599f94..a0b00f0 100644
--- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h
@@ -5,10 +5,22 @@
 #ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_PENDING_BOOKMARK_APP_MANAGER_H_
 #define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_PENDING_BOOKMARK_APP_MANAGER_H_
 
+#include <memory>
 #include <vector>
 
+#include "base/callback.h"
 #include "base/macros.h"
 #include "chrome/browser/web_applications/components/pending_app_manager.h"
+#include "chrome/browser/web_applications/extensions/bookmark_app_installation_task.h"
+#include "content/public/browser/web_contents_observer.h"
+
+class GURL;
+class Profile;
+
+namespace content {
+class RenderFrameHost;
+class WebContents;
+}  // namespace content
 
 namespace extensions {
 
@@ -17,14 +29,49 @@
 //
 // WebAppProvider creates an instance of this class and manages its
 // lifetime. This class should only be used from the UI thread.
-class PendingBookmarkAppManager final : public web_app::PendingAppManager {
+class PendingBookmarkAppManager final : public web_app::PendingAppManager,
+                                        public content::WebContentsObserver {
  public:
-  PendingBookmarkAppManager();
+  using WebContentsFactory =
+      base::RepeatingCallback<std::unique_ptr<content::WebContents>(Profile*)>;
+  using TaskFactory =
+      base::RepeatingCallback<std::unique_ptr<BookmarkAppInstallationTask>(
+          Profile*)>;
+
+  explicit PendingBookmarkAppManager(Profile* profile);
   ~PendingBookmarkAppManager() override;
 
   // web_app::PendingAppManager
-  void ProcessAppOperations(std::vector<web_app::PendingAppManager::AppInfo>
-                                apps_to_install) override;
+  void Install(AppInfo app_to_install,
+               InstallCallback callback) override;
+  void ProcessAppOperations(std::vector<AppInfo> apps_to_install) override;
+
+  void SetFactoriesForTesting(WebContentsFactory web_contents_factory,
+                              TaskFactory task_factory);
+
+ private:
+  // WebContentsObserver
+  void DidFinishLoad(content::RenderFrameHost* render_frame_host,
+                     const GURL& validated_url) override;
+  void DidFailLoad(content::RenderFrameHost* render_frame_host,
+                   const GURL& validated_url,
+                   int error_code,
+                   const base::string16& error_description) override;
+
+  void OnInstalled(BookmarkAppInstallationTask::Result result);
+
+  void CreateWebContentsIfNecessary();
+
+  Profile* profile_;
+
+  WebContentsFactory web_contents_factory_;
+  TaskFactory task_factory_;
+
+  std::unique_ptr<content::WebContents> web_contents_;
+
+  InstallCallback current_install_callback_;
+  std::unique_ptr<AppInfo> current_install_info_;
+  std::unique_ptr<BookmarkAppInstallationTask> current_installation_task_;
 
   DISALLOW_COPY_AND_ASSIGN(PendingBookmarkAppManager);
 };
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc
new file mode 100644
index 0000000..cf38470
--- /dev/null
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager_unittest.cc
@@ -0,0 +1,207 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h"
+
+#include <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/optional.h"
+#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/browser/web_applications/components/pending_app_manager.h"
+#include "chrome/browser/web_applications/extensions/bookmark_app_shortcut_installation_task.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/test/web_contents_tester.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace extensions {
+
+namespace {
+
+const char kWebAppUrl[] = "https://foo.example";
+const char kWrongUrl[] = "https://bar.example";
+
+}  // namespace
+
+class TestBookmarkAppShortcutInstallationTask
+    : public BookmarkAppShortcutInstallationTask {
+ public:
+  TestBookmarkAppShortcutInstallationTask(Profile* profile, bool succeeds)
+      : BookmarkAppShortcutInstallationTask(profile), succeeds_(succeeds) {}
+  ~TestBookmarkAppShortcutInstallationTask() override = default;
+
+  void InstallFromWebContents(
+      content::WebContents* web_contents,
+      BookmarkAppInstallationTask::ResultCallback callback) override {
+    std::move(callback).Run(
+        succeeds_ ? BookmarkAppInstallationTask::Result::kSuccess
+                  : BookmarkAppInstallationTask::Result::kInstallationFailed);
+  }
+
+ private:
+  bool succeeds_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestBookmarkAppShortcutInstallationTask);
+};
+
+class PendingBookmarkAppManagerTest : public ChromeRenderViewHostTestHarness {
+ public:
+  PendingBookmarkAppManagerTest() = default;
+  ~PendingBookmarkAppManagerTest() override = default;
+
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    // CrxInstaller in BookmarkAppInstaller needs an ExtensionService, so
+    // create one for the profile.
+    TestExtensionSystem* test_system =
+        static_cast<TestExtensionSystem*>(ExtensionSystem::Get(profile()));
+    test_system->CreateExtensionService(base::CommandLine::ForCurrentProcess(),
+                                        profile()->GetPath(),
+                                        false /* autoupdate_enabled */);
+  }
+
+  std::unique_ptr<content::WebContents> CreateTestWebContents(
+      Profile* profile) {
+    auto web_contents =
+        content::WebContentsTester::CreateTestWebContents(profile, nullptr);
+    web_contents_tester_ = content::WebContentsTester::For(web_contents.get());
+    return web_contents;
+  }
+
+  std::unique_ptr<BookmarkAppInstallationTask> CreateSuccessfulInstallationTask(
+      Profile* profile) {
+    return std::make_unique<TestBookmarkAppShortcutInstallationTask>(profile,
+                                                                     true);
+  }
+
+  std::unique_ptr<BookmarkAppInstallationTask> CreateFailingInstallationTask(
+      Profile* profile) {
+    return std::make_unique<TestBookmarkAppShortcutInstallationTask>(profile,
+                                                                     false);
+  }
+
+  void InstallCallback(bool succeeded) {
+    install_succeeded_ = succeeded;
+  }
+
+ protected:
+  void ResetResults() { install_succeeded_ = base::nullopt; }
+
+  content::WebContentsTester* web_contents_tester() {
+    return web_contents_tester_;
+  }
+
+  bool install_succeeded() { return install_succeeded_.value(); }
+
+ private:
+  content::WebContentsTester* web_contents_tester_ = nullptr;
+  base::Optional<bool> install_succeeded_;
+
+  DISALLOW_COPY_AND_ASSIGN(PendingBookmarkAppManagerTest);
+};
+
+TEST_F(PendingBookmarkAppManagerTest, Install_Succeeds) {
+  PendingBookmarkAppManager pending_app_manager(profile());
+  pending_app_manager.SetFactoriesForTesting(
+      base::BindRepeating(&PendingBookmarkAppManagerTest::CreateTestWebContents,
+                          base::Unretained(this)),
+      base::BindRepeating(
+          &PendingBookmarkAppManagerTest::CreateSuccessfulInstallationTask,
+          base::Unretained(this)));
+
+  pending_app_manager.Install(
+      web_app::PendingAppManager::AppInfo(
+          GURL(kWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab),
+      base::BindOnce(&PendingBookmarkAppManagerTest::InstallCallback,
+                     base::Unretained(this)));
+  web_contents_tester()->NavigateAndCommit(GURL(kWebAppUrl));
+  web_contents_tester()->TestDidFinishLoad(GURL(kWebAppUrl));
+  EXPECT_TRUE(install_succeeded());
+}
+
+TEST_F(PendingBookmarkAppManagerTest, Install_SucceedsTwice) {
+  PendingBookmarkAppManager pending_app_manager(profile());
+  pending_app_manager.SetFactoriesForTesting(
+      base::BindRepeating(&PendingBookmarkAppManagerTest::CreateTestWebContents,
+                          base::Unretained(this)),
+      base::BindRepeating(
+          &PendingBookmarkAppManagerTest::CreateSuccessfulInstallationTask,
+          base::Unretained(this)));
+
+  pending_app_manager.Install(
+      web_app::PendingAppManager::AppInfo(
+          GURL(kWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab),
+      base::BindOnce(&PendingBookmarkAppManagerTest::InstallCallback,
+                     base::Unretained(this)));
+  web_contents_tester()->NavigateAndCommit(GURL(kWebAppUrl));
+  web_contents_tester()->TestDidFinishLoad(GURL(kWebAppUrl));
+  EXPECT_TRUE(install_succeeded());
+  ResetResults();
+
+  pending_app_manager.Install(
+      web_app::PendingAppManager::AppInfo(
+          GURL(kWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab),
+      base::BindOnce(&PendingBookmarkAppManagerTest::InstallCallback,
+                     base::Unretained(this)));
+  web_contents_tester()->NavigateAndCommit(GURL(kWebAppUrl));
+  web_contents_tester()->TestDidFinishLoad(GURL(kWebAppUrl));
+  EXPECT_TRUE(install_succeeded());
+}
+
+TEST_F(PendingBookmarkAppManagerTest, Install_FailsSameInstallPending) {
+  PendingBookmarkAppManager pending_app_manager(profile());
+  pending_app_manager.SetFactoriesForTesting(
+      base::BindRepeating(&PendingBookmarkAppManagerTest::CreateTestWebContents,
+                          base::Unretained(this)),
+      base::BindRepeating(
+          &PendingBookmarkAppManagerTest::CreateSuccessfulInstallationTask,
+          base::Unretained(this)));
+
+  pending_app_manager.Install(
+      web_app::PendingAppManager::AppInfo(
+          GURL(kWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab),
+      base::BindOnce(&PendingBookmarkAppManagerTest::InstallCallback,
+                     base::Unretained(this)));
+
+  pending_app_manager.Install(
+      web_app::PendingAppManager::AppInfo(
+          GURL(kWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab),
+      base::BindOnce(&PendingBookmarkAppManagerTest::InstallCallback,
+                     base::Unretained(this)));
+
+  // The second install should fail; the app is already getting installed.
+  EXPECT_FALSE(install_succeeded());
+  ResetResults();
+
+  // The original install should still be able to succeed.
+  web_contents_tester()->NavigateAndCommit(GURL(kWebAppUrl));
+  web_contents_tester()->TestDidFinishLoad(GURL(kWebAppUrl));
+  EXPECT_TRUE(install_succeeded());
+}
+
+TEST_F(PendingBookmarkAppManagerTest, Install_FailsLoadIncorrectURL) {
+  PendingBookmarkAppManager pending_app_manager(profile());
+  pending_app_manager.SetFactoriesForTesting(
+      base::BindRepeating(&PendingBookmarkAppManagerTest::CreateTestWebContents,
+                          base::Unretained(this)),
+      base::BindRepeating(
+          &PendingBookmarkAppManagerTest::CreateSuccessfulInstallationTask,
+          base::Unretained(this)));
+
+  pending_app_manager.Install(
+      web_app::PendingAppManager::AppInfo(
+          GURL(kWebAppUrl), web_app::PendingAppManager::LaunchContainer::kTab),
+      base::BindOnce(&PendingBookmarkAppManagerTest::InstallCallback,
+                     base::Unretained(this)));
+
+  web_contents_tester()->NavigateAndCommit(GURL(kWrongUrl));
+  web_contents_tester()->TestDidFinishLoad(GURL(kWrongUrl));
+  EXPECT_FALSE(install_succeeded());
+}
+
+}  // namespace extensions
diff --git a/chrome/browser/web_applications/extensions/web_app_extension_helpers.cc b/chrome/browser/web_applications/extensions/web_app_extension_helpers.cc
deleted file mode 100644
index 24c7d82..0000000
--- a/chrome/browser/web_applications/extensions/web_app_extension_helpers.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
-
-#include "chrome/browser/web_applications/components/web_app_helpers.h"
-
-namespace web_app {
-
-std::string GenerateApplicationNameFromExtensionId(const std::string& id) {
-  return GenerateApplicationNameFromAppId(id);
-}
-
-std::string GetExtensionIdFromApplicationName(const std::string& app_name) {
-  return GetAppIdFromApplicationName(app_name);
-}
-
-}  // namespace web_app
diff --git a/chrome/browser/web_applications/extensions/web_app_extension_helpers.h b/chrome/browser/web_applications/extensions/web_app_extension_helpers.h
deleted file mode 100644
index 3947f29..0000000
--- a/chrome/browser/web_applications/extensions/web_app_extension_helpers.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_WEB_APP_EXTENSION_HELPERS_H_
-#define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_WEB_APP_EXTENSION_HELPERS_H_
-
-#include <string>
-
-namespace web_app {
-
-// Compute a deterministic name based on an extension/apps's id.
-// A legacy alias for GenerateApplicationNameFromAppId.
-// TODO(loyso): Remove it.
-std::string GenerateApplicationNameFromExtensionId(const std::string& id);
-
-// Extracts the extension id from the app name.
-// A legacy alias for GetAppIdFromApplicationName.
-// TODO(loyso): Remove it.
-std::string GetExtensionIdFromApplicationName(const std::string& app_name);
-
-}  // namespace web_app
-
-#endif  // CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_WEB_APP_EXTENSION_HELPERS_H_
diff --git a/chrome/browser/web_applications/extensions/web_app_extension_shortcut.cc b/chrome/browser/web_applications/extensions/web_app_extension_shortcut.cc
index 63f858b..3f61534 100644
--- a/chrome/browser/web_applications/extensions/web_app_extension_shortcut.cc
+++ b/chrome/browser/web_applications/extensions/web_app_extension_shortcut.cc
@@ -9,7 +9,7 @@
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/extension_ui_util.h"
 #include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #include "chrome/common/pref_names.h"
 #include "components/prefs/pref_service.h"
@@ -113,6 +113,10 @@
   // If the shortcut is for an application shortcut with the new bookmark app
   // flow disabled, there will be no corresponding extension.
   if (!shortcut_info->extension_id.empty()) {
+    // The profile manager does not exist in some unit tests.
+    if (!g_browser_process->profile_manager())
+      return;
+
     // It's possible for the extension to be deleted before we get here.
     // For example, creating a hosted app from a website. Double check that
     // it still exists.
diff --git a/chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.mm b/chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.mm
index 556e79a..6564dd9 100644
--- a/chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.mm
+++ b/chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.mm
@@ -4,13 +4,13 @@
 
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut_mac.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/extensions/extension_ui_util.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/web_applications/components/web_app_helpers.h"
 #include "chrome/browser/web_applications/components/web_app_shortcut_mac.h"
-#include "chrome/browser/web_applications/extensions/web_app_extension_helpers.h"
 #include "chrome/browser/web_applications/extensions/web_app_extension_shortcut.h"
 #include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
 #import "chrome/common/mac/app_mode_common.h"
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc
index c281542..4e98d973 100644
--- a/chrome/browser/web_applications/web_app_provider.cc
+++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -8,8 +8,9 @@
 
 #include "base/bind.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
+#include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/bookmark_apps/external_web_apps.h"
 #include "chrome/browser/web_applications/bookmark_apps/policy/web_app_policy_manager.h"
 #include "chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h"
@@ -24,11 +25,11 @@
   return WebAppProviderFactory::GetForProfile(profile);
 }
 
-WebAppProvider::WebAppProvider(PrefService* pref_service)
+WebAppProvider::WebAppProvider(Profile* profile)
     : pending_app_manager_(
-          std::make_unique<extensions::PendingBookmarkAppManager>()),
+          std::make_unique<extensions::PendingBookmarkAppManager>(profile)),
       web_app_policy_manager_(
-          std::make_unique<WebAppPolicyManager>(pref_service,
+          std::make_unique<WebAppPolicyManager>(profile->GetPrefs(),
                                                 pending_app_manager_.get())) {
 #if defined(OS_CHROMEOS)
   // As of mid 2018, only Chrome OS has default web apps or external web apps.
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h
index da3efc3..d122dd1 100644
--- a/chrome/browser/web_applications/web_app_provider.h
+++ b/chrome/browser/web_applications/web_app_provider.h
@@ -12,7 +12,6 @@
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/web_applications/components/pending_app_manager.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/prefs/pref_service.h"
 
 class Profile;
 
@@ -32,7 +31,7 @@
  public:
   static WebAppProvider* Get(Profile* profile);
 
-  explicit WebAppProvider(PrefService* pref_service);
+  explicit WebAppProvider(Profile* profile);
 
   // Clients can use PendingAppManager to install, uninstall, and update
   // Web Apps.
diff --git a/chrome/browser/web_applications/web_app_provider_factory.cc b/chrome/browser/web_applications/web_app_provider_factory.cc
index bbf0533..1e81952 100644
--- a/chrome/browser/web_applications/web_app_provider_factory.cc
+++ b/chrome/browser/web_applications/web_app_provider_factory.cc
@@ -37,7 +37,7 @@
 KeyedService* WebAppProviderFactory::BuildServiceInstanceFor(
     content::BrowserContext* context) const {
   Profile* profile = Profile::FromBrowserContext(context);
-  return new WebAppProvider(profile->GetPrefs());
+  return new WebAppProvider(profile);
 }
 
 bool WebAppProviderFactory::ServiceIsCreatedWithBrowserContext() const {
diff --git a/chrome/browser/win/automation_controller.cc b/chrome/browser/win/automation_controller.cc
index 2ade7be..43f0c2b 100644
--- a/chrome/browser/win/automation_controller.cc
+++ b/chrome/browser/win/automation_controller.cc
@@ -19,7 +19,7 @@
 #include "base/sequence_checker.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/win/scoped_variant.h"
 #include "chrome/browser/win/ui_automation_util.h"
 #include "ui/base/win/atl_module.h"
diff --git a/chrome/browser/win/jumplist.cc b/chrome/browser/win/jumplist.cc
index 1098a56..f1ec10f2 100644
--- a/chrome/browser/win/jumplist.cc
+++ b/chrome/browser/win/jumplist.cc
@@ -17,8 +17,8 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread.h"
 #include "base/timer/elapsed_timer.h"
 #include "base/trace_event/trace_event.h"
diff --git a/chrome/chrome_cleaner/logging/safe_browsing_reporter.cc b/chrome/chrome_cleaner/logging/safe_browsing_reporter.cc
index c2be395..94c92c29 100644
--- a/chrome/chrome_cleaner/logging/safe_browsing_reporter.cc
+++ b/chrome/chrome_cleaner/logging/safe_browsing_reporter.cc
@@ -21,7 +21,7 @@
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 14b76e8..5b92cf79 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -242,6 +242,7 @@
     "//components/nacl/common:buildflags",
     "//components/nacl/common:process_type",
     "//components/nacl/common:switches",
+    "//components/net_log",
     "//components/network_session_configurator/common",
     "//components/ntp_tiles",
     "//components/offline_pages/buildflags",
diff --git a/chrome/common/DEPS b/chrome/common/DEPS
index c7682f1..fbbbe3c 100644
--- a/chrome/common/DEPS
+++ b/chrome/common/DEPS
@@ -26,6 +26,7 @@
   "+components/metrics/client_info.h",
   "+components/metrics/metrics_pref_names.h",
   "+components/nacl/common",
+  "+components/net_log",
   "+components/network_session_configurator/common",
   "+components/ntp_tiles",
   "+components/nux_google_apps",
diff --git a/chrome/common/chrome_content_client.cc b/chrome/common/chrome_content_client.cc
index f8a16d1..f98d01cf 100644
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -26,6 +26,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/version.h"
 #include "build/build_config.h"
+#include "chrome/common/channel_info.h"
 #include "chrome/common/child_process_logging.h"
 #include "chrome/common/chrome_constants.h"
 #include "chrome/common/chrome_paths.h"
@@ -37,6 +38,7 @@
 #include "chrome/grit/common_resources.h"
 #include "components/crash/core/common/crash_key.h"
 #include "components/dom_distiller/core/url_constants.h"
+#include "components/net_log/chrome_net_log.h"
 #include "components/services/heap_profiling/public/cpp/client.h"
 #include "components/version_info/version_info.h"
 #include "content/public/common/cdm_info.h"
@@ -679,6 +681,16 @@
       resource_id);
 }
 
+base::DictionaryValue ChromeContentClient::GetNetLogConstants() const {
+  auto platform_dict = net_log::ChromeNetLog::GetPlatformConstants(
+      base::CommandLine::ForCurrentProcess()->GetCommandLineString(),
+      chrome::GetChannelName());
+  if (platform_dict)
+    return std::move(*platform_dict);
+  else
+    return base::DictionaryValue();
+}
+
 std::string ChromeContentClient::GetProcessTypeNameInEnglish(int type) {
 #if BUILDFLAG(ENABLE_NACL)
   switch (type) {
diff --git a/chrome/common/chrome_content_client.h b/chrome/common/chrome_content_client.h
index 3258d3a..9eb2c04 100644
--- a/chrome/common/chrome_content_client.h
+++ b/chrome/common/chrome_content_client.h
@@ -87,6 +87,7 @@
   base::RefCountedMemory* GetDataResourceBytes(
       int resource_id) const override;
   gfx::Image& GetNativeImageNamed(int resource_id) const override;
+  base::DictionaryValue GetNetLogConstants() const override;
   std::string GetProcessTypeNameInEnglish(int type) override;
 
   bool AllowScriptExtensionForServiceWorker(const GURL& script_url) override;
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 55d4642..fa4bff8 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -40,10 +40,6 @@
 // Use the Toolkit-Views Task Manager window.
 const base::Feature kViewsTaskManager{"ViewsTaskManager",
                                       base::FEATURE_DISABLED_BY_DEFAULT};
-
-// Enables the suggested text touch bar for autocomplete in textfields.
-const base::Feature kSuggestedTextTouchBar{"SuggestedTextTouchBar",
-                                           base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // defined(OS_MACOSX)
 
 #if !defined(OS_ANDROID)
@@ -147,6 +143,12 @@
                                        base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
+#if defined(OS_MACOSX)
+// Enables the suggested text touch bar for autocomplete in textfields.
+const base::Feature kTextSuggestionsTouchBar{"TextSuggestionsTouchBar",
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
 // Enables the blocking of third-party modules.
 // Note: Due to a limitation in the implementation of this feature, it is
@@ -499,8 +501,7 @@
     "SecurityKeyAttestationPrompt", base::FEATURE_ENABLED_BY_DEFAULT};
 
 #if defined(OS_MACOSX)
-// Whether to show all dialogs with toolkit-views on Mac, rather than Cocoa. A
-// subset of "pilot" dialogs can be enabled with kSecondaryUiMd.
+// Whether to show all dialogs with toolkit-views on Mac, rather than Cocoa.
 const base::Feature kShowAllDialogsWithViewsToolkit{
     "ShowAllDialogsWithViewsToolkit", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif  // defined(OS_MACOSX)
@@ -649,13 +650,18 @@
 // Enables or disables initialization & use of the Chrome OS ML Service.
 const base::Feature kMachineLearningService{"MachineLearningService",
                                             base::FEATURE_DISABLED_BY_DEFAULT};
+
+// Enable USBGuard at the lockscreen on Chrome OS.
+const base::Feature kUsbguard{"USBGuard", base::FEATURE_DISABLED_BY_DEFAULT};
 #endif  // defined(OS_CHROMEOS)
 
 #if !defined(OS_ANDROID)
 // Allow capturing of WebRTC event logs, and uploading of those logs to Crash.
 // Please note that a Chrome policy must also be set, for this to have effect.
+// Effectively, this is a kill-switch for the feature.
+// TODO(crbug.com/775415): Remove this kill-switch.
 extern const base::Feature kWebRtcRemoteEventLog{
-    "WebRtcRemoteEventLog", base::FEATURE_DISABLED_BY_DEFAULT};
+    "WebRtcRemoteEventLog", base::FEATURE_ENABLED_BY_DEFAULT};
 // Compress remote-bound WebRTC event logs (if used; see kWebRtcRemoteEventLog).
 extern const base::Feature kWebRtcRemoteEventLogGzipped{
     "WebRtcRemoteEventLogGzipped", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 312c44fb..0d98206e 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -291,10 +291,6 @@
 
 extern const base::Feature kSoundContentSetting;
 
-#if defined(OS_MACOSX)
-extern const base::Feature kSuggestedTextTouchBar;
-#endif
-
 extern const base::Feature kSupervisedUserCommittedInterstitials;
 
 #if defined(OS_CHROMEOS)
@@ -305,6 +301,10 @@
 extern const base::Feature kTabMetricsLogging;
 #endif
 
+#if defined(OS_MACOSX)
+extern const base::Feature kTextSuggestionsTouchBar;
+#endif
+
 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD)
 extern const base::Feature kThirdPartyModulesBlocking;
 #endif
@@ -351,6 +351,8 @@
 extern const base::Feature kCrOSEnableUSMUserService;
 
 extern const base::Feature kMachineLearningService;
+
+extern const base::Feature kUsbguard;
 #endif  // defined(OS_CHROMEOS)
 
 #if !defined(OS_ANDROID)
diff --git a/chrome/common/conflicts/module_watcher_win.cc b/chrome/common/conflicts/module_watcher_win.cc
index 1691d7e..814030b 100644
--- a/chrome/common/conflicts/module_watcher_win.cc
+++ b/chrome/common/conflicts/module_watcher_win.cc
@@ -19,8 +19,8 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/win/scoped_handle.h"
 
diff --git a/chrome/common/extensions/api/BUILD.gn b/chrome/common/extensions/api/BUILD.gn
index fa6b3a1c..867359dc 100644
--- a/chrome/common/extensions/api/BUILD.gn
+++ b/chrome/common/extensions/api/BUILD.gn
@@ -12,9 +12,10 @@
 
 assert(enable_extensions)
 
-json_schema_api("api") {
+# TODO(devlin): Enforce visibility restrictions on more of these targets?
+
+json_schema_api("generated_api_bundles") {
   sources = chrome_extensions_api_schema_sources
-  schemas = true
   bundle = true
   configs = [ "//build/config:precompiled_headers" ]
   bundle_name = "Chrome"
@@ -48,6 +49,21 @@
   deps = [
     "//extensions/common/api",
   ]
+
+  visibility = [ ":api" ]
+}
+
+generated_types("generated_api_types") {
+  sources = chrome_extensions_api_schema_sources
+  configs = [ "//build/config:precompiled_headers" ]
+  schema_include_rules = chrome_extensions_api_schema_include_rules
+
+  root_namespace = chrome_extensions_api_root_namespace
+  deps = [
+    "//extensions/common/api",
+  ]
+
+  visibility = [ ":api" ]
 }
 
 json_features("api_features") {
@@ -74,6 +90,15 @@
   ]
 }
 
+# Public Targets
+
+group("api") {
+  public_deps = [
+    ":generated_api_bundles",
+    ":generated_api_types",
+  ]
+}
+
 group("extensions_features") {
   public_deps = [
     ":api_features",
diff --git a/chrome/common/extensions/api/chromeos_info_private.json b/chrome/common/extensions/api/chromeos_info_private.json
index 62e156a..85b85e4 100644
--- a/chrome/common/extensions/api/chromeos_info_private.json
+++ b/chrome/common/extensions/api/chromeos_info_private.json
@@ -59,6 +59,12 @@
         "type": "string",
         "enum": ["unsupported", "supported", "seen"],
         "description": "Status of stylus."
+      },
+      {
+        "id": "AssistantStatus",
+        "type": "string",
+        "enum": ["unsupported", "supported"],
+        "description": "Status of Google Assistant."
       }
     ],
     "functions": [
@@ -93,6 +99,7 @@
                   "managedDeviceStatus": {"$ref": "ManagedDeviceStatus", "optional": true},
                   "deviceType": {"$ref": "DeviceType", "optional": true},
                   "stylusStatus": {"$ref": "StylusStatus", "optional": true},
+                  "assistantStatus": {"$ref": "AssistantStatus", "optional": true},
                   "clientId" : {"type": "string", "optional": true, "description": "Device client id"},
                   "timezone" : {"type": "string", "optional": true, "description": "Timezone"},
                   "a11yLargeCursorEnabled" : {"type": "boolean", "optional": true, "description": "If true, ChromeOS is showing enlarged cursor."},
diff --git a/chrome/common/extensions/api/input_ime.json b/chrome/common/extensions/api/input_ime.json
index 765c326..dd14520 100644
--- a/chrome/common/extensions/api/input_ime.json
+++ b/chrome/common/extensions/api/input_ime.json
@@ -97,11 +97,6 @@
         "description": "The screen type under which the IME is activated."
       },
       {
-        "id": "CallbackStyle",
-        "type": "string",
-        "enum": ["async"]
-      },
-      {
         "id": "MouseButton",
         "type": "string",
         "description": "Which mouse buttons was clicked.",
@@ -752,7 +747,7 @@
       {
         "name": "onKeyEvent",
         "type": "function",
-        "description": "Fired when a key event is sent from the operating system. The event will be sent to the extension if this extension owns the active IME.",
+        "description": "Fired when a key event is sent from the operating system. The event will be sent to the extension if this extension owns the active IME. The listener function should return true if the event was handled false if it was not.  If the event will be evaluated asynchronously, this function must return undefined and the IME must later call keyEventHandled() with the result.",
         "platforms": ["chromeos", "win", "linux"],
         "options": {
           "supportsFilters": false,
@@ -772,20 +767,9 @@
             "description": "Data on the key event"
           }
         ],
-        "extraParameters": [
-          {
-            "type": "array",
-            "optional": true,
-            "name": "extraInfoSpec",
-            "description": "Array of extra information that specifies how the callback is invoked.",
-            "items": {
-              "$ref": "CallbackStyle"
-            }
-          }
-        ],
         "returns": {
           "type": "boolean",
-          "description": "True if the keystroke was handled, false if not.  This function should always return a value if |async| is not specified.",
+          "description": "True if the keystroke was handled, false if not. Or returns undefined if the extension decides to call keyEventHandled explicitly.",
           "optional": true
         }
       },
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 9abde10..4efe9184 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -1122,6 +1122,11 @@
 const char kPrintPreviewDefaultDestinationSelectionRules[] =
     "printing.default_destination_selection_rules";
 
+// A pref holding a policy that can force 'Headers and footers' checkbox to be
+// checked/unchecked, in Print Preview. It is a |HeaderFooterEnforcement| enum
+// value.
+const char kPrintHeaderFooter[] = "printing.print_header_footer";
+
 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
 // A pref that sets the default destination in Print Preview to always be the
 // OS default printer instead of the most recently used destination.
@@ -1252,6 +1257,8 @@
 const char kWebRTCIPHandlingPolicy[] = "webrtc.ip_handling_policy";
 // Define range of UDP ports allowed to be used by WebRTC PeerConnections.
 const char kWebRTCUDPPortRange[] = "webrtc.udp_port_range";
+// Whether WebRTC event log collection by Google domains is allowed.
+const char kWebRtcEventLogCollectionAllowed[] = "webrtc.event_logs_collection";
 
 #if !defined(OS_ANDROID)
 // Whether or not this profile has been shown the Welcome page.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 8d4695be..f84cb51 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -376,6 +376,7 @@
 extern const char kPrintingEnabled[];
 extern const char kPrintPreviewDisabled[];
 extern const char kPrintPreviewDefaultDestinationSelectionRules[];
+extern const char kPrintHeaderFooter[];
 
 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
 extern const char kPrintPreviewUseSystemDefaultPrinter[];
@@ -425,6 +426,7 @@
 extern const char kWebRTCNonProxiedUdpEnabled[];
 extern const char kWebRTCIPHandlingPolicy[];
 extern const char kWebRTCUDPPortRange[];
+extern const char kWebRtcEventLogCollectionAllowed[];
 
 #if !defined(OS_ANDROID)
 extern const char kHasSeenWelcomePage[];
diff --git a/chrome/common/search/ntp_logging_events.h b/chrome/common/search/ntp_logging_events.h
index 975d3812..15c98fa 100644
--- a/chrome/common/search/ntp_logging_events.h
+++ b/chrome/common/search/ntp_logging_events.h
@@ -9,7 +9,7 @@
 // to transfer information from the NTP javascript to the renderer and is *not*
 // used as a UMA enum histogram's logged value.
 // Note: Keep in sync with browser/resources/local_ntp/local_ntp.js, voice.js,
-// and most_visited_single.js.
+// most_visited_single.js, and custom_backgrounds.js.
 enum NTPLoggingEventType {
   // Deleted: NTP_SERVER_SIDE_SUGGESTION = 0,
   // Deleted: NTP_CLIENT_SIDE_SUGGESTION = 1,
@@ -79,7 +79,52 @@
   // The One Google Bar was shown.
   NTP_ONE_GOOGLE_BAR_SHOWN = 37,
 
-  NTP_EVENT_TYPE_LAST = NTP_ONE_GOOGLE_BAR_SHOWN
+  // The NTP background has been customized with an image.
+  NTP_BACKGROUND_CUSTOMIZED = 38,
+  // Shortcuts have been customized on the NTP.
+  NTP_SHORTCUT_CUSTOMIZED = 39,
+
+  // The 'Chrome backgrounds' menu item was clicked.
+  NTP_CUSTOMIZE_CHROME_BACKGROUNDS_CLICKED = 40,
+  // The 'Upload an image' menu item was clicked.
+  NTP_CUSTOMIZE_LOCAL_IMAGE_CLICKED = 41,
+  // The 'Restore default background' menu item was clicked.
+  NTP_CUSTOMIZE_RESTORE_BACKGROUND_CLICKED = 42,
+  // The attribution link on a customized background image was clicked.
+  NTP_CUSTOMIZE_ATTRIBUTION_CLICKED = 43,
+  // The 'Add shortcut' link was clicked.
+  NTP_CUSTOMIZE_ADD_SHORTCUT_CLICKED = 44,
+  // The 'Edit shortcut' link was clicked.
+  NTP_CUSTOMIZE_EDIT_SHORTCUT_CLICKED = 45,
+  // The 'Restore default shortcuts' menu item was clicked.
+  NTP_CUSTOMIZE_RESTORE_SHORTCUTS_CLICKED = 46,
+
+  // A collection was selected in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_COLLECTION = 47,
+  // An image was selected in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_SELECT_IMAGE = 48,
+  // 'Cancel' was clicked in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_CANCEL = 49,
+  // 'Done' was clicked in the 'Chrome backgrounds' dialog.
+  NTP_CUSTOMIZE_CHROME_BACKGROUND_DONE = 50,
+
+  // 'Cancel' was clicked in the 'Upload an image' dialog.
+  NTP_CUSTOMIZE_LOCAL_IMAGE_CANCEL = 51,
+  // 'Done' was clicked in the 'Upload an image' dialog.
+  NTP_CUSTOMIZE_LOCAL_IMAGE_DONE = 52,
+
+  // 'Remove' was clicked in the 'Edit shortcut' dialog.
+  NTP_CUSTOMIZE_SHORTCUT_REMOVE = 53,
+  // 'Cancel' was clicked in the 'Edit shortcut' dialog.
+  NTP_CUSTOMIZE_SHORTCUT_CANCEL = 54,
+  // 'Done' was clicked in the 'Edit shortcut' dialog.
+  NTP_CUSTOMIZE_SHORTCUT_DONE = 55,
+  // 'Undo' was clicked in the message pop-up.
+  NTP_CUSTOMIZE_SHORTCUT_UNDO = 56,
+  // 'Restore default shortcuts' was clicked in the message pop-up.
+  NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL = 57,
+
+  NTP_EVENT_TYPE_LAST = NTP_CUSTOMIZE_SHORTCUT_RESTORE_ALL
 };
 
 #endif  // CHROME_COMMON_SEARCH_NTP_LOGGING_EVENTS_H_
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index ebded7c8..d02c5059 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -274,6 +274,7 @@
 const char kImportDataSubPage[] = "importData";
 const char kLanguageOptionsSubPage[] = "languages";
 const char kPasswordManagerSubPage[] = "passwords";
+const char kPaymentsSubPage[] = "payments";
 const char kPrintingSettingsSubPage[] = "printing";
 const char kResetProfileSettingsSubPage[] = "resetProfileSettings";
 const char kSearchEnginesSubPage[] = "searchEngines";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 4d819c4b..a52d75b 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -266,6 +266,7 @@
 extern const char kLanguageOptionsSubPage[];
 extern const char kManageProfileSubPage[];
 extern const char kPasswordManagerSubPage[];
+extern const char kPaymentsSubPage[];
 extern const char kPeopleSubPage[];
 extern const char kPrintingSettingsSubPage[];
 extern const char kResetProfileSettingsSubPage[];
diff --git a/chrome/installer/linux/rpm/additional_deps b/chrome/installer/linux/rpm/additional_deps
index ce3f135..3211103 100644
--- a/chrome/installer/linux/rpm/additional_deps
+++ b/chrome/installer/linux/rpm/additional_deps
@@ -3,9 +3,6 @@
 # found in the LICENSE file.
 #
 # Additional dependencies not in the rpm find-requires output.
-#
-# TODO(thestig,bugzilla.redhat.com/show_bug.cgi?id=1482760): Use the
-# liberation-fonts package once it's available on all distros.
 
 # For lsb_release.
 /usr/bin/lsb_release
@@ -16,6 +13,9 @@
 # Temporary entry for tray icons
 libappindicator3.so.1()(64bit)
 
+# Make sure users have compatible fonts for viewing PDFs.
+liberation-fonts
+
 # Specify a more recent version for security and stability updates. While we
 # depend on libnss3.so and not libssl3.so, force the dependency on libssl3 to
 # ensure the NSS version is 3.28 or later, since libssl3 should always be
diff --git a/chrome/installer/util/experiment_storage.cc b/chrome/installer/util/experiment_storage.cc
index 05c012ff..a33c8e9d 100644
--- a/chrome/installer/util/experiment_storage.cc
+++ b/chrome/installer/util/experiment_storage.cc
@@ -17,8 +17,8 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "base/win/registry.h"
 #include "base/win/win_util.h"
diff --git a/chrome/installer/util/google_update_settings.cc b/chrome/installer/util/google_update_settings.cc
index d65a33da..22bcf8c 100644
--- a/chrome/installer/util/google_update_settings.cc
+++ b/chrome/installer/util/google_update_settings.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "base/win/registry.h"
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index 5b5f0e8..c8c0126 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 import("//build/config/features.gni")
+import("//build/config/jumbo.gni")
 import("//chrome/common/features.gni")
 import("//components/nacl/features.gni")
 import("//components/offline_pages/buildflags/features.gni")
@@ -35,7 +36,7 @@
   ]
 }
 
-static_library("renderer") {
+jumbo_static_library("renderer") {
   sources = [
     "app_categorizer.cc",
     "app_categorizer.h",
@@ -421,7 +422,7 @@
   }
 }
 
-static_library("test_support") {
+jumbo_static_library("test_support") {
   testonly = true
   visibility = [ "//chrome/test:test_support" ]
 
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index da38a7e6..fbf143fd 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -272,7 +272,7 @@
 }
 #endif  // BUILDFLAG(ENABLE_PLUGINS)
 
-bool IsStandaloneExtensionProcess() {
+bool IsStandaloneContentExtensionProcess() {
 #if !BUILDFLAG(ENABLE_EXTENSIONS)
   return false;
 #else
@@ -376,7 +376,7 @@
   RenderThread* thread = RenderThread::Get();
 
   thread->SetRendererProcessType(
-      IsStandaloneExtensionProcess()
+      IsStandaloneContentExtensionProcess()
           ? blink::scheduler::RendererProcessType::kExtensionRenderer
           : blink::scheduler::RendererProcessType::kRenderer);
 
@@ -1217,7 +1217,7 @@
 }
 
 bool ChromeContentRendererClient::RunIdleHandlerWhenWidgetsHidden() {
-  return !IsStandaloneExtensionProcess();
+  return !IsStandaloneContentExtensionProcess();
 }
 
 bool ChromeContentRendererClient::AllowPopup() {
@@ -1603,7 +1603,7 @@
 // information. Also, the enforcement of sending and binding UDP is already done
 // by chrome extension permission model.
 bool ChromeContentRendererClient::ShouldEnforceWebRTCRoutingPreferences() {
-  return !IsStandaloneExtensionProcess();
+  return !IsStandaloneContentExtensionProcess();
 }
 
 GURL ChromeContentRendererClient::OverrideFlashEmbedWithHTML(const GURL& url) {
diff --git a/chrome/renderer/extensions/extension_hooks_delegate.cc b/chrome/renderer/extensions/extension_hooks_delegate.cc
index ca1e9072..3f0513a 100644
--- a/chrome/renderer/extensions/extension_hooks_delegate.cc
+++ b/chrome/renderer/extensions/extension_hooks_delegate.cc
@@ -27,7 +27,7 @@
 
 using RequestResult = APIBindingHooks::RequestResult;
 
-constexpr char kSendRequest[] = "extension.sendRequest";
+constexpr char kSendExtensionRequest[] = "extension.sendRequest";
 constexpr char kGetURL[] = "extension.getURL";
 constexpr char kGetBackgroundPage[] = "extension.getBackgroundPage";
 constexpr char kGetViews[] = "extension.getViews";
@@ -116,7 +116,7 @@
     Handler handler;
     base::StringPiece method;
   } kHandlers[] = {
-      {&ExtensionHooksDelegate::HandleSendRequest, kSendRequest},
+      {&ExtensionHooksDelegate::HandleSendRequest, kSendExtensionRequest},
       {&ExtensionHooksDelegate::HandleGetURL, kGetURL},
       {&ExtensionHooksDelegate::HandleGetBackgroundPage, kGetBackgroundPage},
       {&ExtensionHooksDelegate::HandleGetExtensionTabs, kGetExtensionTabs},
@@ -136,7 +136,7 @@
   if (!handler)
     return RequestResult(RequestResult::NOT_HANDLED);
 
-  if (method_name == kSendRequest) {
+  if (method_name == kSendExtensionRequest) {
     messaging_util::MassageSendMessageArguments(context->GetIsolate(), false,
                                                 arguments);
   }
diff --git a/chrome/renderer/extensions/tabs_hooks_delegate.cc b/chrome/renderer/extensions/tabs_hooks_delegate.cc
index 1dc3c47..ef4dff6 100644
--- a/chrome/renderer/extensions/tabs_hooks_delegate.cc
+++ b/chrome/renderer/extensions/tabs_hooks_delegate.cc
@@ -25,7 +25,7 @@
 
 constexpr char kConnect[] = "tabs.connect";
 constexpr char kSendMessage[] = "tabs.sendMessage";
-constexpr char kSendRequest[] = "tabs.sendRequest";
+constexpr char kSendTabsRequest[] = "tabs.sendRequest";
 
 }  // namespace
 
@@ -49,7 +49,7 @@
     base::StringPiece method;
   } kHandlers[] = {
       {&TabsHooksDelegate::HandleSendMessage, kSendMessage},
-      {&TabsHooksDelegate::HandleSendRequest, kSendRequest},
+      {&TabsHooksDelegate::HandleSendRequest, kSendTabsRequest},
       {&TabsHooksDelegate::HandleConnect, kConnect},
   };
 
diff --git a/chrome/renderer/resources/extensions/input.ime_custom_bindings.js b/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
index f3daa9c..3ad1e5e 100644
--- a/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/input.ime_custom_bindings.js
@@ -11,13 +11,11 @@
     $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) :
     require('event_bindings').registerArgumentMassager;
 
-// TODO(crbug.com/733825): These bindings have some issues.
-
-var inputIme;
+var keyEventHandled;
 registerArgumentMassager('input.ime.onKeyEvent',
                          function(args, dispatch) {
   var keyData = args[1];
-  var result = false;
+  var result = undefined;
   try {
     // dispatch() is weird - it returns an object {results: array<results>} iff
     // there is at least one result value that !== undefined. Since onKeyEvent
@@ -27,25 +25,22 @@
     if (dispatchResult && dispatchResult.results)
       result = dispatchResult.results[0];
   } catch (e) {
+    result = false;
     console.error('Error in event handler for onKeyEvent: ' + e.stack);
   }
-  if (!inputIme.onKeyEvent.async)
-    inputIme.keyEventHandled(keyData.requestId, result);
+  if (result !== undefined) {
+    keyEventHandled(keyData.requestId, !!result);
+  }
 });
 
 binding.registerCustomHook(function(api) {
- inputIme = api.compiledApi;
+  keyEventHandled = api.compiledApi.keyEventHandled;
 
-  var originalAddListener = inputIme.onKeyEvent.addListener;
-  inputIme.onKeyEvent.addListener = function(cb, opt_extraInfo) {
-    inputIme.onKeyEvent.async = false;
-    if (opt_extraInfo instanceof Array) {
-      for (var i = 0; i < opt_extraInfo.length; ++i) {
-        if (opt_extraInfo[i] == 'async') {
-          inputIme.onKeyEvent.async = true;
-        }
-      }
-    }
+  // TODO(shuchen): override onKeyEvent.addListener only for compatibility.
+  // This should be removed after the IME extension doesn't rely on the
+  // additional "async" parameter.
+  var originalAddListener = api.compiledApi.onKeyEvent.addListener;
+  api.compiledApi.onKeyEvent.addListener = function(cb, opt_extraInfo) {
     $Function.call(originalAddListener, this, cb);
   };
 
diff --git a/chrome/renderer/sandbox_status_extension_android.cc b/chrome/renderer/sandbox_status_extension_android.cc
index df34509..573d61d 100644
--- a/chrome/renderer/sandbox_status_extension_android.cc
+++ b/chrome/renderer/sandbox_status_extension_android.cc
@@ -9,7 +9,7 @@
 #include "base/android/build_info.h"
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/url_constants.h"
 #include "content/public/renderer/chrome_object_extensions_utils.h"
 #include "content/public/renderer/render_frame.h"
diff --git a/chrome/service/service_process.cc b/chrome/service/service_process.cc
index d4ed98d4..11bd3fc 100644
--- a/chrome/service/service_process.cc
+++ b/chrome/service/service_process.cc
@@ -23,9 +23,9 @@
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/values.h"
diff --git a/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc b/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
index 142819b..0abcb67 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_dmg_analyzer_mac.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/safe_browsing/archive_analyzer_results.h"
 #include "chrome/services/file_util/public/mojom/constants.mojom.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
index deebe13..7849a939 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/process/process_handle.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/safe_browsing/archive_analyzer_results.h"
 #include "chrome/services/file_util/public/mojom/constants.mojom.h"
 #include "chrome/services/file_util/public/mojom/safe_archive_analyzer.mojom.h"
diff --git a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
index 29639319..2d9cec2 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_zip_analyzer.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/common/safe_browsing/archive_analyzer_results.h"
 #include "chrome/services/file_util/public/mojom/constants.mojom.h"
 #include "chrome/services/file_util/public/mojom/safe_archive_analyzer.mojom.h"
diff --git a/chrome/services/file_util/public/cpp/zip_file_creator.cc b/chrome/services/file_util/public/cpp/zip_file_creator.cc
index 4a5ffb8..b36fd8da 100644
--- a/chrome/services/file_util/public/cpp/zip_file_creator.cc
+++ b/chrome/services/file_util/public/cpp/zip_file_creator.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/services/file_util/public/mojom/constants.mojom.h"
 #include "components/services/filesystem/directory_impl.h"
 #include "components/services/filesystem/lock_table.h"
diff --git a/chrome/services/file_util/public/cpp/zip_file_creator.h b/chrome/services/file_util/public/cpp/zip_file_creator.h
index e914f7a6..64f98e45 100644
--- a/chrome/services/file_util/public/cpp/zip_file_creator.h
+++ b/chrome/services/file_util/public/cpp/zip_file_creator.h
@@ -10,7 +10,7 @@
 #include "base/callback.h"
 #include "base/files/file.h"
 #include "base/files/file_path.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chrome/services/file_util/public/mojom/zip_file_creator.mojom.h"
 
 namespace service_manager {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 18030aeb..546c406f 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1294,6 +1294,7 @@
         "../browser/extensions/content_verifier_hash_fetch_behavior_browsertest.cc",
         "../browser/extensions/content_verifier_test_utils.cc",
         "../browser/extensions/content_verifier_test_utils.h",
+        "../browser/extensions/cross_origin_read_blocking_browsertest.cc",
         "../browser/extensions/cross_origin_xhr_apitest.cc",
         "../browser/extensions/crx_installer_browsertest.cc",
         "../browser/extensions/docs/examples/apps/calculator_browsertest.cc",
@@ -1945,7 +1946,6 @@
         "../browser/ui/cocoa/dev_tools_controller_browsertest.mm",
         "../browser/ui/cocoa/extensions/extension_install_prompt_test_utils.h",
         "../browser/ui/cocoa/extensions/extension_install_prompt_test_utils.mm",
-        "../browser/ui/cocoa/extensions/extension_message_bubble_browsertest_mac.mm",
         "../browser/ui/cocoa/extensions/media_galleries_dialog_cocoa_browsertest.mm",
         "../browser/ui/cocoa/find_bar/find_bar_browsertest.mm",
         "../browser/ui/cocoa/location_bar/content_setting_decoration_browsertest.mm",
@@ -1957,7 +1957,7 @@
         "../browser/ui/cocoa/renderer_context_menu/render_view_context_menu_mac_cocoa_browsertest.mm",
         "../browser/ui/cocoa/ssl_client_certificate_selector_cocoa_browsertest.mm",
         "../browser/ui/cocoa/touchbar/browser_window_touch_bar_controller_browsertest.mm",
-        "../browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_browsertest.mm",
+        "../browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_browsertest.mm",
         "../browser/ui/cocoa/view_id_util_browsertest.mm",
         "../browser/ui/cocoa/web_contents_modal_dialog_manager_views_mac_browsertest.mm",
 
@@ -1994,11 +1994,11 @@
         "../browser/vr/test/webxr_vr_browser_test.h",
         "../browser/vr/test/xr_browser_test.cc",
         "../browser/vr/test/xr_browser_test.h",
-        "../browser/vr/webvr_frame_pose_browser_test.cc",
-        "../browser/vr/webvr_input_browser_test.cc",
-        "../browser/vr/webvr_pixel_browser_test.cc",
-        "../browser/vr/webvr_tab_browser_test.cc",
-        "../browser/vr/webvr_transition_browser_test.cc",
+        "../browser/vr/webxr_vr_frame_pose_browser_test.cc",
+        "../browser/vr/webxr_vr_input_browser_test.cc",
+        "../browser/vr/webxr_vr_pixel_browser_test.cc",
+        "../browser/vr/webxr_vr_tab_browser_test.cc",
+        "../browser/vr/webxr_vr_transition_browser_test.cc",
       ]
       deps += [
         "//chrome:other_version",
@@ -2871,6 +2871,7 @@
     "//net:test_support",
     "//ppapi/buildflags",
     "//services/data_decoder/public/cpp:test_support",
+    "//services/network:test_support",
     "//services/network/public/cpp",
     "//skia",
     "//testing/gmock",
@@ -3049,7 +3050,7 @@
       "../browser/resource_coordinator/usage_clock_unittest.cc",
 
       # Android does not use the Message Center notification system.
-      "../browser/notifications/message_center_notifications_unittest.cc",
+      "../browser/notifications/notification_ui_manager_unittest.cc",
       "../browser/platform_util_unittest.cc",
       "../browser/policy/policy_path_parser_unittest.cc",
       "../browser/profile_resetter/profile_resetter_unittest.cc",
@@ -3340,7 +3341,7 @@
 
   if (is_chromeos) {
     sources -= [
-      "../browser/notifications/message_center_notifications_unittest.cc",
+      "../browser/notifications/notification_ui_manager_unittest.cc",
       "../browser/signin/chrome_signin_status_metrics_provider_delegate_unittest.cc",
       "../browser/ui/webui/settings/settings_manage_profile_handler_unittest.cc",
 
@@ -4230,7 +4231,7 @@
         "../browser/ui/cocoa/toolbar/toolbar_view_unittest.mm",
         "../browser/ui/cocoa/touchbar/browser_window_default_touch_bar_unittest.mm",
         "../browser/ui/cocoa/touchbar/credit_card_autofill_touch_bar_controller_unittest.mm",
-        "../browser/ui/cocoa/touchbar/suggested_text_touch_bar_controller_unittest.mm",
+        "../browser/ui/cocoa/touchbar/text_suggestions_touch_bar_controller_unittest.mm",
         "../browser/ui/cocoa/url_drop_target_unittest.mm",
         "../browser/ui/cocoa/vertical_gradient_view_unittest.mm",
         "../browser/ui/cocoa/view_resizer_pong.h",
@@ -4269,13 +4270,9 @@
   if (is_win || is_mac || is_chromeos) {
     sources += [ "../browser/extensions/api/networking_private/networking_private_crypto_unittest.cc" ]
   }
-  if (enable_rlz_support) {
+  if (enable_rlz) {
     sources += [ "../browser/rlz/chrome_rlz_tracker_delegate_unittest.cc" ]
-    deps += [
-      "//chrome/browser:rlz",
-      "//components/rlz",
-      "//rlz:test_support",
-    ]
+    deps += [ "//rlz:test_support" ]
   }
   if (is_win) {
     if (!is_component_build) {
@@ -5060,11 +5057,11 @@
     } else {  # ! is_chromeos
       # Non-ChromeOS notifications tests.
       sources += [
-        "../browser/notifications/message_center_notifications_browsertest.cc",
         "../browser/notifications/notification_interactive_uitest.cc",
         "../browser/notifications/notification_interactive_uitest_mac.mm",
         "../browser/notifications/notification_interactive_uitest_support.cc",
         "../browser/notifications/notification_interactive_uitest_support.h",
+        "../browser/notifications/notification_ui_manager_browsertest.cc",
       ]
     }
 
@@ -5153,13 +5150,13 @@
     }
 
     if (!enable_native_notifications) {
-      sources += [ "../browser/notifications/message_center_notification_manager_interactive_uitest.cc" ]
+      sources += [ "../browser/notifications/notification_ui_manager_interactive_uitest.cc" ]
     }
 
     if (is_android) {
       sources -= [
         # Android does not use the message center-based Notification system.
-        "../browser/notifications/message_center_notifications_browsertest.cc",
+        "../browser/notifications/notification_ui_manager_browsertest.cc",
 
         # TODO(peter): Enable the Notification browser tests.
         "../browser/notifications/notification_interactive_uitest.cc",
diff --git a/chrome/test/base/testing_browser_process.cc b/chrome/test/base/testing_browser_process.cc
index 32e05be..b4e8d515 100644
--- a/chrome/test/base/testing_browser_process.cc
+++ b/chrome/test/base/testing_browser_process.cc
@@ -26,12 +26,12 @@
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/prefs/pref_service.h"
 #include "components/subresource_filter/content/browser/content_ruleset_service.h"
-#include "content/public/browser/network_connection_tracker.h"
 #include "content/public/browser/notification_service.h"
 #include "extensions/buildflags/buildflags.h"
 #include "media/media_buildflags.h"
 #include "net/url_request/url_request_context_getter.h"
 #include "printing/buildflags/buildflags.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if BUILDFLAG(ENABLE_BACKGROUND_MODE)
@@ -59,9 +59,9 @@
 
 namespace {
 
-class MockNetworkConnectionTracker : public content::NetworkConnectionTracker {
+class MockNetworkConnectionTracker : public network::NetworkConnectionTracker {
  public:
-  MockNetworkConnectionTracker() : content::NetworkConnectionTracker() {}
+  MockNetworkConnectionTracker() : network::NetworkConnectionTracker() {}
   ~MockNetworkConnectionTracker() override {}
 
   bool GetConnectionType(network::mojom::ConnectionType* type,
@@ -176,7 +176,7 @@
   return shared_url_loader_factory_;
 }
 
-content::NetworkConnectionTracker*
+network::NetworkConnectionTracker*
 TestingBrowserProcess::network_connection_tracker() {
   if (!network_connection_tracker_) {
     network_connection_tracker_ =
@@ -471,7 +471,7 @@
 }
 
 void TestingBrowserProcess::SetNetworkConnectionTracker(
-    std::unique_ptr<content::NetworkConnectionTracker> tracker) {
+    std::unique_ptr<network::NetworkConnectionTracker> tracker) {
   network_connection_tracker_ = std::move(tracker);
 }
 
diff --git a/chrome/test/base/testing_browser_process.h b/chrome/test/base/testing_browser_process.h
index f5115df7..c79a43e3 100644
--- a/chrome/test/base/testing_browser_process.h
+++ b/chrome/test/base/testing_browser_process.h
@@ -74,7 +74,7 @@
   SystemNetworkContextManager* system_network_context_manager() override;
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory()
       override;
-  content::NetworkConnectionTracker* network_connection_tracker() override;
+  network::NetworkConnectionTracker* network_connection_tracker() override;
   network::NetworkQualityTracker* network_quality_tracker() override;
   WatchDogThread* watchdog_thread() override;
   ProfileManager* profile_manager() override;
@@ -150,7 +150,7 @@
   void SetSharedURLLoaderFactory(
       scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory);
   void SetNetworkConnectionTracker(
-      std::unique_ptr<content::NetworkConnectionTracker> tracker);
+      std::unique_ptr<network::NetworkConnectionTracker> tracker);
   void SetNotificationUIManager(
       std::unique_ptr<NotificationUIManager> notification_ui_manager);
   void SetNotificationPlatformBridge(
@@ -171,7 +171,7 @@
   std::unique_ptr<policy::ChromeBrowserPolicyConnector>
       browser_policy_connector_;
   bool created_browser_policy_connector_ = false;
-  std::unique_ptr<content::NetworkConnectionTracker>
+  std::unique_ptr<network::NetworkConnectionTracker>
       network_connection_tracker_;
   std::unique_ptr<ProfileManager> profile_manager_;
   std::unique_ptr<NotificationUIManager> notification_ui_manager_;
diff --git a/chrome/test/chromedriver/server/chromedriver_server.cc b/chrome/test/chromedriver/server/chromedriver_server.cc
index f0eadca..08cdf982 100644
--- a/chrome/test/chromedriver/server/chromedriver_server.cc
+++ b/chrome/test/chromedriver/server/chromedriver_server.cc
@@ -30,7 +30,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_local.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/chrome/test/chromedriver/test/run_java_tests.py b/chrome/test/chromedriver/test/run_java_tests.py
index edd660e..e2285b76 100755
--- a/chrome/test/chromedriver/test/run_java_tests.py
+++ b/chrome/test/chromedriver/test/run_java_tests.py
@@ -228,6 +228,12 @@
 
 def PrintTestResults(results):
   """Prints the given results in a format recognized by the buildbot."""
+
+  # If no results that means something went wrong and we should return non zero value
+  if len(results) == 0:
+    print 'No tests were run'
+    return 1
+
   failures = []
   failure_names = []
   for result in results:
diff --git a/chrome/test/data/arc_default_apps/test_app1/icon_100p_64.png b/chrome/test/data/arc_default_apps/test_app1/icon_100p_64.png
new file mode 100644
index 0000000..b40f6a2
--- /dev/null
+++ b/chrome/test/data/arc_default_apps/test_app1/icon_100p_64.png
Binary files differ
diff --git a/chrome/test/data/arc_default_apps/test_app1/icon_200p_64.png b/chrome/test/data/arc_default_apps/test_app1/icon_200p_64.png
new file mode 100644
index 0000000..7af3d28
--- /dev/null
+++ b/chrome/test/data/arc_default_apps/test_app1/icon_200p_64.png
Binary files differ
diff --git a/chrome/test/data/arc_default_apps/test_app2/icon_100p_64.png b/chrome/test/data/arc_default_apps/test_app2/icon_100p_64.png
new file mode 100644
index 0000000..5c67726
--- /dev/null
+++ b/chrome/test/data/arc_default_apps/test_app2/icon_100p_64.png
Binary files differ
diff --git a/chrome/test/data/arc_default_apps/test_app2/icon_200p_64.png b/chrome/test/data/arc_default_apps/test_app2/icon_200p_64.png
new file mode 100644
index 0000000..a8431bc
--- /dev/null
+++ b/chrome/test/data/arc_default_apps/test_app2/icon_200p_64.png
Binary files differ
diff --git a/chrome/test/data/extensions/api_test/chromeos_info_private/extended/background.js b/chrome/test/data/extensions/api_test/chromeos_info_private/extended/background.js
index 0465155..85da476 100644
--- a/chrome/test/data/extensions/api_test/chromeos_info_private/extended/background.js
+++ b/chrome/test/data/extensions/api_test/chromeos_info_private/extended/background.js
@@ -15,6 +15,7 @@
       'managedDeviceStatus',
       'deviceType',
       'stylusStatus',
+      'assistantStatus',
     ], chrome.test.callbackPass(function(values) {
           switch (testName) {
             case 'kiosk':
@@ -56,6 +57,12 @@
             case 'stylus seen':
               chrome.test.assertEq('seen', values['stylusStatus']);
               break;
+            case 'assistant unsupported':
+              chrome.test.assertEq('unsupported', values['assistantStatus']);
+              break;
+            case 'assistant supported':
+              chrome.test.assertEq('supported', values['assistantStatus']);
+              break;
           }
         }));
   });
diff --git a/chrome/test/data/extensions/api_test/webnavigation/serverRedirectSingleProcess/test_serverRedirectSingleProcess.js b/chrome/test/data/extensions/api_test/webnavigation/serverRedirectSingleProcess/test_serverRedirectSingleProcess.js
index 20248d1..f12167ae 100644
--- a/chrome/test/data/extensions/api_test/webnavigation/serverRedirectSingleProcess/test_serverRedirectSingleProcess.js
+++ b/chrome/test/data/extensions/api_test/webnavigation/serverRedirectSingleProcess/test_serverRedirectSingleProcess.js
@@ -69,7 +69,7 @@
             { label: "b-onCommitted",
               event: "onCommitted",
               details: { frameId: 0,
-                         processId: 0,
+                         processId: 1,
                          tabId: 0,
                          timeStamp: 0,
                          transitionQualifiers: ["server_redirect"],
@@ -78,14 +78,14 @@
             { label: "b-onDOMContentLoaded",
               event: "onDOMContentLoaded",
               details: { frameId: 0,
-                         processId: 0,
+                         processId: 1,
                          tabId: 0,
                          timeStamp: 0,
                          url: URL_TARGET }},
             { label: "b-onCompleted",
               event: "onCompleted",
               details: { frameId: 0,
-                         processId: 0,
+                         processId: 1,
                          tabId: 0,
                          timeStamp: 0,
                          url: URL_TARGET }}],
diff --git a/chrome/test/data/extensions/api_test/webstore_private/noframe.html b/chrome/test/data/extensions/api_test/webstore_private/noframe.html
index 0d89f61..cc0c5ef2 100644
--- a/chrome/test/data/extensions/api_test/webstore_private/noframe.html
+++ b/chrome/test/data/extensions/api_test/webstore_private/noframe.html
@@ -1,43 +1,17 @@
 <!DOCTYPE html>
-<body onload="dropFrame()">
+<body>
 This represents not an extension, but an HTML page within the test harness
 webstore origin (www.example.com), for which the response headers have been
 misconfigured to allow framing by the 127.0.0.1 origin.
+</body>
 <script>
-var interval_id = -1;
-var check_count = 0;
 function dropFrame() {
   var s = location.href.toString();
   if (s.indexOf('127.0.0.1') > 0) {
     // try to frame a copy of ourselves from the webstore origin.
     var f = document.createElement('iframe');
     f.src = s.replace('127.0.0.1', 'www.example.com');
-    f.onload = checkFrame;
-    f.onerror = checkFrame;
     document.body.appendChild(f);
-    // There's an open issue in WK where neither onload or onerror fires
-    // when interrupted by XFO, so use a setInterval() workaround.  Remove
-    // this workaround when resolved, but in the mean time, mark the test
-    // FLAKY, because there is no reason to believe the server will respond
-    // within the time frame.
-    interval_id = setInterval("checkFrame()", 500);
-  }
-}
-
-function checkFrame() {
-  try {
-    // If the frame was blocked, we instead have an about:blank frame which we
-    // can access.
-    x = window.frames[0].document.location.href;
-    document.title = 'PASS: ' + x;
-    clearInterval(interval_id);
-  }
-  catch (e) {
-    // Frame was not yet blocked, so we have no access.
-    if (++check_count > 40) {
-      document.title = 'FAIL';
-      clearInterval(interval_id);
-    }
   }
 }
 </script>
diff --git a/chrome/test/data/extensions/api_test/webstore_private/noframe2.html b/chrome/test/data/extensions/api_test/webstore_private/noframe2.html
index f89deea..e14b6973 100644
--- a/chrome/test/data/extensions/api_test/webstore_private/noframe2.html
+++ b/chrome/test/data/extensions/api_test/webstore_private/noframe2.html
@@ -1,10 +1,9 @@
 <!DOCTYPE html>
-<body onload="dropFrame()">
+<body>
 This represents not an extension, but an HTML page within an untrusted
 origin (127.0.0.1).
+</body>
 <script>
-var interval_id = -1;
-var check_count = 0;
 function dropFrame() {
   var s = location.href.toString();
   if (s.indexOf('127.0.0.1') > 0) {
@@ -15,30 +14,7 @@
     s = s.replace('127.0.0.1', 'www.example.com');
     s = s.replace('/extensions/', '/nonesuch/extensions/');
     f.src = s;
-    f.onload = checkFrame;
-    f.onerror = checkFrame;
     document.body.appendChild(f);
-    // Due to https://bugs.webkit.org/show_bug.cgi?id=90660 neither onload
-    // or onerror fires when interrupted by XFO, so use a setInterval()
-    // workaround. Remove this workaround when resolved.
-    interval_id = setInterval("checkFrame()", 500);
-  }
-}
-
-function checkFrame() {
-  try {
-    // If the frame was blocked, we instead have an about:blank frame which we
-    // can access.
-    x = window.frames[0].document.location.href;
-    document.title = 'PASS: ' + x;
-    clearInterval(interval_id);
-  }
-  catch (e) {
-    // Frame was not yet blocked, so we have no access.
-    if (++check_count > 40) {
-      document.title = 'FAIL';
-      clearInterval(interval_id);
-    }
   }
 }
 </script>
diff --git a/chrome/test/data/nosniff.xml b/chrome/test/data/nosniff.xml
new file mode 100644
index 0000000..3fe3482
--- /dev/null
+++ b/chrome/test/data/nosniff.xml
@@ -0,0 +1 @@
+nosniff.xml - body
diff --git a/chrome/test/data/nosniff.xml.mock-http-headers b/chrome/test/data/nosniff.xml.mock-http-headers
new file mode 100644
index 0000000..ce9c7f5
--- /dev/null
+++ b/chrome/test/data/nosniff.xml.mock-http-headers
@@ -0,0 +1,3 @@
+HTTP/1.1 200 OK
+Content-Type: text/xml; charset=utf-8
+X-Content-Type-Options: nosniff
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 63c7b9d..fe8477c1 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3200,6 +3200,14 @@
     ]
   },
 
+  "WebRtcEventLogCollectionAllowed": {
+    "os": ["win", "linux", "mac"],
+    "test_policy": { "WebRtcEventLogCollectionAllowed": false },
+    "pref_mappings": [
+      { "pref": "webrtc.event_logs_collection" }
+    ]
+  },
+
   "----- Chrome OS device policies ---------------------------------------": {},
 
   "DevicePolicyRefreshRate": {
diff --git a/chrome/test/data/webui/media_router/media_router_container_cast_mode_list_tests.js b/chrome/test/data/webui/media_router/media_router_container_cast_mode_list_tests.js
index 8b71536..d788a41 100644
--- a/chrome/test/data/webui/media_router/media_router_container_cast_mode_list_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_cast_mode_list_tests.js
@@ -152,8 +152,8 @@
         checkCurrentView(media_router.MediaRouterView.CAST_MODE_LIST);
 
         setTimeout(function() {
-          var castModeList =
-              container.$$('#cast-mode-list').querySelectorAll('paper-item');
+          var castModeList = container.$$('#cast-mode-list')
+                                 .querySelectorAll('button.selectable-item');
           MockInteractions.tap(castModeList[1]);
           checkCurrentView(media_router.MediaRouterView.SINK_LIST);
           done();
@@ -193,8 +193,8 @@
         MockInteractions.tap(
             container.get('container-header').$['arrow-drop-icon']);
         setTimeout(function() {
-          var castModeList =
-              container.$$('#cast-mode-list').querySelectorAll('paper-item');
+          var castModeList = container.$$('#cast-mode-list')
+                                 .querySelectorAll('button.selectable-item');
           assertEquals(
               fakeCastModeListWithNonPresentationModesOnly.length,
               castModeList.length);
@@ -223,8 +223,8 @@
         MockInteractions.tap(
             container.get('container-header').$['arrow-drop-icon']);
         setTimeout(function() {
-          var castModeList =
-              container.$$('#cast-mode-list').querySelectorAll('paper-item');
+          var castModeList = container.$$('#cast-mode-list')
+                                 .querySelectorAll('button.selectable-item');
 
           for (var i = 0; i < fakeCastModeList.length; i++) {
             MockInteractions.tap(castModeList[i]);
@@ -305,8 +305,8 @@
         MockInteractions.tap(
             container.get('container-header').$['arrow-drop-icon']);
         setTimeout(function() {
-          var castModeList =
-              container.$$('#cast-mode-list').querySelectorAll('paper-item');
+          var castModeList = container.$$('#cast-mode-list')
+                                 .querySelectorAll('button.selectable-item');
           MockInteractions.tap(castModeList[0]);
           setTimeout(function() {
             assertEquals(fakeCastModeList[0].description, container.headerText);
@@ -338,14 +338,14 @@
         MockInteractions.tap(
             container.get('container-header').$['arrow-drop-icon']);
         setTimeout(function() {
-          var castModeList =
-              container.$$('#cast-mode-list').querySelectorAll('paper-item');
+          var castModeList = container.$$('#cast-mode-list')
+                                 .querySelectorAll('button.selectable-item');
           MockInteractions.tap(castModeList[0]);
           assertEquals(fakeCastModeList[0].description, container.headerText);
 
           setTimeout(function() {
             var sinkList = container.shadowRoot.getElementById('sink-list')
-                               .querySelectorAll('paper-item');
+                               .querySelectorAll('button.selectable-item');
 
             // The sink list is empty because none of the sinks in
             // fakeSinkList is compatible with cast mode 0.
@@ -355,7 +355,7 @@
 
             setTimeout(function() {
               var sinkList = container.shadowRoot.getElementById('sink-list')
-                                 .querySelectorAll('paper-item');
+                                 .querySelectorAll('button.selectable-item');
               assertEquals(3, sinkList.length);
               done();
             });
@@ -387,7 +387,7 @@
           assertFalse(container.userHasSelectedCastMode_);
 
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
 
           // The sink list contains only sinks compatible with PRESENTATION
           // mode.
@@ -425,7 +425,7 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
 
           // Since we haven't selected a cast mode, we don't filter sinks.
           assertEquals(3, sinkList.length);
@@ -434,8 +434,8 @@
               container.get('container-header').$['arrow-drop-icon']);
           setTimeout(function() {
             // Cast mode 1 is selected, and the sink list is filtered.
-            var castModeList =
-                container.$$('#cast-mode-list').querySelectorAll('paper-item');
+            var castModeList = container.$$('#cast-mode-list')
+                                   .querySelectorAll('button.selectable-item');
             MockInteractions.tap(castModeList[1]);
             assertEquals(fakeCastModeList[1].description, container.headerText);
             assertEquals(
@@ -443,7 +443,7 @@
 
             setTimeout(function() {
               var sinkList = container.shadowRoot.getElementById('sink-list')
-                                 .querySelectorAll('paper-item');
+                                 .querySelectorAll('button.selectable-item');
 
               // newSinks[0] got filtered out since it is not compatible with
               // cast mode 1.
@@ -468,7 +468,7 @@
                 assertEquals(
                     fakeCastModeList[1].type, container.shownCastModeValue_);
                 var sinkList = container.shadowRoot.getElementById('sink-list')
-                                   .querySelectorAll('paper-item');
+                                   .querySelectorAll('button.selectable-item');
                 assertEquals(0, sinkList.length);
                 done();
               });
@@ -516,19 +516,19 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
 
           MockInteractions.tap(
               container.get('container-header').$['arrow-drop-icon']);
           setTimeout(function() {
             // Cast mode 1 is selected, and the sink list is filtered.
-            var castModeList =
-                container.$$('#cast-mode-list').querySelectorAll('paper-item');
+            var castModeList = container.$$('#cast-mode-list')
+                                   .querySelectorAll('button.selectable-item');
             MockInteractions.tap(castModeList[1]);
 
             setTimeout(function() {
               var sinkList = container.shadowRoot.getElementById('sink-list')
-                                 .querySelectorAll('paper-item');
+                                 .querySelectorAll('button.selectable-item');
 
               MockInteractions.tap(sinkList[0]);
               setTimeout(function() {
diff --git a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
index 184e8996..1e5c881 100644
--- a/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_filter_tests.js
@@ -218,8 +218,8 @@
               container.$$('#search-results-paper-menu');
           // Use the Polymer method for selecting (and focusing on) a sink
           searchResultsPaperMenu.selectIndex(focusIndex);
-          var itemInSearch =
-              searchResultsPaperMenu.querySelectorAll('paper-item')[focusIndex];
+          var itemInSearch = searchResultsPaperMenu.querySelectorAll(
+              'button.selectable-item')[focusIndex];
           // TODO(crbug.com/608551): This condition handles flakiness around
           // the search item getting focus earlier. If it doesn't get focus,
           // the logic that changes focus from a search item to a sink list
@@ -230,8 +230,8 @@
             checkCurrentView(media_router.MediaRouterView.SINK_LIST);
             chainOnAnimationPromise(function() {
               var sinkListPaperMenu = container.$$('#sink-list-paper-menu');
-              var item =
-                  sinkListPaperMenu.querySelectorAll('paper-item')[focusIndex];
+              var item = sinkListPaperMenu.querySelectorAll(
+                  'button.selectable-item')[focusIndex];
 
               // Check that the "focused" HTML attribute persists.
               assertTrue(item.focused);
@@ -252,8 +252,8 @@
         container.allSinks = fakeSinkList;
         MockInteractions.tap(container.$$('#sink-search-icon'));
         setTimeout(function() {
-          var item =
-              container.$$('#search-results').querySelectorAll('paper-item')[1];
+          var item = container.$$('#search-results')
+                         .querySelectorAll('button.selectable-item')[1];
           var closeButton = container.$['container-header'].$['close-button'];
           closeButton.focus();
           var focusedSuccess = closeButton.focused;
@@ -391,8 +391,8 @@
         container.$$('#sink-search-input').value = searchTextOne;
         MockInteractions.tap(container.$$('#sink-search-icon'));
         setTimeout(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           assertEquals(1, searchResults.length);
           done();
         });
@@ -406,8 +406,8 @@
         container.$$('#sink-search-input').value = searchTextNone;
         MockInteractions.tap(container.$$('#sink-search-icon'));
         setTimeout(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           assertEquals(0, searchResults.length);
           done();
         });
@@ -456,20 +456,21 @@
         var searchInput = container.$$('#sink-search-input');
         setTimeout(function() {
           searchInput.value = searchTextAll;
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           assertEquals(fakeSinkList.length, searchResults.length);
 
           searchInput.value = searchTextOne;
           setTimeout(function() {
-            var searchResults =
-                container.$$('#search-results').querySelectorAll('paper-item');
+            var searchResults = container.$$('#search-results')
+                                    .querySelectorAll('button.selectable-item');
             assertEquals(1, searchResults.length);
 
             searchInput.value = searchTextNone;
             setTimeout(function() {
-              var searchResults = container.$$('#search-results')
-                                      .querySelectorAll('paper-item');
+              var searchResults =
+                  container.$$('#search-results')
+                      .querySelectorAll('button.selectable-item');
               assertEquals(0, searchResults.length);
               done();
             });
@@ -485,8 +486,8 @@
         var testSinkName = fakeSinkList[0].name;
         container.$$('#sink-search-input').value = testSinkName;
         setTimeout(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           assertEquals(1, searchResults.length);
           // This selector works only because there's only one result in the
           // list.
@@ -503,8 +504,8 @@
         container.allSinks = fakeSinkList;
         MockInteractions.tap(container.$$('#sink-search-icon'));
         setTimeout(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           container.addEventListener('create-route', function(data) {
             assertEquals(fakeSinkList[1].id, data.detail.sinkId);
             done();
@@ -520,8 +521,8 @@
         container.routeList = fakeRouteList;
         MockInteractions.tap(container.$$('#sink-search-icon'));
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[1]);
           checkCurrentView(media_router.MediaRouterView.ROUTE_DETAILS);
           done();
diff --git a/chrome/test/data/webui/media_router/media_router_container_route_tests.js b/chrome/test/data/webui/media_router/media_router_container_route_tests.js
index adf2d3d..d304419a 100644
--- a/chrome/test/data/webui/media_router/media_router_container_route_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_route_tests.js
@@ -121,7 +121,7 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
           container.addEventListener('create-route', function(data) {
             // Container is initially in auto mode since a cast mode has not
             // been selected.
@@ -149,7 +149,7 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
 
           // Start from the SINK_LIST view.
           container.showSinkList_();
@@ -325,13 +325,13 @@
             container.$$('#container-header').$['arrow-drop-icon']);
         setTimeout(function() {
           // Select cast mode 2.
-          var castModeList =
-              container.$$('#cast-mode-list').querySelectorAll('paper-item');
+          var castModeList = container.$$('#cast-mode-list')
+                                 .querySelectorAll('button.selectable-item');
           MockInteractions.tap(castModeList[1]);
           assertEquals(fakeCastModeList[1].description, container.headerText);
           setTimeout(function() {
             var sinkList = container.shadowRoot.getElementById('sink-list')
-                               .querySelectorAll('paper-item');
+                               .querySelectorAll('button.selectable-item');
             container.addEventListener('create-route', function(data) {
               assertEquals(fakeSinkList[2].id, data.detail.sinkId);
               // Cast mode 2 is used, since we selected it explicitly.
@@ -354,8 +354,8 @@
         container.allSinks = fakeSinkList;
         container.routeList = fakeRouteList;
         setTimeout(function() {
-          var sinkList =
-              container.$$('#sink-list').querySelectorAll('paper-item');
+          var sinkList = container.$$('#sink-list')
+                             .querySelectorAll('button.selectable-item');
           MockInteractions.tap(sinkList[2]);
           setTimeout(function() {
             assertTrue(!!container.currentLaunchingSinkId_);
@@ -391,7 +391,8 @@
         setTimeout(function() {
           assertTrue(!container.currentLaunchingSinkId_);
           MockInteractions.tap(
-              container.$$('#sink-list').querySelectorAll('paper-item')[0]);
+              container.$$('#sink-list')
+                  .querySelectorAll('button.selectable-item')[0]);
           setTimeout(function() {
             assertEquals(undefined, container.currentRoute_.currentCastMode);
             checkElementVisible(
@@ -417,12 +418,14 @@
         MockInteractions.tap(
             container.$$('#container-header').$$('#arrow-drop-icon'));
         setTimeout(function() {
-          MockInteractions.tap(container.$$('#cast-mode-list')
-                                   .querySelectorAll('paper-item')[2]);
+          MockInteractions.tap(
+              container.$$('#cast-mode-list')
+                  .querySelectorAll('button.selectable-item')[2]);
           setTimeout(function() {
             assertTrue(container.shownCastModeValue_ != 2);
             MockInteractions.tap(
-                container.$$('#sink-list').querySelectorAll('paper-item')[0]);
+                container.$$('#sink-list')
+                    .querySelectorAll('button.selectable-item')[0]);
             setTimeout(function() {
               checkElementVisible(
                   true,
@@ -447,12 +450,14 @@
         MockInteractions.tap(
             container.$$('#container-header').$$('#arrow-drop-icon'));
         setTimeout(function() {
-          MockInteractions.tap(container.$$('#cast-mode-list')
-                                   .querySelectorAll('paper-item')[1]);
+          MockInteractions.tap(
+              container.$$('#cast-mode-list')
+                  .querySelectorAll('button.selectable-item')[1]);
           setTimeout(function() {
             assertEquals(2, container.shownCastModeValue_);
             MockInteractions.tap(
-                container.$$('#sink-list').querySelectorAll('paper-item')[0]);
+                container.$$('#sink-list')
+                    .querySelectorAll('button.selectable-item')[0]);
             setTimeout(function() {
               checkElementVisible(
                   false,
@@ -480,7 +485,8 @@
         setTimeout(function() {
           assertEquals(-1, container.shownCastModeValue_);
           MockInteractions.tap(
-              container.$$('#sink-list').querySelectorAll('paper-item')[0]);
+              container.$$('#sink-list')
+                  .querySelectorAll('button.selectable-item')[0]);
           setTimeout(function() {
             checkElementVisible(
                 false,
diff --git a/chrome/test/data/webui/media_router/media_router_container_search_tests.js b/chrome/test/data/webui/media_router/media_router_container_search_tests.js
index 2adc420..89dd63a 100644
--- a/chrome/test/data/webui/media_router/media_router_container_search_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_search_tests.js
@@ -55,8 +55,8 @@
    * @param {media_router.Sink} targetSink
    */
   var checkSpinningSinkInFilter = function(targetSink) {
-    var searchResults =
-        container.$$('#search-results').querySelectorAll('paper-item');
+    var searchResults = container.$$('#search-results')
+                            .querySelectorAll('button.selectable-item');
     var targets = 0;
     searchResults.forEach(function(sink) {
       var item = container.$$('#searchResults').itemForElement(sink).sinkItem;
@@ -78,7 +78,8 @@
    * @param {number} length
    */
   var checkSpinningSinkInSinkList = function(targetSink, length) {
-    var sinkList = container.$$('#sink-list').querySelectorAll('paper-item');
+    var sinkList =
+        container.$$('#sink-list').querySelectorAll('button.selectable-item');
     assertEquals(length, sinkList.length);
     var targets = 0;
     sinkList.forEach(function(sink) {
@@ -172,13 +173,13 @@
 
       test('pseudo sink hidden without filter input', function(done) {
         setTimeout(function() {
-          var sinkList =
-              container.$$('#sink-list').querySelectorAll('paper-item');
+          var sinkList = container.$$('#sink-list')
+                             .querySelectorAll('button.selectable-item');
           assertEquals(fakeSinkList.length, sinkList.length);
           MockInteractions.tap(container.$$('#sink-search-icon'));
           chainOnAnimationPromise(function() {
-            var searchResults =
-                container.$$('#search-results').querySelectorAll('paper-item');
+            var searchResults = container.$$('#search-results')
+                                    .querySelectorAll('button.selectable-item');
             assertEquals(fakeSinkList.length, searchResults.length);
             done();
           });
@@ -189,8 +190,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = 'no existing sink';
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           assertEquals(1, searchResults.length);
           var item =
               container.$$('#searchResults').itemForElement(searchResults[0]);
@@ -203,8 +204,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = fakeSinkList[0].name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           assertEquals(1, searchResults.length);
           var item =
               container.$$('#searchResults').itemForElement(searchResults[0]);
@@ -217,8 +218,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = 'no existing sink';
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           container.addEventListener(
               'search-sinks-and-create-route', function(data) {
                 assertEquals(pseudoSink.id, data.detail.id);
@@ -234,12 +235,12 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           setTimeout(function() {
-            searchResults =
-                container.$$('#search-results').querySelectorAll('paper-item');
+            searchResults = container.$$('#search-results')
+                                .querySelectorAll('button.selectable-item');
             assertEquals(1, searchResults.length);
             checkSpinningSinkInFilter(pseudoSink);
 
@@ -261,8 +262,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           MockInteractions.tap(
               container.$['container-header'].$$('#back-button'));
@@ -286,14 +287,14 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           container.allSinks = fakeSinkListWithPseudoSink.concat([foundSink]);
           container.onReceiveSearchResult(foundSink.id);
           setTimeout(function() {
-            searchResults =
-                container.$$('#search-results').querySelectorAll('paper-item');
+            searchResults = container.$$('#search-results')
+                                .querySelectorAll('button.selectable-item');
             assertEquals(1, searchResults.length);
             checkSpinningSinkInFilter(foundSink);
             done();
@@ -305,15 +306,15 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           setTimeout(function() {
             container.onReceiveSearchResult(foundSink.id);
             container.allSinks = fakeSinkListWithPseudoSink.concat([foundSink]);
             setTimeout(function() {
               searchResults = container.$$('#search-results')
-                                  .querySelectorAll('paper-item');
+                                  .querySelectorAll('button.selectable-item');
               assertEquals(1, searchResults.length);
               checkSpinningSinkInFilter(foundSink);
               done();
@@ -329,8 +330,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           container.allSinks = fakeSinkListWithPseudoSink.concat([foundSink]);
           container.onReceiveSearchResult(foundSink.id);
@@ -342,8 +343,8 @@
                 container.$['container-header'].$$('#back-button'));
             chainOnAnimationPromise(function() {
               checkCurrentView(media_router.MediaRouterView.SINK_LIST);
-              sinkList =
-                  container.$$('#sink-list').querySelectorAll('paper-item');
+              sinkList = container.$$('#sink-list')
+                             .querySelectorAll('button.selectable-item');
               sinkList.forEach(function(sink) {
                 var spinner = sink.querySelector('paper-spinner-lite');
                 checkElementVisible(spinner, false);
@@ -368,14 +369,14 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           MockInteractions.tap(
               container.$['container-header'].$$('#back-button'));
           chainOnAnimationPromise(function() {
-            var sinkList =
-                container.$$('#sink-list').querySelectorAll('paper-item');
+            var sinkList = container.$$('#sink-list')
+                               .querySelectorAll('button.selectable-item');
             sinkList = [...sinkList];
             var sink = sinkList.find(function(sink) {
               var item = container.$$('#sinkList').itemForElement(sink);
@@ -409,8 +410,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
           container.allSinks = fakeSinkListWithPseudoSink.concat([foundSink]);
           container.onReceiveSearchResult(foundSink.id);
@@ -418,8 +419,8 @@
           assertEquals(null, container.pseudoSinkSearchState_);
           setTimeout(function() {
             checkCurrentView(media_router.MediaRouterView.FILTER);
-            searchResults =
-                container.$$('#search-results').querySelectorAll('paper-item');
+            searchResults = container.$$('#search-results')
+                                .querySelectorAll('button.selectable-item');
             searchResults.forEach(function(sink) {
               var spinner = sink.querySelector('paper-spinner-lite');
               checkElementVisible(spinner, false);
@@ -433,8 +434,8 @@
         var searchInput = container.$$('#sink-search-input');
         searchInput.value = foundSink.name;
         chainOnAnimationPromise(function() {
-          var searchResults =
-              container.$$('#search-results').querySelectorAll('paper-item');
+          var searchResults = container.$$('#search-results')
+                                  .querySelectorAll('button.selectable-item');
           MockInteractions.tap(searchResults[0]);
 
           // A found sink is added as part of the search but is removed right
@@ -447,8 +448,8 @@
           assertEquals(null, container.pseudoSinkSearchState_);
           setTimeout(function() {
             checkCurrentView(media_router.MediaRouterView.FILTER);
-            searchResults =
-                container.$$('#search-results').querySelectorAll('paper-item');
+            searchResults = container.$$('#search-results')
+                                .querySelectorAll('button.selectable-item');
             assertTrue(container.searchResultsToShow_.some(function(sink) {
               return sink.sinkItem.id == pseudoSink.id;
             }));
diff --git a/chrome/test/data/webui/media_router/media_router_container_sink_list_tests.js b/chrome/test/data/webui/media_router/media_router_container_sink_list_tests.js
index efcb5fe..1093907a 100644
--- a/chrome/test/data/webui/media_router/media_router_container_sink_list_tests.js
+++ b/chrome/test/data/webui/media_router/media_router_container_sink_list_tests.js
@@ -93,7 +93,7 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
           assertEquals(fakeSinkList.length, sinkList.length);
           for (var i = 0; i < fakeSinkList.length; i++) {
             checkElementText(fakeSinkList[i].name, sinkList[i]);
@@ -127,7 +127,7 @@
         container.allSinks = listOne;
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
           assertEquals(listOne.length, sinkList.length);
           for (var i = 0; i < listOneExpected.length; i++) {
             checkElementText(listOneExpected[i].name, sinkList[i]);
@@ -141,7 +141,7 @@
           container.allSinks = listTwo;
           setTimeout(function() {
             sinkList = container.shadowRoot.getElementById('sink-list')
-                           .querySelectorAll('paper-item');
+                           .querySelectorAll('button.selectable-item');
             assertEquals(listTwo.length, sinkList.length);
             for (var i = 0; i < listTwoExpected.length; i++) {
               checkElementText(listTwoExpected[i].name, sinkList[i]);
@@ -154,7 +154,7 @@
             container.allSinks = listThree;
             setTimeout(function() {
               sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
               assertEquals(listThree.length, sinkList.length);
               for (var i = 0; i < listThreeExpected.length; i++) {
                 checkElementText(listThreeExpected[i].name, sinkList[i]);
@@ -184,7 +184,7 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
           assertEquals(2, sinkList.length);
 
           // |sinkList[0]| has sink name only.
@@ -218,7 +218,7 @@
 
         setTimeout(function() {
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
           assertEquals(2, sinkList.length);
 
           // |sinkList[0]| has sink name only.
@@ -348,7 +348,7 @@
               media_router.CastModeType.AUTO, container.shownCastModeValue_);
           assertFalse(container.userHasSelectedCastMode_);
           var sinkList = container.shadowRoot.getElementById('sink-list')
-                             .querySelectorAll('paper-item');
+                             .querySelectorAll('button.selectable-item');
 
           // All sinks are shown in auto mode.
           assertEquals(3, sinkList.length);
@@ -377,7 +377,7 @@
             assertFalse(container.userHasSelectedCastMode_);
 
             var sinkList = container.shadowRoot.getElementById('sink-list')
-                               .querySelectorAll('paper-item');
+                               .querySelectorAll('button.selectable-item');
             assertEquals(3, sinkList.length);
 
             // When compatible cast modes size is no longer exactly 1, switch
@@ -392,7 +392,7 @@
                   container.shownCastModeValue_);
               assertFalse(container.userHasSelectedCastMode_);
               var sinkList = container.shadowRoot.getElementById('sink-list')
-                                 .querySelectorAll('paper-item');
+                                 .querySelectorAll('button.selectable-item');
 
               // All sinks are shown in auto mode.
               assertEquals(3, sinkList.length);
diff --git a/chrome/test/data/webui/print_preview/model_test.js b/chrome/test/data/webui/print_preview/model_test.js
index e0ffbd0..b04743c7 100644
--- a/chrome/test/data/webui/print_preview/model_test.js
+++ b/chrome/test/data/webui/print_preview/model_test.js
@@ -6,6 +6,7 @@
   /** @enum {string} */
   const TestNames = {
     SetStickySettings: 'set sticky settings',
+    SetPolicySettings: 'set policy settings',
     GetPrintTicket: 'get print ticket',
     GetCloudPrintTicket: 'get cloud print ticket',
   };
@@ -115,6 +116,27 @@
           .then(() => testStickySetting('vendorItems', 'vendorOptions'));
     });
 
+    /**
+     * Tests that setSetting() won't change the value if there is already a
+     * policy for that setting.
+     */
+    test(assert(TestNames.SetPolicySettings), function() {
+      model.setSetting('headerFooter', false);
+      assertFalse(model.settings.headerFooter.value);
+
+      model.setPolicySettings(undefined);
+      // undefined is treated as 'no policy', and doesn't affect the value.
+      assertFalse(model.settings.headerFooter.value);
+
+      model.setPolicySettings(true);
+      assertTrue(model.settings.headerFooter.value);
+
+      model.setSetting('headerFooter', false);
+      // The value didn't change after setSetting(), because the policy takes
+      // priority.
+      assertTrue(model.settings.headerFooter.value);
+    });
+
     function toggleSettings() {
       // Some non default setting values to change to.
       const settingsChange = {
diff --git a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
index 486c5b0..a4289dd1 100644
--- a/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
+++ b/chrome/test/data/webui/print_preview/new_print_preview_ui_browsertest.js
@@ -154,6 +154,20 @@
   this.runMochaTest(settings_sections_tests.TestNames.PresetDuplex);
 });
 
+TEST_F(
+    'PrintPreviewSettingsSectionsTest', 'EnableHeaderFooterByPolicy',
+    function() {
+      this.runMochaTest(
+          settings_sections_tests.TestNames.EnableHeaderFooterByPolicy);
+    });
+
+TEST_F(
+    'PrintPreviewSettingsSectionsTest', 'DisableHeaderFooterByPolicy',
+    function() {
+      this.runMochaTest(
+          settings_sections_tests.TestNames.DisableHeaderFooterByPolicy);
+    });
+
 PrintPreviewSettingsSelectTest = class extends NewPrintPreviewTest {
   /** @override */
   get browsePreload() {
@@ -292,6 +306,10 @@
   this.runMochaTest(model_test.TestNames.SetStickySettings);
 });
 
+TEST_F('PrintPreviewModelTest', 'SetPolicySettings', function() {
+  this.runMochaTest(model_test.TestNames.SetPolicySettings);
+});
+
 TEST_F('PrintPreviewModelTest', 'GetPrintTicket', function() {
   this.runMochaTest(model_test.TestNames.GetPrintTicket);
 });
diff --git a/chrome/test/data/webui/print_preview/settings_section_test.js b/chrome/test/data/webui/print_preview/settings_section_test.js
index ec57dfe..8d2d011b 100644
--- a/chrome/test/data/webui/print_preview/settings_section_test.js
+++ b/chrome/test/data/webui/print_preview/settings_section_test.js
@@ -27,6 +27,8 @@
     SetOther: 'set other',
     PresetCopies: 'preset copies',
     PresetDuplex: 'preset duplex',
+    EnableHeaderFooterByPolicy: 'enable header and footer by policy',
+    DisableHeaderFooterByPolicy: 'disable header and footer by policy',
   };
 
   const suiteName = 'SettingsSectionsTests';
@@ -937,6 +939,46 @@
       assertEquals(duplex, page.settings.duplex.value);
       assertTrue(checkbox.checked);
     });
+
+    /**
+     * Tests that 'force enable header/footer' policy disables the header/footer
+     * checkbox and checks it.
+     */
+    // TODO(rbpotter): Don't call setPolicySettings() manually in this test.
+    test(assert(TestNames.EnableHeaderFooterByPolicy), function() {
+      toggleMoreSettings();
+      const optionsElement = page.$$('print-preview-other-options-settings');
+      const checkbox = optionsElement.$.headerFooter;
+      const model = page.$.model;
+
+      assertFalse(checkbox.disabled);
+      model.setPolicySettings(undefined);
+      assertFalse(checkbox.disabled);
+
+      model.setPolicySettings(true);
+      assertTrue(checkbox.disabled);
+      assertTrue(checkbox.checked);
+    });
+
+    /**
+     * Tests that 'force enable header/footer' policy enables the header/footer
+     * checkbox and doesn't check it.
+     */
+    // TODO(rbpotter): Don't call setPolicySettings() manually in this test.
+    test(assert(TestNames.DisableHeaderFooterByPolicy), function() {
+      toggleMoreSettings();
+      const optionsElement = page.$$('print-preview-other-options-settings');
+      const checkbox = optionsElement.$.headerFooter;
+      const model = page.$.model;
+
+      assertFalse(checkbox.disabled);
+      model.setPolicySettings(undefined);
+      assertFalse(checkbox.disabled);
+
+      model.setPolicySettings(false);
+      assertTrue(checkbox.disabled);
+      assertFalse(checkbox.checked);
+    });
   });
 
   return {
diff --git a/chrome/test/data/webui/settings/downloads_page_test.js b/chrome/test/data/webui/settings/downloads_page_test.js
index 9f71b0b..952f4e3 100644
--- a/chrome/test/data/webui/settings/downloads_page_test.js
+++ b/chrome/test/data/webui/settings/downloads_page_test.js
@@ -9,6 +9,7 @@
       'initializeDownloads',
       'selectDownloadLocation',
       'resetAutoOpenFileTypes',
+      'getDownloadLocationText',
     ]);
   }
 
@@ -35,8 +36,8 @@
 
 suite('DownloadsHandler', function() {
   setup(function() {
-    DownloadsBrowserProxy = new TestDownloadsBrowserProxy();
-    settings.DownloadsBrowserProxyImpl.instance_ = DownloadsBrowserProxy;
+    downloadsBrowserProxy = new TestDownloadsBrowserProxy();
+    settings.DownloadsBrowserProxyImpl.instance_ = downloadsBrowserProxy;
 
     PolymerTest.clearBody();
 
@@ -44,7 +45,7 @@
     document.body.appendChild(downloadsPage);
 
     // Page element must call 'initializeDownloads' upon attachment to the DOM.
-    return DownloadsBrowserProxy.whenCalled('initializeDownloads');
+    return downloadsBrowserProxy.whenCalled('initializeDownloads');
   });
 
   teardown(function() {
@@ -56,7 +57,7 @@
     assertTrue(!!button);
     button.click();
     button.fire('transitionend');
-    return DownloadsBrowserProxy.whenCalled('selectDownloadLocation');
+    return downloadsBrowserProxy.whenCalled('selectDownloadLocation');
   });
 
   test('openAdvancedDownloadsettings', function() {
@@ -69,7 +70,7 @@
     assertTrue(!!button);
 
     button.click();
-    return DownloadsBrowserProxy.whenCalled('resetAutoOpenFileTypes')
+    return downloadsBrowserProxy.whenCalled('resetAutoOpenFileTypes')
         .then(function() {
           cr.webUIListenerCallback('auto-open-downloads-changed', false);
           Polymer.dom.flush();
@@ -79,6 +80,13 @@
   });
 
   if (cr.isChromeOS) {
+    /** @override */
+    TestDownloadsBrowserProxy.prototype.getDownloadLocationText = function(
+        path) {
+      this.methodCalled('getDownloadLocationText', path);
+      return Promise.resolve('downloads-text');
+    };
+
     function setDefaultDownloadPathPref(downloadPath) {
       downloadsPage.prefs = {
         download: {
@@ -97,19 +105,14 @@
       return pathElement.textContent.trim();
     }
 
-    test('rewrite default download paths.', function() {
-      // Rewrite path for directories in Downloads volume.
-      setDefaultDownloadPathPref('/home/chronos/u-0123456789abcdef/Downloads');
-      assertEquals('Downloads', getDefaultDownloadPathString());
-
-      // Rewrite path for directories in Google Drive.
-      setDefaultDownloadPathPref('/special/drive-0123456789abcdef/root/foo');
-      assertEquals('Google Drive \u203a foo', getDefaultDownloadPathString());
-
-      // Rewrite path for directories in Android files volume.
-      setDefaultDownloadPathPref('/run/arc/sdcard/write/emulated/0/foo/bar');
-      assertEquals(
-          'Play files \u203a foo \u203a bar', getDefaultDownloadPathString());
+    test('rewrite default download paths', function() {
+      setDefaultDownloadPathPref('downloads-path');
+      return downloadsBrowserProxy.whenCalled('getDownloadLocationText')
+          .then(path => {
+            assertEquals('downloads-path', path);
+            Polymer.dom.flush();
+            assertEquals('downloads-text', getDefaultDownloadPathString());
+          });
     });
   }
 });
diff --git a/chrome/test/nacl/nacl_browsertest.cc b/chrome/test/nacl/nacl_browsertest.cc
index 98148db..6cb2290 100644
--- a/chrome/test/nacl/nacl_browsertest.cc
+++ b/chrome/test/nacl/nacl_browsertest.cc
@@ -376,9 +376,9 @@
       "pnacl_debug_url.html?nmf_file=pnacl_has_debug_flag_off.nmf"));
 }
 
-// NaClBrowserTestPnacl.PnaclErrorHandling is flaky on Win and Linux.
+// NaClBrowserTestPnacl.PnaclErrorHandling is flaky on Win, Mac, and Linux.
 // http://crbug.com/704980, http://crbug.com/870309
-#if defined(OS_WIN) || defined(OS_LINUX)
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
 #define MAYBE_PnaclErrorHandling DISABLED_PnaclErrorHandling
 #else
 #define MAYBE_PnaclErrorHandling PnaclErrorHandling
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 5e59922a..9a00f9c 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -308,7 +308,6 @@
 
     deps += [
       "//chromecast/common/extensions_api:api",
-      "//chromecast/common/extensions_api:api_registration",
       "//components/guest_view/browser",
       "//components/keyed_service/content",
       "//components/pref_registry",
diff --git a/chromecast/browser/cast_extension_message_filter.cc b/chromecast/browser/cast_extension_message_filter.cc
index 486bc98..3b72bea 100644
--- a/chromecast/browser/cast_extension_message_filter.cc
+++ b/chromecast/browser/cast_extension_message_filter.cc
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromecast/common/extensions_api/cast_extension_messages.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/notification_service.h"
diff --git a/chromecast/browser/metrics/external_metrics.cc b/chromecast/browser/metrics/external_metrics.cc
index 3686088..ef38a71f 100644
--- a/chromecast/browser/metrics/external_metrics.cc
+++ b/chromecast/browser/metrics/external_metrics.cc
@@ -17,8 +17,8 @@
 #include "base/metrics/sparse_histogram.h"
 #include "base/metrics/statistics_recorder.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "chromecast/base/metrics/cast_histograms.h"
 #include "chromecast/base/metrics/cast_metrics_helper.h"
diff --git a/chromecast/browser/network_context_manager_unittest.cc b/chromecast/browser/network_context_manager_unittest.cc
index 152b51f..69788838 100644
--- a/chromecast/browser/network_context_manager_unittest.cc
+++ b/chromecast/browser/network_context_manager_unittest.cc
@@ -7,8 +7,8 @@
 #include <memory>
 
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/chromecast/browser/url_request_context_factory.cc b/chromecast/browser/url_request_context_factory.cc
index aaf2098..51989ef 100644
--- a/chromecast/browser/url_request_context_factory.cc
+++ b/chromecast/browser/url_request_context_factory.cc
@@ -11,7 +11,7 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromecast/base/cast_features.h"
 #include "chromecast/base/chromecast_switches.h"
 #include "chromecast/browser/cast_browser_process.h"
diff --git a/chromecast/common/BUILD.gn b/chromecast/common/BUILD.gn
index 88a77dd..0c96f40 100644
--- a/chromecast/common/BUILD.gn
+++ b/chromecast/common/BUILD.gn
@@ -42,12 +42,11 @@
 
     deps += [
       "//chromecast/common/extensions_api:api",
-      "//chromecast/common/extensions_api:api_registration",
       "//chromecast/common/extensions_api:extensions_features",
       "//components/version_info",
       "//extensions:extensions_resources_grd_grit",
       "//extensions/common",
-      "//extensions/common/api:generated_api",
+      "//extensions/common/api",
       "//extensions/shell:resources",
       "//extensions/shell:resources_grit",
     ]
diff --git a/chromecast/common/extensions_api/BUILD.gn b/chromecast/common/extensions_api/BUILD.gn
index 75b38555..8863c28 100644
--- a/chromecast/common/extensions_api/BUILD.gn
+++ b/chromecast/common/extensions_api/BUILD.gn
@@ -31,10 +31,9 @@
 
 extensions_api_uncompiled_sources = [ "extension.json" ]
 
-json_schema_api("api") {
+json_schema_api("generated_api_strings_bundle") {
   sources = schema_sources
   uncompiled_sources = extensions_api_uncompiled_sources
-  schemas = true
   bundle = true
   bundle_name = "Cast"
   uncompiled_bundle_schema_sources = [ "tts.json" ]
@@ -43,19 +42,30 @@
   deps = [
     "//extensions/common/api",
   ]
+  visibility = [ ":api" ]
 }
 
-json_schema_api("api_registration") {
+json_schema_api("generated_api_registration_bundle") {
   sources = schema_sources
   impl_dir = "//chromecast/browser/extensions/api"
   bundle_registration = true
   bundle_name = "Cast"
 
   deps = [
-    ":api",
     "//extensions/common",
     "//extensions/common/api",
   ]
+  visibility = [ ":api" ]
+}
+
+generated_types("generated_api_types") {
+  sources = schema_sources
+  schema_include_rules = extensions_api_schema_include_rules
+
+  deps = [
+    "//extensions/common/api",
+  ]
+  visibility = [ ":api" ]
 }
 
 json_features("cast_api_features") {
@@ -82,6 +92,16 @@
   ]
 }
 
+# Public Targets
+
+group("api") {
+  public_deps = [
+    ":generated_api_registration_bundle",
+    ":generated_api_strings_bundle",
+    ":generated_api_types",
+  ]
+}
+
 group("extensions_features") {
   public_deps = [
     ":cast_api_features",
diff --git a/chromecast/device/bluetooth/le/le_scan_manager_impl_test.cc b/chromecast/device/bluetooth/le/le_scan_manager_impl_test.cc
index f956476..0db63fb 100644
--- a/chromecast/device/bluetooth/le/le_scan_manager_impl_test.cc
+++ b/chromecast/device/bluetooth/le/le_scan_manager_impl_test.cc
@@ -8,7 +8,7 @@
 #include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromecast/device/bluetooth/bluetooth_util.h"
diff --git a/chromeos/BUILD.gn b/chromeos/BUILD.gn
index c75527a..de3d1fd 100644
--- a/chromeos/BUILD.gn
+++ b/chromeos/BUILD.gn
@@ -329,6 +329,8 @@
     "dbus/virtual_file_provider_client.h",
     "dbus/volume_state.cc",
     "dbus/volume_state.h",
+    "disks/disk.cc",
+    "disks/disk.h",
     "disks/disk_mount_manager.cc",
     "disks/disk_mount_manager.h",
     "disks/suspend_unmount_manager.cc",
@@ -747,6 +749,7 @@
     "dbus/shill_third_party_vpn_driver_client_unittest.cc",
     "dbus/util/version_loader_unittest.cc",
     "disks/disk_mount_manager_unittest.cc",
+    "disks/disk_unittest.cc",
     "disks/suspend_unmount_manager_unittest.cc",
     "geolocation/simple_geolocation_unittest.cc",
     "login/auth/authpolicy_login_helper_unittest.cc",
@@ -822,6 +825,10 @@
 if (cros_board != "") {
   generate_vm_runner_script("cros_vm_launcher") {
     generated_script = "$root_build_dir/bin/launch_cros_vm"
+
+    # Assume every time we build cros_vm_launcher, we also build chrome and
+    # want to deploy it to the VM.
+    deploy_chrome = true
   }
 
   # The sanity test's actual binary is baked into the vm image. All we need to
diff --git a/chromeos/account_manager/account_manager.cc b/chromeos/account_manager/account_manager.cc
index 4b7f60b7..ffe159b 100644
--- a/chromeos/account_manager/account_manager.cc
+++ b/chromeos/account_manager/account_manager.cc
@@ -13,7 +13,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "google_apis/gaia/gaia_auth_consumer.h"
diff --git a/chromeos/cert_loader.cc b/chromeos/cert_loader.cc
index f7e1e9f..2cdc8f3c 100644
--- a/chromeos/cert_loader.cc
+++ b/chromeos/cert_loader.cc
@@ -12,7 +12,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "crypto/nss_util.h"
 #include "crypto/scoped_nss_types.h"
 #include "net/cert/cert_database.h"
diff --git a/chromeos/chromeos_switches.cc b/chromeos/chromeos_switches.cc
index e1261f15..0ac444f 100644
--- a/chromeos/chromeos_switches.cc
+++ b/chromeos/chromeos_switches.cc
@@ -27,11 +27,11 @@
 // all stored user keys will be converted to GaiaId)
 const char kTestCrosGaiaIdMigrationStarted[] = "started";
 
-// Controls whether enable assistant for locale.
+// Controls whether to enable assistant for locale.
 const base::Feature kAssistantFeatureForLocale{
     "ChromeOSAssistantForLocale", base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Controls whether enable voice interaction feature.
+// Controls whether to enable voice interaction feature.
 const base::Feature kVoiceInteractionFeature{"ChromeOSVoiceInteraction",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -47,7 +47,7 @@
 const base::Feature kAccountManager{"ChromeOSAccountManager",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Controls whether enable Google Assistant feature.
+// Controls whether to enable Google Assistant feature.
 const base::Feature kAssistantFeature{"ChromeOSAssistant",
                                       base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/chromeos/chromeos_switches.h b/chromeos/chromeos_switches.h
index 53be935..9080de02 100644
--- a/chromeos/chromeos_switches.h
+++ b/chromeos/chromeos_switches.h
@@ -168,7 +168,7 @@
 // Controls whether to enable Chrome OS Account Manager.
 CHROMEOS_EXPORT extern const base::Feature kAccountManager;
 
-// Controls whether enable Google Assistant feature.
+// Controls whether to enable Google Assistant feature.
 CHROMEOS_EXPORT extern const base::Feature kAssistantFeature;
 
 // Returns true if the system should wake in response to wifi traffic.
diff --git a/chromeos/components/drivefs/fake_drivefs_launcher_client.cc b/chromeos/components/drivefs/fake_drivefs_launcher_client.cc
index 46c32fc..a48cb64 100644
--- a/chromeos/components/drivefs/fake_drivefs_launcher_client.cc
+++ b/chromeos/components/drivefs/fake_drivefs_launcher_client.cc
@@ -9,7 +9,7 @@
 
 #include "base/strings/strcat.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromeos/components/drivefs/pending_connection_manager.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_cros_disks_client.h"
diff --git a/chromeos/components/nearby/count_down_latch_impl_unittests.cc b/chromeos/components/nearby/count_down_latch_impl_unittests.cc
index d795d599..527c4e1 100644
--- a/chromeos/components/nearby/count_down_latch_impl_unittests.cc
+++ b/chromeos/components/nearby/count_down_latch_impl_unittests.cc
@@ -8,8 +8,8 @@
 #include "base/optional.h"
 #include "base/stl_util.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
diff --git a/chromeos/components/nearby/settable_future_impl_unittests.cc b/chromeos/components/nearby/settable_future_impl_unittests.cc
index 98543b9..089caa6d 100644
--- a/chromeos/components/nearby/settable_future_impl_unittests.cc
+++ b/chromeos/components/nearby/settable_future_impl_unittests.cc
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "base/stl_util.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
diff --git a/chromeos/dbus/biod/biod_client.cc b/chromeos/dbus/biod/biod_client.cc
index 7152eb41..2ea91eb 100644
--- a/chromeos/dbus/biod/biod_client.cc
+++ b/chromeos/dbus/biod/biod_client.cc
@@ -347,6 +347,10 @@
     int percent_complete =
         protobuf.has_percent_complete() ? protobuf.percent_complete() : -1;
 
+    // Enroll session is ended automatically when enrollment is done.
+    if (protobuf.done())
+      current_enroll_session_path_.reset();
+
     for (auto& observer : observers_) {
       observer.BiodEnrollScanDoneReceived(protobuf.scan_result(),
                                           protobuf.done(), percent_complete);
diff --git a/chromeos/dbus/cicerone_client.cc b/chromeos/dbus/cicerone_client.cc
index 2013c42..344fa23 100644
--- a/chromeos/dbus/cicerone_client.cc
+++ b/chromeos/dbus/cicerone_client.cc
@@ -40,6 +40,18 @@
     return is_install_linux_package_progress_signal_connected_;
   }
 
+  bool IsLxdContainerCreatedSignalConnected() override {
+    return is_lxd_container_created_signal_connected_;
+  }
+
+  bool IsLxdContainerDownloadingSignalConnected() override {
+    return is_lxd_container_downloading_signal_connected_;
+  }
+
+  bool IsTremplinStartedSignalConnected() override {
+    return is_tremplin_started_signal_connected_;
+  }
+
   void LaunchContainerApplication(
       const vm_tools::cicerone::LaunchContainerApplicationRequest& request,
       DBusMethodCallback<vm_tools::cicerone::LaunchContainerApplicationResponse>
@@ -108,6 +120,92 @@
                        weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
   }
 
+  void CreateLxdContainer(
+      const vm_tools::cicerone::CreateLxdContainerRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::CreateLxdContainerResponse>
+          callback) override {
+    dbus::MethodCall method_call(vm_tools::cicerone::kVmCiceroneInterface,
+                                 vm_tools::cicerone::kCreateLxdContainerMethod);
+    dbus::MessageWriter writer(&method_call);
+
+    if (!writer.AppendProtoAsArrayOfBytes(request)) {
+      LOG(ERROR) << "Failed to encode CreateLxdContainerRequest protobuf";
+      std::move(callback).Run(base::nullopt);
+      return;
+    }
+
+    cicerone_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(&CiceroneClientImpl::OnDBusProtoResponse<
+                           vm_tools::cicerone::CreateLxdContainerResponse>,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
+  void StartLxdContainer(
+      const vm_tools::cicerone::StartLxdContainerRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::StartLxdContainerResponse>
+          callback) override {
+    dbus::MethodCall method_call(vm_tools::cicerone::kVmCiceroneInterface,
+                                 vm_tools::cicerone::kStartLxdContainerMethod);
+    dbus::MessageWriter writer(&method_call);
+
+    if (!writer.AppendProtoAsArrayOfBytes(request)) {
+      LOG(ERROR) << "Failed to encode StartLxdContainerRequest protobuf";
+      std::move(callback).Run(base::nullopt);
+      return;
+    }
+
+    cicerone_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(&CiceroneClientImpl::OnDBusProtoResponse<
+                           vm_tools::cicerone::StartLxdContainerResponse>,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
+  void GetLxdContainerUsername(
+      const vm_tools::cicerone::GetLxdContainerUsernameRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::GetLxdContainerUsernameResponse>
+          callback) override {
+    dbus::MethodCall method_call(
+        vm_tools::cicerone::kVmCiceroneInterface,
+        vm_tools::cicerone::kGetLxdContainerUsernameMethod);
+    dbus::MessageWriter writer(&method_call);
+
+    if (!writer.AppendProtoAsArrayOfBytes(request)) {
+      LOG(ERROR) << "Failed to encode GetLxdContainerUsernameRequest protobuf";
+      std::move(callback).Run(base::nullopt);
+      return;
+    }
+
+    cicerone_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(&CiceroneClientImpl::OnDBusProtoResponse<
+                           vm_tools::cicerone::GetLxdContainerUsernameResponse>,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
+  void SetUpLxdContainerUser(
+      const vm_tools::cicerone::SetUpLxdContainerUserRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::SetUpLxdContainerUserResponse>
+          callback) override {
+    dbus::MethodCall method_call(
+        vm_tools::cicerone::kVmCiceroneInterface,
+        vm_tools::cicerone::kSetUpLxdContainerUserMethod);
+    dbus::MessageWriter writer(&method_call);
+
+    if (!writer.AppendProtoAsArrayOfBytes(request)) {
+      LOG(ERROR) << "Failed to encode SetUpLxdContainerUserRequest protobuf";
+      std::move(callback).Run(base::nullopt);
+      return;
+    }
+
+    cicerone_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(&CiceroneClientImpl::OnDBusProtoResponse<
+                           vm_tools::cicerone::SetUpLxdContainerUserResponse>,
+                       weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+  }
+
   void WaitForServiceToBeAvailable(
       dbus::ObjectProxy::WaitForServiceToBeAvailableCallback callback)
       override {
@@ -145,6 +243,28 @@
             weak_ptr_factory_.GetWeakPtr()),
         base::BindOnce(&CiceroneClientImpl::OnSignalConnected,
                        weak_ptr_factory_.GetWeakPtr()));
+    cicerone_proxy_->ConnectToSignal(
+        vm_tools::cicerone::kVmCiceroneInterface,
+        vm_tools::cicerone::kLxdContainerCreatedSignal,
+        base::BindRepeating(&CiceroneClientImpl::OnLxdContainerCreatedSignal,
+                            weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&CiceroneClientImpl::OnSignalConnected,
+                       weak_ptr_factory_.GetWeakPtr()));
+    cicerone_proxy_->ConnectToSignal(
+        vm_tools::cicerone::kVmCiceroneInterface,
+        vm_tools::cicerone::kLxdContainerDownloadingSignal,
+        base::BindRepeating(
+            &CiceroneClientImpl::OnLxdContainerDownloadingSignal,
+            weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&CiceroneClientImpl::OnSignalConnected,
+                       weak_ptr_factory_.GetWeakPtr()));
+    cicerone_proxy_->ConnectToSignal(
+        vm_tools::cicerone::kVmCiceroneInterface,
+        vm_tools::cicerone::kTremplinStartedSignal,
+        base::BindRepeating(&CiceroneClientImpl::OnTremplinStartedSignal,
+                            weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&CiceroneClientImpl::OnSignalConnected,
+                       weak_ptr_factory_.GetWeakPtr()));
   }
 
  private:
@@ -201,6 +321,42 @@
     }
   }
 
+  void OnLxdContainerCreatedSignal(dbus::Signal* signal) {
+    vm_tools::cicerone::LxdContainerCreatedSignal proto;
+    dbus::MessageReader reader(signal);
+    if (!reader.PopArrayOfBytesAsProto(&proto)) {
+      LOG(ERROR) << "Failed to parse proto from DBus Signal";
+      return;
+    }
+    for (auto& observer : observer_list_) {
+      observer.OnLxdContainerCreated(proto);
+    }
+  }
+
+  void OnLxdContainerDownloadingSignal(dbus::Signal* signal) {
+    vm_tools::cicerone::LxdContainerDownloadingSignal proto;
+    dbus::MessageReader reader(signal);
+    if (!reader.PopArrayOfBytesAsProto(&proto)) {
+      LOG(ERROR) << "Failed to parse proto from DBus Signal";
+      return;
+    }
+    for (auto& observer : observer_list_) {
+      observer.OnLxdContainerDownloading(proto);
+    }
+  }
+
+  void OnTremplinStartedSignal(dbus::Signal* signal) {
+    vm_tools::cicerone::TremplinStartedSignal proto;
+    dbus::MessageReader reader(signal);
+    if (!reader.PopArrayOfBytesAsProto(&proto)) {
+      LOG(ERROR) << "Failed to parse proto from DBus Signal";
+      return;
+    }
+    for (auto& observer : observer_list_) {
+      observer.OnTremplinStarted(proto);
+    }
+  }
+
   void OnSignalConnected(const std::string& interface_name,
                          const std::string& signal_name,
                          bool is_connected) {
@@ -216,6 +372,13 @@
     } else if (signal_name ==
                vm_tools::cicerone::kInstallLinuxPackageProgressSignal) {
       is_install_linux_package_progress_signal_connected_ = is_connected;
+    } else if (signal_name == vm_tools::cicerone::kLxdContainerCreatedSignal) {
+      is_lxd_container_created_signal_connected_ = is_connected;
+    } else if (signal_name ==
+               vm_tools::cicerone::kLxdContainerDownloadingSignal) {
+      is_lxd_container_downloading_signal_connected_ = is_connected;
+    } else if (signal_name == vm_tools::cicerone::kTremplinStartedSignal) {
+      is_tremplin_started_signal_connected_ = is_connected;
     } else {
       NOTREACHED();
     }
@@ -228,6 +391,9 @@
   bool is_container_started_signal_connected_ = false;
   bool is_container_shutdown_signal_connected_ = false;
   bool is_install_linux_package_progress_signal_connected_ = false;
+  bool is_lxd_container_created_signal_connected_ = false;
+  bool is_lxd_container_downloading_signal_connected_ = false;
+  bool is_tremplin_started_signal_connected_ = false;
 
   // Note: This should remain the last member so it'll be destroyed and
   // invalidate its weak pointers before any other members are destroyed.
diff --git a/chromeos/dbus/cicerone_client.h b/chromeos/dbus/cicerone_client.h
index 8e481fc..acc12616 100644
--- a/chromeos/dbus/cicerone_client.h
+++ b/chromeos/dbus/cicerone_client.h
@@ -21,7 +21,7 @@
  public:
   class Observer {
    public:
-    // OnContainerStarted is signaled by Cicerone after the long-running
+    // OnContainerStarted is signaled by Cicerone after the long-running Lxd
     // container startup process has been completed and the container is ready.
     virtual void OnContainerStarted(
         const vm_tools::cicerone::ContainerStartedSignal& signal) = 0;
@@ -36,6 +36,22 @@
         const vm_tools::cicerone::InstallLinuxPackageProgressSignal&
             signal) = 0;
 
+    // OnLxdContainerCreated is signaled from Cicerone when the long running
+    // creation of an Lxd container is complete.
+    virtual void OnLxdContainerCreated(
+        const vm_tools::cicerone::LxdContainerCreatedSignal& signal) = 0;
+
+    // OnLxdContainerDownloading is signaled from Cicerone giving download
+    // progress on the container.
+    virtual void OnLxdContainerDownloading(
+        const vm_tools::cicerone::LxdContainerDownloadingSignal& signal) = 0;
+
+    // OnTremplinStarted is signaled from Cicerone when Tremplin gRPC service is
+    // first connected in a VM. This service is required for CreateLxdContainer
+    // and StartLxdContainer.
+    virtual void OnTremplinStarted(
+        const vm_tools::cicerone::TremplinStartedSignal& signal) = 0;
+
    protected:
     virtual ~Observer() = default;
   };
@@ -59,6 +75,18 @@
   // This should be true prior to calling InstallLinuxPackage.
   virtual bool IsInstallLinuxPackageProgressSignalConnected() = 0;
 
+  // This should be true prior to calling CreateLxdContainer or
+  // StartLxdContainer.
+  virtual bool IsLxdContainerCreatedSignalConnected() = 0;
+
+  // This should be true prior to calling CreateLxdContainer or
+  // StartLxdContainer.
+  virtual bool IsLxdContainerDownloadingSignalConnected() = 0;
+
+  // This should be true prior to calling CreateLxdContainer or
+  // StartLxdContainer.
+  virtual bool IsTremplinStartedSignalConnected() = 0;
+
   // Launches an application inside a running Container.
   // |callback| is called after the method call finishes.
   virtual void LaunchContainerApplication(
@@ -80,6 +108,36 @@
       DBusMethodCallback<vm_tools::cicerone::InstallLinuxPackageResponse>
           callback) = 0;
 
+  // Creates a new Lxd Container.
+  // |callback| is called to indicate creation status.
+  // |Observer::OnLxdContainerCreated| will be called on completion.
+  // |Observer::OnLxdContainerDownloading| is called to indicate progress.
+  virtual void CreateLxdContainer(
+      const vm_tools::cicerone::CreateLxdContainerRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::CreateLxdContainerResponse>
+          callback) = 0;
+
+  // Starts a new Lxd Container.
+  // |callback| is called when the method completes.
+  virtual void StartLxdContainer(
+      const vm_tools::cicerone::StartLxdContainerRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::StartLxdContainerResponse>
+          callback) = 0;
+
+  // Gets the Lxd container username.
+  // |callback| is called when the method completes.
+  virtual void GetLxdContainerUsername(
+      const vm_tools::cicerone::GetLxdContainerUsernameRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::GetLxdContainerUsernameResponse>
+          callback) = 0;
+
+  // Sets the Lxd container user, creating it if needed.
+  // |callback| is called when the method completes.
+  virtual void SetUpLxdContainerUser(
+      const vm_tools::cicerone::SetUpLxdContainerUserRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::SetUpLxdContainerUserResponse>
+          callback) = 0;
+
   // Registers |callback| to run when the Cicerone service becomes available.
   // If the service is already available, or if connecting to the name-owner-
   // changed signal fails, |callback| will be run once asynchronously.
diff --git a/chromeos/dbus/debug_daemon_client.cc b/chromeos/dbus/debug_daemon_client.cc
index 026cf61..6164b00a 100644
--- a/chromeos/dbus/debug_daemon_client.cc
+++ b/chromeos/dbus/debug_daemon_client.cc
@@ -22,7 +22,7 @@
 #include "base/macros.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/dbus/pipe_reader.h"
 #include "dbus/bus.h"
diff --git a/chromeos/dbus/fake_auth_policy_client.cc b/chromeos/dbus/fake_auth_policy_client.cc
index ed39e0b..8b8bfeb 100644
--- a/chromeos/dbus/fake_auth_policy_client.cc
+++ b/chromeos/dbus/fake_auth_policy_client.cc
@@ -14,7 +14,7 @@
 #include "base/md5.h"
 #include "base/path_service.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/chromeos_paths.h"
diff --git a/chromeos/dbus/fake_cicerone_client.cc b/chromeos/dbus/fake_cicerone_client.cc
index 010b937..8d73fb9 100644
--- a/chromeos/dbus/fake_cicerone_client.cc
+++ b/chromeos/dbus/fake_cicerone_client.cc
@@ -36,8 +36,20 @@
   return is_container_shutdown_signal_connected_;
 }
 
+bool FakeCiceroneClient::IsLxdContainerCreatedSignalConnected() {
+  return is_lxd_container_created_signal_connected_;
+}
+
+bool FakeCiceroneClient::IsLxdContainerDownloadingSignalConnected() {
+  return is_lxd_container_downloading_signal_connected_;
+}
+
+bool FakeCiceroneClient::IsTremplinStartedSignalConnected() {
+  return is_tremplin_started_signal_connected_;
+}
+
 bool FakeCiceroneClient::IsInstallLinuxPackageProgressSignalConnected() {
-  return is_install_linux_package_progress_signal_connected;
+  return is_install_linux_package_progress_signal_connected_;
 }
 
 void FakeCiceroneClient::LaunchContainerApplication(
@@ -72,4 +84,40 @@
       FROM_HERE, base::BindOnce(std::move(callback), true));
 }
 
+void FakeCiceroneClient::CreateLxdContainer(
+    const vm_tools::cicerone::CreateLxdContainerRequest& request,
+    DBusMethodCallback<vm_tools::cicerone::CreateLxdContainerResponse>
+        callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(callback), create_lxd_container_response_));
+}
+
+void FakeCiceroneClient::StartLxdContainer(
+    const vm_tools::cicerone::StartLxdContainerRequest& request,
+    DBusMethodCallback<vm_tools::cicerone::StartLxdContainerResponse>
+        callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(callback), start_lxd_container_response_));
+}
+
+void FakeCiceroneClient::GetLxdContainerUsername(
+    const vm_tools::cicerone::GetLxdContainerUsernameRequest& request,
+    DBusMethodCallback<vm_tools::cicerone::GetLxdContainerUsernameResponse>
+        callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback),
+                                get_lxd_container_username_response_));
+}
+
+void FakeCiceroneClient::SetUpLxdContainerUser(
+    const vm_tools::cicerone::SetUpLxdContainerUserRequest& request,
+    DBusMethodCallback<vm_tools::cicerone::SetUpLxdContainerUserResponse>
+        callback) {
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(std::move(callback), setup_lxd_container_user_response_));
+}
+
 }  // namespace chromeos
diff --git a/chromeos/dbus/fake_cicerone_client.h b/chromeos/dbus/fake_cicerone_client.h
index 253d782..421839b 100644
--- a/chromeos/dbus/fake_cicerone_client.h
+++ b/chromeos/dbus/fake_cicerone_client.h
@@ -32,6 +32,18 @@
   // This should be true prior to calling InstallLinuxPackage.
   bool IsInstallLinuxPackageProgressSignalConnected() override;
 
+  // This should be true prior to calling CreateLxdContainer or
+  // StartLxdContainer.
+  bool IsLxdContainerCreatedSignalConnected() override;
+
+  // This should be true prior to calling CreateLxdContainer or
+  // StartLxdContainer.
+  bool IsLxdContainerDownloadingSignalConnected() override;
+
+  // This should be true prior to calling CreateLxdContainer or
+  // StartLxdContainer.
+  bool IsTremplinStartedSignalConnected() override;
+
   // Fake version of the method that launches an application inside a running
   // Container. |callback| is called after the method call finishes.
   void LaunchContainerApplication(
@@ -54,6 +66,34 @@
       DBusMethodCallback<vm_tools::cicerone::InstallLinuxPackageResponse>
           callback) override;
 
+  // Fake version of the method that creates a new Container.
+  // |callback| is called to indicate creation status.
+  void CreateLxdContainer(
+      const vm_tools::cicerone::CreateLxdContainerRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::CreateLxdContainerResponse>
+          callback) override;
+
+  // Fake version of the method that starts a new Container.
+  // |callback| is called when the method completes.
+  void StartLxdContainer(
+      const vm_tools::cicerone::StartLxdContainerRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::StartLxdContainerResponse>
+          callback) override;
+
+  // Fake version of the method that gets the container username.
+  // |callback| is called when the method completes.
+  void GetLxdContainerUsername(
+      const vm_tools::cicerone::GetLxdContainerUsernameRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::GetLxdContainerUsernameResponse>
+          callback) override;
+
+  // Fake version of the method that sets the container user.
+  // |callback| is called when the method completes.
+  void SetUpLxdContainerUser(
+      const vm_tools::cicerone::SetUpLxdContainerUserRequest& request,
+      DBusMethodCallback<vm_tools::cicerone::SetUpLxdContainerUserResponse>
+          callback) override;
+
   // Fake version of the method that waits for the Cicerone service to be
   // availble.  |callback| is called after the method call finishes.
   void WaitForServiceToBeAvailable(
@@ -71,7 +111,20 @@
 
   // Set InstallLinuxPackageProgressSignalConnected state
   void set_install_linux_package_progress_signal_connected(bool connected) {
-    is_install_linux_package_progress_signal_connected = connected;
+    is_install_linux_package_progress_signal_connected_ = connected;
+  }
+
+  // Set LxdContainerCreatedSignalConnected state
+  void set_lxd_container_created_signal_connected(bool connected) {
+    is_lxd_container_created_signal_connected_ = connected;
+  }
+  // Set LxdContainerDownloadingSignalConnected state
+  void set_lxd_container_downloading_signal_connected(bool connected) {
+    is_lxd_container_downloading_signal_connected_ = connected;
+  }
+  // Set TremplinStartedSignalConnected state
+  void set_tremplin_started_signal_connected(bool connected) {
+    is_tremplin_started_signal_connected_ = connected;
   }
 
   void set_launch_container_application_response(
@@ -93,19 +146,53 @@
     install_linux_package_response_ = install_linux_package_response;
   }
 
+  void set_create_lxd_container_response(
+      const vm_tools::cicerone::CreateLxdContainerResponse&
+          create_lxd_container_response) {
+    create_lxd_container_response_ = create_lxd_container_response;
+  }
+
+  void set_start_lxd_container_response(
+      const vm_tools::cicerone::StartLxdContainerResponse&
+          start_lxd_container_response) {
+    start_lxd_container_response_ = start_lxd_container_response;
+  }
+
+  void set_get_lxd_container_username_response(
+      const vm_tools::cicerone::GetLxdContainerUsernameResponse&
+          get_lxd_container_username_response) {
+    get_lxd_container_username_response_ = get_lxd_container_username_response;
+  }
+
+  void set_setup_lxd_container_user_response(
+      const vm_tools::cicerone::SetUpLxdContainerUserResponse&
+          setup_lxd_container_user_response) {
+    setup_lxd_container_user_response_ = setup_lxd_container_user_response;
+  }
+
  protected:
   void Init(dbus::Bus* bus) override {}
 
  private:
   bool is_container_started_signal_connected_ = true;
   bool is_container_shutdown_signal_connected_ = true;
-  bool is_install_linux_package_progress_signal_connected = true;
+  bool is_install_linux_package_progress_signal_connected_ = true;
+  bool is_lxd_container_created_signal_connected_ = true;
+  bool is_lxd_container_downloading_signal_connected_ = true;
+  bool is_tremplin_started_signal_connected_ = true;
 
   vm_tools::cicerone::LaunchContainerApplicationResponse
       launch_container_application_response_;
   vm_tools::cicerone::ContainerAppIconResponse container_app_icon_response_;
   vm_tools::cicerone::InstallLinuxPackageResponse
       install_linux_package_response_;
+  vm_tools::cicerone::CreateLxdContainerResponse create_lxd_container_response_;
+  vm_tools::cicerone::StartLxdContainerResponse start_lxd_container_response_;
+  vm_tools::cicerone::GetLxdContainerUsernameResponse
+      get_lxd_container_username_response_;
+  vm_tools::cicerone::SetUpLxdContainerUserResponse
+      setup_lxd_container_user_response_;
+
   base::ObserverList<Observer> observer_list_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeCiceroneClient);
diff --git a/chromeos/dbus/fake_cros_disks_client.cc b/chromeos/dbus/fake_cros_disks_client.cc
index b6d9f96f..112c80ccf 100644
--- a/chromeos/dbus/fake_cros_disks_client.cc
+++ b/chromeos/dbus/fake_cros_disks_client.cc
@@ -11,7 +11,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "url/gurl.h"
 
diff --git a/chromeos/dbus/fake_permission_broker_client.cc b/chromeos/dbus/fake_permission_broker_client.cc
index f41772d..b78a64227 100644
--- a/chromeos/dbus/fake_permission_broker_client.cc
+++ b/chromeos/dbus/fake_permission_broker_client.cc
@@ -13,7 +13,7 @@
 #include "base/logging.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 
 namespace chromeos {
diff --git a/chromeos/dbus/fake_session_manager_client.cc b/chromeos/dbus/fake_session_manager_client.cc
index d541efa..ff426bb 100644
--- a/chromeos/dbus/fake_session_manager_client.cc
+++ b/chromeos/dbus/fake_session_manager_client.cc
@@ -17,7 +17,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chromeos/chromeos_paths.h"
 #include "chromeos/dbus/cryptohome_client.h"
diff --git a/chromeos/dbus/lorgnette_manager_client.cc b/chromeos/dbus/lorgnette_manager_client.cc
index 4865b379..5647a056 100644
--- a/chromeos/dbus/lorgnette_manager_client.cc
+++ b/chromeos/dbus/lorgnette_manager_client.cc
@@ -15,7 +15,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromeos/dbus/pipe_reader.h"
 #include "dbus/bus.h"
 #include "dbus/message.h"
diff --git a/chromeos/dbus/machine_learning_client.cc b/chromeos/dbus/machine_learning_client.cc
index e17ff9ba..1982559 100644
--- a/chromeos/dbus/machine_learning_client.cc
+++ b/chromeos/dbus/machine_learning_client.cc
@@ -7,7 +7,6 @@
 #include <memory>
 
 #include "base/bind.h"
-#include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chromeos/dbus/fake_machine_learning_client.h"
@@ -28,10 +27,15 @@
   void BootstrapMojoConnection(
       base::ScopedFD fd,
       base::OnceCallback<void(bool success)> result_callback) override {
-    ml_service_proxy_->WaitForServiceToBeAvailable(
-        base::BindOnce(&MachineLearningClientImpl::OnServiceAvailable,
-                       weak_ptr_factory_.GetWeakPtr(), std::move(fd),
-                       std::move(result_callback)));
+    dbus::MethodCall method_call(ml::kMachineLearningInterfaceName,
+                                 ml::kBootstrapMojoConnectionMethod);
+    dbus::MessageWriter writer(&method_call);
+    writer.AppendFileDescriptor(fd.get());
+    ml_service_proxy_->CallMethod(
+        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+        base::BindOnce(
+            &MachineLearningClientImpl::OnBootstrapMojoConnectionResponse,
+            weak_ptr_factory_.GetWeakPtr(), std::move(result_callback)));
   }
 
  protected:
@@ -45,31 +49,6 @@
  private:
   dbus::ObjectProxy* ml_service_proxy_ = nullptr;
 
-  // Actually sends the Mojo-bootstrap message to the ML service daemon, once
-  // the daemon's D-Bus interface is available.
-  void OnServiceAvailable(
-      base::ScopedFD fd,
-      base::OnceCallback<void(bool success)> result_callback,
-      const bool service_is_available) {
-    // Return failure immediately if D-Bus service is not available.
-    if (!service_is_available) {
-      const bool success = false;
-      std::move(result_callback).Run(success);
-      return;
-    }
-
-    // Call the bootstrap D-Bus method.
-    dbus::MethodCall method_call(ml::kMachineLearningInterfaceName,
-                                 ml::kBootstrapMojoConnectionMethod);
-    dbus::MessageWriter writer(&method_call);
-    writer.AppendFileDescriptor(fd.get());
-    ml_service_proxy_->CallMethod(
-        &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
-        base::BindOnce(
-            &MachineLearningClientImpl::OnBootstrapMojoConnectionResponse,
-            weak_ptr_factory_.GetWeakPtr(), std::move(result_callback)));
-  }
-
   // Passes the success/failure of |dbus_response| on to |result_callback|.
   void OnBootstrapMojoConnectionResponse(
       base::OnceCallback<void(bool success)> result_callback,
diff --git a/chromeos/dbus/pipe_reader_unittest.cc b/chromeos/dbus/pipe_reader_unittest.cc
index dc53d7e..6cdcee1 100644
--- a/chromeos/dbus/pipe_reader_unittest.cc
+++ b/chromeos/dbus/pipe_reader_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromeos/dbus/services/chrome_features_service_provider.cc b/chromeos/dbus/services/chrome_features_service_provider.cc
index c3ad74f..52c0e4be9 100644
--- a/chromeos/dbus/services/chrome_features_service_provider.cc
+++ b/chromeos/dbus/services/chrome_features_service_provider.cc
@@ -28,6 +28,13 @@
                           weak_ptr_factory_.GetWeakPtr()),
       base::BindRepeating(&ChromeFeaturesServiceProvider::OnExported,
                           weak_ptr_factory_.GetWeakPtr()));
+  exported_object->ExportMethod(
+      kChromeFeaturesServiceInterface,
+      kChromeFeaturesServiceIsUsbguardEnabledMethod,
+      base::BindRepeating(&ChromeFeaturesServiceProvider::IsUsbguardEnabled,
+                          weak_ptr_factory_.GetWeakPtr()),
+      base::BindRepeating(&ChromeFeaturesServiceProvider::OnExported,
+                          weak_ptr_factory_.GetWeakPtr()));
 }
 
 void ChromeFeaturesServiceProvider::OnExported(
@@ -59,4 +66,14 @@
   response_sender.Run(std::move(response));
 }
 
+void ChromeFeaturesServiceProvider::IsUsbguardEnabled(
+    dbus::MethodCall* method_call,
+    dbus::ExportedObject::ResponseSender response_sender) {
+  std::unique_ptr<dbus::Response> response =
+      dbus::Response::FromMethodCall(method_call);
+  dbus::MessageWriter writer(response.get());
+  writer.AppendBool(delegate_->IsUsbguardEnabled());
+  response_sender.Run(std::move(response));
+}
+
 }  // namespace chromeos
diff --git a/chromeos/dbus/services/chrome_features_service_provider.h b/chromeos/dbus/services/chrome_features_service_provider.h
index 8711cf1..b6cc6fa 100644
--- a/chromeos/dbus/services/chrome_features_service_provider.h
+++ b/chromeos/dbus/services/chrome_features_service_provider.h
@@ -41,6 +41,7 @@
     virtual ~Delegate() {}
 
     virtual bool IsCrostiniEnabled(const std::string& user_id_hash) = 0;
+    virtual bool IsUsbguardEnabled() = 0;
 
    private:
     DISALLOW_COPY_AND_ASSIGN(Delegate);
@@ -62,6 +63,8 @@
   // Called on UI thread in response to a D-Bus request.
   void IsCrostiniEnabled(dbus::MethodCall* method_call,
                          dbus::ExportedObject::ResponseSender response_sender);
+  void IsUsbguardEnabled(dbus::MethodCall* method_call,
+                         dbus::ExportedObject::ResponseSender response_sender);
 
   std::unique_ptr<Delegate> delegate_;
   // Keep this last so that all weak pointers will be invalidated at the
diff --git a/chromeos/disks/DEPS b/chromeos/disks/DEPS
new file mode 100644
index 0000000..aed2994
--- /dev/null
+++ b/chromeos/disks/DEPS
@@ -0,0 +1,5 @@
+specific_include_rules = {
+  "disk_unittest.cc": [
+    "+dbus",
+  ],
+}
diff --git a/chromeos/disks/OWNERS b/chromeos/disks/OWNERS
new file mode 100644
index 0000000..73220a8
--- /dev/null
+++ b/chromeos/disks/OWNERS
@@ -0,0 +1 @@
+file://ui/file_manager/OWNERS
diff --git a/chromeos/disks/disk.cc b/chromeos/disks/disk.cc
new file mode 100644
index 0000000..3ba6a39
--- /dev/null
+++ b/chromeos/disks/disk.cc
@@ -0,0 +1,114 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/disks/disk.h"
+
+namespace chromeos {
+namespace disks {
+
+namespace {
+constexpr char kStatefulPartition[] = "/mnt/stateful_partition";
+}
+
+Disk::Disk(const DiskInfo& disk_info,
+           bool write_disabled_by_policy,
+           const std::string& system_path_prefix,
+           const std::string& base_mount_path)
+    : device_path_(disk_info.device_path()),
+      mount_path_(disk_info.mount_path()),
+      write_disabled_by_policy_(write_disabled_by_policy),
+      system_path_(disk_info.system_path()),
+      file_path_(disk_info.file_path()),
+      device_label_(disk_info.label()),
+      drive_label_(disk_info.drive_label()),
+      vendor_id_(disk_info.vendor_id()),
+      vendor_name_(disk_info.vendor_name()),
+      product_id_(disk_info.product_id()),
+      product_name_(disk_info.product_name()),
+      fs_uuid_(disk_info.uuid()),
+      system_path_prefix_(system_path_prefix),
+      device_type_(disk_info.device_type()),
+      total_size_in_bytes_(disk_info.total_size_in_bytes()),
+      is_parent_(disk_info.is_drive()),
+      is_read_only_hardware_(disk_info.is_read_only()),
+      has_media_(disk_info.has_media()),
+      on_boot_device_(disk_info.on_boot_device()),
+      on_removable_device_(disk_info.on_removable_device()),
+      is_hidden_(disk_info.is_hidden()),
+      file_system_type_(disk_info.file_system_type()),
+      base_mount_path_(base_mount_path) {}
+
+Disk::Disk(const std::string& device_path,
+           const std::string& mount_path,
+           bool write_disabled_by_policy,
+           const std::string& system_path,
+           const std::string& file_path,
+           const std::string& device_label,
+           const std::string& drive_label,
+           const std::string& vendor_id,
+           const std::string& vendor_name,
+           const std::string& product_id,
+           const std::string& product_name,
+           const std::string& fs_uuid,
+           const std::string& system_path_prefix,
+           DeviceType device_type,
+           uint64_t total_size_in_bytes,
+           bool is_parent,
+           bool is_read_only_hardware,
+           bool has_media,
+           bool on_boot_device,
+           bool on_removable_device,
+           bool is_hidden,
+           const std::string& file_system_type,
+           const std::string& base_mount_path)
+    : device_path_(device_path),
+      mount_path_(mount_path),
+      write_disabled_by_policy_(write_disabled_by_policy),
+      system_path_(system_path),
+      file_path_(file_path),
+      device_label_(device_label),
+      drive_label_(drive_label),
+      vendor_id_(vendor_id),
+      vendor_name_(vendor_name),
+      product_id_(product_id),
+      product_name_(product_name),
+      fs_uuid_(fs_uuid),
+      system_path_prefix_(system_path_prefix),
+      device_type_(device_type),
+      total_size_in_bytes_(total_size_in_bytes),
+      is_parent_(is_parent),
+      is_read_only_hardware_(is_read_only_hardware),
+      has_media_(has_media),
+      on_boot_device_(on_boot_device),
+      on_removable_device_(on_removable_device),
+      is_hidden_(is_hidden),
+      file_system_type_(file_system_type),
+      base_mount_path_(base_mount_path) {}
+
+Disk::Disk(const Disk&) = default;
+
+Disk::~Disk() = default;
+
+void Disk::SetMountPath(const std::string& mount_path) {
+  mount_path_ = mount_path;
+
+  if (base_mount_path_.empty())
+    base_mount_path_ = mount_path;
+}
+
+bool Disk::IsAutoMountable() const {
+  // Disks are considered auto-mountable if they are:
+  // 1. Non-virtual
+  // 2. Not on boot device
+  // Only the second condition is checked here, because Disks are created from
+  // non-virtual mount devices only.
+  return !on_boot_device_;
+}
+
+bool Disk::IsStatefulPartition() const {
+  return mount_path_ == kStatefulPartition;
+}
+
+}  // namespace disks
+}  // namespace chromeos
diff --git a/chromeos/disks/disk.h b/chromeos/disks/disk.h
new file mode 100644
index 0000000..63860456
--- /dev/null
+++ b/chromeos/disks/disk.h
@@ -0,0 +1,184 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_DISKS_DISK_H_
+#define CHROMEOS_DISKS_DISK_H_
+
+#include <string>
+
+#include "chromeos/chromeos_export.h"
+#include "chromeos/dbus/cros_disks_client.h"
+
+namespace chromeos {
+namespace disks {
+
+class CHROMEOS_EXPORT Disk {
+ public:
+  Disk(const DiskInfo& disk_info,
+       // Whether the device is mounted in read-only mode by the policy.
+       // Valid only when the device mounted and mount_path_ is non-empty.
+       bool write_disabled_by_policy,
+       const std::string& system_path_prefix,
+       const std::string& base_mount_path);
+
+  // For tests.
+  // TODO(amistry): Replace with a builder.
+  Disk(const std::string& device_path,
+       // The path to the mount point of this device. Empty if not mounted.
+       // (e.g. /media/removable/VOLUME)
+       const std::string& mount_path,
+       bool write_disabled_by_policy,
+       const std::string& system_path,
+       const std::string& file_path,
+       const std::string& device_label,
+       const std::string& drive_label,
+       const std::string& vendor_id,
+       const std::string& vendor_name,
+       const std::string& product_id,
+       const std::string& product_name,
+       const std::string& fs_uuid,
+       const std::string& system_path_prefix,
+       DeviceType device_type,
+       uint64_t total_size_in_bytes,
+       bool is_parent,
+       bool is_read_only_hardware,
+       bool has_media,
+       bool on_boot_device,
+       bool on_removable_device,
+       bool is_hidden,
+       const std::string& file_system_type,
+       const std::string& base_mount_path);
+  Disk(const Disk&);
+
+  ~Disk();
+
+  // The path of the device, used by devicekit-disks.
+  // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1)
+  const std::string& device_path() const { return device_path_; }
+
+  // The path to the mount point of this device. Will be empty if not mounted.
+  // (e.g. /media/removable/VOLUME)
+  const std::string& mount_path() const { return mount_path_; }
+
+  // The path of the device according to the udev system.
+  // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1)
+  const std::string& system_path() const { return system_path_; }
+
+  // The path of the device according to filesystem.
+  // (e.g. /dev/sdb)
+  const std::string& file_path() const { return file_path_; }
+
+  // Device's label.
+  const std::string& device_label() const { return device_label_; }
+
+  void set_device_label(const std::string& device_label) {
+    device_label_ = device_label;
+  }
+
+  // If disk is a parent, then its label, else parents label.
+  // (e.g. "TransMemory")
+  const std::string& drive_label() const { return drive_label_; }
+
+  // Vendor ID of the device (e.g. "18d1").
+  const std::string& vendor_id() const { return vendor_id_; }
+
+  // Vendor name of the device (e.g. "Google Inc.").
+  const std::string& vendor_name() const { return vendor_name_; }
+
+  // Product ID of the device (e.g. "4e11").
+  const std::string& product_id() const { return product_id_; }
+
+  // Product name of the device (e.g. "Nexus One").
+  const std::string& product_name() const { return product_name_; }
+
+  // Returns the file system uuid string.
+  const std::string& fs_uuid() const { return fs_uuid_; }
+
+  // Path of the system device this device's block is a part of.
+  // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/)
+  const std::string& system_path_prefix() const { return system_path_prefix_; }
+
+  // Device type.
+  DeviceType device_type() const { return device_type_; }
+
+  // Total size of the device in bytes.
+  uint64_t total_size_in_bytes() const { return total_size_in_bytes_; }
+
+  // Is the device is a parent device (i.e. sdb rather than sdb1).
+  bool is_parent() const { return is_parent_; }
+
+  // Whether the user can write to the device. True if read-only.
+  bool is_read_only() const {
+    return is_read_only_hardware_ || write_disabled_by_policy_;
+  }
+
+  // Is the device read only.
+  bool is_read_only_hardware() const { return is_read_only_hardware_; }
+
+  // Does the device contains media.
+  bool has_media() const { return has_media_; }
+
+  // Is the device on the boot device.
+  bool on_boot_device() const { return on_boot_device_; }
+
+  // Is the device on the removable device.
+  bool on_removable_device() const { return on_removable_device_; }
+
+  // Shoud the device be shown in the UI, or automounted.
+  bool is_hidden() const { return is_hidden_; }
+
+  void set_write_disabled_by_policy(bool disable) {
+    write_disabled_by_policy_ = disable;
+  }
+
+  void clear_mount_path() { mount_path_.clear(); }
+
+  bool is_mounted() const { return !mount_path_.empty(); }
+
+  const std::string& file_system_type() const { return file_system_type_; }
+
+  void set_file_system_type(const std::string& file_system_type) {
+    file_system_type_ = file_system_type;
+  }
+  // Name of the first mount path of the disk.
+  const std::string& base_mount_path() const { return base_mount_path_; }
+
+  void SetMountPath(const std::string& mount_path);
+
+  bool IsAutoMountable() const;
+
+  bool IsStatefulPartition() const;
+
+ private:
+  Disk() = delete;
+
+  std::string device_path_;
+  std::string mount_path_;
+  bool write_disabled_by_policy_;
+  std::string system_path_;
+  std::string file_path_;
+  std::string device_label_;
+  std::string drive_label_;
+  std::string vendor_id_;
+  std::string vendor_name_;
+  std::string product_id_;
+  std::string product_name_;
+  std::string fs_uuid_;
+  std::string system_path_prefix_;
+  DeviceType device_type_;
+  uint64_t total_size_in_bytes_;
+  bool is_parent_;
+  bool is_read_only_hardware_;
+  bool has_media_;
+  bool on_boot_device_;
+  bool on_removable_device_;
+  bool is_hidden_;
+  std::string file_system_type_;
+  std::string base_mount_path_;
+};
+
+}  // namespace disks
+}  // namespace chromeos
+
+#endif  // CHROMEOS_DISKS_DISK_H_
diff --git a/chromeos/disks/disk_mount_manager.cc b/chromeos/disks/disk_mount_manager.cc
index 366482f..830a0a85 100644
--- a/chromeos/disks/disk_mount_manager.cc
+++ b/chromeos/disks/disk_mount_manager.cc
@@ -22,6 +22,7 @@
 #include "base/strings/string_util.h"
 #include "chromeos/dbus/cros_disks_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/suspend_unmount_manager.h"
 
 namespace chromeos {
@@ -32,7 +33,6 @@
 constexpr char kDefaultFormattedDeviceName[] = "UNTITLED";
 constexpr char kDefaultFormatVFAT[] = "vfat";
 constexpr char kDeviceNotFound[] = "Device could not be found";
-constexpr char kStatefulPartition[] = "/mnt/stateful_partition";
 DiskMountManager* g_disk_mount_manager = NULL;
 
 // The DiskMountManager implementation.
@@ -633,19 +633,9 @@
     auto access_mode = access_modes_.find(disk_info.device_path());
     bool write_disabled_by_policy = access_mode != access_modes_.end()
         && access_mode->second == chromeos::MOUNT_ACCESS_MODE_READ_ONLY;
-    // TODO(agawronska): Add constructor for Disk from DiskInfo. Introduce Disk
-    // builder class for tests.
-    Disk* disk = new Disk(
-        disk_info.device_path(), disk_info.mount_path(),
-        write_disabled_by_policy, disk_info.system_path(),
-        disk_info.file_path(), disk_info.label(), disk_info.drive_label(),
-        disk_info.vendor_id(), disk_info.vendor_name(), disk_info.product_id(),
-        disk_info.product_name(), disk_info.uuid(),
-        FindSystemPathPrefix(disk_info.system_path()), disk_info.device_type(),
-        disk_info.total_size_in_bytes(), disk_info.is_drive(),
-        disk_info.is_read_only(), disk_info.has_media(),
-        disk_info.on_boot_device(), disk_info.on_removable_device(),
-        disk_info.is_hidden(), disk_info.file_system_type(), base_mount_path);
+    Disk* disk = new Disk(disk_info, write_disabled_by_policy,
+                          FindSystemPathPrefix(disk_info.system_path()),
+                          base_mount_path);
     disks_.insert(
         std::make_pair(disk_info.device_path(), base::WrapUnique(disk)));
     NotifyDiskStatusUpdate(is_new ? DISK_ADDED : DISK_CHANGED, *disk);
@@ -835,77 +825,6 @@
 
 }  // namespace
 
-DiskMountManager::Disk::Disk(const std::string& device_path,
-                             const std::string& mount_path,
-                             bool write_disabled_by_policy,
-                             const std::string& system_path,
-                             const std::string& file_path,
-                             const std::string& device_label,
-                             const std::string& drive_label,
-                             const std::string& vendor_id,
-                             const std::string& vendor_name,
-                             const std::string& product_id,
-                             const std::string& product_name,
-                             const std::string& fs_uuid,
-                             const std::string& system_path_prefix,
-                             DeviceType device_type,
-                             uint64_t total_size_in_bytes,
-                             bool is_parent,
-                             bool is_read_only_hardware,
-                             bool has_media,
-                             bool on_boot_device,
-                             bool on_removable_device,
-                             bool is_hidden,
-                             const std::string& file_system_type,
-                             const std::string& base_mount_path)
-    : device_path_(device_path),
-      mount_path_(mount_path),
-      write_disabled_by_policy_(write_disabled_by_policy),
-      system_path_(system_path),
-      file_path_(file_path),
-      device_label_(device_label),
-      drive_label_(drive_label),
-      vendor_id_(vendor_id),
-      vendor_name_(vendor_name),
-      product_id_(product_id),
-      product_name_(product_name),
-      fs_uuid_(fs_uuid),
-      system_path_prefix_(system_path_prefix),
-      device_type_(device_type),
-      total_size_in_bytes_(total_size_in_bytes),
-      is_parent_(is_parent),
-      is_read_only_hardware_(is_read_only_hardware),
-      has_media_(has_media),
-      on_boot_device_(on_boot_device),
-      on_removable_device_(on_removable_device),
-      is_hidden_(is_hidden),
-      file_system_type_(file_system_type),
-      base_mount_path_(base_mount_path) {}
-
-DiskMountManager::Disk::Disk(const Disk& other) = default;
-
-DiskMountManager::Disk::~Disk() = default;
-
-void DiskMountManager::Disk::SetMountPath(const std::string& mount_path) {
-  mount_path_ = mount_path;
-
-  if (base_mount_path_.empty())
-    base_mount_path_ = mount_path;
-}
-
-bool DiskMountManager::Disk::IsAutoMountable() const {
-  // Disks are considered auto-mountable if they are:
-  // 1. Non-virtual
-  // 2. Not on boot device
-  // Only the second condition is checked here, because Disks are created from
-  // non-virtual mount devices only.
-  return !on_boot_device_;
-}
-
-bool DiskMountManager::Disk::IsStatefulPartition() const {
-  return mount_path_ == kStatefulPartition;
-}
-
 bool DiskMountManager::AddDiskForTest(std::unique_ptr<Disk> disk) {
   return false;
 }
diff --git a/chromeos/disks/disk_mount_manager.h b/chromeos/disks/disk_mount_manager.h
index e65a5c0..b60c106f 100644
--- a/chromeos/disks/disk_mount_manager.h
+++ b/chromeos/disks/disk_mount_manager.h
@@ -18,6 +18,8 @@
 namespace chromeos {
 namespace disks {
 
+class Disk;
+
 // Condition of mounted filesystem.
 enum MountCondition {
   MOUNT_CONDITION_NONE,
@@ -54,164 +56,6 @@
 
   enum RenameEvent { RENAME_STARTED, RENAME_COMPLETED };
 
-  // Used to house an instance of each found mount device. Created from
-  // non-virtual mount devices only - see IsAutoMountable().
-  class Disk {
-   public:
-    Disk(const std::string& device_path,
-         // The path to the mount point of this device. Empty if not mounted.
-         // (e.g. /media/removable/VOLUME)
-         const std::string& mount_path,
-         // Whether the device is mounted in read-only mode by the policy.
-         // Valid only when the device mounted and mount_path_ is non-empty.
-         bool write_disabled_by_policy,
-         const std::string& system_path,
-         const std::string& file_path,
-         const std::string& device_label,
-         const std::string& drive_label,
-         const std::string& vendor_id,
-         const std::string& vendor_name,
-         const std::string& product_id,
-         const std::string& product_name,
-         const std::string& fs_uuid,
-         const std::string& system_path_prefix,
-         DeviceType device_type,
-         uint64_t total_size_in_bytes,
-         bool is_parent,
-         bool is_read_only_hardware,
-         bool has_media,
-         bool on_boot_device,
-         bool on_removable_device,
-         bool is_hidden,
-         const std::string& file_system_type,
-         const std::string& base_mount_path);
-    Disk(const Disk& other);
-    ~Disk();
-
-    // The path of the device, used by devicekit-disks.
-    // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1)
-    const std::string& device_path() const { return device_path_; }
-
-    // The path to the mount point of this device. Will be empty if not mounted.
-    // (e.g. /media/removable/VOLUME)
-    const std::string& mount_path() const { return mount_path_; }
-
-    // The path of the device according to the udev system.
-    // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/block/sdb/sdb1)
-    const std::string& system_path() const { return system_path_; }
-
-    // The path of the device according to filesystem.
-    // (e.g. /dev/sdb)
-    const std::string& file_path() const { return file_path_; }
-
-    // Device's label.
-    const std::string& device_label() const { return device_label_; }
-
-    void set_device_label(const std::string& device_label) {
-      device_label_ = device_label;
-    }
-
-    // If disk is a parent, then its label, else parents label.
-    // (e.g. "TransMemory")
-    const std::string& drive_label() const { return drive_label_; }
-
-    // Vendor ID of the device (e.g. "18d1").
-    const std::string& vendor_id() const { return vendor_id_; }
-
-    // Vendor name of the device (e.g. "Google Inc.").
-    const std::string& vendor_name() const { return vendor_name_; }
-
-    // Product ID of the device (e.g. "4e11").
-    const std::string& product_id() const { return product_id_; }
-
-    // Product name of the device (e.g. "Nexus One").
-    const std::string& product_name() const { return product_name_; }
-
-    // Returns the file system uuid string.
-    const std::string& fs_uuid() const { return fs_uuid_; }
-
-    // Path of the system device this device's block is a part of.
-    // (e.g. /sys/devices/pci0000:00/.../8:0:0:0/)
-    const std::string& system_path_prefix() const {
-      return system_path_prefix_;
-    }
-
-    // Device type.
-    DeviceType device_type() const { return device_type_; }
-
-    // Total size of the device in bytes.
-    uint64_t total_size_in_bytes() const { return total_size_in_bytes_; }
-
-    // Is the device is a parent device (i.e. sdb rather than sdb1).
-    bool is_parent() const { return is_parent_; }
-
-    // Whether the user can write to the device. True if read-only.
-    bool is_read_only() const {
-      return is_read_only_hardware_ || write_disabled_by_policy_;
-    }
-
-    // Is the device read only.
-    bool is_read_only_hardware() const { return is_read_only_hardware_; }
-
-    // Does the device contains media.
-    bool has_media() const { return has_media_; }
-
-    // Is the device on the boot device.
-    bool on_boot_device() const { return on_boot_device_; }
-
-    // Is the device on the removable device.
-    bool on_removable_device() const { return on_removable_device_; }
-
-    // Shoud the device be shown in the UI, or automounted.
-    bool is_hidden() const { return is_hidden_; }
-
-    void set_write_disabled_by_policy(bool disable) {
-      write_disabled_by_policy_ = disable;
-    }
-
-    void clear_mount_path() { mount_path_.clear(); }
-
-    bool is_mounted() const { return !mount_path_.empty(); }
-
-    const std::string& file_system_type() const { return file_system_type_; }
-
-    void set_file_system_type(const std::string& file_system_type) {
-      file_system_type_ = file_system_type;
-    }
-    // Name of the first mount path of the disk.
-    const std::string& base_mount_path() const { return base_mount_path_; }
-
-    void SetMountPath(const std::string& mount_path);
-
-    bool IsAutoMountable() const;
-
-    bool IsStatefulPartition() const;
-
-   private:
-    std::string device_path_;
-    std::string mount_path_;
-    bool write_disabled_by_policy_;
-    std::string system_path_;
-    std::string file_path_;
-    std::string device_label_;
-    std::string drive_label_;
-    std::string vendor_id_;
-    std::string vendor_name_;
-    std::string product_id_;
-    std::string product_name_;
-    std::string fs_uuid_;
-    std::string system_path_prefix_;
-    DeviceType device_type_;
-    uint64_t total_size_in_bytes_;
-    bool is_parent_;
-    bool is_read_only_hardware_;
-    bool has_media_;
-    bool on_boot_device_;
-    bool on_removable_device_;
-    bool is_hidden_;
-    std::string file_system_type_;
-    std::string base_mount_path_;
-  };
   typedef std::map<std::string, std::unique_ptr<Disk>> DiskMap;
 
   // A struct to store information about mount point.
diff --git a/chromeos/disks/disk_mount_manager_unittest.cc b/chromeos/disks/disk_mount_manager_unittest.cc
index 4219b47..fc1e20a 100644
--- a/chromeos/disks/disk_mount_manager_unittest.cc
+++ b/chromeos/disks/disk_mount_manager_unittest.cc
@@ -16,10 +16,12 @@
 #include "base/test/scoped_task_environment.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_cros_disks_client.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 using base::StringPrintf;
+using chromeos::disks::Disk;
 using chromeos::disks::DiskMountManager;
 using chromeos::CrosDisksClient;
 using chromeos::DBusThreadManager;
@@ -37,7 +39,7 @@
 const char kFileSystemType1[] = "ntfs";
 const char kFileSystemType2[] = "exfat";
 
-// Holds information needed to create a DiskMountManager::Disk instance.
+// Holds information needed to create a Disk instance.
 struct TestDiskInfo {
   const char* source_path;
   const char* mount_path;
@@ -216,11 +218,10 @@
 // DiskMountManager::Observer::OnAutoMountableDiskEvent().
 struct AutoMountableDiskEvent : public ObserverEvent {
   DiskMountManager::DiskEvent event;
-  std::unique_ptr<DiskMountManager::Disk> disk;
+  std::unique_ptr<Disk> disk;
 
-  AutoMountableDiskEvent(DiskMountManager::DiskEvent event,
-                         const DiskMountManager::Disk& disk)
-      : event(event), disk(std::make_unique<DiskMountManager::Disk>(disk)) {}
+  AutoMountableDiskEvent(DiskMountManager::DiskEvent event, const Disk& disk)
+      : event(event), disk(std::make_unique<Disk>(disk)) {}
 
   AutoMountableDiskEvent(AutoMountableDiskEvent&& other)
       : event(other.event), disk(std::move(other.disk)) {}
@@ -243,11 +244,10 @@
 // TODO(agawronska): Add tests for disks events.
 struct BootDeviceDiskEvent : public ObserverEvent {
   DiskMountManager::DiskEvent event;
-  std::unique_ptr<DiskMountManager::Disk> disk;
+  std::unique_ptr<Disk> disk;
 
-  BootDeviceDiskEvent(DiskMountManager::DiskEvent event,
-                      const DiskMountManager::Disk& disk)
-      : event(event), disk(std::make_unique<DiskMountManager::Disk>(disk)) {}
+  BootDeviceDiskEvent(DiskMountManager::DiskEvent event, const Disk& disk)
+      : event(event), disk(std::make_unique<Disk>(disk)) {}
 
   BootDeviceDiskEvent(BootDeviceDiskEvent&& other)
       : event(other.event), disk(std::move(other.disk)) {}
@@ -322,7 +322,7 @@
 
   // Not passed to callback, but read by handlers. So it's captured upon
   // callback.
-  std::unique_ptr<DiskMountManager::Disk> disk;
+  std::unique_ptr<Disk> disk;
 
   MountEvent(MountEvent&& other)
       : event(other.event),
@@ -332,11 +332,11 @@
   MountEvent(DiskMountManager::MountEvent event,
              chromeos::MountError error_code,
              const DiskMountManager::MountPointInfo& mount_point,
-             const DiskMountManager::Disk& disk)
+             const Disk& disk)
       : event(event),
         error_code(error_code),
         mount_point(mount_point),
-        disk(new DiskMountManager::Disk(disk)) {}
+        disk(std::make_unique<Disk>(disk)) {}
 
   ObserverEventType type() const override { return MOUNT_EVENT; }
 
@@ -365,14 +365,14 @@
   }
 
   void OnBootDeviceDiskEvent(DiskMountManager::DiskEvent event,
-                             const DiskMountManager::Disk& disk) override {
+                             const Disk& disk) override {
     // Take a snapshot (copy) of the Disk object at the time of invocation for
     // later verification.
     events_.push_back(std::make_unique<BootDeviceDiskEvent>(event, disk));
   }
 
   void OnAutoMountableDiskEvent(DiskMountManager::DiskEvent event,
-                                const DiskMountManager::Disk& disk) override {
+                                const Disk& disk) override {
     // Take a snapshot (copy) of the Disk object at the time of invocation for
     // later verification.
     events_.push_back(std::make_unique<AutoMountableDiskEvent>(event, disk));
@@ -556,8 +556,8 @@
  private:
   // Adds a new disk to the disk mount manager.
   void AddTestDisk(const TestDiskInfo& disk) {
-    EXPECT_TRUE(DiskMountManager::GetInstance()->AddDiskForTest(
-        std::make_unique<DiskMountManager::Disk>(
+    EXPECT_TRUE(
+        DiskMountManager::GetInstance()->AddDiskForTest(std::make_unique<Disk>(
             disk.source_path, disk.mount_path, disk.write_disabled_by_policy,
             disk.system_path, disk.file_path, disk.device_label,
             disk.drive_label, disk.vendor_id, disk.vendor_name, disk.product_id,
diff --git a/chromeos/disks/disk_unittest.cc b/chromeos/disks/disk_unittest.cc
new file mode 100644
index 0000000..7d8615fa
--- /dev/null
+++ b/chromeos/disks/disk_unittest.cc
@@ -0,0 +1,234 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/disks/disk.h"
+
+#include <stdint.h>
+
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "chromeos/dbus/cros_disks_client.h"
+#include "dbus/message.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+namespace disks {
+namespace {
+
+const char kDevicePath[] = "/sys/device/path";
+const char kDeviceFile[] = "/dev/sdb1";
+const char kMountPath1[] = "/media/removable/UNTITLED";
+const char kMountPath2[] = "/media/removable/second_mount_path";
+const char kDriveModel[] = "DriveModel";
+const char kIdLabel[] = "UNTITLED";
+const char kIdUuid[] = "XXXX-YYYY";
+const char kNativePath[] = "/sys/devices/.../sdb/sdb1";
+const char kProductId[] = "1234";
+const char kProductName[] = "Product Name";
+const char kVendorId[] = "0000";
+const char kVendorName[] = "Vendor Name";
+const char kFileSystemType[] = "exfat";
+const uint64_t kDeviceSize = 16005464064;
+const uint32_t kDeviceMediaType = cros_disks::DEVICE_MEDIA_SD;
+
+// Appends a boolean entry to a dictionary of type "a{sv}"
+void AppendBoolDictEntry(dbus::MessageWriter* array_writer,
+                         const std::string& key,
+                         bool value) {
+  dbus::MessageWriter entry_writer(nullptr);
+  array_writer->OpenDictEntry(&entry_writer);
+  entry_writer.AppendString(key);
+  entry_writer.AppendVariantOfBool(value);
+  array_writer->CloseContainer(&entry_writer);
+}
+
+// Appends a string entry to a dictionary of type "a{sv}"
+void AppendStringDictEntry(dbus::MessageWriter* array_writer,
+                           const std::string& key,
+                           const std::string& value) {
+  dbus::MessageWriter entry_writer(nullptr);
+  array_writer->OpenDictEntry(&entry_writer);
+  entry_writer.AppendString(key);
+  entry_writer.AppendVariantOfString(value);
+  array_writer->CloseContainer(&entry_writer);
+}
+
+// Appends a uint64 entry to a dictionary of type "a{sv}"
+void AppendUint64DictEntry(dbus::MessageWriter* array_writer,
+                           const std::string& key,
+                           uint64_t value) {
+  dbus::MessageWriter entry_writer(nullptr);
+  array_writer->OpenDictEntry(&entry_writer);
+  entry_writer.AppendString(key);
+  entry_writer.AppendVariantOfUint64(value);
+  array_writer->CloseContainer(&entry_writer);
+}
+
+// Appends a uint32 entry to a dictionary of type "a{sv}"
+void AppendUint32DictEntry(dbus::MessageWriter* array_writer,
+                           const std::string& key,
+                           uint64_t value) {
+  dbus::MessageWriter entry_writer(nullptr);
+  array_writer->OpenDictEntry(&entry_writer);
+  entry_writer.AppendString(key);
+  entry_writer.AppendVariantOfUint32(value);
+  array_writer->CloseContainer(&entry_writer);
+}
+
+void AppendBasicProperties(dbus::MessageWriter* array_writer) {
+  AppendStringDictEntry(array_writer, cros_disks::kDeviceFile, kDeviceFile);
+  AppendStringDictEntry(array_writer, cros_disks::kDriveModel, kDriveModel);
+  AppendStringDictEntry(array_writer, cros_disks::kIdLabel, kIdLabel);
+  AppendStringDictEntry(array_writer, cros_disks::kIdUuid, kIdUuid);
+  AppendStringDictEntry(array_writer, cros_disks::kNativePath, kNativePath);
+  AppendStringDictEntry(array_writer, cros_disks::kProductId, kProductId);
+  AppendStringDictEntry(array_writer, cros_disks::kProductName, kProductName);
+  AppendStringDictEntry(array_writer, cros_disks::kVendorId, kVendorId);
+  AppendStringDictEntry(array_writer, cros_disks::kVendorName, kVendorName);
+  AppendStringDictEntry(array_writer, cros_disks::kFileSystemType,
+                        kFileSystemType);
+  AppendUint64DictEntry(array_writer, cros_disks::kDeviceSize, kDeviceSize);
+  AppendUint32DictEntry(array_writer, cros_disks::kDeviceMediaType,
+                        kDeviceMediaType);
+}
+
+// Builds a dbus reponse with a common set of fields.
+std::unique_ptr<dbus::Response> BuildBasicDbusResponse() {
+  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
+  dbus::MessageWriter writer(response.get());
+  dbus::MessageWriter array_writer(nullptr);
+
+  writer.OpenArray("{sv}", &array_writer);
+  AppendBasicProperties(&array_writer);
+  writer.CloseContainer(&array_writer);
+
+  return response;
+}
+
+TEST(DiskTest, ConstructFromDiskInfo) {
+  const char kSystemPathPrefix[] = "/system/path/prefix";
+  const char kBaseMountpath[] = "/base/mount/path";
+
+  std::unique_ptr<dbus::Response> response = BuildBasicDbusResponse();
+  DiskInfo disk_info(kDevicePath, response.get());
+  Disk disk(disk_info, false /* write_disabled_by_policy */, kSystemPathPrefix,
+            kBaseMountpath);
+
+  EXPECT_EQ(kDevicePath, disk.device_path());
+  EXPECT_EQ(kNativePath, disk.system_path());
+  EXPECT_EQ(kDeviceFile, disk.file_path());
+  EXPECT_EQ(kIdLabel, disk.device_label());
+  EXPECT_EQ(kDriveModel, disk.drive_label());
+  EXPECT_EQ(kVendorId, disk.vendor_id());
+  EXPECT_EQ(kVendorName, disk.vendor_name());
+  EXPECT_EQ(kProductId, disk.product_id());
+  EXPECT_EQ(kProductName, disk.product_name());
+  EXPECT_EQ(kIdUuid, disk.fs_uuid());
+  EXPECT_EQ(kDeviceSize, disk.total_size_in_bytes());
+  EXPECT_EQ(DEVICE_TYPE_SD, disk.device_type());
+  EXPECT_EQ(kSystemPathPrefix, disk.system_path_prefix());
+  EXPECT_EQ(kBaseMountpath, disk.base_mount_path());
+  EXPECT_FALSE(disk.is_parent());
+  EXPECT_FALSE(disk.is_read_only());
+  EXPECT_FALSE(disk.is_read_only_hardware());
+  EXPECT_FALSE(disk.has_media());
+  EXPECT_FALSE(disk.on_boot_device());
+  EXPECT_FALSE(disk.on_removable_device());
+  EXPECT_FALSE(disk.is_mounted());
+  EXPECT_FALSE(disk.IsStatefulPartition());
+
+  // Drives are hidden by default.
+  EXPECT_TRUE(disk.is_hidden());
+
+  // Drives not on the boot device are auto-mountable.
+  EXPECT_TRUE(disk.IsAutoMountable());
+}
+
+std::unique_ptr<Disk> BuildDiskWithProperty(const std::string& property,
+                                            bool value) {
+  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
+  {
+    dbus::MessageWriter writer(response.get());
+    dbus::MessageWriter array_writer(nullptr);
+
+    writer.OpenArray("{sv}", &array_writer);
+    AppendBasicProperties(&array_writer);
+    AppendBoolDictEntry(&array_writer, property, value);
+    writer.CloseContainer(&array_writer);
+  }
+  DiskInfo disk_info(kDevicePath, response.get());
+  return std::make_unique<Disk>(disk_info, false, "", "");
+}
+
+TEST(DiskTest, ConstructFromDiskInfo_BoolProperties) {
+  {
+    auto disk = BuildDiskWithProperty(cros_disks::kDeviceIsDrive, true);
+    EXPECT_TRUE(disk->is_parent());
+  }
+  {
+    auto disk = BuildDiskWithProperty(cros_disks::kDeviceIsReadOnly, true);
+    EXPECT_TRUE(disk->is_read_only());
+    EXPECT_TRUE(disk->is_read_only_hardware());
+  }
+  {
+    auto disk =
+        BuildDiskWithProperty(cros_disks::kDeviceIsMediaAvailable, true);
+    EXPECT_TRUE(disk->has_media());
+  }
+  {
+    auto disk = BuildDiskWithProperty(cros_disks::kDeviceIsOnBootDevice, true);
+    EXPECT_TRUE(disk->on_boot_device());
+  }
+  {
+    auto disk =
+        BuildDiskWithProperty(cros_disks::kDeviceIsOnRemovableDevice, true);
+    EXPECT_TRUE(disk->on_removable_device());
+  }
+}
+
+TEST(DiskTest, ConstructFromDiskInfo_WriteDisabledByPolicy) {
+  std::unique_ptr<dbus::Response> response = BuildBasicDbusResponse();
+  DiskInfo disk_info(kDevicePath, response.get());
+  Disk disk(disk_info, true /* write_disabled_by_policy */, "", "");
+
+  EXPECT_TRUE(disk.is_read_only());
+  EXPECT_FALSE(disk.is_read_only_hardware());
+}
+
+TEST(DiskTest, ConstructFromDiskInfo_Mounted) {
+  std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
+  {
+    dbus::MessageWriter writer(response.get());
+    dbus::MessageWriter array_writer(nullptr);
+
+    writer.OpenArray("{sv}", &array_writer);
+    AppendBasicProperties(&array_writer);
+    {
+      std::vector<std::string> mounted_paths = {kMountPath1, kMountPath2};
+
+      dbus::MessageWriter entry_writer(nullptr);
+      array_writer.OpenDictEntry(&entry_writer);
+      entry_writer.AppendString(cros_disks::kDeviceMountPaths);
+      dbus::MessageWriter variant_writer(nullptr);
+      entry_writer.OpenVariant("as", &variant_writer);
+      variant_writer.AppendArrayOfStrings(mounted_paths);
+      entry_writer.CloseContainer(&variant_writer);
+      array_writer.CloseContainer(&entry_writer);
+    }
+    writer.CloseContainer(&array_writer);
+  }
+
+  DiskInfo disk_info(kDevicePath, response.get());
+  Disk disk(disk_info, false, "", "");
+
+  EXPECT_TRUE(disk.is_mounted());
+  EXPECT_EQ(kMountPath1, disk.mount_path());
+}
+
+}  // namespace
+}  // namespace disks
+}  // namespace chromeos
diff --git a/chromeos/disks/mock_disk_mount_manager.cc b/chromeos/disks/mock_disk_mount_manager.cc
index 9b076551..247bbea 100644
--- a/chromeos/disks/mock_disk_mount_manager.cc
+++ b/chromeos/disks/mock_disk_mount_manager.cc
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/strings/string_util.h"
+#include "chromeos/disks/disk.h"
 
 using testing::_;
 using testing::AnyNumber;
@@ -68,24 +69,22 @@
 MockDiskMountManager::~MockDiskMountManager() = default;
 
 void MockDiskMountManager::NotifyDeviceInsertEvents() {
-  std::unique_ptr<DiskMountManager::Disk> disk1_ptr =
-      std::make_unique<DiskMountManager::Disk>(
-          std::string(kTestDevicePath), std::string(),
-          false,  // write_disabled_by_policy
-          std::string(kTestSystemPath), std::string(kTestFilePath),
-          std::string(), std::string(kTestDriveLabel),
-          std::string(kTestVendorId), std::string(kTestVendorName),
-          std::string(kTestProductId), std::string(kTestProductName),
-          std::string(kTestUuid), std::string(kTestSystemPathPrefix),
-          DEVICE_TYPE_USB, 4294967295U,
-          false,  // is_parent
-          false,  // is_read_only
-          true,   // has_media
-          false,  // on_boot_device
-          true,   // on_removable_device
-          false,  // is_hidden
-          std::string(kTestFileSystemType), std::string());
-  DiskMountManager::Disk* disk1 = disk1_ptr.get();
+  std::unique_ptr<Disk> disk1_ptr = std::make_unique<Disk>(
+      std::string(kTestDevicePath), std::string(),
+      false,  // write_disabled_by_policy
+      std::string(kTestSystemPath), std::string(kTestFilePath), std::string(),
+      std::string(kTestDriveLabel), std::string(kTestVendorId),
+      std::string(kTestVendorName), std::string(kTestProductId),
+      std::string(kTestProductName), std::string(kTestUuid),
+      std::string(kTestSystemPathPrefix), DEVICE_TYPE_USB, 4294967295U,
+      false,  // is_parent
+      false,  // is_read_only
+      true,   // has_media
+      false,  // on_boot_device
+      true,   // on_removable_device
+      false,  // is_hidden
+      std::string(kTestFileSystemType), std::string());
+  Disk* disk1 = disk1_ptr.get();
 
   disks_.clear();
   disks_[std::string(kTestDevicePath)] = std::move(disk1_ptr);
@@ -97,48 +96,46 @@
   NotifyDiskChanged(DISK_ADDED, disk1);
 
   // Disk Changed
-  std::unique_ptr<DiskMountManager::Disk> disk2_ptr =
-      std::make_unique<DiskMountManager::Disk>(
-          std::string(kTestDevicePath), std::string(kTestMountPath),
-          false,  // write_disabled_by_policy
-          std::string(kTestSystemPath), std::string(kTestFilePath),
-          std::string(kTestDeviceLabel), std::string(kTestDriveLabel),
-          std::string(kTestVendorId), std::string(kTestVendorName),
-          std::string(kTestProductId), std::string(kTestProductName),
-          std::string(kTestUuid), std::string(kTestSystemPathPrefix),
-          DEVICE_TYPE_MOBILE, 1073741824,
-          false,  // is_parent
-          false,  // is_read_only
-          true,   // has_media
-          false,  // on_boot_device
-          true,   // on_removable_device
-          false,  // is_hidden
-          std::string(kTestFileSystemType), std::string());
-  DiskMountManager::Disk* disk2 = disk2_ptr.get();
+  std::unique_ptr<Disk> disk2_ptr = std::make_unique<Disk>(
+      std::string(kTestDevicePath), std::string(kTestMountPath),
+      false,  // write_disabled_by_policy
+      std::string(kTestSystemPath), std::string(kTestFilePath),
+      std::string(kTestDeviceLabel), std::string(kTestDriveLabel),
+      std::string(kTestVendorId), std::string(kTestVendorName),
+      std::string(kTestProductId), std::string(kTestProductName),
+      std::string(kTestUuid), std::string(kTestSystemPathPrefix),
+      DEVICE_TYPE_MOBILE, 1073741824,
+      false,  // is_parent
+      false,  // is_read_only
+      true,   // has_media
+      false,  // on_boot_device
+      true,   // on_removable_device
+      false,  // is_hidden
+      std::string(kTestFileSystemType), std::string());
+  Disk* disk2 = disk2_ptr.get();
   disks_.clear();
   disks_[std::string(kTestDevicePath)] = std::move(disk2_ptr);
   NotifyDiskChanged(DISK_CHANGED, disk2);
 }
 
 void MockDiskMountManager::NotifyDeviceRemoveEvents() {
-  std::unique_ptr<DiskMountManager::Disk> disk_ptr =
-      std::make_unique<DiskMountManager::Disk>(
-          std::string(kTestDevicePath), std::string(kTestMountPath),
-          false,  // write_disabled_by_policy
-          std::string(kTestSystemPath), std::string(kTestFilePath),
-          std::string(kTestDeviceLabel), std::string(kTestDriveLabel),
-          std::string(kTestVendorId), std::string(kTestVendorName),
-          std::string(kTestProductId), std::string(kTestProductName),
-          std::string(kTestUuid), std::string(kTestSystemPathPrefix),
-          DEVICE_TYPE_SD, 1073741824,
-          false,  // is_parent
-          false,  // is_read_only
-          true,   // has_media
-          false,  // on_boot_device
-          true,   // on_removable_device
-          false,  // is_hidden
-          std::string(kTestFileSystemType), std::string());
-  DiskMountManager::Disk* disk = disk_ptr.get();
+  std::unique_ptr<Disk> disk_ptr = std::make_unique<Disk>(
+      std::string(kTestDevicePath), std::string(kTestMountPath),
+      false,  // write_disabled_by_policy
+      std::string(kTestSystemPath), std::string(kTestFilePath),
+      std::string(kTestDeviceLabel), std::string(kTestDriveLabel),
+      std::string(kTestVendorId), std::string(kTestVendorName),
+      std::string(kTestProductId), std::string(kTestProductName),
+      std::string(kTestUuid), std::string(kTestSystemPathPrefix),
+      DEVICE_TYPE_SD, 1073741824,
+      false,  // is_parent
+      false,  // is_read_only
+      true,   // has_media
+      false,  // on_boot_device
+      true,   // on_removable_device
+      false,  // is_hidden
+      std::string(kTestFileSystemType), std::string());
+  Disk* disk = disk_ptr.get();
   disks_.clear();
   disks_[std::string(kTestDevicePath)] = std::move(disk_ptr);
   NotifyDiskChanged(DISK_REMOVED, disk);
@@ -186,24 +183,23 @@
     bool on_boot_device,
     bool on_removable_device,
     const std::string& file_system_type) {
-  std::unique_ptr<DiskMountManager::Disk> disk_ptr =
-      std::make_unique<DiskMountManager::Disk>(
-          mount_info.source_path, mount_info.mount_path,
-          false,          // write_disabled_by_policy
-          std::string(),  // system_path
-          mount_info.source_path, device_label,
-          std::string(),  // drive_label
-          std::string(),  // vendor_id
-          vendor_name,
-          std::string(),  // product_id
-          product_name,
-          device_id,      // fs_uuid
-          std::string(),  // system_path_prefix
-          device_type, total_size_in_bytes, is_parent,
-          false,  // is_read_only
-          has_media, on_boot_device, on_removable_device,
-          false,  // is_hidden
-          file_system_type, std::string());
+  std::unique_ptr<Disk> disk_ptr =
+      std::make_unique<Disk>(mount_info.source_path, mount_info.mount_path,
+                             false,          // write_disabled_by_policy
+                             std::string(),  // system_path
+                             mount_info.source_path, device_label,
+                             std::string(),  // drive_label
+                             std::string(),  // vendor_id
+                             vendor_name,
+                             std::string(),  // product_id
+                             product_name,
+                             device_id,      // fs_uuid
+                             std::string(),  // system_path_prefix
+                             device_type, total_size_in_bytes, is_parent,
+                             false,  // is_read_only
+                             has_media, on_boot_device, on_removable_device,
+                             false,  // is_hidden
+                             file_system_type, std::string());
   disks_[std::string(mount_info.source_path)] = std::move(disk_ptr);
 }
 
@@ -217,8 +213,7 @@
   return mount_points_;
 }
 
-const DiskMountManager::Disk*
-MockDiskMountManager::FindDiskBySourcePathInternal(
+const Disk* MockDiskMountManager::FindDiskBySourcePathInternal(
     const std::string& source_path) const {
   DiskMap::const_iterator disk_it = disks_.find(source_path);
   return disk_it == disks_.end() ? nullptr : disk_it->second.get();
@@ -230,9 +225,8 @@
   callback.Run(true);
 }
 
-void MockDiskMountManager::NotifyDiskChanged(
-    DiskEvent event,
-    const DiskMountManager::Disk* disk) {
+void MockDiskMountManager::NotifyDiskChanged(DiskEvent event,
+                                             const Disk* disk) {
   for (auto& observer : observers_) {
     disk->IsAutoMountable() ? observer.OnAutoMountableDiskEvent(event, *disk)
                             : observer.OnBootDeviceDiskEvent(event, *disk);
diff --git a/chromeos/disks/mock_disk_mount_manager.h b/chromeos/disks/mock_disk_mount_manager.h
index 33868f5c..9296131 100644
--- a/chromeos/disks/mock_disk_mount_manager.h
+++ b/chromeos/disks/mock_disk_mount_manager.h
@@ -31,8 +31,7 @@
   MOCK_METHOD1(AddObserver, void(DiskMountManager::Observer*));
   MOCK_METHOD1(RemoveObserver, void(DiskMountManager::Observer*));
   MOCK_CONST_METHOD0(disks, const DiskMountManager::DiskMap&(void));
-  MOCK_CONST_METHOD1(FindDiskBySourcePath,
-                     const DiskMountManager::Disk*(const std::string&));
+  MOCK_CONST_METHOD1(FindDiskBySourcePath, const Disk*(const std::string&));
   MOCK_CONST_METHOD0(mount_points,
                      const DiskMountManager::MountPointMap&(void));
   MOCK_METHOD2(EnsureMountInfoRefreshed,
@@ -104,7 +103,7 @@
   const DiskMountManager::MountPointMap& mountPointsInternal() const;
 
   // Returns Disk object associated with the |source_path| or NULL on failure.
-  const DiskMountManager::Disk* FindDiskBySourcePathInternal(
+  const Disk* FindDiskBySourcePathInternal(
       const std::string& source_path) const;
 
   // Is used to implement EnsureMountInfoRefreshed.
@@ -117,8 +116,7 @@
                            const std::string& path);
 
   // Notifies observers about disk status update.
-  void NotifyDiskChanged(DiskEvent event,
-                         const DiskMountManager::Disk* disk);
+  void NotifyDiskChanged(DiskEvent event, const Disk* disk);
 
   // The list of observers.
   base::ObserverList<DiskMountManager::Observer> observers_;
diff --git a/chromeos/disks/suspend_unmount_manager.cc b/chromeos/disks/suspend_unmount_manager.cc
index 761dd71..34922be 100644
--- a/chromeos/disks/suspend_unmount_manager.cc
+++ b/chromeos/disks/suspend_unmount_manager.cc
@@ -6,6 +6,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 
 namespace chromeos {
diff --git a/chromeos/login/auth/authpolicy_login_helper.cc b/chromeos/login/auth/authpolicy_login_helper.cc
index 04c166752..cc56973 100644
--- a/chromeos/login/auth/authpolicy_login_helper.cc
+++ b/chromeos/login/auth/authpolicy_login_helper.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_util.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromeos/dbus/auth_policy_client.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/upstart_client.h"
diff --git a/chromeos/network/client_cert_resolver.cc b/chromeos/network/client_cert_resolver.cc
index b8de4445..dba950495 100644
--- a/chromeos/network/client_cert_resolver.cc
+++ b/chromeos/network/client_cert_resolver.cc
@@ -17,7 +17,7 @@
 #include "base/logging.h"
 #include "base/optional.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/clock.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/shill_service_client.h"
diff --git a/chromeos/printing/ppd_cache.cc b/chromeos/printing/ppd_cache.cc
index c547018..1bbb7da7 100644
--- a/chromeos/printing/ppd_cache.cc
+++ b/chromeos/printing/ppd_cache.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/chromeos/printing/ppd_provider.cc b/chromeos/printing/ppd_provider.cc
index ecedb36..c9f2414e 100644
--- a/chromeos/printing/ppd_provider.cc
+++ b/chromeos/printing/ppd_provider.cc
@@ -25,7 +25,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/chromeos/process_proxy/process_proxy_registry.cc b/chromeos/process_proxy/process_proxy_registry.cc
index d4ab1f5..c890c10 100644
--- a/chromeos/process_proxy/process_proxy_registry.cc
+++ b/chromeos/process_proxy/process_proxy_registry.cc
@@ -8,7 +8,7 @@
 #include "base/command_line.h"
 #include "base/message_loop/message_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 
 namespace chromeos {
 
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.cc b/chromeos/services/assistant/assistant_manager_service_impl.cc
index de99745..2ef1690 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.cc
+++ b/chromeos/services/assistant/assistant_manager_service_impl.cc
@@ -13,7 +13,7 @@
 #include "base/logging.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/util/webkit_version.h"
 #include "chromeos/assistant/internal/internal_constants.h"
 #include "chromeos/assistant/internal/internal_util.h"
@@ -57,15 +57,23 @@
       background_thread_("background thread"),
       weak_factory_(this) {
   background_thread_.Start();
-  background_thread_.task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&AssistantManagerServiceImpl::SetVolumeHack,
-                                base::Unretained(this)));
   connector->BindInterface(ash::mojom::kServiceName,
                            &voice_interaction_controller_);
 
+  // TODO(b/112281490): Combine this observer with the one in service.cc.
   ash::mojom::VoiceInteractionObserverPtr ptr;
   voice_interaction_observer_binding_.Bind(mojo::MakeRequest(&ptr));
   voice_interaction_controller_->AddObserver(std::move(ptr));
+
+  // Initialize |assistant_enabled_| to the value in settings.
+  voice_interaction_controller_->IsSettingEnabled(base::BindOnce(
+      &AssistantManagerServiceImpl::OnVoiceInteractionSettingsEnabled,
+      weak_factory_.GetWeakPtr()));
+
+  // Initialize |context_enabled_| to the value in settings.
+  voice_interaction_controller_->IsContextEnabled(base::BindOnce(
+      &AssistantManagerServiceImpl::OnVoiceInteractionContextEnabled,
+      weak_factory_.GetWeakPtr()));
 }
 
 AssistantManagerServiceImpl::~AssistantManagerServiceImpl() {}
@@ -99,6 +107,7 @@
 
 void AssistantManagerServiceImpl::SetAccessToken(
     const std::string& access_token) {
+  VLOG(1) << "Set access token.";
   // Push the |access_token| we got as an argument into AssistantManager before
   // starting to ensure that all server requests will be authenticated once
   // it is started. |user_id| is used to pair a user to their |access_token|,
@@ -753,10 +762,5 @@
   std::move(callback).Run();
 }
 
-void AssistantManagerServiceImpl::SetVolumeHack() {
-  DCHECK(background_thread_.task_runner()->BelongsToCurrentThread());
-  platform_api_.GetFileProvider().WriteFile("assistant/volume/system", "1.0");
-}
-
 }  // namespace assistant
 }  // namespace chromeos
diff --git a/chromeos/services/assistant/assistant_manager_service_impl.h b/chromeos/services/assistant/assistant_manager_service_impl.h
index 2085c9e..ef62a0d 100644
--- a/chromeos/services/assistant/assistant_manager_service_impl.h
+++ b/chromeos/services/assistant/assistant_manager_service_impl.h
@@ -190,10 +190,6 @@
   void OnAssistantScreenshotReceived(base::OnceClosure on_done,
                                      const std::vector<uint8_t>& jpg_image);
 
-  // Writes a file to assistant's path to force assistant volume to 100%.
-  // TODO(muyuanli): Remove once AudioOutputImpl is checked in.
-  void SetVolumeHack();
-
   State state_ = State::STOPPED;
   PlatformApiImpl platform_api_;
   bool enable_hotword_;
diff --git a/chromeos/services/assistant/service.cc b/chromeos/services/assistant/service.cc
index ad18a4e..4198bba 100644
--- a/chromeos/services/assistant/service.cc
+++ b/chromeos/services/assistant/service.cc
@@ -179,6 +179,7 @@
 }
 
 void Service::RequestAccessToken() {
+  VLOG(1) << "Start requesting access token.";
   GetIdentityManager()->GetPrimaryAccountInfo(base::BindOnce(
       &Service::GetPrimaryAccountInfoCallback, base::Unretained(this)));
 }
diff --git a/chromeos/settings/timezone_settings.cc b/chromeos/settings/timezone_settings.cc
index 228efcf..01569cf 100644
--- a/chromeos/settings/timezone_settings.cc
+++ b/chromeos/settings/timezone_settings.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "chromeos/settings/timezone_settings_helper.h"
 
diff --git a/chromeos/system/cpu_temperature_reader.cc b/chromeos/system/cpu_temperature_reader.cc
index 54e3ef87..b077a1ec 100644
--- a/chromeos/system/cpu_temperature_reader.cc
+++ b/chromeos/system/cpu_temperature_reader.cc
@@ -10,8 +10,8 @@
 #include "base/location.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 
 namespace chromeos {
 namespace system {
diff --git a/chromeos/system/statistics_provider.cc b/chromeos/system/statistics_provider.cc
index 39a5f73..fd7d77bf 100644
--- a/chromeos/system/statistics_provider.cc
+++ b/chromeos/system/statistics_provider.cc
@@ -25,8 +25,8 @@
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/components/BUILD.gn b/components/BUILD.gn
index 32b4b00b..2308b30 100644
--- a/components/BUILD.gn
+++ b/components/BUILD.gn
@@ -190,6 +190,7 @@
       "//components/autofill/ios/browser:unit_tests",
       "//components/autofill/ios/form_util:unit_tests",
       "//components/image_fetcher/ios:unit_tests",
+      "//components/password_manager/ios:unit_tests",
       "//components/signin/ios/browser:unit_tests",
       "//components/translate/ios/browser:unit_tests",
     ]
diff --git a/components/arc/arc_features_parser.cc b/components/arc/arc_features_parser.cc
index 3e2050c..56b72c5 100644
--- a/components/arc/arc_features_parser.cc
+++ b/components/arc/arc_features_parser.cc
@@ -11,7 +11,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/values.h"
 
diff --git a/components/arc/arc_session_impl.cc b/components/arc/arc_session_impl.cc
index 95f3130..3040fa7 100644
--- a/components/arc/arc_session_impl.cc
+++ b/components/arc/arc_session_impl.cc
@@ -16,8 +16,8 @@
 #include "base/posix/eintr_wrapper.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "chromeos/chromeos_switches.h"
 #include "chromeos/cryptohome/cryptohome_parameters.h"
 #include "chromeos/dbus/dbus_method_call_status.h"
diff --git a/components/arc/crash_collector/arc_crash_collector_bridge.cc b/components/arc/crash_collector/arc_crash_collector_bridge.cc
index 3d21d87..ec0e49ee 100644
--- a/components/arc/crash_collector/arc_crash_collector_bridge.cc
+++ b/components/arc/crash_collector/arc_crash_collector_bridge.cc
@@ -13,8 +13,8 @@
 #include "base/logging.h"
 #include "base/memory/singleton.h"
 #include "base/process/launch.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "components/arc/arc_bridge_service.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
 #include "mojo/public/cpp/system/platform_handle.h"
diff --git a/components/arc/intent_helper/activity_icon_loader.cc b/components/arc/intent_helper/activity_icon_loader.cc
index fa9ceac..66f9097 100644
--- a/components/arc/intent_helper/activity_icon_loader.cc
+++ b/components/arc/intent_helper/activity_icon_loader.cc
@@ -12,7 +12,7 @@
 #include "base/base64.h"
 #include "base/bind.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/arc/arc_bridge_service.h"
 #include "components/arc/arc_service_manager.h"
 #include "components/arc/arc_util.h"
diff --git a/components/arc/volume_mounter/arc_volume_mounter_bridge.cc b/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
index 65147ba..a599609d 100644
--- a/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
+++ b/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
@@ -7,7 +7,8 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/singleton.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/arc/arc_bridge_service.h"
 #include "components/arc/arc_browser_context_keyed_service_factory_base.h"
@@ -87,7 +88,7 @@
   }
 
   // Get disks informations that are needed by Android MountService.
-  const chromeos::disks::DiskMountManager::Disk* disk =
+  const chromeos::disks::Disk* disk =
       DiskMountManager::GetInstance()->FindDiskBySourcePath(
           mount_info.source_path);
   std::string fs_uuid, device_label;
diff --git a/components/assist_ranker/ranker_model_loader_impl.cc b/components/assist_ranker/ranker_model_loader_impl.cc
index 0b63db56..225fde8 100644
--- a/components/assist_ranker/ranker_model_loader_impl.cc
+++ b/components/assist_ranker/ranker_model_loader_impl.cc
@@ -17,7 +17,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
diff --git a/components/assist_ranker/ranker_model_loader_impl_unittest.cc b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
index 27608136..eef70df 100644
--- a/components/assist_ranker/ranker_model_loader_impl_unittest.cc
+++ b/components/assist_ranker/ranker_model_loader_impl_unittest.cc
@@ -13,7 +13,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 81657711..0d3e6a5a 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -176,6 +176,8 @@
     "webdata/autofill_profile_sync_difference_tracker.h",
     "webdata/autofill_profile_syncable_service.cc",
     "webdata/autofill_profile_syncable_service.h",
+    "webdata/autofill_sync_bridge_util.cc",
+    "webdata/autofill_sync_bridge_util.h",
     "webdata/autofill_table.cc",
     "webdata/autofill_table.h",
     "webdata/autofill_table_encryptor.h",
@@ -333,6 +335,8 @@
     "test_region_data_loader.h",
     "test_sync_service.cc",
     "test_sync_service.h",
+    "webdata/autofill_sync_bridge_test_util.cc",
+    "webdata/autofill_sync_bridge_test_util.h",
   ]
 
   public_deps = [
diff --git a/components/autofill/core/browser/address_normalizer_impl.cc b/components/autofill/core/browser/address_normalizer_impl.cc
index 29db6030..ca78af9 100644
--- a/components/autofill/core/browser/address_normalizer_impl.cc
+++ b/components/autofill/core/browser/address_normalizer_impl.cc
@@ -14,7 +14,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/address_i18n.h"
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index d49be23..9a8ab90 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -123,8 +123,9 @@
   // context if possible, SECURITY_LEVEL_COUNT otherwise.
   virtual security_state::SecurityLevel GetSecurityLevelForUmaHistograms() = 0;
 
-  // Causes the Autofill settings UI to be shown.
-  virtual void ShowAutofillSettings() = 0;
+  // Causes the Autofill settings UI to be shown. If |show_credit_card_settings|
+  // is true, will show the credit card specific subpage.
+  virtual void ShowAutofillSettings(bool show_credit_card_settings) = 0;
 
   // Runs |callback| if the |profile| should be imported as personal data.
   virtual void ConfirmSaveAutofillProfile(const AutofillProfile& profile,
diff --git a/components/autofill/core/browser/autofill_download_manager_unittest.cc b/components/autofill/core/browser/autofill_download_manager_unittest.cc
index e38b4c7..6f2d07c6 100644
--- a/components/autofill/core/browser/autofill_download_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_download_manager_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_command_line.h"
 #include "base/test/scoped_feature_list.h"
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index aca02c8f..7da9899a 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -223,7 +223,7 @@
                                                    int position) {
   if (identifier == POPUP_ITEM_ID_AUTOFILL_OPTIONS) {
     // User selected 'Autofill Options'.
-    manager_->ShowAutofillSettings();
+    manager_->ShowAutofillSettings(popup_type_ == PopupType::kCreditCards);
   } else if (identifier == POPUP_ITEM_ID_CLEAR_FORM) {
     // User selected 'Clear form'.
     driver_->RendererShouldClearFilledSection();
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 16e620f..7dbc87d 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -32,7 +32,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autocomplete_history_manager.h"
@@ -192,8 +192,8 @@
   autocomplete_history_manager_->SetExternalDelegate(delegate);
 }
 
-void AutofillManager::ShowAutofillSettings() {
-  client_->ShowAutofillSettings();
+void AutofillManager::ShowAutofillSettings(bool show_credit_card_settings) {
+  client_->ShowAutofillSettings(show_credit_card_settings);
 }
 
 bool AutofillManager::ShouldShowScanCreditCard(const FormData& form,
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
index be28f66..df0ce5f2 100644
--- a/components/autofill/core/browser/autofill_manager.h
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -79,7 +79,7 @@
   // Sets an external delegate.
   void SetExternalDelegate(AutofillExternalDelegate* delegate);
 
-  void ShowAutofillSettings();
+  void ShowAutofillSettings(bool show_credit_card_settings);
 
   // Whether the |field| should show an entry to scan a credit card.
   virtual bool ShouldShowScanCreditCard(const FormData& form,
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
index 19a108d..ba53d73 100644
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -60,8 +60,7 @@
   return security_level_;
 }
 
-void TestAutofillClient::ShowAutofillSettings() {
-}
+void TestAutofillClient::ShowAutofillSettings(bool show_credit_card_settings) {}
 
 void TestAutofillClient::ShowUnmaskPrompt(
     const CreditCard& card,
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index cff3e37..85ed7e5 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -37,7 +37,7 @@
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  void ShowAutofillSettings() override;
+  void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         UnmaskCardReason reason,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.cc b/components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.cc
new file mode 100644
index 0000000..4b7b7d7
--- /dev/null
+++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.cc
@@ -0,0 +1,19 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.h"
+
+namespace autofill {
+
+AutofillProfile CreateServerProfile(const std::string& server_id) {
+  // TODO(sebsg): Set data.
+  return AutofillProfile(AutofillProfile::SERVER_PROFILE, server_id);
+}
+
+CreditCard CreateServerCreditCard(const std::string& server_id) {
+  // TODO(sebsg): Set data.
+  return CreditCard(CreditCard::MASKED_SERVER_CARD, server_id);
+}
+
+}  // namespace autofill
\ No newline at end of file
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.h b/components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.h
new file mode 100644
index 0000000..7eb8bf4
--- /dev/null
+++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.h
@@ -0,0 +1,21 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_SYNC_BRIDGE_TEST_UTIL_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_SYNC_BRIDGE_TEST_UTIL_H_
+
+#include <string>
+
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "components/autofill/core/browser/credit_card.h"
+
+namespace autofill {
+
+AutofillProfile CreateServerProfile(const std::string& server_id);
+
+CreditCard CreateServerCreditCard(const std::string& server_id);
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_SYNC_BRIDGE_TEST_UTIL_H_
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc b/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc
new file mode 100644
index 0000000..fc0a4205
--- /dev/null
+++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc
@@ -0,0 +1,212 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_util.h"
+
+#include "base/base64.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/webdata/autofill_table.h"
+#include "components/sync/model/entity_data.h"
+
+using sync_pb::AutofillWalletSpecifics;
+using syncer::EntityData;
+
+namespace autofill {
+namespace {
+std::string TruncateUTF8(const std::string& data) {
+  std::string trimmed_value;
+  base::TruncateUTF8ToByteSize(data, AutofillTable::kMaxDataLength,
+                               &trimmed_value);
+  return trimmed_value;
+}
+
+sync_pb::WalletMaskedCreditCard::WalletCardStatus LocalToServerStatus(
+    const CreditCard& card) {
+  switch (card.GetServerStatus()) {
+    case CreditCard::OK:
+      return sync_pb::WalletMaskedCreditCard::VALID;
+    case CreditCard::EXPIRED:
+    default:
+      return sync_pb::WalletMaskedCreditCard::EXPIRED;
+  }
+}
+
+sync_pb::WalletMaskedCreditCard::WalletCardType WalletCardTypeFromCardNetwork(
+    const std::string& network) {
+  if (network == kAmericanExpressCard)
+    return sync_pb::WalletMaskedCreditCard::AMEX;
+  if (network == kDiscoverCard)
+    return sync_pb::WalletMaskedCreditCard::DISCOVER;
+  if (network == kJCBCard)
+    return sync_pb::WalletMaskedCreditCard::JCB;
+  if (network == kMasterCard)
+    return sync_pb::WalletMaskedCreditCard::MASTER_CARD;
+  if (network == kUnionPay)
+    return sync_pb::WalletMaskedCreditCard::UNIONPAY;
+  if (network == kVisaCard)
+    return sync_pb::WalletMaskedCreditCard::VISA;
+
+  // Some cards aren't supported by the client, so just return unknown.
+  return sync_pb::WalletMaskedCreditCard::UNKNOWN;
+}
+
+sync_pb::WalletMaskedCreditCard::WalletCardClass WalletCardClassFromCardType(
+    CreditCard::CardType card_type) {
+  switch (card_type) {
+    case CreditCard::CARD_TYPE_CREDIT:
+      return sync_pb::WalletMaskedCreditCard::CREDIT;
+    case CreditCard::CARD_TYPE_DEBIT:
+      return sync_pb::WalletMaskedCreditCard::DEBIT;
+    case CreditCard::CARD_TYPE_PREPAID:
+      return sync_pb::WalletMaskedCreditCard::PREPAID;
+    default:
+      return sync_pb::WalletMaskedCreditCard::UNKNOWN_CARD_CLASS;
+  }
+}
+
+}  // namespace
+
+std::string GetSpecificsIdForEntryServerId(const std::string& server_id) {
+  std::string specifics_id;
+  base::Base64Encode(server_id, &specifics_id);
+  return specifics_id;
+}
+
+std::string GetStorageKeyForSpecificsId(const std::string& specifics_id) {
+  // We use the base64 encoded |specifics_id| directly as the storage key, this
+  // function only hides this definition from all its call sites.
+  return specifics_id;
+}
+
+std::string GetStorageKeyForEntryServerId(const std::string& server_id) {
+  return GetStorageKeyForSpecificsId(GetSpecificsIdForEntryServerId(server_id));
+}
+
+std::string GetClientTagForSpecificsId(
+    AutofillWalletSpecifics::WalletInfoType type,
+    const std::string& wallet_data_specifics_id) {
+  switch (type) {
+    case AutofillWalletSpecifics::POSTAL_ADDRESS:
+      return "address-" + wallet_data_specifics_id;
+    case AutofillWalletSpecifics::MASKED_CREDIT_CARD:
+      return "card-" + wallet_data_specifics_id;
+    case sync_pb::AutofillWalletSpecifics::CUSTOMER_DATA:
+      return "customer-" + wallet_data_specifics_id;
+    case AutofillWalletSpecifics::UNKNOWN:
+      NOTREACHED();
+      return "";
+  }
+}
+
+void SetAutofillWalletSpecificsFromServerProfile(
+    const AutofillProfile& address,
+    AutofillWalletSpecifics* wallet_specifics) {
+  wallet_specifics->set_type(AutofillWalletSpecifics::POSTAL_ADDRESS);
+
+  sync_pb::WalletPostalAddress* wallet_address =
+      wallet_specifics->mutable_address();
+
+  wallet_address->set_id(address.server_id());
+  wallet_address->set_language_code(TruncateUTF8(address.language_code()));
+
+  if (address.HasRawInfo(NAME_FULL)) {
+    wallet_address->set_recipient_name(
+        TruncateUTF8(base::UTF16ToUTF8(address.GetRawInfo(NAME_FULL))));
+  }
+  if (address.HasRawInfo(COMPANY_NAME)) {
+    wallet_address->set_company_name(
+        TruncateUTF8(base::UTF16ToUTF8(address.GetRawInfo(COMPANY_NAME))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_STREET_ADDRESS)) {
+    wallet_address->add_street_address(TruncateUTF8(
+        base::UTF16ToUTF8(address.GetRawInfo(ADDRESS_HOME_STREET_ADDRESS))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_STATE)) {
+    wallet_address->set_address_1(TruncateUTF8(
+        base::UTF16ToUTF8(address.GetRawInfo(ADDRESS_HOME_STATE))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_CITY)) {
+    wallet_address->set_address_2(
+        TruncateUTF8(base::UTF16ToUTF8(address.GetRawInfo(ADDRESS_HOME_CITY))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY)) {
+    wallet_address->set_address_3(TruncateUTF8(base::UTF16ToUTF8(
+        address.GetRawInfo(ADDRESS_HOME_DEPENDENT_LOCALITY))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_ZIP)) {
+    wallet_address->set_postal_code(
+        TruncateUTF8(base::UTF16ToUTF8(address.GetRawInfo(ADDRESS_HOME_ZIP))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_COUNTRY)) {
+    wallet_address->set_country_code(TruncateUTF8(
+        base::UTF16ToUTF8(address.GetRawInfo(ADDRESS_HOME_COUNTRY))));
+  }
+  if (address.HasRawInfo(PHONE_HOME_WHOLE_NUMBER)) {
+    wallet_address->set_phone_number(TruncateUTF8(
+        base::UTF16ToUTF8(address.GetRawInfo(PHONE_HOME_WHOLE_NUMBER))));
+  }
+  if (address.HasRawInfo(ADDRESS_HOME_SORTING_CODE)) {
+    wallet_address->set_sorting_code(TruncateUTF8(
+        base::UTF16ToUTF8(address.GetRawInfo(ADDRESS_HOME_SORTING_CODE))));
+  }
+}
+
+std::unique_ptr<EntityData> CreateEntityDataFromAutofillServerProfile(
+    const AutofillProfile& address) {
+  auto entity_data = std::make_unique<EntityData>();
+
+  std::string specifics_id =
+      GetSpecificsIdForEntryServerId(address.server_id());
+  entity_data->non_unique_name = GetClientTagForSpecificsId(
+      AutofillWalletSpecifics::POSTAL_ADDRESS, specifics_id);
+
+  AutofillWalletSpecifics* wallet_specifics =
+      entity_data->specifics.mutable_autofill_wallet();
+
+  SetAutofillWalletSpecificsFromServerProfile(address, wallet_specifics);
+
+  return entity_data;
+}
+
+void SetAutofillWalletSpecificsFromServerCard(
+    const CreditCard& card,
+    AutofillWalletSpecifics* wallet_specifics) {
+  wallet_specifics->set_type(AutofillWalletSpecifics::MASKED_CREDIT_CARD);
+
+  sync_pb::WalletMaskedCreditCard* wallet_card =
+      wallet_specifics->mutable_masked_card();
+  wallet_card->set_id(card.server_id());
+  wallet_card->set_status(LocalToServerStatus(card));
+  if (card.HasRawInfo(CREDIT_CARD_NAME_FULL)) {
+    wallet_card->set_name_on_card(TruncateUTF8(
+        base::UTF16ToUTF8(card.GetRawInfo(CREDIT_CARD_NAME_FULL))));
+  }
+  wallet_card->set_type(WalletCardTypeFromCardNetwork(card.network()));
+  wallet_card->set_last_four(base::UTF16ToUTF8(card.LastFourDigits()));
+  wallet_card->set_exp_month(card.expiration_month());
+  wallet_card->set_exp_year(card.expiration_year());
+  wallet_card->set_billing_address_id(card.billing_address_id());
+  wallet_card->set_card_class(WalletCardClassFromCardType(card.card_type()));
+  wallet_card->set_bank_name(card.bank_name());
+}
+
+std::unique_ptr<EntityData> CreateEntityDataFromCard(const CreditCard& card) {
+  std::string specifics_id = GetSpecificsIdForEntryServerId(card.server_id());
+
+  auto entity_data = std::make_unique<EntityData>();
+  entity_data->non_unique_name = GetClientTagForSpecificsId(
+      AutofillWalletSpecifics::MASKED_CREDIT_CARD, specifics_id);
+
+  AutofillWalletSpecifics* wallet_specifics =
+      entity_data->specifics.mutable_autofill_wallet();
+
+  SetAutofillWalletSpecificsFromServerCard(card, wallet_specifics);
+
+  return entity_data;
+}
+
+}  // namespace autofill
\ No newline at end of file
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_util.h b/components/autofill/core/browser/webdata/autofill_sync_bridge_util.h
new file mode 100644
index 0000000..bd5e40c
--- /dev/null
+++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_util.h
@@ -0,0 +1,54 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_SYNC_BRIDGE_UTIL_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_SYNC_BRIDGE_UTIL_H_
+
+#include <memory>
+#include <string>
+
+#include "components/sync/model/entity_data.h"
+
+namespace autofill {
+
+class AutofillProfile;
+class CreditCard;
+
+// Returns the wallet specifics id for the specified |server_id|.
+std::string GetSpecificsIdForEntryServerId(const std::string& server_id);
+
+// Returns the storage key for the specified |server_id|.
+std::string GetStorageKeyForSpecificsId(const std::string& specifics_id);
+
+// Returns the wallet specifics storage key for the specified |server_id|.
+std::string GetStorageKeyForEntryServerId(const std::string& server_id);
+
+// Returns the client tag for the specified wallet |type| and
+// |wallet_data_specifics_id|.
+std::string GetClientTagForSpecificsId(
+    sync_pb::AutofillWalletSpecifics::WalletInfoType type,
+    const std::string& wallet_data_specifics_id);
+
+// Sets the fields of the |wallet_specifics| based on the the specified
+// |address|.
+void SetAutofillWalletSpecificsFromServerProfile(
+    const AutofillProfile& address,
+    sync_pb::AutofillWalletSpecifics* wallet_specifics);
+
+// Creates a EntityData object corresponding to the specified |address|.
+std::unique_ptr<syncer::EntityData> CreateEntityDataFromAutofillServerProfile(
+    const AutofillProfile& address);
+
+// Sets the fields of the |wallet_specifics| based on the the specified |card|.
+void SetAutofillWalletSpecificsFromServerCard(
+    const CreditCard& card,
+    sync_pb::AutofillWalletSpecifics* wallet_specifics);
+
+// Creates a EntityData object corresponding to the specified |card|.
+std::unique_ptr<syncer::EntityData> CreateEntityDataFromCard(
+    const CreditCard& card);
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_SYNC_BRIDGE_UTIL_H_
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc
index ec409e2..ce6c6172 100644
--- a/components/autofill/core/browser/webdata/autofill_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -2393,7 +2393,8 @@
 bool AutofillTable::SupportsMetadataForModelType(
     syncer::ModelType model_type) const {
   return (model_type == syncer::AUTOFILL ||
-          model_type == syncer::AUTOFILL_PROFILE);
+          model_type == syncer::AUTOFILL_PROFILE ||
+          model_type == syncer::AUTOFILL_WALLET_METADATA);
 }
 
 int AutofillTable::GetKeyValueForModelType(syncer::ModelType model_type) const {
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc
index 0f99cea4..7f2c2761 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.cc
@@ -12,12 +12,14 @@
 #include "base/optional.h"
 #include "components/autofill/core/browser/autofill_profile.h"
 #include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_util.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
 #include "components/sync/model/entity_data.h"
 #include "components/sync/model/mutable_data_batch.h"
 #include "components/sync/model_impl/client_tag_based_model_type_processor.h"
+#include "components/sync/model_impl/sync_metadata_store_change_list.h"
 
 namespace autofill {
 
@@ -25,6 +27,7 @@
 
 using sync_pb::WalletMetadataSpecifics;
 using syncer::EntityData;
+using syncer::MetadataChangeList;
 
 // Address to this variable used as the user data key.
 static int kAutofillWalletMetadataSyncBridgeUserDataKey = 0;
@@ -42,22 +45,6 @@
   }
 }
 
-std::string GetSpecificsIdForEntryServerId(const std::string& server_id) {
-  std::string specifics_id;
-  base::Base64Encode(server_id, &specifics_id);
-  return specifics_id;
-}
-
-std::string GetStorageKeyForSpecificsId(const std::string& specifics_id) {
-  // We use the base64 encoded |specifics_id| directly as the storage key, this
-  // function only hides this definition from all its call sites.
-  return specifics_id;
-}
-
-std::string GetStorageKeyForEntryServerId(const std::string& server_id) {
-  return GetStorageKeyForSpecificsId(GetSpecificsIdForEntryServerId(server_id));
-}
-
 // Returns EntityData with common fields set based on |local_data_model|.
 std::unique_ptr<EntityData> CreateEntityDataFromAutofillDataModel(
     const AutofillDataModel& local_data_model,
@@ -77,7 +64,7 @@
 }
 
 // Returns EntityData for wallet_metadata for |local_profile|.
-std::unique_ptr<EntityData> CreateWalletMetadataEntityDataFromAutofillProfile(
+std::unique_ptr<EntityData> CreateMetadataEntityDataFromAutofillServerProfile(
     const AutofillProfile& local_profile) {
   std::unique_ptr<EntityData> entity_data =
       CreateEntityDataFromAutofillDataModel(
@@ -91,7 +78,7 @@
 }
 
 // Returns EntityData for wallet_metadata for |local_card|.
-std::unique_ptr<EntityData> CreateEntityDataFromCreditCard(
+std::unique_ptr<EntityData> CreateMetadataEntityDataFromCard(
     const CreditCard& local_card) {
   std::unique_ptr<EntityData> entity_data =
       CreateEntityDataFromAutofillDataModel(
@@ -118,7 +105,7 @@
       &kAutofillWalletMetadataSyncBridgeUserDataKey,
       std::make_unique<AutofillWalletMetadataSyncBridge>(
           std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
-              syncer::AUTOFILL_WALLET_DATA,
+              syncer::AUTOFILL_WALLET_METADATA,
               /*dump_stack=*/base::RepeatingClosure()),
           web_data_backend));
 }
@@ -136,14 +123,22 @@
     std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor,
     AutofillWebDataBackend* web_data_backend)
     : ModelTypeSyncBridge(std::move(change_processor)),
-      web_data_backend_(web_data_backend) {}
+      web_data_backend_(web_data_backend),
+      scoped_observer_(this) {
+  DCHECK(web_data_backend_);
+
+  scoped_observer_.Add(web_data_backend_);
+
+  LoadDataCacheAndMetadata();
+}
 
 AutofillWalletMetadataSyncBridge::~AutofillWalletMetadataSyncBridge() {}
 
 std::unique_ptr<syncer::MetadataChangeList>
 AutofillWalletMetadataSyncBridge::CreateMetadataChangeList() {
-  NOTIMPLEMENTED();
-  return nullptr;
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return std::make_unique<syncer::SyncMetadataStoreChangeList>(
+      GetAutofillTable(), syncer::AUTOFILL_WALLET_METADATA);
 }
 
 base::Optional<syncer::ModelError>
@@ -190,10 +185,111 @@
       entity_data.specifics.wallet_metadata().id());
 }
 
+void AutofillWalletMetadataSyncBridge::AutofillProfileChanged(
+    const AutofillProfileChange& change) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  const AutofillProfile* changed = change.data_model();
+  if (!changed || changed->record_type() != AutofillProfile::SERVER_PROFILE) {
+    return;
+  }
+
+  // The only legal change on a server profile is that its use count or use date
+  // or has-converted status gets updated. Other changes (adding, deleting) are
+  // only done by the AutofillWalletSyncBridge and result only in the
+  // AutofillMultipleChanged() notification.
+  DCHECK(change.type() == AutofillProfileChange::UPDATE);
+  SyncUpUpdatedEntity(
+      CreateMetadataEntityDataFromAutofillServerProfile(*changed));
+}
+
+void AutofillWalletMetadataSyncBridge::CreditCardChanged(
+    const CreditCardChange& change) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  const CreditCard* changed = change.data_model();
+  if (!changed || changed->record_type() == CreditCard::LOCAL_CARD) {
+    return;
+  }
+
+  // The only legal change on a server card is that its use count or use date or
+  // billing address id gets updated. Other changes (adding, deleting) are only
+  // done by the AutofillWalletSyncBridge and result only in the
+  // AutofillMultipleChanged() notification.
+  DCHECK(change.type() == CreditCardChange::UPDATE);
+  SyncUpUpdatedEntity(CreateMetadataEntityDataFromCard(*changed));
+}
+
+void AutofillWalletMetadataSyncBridge::AutofillMultipleChanged() {
+  NOTIMPLEMENTED();
+}
+
+void AutofillWalletMetadataSyncBridge::SyncUpUpdatedEntity(
+    std::unique_ptr<EntityData> entity_after_change) {
+  std::string storage_key = GetStorageKey(*entity_after_change);
+  auto it = cache_.find(storage_key);
+
+  // This *changed* entity should already be in the cache, ignore otherwise.
+  if (it == cache_.end())
+    return;
+
+  const WalletMetadataSpecifics& specifics_before = it->second;
+  const WalletMetadataSpecifics& specifics_after =
+      entity_after_change->specifics.wallet_metadata();
+
+  if (specifics_before.use_count() < specifics_after.use_count() &&
+      specifics_before.use_date() < specifics_after.use_date()) {
+    std::unique_ptr<MetadataChangeList> metadata_change_list =
+        CreateMetadataChangeList();
+    cache_[storage_key] = specifics_after;
+    change_processor()->Put(storage_key, std::move(entity_after_change),
+                            metadata_change_list.get());
+  }
+}
+
 AutofillTable* AutofillWalletMetadataSyncBridge::GetAutofillTable() {
   return AutofillTable::FromWebDatabase(web_data_backend_->GetDatabase());
 }
 
+void AutofillWalletMetadataSyncBridge::LoadDataCacheAndMetadata() {
+  if (!web_data_backend_ || !web_data_backend_->GetDatabase() ||
+      !GetAutofillTable()) {
+    change_processor()->ReportError(
+        {FROM_HERE, "Failed to load AutofillWebDatabase."});
+    return;
+  }
+
+  // Load the data cache.
+  std::vector<std::unique_ptr<AutofillProfile>> profiles;
+  std::vector<std::unique_ptr<CreditCard>> cards;
+  if (!GetAutofillTable()->GetServerProfiles(&profiles) ||
+      !GetAutofillTable()->GetServerCreditCards(&cards)) {
+    change_processor()->ReportError(
+        {FROM_HERE, "Failed reading autofill data from WebDatabase."});
+    return;
+  }
+  for (const std::unique_ptr<AutofillProfile>& entry : profiles) {
+    cache_[GetStorageKeyForEntryServerId(entry->server_id())] =
+        CreateMetadataEntityDataFromAutofillServerProfile(*entry)
+            ->specifics.wallet_metadata();
+  }
+  for (const std::unique_ptr<CreditCard>& entry : cards) {
+    cache_[GetStorageKeyForEntryServerId(entry->server_id())] =
+        CreateMetadataEntityDataFromCard(*entry)->specifics.wallet_metadata();
+  }
+
+  // Load the metadata and send to the processor.
+  auto batch = std::make_unique<syncer::MetadataBatch>();
+  if (!GetAutofillTable()->GetAllSyncMetadata(syncer::AUTOFILL_WALLET_METADATA,
+                                              batch.get())) {
+    change_processor()->ReportError(
+        {FROM_HERE, "Failed reading autofill metadata from WebDatabase."});
+    return;
+  }
+
+  change_processor()->ModelReadyToSync(std::move(batch));
+}
+
 void AutofillWalletMetadataSyncBridge::GetDataImpl(
     base::Optional<std::unordered_set<std::string>> storage_keys_set,
     DataCallback callback) {
@@ -214,14 +310,14 @@
     std::string key = GetStorageKeyForEntryServerId(entry->server_id());
     if (!storage_keys_set || base::ContainsKey(*storage_keys_set, key)) {
       batch->Put(key,
-                 CreateWalletMetadataEntityDataFromAutofillProfile(*entry));
+                 CreateMetadataEntityDataFromAutofillServerProfile(*entry));
     }
   }
   for (const std::unique_ptr<CreditCard>& entry : cards) {
     std::string key = GetStorageKeyForEntryServerId(entry->server_id());
     if (!storage_keys_set || base::ContainsKey(*storage_keys_set, key)) {
       batch->Put(GetStorageKeyForEntryServerId(entry->server_id()),
-                 CreateEntityDataFromCreditCard(*entry));
+                 CreateMetadataEntityDataFromCard(*entry));
     }
   }
 
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.h b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.h
index 49f2e38..00479c1 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.h
+++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge.h
@@ -7,15 +7,23 @@
 
 #include <memory>
 #include <string>
+#include <unordered_set>
 
 #include "base/macros.h"
+#include "base/scoped_observer.h"
 #include "base/sequence_checker.h"
 #include "base/supports_user_data.h"
+#include "components/autofill/core/browser/webdata/autofill_change.h"
+#include "components/autofill/core/browser/webdata/autofill_webdata_service_observer.h"
 #include "components/sync/model/metadata_change_list.h"
 #include "components/sync/model/model_error.h"
 #include "components/sync/model/model_type_change_processor.h"
 #include "components/sync/model/model_type_sync_bridge.h"
 
+namespace syncer {
+struct EntityData;
+}  // namespace syncer
+
 namespace autofill {
 
 class AutofillTable;
@@ -24,8 +32,10 @@
 
 // Sync bridge responsible for propagating local changes to the processor and
 // applying remote changes to the local database.
-class AutofillWalletMetadataSyncBridge : public base::SupportsUserData::Data,
-                                         public syncer::ModelTypeSyncBridge {
+class AutofillWalletMetadataSyncBridge
+    : public base::SupportsUserData::Data,
+      public syncer::ModelTypeSyncBridge,
+      public AutofillWebDataServiceObserverOnDBSequence {
  public:
   // Factory method that hides dealing with change_processor and also stores the
   // created bridge within |web_data_service|. This method should only be
@@ -57,10 +67,23 @@
   std::string GetClientTag(const syncer::EntityData& entity_data) override;
   std::string GetStorageKey(const syncer::EntityData& entity_data) override;
 
+  // AutofillWebDataServiceObserverOnDBSequence implementation.
+  void AutofillProfileChanged(const AutofillProfileChange& change) override;
+  void CreditCardChanged(const CreditCardChange& change) override;
+  void AutofillMultipleChanged() override;
+
  private:
+  // Syncs up an updated entity |entity_after_change| (if needed).
+  void SyncUpUpdatedEntity(
+      std::unique_ptr<syncer::EntityData> entity_after_change);
+
   // Returns the table associated with the |web_data_backend_|.
   AutofillTable* GetAutofillTable();
 
+  // Synchronously load |cache_| and sync metadata from the autofill table
+  // and pass the latter to the processor so that it can start tracking changes.
+  void LoadDataCacheAndMetadata();
+
   // Reads local wallet metadata from the database and passes them into
   // |callback|. If |storage_keys_set| is not set, it returns all data entries.
   // Otherwise, it returns only entries with storage key in |storage_keys_set|.
@@ -72,6 +95,14 @@
   // SupportsUserData, so it's guaranteed to outlive |this|.
   AutofillWebDataBackend* const web_data_backend_;
 
+  ScopedObserver<AutofillWebDataBackend, AutofillWalletMetadataSyncBridge>
+      scoped_observer_;
+
+  // Cache of the data (local data + data that hasn't synced down yet); keyed by
+  // storage keys. Needed for figuring out what to sync up when larger changes
+  // happen in the local database.
+  std::unordered_map<std::string, sync_pb::WalletMetadataSpecifics> cache_;
+
   // The bridge should be used on the same sequence where it is constructed.
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
index a7b9c81..435e795 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_sync_bridge_unittest.cc
@@ -22,6 +22,7 @@
 #include "components/autofill/core/browser/country_names.h"
 #include "components/autofill/core/browser/credit_card.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
 #include "components/autofill/core/common/autofill_constants.h"
@@ -45,6 +46,7 @@
 using syncer::KeyAndData;
 using syncer::MockModelTypeChangeProcessor;
 using syncer::ModelType;
+using testing::_;
 using testing::ElementsAre;
 using testing::IsEmpty;
 using testing::UnorderedElementsAre;
@@ -89,38 +91,77 @@
   WebDatabase* db_;
 };
 
-WalletMetadataSpecifics CreateWalletMetadataSpecificsForAddress(
-    const std::string& specifics_id) {
+base::Time UseDateFromProtoValue(int64_t use_date_proto_value) {
+  return base::Time::FromDeltaSinceWindowsEpoch(
+      base::TimeDelta::FromMicroseconds(use_date_proto_value));
+}
+
+int64_t UseDateToProtoValue(base::Time use_date) {
+  return use_date.ToDeltaSinceWindowsEpoch().InMicroseconds();
+}
+
+WalletMetadataSpecifics CreateWalletMetadataSpecificsForAddressWithUseStats(
+    const std::string& specifics_id,
+    size_t use_count,
+    int64_t use_date) {
   WalletMetadataSpecifics specifics;
   specifics.set_id(specifics_id);
   specifics.set_type(WalletMetadataSpecifics::ADDRESS);
+  specifics.set_use_count(use_count);
+  specifics.set_use_date(use_date);
+  // Set the default value according to the constructor of AutofillProfile.
+  specifics.set_address_has_converted(false);
+  return specifics;
+}
+
+WalletMetadataSpecifics CreateWalletMetadataSpecificsForAddress(
+    const std::string& specifics_id) {
   // Set default values according to the constructor of AutofillProfile (the
   // clock value is overrided by TestAutofillClock in the test fixture).
-  specifics.set_use_count(1);
-  specifics.set_use_date(kJune2017.ToDeltaSinceWindowsEpoch().InMicroseconds());
-  specifics.set_address_has_converted(false);
+  return CreateWalletMetadataSpecificsForAddressWithUseStats(
+      specifics_id, /*use_count=*/1,
+      /*use_date=*/UseDateToProtoValue(kJune2017));
+}
+
+WalletMetadataSpecifics CreateWalletMetadataSpecificsForCardWithUseStats(
+    const std::string& specifics_id,
+    size_t use_count,
+    int64_t use_date) {
+  WalletMetadataSpecifics specifics;
+  specifics.set_id(specifics_id);
+  specifics.set_type(WalletMetadataSpecifics::CARD);
+  specifics.set_use_count(use_count);
+  specifics.set_use_date(use_date);
+  // Set the default value according to the constructor of AutofillProfile.
+  specifics.set_card_billing_address_id("");
   return specifics;
 }
 
 WalletMetadataSpecifics CreateWalletMetadataSpecificsForCard(
     const std::string& specifics_id) {
-  WalletMetadataSpecifics specifics;
-  specifics.set_id(specifics_id);
-  specifics.set_type(WalletMetadataSpecifics::CARD);
-  // Make it consistent with the constructor of CreditCard (the clock value is
-  // overrided by TestAutofillClock in the test fixture).
-  specifics.set_use_count(1);
-  specifics.set_use_date(kJune2017.ToDeltaSinceWindowsEpoch().InMicroseconds());
-  specifics.set_card_billing_address_id("");
-  return specifics;
+  // Set default values according to the constructor of AutofillProfile (the
+  // clock value is overrided by TestAutofillClock in the test fixture).
+  return CreateWalletMetadataSpecificsForCardWithUseStats(
+      specifics_id, /*use_count=*/1,
+      /*use_date=*/UseDateToProtoValue(kJune2017));
 }
 
-AutofillProfile CreateServerProfile(const std::string& server_id) {
-  return AutofillProfile(AutofillProfile::SERVER_PROFILE, server_id);
+AutofillProfile CreateServerProfileWithUseStats(const std::string& server_id,
+                                                size_t use_count,
+                                                int64_t use_date) {
+  AutofillProfile profile = CreateServerProfile(server_id);
+  profile.set_use_count(use_count);
+  profile.set_use_date(UseDateFromProtoValue(use_date));
+  return profile;
 }
 
-CreditCard CreateCreditCard(const std::string& server_id) {
-  return CreditCard(CreditCard::MASKED_SERVER_CARD, server_id);
+CreditCard CreateServerCreditCardWithUseStats(const std::string& server_id,
+                                              size_t use_count,
+                                              int64_t use_date) {
+  CreditCard card = CreateServerCreditCard(server_id);
+  card.set_use_count(use_count);
+  card.set_use_date(UseDateFromProtoValue(use_date));
+  return card;
 }
 
 void ExtractWalletMetadataSpecificsFromDataBatch(
@@ -137,9 +178,8 @@
   std::ostringstream output;
   output << "[id: " << specifics.id()
          << ", type: " << static_cast<int>(specifics.type())
-         << ", use_count: " << specifics.use_count() << ", use_date: "
-         << base::Time::FromDeltaSinceWindowsEpoch(
-                base::TimeDelta::FromMicroseconds(specifics.use_date()))
+         << ", use_count: " << specifics.use_count()
+         << ", use_date: " << UseDateFromProtoValue(specifics.use_date())
          << ", card_billing_address_id: "
          << (specifics.has_card_billing_address_id()
                  ? specifics.card_billing_address_id()
@@ -163,6 +203,20 @@
   return true;
 }
 
+MATCHER_P(HasSpecifics, expected, "") {
+  const WalletMetadataSpecifics& arg_specifics =
+      arg->specifics.wallet_metadata();
+
+  if (arg_specifics.SerializeAsString() != expected.SerializeAsString()) {
+    *result_listener << "entry\n"
+                     << WalletMetadataSpecificsAsDebugString(arg_specifics)
+                     << "\ndid not match expected\n"
+                     << WalletMetadataSpecificsAsDebugString(expected);
+    return false;
+  }
+  return true;
+}
+
 }  // namespace
 
 class AutofillWalletMetadataSyncBridgeTest : public testing::Test {
@@ -179,7 +233,6 @@
     db_.Init(temp_dir_.GetPath().AppendASCII("SyncTestWebDatabase"));
     backend_.SetWebDatabase(&db_);
     ResetProcessor();
-    ResetBridge();
   }
 
   void ResetProcessor() {
@@ -258,6 +311,7 @@
 
 // The following 2 tests make sure client tags stay stable.
 TEST_F(AutofillWalletMetadataSyncBridgeTest, GetClientTagForAddress) {
+  ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForAddress(kAddr1SpecificsId);
   EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
@@ -265,6 +319,7 @@
 }
 
 TEST_F(AutofillWalletMetadataSyncBridgeTest, GetClientTagForCard) {
+  ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForCard(kCard1SpecificsId);
   EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
@@ -273,6 +328,7 @@
 
 // The following 2 tests make sure storage keys stay stable.
 TEST_F(AutofillWalletMetadataSyncBridgeTest, GetStorageKeyForAddress) {
+  ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForAddress(kAddr1SpecificsId);
   EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics)),
@@ -280,6 +336,7 @@
 }
 
 TEST_F(AutofillWalletMetadataSyncBridgeTest, GetStorageKeyForCard) {
+  ResetBridge();
   WalletMetadataSpecifics specifics =
       CreateWalletMetadataSpecificsForCard(kCard1SpecificsId);
   EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics)),
@@ -290,8 +347,9 @@
        GetAllDataForDebugging_ShouldReturnAllData) {
   table()->SetServerProfiles({CreateServerProfile(kAddr1ServerId),
                               CreateServerProfile(kAddr2ServerId)});
-  table()->SetServerCreditCards(
-      {CreateCreditCard(kCard1ServerId), CreateCreditCard(kCard2ServerId)});
+  table()->SetServerCreditCards({CreateServerCreditCard(kCard1ServerId),
+                                 CreateServerCreditCard(kCard2ServerId)});
+  ResetBridge();
 
   EXPECT_THAT(
       GetAllLocalData(),
@@ -308,14 +366,16 @@
 
 TEST_F(AutofillWalletMetadataSyncBridgeTest,
        GetData_ShouldNotReturnNonexistentData) {
+  ResetBridge();
   EXPECT_THAT(GetLocalData({kAddr1SpecificsId}), IsEmpty());
 }
 
 TEST_F(AutofillWalletMetadataSyncBridgeTest, GetData_ShouldReturnSelectedData) {
   table()->SetServerProfiles({CreateServerProfile(kAddr1ServerId),
                               CreateServerProfile(kAddr2ServerId)});
-  table()->SetServerCreditCards(
-      {CreateCreditCard(kCard1ServerId), CreateCreditCard(kCard2ServerId)});
+  table()->SetServerCreditCards({CreateServerCreditCard(kCard1ServerId),
+                                 CreateServerCreditCard(kCard2ServerId)});
+  ResetBridge();
 
   EXPECT_THAT(GetLocalData({kAddr1SpecificsId, kCard1SpecificsId}),
               UnorderedElementsAre(
@@ -328,17 +388,16 @@
 TEST_F(AutofillWalletMetadataSyncBridgeTest, GetData_ShouldReturnCompleteData) {
   AutofillProfile profile = CreateServerProfile(kAddr1ServerId);
   profile.set_use_count(5);
-  profile.set_use_date(base::Time::FromDeltaSinceWindowsEpoch(
-      base::TimeDelta::FromMicroseconds(2)));
+  profile.set_use_date(UseDateFromProtoValue(2));
   profile.set_has_converted(true);
   table()->SetServerProfiles({profile});
 
-  CreditCard card = CreateCreditCard(kCard1ServerId);
+  CreditCard card = CreateServerCreditCard(kCard1ServerId);
   card.set_use_count(6);
-  card.set_use_date(base::Time::FromDeltaSinceWindowsEpoch(
-      base::TimeDelta::FromMicroseconds(3)));
+  card.set_use_date(UseDateFromProtoValue(3));
   card.set_billing_address_id(kAddr1ServerId);
   table()->SetServerCreditCards({card});
+  ResetBridge();
 
   // Expect to retrieve following specifics:
   WalletMetadataSpecifics profile_specifics =
@@ -358,4 +417,84 @@
                                    EqualsSpecifics(card_specifics)));
 }
 
+// Verify that lower values of metadata are not sent to the sync server when
+// local metadata is updated.
+TEST_F(AutofillWalletMetadataSyncBridgeTest,
+       DontSendLowerValueToServerOnSingleChange) {
+  table()->SetServerProfiles({CreateServerProfileWithUseStats(
+      kAddr1ServerId, /*use_count=*/2, /*use_date=*/5)});
+  table()->SetServerCreditCards({CreateServerCreditCardWithUseStats(
+      kCard1ServerId, /*use_count=*/3, /*use_date=*/6)});
+  ResetBridge();
+
+  AutofillProfile updated_profile = CreateServerProfileWithUseStats(
+      kAddr1ServerId, /*use_count=*/1, /*use_date=*/4);
+  CreditCard updated_card = CreateServerCreditCardWithUseStats(
+      kCard1ServerId, /*use_count=*/2, /*use_date=*/5);
+
+  EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0);
+
+  bridge()->AutofillProfileChanged(AutofillProfileChange(
+      AutofillProfileChange::UPDATE, updated_profile.guid(), &updated_profile));
+  bridge()->CreditCardChanged(CreditCardChange(
+      CreditCardChange::UPDATE, updated_card.guid(), &updated_card));
+}
+
+// Verify that one-off addition of metadata is not sent to the sync
+// server. Metadata add and delete trigger multiple changes notification
+// instead.
+TEST_F(AutofillWalletMetadataSyncBridgeTest, DontAddToServerOnSingleChange) {
+  table()->SetServerProfiles({CreateServerProfileWithUseStats(
+      kAddr1ServerId, /*use_count=*/1, /*use_date=*/2)});
+  table()->SetServerCreditCards({CreateServerCreditCardWithUseStats(
+      kCard1ServerId, /*use_count=*/3, /*use_date=*/4)});
+  ResetBridge();
+
+  AutofillProfile new_profile = CreateServerProfileWithUseStats(
+      kAddr2ServerId, /*use_count=*/10, /*use_date=*/20);
+  CreditCard new_card = CreateServerCreditCardWithUseStats(
+      kCard2ServerId, /*use_count=*/30, /*use_date=*/40);
+
+  EXPECT_CALL(mock_processor(), Put(_, _, _)).Times(0);
+
+  bridge()->AutofillProfileChanged(AutofillProfileChange(
+      AutofillProfileChange::UPDATE, new_profile.guid(), &new_profile));
+  bridge()->CreditCardChanged(
+      CreditCardChange(CreditCardChange::UPDATE, new_card.guid(), &new_card));
+}
+
+// Verify that higher values of metadata are sent to the sync server when local
+// metadata is updated.
+TEST_F(AutofillWalletMetadataSyncBridgeTest,
+       SendHigherValuesToServerOnLocalSingleChange) {
+  table()->SetServerProfiles({CreateServerProfileWithUseStats(
+      kAddr1ServerId, /*use_count=*/1, /*use_date=*/2)});
+  table()->SetServerCreditCards({CreateServerCreditCardWithUseStats(
+      kCard1ServerId, /*use_count=*/3, /*use_date=*/4)});
+  ResetBridge();
+
+  AutofillProfile updated_profile = CreateServerProfileWithUseStats(
+      kAddr1ServerId, /*use_count=*/10, /*use_date=*/20);
+  CreditCard updated_card = CreateServerCreditCardWithUseStats(
+      kCard1ServerId, /*use_count=*/30, /*use_date=*/40);
+
+  WalletMetadataSpecifics expected_profile_specifics =
+      CreateWalletMetadataSpecificsForAddressWithUseStats(
+          kAddr1SpecificsId, /*use_count=*/10, /*use_date=*/20);
+  WalletMetadataSpecifics expected_card_specifics =
+      CreateWalletMetadataSpecificsForCardWithUseStats(
+          kCard1SpecificsId, /*use_count=*/30, /*use_date=*/40);
+
+  EXPECT_CALL(
+      mock_processor(),
+      Put(kAddr1SpecificsId, HasSpecifics(expected_profile_specifics), _));
+  EXPECT_CALL(mock_processor(),
+              Put(kCard1SpecificsId, HasSpecifics(expected_card_specifics), _));
+
+  bridge()->AutofillProfileChanged(AutofillProfileChange(
+      AutofillProfileChange::UPDATE, updated_profile.guid(), &updated_profile));
+  bridge()->CreditCardChanged(CreditCardChange(
+      CreditCardChange::UPDATE, updated_card.guid(), &updated_card));
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc
index ee74a384..bed8074 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.cc
@@ -4,17 +4,26 @@
 
 #include "components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h"
 
-#include <memory>
 #include <utility>
 
+#include "base/base64.h"
 #include "base/logging.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/autofill_profile.h"
+#include "components/autofill/core/browser/autofill_profile_sync_util.h"
+#include "components/autofill/core/browser/credit_card.h"
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_util.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_service.h"
+#include "components/sync/model/entity_data.h"
+#include "components/sync/model/mutable_data_batch.h"
 #include "components/sync/model_impl/client_tag_based_model_type_processor.h"
 #include "components/sync/model_impl/sync_metadata_store_change_list.h"
 
 using sync_pb::AutofillWalletSpecifics;
+using syncer::EntityData;
 
 namespace autofill {
 namespace {
@@ -29,6 +38,8 @@
       return specifics.masked_card().id();
     case AutofillWalletSpecifics::POSTAL_ADDRESS:
       return specifics.address().id();
+    case AutofillWalletSpecifics::CUSTOMER_DATA:
+      return specifics.customer_data().id();
     case AutofillWalletSpecifics::UNKNOWN:
       NOTREACHED();
       return std::string();
@@ -67,12 +78,12 @@
       web_data_backend_(web_data_backend) {}
 
 AutofillWalletSyncBridge::~AutofillWalletSyncBridge() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
 std::unique_ptr<syncer::MetadataChangeList>
 AutofillWalletSyncBridge::CreateMetadataChangeList() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return std::make_unique<syncer::SyncMetadataStoreChangeList>(
       GetAutofillTable(), syncer::AUTOFILL_WALLET_DATA);
 }
@@ -93,27 +104,42 @@
 
 void AutofillWalletSyncBridge::GetData(StorageKeyList storage_keys,
                                        DataCallback callback) {
+  // This data type is never synced "up" so we don't need to implement this.
   NOTIMPLEMENTED();
 }
 
 void AutofillWalletSyncBridge::GetAllDataForDebugging(DataCallback callback) {
-  NOTIMPLEMENTED();
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  std::vector<std::unique_ptr<AutofillProfile>> profiles;
+  std::vector<std::unique_ptr<CreditCard>> cards;
+  if (!GetAutofillTable()->GetServerProfiles(&profiles) ||
+      !GetAutofillTable()->GetServerCreditCards(&cards)) {
+    change_processor()->ReportError(
+        {FROM_HERE, "Failed to load entries from table."});
+    return;
+  }
+
+  auto batch = std::make_unique<syncer::MutableDataBatch>();
+  for (const std::unique_ptr<AutofillProfile>& entry : profiles) {
+    batch->Put(GetStorageKeyForEntryServerId(entry->server_id()),
+               CreateEntityDataFromAutofillServerProfile(*entry));
+  }
+  for (const std::unique_ptr<CreditCard>& entry : cards) {
+    batch->Put(GetStorageKeyForEntryServerId(entry->server_id()),
+               CreateEntityDataFromCard(*entry));
+  }
+
+  std::move(callback).Run(std::move(batch));
 }
 
 std::string AutofillWalletSyncBridge::GetClientTag(
     const syncer::EntityData& entity_data) {
   DCHECK(entity_data.specifics.has_autofill_wallet());
 
-  switch (entity_data.specifics.autofill_wallet().type()) {
-    case sync_pb::AutofillWalletSpecifics::POSTAL_ADDRESS:
-      return "address-" + GetStorageKey(entity_data);
-    case sync_pb::AutofillWalletSpecifics::MASKED_CREDIT_CARD:
-      return "card-" + GetStorageKey(entity_data);
-    case sync_pb::AutofillWalletSpecifics::UNKNOWN:
-      NOTREACHED();
-      return std::string();
-  }
-  return std::string();
+  return GetClientTagForSpecificsId(
+      entity_data.specifics.autofill_wallet().type(),
+      GetStorageKey(entity_data));
 }
 
 std::string AutofillWalletSyncBridge::GetStorageKey(
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h
index eabd20c..394de20 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h
+++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge.h
@@ -7,10 +7,11 @@
 
 #include <memory>
 #include <string>
+#include <unordered_set>
 
 #include "base/macros.h"
+#include "base/sequence_checker.h"
 #include "base/supports_user_data.h"
-#include "base/threading/thread_checker.h"
 #include "components/sync/model/metadata_change_list.h"
 #include "components/sync/model/model_error.h"
 #include "components/sync/model/model_type_change_processor.h"
@@ -58,15 +59,16 @@
   std::string GetStorageKey(const syncer::EntityData& entity_data) override;
 
  private:
+  // Returns the table associated with the |web_data_backend_|.
   AutofillTable* GetAutofillTable();
 
-  // The bridge should be used on the same sequence where it is constructed.
-  THREAD_CHECKER(thread_checker_);
-
   // AutofillProfileSyncBridge is owned by |web_data_backend_| through
   // SupportsUserData, so it's guaranteed to outlive |this|.
   AutofillWebDataBackend* const web_data_backend_;
 
+  // The bridge should be used on the same sequence where it is constructed.
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(AutofillWalletSyncBridge);
 };
 
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
index 1ab7ddf0..d702c4f 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -12,11 +12,14 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/message_loop/message_loop.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "components/autofill/core/browser/country_names.h"
 #include "components/autofill/core/browser/test_autofill_clock.h"
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_test_util.h"
+#include "components/autofill/core/browser/webdata/autofill_sync_bridge_util.h"
 #include "components/autofill/core/browser/webdata/autofill_table.h"
 #include "components/autofill/core/browser/webdata/autofill_webdata_backend.h"
 #include "components/autofill/core/common/autofill_constants.h"
@@ -35,16 +38,30 @@
 
 using base::ScopedTempDir;
 using sync_pb::AutofillWalletSpecifics;
+using syncer::DataBatch;
 using syncer::EntityData;
 using syncer::EntityDataPtr;
+using syncer::KeyAndData;
 using syncer::MockModelTypeChangeProcessor;
 using syncer::ModelType;
+using testing::UnorderedElementsAre;
 
-// Base64 encoded SHA1 hash of all address fields.
-const char kAddressHashA[] = "MgM+9iWXwMGwEpFfDDp06K3jizU=";
+// Non-UTF8 server IDs.
+const char kAddr1ServerId[] = "addr1\xEF\xBF\xBE";
+const char kAddr2ServerId[] = "addr2\xEF\xBF\xBE";
+const char kCard1ServerId[] = "card1\xEF\xBF\xBE";
+const char kCard2ServerId[] = "card2\xEF\xBF\xBE";
 
-// Base64 encoded string (opaque to Chrome; any such string works here).
-const char kCardIdA[] = "AQIDBAECAwQBAgMEAQIDBAECAwQBAgMEAQIDBAECAwQBAgME";
+// Base64 encodings of the server IDs, used as ids in WalletMetadataSpecifics
+// (these are suitable for syncing, because they are valid UTF-8).
+const char kAddr1SpecificsId[] = "YWRkcjHvv74=";
+//const char kAddr2SpecificsId[] = "YWRkcjLvv74=";
+const char kCard1SpecificsId[] = "Y2FyZDHvv74=";
+//const char kCard2SpecificsId[] = "Y2FyZDLvv74=";
+
+// Unique sync tags for the server IDs.
+const char kAddr1SyncTag[] = "address-YWRkcjHvv74=";
+const char kCard1SyncTag[] = "card-Y2FyZDHvv74=";
 
 const char kLocaleString[] = "en-US";
 const base::Time kJune2017 = base::Time::FromDoubleT(1497552271);
@@ -69,7 +86,8 @@
   WebDatabase* db_;
 };
 
-AutofillWalletSpecifics CreateWalletSpecificsForCard(const std::string& id) {
+AutofillWalletSpecifics CreateAutofillWalletSpecificsForCard(
+    const std::string& specifics_id) {
   sync_pb::AutofillWalletSpecifics wallet_specifics;
   wallet_specifics.set_type(
       sync_pb::AutofillWalletSpecifics_WalletInfoType::
@@ -77,11 +95,12 @@
 
   sync_pb::WalletMaskedCreditCard* card_specifics =
       wallet_specifics.mutable_masked_card();
-  card_specifics->set_id(id);
+  card_specifics->set_id(specifics_id);
   return wallet_specifics;
 }
 
-AutofillWalletSpecifics CreateWalletSpecificsForAddress(const std::string& id) {
+AutofillWalletSpecifics CreateAutofillWalletSpecificsForAddress(
+    const std::string& specifics_id) {
   sync_pb::AutofillWalletSpecifics wallet_specifics;
   wallet_specifics.set_type(
       sync_pb::AutofillWalletSpecifics_WalletInfoType::
@@ -89,10 +108,86 @@
 
   sync_pb::WalletPostalAddress* address_specifics =
       wallet_specifics.mutable_address();
-  address_specifics->set_id(id);
+  address_specifics->set_id(specifics_id);
   return wallet_specifics;
 }
 
+void ExtractAutofillWalletSpecificsFromDataBatch(
+    std::unique_ptr<DataBatch> batch,
+    std::vector<AutofillWalletSpecifics>* output) {
+  while (batch->HasNext()) {
+    const KeyAndData& data_pair = batch->Next();
+    output->push_back(data_pair.second->specifics.autofill_wallet());
+  }
+}
+
+std::string WalletMaskedCreditCardSpecificsAsDebugString(
+    const AutofillWalletSpecifics& specifics) {
+  std::ostringstream output;
+  output << "[id: " << specifics.masked_card().id()
+         << ", type: " << static_cast<int>(specifics.type())
+         << ", name_on_card: " << specifics.masked_card().name_on_card()
+         << ", type: " << specifics.masked_card().type()
+         << ", last_four: " << specifics.masked_card().last_four()
+         << ", exp_month: " << specifics.masked_card().exp_month()
+         << ", exp_year: " << specifics.masked_card().exp_year()
+         << ", billing_address_id: "
+         << specifics.masked_card().billing_address_id()
+         << ", card_class: " << specifics.masked_card().card_class()
+         << ", bank_name: " << specifics.masked_card().bank_name() << "]";
+  return output.str();
+}
+
+std::string WalletPostalAddressSpecificsAsDebugString(
+    const AutofillWalletSpecifics& specifics) {
+  std::ostringstream output;
+  output << "[id: " << specifics.address().id()
+         << ", type: " << static_cast<int>(specifics.type())
+         << ", recipient_name: " << specifics.address().recipient_name()
+         << ", company_name: " << specifics.address().company_name()
+         << ", street_address: "
+         << (specifics.address().street_address_size()
+                 ? specifics.address().street_address(0)
+                 : "")
+         << ", address_1: " << specifics.address().address_1()
+         << ", address_2: " << specifics.address().address_2()
+         << ", address_3: " << specifics.address().address_3()
+         << ", postal_code: " << specifics.address().postal_code()
+         << ", country_code: " << specifics.address().country_code()
+         << ", phone_number: " << specifics.address().phone_number()
+         << ", sorting_code: " << specifics.address().sorting_code() << "]";
+  return output.str();
+}
+
+std::string AutofillWalletSpecificsAsDebugString(
+    const AutofillWalletSpecifics& specifics) {
+  switch (specifics.type()) {
+    case sync_pb::AutofillWalletSpecifics_WalletInfoType::
+        AutofillWalletSpecifics_WalletInfoType_MASKED_CREDIT_CARD:
+      return WalletMaskedCreditCardSpecificsAsDebugString(specifics);
+    case sync_pb::AutofillWalletSpecifics_WalletInfoType::
+        AutofillWalletSpecifics_WalletInfoType_POSTAL_ADDRESS:
+      return WalletPostalAddressSpecificsAsDebugString(specifics);
+    case sync_pb::AutofillWalletSpecifics_WalletInfoType::
+        AutofillWalletSpecifics_WalletInfoType_CUSTOMER_DATA:
+      return "CustomerData";
+    case sync_pb::AutofillWalletSpecifics_WalletInfoType::
+        AutofillWalletSpecifics_WalletInfoType_UNKNOWN:
+      return "Unknown";
+  }
+}
+
+MATCHER_P(EqualsSpecifics, expected, "") {
+  if (arg.SerializeAsString() != expected.SerializeAsString()) {
+    *result_listener << "entry\n"
+                     << AutofillWalletSpecificsAsDebugString(arg) << "\n"
+                     << "did not match expected\n"
+                     << AutofillWalletSpecificsAsDebugString(expected);
+    return false;
+  }
+  return true;
+}
+
 }  // namespace
 
 class AutofillWalletSyncBridgeTest : public testing::Test {
@@ -115,7 +210,7 @@
   void ResetProcessor() {
     real_processor_ =
         std::make_unique<syncer::ClientTagBasedModelTypeProcessor>(
-            syncer::AUTOFILL_WALLET_METADATA, /*dump_stack=*/base::DoNothing(),
+            syncer::AUTOFILL_WALLET_DATA, /*dump_stack=*/base::DoNothing(),
             /*commit_only=*/false);
     mock_processor_.DelegateCallsByDefaultTo(real_processor_.get());
   }
@@ -129,7 +224,20 @@
     EntityData data;
     *data.specifics.mutable_autofill_wallet() = specifics;
     data.client_tag_hash = syncer::GenerateSyncableHash(
-        syncer::AUTOFILL_WALLET_METADATA, bridge()->GetClientTag(data));
+        syncer::AUTOFILL_WALLET_DATA, bridge()->GetClientTag(data));
+    return data;
+  }
+
+  std::vector<AutofillWalletSpecifics> GetAllLocalData() {
+    std::vector<AutofillWalletSpecifics> data;
+    // Perform an async call synchronously for testing.
+    base::RunLoop loop;
+    bridge()->GetAllDataForDebugging(base::BindLambdaForTesting(
+        [&loop, &data](std::unique_ptr<DataBatch> batch) {
+          ExtractAutofillWalletSpecificsFromDataBatch(std::move(batch), &data);
+          loop.Quit();
+        }));
+    loop.Run();
     return data;
   }
 
@@ -160,28 +268,56 @@
 // The following 2 tests make sure client tags stay stable.
 TEST_F(AutofillWalletSyncBridgeTest, GetClientTagForAddress) {
   AutofillWalletSpecifics specifics =
-      CreateWalletSpecificsForAddress(kAddressHashA);
+      CreateAutofillWalletSpecificsForAddress(kAddr1SyncTag);
   EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
-            "address-" + std::string(kAddressHashA));
+            "address-" + std::string(kAddr1SyncTag));
 }
 
 TEST_F(AutofillWalletSyncBridgeTest, GetClientTagForCard) {
-  AutofillWalletSpecifics specifics = CreateWalletSpecificsForCard(kCardIdA);
+  AutofillWalletSpecifics specifics =
+      CreateAutofillWalletSpecificsForCard(kCard1SyncTag);
   EXPECT_EQ(bridge()->GetClientTag(SpecificsToEntity(specifics)),
-            "card-" + std::string(kCardIdA));
+            "card-" + std::string(kCard1SyncTag));
 }
 
 // The following 2 tests make sure storage keys stay stable.
 TEST_F(AutofillWalletSyncBridgeTest, GetStorageKeyForAddress) {
   AutofillWalletSpecifics specifics1 =
-      CreateWalletSpecificsForAddress(kAddressHashA);
+      CreateAutofillWalletSpecificsForAddress(kAddr1SpecificsId);
   EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics1)),
-            kAddressHashA);
+            kAddr1SpecificsId);
 }
 
 TEST_F(AutofillWalletSyncBridgeTest, GetStorageKeyForCard) {
-  AutofillWalletSpecifics specifics2 = CreateWalletSpecificsForCard(kCardIdA);
-  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics2)), kCardIdA);
+  AutofillWalletSpecifics specifics2 =
+      CreateAutofillWalletSpecificsForCard(kCard1SpecificsId);
+  EXPECT_EQ(bridge()->GetStorageKey(SpecificsToEntity(specifics2)),
+            kCard1SpecificsId);
+}
+
+TEST_F(AutofillWalletSyncBridgeTest,
+       GetAllDataForDebugging_ShouldReturnAllData) {
+  AutofillProfile address1 = CreateServerProfile(kAddr1ServerId);
+  AutofillProfile address2 = CreateServerProfile(kAddr2ServerId);
+  table()->SetServerProfiles({address1, address2});
+  CreditCard card1 = CreateServerCreditCard(kCard1ServerId);
+  CreditCard card2 = CreateServerCreditCard(kCard2ServerId);
+  table()->SetServerCreditCards({card1, card2});
+
+  AutofillWalletSpecifics address_specifics1;
+  SetAutofillWalletSpecificsFromServerProfile(address1, &address_specifics1);
+  AutofillWalletSpecifics address_specifics2;
+  SetAutofillWalletSpecificsFromServerProfile(address2, &address_specifics2);
+  AutofillWalletSpecifics card_specifics1;
+  SetAutofillWalletSpecificsFromServerCard(card1, &card_specifics1);
+  AutofillWalletSpecifics card_specifics2;
+  SetAutofillWalletSpecificsFromServerCard(card2, &card_specifics2);
+
+  EXPECT_THAT(GetAllLocalData(),
+              UnorderedElementsAre(EqualsSpecifics(address_specifics1),
+                                   EqualsSpecifics(address_specifics2),
+                                   EqualsSpecifics(card_specifics1),
+                                   EqualsSpecifics(card_specifics2)));
 }
 
 }  // namespace autofill
\ No newline at end of file
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_syncable_service.cc b/components/autofill/core/browser/webdata/autofill_wallet_syncable_service.cc
index cdfdc71..bd3f5e6 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_syncable_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_syncable_service.cc
@@ -285,6 +285,7 @@
         ids[autofill_specifics.address().id()] =
             wallet_addresses->back().server_id();
         break;
+      case sync_pb::AutofillWalletSpecifics::CUSTOMER_DATA:
       case sync_pb::AutofillWalletSpecifics::UNKNOWN:
         // Just ignore new entry types that the client doesn't know about.
         break;
diff --git a/components/autofill/core/browser/webdata/web_data_service_unittest.cc b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
index 27c5395..97f8650 100644
--- a/components/autofill/core/browser/webdata/web_data_service_unittest.cc
+++ b/components/autofill/core/browser/webdata/web_data_service_unittest.cc
@@ -16,8 +16,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/components/autofill_assistant/browser/assistant_controller.cc b/components/autofill_assistant/browser/assistant_controller.cc
index 2f0c7975..aaa5ed6 100644
--- a/components/autofill_assistant/browser/assistant_controller.cc
+++ b/components/autofill_assistant/browser/assistant_controller.cc
@@ -72,6 +72,10 @@
   // TODO(crbug.com/806868): Stop executing scripts.
 }
 
+void AssistantController::OnDestroy() {
+  delete this;
+}
+
 void AssistantController::DidFinishLoad(
     content::RenderFrameHost* render_frame_host,
     const GURL& validated_url) {
@@ -81,7 +85,7 @@
 }
 
 void AssistantController::WebContentsDestroyed() {
-  delete this;
+  OnDestroy();
 }
 
 }  // namespace autofill_assistant
\ No newline at end of file
diff --git a/components/autofill_assistant/browser/assistant_controller.h b/components/autofill_assistant/browser/assistant_controller.h
index d4230d16..e0c7fe4 100644
--- a/components/autofill_assistant/browser/assistant_controller.h
+++ b/components/autofill_assistant/browser/assistant_controller.h
@@ -45,6 +45,7 @@
 
   // Overrides content::AssistantUiDelegate:
   void OnClickOverlay() override;
+  void OnDestroy() override;
 
   // Overrides content::WebContentsObserver:
   void DidFinishLoad(content::RenderFrameHost* render_frame_host,
diff --git a/components/autofill_assistant/browser/assistant_ui_controller.h b/components/autofill_assistant/browser/assistant_ui_controller.h
index e8674950..f8066a3 100644
--- a/components/autofill_assistant/browser/assistant_ui_controller.h
+++ b/components/autofill_assistant/browser/assistant_ui_controller.h
@@ -7,6 +7,8 @@
 
 #include "components/autofill_assistant/browser/assistant_ui_delegate.h"
 
+#include <string>
+
 namespace autofill_assistant {
 // Controller to control autofill assistant UI.
 class AssistantUiController {
diff --git a/components/autofill_assistant/browser/assistant_ui_delegate.h b/components/autofill_assistant/browser/assistant_ui_delegate.h
index 57b9da0..330e419 100644
--- a/components/autofill_assistant/browser/assistant_ui_delegate.h
+++ b/components/autofill_assistant/browser/assistant_ui_delegate.h
@@ -14,6 +14,10 @@
   // Called when the overlay has been clicked by user.
   virtual void OnClickOverlay() = 0;
 
+  // Called when the Autofill Assistant should be destroyed, e.g. the tab
+  // detached from the associated activity.
+  virtual void OnDestroy() = 0;
+
  protected:
   AssistantUiDelegate() = default;
 };
diff --git a/components/background_task_scheduler/OWNERS b/components/background_task_scheduler/OWNERS
index c6a24d5..2fff026 100644
--- a/components/background_task_scheduler/OWNERS
+++ b/components/background_task_scheduler/OWNERS
@@ -1,7 +1,7 @@
-awdf@chromium.org
 dtrainor@chromium.org
 fgorski@chromium.org
 nyquist@chromium.org
+peter@chromium.org
 
 # COMPONENT: Internals>BackgroundTaskScheduler
 
diff --git a/components/browser_sync/profile_sync_components_factory_impl.cc b/components/browser_sync/profile_sync_components_factory_impl.cc
index a98efcc..aeb5617 100644
--- a/components/browser_sync/profile_sync_components_factory_impl.cc
+++ b/components/browser_sync/profile_sync_components_factory_impl.cc
@@ -67,14 +67,9 @@
 // "WeakPtr<ModelTypeControllerDelegate> (AutofillWebDataService*)".
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
 AutocompleteDelegateFromDataService(autofill::AutofillWebDataService* service) {
-  // TODO(jkrcal): Deal with the (probably rare) race condition when we call
-  // bridges' FromWebDataService() before calling
-  // CreateForWebDataServiceAndBackend() in WebDataServiceWrapper. This TODO
-  // also applies to all analogous functions below and to analogous code in
-  // SyncClient::GetControllerDelegateForModelType().
   return autofill::AutocompleteSyncBridge::FromWebDataService(service)
       ->change_processor()
-      ->GetControllerDelegateOnUIThread();
+      ->GetControllerDelegate();
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
@@ -82,7 +77,7 @@
     autofill::AutofillWebDataService* service) {
   return autofill::AutofillProfileSyncBridge::FromWebDataService(service)
       ->change_processor()
-      ->GetControllerDelegateOnUIThread();
+      ->GetControllerDelegate();
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
@@ -90,7 +85,7 @@
     autofill::AutofillWebDataService* service) {
   return autofill::AutofillWalletSyncBridge::FromWebDataService(service)
       ->change_processor()
-      ->GetControllerDelegateOnUIThread();
+      ->GetControllerDelegate();
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
@@ -98,7 +93,7 @@
     autofill::AutofillWebDataService* service) {
   return autofill::AutofillWalletMetadataSyncBridge::FromWebDataService(service)
       ->change_processor()
-      ->GetControllerDelegateOnUIThread();
+      ->GetControllerDelegate();
 }
 
 }  // namespace
diff --git a/components/browser_sync/profile_sync_service.cc b/components/browser_sync/profile_sync_service.cc
index b961ef2e..f6df2a4 100644
--- a/components/browser_sync/profile_sync_service.cc
+++ b/components/browser_sync/profile_sync_service.cc
@@ -16,7 +16,6 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/threading/sequenced_task_runner_handle.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/browser_sync/sync_auth_manager.h"
 #include "components/invalidation/impl/invalidation_prefs.h"
@@ -53,7 +52,6 @@
 #include "components/sync/engine/polling_constants.h"
 #include "components/sync/engine/sync_encryption_handler.h"
 #include "components/sync/engine/sync_string_conversions.h"
-#include "components/sync/js/js_event_details.h"
 #include "components/sync/model/change_processor.h"
 #include "components/sync/model/model_type_change_processor.h"
 #include "components/sync/model/model_type_store_service.h"
@@ -303,13 +301,11 @@
   int disable_reasons = GetDisableReasons();
   RecordSyncInitialState(disable_reasons, IsFirstSetupComplete());
 
-  // If sync isn't allowed, the only thing to do is to turn it off.
-  if ((disable_reasons & DISABLE_REASON_PLATFORM_OVERRIDE) ||
-      (disable_reasons & DISABLE_REASON_ENTERPRISE_POLICY)) {
-    // Only clear data if disallowed by policy.
-    StopImpl((disable_reasons & DISABLE_REASON_ENTERPRISE_POLICY) ? CLEAR_DATA
-                                                                  : KEEP_DATA);
-    return;
+  // If sync is disallowed by policy, clean up.
+  if (disable_reasons & DISABLE_REASON_ENTERPRISE_POLICY) {
+    // Note that this won't actually clear data, since neither |engine_| nor
+    // |sync_thread_| exist at this point. Bug or feature?
+    StopImpl(CLEAR_DATA);
   }
 
   if (!IsLocalSyncEnabled()) {
@@ -788,19 +784,14 @@
   return result;
 }
 
-syncer::SyncService::State ProfileSyncService::GetState() const {
+syncer::SyncService::TransportState ProfileSyncService::GetTransportState()
+    const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!IsEngineAllowedToStart()) {
-    // We shouldn't have an engine while in a disabled state, with one
-    // exception: When encountering an unrecoverable error, we post a task to
-    // shut down instead of doing it immediately, so there's a brief timeframe
-    // where we have an unrecoverable error but the engine still exists.
-    // TODO(crbug.com/839834): See if we can change this by either shutting down
-    // immediately (not posting a task), or setting the unrecoverable error as
-    // part of the posted task.
-    DCHECK(HasDisableReason(DISABLE_REASON_UNRECOVERABLE_ERROR) || !engine_);
-    return State::DISABLED;
+    // We shouldn't have an engine while in a disabled state.
+    DCHECK(!engine_);
+    return TransportState::DISABLED;
   }
 
   // Typically, Sync won't start until the initial setup is at least in
@@ -810,13 +801,13 @@
     switch (startup_controller_->GetState()) {
       case syncer::StartupController::State::NOT_STARTED:
         DCHECK(!engine_);
-        return State::WAITING_FOR_START_REQUEST;
+        return TransportState::WAITING_FOR_START_REQUEST;
       case syncer::StartupController::State::STARTING_DEFERRED:
         DCHECK(!engine_);
-        return State::START_DEFERRED;
+        return TransportState::START_DEFERRED;
       case syncer::StartupController::State::STARTED:
         DCHECK(engine_);
-        return State::INITIALIZING;
+        return TransportState::INITIALIZING;
     }
     NOTREACHED();
   }
@@ -831,7 +822,7 @@
   // in progress, we won't configure them right now.
   if (data_type_manager_->state() == DataTypeManager::STOPPED) {
     DCHECK(!CanConfigureDataTypes());
-    return State::PENDING_DESIRED_CONFIGURATION;
+    return TransportState::PENDING_DESIRED_CONFIGURATION;
   }
 
   // Unless standalone transport is enabled, the DataTypeManager shouldn't get
@@ -845,10 +836,10 @@
   DCHECK(CanConfigureDataTypes() || IsSetupInProgress());
 
   if (data_type_manager_->state() != DataTypeManager::CONFIGURED) {
-    return State::CONFIGURING;
+    return TransportState::CONFIGURING;
   }
 
-  return State::ACTIVE;
+  return TransportState::ACTIVE;
 }
 
 bool ProfileSyncService::IsFirstSetupComplete() const {
@@ -914,17 +905,21 @@
 // to do as little work as possible, to avoid further corruption or crashes.
 void ProfileSyncService::OnUnrecoverableError(const base::Location& from_here,
                                               const std::string& message) {
+  // TODO(crbug.com/840720): Get rid of the UnrecoverableErrorHandler interface
+  // and instead pass a callback.
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   // Unrecoverable errors that arrive via the syncer::UnrecoverableErrorHandler
   // interface are assumed to originate within the syncer.
-  unrecoverable_error_reason_ = ERROR_REASON_SYNCER;
-  OnUnrecoverableErrorImpl(from_here, message);
+  OnUnrecoverableErrorImpl(from_here, message, ERROR_REASON_SYNCER);
 }
 
 void ProfileSyncService::OnUnrecoverableErrorImpl(
     const base::Location& from_here,
-    const std::string& message) {
-  DCHECK_NE(unrecoverable_error_reason_, ERROR_REASON_UNSET);
+    const std::string& message,
+    UnrecoverableErrorReason reason) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK_NE(reason, ERROR_REASON_UNSET);
+  unrecoverable_error_reason_ = reason;
   unrecoverable_error_message_ = message;
   unrecoverable_error_location_ = from_here;
 
@@ -933,13 +928,8 @@
   LOG(ERROR) << "Unrecoverable error detected at " << from_here.ToString()
              << " -- ProfileSyncService unusable: " << message;
 
-  NotifyObservers();
-
   // Shut all data types down.
-  base::SequencedTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ProfileSyncService::ShutdownImpl,
-                                sync_enabled_weak_factory_.GetWeakPtr(),
-                                syncer::DISABLE_SYNC));
+  ShutdownImpl(syncer::DISABLE_SYNC);
 }
 
 void ProfileSyncService::ReenableDatatype(syncer::ModelType type) {
@@ -985,8 +975,8 @@
   if (!success) {
     // Something went unexpectedly wrong.  Play it safe: stop syncing at once
     // and surface error UI to alert the user sync has stopped.
-    OnInternalUnrecoverableError(FROM_HERE, "BackendInitialize failure",
-                                 ERROR_REASON_ENGINE_INIT_FAILURE);
+    OnUnrecoverableErrorImpl(FROM_HERE, "BackendInitialize failure",
+                             ERROR_REASON_ENGINE_INIT_FAILURE);
     return;
   }
 
@@ -1122,9 +1112,9 @@
         expect_sync_configuration_aborted_ = true;
       }
       // Trigger an unrecoverable error to stop syncing.
-      OnInternalUnrecoverableError(FROM_HERE,
-                                   last_actionable_error_.error_description,
-                                   ERROR_REASON_ACTIONABLE_ERROR);
+      OnUnrecoverableErrorImpl(FROM_HERE,
+                               last_actionable_error_.error_description,
+                               ERROR_REASON_ACTIONABLE_ERROR);
       break;
     case syncer::DISABLE_SYNC_ON_CLIENT:
       if (error.error_type == syncer::NOT_MY_BIRTHDAY) {
@@ -1256,8 +1246,8 @@
             result.data_type_status_table.GetUnrecoverableErrorTypes()) +
         ": " + error.message();
     LOG(ERROR) << "ProfileSyncService error: " << message;
-    OnInternalUnrecoverableError(error.location(), message,
-                                 ERROR_REASON_CONFIGURATION_FAILURE);
+    OnUnrecoverableErrorImpl(error.location(), message,
+                             ERROR_REASON_CONFIGURATION_FAILURE);
     return;
   }
 
@@ -2079,15 +2069,6 @@
   return types;
 }
 
-void ProfileSyncService::OnInternalUnrecoverableError(
-    const base::Location& from_here,
-    const std::string& message,
-    UnrecoverableErrorReason reason) {
-  DCHECK_EQ(unrecoverable_error_reason_, ERROR_REASON_UNSET);
-  unrecoverable_error_reason_ = reason;
-  OnUnrecoverableErrorImpl(from_here, message);
-}
-
 bool ProfileSyncService::IsRetryingAccessTokenFetchForTest() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   return auth_manager_->IsRetryingAccessTokenFetchForTest();
@@ -2106,20 +2087,19 @@
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
-ProfileSyncService::GetSessionSyncControllerDelegateOnUIThread() {
+ProfileSyncService::GetSessionSyncControllerDelegate() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!sessions_sync_manager_)
     return nullptr;
   return sessions_sync_manager_->GetModelTypeSyncBridge()
       ->change_processor()
-      ->GetControllerDelegateOnUIThread();
+      ->GetControllerDelegate();
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
-ProfileSyncService::GetDeviceInfoSyncControllerDelegateOnUIThread() {
+ProfileSyncService::GetDeviceInfoSyncControllerDelegate() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return device_info_sync_bridge_->change_processor()
-      ->GetControllerDelegateOnUIThread();
+  return device_info_sync_bridge_->change_processor()->GetControllerDelegate();
 }
 
 syncer::SyncTokenStatus ProfileSyncService::GetSyncTokenStatus() const {
diff --git a/components/browser_sync/profile_sync_service.h b/components/browser_sync/profile_sync_service.h
index 06ed438..b143fe46 100644
--- a/components/browser_sync/profile_sync_service.h
+++ b/components/browser_sync/profile_sync_service.h
@@ -233,7 +233,7 @@
 
   // syncer::SyncService implementation
   int GetDisableReasons() const override;
-  State GetState() const override;
+  TransportState GetTransportState() const override;
   bool IsFirstSetupComplete() const override;
   bool IsLocalSyncEnabled() const override;
   void TriggerRefresh(const syncer::ModelTypeSet& types) override;
@@ -304,11 +304,11 @@
   // Returns the SyncableService or USS bridge for syncer::SESSIONS.
   syncer::SyncableService* GetSessionsSyncableService();
   base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetSessionSyncControllerDelegateOnUIThread();
+  GetSessionSyncControllerDelegate();
 
   // Returns the ModelTypeControllerDelegate for syncer::DEVICE_INFO.
   base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetDeviceInfoSyncControllerDelegateOnUIThread();
+  GetDeviceInfoSyncControllerDelegate();
 
   // Returns synced devices tracker.
   // Virtual for testing.
@@ -526,9 +526,10 @@
   // Helper method for managing encryption UI.
   bool IsEncryptedDatatypeEnabled() const;
 
-  // Helper for OnUnrecoverableError and OnInternalUnrecoverableError.
+  // Helper for OnUnrecoverableError.
   void OnUnrecoverableErrorImpl(const base::Location& from_here,
-                                const std::string& message);
+                                const std::string& message,
+                                UnrecoverableErrorReason reason);
 
   // Stops the sync engine. Does NOT set IsSyncRequested to false. Use
   // RequestStop for that. |data_fate| controls whether the local sync data is
@@ -566,12 +567,6 @@
       bool sync_everything,
       const syncer::ModelTypeSet chosen_types) const;
 
-  // Internal unrecoverable error handler. Used to track error reason via
-  // Sync.UnrecoverableErrors histogram.
-  void OnInternalUnrecoverableError(const base::Location& from_here,
-                                    const std::string& message,
-                                    UnrecoverableErrorReason reason);
-
   // Update UMA for syncing engine.
   void UpdateEngineInitUMA(bool success) const;
 
diff --git a/components/browser_sync/profile_sync_service_mock.h b/components/browser_sync/profile_sync_service_mock.h
index b68d823f..fb3a99a0 100644
--- a/components/browser_sync/profile_sync_service_mock.h
+++ b/components/browser_sync/profile_sync_service_mock.h
@@ -70,7 +70,7 @@
   MOCK_CONST_METHOD0(GetLastCycleSnapshot, syncer::SyncCycleSnapshot());
 
   MOCK_CONST_METHOD0(GetDisableReasons, int());
-  MOCK_CONST_METHOD0(GetState, State());
+  MOCK_CONST_METHOD0(GetTransportState, TransportState());
   MOCK_CONST_METHOD1(QueryDetailedSyncStatus,
                      bool(syncer::SyncEngine::Status* result));
   MOCK_CONST_METHOD0(GetAuthError, const GoogleServiceAuthError&());
diff --git a/components/browser_sync/profile_sync_service_startup_unittest.cc b/components/browser_sync/profile_sync_service_startup_unittest.cc
index 801ae25..b3ec24d 100644
--- a/components/browser_sync/profile_sync_service_startup_unittest.cc
+++ b/components/browser_sync/profile_sync_service_startup_unittest.cc
@@ -206,7 +206,8 @@
   sync_service()->Initialize();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 
   // Preferences should be back to defaults.
   EXPECT_EQ(0, pref_service()->GetInt64(syncer::prefs::kSyncLastSyncedTime));
@@ -223,7 +224,8 @@
   EXPECT_FALSE(sync_service()->IsEngineInitialized());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 
   // Confirmation isn't needed before sign in occurs, or when setup is already
   // in progress.
@@ -240,8 +242,8 @@
   EXPECT_TRUE(sync_service()->IsEngineInitialized());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
 
   // Setup is already in progress, so confirmation still isn't needed.
   EXPECT_FALSE(sync_service()->IsSyncConfirmationNeeded());
@@ -254,8 +256,8 @@
   // that the initial setup was completed.
   ASSERT_FALSE(sync_service()->IsSetupInProgress());
   EXPECT_TRUE(sync_service()->IsSyncConfirmationNeeded());
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
 
   // Marking first setup complete will let ProfileSyncService configure the
   // DataTypeManager.
@@ -266,7 +268,8 @@
 
   // This should have fully enabled sync.
   EXPECT_FALSE(sync_service()->IsSyncConfirmationNeeded());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 
@@ -289,7 +292,8 @@
   sync_service()->Initialize();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 
   // Preferences should be back to defaults.
   EXPECT_EQ(0, pref_service()->GetInt64(syncer::prefs::kSyncLastSyncedTime));
@@ -306,7 +310,8 @@
   EXPECT_FALSE(sync_service()->IsEngineInitialized());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 
   // Confirmation isn't needed before sign in occurs, or when setup is already
   // in progress.
@@ -321,8 +326,8 @@
   EXPECT_TRUE(sync_service()->IsEngineInitialized());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
 
   // Setup is already in progress, so confirmation still isn't needed.
   EXPECT_FALSE(sync_service()->IsSyncConfirmationNeeded());
@@ -338,7 +343,8 @@
       .WillByDefault(Return(DataTypeManager::CONFIGURED));
   sync_blocker.reset();
   ASSERT_FALSE(sync_service()->IsSetupInProgress());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   // Sync-the-feature is still not active, but rather pending confirmation.
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncActive());
@@ -355,7 +361,8 @@
   EXPECT_TRUE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_TRUE(sync_service()->IsSyncActive());
   EXPECT_FALSE(sync_service()->IsSyncConfirmationNeeded());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
 
   EXPECT_CALL(*data_type_manager, Stop(syncer::BROWSER_SHUTDOWN));
 }
@@ -378,7 +385,8 @@
 
   // ProfileSyncService should now be active, but of course not have an access
   // token.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->GetAccessTokenForTest().empty());
   // Note that ProfileSyncService is not in an auth error state - no auth was
   // attempted, so no error.
@@ -406,7 +414,8 @@
   EXPECT_TRUE(sync_service()->HasUnrecoverableError());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_UNRECOVERABLE_ERROR,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 }
 
 TEST_F(ProfileSyncServiceStartupTest, StartCrosNoCredentials) {
@@ -429,7 +438,8 @@
       .WillByDefault(Return(DataTypeManager::CONFIGURED));
 
   // Sync should be considered active, even though there is no refresh token.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   // Since we're in AUTO_START mode, FirstSetupComplete gets set automatically.
   EXPECT_TRUE(sync_service()->IsFirstSetupComplete());
 }
@@ -452,7 +462,8 @@
   // a refresh token.
   UpdateCredentials();
   sync_service()->Initialize();
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_CALL(*data_type_manager, Stop(syncer::BROWSER_SHUTDOWN));
 }
 
@@ -476,7 +487,8 @@
   ON_CALL(*data_type_manager, state())
       .WillByDefault(Return(DataTypeManager::CONFIGURED));
 
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
 
   EXPECT_CALL(*data_type_manager, Stop(syncer::BROWSER_SHUTDOWN));
 }
@@ -651,7 +663,8 @@
   EXPECT_TRUE(sync_service()->IsEngineInitialized());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 
@@ -664,7 +677,8 @@
   ASSERT_EQ(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY,
             sync_service()->GetDisableReasons());
   EXPECT_FALSE(sync_service()->IsEngineInitialized());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncActive());
   // Note that PSS no longer references |data_type_manager| after stopping.
@@ -680,8 +694,8 @@
   ASSERT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             sync_service()->GetDisableReasons());
   EXPECT_FALSE(sync_service()->IsEngineInitialized());
-  EXPECT_EQ(syncer::SyncService::State::WAITING_FOR_START_REQUEST,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST,
+            sync_service()->GetTransportState());
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncActive());
 }
@@ -700,7 +714,8 @@
   EXPECT_TRUE(sync_service()->IsEngineInitialized());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 
@@ -714,7 +729,8 @@
   ASSERT_EQ(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY,
             sync_service()->GetDisableReasons());
   EXPECT_FALSE(sync_service()->IsEngineInitialized());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncActive());
   // Note that PSS no longer references |data_type_manager| after stopping.
@@ -735,7 +751,8 @@
             sync_service()->GetDisableReasons());
 
   EXPECT_TRUE(sync_service()->IsEngineInitialized());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   // Sync-the-feature is still considered off.
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
   EXPECT_FALSE(sync_service()->IsSyncActive());
@@ -777,7 +794,8 @@
   sync_blocker.reset();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_UNRECOVERABLE_ERROR,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 }
 
 // ChromeOS does not support sign-in after startup (in particular,
@@ -805,20 +823,21 @@
   // There is no signed-in user, but nothing else prevents Sync from starting.
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 
   // Sign in. Now Sync is ready to start, just waiting for a prod.
   SimulateTestUserSignin();
-  EXPECT_EQ(syncer::SyncService::State::WAITING_FOR_START_REQUEST,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST,
+            sync_service()->GetTransportState());
 
   // Once we give the service a prod by initiating Sync setup, it'll start and
   // initialize the engine. Since this is the initial Sync start, this will not
   // be deferred.
   EXPECT_CALL(*sync_engine, Initialize(_));
   auto setup_in_progress_handle = sync_service()->GetSetupInProgressHandle();
-  EXPECT_EQ(syncer::SyncService::State::INITIALIZING,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::INITIALIZING,
+            sync_service()->GetTransportState());
 
   // Once the engine calls back and says it's initialized, we're just waiting
   // for the user to finish the initial configuration (choosing data types etc.)
@@ -828,8 +847,8 @@
       syncer::WeakHandle<syncer::DataTypeDebugInfoListener>(), "test-guid",
       /*success=*/true);
   ASSERT_TRUE(sync_service()->IsEngineInitialized());
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
 
   // Once the user finishes the initial setup, the service can actually start
@@ -837,8 +856,8 @@
   // isn't enough though, because setup is still considered in progress (we
   // haven't released the setup-in-progress handle).
   sync_service()->SetFirstSetupComplete();
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncFeatureEnabled());
 
   // Releasing the setup in progress handle lets the service actually configure
@@ -851,8 +870,8 @@
   setup_in_progress_handle.reset();
   // While DataTypeManager configuration is ongoing, the overall state is still
   // CONFIGURING.
-  EXPECT_EQ(syncer::SyncService::State::CONFIGURING,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::CONFIGURING,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 
   // Finally, once the DataTypeManager says it's done with configuration, Sync
@@ -862,7 +881,8 @@
   ON_CALL(*data_type_manager, state())
       .WillByDefault(Return(DataTypeManager::CONFIGURED));
   sync_service()->OnConfigureDone(configure_result);
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 }
 
@@ -888,20 +908,21 @@
   // There is no signed-in user, but nothing else prevents Sync from starting.
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             sync_service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            sync_service()->GetTransportState());
 
   // Sign in. Now Sync is ready to start, just waiting for a prod.
   SimulateTestUserSignin();
-  EXPECT_EQ(syncer::SyncService::State::START_DEFERRED,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::START_DEFERRED,
+            sync_service()->GetTransportState());
 
   // Once we give the service a prod by initiating Sync setup, it'll start and
   // initialize the engine. Since this is the initial Sync start, this will not
   // be deferred.
   EXPECT_CALL(*sync_engine, Initialize(_));
   auto setup_in_progress_handle = sync_service()->GetSetupInProgressHandle();
-  EXPECT_EQ(syncer::SyncService::State::INITIALIZING,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::INITIALIZING,
+            sync_service()->GetTransportState());
 
   // Once the engine calls back and says it's initialized, we're just waiting
   // for the user to finish the initial configuration (choosing data types etc.)
@@ -911,8 +932,8 @@
       syncer::WeakHandle<syncer::DataTypeDebugInfoListener>(), "test-guid",
       /*success=*/true);
   ASSERT_TRUE(sync_service()->IsEngineInitialized());
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
   EXPECT_FALSE(sync_service()->IsSyncFeatureEnabled());
 
   // Once the user finishes the initial setup, the service can actually start
@@ -920,8 +941,8 @@
   // isn't enough though, because setup is still considered in progress (we
   // haven't released the setup-in-progress handle).
   sync_service()->SetFirstSetupComplete();
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncFeatureEnabled());
 
   // Releasing the setup in progress handle lets the service actually configure
@@ -934,8 +955,8 @@
   setup_in_progress_handle.reset();
   // While DataTypeManager configuration is ongoing, the overall state is still
   // CONFIGURING.
-  EXPECT_EQ(syncer::SyncService::State::CONFIGURING,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::CONFIGURING,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 
   // Finally, once the DataTypeManager says it's done with configuration, Sync
@@ -945,7 +966,8 @@
   ON_CALL(*data_type_manager, state())
       .WillByDefault(Return(DataTypeManager::CONFIGURED));
   sync_service()->OnConfigureDone(configure_result);
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
   EXPECT_TRUE(sync_service()->IsSyncActive());
 }
 #endif  // OS_CHROMEOS
@@ -971,15 +993,15 @@
 
   // Nothing is preventing Sync from starting, but it should be deferred so as
   // to now slow down browser startup.
-  EXPECT_EQ(syncer::SyncService::State::START_DEFERRED,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::START_DEFERRED,
+            sync_service()->GetTransportState());
 
   // Wait for the deferred startup timer to expire. The Sync service will start
   // and initialize the engine.
   EXPECT_CALL(*sync_engine, Initialize(_));
   FastForwardUntilNoTasksRemain();
-  EXPECT_EQ(syncer::SyncService::State::INITIALIZING,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::INITIALIZING,
+            sync_service()->GetTransportState());
 
   // Once the engine calls back and says it's initialized, the DataTypeManager
   // will get configured, since initial setup is already done.
@@ -990,8 +1012,8 @@
       /*success=*/true);
   ON_CALL(*data_type_manager, state())
       .WillByDefault(Return(DataTypeManager::CONFIGURING));
-  EXPECT_EQ(syncer::SyncService::State::CONFIGURING,
-            sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::CONFIGURING,
+            sync_service()->GetTransportState());
 
   // Finally, once the DataTypeManager says it's done with configuration, Sync
   // is actually fully up and running.
@@ -1000,7 +1022,8 @@
   ON_CALL(*data_type_manager, state())
       .WillByDefault(Return(DataTypeManager::CONFIGURED));
   sync_service()->OnConfigureDone(configure_result);
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, sync_service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            sync_service()->GetTransportState());
 }
 
 }  // namespace browser_sync
diff --git a/components/browser_sync/profile_sync_service_unittest.cc b/components/browser_sync/profile_sync_service_unittest.cc
index cfbe8e9..19b90f3c 100644
--- a/components/browser_sync/profile_sync_service_unittest.cc
+++ b/components/browser_sync/profile_sync_service_unittest.cc
@@ -374,7 +374,8 @@
   InitializeForNthSync();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 }
 
 TEST_F(ProfileSyncServiceTest, SuccessfulLocalBackendInitialization) {
@@ -388,7 +389,8 @@
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
   EXPECT_FALSE(service()->IsSyncConfirmationNeeded());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 }
 
 // Verify that an initialization where first setup is not complete does not
@@ -410,14 +412,14 @@
   // (usually that happens via getting and then releasing a
   // SyncSetupInProgressHandle), so the state is still WAITING_FOR_START_REQUEST
   // and not PENDING_DESIRED_CONFIGURATION.
-  EXPECT_EQ(syncer::SyncService::State::WAITING_FOR_START_REQUEST,
-            service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST,
+            service()->GetTransportState());
 
   // Once we kick off initialization by getting and releasing a setup handle,
   // the state goes to PENDING_DESIRED_CONFIGURATION.
   service()->GetSetupInProgressHandle();
-  EXPECT_EQ(syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION,
-            service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION,
+            service()->GetTransportState());
 
   // The last sync time shouldn't be cleared.
   // TODO(zea): figure out a way to check that the directory itself wasn't
@@ -440,7 +442,8 @@
             service()->GetDisableReasons());
 
   // Sync should immediately start up in transport mode.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncActive());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
@@ -476,9 +479,40 @@
   InitializeForNthSync();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
 }
 
+// This test exercises sign-in after startup, which isn't supported on ChromeOS.
+#if !defined(OS_CHROMEOS)
+TEST_F(ProfileSyncServiceTest, DisabledByPolicyBeforeInitThenPolicyRemoved) {
+  prefs()->SetManagedPref(syncer::prefs::kSyncManaged,
+                          std::make_unique<base::Value>(true));
+  CreateService(ProfileSyncService::AUTO_START);
+  InitializeForNthSync();
+  EXPECT_EQ(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY |
+                syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
+            service()->GetDisableReasons());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
+
+  // Remove the policy. Now only missing sign-in is preventing startup.
+  prefs()->SetManagedPref(syncer::prefs::kSyncManaged,
+                          std::make_unique<base::Value>(false));
+  EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
+            service()->GetDisableReasons());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
+
+  // Once we mark first setup complete again (it was cleared by the policy) and
+  // sign in, sync starts up.
+  service()->SetFirstSetupComplete();
+  SignIn();
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
+}
+#endif  // !defined(OS_CHROMEOS)
+
 // Verify that disable by enterprise policy works even after the backend has
 // been initialized.
 TEST_F(ProfileSyncServiceTest, DisabledByPolicyAfterInit) {
@@ -488,14 +522,16 @@
 
   ASSERT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   prefs()->SetManagedPref(syncer::prefs::kSyncManaged,
                           std::make_unique<base::Value>(true));
 
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
 }
 
 // Exercises the ProfileSyncService's code paths related to getting shut down
@@ -507,7 +543,8 @@
 
   SignIn();
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::INITIALIZING, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::INITIALIZING,
+            service()->GetTransportState());
 
   ShutdownAndDeleteService();
 }
@@ -521,13 +558,15 @@
   SignIn();
   InitializeForNthSync();
 
-  ASSERT_EQ(syncer::SyncService::State::INITIALIZING, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::INITIALIZING,
+            service()->GetTransportState());
 
   // Request stop. Sync should get disabled.
   service()->RequestStop(ProfileSyncService::KEEP_DATA);
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
   // Request start again, this time with an engine that does get initialized.
@@ -537,7 +576,8 @@
   service()->RequestStart();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_TRUE(service()->IsSyncActive());
   EXPECT_TRUE(service()->IsSyncFeatureEnabled());
 }
@@ -550,7 +590,8 @@
   SignIn();
   InitializeForNthSync();
 
-  ASSERT_EQ(syncer::SyncService::State::INITIALIZING, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::INITIALIZING,
+            service()->GetTransportState());
 
   // Request stop. This should immediately restart the service in standalone
   // transport mode.
@@ -559,7 +600,8 @@
   service()->RequestStop(ProfileSyncService::KEEP_DATA);
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncActive());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
@@ -567,7 +609,8 @@
   service()->RequestStart();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_TRUE(service()->IsSyncActive());
   EXPECT_TRUE(service()->IsSyncFeatureEnabled());
 }
@@ -582,7 +625,8 @@
   ASSERT_FALSE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   ASSERT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_TRUE(service()->IsSyncActive());
   ASSERT_TRUE(service()->IsSyncFeatureEnabled());
 
@@ -592,7 +636,8 @@
   EXPECT_TRUE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncActive());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
@@ -600,7 +645,8 @@
   EXPECT_FALSE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_TRUE(service()->IsSyncActive());
   EXPECT_TRUE(service()->IsSyncFeatureEnabled());
 }
@@ -614,7 +660,8 @@
   ASSERT_FALSE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   ASSERT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_TRUE(service()->IsSyncActive());
   ASSERT_TRUE(service()->IsSyncFeatureEnabled());
 
@@ -624,7 +671,8 @@
   EXPECT_TRUE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncActive());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
@@ -632,7 +680,8 @@
   EXPECT_FALSE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_TRUE(service()->IsSyncActive());
   EXPECT_TRUE(service()->IsSyncFeatureEnabled());
 }
@@ -648,7 +697,8 @@
   EXPECT_FALSE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   signin_manager()->SignOut(signin_metrics::SIGNOUT_TEST,
                             signin_metrics::SignoutDelete::IGNORE_METRIC);
@@ -656,7 +706,8 @@
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
 }
 #endif  // !defined(OS_CHROMEOS)
 
@@ -704,7 +755,8 @@
           Return(ByMove(std::make_unique<FakeSyncEngineCollectCredentials>(
               &init_credentials, base::RepeatingClosure()))));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   const std::string primary_account_id =
       signin_manager()->GetAuthenticatedAccountId();
@@ -752,7 +804,8 @@
           Return(ByMove(std::make_unique<FakeSyncEngineCollectCredentials>(
               &init_credentials, invalidate_credentials_callback))));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   TestSyncServiceObserver observer;
   service()->AddObserver(&observer);
@@ -792,7 +845,8 @@
   // The observer should have been notified of the auth error state.
   EXPECT_EQ(rejected_by_client, observer.auth_error());
   // The overall state should remain ACTIVE.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   service()->RemoveObserver(&observer);
 }
@@ -809,7 +863,8 @@
           Return(ByMove(std::make_unique<FakeSyncEngineCollectCredentials>(
               &init_credentials, base::RepeatingClosure()))));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   const std::string primary_account_id =
       signin_manager()->GetAuthenticatedAccountId();
@@ -839,7 +894,8 @@
   SignIn();
   CreateService(ProfileSyncService::AUTO_START);
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_LT(base::Time::Now() - service()->GetLastSyncedTime(),
             base::TimeDelta::FromMinutes(1));
   ASSERT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
@@ -847,7 +903,8 @@
   // Sign out.
   service()->RequestStop(ProfileSyncService::CLEAR_DATA);
 
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
   EXPECT_TRUE(service()->GetLastSyncedTime().is_null());
@@ -858,7 +915,8 @@
   SignIn();
   CreateService(ProfileSyncService::AUTO_START);
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   base::Time last_synced_time = service()->GetLastSyncedTime();
   ASSERT_LT(base::Time::Now() - last_synced_time,
             base::TimeDelta::FromMinutes(1));
@@ -869,7 +927,8 @@
 
   // Even though Sync-the-feature is disabled, Sync-the-transport should still
   // be running, and should have updated the last synced time.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   EXPECT_FALSE(service()->IsSyncFeatureEnabled());
 
   EXPECT_NE(service()->GetLastSyncedTime(), last_synced_time);
@@ -891,7 +950,8 @@
           Return(ByMove(std::make_unique<FakeSyncEngineCollectCredentials>(
               &init_credentials, base::RepeatingClosure()))));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   const std::string primary_account_id =
       signin_manager()->GetAuthenticatedAccountId();
@@ -931,7 +991,8 @@
   EXPECT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS,
             observer.auth_error().state());
   // The overall state should remain ACTIVE.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   service()->RemoveObserver(&observer);
 }
@@ -952,7 +1013,8 @@
           Return(ByMove(std::make_unique<FakeSyncEngineCollectCredentials>(
               &init_credentials, base::RepeatingClosure()))));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   const std::string primary_account_id =
       signin_manager()->GetAuthenticatedAccountId();
@@ -991,7 +1053,8 @@
   ASSERT_EQ(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS,
             service()->GetAuthError().state());
   // The overall state should remain ACTIVE.
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   // Now emulate Chrome receiving a new, valid LST.
   auth_service()->UpdateCredentials(primary_account_id, "totally valid token");
@@ -1003,7 +1066,8 @@
   // Check that sync auth error state cleared.
   EXPECT_EQ(GoogleServiceAuthError::NONE, service()->GetAuthError().state());
   EXPECT_EQ(GoogleServiceAuthError::NONE, observer.auth_error().state());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   service()->RemoveObserver(&observer);
 }
@@ -1026,7 +1090,8 @@
   InitializeForNthSync();
 
   ASSERT_FALSE(prefs()->GetBoolean(syncer::prefs::kSyncSuppressStart));
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   testing::Mock::VerifyAndClearExpectations(component_factory());
 
@@ -1082,7 +1147,8 @@
       .WillOnce(ReturnNewFakeDataTypeManager(
           GetRecordingConfigureCalledCallback(&configure_reason)));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   testing::Mock::VerifyAndClearExpectations(component_factory());
   ASSERT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason);
   syncer::DataTypeManager::ConfigureResult result;
@@ -1303,7 +1369,8 @@
   CreateService(ProfileSyncService::AUTO_START);
   InitializeForNthSync();
 
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_LT(base::Time::Now() - service()->GetLastSyncedTime(),
             base::TimeDelta::FromMinutes(1));
   ASSERT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
@@ -1317,13 +1384,15 @@
   EXPECT_FALSE(signin_manager()->GetAuthenticatedAccountId().empty());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
 #else
   EXPECT_TRUE(signin_manager()->GetAuthenticatedAccountId().empty());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN |
                 syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
   EXPECT_TRUE(service()->GetLastSyncedTime().is_null());
   EXPECT_FALSE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
 #endif
@@ -1337,7 +1406,8 @@
   CreateService(ProfileSyncService::AUTO_START);
   InitializeForNthSync();
 
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_LT(base::Time::Now() - service()->GetLastSyncedTime(),
             base::TimeDelta::FromMinutes(1));
   ASSERT_TRUE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
@@ -1353,13 +1423,15 @@
             service()->GetDisableReasons());
   // Since ChromeOS doesn't support signout and so the account is still there
   // and available, Sync will restart in standalone transport mode.
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 #else
   EXPECT_TRUE(signin_manager()->GetAuthenticatedAccountId().empty());
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NOT_SIGNED_IN |
                 syncer::SyncService::DISABLE_REASON_USER_CHOICE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
   EXPECT_TRUE(service()->GetLastSyncedTime().is_null());
   EXPECT_FALSE(service()->GetLocalDeviceInfoProvider()->GetLocalDeviceInfo());
 #endif
@@ -1376,14 +1448,16 @@
   InitializeForNthSync();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 
   prefs()->SetManagedPref(syncer::prefs::kSyncManaged,
                           std::make_unique<base::Value>(true));
 
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::DISABLED, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::DISABLED,
+            service()->GetTransportState());
 
   // Note: If standalone transport is enabled, then setting kSyncManaged to
   // false will immediately start up the engine. Otherwise, the RequestStart
@@ -1394,7 +1468,8 @@
   service()->RequestStart();
   EXPECT_EQ(syncer::SyncService::DISABLE_REASON_NONE,
             service()->GetDisableReasons());
-  EXPECT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
 }
 
 // Test ConfigureDataTypeManagerReason on First and Nth start.
@@ -1411,7 +1486,8 @@
       .WillOnce(ReturnNewFakeDataTypeManager(
           GetRecordingConfigureCalledCallback(&configure_reason)));
   InitializeForFirstSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(component_factory()));
   EXPECT_EQ(syncer::CONFIGURE_REASON_NEW_CLIENT, configure_reason);
   service()->OnConfigureDone(configure_result);
@@ -1428,7 +1504,8 @@
       .WillOnce(ReturnNewFakeDataTypeManager(
           GetRecordingConfigureCalledCallback(&configure_reason)));
   InitializeForNthSync();
-  ASSERT_EQ(syncer::SyncService::State::ACTIVE, service()->GetState());
+  ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE,
+            service()->GetTransportState());
   ASSERT_TRUE(testing::Mock::VerifyAndClearExpectations(component_factory()));
   EXPECT_EQ(syncer::CONFIGURE_REASON_NEWLY_ENABLED_DATA_TYPE, configure_reason);
   service()->OnConfigureDone(configure_result);
diff --git a/components/browser_watcher/watcher_metrics_provider_win.cc b/components/browser_watcher/watcher_metrics_provider_win.cc
index 4ce6cbdf..996f09d7 100644
--- a/components/browser_watcher/watcher_metrics_provider_win.cc
+++ b/components/browser_watcher/watcher_metrics_provider_win.cc
@@ -23,8 +23,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/win/registry.h"
 #include "components/browser_watcher/features.h"
 #include "components/browser_watcher/postmortem_report_collector.h"
diff --git a/components/browsing_data/core/history_notice_utils_unittest.cc b/components/browsing_data/core/history_notice_utils_unittest.cc
index 604f041..106417d 100644
--- a/components/browsing_data/core/history_notice_utils_unittest.cc
+++ b/components/browsing_data/core/history_notice_utils_unittest.cc
@@ -27,9 +27,10 @@
   // Getters (FakeSyncService implementation). ---------------------------------
   int GetDisableReasons() const override { return DISABLE_REASON_NONE; }
 
-  State GetState() const override {
-    return IsFirstSetupComplete() ? State::ACTIVE
-                                  : State::PENDING_DESIRED_CONFIGURATION;
+  TransportState GetTransportState() const override {
+    return IsFirstSetupComplete()
+               ? TransportState::ACTIVE
+               : TransportState::PENDING_DESIRED_CONFIGURATION;
   }
 
   bool IsFirstSetupComplete() const override {
diff --git a/components/cast_channel/cast_socket_service.cc b/components/cast_channel/cast_socket_service.cc
index b8e3e29a..0cc05316 100644
--- a/components/cast_channel/cast_socket_service.cc
+++ b/components/cast_channel/cast_socket_service.cc
@@ -5,7 +5,7 @@
 #include "components/cast_channel/cast_socket_service.h"
 
 #include "base/memory/ptr_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/cast_channel/cast_socket.h"
 #include "components/cast_channel/logger.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/components/cdm/browser/cdm_message_filter_android.cc b/components/cdm/browser/cdm_message_filter_android.cc
index ca4811f2..d43d766 100644
--- a/components/cdm/browser/cdm_message_filter_android.cc
+++ b/components/cdm/browser/cdm_message_filter_android.cc
@@ -11,7 +11,7 @@
 
 #include "base/feature_list.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/cdm/common/cdm_messages_android.h"
 #include "content/public/browser/android/android_overlay_provider.h"
 #include "ipc/ipc_message_macros.h"
diff --git a/components/component_updater/component_installer.cc b/components/component_updater/component_installer.cc
index 82cdb0be..6d343fa3 100644
--- a/components/component_updater/component_installer.cc
+++ b/components/component_updater/component_installer.cc
@@ -16,8 +16,8 @@
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "base/version.h"
diff --git a/components/component_updater/component_installer_unittest.cc b/components/component_updater/component_installer_unittest.cc
index 4650b71..03987aa 100644
--- a/components/component_updater/component_installer_unittest.cc
+++ b/components/component_updater/component_installer_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_path_override.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/component_updater/component_updater_service_unittest.cc b/components/component_updater/component_updater_service_unittest.cc
index 04795d6..42552e6 100644
--- a/components/component_updater/component_updater_service_unittest.cc
+++ b/components/component_updater/component_updater_service_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/component_updater/crl_set_remover.cc b/components/component_updater/crl_set_remover.cc
index eab46f8..2598e7d 100644
--- a/components/component_updater/crl_set_remover.cc
+++ b/components/component_updater/crl_set_remover.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace component_updater {
 
diff --git a/components/consent_auditor/consent_auditor.h b/components/consent_auditor/consent_auditor.h
index 4862a7f..902a9616 100644
--- a/components/consent_auditor/consent_auditor.h
+++ b/components/consent_auditor/consent_auditor.h
@@ -90,7 +90,7 @@
 
   // Returns the underlying Sync integration point.
   virtual base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() = 0;
+  GetControllerDelegate() = 0;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ConsentAuditor);
diff --git a/components/consent_auditor/consent_auditor_impl.cc b/components/consent_auditor/consent_auditor_impl.cc
index 9dc87584..84f2933 100644
--- a/components/consent_auditor/consent_auditor_impl.cc
+++ b/components/consent_auditor/consent_auditor_impl.cc
@@ -311,9 +311,9 @@
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
-ConsentAuditorImpl::GetControllerDelegateOnUIThread() {
+ConsentAuditorImpl::GetControllerDelegate() {
   if (consent_sync_bridge_) {
-    return consent_sync_bridge_->GetControllerDelegateOnUIThread();
+    return consent_sync_bridge_->GetControllerDelegate();
   }
   return base::WeakPtr<syncer::ModelTypeControllerDelegate>();
 }
diff --git a/components/consent_auditor/consent_auditor_impl.h b/components/consent_auditor/consent_auditor_impl.h
index fc0d44b..47d43633 100644
--- a/components/consent_auditor/consent_auditor_impl.h
+++ b/components/consent_auditor/consent_auditor_impl.h
@@ -71,8 +71,8 @@
   void RecordLocalConsent(const std::string& feature,
                           const std::string& description_text,
                           const std::string& confirmation_text) override;
-  base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() override;
+  base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
+      override;
 
  private:
   // Records a consent for |feature| for the signed-in GAIA account with
diff --git a/components/consent_auditor/consent_auditor_impl_unittest.cc b/components/consent_auditor/consent_auditor_impl_unittest.cc
index 0f2a019..08a60f80 100644
--- a/components/consent_auditor/consent_auditor_impl_unittest.cc
+++ b/components/consent_auditor/consent_auditor_impl_unittest.cc
@@ -89,13 +89,13 @@
     recorded_user_consents_.push_back(*specifics);
   }
 
-  base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() override {
+  base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
+      override {
     return delegate_;
   }
 
   // Fake methods.
-  void SetControllerDelegateOnUIThread(
+  void SetControllerDelegate(
       base::WeakPtr<syncer::ModelTypeControllerDelegate> delegate) {
     delegate_ = delegate;
   }
@@ -476,7 +476,7 @@
 
   // There is no bridge (i.e. separate sync type for consents is disabled),
   // thus, there should be no delegate as well.
-  EXPECT_EQ(nullptr, consent_auditor()->GetControllerDelegateOnUIThread());
+  EXPECT_EQ(nullptr, consent_auditor()->GetControllerDelegate());
 }
 
 TEST_F(ConsentAuditorImplTest, ShouldReturnSyncDelegateWhenBridgePresent) {
@@ -487,7 +487,7 @@
       syncer::ModelType::USER_CONSENTS);
   auto expected_delegate_ptr = fake_delegate.GetWeakPtr();
   DCHECK(expected_delegate_ptr);
-  fake_bridge->SetControllerDelegateOnUIThread(expected_delegate_ptr);
+  fake_bridge->SetControllerDelegate(expected_delegate_ptr);
 
   SetConsentSyncBridge(std::move(fake_bridge));
   SetUserEventService(nullptr);
@@ -496,7 +496,7 @@
   // There is a bridge (i.e. separate sync type for consents is enabled), thus,
   // there should be a delegate as well.
   EXPECT_EQ(expected_delegate_ptr.get(),
-            consent_auditor()->GetControllerDelegateOnUIThread().get());
+            consent_auditor()->GetControllerDelegate().get());
 }
 
 }  // namespace consent_auditor
diff --git a/components/consent_auditor/consent_sync_bridge.h b/components/consent_auditor/consent_sync_bridge.h
index 49a2f3a5..b14012d 100644
--- a/components/consent_auditor/consent_sync_bridge.h
+++ b/components/consent_auditor/consent_sync_bridge.h
@@ -22,7 +22,7 @@
 
   // Returns the delegate for the controller, i.e. sync integration point.
   virtual base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() = 0;
+  GetControllerDelegate() = 0;
 };
 
 }  // namespace syncer
diff --git a/components/consent_auditor/consent_sync_bridge_impl.cc b/components/consent_auditor/consent_sync_bridge_impl.cc
index 7d622da..6af59ab1 100644
--- a/components/consent_auditor/consent_sync_bridge_impl.cc
+++ b/components/consent_auditor/consent_sync_bridge_impl.cc
@@ -224,8 +224,8 @@
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
-ConsentSyncBridgeImpl::GetControllerDelegateOnUIThread() {
-  return change_processor()->GetControllerDelegateOnUIThread();
+ConsentSyncBridgeImpl::GetControllerDelegate() {
+  return change_processor()->GetControllerDelegate();
 }
 
 void ConsentSyncBridgeImpl::ProcessQueuedEvents() {
diff --git a/components/consent_auditor/consent_sync_bridge_impl.h b/components/consent_auditor/consent_sync_bridge_impl.h
index 99d9581..cfac5f2 100644
--- a/components/consent_auditor/consent_sync_bridge_impl.h
+++ b/components/consent_auditor/consent_sync_bridge_impl.h
@@ -48,8 +48,8 @@
   // ConsentSyncBridge implementation.
   void RecordConsent(
       std::unique_ptr<sync_pb::UserConsentSpecifics> specifics) override;
-  base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() override;
+  base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
+      override;
 
   static std::string GetStorageKeyFromSpecificsForTest(
       const sync_pb::UserConsentSpecifics& specifics);
diff --git a/components/consent_auditor/fake_consent_auditor.cc b/components/consent_auditor/fake_consent_auditor.cc
index 4f00583..ba4421f 100644
--- a/components/consent_auditor/fake_consent_auditor.cc
+++ b/components/consent_auditor/fake_consent_auditor.cc
@@ -70,7 +70,7 @@
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
-FakeConsentAuditor::GetControllerDelegateOnUIThread() {
+FakeConsentAuditor::GetControllerDelegate() {
   NOTIMPLEMENTED();
   return nullptr;
 }
diff --git a/components/consent_auditor/fake_consent_auditor.h b/components/consent_auditor/fake_consent_auditor.h
index 608e3d83..c1b0d58 100644
--- a/components/consent_auditor/fake_consent_auditor.h
+++ b/components/consent_auditor/fake_consent_auditor.h
@@ -44,8 +44,8 @@
   void RecordLocalConsent(const std::string& feature,
                           const std::string& description_text,
                           const std::string& confirmation_text) override;
-  base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() override;
+  base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
+      override;
 
   // Methods for fake.
   // TODO(markusheintz): Replace the usage of this methods in all tests.
diff --git a/components/crash/content/browser/child_process_crash_observer_android.cc b/components/crash/content/browser/child_process_crash_observer_android.cc
index 95917fc..e235ba3 100644
--- a/components/crash/content/browser/child_process_crash_observer_android.cc
+++ b/components/crash/content/browser/child_process_crash_observer_android.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/crash/content/app/breakpad_linux.h"
 #include "components/crash/content/browser/crash_dump_manager_android.h"
 
diff --git a/components/crash/content/browser/crash_dump_manager_android_unittest.cc b/components/crash/content/browser/crash_dump_manager_android_unittest.cc
index 0680dc40..0b284e1 100644
--- a/components/crash/content/browser/crash_dump_manager_android_unittest.cc
+++ b/components/crash/content/browser/crash_dump_manager_android_unittest.cc
@@ -20,7 +20,7 @@
 #include "base/optional.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/components/crash/content/browser/crash_handler_host_linux.cc b/components/crash/content/browser/crash_handler_host_linux.cc
index 60b51fa..94e39a40 100644
--- a/components/crash/content/browser/crash_handler_host_linux.cc
+++ b/components/crash/content/browser/crash_handler_host_linux.cc
@@ -30,7 +30,7 @@
 #include "base/rand_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/crash/content/browser/crash_metrics_reporter_android.cc b/components/crash/content/browser/crash_metrics_reporter_android.cc
index 8b8e741..7b327ae5 100644
--- a/components/crash/content/browser/crash_metrics_reporter_android.cc
+++ b/components/crash/content/browser/crash_metrics_reporter_android.cc
@@ -253,6 +253,9 @@
     }
     UMA_HISTOGRAM_ENUMERATION(
         "Stability.Android.StrongBindingOomRemainingBindingState", combo);
+    UMA_HISTOGRAM_EXACT_LINEAR(
+        "Stability.Android.StrongBindingOomRemainingStrongBindingCount",
+        info.remaining_process_with_strong_binding, 20);
   }
 
   ReportLegacyCrashUma(info, has_valid_dump);
diff --git a/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc b/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc
index 2f02056..e50a0f7 100644
--- a/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc
+++ b/components/crash/content/browser/crash_metrics_reporter_android_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/cronet/android/cronet_integrated_mode_state.h b/components/cronet/android/cronet_integrated_mode_state.h
index abbe8d5..7d65dc0 100644
--- a/components/cronet/android/cronet_integrated_mode_state.h
+++ b/components/cronet/android/cronet_integrated_mode_state.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_CRONET_ANDROID_CRONET_INTEGRATED_MODE_STATE_H_
 #define COMPONENTS_CRONET_ANDROID_CRONET_INTEGRATED_MODE_STATE_H_
 
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 
 namespace cronet {
 
diff --git a/components/cronet/android/cronet_library_loader.cc b/components/cronet/android/cronet_library_loader.cc
index e757df9..32e507e 100644
--- a/components/cronet/android/cronet_library_loader.cc
+++ b/components/cronet/android/cronet_library_loader.cc
@@ -20,7 +20,7 @@
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "components/cronet/android/buildflags.h"
 #include "components/cronet/cronet_global_state.h"
diff --git a/components/cronet/cronet_global_state_stubs.cc b/components/cronet/cronet_global_state_stubs.cc
index 33eac63..d96d46a 100644
--- a/components/cronet/cronet_global_state_stubs.cc
+++ b/components/cronet/cronet_global_state_stubs.cc
@@ -6,8 +6,8 @@
 
 #include "base/at_exit.h"
 #include "base/feature_list.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/proxy_resolution/proxy_config_service.h"
 #include "net/proxy_resolution/proxy_resolution_service.h"
 #include "url/url_util.h"
diff --git a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc
index cb61cd0..442503f 100644
--- a/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc
+++ b/components/data_reduction_proxy/content/browser/data_reduction_proxy_pingback_client_impl.cc
@@ -12,8 +12,8 @@
 #include "base/optional.h"
 #include "base/rand_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_data.h"
 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_util.h"
diff --git a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
index ec0ec324..7f24293 100644
--- a/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
+++ b/components/data_reduction_proxy/core/browser/data_reduction_proxy_config.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_piece.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "base/task_runner_util.h"
 #include "base/time/default_tick_clock.h"
 #include "build/build_config.h"
diff --git a/components/dom_distiller/standalone/content_extractor_browsertest.cc b/components/dom_distiller/standalone/content_extractor_browsertest.cc
index db22a39..999d6e4 100644
--- a/components/dom_distiller/standalone/content_extractor_browsertest.cc
+++ b/components/dom_distiller/standalone/content_extractor_browsertest.cc
@@ -16,7 +16,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/dom_distiller/content/browser/distiller_javascript_utils.h"
 #include "components/dom_distiller/content/browser/distiller_page_web_contents.h"
diff --git a/components/download/database/download_db_impl.cc b/components/download/database/download_db_impl.cc
index 9cb742a..4db1658a 100644
--- a/components/download/database/download_db_impl.cc
+++ b/components/download/database/download_db_impl.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/download/database/download_db_conversions.h"
 #include "components/download/database/download_db_entry.h"
 #include "components/download/database/proto/download_entry.pb.h"
diff --git a/components/download/database/in_progress/in_progress_cache_impl_unittest.cc b/components/download/database/in_progress/in_progress_cache_impl_unittest.cc
index f9d7331..ac54cda 100644
--- a/components/download/database/in_progress/in_progress_cache_impl_unittest.cc
+++ b/components/download/database/in_progress/in_progress_cache_impl_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/bind_helpers.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/download/public/common/download_url_parameters.h"
diff --git a/components/download/internal/common/download_task_runner.cc b/components/download/internal/common/download_task_runner.cc
index d0bc731..27bfc6f 100644
--- a/components/download/internal/common/download_task_runner.cc
+++ b/components/download/internal/common/download_task_runner.cc
@@ -8,7 +8,7 @@
 #include "base/no_destructor.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/lock.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "build/build_config.h"
 
 namespace download {
diff --git a/components/download/internal/common/in_progress_download_manager.cc b/components/download/internal/common/in_progress_download_manager.cc
index 55519c67..e51414c 100644
--- a/components/download/internal/common/in_progress_download_manager.cc
+++ b/components/download/internal/common/in_progress_download_manager.cc
@@ -6,7 +6,7 @@
 
 #include "base/command_line.h"
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/download/database/download_db_entry.h"
 #include "components/download/database/download_db_impl.h"
diff --git a/components/drive/file_system/operation_test_base.cc b/components/drive/file_system/operation_test_base.cc
index 23ac87a..5fa0300 100644
--- a/components/drive/file_system/operation_test_base.cc
+++ b/components/drive/file_system/operation_test_base.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/drive/chromeos/about_resource_loader.h"
 #include "components/drive/chromeos/about_resource_root_folder_id_loader.h"
 #include "components/drive/chromeos/change_list_loader.h"
diff --git a/components/drive/file_write_watcher_unittest.cc b/components/drive/file_write_watcher_unittest.cc
index 473e14e..a3ddbf5 100644
--- a/components/drive/file_write_watcher_unittest.cc
+++ b/components/drive/file_write_watcher_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/exo/client_controlled_shell_surface.cc b/components/exo/client_controlled_shell_surface.cc
index 99783f9d..5f40dbe 100644
--- a/components/exo/client_controlled_shell_surface.cc
+++ b/components/exo/client_controlled_shell_surface.cc
@@ -511,7 +511,7 @@
 
     // The client's geometry uses fullscreen in client controlled,
     // (but the surface is placed under the frame), so just use
-    // the window bounds instead for maximixed stte.
+    // the window bounds instead for maximixed state.
     gfx::Rect client_bounds =
         widget_->IsMaximized()
             ? window_bounds
@@ -615,7 +615,6 @@
 
 void ClientControlledShellSurface::OnSetFrame(SurfaceFrameType type) {
   ShellSurfaceBase::OnSetFrame(type);
-  frame_type_ = type;
   UpdateAutoHideFrame();
 }
 
@@ -908,8 +907,9 @@
 // ClientControlledShellSurface, private:
 
 void ClientControlledShellSurface::UpdateFrame() {
-  if (!widget_ || !GetFrameView()->visible())
+  if (!widget_)
     return;
+
   gfx::Rect work_area =
       display::Screen::GetScreen()
           ->GetDisplayNearestWindow(widget_->GetNativeWindow())
@@ -955,11 +955,11 @@
 
 void ClientControlledShellSurface::UpdateBackdrop() {
   aura::Window* window = widget_->GetNativeWindow();
-  const display::Display display =
-      display::Screen::GetScreen()->GetDisplayNearestWindow(window);
-  bool enable_backdrop =
-      (widget_->IsFullscreen() || widget_->IsMaximized()) &&
-      !widget_->GetWindowBoundsInScreen().Contains(display.work_area());
+
+  // Always create a backdrop regardless of the geometry because
+  // maximized/fullscreen widget's geometry can be cropped.
+  bool enable_backdrop = (widget_->IsFullscreen() || widget_->IsMaximized());
+
   ash::BackdropWindowMode target_backdrop_mode =
       enable_backdrop ? ash::BackdropWindowMode::kEnabled
                       : ash::BackdropWindowMode::kAuto;
diff --git a/components/exo/client_controlled_shell_surface_unittest.cc b/components/exo/client_controlled_shell_surface_unittest.cc
index f34784f..c440cdc 100644
--- a/components/exo/client_controlled_shell_surface_unittest.cc
+++ b/components/exo/client_controlled_shell_surface_unittest.cc
@@ -18,7 +18,9 @@
 #include "ash/system/tray/system_tray.h"
 #include "ash/system/unified/unified_system_tray.h"
 #include "ash/wm/drag_window_resizer.h"
+#include "ash/wm/overview/window_selector_controller.h"
 #include "ash/wm/splitview/split_view_controller.h"
+#include "ash/wm/tablet_mode/tablet_mode_app_window_drag_controller.h"
 #include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "ash/wm/window_positioning_utils.h"
 #include "ash/wm/window_resizer.h"
@@ -26,8 +28,9 @@
 #include "ash/wm/window_util.h"
 #include "ash/wm/wm_event.h"
 #include "ash/wm/workspace_controller_test_api.h"
-#include "base/debug/stack_trace.h"
+#include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "cc/paint/display_item_list.h"
 #include "components/exo/buffer.h"
 #include "components/exo/display.h"
@@ -39,6 +42,7 @@
 #include "components/exo/wm_helper.h"
 #include "third_party/skia/include/utils/SkNoDrawCanvas.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/aura/env.h"
 #include "ui/aura/window.h"
 #include "ui/aura/window_event_dispatcher.h"
 #include "ui/aura/window_tree_host.h"
@@ -518,6 +522,7 @@
 
   // AutoHide
   surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
   EXPECT_TRUE(frame_view->visible());
   EXPECT_EQ(fullscreen_bounds, widget->GetWindowBoundsInScreen());
   EXPECT_EQ(fullscreen_bounds,
@@ -550,6 +555,73 @@
   EXPECT_EQ(client_bounds, widget->GetWindowBoundsInScreen());
   EXPECT_EQ(client_bounds,
             frame_view->GetClientBoundsForWindowBounds(client_bounds));
+
+  // Test NONE -> AUTOHIDE -> NONE
+  shell_surface->SetMaximized();
+  shell_surface->SetGeometry(fullscreen_bounds);
+  surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
+  EXPECT_TRUE(frame_view->visible());
+  EXPECT_TRUE(frame_view->GetHeaderView()->in_immersive_mode());
+  surface->SetFrame(SurfaceFrameType::NONE);
+  surface->Commit();
+  EXPECT_FALSE(frame_view->visible());
+  EXPECT_FALSE(frame_view->GetHeaderView()->in_immersive_mode());
+}
+
+namespace {
+
+class TestEventHandler : public ui::EventHandler {
+ public:
+  TestEventHandler() = default;
+  ~TestEventHandler() override = default;
+
+  // ui::EventHandler:
+  void OnMouseEvent(ui::MouseEvent* event) override { received_event_ = true; }
+
+  bool received_event() const { return received_event_; }
+
+ private:
+  bool received_event_ = false;
+  DISALLOW_COPY_AND_ASSIGN(TestEventHandler);
+};
+
+}  // namespace
+
+TEST_F(ClientControlledShellSurfaceTest, NoSynthesizedEventOnFrameChange) {
+  UpdateDisplay("800x600");
+
+  gfx::Size buffer_size(256, 256);
+  std::unique_ptr<Buffer> buffer(
+      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(buffer_size)));
+  std::unique_ptr<Surface> surface(new Surface);
+
+  gfx::Rect fullscreen_bounds(0, 0, 800, 600);
+
+  auto shell_surface =
+      exo_test_helper()->CreateClientControlledShellSurface(surface.get());
+  surface->Attach(buffer.get());
+  surface->SetFrame(SurfaceFrameType::NORMAL);
+  surface->Commit();
+
+  // Maximized
+  shell_surface->SetMaximized();
+  shell_surface->SetGeometry(fullscreen_bounds);
+  surface->Commit();
+
+  // AutoHide
+  base::RunLoop().RunUntilIdle();
+  auto* env = aura::Env::GetInstance();
+  gfx::Rect cropped_fullscreen_bounds(0, 0, 800, 400);
+  env->SetLastMouseLocation(gfx::Point(100, 100));
+  TestEventHandler handler;
+  env->AddPreTargetHandler(&handler);
+  surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  shell_surface->SetGeometry(cropped_fullscreen_bounds);
+  surface->Commit();
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(handler.received_event());
+  env->RemovePreTargetHandler(&handler);
 }
 
 TEST_F(ClientControlledShellSurfaceTest, CompositorLockInRotation) {
@@ -689,11 +761,11 @@
   EXPECT_TRUE(HasBackdrop());
   EXPECT_TRUE(shell_surface->GetWidget()->IsMaximized());
 
-  // Enable backdrop only if the shell surface doesn't cover the display.
+  // We always show backdrop because the window may be cropped.
   display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
   shell_surface->SetGeometry(display.bounds());
   surface->Commit();
-  EXPECT_FALSE(HasBackdrop());
+  EXPECT_TRUE(HasBackdrop());
 
   shell_surface->SetGeometry(gfx::Rect(0, 0, 100, display.bounds().height()));
   surface->Commit();
@@ -752,11 +824,11 @@
   surface->Commit();
   EXPECT_TRUE(HasBackdrop());
 
-  // Enable backdrop only if the shell surface doesn't cover the display.
+  // We always show backdrop becaues the window can be cropped.
   display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
   shell_surface->SetGeometry(display.bounds());
   surface->Commit();
-  EXPECT_FALSE(HasBackdrop());
+  EXPECT_TRUE(HasBackdrop());
 
   shell_surface->SetGeometry(gfx::Rect(0, 0, 100, display.bounds().height()));
   surface->Commit();
@@ -1064,6 +1136,65 @@
   ASSERT_FALSE(window_state->is_dragged());
 }
 
+// Test the functionalities of dragging a window from top in tablet mode.
+TEST_F(ClientControlledShellSurfaceTest, DragWindowFromTopInTabletMode) {
+  UpdateDisplay("800x600");
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(ash::features::kDragAppsInTabletMode);
+  ash::Shell* shell = ash::Shell::Get();
+  shell->tablet_mode_controller()->EnableTabletModeWindowManager(true);
+  std::unique_ptr<Surface> surface(new Surface());
+  const gfx::Size window_size(800, 552);
+  std::unique_ptr<Buffer> buffer(
+      new Buffer(exo_test_helper()->CreateGpuMemoryBuffer(window_size)));
+  auto shell_surface =
+      exo_test_helper()->CreateClientControlledShellSurface(surface.get());
+  shell_surface->SetMaximized();
+  surface->Attach(buffer.get());
+  shell_surface->SetGeometry(gfx::Rect(window_size));
+  surface->Commit();
+
+  aura::Window* window = shell_surface->GetWidget()->GetNativeWindow();
+  ASSERT_TRUE(ash::wm::GetWindowState(window)->IsMaximized());
+  surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
+  ui::test::EventGenerator* event_generator = GetEventGenerator();
+
+  // Drag the window by a small amount of distance will maximize the window
+  // again.
+  const gfx::Point start(0, 0);
+  gfx::Point end(0, 10);
+  event_generator->GestureScrollSequence(
+      start, end, base::TimeDelta::FromMilliseconds(100), 2);
+  EXPECT_TRUE(ash::wm::GetWindowState(window)->IsMaximized());
+
+  // FLING the window with large veloicty (larger than
+  // kFlingToOverviewThreshold) will drop the window into overview.
+  EXPECT_FALSE(shell->window_selector_controller()->IsSelecting());
+  end = gfx::Point(0, 210);
+  const base::TimeDelta duration =
+      event_generator->CalculateScrollDurationForFlingVelocity(
+          start, end,
+          ash::TabletModeAppWindowDragController::kFlingToOverviewThreshold +
+              10.f,
+          200);
+  event_generator->GestureScrollSequence(start, end, duration, 200);
+  EXPECT_TRUE(shell->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(shell->window_selector_controller()
+                  ->window_selector()
+                  ->IsWindowInOverview(window));
+
+  // Drag the window long enough (pass one fourth of the screen vertical
+  // height) to snap the window to splitscreen.
+  shell->window_selector_controller()->ToggleOverview();
+  EXPECT_FALSE(shell->window_selector_controller()->IsSelecting());
+  EXPECT_TRUE(ash::wm::GetWindowState(window)->IsMaximized());
+  event_generator->GestureScrollSequence(
+      start, end, base::TimeDelta::FromMilliseconds(100), 20);
+  EXPECT_EQ(ash::wm::GetWindowState(window)->GetStateType(),
+            ash::mojom::WindowStateType::LEFT_SNAPPED);
+}
+
 namespace {
 
 class ClientControlledShellSurfaceDisplayTest : public test::ExoTestBase {
@@ -1364,12 +1495,22 @@
   ASSERT_TRUE(wide_frame);
   EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
 
-  // Set AutoHide mode.
+  // Test AUTOHIDE -> NORMAL
   surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
   EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
 
-  // Exit AutoHide mode.
   surface->SetFrame(SurfaceFrameType::NORMAL);
+  surface->Commit();
+  EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
+
+  // Test AUTOHIDE -> NONE
+  surface->SetFrame(SurfaceFrameType::AUTOHIDE);
+  surface->Commit();
+  EXPECT_TRUE(wide_frame->header_view()->in_immersive_mode());
+
+  surface->SetFrame(SurfaceFrameType::NONE);
+  surface->Commit();
   EXPECT_FALSE(wide_frame->header_view()->in_immersive_mode());
 
   // Unmaximize it and the frame should be normal.
diff --git a/components/exo/data_offer.cc b/components/exo/data_offer.cc
index 9e6aea5f2..927f001d 100644
--- a/components/exo/data_offer.cc
+++ b/components/exo/data_offer.cc
@@ -8,7 +8,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/pickle.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/exo/data_offer_delegate.h"
 #include "components/exo/data_offer_observer.h"
 #include "components/exo/file_helper.h"
diff --git a/components/exo/data_source.cc b/components/exo/data_source.cc
index 820e08e..0cf1cae 100644
--- a/components/exo/data_source.cc
+++ b/components/exo/data_source.cc
@@ -5,7 +5,7 @@
 #include "components/exo/data_source.h"
 
 #include "base/posix/eintr_wrapper.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/exo/data_source_delegate.h"
 #include "components/exo/data_source_observer.h"
 
diff --git a/components/exo/seat_unittest.cc b/components/exo/seat_unittest.cc
index e6c0ff19..3ee2cb0 100644
--- a/components/exo/seat_unittest.cc
+++ b/components/exo/seat_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "components/exo/data_source.h"
 #include "components/exo/data_source_delegate.h"
 #include "components/exo/seat_observer.h"
diff --git a/components/favicon/content/content_favicon_driver.cc b/components/favicon/content/content_favicon_driver.cc
index d31110e..d26aebf 100644
--- a/components/favicon/content/content_favicon_driver.cc
+++ b/components/favicon/content/content_favicon_driver.cc
@@ -9,7 +9,6 @@
 #include "components/favicon/content/favicon_url_util.h"
 #include "components/favicon/core/favicon_service.h"
 #include "components/favicon/core/favicon_url.h"
-#include "components/history/core/browser/history_service.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/favicon_status.h"
 #include "content/public/browser/navigation_controller.h"
@@ -40,14 +39,13 @@
 // static
 void ContentFaviconDriver::CreateForWebContents(
     content::WebContents* web_contents,
-    FaviconService* favicon_service,
-    history::HistoryService* history_service) {
+    FaviconService* favicon_service) {
   if (FromWebContents(web_contents))
     return;
 
-  web_contents->SetUserData(
-      UserDataKey(), base::WrapUnique(new ContentFaviconDriver(
-                         web_contents, favicon_service, history_service)));
+  web_contents->SetUserData(UserDataKey(),
+                            base::WrapUnique(new ContentFaviconDriver(
+                                web_contents, favicon_service)));
 }
 
 void ContentFaviconDriver::SaveFaviconEvenIfInIncognito() {
@@ -58,10 +56,8 @@
 
   // Make sure the page is in history, otherwise adding the favicon does
   // nothing.
-  if (!history_service())
-    return;
   GURL page_url = entry->GetURL();
-  history_service()->AddPageNoVisitForBookmark(page_url, entry->GetTitle());
+  favicon_service()->AddPageNoVisitForBookmark(page_url, entry->GetTitle());
 
   const content::FaviconStatus& favicon_status = entry->GetFavicon();
   if (!favicon_service() || !favicon_status.valid ||
@@ -109,12 +105,10 @@
   return entry ? entry->GetURL() : GURL();
 }
 
-ContentFaviconDriver::ContentFaviconDriver(
-    content::WebContents* web_contents,
-    FaviconService* favicon_service,
-    history::HistoryService* history_service)
+ContentFaviconDriver::ContentFaviconDriver(content::WebContents* web_contents,
+                                           FaviconService* favicon_service)
     : content::WebContentsObserver(web_contents),
-      FaviconDriverImpl(favicon_service, history_service),
+      FaviconDriverImpl(favicon_service),
       document_on_load_completed_(false) {}
 
 ContentFaviconDriver::~ContentFaviconDriver() {
diff --git a/components/favicon/content/content_favicon_driver.h b/components/favicon/content/content_favicon_driver.h
index 427943e..94b955d 100644
--- a/components/favicon/content/content_favicon_driver.h
+++ b/components/favicon/content/content_favicon_driver.h
@@ -34,8 +34,7 @@
   ~ContentFaviconDriver() override;
 
   static void CreateForWebContents(content::WebContents* web_contents,
-                                   FaviconService* favicon_service,
-                                   history::HistoryService* history_service);
+                                   FaviconService* favicon_service);
 
   // Returns the current tab's favicon URLs. If this is empty,
   // DidUpdateFaviconURL has not yet been called for the current navigation.
@@ -54,8 +53,7 @@
 
  protected:
   ContentFaviconDriver(content::WebContents* web_contents,
-                       FaviconService* favicon_service,
-                       history::HistoryService* history_service);
+                       FaviconService* favicon_service);
 
  private:
   friend class content::WebContentsUserData<ContentFaviconDriver>;
diff --git a/components/favicon/content/content_favicon_driver_unittest.cc b/components/favicon/content/content_favicon_driver_unittest.cc
index 77f04397..3d4d6156 100644
--- a/components/favicon/content/content_favicon_driver_unittest.cc
+++ b/components/favicon/content/content_favicon_driver_unittest.cc
@@ -52,7 +52,7 @@
     RenderViewHostTestHarness::SetUp();
 
     ContentFaviconDriver::CreateForWebContents(web_contents(),
-                                               &favicon_service_, nullptr);
+                                               &favicon_service_);
   }
 
   content::WebContentsTester* web_contents_tester() {
diff --git a/components/favicon/core/favicon_driver_impl.cc b/components/favicon/core/favicon_driver_impl.cc
index 74ba6c7e0..c9d37aa 100644
--- a/components/favicon/core/favicon_driver_impl.cc
+++ b/components/favicon/core/favicon_driver_impl.cc
@@ -14,7 +14,6 @@
 #include "components/favicon/core/favicon_handler.h"
 #include "components/favicon/core/favicon_service.h"
 #include "components/favicon/core/favicon_url.h"
-#include "components/history/core/browser/history_service.h"
 
 namespace favicon {
 namespace {
@@ -27,9 +26,8 @@
 
 }  // namespace
 
-FaviconDriverImpl::FaviconDriverImpl(FaviconService* favicon_service,
-                                     history::HistoryService* history_service)
-    : favicon_service_(favicon_service), history_service_(history_service) {
+FaviconDriverImpl::FaviconDriverImpl(FaviconService* favicon_service)
+    : favicon_service_(favicon_service) {
   if (!favicon_service_)
     return;
 
diff --git a/components/favicon/core/favicon_driver_impl.h b/components/favicon/core/favicon_driver_impl.h
index 35dc08f6..a7bf33d 100644
--- a/components/favicon/core/favicon_driver_impl.h
+++ b/components/favicon/core/favicon_driver_impl.h
@@ -14,10 +14,6 @@
 
 class GURL;
 
-namespace history {
-class HistoryService;
-}
-
 namespace favicon {
 
 class FaviconService;
@@ -41,8 +37,7 @@
   bool HasPendingTasksForTest();
 
  protected:
-  FaviconDriverImpl(FaviconService* favicon_service,
-                    history::HistoryService* history_service);
+  explicit FaviconDriverImpl(FaviconService* favicon_service);
   ~FaviconDriverImpl() override;
 
   // Informs FaviconService that the favicon for |url| is out of date. If
@@ -56,15 +51,12 @@
                           const GURL& manifest_url);
 
  protected:
-  history::HistoryService* history_service() { return history_service_; }
-
   FaviconService* favicon_service() { return favicon_service_; }
 
  private:
-  // KeyedServices used by FaviconDriverImpl. They may be null during testing,
-  // but if they are defined, they must outlive the FaviconDriverImpl.
+  // KeyedService used by FaviconDriverImpl. It may be null during testing,
+  // but if it is defined, it must outlive the FaviconDriverImpl.
   FaviconService* favicon_service_;
-  history::HistoryService* history_service_;
 
   // FaviconHandlers used to download the different kind of favicons.
   std::vector<std::unique_ptr<FaviconHandler>> handlers_;
diff --git a/components/favicon/core/favicon_service.h b/components/favicon/core/favicon_service.h
index e91ef9d..342fb987 100644
--- a/components/favicon/core/favicon_service.h
+++ b/components/favicon/core/favicon_service.h
@@ -165,6 +165,11 @@
   virtual void SetImportedFavicons(
       const favicon_base::FaviconUsageDataList& favicon_usage) = 0;
 
+  // See HistoryService::AddPageNoVisitForBookmark(). Adds an entry for the
+  // specified url in the history service without creating a visit.
+  virtual void AddPageNoVisitForBookmark(const GURL& url,
+                                         const base::string16& title) = 0;
+
   // Set the favicon for |page_url| for |icon_type| in the thumbnail database.
   // Unlike SetFavicons(), this method will not delete preexisting bitmap data
   // which is associated to |page_url| if at all possible. Use this method if
diff --git a/components/favicon/core/favicon_service_impl.cc b/components/favicon/core/favicon_service_impl.cc
index 225205b..5689d76 100644
--- a/components/favicon/core/favicon_service_impl.cc
+++ b/components/favicon/core/favicon_service_impl.cc
@@ -224,6 +224,12 @@
   history_service_->SetImportedFavicons(favicon_usage);
 }
 
+void FaviconServiceImpl::AddPageNoVisitForBookmark(
+    const GURL& url,
+    const base::string16& title) {
+  history_service_->AddPageNoVisitForBookmark(url, title);
+}
+
 void FaviconServiceImpl::MergeFavicon(
     const GURL& page_url,
     const GURL& icon_url,
diff --git a/components/favicon/core/favicon_service_impl.h b/components/favicon/core/favicon_service_impl.h
index 3763665..8e49d4f6 100644
--- a/components/favicon/core/favicon_service_impl.h
+++ b/components/favicon/core/favicon_service_impl.h
@@ -98,6 +98,8 @@
   void TouchOnDemandFavicon(const GURL& icon_url) override;
   void SetImportedFavicons(
       const favicon_base::FaviconUsageDataList& favicon_usage) override;
+  void AddPageNoVisitForBookmark(const GURL& url,
+                                 const base::string16& title) override;
   void MergeFavicon(const GURL& page_url,
                     const GURL& icon_url,
                     favicon_base::IconType icon_type,
diff --git a/components/favicon/core/large_icon_service.cc b/components/favicon/core/large_icon_service.cc
index d2386f4..5501af9 100644
--- a/components/favicon/core/large_icon_service.cc
+++ b/components/favicon/core/large_icon_service.cc
@@ -20,7 +20,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
diff --git a/components/favicon/core/test/mock_favicon_service.h b/components/favicon/core/test/mock_favicon_service.h
index d7146cb0..8d4b504f 100644
--- a/components/favicon/core/test/mock_favicon_service.h
+++ b/components/favicon/core/test/mock_favicon_service.h
@@ -97,6 +97,8 @@
   MOCK_METHOD1(TouchOnDemandFavicon, void(const GURL& icon_url));
   MOCK_METHOD1(SetImportedFavicons,
                void(const favicon_base::FaviconUsageDataList& favicon_usage));
+  MOCK_METHOD2(AddPageNoVisitForBookmark,
+               void(const GURL& url, const base::string16& title));
   MOCK_METHOD5(MergeFavicon,
                void(const GURL& page_url,
                     const GURL& icon_url,
diff --git a/components/favicon/ios/web_favicon_driver.h b/components/favicon/ios/web_favicon_driver.h
index 482a954..400f83a 100644
--- a/components/favicon/ios/web_favicon_driver.h
+++ b/components/favicon/ios/web_favicon_driver.h
@@ -27,8 +27,7 @@
   ~WebFaviconDriver() override;
 
   static void CreateForWebState(web::WebState* web_state,
-                                FaviconService* favicon_service,
-                                history::HistoryService* history_service);
+                                FaviconService* favicon_service);
 
   // FaviconDriver implementation.
   gfx::Image GetFavicon() const override;
@@ -55,9 +54,7 @@
  private:
   friend class web::WebStateUserData<WebFaviconDriver>;
 
-  WebFaviconDriver(web::WebState* web_state,
-                   FaviconService* favicon_service,
-                   history::HistoryService* history_service);
+  WebFaviconDriver(web::WebState* web_state, FaviconService* favicon_service);
 
   // web::WebStateObserver implementation.
   void DidFinishNavigation(web::WebState* web_state,
diff --git a/components/favicon/ios/web_favicon_driver.mm b/components/favicon/ios/web_favicon_driver.mm
index 9b708fff..f33ffa2 100644
--- a/components/favicon/ios/web_favicon_driver.mm
+++ b/components/favicon/ios/web_favicon_driver.mm
@@ -37,16 +37,13 @@
 namespace favicon {
 
 // static
-void WebFaviconDriver::CreateForWebState(
-    web::WebState* web_state,
-    FaviconService* favicon_service,
-    history::HistoryService* history_service) {
+void WebFaviconDriver::CreateForWebState(web::WebState* web_state,
+                                         FaviconService* favicon_service) {
   if (FromWebState(web_state))
     return;
 
-  web_state->SetUserData(UserDataKey(),
-                         base::WrapUnique(new WebFaviconDriver(
-                             web_state, favicon_service, history_service)));
+  web_state->SetUserData(UserDataKey(), base::WrapUnique(new WebFaviconDriver(
+                                            web_state, favicon_service)));
 }
 
 gfx::Image WebFaviconDriver::GetFavicon() const {
@@ -152,9 +149,8 @@
 }
 
 WebFaviconDriver::WebFaviconDriver(web::WebState* web_state,
-                                   FaviconService* favicon_service,
-                                   history::HistoryService* history_service)
-    : FaviconDriverImpl(favicon_service, history_service),
+                                   FaviconService* favicon_service)
+    : FaviconDriverImpl(favicon_service),
       image_fetcher_(web_state->GetBrowserState()->GetSharedURLLoaderFactory()),
       web_state_(web_state) {
   web_state_->AddObserver(this);
diff --git a/components/feed/core/feed_image_database.cc b/components/feed/core/feed_image_database.cc
index 54bb219f..358e946 100644
--- a/components/feed/core/feed_image_database.cc
+++ b/components/feed/core/feed_image_database.cc
@@ -8,8 +8,8 @@
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "components/feed/core/proto/cached_image.pb.h"
diff --git a/components/feed/core/feed_storage_database.cc b/components/feed/core/feed_storage_database.cc
index c5f0cfa..4ea3da4 100644
--- a/components/feed/core/feed_storage_database.cc
+++ b/components/feed/core/feed_storage_database.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/feed/core/proto/feed_storage.pb.h"
 #include "components/leveldb_proto/proto_database_impl.h"
 
diff --git a/components/feedback/anonymizer_tool.cc b/components/feedback/anonymizer_tool.cc
index f9f1fd6..1d5c7933 100644
--- a/components/feedback/anonymizer_tool.cc
+++ b/components/feedback/anonymizer_tool.cc
@@ -55,6 +55,9 @@
 
     // Serial numbers
     "(?i-s)(serial\\s*(?:number)?\\s*[:=]\\s*)([0-9a-zA-Z\\-\"]+)()",
+
+    // usbguard-daemon
+    "(?-s)(usbguard-daemon.* serial \")(.*)(\" name \")",
 };
 
 // Helper macro: Non capturing group
diff --git a/components/feedback/anonymizer_tool_unittest.cc b/components/feedback/anonymizer_tool_unittest.cc
index ef800ba..2333a77 100644
--- a/components/feedback/anonymizer_tool_unittest.cc
+++ b/components/feedback/anonymizer_tool_unittest.cc
@@ -165,6 +165,25 @@
   // Test that "Android:" is not considered a schema with empty hier part.
   EXPECT_EQ("The following applies to Android:",
             AnonymizeCustomPatterns("The following applies to Android:"));
+
+  EXPECT_EQ(
+      "2000-01-01T01:00:00.123456-00:00 NOTICE usbguard-daemon[5000]: uid=0 "
+      "pid=5000 result='SUCCESS' device.rule='block id 13fe:5500 serial "
+      "\"1\" name \"Patriot Memory\" hash "
+      "\"nrP2FU5Q0KDHJvqT4OFjvpA4Mu/ITEF+fMCMuXsTBs4=\" parent-hash "
+      "\"++ZNvxSmqWP6SLayt9yJSIHqUn0PKkvTNT/TVw0OKDE=\" via-port \"2-5\" "
+      "with-interface 08:06:50' target.old='block' "
+      "device.system_name='/devices/pci0000:00/0000:00:15.0/usb2/2-5' "
+      "target.new='block' type='Policy.Device.Update'",
+      AnonymizeCustomPatterns(
+          "2000-01-01T01:00:00.123456-00:00 NOTICE usbguard-daemon[5000]: "
+          "uid=0 pid=5000 result='SUCCESS' device.rule='block id 13fe:5500 "
+          "serial \"0609911A1Z199991\" name \"Patriot Memory\" hash "
+          "\"nrP2FU5Q0KDHJvqT4OFjvpA4Mu/ITEF+fMCMuXsTBs4=\" parent-hash "
+          "\"++ZNvxSmqWP6SLayt9yJSIHqUn0PKkvTNT/TVw0OKDE=\" via-port \"2-5\" "
+          "with-interface 08:06:50' target.old='block' "
+          "device.system_name='/devices/pci0000:00/0000:00:15.0/usb2/2-5' "
+          "target.new='block' type='Policy.Device.Update'"));
 }
 
 TEST_F(AnonymizerToolTest, AnonymizeCustomPatternWithContext) {
diff --git a/components/feedback/feedback_data.cc b/components/feedback/feedback_data.cc
index ac87ee8..824d35b 100644
--- a/components/feedback/feedback_data.cc
+++ b/components/feedback/feedback_data.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "components/feedback/feedback_util.h"
 #include "components/feedback/proto/extension.pb.h"
diff --git a/components/feedback/feedback_uploader_dispatch_unittest.cc b/components/feedback/feedback_uploader_dispatch_unittest.cc
index 7dcffad..7e5186d 100644
--- a/components/feedback/feedback_uploader_dispatch_unittest.cc
+++ b/components/feedback/feedback_uploader_dispatch_unittest.cc
@@ -9,8 +9,8 @@
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/bind_test_util.h"
 #include "components/feedback/feedback_uploader_factory.h"
 #include "components/variations/variations_associated_data.h"
diff --git a/components/feedback/feedback_uploader_factory.cc b/components/feedback/feedback_uploader_factory.cc
index a5ee9bd..18788074 100644
--- a/components/feedback/feedback_uploader_factory.cc
+++ b/components/feedback/feedback_uploader_factory.cc
@@ -6,8 +6,8 @@
 
 #include "base/memory/singleton.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "components/feedback/feedback_uploader.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "content/public/browser/browser_context.h"
diff --git a/components/feedback/feedback_uploader_unittest.cc b/components/feedback/feedback_uploader_unittest.cc
index e8f858c..7fa32c2 100644
--- a/components/feedback/feedback_uploader_unittest.cc
+++ b/components/feedback/feedback_uploader_unittest.cc
@@ -11,8 +11,8 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/feedback/feedback_report.h"
 #include "components/feedback/feedback_uploader_factory.h"
diff --git a/components/feedback/system_logs/system_logs_fetcher.cc b/components/feedback/system_logs/system_logs_fetcher.cc
index ce9dd857..efeba4b 100644
--- a/components/feedback/system_logs/system_logs_fetcher.cc
+++ b/components/feedback/system_logs/system_logs_fetcher.cc
@@ -9,8 +9,8 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "content/public/browser/browser_thread.h"
 
 using content::BrowserThread;
diff --git a/components/flags_ui/resources/flags.html b/components/flags_ui/resources/flags.html
index 6331741..ab34618 100644
--- a/components/flags_ui/resources/flags.html
+++ b/components/flags_ui/resources/flags.html
@@ -23,7 +23,7 @@
   <div class="flex-container">
     <div class="flex">
       <div class="search-container">
-        <input type="text" id="search" placeholder="Search flags" tabindex="1">
+        <input type="text" id="search" placeholder="Search flags" tabindex="1" autocomplete="search">
         <button class="clear-search" title="Clear search" tabindex="2"></button>
       </div>
     </div>
diff --git a/components/heap_profiling/test_driver.cc b/components/heap_profiling/test_driver.cc
index df45463..acc8d3e 100644
--- a/components/heap_profiling/test_driver.cc
+++ b/components/heap_profiling/test_driver.cc
@@ -13,7 +13,7 @@
 #include "base/process/process_handle.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "base/trace_event/heap_profiler_event_filter.h"
 #include "base/values.h"
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index 95f41c8f..11bdcca7 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -1134,8 +1134,7 @@
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
 HistoryBackend::GetTypedURLSyncControllerDelegate() {
   DCHECK(typed_url_sync_bridge_);
-  return typed_url_sync_bridge_->change_processor()
-      ->GetControllerDelegateOnUIThread();
+  return typed_url_sync_bridge_->change_processor()->GetControllerDelegate();
 }
 
 // Statistics ------------------------------------------------------------------
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
index d4fa6b0..6c41106 100644
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.cc
@@ -28,7 +28,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/history/core/browser/top_sites_backend.cc b/components/history/core/browser/top_sites_backend.cc
index b0fed11..aa7cfd6 100644
--- a/components/history/core/browser/top_sites_backend.cc
+++ b/components/history/core/browser/top_sites_backend.cc
@@ -14,8 +14,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task/cancelable_task_tracker.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "components/history/core/browser/top_sites_database.h"
diff --git a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm
index a0351be..a5ce3ea 100644
--- a/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm
+++ b/components/image_fetcher/ios/ios_image_data_fetcher_wrapper.mm
@@ -5,7 +5,7 @@
 #import "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #import "components/image_fetcher/ios/webp_decoder.h"
 #include "net/http/http_response_headers.h"
 #include "net/http/http_status_code.h"
diff --git a/components/image_fetcher/ios/ios_image_decoder_impl.mm b/components/image_fetcher/ios/ios_image_decoder_impl.mm
index ff955c50..af4fc56 100644
--- a/components/image_fetcher/ios/ios_image_decoder_impl.mm
+++ b/components/image_fetcher/ios/ios_image_decoder_impl.mm
@@ -12,7 +12,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #import "components/image_fetcher/ios/webp_decoder.h"
 #include "ios/web/public/web_thread.h"
 #include "ui/gfx/geometry/size.h"
diff --git a/components/invalidation/impl/fcm_network_handler.cc b/components/invalidation/impl/fcm_network_handler.cc
index 55aeb3ca..53445d8 100644
--- a/components/invalidation/impl/fcm_network_handler.cc
+++ b/components/invalidation/impl/fcm_network_handler.cc
@@ -7,7 +7,7 @@
 #include "base/base64url.h"
 #include "base/callback.h"
 #include "base/observer_list.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/gcm_driver/gcm_driver.h"
 #include "components/gcm_driver/gcm_profile_service.h"
diff --git a/components/language/content/browser/geo_language_provider.cc b/components/language/content/browser/geo_language_provider.cc
index 1166ec0..19ed2c5f 100644
--- a/components/language/content/browser/geo_language_provider.cc
+++ b/components/language/content/browser/geo_language_provider.cc
@@ -5,7 +5,7 @@
 #include "components/language/content/browser/geo_language_provider.h"
 
 #include "base/memory/singleton.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "services/device/public/mojom/constants.mojom.h"
diff --git a/components/login/secure_module_util_chromeos.cc b/components/login/secure_module_util_chromeos.cc
index d6dfca4..58aa44b2 100644
--- a/components/login/secure_module_util_chromeos.cc
+++ b/components/login/secure_module_util_chromeos.cc
@@ -8,7 +8,7 @@
 #include "base/callback_helpers.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace login {
 
diff --git a/components/metrics/cloned_install_detector.cc b/components/metrics/cloned_install_detector.cc
index d5783d2f..38397447 100644
--- a/components/metrics/cloned_install_detector.cc
+++ b/components/metrics/cloned_install_detector.cc
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/metrics_hashes.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "components/metrics/machine_id_provider.h"
 #include "components/metrics/metrics_pref_names.h"
diff --git a/components/metrics/drive_metrics_provider.cc b/components/metrics/drive_metrics_provider.cc
index c7851c22..b39733b 100644
--- a/components/metrics/drive_metrics_provider.cc
+++ b/components/metrics/drive_metrics_provider.cc
@@ -12,8 +12,8 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 
diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc
index d46ae29..a94bb07 100644
--- a/components/metrics/file_metrics_provider.cc
+++ b/components/metrics/file_metrics_provider.cc
@@ -18,8 +18,8 @@
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/metrics/persistent_memory_allocator.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
 #include "base/time/time.h"
 #include "components/metrics/metrics_pref_names.h"
diff --git a/components/metrics/net/network_metrics_provider.cc b/components/metrics/net/network_metrics_provider.cc
index 8874c5d..d175648 100644
--- a/components/metrics/net/network_metrics_provider.cc
+++ b/components/metrics/net/network_metrics_provider.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "net/base/net_errors.h"
diff --git a/components/mirroring/service/session.cc b/components/mirroring/service/session.cc
index 2610e6c..d70ecd9 100644
--- a/components/mirroring/service/session.cc
+++ b/components/mirroring/service/session.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/time/time.h"
diff --git a/components/nacl/browser/nacl_browser.cc b/components/nacl/browser/nacl_browser.cc
index e76afd1..4e24038 100644
--- a/components/nacl/browser/nacl_browser.cc
+++ b/components/nacl/browser/nacl_browser.cc
@@ -16,7 +16,7 @@
 #include "base/pickle.h"
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/components/nacl/browser/nacl_browser.h b/components/nacl/browser/nacl_browser.h
index 4ba2c40d..4ff6156 100644
--- a/components/nacl/browser/nacl_browser.h
+++ b/components/nacl/browser/nacl_browser.h
@@ -14,7 +14,7 @@
 #include "base/containers/mru_cache.h"
 #include "base/files/file.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/nacl/browser/nacl_browser_delegate.h"
diff --git a/components/nacl/browser/nacl_file_host.cc b/components/nacl/browser/nacl_file_host.cc
index 438fbb3..715f9a3 100644
--- a/components/nacl/browser/nacl_file_host.cc
+++ b/components/nacl/browser/nacl_file_host.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/nacl/browser/bad_message.h"
 #include "components/nacl/browser/nacl_browser.h"
 #include "components/nacl/browser/nacl_browser_delegate.h"
diff --git a/components/nacl/browser/nacl_host_message_filter.cc b/components/nacl/browser/nacl_host_message_filter.cc
index 10b5b86..db73745 100644
--- a/components/nacl/browser/nacl_host_message_filter.cc
+++ b/components/nacl/browser/nacl_host_message_filter.cc
@@ -9,7 +9,7 @@
 #include <utility>
 
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/nacl/browser/bad_message.h"
 #include "components/nacl/browser/nacl_browser.h"
diff --git a/components/nacl/browser/nacl_process_host.cc b/components/nacl/browser/nacl_process_host.cc
index f0d8258..2b81bc09 100644
--- a/components/nacl/browser/nacl_process_host.cc
+++ b/components/nacl/browser/nacl_process_host.cc
@@ -31,7 +31,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_byteorder.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/nacl/browser/nacl_browser.h"
diff --git a/components/nacl/browser/pnacl_host.cc b/components/nacl/browser/pnacl_host.cc
index ec8df6e..bb01cd1a 100644
--- a/components/nacl/browser/pnacl_host.cc
+++ b/components/nacl/browser/pnacl_host.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/numerics/safe_math.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/nacl/browser/nacl_browser.h"
 #include "components/nacl/browser/pnacl_translation_cache.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/components/nacl/browser/pnacl_host.h b/components/nacl/browser/pnacl_host.h
index 408f298..405ac80 100644
--- a/components/nacl/browser/pnacl_host.h
+++ b/components/nacl/browser/pnacl_host.h
@@ -14,7 +14,7 @@
 #include "base/files/file.h"
 #include "base/macros.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_checker.h"
 #include "components/nacl/browser/nacl_file_host.h"
 #include "components/nacl/common/pnacl_types.h"
diff --git a/components/net_log/net_export_file_writer.cc b/components/net_log/net_export_file_writer.cc
index d4fcaf40..e4e0dee 100644
--- a/components/net_log/net_export_file_writer.cc
+++ b/components/net_log/net_export_file_writer.cc
@@ -14,7 +14,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_file.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
diff --git a/components/ntp_snippets/BUILD.gn b/components/ntp_snippets/BUILD.gn
index 65c2b85e..eff637f 100644
--- a/components/ntp_snippets/BUILD.gn
+++ b/components/ntp_snippets/BUILD.gn
@@ -168,6 +168,7 @@
     "//components/sessions",
     "//components/strings",
     "//components/sync_sessions",
+    "//components/unified_consent",
     "//components/url_formatter",
     "//components/variations",
     "//components/variations/net",
diff --git a/components/ntp_snippets/DEPS b/components/ntp_snippets/DEPS
index 33dd6c9..e86d653 100644
--- a/components/ntp_snippets/DEPS
+++ b/components/ntp_snippets/DEPS
@@ -16,6 +16,7 @@
   "+components/sync_preferences/testing_pref_service_syncable.h",
   "+components/sync/driver",
   "+components/ukm",
+  "+components/unified_consent",
   "+components/url_formatter",
   "+components/variations",
   "+components/version_info",
diff --git a/components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.cc b/components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.cc
index 0e33282..034aef0 100644
--- a/components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.cc
+++ b/components/ntp_snippets/breaking_news/breaking_news_gcm_app_handler.cc
@@ -6,7 +6,7 @@
 
 #include "base/json/json_writer.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/gcm_driver/gcm_driver.h"
 #include "components/gcm_driver/gcm_profile_service.h"
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc
index 442509405..45c66f1 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetch.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <vector>
+
 #include "components/ntp_snippets/contextual/contextual_suggestions_fetch.h"
 
 #include "base/base64.h"
@@ -179,8 +181,11 @@
 
 ContextualSuggestionsFetch::ContextualSuggestionsFetch(
     const GURL& url,
-    const std::string& bcp_language_code)
-    : url_(url), bcp_language_code_(bcp_language_code) {}
+    const std::string& bcp_language_code,
+    bool include_cookies)
+    : url_(url),
+      bcp_language_code_(bcp_language_code),
+      include_cookies_(include_cookies) {}
 
 ContextualSuggestionsFetch::~ContextualSuggestionsFetch() = default;
 
@@ -252,11 +257,11 @@
   auto resource_request = std::make_unique<network::ResourceRequest>();
 
   resource_request->url = GURL(GetFetchEndpoint());
-  // TODO(pnoland): include cookies once the suggestions endpoint can make use
-  // of them.
-  resource_request->load_flags =
-      net::LOAD_BYPASS_CACHE | net::LOAD_DO_NOT_SAVE_COOKIES |
-      net::LOAD_DO_NOT_SEND_COOKIES | net::LOAD_DO_NOT_SEND_AUTH_DATA;
+
+  int cookie_flag = include_cookies_ ? 0 : net::LOAD_DO_NOT_SEND_COOKIES;
+  resource_request->load_flags = net::LOAD_BYPASS_CACHE |
+                                 net::LOAD_DO_NOT_SAVE_COOKIES | cookie_flag |
+                                 net::LOAD_DO_NOT_SEND_AUTH_DATA;
   resource_request->headers = MakeHeaders();
   resource_request->method = "GET";
 
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetch.h b/components/ntp_snippets/contextual/contextual_suggestions_fetch.h
index 8e20004..4c461de 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetch.h
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetch.h
@@ -12,6 +12,7 @@
 #include "base/callback.h"
 #include "components/ntp_snippets/contextual/contextual_suggestions_metrics_reporter.h"
 #include "components/ntp_snippets/contextual/contextual_suggestions_result.h"
+#include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
 #include "url/gurl.h"
 
@@ -27,7 +28,9 @@
 // body protos and parsing the response body protos.
 class ContextualSuggestionsFetch {
  public:
-  ContextualSuggestionsFetch(const GURL& url, const std::string& bcp_language);
+  ContextualSuggestionsFetch(const GURL& url,
+                             const std::string& bcp_language,
+                             bool include_cookies);
   ~ContextualSuggestionsFetch();
 
   // Get the url used to fetch suggestions.
@@ -54,6 +57,8 @@
   // Identifier for the spoken language in BCP47 format.
   const std::string bcp_language_code_;
 
+  bool include_cookies_ = false;
+
   // The loader for downloading the suggestions. Only non-null if a fetch is
   // currently ongoing.
   std::unique_ptr<network::SimpleURLLoader> url_loader_;
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc
index a86ba26a..ef050f796 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include <utility>
+
 #include "components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h"
 
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -10,8 +12,11 @@
 
 ContextualSuggestionsFetcherImpl::ContextualSuggestionsFetcherImpl(
     const scoped_refptr<network::SharedURLLoaderFactory>& loader_factory,
+    std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>
+        consent_helper,
     const std::string& application_language_code)
     : loader_factory_(loader_factory),
+      consent_helper_(std::move(consent_helper)),
       bcp_language_code_(application_language_code) {}
 
 ContextualSuggestionsFetcherImpl::~ContextualSuggestionsFetcherImpl() = default;
@@ -20,8 +25,9 @@
     const GURL& url,
     FetchClustersCallback callback,
     ReportFetchMetricsCallback metrics_callback) {
-  auto fetch =
-      std::make_unique<ContextualSuggestionsFetch>(url, bcp_language_code_);
+  bool include_cookies = consent_helper_ && consent_helper_->IsEnabled();
+  auto fetch = std::make_unique<ContextualSuggestionsFetch>(
+      url, bcp_language_code_, include_cookies);
   ContextualSuggestionsFetch* fetch_unowned = fetch.get();
   pending_requests_.emplace(std::move(fetch));
 
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
index 3eccc9d..65410f84 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl.h
@@ -15,6 +15,7 @@
 #include "components/ntp_snippets/contextual/contextual_suggestion.h"
 #include "components/ntp_snippets/contextual/contextual_suggestions_fetch.h"
 #include "components/ntp_snippets/contextual/contextual_suggestions_fetcher.h"
+#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
 
 namespace network {
 class SharedURLLoaderFactory;
@@ -30,6 +31,8 @@
  public:
   ContextualSuggestionsFetcherImpl(
       const scoped_refptr<network::SharedURLLoaderFactory>& loader_factory,
+      std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>
+          consent_helper,
       const std::string& application_language_code);
   ~ContextualSuggestionsFetcherImpl() override;
 
@@ -45,6 +48,8 @@
                      ContextualSuggestionsResult result);
 
   const scoped_refptr<network::SharedURLLoaderFactory> loader_factory_;
+  std::unique_ptr<unified_consent::UrlKeyedDataCollectionConsentHelper>
+      consent_helper_;
   /// BCP47 formatted language code to use.
   const std::string bcp_language_code_;
 
diff --git a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
index 02a9487b..1f27157 100644
--- a/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
+++ b/components/ntp_snippets/contextual/contextual_suggestions_fetcher_impl_unittest.cc
@@ -147,18 +147,36 @@
 
 }  // namespace
 
+class TestUrlKeyedDataCollectionConsentHelper
+    : public unified_consent::UrlKeyedDataCollectionConsentHelper {
+ public:
+  TestUrlKeyedDataCollectionConsentHelper() = default;
+  ~TestUrlKeyedDataCollectionConsentHelper() override = default;
+
+  bool IsEnabled() override { return is_enabled_; }
+  void SetIsEnabled(bool enabled) { is_enabled_ = enabled; }
+
+ private:
+  bool is_enabled_ = false;
+};
+
 class ContextualSuggestionsFetcherTest : public testing::Test {
  public:
   ContextualSuggestionsFetcherTest() {
     shared_url_loader_factory_ =
         base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
             &test_factory_);
+    auto consent_helper =
+        std::make_unique<TestUrlKeyedDataCollectionConsentHelper>();
+    consent_helper_ = consent_helper.get();
     fetcher_ = std::make_unique<ContextualSuggestionsFetcherImpl>(
-        shared_url_loader_factory_, "en");
+        shared_url_loader_factory_, std::move(consent_helper), "en");
   }
 
   ~ContextualSuggestionsFetcherTest() override {}
 
+  void SetUp() override { consent_helper()->SetIsEnabled(true); }
+
   void SetFakeResponse(const std::string& response_data,
                        net::HttpStatusCode response_code = net::HTTP_OK,
                        network::URLLoaderCompletionStatus status =
@@ -192,10 +210,15 @@
 
   TestURLLoaderFactory* test_factory() { return &test_factory_; }
 
+  TestUrlKeyedDataCollectionConsentHelper* consent_helper() {
+    return consent_helper_;
+  }
+
  private:
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   network::TestURLLoaderFactory test_factory_;
   scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
+  TestUrlKeyedDataCollectionConsentHelper* consent_helper_;
   std::unique_ptr<ContextualSuggestionsFetcherImpl> fetcher_;
 
   DISALLOW_COPY_AND_ASSIGN(ContextualSuggestionsFetcherTest);
@@ -412,6 +435,42 @@
       "ContextualSuggestions.FetchRequestProtoSizeKB", 1);
 }
 
+TEST_F(ContextualSuggestionsFetcherTest, CookiesIncludedWhenConsentIsEnabled) {
+  network::ResourceRequest last_resource_request;
+
+  test_factory()->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        last_resource_request = request;
+      }));
+
+  SetFakeResponse(SerializedResponseProto("Peek Text", DefaultClusters()));
+
+  MockClustersCallback callback;
+  SendAndAwaitResponse(GURL("http://www.article.com/"), &callback);
+
+  int load_flags = last_resource_request.load_flags;
+  EXPECT_EQ(0, load_flags & net::LOAD_DO_NOT_SEND_COOKIES);
+}
+
+TEST_F(ContextualSuggestionsFetcherTest, CookiesExcludedWhenConsentIsDisabled) {
+  consent_helper()->SetIsEnabled(false);
+  network::ResourceRequest last_resource_request;
+
+  test_factory()->SetInterceptor(
+      base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
+        last_resource_request = request;
+      }));
+
+  SetFakeResponse(SerializedResponseProto("Peek Text", DefaultClusters()));
+
+  MockClustersCallback callback;
+  SendAndAwaitResponse(GURL("http://www.article.com/"), &callback);
+
+  int load_flags = last_resource_request.load_flags;
+  EXPECT_EQ(net::LOAD_DO_NOT_SEND_COOKIES,
+            load_flags & net::LOAD_DO_NOT_SEND_COOKIES);
+}
+
 TEST_F(ContextualSuggestionsFetcherTest, ProtocolError) {
   MockClustersCallback callback;
   MockMetricsCallback metrics_callback;
diff --git a/components/ntp_snippets/remote/remote_suggestions_database.cc b/components/ntp_snippets/remote/remote_suggestions_database.cc
index 29c9f8e..9f6e924 100644
--- a/components/ntp_snippets/remote/remote_suggestions_database.cc
+++ b/components/ntp_snippets/remote/remote_suggestions_database.cc
@@ -8,7 +8,7 @@
 
 #include "base/files/file_path.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/leveldb_proto/proto_database_impl.h"
 #include "components/ntp_snippets/remote/proto/ntp_snippets.pb.h"
 
diff --git a/components/offline_pages/core/model/offline_page_model_taskified.cc b/components/offline_pages/core/model/offline_page_model_taskified.cc
index 4791a6ea..216310bd 100644
--- a/components/offline_pages/core/model/offline_page_model_taskified.cc
+++ b/components/offline_pages/core/model/offline_page_model_taskified.cc
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string16.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/clock.h"
 #include "base/time/default_clock.h"
@@ -358,7 +358,6 @@
 
 void OfflinePageModelTaskified::GetPagesByURL(
     const GURL& url,
-    URLSearchMode url_search_mode,
     MultipleOfflinePageItemCallback callback) {
   auto task = GetPagesTask::CreateTaskMatchingUrl(store_.get(),
                                                   std::move(callback), url);
@@ -748,7 +747,7 @@
     bool success,
     const std::vector<int64_t>& pages_deleted) {
   // If there's no persistent page expired, save some effort by exiting early.
-  // TODO(https://crbug.com/834909), use the temporary hidden bit in
+  // TODO(https://crbug.com/834909): Use the temporary hidden bit in
   // DownloadUIAdapter instead of calling remove directly.
   if (pages_deleted.size() > 0)
     download_manager_->Remove(pages_deleted);
diff --git a/components/offline_pages/core/model/offline_page_model_taskified.h b/components/offline_pages/core/model/offline_page_model_taskified.h
index c21d381e..d72f474 100644
--- a/components/offline_pages/core/model/offline_page_model_taskified.h
+++ b/components/offline_pages/core/model/offline_page_model_taskified.h
@@ -105,7 +105,6 @@
   void GetPagesByClientIds(const std::vector<ClientId>& client_ids,
                            MultipleOfflinePageItemCallback callback) override;
   void GetPagesByURL(const GURL& url,
-                     URLSearchMode url_search_mode,
                      MultipleOfflinePageItemCallback callback) override;
   void GetPagesByNamespace(const std::string& name_space,
                            MultipleOfflinePageItemCallback callback) override;
diff --git a/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc b/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
index 239a09c..8a82583 100644
--- a/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
+++ b/components/offline_pages/core/model/offline_page_model_taskified_unittest.cc
@@ -6,6 +6,7 @@
 
 #include <stdint.h>
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/files/file_enumerator.h"
@@ -65,9 +66,9 @@
 const ClientId kTestBrowserActionsClientId(kBrowserActionsNamespace, "999");
 const int64_t kTestFileSize = 876543LL;
 const base::string16 kTestTitle = base::UTF8ToUTF16("a title");
-const std::string kTestRequestOrigin("abc.xyz");
-const std::string kEmptyRequestOrigin;
-const std::string kTestDigest("test digest");
+const char kTestRequestOrigin[] = "abc.xyz";
+const char kEmptyRequestOrigin[] = "";
+const char kTestDigest[] = "test digest";
 const int64_t kDownloadId = 42LL;
 
 }  // namespace
@@ -941,21 +942,18 @@
   // Search by kTestUrl.
   base::MockCallback<MultipleOfflinePageItemCallback> callback;
   EXPECT_CALL(callback, Run(ElementsAre(page1)));
-  model()->GetPagesByURL(kTestUrl, URLSearchMode::SEARCH_BY_FINAL_URL_ONLY,
-                         callback.Get());
+  model()->GetPagesByURL(kTestUrl, callback.Get());
   EXPECT_TRUE(task_queue()->HasRunningTask());
   PumpLoop();
 
   // Search by kTestUrl2.
   EXPECT_CALL(callback, Run(ElementsAre(page2)));
-  model()->GetPagesByURL(kTestUrl2, URLSearchMode::SEARCH_BY_FINAL_URL_ONLY,
-                         callback.Get());
+  model()->GetPagesByURL(kTestUrl2, callback.Get());
   PumpLoop();
 
   // Search by random url, which should return no pages.
   EXPECT_CALL(callback, Run(IsEmpty()));
-  model()->GetPagesByURL(kOtherUrl, URLSearchMode::SEARCH_BY_FINAL_URL_ONLY,
-                         callback.Get());
+  model()->GetPagesByURL(kOtherUrl, callback.Get());
   EXPECT_TRUE(task_queue()->HasRunningTask());
   PumpLoop();
 }
@@ -973,22 +971,19 @@
   base::MockCallback<MultipleOfflinePageItemCallback> callback;
   EXPECT_CALL(callback, Run(ElementsAre(page1)));
   model()->GetPagesByURL(kTestUrlWithFragment,
-                         URLSearchMode::SEARCH_BY_FINAL_URL_ONLY,
                          callback.Get());
   EXPECT_TRUE(task_queue()->HasRunningTask());
   PumpLoop();
 
   // Search by kTestUrl2.
   EXPECT_CALL(callback, Run(ElementsAre(page2)));
-  model()->GetPagesByURL(kTestUrl2, URLSearchMode::SEARCH_BY_FINAL_URL_ONLY,
-                         callback.Get());
+  model()->GetPagesByURL(kTestUrl2, callback.Get());
   EXPECT_TRUE(task_queue()->HasRunningTask());
   PumpLoop();
 
   // Search by kTestUrl2WithFragment.
   EXPECT_CALL(callback, Run(ElementsAre(page2)));
   model()->GetPagesByURL(kTestUrl2WithFragment,
-                         URLSearchMode::SEARCH_BY_FINAL_URL_ONLY,
                          callback.Get());
   EXPECT_TRUE(task_queue()->HasRunningTask());
   PumpLoop();
@@ -1006,8 +1001,7 @@
 
   base::MockCallback<MultipleOfflinePageItemCallback> callback;
   EXPECT_CALL(callback, Run(UnorderedElementsAre(page1, page2)));
-  model()->GetPagesByURL(kTestUrl2, URLSearchMode::SEARCH_BY_ALL_URLS,
-                         callback.Get());
+  model()->GetPagesByURL(kTestUrl2, callback.Get());
   PumpLoop();
 }
 
diff --git a/components/offline_pages/core/offline_page_feature.cc b/components/offline_pages/core/offline_page_feature.cc
index 70f1fb5..05e5672 100644
--- a/components/offline_pages/core/offline_page_feature.cc
+++ b/components/offline_pages/core/offline_page_feature.cc
@@ -34,6 +34,9 @@
 const base::Feature kOfflinePagesSharingFeature{
     "OfflinePagesSharing", base::FEATURE_ENABLED_BY_DEFAULT};
 
+const base::Feature kOfflinePagesLivePageSharingFeature{
+    "OfflinePagesLivePageSharing", base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kOfflinePagesSvelteConcurrentLoadingFeature{
     "OfflinePagesSvelteConcurrentLoading", base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -99,6 +102,10 @@
   return base::FeatureList::IsEnabled(kOfflinePagesSharingFeature);
 }
 
+bool IsOfflinePagesLivePageSharingEnabled() {
+  return base::FeatureList::IsEnabled(kOfflinePagesLivePageSharingFeature);
+}
+
 bool IsBackgroundLoaderForDownloadsEnabled() {
   return base::FeatureList::IsEnabled(kBackgroundLoaderForDownloadsFeature);
 }
diff --git a/components/offline_pages/core/offline_page_feature.h b/components/offline_pages/core/offline_page_feature.h
index f144447..cd03248 100644
--- a/components/offline_pages/core/offline_page_feature.h
+++ b/components/offline_pages/core/offline_page_feature.h
@@ -15,6 +15,7 @@
 extern const base::Feature kOfflinePagesSvelteConcurrentLoadingFeature;
 extern const base::Feature kOfflinePagesCTFeature;
 extern const base::Feature kOfflinePagesSharingFeature;
+extern const base::Feature kOfflinePagesLivePageSharingFeature;
 extern const base::Feature kBackgroundLoaderForDownloadsFeature;
 extern const base::Feature kPrefetchingOfflinePagesFeature;
 extern const base::Feature kOfflinePagesLoadSignalCollectingFeature;
@@ -45,6 +46,9 @@
 // Returns true if offline page sharing is enabled.
 bool IsOfflinePagesSharingEnabled();
 
+// Returns true if live page sharing of offline page is enabled.
+bool IsOfflinePagesLivePageSharingEnabled();
+
 // Returns true if saving a foreground tab that is taking too long using the
 // background scheduler is enabled.
 bool IsBackgroundLoaderForDownloadsEnabled();
diff --git a/components/offline_pages/core/offline_page_feature_unittest.cc b/components/offline_pages/core/offline_page_feature_unittest.cc
index e313568..28e31dc 100644
--- a/components/offline_pages/core/offline_page_feature_unittest.cc
+++ b/components/offline_pages/core/offline_page_feature_unittest.cc
@@ -40,6 +40,17 @@
   EXPECT_TRUE(offline_pages::IsOfflinePagesSharingEnabled());
 }
 
+TEST(OfflinePageFeatureTest, OfflinePagesLivePageSharing) {
+  // Disabled by default.
+  EXPECT_FALSE(
+      base::FeatureList::IsEnabled(kOfflinePagesLivePageSharingFeature));
+
+  // Check if helper method works correctly when the feature is disabled.
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(kOfflinePagesLivePageSharingFeature);
+  EXPECT_TRUE(offline_pages::IsOfflinePagesLivePageSharingEnabled());
+}
+
 TEST(OfflinePageFeatureTest, OfflinePagesSvelteConcurrentLoading) {
   // Disabled by default.
   EXPECT_FALSE(offline_pages::IsOfflinePagesSvelteConcurrentLoadingEnabled());
diff --git a/components/offline_pages/core/offline_page_model.h b/components/offline_pages/core/offline_page_model.h
index 2dcbfe6..d6f9d428 100644
--- a/components/offline_pages/core/offline_page_model.h
+++ b/components/offline_pages/core/offline_page_model.h
@@ -191,10 +191,12 @@
       const std::vector<ClientId>& client_ids,
       MultipleOfflinePageItemCallback callback) = 0;
 
-  // Returns the offline pages that are related to |url|. |url_search_mode|
-  // controls how the url match is done. See URLSearchMode for more details.
+  // Returns via callback all offline pages related to |url|. The provided URL
+  // is matched both against the original and the actual URL fields (they
+  // sometimes differ because of possible redirects). The returned list is
+  // sorted by descending creation date so that the most recent offline page
+  // will be the first element of the list.
   virtual void GetPagesByURL(const GURL& url,
-                             URLSearchMode url_search_mode,
                              MultipleOfflinePageItemCallback callback) = 0;
 
   // Returns the offline pages that belong in |name_space|.
diff --git a/components/offline_pages/core/offline_page_types.h b/components/offline_pages/core/offline_page_types.h
index e0c126e..82ae506 100644
--- a/components/offline_pages/core/offline_page_types.h
+++ b/components/offline_pages/core/offline_page_types.h
@@ -6,7 +6,7 @@
 #define COMPONENTS_OFFLINE_PAGES_CORE_OFFLINE_PAGE_TYPES_H_
 
 #include <stdint.h>
-
+#include <memory>
 #include <set>
 #include <vector>
 
@@ -81,19 +81,9 @@
   RESULT_COUNT,
 };
 
-// Controls how to search on differnt URLs for pages.
-enum class URLSearchMode {
-  // Match against the last committed URL only.
-  SEARCH_BY_FINAL_URL_ONLY,
-  // Match against all stored URLs, including the last committed URL and
-  // the original request URL.
-  SEARCH_BY_ALL_URLS,
-};
-
 typedef std::vector<int64_t> MultipleOfflineIdResult;
 typedef std::vector<OfflinePageItem> MultipleOfflinePageItemResult;
 
-// TODO(carlosk): All or most of these should use base::OnceCallback.
 typedef base::OnceCallback<void(SavePageResult, int64_t)> SavePageCallback;
 typedef base::OnceCallback<void(AddPageResult, int64_t)> AddPageCallback;
 typedef base::OnceCallback<void(DeletePageResult)> DeletePageCallback;
diff --git a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc
index 1e25be0..c19b226 100644
--- a/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc
+++ b/components/offline_pages/core/prefetch/prefetch_dispatcher_impl.cc
@@ -9,7 +9,7 @@
 
 #include "base/bind.h"
 #include "base/guid.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/offline_pages/core/client_namespace_constants.h"
diff --git a/components/offline_pages/core/stub_offline_page_model.cc b/components/offline_pages/core/stub_offline_page_model.cc
index 429be62..74b8650 100644
--- a/components/offline_pages/core/stub_offline_page_model.cc
+++ b/components/offline_pages/core/stub_offline_page_model.cc
@@ -55,7 +55,6 @@
     SingleOfflinePageItemCallback callback) {}
 void StubOfflinePageModel::GetPagesByURL(
     const GURL& url,
-    URLSearchMode url_search_mode,
     MultipleOfflinePageItemCallback callback) {}
 void StubOfflinePageModel::GetPagesByRequestOrigin(
     const std::string& origin,
@@ -81,7 +80,7 @@
 void StubOfflinePageModel::PublishInternalArchive(
     const OfflinePageItem& offline_page,
     std::unique_ptr<OfflinePageArchiver> archiver,
-    PublishPageCallback publish_done_callback){};
+    PublishPageCallback publish_done_callback) {}
 const base::FilePath& StubOfflinePageModel::GetInternalArchiveDirectory(
     const std::string& name_space) const {
   return archive_directory_;
diff --git a/components/offline_pages/core/stub_offline_page_model.h b/components/offline_pages/core/stub_offline_page_model.h
index 33a0950..90d5636 100644
--- a/components/offline_pages/core/stub_offline_page_model.h
+++ b/components/offline_pages/core/stub_offline_page_model.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_OFFLINE_PAGES_CORE_STUB_OFFLINE_PAGE_MODEL_H_
 #define COMPONENTS_OFFLINE_PAGES_CORE_STUB_OFFLINE_PAGE_MODEL_H_
 
+#include <memory>
 #include <set>
 #include <string>
 #include <vector>
@@ -51,7 +52,6 @@
   void GetPageByGuid(const std::string& guid,
                      SingleOfflinePageItemCallback callback) override;
   void GetPagesByURL(const GURL& url,
-                     URLSearchMode url_search_mode,
                      MultipleOfflinePageItemCallback callback) override;
   void GetPagesByRequestOrigin(
       const std::string& origin,
diff --git a/components/omnibox/browser/in_memory_url_index.cc b/components/omnibox/browser/in_memory_url_index.cc
index 382b712..73fb002a 100644
--- a/components/omnibox/browser/in_memory_url_index.cc
+++ b/components/omnibox/browser/in_memory_url_index.cc
@@ -10,7 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/memory_dump_manager.h"
diff --git a/components/omnibox/browser/shortcuts_backend.cc b/components/omnibox/browser/shortcuts_backend.cc
index 12ba476..911931d9 100644
--- a/components/omnibox/browser/shortcuts_backend.cc
+++ b/components/omnibox/browser/shortcuts_backend.cc
@@ -18,7 +18,7 @@
 #include "base/i18n/case_conversion.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/history/core/browser/history_service.h"
 #include "components/omnibox/browser/autocomplete_input.h"
diff --git a/components/optimization_guide/optimization_guide_service.cc b/components/optimization_guide/optimization_guide_service.cc
index 7a80aae0..c1f2f945 100644
--- a/components/optimization_guide/optimization_guide_service.cc
+++ b/components/optimization_guide/optimization_guide_service.cc
@@ -10,7 +10,7 @@
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace optimization_guide {
 
diff --git a/components/password_manager/core/browser/export/password_manager_exporter.cc b/components/password_manager/core/browser/export/password_manager_exporter.cc
index ac3c79c..f43185d9 100644
--- a/components/password_manager/core/browser/export/password_manager_exporter.cc
+++ b/components/password_manager/core/browser/export/password_manager_exporter.cc
@@ -9,8 +9,8 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/export/password_csv_writer.h"
diff --git a/components/password_manager/core/browser/import/password_importer.cc b/components/password_manager/core/browser/import/password_importer.cc
index 4fd336a..9b45e71 100644
--- a/components/password_manager/core/browser/import/password_importer.cc
+++ b/components/password_manager/core/browser/import/password_importer.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/import/password_csv_reader.h"
 
diff --git a/components/password_manager/core/browser/login_database.cc b/components/password_manager/core/browser/login_database.cc
index 200262e..e4d5c5a8 100644
--- a/components/password_manager/core/browser/login_database.cc
+++ b/components/password_manager/core/browser/login_database.cc
@@ -1263,11 +1263,11 @@
   return Init();
 }
 
-bool LoginDatabase::DeleteUndecryptableLogins() {
+DatabaseCleanupResult LoginDatabase::DeleteUndecryptableLogins() {
 #if defined(OS_MACOSX) && !defined(OS_IOS)
   // If the Keychain is unavailable, don't delete any logins.
   if (!OSCrypt::IsEncryptionAvailable())
-    return false;
+    return DatabaseCleanupResult::kEncryptionUnavailable;
 
   DCHECK(db_.is_open());
 
@@ -1300,11 +1300,11 @@
 
   for (const auto& form : forms_to_be_deleted) {
     if (!RemoveLogin(form))
-      return false;
+      return DatabaseCleanupResult::kItemFailure;
   }
 #endif
 
-  return true;
+  return DatabaseCleanupResult::kSuccess;
 }
 
 std::string LoginDatabase::GetEncryptedPassword(
diff --git a/components/password_manager/core/browser/login_database.h b/components/password_manager/core/browser/login_database.h
index 88e80a4..51558dd0 100644
--- a/components/password_manager/core/browser/login_database.h
+++ b/components/password_manager/core/browser/login_database.h
@@ -143,12 +143,12 @@
 
   // On MacOS, it deletes all logins from the database that cannot be decrypted
   // when encryption key from Keychain is available. If the Keychain is locked,
-  // it does nothing and returns false. If it's not running on MacOS, it does
-  // nothing and returns true. This can be used when syncing logins from the
-  // cloud to rewrite entries that can't be used anymore (due to modification of
-  // the encryption key). Returns true on success, if all the broken entries are
-  // successfully deleted.
-  bool DeleteUndecryptableLogins();
+  // it does nothing and returns ENCRYPTION_UNAVAILABLE. If it's not running on
+  // MacOS, it does nothing and returns SUCCESS. This can be used when syncing
+  // logins from the cloud to rewrite entries that can't be used anymore (due to
+  // modification of the encryption key). If one of the logins couldn't be
+  // removed from the database, returns ITEM_FAILURE.
+  DatabaseCleanupResult DeleteUndecryptableLogins();
 
   // Returns the encrypted password value for the specified |form|.  Returns an
   // empty string if the row for this |form| is not found.
diff --git a/components/password_manager/core/browser/login_database_unittest.cc b/components/password_manager/core/browser/login_database_unittest.cc
index 2915c27..8e4ad01 100644
--- a/components/password_manager/core/browser/login_database_unittest.cc
+++ b/components/password_manager/core/browser/login_database_unittest.cc
@@ -2070,11 +2070,11 @@
   EXPECT_TRUE(result.empty());
 
   // Delete undecryptable logins and make sure we can get valid logins.
-  EXPECT_TRUE(db.DeleteUndecryptableLogins());
+  EXPECT_EQ(DatabaseCleanupResult::kSuccess, db.DeleteUndecryptableLogins());
   EXPECT_TRUE(db.GetAutofillableLogins(&result));
   EXPECT_THAT(result, UnorderedElementsAre(Pointee(form1), Pointee(form3)));
 #else
-  EXPECT_TRUE(db.DeleteUndecryptableLogins());
+  EXPECT_EQ(DatabaseCleanupResult::kSuccess, db.DeleteUndecryptableLogins());
 #endif
 }
 
@@ -2086,7 +2086,8 @@
   OSCryptMocker::SetBackendLocked(true);
   LoginDatabase db(database_path());
   ASSERT_TRUE(db.Init());
-  EXPECT_FALSE(db.DeleteUndecryptableLogins());
+  EXPECT_EQ(DatabaseCleanupResult::kEncryptionUnavailable,
+            db.DeleteUndecryptableLogins());
 }
 #endif
 
diff --git a/components/password_manager/core/browser/mock_password_store.h b/components/password_manager/core/browser/mock_password_store.h
index 941efc4a..3d712ed 100644
--- a/components/password_manager/core/browser/mock_password_store.h
+++ b/components/password_manager/core/browser/mock_password_store.h
@@ -64,6 +64,7 @@
                bool(std::vector<std::unique_ptr<autofill::PasswordForm>>*));
   MOCK_METHOD1(FillBlacklistLogins,
                bool(std::vector<std::unique_ptr<autofill::PasswordForm>>*));
+  MOCK_METHOD0(DeleteUndecryptableLogins, DatabaseCleanupResult());
   MOCK_METHOD1(NotifyLoginsChanged, void(const PasswordStoreChangeList&));
   MOCK_METHOD0(GetAllSiteStatsImpl, std::vector<InteractionsStats>());
   MOCK_METHOD1(GetSiteStatsImpl,
diff --git a/components/password_manager/core/browser/password_bubble_experiment_unittest.cc b/components/password_manager/core/browser/password_bubble_experiment_unittest.cc
index d9c17de..27779f23 100644
--- a/components/password_manager/core/browser/password_bubble_experiment_unittest.cc
+++ b/components/password_manager/core/browser/password_bubble_experiment_unittest.cc
@@ -27,9 +27,10 @@
   // FakeSyncService overrides.
   int GetDisableReasons() const override { return disable_reasons_; }
 
-  State GetState() const override {
-    return IsFirstSetupComplete() ? State::ACTIVE
-                                  : State::PENDING_DESIRED_CONFIGURATION;
+  TransportState GetTransportState() const override {
+    return IsFirstSetupComplete()
+               ? TransportState::ACTIVE
+               : TransportState::PENDING_DESIRED_CONFIGURATION;
   }
 
   bool IsFirstSetupComplete() const override {
diff --git a/components/password_manager/core/browser/password_manager_metrics_util.h b/components/password_manager/core/browser/password_manager_metrics_util.h
index 25f3da5..d6505e38 100644
--- a/components/password_manager/core/browser/password_manager_metrics_util.h
+++ b/components/password_manager/core/browser/password_manager_metrics_util.h
@@ -77,6 +77,8 @@
   NOT_SYNCING_FAILED_READ,
   NOT_SYNCING_DUPLICATE_TAGS,
   NOT_SYNCING_SERVER_ERROR,
+  NOT_SYNCING_FAILED_CLEANUP,
+  NOT_SYNCING_FAILED_DECRYPTION,
   NUM_SYNC_STATES
 };
 
diff --git a/components/password_manager/core/browser/password_store.cc b/components/password_manager/core/browser/password_store.cc
index e7269de7..54e9b61b 100644
--- a/components/password_manager/core/browser/password_store.cc
+++ b/components/password_manager/core/browser/password_store.cc
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/autofill/core/common/form_data.h"
diff --git a/components/password_manager/core/browser/password_store_default.cc b/components/password_manager/core/browser/password_store_default.cc
index 2eea96be..18a548e 100644
--- a/components/password_manager/core/browser/password_store_default.cc
+++ b/components/password_manager/core/browser/password_store_default.cc
@@ -196,6 +196,13 @@
   return login_db_ && login_db_->GetBlacklistLogins(forms);
 }
 
+DatabaseCleanupResult PasswordStoreDefault::DeleteUndecryptableLogins() {
+  DCHECK(background_task_runner()->RunsTasksInCurrentSequence());
+  if (!login_db_)
+    return DatabaseCleanupResult::kDatabaseUnavailable;
+  return login_db_->DeleteUndecryptableLogins();
+}
+
 void PasswordStoreDefault::AddSiteStatsImpl(const InteractionsStats& stats) {
   DCHECK(background_task_runner()->RunsTasksInCurrentSequence());
   if (login_db_)
diff --git a/components/password_manager/core/browser/password_store_default.h b/components/password_manager/core/browser/password_store_default.h
index 1d4cf69..3a203da1 100644
--- a/components/password_manager/core/browser/password_store_default.h
+++ b/components/password_manager/core/browser/password_store_default.h
@@ -77,6 +77,7 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
   bool FillBlacklistLogins(
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
+  DatabaseCleanupResult DeleteUndecryptableLogins() override;
   void AddSiteStatsImpl(const InteractionsStats& stats) override;
   void RemoveSiteStatsImpl(const GURL& origin_domain) override;
   std::vector<InteractionsStats> GetAllSiteStatsImpl() override;
diff --git a/components/password_manager/core/browser/password_store_factory_util.cc b/components/password_manager/core/browser/password_store_factory_util.cc
index 47bbb33..d8cc584 100644
--- a/components/password_manager/core/browser/password_store_factory_util.cc
+++ b/components/password_manager/core/browser/password_store_factory_util.cc
@@ -7,7 +7,7 @@
 #include <memory>
 #include <utility>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliated_match_helper.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_service.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h"
diff --git a/components/password_manager/core/browser/password_store_sync.h b/components/password_manager/core/browser/password_store_sync.h
index fc8b55de..02382e2a 100644
--- a/components/password_manager/core/browser/password_store_sync.h
+++ b/components/password_manager/core/browser/password_store_sync.h
@@ -18,6 +18,15 @@
 
 namespace password_manager {
 
+// This enum is used to determine result status when deleting undecryptable
+// logins from database.
+enum class DatabaseCleanupResult {
+  kSuccess,
+  kItemFailure,
+  kDatabaseUnavailable,
+  kEncryptionUnavailable,
+};
+
 // PasswordStore interface for PasswordSyncableService. It provides access to
 // synchronous methods of PasswordStore which shouldn't be accessible to other
 // classes. These methods are to be called on the PasswordStore background
@@ -38,6 +47,9 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms)
       WARN_UNUSED_RESULT = 0;
 
+  // Deletes logins that cannot be decrypted.
+  virtual DatabaseCleanupResult DeleteUndecryptableLogins() = 0;
+
   // Synchronous implementation to add the given login.
   virtual PasswordStoreChangeList AddLoginSync(
       const autofill::PasswordForm& form) = 0;
diff --git a/components/password_manager/core/browser/password_syncable_service.cc b/components/password_manager/core/browser/password_syncable_service.cc
index 4f959a6..d0dadb3 100644
--- a/components/password_manager/core/browser/password_syncable_service.cc
+++ b/components/password_manager/core/browser/password_syncable_service.cc
@@ -16,6 +16,7 @@
 #include "components/autofill/core/common/password_form.h"
 #include "components/password_manager/core/browser/password_manager_metrics_util.h"
 #include "components/password_manager/core/browser/password_store_sync.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 #include "components/sync/model/sync_error_factory.h"
 #include "net/base/escape.h"
 
@@ -139,6 +140,31 @@
   base::AutoReset<bool> processing_changes(&is_processing_sync_changes_, true);
   syncer::SyncMergeResult merge_result(type);
 
+  // On MacOS it may happen that some passwords cannot be decrypted due to
+  // modification of encryption key in Keychain (https://crbug.com/730625).
+  // Delete those logins from the store, they should be automatically updated
+  // with Sync data.
+  if (base::FeatureList::IsEnabled(features::kDeleteUndecryptableLogins)) {
+    DatabaseCleanupResult cleanup_result =
+        password_store_->DeleteUndecryptableLogins();
+
+    if (cleanup_result == DatabaseCleanupResult::kEncryptionUnavailable) {
+      merge_result.set_error(sync_error_factory->CreateAndUploadError(
+          FROM_HERE, "Failed to get encryption key during database cleanup."));
+      metrics_util::LogPasswordSyncState(
+          metrics_util::NOT_SYNCING_FAILED_DECRYPTION);
+      return merge_result;
+    }
+
+    if (cleanup_result != DatabaseCleanupResult::kSuccess) {
+      merge_result.set_error(sync_error_factory->CreateAndUploadError(
+          FROM_HERE, "Failed to cleanup database."));
+      metrics_util::LogPasswordSyncState(
+          metrics_util::NOT_SYNCING_FAILED_CLEANUP);
+      return merge_result;
+    }
+  }
+
   // We add all the db entries as |new_local_entries| initially. During model
   // association entries that match a sync entry will be removed and this list
   // will only contain entries that are not in sync.
diff --git a/components/password_manager/core/browser/password_syncable_service_unittest.cc b/components/password_manager/core/browser/password_syncable_service_unittest.cc
index 39c4499..7722d217 100644
--- a/components/password_manager/core/browser/password_syncable_service_unittest.cc
+++ b/components/password_manager/core/browser/password_syncable_service_unittest.cc
@@ -14,8 +14,10 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/password_manager/core/browser/mock_password_store.h"
+#include "components/password_manager/core/common/password_manager_features.h"
 #include "components/sync/model/sync_change_processor.h"
 #include "components/sync/model/sync_error.h"
 #include "components/sync/model/sync_error_factory_mock.h"
@@ -511,6 +513,65 @@
   service()->ActOnPasswordStoreChanges(list);
 }
 
+// Disable feature for deleting undecryptable logins.
+TEST_F(PasswordSyncableServiceTest, DeleteUndecryptableLoginsDisabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndDisableFeature(
+      features::kDeleteUndecryptableLogins);
+
+  EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty()));
+  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins()).Times(0);
+  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
+      .WillOnce(Return(true));
+  EXPECT_CALL(*password_store(), FillBlacklistLogins(_))
+      .WillOnce(Return(true));
+
+  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
+      syncer::PASSWORDS, SyncDataList(), std::move(processor_), nullptr);
+  EXPECT_FALSE(result.error().IsSet());
+}
+
+// Enable feature for deleting undecryptable logins.
+TEST_F(PasswordSyncableServiceTest, DeleteUndecryptableLoginsEnabled) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      features::kDeleteUndecryptableLogins);
+
+  EXPECT_CALL(*processor_, ProcessSyncChanges(_, IsEmpty()));
+  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins())
+      .WillOnce(Return(DatabaseCleanupResult::kSuccess));
+  EXPECT_CALL(*password_store(), FillAutofillableLogins(_))
+      .WillOnce(Return(true));
+  EXPECT_CALL(*password_store(), FillBlacklistLogins(_))
+      .WillOnce(Return(true));
+
+  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
+      syncer::PASSWORDS, SyncDataList(), std::move(processor_), nullptr);
+  EXPECT_FALSE(result.error().IsSet());
+}
+
+// Database cleanup fails because encryption is unavailable.
+TEST_F(PasswordSyncableServiceTest, FailedDeleteUndecryptableLogins) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeature(
+      features::kDeleteUndecryptableLogins);
+  auto error_factory = std::make_unique<syncer::SyncErrorFactoryMock>();
+  syncer::SyncError error(
+      FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
+      "Failed to get encryption key during database cleanup.",
+      syncer::PASSWORDS);
+  EXPECT_CALL(*error_factory, CreateAndUploadError(_, _))
+      .WillOnce(Return(error));
+
+  EXPECT_CALL(*password_store(), DeleteUndecryptableLogins())
+      .WillOnce(Return(DatabaseCleanupResult::kEncryptionUnavailable));
+
+  syncer::SyncMergeResult result = service()->MergeDataAndStartSyncing(
+      syncer::PASSWORDS, SyncDataList(), std::move(processor_),
+      std::move(error_factory));
+  EXPECT_TRUE(result.error().IsSet());
+}
+
 // Start syncing with an error in ProcessSyncChanges. Subsequent password store
 // updates shouldn't be propagated to Sync.
 TEST_F(PasswordSyncableServiceTest, FailedProcessSyncChanges) {
diff --git a/components/password_manager/core/browser/test_password_store.cc b/components/password_manager/core/browser/test_password_store.cc
index 2166d73..d429f17 100644
--- a/components/password_manager/core/browser/test_password_store.cc
+++ b/components/password_manager/core/browser/test_password_store.cc
@@ -11,6 +11,7 @@
 #include "base/logging.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/autofill/core/common/password_form.h"
+#include "components/password_manager/core/browser/login_database.h"
 #include "components/password_manager/core/browser/psl_matching_helper.h"
 #include "components/password_manager/core/browser/statistics_table.h"
 #include "url/gurl.h"
@@ -138,6 +139,10 @@
   return true;
 }
 
+DatabaseCleanupResult TestPasswordStore::DeleteUndecryptableLogins() {
+  return DatabaseCleanupResult::kSuccess;
+}
+
 std::vector<std::unique_ptr<autofill::PasswordForm>>
 TestPasswordStore::FillLoginsForSameOrganizationName(
     const std::string& signon_realm) {
diff --git a/components/password_manager/core/browser/test_password_store.h b/components/password_manager/core/browser/test_password_store.h
index c61793e..a74d1dc4 100644
--- a/components/password_manager/core/browser/test_password_store.h
+++ b/components/password_manager/core/browser/test_password_store.h
@@ -54,6 +54,7 @@
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
   bool FillBlacklistLogins(
       std::vector<std::unique_ptr<autofill::PasswordForm>>* forms) override;
+  DatabaseCleanupResult DeleteUndecryptableLogins() override;
   std::vector<std::unique_ptr<autofill::PasswordForm>>
   FillLoginsForSameOrganizationName(const std::string& signon_realm) override;
   std::vector<InteractionsStats> GetSiteStatsImpl(
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc
index 1849ecd..4ea1aff 100644
--- a/components/password_manager/core/common/password_manager_features.cc
+++ b/components/password_manager/core/common/password_manager_features.cc
@@ -19,6 +19,11 @@
 const base::Feature kAutofillHome = {"AutofillHome",
                                      base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Deletes entries from local database on Mac which cannot be decrypted when
+// merging data with Sync.
+const base::Feature kDeleteUndecryptableLogins = {
+    "DeleteUndecryptableLogins", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Use HTML based username detector.
 const base::Feature kHtmlBasedUsernameDetector = {
     "HtmlBaseUsernameDetector", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h
index 0cf462bd..49156a64 100644
--- a/components/password_manager/core/common/password_manager_features.h
+++ b/components/password_manager/core/common/password_manager_features.h
@@ -19,6 +19,7 @@
 
 extern const base::Feature kAffiliationBasedMatching;
 extern const base::Feature kAutofillHome;
+extern const base::Feature kDeleteUndecryptableLogins;
 extern const base::Feature kHtmlBasedUsernameDetector;
 extern const base::Feature kPasswordGenerationRequirements;
 extern const base::Feature kPasswordGenerationRequirementsDomainOverrides;
diff --git a/components/password_manager/core/common/passwords_directory_util_ios.cc b/components/password_manager/core/common/passwords_directory_util_ios.cc
index 24b5aca..014a9f87 100644
--- a/components/password_manager/core/common/passwords_directory_util_ios.cc
+++ b/components/password_manager/core/common/passwords_directory_util_ios.cc
@@ -7,8 +7,8 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 
 namespace password_manager {
diff --git a/components/password_manager/core/common/passwords_directory_util_ios_unittest.cc b/components/password_manager/core/common/passwords_directory_util_ios_unittest.cc
index fe0c468..e4d9945e 100644
--- a/components/password_manager/core/common/passwords_directory_util_ios_unittest.cc
+++ b/components/password_manager/core/common/passwords_directory_util_ios_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/components/password_manager/ios/BUILD.gn b/components/password_manager/ios/BUILD.gn
index a1374cf..c53bf96 100644
--- a/components/password_manager/ios/BUILD.gn
+++ b/components/password_manager/ios/BUILD.gn
@@ -7,11 +7,46 @@
 
   deps = [
     "//base",
+    "//components/autofill/core/common",
     "//ios/web/public",
+    "//url",
   ]
 
   sources = [
+    "account_select_fill_data.cc",
+    "account_select_fill_data.h",
     "js_password_manager.h",
     "js_password_manager.mm",
   ]
 }
+
+static_library("test_support") {
+  testonly = true
+  sources = [
+    "test_helpers.cc",
+    "test_helpers.h",
+  ]
+
+  deps = [
+    "//base",
+    "//components/autofill/core/common",
+    "//url",
+  ]
+}
+
+source_set("unit_tests") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  testonly = true
+  sources = [
+    "account_select_fill_data_unittest.cc",
+  ]
+  deps = [
+    ":ios",
+    ":test_support",
+    "//base",
+    "//base/test:test_support",
+    "//components/autofill/core/common",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/password_manager/ios/DEPS b/components/password_manager/ios/DEPS
index 0fc0ddd..cb7366a 100644
--- a/components/password_manager/ios/DEPS
+++ b/components/password_manager/ios/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
+  "+components/autofill/core/common",
   "+ios/web/public",
 ]
diff --git a/ios/chrome/browser/passwords/account_select_fill_data.cc b/components/password_manager/ios/account_select_fill_data.cc
similarity index 96%
rename from ios/chrome/browser/passwords/account_select_fill_data.cc
rename to components/password_manager/ios/account_select_fill_data.cc
index 0ec2614..07dd63c0 100644
--- a/ios/chrome/browser/passwords/account_select_fill_data.cc
+++ b/components/password_manager/ios/account_select_fill_data.cc
@@ -1,8 +1,8 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ios/chrome/browser/passwords/account_select_fill_data.h"
+#include "components/password_manager/ios/account_select_fill_data.h"
 
 #include "base/strings/string_util.h"
 #include "components/autofill/core/common/password_form_fill_data.h"
diff --git a/ios/chrome/browser/passwords/account_select_fill_data.h b/components/password_manager/ios/account_select_fill_data.h
similarity index 93%
rename from ios/chrome/browser/passwords/account_select_fill_data.h
rename to components/password_manager/ios/account_select_fill_data.h
index da27cee..dee31330 100644
--- a/ios/chrome/browser/passwords/account_select_fill_data.h
+++ b/components/password_manager/ios/account_select_fill_data.h
@@ -1,9 +1,9 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_PASSWORDS_ACCOUNT_SELECT_FILL_DATA_H_
-#define IOS_CHROME_BROWSER_PASSWORDS_ACCOUNT_SELECT_FILL_DATA_H_
+#ifndef COMPONENTS_PASSWORD_MANAGER_IOS_ACCOUNT_SELECT_FILL_DATA_H_
+#define COMPONENTS_PASSWORD_MANAGER_IOS_ACCOUNT_SELECT_FILL_DATA_H_
 
 #include <map>
 #include <memory>
@@ -127,4 +127,4 @@
 
 }  // namespace  password_manager
 
-#endif  // IOS_CHROME_BROWSER_PASSWORDS_ACCOUNT_SELECT_FILL_DATA_H_
+#endif  // COMPONENTS_PASSWORD_MANAGER_IOS_ACCOUNT_SELECT_FILL_DATA_H_
diff --git a/ios/chrome/browser/passwords/account_select_fill_data_unittest.cc b/components/password_manager/ios/account_select_fill_data_unittest.cc
similarity index 95%
rename from ios/chrome/browser/passwords/account_select_fill_data_unittest.cc
rename to components/password_manager/ios/account_select_fill_data_unittest.cc
index 3bee700..b115f4b 100644
--- a/ios/chrome/browser/passwords/account_select_fill_data_unittest.cc
+++ b/components/password_manager/ios/account_select_fill_data_unittest.cc
@@ -1,12 +1,13 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
+// Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ios/chrome/browser/passwords/account_select_fill_data.h"
+#include "components/password_manager/ios/account_select_fill_data.h"
 
+#include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/common/password_form_fill_data.h"
-#include "ios/chrome/browser/passwords/test_helpers.h"
+#include "components/password_manager/ios/test_helpers.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "testing/platform_test.h"
@@ -31,7 +32,7 @@
 class AccountSelectFillDataTest : public PlatformTest {
  public:
   AccountSelectFillDataTest() {
-    for (size_t i = 0; i < arraysize(form_data_); ++i) {
+    for (size_t i = 0; i < base::size(form_data_); ++i) {
       SetPasswordFormFillData(form_data_[i], kUrl, kUrl, kUsernameElements[i],
                               kUsernames[i], kPasswordElements[i],
                               kPasswords[i], kAdditionalUsernames[i],
@@ -166,7 +167,7 @@
   account_select_fill_data.Add(form_data_[1]);
 
   for (bool is_password_field : {false, true}) {
-    for (size_t form_i = 0; form_i < arraysize(form_data_); ++form_i) {
+    for (size_t form_i = 0; form_i < base::size(form_data_); ++form_i) {
       const auto& form_data = form_data_[form_i];
       // Suggestions should be shown on any password field on the form. So in
       // case of clicking on a password field it is taken an id different from
diff --git a/components/password_manager/ios/js_password_manager.h b/components/password_manager/ios/js_password_manager.h
index f4480e85..7b240f2 100644
--- a/components/password_manager/ios/js_password_manager.h
+++ b/components/password_manager/ios/js_password_manager.h
@@ -8,6 +8,25 @@
 #include "base/ios/block_types.h"
 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
 
+namespace autofill {
+struct PasswordFormFillData;
+}  // namespace autofill
+
+namespace password_manager {
+
+struct FillData;
+
+// Serializes |fillData| into a JSON string that can be used by the JS side
+// of PasswordController.
+NSString* SerializeFillData(const password_manager::FillData& fillData);
+
+// Serializes |formData| into a JSON string that can be used by the JS side
+// of PasswordController.
+NSString* SerializePasswordFormFillData(
+    const autofill::PasswordFormFillData& formData);
+
+}  // namespace password_manager
+
 // Loads the JavaScript file, password_controller.js, which contains password
 // form parsing and autofill functions. It will be evaluated on a page that
 // is known to have at least one password form (see hasPasswordField_ in
diff --git a/components/password_manager/ios/js_password_manager.mm b/components/password_manager/ios/js_password_manager.mm
index 8dbb824..1148b76 100644
--- a/components/password_manager/ios/js_password_manager.mm
+++ b/components/password_manager/ios/js_password_manager.mm
@@ -4,15 +4,66 @@
 
 #import "components/password_manager/ios/js_password_manager.h"
 
+#include "base/json/json_writer.h"
 #include "base/json/string_escape.h"
 #include "base/logging.h"
 #include "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
+#include "base/values.h"
+#include "components/autofill/core/common/password_form_fill_data.h"
+#include "components/password_manager/ios/account_select_fill_data.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
+namespace password_manager {
+
+NSString* SerializeFillData(const GURL& origin,
+                            const GURL& action,
+                            const base::string16& username_element,
+                            const base::string16& username_value,
+                            const base::string16& password_element,
+                            const base::string16& password_value) {
+  base::DictionaryValue rootDict;
+  rootDict.SetString("origin", origin.spec());
+  rootDict.SetString("action", action.spec());
+
+  auto fieldList = std::make_unique<base::ListValue>();
+
+  auto usernameField = std::make_unique<base::DictionaryValue>();
+  usernameField->SetString("name", username_element);
+  usernameField->SetString("value", username_value);
+  fieldList->Append(std::move(usernameField));
+
+  auto passwordField = std::make_unique<base::DictionaryValue>();
+  passwordField->SetString("name", password_element);
+  passwordField->SetString("value", password_value);
+  fieldList->Append(std::move(passwordField));
+
+  rootDict.Set("fields", std::move(fieldList));
+
+  std::string jsonString;
+  base::JSONWriter::Write(rootDict, &jsonString);
+  return base::SysUTF8ToNSString(jsonString);
+}
+
+NSString* SerializePasswordFormFillData(
+    const autofill::PasswordFormFillData& formData) {
+  return SerializeFillData(
+      formData.origin, formData.action, formData.username_field.name,
+      formData.username_field.value, formData.password_field.name,
+      formData.password_field.value);
+}
+
+NSString* SerializeFillData(const password_manager::FillData& fillData) {
+  return SerializeFillData(fillData.origin, fillData.action,
+                           fillData.username_element, fillData.username_value,
+                           fillData.password_element, fillData.password_value);
+}
+
+}  // namespace password_manager
+
 namespace {
 // Sanitizes |JSONString| and wraps it in quotes so it can be injected safely in
 // JavaScript.
diff --git a/ios/chrome/browser/passwords/test_helpers.cc b/components/password_manager/ios/test_helpers.cc
similarity index 93%
rename from ios/chrome/browser/passwords/test_helpers.cc
rename to components/password_manager/ios/test_helpers.cc
index 8ece456..8e5d48a 100644
--- a/ios/chrome/browser/passwords/test_helpers.cc
+++ b/components/password_manager/ios/test_helpers.cc
@@ -1,8 +1,8 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ios/chrome/browser/passwords/test_helpers.h"
+#include "components/password_manager/ios/test_helpers.h"
 
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/common/password_form_fill_data.h"
diff --git a/ios/chrome/browser/passwords/test_helpers.h b/components/password_manager/ios/test_helpers.h
similarity index 78%
rename from ios/chrome/browser/passwords/test_helpers.h
rename to components/password_manager/ios/test_helpers.h
index 019cf9f..ea6c176 100644
--- a/ios/chrome/browser/passwords/test_helpers.h
+++ b/components/password_manager/ios/test_helpers.h
@@ -1,9 +1,9 @@
-// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef IOS_CHROME_BROWSER_PASSWORDS_TEST_HELPERS_H_
-#define IOS_CHROME_BROWSER_PASSWORDS_TEST_HELPERS_H_
+#ifndef COMPONENTS_PASSWORD_MANAGER_IOS_TEST_HELPERS_H_
+#define COMPONENTS_PASSWORD_MANAGER_IOS_TEST_HELPERS_H_
 
 #include <string>
 
@@ -27,4 +27,4 @@
 
 }  // namespace  test_helpers
 
-#endif  // IOS_CHROME_BROWSER_PASSWORDS_TEST_HELPERS_H_
+#endif  // COMPONENTS_PASSWORD_MANAGER_IOS_TEST_HELPERS_H_
diff --git a/components/policy/core/browser/url_blacklist_manager.cc b/components/policy/core/browser/url_blacklist_manager.cc
index 03a9bc4..3aff71d 100644
--- a/components/policy/core/browser/url_blacklist_manager.cc
+++ b/components/policy/core/browser/url_blacklist_manager.cc
@@ -23,7 +23,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/values.h"
diff --git a/components/policy/core/common/cloud/cloud_policy_manager.cc b/components/policy/core/common/cloud/cloud_policy_manager.cc
index d642586..a853c937 100644
--- a/components/policy/core/common/cloud/cloud_policy_manager.cc
+++ b/components/policy/core/common/cloud/cloud_policy_manager.cc
@@ -11,8 +11,8 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "components/policy/core/common/cloud/cloud_policy_service.h"
 #include "components/policy/core/common/policy_bundle.h"
diff --git a/components/policy/core/common/configuration_policy_provider_test.cc b/components/policy/core/common/configuration_policy_provider_test.cc
index 04ca073..240fb4c 100644
--- a/components/policy/core/common/configuration_policy_provider_test.cc
+++ b/components/policy/core/common/configuration_policy_provider_test.cc
@@ -8,8 +8,8 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/values.h"
 #include "components/policy/core/common/configuration_policy_provider.h"
 #include "components/policy/core/common/external_data_fetcher.h"
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 82b31483..06a35ee 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -12619,6 +12619,32 @@
 
       When this policy is set to False, users will be unable to use Network File Shares.''',
     },
+    {
+      'name': 'WebRtcEventLogCollectionAllowed',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      # TODO(crbug.com/775415): Support for ChromeOS as well.
+      'supported_on': ['chrome.*:70-'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': True,
+      },
+      'example_value': True,
+      'id': 464,
+      'caption': '''Allow collection of WebRTC event logs from Google services''',
+      'tags': ['google-sharing'],
+      'desc': '''
+      If the policy is set to true, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> is allowed to collect WebRTC event logs from Google services (e.g. Google Meet), and upload those logs to Google.
+
+      If the policy is set to false, or is unset, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> may not collect nor upload such logs.
+
+      These logs contain information such as the time and size of sent and received RTP packets, feedback about congestion on the network, and metadata about time and quality of audio and video frames. This information is helpful when debugging issues with audio or video calls in Chrome, such as bandwidth estimation issues, etc. The logs do not contain audio or video contents from the call.
+
+      This data collection can only be triggered by Google's web services, such as Google Hangouts or Google Meet.
+
+      These logs may be associated, by means of a session ID, with other logs collected by the Google service itself; this is intended to make debugging easier.
+      ''',
+    },
   ],
 
   'messages': {
@@ -12760,5 +12786,5 @@
   },
   'placeholders': [],
   'deleted_policy_ids': [412],
-  'highest_id_currently_used': 463
+  'highest_id_currently_used': 464
 }
diff --git a/components/policy/resources/policy_templates_am.xtb b/components/policy/resources/policy_templates_am.xtb
index 20fd000..5fbd951 100644
--- a/components/policy/resources/policy_templates_am.xtb
+++ b/components/policy/resources/policy_templates_am.xtb
@@ -512,6 +512,11 @@
       ይህ ቅንብር እንዳልተዋቀረ ከተተወ ተጠቃሚው ይህን ተግባር መጠቀም ወይም አለመጠቀም ይችላል።
 
       ይህ ቅንብር ከ<ph name="PRODUCT_NAME" /> 29 እና ከዚያ ከፍ ካሉ ስሪቶች ተወግዷል።</translation>
+<translation id="2433412232489478893">ይህ መመሪያ የ<ph name="PRODUCT_NAME" /> የአውታረ መረብ ፋይል ማጋሪያ ባህሪያት ለአንድ ተጠቃሚ ይፈቀድ እንደሆነ ይቆጣጠራል።
+
+      ይህ መመሪያ ካልተዋቀረ ወይም ወደ እውነት ከተዋቀረ ተጠቃሚዎች የአውታረ መረብ ፋይል ማጋሪያዎችን መጠቀም ይችላሉ።
+
+      ይህ መመሪያ ወደ ሐሰት ሲዋቀር ተጠቃሚዎች የአውታረ መረብ ፋይል ማጋሪያዎችን መጠቀም አይችሉም።</translation>
 <translation id="2438609638493026652">የAndroid መተግበሪያ በሚጫንበት ጊዜ የቁልፍ ክስተቶች ወደ Google ሪፖርት ማድረግን ያነቃል። ክስተቶች የሚመዘገቡት ጭነታቸው በመመሪያ በኩል ለተቀሰቀሱ መተግበሪያዎ ብቻ ነው።
 
       መመሪያው ወደ እውነት ከተዋቀረ ክስተቶች በምዝግብ ማስታወሻ ይያዛሉ።
@@ -594,6 +599,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> የሚታይባቸውን ቋንቋዎች ያዋቅራል።
 
       ይህ መመሪያ ከተዋቀረ ተጠቃሚው <ph name="PRODUCT_OS_NAME" />ን በዚህ መመሪያ ከተጠቀሱት ቋንቋዎች ውስጥ በአንዱ ብቻ እንዲታይ ማዋቀር ይችላል። ይህ መመሪያ ካልተዋቀረ ወይም ወደ ባዶ ዝርዝር ከተዋቀረ <ph name="PRODUCT_OS_NAME" /> በሁሉም የሚደገፉ ቋንቋዎች ላይ ሊታይ ይችላል። ይህ መመሪያ የማይሠሩ እሴቶች ወዳለው ዝርዝር ከተዋቀረ ሁሉም የማይሠሩ እሴቶች ችላ ይባላሉ። አንድ ተጠቃሚ ከዚህ ቀደም <ph name="PRODUCT_OS_NAME" />ን በዚህ መመሪያ ወደ የማይፈቀድ ቋንቋ እንዲታይ አድርጎ ካዋቀረ የማሳያ አካባቢ ቋንቋው ተጠቃሚው በሚቀጥለው ጊዜ በመለያ ሲገባ ወደ የሚፈቀድ ቋንቋ ይቀየራል። ተጠቃሚው ተመራጭ ቋንቋዎችን አዋቅሮ ከሆነ እና ከተመራጭ ቋንቋዎቹ ውስጥ ወደ አንዱ አዋቅሮ ከነበረ <ph name="PRODUCT_OS_NAME" /> ወደዚህ ቋንቋ ይቀየራል። አለበለዚያ <ph name="PRODUCT_OS_NAME" /> በዚህ መመሪያ ወደተገለጸው የመጀመሪያው የሚሠራ እሴት ወይም መጠባበቂያ ቋንቋ (አሁን en-US) ይቀየራል፣ ይህም የሚሆነው ይህ መመሪያ የማይሠሩ ግቤቶች ካሉት ብቻ ነው።</translation>
+<translation id="2604182581880595781">ከአውታረ መረብ ፋይል ማጋሪያ ጋር የሚዛመዱ መመሪያዎችን ያዋቅሩ።</translation>
 <translation id="2623014935069176671">የመነሻ የተጠቃሚ እንቅስቃሴን ይጠብቁ</translation>
 <translation id="262740370354162807">የሰነዶች ወደ <ph name="CLOUD_PRINT_NAME" /> መግባትን ያነቃል</translation>
 <translation id="2627554163382448569">ለድርጅት ማተሚያዎች ውቅረቶችን ያቀርባል።
@@ -679,6 +685,7 @@
 <translation id="2823870601012066791">ለ<ph name="PRODUCT_OS_NAME" /> ደንበኛዎች የWindows መዝገብ ቦታ፦</translation>
 <translation id="2824715612115726353">ማንነትን የማያሳውቅ ሁነታን ያንቁ</translation>
 <translation id="2838830882081735096">የውሂብ ዝውውርን እና ኤአርሲ አይፍቀዱ</translation>
+<translation id="2839294585867804686">የአውታረ መረብ ፋይል ማጋሪያ ቅንብሮች</translation>
 <translation id="2840269525054388612">ተጠቃሚው ሊጠቀምባቸው የሚችላቸው አታሚዎችን ይገልጻል።
 
       ይህ መመሪያ ስራ ላይ የሚውለው <ph name="PRINTERS_WHITELIST" /> ለ<ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ከተመረጠ ብቻ ነው።
@@ -1174,6 +1181,7 @@
       ይህ መመሪያ ከተተወ ወይም ካልተቀናበረ፣ የዩእርኤል ቁልፍ ያለውን ማንነትን የማያሳውቅ ውሂብ ስብስብ ይነቃል ሆኖም ግን ተጠቃሚ ሊለውጠው ይችላል።</translation>
 <translation id="4250680216510889253">አይ</translation>
 <translation id="4261820385751181068">የመሣሪያ መግቢያ ገጽ ቋንቋ</translation>
+<translation id="4264607809747169568">የአውታረ መረብ ፋይል ማጋሪያዎችን ለChromeOS ተገኝነትን ይቆጣጠራል</translation>
 <translation id="427220754384423013">ተጠቃሚው ሊጠቀምባቸው የሚችላቸው አታሚዎችን ይገልጻል።
 
       ይህ መመሪያ ስራ ላይ የሚውለው <ph name="PRINTERS_WHITELIST" /> ለ<ph name="BULK_PRINTERS_ACCESS_MODE" /> ከተመረጠ ብቻ ነው
@@ -1606,6 +1614,15 @@
       የመመሪያ እሴቱ በሚሊሰከንዶች ነው መገለጽ ያለበት።</translation>
 <translation id="5511702823008968136">የዕልባት አሞሌን አንቃ</translation>
 <translation id="5512418063782665071">የመነሻ ገጽ ዩአርኤል</translation>
+<translation id="551639594034811656">ይህ መመሪያ በOU ያሉ ዝማኔው ከተገኘበት የመጀመሪያው ቀን ጀምሮ በየቀኑ መዘመን ያለባቸው የ<ph name="PRODUCT_OS_NAME" /> መሣሪያዎች ክፍልፋዩን የሚገልጹ የመቶኛዎች ዝርዝር ይገልጻል። መሣሪያው ዝማኔዎች ካሉ የሚፈትሸው ዝማኔው ከታተመ በኋላ ቆይቶ ሊሆን ስለሚችል የግኝት ጊዜው ከዝማኔ ህትመት ጊዜ በኋላ ነው።
+
+      እያንዳንዱ (ቀን፣ መቶኛ) ጥምር ዝማኔው ከተገኘ በኋላ እስከተሰጠው የቀኖች ብዛት ድረስ መዘመን ያለበት የስብስቡ መቶኛን ይይዛል። ለምሳሌ፣ እነዚህ እነዚህ [(4, 40), (10, 70), (15, 100)] ጥምሮች ካሉ እንግዲህ የስብስቡ 40% ዝማኔው ካየ በኋላ 4 ቀኖች ድረስ መዘመን አለበት። 70% ከ10 ቀን በኋላ መዘመን አለበት፣ ወዘተ።
+
+      ለዚህ መመሪያ የተገለጸ እሴት ካለ ዝማኔዎች የ<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> መመሪያውን ችላ ይሉትና በምትክሉ ይህን መመሪያ ይከተሉታል።
+
+      ይህ ዝርዝር ባዶ ከሆነ ምንም ማዘጋጀት የማይኖር ሲሆን ዝማኔዎች በሌሎች የመሣሪያ መመሪያዎቻቸው መሠረት ይተገበራሉ።
+
+      ይህ መመሪያ የሰርጥ መለወጫዎችን አይመለከትም።</translation>
 <translation id="5523812257194833591">ከአንድ መዘግየት በኋላ በራስ-የሚገባበት ይፋዊ ክፍለ-ጊዜ።
 
       ይህ መመሪያ ከተዋቀረ የመግቢያ ገጹ ላይ ያለተጠቃሚ መስተጋብር የተወሰነ ጊዜ ካለፈ በኋላ  የተገለጸው ክፍለ-ጊዜ በራስ-ሰር ይገባል። ይፋዊ ክፍለ-ጊዜው አስቀድሞ መዋቀር አለበት (|DeviceLocalAccounts| ይመልከቱ)።
@@ -2531,6 +2548,11 @@
       መመሪያው ከተሰናከለ ምንም ግልጽ የጣቢያ ማግለል አይከሰትም፣ እና የIsolateOrigins እና የSitePerProcess የመስክ ሙከራዎች ይሰናከላሉ። ተጠቃሚዎች አሁንም ራሳቸው SitePerProcessን ማንቃት ይችላሉ።
       መመሪያው ካልተዋቀረ ተጠቃሚው ይህን ቅንብር መቀየር ይችላል።
       </translation>
+<translation id="7902255855035461275">በዚህ ዝርዝር ውስጥ ያሉ ስርዓተ ጥለቶች ከሚጠይቀው ዩአርኤል የደህንነት መነሻ
+      ጋር እንዲዛመዱ ይደረጋሉ። የሚዛመድ ከተገኘ የቪዲዮ መቅረጫ
+      መሣሪያዎች መድረሻ ሳይጠየቅ ይሰጣል።
+
+      ማስታወሻ፦ እስከ ስሪት 45 ድረስ ይህ መመሪያ በኪዮስክ ሁነታ ላይ ብቻ ነበር የሚደገፈው።</translation>
 <translation id="7912255076272890813">የተፈቀዱ የመተግበሪያ/ቅጥያ አይነቶችን ያዋቅሩ</translation>
 <translation id="7915236031252389808">እዚህ ለተኪ .pac ፋይሉ አንድ ዩአርኤል መግለጽ ይችላሉ።
 
diff --git a/components/policy/resources/policy_templates_ar.xtb b/components/policy/resources/policy_templates_ar.xtb
index cae7efe1..2b3e09a7 100644
--- a/components/policy/resources/policy_templates_ar.xtb
+++ b/components/policy/resources/policy_templates_ar.xtb
@@ -513,6 +513,11 @@
       إذا تم ترك هذا الإعداد بدون تعيين، يمكن أن يقرر المستخدم استخدام هذه الوظيفة أو عدم استخدامها.
 
       تمت إزالة هذا الإعداد من <ph name="PRODUCT_NAME" /> 29 والإصدارات الأحدث.</translation>
+<translation id="2433412232489478893">‏تتحكّم هذه السياسة في ما إذا كان يُسمح للمستخدم بميزة "خوادم مشاركة الملفات على الشبكة" لـ <ph name="PRODUCT_NAME" /> أم لا.
+
+      في حال عدم تهيئة هذه السياسة أو ضبطها على "True"، سيتمكّن المستخدمون من استخدام ميزة "خوادم مشاركة الملفات على الشبكة".
+
+      وفي حال ضبط هذه السياسة على "False"، لن يتمكّن المستخدمون من استخدام ميزة "خوادم مشاركة الملفات على الشبكة".</translation>
 <translation id="2438609638493026652">‏تُفعّل هذه السياسة الإبلاغ عن الأحداث المهمة أثناء تثبيت تطبيق Android على Google. لا يتم تسجيل الأحداث إلا على التطبيقات التي تم تشغيل التثبيت التابع لها عبر السياسة.
 
       في حال تعيين السياسة على "true"، سيتم تسجيل الأحداث.
@@ -585,6 +590,7 @@
 <translation id="2598508021807251719">‏تهيئة اللغات التي قد يُعرض <ph name="PRODUCT_OS_NAME" /> بها.
 
       في حال وضع هذه السياسة، لا يستطيع المستخدم سوى تهيئة <ph name="PRODUCT_OS_NAME" /> ليتم عرضه بإحدى اللغات التي تحدّدها هذه السياسة. إذا لم يتم وضع هذه السياسة أو تم ضبطها على قائمة فارغة، يمكن عرض <ph name="PRODUCT_OS_NAME" /> بكل لغات واجهة المستخدم المدعومة. وإذا تم ضبط هذه السياسة على قائمة ذات قيم غير صالحة، سيتم تجاهل كل القيم غير الصالحة. إذا سبق للمستخدم تهيئة <ph name="PRODUCT_OS_NAME" /> ليتم عرضه بلغة لا تسمح بها هذه السياسة، سيتم تبديل لغة العرض إلى لغة واجهة مستخدم مسموح بها عند تسجيل دخول المستخدم في المرة القادمة. وإذا هيأ المستخدم اللغات المفضّلة وسمحت السياسة بإحدى هذه اللغات المفضّلة، سيتحوّل <ph name="PRODUCT_OS_NAME" /> إلى هذه اللغة. أو سيتحوّل <ph name="PRODUCT_OS_NAME" /> إلى أول قيمة صالحة تحدّدها هذه السياسة، أو إلى لغة بديلة (حاليًا en-US)، إذا كانت السياسة لا تحتوي إلا على إدخالات غير صالحة.</translation>
+<translation id="2604182581880595781">تهيئة السياسات المرتبطة بميزة "خوادم مشاركة الملفات على الشبكة".</translation>
 <translation id="2623014935069176671">انتظار نشاط المستخدم الأولي</translation>
 <translation id="262740370354162807">تفعيل إرسال المستندات إلى <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">‏توفِّر السياسة عمليات تهيئة لطابعات المؤسسة وتسمح بتوفير عمليات تهيئة الطابعات لأجهزة <ph name="PRODUCT_OS_NAME" /> أيضًا. ويتطابق التنسيق مع تنسيق معجم NativePrinters، لكن أضيف حقل "id" أو "guid" إلزامي لكل طابعة لتحديد ما إذا سيتم إضافتها إلى القوائم البيضاء أو القوائم السوداء.
@@ -658,6 +664,7 @@
 <translation id="2823870601012066791">‏موقع سجل Windows لعملاء <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">تفعيل وضع التصفح المتخفي</translation>
 <translation id="2838830882081735096">‏عدم السماح بترحيل البيانات وARC</translation>
+<translation id="2839294585867804686">إعدادات ميزة "خوادم مشاركة الملفات على الشبكة"</translation>
 <translation id="2840269525054388612">‏تُحدد السياسة الطابعات التي يمكن لأي مستخدم استخدامها.
 
       لا يتم استخدام هذه السياسة إلا في حال اختيار <ph name="PRINTERS_WHITELIST" /> لـ <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1138,6 +1145,7 @@
       وفي حال ترك هذه السياسة بدون تحديد، سيتم تفعيل مجموعة البيانات مجهولة المصدر والمستندة إلى عنوان URL، ولكن سيتمكَّن المستخدم من تغييرها.</translation>
 <translation id="4250680216510889253">لا</translation>
 <translation id="4261820385751181068">لغة شاشة تسجيل الدخول إلى الجهاز</translation>
+<translation id="4264607809747169568">‏تتحكّم في ميزة "خوادم مشاركة الملفات على الشبكة" لتوفّر نظام التشغيل Chrome</translation>
 <translation id="427220754384423013">‏تُحدد السياسة الطابعات التي يمكن لأي مستخدم استخدامها.
 
       لا يتم استخدام هذه السياسة إلا في حال اختيار <ph name="PRINTERS_WHITELIST" /> لـ <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1526,6 +1534,15 @@
       يجب تحديد قيمة السياسة بالمللي ثانية.</translation>
 <translation id="5511702823008968136">تفعيل شريط الإشارات</translation>
 <translation id="5512418063782665071">‏عنوان URL للصفحة الرئيسية</translation>
+<translation id="551639594034811656">تُحدِّد هذه السياسة قائمة بالنسب المئوية التي ستحدّد الجزء الذي سيتم تحديثه يوميًا من أجهزة <ph name="PRODUCT_OS_NAME" /> في الوحدة التنظيمية بدءًا من اليوم الذي يتم فيه اكتشاف التحديث لأول مرة. وسيكون وقت الاكتشاف بعد وقت التحديث المنشور، حيث من الممكن أن يستغرق الأمر بعض الوقت حتى يبحث الجهاز عن التحديثات بعد نشر التحديث.
+
+      يحتوي كل زوج (يوم، نسبة مئوية) على النسبة المئوية للأسطول التي يجب تحديثها حسب عدد الأيام المُحدّد منذ اكتشاف التحديث. فمثلاً إذا كان لدينا الأزواج [(4، 40)، (10، 70)، (15، 100)]، عندئذٍ يجب تحديث 40% من الأسطول بعد 4 أيام من ظهور التحديث. ويجب تحديث 70% بعد 10 أيام، وهكذا.
+
+      في حال تحديد قيمة لهذه السياسة، ستتجاهل التحديثات سياسة <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> وستتَّبِع هذه السياسة بدلاً منها.
+
+      وفي حال ترك هذه القائمة فارغة، لن تتوفَّر أي مراحل وسيتم تطبيق التحديثات وفقًا لسياسات الجهاز الأخرى.
+
+      لا تنطبق هذه السياسة على عمليات تبديل القنوات.</translation>
 <translation id="5523812257194833591">‏جلسة عامة يتم تسجيل الدخول إليها تلقائيًا بعد مهلة.
 
       في حالة تعيين هذه السياسة، سيتم تسجيل الدخول تلقائيًا إلى الجلسة المحددة بعد مرور فترة زمنية في شاشة تسجيل الدخول بدون أي إجراء من المستخدم. يجب أن تتم تهيئة الجلسة مسبقًا (اطلع على |DeviceLocalAccounts|).
@@ -2407,6 +2424,11 @@
       في حال إيقاف السياسة، لن يتم عزل أي موقع بشكلٍ صريح وسيتم إيقاف التجارب الميدانية لكل من IsolateOrigins وSitePerProcess، لكن سيظل بإمكان المستخدمين تفعيل SitePerProcess يدويًا.
       إذا لم يتم وضع السياسة، سيتمكّن المستخدم من تغيير هذا الإعداد.
       </translation>
+<translation id="7902255855035461275">‏ستتم مطابقة الأنماط المُدرجة في هذه القائمة مع المصدر الأمني
+      لعنوان URL المطلوب.  في حال وجود تطابق، سيُمنح إذن الوصول إلى
+      أجهزة التقاط الفيديو بدون رسالة مطالبة.
+
+      ملاحظة: لا تعمل هذه السياسة إلا في وضع الكشك حتى الإصدار 45.</translation>
 <translation id="7912255076272890813">تهيئة أنواع التطبيقات/الإضافات المسموح بها</translation>
 <translation id="7915236031252389808">‏يمكنك تحديد عنوان URL لملف pac. للخادم الوكيل هنا.
 
diff --git a/components/policy/resources/policy_templates_bg.xtb b/components/policy/resources/policy_templates_bg.xtb
index b917db3..2024667 100644
--- a/components/policy/resources/policy_templates_bg.xtb
+++ b/components/policy/resources/policy_templates_bg.xtb
@@ -506,6 +506,11 @@
 Ако настройката не е зададена, потребителите са в състояние да решат дали да използва функцията.
 
 Тази настройка е премахната от <ph name="PRODUCT_NAME" /> 29 и по-новите версии.</translation>
+<translation id="2433412232489478893">Това правило контролира дали функцията на <ph name="PRODUCT_NAME" /> за споделяне на файлове в мрежата да е разрешена за потребителите.
+
+Когато то не е конфигурирано или е true, потребителите ще могат да използват функцията.
+
+При задаване на false това няма да е възможно.</translation>
 <translation id="2438609638493026652">Активира съобщаването на Google на информация за ключови събития по време на инсталирането на приложения за Android. Събитията се записват само за приложения, чието инсталиране е задействано от правило.
 
 Ако за правилото е зададено true, събитията ще се записват в регистрационен файл.
@@ -583,6 +588,7 @@
 <translation id="2598508021807251719">Конфигурира локалите, на които да е разрешено показването на <ph name="PRODUCT_OS_NAME" />.
 
 Ако това правило е зададено, локалите за показване на <ph name="PRODUCT_OS_NAME" />, които може да избере потребителят, са ограничени до посочените в правилото. В случай че то не е зададено или е конфигурирано като празен списък, <ph name="PRODUCT_OS_NAME" /> може да се показва на всички поддържани локали на ПИ. При посочване на списък с невалидни стойности те ще бъдат пренебрегнати. Ако по-рано потребителят е конфигурирал <ph name="PRODUCT_OS_NAME" /> да се показва на език, който не е разрешен от това правило, ще се превключи към разрешен локал на ПИ следващия път, когато потребителят влезе в профила си. Ако потребителят е конфигурирал предпочитани локали и един от тях е разрешен от това правило, <ph name="PRODUCT_OS_NAME" /> ще превключи към този локал. В противен случай <ph name="PRODUCT_OS_NAME" /> ще превключи към първата валидна стойност, посочена в правилото, или към резервен локал (който понастоящем е en-US), ако то съдържа само невалидни записи.</translation>
+<translation id="2604182581880595781">Конфигуриране на правилата за споделяне на файлове в мрежата.</translation>
 <translation id="2623014935069176671">Изчакване на първоначална потребителска активност</translation>
 <translation id="262740370354162807">Активиране на изпращането на документи до <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Осигурява конфигурации за корпоративни принтери.
@@ -663,6 +669,7 @@
 <translation id="2823870601012066791">Местоположение в системния регистър на Windows за клиенти под <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Активиране на режим „инкогнито“</translation>
 <translation id="2838830882081735096">Забраняване на мигрирането на данни и ARC</translation>
+<translation id="2839294585867804686">Настройки за споделяне на файлове в мрежата</translation>
 <translation id="2840269525054388612">Посочва кои принтери могат да се използват от потребителя.
 
 Това правило е в сила само ако сте избрали <ph name="PRINTERS_WHITELIST" /> за <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1143,6 +1150,7 @@
 Ако правилото не е зададено, функцията ще е активирана, но потребителят ще може да променя настройката.</translation>
 <translation id="4250680216510889253">Не</translation>
 <translation id="4261820385751181068">Локал на екрана за вход в устройството</translation>
+<translation id="4264607809747169568">Управление на наличността на функцията на Chrome OS за споделяне на файлове в мрежата</translation>
 <translation id="427220754384423013">Посочва кои принтери могат да се използват от потребителя.
 
 Това правило е в сила само ако сте избрали <ph name="PRINTERS_WHITELIST" /> за <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1545,6 +1553,15 @@
 Стойността на правилото трябва да се посочи в милисекунди.</translation>
 <translation id="5511702823008968136">Активиране на лентата на отметките</translation>
 <translation id="5512418063782665071">URL адрес на началната страница</translation>
+<translation id="551639594034811656">Това правило служи за съставяне на списък с процентни стойности, указващи каква част от устройствата с <ph name="PRODUCT_OS_NAME" /> в ОЕ да бъдат актуализирани на ден, като се започва от деня на първото откриване на актуализацията. Моментът на откриването е по-късен от този на публикуване на актуализацията, тъй като е възможно да измине известно време след публикуването, докато устройството провери за актуализации.
+
+Всяка двойка (ден, процент) указва какъв процент от устройствата трябва да бъдат актуализирани в рамките на дадения брой дни след откриването на актуализацията. Например двойките [(4, 40), (10, 70), (15, 100)] показват, че 40% от устройствата трябва да са актуализирани 4 дни след откриването й, 70% – 10 дни след него и т.н.
+
+Ако за това правило е зададена стойност, актуализациите ще са съобразени с него и правилото <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ще бъде пренебрегнато.
+
+В случай че списъкът е празен, актуализациите няма да се инсталират поетапно, а ще бъдат прилагани според другите правила за устройства.
+
+Това правило не е приложимо при промяна на канала.</translation>
 <translation id="5523812257194833591">Обществена сесия, в която да се влезе автоматично след забавяне.
 
 Ако това правило е зададено, посочената сесия ще започне автоматично, след като на екрана за вход не е имало потребителско взаимодействие за даден период от време. Обществената сесия трябва вече да е конфигурирана (вижте |DeviceLocalAccounts|).
@@ -2439,6 +2456,11 @@
 В случай че правилото е деактивирано, няма да се осъществява изрично изолиране на сайтове и полевите изпитания на IsolateOrigins и SitePerProcess ще бъдат деактивирани. Потребителите пак ще могат да активират SitePerProcess ръчно.
 Ако правилото не е конфигурирано, потребителите ще са в състояние да променят тази настройка.
       </translation>
+<translation id="7902255855035461275">Ще се търси съответствие между образците в този списък и първоизточника на сигурност
+на отправящия заявката URL адрес. Ако има съответствие, достъпът до устройствата
+за видеозапис ще бъде предоставен без подкана.
+
+ЗАБЕЛЕЖКА: Преди версия 45 това правило се поддържаше само в павилионен режим.</translation>
 <translation id="7912255076272890813">Конфигуриране на разрешените типове приложения/разширения</translation>
 <translation id="7915236031252389808">Тук можете да посочите URL адрес на .pac файл за прокси сървър.
 
diff --git a/components/policy/resources/policy_templates_bn.xtb b/components/policy/resources/policy_templates_bn.xtb
index 8cbb0439..cd6ff47 100644
--- a/components/policy/resources/policy_templates_bn.xtb
+++ b/components/policy/resources/policy_templates_bn.xtb
@@ -342,6 +342,11 @@
       কোনো সেটিং অনির্দিষ্ট রাখা হলে, ডিফল্ট মান ব্যবহৃত হবে।
 
       এই নীতিটিকে সেট করা না হলে, সব সেটিংস এর জন্য ডিফল্ট মান ব্যবহৃত হবে।</translation>
+<translation id="1958138414749279167"><ph name="PRODUCT_NAME" />-এর 'আপনা-আপনি পূরণ হওয়া' ফিচারটি চালু করে এবং ব্যবহারকারীদের আগে সেভ করা তথ্য ব্যবহার করে ঠিকানার তথ্য ওয়েব ফর্মে নিজে থেকে পূরণ করতে দেয়।
+
+      আপনি যদি এই সেটিংটি বন্ধ করেন তাহলে 'আপনা-আপনি পূরণ হওয়া' ফিচারটি ঠিকানার তথ্য পূরণের প্রস্তাব দেবে না, নিজে থেকে তা পূরণ করবে না এবং ওয়েবে ব্রাউজ করার সময় ব্যবহারকারী ঠিকানার কোনও অতিরিক্ত তথ্য জমা দিলে তা সেভ করবে না।
+
+      আপনি যদি এই সেটিংটি চালু করেন বা কোনও মান সেট না করেন তাহলে ব্যবহারকারী UI-তে ঠিকানার ক্ষেত্রে 'আপনা-আপনি পূরণ হওয়া' ফিচারটি নিয়ন্ত্রণ করতে পারবেন।</translation>
 <translation id="1960840544413786116">subjectAlternativeName এক্সটেনশান অনুপস্থিত রয়েছে এমন স্থানীয় বিশ্বস্ততা অ্যাঙ্করের দ্বারা জারিকৃত শংসাপত্রগুলিকে অনুমতি দেওয়া হবে কিনা</translation>
 <translation id="1964634611280150550">ছদ্মবেশি মোড অক্ষমিত রয়েছে</translation>
 <translation id="1964802606569741174">Android YouTube অ্যাপ্লিকেশানের উপর এই নীতির কোনো প্রভাব নেই। যদি YouTube এ নিরাপদ মোড বলবৎ করতে হয়, তাহলে Android YouTube অ্যাপ্লিকেশানের ইনস্টলেশন অননুমোদিত করতে হবে।</translation>
@@ -2252,6 +2257,7 @@
 <translation id="6440051664870270040">সাইটগুলিকে একসাথে নেভিগেট এবং পপ-আপগুলি খোলার অনুমতি দিন</translation>
 <translation id="6447948611083700881">ব্যাক-আপ এবং পুনরুদ্ধার বিকল্প বন্ধ রয়েছে</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" />-এর জন্য জোর করে সাইন-ইন চালু করুন</translation>
+<translation id="6464074037294098618">ঠিকানার ক্ষেত্রে 'আপনা-আপনি পূরণ হওয়া' ফিচারটি চালু করুন</translation>
 <translation id="6467613372414922590">ব্যবহারকারী লেভেলের নেটিভ মেসেজিং হোস্টগুলিকে অনুমতি দিন (প্রশাসকের অনুমতি ছাড়াই ইনস্টল করা)</translation>
 <translation id="6468980648680553776">এই নীতি থামিয়ে দেওয়া হয়েছে। অনুগ্রহ করে পরিবর্তে RemoteAccessHostClientDomainList ব্যবহার করুন।</translation>
 <translation id="6473623140202114570">এমন ডোমেনগুলির তালিকা কনফিগার করুন যা নিরাপদ ব্রাউজিং সতর্কতাগুলিকে ট্রিগার করবে না।</translation>
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index b42a9d20..ea9cea9 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -503,6 +503,11 @@
       Si no s'estableix aquesta opció, l'usuari pot decidir si vol fer servir aquesta funció o no.
 
       Aquesta configuració s'ha suprimit a la versió 29 i versions posteriors de <ph name="PRODUCT_NAME" />.</translation>
+<translation id="2433412232489478893">Aquesta política controla si es permet utilitzar la funció Ús compartit dels fitxers de la xarxa per a <ph name="PRODUCT_NAME" /> als usuaris.
+
+      Si aquesta política no es configura o s'estableix en "true", els usuaris podran fer servir la funció Ús compartit dels fitxers de la xarxa.
+
+      Si aquesta política s'estableix en "false", els usuaris no podran fer servir la funció Ús compartit dels fitxers de la xarxa.</translation>
 <translation id="2438609638493026652">Permet informar Google d'esdeveniments clau durant la instal·lació d'aplicacions per a Android. Només es capturen esdeveniments si la instal·lació d'aplicacions s'activa mitjançant la política.
 
       Si la política s'estableix en "true", es registren esdeveniments.
@@ -580,6 +585,7 @@
 <translation id="2598508021807251719">Estableix les configuracions regionals en què es pot mostrar <ph name="PRODUCT_OS_NAME" />.
 
       Si aquesta política s'estableix, l'usuari només podrà configurar <ph name="PRODUCT_OS_NAME" /> perquè es mostri en una de les configuracions regionals especificades per aquesta política. Si aquesta política no s'estableix o s'estableix en una llista buida, <ph name="PRODUCT_OS_NAME" /> es podrà mostrar en totes les configuracions regionals admeses per a IU. Si aquesta política s'estableix en una llista amb valors no vàlids, tots els valors no vàlids s'ignoraran. Si un usuari ha configurat prèviament <ph name="PRODUCT_OS_NAME" /> perquè es mostri en un idioma que aquesta política no admet, la configuració regional de visualització canviarà a una configuració regional permesa per a la IU la propera vegada que l'usuari iniciï la sessió. Si l'usuari havia establert configuracions regionals preferides i aquesta política n'admet una, <ph name="PRODUCT_OS_NAME" /> canviarà a aquesta configuració regional. En canvi, si aquesta política només conté entrades no vàlides, <ph name="PRODUCT_OS_NAME" /> canviarà al primer valor vàlid que especifiqui aquesta política o a una configuració regional alternativa (actualment, en-US).</translation>
+<translation id="2604182581880595781">Configura les polítiques relacionades amb la funció Ús compartit dels fitxers de la xarxa.</translation>
 <translation id="2623014935069176671">Espereu que hi hagi una activitat inicial de l'usuari.</translation>
 <translation id="262740370354162807">Activa l'enviament de documents a <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Proporciona configuracions per a les impressores d'empresa.
@@ -658,6 +664,7 @@
 <translation id="2823870601012066791">Ubicació del registre de Windows per a clients amb <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Activa el mode d'incògnit</translation>
 <translation id="2838830882081735096">No permetis la migració de dades i ARC</translation>
+<translation id="2839294585867804686">Configuració de la funció Ús compartit dels fitxers de la xarxa</translation>
 <translation id="2840269525054388612">Especifica les impressores que un usuari pot fer servir.
 
       Aquesta política només s'utilitza si se selecciona <ph name="PRINTERS_WHITELIST" /> per a <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1136,6 +1143,7 @@
       Si aquesta política es deixa sense definir, la recopilació de dades anònimes amb URL s'activarà però l'usuari podrà canviar aquesta opció.</translation>
 <translation id="4250680216510889253">No</translation>
 <translation id="4261820385751181068">Configuració regional de la pantalla d'inici de sessió del dispositiu</translation>
+<translation id="4264607809747169568">Controla si la funció Ús compartit dels fitxers de la xarxa estarà disponible per a Chrome OS</translation>
 <translation id="427220754384423013">Especifica les impressores que un usuari pot fer servir.
 
       Aquesta política només s'utilitza si se selecciona <ph name="PRINTERS_WHITELIST" /> per a <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1534,6 +1542,15 @@
       El valor de la política s'ha d'especificar en mil·lisegons.</translation>
 <translation id="5511702823008968136">Activa la barra d'adreces d'interès</translation>
 <translation id="5512418063782665071">URL de la pàgina d'inici</translation>
+<translation id="551639594034811656">Aquesta política defineix una llista de percentatges que determinen quina part dels dispositius <ph name="PRODUCT_OS_NAME" /> de l'UO cal actualitzar diàriament a partir del dia en què l'actualització es detecta per primer cop. El moment de detecció és posterior al de publicació, ja que pot passar una estona des que es publica l'actualització fins que el dispositiu comprova si hi ha actualitzacions.
+
+      Cada parell (dies, percentatge) indica el percentatge de dispositius que s'ha d'actualitzar en el termini de dies transcorreguts des que es detecta l'actualització. Per exemple, si tenim els parells [(4, 40), (10, 70), (15, 100)], el 40% dels dispositius s'ha d'actualitzar 4 dies després de detectar-se l'actualització, el 70% s'ha d'actualitzar passats 10 dies i així successivament.
+
+      Si es defineix un valor per a aquesta política, les actualitzacions ignoraran la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> i seguiran aquesta.
+
+      Si aquesta llista està buida, les actualitzacions no es faran per fases, sinó que s'aplicaran tenint en compte les polítiques d'altres dispositius.
+
+      Aquesta política no s'aplica als canvis de canal.</translation>
 <translation id="5523812257194833591">Sessió pública per iniciar la sessió automàticament després d'un retard.
 
       Si aquesta política es defineix, s'iniciarà automàticament la sessió especificada després d'un període de temps a la pantalla d'inici de sessió sense interacció de l'usuari. La sessió pública ja ha d'estar configurada (consulteu |DeviceLocalAccounts|).
@@ -2418,6 +2435,11 @@
       Si la política es desactiva, no es produirà l'aïllament explícit de cap lloc web i es desactivaran les proves de camp de les polítiques IsolateOrigins i SitePerProcess. Els usuaris podran continuar activant SitePerProcess manualment.
       Si no es configura la política, l'usuari podrà canviar aquesta opció de configuració.
       </translation>
+<translation id="7902255855035461275">Els patrons d'aquesta llista es compararan amb l'origen de seguretat
+      de l'URL que has sol·licitat. Si es troba alguna coincidència, es permetrà l'accés
+      als dispositius de captura de vídeo sense confirmació.
+
+      NOTA: fins a la versió 45, aquesta política només s'admetia en mode quiosc.</translation>
 <translation id="7912255076272890813">Configuració dels tipus d'aplicacions i d'extensions permeses</translation>
 <translation id="7915236031252389808">Permet especificar l'URL d'un fitxer .pac del servidor intermediari.
 
diff --git a/components/policy/resources/policy_templates_cs.xtb b/components/policy/resources/policy_templates_cs.xtb
index f1bc67c..b816ba69 100644
--- a/components/policy/resources/policy_templates_cs.xtb
+++ b/components/policy/resources/policy_templates_cs.xtb
@@ -1141,7 +1141,7 @@
 
 Pokud tuto zásadu nenastavíte, použije se pro všechny webové stránky globální výchozí hodnota buď ze zásady DefaultKeygenSetting (pokud je nastavena), nebo z osobního nastavení uživatele.</translation>
 <translation id="4239720644496144453">Pro aplikace Android se mezipaměť nepoužívá. Pokud několik uživatelů nainstaluje stejnou aplikaci Android, stáhne se aplikace pro každého uživatele znovu.</translation>
-<translation id="4243336580717651045">Zapne v prohlížeči <ph name="PRODUCT_NAME" /> shromažďování anonymizovaných dat přidružených k adresám URL a znemožňuje uživatelům toto nastavení změnit.
+<translation id="4243336580717651045">Zapne v prohlížeči <ph name="PRODUCT_NAME" /> shromažďování anonymizovaných dat přidružených k adresám URL a znemožní uživatelům toto nastavení změnit.
 
       Při shromažďování anonymizovaných dat přidružených k adresám URL se adresy URL navštívených stránek odesílají do Googlu kvůli usnadnění vyhledávání a prohlížení.
 
diff --git a/components/policy/resources/policy_templates_da.xtb b/components/policy/resources/policy_templates_da.xtb
index ab38b98c..c43dc725 100644
--- a/components/policy/resources/policy_templates_da.xtb
+++ b/components/policy/resources/policy_templates_da.xtb
@@ -294,6 +294,11 @@
       Hvis en indstilling ikke er specificeret, anvendes en standardværdi.
 
       Hvis denne politik ikke er indstillet, anvendes standarder for alle indstillinger.</translation>
+<translation id="1958138414749279167">Aktiverer funktionen AutoFyld for <ph name="PRODUCT_NAME" /> og giver brugerne mulighed for automatisk at udfylde webformularer med adresseoplysninger, der er gemt tidligere.
+
+      Hvis denne indstilling er deaktiveret, foreslår eller udfylder AutoFyld aldrig adresseoplysninger, og der gemmes heller ikke yderligere adresseoplysninger, som brugeren muligvis indsender, når vedkommende er på nettet.
+
+      Hvis denne indstilling er aktiveret eller ikke har nogen værdi, kan brugeren administrere den overordnede AutoFyld-funktion for adresser i brugerfladen.</translation>
 <translation id="1960840544413786116">Hvorvidt der skal gives tilladelse til certifikater, som er udstedt af lokale tillidsankre og mangler udvidelsen subjectAlternativeName</translation>
 <translation id="1964634611280150550">Inkognitotilstand er deaktiveret</translation>
 <translation id="1964802606569741174">Denne politik påvirker ikke YouTube-appen til Android. Hvis Beskyttet tilstand på YouTube skal håndhæves, skal installation af YouTube-appen til Android ikke tillades.</translation>
@@ -506,6 +511,11 @@
       Hvis denne indstilling ikke konfigureres, kan brugeren bestemme, om denne funktion skal anvendes eller ej.
 
       Denne indstilling er fjernet fra <ph name="PRODUCT_NAME" />-version 29 og nyere.</translation>
+<translation id="2433412232489478893">Denne politik styrer, om fildelingsfunktionen via netværk for <ph name="PRODUCT_NAME" /> er tilladt for en bruger.
+
+      Når denne politik ikke er konfigureret eller er angivet som sand, kan brugerne anvende fildeling via netværk.
+
+      Når denne politik er angivet som falsk, kan brugerne ikke anvende fildeling via netværk.</translation>
 <translation id="2438609638493026652">Aktivér rapportering af vigtige hændelser under Android-appinstallation til Google. Hændelser registreres kun i forbindelse med apps, hvis installation blev aktiveret via en politik.
 
       Hvis politikken er angivet som sand, logføres hændelser.
@@ -583,6 +593,7 @@
 <translation id="2598508021807251719">Konfigurerer de sprog, som <ph name="PRODUCT_OS_NAME" /> kan vises på.
 
       Hvis denne politik er angivet, kan brugeren kun konfigurere <ph name="PRODUCT_OS_NAME" /> til at blive vist på et af de sprog, der angives af denne politik. Hvis politikken ikke er angivet eller er angivet med en tom liste, kan <ph name="PRODUCT_OS_NAME" /> vises på alle understøttede sprog. Hvis denne politik er angivet med en liste, der indeholder ugyldige værdier, ignoreres alle ugyldige værdier. Hvis en bruger tidligere konfigurerede <ph name="PRODUCT_OS_NAME" /> til at blive vist på et sprog, der ikke tillades af denne politik, ændres visningssproget til et tilladt sprog, næste gang brugeren logger ind. Hvis brugeren har konfigureret foretrukne sprog, og et af de foretrukne sprog er tilladt af denne politik, skifter <ph name="PRODUCT_OS_NAME" /> til det pågældende sprog. Ellers skifter <ph name="PRODUCT_OS_NAME" /> til den første gyldige værdi, der er angivet af denne politik, eller til en alternativ landestandard (som i øjeblikket er en-US), hvis politikken kun indeholder ugyldige poster.</translation>
+<translation id="2604182581880595781">Konfigurer politikker for fildeling via netværk.</translation>
 <translation id="2623014935069176671">Vent på første aktivitet fra brugeren</translation>
 <translation id="262740370354162807">Aktiver indsendelse af dokumenter til <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Angiver konfigurationer af virksomhedsprintere.
@@ -662,6 +673,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" />-klienters placering i Windows-registreringsdatabasen:</translation>
 <translation id="2824715612115726353">Aktiver inkognitotilstand</translation>
 <translation id="2838830882081735096">Tillad ikke datamigrering og ARC</translation>
+<translation id="2839294585867804686">Indstillinger for fildeling via netværk</translation>
 <translation id="2840269525054388612">Angiver, hvilke printere en bruger kan anvende.
 
       Denne politik anvendes kun, hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1149,6 +1161,7 @@
       Hvis politikken ikke konfigureres, aktiveres den anonyme dataindsamling fra indtastede webadresser, men brugeren kan ændre den.</translation>
 <translation id="4250680216510889253">Nej</translation>
 <translation id="4261820385751181068">Landestandard for loginskærme på enheder</translation>
+<translation id="4264607809747169568">Styrer tilgængelighed af fildeling via netværk for Chrome OS</translation>
 <translation id="427220754384423013">Angiver, hvilke printere en bruger kan anvende.
 
       Denne politik anvendes kun, hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1549,6 +1562,15 @@
       Politikkens værdi bør angives i millisekunder.</translation>
 <translation id="5511702823008968136">Aktiver bogmærkelinje</translation>
 <translation id="5512418063782665071">Startsidens webadresse</translation>
+<translation id="551639594034811656">Denne politik angiver en liste over procentdele, som definerer den andel af <ph name="PRODUCT_OS_NAME" />-enheder i organisationsenheden, der skal opdateres pr. dag, fra og med den dag hvor opdateringen først opdages. Tidspunktet, hvor opdateringen opdages, ligger efter det tidspunkt, hvor opdateringen udgives, da der kan gå et stykke tid, efter opdateringen udgives, til enheden søger efter opdateringer.
+
+      Hvert (dag, procentdel)-par indeholder den procentdel af flåden, der skal opdateres inden det givne antal dage, siden opdateringen blev opdaget. Hvis vi f.eks. har parrene [(4, 40), (10, 70), (15, 100)], så skal 40 % være opdateret fire dage efter opdagelsen af opdateringen, 70 % skal være opdateret efter 10 dage osv.
+
+      Hvis der er angivet en værdi for denne politik, ignorerer opdateringer politikken <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> og følger denne politik i stedet.
+
+      Hvis denne liste er tom, anvendes ingen trindeling eller opdateringer i andre enhedspolitikker.
+
+      Denne politik gælder ikke for kanalskift.</translation>
 <translation id="5523812257194833591">Automatisk login på en offentlig session efter en forsinkelse.
 
       Hvis denne politik er angivet, logges den angivne session automatisk ind efter et stykke tid ved loginskærmen uden brugerinteraktion. Den offentlige session skal i forvejen være konfigureret (se |DeviceLocalAccounts|).
@@ -1845,6 +1867,7 @@
 <translation id="6440051664870270040">Tillad, at websites navigerer samtidigt og åbner pop op-vinduer</translation>
 <translation id="6447948611083700881">Sikkerhedskopiering og gendannelse er deaktiveret</translation>
 <translation id="645425387487868471">Aktivér påtvungen login for <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Aktivér AutoFyld for adresser</translation>
 <translation id="6473623140202114570">Konfigurer listen over domæner, hvor Beskyttet browsing ikke udløser advarsler.</translation>
 <translation id="6491139795995924304">Tillad Bluetooth på enheden</translation>
 <translation id="6520802717075138474">Import af søgemaskiner fra standardbrowseren ved første visning</translation>
@@ -2437,6 +2460,9 @@
       Hvis politikken er deaktiveret, sker der ingen udtrykkelig isolering af websites, og brugstest af IsolateOrigins og SitePerProcess deaktiveres. Brugere kan stadig aktivere SitePerProcess manuelt.
       Hvis politikken ikke konfigureres, kan den enkelte bruger ændre denne indstilling.
       </translation>
+<translation id="7902255855035461275">Mønstre på denne liste sammenlignes med sikkerhedskilden for den anmodende webadresse. Hvis der findes et match, gives der adgang til videooptagelsesenheder, uden at du behøver give tilladelse til det.
+
+BEMÆRK! Op til version 45 var denne funktion kun understøttet i terminaltilstand.</translation>
 <translation id="7912255076272890813">Konfigurer tilladte app-/udvidelsestyper</translation>
 <translation id="7915236031252389808">Du kan angive en webadresse til en proxyfil af typen .pac her.
 
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 01cb8b3b..c61527a76 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -287,6 +287,11 @@
       Wird für eine Einstellung kein Wert festgelegt, wird ein Standardwert verwendet.
 
       Wenn die Richtlinie nicht festgelegt wird, gelten für alle Einstellungen Standardwerte.</translation>
+<translation id="1958138414749279167">Aktiviert die AutoFill-Funktion von <ph name="PRODUCT_NAME" /> und ermöglicht es Nutzern, Adressinformationen in Webformularen automatisch mit zuvor gespeicherten Informationen ausfüllen zu lassen.
+
+      Wenn diese Einstellung deaktiviert ist, schlägt AutoFill weder Adressinformationen vor oder füllt sie automatisch aus noch werden zusätzliche Adressinformationen gespeichert, die der Nutzer während des Surfens im Web möglicherweise sendet.
+
+      Falls diese Einstellung aktiviert ist oder keinen Wert hat, kann der Nutzer die AutoFill-Funktion in der UI für Adressen steuern.</translation>
 <translation id="1960840544413786116">Genehmigung von Zertifikaten, die von lokalen Vertrauensankern ausgestellt werden, bei denen die "subjectAlternativeName"-Erweiterung fehlt</translation>
 <translation id="1964634611280150550">Inkognitomodus deaktiviert</translation>
 <translation id="1964802606569741174">Diese Richtlinie hat keine Auswirkungen auf die Android YouTube App. Wenn der Sicherheitsmodus in YouTube erzwungen werden soll, darf das Installieren der Android YouTube App nicht zugelassen werden.</translation>
@@ -500,6 +505,11 @@
       Wird diese Einstellung nicht konfiguriert, können die Nutzer entscheiden, ob sie die Funktion verwenden möchten.
 
       Diese Einstellung ist ab <ph name="PRODUCT_NAME" />-Version 29 nicht mehr vorhanden.</translation>
+<translation id="2433412232489478893">Mit dieser Richtlinie wird gesteuert, ob die Netzwerkfreigabe-Funktion für <ph name="PRODUCT_NAME" /> für einen Nutzer zulässig ist.
+
+      Wenn diese Richtlinie nicht konfiguriert oder auf "true" gesetzt ist, können Nutzer Netzwerkfreigaben verwenden.
+
+      Ist diese Richtlinie auf "false" eingestellt, so stehen Nutzern keine Netzwerkfreigaben zur Verfügung.</translation>
 <translation id="2438609638493026652">Aktiviert die Meldung von wichtigen Ereignissen an Google während der Installation von Android-Apps. Ereignisse werden nur für Apps erfasst, deren Installation über die Richtlinie ausgelöst wurde.
 
       Wenn die Richtlinie auf "true" festgelegt ist, werden Ereignisse protokolliert.
@@ -577,6 +587,7 @@
 <translation id="2598508021807251719">Mit dieser Richtlinie werden die Sprachen konfiguriert, in denen <ph name="PRODUCT_OS_NAME" /> angezeigt werden kann.
 
       Wenn diese Richtlinie festgelegt ist, kann der Nutzer <ph name="PRODUCT_OS_NAME" /> nur in einer der durch diese Richtlinie angegebenen Sprachen anzeigen lassen. Falls diese Richtlinie nicht festgelegt ist oder auf eine leere Liste verweist, kann <ph name="PRODUCT_OS_NAME" /> in allen unterstützten UI-Sprachen angezeigt werden. Sollte diese Richtlinie auf eine Liste mit ungültigen Werten verweisen, werden alle ungültigen Werte ignoriert. Wenn ein Nutzer <ph name="PRODUCT_OS_NAME" /> zuvor so konfiguriert hat, dass das Betriebssystem in einer Sprache angezeigt wird, die nicht durch diese Richtlinie zugelassen ist, wird die UI-Sprache in eine zulässige Sprache geändert, wenn sich der Nutzer das nächste Mal anmeldet. Falls der Nutzer bevorzugte Sprachen konfiguriert hatte und eine der bevorzugten Sprachen durch diese Richtlinie zugelassen ist, wechselt <ph name="PRODUCT_OS_NAME" /> zu dieser Sprache. Andernfalls wechselt <ph name="PRODUCT_OS_NAME" /> zum ersten gültigen Wert, der durch diese Richtlinie angegeben ist, oder – falls diese Richtlinie nur ungültige Einträge enthält – zu einer Ersatzsprache (derzeit en-US).</translation>
+<translation id="2604182581880595781">Richtlinien für Netzwerkfreigaben konfigurieren.</translation>
 <translation id="2623014935069176671">Auf erste Nutzeraktivität warten</translation>
 <translation id="262740370354162807">Senden von Dokumenten an <ph name="CLOUD_PRINT_NAME" /> aktivieren</translation>
 <translation id="2627554163382448569">Stellt Konfigurationen für Unternehmensdrucker bereit.
@@ -656,6 +667,7 @@
 <translation id="2823870601012066791">Windows-Registrierungspfad für <ph name="PRODUCT_OS_NAME" />-Clients:</translation>
 <translation id="2824715612115726353">Inkognitomodus aktivieren</translation>
 <translation id="2838830882081735096">Datenmigration und ARC nicht zulassen</translation>
+<translation id="2839294585867804686">Einstellungen für Netzwerkfreigaben</translation>
 <translation id="2840269525054388612">Gibt die Drucker an, die ein Nutzer verwenden kann.
 
       Diese Richtlinie wird nur verwendet, wenn <ph name="PRINTERS_WHITELIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ausgewählt wurde.
@@ -1121,17 +1133,18 @@
 
           Wenn diese Richtlinie nicht konfiguriert ist, wird für alle Websites entweder der globale Standardwert der Richtlinie "DefaultKeygenSetting", sofern festgelegt, oder die persönliche Konfiguration des Nutzers verwendet.</translation>
 <translation id="4239720644496144453">Der Cache wird nicht für Android-Apps verwendet. Wenn mehrere Nutzer die gleiche Android-App installieren, wird sie für jeden Nutzer neu heruntergeladen.</translation>
-<translation id="4243336580717651045">Unter <ph name="PRODUCT_NAME" /> können Sie die anonymisierte URL-Erfassung von Daten aktivieren und Nutzer daran hindern, diese Einstellung zu ändern.
+<translation id="4243336580717651045">Unter <ph name="PRODUCT_NAME" /> können Sie die anonymisierte URL-Datenerfassung aktivieren und Nutzer daran hindern, diese Einstellung zu ändern.
 
-      Bei der anonymisierten URL-Erfassung von Daten werden die URLs der vom Nutzer besuchten Seiten an Google gesendet, um die Suche und das Surfen zu verbessern.
+      Bei der anonymisierten URL-Datenerfassung werden die URLs der vom Nutzer besuchten Seiten an Google gesendet, um die Suche und das Surfen zu verbessern.
 
-      Wenn Sie diese Richtlinie aktivieren, ist die anonymisierte URL-Erfassung von Daten immer aktiviert.
+      Wenn Sie diese Richtlinie aktivieren, ist die anonymisierte URL-Datenerfassung immer aktiviert.
 
-      Wenn Sie diese Richtlinie deaktivieren, ist die anonymisierte URL-Erfassung von Daten immer deaktiviert.
+      Wenn Sie diese Richtlinie deaktivieren, ist die anonymisierte URL-Datenerfassung immer deaktiviert.
 
-      Wenn diese Richtlinie nicht festgelegt wird, ist die anonymisierte URL-Erfassung von Daten aktiviert, aber der Nutzer kann diese Einstellung ändern.</translation>
+      Wenn diese Richtlinie nicht festgelegt wird, ist die anonymisierte URL-Datenerfassung aktiviert, aber der Nutzer kann diese Einstellung ändern.</translation>
 <translation id="4250680216510889253">Nein</translation>
 <translation id="4261820385751181068">Sprache der Anmeldeseite</translation>
+<translation id="4264607809747169568">Steuert Netzwerkfreigaben für Chrome OS-Verfügbarkeit</translation>
 <translation id="427220754384423013">Gibt die Drucker an, die ein Nutzer verwenden kann.
 
       Diese Richtlinie wird nur verwendet, wenn <ph name="PRINTERS_WHITELIST" /> für <ph name="BULK_PRINTERS_ACCESS_MODE" /> ausgewählt wurde.
@@ -1534,6 +1547,15 @@
       Der Wert sollte in Millisekunden angegeben werden.</translation>
 <translation id="5511702823008968136">Lesezeichenleiste aktivieren</translation>
 <translation id="5512418063782665071">Startseiten-URL</translation>
+<translation id="551639594034811656">Durch diese Richtlinie wird eine Liste mit Prozentwerten festgelegt, die angeben, welcher Anteil der <ph name="PRODUCT_OS_NAME" />-Geräte in der OE pro Tag aktualisiert werden, nachdem das Update entdeckt wurde. Der Abstand zwischen Entdeckungszeitpunkt und Veröffentlichungszeitpunkt hängt davon ab, wann das Gerät nach Updates sucht.
+
+      Jedes Paar der Form (Tag, Prozentwert) gibt an, welcher Anteil der Geräte nach dieser Anzahl von Tagen, seit das Update entdeckt wurde, aktualisiert worden sein muss. Wenn zum Beispiel die Paare [(4, 40), (10, 70), (15, 100)] festgelegt wurden, sollten vier Tage, nachdem das Updates entdeckt wurde, 40 % der Geräte aktualisiert worden sein. Nach zehn Tagen sollte das Update für 70 % erfolgt sein und so weiter.
+
+      Wenn für diese Richtlinie ein Wert festgelegt ist, folgen Updates dieser Richtlinie und ignorieren die Richtlinie "<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />".
+
+      Falls diese Liste leer ist, erfolgt kein Staging und Updates werden gemäß anderen Geräterichtlinien angewendet.
+
+      Diese Richtlinie gilt nicht für Kanalwechsel.</translation>
 <translation id="5523812257194833591">Hiermit geben Sie die öffentliche Sitzung an, in der ein Nutzer nach einer bestimmten Zeitspanne automatisch angemeldet wird.
 
       Ist diese Richtlinie festgelegt, wird der Nutzer nach Ablauf einer bestimmten Zeitspanne der Inaktivität beim Anmeldebildschirm automatisch in der angegebenen Sitzung angemeldet. Die öffentliche Sitzung muss vorher konfiguriert werden, siehe |DeviceLocalAccounts|.
@@ -1755,7 +1777,7 @@
           Wenn der Bildschirm bei Inaktivität gesperrt werden soll, empfehlen wir, die Bildschirmsperre für den Wechsel in den Suspend-Modus zu aktivieren und <ph name="PRODUCT_OS_NAME" /> anzuweisen, nach der Inaktivitätsverzögerung in den Suspend-Modus zu wechseln. Diese Richtlinie sollte nur verwendet werden, wenn die Bildschirmsperre deutlich früher aktiviert werden soll als der Suspend-Modus oder wenn der Suspend-Modus bei Inaktivität nicht erwünscht ist.
 
           Der Richtlinienwert muss in Millisekunden angegeben werden und wird automatisch auf einen Wert unter der Inaktivitätsverzögerung reduziert.</translation>
-<translation id="6097601282776163274">Anonymisierte URL-Erfassung von Daten aktivieren</translation>
+<translation id="6097601282776163274">Anonymisierte URL-Datenerfassung aktivieren</translation>
 <translation id="6111936128861357925">Easter Egg-Dinosaurierspiel zulassen</translation>
 <translation id="6114416803310251055">Veraltet</translation>
 <translation id="6133088669883929098">Schlüsselgenerierung für alle Websites zulassen</translation>
@@ -1831,6 +1853,7 @@
 <translation id="6440051664870270040">Websites erlauben, gleichzeitig auf andere Websites weiterzuleiten und Pop-ups zu öffnen</translation>
 <translation id="6447948611083700881">"Sicherung und Wiederherstellung" deaktiviert</translation>
 <translation id="645425387487868471">Erzwungene Anmeldung für <ph name="PRODUCT_NAME" /> aktivieren</translation>
+<translation id="6464074037294098618">AutoFill für Adressen aktivieren</translation>
 <translation id="6473623140202114570">Hiermit wird die Liste der Domains konfiguriert, auf denen durch Safe Browsing keine Warnungen ausgelöst werden.</translation>
 <translation id="6491139795995924304">Bluetooth auf Gerät zulassen</translation>
 <translation id="6520802717075138474">Suchmaschinen bei erster Ausführung aus Standardbrowser importieren</translation>
@@ -2429,6 +2452,11 @@
       Wenn die Richtlinie deaktiviert ist, findet keine explizite Website-Isolierung statt und Feldtests von "IsolateOrigins" und "SitePerProcess" werden ebenfalls deaktiviert. Nutzer können aber "SitePerProcess" weiterhin manuell aktivieren.
       Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer diese Einstellung ändern.
       </translation>
+<translation id="7902255855035461275">Muster in dieser Liste werden mit der Sicherheitsherkunft
+      der anfragenden URL abgeglichen. Bei einer Übereinstimmung wird der
+      Zugriff auf Videoaufnahmegeräte ohne Nachfrage gestattet.
+
+      HINWEIS: Bis Version 45 wurde diese Richtlinie nur im Kioskmodus unterstützt.</translation>
 <translation id="7912255076272890813">Zulässige App- bzw. Erweiterungstypen konfigurieren</translation>
 <translation id="7915236031252389808">Hier können Sie eine URL zu einer Proxy-PAC-Datei angeben.
 
diff --git a/components/policy/resources/policy_templates_el.xtb b/components/policy/resources/policy_templates_el.xtb
index fcffefb..cc17a61 100644
--- a/components/policy/resources/policy_templates_el.xtb
+++ b/components/policy/resources/policy_templates_el.xtb
@@ -517,6 +517,11 @@
       Αν δεν διαμορφωθεί αυτή η ρύθμιση, ο χρήστης μπορεί να επιλέξει αν θα χρησιμοποιήσει τη λειτουργία ή όχι.
 
       Αυτή η ρύθμιση έχει καταργηθεί από το <ph name="PRODUCT_NAME" /> 29 και τις νεότερες εκδόσεις.</translation>
+<translation id="2433412232489478893">Αυτή η πολιτική ελέγχει εάν επιτρέπεται η λειτουργία "Κοινόχρηστα αρχεία δικτύου" για το προϊόν <ph name="PRODUCT_NAME" /> για κάποιον χρήστη.
+
+      Εάν αυτή η πολιτική δεν διαμορφωθεί ή οριστεί ως Αληθής, οι χρήστες θα μπορούν να χρησιμοποιήσουν τη λειτουργία "Κοινόχρηστα αρχεία δικτύου".
+
+      Εάν αυτή η πολιτική οριστεί ως Ψευδής, οι χρήστες δεν θα μπορούν να χρησιμοποιήσουν τη λειτουργία "Κοινόχρηστα αρχεία δικτύου".</translation>
 <translation id="2438609638493026652">Επιτρέπει τη δημιουργία αναφορών προς την Google για σημαντικά συμβάντα κατά τη διάρκεια της εγκατάστασης εφαρμογών Android. Τα συμβάντα καταγράφονται μόνο για αναφορές των οποίων η εγκατάσταση ενεργοποιήθηκε μέσω πολιτικής.
 
       Εάν η πολιτική οριστεί ως αληθής, τα συμβάντα θα καταγράφονται.
@@ -598,6 +603,7 @@
 <translation id="2598508021807251719">Διαμορφώνει τις τοπικές ρυθμίσεις στις οποίες μπορεί να προβάλλεται το <ph name="PRODUCT_OS_NAME" />.
 
       Εάν οριστεί αυτή η πολιτική, ο χρήστης μπορεί να διαμορφώσει το <ph name="PRODUCT_OS_NAME" /> ούτως ώστε να προβάλλεται μόνο σε μία από τις τοπικές ρυθμίσεις που καθορίζονται από αυτήν την πολιτική. Εάν αυτή η πολιτική δεν οριστεί ή οριστεί σε μια κενή λίστα, το <ph name="PRODUCT_OS_NAME" /> μπορεί να προβληθεί σε όλες τις υποστηριζόμενες τοπικές ρυθμίσεις. Εάν οριστεί αυτή η πολιτική σε μια λίστα με μη έγκυρες τιμές, όλες οι μη έγκυρες τιμές θα αγνοηθούν. Εάν ο χρήστης διαμόρφωσε στο παρελθόν το <ph name="PRODUCT_OS_NAME" /> ούτως ώστε να προβάλλεται σε μια τοπική ρύθμιση η οποία δεν επιτρέπεται από αυτήν την πολιτική, οι προβαλλόμενες τοπικές ρυθμίσεις θα αλλάξουν σε επιτρεπόμενες τοπικές ρυθμίσεις την επόμενη φορά που θα συνδεθεί ο χρήστης. Εάν ο χρήστης είχε διαμορφώσει τις προτιμώμενες τοπικές ρυθμίσεις και ένα σύνολο από τις προτιμώμενες τοπικές ρυθμίσεις επιτρέπεται από αυτήν την πολιτική, το <ph name="PRODUCT_OS_NAME" /> θα κάνει εναλλαγή σε αυτές τις τοπικές ρυθμίσεις. Διαφορετικά, το <ph name="PRODUCT_OS_NAME" /> θα κάνει εναλλαγή στην πρώτη έγκυρη τιμή που καθορίζεται από αυτήν την πολιτική ή σε κάποιο εναλλακτικό σύνολο τοπικών ρυθμίσεων (αυτήν τη στιγμή είναι en-US), εάν αυτή η πολιτική περιέχει μόνο μη έγκυρες καταχωρίσεις.</translation>
+<translation id="2604182581880595781">Διαμορφώστε πολιτικές που σχετίζονται με τη λειτουργία "Κοινόχρηστα αρχεία δικτύου".</translation>
 <translation id="2623014935069176671">Αναμονή για τη δραστηριότητα του αρχικού χρήστη</translation>
 <translation id="262740370354162807">Ενεργοποιήστε την υποβολή των εγγράφων στο <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Παρέχει διαμορφώσεις για εταιρικούς εκτυπωτές.
@@ -684,6 +690,7 @@
 <translation id="2823870601012066791">Τοποθεσία μητρώου Windows για εφαρμογές πελάτες <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Ενεργοποίηση κατάστασης ανώνυμης περιήγησης</translation>
 <translation id="2838830882081735096">Να μην επιτρέπεται η μετεγκατάσταση δεδομένων και το ARC</translation>
+<translation id="2839294585867804686">Ρυθμίσεις λειτουργίας "Κοινόχρηστα αρχεία δικτύου"</translation>
 <translation id="2840269525054388612">Καθορίζει τους εκτυπωτές που μπορεί να χρησιμοποιήσει ένας χρήστης.
 
       Αυτή η πολιτική χρησιμοποιείται μόνο εάν επιλεγεί η ρύθμιση <ph name="PRINTERS_WHITELIST" /> για τη λειτουργία <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1179,6 +1186,7 @@
       Εάν αυτή η πολιτική δεν οριστεί, η συλλογή ανώνυμων δεδομένων με κλειδί URL θα ενεργοποιηθεί, αλλά ο χρήστης θα μπορεί να την αλλάξει.</translation>
 <translation id="4250680216510889253">Όχι</translation>
 <translation id="4261820385751181068">Τοπικές ρυθμίσεις οθόνης σύνδεσης συσκευής</translation>
+<translation id="4264607809747169568">Ελέγχει τη λειτουργία "Κοινόχρηστα αρχεία δικτύου" για τη διαθεσιμότητα του ChromeOS</translation>
 <translation id="427220754384423013">Καθορίζει τους εκτυπωτές που μπορεί να χρησιμοποιήσει ένας χρήστης.
 
       Αυτή η πολιτική χρησιμοποιείται μόνο εάν επιλεγεί η ρύθμιση <ph name="PRINTERS_WHITELIST" /> για τη λειτουργία <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1611,6 +1619,15 @@
       Η τιμή της πολιτικής θα πρέπει να οριστεί σε χιλιοστά του δευτερολέπτου.</translation>
 <translation id="5511702823008968136">Ενεργοποίηση γραμμής σελιδοδεικτών</translation>
 <translation id="5512418063782665071">URL αρχικής σελίδας</translation>
+<translation id="551639594034811656">Αυτή η πολιτική ορίζει μια λίστα ποσοστών που προσδιορίζουν το κλάσμα των συσκευών <ph name="PRODUCT_OS_NAME" /> στη ΜΟ (OU) για ενημέρωση ανά ημέρα, με έναρξη από την ημέρα που εντοπίζεται για πρώτη φορά η ενημέρωση. Ο χρόνος εντοπισμού είναι μεταγενέστερος από τον δημοσιευμένο χρόνο ενημέρωσης, καθώς θα μπορούσε να περάσει κάποιο χρονικό διάστημα από τη δημοσίευση της ενημέρωσης ώσπου η συσκευή να πραγματοποιήσει έλεγχο για ενημερώσεις.
+
+      Κάθε ζεύγος (ημέρα, ποσοστό) περιέχει το ποσοστό του στόλου που πρέπει να ενημερωθεί μέχρι τον καθορισμένο αριθμό ημερών από τη στιγμή που εντοπίστηκε η ενημέρωση. Για παράδειγμα, εάν έχουμε τα ζεύγη [(4, 40), (10, 70), (15, 100)], τότε το 40% του στόλου θα πρέπει να έχει ενημερωθεί 4 ημέρες μετά την εμφάνιση της ενημέρωσης. Το 70% θα πρέπει να ενημερωθεί μετά από 10 ημέρες και ούτω καθεξής.
+
+      Εάν υπάρχει τιμή που έχει καθοριστεί για αυτήν την πολιτική, οι ενημερώσεις θα παραβλέψουν την πολιτική <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> και θα ακολουθήσουν την παρούσα πολιτική.
+
+      Εάν αυτή η λίστα είναι κενή, δεν θα υπάρχει προετοιμασία και θα εφαρμοστούν ενημερώσεις σύμφωνα με άλλες πολιτικές χρήσης συσκευής.
+
+      Αυτή η πολιτική δεν ισχύει για εναλλαγές καναλιών.</translation>
 <translation id="5523812257194833591">Δημόσια περίοδος σύνδεσης για αυτόματη σύνδεση μετά από μια καθυστέρηση.
 
       Αν οριστεί αυτή η πολιτική, η καθορισμένη περίοδος σύνδεσης θα συνδέεται αυτόματα μετά την παρέλευση ενός χρονικού διαστήματος στην οθόνη σύνδεσης χωρίς κάποια αλληλεπίδραση από το χρήστη. Η δημόσια περίοδος σύνδεσης θα πρέπει να έχει διαμορφωθεί ήδη (συμβουλευτείτε την ενότητα |DeviceLocalAccounts|).
@@ -2544,6 +2561,11 @@
       Εάν η πολιτική είναι απενεργοποιημένη, δεν θα πραγματοποιείται ρητή απομόνωση ιστοτόπου και οι δοκιμές πεδίου των IsolateOrigins και SitePerProcess θα απενεργοποιηθούν. Οι χρήστες θα διατηρήσουν τη δυνατότητα μη αυτόματης ενεργοποίησης της πολιτικής SitePerProcess.
       Εάν η πολιτική δεν έχει διαμορφωθεί, ο χρήστης θα μπορεί να αλλάξει αυτήν τη ρύθμιση.
       </translation>
+<translation id="7902255855035461275">Τα μοτίβα σε αυτήν τη λίστα θα αντιστοιχιστούν με την προέλευση ασφαλείας του URL 
+      που στέλνει το αίτημα.  Εάν εντοπιστεί αντιστοίχιση, θα παραχωρείται πρόσβαση
+      στις συσκευές καταγραφής ήχου χωρίς ερώτηση.
+
+      ΣΗΜΕΙΩΣΗ: Μέχρι την έκδοση 45, αυτή η πολιτική υποστηριζόταν μόνο στη λειτουργία Kiosk.</translation>
 <translation id="7912255076272890813">Διαμόρφωση επιτρεπόμενων τύπων επεκτάσεων/εφαρμογών</translation>
 <translation id="7915236031252389808">Εδώ μπορείτε να καθορίσετε ένα URL για κάποιο αρχείο .pac του διακομιστή μεσολάβησης.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 082f660..7355ac7 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -293,6 +293,11 @@
       Si no se especifica una configuración, se utiliza un valor predeterminado.
 
       Si no se establece esta política, se utilizan valores predeterminados para todas las configuraciones.</translation>
+<translation id="1958138414749279167">Habilita la función "Autocompletar" de <ph name="PRODUCT_NAME" /> y permite que los usuarios completen automáticamente formularios web con información ya almacenada de la dirección.
+
+      Si se inhabilita esta configuración, "Autocompletar" nunca sugerirá ni completará direcciones. Tampoco guardará información adicional de direcciones que el usuario haya enviado cuando navegaba en la Web.
+
+      Si se habilita esta configuración o no se establece ningún valor, el usuario podrá controlar la función "Autocompletar" para las direcciones en la IU.</translation>
 <translation id="1960840544413786116">Permitir o no los certificados emitidos por los anclajes de confianza locales que no tienen la extensión subjectAlternativeName</translation>
 <translation id="1964634611280150550">Modo incógnito inhabilitado</translation>
 <translation id="1964802606569741174">Esta política no tiene efecto en la app de YouTube de Android. Si se debe aplicar el modo de seguridad en YouTube, se debe inhabilitar la instalación de la app de YouTube de Android.</translation>
@@ -1829,6 +1834,7 @@
 <translation id="6440051664870270040">Permitir la navegación y las ventanas emergentes en los sitios al mismo tiempo</translation>
 <translation id="6447948611083700881">Se inhabilitó la funcionalidad de copia de seguridad y restablecimiento</translation>
 <translation id="645425387487868471">Permitir forzar el acceso para <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Habilitar "Autocompletar" para las direcciones</translation>
 <translation id="6473623140202114570">Configura la lista de dominios donde la Navegación segura no activa advertencias.</translation>
 <translation id="6491139795995924304">Permitir Bluetooth en el dispositivo</translation>
 <translation id="6520802717075138474">Importar los motores de búsqueda desde el navegador predeterminado en la primera ejecución</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index 59d3aaf..4d3fae67 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -520,6 +520,11 @@
       Si no se establece esta opción, el usuario podrá decidir si quiere o no utilizar esta función.
 
       Esta opción se ha eliminado de la versión 29 y versiones posteriores de <ph name="PRODUCT_NAME" />.</translation>
+<translation id="2433412232489478893">Esta política controla si los usuarios pueden usar la función Uso compartido de archivos del sistema de <ph name="PRODUCT_NAME" />.
+
+      Si esta política no está configurada o tiene asignado el valor "True", los usuarios podrán usar esta función.
+
+      En cambio, si tiene asignado el valor "False", no podrán usarla.</translation>
 <translation id="2438609638493026652">Habilita el envío de informes de eventos clave durante la instalación de aplicaciones para Android a Google. Solo se registran eventos de aplicaciones cuya instalación haya provocado la política.
 
       Si se le asigna el valor "True" a la política, se registrarán los eventos.
@@ -601,6 +606,7 @@
 <translation id="2598508021807251719">Establece las configuraciones regionales en las que puede mostrarse <ph name="PRODUCT_OS_NAME" />.
 
       Si asigna a esta política una lista de configuraciones regionales, el usuario solo podrá mostrar <ph name="PRODUCT_OS_NAME" /> en una de esas configuraciones. Si no asigna ninguna configuración regional a esta política o le asigna una lista vacía, <ph name="PRODUCT_OS_NAME" /> se podrá mostrar en cualquier configuración de IU admitida. Si se asigna a esta política una lista con configuraciones regionales no válidas, los valores que no sean válidos se ignorarán. Si un usuario ya había configurado <ph name="PRODUCT_OS_NAME" /> anteriormente en un idioma no permitido por esta política, la configuración regional se cambiará a otra permitida la próxima vez que el usuario inicie sesión. Si el usuario había establecido configuraciones regionales de preferencia y una de ellas está permitida por esta política, <ph name="PRODUCT_OS_NAME" /> se mostrará en dicha configuración. De lo contrario, <ph name="PRODUCT_OS_NAME" /> se cambiará a la primera configuración regional válida especificada por esta política, o bien a una alternativa (actualmente en-US) si ninguna de las entradas de la política es válida.</translation>
+<translation id="2604182581880595781">Configura las políticas relacionadas con Uso compartido de archivos del sistema.</translation>
 <translation id="2623014935069176671">Esperar actividad inicial del usuario</translation>
 <translation id="262740370354162807">Habilitar el envío de documentos a <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Proporciona opciones de configuración de impresoras de empresa vinculadas con los dispositivos.
@@ -689,6 +695,7 @@
 <translation id="2823870601012066791">Ubicación del registro de Windows para clientes de <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Habilitar modo de incógnito</translation>
 <translation id="2838830882081735096">No permitir la migración de datos ni ARC</translation>
+<translation id="2839294585867804686">Configuración de Uso compartido de archivos del sistema</translation>
 <translation id="2840269525054388612">Especifica las impresoras que puede utilizar un usuario.
 
       Esta política solo se usará si se asigna <ph name="PRINTERS_WHITELIST" /> a <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1185,6 +1192,7 @@
       Si dejas esta política sin configurar, la recogida de datos anónima con clave de URL se habilitará, pero el usuario podrá cambiar la opción.</translation>
 <translation id="4250680216510889253">No</translation>
 <translation id="4261820385751181068">Configuración regional para la pantalla de inicio de sesión del dispositivo</translation>
+<translation id="4264607809747169568">Controla si Uso compartido de archivos del sistema estará disponible en Chrome OS</translation>
 <translation id="427220754384423013">Especifica las impresoras que puede utilizar un usuario.
 
 
@@ -1620,6 +1628,15 @@
       El valor de la política se debe especificar en milisegundos.</translation>
 <translation id="5511702823008968136">Habilitar barra de marcadores</translation>
 <translation id="5512418063782665071">URL de la página de inicio</translation>
+<translation id="551639594034811656">Esta política define una lista de porcentajes que determinan qué parte de dispositivos <ph name="PRODUCT_OS_NAME" /> de la UO se actualizarán semanalmente a partir del día en el que se descubra la actualización. El momento de descubrimiento es posterior al momento de la publicación de la actualización, ya que puede haber pasado un tiempo desde que se publica la actualización hasta que el dispositivo busca actualizaciones.
+
+      Cada par (día, porcentaje) indica el porcentaje de dispositivos que hay que actualizar entre el número de días desde que se descubrió la actualización. Por ejemplo, los pares [(4, 40), (10, 70), (15, 100)] indican que el 40 % de los dispositivos se debería haber actualizado 4 después de ver la actualización, el 70 % se debería haber actualizado 10 días después, etc.
+
+      Si se ha asignado un valor a esta política, las actualizaciones ignorarán la política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> y seguirán esta.
+
+      Si esta lista está vacía, no se hará un lanzamiento progresivo y las actualizaciones se aplicarán de acuerdo con otras políticas de dispositivos.
+
+      Esta política no se aplica a los cambios de canal.</translation>
 <translation id="5523812257194833591">Permite indicar una sesión pública para el inicio de sesión automático después de una espera.
 
       Si se establece esta política, se iniciará automáticamente la sesión especificada una vez que haya transcurrido un tiempo sin que el usuario haya realizado ninguna acción en la pantalla de inicio de sesión. La sesión pública tendrá que estar configurada previamente (ver | DeviceLocalAccounts|).
@@ -2558,6 +2575,9 @@
       Si se inhabilita, no se aplica ningún aislamiento de sitios web explícito y se inhabilitarán las pruebas de campo de IsolateOrigins y SitePerProcess. Los usuarios podrán seguir habilitando la política SitePerProcess manualmente.
       Si no se configura la política, el usuario podrá cambiar esta opción.
       </translation>
+<translation id="7902255855035461275">Los patrones de esta lista se compararán con el origen de seguridad de la URL solicitante. Si se encuentra alguna coincidencia, se concederá acceso a dispositivos de captura de vídeo sin solicitarlo.
+
+NOTA: Hasta la versión 45, esta política solo se admitía en modo kiosco.</translation>
 <translation id="7912255076272890813">Configurar tipos de extensiones o aplicaciones permitidos</translation>
 <translation id="7915236031252389808">Permite especificar la URL de un archivo .pac de proxy.
 
diff --git a/components/policy/resources/policy_templates_et.xtb b/components/policy/resources/policy_templates_et.xtb
index 2190da92..29c9492 100644
--- a/components/policy/resources/policy_templates_et.xtb
+++ b/components/policy/resources/policy_templates_et.xtb
@@ -302,6 +302,11 @@
       Kui seadet ei määrata, siis kasutatakse vaikeväärtust.
 
       Kui seda reeglit ei määrata, siis kasutatakse kõikide seadete jaoks vaikevalikuid.</translation>
+<translation id="1958138414749279167">Lubab rakenduse <ph name="PRODUCT_NAME" /> automaattäite funktsiooni ja võimaldab kasutajatel aadressiteabe automaatselt veebivormidele sisestada, kasutades varem salvestatud teavet.
+
+      Selle seade keelamisel ei anna automaattäite funktsioon soovitusi ega sisesta aadressiteavet. Samuti ei salvesta see aadressi lisateavet, mille kasutaja võib veebi sirvimisel esitada.
+
+      Selle seade lubamisel või määramata jätmisel saab kasutaja kasutajaliideses aadresside automaattäite funktsiooni juhtida.</translation>
 <translation id="1960840544413786116">Kas lubada kohalike usaldusvõtmete väljastatud sertifikaadid, millel puudub laiend subjectAlternativeName?</translation>
 <translation id="1964634611280150550">Inkognito režiim on keelatud</translation>
 <translation id="1964802606569741174">See reegel ei mõjuta Androidi YouTube'i rakendust. Kui ohutusrežiim on sisse lülitatud, tuleks YouTube jõustada ja Androidi YouTube'i rakenduse installimine keelata.</translation>
@@ -517,6 +522,11 @@
       Kui jätate seade määramata, saavad kasutajad otsustada, kas seda funktsiooni kasutada või mitte.
 
       Toote <ph name="PRODUCT_NAME" /> 29-st ja uuematest versioonidest on see seade eemaldatud.</translation>
+<translation id="2433412232489478893">Reegel määrab, kas teenuse <ph name="PRODUCT_NAME" /> failide võrguhoidlate funktsioon on kasutaja jaoks lubatud.
+
+      Kui reegel on seadistamata või seatud väärtusele Tõene, saavad kasutajad failide võrguhoidlaid kasutada.
+
+      Kui reegel on seatud väärtusele Väär, ei saa kasutajad failide võrguhoidlaid kasutada.</translation>
 <translation id="2438609638493026652">Võimaldab Androidi rakenduse installimise ajal saata Google'ile teavitusi oluliste sündmuste kohta. Sündmused jäädvustatakse ainult rakenduste puhul, mille installimine käivitati reegli kaudu.
 
       Kui reegel on määratud väärtusele Tõene, siis sündmused logitakse.
@@ -599,6 +609,7 @@
 <translation id="2598508021807251719">Seadistab lokaadid, kus tohib operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> kuvada.
 
       Kui reegel on määratud, saab kasutaja seadistada operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> nii, et seda tohiks kuvada ainult selle reegliga määratud lokaatides. Kui reegel on määramata või määratud on tühi loend, tohib operatsioonisüsteemi <ph name="PRODUCT_OS_NAME" /> kuvada kõikides toetatud lokaatides. Kui reegli jaoks on määratud sobimatute väärtustega loend, eiratakse kõiki sobimatuid väärtusi. Kui kasutaja oli operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" /> valinud kuvatava keele, mis ei ole selle reegli kohaselt lubatud, määratakse kasutaja järgmisel sisselogimisel lubatud kuvatav lokaat. Kui kasutaja oli seadistanud eelistatud lokaadid ja üks eelistatud lokaatidest on selle reegli alusel lubatud, aktiveeritakse operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" /> see lokaat. Muul juhul kasutatakse operatsioonisüsteemis <ph name="PRODUCT_OS_NAME" /> reegli esimest sobivat väärtust või varulokaati (praegu en-US), kui reegel sisaldab ainult sobimatuid kirjeid.</translation>
+<translation id="2604182581880595781">Failide võrguhoidlatega seotud reeglite seadistamine.</translation>
 <translation id="2623014935069176671">Kasutaja esmase tegevuse ootamine</translation>
 <translation id="262740370354162807">Luba dokumentide saatmine teenusesse <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Määrab seadistused ettevõtte printeritele.
@@ -684,6 +695,7 @@
 <translation id="2823870601012066791">Windowsi registri asukoht operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> klientide puhul:</translation>
 <translation id="2824715612115726353">Luba inkognitorežiim</translation>
 <translation id="2838830882081735096">Keela andmete üleviimine ja ARC</translation>
+<translation id="2839294585867804686">Failide võrguhoidlate seaded</translation>
 <translation id="2840269525054388612">Määrab printerid, mida kasutaja saab kasutada.
 
       Seda reeglit kasutatakse ainult siis, kui režiimis <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> on valitud väärtus <ph name="PRINTERS_WHITELIST" />
@@ -1171,6 +1183,7 @@
       Kui jätate selle reegli määramata, on URL-i võtmetega anonüümsete andmete kogumine lubatud, kuid kasutaja saab seda muuta.</translation>
 <translation id="4250680216510889253">Ei</translation>
 <translation id="4261820385751181068">Seadme sisselogimisekraani lokaat</translation>
+<translation id="4264607809747169568">Juhib failide võrguhoidlate saadavalolekut Chrome OS-is</translation>
 <translation id="427220754384423013">Määrab printerid, mida kasutaja saab kasutada.
 
       Seda reeglit kasutatakse ainult siis, kui režiimis <ph name="BULK_PRINTERS_ACCESS_MODE" /> on valitud väärtus <ph name="PRINTERS_WHITELIST" />.
@@ -1602,6 +1615,15 @@
       Reegli väärtus peab olema määratud millisekundites.</translation>
 <translation id="5511702823008968136">Luba järjehoidjariba</translation>
 <translation id="5512418063782665071">Avalehe URL</translation>
+<translation id="551639594034811656">See reegel määrab loendi protsentidest, mis sätestavad OU operatsioonisüsteemiga <ph name="PRODUCT_OS_NAME" /> seadmete murdosa, mida alates värskenduse leidmisest kord nädalas värskendatakse. Avastamisaeg on hilisem kui värskenduse avaldamise aeg, kuna pärast värskenduse avaldamist võib seadmel kuluda värskenduste otsimiseks pisut aega.
+
+      Iga paar (päev, protsent) määrab, milline protsent seadetest tuleb värskendada määratud päevade arvu jooksul pärast värskenduse leidmist. Näiteks paaride {(4, 40), (10, 70), (15, 100)] puhul peab 40% seadmetest olema värskendatud 4 päeva jooksul pärast värskenduse leidmist, 70% 10 päeva jooksul jne.
+
+      Kui reegli väärtus on määratud, eiravad värskendused reeglit <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ja järgivad selle asemel seda reeglit.
+
+      Kui loend on tühi, siis kontrollimist ei kasutata ja värskendused rakendatakse seadme muude eeskirjade alusel.
+
+      Reegel ei kehti kanalivahetuste puhul.</translation>
 <translation id="5523812257194833591">Avalik seanss automaatseks sisselogimiseks pärast viivitust.
 
       Kui selle reegli määrate, logitakse määratud seanssi automaatselt sisse pärast teatud perioodi möödumist sisselogimisekraanil ilma kasutaja interaktsioonita. Avalik seanss peab olema juba seadistatud (vt |DeviceLocalAccounts|).
@@ -1914,6 +1936,7 @@
 <translation id="6440051664870270040">Saitidel samaaegse navigeerimise ja hüpikakende avamise lubamine</translation>
 <translation id="6447948611083700881">Varundamine ja taastamine on keelatud</translation>
 <translation id="645425387487868471">Teenusesse <ph name="PRODUCT_NAME" /> sundsisselogimise lubamine</translation>
+<translation id="6464074037294098618">Aadresside automaattäite lubamine</translation>
 <translation id="6473623140202114570">Seadistage loend domeenidest, kus Google'i ohutu sirvimise funktsioon hoiatusi ei käivita.</translation>
 <translation id="6491139795995924304">Luba Bluetooth seadmes</translation>
 <translation id="6520802717075138474">Impordi otsingumootorid vaikebrauserist esimesel käitamisel</translation>
@@ -2536,6 +2559,11 @@
       Kui reegel on keelatud, ei toimu selget saidi isoleerimist ning reeglite IsolateOrigins ja SitePerProcess testid keelatakse. Kasutajad saavad reegli SitePerProcess siiski käsitsi lubada.
       Kui reegel on seadistamata, saab kasutaja seda seadet muuta.
       </translation>
+<translation id="7902255855035461275">Selles loendis olevaid mustreid võrreldakse taotleva URL-i
+      algse turvalisusega. Vaste leidmisel antakse juurdepääs
+      videosalvestusseadmetele ilma küsimata.
+
+      MÄRKUS. Versioonini 45 toetati seda reeglit ainult kioskirežiimis.</translation>
 <translation id="7912255076272890813">Seadista lubatud rakenduste/laienduste tüübid</translation>
 <translation id="7915236031252389808">Siin saate määrata puhverserveri PAC-faili URL-i.
 
diff --git a/components/policy/resources/policy_templates_fa.xtb b/components/policy/resources/policy_templates_fa.xtb
index 59bc7154..2322d63 100644
--- a/components/policy/resources/policy_templates_fa.xtb
+++ b/components/policy/resources/policy_templates_fa.xtb
@@ -505,6 +505,11 @@
       چنانچه آن را بدون تنظیم رها کنید، کاربر می‌تواند تصمیم بگیرد که از این عملکرد استفاده کند یا نه.
 
       این تنظیم از نسخه ۲۹ به بعد <ph name="PRODUCT_NAME" /> حذف شده است.</translation>
+<translation id="2433412232489478893">‏این خط‌مشی کنترل می‌کند ویژگی Network File Shares <ph name="PRODUCT_NAME" /> برای کاربر مجاز باشد یا نه.
+
+      اگر این خط‌مشی پیکربندی نشود یا روی «درست» تنظیم شود، کاربران می‌توانند از Network File Shares استفاده کنند.
+
+      اگر این خط‌مشی روی «نادرست» تنظیم شود، کاربران نمی‌توانند از Network File Shares استفاده کنند.</translation>
 <translation id="2438609638493026652">‏گزارش دادن رویدادهای مهم به Google را که درطول نصب برنامه‌های Android اتفاق می‌افتند، فعال می‌کند. رویدادها فقط برای برنامه‌هایی ثبت می‌شوند که نصب آن‌ها ازطریق خط‌مشی راه‌اندازی شده باشد.
 
       اگر خط‌مشی روی درست تنظیم شود، رویدادها ثبت خواهند شد.
@@ -582,6 +587,7 @@
 <translation id="2598508021807251719">منطقه‌های زبانی را که <ph name="PRODUCT_OS_NAME" /> می‌تواند به آن‌ها نشان داده شود پیکربندی می‌کند.
 
       اگر این خط‌مشی تنظیم شود، کاربر فقط می‌تواند <ph name="PRODUCT_OS_NAME" /> را به‌گونه‌ای پیکربندی کند که به یکی از منطقه‌های زبانی مشخص‌شده توسط این خط‌مشی نمایش داده شود. اگر این خط‌مشی تنظیم نشود یا روی فهرستی خالی تنظیم شود، <ph name="PRODUCT_OS_NAME" /> می‌تواند در همه منطقه‌های زبانی رابط کاربری پشتیبانی‌شده نمایش داده شود. اگر این خط‌مشی روی فهرستی حاوی مقادیر نامعتبر تنظیم شود، همه مقادیر نامعتبر نادیده گرفته می‌شوند. اگر کاربری قبلاً <ph name="PRODUCT_OS_NAME" /> را طوری پیکربندی کرده باشد که به منطقه زبانی غیرمجاز توسط این خط‌مشی، نمایش داده شود، در ورود به سیستم بعدی کاربر، منطقه زبانی نمایش‌داده‌شده به منطقه زبانی مجاز رابط کاربری تغییر می‌کند. اگر کاربر منطقه‌های زبانی ترجیحی را پیکربندی کرده باشد و یکی از منطقه‌های زبانی ترجیحی توسط این خط‌مشی مجاز شده باشد، <ph name="PRODUCT_OS_NAME" /> به آن منطقه زبانی تغییر وضعیت می‌دهد. درغیر این‌صورت، <ph name="PRODUCT_OS_NAME" /> به اولین مقدار معتبر مشخص‌شده توسط این خط‌مشی یا اگر این خط‌مشی تنها حاوی ورودی‌های نامعتبر باشد، به منطقه‌زبانی پیش‌فرض (درحال‌حاضر انگلیسی آمریکایی) تغییر‌ می‌کند.</translation>
+<translation id="2604182581880595781">‏پیکربندی خط‌مشی‌های مرتبط با Network File Shares.</translation>
 <translation id="2623014935069176671">در انتظار فعالیت اولیه کاربر</translation>
 <translation id="262740370354162807">فعال کردن ارسال اسناد به <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">‏پیکربندی‌هایی برای چاپگرهای شرکتی ارائه می‌کند.
@@ -661,6 +667,7 @@
 <translation id="2823870601012066791">‏مکان رجیستری Windows برای کارخواه‌های <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">فعال کردن حالت ناشناس</translation>
 <translation id="2838830882081735096">‏اجازه ندادن به انتقال داده و ARC</translation>
+<translation id="2839294585867804686">‏تنظیمات Network File Shares</translation>
 <translation id="2840269525054388612">‏چاپگرهایی را که کاربر می‌تواند استفاده کند مشخص می‌کند.
 
       این خط‌مشی فقط درصورت انتخاب <ph name="PRINTERS_WHITELIST" /> برای <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> استفاده می‌شود.
@@ -1136,6 +1143,7 @@
       اگر این خط‌مشی تنظیم نشود، جمع‌آوری داده ناشناس‌شده حاوی نشانی وب فعال می‌شود اما کاربر می‌تواند آن را تغییر دهد.</translation>
 <translation id="4250680216510889253">نه</translation>
 <translation id="4261820385751181068">منطقه زبانی صفحه ورود به سیستم دستگاه</translation>
+<translation id="4264607809747169568">‏دردسترس بودن Network File Shares برای سیستم‌عامل Chrome را کنترل می‌کند</translation>
 <translation id="427220754384423013">‏چاپگرهایی را که کاربر می‌تواند استفاده کند مشخص می‌کند.
 
       این خط‌مشی فقط درصورت انتخاب <ph name="PRINTERS_WHITELIST" /> برای <ph name="BULK_PRINTERS_ACCESS_MODE" /> استفاده می‌شود.
@@ -1536,6 +1544,15 @@
       مقدار خط‌مشی باید برحسب میلی ثانیه تنظیم شود.</translation>
 <translation id="5511702823008968136">فعال کردن نوار نشانک</translation>
 <translation id="5512418063782665071">نشانی وب صفحه‌اصلی</translation>
+<translation id="551639594034811656">‏این خط‌مشی فهرستی از درصدهایی را تعریف می‌کند که مشخص می‌کنند چه بخشی از دستگاه‌های <ph name="PRODUCT_OS_NAME" /> در واحد سازمانی، هر هفته به‌روزرسانی شوند (شروع این عملیات از روزی است که به‌روزرسانی شناسایی می‌شود). زمان شناسایی دیرتر از انتشار به‌روزرسانی است، زیرا ممکن است بین زمان انتشار به‌روزرسانی و زمانی که دستگاه وجود به‌روزرسانی را بررسی می‌کند فاصله وجود داشته باشد.
+
+      هر جفت (درصد، روز) مشخص می‌کند چند درصد از دستگاه‌ها باید تا روز مشخصی بعد از شناسایی شدن به‌روزرسانی، به‌روزرسانی شوند. برای مثال، اگر جفت‌های [(‎4, 40)، ‏(‎10, 70)، ‏(‎15, 100)] داشته باشیم، ٪۴۰ دستگاه‌ها باید ۴ روز بعد از شناسایی به‌روزرسانی به‌روزرسانی شده باشند. ٪۷۰ بعد از ۱۰ روز به‌روزرسانی شده باشند و به‌همین‌ترتیب تا آخر.
+
+      اگر مقداری برای این خط‌مشی مشخص شود، به‌روزرسانی‌ها خط‌مشی <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> را نادیده می‌گیرند و از این خط‌مشی پیروی می‌کنند.
+
+      اگر این فهرست خالی باشد، مرحله‌بندی وجود نخواهد داشت و به‌روزرسانی‌ها طبق خط‌مشی‌های دیگر دستگاه اعمال می‌شوند.
+
+      این خط‌مشی برای جابه‌جایی میان کانال‌ها کاربرد ندارد.</translation>
 <translation id="5523812257194833591">‏اجازه به یک جلسه عمومی برای ورود خودکار به سیستم پس از یک تأخیر.
 
 اگر این خط‌مشی تنظیم شود، ورود به جلسه مشخص شده پس از گذشت یک دوره زمانی در صفحه ورود به سیستم بدون تعامل کاربر به‌طور خودکار انجام خواهد شد. جلسه عمومی باید از قبل پیکربندی شده باشد (به |DeviceLocalAccounts| مراجعه کنید)
@@ -2429,6 +2446,11 @@
       اگر این خط‌مشی غیرفعال شود، هیچ‌گونه «جداشدگی سایت» به‌صورت آشکار انجام نمی‌شود و آزمایش‌های میدانی IsolateOrigins و SitePerProcess غیرفعال خواهد شد. کاربران همچنان می‌توانند SitePerProcess را دستی فعال کنند.
       اگر این خط‌مشی پیکربندی نشود، کاربر می‌تواند این تنظیم را تغییر دهد.
       </translation>
+<translation id="7902255855035461275">الگوهای این فهرست با منشأ امنیتی نشانی وب درخواستی مطابقت داده می‌شود.
+      اگر مورد منطبقی پیدا شود، دسترسی به دستگاه‌های ضبط ویدیو بدون
+      درخواست شدن ارائه می‌شود.
+      
+      توجه: تا قبل از نسخه ۴۵، این خط‌مشی فقط در «حالت کیوسک» پشتیبانی می‌شد.</translation>
 <translation id="7912255076272890813">پیکربندی انواع برنامه/برنامه افزودنی مجاز</translation>
 <translation id="7915236031252389808">‏در اینجا می‌توانید نشانی وب مربوط به یک فایل ‎.‎pac را مشخص کنید.
 
diff --git a/components/policy/resources/policy_templates_fi.xtb b/components/policy/resources/policy_templates_fi.xtb
index bf378db..c3ac16f 100644
--- a/components/policy/resources/policy_templates_fi.xtb
+++ b/components/policy/resources/policy_templates_fi.xtb
@@ -510,6 +510,11 @@
       Jos tätä asetusta ei ole määritetty, käyttäjä voi päättää, käyttääkö tätä toimintoa vai ei.
 
       Tämä asetus on poistettu <ph name="PRODUCT_NAME" /> 29:stä ja uudemmista versioista.</translation>
+<translation id="2433412232489478893">Tämä käytäntö määrittää, antaako <ph name="PRODUCT_NAME" /> käyttäjälle oikeuden käyttää Verkkotiedostojen jakamista.
+
+      Jos tätä käytäntöä ei ole määritetty tai sen arvo on tosi, käyttäjät voivat käyttää Verkkotiedostojen jakamista.
+
+      Jos tämän käytännön arvo on epätosi, käyttäjät eivät voi käyttää Verkkotiedostojen jakamista.</translation>
 <translation id="2438609638493026652">Sallii tärkeistä tapahtumista raportoimisen Googlelle Android-sovelluksen asennuksen aikana. Tapahtumia tallennetaan vain, jos sovelluksen asennus käynnistetään käytännön kautta.
 
       Jos käytännön arvoksi on asetettu tosi, tapahtumat kirjataan.
@@ -587,6 +592,7 @@
 <translation id="2598508021807251719">Määrittää kieli- ja maa-asetukset, joilla <ph name="PRODUCT_OS_NAME" /> voidaan näyttää.
 
       Jos tämä käytäntö on määritetty, <ph name="PRODUCT_OS_NAME" /> voidaan määrittää näkymään ainoastaan jollakin tässä käytännössä ilmoitetulla kielellä. Jos tätä käytäntöä ei ole määritetty tai sen arvoksi on määritetty tyhjä luettelo, <ph name="PRODUCT_OS_NAME" /> voidaan näyttää kaikilla tuetuilla UI-kielillä. Jos käytännön arvoksi on määritetty luettelo, jonka arvot ovat virheellisiä, kaikki virheelliset arvot ohitetaan. Jos <ph name="PRODUCT_OS_NAME" /> on aiemmin määritetty näkymään kielellä, jota käytäntö ei salli, näytettävä UI-kieli vaihdetaan sallittuun kieleen seuraavalla sisäänkirjautumiskerralla. Jos käyttäjä on määrittänyt haluamansa kielet ja jokin niistä sallitaan tässä käytännössä, <ph name="PRODUCT_OS_NAME" /> vaihtaa tähän kieleen. Muussa tapauksessa <ph name="PRODUCT_OS_NAME" /> vaihtaa ensimmäiseen kelvollisen arvoon tai varakieleen (tällä hetkellä Yhdysvaltain englantiin), jos käytännössä on virheellisiä merkintöjä.</translation>
+<translation id="2604182581880595781">Määritä Verkkotiedostojen jakamiseen liittyviä käytäntöjä.</translation>
 <translation id="2623014935069176671">Odota alkuperäisen käyttäjän toimintaa</translation>
 <translation id="262740370354162807">Salli asiakirjojen lähettäminen palveluun <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Määritä yritystulostimien asetuksia.
@@ -666,6 +672,7 @@
 <translation id="2823870601012066791">Käyttöjärjestelmässä <ph name="PRODUCT_OS_NAME" /> toimivien asiakkaiden sijainti Windows-rekisterissä:</translation>
 <translation id="2824715612115726353">Ota incognito-tila käyttöön</translation>
 <translation id="2838830882081735096">Estä tietojen siirtäminen ja ARC</translation>
+<translation id="2839294585867804686">Verkkotiedostojen jakamisen asetukset</translation>
 <translation id="2840269525054388612">Määritä tulostimet, joita käyttäjä voi käyttää.
 
       Tätä käytäntöä käytetään vain, jos <ph name="PRINTERS_WHITELIST" /> on valittuna asetuksen <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> arvoksi.
@@ -1148,6 +1155,7 @@
       Jos tätä käytäntöä ei ole määritetty, anonymisoidun datan kerääminen URL-avaimella on käytössä, mutta käyttäjä voi muuttaa asetusta.</translation>
 <translation id="4250680216510889253">Ei</translation>
 <translation id="4261820385751181068">Laitteen kirjautumisnäytön kieli- ja maa-asetus</translation>
+<translation id="4264607809747169568">Määrittää, onko Verkkotiedostojen jakaminen käytettävissä Chrome-käyttöjärjestelmässä</translation>
 <translation id="427220754384423013">Määritä tulostimet, joita käyttäjä voi käyttää.
 
       Tätä käytäntöä käytetään vain, jos <ph name="PRINTERS_WHITELIST" /> on valittuna asetuksen <ph name="BULK_PRINTERS_ACCESS_MODE" /> arvoksi.
@@ -1548,6 +1556,15 @@
       Käytännön arvo tulee antaa millisekunteina.</translation>
 <translation id="5511702823008968136">Ota kirjanmerkkipalkki käyttöön</translation>
 <translation id="5512418063782665071">Etusivun URL-osoite</translation>
+<translation id="551639594034811656">Tämä käytäntö asettaa prosenttiosuudet, joiden mukaan määritellään, kuinka suuri osuus organisaatioyksikön <ph name="PRODUCT_OS_NAME" /> ‑laitteista päivitetään uuden päivityksen löytämisen jälkeen päivittäin. Löytämisen ajankohta on päivityksen julkaisuajankohdan jälkeen, sillä julkaisusta on saattanut kulua jonkin aikaa, ennen kuin laite tarkistaa päivitykset.
+
+      Kukin päivän ja prosenttiosuuden yhdistelmä määrittää, kuinka suuri osuus laitteistosta täytyy olla päivitettynä valittuun päivään mennessä. Päivät lasketaan päivityksen löytämisestä alkaen. Jos yhdistelmät ovat esimerkiksi [(4, 40), (10, 70), (15, 100)], 40 % laitteistosta tulee olla päivitettynä neljän päivän kuluttua päivityksen löytymisestä, 70 % laitteistosta 10 päivän kuluttua ja niin edelleen.
+
+      Jos tämän käytännön arvo on määritetty, tätä käytäntöä noudatetaan <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />-käytännön sijaan.
+
+      Jos tämä luettelo on tyhjä, päivityksiä ei jaeta päiväkohtaisten kiintiöiden mukaan, vaan ne asennetaan muiden laitekäytäntöjen mukaan.
+
+      Tämä käytäntö ei koske kanavan vaihtoja.</translation>
 <translation id="5523812257194833591">Automaattinen kirjautuminen julkiseen istuntoon viiveen jälkeen.
 
       Jos käytäntö asetetaan, määritettyyn istuntoon kirjaudutaan automaattisesti, kun kirjautumisruudulla ei ole havaittu käyttäjän toimia tietyn ajan kuluessa. Julkinen istunto täytyy määrittää ensin (katso |DeviceLocalAccounts|).
@@ -2439,6 +2456,11 @@
       Jos käytäntö ei ole käytössä, sivustoja ei eristetä ja IsolateOrigins- ja SitePerProcess-käytäntöjen kokeilut poistetaan käytöstä. Käyttäjät voivat edelleen ottaa SitePerProcess-asetuksen käyttöön manuaalisesti.
       Jos käytäntöä ei määritetä, käyttäjä voi muuttaa tätä asetusta.
       </translation>
+<translation id="7902255855035461275">Tähän luetteloon merkittyjä malleja verrataan pyynnön tehneen
+      URL-osoitteen suojaustiedon alkuperään. Jos vastaavuus löydetään,
+      videontallennuslaitteiden käyttöoikeus myönnetään ilman erillistä kehotetta.
+
+      HUOM. Versioon 45 asti tätä käytäntöä tuettiin vain kioskitilassa.</translation>
 <translation id="7912255076272890813">Määritä sallitut sovellus- ja laajennustyypit</translation>
 <translation id="7915236031252389808">Voit määrittää välityspalvelimen .pac-tiedoston URL-osoitteen tässä.
 
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 72e8362..baecfaf 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -521,6 +521,11 @@
       Kung iniwang hindi nakatakda ang setting na ito, maaaring magpasya ang user kung gagamitin o hindi ang function na ito.
 
       Inalis ang setting na ito sa <ph name="PRODUCT_NAME" /> 29 at sa mga mas bagong bersyon.</translation>
+<translation id="2433412232489478893">Kinokontrol ng patakarang ito kung papayagan para sa user ang feature na Mga File Share sa Network para sa <ph name="PRODUCT_NAME" />.
+
+      Kapag hindi naka-configure o nakatakda sa True ang patakarang ito, magagamit ng mga user ang Mga File Share sa Network.
+
+      Kapag nakatakda sa False ang patakarang ito, hindi magagamit ng mga user ang Mga File Share sa Network.</translation>
 <translation id="2438609638493026652">Ine-enable ang pag-uulat ng mahahalagang event sa panahon ng pag-install ng Android app sa Google. Kina-capture lang ang mga event para sa mga app na kung saan na-trigger ng patakaran ang pag-install.
 
       Kung itatakda ang patakaran sa true, mala-log ang mga event.
@@ -602,6 +607,7 @@
 <translation id="2598508021807251719">Kino-configure ang mga lokal kung saan maaaring ipinapakita ang <ph name="PRODUCT_OS_NAME" />.
 
       Kung itatakda ang patakarang ito, mako-configure lang ng user ang <ph name="PRODUCT_OS_NAME" /> para ipakita sa isa sa mga lokal na tinukoy sa patakarang ito. Kung hindi itatakda ang patakarang ito o itatakda ito sa isang blangkong listahan, maaaring ipakita ang <ph name="PRODUCT_OS_NAME" /> sa lahat ng sinusuportahang lokal ng UI. Kung itatakda ang patakarang ito sa isang listahang may mga invalid na value, babalewalain ang lahat ng invalid na value. Kung na-configure dati ng user ang <ph name="PRODUCT_OS_NAME" /> para ipakita sa isang lokal na hindi pinapayagan ng patakarang ito, ililipat ang lokal ng display sa isang pinapayagang lokal ng UI sa susunod na mag-sign in ang user. Kung na-configure ng user ang mga piniling lokal at ang isa sa mga piniling lokal ay pinapayagan ng patakarang ito, lilipat ang <ph name="PRODUCT_OS_NAME" /> sa lokal na ito. Kung hindi, lilipat ang <ph name="PRODUCT_OS_NAME" /> sa unang valid na value na tinukoy sa patakarang ito, o sa isang fallback na lokal (kasalukuyang en-US), kung naglalaman lang ang patakarang ito ng mga invalid na entry.</translation>
+<translation id="2604182581880595781">I-configure ang mga patakarang nauugnay sa File Share sa Network.</translation>
 <translation id="2623014935069176671">Maghintay sa paunang aktibidad ng user</translation>
 <translation id="262740370354162807">Paganahin ang pagsusumite ng mga dokumento sa <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Nagbibigay ng mga configuration para sa mga printer ng enterprise.
@@ -687,6 +693,7 @@
 <translation id="2823870601012066791">Lokasyon ng registry ng Windows para sa mga <ph name="PRODUCT_OS_NAME" /> client:</translation>
 <translation id="2824715612115726353">Paganahin ang Incognito mode</translation>
 <translation id="2838830882081735096">Huwag payagan ang paglipat ng data at ARC</translation>
+<translation id="2839294585867804686">Mga setting ng Mga File Share sa Network</translation>
 <translation id="2840269525054388612">Tinutukoy ang mga printer na maaaring gamitin ng isang user.
 
       Gagamitin lang ang patakarang ito kung napili ang <ph name="PRINTERS_WHITELIST" /> para sa <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1177,6 +1184,7 @@
       Kung hahayaang hindi nakatakda ang patakarang ito, ie-enable ang pangongolekta ng naka-anonymize na data na may key ng URL ngunit mababago ito ng user.</translation>
 <translation id="4250680216510889253">Hindi</translation>
 <translation id="4261820385751181068">Lokal ng screen sa pag-sign in ng device</translation>
+<translation id="4264607809747169568">Kumokontrol sa Mga File Share sa Network para sa availability ng ChromeOS</translation>
 <translation id="427220754384423013">Tinutukoy ang mga printer na maaaring gamitin ng isang user.
 
       Gagamitin lang ang patakarang ito kung napili ang <ph name="PRINTERS_WHITELIST" /> para sa <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1607,6 +1615,15 @@
       Dapat tukuyin sa milliseconds ang halaga ng patakaran.</translation>
 <translation id="5511702823008968136">Paganahin ang Bookmark Bar</translation>
 <translation id="5512418063782665071">URL ng home page</translation>
+<translation id="551639594034811656">Nakasaad sa patakarang ito ang listahan ng mga porsyentong maglalarawan sa bahagi ng mga <ph name="PRODUCT_OS_NAME" /> device sa OU para mag-update bawat araw simula sa araw na unang matuklasan ang update. Ang oras ng pagtuklas ay pagkatapos ng oras ng pag-publish ng update, dahil maaaring medyo matagalan ang palugit sa pagitan ng pag-publish ng update at pagtingin ng update ng device.
+
+      Makikita sa bawat (araw, porsyento) pares kung aling porsyento ng fleet ang ia-update ayon sa isinaad na bilang ng mga araw simula nang matuklasan ang update. Halimbawa, kung mayroon kami ng mga pares [(4, 40), (10, 70), (15, 100)], 40% ng fleet ang dapat ma-update 4 na araw pagkatapos makita ang update. 70% ang dapat ma-update pagkalipas ng 10 araw, at ganito rin sa susunod.
+
+      Kung may tinukoy na value para sa patakarang ito, babalewalain ng mga update ang patakarang <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> at susundin na lang ang patakarang ito.
+
+      Kung walang laman ang listahang ito, walang magiging staging at ilalapat ang mga update ayon sa iba pang patakaran ng device.
+
+      Hindi nalalapat ang patakarang ito para sa mga switch ng channel.</translation>
 <translation id="5523812257194833591">Awtomatikong mala-log in ang isang pampublikong session pagkatapos ng delay.
 
       Kung nakatakda ang patakarang ito, ang tinukoy na session ay awtomatikong mala-log in kapag lumipas na ang isang takdang panahon sa screen sa pag-log in nang walang pakikipag-ugnayan ng user. Dapat ay naka-configure na ang pampublikong session (tingnan ang |DeviceLocalAccounts|).
@@ -2540,6 +2557,11 @@
       Kung idi-disable ang patakaran, walang magaganap na tahasang Pag-isolate ng Site at madi-disable ang mga field trial ng IsolateOrigins at SitePerProcess. Mae-enable pa rin ng mga user ang SitePerProcess sa manual na paraan.
       Kung hindi naka-configure ang patakaran, mababago ng user ang setting na ito.
       </translation>
+<translation id="7902255855035461275">Itutugma ang mga pattern sa listahang ito sa security
+      origin ng humihiling na URL.  Kung makakakita ng katugma, magbibigay ng access sa mga device na nagka-capture ng video
+      nang walang prompt.
+
+      TANDAAN: Hanggang sa bersyon 45, sinusuportahan lang ang patakarang ito sa Kiosk mode.</translation>
 <translation id="7912255076272890813">I-configure ang mga pinapayagang uri ng app/extension</translation>
 <translation id="7915236031252389808">Makakapagtakda ka rito ng URL sa isang proxy .pac file.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index d37b835..27f33e49 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -304,6 +304,11 @@
       Si un paramètre n'est pas défini, une valeur par défaut est utilisée.
 
       Si cette règle n'est pas configurée, des valeurs par défaut sont utilisées pour l'ensemble des paramètres.</translation>
+<translation id="1958138414749279167">Active la fonctionnalité de saisie automatique de <ph name="PRODUCT_NAME" />, qui permet à l'utilisateur de remplir automatiquement des formulaires Web à partir de données stockées précédemment, telles que des informations relatives à son adresse.
+
+      Si ce paramètre est désactivé, ces informations ne sont jamais suggérées ni saisies automatiquement. De même, les informations complémentaires relatives à l'adresse que l'utilisateur est susceptible de fournir sur une page Web ne sont pas enregistrées.
+
+      Si ce paramètre est activé ou vide, l'utilisateur peut contrôler la saisie automatique pour les adresses dans l'interface utilisateur.</translation>
 <translation id="1960840544413786116">Autoriser ou non les certificats émis par les ancres d'approbation locales qui ne comportent pas l'extension subjectAlternativeName</translation>
 <translation id="1964634611280150550">Mode navigation privée désactivé</translation>
 <translation id="1964802606569741174">Cette règle n'a aucun effet sur l'application YouTube pour Android. Vous ne devez pas autoriser son installation si le mode sécurisé de YouTube doit être appliqué.</translation>
@@ -528,6 +533,11 @@
       Si vous ne définissez pas ce paramètre, les utilisateurs peuvent choisir d'appliquer cette fonctionnalité ou non.
 
       Ce paramètre a été supprimé de <ph name="PRODUCT_NAME" /> 29 et versions ultérieures.</translation>
+<translation id="2433412232489478893">Cette règle permet de déterminer si la fonctionnalité Partages de fichiers en réseau pour <ph name="PRODUCT_NAME" /> est autorisée pour un utilisateur.
+
+      Si cette règle n'est pas configurée ou si elle est définie sur "True", les utilisateurs peuvent utiliser la fonctionnalité Partages de fichiers en réseau.
+
+      Si cette règle est définie sur "False", les utilisateurs ne peuvent pas utiliser la fonctionnalité Partages de fichiers en réseau.</translation>
 <translation id="2438609638493026652">Permet de signaler des événements clés à Google pendant l'installation d'une application Android. Les événements ne sont enregistrés que pour les applications dont l'installation a été déclenchée via des règles.
 
       Si cette règle est définie sur "True", les événements sont enregistrés.
@@ -609,6 +619,7 @@
 <translation id="2598508021807251719">Permet de configurer les langues dans lesquelles <ph name="PRODUCT_OS_NAME" /> peut s'afficher.
 
       Si cette règle est définie, l'utilisateur ne peut configurer l'affichage de <ph name="PRODUCT_OS_NAME" /> que dans l'une des langues spécifiées dans cette règle. Si cette dernière n'est pas configurée ou si elle est définie sur une liste vide, <ph name="PRODUCT_OS_NAME" /> peut s'afficher dans toutes les langues compatibles de l'interface utilisateur. Si cette règle est définie sur une liste contenant des valeurs non valides, ces dernières sont toutes ignorées. Si un utilisateur a auparavant configuré l'affichage de <ph name="PRODUCT_OS_NAME" /> dans une langue non autorisée par cette règle, la langue d'affichage est remplacée par une langue autorisée lors de la prochaine connexion de l'utilisateur. Si l'utilisateur a configuré des langues préférées et que l'une d'entre elles est autorisée par cette règle, <ph name="PRODUCT_OS_NAME" /> s'affiche dans cette langue. Sinon, <ph name="PRODUCT_OS_NAME" /> s'affiche dans la langue définie par la première valeur valide spécifiée par cette règle, ou dans une langue de remplacement (actuellement, en-US), si cette règle contient uniquement des entrées non valides.</translation>
+<translation id="2604182581880595781">Configurer les règles associées à la fonctionnalité Partages de fichiers en réseau.</translation>
 <translation id="2623014935069176671">Attendre l'activité utilisateur initiale</translation>
 <translation id="262740370354162807">Activer l'envoi de documents à <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Fournit les configurations des imprimantes d'entreprise associées à des appareils.
@@ -694,6 +705,7 @@
 <translation id="2823870601012066791">Emplacement du registre Windows pour les clients <ph name="PRODUCT_OS_NAME" /> :</translation>
 <translation id="2824715612115726353">Activer le mode navigation privée</translation>
 <translation id="2838830882081735096">Interdire la migration de données et ARC</translation>
+<translation id="2839294585867804686">Paramètres de la fonctionnalité Partages de fichiers en réseau</translation>
 <translation id="2840269525054388612">Indique les imprimantes auxquelles un utilisateur a accès.
 
       Cette règle est utilisée uniquement si <ph name="PRINTERS_WHITELIST" /> est sélectionné pour <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1181,7 +1193,7 @@
 
           Si cette règle n'est pas définie, la valeur globale par défaut est utilisée pour tous les sites, et déterminée à partir de la règle "DefaultKeygenSetting" si celle-ci est définie, ou à partir de la configuration personnelle de l'utilisateur.</translation>
 <translation id="4239720644496144453">Le cache n'est pas utilisé pour les applications Android. Si plusieurs utilisateurs installent la même application Android, celle-ci sera à nouveau téléchargée pour chacun d'eux.</translation>
-<translation id="4243336580717651045">Activer la collecte des données anonymes incluant les URL dans <ph name="PRODUCT_NAME" /> et empêche les utilisateurs de modifier ce paramètre.
+<translation id="4243336580717651045">Permet d'activer la collecte des données anonymes incluant les URL dans <ph name="PRODUCT_NAME" /> et empêche l'utilisateur de modifier ce paramètre.
 
       La collecte des données anonymes incluant les URL transmet les URL des pages que l'utilisateur a visitées à Google pour améliorer vos recherches et votre navigation.
 
@@ -1192,6 +1204,7 @@
       Si vous ne configurez pas cette règle, la collecte des données anonymes incluant les URL est activée, mais l'utilisateur pourra la modifier.</translation>
 <translation id="4250680216510889253">Non</translation>
 <translation id="4261820385751181068">Paramètres régionaux de l'écran de connexion de l'appareil</translation>
+<translation id="4264607809747169568">Vérifie la disponibilité de la fonctionnalité Partages de fichiers en réseau pour Chrome OS</translation>
 <translation id="427220754384423013">Indique les imprimantes auxquelles un utilisateur a accès.
 
       Cette règle est utilisée uniquement si <ph name="PRINTERS_WHITELIST" /> est sélectionné pour <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1625,6 +1638,15 @@
       Notez que la valeur de cette règle se mesure en millisecondes.</translation>
 <translation id="5511702823008968136">Activer le barre de favoris</translation>
 <translation id="5512418063782665071">URL de la page d'accueil</translation>
+<translation id="551639594034811656">Cette règle dresse une liste de pourcentages qui définit la fraction d'appareils <ph name="PRODUCT_OS_NAME" /> de l'unité organisationnelle qui doivent être mis à jour, par jour, à compter de la date où la mise à jour est détectée pour la première fois. La date de détection est postérieure à la date de publication de la mise à jour, car un certain temps peut s'écouler avant que l'appareil ne recherche des mises à jour après la publication de la mise à jour.
+
+      Chaque paire (jour, pourcentage) contient le pourcentage du parc qui doit être mis à jour en fonction du nombre de jours écoulés depuis la détection de la mise à jour. Par exemple, dans le cas des paires [(4, 40), (10, 70), (15, 100)], il faut que 40 % du parc ait été mis à jour 4 jours après la détection de la mise à jour, 70 % après 10 jours, et ainsi de suite.
+
+      Si cette règle est définie sur une valeur, elle s'applique à la place de la règle <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />
+
+      Si cette liste est vide, il n'y a pas de déploiement par étapes et les mises à jour sont appliquées en fonction des autres règles des appareils.
+
+      Cette règle ne concerne pas les changements de version.</translation>
 <translation id="5523812257194833591">Session publique à laquelle le système se connecte automatiquement après l'expiration du délai d'inactivité de l'utilisateur.
 
       Si cette règle est définie, le système se connecte automatiquement à la session spécifiée après expiration du délai d'inactivité. La session publique doit être configurée au préalable (voir |DeviceLocalAccounts|).
@@ -1938,6 +1960,7 @@
 <translation id="6440051664870270040">Autoriser les sites à parcourir et à ouvrir des pop-up simultanément</translation>
 <translation id="6447948611083700881">Service de sauvegarde et de restauration désactivé</translation>
 <translation id="645425387487868471">Activer la connexion forcée pour <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Activer la saisie automatique pour les adresses</translation>
 <translation id="6473623140202114570">Configurez la liste des domaines sur lesquels la navigation sécurisée ne déclenchera aucun avertissement.</translation>
 <translation id="6491139795995924304">Autoriser le Bluetooth sur l'appareil</translation>
 <translation id="6520802717075138474">Importer les moteurs de recherche du navigateur par défaut à la première exécution</translation>
@@ -2559,6 +2582,11 @@
       Si cette règle est désactivée, aucune isolation de sites explicite n'est effectuée, et les tests en conditions réelles d'IsolateOrigins et de SitePerProcess sont désactivés. Les utilisateurs peuvent toujours activer SitePerProcess manuellement.
       Si cette règle n'est pas configurée, l'utilisateur peut modifier ce paramètre.
       </translation>
+<translation id="7902255855035461275">Les modèles de cette liste sont rapprochés de la source de sécurité
+      de l'URL à l'origine de la demande. En cas de correspondance, l'accès
+      aux appareils d'enregistrement vidéo est autorisé sans confirmation requise.
+
+      REMARQUE : Avant la version 45, cette règle n'était compatible qu'avec le mode Kiosque.</translation>
 <translation id="7912255076272890813">Configurer les types d'applications ou d'extensions autorisés</translation>
 <translation id="7915236031252389808">Vous pouvez indiquer ici une URL pointant vers un fichier .pac de proxy.
 
diff --git a/components/policy/resources/policy_templates_gu.xtb b/components/policy/resources/policy_templates_gu.xtb
index c64eda2..8c6b969f 100644
--- a/components/policy/resources/policy_templates_gu.xtb
+++ b/components/policy/resources/policy_templates_gu.xtb
@@ -345,6 +345,11 @@
       જો સેટિંગ અનુલ્લેખિત છોડી હોય, તો ડિફોલ્ટ મૂલ્યનો ઉપયોગ થાય છે.
 
       જો આ નીતિ સેટ કર્યા વગરની છે, તો બધી સેટિંગ્સ માટે ડિફોલ્ટ્સનો ઉપયોગ થાય છે.</translation>
+<translation id="1958138414749279167"><ph name="PRODUCT_NAME" />ની આપમેળે ભરાવાની સુવિધા ચાલુ કરે છે અને વપરાશકર્તાઓને પહેલાં સંગ્રહ કરેલી માહિતીનો ઉપયોગ કરીને વેબ ફૉર્મમાં સરનામાની માહિતી આપમેળે પૂર્ણ કરવાની મંજૂરી આપે છે.
+
+      જો આ સેટિંગ બંધ હોય, તો આપમેળે ભરાવાની સુવિધા ક્યારેય સૂચન નહીં આપે, સરનામાની માહિતી નહીં ભરે અથવા વેબને બ્રાઉઝ કરતી વખતે વપરાશકર્તાએ સબમિટ કરી હોઈ શકે તેવી સરનામાની વધારાની માહિતી નહીં સાચવે.
+
+      જો આ સેટિંગ ચાલુ કરેલ હશે અથવા તેમાં કોઈ મૂલ્ય નહીં હોય, તો વપરાશકર્તા UIમાંના સરનામા માટે આપમેળે ભરાવાની સુવિધાનું નિયંત્રણ કરી શકશે.</translation>
 <translation id="1960840544413786116">સ્થાનિક વિશ્વનીય એન્કર દ્વારા જારી કરાયેલ તે પ્રમાણપત્રોને મંજૂરી આપવામાં આવે કે નહીં કે જેમાં subjectAlternativeName એક્સ્ટેન્શન ખૂટે છે</translation>
 <translation id="1964634611280150550">છુપો મોડ અક્ષમ કર્યો</translation>
 <translation id="1964802606569741174">આ નીતિનો Android YouTube ઍપ્લિકેશન પર કોઈ પ્રભાવ પડતો નથી. જો YouTube પર સુરક્ષા મોડ લાગુ કરવો જોઈએ, તો Android YouTube ઍપ્લિકેશનનું ઇન્સ્ટૉલેશન નામંજૂર કરી દેવું જોઈએ.</translation>
@@ -594,6 +599,11 @@
       જો આ નીતિ false પર સેટ કરેલી છે, તો <ph name="PRODUCT_OS_NAME" /> લૉગિન સ્ક્રીન પર અસ્તિત્વમાં છે તે વપરાશકર્તાઓ બતાવશે નહીં. સામાન્ય સાઇન-ઇન સ્ક્રીન (વપરાશકર્તાના ઇમેઇલ ઍડ્રેસ અને પાસવર્ડ અથવા ફોન માટે સંકેત આપતી) અથવા SAML interstital સ્ક્રીન (જો <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" /> નીતિ દ્વારા સક્ષમ કરેલ હોય) બતાવવામાં આવશે, સિવાય કે સાર્વજનિક સત્ર ગોઠવેલ ન હોય. જ્યારે સાર્વજનિક સત્ર ગોઠવેલ હોય, ત્યારે માત્ર સાર્વજનિક સત્ર એકાઉન્ટ બતાવવામાં આવશે, જે તેમાંથી એક પસંદ કરવાની મંજૂરી આપે છે.
 
       નોંધો કે આ નીતિ ઉપકરણ સ્થાનિક વપરાશકર્તા ડેટા રાખે કે નિકાળી દે તેને પ્રભાવિત કરતી નથી.</translation>
+<translation id="2433412232489478893">આ નીતિ વપરાશકર્તા માટે <ph name="PRODUCT_NAME" /> માટે 'નેટવર્ક ફાઇલ શેર' સુવિધાને મંજૂરી મળે કે નહીં તેનું નિયંત્રણ કરે છે.
+
+      જ્યારે આ નીતિ કન્ફિગર કરવામાં ન આવી હોય અથવા True પર સેટ કરેલી હોય, ત્યારે વપરાશકર્તાઓ 'નેટવર્ક ફાઇલ શેર'નો ઉપયોગ કરી શકશે.
+
+      જ્યારે આ નીતિ False પર સેટ કરવામાં આવી હોય, ત્યારે વપરાશકર્તાઓ 'નેટવર્ક ફાઇલ શેર'નો ઉપયોગ નહીં કરી શકે.</translation>
 <translation id="2438609638493026652">Google પર Android ઍપ ઇન્સ્ટૉલેશન દરમિયાન મહત્વની ઇવેન્ટનું રિપોર્ટિંગ ચાલુ કરે છે. ઇવેન્ટ ફક્ત એવી ઍપ માટે કૅપ્ચર કરવામાં આવે છે જેનું ઇન્સ્ટૉલેશન નીતિ દ્વારા શરૂ થયું હતું.
 
       જો નીતિ true પર સેટ કરેલી હોય, તો ઇવેન્ટ લૉગ થશે.
@@ -679,6 +689,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> પ્રદર્શિત થઈ શકે તે લોકેલને કન્ફિગર કરે છે.
 
       જો આ નીતિ સેટ કરેલી હોય, તો વપરાશકર્તા <ph name="PRODUCT_OS_NAME" />ને આ નીતિ દ્વારા ઉલ્લેખિત લોકેલમાંથી માત્ર એકમાં પ્રદર્શિત થવા માટે કન્ફિગર કરી શકે છે. જો આ નીતિ સેટ કરેલી ન હોય અથવા ખાલી સૂચિ પર સેટ કરેલી હોય, તો <ph name="PRODUCT_OS_NAME" /> બધા સમર્થિત UI લોકેલમાં પ્રદર્શિત થઈ શકે છે. જો આ નીતિ અમાન્ય મૂલ્યો ધરાવતી સૂચિ પર સેટ કરવામાં આવી હોય, તો બધાં અમાન્ય મૂલ્યોને અવગણવામાં આવશે. જો વપરાશકર્તાએ <ph name="PRODUCT_OS_NAME" />ને પહેલાં એવા લોકેલમાં પ્રદર્શિત થવા માટે કન્ફિગર કર્યું હોય જેને આ નીતિ દ્વારા મંજૂરી મળેલી નથી, તો આગલી વાર જ્યારે વપરાશકર્તા સાઇન ઇન કરશે ત્યારે ડિસ્પ્લે લોકેલને મંજૂર થયેલા UI લોકેલ પર સ્વિચ કરવામાં આવશે. જો વપરાશકર્તાએ પસંદગીના લોકેલ કન્ફિગર કર્યા હોય અને પસંદગીના લોકેલમાંના એકને આ નીતિ દ્વારા મંજૂરી મળેલી હોય, તો <ph name="PRODUCT_OS_NAME" /> આ લોકેલ પર સ્વિચ થશે. અન્યથા, <ph name="PRODUCT_OS_NAME" /> આ નીતિ દ્વારા ઉલ્લેખિત પ્રથમ માન્ય મૂલ્ય પર અથવા જો આ નીતિ માત્ર અમાન્ય એન્ટ્રીઓ ધરાવતી હોય તો ફૉલબૅક લોકેલ (હાલમાં en-US) પર સ્વિચ થશે.</translation>
+<translation id="2604182581880595781">'નેટવર્ક ફાઇલ શેર' સંબંધિત નીતિઓ કન્ફિગર કરો.</translation>
 <translation id="2623014935069176671">આરંભિક વપરાશકર્તા પ્રવૃત્તિ માટે રાહ જુઓ</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> પર દસ્તાવેજના સબમિશનને સક્ષમ કરો</translation>
 <translation id="2627554163382448569">ઉપકરણો સાથે જોડેલ એન્ટરપ્રાઇઝ પ્રિન્ટર માટે ગોઠવણો પૂરી પાડે છે.
@@ -766,6 +777,7 @@
 
           જો નીતિ સેટ કરેલ ન હોય, તો કોઈ મહત્તમ લંબાઈ લાગુ કરવામાં આવતી નથી.</translation>
 <translation id="2838830882081735096">ડેટાનું સ્થાનાંતરણ અને ARCને નામંજૂર કરો</translation>
+<translation id="2839294585867804686">'નેટવર્ક ફાઇલ શેર' સેટિંગ</translation>
 <translation id="2840269525054388612">વપરાશકર્તા ઉપયોગમાં લઈ શકે તે પ્રિન્ટરને ઉલ્લેખિત કરે છે.
 
       જો <ph name="PRINTERS_WHITELIST" />ને <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> માટે પસંદ કર્યું હોય, તો જ આ નીતિનો ઉપયોગ કરવામાં આવે છે.
@@ -1340,6 +1352,7 @@
       જો આ નીતિ સેટ કર્યા વિનાની હશે, તો URL-કીવાળા અનામીકૃત ડેટાનું એકત્રીકરણ ચાલુ થશે, પણ વપરાશકર્તા તેને બદલી શકશે.</translation>
 <translation id="4250680216510889253">નહીં</translation>
 <translation id="4261820385751181068">ઉપકરણ સાઇન ઇન સ્ક્રીન લોકેલ</translation>
+<translation id="4264607809747169568">ChromeOSની ઉપલબ્ધતા માટે 'નેટવર્ક ફાઇલ શેર'નું નિયંત્રણ કરે છે</translation>
 <translation id="427220754384423013">વપરાશકર્તા ઉપયોગમાં લઈ શકે તે પ્રિન્ટરને ઉલ્લેખિત કરે છે.
 
       જો <ph name="PRINTERS_WHITELIST" />ને <ph name="BULK_PRINTERS_ACCESS_MODE" /> માટે પસંદ કર્યું હોય, તો જ આ નીતિનો ઉપયોગ કરવામાં આવે છે.
@@ -1835,6 +1848,15 @@
       નીતિ મૂલ્ય મીલિસેકન્ડ્સમાં ઉલ્લેખિત હોવું જોઈએ.</translation>
 <translation id="5511702823008968136">બુકમાર્ક બાર સક્ષમ કરો </translation>
 <translation id="5512418063782665071">હોમ પેજ URL</translation>
+<translation id="551639594034811656">આ નીતિ એ ટકાવારીઓની સૂચિ વ્યાખ્યાયિત કરે છે જે, અપડેટ મળ્યાના દિવસથી શરૂઆત કરીને OUમાં પ્રતિ દિવસ અપડેટ કરવાના <ph name="PRODUCT_OS_NAME" /> ઉપકરણોના અંશ વ્યાખ્યાયિત કરશે. મળ્યાનો સમય અપડેટ પ્રકાશિત થયાના સમય પછીનો હોય છે, કારણ કે અપડેટ પ્રકાશિત થયા પછી ઉપકરણ અપડેટની તપાસ કરે તેમાં થોડો સમય લાગી જાય છે.
+
+      દરેક (દિવસ, ટકાવારી) જોડીમાં અપડેટ પ્રકાશિત થાય ત્યાર પછીના આપવામાં આવેલા દિવસોની સંખ્યા પ્રમાણે અપડેટ કરવાના ઉપકરણોની ટકાવારી હોય છે. ઉદાહરણ તરીકે, જો આપણી પાસે [(4, 40), (10, 70), (15, 100)] જોડીઓ હોય, તો અપડેટ જોવાયાના 4 દિવસ પછી 40% ઉપકરણો અપડેટ થયા હોવા જોઈશે. 10 દિવસ પછી 70% અપડેટ થયા હોવા જોઈશે, એ પ્રમાણે ગણતરી કરવી.
+
+      જો આ નીતિ માટે કોઈ મૂલ્ય વ્યાખ્યાયિત કરવામાં આવ્યું હશે, તો અપડેટ <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> નીતિને અવગણશે અને તેના બદલે આ નીતિને અનુસરશે.
+
+      જો આ નીતિ ખાલી હશે, તો સ્ટેજિંગ નહીં થાય અને ઉપકરણની અન્ય નીતિઓ અનુસાર અપડેટ લાગુ કરવામાં આવશે.
+
+      આ નીતિ ચૅનલ સ્વિચ માટે લાગુ થતી નથી.</translation>
 <translation id="5523812257194833591">વિલંબ પછી સ્વતઃલોગિન કરવા માટે એક સાર્વજનિક સત્ર.
 
       જો આ નીતિ સેટ કરેલી હોય, તો ઉલ્લેખિત સત્ર વપરાશકર્તાના હસ્તક્ષેપ વિના લોગિન સ્ક્રીન પર સમયની અવધિ વીતી ગયા પછી આપમેળે લોગિન કરશે. સાર્વજનિક સત્ર પહેલેથી ગોઠવેલું હોવું જોઈએ (|DeviceLocalAccounts| જુઓ).
@@ -2169,6 +2191,7 @@
 <translation id="6440051664870270040">સાઇટને નૅવિગેટ કરવાની અને પૉપ-અપ ખોલવાની ક્રિયા એકસાથે કરવા દો</translation>
 <translation id="6447948611083700881">બૅકઅપ અને પુનઃસ્થાપના બંધ કરેલ છે</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> માટે ફરજિયાત સાઇન ઇન ચાલુ કરો</translation>
+<translation id="6464074037294098618">સરનામા માટે આપમેળે ભરાવાનું ચાલુ કરો</translation>
 <translation id="6467613372414922590">વપરાશકર્તા-સ્તરના મૂળ મેસેજિંગ હોસ્ટને મંજૂરી આપો (વ્યવસ્થાપક પરવાનગીઓ વિના ઇન્સ્ટૉલ કરેલ).</translation>
 <translation id="6468980648680553776">આ નીતિ ટાળવામાં આવી છે. કૃપા કરીને RemoteAccessHostClientDomainList insteadનો ઉપયોગ કરો.</translation>
 <translation id="6473623140202114570">ડોમેનની સૂચિ જેના પર Safe Browsing ચેતવણીઓ ટ્રિગર નહીં કરે તે ગોઠવો.</translation>
@@ -2825,6 +2848,11 @@
       જો નીતિ બંધ કરેલી હોય, તો સાઇટ માટે કોઈ વિશિષ્ટ આઇસોલેશન નહીં થાય અને IsolateOrigins તથા SitePerProcessની ફીલ્ડ અજમાયશો બંધ થશે. વપરાશકર્તાઓ હજુ પણ SitePerProcess મૅન્યુઅલી ચાલુ કરી શકશે.
       જો નીતિ કન્ફિગર કરેલી નહીં હોય, તો વપરાશકર્તા આ સેટિંગ બદલી શકશે.
       </translation>
+<translation id="7902255855035461275">વિનંતી કરનાર URLની સુરક્ષાના મૂળ સાથે આ સૂચિમાંની પૅટર્નનો 
+      મેળ કરવામાં આવશે. જો કોઈ મેળ મળશે, તો સંકેત વિના વીડિઓ
+      કૅપ્ચર ઉપકરણો માટે ઍક્સેસ આપવામાં આવશે.
+
+      નોંધ: વર્ઝન 45 સુધી, આ નીતિ માત્ર કિઓસ્ક મોડમાં સમર્થિત હતી.</translation>
 <translation id="7912255076272890813">મંજૂર ઍપ્લિકેશન/એક્સ્ટેંશન પ્રકારોને ગોઠવો</translation>
 <translation id="7915236031252389808">તમે અહીં પ્રોક્સી .pac ફાઇલના URL નો ઉલ્લેખ કરી શકો છો.
 
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index 85ab428..aaa13789 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -302,6 +302,11 @@
       अगर कोई सेटिंग तय किए बिना छोड़ दी जाती है तो, डिफ़ॉल्ट मान का उपयोग किया जाता है.
 
       अगर यह नीति सेट नहीं होती है तो, सभी सेटिंग के लिए डिफ़ॉल्ट का उपयोग किया जाता है.</translation>
+<translation id="1958138414749279167">यह नीति <ph name="PRODUCT_NAME" /> की 'अपने आप भरने की सुविधा (ऑटो फ़िल)' चालू करती है. इसके ज़रिए उपयोगकर्ताओं को पहले से संग्रहित जानकारी की मदद से वेब फ़ॉर्म में पते की जानकारी अपने आप भरने की सुविधा मिलती है.
+
+      अगर यह सेटिंग बंद होती है, तो 'अपने आप भरने की सुविधा (ऑटो फ़िल)' न तो कभी कोई सुझाव देगी न ही पते की जानकारी भरेगी. साथ ही यह पते की ऐसी और ज़्यादा जानकारी सेव नहीं करेगी जिसे उपयोगकर्ता ने शायद वेब ब्राउज़ करते समय सबमिट किया होगा.
+
+      अगर यह सेटिंग चालू होती है या इसका कोई मान न दिया गया हो, तो उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) में पते की जानकारी के लिए 'अपने आप भरने की सुविधा (ऑटो फ़िल)' को नियंत्रित कर पाएगा.</translation>
 <translation id="1960840544413786116">स्थानीय विश्वसनीय एंकरों की ओर से जारी किए जाने वाले ऐसे प्रमाणपत्रों को अनुमति दें या नहीं जिनमें subjectAlternativeName एक्सटेंशन मौजूद नहीं है</translation>
 <translation id="1964634611280150550">गुप्त मोड अक्षम किया गया</translation>
 <translation id="1964802606569741174">इस नीति का Android YouTube ऐप्लिकेशन पर कोई प्रभाव नहीं पड़ता. यदि YouTube पर सुरक्षा मोड लागू किया जाना चाहिए, तो Android YouTube ऐप्लिकेशन के इंस्टॉलेशन की अनुमति नहीं दी जानी चाहिए.</translation>
@@ -519,6 +524,11 @@
       अगर यह सेटिंग सेट किए बिना छोड़ दी जाती है तो, उपयोगकर्ता इस फ़ंक्शन का उपयोग करने या न करने का फ़ैसला कर सकते हैं.
 
       <ph name="PRODUCT_NAME" /> के 29 और उसके बाद वाले वर्शन से यह सेटिंग हटा दी गई है.</translation>
+<translation id="2433412232489478893">यह नीति नियंत्रित करती है कि क्या किसी उपयोगकर्ता के लिए <ph name="PRODUCT_NAME" /> की नेटवर्क फ़ाइल शेयर सुविधा की अनुमति है या नहीं.
+
+      जब यह नीति कॉन्फ़िगर नहीं होती या सही पर सेट की जाती है, तो उपयोगकर्ता नेटवर्क फ़ाइल शेयर का इस्तेमाल कर पाएंगे.
+
+      जब यह नीति गलत पर सेट होती है, तो उपयोगकर्ता नेटवर्क फ़ाइल शेयर का इस्तेमाल नहीं कर पाएंगे.</translation>
 <translation id="2438609638493026652">Android ऐप्लिकेशन इंस्टॉल करते समय होने वाले खास इवेंट के बारे में Google को रिपोर्ट करती है. सिर्फ़ उन्हीं ऐप्लिकेशन के इवेंट कैप्चर किए जाते हैं जिनके इंस्टॉलेशन को नीति के ज़रिए शुरू हुआ था.
 
       अगर नीति सही पर सेट हो, तो इवेंट लॉग किए जाएंगे.
@@ -600,6 +610,7 @@
 <translation id="2598508021807251719">उन स्थान-भाषाओं को कॉन्फ़िगर करती है जिनमें <ph name="PRODUCT_OS_NAME" /> दिखाया जा सकता है.
 
       अगर यह नीति सेट हो, तो उपयोगकर्ता <ph name="PRODUCT_OS_NAME" /> को सिर्फ़ इस नीति में बताई गई स्थान-भाषाओं में से किसी एक में दिखाए जाने के लिए कॉन्फ़िगर कर सकता है. अगर यह नीति सेट नहीं हो या किसी खाली सूची पर सेट हो, तो <ph name="PRODUCT_OS_NAME" /> को काम करने वाली सभी यूज़र इंटरफ़ेस (यूआई) स्थान-भाषाओं में दिखाया जा सकता है. अगर यह नीति गलत मानों वाली किसी सूची पर सेट हो, तो सभी गलत मानों को अनदेखा कर दिया जाएगा. अगर किसी उपयोगकर्ता ने <ph name="PRODUCT_OS_NAME" /> को पहले किसी ऐसी भाषा में दिखाए जाने के लिए कॉन्फ़िगर किया है जिसे यह नीति मंज़ूरी नहीं देती है, तो दिखाई जाने वाली स्थान-भाषा अगली बार उपयोगकर्ता के साइन इन करने पर मंज़ूरी दी गई स्थान-भाषा में बदल जाएगी. अगर उपयोगकर्ता ने पसंदीदा स्थान-भाषाएं कॉन्फ़िगर की थीं और पसंदीदा स्थान-भाषाओं में से किसी एक को इस नीति ने मंज़ूरी दी है, तो <ph name="PRODUCT_OS_NAME" /> इस स्थान-भाषा में बदल जाएगा. अगर ऐसा नहीं होता है, तो <ph name="PRODUCT_OS_NAME" /> इस नीति के बताए गए पहले सही मान में बदल जाएगा या अगर इस नीति में सिर्फ़ गलत प्रविष्टियां ही हों तो, वह किसी वैकल्पिक स्थान-भाषा (फ़िलहाल en-US) में बदल जाएगा.</translation>
+<translation id="2604182581880595781">नेटवर्क फ़ाइल शेयर से जुड़ी नीतियां कॉन्फ़िगर करें.</translation>
 <translation id="2623014935069176671">'उपयोगकर्ता की शुरुआती गतिविधि' का इंतज़ार करें</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> पर दस्‍तावेज़ों का सबमिशन सक्षम करती है</translation>
 <translation id="2627554163382448569">एंटरप्राइज़ प्रिंटर के लिए कॉन्फ़िगरेशन उपलब्ध कराती है.
@@ -686,6 +697,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> क्लाइंट के लिए Windows रजिस्ट्री का स्थान:</translation>
 <translation id="2824715612115726353">गुप्त मोड सक्षम करें</translation>
 <translation id="2838830882081735096">डेटा माइग्रेशन और ARC की अनुमति न दें</translation>
+<translation id="2839294585867804686">नेटवर्क फ़ाइल शेयर की सेटिंग</translation>
 <translation id="2840269525054388612">उन प्रिंटर के बारे में बताती है जिनका इस्तेमाल कोई उपयोगकर्ता कर सकता है.
 
       इस नीति का इस्तेमाल तभी किया जाता है जब <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> के लिए <ph name="PRINTERS_WHITELIST" /> को चुना गया हो
@@ -1181,6 +1193,7 @@
       अगर इस नीति को सेट किए बिना छोड़ दिया जाता है, तो 'यूआरएल-की' के साथ पहचान ज़ाहिर न करने वाले डेटा संग्रह की सेटिंग चालू कर दी जाएगी लेकिन उपयोगकर्ता इसे बदल सकेगा.</translation>
 <translation id="4250680216510889253">नहीं</translation>
 <translation id="4261820385751181068">डिवाइस प्रवेश स्क्रीन भाषा</translation>
+<translation id="4264607809747169568">ChromeOS की उपलब्धता के लिए नेटवर्क फ़ाइल शेयर को नियंत्रित करती है</translation>
 <translation id="427220754384423013">उन प्रिंटर के बारे में बताती है जिनका इस्तेमाल कोई उपयोगकर्ता कर सकता है.
       इस नीति का इस्तेमाल तभी किया जाता है जब <ph name="BULK_PRINTERS_ACCESS_MODE" /> के लिए <ph name="PRINTERS_WHITELIST" /> को चुना गया हो.
 
@@ -1361,7 +1374,7 @@
       अगर इस सेटिंग को गलत पर सेट किया जाता है, तो सुझावों को न तो फ़ेच किया जाएगा, न ही उन्हें दिखाया जाएगा.</translation>
 <translation id="4788252609789586009">यह नीति, <ph name="PRODUCT_NAME" /> की 'अपने आप भरने की सुविधा (ऑटो फ़िल)' चालू करती है. इसके ज़रिए उपयोगकर्ताओं को क्रेडिट कार्ड से जुड़ी जानकारी जैसी पहले से संग्रहित जानकारी की मदद से वेब फ़ॉर्म अपने आप भरने की सुविधा मिलती है.
 
-      अगर यह सेटिंग बंद होती है, तो 'अपने आप भरने की सुविधा' कभी कोई सुझाव नहीं देगी या क्रेडिट कार्ड की जानकारी अपने आप नहीं भरेगी. साथ ही यह, क्रेडिट कार्ड की उस और भी जानकारी को सेव नहीं करेगी जिसे उपयोगकर्ता ने शायद वेब ब्राउज़ करते समय सबमिट किया हो.
+      अगर यह सेटिंग बंद होती है, तो 'अपने आप भरने की सुविधा' कभी कोई सुझाव नहीं देगी या क्रेडिट कार्ड की जानकारी अपने आप नहीं भरेगी. साथ ही यह, क्रेडिट कार्ड की ऐसी कोई भी दूसरी जानकारी जानकारी सेव नहीं करेगी जिसे उपयोगकर्ता ने शायद वेब ब्राउज़ करते समय सबमिट किया हो.
 
       अगर यह सेटिंग चालू होती है या कोई मान नहीं दिया जाता है, तो उपयोगकर्ता यूज़र इंटरफ़ेस (यूआई) में क्रेडिट कार्ड के लिए 'अपने आप भरने की सुविधा' को नियंत्रित कर पाएगा.</translation>
 <translation id="4791031774429044540">'बड़े कर्सर की सुलभता सुविधा' चालू करें.
@@ -1506,9 +1519,9 @@
       यदि यह नीति सेट नहीं की जाती या गलत पर सेट की जाती है, तो डेवलपर मोड डिवाइस के लिए उपलब्ध रहेगा.</translation>
 <translation id="520403427390290017">'टैब लाइफ़ साइकल' सुविधा सीपीयू (CPU) पर और आखिरकार चल रहे टैब से जुड़ी ऐसी मेमोरी वापस ले लेती है जो काफ़ी समय से इस्तेमाल नहीं की गई है. इसके लिए वह सबसे पहले उन टैब को धीमा करती है, फिर उन्हें फ़्रीज़ करती है और आखिर में उन्हें निकाल देती है.
 
-      अगर नीति को गलत पर सेट किया जाता है, तो 'टैब लाइफ़ साइकल' सुविधा बंद होती है और सभी टैब सामान्य रूप से चलते रहेंगे.
+      अगर नीति को गलत पर सेट किया जाता है, तो 'टैब लाइफ़ साइकल' सुविधा बंद हो जाती है और सभी टैब सामान्य रूप से चलते रहेंगे.
 
-      अगर नीति सही पर सेट की जाती है या तय किए बिना छोड़ दी जाती है, तो 'टैब लाइफ़ साइकल' सुविधा चालू होती है.</translation>
+      अगर नीति सही पर सेट की जाती है या तय किए बिना छोड़ दी जाती है, तो 'टैब लाइफ़ साइकल' सुविधा चालू हो जाती है.</translation>
 <translation id="5208240613060747912">यह नीति आपको उन 'यूआरएल पैटर्न' की सूची सेट करने देती है जो ऐसी साइटें बताते हैं जिनमें सूचनाएं दिखाने की अनुमति है.
 
           अगर यह नीति सेट नहीं की जाती है तो, सभी साइटों के लिए 'ग्लोबल डिफ़ॉल्ट मान' का उपयोग किया जाएगा. यह मान, 'DefaultPluginsSetting' नीति सेट होने पर उससे लिया जाएगा वरना उपयोगकर्ता के निजी कॉन्फ़िगरेशन से लिया जाएगा.</translation>
@@ -1614,6 +1627,15 @@
       नीति का मान मिलीसेकंड में बताया जाना चाहिए.</translation>
 <translation id="5511702823008968136">बुकमार्क बार सक्षम करें</translation>
 <translation id="5512418063782665071">होम पेज URL</translation>
+<translation id="551639594034811656">यह नीति ऐसे प्रतिशतों की सूची तय करती है जिनसे OU में अपडेट मिलने के पहले दिन से, हर दिन अपडेट होने वाले <ph name="PRODUCT_OS_NAME" /> डिवाइसों का हिस्सा तय होगा. अपडेट मिलने का समय अपडेट प्रकाशित होने के समय के बाद का होगा, क्योंकि डिवाइस पर अपडेट के लिए देखे जाने से पहले अपडेट को प्रकाशित हुए कुछ समय बीत चुका होगा.
+
+      हर (दिन, प्रतिशत) की जोड़ी में समूह का वह प्रतिशत शामिल होगा जिसे अपडेट मिलने के बाद बताए गए दिनों में अपडेट किया जाना है. उदाहरण के लिए, अगर हमारे पास [(4, 40), (10, 70), (15, 100)] की जोड़ियां हैं, तो फिर समूह के 40% डिवाइस अपडेट दिखाई देने के 4 दिनों के बाद अपडेट किए जाने चाहिए. 70% डिवाइस 10 दिनों के बाद अपडेट किए जाने चाहिए और उसके बाद यह इसी तरीके से आगे बढ़ता जाएगा.
+
+      अगर इस नीति के लिए कोई मान तय किया गया हो, तो अपडेट <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> नीति को अनदेखा करेंगे और उसके बजाय इस नीति के मुताबिक होंगे.
+
+      अगर यह सूची खाली हो, तो स्टेजिंग की कोई प्रक्रिया नहीं होगी और अपडेट दूसरी डिवाइस नीतियों के मुताबिक लागू किए जाएंगे.
+
+      यह नीति चैनल स्विच के लिए लागू नहीं होती.</translation>
 <translation id="5523812257194833591">देरी के बाद अपने अाप लॉग इन के लिए कोई सार्वजनिक सत्र.
 
       अगर यह नीति सेट होती है तो, साइन इन स्क्रीन पर कोई समय सीमा खत्म हो जाने के बाद बताया गया सत्र, उपयोगकर्ता के इंटरैक्शन के बिना ही अपने आप लॉग इन हो जाएगा. सार्वजनिक सत्र पहले से कॉन्फ़िगर होना चाहिए (|DeviceLocalAccounts| देखें).
@@ -1932,6 +1954,7 @@
 <translation id="6440051664870270040">साइटों को एक ही समय में नेविगेट करने और पॉप-अप खोलने देती है</translation>
 <translation id="6447948611083700881">बैकअप और बहाली बंद है</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> के लिए हर हाल में साइन इन करने की शर्त चालू करती है</translation>
+<translation id="6464074037294098618">पतों के लिए 'अपने आप भरने की सुविधा (ऑटो फ़िल)' चालू करें</translation>
 <translation id="6473623140202114570">उन डोमेन की सूची कॉन्फ़िगर करें जिन पर सुरक्षित ब्राउज़िंग चेतावनियां ट्रिगर नहीं करेगी.</translation>
 <translation id="6491139795995924304">डिवाइस पर ब्लूटूथ की अनुमति दें</translation>
 <translation id="6520802717075138474">पहली बार चलाने पर डिफ़ॉल्‍ट ब्राउज़र से खोज इंजन आयात करें</translation>
@@ -2554,6 +2577,11 @@
       अगर नीति बंद हो, तो साफ़ तौर पर कोई साइट आइसोलेशन नहीं किया जाएगा, साथ ही IsolateOrigins और SitePerProcess के फ़ील्ड परीक्षण बंद कर दिए जाएंगे. उपयोगकर्ता अभी भी SitePerProcess को मैन्युअल रूप से चालू कर पाएंगे.
       अगर नीति कॉन्फ़िगर नहीं की जाती है, तो उपयोगकर्ता इस सेटिंग को बदल सकेगा.
       </translation>
+<translation id="7902255855035461275">इस सूची के पैटर्न का मिलान अनुरोध करने वाले यूआरएल के सुरक्षा
+      मूल से किया जाता है. अगर मिलान हो जाता है, तो वीडियो
+      डिवाइस सूचना दिए बिना ही दे दिए जाएंगे.
+
+      नोट: वर्शन 45 तक, यह नीति सिर्फ़ किओस्क मोड में ही काम करती थी.</translation>
 <translation id="7912255076272890813">अनुमत ऐप्स /एक्सटेंशन प्रकारों को कॉन्फ़िगर करें</translation>
 <translation id="7915236031252389808">आप यहां प्रॉक्‍सी .pac फ़ाइल का कोई यूआरएल तय कर सकते हैं.
 
diff --git a/components/policy/resources/policy_templates_hr.xtb b/components/policy/resources/policy_templates_hr.xtb
index 56f7074..d8f0b10 100644
--- a/components/policy/resources/policy_templates_hr.xtb
+++ b/components/policy/resources/policy_templates_hr.xtb
@@ -513,6 +513,11 @@
       Ako se ta postavka ne postavi, korisnici mogu upotrebljavati tu funkciju prema želji.
 
       Ta je postavka uklonjena iz verzije <ph name="PRODUCT_NAME" /> 29 i novijih verzija.</translation>
+<translation id="2433412232489478893">To pravilo određuje je li korisniku dopuštena značajka mrežnog dijeljenja datoteka za <ph name="PRODUCT_NAME" />.
+
+      Ako se pravilo ne konfigurira ili se postavi na True, korisnici će moći upotrebljavati mrežno dijeljenje datoteka.
+
+      Ako se pravilo postavi na False, korisnici neće moći upotrebljavati mrežno dijeljenje datoteka.</translation>
 <translation id="2438609638493026652">Omogućuje izvještavanje o ključnim događajima tijekom instalacije Android aplikacije na Googleu. Događaji se bilježe samo za aplikacije čija je instalacija pokrenuta putem pravila.
 
       Ako je pravilo postavljeno na "true", događaji će biti zabilježeni.
@@ -590,6 +595,7 @@
 <translation id="2598508021807251719">Konfigurira jezike na kojima se <ph name="PRODUCT_OS_NAME" /> može prikazivati.
 
       Ako se to pravilo postavi, korisnik može konfigurirati da se <ph name="PRODUCT_OS_NAME" /> prikazuje samo na jednom od jezika navedenih ovim pravilom. Ako se to pravilo ne postavi ili se postavi na prazan popis, moguće je prikazivati <ph name="PRODUCT_OS_NAME" /> na svim podržanim jezicima korisničkog sučelja. Ako se to pravilo postavi na popis s nevažećim vrijednostima, sve će se nevažeće vrijednosti zanemariti. Ako je korisnik prethodno konfigurirao da se <ph name="PRODUCT_OS_NAME" /> prikazuje na jeziku koji nije dopušten ovim pravilom, jezik prikaza prebacit će se na dopušteni jezik korisničkog sučelja sljedeći put kada se korisnik prijavi. Ako je korisnik konfigurirao preferirane jezike i jedan od njih dopušten je ovim pravilom, <ph name="PRODUCT_OS_NAME" /> prelazi na taj jezik. U suprotnom, <ph name="PRODUCT_OS_NAME" /> prelazi na prvu važeću vrijednost navedenu tim pravilom ili na zamjenski jezik (trenutačno en-US), ako pravilo sadrži samo nevažeće unose.</translation>
+<translation id="2604182581880595781">Konfiguriranje pravila povezanih s mrežnim dijeljenjem datoteka.</translation>
 <translation id="2623014935069176671">Pričekaj početnu aktivnost korisnika</translation>
 <translation id="262740370354162807">Omogući slanje dokumenata na uslugu <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Pruža konfiguracije za pisače tvrtki.
@@ -669,6 +675,7 @@
 <translation id="2823870601012066791">Lokacija Windows registra za <ph name="PRODUCT_OS_NAME" /> klijente:</translation>
 <translation id="2824715612115726353">Omogući anonimni način</translation>
 <translation id="2838830882081735096">Onemogući premještanje podataka i ARC</translation>
+<translation id="2839294585867804686">Postavke mrežnog dijeljenja datoteka</translation>
 <translation id="2840269525054388612">Određuje pisače koje korisnik može upotrebljavati.
 
       To se pravilo upotrebljava samo ako je pravilo <ph name="PRINTERS_WHITELIST" /> odabrano za <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1147,6 +1154,7 @@
       Ako se to pravilo ne postavi, prikupljanje anonimiziranih podataka zaključano URL-om bit će omogućeno, no korisnik će to moći promijeniti.</translation>
 <translation id="4250680216510889253">Ne</translation>
 <translation id="4261820385751181068">Oznaka zemlje/jezika za zaslon za prijavu na uređaju</translation>
+<translation id="4264607809747169568">Određuje dostupnost mrežnog dijeljenja datoteka za OS Chrome</translation>
 <translation id="427220754384423013">Određuje pisače koje korisnik može upotrebljavati.
 
       To se pravilo upotrebljava samo ako je pravilo <ph name="PRINTERS_WHITELIST" /> odabrano za <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1554,6 +1562,15 @@
       Vrijednost pravila treba odrediti u milisekundama.</translation>
 <translation id="5511702823008968136">Omogući traku Knjižne oznake</translation>
 <translation id="5512418063782665071">URL početne stranice</translation>
+<translation id="551639594034811656">Pravilom se definira popis postotaka kojim će se definirati udio <ph name="PRODUCT_OS_NAME" /> uređaja u organizacijskoj jedinici za dnevno ažuriranje počevši od dana otkrivanja ažuriranja. Vrijeme otkrivanja kasnije je od vremena objavljivanja ažuriranja jer nakon objavljivanja ažuriranja može proći neko vrijeme dok uređaj ne potraži ažuriranja.
+
+      Svaki par (dan, postotak) sadrži postotak flote koji se treba ažurirati za određeni broj dana od vremena otkrivanja ažuriranja. Na primjer, ako su parovi [(4, 40), (10, 70), (15, 100)], to znači da se 40% flote treba ažurirati u roku od četiri dana od otkrivanja ažuriranja, 70% treba se ažurirati u roku od 10 dana i tako dalje.
+
+      Ako se za ovo pravilo definira vrijednost, ažuriranja će zanemariti pravilo <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> i slijediti ovo pravilo.
+
+      Ako je popis prazan, neće biti postupnog uvođenja i ažuriranja će se primijeniti prema drugim pravilima za uređaje.
+
+      Pravilo se ne primjenjuje na prebacivanje kanala.</translation>
 <translation id="5523812257194833591">Automatska prijava u javnu sesiju nakon odgode.
 
       Ako je ovo pravilo postavljeno, automatski će se prijavljivati u navedenu sesiju nakon isteka vremenskog razdoblja bez interakcije korisnika na zaslonu za prijavu. Javna sesija mora biti već konfigurirana (pogledajte |DeviceLocalAccounts|).
@@ -2440,6 +2457,11 @@
       Ako se to pravilo onemogući, neće doći do eksplicitne izolacije web-lokacija i onemogućit će se radne verzije pravila IsolateOrigins i SitePerProcess. Korisnici će i dalje moći ručno omogućiti SitePerProcess.
       Ako se to pravilo ne konfigurira, korisnik će moći promijeniti tu postavku.
       </translation>
+<translation id="7902255855035461275">Uzorci na tom popisu usporedit će se sa sigurnosnim izvorištem
+      URL-a koji šalje zahtjev. Ako se pronađe podudaranje, pristup uređajima
+      za snimanje videozapisa dopuštat će se bez upita.
+
+      NAPOMENA: do verzije 45 to je pravilo bilo podržano samo u načinu kioska.</translation>
 <translation id="7912255076272890813">Konfiguriraj dopuštene vrste aplikacija/proširenja</translation>
 <translation id="7915236031252389808">Ovdje možete navesti URL za .pac datoteku proxy poslužitelja.
 
diff --git a/components/policy/resources/policy_templates_hu.xtb b/components/policy/resources/policy_templates_hu.xtb
index e7aae3a..27a50b3c 100644
--- a/components/policy/resources/policy_templates_hu.xtb
+++ b/components/policy/resources/policy_templates_hu.xtb
@@ -294,6 +294,11 @@
       Ha egy beállítás nincs megadva, akkor az alapértelmezett érték használandó.
 
       Ha ez a házirend nincs beállítva, az összes beállítás az alapértelmezett értéket használja.</translation>
+<translation id="1958138414749279167">Engedélyezi a(z) <ph name="PRODUCT_NAME" /> Automatikus kitöltés funkcióját, és lehetővé teszi a felhasználók számára az internetes űrlapok automatikus kitöltését korábban tárolt címadatokkal.
+
+      Ha le van tiltva ez a beállítás, az Automatikus kitöltés funkció nem ajánlja fel és nem végzi el a címadatok kitöltését, illetve nem ment további címadatokat, amelyeket a felhasználó az interneten való böngészés közben ad meg.
+
+      Ha engedélyezve van ez a beállítás, vagy nincs értéke, a felhasználó vezérelheti az Automatikus kitöltés funkció címekkel kapcsolatos használatát a kezelőfelületen.</translation>
 <translation id="1960840544413786116">A helyi bizalmi horgonyok által nyújtott, de a subjectAlternativeName bővítménnyel nem rendelkező tanúsítványok engedélyezése</translation>
 <translation id="1964634611280150550">Inkognitómód letiltva</translation>
 <translation id="1964802606569741174">A házirend nincs hatással az androidos YouTube alkalmazásra. Ha a YouTube-on kényszeríteni kell a Biztonságos módot, akkor az androidos YouTube alkalmazás telepítését nem szabad megengedni.</translation>
@@ -506,6 +511,11 @@
       Ha nem állítja be, akkor a felhasználók dönthetik el, hogy használják-e ezt a funkciót, vagy sem.
 
       Ez a beállítás a <ph name="PRODUCT_NAME" /> 29-es és újabb verzióiban már nem szerepel.</translation>
+<translation id="2433412232489478893">Ez a házirend azt szabályozza, hogy a(z) <ph name="PRODUCT_NAME" /> termékhez tartozó Hálózati fájlmegosztások funkció engedélyezett-e az adott felhasználó esetében.
+
+      Ha ez a házirend nincs konfigurálva, vagy Igaz értékre van állítva, akkor a felhasználók használni tudják majd a Hálózati fájlmegosztások funkciót.
+
+      Ha ez a házirend Hamis értékre van állítva, akkor a felhasználók nem tudják majd használni a Hálózati fájlmegosztások funkciót.</translation>
 <translation id="2438609638493026652">Lehetővé teszi a fő események jelentését a Google-nak az Android-alkalmazások telepítésekor. Az eseményeket csak az olyan alkalmazásokra vonatkozóan rögzíti a rendszer, amelyek telepítése a házirenden keresztül aktiválódott.
 
       Ha a házirend értéke igaz, a rendszer naplózza az eseményeket.
@@ -583,6 +593,7 @@
 <translation id="2598508021807251719">Konfigurálja a nyelveket, amelyeken a <ph name="PRODUCT_OS_NAME" /> megjeleníthető.
 
       Ha beállítja a házirendet, a felhasználó kizárólag a házirend által megadott nyelvek egyikén használhatja a <ph name="PRODUCT_OS_NAME" /> rendszert. Ha a házirend nincs beállítva, vagy ha üres listára van állítva, akkor a <ph name="PRODUCT_OS_NAME" /> a kezelőfelület összes támogatott nyelvén megjeleníthető. Ha a házirend érvénytelen értékeket tartalmazó listára van állítva, a böngésző figyelmen kívül hagyja az összes érvénytelen értéket. Ha a felhasználó korábban olyan nyelvre állította be a <ph name="PRODUCT_OS_NAME" /> rendszert, amelyet a házirend nem engedélyez, akkor a megjelenítési nyelv a kezelőfelület valamelyik engedélyezett nyelvére változik a felhasználó következő bejelentkezésekor. Ha a felhasználó megadott előnyben részesített nyelveket, és ezen előnyben részesített nyelvek egyikét engedélyezi a házirend, akkor a <ph name="PRODUCT_OS_NAME" /> arra a nyelvre vált. Máskülönben a <ph name="PRODUCT_OS_NAME" /> a házirend által megadott első érvényes értékre, illetve – amennyiben a házirend csak érvénytelen bejegyzéseket tartalmaz – a tartalék nyelvi beállításra (jelenleg en-US) vált.</translation>
+<translation id="2604182581880595781">A Hálózati fájlmegosztásokra vonatkozó házirendek konfigurálása.</translation>
 <translation id="2623014935069176671">Várakozás a kezdeti felhasználói tevékenységre</translation>
 <translation id="262740370354162807">A dokumentumok <ph name="CLOUD_PRINT_NAME" /> szolgáltatás részére való benyújtásának engedélyezése</translation>
 <translation id="2627554163382448569">Vállalati nyomtatókhoz biztosít beállításokat.
@@ -662,6 +673,7 @@
 <translation id="2823870601012066791">A Windows beállításjegyzékének helye <ph name="PRODUCT_OS_NAME" />-ügyfelek esetében:</translation>
 <translation id="2824715612115726353">Inkognitómód engedélyezése</translation>
 <translation id="2838830882081735096">Adatmigráció és ARC letiltása</translation>
+<translation id="2839294585867804686">A Hálózati fájlmegosztásokhoz tartozó beállítások</translation>
 <translation id="2840269525054388612">Meghatározza, hogy mely nyomtatókat használhatja a felhasználó.
 
       A házirend csak akkor van használatban, ha a(z) <ph name="PRINTERS_WHITELIST" /> lehetőség van kiválasztva a(z) <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> házirendnél.
@@ -1138,6 +1150,7 @@
       Ha a házirend beállítatlanul marad, az URL-alapú anonimizált adatgyűjtés aktív lesz, de a felhasználó kikapcsolhatja.</translation>
 <translation id="4250680216510889253">Nem</translation>
 <translation id="4261820385751181068">Az eszköz bejelentkezési képernyőjének nyelv- és országkódja</translation>
+<translation id="4264607809747169568">A ChromeOS rendelkezésre állására vonatkozó hálózati fájlmegosztásokat szabályozza</translation>
 <translation id="427220754384423013">Meghatározza, hogy mely nyomtatókat használhatja a felhasználó.
 
       A házirend csak akkor van használatban, ha a(z) <ph name="PRINTERS_WHITELIST" /> lehetőség van kiválasztva a(z) <ph name="BULK_PRINTERS_ACCESS_MODE" /> házirendnél.
@@ -1539,6 +1552,15 @@
        A házirend értékét ezredmásodpercben kell megadni.</translation>
 <translation id="5511702823008968136">Könyvjelzősáv engedélyezése</translation>
 <translation id="5512418063782665071">Kezdőoldal URL-je</translation>
+<translation id="551639594034811656">Ez a házirend megadja azon százalékok listáját, amelyek meghatározzák, hogy a szervezeti egység (SZE) <ph name="PRODUCT_OS_NAME" />-eszközeinek mekkora része frissül naponta a frissítés első észlelésétől kezdődően. Az észlelés ideje későbbi, mint a frissítés közzététele, mivel a közzététel után eltarthat bizonyos ideig, mire az eszköz frissítéseket keres.
+
+      Minden pár (nap, százalék) tartalmazza, hogy a flotta hány százalékának kellene frissülni azon adott napok számával, amióta a frissítést észlelték. Ha például vesszük a [(4, 40), (10, 70), (15, 100)] párokat, akkor a flotta 40%-ának kellene frissülnie négy nappal a frissítés észlelése után, 70%-ának kellene frissülnie 10 nap után és így tovább.
+
+      Ha meg van adva a házirend értéke, a frissítések figyelmen kívül hagyják a(z) <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> házirendet, és helyette ezt a házirendet követik.
+
+      Ha a lista üres, nem lesz fokozatos frissítés, hanem a többi eszközházirendnek megfelelően telepíti a rendszer a frissítéseket.
+
+      A házirend nem vonatkozik a csatornaváltásokra.</translation>
 <translation id="5523812257194833591">Nyilvános munkamenet, amely bizonyos késleltetés után automatikusan bejelentkezik.
 
       Ha a házirend be van állítva, a meghatározott munkamenetet a rendszer automatikusan bejelentkezteti, ha felhasználói interakció nélkül telik el a megadott időtartam a bejelentkezési képernyőn. A nyilvános munkamenetet előre be kell állítani (tekintse meg a következőt: |DeviceLocalAccounts|).
@@ -1836,6 +1858,7 @@
 <translation id="6440051664870270040">Annak engedélyezése a webhelyek számára, hogy egyszerre navigáljanak és nyissanak meg előugró ablakokat</translation>
 <translation id="6447948611083700881">Biztonsági mentés és helyreállítás letiltva</translation>
 <translation id="645425387487868471">A kényszerített bejelentkezés engedélyezése a <ph name="PRODUCT_NAME" /> használatához</translation>
+<translation id="6464074037294098618">Automatikus kitöltés engedélyezése címekhez</translation>
 <translation id="6473623140202114570">Azon domainek listájának beállítása, amelyeken nem aktivál figyelmeztetéseket a Biztonságos Böngészés.</translation>
 <translation id="6491139795995924304">Bluetooth engedélyezése az eszközön</translation>
 <translation id="6520802717075138474">Keresőmotorok importálása az alapértelmezett böngészőből az első indításkor</translation>
@@ -2433,6 +2456,11 @@
       Ha letiltja a házirendet, nem történik kifejezett webhely-izoláció, az IsolateOrigins és SitePerProcess házirendek próbaverziói pedig le lesznek tiltva. A felhasználók manuálisan továbbra is engedélyezhetik a SitePerProcess házirendet.
       Ha nem állítja be a házirendet, a felhasználó módosíthatja ezt a beállítást.
       </translation>
+<translation id="7902255855035461275">A listában szereplő mintákat a böngésző egyezteti a kérelmező URL
+      biztonsági eredetével. Egyezés esetén a videorögzítő
+      eszközökhöz való hozzáférést kérdés nélkül engedélyezi.
+
+      MEGJEGYZÉS: A 45-ös verzióig ezt a házirendet csak a kioszk módban történő futtatás esetén támogatta a böngésző.</translation>
 <translation id="7912255076272890813">Engedélyezett alkalmazás-/bővítménytípusok konfigurálása</translation>
 <translation id="7915236031252389808">Itt adhatja meg a proxy .pac fájlok URL-jét.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index 8524b25..713e8fe 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -503,6 +503,11 @@
       Jika setelan ini tidak disetel, pengguna dapat memutuskan untuk menggunakan fungsi ini atau tidak.
 
       Setelan ini telah dibuang dari <ph name="PRODUCT_NAME" /> 29 dan versi yang lebih tinggi.</translation>
+<translation id="2433412232489478893">Kebijakan ini mengontrol apakah fitur Berbagi File Jaringan untuk <ph name="PRODUCT_NAME" /> diizinkan untuk pengguna.
+
+      Jika kebijakan ini tidak dikonfigurasi atau disetel ke True, pengguna dapat menggunakan fitur Berbagi File Jaringan.
+
+      Jika kebijakan ini disetel ke False, pengguna tidak dapat menggunakan fitur Berbagi File Jaringan.</translation>
 <translation id="2438609638493026652">Mengaktifkan pelaporan peristiwa penting selama penginstalan aplikasi Android ke Google. Peristiwa direkam hanya untuk aplikasi yang penginstalannya dipicu melalui kebijakan.
 
       Jika kebijakan disetel ke true, peristiwa akan dicatat dalam log.
@@ -582,6 +587,7 @@
 <translation id="2598508021807251719">Mengonfigurasi lokal yang digunakan untuk menampilkan <ph name="PRODUCT_OS_NAME" />.
 
       Jika kebijakan ini disetel, pengguna hanya dapat mengonfigurasi <ph name="PRODUCT_OS_NAME" /> untuk ditampilkan di salah satu lokal yang ditentukan oleh kebijakan tersebut. Jika kebijakan ini tidak disetel atau disetel ke daftar kosong, <ph name="PRODUCT_OS_NAME" /> dapat ditampilkan di semua lokal yang didukung. Jika kebijakan ini disetel ke daftar yang memuat nilai yang tidak valid, maka semua nilai yang tidak valid akan diabaikan. Jika sebelumnya pengguna telah mengonfigurasi <ph name="PRODUCT_OS_NAME" /> untuk ditampilkan dalam bahasa yang tidak diizinkan oleh kebijakan ini, lokal tampilan akan dialihkan ke lokal yang diizinkan saat berikutnya pengguna login. Jika pengguna telah mengonfigurasi beberapa lokal pilihan, dan salah satu lokal pilihan itu diizinkan oleh kebijakan ini, <ph name="PRODUCT_OS_NAME" /> akan dialihkan ke lokal tersebut. Jika tidak, <ph name="PRODUCT_OS_NAME" /> akan dialihkan ke nilai valid pertama yang ditentukan oleh kebijakan ini, atau ke lokal alternatif yang telah ditentukan (saat ini en-US), jika kebijakan ini hanya memuat entri yang tidak valid.</translation>
+<translation id="2604182581880595781">Mengonfigurasi kebijakan terkait fitur Berbagi File Jaringan.</translation>
 <translation id="2623014935069176671">Tunggu aktivitas pengguna awal</translation>
 <translation id="262740370354162807">Aktifkan penyerahan dokumen ke <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Memberikan konfigurasi untuk printer perusahaan.
@@ -661,6 +667,7 @@
 <translation id="2823870601012066791">Lokasi registry Windows untuk klien <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Aktifkan mode Penyamaran</translation>
 <translation id="2838830882081735096">Jangan izinkan migrasi data dan ARC</translation>
+<translation id="2839294585867804686">Pengaturan Berbagi File Jaringan</translation>
 <translation id="2840269525054388612">Menentukan printer yang dapat digunakan pengguna.
 
       Kebijakan ini hanya digunakan jika <ph name="PRINTERS_WHITELIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1143,6 +1150,7 @@
       Jika kebijakan ini dibiarkan tidak disetel, pengumpulan data anonim yang menyertakan URL akan diaktifkan, namun pengguna dapat mengubahnya.</translation>
 <translation id="4250680216510889253">Tidak</translation>
 <translation id="4261820385751181068">Lokal layar login perangkat</translation>
+<translation id="4264607809747169568">Mengontrol fitur Berbagi File Jaringan untuk ketersediaan Chrome OS</translation>
 <translation id="427220754384423013">Menentukan printer yang dapat digunakan pengguna.
 
       Kebijakan ini hanya digunakan jika <ph name="PRINTERS_WHITELIST" /> dipilih untuk <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1544,6 +1552,15 @@
       Nilai kebijakan sebaiknya ditentukan dalam milidetik.</translation>
 <translation id="5511702823008968136">Aktifkan Bilah Bookmark</translation>
 <translation id="5512418063782665071">URL beranda</translation>
+<translation id="551639594034811656">Kebijakan ini menentukan daftar persentase yang akan menentukan jumlah perangkat <ph name="PRODUCT_OS_NAME" /> di OU untuk diupdate per hari sejak hari pertama update ditemukan. Waktu penemuan lebih lama daripada waktu publikasi update, karena publikasi update mungkin agak lama hingga perangkat memeriksa apakah ada update.
+
+      Tiap pasangan (hari, persentase) berisi persentase fleet mana yang harus diupdate menurut jumlah hari tertentu sejak update ditemukan. Misalnya, jika ada pasangan [(4, 40), (10, 70), (15, 100)], maka 40% fleet harus diupdate 4 hari setelah update ditemukan. 70% harus diupdate setelah 10 hari, dan seterusnya.
+
+      Jika ada nilai yang ditentukan untuk kebijakan ini, update akan mengabaikan kebijakan <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> dan mengikuti kebijakan ini.
+
+      Jika daftar ini kosong, tidak akan ada persiapan dan update akan diterapkan menurut kebijakan perangkat lain.
+
+      Kebijakan ini tidak berlaku untuk peralihan channel.</translation>
 <translation id="5523812257194833591">Sesi publik untuk masuk secara otomatis setelah penundaan.
 
       Jika kebijakan ini disetel, sesi yang ditentukan akan secara otomatis masuk setelah jangka waktu tersebut berlalu pada layar masuk tanpa interaksi pengguna. Sesi publik harus sudah dikonfigurasi (lihat |DeviceLocalAccounts|).
@@ -2438,6 +2455,11 @@
       Jika kebijakan dinonaktifkan, Isolasi Situs eksplisit tidak akan terjadi dan uji coba kolom IsolateOrigins dan SitePerProcess akan dinonaktifkan. Pengguna tetap dapat mengaktifkan SitePerProcess secara manual.
       Jika kebijakan tidak dikonfigurasi, pengguna dapat mengubah setelan ini.
       </translation>
+<translation id="7902255855035461275">Pola dalam daftar ini akan dicocokan dengan asal
+      keamanan URL yang meminta.  Jika ditemukan kecocokan, akses ke perangkat
+      yang merekam audio akan diberikan tanpa permintaan.
+
+      CATATAN: Hingga versi 45, kebijakan ini hanya didukung dalam mode Kios.</translation>
 <translation id="7912255076272890813">Konfigurasikan jenis aplikasi/ekstensi yang diizinkan</translation>
 <translation id="7915236031252389808">Anda dapat menetapkan URL ke file .pac proxy di sini.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 1b1fa20e..3a35de31 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -283,6 +283,11 @@
       Se un'impostazione non viene specificata, viene utilizzato un valore predefinito.
 
       Se questa norma non viene impostata, vengono utilizzati i valori predefiniti per tutte le impostazioni.</translation>
+<translation id="1958138414749279167">Consente di attivare la funzione Compilazione automatica di <ph name="PRODUCT_NAME" /> e permette agli utenti di eseguire il completamento automatico dell'indirizzo nei moduli web utilizzando informazioni memorizzate in precedenza.
+
+      Se questa impostazione è disattivata, la funzione Compilazione automatica non suggerirà o non inserirà mai i dati relativi all'indirizzo, né salverà altre informazioni relative ad altri indirizzi che l'utente potrebbe inviare durante la navigazione sul Web.
+
+      Se questa impostazione è attivata o non è impostata su alcun valore, l'utente potrà gestire la funzione Compilazione automatica per gli indirizzi nell'interfaccia utente.</translation>
 <translation id="1960840544413786116">Consente di stabilire se consentire i certificati privi dell'estensione subjectAlternativeName emessi dai trust anchor locali</translation>
 <translation id="1964634611280150550">Modalità di navigazione in incognito non attiva</translation>
 <translation id="1964802606569741174">Questa norma non ha effetto sull'app YouTube per Android. Se è necessario applicare la modalità di protezione di YouTube, l'installazione dell'app YouTube per Android non deve essere consentita.</translation>
@@ -489,6 +494,11 @@
       Se l'impostazione non viene impostata, l'utente può decidere se utilizzare o meno la funzione.
 
       L'impostazione è stata rimossa da <ph name="PRODUCT_NAME" /> 29 e versioni successive.</translation>
+<translation id="2433412232489478893">Questa norma controlla se per un utente è consentita o meno la funzione Condivisioni file di rete per <ph name="PRODUCT_NAME" />.
+
+      Quando questa norma non è configurata o è impostata su True, gli utenti possono utilizzare la funzione Condivisioni file di rete.
+
+      Quando questa norma è impostata su False, gli utenti non possono utilizzare la funzione Network File Shares.</translation>
 <translation id="2438609638493026652">Attiva la segnalazione di eventi chiave durante l'installazione di app Android a Google. Gli eventi vengono acquisiti solo per le app la cui installazione è stata lanciata tramite norma.
 
       Se la norma viene impostata su True, gli eventi saranno registrati.
@@ -566,6 +576,7 @@
 <translation id="2598508021807251719">Questa norma consente di configurare le impostazioni internazionali che possono essere visualizzate in <ph name="PRODUCT_OS_NAME" />.
 
       Se questa norma viene impostata, l'utente potrà configurare soltanto una delle impostazioni internazionali di <ph name="PRODUCT_OS_NAME" /> specificate da questa norma. Se la norma non viene impostata o viene impostato un elenco vuoto, <ph name="PRODUCT_OS_NAME" /> potrà essere visualizzato in tutte le impostazioni internazionali dell'interfaccia utente supportate. Se per questa norma viene impostato un elenco contenente valori non validi, tutti i valori non validi verranno ignorati. Se un utente aveva precedentemente configurato un'impostazione internazionale di <ph name="PRODUCT_OS_NAME" /> non consentita da questa norma, all'accesso successivo l'impostazione internazionale visualizzata verrà sostituita con una impostazione internazionale dell'interfaccia utente consentita. Se l'utente aveva configurato delle impostazioni internazionali preferite e una di queste è consentita da questa norma, in <ph name="PRODUCT_OS_NAME" /> verrà usata tale impostazione internazionale. In caso contrario, in <ph name="PRODUCT_OS_NAME" /> verrà usato il primo valore valido specificato da questa norma oppure, se la norma contiene soltanto voci non valide, verrà usata un'impostazione internazionale di riserva (attualmente en-US).</translation>
+<translation id="2604182581880595781">Configura le norme relative alla funzione Condivisioni file di rete</translation>
 <translation id="2623014935069176671">Attesa dell'attività iniziale dell'utente</translation>
 <translation id="262740370354162807">Attiva l'invio di documenti a <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Consente di specificare le configurazioni delle stampanti aziendali.
@@ -645,6 +656,7 @@
 <translation id="2823870601012066791">Posizione del Registro di sistema di Windows per client <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Attiva modalità di navigazione in incognito</translation>
 <translation id="2838830882081735096">Non consentire migrazione dei dati e ARC</translation>
+<translation id="2839294585867804686">Impostazioni di Condivisioni file di rete</translation>
 <translation id="2840269525054388612">Consente di specificare le stampanti utilizzabili dagli utenti.
 
       Questa norma viene usata soltanto se viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" /> per la norma <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1118,6 +1130,7 @@
       Se questa norma non viene impostata, la raccolta di dati anonimizzati con chiave URL verrà attivata, ma l'utente potrà modificare l'impostazione.</translation>
 <translation id="4250680216510889253">No</translation>
 <translation id="4261820385751181068">Lingua della schermata di accesso del dispositivo</translation>
+<translation id="4264607809747169568">Consente di controllare la disponibilità della funzione Condivisioni file di rete per Chrome OS</translation>
 <translation id="427220754384423013">Consente di specificare le stampanti utilizzabili dagli utenti.
 
       Questa norma viene usata soltanto se viene selezionata l'opzione <ph name="PRINTERS_WHITELIST" /> per la norma <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1510,6 +1523,15 @@
       Il valore della norma deve essere specificato in millisecondi.</translation>
 <translation id="5511702823008968136">Attiva barra dei Preferiti</translation>
 <translation id="5512418063782665071">URL pagina iniziale</translation>
+<translation id="551639594034811656">Questa norma definisce un elenco di percentuali che definiranno la frazione dei dispositivi di <ph name="PRODUCT_OS_NAME" /> nell'UO da aggiornare ogni giorno a partire dal giorno in cui l'aggiornamento viene rilevato la prima volta. L'ora del rilevamento è successiva all'ora in cui l'aggiornamento viene pubblicato, perché potrebbe passare del tempo tra la pubblicazione dell'aggiornamento e il momento in cui il dispositivo controlla la disponibilità di aggiornamenti.
+
+      Ogni coppia (giorno, percentuale) contiene la percentuale dei gruppi da aggiornare entro il numero di giorni stabilito a partire dal giorno in cui l'aggiornamento viene rilevato. Ad esempio, se abbiamo le coppie [(4, 40), (10, 70), (15, 100)], allora il 40% dei gruppi deve essere aggiornato entro 4 giorni dal rilevamento dell'aggiornamento; il 70% deve essere aggiornato dopo 10 giorni e così via.
+
+      Se viene definito un valore per questa norma, gli aggiornamenti ignoreranno la norma <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguiranno invece questa norma.
+
+      Se quest'elenco è vuoto, non viene eseguita alcuna gestione temporanea e gli aggiornamenti vengono applicati in base alle altre norme del dispositivo.
+
+      Questa norma non viene applicata agli switch del canale.</translation>
 <translation id="5523812257194833591">Una sessione pubblica a cui accedere automaticamente dopo un ritardo.
 
       Se questa norma è impostata, verrà eseguito l'accesso automatico alla sessione specificata dopo che è trascorso un periodo di tempo senza interazioni dell'utente nella schermata di accesso. La sessione pubblica deve essere già configurata (vedi |DeviceLocalAccounts|).
@@ -1801,6 +1823,7 @@
 <translation id="6440051664870270040">Consenti ai siti di navigare e aprire popup contemporaneamente</translation>
 <translation id="6447948611083700881">Backup e ripristino disabilitati</translation>
 <translation id="645425387487868471">Attiva l'accesso forzato per <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Attiva la Compilazione automatica per gli indirizzi</translation>
 <translation id="6473623140202114570">Configura l'elenco di domini sui quali Navigazione sicura non attiverà avvisi.</translation>
 <translation id="6491139795995924304">Consenti Bluetooth sul dispositivo</translation>
 <translation id="6520802717075138474">Importa motori di ricerca dal browser predefinito alla prima esecuzione</translation>
@@ -2389,6 +2412,11 @@
       Se la norma è disattivata, non avverrà alcun isolamento esplicito dei siti e le prove sul campo di IsolateOrigins e SitePerProcess saranno disattivate. Gli utenti potranno ancora attivare SitePerProcess manualmente.
       Se la norma non viene configurata, l'utente potrà modificare questa impostazione.
       </translation>
+<translation id="7902255855035461275">I pattern di questo elenco verranno confrontati con
+      l'origine di sicurezza dell'URL richiedente. Se viene trovata una corrispondenza, l'accesso ai dispositivi
+      di acquisizione video verrà concesso senza richieste.
+
+      NOTA: fino alla versione 45, questa norma era supportata soltanto in modalità kiosk.</translation>
 <translation id="7912255076272890813">Configura tipi di app/estensioni consentiti</translation>
 <translation id="7915236031252389808">Qui puoi specificare un URL che rimanda a un file proxy .pac.
 
diff --git a/components/policy/resources/policy_templates_iw.xtb b/components/policy/resources/policy_templates_iw.xtb
index f2616a9..2b828bc 100644
--- a/components/policy/resources/policy_templates_iw.xtb
+++ b/components/policy/resources/policy_templates_iw.xtb
@@ -290,6 +290,11 @@
       אם לא נקבע ערך להגדרה כלשהי, ייעשה שימוש בערך ברירת המחדל.
 
       אם המדיניות הזו לא מוגדרת, ייעשה שימוש בברירות המחדל עבור כל ההגדרות.</translation>
+<translation id="1958138414749279167">המדיניות מפעילה את תכונת המילוי האוטומטי של <ph name="PRODUCT_NAME" /> ומאפשרת למשתמשים להשלים באופן אוטומטי פרטי כתובת בטפסים באינטרנט, באמצעות מידע שאוחסן בעבר.
+
+      אם ההגדרה הזו מושבתת, לא מוצגות הצעות למלא באופן אוטומטי פרטי כתובת, והמילוי אינו נעשה באופן אוטומטי. כמו כן, לא יישמרו פרטי כתובת נוספים שהמשתמש יזין בזמן גלישה באינטרנט.
+
+      אם ההגדרה הזו מופעלת או אם לא נקבע הערך שלה, המשתמש יוכל לקבוע דרך ממשק המשתמש את ההגדרות של תכונת המילוי האוטומטי לכתובות.</translation>
 <translation id="1960840544413786116">‏האם להתיר אישורים שהונפקו באמצעות עוגני אמון מקומיים שחסר בהם התוסף subjectAlternativeName</translation>
 <translation id="1964634611280150550">מצב גלישה בסתר מושבת.</translation>
 <translation id="1964802606569741174">‏למדיניות הזו אין השפעה על האפליקציה של YouTube ל-Android. אם יש לאכוף מצב בטיחות ב-YouTube, יש לאסור את התקנת האפליקציה של YouTube ל-Android.</translation>
@@ -500,6 +505,11 @@
       אם לא תקבע הגדרה זו כלל, המשתמש יוכל להחליט אם להשתמש בפונקציה זו.
 
       הגדרה זו הוסרה מגרסה 29 של <ph name="PRODUCT_NAME" /> ומגרסאות מתקדמות יותר.</translation>
+<translation id="2433412232489478893">‏המדיניות הזו קובעת אם התכונה 'התקן רשת לשיתוף קבצים' של <ph name="PRODUCT_NAME" /> זמינה למשתמש.
+
+      אם המדיניות לא מוגדרת או אם הגדירו אותה לערך True, המשתמשים יכולים להשתמש בתכונה 'התקן רשת לשיתוף קבצים'.
+
+      אם הגדירו את המדיניות לערך False, משתמשים לא יכולים להשתמש בתכונה 'התקן רשת לשיתוף קבצים'.</translation>
 <translation id="2438609638493026652">‏מאפשרת לדווח ל-Google על אירועי מפתח במהלך התקנה של אפליקציות Android. האירועים נרשמים רק בשביל אפליקציות שההתקנה שלהן הופעלה באמצעות מדיניות.
 
       אם המדיניות מוגדרת כ-true, האירועים יירשמו ביומן.
@@ -577,6 +587,7 @@
 <translation id="2598508021807251719">‏מגדירה את שילובי השפה והאזור שבהם אפשר להציג את <ph name="PRODUCT_OS_NAME" />.
 
       אם המדיניות הזו מוגדרת, המשתמש יכול להציג את <ph name="PRODUCT_OS_NAME" /> רק באחד משילובי השפה והאזור שצוינו במדיניות הזו. אם המדיניות הזו לא מוגדרת או אם היא מוגדרת בעזרת רשימה ריקה, אפשר להציג את <ph name="PRODUCT_OS_NAME" /> בכל השילובים הנתמכים של שפה ואזור. אם המדיניות הזו מוגדרת בעזרת רשימה שמכילה ערכים לא חוקיים, המערכת תתעלם מהערכים הלא חוקיים. אם משתמש הגדיר בעבר ש-<ph name="PRODUCT_OS_NAME" /> יוצג בשילוב שפה ואזור שאינו מורשה במדיניות הזו, בפעם הבאה שהמשתמש ייכנס לחשבון, שילוב השפה והאזור בממשק המשתמש ישתנה לשילוב מורשה. אם המשתמש הגדיר שילובים מועדפים של שפה ואזור, ואחד מהשילובים המועדפים מורשה במדיניות הזו, המערכת תקבע ש-<ph name="PRODUCT_OS_NAME" /> יוצג בעזרת השילוב הזה. אחרת, <ph name="PRODUCT_OS_NAME" /> יעבור אל הערך החוקי הראשון שצוין במדיניות הזו. אם המדיניות הזו מכילה רק ערכים לא חוקיים, ייעשה שימוש בשילוב של שפה ואזור שנקבע כברירת מחדל (נכון לעכשיו, en-US).</translation>
+<translation id="2604182581880595781">הגדרת כללי המדיניות הקשורים ל'התקן רשת לשיתוף קבצים'.</translation>
 <translation id="2623014935069176671">המתן לפעילות משתמש התחלתית</translation>
 <translation id="262740370354162807">אפשר הגשת מסמכים ל-<ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">‏מספקת תצורות בשביל מדפסות ארגוניות.
@@ -656,6 +667,7 @@
 <translation id="2823870601012066791">‏מיקום בקובץ הרישום של Windows בשביל לקוחות <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">הפעל מצב גלישה בסתר</translation>
 <translation id="2838830882081735096">‏אל תאפשר העברת נתונים ו-ARC</translation>
+<translation id="2839294585867804686">ההגדרות של 'התקן רשת לשיתוף קבצים'</translation>
 <translation id="2840269525054388612">‏מציינת את המדפסות הזמינות למשתמש.
 
       המדיניות הזו מופעלת רק אם האפשרות <ph name="PRINTERS_WHITELIST" /> נבחרה בשביל <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1124,17 +1136,18 @@
 
       אם מדיניות זו לא הוגדרה, המערכת תשתמש בערך ברירת המחדל הכללי עבור כל האתרים לפי המדיניות 'DefaultKeygenSetting' במקרה שהוגדרה, או לפי התצורה האישית שקבע המשתמש במקרה שלא הוגדרה.</translation>
 <translation id="4239720644496144453">‏אפליקציות Android אינן משתמשות בקובץ השמור. אם מספר משתמשים יתקינו את אותה אפליקציית Android, תתבצע הורדה חוזרת שלה בשביל כל משתמש.</translation>
-<translation id="4243336580717651045">‏הפעלת איסוף נתונים שעברו אנונימיזציה עם קידוד לפי כתובת אתר במסגרת <ph name="PRODUCT_NAME" />, ומניעת היכולת של משתמשים לשנות את ההגדרה הזאת.
+<translation id="4243336580717651045">‏הפעלת איסוף נתונים שעברו אנונימיזציה עם קידוד שכולל כתובת אתר במסגרת <ph name="PRODUCT_NAME" />, ומניעת היכולת של משתמשים לשנות את ההגדרה הזאת.
 
-      במסגרת איסוף נתונים שעברו אנונימיזציה עם קידוד לפי כתובת אתר, כתובות אתרים של דפים שהמשתמש ביקר בהם נשלחות אל Google במטרה לשפר את האיכות של החיפושים והגלישה.
+      במסגרת איסוף נתונים שעברו אנונימיזציה עם קידוד שכולל כתובת אתר, כתובות אתרים של דפים שהמשתמש ביקר בהם נשלחות אל Google במטרה לשפר את האיכות של החיפושים והגלישה.
 
-      אם המדיניות הזאת מופעלת, איסוף נתונים שעברו אנונימיזציה עם קידוד לפי כתובת אתר תמיד פעיל.
+      אם המדיניות הזאת מופעלת, איסוף נתונים שעברו אנונימיזציה עם קידוד שכולל כתובת אתר תמיד פעיל.
 
-      אם המדיניות הזאת מושבתת, איסוף נתונים שעברו אנונימיזציה עם קידוד לפי כתובת אתר אף פעם לא פעיל.
+      אם המדיניות הזאת מושבתת, איסוף נתונים שעברו אנונימיזציה עם קידוד שכולל כתובת אתר אף פעם לא פעיל.
 
-      אם המדיניות הזאת לא מוגדרת, איסוף נתונים שעברו אנונימיזציה עם קידוד לפי כתובת אתר יופעל, אבל המשתמשים יוכלו לשנות את ההגדרה.</translation>
+      אם המדיניות הזאת לא מוגדרת, איסוף נתונים שעברו אנונימיזציה עם קידוד שכולל כתובת אתר יופעל, אבל המשתמשים יוכלו לשנות את ההגדרה.</translation>
 <translation id="4250680216510889253">לא</translation>
 <translation id="4261820385751181068">הגדרת המקום של מסך הכניסה במכשיר</translation>
+<translation id="4264607809747169568">‏שליטה בהגדרות התכונה 'התקן רשת לשיתוף קבצים' לקביעת הזמינות של ChromeOS</translation>
 <translation id="427220754384423013">‏מציינת את המדפסות הזמינות למשתמש.
 
       המדיניות הזו מופעלת רק אם האפשרות <ph name="PRINTERS_WHITELIST" /> נבחרה בשביל <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1531,6 +1544,15 @@
       את ערך המדיניות יש לקבוע באלפיות השנייה.</translation>
 <translation id="5511702823008968136">הפוך סרגל סימניות לפעיל</translation>
 <translation id="5512418063782665071">כתובת אתר של דף הבית</translation>
+<translation id="551639594034811656">המדיניות הזו מגדירה רשימה של ערכי אחוזים. ערכי האחוזים האלה קובעים את שיעור מכשירי <ph name="PRODUCT_OS_NAME" /> ביחידה הארגונית שיש לעדכן בכל יום, החל מהיום שבו המערכת מאתרת לראשונה את העדכון. האיתור נעשה במועד מאוחר מזה שבו פורסם העדכון, כי יכול לחלוף זמן מרגע פרסום העדכון ועד שהמכשיר מחפש עדכונים.
+
+      כל זוג (יום ואחוז) מציין את האחוז שיש לעדכן מתוך המאגר תוך מספר ימים מוגדר ממועד איתור העדכון. למשל, הזוגות [(4, 40), (10, 70), (15, 100)] פירושם שצריך היה לעדכן 40% מהמאגר 4 ימים אחרי שהופיע העדכון. 70% צריך לעדכן כעבור 10 ימים וכן הלאה.
+
+      אם הוגדר ערך עבור המדיניות הזו, עדכונים יתעלמו מהמדיניות <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ויפעלו במקום זאת לפי המדיניות הזו.
+
+      אם הרשימה הזו ריקה, אין שלבי ביניים והעדכונים יבוצעו בהתאם לכללי מדיניות אחרים בנושא מכשירים.
+
+      המדיניות הזו לא חלה על מעבר לערוץ אחר.</translation>
 <translation id="5523812257194833591">‏פעילות ציבורית באתר לביצוע התחברות אוטומטית לאחר השהיה.
 
       אם המדיניות הזו מוגדרת, הפעילות המצוינת באתר תחובר באופן אוטומטי לאחר שיחלוף משך זמן מסוים ללא פעולת משתמש במסך ההתחברות. על הפעילות הציבורית באתר כבר להיות מוגדרת (ראה |DeviceLocalAccounts|).
@@ -1752,7 +1774,7 @@
           הדרך המומלצת לנעול את המסך בזמן של חוסר פעילות היא להפעיל נעילת מסך בהשעייה, ולהגדיר את <ph name="PRODUCT_OS_NAME" /> לביצוע ההשעייה לאחר שחלף פרק הזמן של חוסר הפעילות. יש להשתמש במדיניות זו רק כאשר נעילת המסך צריכה להתרחש הרבה לפני ההשעייה, או כאשר אינך מעוניין להשתמש כלל בהשעייה בזמן חוסר פעילות.
 
           יש לציין את פרק הזמן באלפיות שנייה. הערכים צריכים להיות קטנים יותר מפרק הזמן של חוסר פעילות.</translation>
-<translation id="6097601282776163274">הפעלת איסוף נתונים שעברו אנונימיזציה עם קידוד לפי כתובת אתר</translation>
+<translation id="6097601282776163274">הפעלת איסוף נתונים שעברו אנונימיזציה עם קידוד שכולל כתובת אתר</translation>
 <translation id="6111936128861357925">‏אפשר לשחק במשחק ביצי הפסחא של הדינוזאורים (Dinosaur Easter Egg)</translation>
 <translation id="6114416803310251055">הוצאה משימוש</translation>
 <translation id="6133088669883929098">אפשר לכל האתרים להשתמש ביצירת מפתחות</translation>
@@ -1827,6 +1849,7 @@
 <translation id="6440051664870270040">אישור לאתרים לנווט ולפתוח חלונות מוקפצים בו זמנית</translation>
 <translation id="6447948611083700881">גיבוי ושחזור מושבתים</translation>
 <translation id="645425387487868471">הפעלת אכיפת הכניסה במסגרת <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">הפעלת מילוי אוטומטי בשביל כתובות</translation>
 <translation id="6473623140202114570">הגדרת רשימת הדומיינים שבהם גלישה בטוחה לא תפעיל אזהרות.</translation>
 <translation id="6491139795995924304">‏התר Bluetooth במכשיר</translation>
 <translation id="6520802717075138474">ייבא ​​מנועי חיפוש מדפדפן ברירת המחדל בהפעלה הראשונה</translation>
@@ -2423,6 +2446,10 @@
       אם המדיניות מושבתת, לא יתבצע בידוד מפורש של אתר, וניסויי השטח של IsolateOrigins ו-SitePerProcess יושבתו. משתמשים עדיין יוכלו להפעיל באופן ידני את SitePerProcess.
        אם המדיניות לא מוגדרת, המשתמש יוכל לשנות את ההגדרה הזו.
       </translation>
+<translation id="7902255855035461275">המערכת תחפש התאמות בין הדפוסים ברשימה הזו לבין מקור האבטחה
+      של כתובת האתר המבצעת את הבקשה. אם תימצא התאמה, הגישה למכשירי צילום וידאו תוענק ללא הצגת בקשה.
+
+      הערה: עד גרסה 45, מדיניות זו נתמכה רק במצב קיוסק.</translation>
 <translation id="7912255076272890813">הגדרת סוגי יישומים/תוספים מותרים</translation>
 <translation id="7915236031252389808">‏תוכל לציין כאן כתובת אתר לקובץ ‎.pac של שרת proxy.
           
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index b65467cf..d1d1f2c 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -295,6 +295,11 @@
       設定を指定しない場合は、デフォルト値が使用されます。
 
       このポリシーを設定しない場合は、すべての設定でデフォルトが使用されます。</translation>
+<translation id="1958138414749279167"><ph name="PRODUCT_NAME" /> の自動入力機能を有効にし、ユーザーが以前に保存した情報を使ってウェブフォームに住所情報を自動入力できるようにします。
+
+      この設定を無効にした場合は、住所情報が候補として表示されたり、自動入力されたりすることはありません。また、ユーザーがウェブの利用中に送信した住所情報が追加で保存されることもありません。
+
+      この設定を有効にするか、値を設定しない場合、ユーザーは UI で住所の自動入力を制御できます。</translation>
 <translation id="1960840544413786116">ローカルの信頼済みアンカーが発行した、subjectAlternativeName 拡張がない証明書の許可</translation>
 <translation id="1964634611280150550">シークレット モードを無効にする</translation>
 <translation id="1964802606569741174">このポリシーは Android YouTube アプリには適用されません。YouTube でセーフモードを有効にする場合は、Android YouTube アプリのインストールを禁止する必要があります。</translation>
@@ -501,6 +506,11 @@
       この設定が未設定の場合は、この機能を使用するかどうかをユーザーが選択できます。
 
       この設定は、<ph name="PRODUCT_NAME" /> 29 以降のバージョンでは削除されています。</translation>
+<translation id="2433412232489478893">このポリシーでは、<ph name="PRODUCT_NAME" /> のネットワーク ファイル共有の機能をユーザーが使用できるようにするかどうかを設定します。
+
+      このポリシーが未設定または True に設定されている場合、ユーザーはネットワーク ファイル共有を使用できます。
+
+      このポリシーが False に設定されている場合、ユーザーはネットワーク ファイル共有を使用できません。</translation>
 <translation id="2438609638493026652">Android アプリのインストール中に発生したキーイベントが Google に報告されるようにします。取得されるイベントは、ポリシーを通じてインストールされたアプリのイベントのみです。
 
       このポリシーが true に設定されている場合は、イベントが記録されます。
@@ -578,6 +588,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> の表示用の言語 / 地域を設定します。
 
       このポリシーが設定されている場合、ユーザーはこのポリシーで指定された言語 / 地域からのみ <ph name="PRODUCT_OS_NAME" /> の表示用の言語 / 地域を選択できます。このポリシーが設定されていない場合や空のリストが指定されている場合は、サポートされているすべての UI 言語 / 地域から <ph name="PRODUCT_OS_NAME" /> の表示用の言語 / 地域を選択できます。このポリシーで指定されているリストに含まれる無効な値はすべて無視されます。ユーザーがすでに選択していた <ph name="PRODUCT_OS_NAME" /> の表示用の言語 / 地域がこのポリシーで許可されていない場合は、ユーザーの次回のログイン時に表示用の言語 / 地域が切り替えられ、許可されている UI 言語 / 地域が使用されます。ユーザーが希望の言語 / 地域をいくつか指定していて、そのいずれかがこのポリシーで許可されている場合、<ph name="PRODUCT_OS_NAME" /> はその言語 / 地域に切り替えられます。それ以外の場合、<ph name="PRODUCT_OS_NAME" /> はこのポリシーで指定されている最初の有効な言語 / 地域に切り替えられるか、ポリシーの値がいずれも無効であれば代替の言語 / 地域(現在は「en-US」)に切り替えられます。</translation>
+<translation id="2604182581880595781">ネットワーク ファイル共有に関連するポリシーを設定します。</translation>
 <translation id="2623014935069176671">最初のユーザー操作を待機する</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> へのドキュメントの送信を有効にします。</translation>
 <translation id="2627554163382448569">企業プリンタの設定を指定します。
@@ -657,6 +668,7 @@
 <translation id="2823870601012066791">Windows レジストリでの <ph name="PRODUCT_OS_NAME" /> クライアントの場所:</translation>
 <translation id="2824715612115726353">シークレット モードを有効にする</translation>
 <translation id="2838830882081735096">データ移行と ARC を許可しない</translation>
+<translation id="2839294585867804686">ネットワーク ファイル共有の設定</translation>
 <translation id="2840269525054388612">ユーザーに使用を許可するプリンタを指定します。
 
       このポリシーは、<ph name="DEVICE_PRINTERS_ACCESS_MODE" /> の値に <ph name="PRINTERS_WHITELIST" /> が選択されている場合にのみ使用されます。
@@ -1138,6 +1150,7 @@
       このポリシーを未設定のままにすると、URL キーによる匿名化データの収集は有効になりますが、ユーザーはこの設定を変更できます。</translation>
 <translation id="4250680216510889253">いいえ</translation>
 <translation id="4261820385751181068">端末のログイン画面の言語 / 地域</translation>
+<translation id="4264607809747169568">Chrome OS でネットワーク ファイル共有を使用できるかどうかの設定</translation>
 <translation id="427220754384423013">ユーザーに使用を許可するプリンタを指定します。
 
       このポリシーは、<ph name="BULK_PRINTERS_ACCESS_MODE" /> の値に <ph name="PRINTERS_WHITELIST" /> が選択されている場合にのみ使用されます。
@@ -1539,6 +1552,15 @@
       ポリシーの値は、ミリ秒単位で指定する必要があります。</translation>
 <translation id="5511702823008968136">ブックマーク バーを有効にする</translation>
 <translation id="5512418063782665071">ホームページの URL</translation>
+<translation id="551639594034811656">このポリシーでは、アップデートが最初に検出された日からの経過日数ごとに、組織部門の <ph name="PRODUCT_OS_NAME" /> デバイスのうちでアップデートを適用するデバイスの割合(%)を指定します。アップデートの公開からデバイスでのアップデート チェックまでは時間が空くことがあるため、アップデートの検出日はアップデートの公開日よりも後になることがよくあります。
+
+      このポリシーでは、アップデートが検出されてからの日数と、アップデートを適用するデバイスの割合(%)を、(日付, %) の形式で指定します。たとえば [(4, 40), (10, 70), (15, 100)] と指定した場合は、アップデートの検出から 4 日後にデバイスの 40% にアップデートを適用し、10 日後には 70% に適用する、という意味になります。
+
+      このポリシーのリストに値が指定されている場合は、<ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ポリシーではなくこのポリシーに沿ってアップデートが適用されます。
+
+      このポリシーのリストが空の場合、段階的な適用は行われず、アップデートは他のデバイス ポリシーに沿って適用されます。
+
+      このポリシーはチャンネルの切り替えには適用されません。</translation>
 <translation id="5523812257194833591">一定時間経過後に自動ログインする公開セッションです。
 
       このポリシーが設定されている場合、ログイン画面で一定時間ユーザー操作が行われないと、指定されたセッションに自動的にログインします。公開セッションは事前に設定しておく必要があります(|DeviceLocalAccounts| をご覧ください)。
@@ -1835,6 +1857,7 @@
 <translation id="6440051664870270040">移動と同時にポップアップを表示することをサイトに許可する</translation>
 <translation id="6447948611083700881">バックアップと復元が無効</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> への強制ログインを有効にする</translation>
+<translation id="6464074037294098618">住所の自動入力を有効にします</translation>
 <translation id="6473623140202114570">セーフ ブラウジングによる警告の表示を行わないドメインのリストを設定する。</translation>
 <translation id="6491139795995924304">端末で Bluetooth を許可する</translation>
 <translation id="6520802717075138474">初回実行時にデフォルトのブラウザから検索エンジンをインポートする</translation>
@@ -2432,6 +2455,11 @@
       このポリシーが無効に設定されている場合、明示的なサイト分離は行われず、IsolateOrigins と SitePerProcess のフィールドテストは無効になります。ただしユーザーは SitePerProcess を手動で有効にできます。
       このポリシーが未設定の場合、ユーザーはこの設定を変更できます。
       </translation>
+<translation id="7902255855035461275">このリストに指定されているパターンが、リクエスト元 URL の
+      セキュリティ オリジンと照合されます。一致するものが見つかった場合は、
+      動画キャプチャ デバイスへのアクセスが許可されます。その際、確認のメッセージは表示されません。
+
+      注: バージョン 45 以前は、このポリシーはキオスクモードでのみサポートされていました。</translation>
 <translation id="7912255076272890813">許可されるアプリ/拡張機能のタイプを設定する</translation>
 <translation id="7915236031252389808">プロキシ .pac ファイルの URL をここで指定できます。
 
diff --git a/components/policy/resources/policy_templates_kn.xtb b/components/policy/resources/policy_templates_kn.xtb
index 15b3253..3695658 100644
--- a/components/policy/resources/policy_templates_kn.xtb
+++ b/components/policy/resources/policy_templates_kn.xtb
@@ -552,6 +552,10 @@
       ಈ ನೀತಿಯನ್ನು 'ತಪ್ಪು' ಎಂದು ಹೊಂದಿಸಿದರೆ, ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರನ್ನು ಲಾಗಿನ್‌ ಪರದೆಯ ಮೇಲೆ <ph name="PRODUCT_OS_NAME" /> ತೋರಿಸಲಾಗುವುದಿಲ್ಲ. ಸಾರ್ವಜನಿಕ ಸೆಷನ್ ಕಾನ್ಫಿಗರ್ ಮಾಡದ ಹೊರತು ಸಾಮಾನ್ಯ ಸೈನ್-ಇನ್ ಪರದೆಯ (ಬಳಕೆದಾರರ ಇಮೇಲ್ ಮತ್ತು ಪಾಸ್ವರ್ಡ್ ಅಥವಾ ಫೋನ್‌ಗಾಗಿ ಪ್ರಾಂಪ್ಟ್‌ ಮಾಡಲು) ಅಥವಾ SAML ಹೊರಗಿನ ಪರದೆಯನ್ನು (<ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" /> ನೀತಿಯ ಮೂಲಕ ಸಕ್ರಿಯಗೊಳಿಸಿದ್ದರೆ) ತೋರಿಸುತ್ತದೆ. ಸಾರ್ವಜನಿಕ ಸೆಷನ್‌ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದಾಗ, ಸಾರ್ವಜನಿಕ ಸೆಷನ್ ಖಾತೆಗಳನ್ನು ಮಾತ್ರ ತೋರಿಸಲಾಗುತ್ತದೆ ಮತ್ತು ಅವುಗಳಲ್ಲಿ ಒಂದನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ.
 
        ಸಾಧನವು ಸ್ಥಳೀಯ ಬಳಕೆದಾರ ಡೇಟಾವನ್ನು ಇರಿಸಿದಲ್ಲಿ ಅಥವಾ ತಿರಸ್ಕರಿಸಿದರೂ ಈ ನೀತಿಯು ಯಾವುದೇ ಪರಿಣಾಮ ಬೀರುವುದಿಲ್ಲ ಎಂಬುದನ್ನು ಗಮನಿಸಿ.</translation>
+<translation id="2433412232489478893"><ph name="PRODUCT_NAME" /> ಗಾಗಿ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್ ಹಂಚಿಕೊಳ್ಳುವ ವೈಶಿಷ್ಟ್ಯ ಬಳಸಲು ನಿರ್ದಿಷ್ಟ ಬಳಕೆದಾರರಿಗೆ ಅನುಮತಿ ಇದೆಯೇ ಎಂಬುದನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ನಿಯಂತ್ರಿಸುತ್ತದೆ.
+      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದಿದ್ದರೆ ಅಥವಾ True ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದರೆ, ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳುವ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.
+
+      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು False ಎಂಬುದಾಗಿ ಹೊಂದಿಸಿದರೆ, ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳುವ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಬಳಸಲು, ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="2438609638493026652">Android ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಇನ್‌ಸ್ಟಾಲ್‌ ಮಾಡುವ ಸಮಯದಲ್ಲಿ Google ಗೆ ಮುಖ್ಯ ಈವೆಂಟ್‌ಗಳನ್ನು ವರದಿ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ. ಕಾರ್ಯನೀತಿಯ ಮೂಲಕ ಇನ್‍ಸ್ಟಲೇಶನ್ ಅನ್ನು ಯಾವೆಲ್ಲಾ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಟ್ರಿಗರ್ ಮಾಡಲಾಗಿದೆಯೋ,ಅಂತಹ ಅಪ್ಲಿಕೇಶನ್‍ಗಳಿಗೆ ಮಾತ್ರ ಈವೆಂಟ್‌ಗಳನ್ನು ಸೆರೆಹಿಡಿಯಲಾಗುತ್ತದೆ.
 
 ಕಾರ್ಯನೀತಿಯನ್ನು ಸರಿ ಎಂದು ಹೊಂದಿಸಿದರೆ, ಈವೆಂಟ್‌ಗಳನ್ನು ಲಾಗ್ ಮಾಡಲಾಗುವುದು.
@@ -632,6 +636,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> ಅನ್ನು ಪ್ರದರ್ಶಿಸಬಹುದಾದ ಸ್ಥಳೀಯ ಭಾಷೆಗಳನ್ನು ಕಾನ್ಫಿಗರ್‌ ಮಾಡುತ್ತದೆ.
 
       ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸಿದಲ್ಲಿ, ಬಳಕೆದಾರರು ಈ ಕಾರ್ಯನೀತಿಯು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಯಾವುದೇ ಒಂದು ಸ್ಥಳೀಯ ಭಾಷೆಯಲ್ಲಿ ಮಾತ್ರ <ph name="PRODUCT_OS_NAME" /> ಅನ್ನು ಪ್ರದರ್ಶಿಸುವಂತೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಬಿಟ್ಟರೆ ಅಥವಾ ಖಾಲಿ ಪಟ್ಟಿಗೆ ಹೊಂದಿಸಿದರೆ, <ph name="PRODUCT_OS_NAME" /> ಅನ್ನು ಎಲ್ಲಾ ಬೆಂಬಲಿತ UI ಸ್ಥಳೀಯ ಭಾಷೆಗಳಲ್ಲಿ ಪ್ರದರ್ಶಿಸಬಹುದು. ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಅಮಾನ್ಯ ಮೌಲ್ಯಗಳನ್ನು ಹೊಂದಿರುವ ಪಟ್ಟಿಗೆ ಹೊಂದಿಸಿದರೆ, ಎಲ್ಲಾ ಅಮಾನ್ಯ ಮೌಲ್ಯಗಳನ್ನು ನಿರ್ಲಕ್ಷಿಸಲಾಗುವುದು. ಈ ಕಾರ್ಯನೀತಿಯು ಅನುಮತಿಸದ ಭಾಷೆಯಲ್ಲಿ <ph name="PRODUCT_OS_NAME" /> ಅನ್ನು ಪ್ರದರ್ಶಿಸುವಂತೆ ಬಳಕೆದಾರರು ಈ ಹಿಂದೆಯೇ ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ್ದರೆ, ಮುಂದಿನ ಬಾರಿ ಬಳಕೆದಾರರು ಸೈನ್ ಇನ್ ಮಾಡಿದಾಗ ಪ್ರದರ್ಶನ ಭಾಷೆಯನ್ನು ಅನುಮತಿಸಲಾದ UI ಸ್ಥಳೀಯ ಭಾಷೆಗೆ ಬದಲಾಯಿಸಲಾಗುತ್ತದೆ. ಬಳಕೆದಾರರು ಆದ್ಯತೆಯ ಸ್ಥಳೀಯ ಭಾಷೆಗಳನ್ನು ಕಾನ್ಫಿಗರ್‌ ಮಾಡಿದ್ದರೆ ಮತ್ತು ಅದರಲ್ಲಿರುವ ಒಂದು ಆದ್ಯತೆಯ ಸ್ಥಳೀಯ ಭಾಷೆಯನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ಅನುಮತಿಸಿದರೆ, <ph name="PRODUCT_OS_NAME" /> ಈ ಸ್ಥಳೀಯ ಭಾಷೆಗೆ ಬದಲಾಗುತ್ತದೆ. ಇಲ್ಲದಿದ್ದರೆ, ಈ ಕಾರ್ಯನೀತಿಯಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ ಮೊದಲ ಮೌಲ್ಯಕ್ಕೆ <ph name="PRODUCT_OS_NAME" /> ಬದಲಾಗುತ್ತದೆ, ಅಥವಾ ಈ ಕಾರ್ಯನೀತಿಯು ಅಮಾನ್ಯ ಮೌಲ್ಯಗಳನ್ನು ಮಾತ್ರ ಹೊಂದಿದ್ದರೆ, ಅದು ಪರ್ಯಾಯ ಸ್ಥಳೀಯ ಭಾಷೆಗೆ (ಪ್ರಸ್ತುತ en-US) ಬದಲಾಗುತ್ತದೆ.</translation>
+<translation id="2604182581880595781">ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಕಾರ್ಯನೀತಿಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ.</translation>
 <translation id="2623014935069176671">ಆರಂಭಿಕ ಬಳಕೆದಾರ ಚಟುವಟಿಕೆಗಾಗಿ ನಿರೀಕ್ಷಿಸಿ</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> ಗೆ ಡಾಕ್ಯುಮೆಂಟ್‌ಗಳ ಸಲ್ಲಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು</translation>
 <translation id="2627554163382448569">ಎಂಟರ್‌ಪ್ರೈಸ್‌ ಪ್ರಿಂಟರ್‌ಗಳಿಗಾಗಿ ಕಾನ್ಫಿಗರೇಶನ್‌ಗಳನ್ನು ಒದಗಿಸುತ್ತದೆ. 
@@ -714,6 +719,7 @@
 
           ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಇದ್ದರೆ, ಯಾವುದೇ ಗರಿಷ್ಠ ಉದ್ದವು ಒತ್ತಾಯಪಡಿಸಲಾಗುವುದಿಲ್ಲ.</translation>
 <translation id="2838830882081735096">ಡೇಟಾ ರವಾನೆ ಮತ್ತು ARC ಅನ್ನು ಅನುಮತಿಸಿಲ್ಲ</translation>
+<translation id="2839294585867804686">ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್ ಹಂಚಿಕೊಳ್ಳುವುದಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 <translation id="2840269525054388612">ಬಳಕೆದಾರರು ಬಳಸಲು ಸಾಧ್ಯವಿರುವ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ.
 
 <ph name="PRINTERS_WHITELIST" /> ಅನ್ನು <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ಗಾಗಿ ಆಯ್ಕೆ ಮಾಡಿದ್ದರೆ ಮಾತ್ರ ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.
@@ -1238,17 +1244,18 @@
       ಬಳಸಬಹುದಾದ ವೇರಿಯಬಲ್‌ಗಳ ಪಟ್ಟಿಗಾಗಿ https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables ನೋಡಿ.
     ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸದೇ ಬಿಟ್ಟಲ್ಲಿ ಡೀಫಾಲ್ಟ್ ರೋಮಿಂಗ್ ಪ್ರೊಫೈಲ್ ಹಾದಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.</translation>
 <translation id="4239720644496144453">Android ಅಪ್ಲಿಕೇಶನ್‌ಗಳಿಗೆ ಸಂಗ್ರಹವನ್ನು ಬಳಸಲಾಗಿಲ್ಲ. ಒಂದೇ Android ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಹಲವು ಬಳಕೆದಾರರು ಸ್ಥಾಪಿಸಿದ್ದರೆ, ಪ್ರತಿ ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಹೊಸತಾಗಿ ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತದೆ.</translation>
-<translation id="4243336580717651045">URL-ಸೇರಿಸಲಾದ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವನ್ನು <ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಿಸುವುದರಿಂದ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ.
+<translation id="4243336580717651045">ವೆಬ್‍ಪುಟಗಳ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವನ್ನು <ph name="PRODUCT_NAME" /> ನಲ್ಲಿ ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಿಸದಂತೆ ಬಳಕೆದಾರರನ್ನು ತಡೆಯುತ್ತದೆ.
 
-      ಬ್ರೌಸಿಂಗ್ ಮತ್ತು ಹುಡುಕಾಟಗಳನ್ನು ಉತ್ತಮಗೊಳಿಸಲು, URL-ಸೇರಿಸಲಾದ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವು ಬಳಕೆದಾರರು ಭೇಟಿ ನೀಡುವ ಪುಟಗಳ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ.
+      ಬ್ರೌಸಿಂಗ್ ಮತ್ತು ಹುಡುಕಾಟಗಳನ್ನು ಉತ್ತಮಗೊಳಿಸಲು, ವೆಬ್‍ಪುಟಗಳ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವು ಬಳಕೆದಾರರು ಭೇಟಿ ನೀಡುವ ಪುಟಗಳ URL ಗಳನ್ನು Google ಗೆ ಕಳುಹಿಸುತ್ತದೆ.
 
-      ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, URL-ಸೇರಿಸಲಾದ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವು ಯಾವಾಗಲೂ ಕ್ರಿಯಾತ್ಮಕವಾಗಿರುತ್ತದೆ.
+      ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿದರೆ, ವೆಬ್‍ಪುಟಗಳ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವು ಯಾವಾಗಲೂ ಸಕ್ರಿಯವಾಗಿರುತ್ತದೆ.
 
-      ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, URL-ಸೇರಿಸಲಾದ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವು ಎಂದಿಗೂ ಕ್ರಿಯಾತ್ಮಕವಾಗಿರುವುದಿಲ್ಲ.
+      ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ವೆಬ್‍ಪುಟಗಳ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವು ಎಂದಿಗೂ ಸಕ್ರಿಯವಾಗಿರುವುದಿಲ್ಲ.
 
-     ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, URL-ಸೇರಿಸಲಾದ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation>
+     ನೀವು ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಹೊಂದಿಸದೆ ಬಿಟ್ಟರೆ, ವೆಬ್‍ಪುಟಗಳ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ, ಆದರೆ ಬಳಕೆದಾರರಿಗೆ ಅದನ್ನು ಬದಲಾಯಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತದೆ.</translation>
 <translation id="4250680216510889253">ಇಲ್ಲ</translation>
 <translation id="4261820385751181068">ಸಾಧನ ಸೈನ್-ಇನ್ ಪರದೆ ಸ್ಥಳ</translation>
+<translation id="4264607809747169568">ChromeOS ಲಭ್ಯತೆಗಾಗಿ ನೆಟ್‌ವರ್ಕ್‌ನಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಹಂಚಿಕೊಳ್ಳುವುದನ್ನು ನಿಯಂತ್ರಿಸುತ್ತದೆ</translation>
 <translation id="427220754384423013">ಬಳಕೆದಾರರು ಬಳಸಬಹುದಾದ ಪ್ರಿಂಟರ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುತ್ತದೆ. 
 
 <ph name="PRINTERS_WHITELIST" /> ಅನ್ನು <ph name="BULK_PRINTERS_ACCESS_MODE" /> ಗಾಗಿ ಆರಿಸಿದಾಗ ಮಾತ್ರ ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಬಳಸಲಾಗುತ್ತದೆ.
@@ -1694,6 +1701,15 @@
       ನೀತಿಯ ಮೌಲ್ಯವನ್ನು ಮಿಲಿಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕು.</translation>
 <translation id="5511702823008968136">ಬುಕ್‌ಮಾರ್ಕ್ ಪಟ್ಟಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸು</translation>
 <translation id="5512418063782665071">ಮುಖ ಪುಟ  URL</translation>
+<translation id="551639594034811656">ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಮೊದಲ ಬಾರಿಗೆ ಪತ್ತೆಹಚ್ಚಿದ ದಿನದಿಂದ, ಪ್ರತಿ ದಿನ OU ನಲ್ಲಿ <ph name="PRODUCT_OS_NAME" /> ಸಾಧನಗಳ ಎಷ್ಟು ಭಾಗವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕು ಎಂಬುದನ್ನು ಈ ಕಾರ್ಯನೀತಿಯು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಪತ್ತೆಹಚ್ಚಿದ ದಿನಾಂಕವು, ಅಪ್‌ಡೇಟ್ ಪ್ರಕಟಣೆಯ ದಿನಾಂಕದ ನಂತರದ ದಿನವಾಗಿರಬೇಕು, ಏಕೆಂದರೆ ಅಪ್‌ಡೇಟ್‌ಗಳಿವೆಯೇ ಎಂದು ಸಾಧನವು ಪರೀಕ್ಷಿಸುವಾಗ, ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಪ್ರಕಟಿಸಿ ಕೊಂಚ ಸಮಯ ಕಳೆದಿರಬಹುದು.
+
+      ಅಪ್‌ಡೇಟ್ ಅನ್ನು ಪತ್ತೆಹಚ್ಚಿದ ನಂತರ, ನಿಗದಿತ ದಿನಗಳ ಒಳಗೆ, ಸಮೂಹದ ಯಾವ ಭಾಗವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕು ಎಂಬುದನ್ನು ಪ್ರತಿ (ದಿನ, ಶೇಕಡಾ) ಜೋಡಿಯು ಸ್ಪಷ್ಟಪಡಿಸುತ್ತದೆ. ಉದಾಹರಣೆಗೆ, ನಾವು [(4, 40), (10, 70), (15, 100)] ಎಂಬ ಜೋಡಿಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ಅಪ್‌ಡೇಟ್ ಅನ್ನು ನೋಡಿದ 4 ದಿನಗಳ ಒಳಗೆ, ಸಮೂಹದ ಶೇ. 40 ರಷ್ಟು ಭಾಗವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕು. 10 ದಿನಗಳ ಒಳಗೆ ಶೇ. 70 ರಷ್ಟು ಭಾಗವನ್ನು ಅಪ್‌ಡೇಟ್ ಮಾಡಬೇಕು ಮತ್ತು ಈ ರೀತಿ ಮುಂದುವರಿಸಬೇಕು.
+
+      ಈ ಕಾರ್ಯನೀತಿಗೆ ಒಂದು ಮೌಲ್ಯವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿದ್ದರೆ, ಅಪ್‌ಡೇಟ್‌ಗಳು <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ಕಾರ್ಯನೀತಿಯನ್ನು ನಿರ್ಲಕ್ಷಿಸುತ್ತವೆ ಮತ್ತು ಅದರ ಬದಲಿಗೆ, ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಅನುಸರಿಸುತ್ತವೆ.
+
+      ಈ ಪಟ್ಟಿಯು ಖಾಲಿಯಾಗಿದ್ದರೆ, ಹಂತಗಳ ಪ್ರಕಾರ ಕಾರ್ಯಾಚರಣೆ ನಡೆಸಲಾಗುವುದಿಲ್ಲ ಮತ್ತು ಇತರ ಸಾಧನ ಕಾರ್ಯನೀತಿಗಳ ಅನುಸಾರ ಅಪ್‌ಡೇಟ್‌ಗಳನ್ನು ಅನ್ವಯಿಸಲಾಗುತ್ತದೆ.
+
+      ಈ ಕಾರ್ಯನೀತಿಯು ಚಾನಲ್ ಬದಲಾವಣೆಗಳಿಗೆ ಅನ್ವಯಿಸುವುದಿಲ್ಲ.</translation>
 <translation id="5523812257194833591">ವಿಳಂಬದ ನಂತರ ಸ್ವಯಂ ಲಾಗಿನ್‌ಗೆ ಸಾರ್ವಜನಿಕ ಸೆಷನ್.
 
       ಈ ನೀತಿಯನ್ನು ಹೊಂದಿಸಿದರೆ, ಬಳಕೆದಾರರ ಮಧ್ಯಸ್ಥಿಕೆ ಇಲ್ಲದೆಯೇ ಲಾಗಿನ್ ಪರದೆಯಲ್ಲಿ ನಿಗಧಿತ ಸಮಯ ಕಳೆದ ನಂತರ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾದ ಸೆಷನ್ ಅನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಲಾಗ್ ಇನ್ ಮಾಡಲಾಗುವುದು. ಸಾರ್ವಜನಿಕ ಸೆಷನ್ ಅನ್ನು ಈಗಾಗಲೇ ಕಾನ್ಫಿಗರ್ ಮಾಡಿರಬೇಕು (|DeviceLocalAccounts| ನೋಡಿ).
@@ -1936,7 +1952,7 @@
           ತಟಸ್ಥವಾಗಿರುವ ಪರದೆಯನ್ನು ಲಾಕ್ ಮಾಡಲು ಶಿಫಾರಸು ಮಾಡಲಾದ ವಿಧಾನವೆಂದರೆ, ಅಮಾನತ್ತಿನಲ್ಲಿರುವಾಗ ಸ್ಕ್ರೀನ್ ಲಾಕ್ ಮಾಡುವುದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದು ಮತ್ತು ತಟಸ್ಥ ವಿಳಂಬದ ನಂತರ <ph name="PRODUCT_OS_NAME" /> ಅಮಾನತ್ತು ಮಾಡುವಂತೆ ಮಾಡುವುದಾಗಿದೆ. ಅಮಾನತು ಮಾಡಿದ ಬಳಿಕ ಗಮನಾರ್ಹವಾಗಿ ಬೇಗದ ಸಮಯದಲ್ಲೇ ಅಥವಾ ತಟಸ್ಥದ ಅಮಾನತನ್ನು ಇನ್ನೂ ತೀರ್ಮಾನಿಸದಿರುವಾಗ ಪರದೆ ಲಾಕಿಂಗ್ ಸಂಭವಿಸಿದರೆ ಮಾತ್ರ ಈ ನೀತಿಯನ್ನು ಬಳಸಬೇಕು.
 
           ನೀತಿ ಮೌಲ್ಯವನ್ನು ಮಿಲಿಸೆಕೆಂಡುಗಳಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬೇಕು. ಮೌಲ್ಯಗಳು ತಟಸ್ಥ ವಿಳಂಬಕ್ಕಿಂತಲೂ ಕಡಿಮೆ ಇರುವಂತೆ ಹೊಂದಿಸಿರಬೇಕು.</translation>
-<translation id="6097601282776163274">URL-ಸೇರಿಸಲಾದ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
+<translation id="6097601282776163274">ವೆಬ್‍ಪುಟಗಳ URL ಗಳನ್ನು ಒಳಗೊಂಡಿರುವ ಅನಾಮಧೇಯ ಡೇಟಾ ಸಂಗ್ರಹವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
 <translation id="6111936128861357925">ಡೈನೋಸಾರ್ ಈಸ್ಟರ್ ಎಗ್ ಆಟ ಅನುಮತಿಸಿ</translation>
 <translation id="6114416803310251055">ಪ್ರಾರ್ಥಿಸಲಾಗಿದೆ</translation>
 <translation id="6133088669883929098">ಕೀ ರಚನೆ ಬಳಸಲು ಎಲ್ಲ ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸಿ</translation>
@@ -2637,6 +2653,9 @@
      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದರೆ, ಯಾವುದೇ ಸ್ಪಷ್ಟ ಸೈಟ್ ಪ್ರತ್ಯೇಕಿಸುವಿಕೆ ಪ್ರಕ್ರಿಯೆಯು ನಡೆಯುವುದಿಲ್ಲ ಮತ್ತು IsolateOrigins ಹಾಗೂ SitePerProcess ನ ಫೀಲ್ಡ್ ಟ್ರಯಲ್‍ಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗುತ್ತದೆ. SitePerProcess ಅನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಇನ್ನೂ ಸಾಧ್ಯವಾಗುತ್ತದೆ.
      ಈ ಕಾರ್ಯನೀತಿಯನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡದಿದ್ದರೆ, ಈ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಬದಲಾಯಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಸಾಧ್ಯವಾಗುತ್ತದೆ.
       </translation>
+<translation id="7902255855035461275">ಈ ಪಟ್ಟಿಯಲ್ಲಿನ ವಿನ್ಯಾಸಗಳನ್ನು, ವಿನಂತಿಸುವ URL ನ ಸುರಕ್ಷತಾ ಮೂಲಕ್ಕೆ ಹೊಂದಾಣಿಕೆ ಮಾಡಲಾಗುತ್ತದೆ.   ಹೊಂದಾಣಿಕೆ ಕಂಡುಬಂದರೆ, ಪ್ರಾಂಪ್ಟ್ ಮಾಡದೆಯೇ, ವೀಡಿಯೊ ಸೆರೆಹಿಡಿಯುವ ಸಾಧನಗಳಿಗೆ ಪ್ರವೇಶ ಒದಗಿಸಲಾಗುತ್ತದೆ.
+      
+      ಗಮನಿಸಿ: ಆವೃತ್ತಿ 45 ರವರೆಗೆ, ಈ ಕಾರ್ಯನೀತಿಗೆ ಕಿಯೋಸ್ಕ್ ಮೋಡ್‌ನಲ್ಲಿ ಮಾತ್ರ ಬೆಂಬಲವಿತ್ತು.</translation>
 <translation id="7912255076272890813">ಅನುಮತಿಸಿದ ಅಪ್ಲಿಕೇಶನ್/ವಿಸ್ತರಣೆ ಪ್ರಕಾರಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ</translation>
 <translation id="7915236031252389808">ಪ್ರಾಕ್ಸಿ .pac ಫೈಲ್‌ಗೆ ನೀವು URL ಅನ್ನು ಇಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಬಹುದು.
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 9508b57..3fc58e5 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -523,6 +523,11 @@
       이 정책이 설정되어 있지 않은 경우 사용자가 이 기능의 사용 여부를 결정할 수 있습니다.
 
       이 설정은 <ph name="PRODUCT_NAME" /> 29 이상 버전에서 제거되었습니다.</translation>
+<translation id="2433412232489478893">이 정책은 사용자에게 <ph name="PRODUCT_NAME" />의 네트워크 파일 공유 기능을 허용할지 여부를 제어합니다.
+
+      이 정책이 구성되어 있지 않거나 True로 설정되어 있으면 사용자가 네트워크 파일 공유를 사용할 수 있습니다.
+
+      이 정책이 False로 설정되어 있으면 사용자가 네트워크 파일 공유를 사용할 수 없게 됩니다.</translation>
 <translation id="2438609638493026652">Android 앱 설치 중 주요 이벤트를 Google에 보고할 수 있습니다. 정책을 통해 설치가 실행된 앱의 이벤트만 기록됩니다.
 
       정책을 true로 설정하면 이벤트가 로깅됩니다.
@@ -604,6 +609,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" />의 표시 언어를 구성합니다.
 
       이 정책이 설정되면 사용자는 이 정책에서 지정된 언어 중 하나로만 <ph name="PRODUCT_OS_NAME" />이(가) 표시되도록 구성할 수 있습니다. 이 정책이 설정되지 않거나 빈 목록으로 설정될 경우 <ph name="PRODUCT_OS_NAME" />이(가) 지원되는 모든 언어로 표시될 수 있습니다. 이 정책이 잘못된 값을 포함하는 목록으로 설정될 경우 모든 잘못된 값은 무시됩니다. 사용자가 이전에 <ph name="PRODUCT_OS_NAME" />이(가) 이 정책에서 허용되지 않는 언어로 표시되도록 구성한 경우 다음번에 사용자가 로그인하면 표시 언어가 허용되는 언어로 전환됩니다. 사용자가 기본 언어를 구성했으며 기본 언어 중 하나가 이 정책에서 허용되는 경우 <ph name="PRODUCT_OS_NAME" />이(가) 이 언어로 전환됩니다. 그렇지 않은 경우 <ph name="PRODUCT_OS_NAME" />이(가) 이 정책에서 지정된 첫 번째 유효한 값으로 전환되거나, 이 정책에 잘못된 값만 있는 경우 대체 언어(현재 en-US)로 전환됩니다.</translation>
+<translation id="2604182581880595781">네트워크 파일 공유 관련 정책을 구성합니다.</translation>
 <translation id="2623014935069176671">첫 번째 사용자 활동 기다리기</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" />(으)로 문서 제출 사용</translation>
 <translation id="2627554163382448569">엔터프라이즈 프린터의 설정을 제공합니다.
@@ -689,6 +695,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> 클라이언트의 Windows 레지스트리 위치:</translation>
 <translation id="2824715612115726353">시크릿 모드 사용</translation>
 <translation id="2838830882081735096">데이터 이전 및 ARC 허용 안함</translation>
+<translation id="2839294585867804686">네트워크 파일 공유 설정</translation>
 <translation id="2840269525054388612">사용자가 사용할 수 있는 프린터를 지정합니다.
 
       이 정책은 <ph name="DEVICE_PRINTERS_ACCESS_MODE" />으(로) <ph name="PRINTERS_WHITELIST" />이(가) 선택되었을 때만 사용됩니다.
@@ -1180,6 +1187,7 @@
       이 정책을 설정하지 않은 경우 URL로 입력되며 익명으로 처리되는 데이터 수집이 사용 설정되지만 사용자가 이 설정을 변경할 수 있습니다.</translation>
 <translation id="4250680216510889253">아니요</translation>
 <translation id="4261820385751181068">기기 로그인 화면 언어</translation>
+<translation id="4264607809747169568">ChromeOS의 네트워크 파일 공유 가능 여부를 제어합니다.</translation>
 <translation id="427220754384423013">사용자가 사용할 수 있는 프린터를 지정합니다.
 
       이 정책은 <ph name="BULK_PRINTERS_ACCESS_MODE" />으(로) <ph name="PRINTERS_WHITELIST" />이(가) 선택되었을 때만 사용됩니다.
@@ -1610,6 +1618,15 @@
       이 정책 값은 밀리초 단위로 지정되어야 합니다.</translation>
 <translation id="5511702823008968136">북마크바 사용</translation>
 <translation id="5512418063782665071">홈페이지 URL</translation>
+<translation id="551639594034811656">이 정책은 OU에 있는 <ph name="PRODUCT_OS_NAME" /> 기기의 일부를 정의하는 비율의 목록을 정의하여 업데이트가 처음 발견된 날부터 매주 업데이트합니다. 업데이트가 게시된 후 기기가 업데이트를 확인할 때까지 시간이 다소 걸리므로 발견 시간은 업데이트 게시 시간 이후입니다.
+
+      각 (일, 비율) 쌍은 업데이트가 발견된 이후 지정한 일 수까지 얼마만큼의 요소군 비율이 업데이트되어야 하는지를 포함합니다. 예를 들어 [(4, 40), (10, 70), (15, 100)] 쌍이 있으면 업데이트가 발견된 이후 4일 후에 40%의 요소군이 업데이트되어야 하고, 10일 후에는 70%가 업데이트되어야 하는 식입니다.
+
+      정책에 값이 정의되어 있다면 업데이트는 <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> 정책을 무시하고 이 정책을 대신 따릅니다.
+
+      목록이 비어 있다면 스테이징이 이루어지지 않으며 다른 기기 정책에 따라 업데이트가 적용됩니다.
+
+      이 정책은 채널 전환에 적용되지 않습니다.</translation>
 <translation id="5523812257194833591">지연된 후 자동 로그인에 대한 공개 세션입니다.
 
       이 정책이 설정되어 있으면, 로그인 화면에서 사용자 활동 없이 일정 시간이 경과한 뒤에 지정된 세션이 자동으로 로그인됩니다. 공개 세션은 이미 구성되어 있어야 합니다(|DeviceLocalAccounts| 참조).
@@ -2541,6 +2558,11 @@
       정책을 사용 중지하면 명시적인 사이트 격리는 이루어지지 않고 IsolateOrigins 및 SitePerProcess 필드 평가판이 사용 중지됩니다. 사용자는 계속해서 SitePerProcess를 직접 사용 설정할 수 있습니다.
       정책을 구성하지 않으면 사용자가 이 설정을 변경할 수 있게 됩니다.
       </translation>
+<translation id="7902255855035461275">이 목록의 패턴을 요청 URL의 보안 출처와 비교합니다.
+      일치하는 항목이 확인되면 메시지를 표시하지 않고 동영상 캡처
+      기기에 액세스 권한을 부여합니다.
+
+      참고: 버전 45 이하에서는 키오스크 모드에서만 이 정책이 지원됩니다.</translation>
 <translation id="7912255076272890813">허용된 앱/확장 프로그램 설정</translation>
 <translation id="7915236031252389808">여기에서 프록시.pac 파일의 URL을 지정할 수 있습니다.
 
diff --git a/components/policy/resources/policy_templates_lt.xtb b/components/policy/resources/policy_templates_lt.xtb
index 5f24507..0ecf2d3 100644
--- a/components/policy/resources/policy_templates_lt.xtb
+++ b/components/policy/resources/policy_templates_lt.xtb
@@ -302,6 +302,11 @@
       Jei nustatymas nenurodytas, naudojama numatytoji vertė.
 
       Jei ši politika nenustatyta, naudojami numatytieji nustatymai.</translation>
+<translation id="1958138414749279167">Įgalinama „<ph name="PRODUCT_NAME" />“ automatinio pildymo funkcija ir naudotojams leidžiama automatiškai užpildyti žiniatinklio formas, naudojant anksčiau išsaugotą informaciją, pvz., adreso informaciją.
+
+      Jei šis nustatymas išjungtas, Automatinio pildymo funkcija niekada nesiūlys ir automatiškai nepildys adreso informacijos, taip pat neišsaugos papildomos adreso informacijos, kurią naudotojas gali pateikti naršydamas žiniatinklyje.
+
+      Jei šis nustatymas įgalintas arba vertė nenustatyta, naudotojas galės valdyti adreso informacijos Automatinio pildymo funkciją naudotojo sąsajoje.</translation>
 <translation id="1960840544413786116">Ar leidžiami sertifikatai, išduoti naudojant vietinius patikimus prieraišus, kuriuose nėra plėtinio „subjectAlternativeName“</translation>
 <translation id="1964634611280150550">Inkognito režimas neleidžiamas</translation>
 <translation id="1964802606569741174">Ši politika neturi įtakos „Android“ skirtai „YouTube“ programai. Jei turėtų būti taikomi „YouTube“ saugos nustatymai, „Android“ skirtos „YouTube“ programos diegimas turėtų būti neleidžiamas.</translation>
@@ -1942,6 +1947,7 @@
 <translation id="6440051664870270040">Leisti svetainėms vienu metu naršyti ir atidaryti iššokančiuosius langus</translation>
 <translation id="6447948611083700881">Atsarginis kopijavimas ir atkūrimas išjungtas</translation>
 <translation id="645425387487868471">Įgalinti „<ph name="PRODUCT_NAME" />“ priverstinį prisijungimą</translation>
+<translation id="6464074037294098618">Adresų automatinio pildymo funkcijos įgalinimas</translation>
 <translation id="6473623140202114570">Domenų, kuriuose Saugaus naršymo funkcija nesuaktyvins įspėjimų, sąrašo konfigūravimas.</translation>
 <translation id="6491139795995924304">Leisti „Bluetooth“ įrenginyje</translation>
 <translation id="6520802717075138474">Importuoti paieškos variklius iš numatytosios naršyklės paleidžiant pirmą kartą</translation>
diff --git a/components/policy/resources/policy_templates_lv.xtb b/components/policy/resources/policy_templates_lv.xtb
index 164fb30c..e1e491df6 100644
--- a/components/policy/resources/policy_templates_lv.xtb
+++ b/components/policy/resources/policy_templates_lv.xtb
@@ -301,6 +301,11 @@
 
       Ja iestatījums netiek norādīts, tiek izmantota noklusējuma vērtība.
       Ja šī politika vispār netiek iestatīta, visiem iestatījumiem tiek izmantotas noklusējuma vērtības.</translation>
+<translation id="1958138414749279167">Iespējo pārlūka <ph name="PRODUCT_NAME" /> funkciju Automātiskā aizpilde un ļauj lietotājiem automātiski aizpildīt adrešu informāciju tīmekļa veidlapās, izmantojot iepriekš saglabāto informāciju.
+
+      Ja šis iestatījums ir atspējots, funkcija Automātiskā aizpilde nekad nerādīs adrešu informācijas ieteikumus un neaizpildīs šo informāciju, kā arī nesaglabās papildu adrešu informāciju, ko lietotājs var norādīt, pārlūkojot tīmekli.
+
+      Ja šis iestatījums ir iespējots vai tā vērtība nav norādīta, lietotājs varēs kontrolēt adrešu informācijas automātisko aizpildi lietotāja saskarnē.</translation>
 <translation id="1960840544413786116">Nosaka, vai atļaut sertifikātus, kurus izsnieguši lokāli uzticamības enkuri un kuriem trūkst paplašinājuma subjectAlternativeName.</translation>
 <translation id="1964634611280150550">Inkognito režīms atspējots</translation>
 <translation id="1964802606569741174">Šī politika neietekmē Android lietotni YouTube. Ja lietotnē YouTube tiks aktivizēts drošais režīms, nedrīkst atļaut instalēt Android lietotni YouTube.</translation>
@@ -521,6 +526,11 @@
       Ja šis iestatījums nav iestatīts, lietotāji var izlemt, vai izmantot šo funkciju.
 
       Šis iestatījums ir noņemts pārlūkā <ph name="PRODUCT_NAME" /> 29 un jaunākās versijās.</translation>
+<translation id="2433412232489478893">Šī politika nosaka, vai lietotājam ir atļauta tīkla failu kopīgošanas funkcija lietošanai ar <ph name="PRODUCT_NAME" />.
+
+      Ja šī politika nav konfigurēta vai tai nav iestatīta vērtība “True”, lietotāji varēs izmantot tīkla failu kopīgošanas ierīces.
+
+      Ja šai politikai ir iestatīta vērtība “False”, lietotāji nevarēs izmantot tīkla failu kopīošanas ierīces.</translation>
 <translation id="2438609638493026652">Iespējo galveno notikumu ziņošanu Google serveriem Android lietotņu instalēšanas laikā. Notikumi tiek reģistrēti tikai lietotnēm, kuru instalēšana tika aktivizēta, izmantojot politiku.
 
       Ja politikai ir iestatīta vērtība “true”, notikumi tiks reģistrēti.
@@ -602,6 +612,7 @@
 <translation id="2598508021807251719">Konfigurē operētājsistēmas <ph name="PRODUCT_OS_NAME" /> attēlojuma lokalizācijas.
 
       Ja šī politika ir iestatīta, lietotājs var konfigurēt operētājsistēmas <ph name="PRODUCT_OS_NAME" /> attēlošanu vienā no šajā rakstā norādītajām lokalizācijām. Ja šī politika nav iestatīta vai tai ir iestatīts tukšs saraksts, operētājsistēma <ph name="PRODUCT_OS_NAME" /> var tikt attēlota visās atbalstītajās lietotāja saskarnes lokalizācijās. Ja politikai iestatītajā sarakstā ir nederīgas vērtības, tās tiks ignorētas. Ja lietotājs iepriekš konfigurēja operētājsistēmas <ph name="PRODUCT_OS_NAME" /> attēlošanu lokalizācijā, kas šajā politikā nav atļauta, nākamajā lietotāja pierakstīšanās reizē attēlojuma lokalizācija tiks mainīta uz politikā atļautu lietotāja saskarnes lokalizāciju. Ja lietotājs iepriekš konfigurēja vēlamās lokalizācijas un viena no vēlamajām lokalizācijām ir atļauta šajā politikā, operētājsistēmā <ph name="PRODUCT_OS_NAME" /> tiks izmantota attiecīgā lokalizācija. Ja vēlamā lokalizācija nav iestatīta, operētājsistēmā <ph name="PRODUCT_OS_NAME" /> tika izmantota pirmā derīgā politikā norādītā vērtība vai atkāpšanās lokalizācija (šobrīd “en-US”), ja politikā ir norādītas nederīgas vērtības.</translation>
+<translation id="2604182581880595781">Konfigurēt ar tīkla failu kopīgošanas ierīcēm saistīto politiku.</translation>
 <translation id="2623014935069176671">Gaidīt sākotnējo lietotāja darbību</translation>
 <translation id="262740370354162807">Iespējo dokumentu iesniegšanu pakalpojumā <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Nodrošina konfigurāciju uzņēmuma printeriem.
@@ -687,6 +698,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> klientu Windows reģistra vieta:</translation>
 <translation id="2824715612115726353">Iespējo inkognito režīmu</translation>
 <translation id="2838830882081735096">Aizliegt datu migrēšanu un ARC</translation>
+<translation id="2839294585867804686">Tīkla failu kopīgošanas ierīču iestatījumi</translation>
 <translation id="2840269525054388612">Norāda printerus, ko lietotājs var izmantot.
 
       Šī politika tiek izmantota tikai tad, ja parametram <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> ir izvēlēta vērtība <ph name="PRINTERS_WHITELIST" />.
@@ -1177,6 +1189,7 @@
       Ja šī politika nav iestatīta, uz vietrāžiem URL balstīta anonimizētu datu apkopošana ir iespējota, taču lietotājs to varēs mainīt.</translation>
 <translation id="4250680216510889253">Nē</translation>
 <translation id="4261820385751181068">Ierīces pierakstīšanās ekrāna lokalizācija</translation>
+<translation id="4264607809747169568">Kontrolē tīkla failu kopīgošanas ierīces ChromeOS pieejamībai</translation>
 <translation id="427220754384423013">Norāda printerus, ko lietotājs var izmantot.
 
       Šī politika tiek izmantota tikai tad, ja parametram <ph name="BULK_PRINTERS_ACCESS_MODE" /> ir izvēlēta vērtība <ph name="PRINTERS_WHITELIST" />.
@@ -1612,6 +1625,15 @@
       Politikas vērtība ir jānorāda milisekundēs.</translation>
 <translation id="5511702823008968136">Iespējo grāmatzīmju joslu</translation>
 <translation id="5512418063782665071">Sākumlapas URL</translation>
+<translation id="551639594034811656">Šī politika nosaka procentuālo daļu sarakstu, kas definēs daļu no <ph name="PRODUCT_OS_NAME" /> OV ierīcēm, kuras atjaunināt katru dienu, sākot no dienas, kad atjauninājums tiek atklāts. Atklāšanas laiks ir vēlāks par atjauninājuma publicēšanas laiku, jo pēc atjauninājuma publicēšanas var paiet laiks, līdz ierīce pārbauda atjauninājumus.
+
+      Katrs (diena, procentālā daļa) pāris satur informāciju par to, kāda pārvaldības procentuālā daļa ir jāatjaunina norādītajā dienu skaitā kopš atjauninājuma atklāšanas. Piemēram, ja ir pāri [(4, 40), (10, 70), (15, 100)], tad 40% no pārvaldības būtu jāatjaunina 4 dienas pēc atjaunināšanas. 70% jāatjaunina pēc 10 dienām utt.
+
+      Ja šai politikai ir noteikta vērtība, atjauninājumi ignorē <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> politiku un ievēro šo politiku.
+
+      Ja šis saraksts ir tukšs, izstādīšana netiks veikta, un jauninājumi tiks piemēroti saskaņā ar citu ierīču politiku.
+
+      Šī politika neattiecas uz kanālu slēdžiem.</translation>
 <translation id="5523812257194833591">Publiska sesija, kurā pēc aizkaves veikt automātisku pieteikšanos.
 
       Ja šī politika ir iestatīta, pēc tam, kad noteiktu laika periodu lietotājs pieteikšanās ekrānā nebūs veicis nekādas darbības, notiks automātiska pieteikšanās norādītajā sesijā. Publiskajai sesijai jau ir jābūt konfigurētai (skatiet politiku |DeviceLocalAccounts|).
@@ -1920,6 +1942,7 @@
 <translation id="6440051664870270040">Atļauja vietnēs vienlaicīgi izmantot navigāciju un atvērt uznirstošos logus</translation>
 <translation id="6447948611083700881">Dublēšana un atjaunošana ir atspējota</translation>
 <translation id="645425387487868471">Piespiedu pierakstīšanās iespējošana pārlūkā <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Automātiskās aizpildes iespējošana adresēm</translation>
 <translation id="6473623140202114570">Konfigurēt to domēnu sarakstu, kuros funkcija “Droša pārlūkošana” neaktivizē brīdinājumus.</translation>
 <translation id="6491139795995924304">Bluetooth atļaušana ierīcē</translation>
 <translation id="6520802717075138474">Meklētājprogrammu importēšana no noklusējuma pārlūka pirmajā palaišanas reizē</translation>
@@ -2538,6 +2561,11 @@
       Ja politika ir atspējota, neviena saite netiks izolēta un tiks atspējoti IsolateOrigins un SitePerProcess eksperimenti. Lietotāji joprojām varēs manuāli iespējot politiku SitePerProcess.
       Ja politika nav konfigurēta, lietotājs varēs mainīt šo iestatījumu.
       </translation>
+<translation id="7902255855035461275">Šajā sarakstā pieejamajiem šabloniem tiek meklēta atbilstība pieprasītā URL
+      drošības avotam. Ja tiek atrasta atbilstība, piekļuve video
+      ierakstīšanas ierīcēm tiek nodrošināta bez uzaicinājuma.
+
+      PIEZĪME. Līdz 45. versijai šī politika tika atbalstīta tikai kioska režīmā.</translation>
 <translation id="7912255076272890813">Atļauto lietotņu/paplašinājumu veidu konfigurēšana</translation>
 <translation id="7915236031252389808">Šeit varat norādīt starpniekservera .pac faila vietrādi URL.
 
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 5a25694..7be29ee 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -593,6 +593,11 @@
       ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ലോഗിൻ സ്‌ക്രീനിൽ നിലവിലുള്ള ഉപയോക്താക്കളെ കാണിക്കുകയില്ല. പബ്ലിക് സെഷൻ കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിൽ, സാധാരണ സൈൻ ഇൻ സ്‌ക്രീനോ (ഉപയോക്താവിനായി ഇമെയിൽ, പാസ്‌വേഡ് അല്ലെങ്കിൽ ഫോൺ നമ്പർ നിർദ്ദേശിക്കുന്നത്) SAML ഇന്റർസ്‌റ്റിറ്റിക്കൽ സ്‌ക്രീനോ (<ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" /> നയം മുഖേന പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിൽ) കാണിക്കും. പബ്ലിക് സെഷൻ കോൺഫിഗർ ചെയ്യുമ്പോൾ, പബ്ലിക് സെഷൻ അക്കൗണ്ടുകൾ മാത്രം കാണിക്കുകയും അവയിൽ നിന്ന് ഒന്ന് തിരഞ്ഞെടുക്കാൻ അനുവദിക്കുകയും ചെയ്യും.
 
       ശ്രദ്ധിക്കുക, ഉപകരണം ലോക്കൽ ഡാറ്റ സൂക്ഷിക്കുകയോ ഒഴിവാക്കുകയോ ചെയ്യുന്നതിനെ ഈ നയം ബാധിക്കുകയില്ല.</translation>
+<translation id="2433412232489478893"><ph name="PRODUCT_NAME" />-നുള്ള നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടൽ ഫീച്ചറുകൾ ഒരു ഉപയോക്താവിന് അനുവദിച്ചതാണോയെന്ന് ഈ നയം നിയന്ത്രിക്കുന്നു.
+
+      ഈ പോളിസി കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിൽ അല്ലെങ്കിൽ 'ട്രൂ' ആയി സജ്ജീകരിക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടൽ ഉപയോഗിക്കാനാവും.
+
+      ഈ പോളിസി, 'ഫാൾസ്' എന്ന് സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടൽ ഉപയോഗിക്കാനാവില്ല.</translation>
 <translation id="2438609638493026652">Google-ലേക്ക് Android ആപ്പ് ഇൻസ്‌റ്റാളേഷൻ നടക്കുമ്പോൾ കീ ഇവൻ്റുകൾ റിപ്പോർട്ട് ചെയ്യുന്നത് പ്രവർത്തനക്ഷമമാക്കുന്നു. നയം മുഖേന ഇൻസ്‌റ്റാളേഷൻ ട്രിഗർ ചെയ്‌ത ആപ്പുകൾക്ക് മാത്രമേ ഇവൻ്റുകൾ ക്യാപ്ചർ ചെയ്യുകയുള്ളൂ.
 
       നയം ശരിയെന്ന് സജ്ജീകരിക്കുകയാണെങ്കിൽ, ഇവൻ്റുകൾ ലോഗ് ചെയ്യപ്പെടും.
@@ -678,6 +683,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിച്ചേക്കാവുന്ന ഭാഷകൾ കോൺഫിഗർ ചെയ്യുന്നു.
 
       ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഈ നയത്തിൽ വ്യക്തമാക്കിയിട്ടുള്ള ഏതെങ്കിലും ഒരു ഭാഷയിൽ മാത്രം <ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിക്കാൻ കോൺഫിഗർ ചെയ്യാനേ ഉപയോക്താവിന് കഴിയൂ. ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ ഒരു ശൂന്യമായ ലിസ്‌റ്റിലേക്കാണ് സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിലോ, പിന്തുണയ്ക്കുന്ന എല്ലാ UI ഭാഷകളിലും <ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിക്കാനാവും. അസാധുവായ മൂല്യങ്ങളുള്ള ഒരു ലിസ്‌റ്റിലേക്കാണ് ഈ നയം സജ്ജീകരിച്ചിരിക്കുന്നതെങ്കിൽ, അസാധുവായ എല്ലാ മൂല്യങ്ങളും അവഗണിക്കപ്പെടും. ഈ നയമനുസരിച്ച് അനുവദനീയമല്ലാത്ത ഒരു ഭാഷയിൽ <ph name="PRODUCT_OS_NAME" /> പ്രദർശിപ്പിക്കാൻ ഒരു ഉപയോക്താവ് മുമ്പ് കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവ് അടുത്ത തവണ സൈൻ ഇൻ ചെയ്യുമ്പോൾ പ്രദർശിപ്പിക്കുന്ന ഭാഷ ഒരു അനുവദനീയ UI ഭാഷയിലേക്ക് മാറും. ഉപയോക്താവ് തിരഞ്ഞെടുത്ത ഭാഷകൾ കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടായിരുന്നെങ്കിൽ, അവയിൽ ഒന്ന് ഈ നയപ്രകാരം അനുവദനീയമാണെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ഈ ഭാഷയിലേക്ക് മാറും. അല്ലെങ്കിൽ, ഈ നയത്തിൽ അസാധുവായ എൻട്രികൾ മാത്രമാണുള്ളതെങ്കിൽ, ഈ നയപ്രകാരം വ്യക്തമാക്കിയിട്ടുള്ള ആദ്യ സാധുവായ മൂല്യത്തിലേക്കോ ഒരു ഫാൾബാക്ക് ഭാഷയിലേക്കോ (നിലവിൽ യുഎസ്-ഇംഗ്ലീഷ്) <ph name="PRODUCT_OS_NAME" /> മാറും.</translation>
+<translation id="2604182581880595781">നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടലിന് സമാനമായ നയങ്ങൾ കോൺഫിഗർ ചെയ്യുക.</translation>
 <translation id="2623014935069176671">പ്രാരംഭ ഉപയോക്തൃ പ്രവർത്തനത്തിനായി കാത്തിരിക്കുക</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> എന്നതിലേക്കുള്ള പ്രമാണങ്ങളുടെ സമർപ്പണം പ്രാപ്‌തമാക്കുക</translation>
 <translation id="2627554163382448569">എന്‍റർപ്രൈസ് പ്രിന്‍ററുകൾക്ക് കോൺഫിഗറേഷനുകൾ നൽകുന്നു.
@@ -768,6 +774,7 @@
 
           നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ. പരമാവധി ദൈർഘ്യം നടപ്പിലാവുകയില്ല.</translation>
 <translation id="2838830882081735096">ഡാറ്റ മൈഗ്രേഷനും ARC-യും അനുവദിക്കതിരിക്കുക</translation>
+<translation id="2839294585867804686">നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടൽ ക്രമീകരണം</translation>
 <translation id="2840269525054388612">ഒരു ഉപയോക്താവിന് ഉപയോഗിക്കാൻ കഴിയുന്ന പ്രിന്‍ററുകളെ ഇത് വ്യക്തമാക്കുന്നു.
 
       <ph name="DEVICE_PRINTERS_ACCESS_MODE" />-നായി <ph name="PRINTERS_WHITELIST" /> തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കപ്പെടുകയുള്ളൂ
@@ -1341,6 +1348,7 @@
       ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ, URL കീ ഉപയോഗിച്ച് അജ്ഞാതമാക്കിയ ഡാറ്റ ശേഖരണം പ്രവർത്തനക്ഷമമാകുമെങ്കിലും ഉപയോക്താവിന് അത് മാറ്റാനാവും.</translation>
 <translation id="4250680216510889253">ഇല്ല</translation>
 <translation id="4261820385751181068">ഉപകരണ സൈൻ ഇൻ സ്‌ക്രീൻ ഭാഷ</translation>
+<translation id="4264607809747169568">ChromeOS ലഭ്യതയ്ക്കായി നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടൽ നിയന്ത്രിക്കുന്നു</translation>
 <translation id="427220754384423013">ഒരു ഉപയോക്താവിന് ഉപയോഗിക്കാൻ കഴിയുന്ന പ്രിന്‍ററുകളെ ഇത് വ്യക്തമാക്കുന്നു.
 
       <ph name="BULK_PRINTERS_ACCESS_MODE" />-നായി <ph name="PRINTERS_WHITELIST" /> തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കപ്പെടുകയുള്ളൂ.
@@ -1830,6 +1838,15 @@
       നയത്തിന്റെ മൂല്യം മില്ലിസെക്കന്റിൽ വ്യക്തമാക്കേണ്ടതാണ്.</translation>
 <translation id="5511702823008968136">ബുക്ക്‌മാര്‍ക്ക് ബാര്‍ പ്രാപ്തമാക്കുക</translation>
 <translation id="5512418063782665071">ഹോം  പേജ്  URL</translation>
+<translation id="551639594034811656">അപ്ഡേറ്റ് ആദ്യം കണ്ടെത്തിയ ദിവസം മുതലുള്ള ഓരോ ആഴ്ചയിലും അപ്ഡേറ്റ് ചെയ്യാനുള്ള, OU-വിലെ <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങളുടെ ഒരു ഭാഗത്തെ നിർവചിക്കുന്ന ശതമാനങ്ങളുടെ ഒരു ലിസ്‌റ്റിനെ ഈ നയം നിർവചിക്കുന്നു. അപ്ഡേറ്റ് പ്രസിദ്ധീകരിച്ച് അൽപ്പസമയത്തിന് ശേഷമാവും ഉപകരണം അപ്ഡേറ്റുകൾക്കായി പരിശോധിക്കുക എന്നതിനാൽ, അപ്ഡേറ്റ് കണ്ടെത്തിയ സമയം അത് പ്രസിദ്ധീകരിച്ചതിന് ശേഷമുള്ളതായിരിക്കും.
+
+      അപ്ഡേറ്റ് കണ്ടെത്തിയ സമയം മുതൽ നിശ്ചിത ദിവസങ്ങൾ, ഫ്ലീറ്റിന്റെ എത്ര ശതമാനം അപ്ഡേറ്റ് ചെയ്യേണ്ടതുണ്ട് എന്ന് ഓരോ (ദിവസം, ശതമാനം) ജോടിയിലും ഉണ്ട്. ഉദാഹരണത്തിന്, നമുക്ക് [(4, 40), (10, 70), (15, 100)] എന്നീ ജോടികൾ ഉണ്ടെങ്കിൽ, ഫ്ലീറ്റിന്റെ 40%, അപ്ഡേറ്റ് കണ്ടതിന് ശേഷം 4 ദിവസം അപ്ഡേറ്റ് ചെയ്‌തിരിക്കും. 10 ദിവസത്തിന് ശേഷം 70% അപ്ഡേറ്റ് ചെയ്യും, ഇത് ഇങ്ങനെ തുടരും.
+
+      ഈ നയത്തിനായി ഒരു മൂല്യം നിർവചിച്ചിട്ടുണ്ടെങ്കിൽ, അപ്‌ഡേറ്റുകൾ, <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> എന്ന നയം അവഗണിക്കുകയും പകരം ഈ നയം പിന്തുടരുകയും ചെയ്യും.
+
+      ഈ ലിസ്‌റ്റ് ശൂന്യമാണെങ്കിൽ, സ്‌റ്റേജിംഗ് ഉണ്ടാവില്ല, മറ്റ് ഉപകരണ നയങ്ങൾ അനുസരിച്ച് അപ്‌ഡേറ്റുകൾ ബാധകമാക്കുകയും ചെയ്യും.
+
+      ചാനൽ സ്വിച്ചുകൾക്ക് ഈ നയം ബാധകമാവില്ല.</translation>
 <translation id="5523812257194833591">ഒരു കാലതാമസത്തിന് ശേഷം യാന്ത്രിക-ലോഗിൻ ചെയ്യുന്നതിനുള്ള എല്ലാവർക്കുമുള്ള സെഷൻ.
 
       ഈ നയം സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ, ലോഗിൻ സ്‌ക്രീനിൽ ഉപയോക്തൃ ഇടപെടൽ ഇല്ലാത്ത സമയം കഴിഞ്ഞ ശേഷം നിർദ്ദിഷ്‌ട സെഷൻ സ്വയമേവ ലോഗിൻ ചെയ്യപ്പെടും. എല്ലാവർക്കുമുള്ള സെഷൻ ഇതിനകം കോൺഫിഗർ ചെയ്‌തിരിക്കണം (|DeviceLocalAccounts| കാണുക).
@@ -2832,6 +2849,11 @@
       ഈ നയം പ്രവർത്തനരഹിതം ആക്കുകയാണെങ്കിൽ, സ്‌പഷ്‌ടമായ സൈറ്റ് ഐസൊലേഷൻ സംഭവിക്കുകയില്ല, ഒപ്പം  IsolateOrigins, SitePerProcess എന്നിവയുടെ ഫീൽഡ് ട്രയലുകൾ പ്രവർത്തനരഹിതമാക്കപ്പെടുകയും ചെയ്യും. ഉപയോക്താക്കൾക്ക് തുടർന്നും SitePerProcess നേരിട്ട് പ്രവർത്തനക്ഷമമാക്കാനാവും.
       ഈ നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന് ഈ ക്രമീകരണം മാറ്റാനാവും.
       </translation>
+<translation id="7902255855035461275">ഈ ലിസ്‌റ്റിലെ പാറ്റേണുകൾ, അഭ്യർത്ഥിക്കുന്ന URL-ന്റെ സുരക്ഷാ ഉറവിടവുമായി
+      പൊരുത്തപ്പെടും. ഒരു പൊരുത്തം കണ്ടെത്തിയാൽ ആവശ്യപ്പെടാതെ തന്നെ
+      ഓഡിയോ ക്യാപ്‌ചർ ഉപകരണത്തിലേക്ക് ആക്‌സസ് അനുവദിക്കും.
+
+      ശ്രദ്ധിക്കുക: 45 പതിപ്പ് വരെ, ഈ നയം കിയോസ്‌ക് മോഡിൽ മാത്രം പിന്തുണയ്‌ക്കുന്നു.</translation>
 <translation id="7912255076272890813">അനുവദിച്ച അപ്ലിക്കേഷൻ/വിപുലീകരണ തരങ്ങൾ കോൺഫിഗർ ചെയ്യുക</translation>
 <translation id="7915236031252389808">നിങ്ങൾക്ക് ഒരു പ്രോക്‌സി .pac ഫയലിലേക്കുള്ള URL ഇവിടെ വ്യക്തമാക്കാനാകും.
 
diff --git a/components/policy/resources/policy_templates_ms.xtb b/components/policy/resources/policy_templates_ms.xtb
index e2466d2..d374e7f 100644
--- a/components/policy/resources/policy_templates_ms.xtb
+++ b/components/policy/resources/policy_templates_ms.xtb
@@ -525,6 +525,11 @@
       Jika tetapan ini dibiarkan tanpa ditetapkan, pengguna boleh memutuskan untuk menggunakan fungsi ini atau tidak.
 
       Tetapan ini telah dialih keluar daripada <ph name="PRODUCT_NAME" /> 29 dan versi yang lebih tinggi.</translation>
+<translation id="2433412232489478893">Dasar ini mengawal sama ada ciri Perkongsian Fail Rangkaian <ph name="PRODUCT_NAME" /> dibenarkan untuk pengguna.
+
+      Apabila dasar ini tidak dikonfigurasi atau ditetapkan kepada Benar, pengguna akan dapat menggunakan Perkongsian Fail Rangkaian.
+
+      Apabila dasar ini ditetapkan kepada Palsu, pengguna tidak akan dapat menggunakan Perkongsian Fail Rangkaian.</translation>
 <translation id="2438609638493026652">Mendayakan pelaporan acara penting semasa pemasangan apl Android pada Google. Acara dirakam hanya untuk apl yang dimulakan pemasangannya melalui dasar.
 
       Jika dasar ditetapkan kepada benar, acara akan dilog.
@@ -606,6 +611,7 @@
 <translation id="2598508021807251719">Mengkonfigurasi tempat peristiwa yang digunakan <ph name="PRODUCT_OS_NAME" /> dalam paparan.
 
       Jika dasar ini ditetapkan, pengguna hanya boleh mengkonfigurasi <ph name="PRODUCT_OS_NAME" /> supaya dipaparkan dalam salah satu tempat peristiwa yang dinyatakan oleh dasar ini. Jika dasar ini tidak ditetapkan atau ditetapkan kepada senarai kosong, <ph name="PRODUCT_OS_NAME" /> boleh dipaparkan dalam semua tempat peristiwa UI yang disokong. Jika dasar ini ditetapkan kepada senarai dengan nilai yang tidak sah, semua nilai tidak sah akan diabaikan. Jika sebelum ini pengguna telah mengkonfigurasi <ph name="PRODUCT_OS_NAME" /> supaya dipaparkan dalam tempat peristiwa yang tidak dibenarkan oleh dasar ini, tempat peristiwa paparan akan ditukar kepada tempat peristiwa UI yang dibenarkan apabila pengguna log masuk selepas ini. Jika pengguna telah mengkonfigurasi tempat peristiwa pilihan dan salah satu tempat peristiwa pilihan itu dibenarkan oleh dasar ini, <ph name="PRODUCT_OS_NAME" /> akan beralih kepada tempat peristiwa ini. Jika tidak, <ph name="PRODUCT_OS_NAME" /> akan beralih kepada nilai sah pertama yang dinyatakan oleh dasar ini atau kepada tempat peristiwa sebelumnya (pada masa ini en-US), jika dasar ini hanya mengandungi masukan yang tidak sah.</translation>
+<translation id="2604182581880595781">Konfigurasikan dasar yang berkaitan dengan Perkongsian Fail Rangkaian.</translation>
 <translation id="2623014935069176671">Tunggu aktiviti pengguna awal</translation>
 <translation id="262740370354162807">Dayakan penyerahan dokumen pada <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Menyediakan konfigurasi untuk pencetak perusahaan.
@@ -689,6 +695,7 @@
 <translation id="2823870601012066791">Lokasi pendaftaran Windows untuk pelanggan <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Dayakan mod Inkognito</translation>
 <translation id="2838830882081735096">Tidak membenarkan penghijrahan data dan ARC</translation>
+<translation id="2839294585867804686">Tetapan Perkongsian Fail Rangkaian</translation>
 <translation id="2840269525054388612">Menentukan pencetak yang boleh digunakan oleh pengguna.
 
       Dasar ini hanya digunakan jika <ph name="PRINTERS_WHITELIST" /> dipilih untuk <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1185,6 +1192,7 @@
       Jika dasar ini dibiarkan tanpa ditetapkan, pengumpulan data awanama termasuk URL akan didayakan, tetapi pengguna akan dapat menukarnya.</translation>
 <translation id="4250680216510889253">Tidak</translation>
 <translation id="4261820385751181068">Tempat peristiwa skrin log masuk peranti</translation>
+<translation id="4264607809747169568">Mengawal Perkongsian Fail Rangkaian untuk ketersediaan OS Chrome</translation>
 <translation id="427220754384423013">Menentukan pencetak yang boleh digunakan oleh pengguna.
 
       Dasar ini hanya digunakan jika <ph name="PRINTERS_WHITELIST" /> dipilih untuk <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1614,6 +1622,15 @@
       Nilai dasar ini harus ditetapkan dalam milisaat.</translation>
 <translation id="5511702823008968136">Dayakan Bar Penanda Halaman</translation>
 <translation id="5512418063782665071">URL halaman utama</translation>
+<translation id="551639594034811656">Dasar ini mentakrifkan senarai peratusan yang akan menentukan pecahan peranti <ph name="PRODUCT_OS_NAME" /> dalam OU yang akan dikemas kini setiap minggu bermula dari hari kemas kini itu mula-mula ditemui. Masa penemuan adalah lebih kemudian daripada masa kemas kini diterbitkan memandangkan peranti menyemak kemas kini beberapa ketika selepas kemas kini itu diterbitkan.
+
+      Setiap pasangan (hari, peratusan) mengandungi peratusan himpunan yang perlu dikemas kini mengikut bilangan hari yang dinyatakan sejak kemas kini ditemui. Contohnya, jika kami mempunyai pasangan [(4, 40), (10, 70), (15, 100)], maka 40% daripada himpunan seharusnya telah dikemas kini 4 hari selepas kemas kini ditemui. 70% harus dikemas kini selepas 10 hari dan begitulah seterusnya.
+
+      Jika terdapat nilai yang ditakrifkan untuk dasar ini, kemas kini akan mengabaikan dasar <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> dan mematuhi dasar ini.
+
+      Jika senarai ini kosong, tidak akan ada pemeringkatan dan kemas kini akan dibuat mengikut dasar peranti lain.
+
+      Penukaran saluran tidak tertakluk pada dasar ini.</translation>
 <translation id="5523812257194833591">Sesi terbuka untuk log masuk automatik selepas kelewatan.
 
       Jika dasar ini ditetapkan, sesi yang dinyatakan akan log masuk secara automatik selepas berlalunya suatu tempoh pada skrin log masuk tanpa interaksi pengguna. Sesi terbuka hendaklah telah dikonfigurasi (lihat |DeviceLocalAccounts|).
@@ -2546,6 +2563,11 @@
       Jika dasar ini dilumpuhkan, tiada Pengasingan Tapak eksplisit akan berlaku dan percubaan medan IsolateOrigins dan SitePerProcess akan dilumpuhkan. Pengguna masih dapat mendayakan SitePerProcess secara manual.
       Jika dasar ini tidak dikonfiguraskan, pengguna akan dapat mengubah tetapan ini.
       </translation>
+<translation id="7902255855035461275">Pola dalam senarai ini akan dipadankan dengan keselamatan
+      asal URL yang meminta.  Jika padanan ditemui, akses kepada peranti
+      yang merakam video akan diberi tanpa gesaan.
+
+      NOTA: Dasar ini hanya disokong dalam mod Kios sehingga versi 45.</translation>
 <translation id="7912255076272890813">Konfigurasi jenis apl/sambungan yang dibenarkan</translation>
 <translation id="7915236031252389808">Anda boleh menetapkan URL untuk fail .pac proksi di sini.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 24f2f80..34b38a99 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -510,6 +510,11 @@
       Als je deze instelling niet instelt, kan de gebruiker bepalen of de functie wordt gebruikt.
 
       Deze instelling is verwijderd uit <ph name="PRODUCT_NAME" /> 29 en hogere versies.</translation>
+<translation id="2433412232489478893">Dit beleid bepaalt of de functie Network File Shares voor <ph name="PRODUCT_NAME" /> is toegestaan voor een gebruiker.
+
+      Wanneer dit beleid niet is geconfigureerd of is ingesteld op 'true' (waar), kunnen gebruikers Network File Shares gebruiken.
+
+      Wanneer dit beleid is ingesteld op 'false' (onwaar), kunnen gebruikers Network File Shares niet gebruiken.</translation>
 <translation id="2438609638493026652">Hiermee schakel je de rapportage aan Google in van belangrijke gebeurtenissen tijdens de installatie van Android-apps. Gebeurtenissen worden alleen geregistreerd voor apps waarvan de installatie via beleid is geactiveerd.
 
       Als het beleid is ingesteld op True (Waar), worden gebeurtenissen geregistreerd.
@@ -591,6 +596,7 @@
 <translation id="2598508021807251719">Hiermee wordt ingesteld in welke talen <ph name="PRODUCT_OS_NAME" /> kan worden weergegeven.
 
       Als dit beleid is ingesteld, kan de gebruiker alleen instellen dat <ph name="PRODUCT_OS_NAME" /> wordt weergegeven in een van de talen die is opgenomen in dit beleid. Als dit beleid niet is ingesteld of op een lege lijst is ingesteld, kan <ph name="PRODUCT_OS_NAME" /> worden weergegeven in alle ondersteunde weergavetalen. Als dit beleid is ingesteld op een lijst met ongeldige waarden, worden alle ongeldige waarden genegeerd. Als een gebruiker eerder had ingesteld dat <ph name="PRODUCT_OS_NAME" /> wordt weergegeven in een bepaalde taal die niet is toegestaan door dit beleid, wordt de weergavetaal de volgende keer dat de gebruiker inlogt, ingesteld op een taal die wel is toegestaan. Als de gebruiker voorkeurstalen had ingesteld en een van de voorkeurstalen is toegestaan door dit beleid, schakelt <ph name="PRODUCT_OS_NAME" /> over naar deze taal. Als de gebruiker geen voorkeurstalen had ingesteld, schakelt <ph name="PRODUCT_OS_NAME" /> over naar de eerste geldige waarde die door het beleid is bepaald, of anders naar de standaardtaal (momenteel en-US) als het beleid alleen ongeldige talen bevat.</translation>
+<translation id="2604182581880595781">Beleid met betrekking tot Network File Shares configureren.</translation>
 <translation id="2623014935069176671">Wachten op initiële gebruikersactiviteit</translation>
 <translation id="262740370354162807">Verzenden van documenten naar <ph name="CLOUD_PRINT_NAME" /> inschakelen</translation>
 <translation id="2627554163382448569">Hiermee worden configuraties geleverd voor zakelijke printers.
@@ -676,6 +682,7 @@
 <translation id="2823870601012066791">Locatie van Windows-register voor <ph name="PRODUCT_OS_NAME" />-clients:</translation>
 <translation id="2824715612115726353">Incognitomodus inschakelen</translation>
 <translation id="2838830882081735096">Gegevensmigratie en ARC niet toestaan</translation>
+<translation id="2839294585867804686">Instellingen voor Network File Shares</translation>
 <translation id="2840269525054388612">Hiermee worden de printers gespecificeerd die een gebruiker kan gebruiken.
 
       Dit beleid wordt alleen gebruikt als <ph name="PRINTERS_WHITELIST" /> is gekozen voor <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1172,6 +1179,7 @@
       Als dit beleid niet wordt ingesteld, worden aan URL's gekoppelde, geanonimiseerde gegevens verzameld, maar kan de gebruiker dit wijzigen.</translation>
 <translation id="4250680216510889253">Nee</translation>
 <translation id="4261820385751181068">Taal voor inlogscherm van apparaat</translation>
+<translation id="4264607809747169568">Beheert Network File Shares voor Chrome OS-beschikbaarheid</translation>
 <translation id="427220754384423013">Hiermee worden de printers gespecificeerd die een gebruiker kan gebruiken.
 
       Dit beleid wordt alleen gebruikt als <ph name="PRINTERS_WHITELIST" /> is gekozen voor <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1600,6 +1608,15 @@
       De beleidswaarde moet worden opgegeven in milliseconden.</translation>
 <translation id="5511702823008968136">Bladwijzerbalk inschakelen</translation>
 <translation id="5512418063782665071">URL van homepage</translation>
+<translation id="551639594034811656">Dit beleid definieert een lijst van percentages. Deze percentages bepalen welk deel van <ph name="PRODUCT_OS_NAME" />-apparaten in de OE per week moet worden geüpdatet vanaf de dag waarop de update voor het eerst wordt ontdekt. De update wordt later ontdekt dan deze wordt gepubliceerd, aangezien het even kan duren voordat het apparaat controleert op updates.
+
+      Elk (dag, percentage)-paar geeft aan welk percentage van de apparaten moet worden geüpdatet binnen het opgegeven aantal dagen nadat de update is ontdekt. Als we bijvoorbeeld de paren [(4, 40), (10, 70), (15, 100)] hebben, moet 40% van de apparaten zijn geüpdatet binnen vier dagen nadat de update is ontdekt. 70% moet na tien dagen zijn geüpdatet, enzovoort.
+
+      Als er voor dit beleid een waarde is ingesteld, negeren updates het beleid <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> en wordt in plaats daarvan dit beleid gevolgd.
+
+      Als deze lijst leeg is, vindt het updaten niet gefaseerd plaats en worden updates toegepast volgens ander apparaatbeleid.
+
+      Dit beleid is niet van toepassing op kanaalwisselingen.</translation>
 <translation id="5523812257194833591">Een openbare sessie om automatisch in te loggen na een vertraging.
 
       Als dit beleid is ingesteld, wordt de opgegeven sessie automatisch ingelogd na een tijdsperiode zonder gebruikersinteractie op het inlogscherm is verstreken. De openbare sessie moet al zijn geconfigureerd (zie |DeviceLocalAccounts|).
@@ -2523,6 +2540,9 @@
       Als het beleid is uitgeschakeld, vindt er geen expliciete site-isolatie plaats en worden praktijktests van IsolateOrigins en SitePerProcess uitgeschakeld. Gebruikers kunnen SitePerProcess nog steeds handmatig inschakelen.
       Als het beleid niet is geconfigureerd, kan de gebruiker deze instelling wijzigen.
       </translation>
+<translation id="7902255855035461275">Patronen in deze lijst worden vergeleken met de beveiligingsoorsprong van de aanvragende URL. Als een overeenkomst wordt gevonden, wordt toegang tot apparaten voor het vastleggen van video zonder prompt toegestaan.
+
+      OPMERKING: Tot versie 45 werd dit beleid alleen ondersteund in de kioskmodus.</translation>
 <translation id="7912255076272890813">Toegestane typen apps/extensies configureren</translation>
 <translation id="7915236031252389808">Je kunt hier een URL naar een PAC-bestand voor de proxy opgeven.
 
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index a8907f389..052817ce 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -518,6 +518,11 @@
       Hvis denne innstillingen ikke angis, kan brukere bestemme om de vil bruke den eller ikke.
 
       Denne innstillingen er fjernet fra <ph name="PRODUCT_NAME" /> 29 og nyere versjoner.</translation>
+<translation id="2433412232489478893">Denne retningslinjen kontrollerer om delte nettverksressurser-funksjonen for <ph name="PRODUCT_NAME" /> er tillatt for en bruker.
+   
+      Hvis denne retningslinjen ikke er konfigurert eller satt til Sann, vil brukeren ha mulighet til å bruke delte nettverksressurser.
+
+      Hvis denne retningslinjen er satt til Usann, vil ikke brukere ha mulighet til å bruke delte nettverksressurser.</translation>
 <translation id="2438609638493026652">Slår på rapportering av viktige hendelser under Android-appinstallasjoner til Google. Hendelser registreres bare for apper som ble installert på grunn av en regel.
 
       Hvis regelen er satt til «True» (sann), blir hendelser loggført.
@@ -599,6 +604,7 @@
 <translation id="2598508021807251719">Konfigurerer hvilke lokaliteter <ph name="PRODUCT_OS_NAME" /> kan vises i.
 
       Hvis denne regelen er angitt, kan brukeren bare konfigurere <ph name="PRODUCT_OS_NAME" /> til å vises i en av lokalitetene som er angitt av denne regelen. Hvis regelen ikke er angitt eller er angitt med en tom liste, kan <ph name="PRODUCT_OS_NAME" /> vises i alle UI-lokalitetene som støttes. Hvis regelen er angitt med en liste med ugyldige verdier, ignoreres alle de ugyldige verdiene. Hvis en bruker tidligere konfigurerte <ph name="PRODUCT_OS_NAME" /> til å bli vist på en lokalitet som ikke tillates av denne regelen, byttes den viste lokaliteten til en tillatt UI-lokalitet neste gang brukeren logger på. Hvis brukeren har konfigurert foretrukne lokaliteter og en av de foretrukne lokalitetene tillates av denne regelen, bytter <ph name="PRODUCT_OS_NAME" /> til denne lokaliteten. Ellers bytter <ph name="PRODUCT_OS_NAME" /> til den første gyldige verdien angitt av denne regelen eller til en reservelokalitet (en-US) hvis denne regelen bare inneholder ugyldige oppføringer.</translation>
+<translation id="2604182581880595781">Konfigurer delte nettverksresurser relatert til retningslinjene.</translation>
 <translation id="2623014935069176671">Vent på første brukeraktivitet</translation>
 <translation id="262740370354162807">Aktiver sending av dokumenter til <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Gir konfigurasjoner for bedriftsskrivere.
@@ -682,6 +688,7 @@
 <translation id="2823870601012066791">Plasseringen av Windows-registeret for <ph name="PRODUCT_OS_NAME" />-klienter:</translation>
 <translation id="2824715612115726353">Aktiver inkognitomodus</translation>
 <translation id="2838830882081735096">Ikke tillat dataoverføring og ARC</translation>
+<translation id="2839294585867804686">Innstillinger for delte nettverksressurser</translation>
 <translation id="2840269525054388612">Angir skriverne som en bruker kan bruke.
 
       Denne regelen brukes bare hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1168,6 +1175,7 @@
       Hvis denne retningslinjen ikke angis, vil anonymisert datainnsamling med nettadressenøkkel være aktivert, men brukeren kan endre på det.</translation>
 <translation id="4250680216510889253">Nei</translation>
 <translation id="4261820385751181068">Lokalitet for påloggingsskjermen på enheten</translation>
+<translation id="4264607809747169568">Kontroller tilgjengeligheten til delte nettverksressurser for ChromeOS</translation>
 <translation id="427220754384423013">Angir skriverne som en bruker kan bruke.
 
       Denne regelen brukes bare hvis <ph name="PRINTERS_WHITELIST" /> er valgt for <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1594,6 +1602,15 @@
       Retningslinjeverdien må spesifiseres i millisekunder.</translation>
 <translation id="5511702823008968136">Aktiver bokmerkerad</translation>
 <translation id="5512418063782665071">Nettadresse for startside</translation>
+<translation id="551639594034811656">Denne retningslinjen definerer en liste med prosenter som definerer hvor stor andel av <ph name="PRODUCT_OS_NAME" />-enheter i OU som må oppdateres per dag, starter fra den dagen oppdateringen ble oppdaget. Oppdagelsestidspunktet er senere enn tidspunktet for utgivelsen av oppdateringen, siden det kan ta litt tid før enheten sjekker etter oppdateringen.
+
+      Hver (dag, prosent)-par inneholder hvilken prosent av systemet som må oppdateres innen det angitte antall dager etter oppdagelsen av oppdateringen. For eksempel, hvis vi har parene [(4, 40), (10, 70), (15, 100)], må 40% av systemene bli oppdatert innen 4 dager etter oppdagelsen av oppdateringen. 70% må være ferdig etter 10 dag, osv.
+
+      Hvis det ikke er angitt en verdi for denne retningslinjen, vil oppdateringene ignorere <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />-retningslinjen og følge denne retningslinjen istedet.
+
+      Hvis denne listen er tom, vil det ikke gjennomføres noen fase og oppdateringene vil installeres i henhold til andre enhetsinnstillinger.
+
+     Denne retningslinjen gjelder ikke for kanalbrytere.</translation>
 <translation id="5523812257194833591">Automatisk pålogging til offentlig økt etter en gitt tid.
 
       Hvis denne innstillingen angis, skjer det en automatisk pålogging etter en gitt periode av brukerinaktivitet. Den offentlige økten må allerede være konfigurert (se |DeviceLocalAccounts|).
@@ -2528,6 +2545,11 @@
       Hvis regelen er deaktivert, er det ingen nettstedsisolering, og feltprøver for IsolateOrigins og SitePerProcess deaktiveres. Brukerne kan fortsatt aktivere SitePerProcess manuelt.
       Hvis regelen ikke er konfigurert, kan brukerne endre denne innstillingen.
       </translation>
+<translation id="7902255855035461275">Mønstrene i denne listen sammenlignes med sikkerhetskilden
+      til nettadressen forespørselen kommer fra. Hvis det finnes samsvar, blir 
+      tilgang til videoopptaksenheter gitt uten forespørsel på forhånd.
+
+      MERK: Frem til versjon 45 ble denne regelen bare støttet i kioskmodus.</translation>
 <translation id="7912255076272890813">Konfigurer tillatte typer apper og utvidelser</translation>
 <translation id="7915236031252389808">Du kan angi nettadressen til en .pac-fil for en proxy-tjener her.
 
diff --git a/components/policy/resources/policy_templates_pl.xtb b/components/policy/resources/policy_templates_pl.xtb
index df4f368..74fab1d 100644
--- a/components/policy/resources/policy_templates_pl.xtb
+++ b/components/policy/resources/policy_templates_pl.xtb
@@ -510,6 +510,11 @@
       Jeśli pozostanie ono nieokreślone, użytkownik będzie mógł zdecydować, czy chce używać tej funkcji.
 
       Ustawienie zostało usunięte z <ph name="PRODUCT_NAME" /> 29 i nowszych wersji.</translation>
+<translation id="2433412232489478893">Ta zasada określa, czy użytkownicy mogą używać Sieciowych udziałów plików w <ph name="PRODUCT_NAME" />.
+
+      Gdy ta zasada jest nieskonfigurowana lub ma wartość prawda, użytkownicy mogą używać Sieciowych udziałów plików.
+
+      Gdy ta zasada ma wartość fałsz, użytkownicy nie mogą używać Sieciowych udziałów plików.</translation>
 <translation id="2438609638493026652">Włącza raportowanie do Google najważniejszych zdarzeń podczas instalowania aplikacji na Androida. Zdarzenia są rejestrowane tylko w przypadku aplikacji, których instalacja została spowodowana przez zasadę.
 
       Jeśli zasada ma wartość prawda, zdarzenia będą rejestrowane.
@@ -587,6 +592,7 @@
 <translation id="2598508021807251719">Określa języki, w których można wyświetlać <ph name="PRODUCT_OS_NAME" />.
 
       Jeśli ta zasada jest skonfigurowana, użytkownik może skonfigurować wyświetlanie <ph name="PRODUCT_OS_NAME" /> tylko w jednym z języków określonych w tej zasadzie. Jeśli zasada jest nieskonfigurowana lub jest ustawiona na pustą listę, <ph name="PRODUCT_OS_NAME" /> można wyświetlać we wszystkich obsługiwanych językach. Jeśli ustawiona lista zawiera nieprawidłowe wartości, będą one ignorowane. Jeśli użytkownik wcześniej skonfigurował wyświetlanie <ph name="PRODUCT_OS_NAME" /> w języku niedozwolonym przez tę zasadę, język wyświetlania zostanie przełączony na dozwolony po następnym zalogowaniu się użytkownika. Jeśli użytkownik skonfigurował preferowane języki i jeden z nich jest dozwolony przez tę zasadę, <ph name="PRODUCT_OS_NAME" /> przełączy się na ten język. W przeciwnym razie <ph name="PRODUCT_OS_NAME" /> przełączy się na język odpowiadający pierwszej prawidłowej wartości z listy, a jeśli lista zawiera same nieprawidłowe wartości – na język zastępczy (obecnie en-US).</translation>
+<translation id="2604182581880595781">Umożliwia skonfigurowanie zasad związanych z Sieciowymi udziałami plików.</translation>
 <translation id="2623014935069176671">Poczekaj na początkową aktywność użytkownika</translation>
 <translation id="262740370354162807">Włącz wysyłanie dokumentów do <ph name="CLOUD_PRINT_NAME" />.</translation>
 <translation id="2627554163382448569">Udostępnia konfiguracje drukarek firmowych.
@@ -666,6 +672,7 @@
 <translation id="2823870601012066791">Lokalizacja w rejestrze systemu Windows dla klientów <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Włącz tryb incognito</translation>
 <translation id="2838830882081735096">Nie zezwalaj na migrację danych ani na działanie ARC</translation>
+<translation id="2839294585867804686">Ustawienia Sieciowych udziałów plików</translation>
 <translation id="2840269525054388612">Określa drukarki, z których może korzystać użytkownik.
 
       Ta zasada jest używana tylko wtedy, gdy dla zasady <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> wybrano ustawienie <ph name="PRINTERS_WHITELIST" />.
@@ -1130,17 +1137,18 @@
 
           Jeśli ta zasada nie zostanie skonfigurowana, dla wszystkich witryn będzie używana globalna wartość domyślna pochodząca z zasady „DefaultKeygenSetting” (jeśli została skonfigurowana) lub z osobistej konfiguracji użytkownika.</translation>
 <translation id="4239720644496144453">Pamięć podręczna nie jest używana dla aplikacji na Androida. Gdy wielu użytkowników instaluje tę samą aplikację na Androida, jest ona pobierana oddzielnie dla każdego z nich.</translation>
-<translation id="4243336580717651045">Włącza w <ph name="PRODUCT_NAME" /> zbieranie zanonimizowanych danych z URL jako kluczem i uniemożliwia użytkownikom zmianę tego ustawienia.
+<translation id="4243336580717651045">Włącza w <ph name="PRODUCT_NAME" /> zbieranie zanonimizowanych danych z URL-em jako kluczem i uniemożliwia użytkownikom zmianę tego ustawienia.
 
-      Zbieranie zanonimizowanych danych z URL jako kluczem wysyła adresy URL stron odwiedzanych przez użytkownika do Google, by pomóc w ulepszaniu wyszukiwania i przeglądania.
+      Zbieranie zanonimizowanych danych z URL-em jako kluczem wysyła adresy URL stron odwiedzanych przez użytkownika do Google, by pomóc w ulepszaniu wyszukiwania i przeglądania.
 
-      Jeśli ta zasada jest włączona, zbieranie zanonimizowanych danych z URL jako kluczem jest zawsze aktywne.
+      Jeśli ta zasada jest włączona, zbieranie zanonimizowanych danych z URL-em jako kluczem jest zawsze aktywne.
 
-      Jeśli ta zasada jest wyłączona, zbieranie zanonimizowanych danych z URL jako kluczem nigdy nie jest aktywne.
+      Jeśli ta zasada jest wyłączona, zbieranie zanonimizowanych danych z URL-em jako kluczem nigdy nie jest aktywne.
 
-      Jeśli ta zasada nie została skonfigurowana, zbieranie zanonimizowanych danych z URL jako kluczem będzie włączone, ale użytkownik może to zmienić.</translation>
+      Jeśli ta zasada nie została skonfigurowana, zbieranie zanonimizowanych danych z URL-em jako kluczem będzie włączone, ale użytkownik może to zmienić.</translation>
 <translation id="4250680216510889253">Nie</translation>
 <translation id="4261820385751181068">Ustawienia regionalne na ekranie logowania na urządzeniu</translation>
+<translation id="4264607809747169568">Określa dostępność funkcji Sieciowe udziały plików w Chrome OS</translation>
 <translation id="427220754384423013">Określa drukarki, z których może korzystać użytkownik.
 
       Ta zasada jest używana tylko wtedy, gdy dla zasady <ph name="BULK_PRINTERS_ACCESS_MODE" /> wybrano ustawienie <ph name="PRINTERS_WHITELIST" />.
@@ -1537,6 +1545,15 @@
       Wartość zasady należy określić w milisekundach.</translation>
 <translation id="5511702823008968136">Włącz pasek zakładek</translation>
 <translation id="5512418063782665071">Adres URL strony startowej</translation>
+<translation id="551639594034811656">Ta zasada zawiera listę wartości procentowych określających, jaki odsetek urządzeń z systemem <ph name="PRODUCT_OS_NAME" /> w OU ma być aktualizowany dziennie, począwszy od dnia wykrycia aktualizacji. Moment wykrycia jest późniejszy niż moment opublikowania, ponieważ może minąć trochę czasu między opublikowaniem aktualizacji a sprawdzeniem jej dostępności przez urządzenie.
+
+      Każda para (dzień, procent) określa procent urządzeń, który ma zostać zaktualizowany w ciągu danej liczby dni od wykrycia aktualizacji. Na przykład: jeśli mamy pary [(4, 40), (10, 70), (15, 100)], to 40% urządzeń powinno zostać zaktualizowanych w ciągu 4 dni od wykrycia aktualizacji, 70% powinno zostać zaktualizowanych w ciągu 10 dni itd.
+
+      Jeśli zasada zawiera jakąś wartość, aktualizacje będą ignorować zasadę <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> i zamiast niej stosować tę zasadę.
+
+      Jeśli ta lista jest pusta, wdrażanie etapowe nie będzie stosowane, a aktualizacje będą instalowane zgodnie z innymi zasadami dotyczącymi urządzeń.
+
+      Ta zasada nie ma zastosowania do przełączania kanałów.</translation>
 <translation id="5523812257194833591">Sesja publiczna, do której następuje automatyczne zalogowanie po opóźnieniu.
 
       Jeśli ta zasada jest ustawiona, użytkownik zostanie automatycznie zalogowany do określonej sesji po upływie określonego czasu nieaktywności na ekranie logowania. Sesja publiczna musi zostać wcześniej skonfigurowana (zobacz zasadę |DeviceLocalAccounts|).
@@ -1758,7 +1775,7 @@
           Zalecany sposób blokowania ekranu w czasie nieaktywności to włączenie blokowania ekranu przy wstrzymaniu pracy i pozwolenie, by <ph name="PRODUCT_OS_NAME" /> wstrzymywał pracę po okresie nieaktywności. Zasady tej należy używać jedynie, gdy ekran powinien zostać zablokowany znacznie wcześniej niż nastąpi wstrzymanie pracy lub gdy wstrzymanie pracy przy nieaktywności nie jest w ogóle wskazane.
 
           Wartość dla tej zasady należy określić w milisekundach. Wartości są zmniejszane tak, by były mniejsze niż opóźnienie nieaktywności.</translation>
-<translation id="6097601282776163274">Włącz zbieranie zanonimizowanych danych z URL jako kluczem</translation>
+<translation id="6097601282776163274">Włącz zbieranie zanonimizowanych danych z URL-em jako kluczem</translation>
 <translation id="6111936128861357925">Zezwól na ukrytą grę-żart z dinozaurem</translation>
 <translation id="6114416803310251055">przestarzała</translation>
 <translation id="6133088669883929098">Zezwalaj na generowanie kluczy we wszystkich witrynach</translation>
@@ -2425,6 +2442,11 @@
       Jeśli zasada jest wyłączona, izolacja witryn nie będzie stosowana wprost, a testowe funkcje IsolateOrigins i SitePerProcess będą wyłączone. Użytkownicy będą mogli ręcznie włączyć ustawienie SitePerProcess.
       Jeśli zasada nie jest skonfigurowana, użytkownik może zmienić to ustawienie.
       </translation>
+<translation id="7902255855035461275">Wzorce na tej liście są porównywane ze źródłem zabezpieczeń adresu URL,
+      z którego pochodzi żądanie. Jeśli URL będzie pasować do któregoś wzorca,
+      dostęp do urządzeń rejestrujących wideo zostanie przyznany bez pytania.
+
+      UWAGA: do wersji 45 ta zasada była stosowana tylko w trybie kiosku.</translation>
 <translation id="7912255076272890813">Skonfiguruj dozwolone typy aplikacji/rozszerzeń</translation>
 <translation id="7915236031252389808">W tym miejscu możesz podać URL pliku PAC serwera proxy.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index 43a05d1..9c15dbf 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -507,6 +507,11 @@
       Se essa configuração não for definida, o usuário poderá optar por usar essa função ou não.
 
       Essa configuração foi removida do <ph name="PRODUCT_NAME" /> 29 e de versões superiores.</translation>
+<translation id="2433412232489478893">Esta política controla se o recurso de Compartilhamento de arquivos de rede do <ph name="PRODUCT_NAME" /> é permitido para um usuário.
+
+      Quando esta política não for configurada ou for definida como verdadeira, os usuários poderão usar o Compartilhamento de arquivos de rede.
+
+      Quando esta política for definida como falsa, os usuários não poderão usar o Compartilhamento de arquivos de rede.</translation>
 <translation id="2438609638493026652">Ativa a geração de relatórios dos principais eventos durante a instalação do app Android no Google. Os eventos são capturados apenas para os apps cuja instalação foi acionada por meio da política.
 
       Se a política estiver definida como verdadeira, os eventos serão registrados.
@@ -584,6 +589,7 @@
 <translation id="2598508021807251719">Configura as localidades em que o <ph name="PRODUCT_OS_NAME" /> pode ser exibido.
 
       Se esta política for definida, o usuário só poderá configurar o <ph name="PRODUCT_OS_NAME" /> para ser exibido em uma das localidades especificadas por esta política. Se esta política não for definida ou for definida como uma lista vazia, o <ph name="PRODUCT_OS_NAME" /> poderá ser exibido em todas as localidades de IU disponíveis. Se esta política for definida como uma lista com valores inválidos, todos os valores inválidos serão ignorados. Se um usuário tiver configurado anteriormente o <ph name="PRODUCT_OS_NAME" /> para ser exibido em uma localidade que não seja permitida por esta política, a localidade de exibição será alternada para uma localidade de IU permitida na próxima vez que o usuário fizer login. Se o usuário tiver configurado localidades preferenciais, e uma delas for permitida por esta política, o <ph name="PRODUCT_OS_NAME" /> será alternado para essa localidade. Caso contrário, o <ph name="PRODUCT_OS_NAME" /> passará para o primeiro valor válido especificado por esta política ou para a localidade substituta (atualmente, en-US) se a política incluir apenas entradas inválidas.</translation>
+<translation id="2604182581880595781">Configurar políticas relacionadas ao Compartilhamento de arquivos de rede.</translation>
 <translation id="2623014935069176671">Aguardar atividade inicial do usuário</translation>
 <translation id="262740370354162807">Ativar o envio de documentos para <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Fornece configurações para impressoras corporativas.
@@ -661,6 +667,7 @@
 <translation id="2823870601012066791">Local de registro do Windows para clientes do <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Ativar o modo de navegação anônima</translation>
 <translation id="2838830882081735096">Bloquear migração de dados e ARC</translation>
+<translation id="2839294585867804686">Configurações do Compartilhamento de arquivos de rede</translation>
 <translation id="2840269525054388612">Especifica as impressoras que um usuário pode usar.
 
       Esta política só será usada se <ph name="PRINTERS_WHITELIST" /> for escolhida para <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1140,6 +1147,7 @@
       Se essa política não for configurada, a coleta de dados anônimos inseridos no URL estará ativa, mas o usuário poderá alterar isso.</translation>
 <translation id="4250680216510889253">Não</translation>
 <translation id="4261820385751181068">Localidade da tela de login do dispositivo</translation>
+<translation id="4264607809747169568">Controla o Compartilhamento de arquivos de rede para disponibilidade do ChromeOS</translation>
 <translation id="427220754384423013">Especifica as impressoras que um usuário pode usar.
 
       Esta política só será usada se <ph name="PRINTERS_WHITELIST" /> for escolhida para <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1536,6 +1544,15 @@
       O valor da política deve ser especificado em milissegundos.</translation>
 <translation id="5511702823008968136">Ativar a barra de favoritos</translation>
 <translation id="5512418063782665071">URL da página inicial</translation>
+<translation id="551639594034811656">Esta política define uma lista de porcentagens que determina a fração dos dispositivos <ph name="PRODUCT_OS_NAME" /> na UO a ser atualizada diariamente a partir do dia em que a atualização é descoberta pela primeira vez. A descoberta acontece após a publicação da atualização, já que o dispositivo pode levar algum tempo para procurar por atualizações.
+
+      Cada par (dia, porcentagem) contém a indicação da porcentagem da frota a ser atualizada por um determinado número de dias desde a descoberta da atualização. Por exemplo, se tivermos os pares [(4, 40), (10, 70), (15, 100)], então 40% da frota deverá ter sido atualizada quatro dias após a visualização da atualização, 70% deverá ter sido atualizada após 10 dias, e assim por diante.
+
+      Se houver um valor definido para esta política, as atualizações ignorarão a <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguirão esta política.
+
+      Se a lista estiver vazia, não haverá uma fase de testes, e as atualizações serão aplicadas de acordo com outras políticas do dispositivo.
+
+      Esta política não se aplica a trocas de canais.</translation>
 <translation id="5523812257194833591">Uma sessão pública para o login automático após um intervalo.
 
       Se esta política for definida, automaticamente ocorrerá o login na sessão especificada após haver transcorrido um período sem interação do usuário na tela de login. A sessão pública já deve estar configurada (consulte |DeviceLocalAccounts|).
@@ -2429,6 +2446,11 @@
       Se a política estiver desativada, nenhum isolamento de sites ocorrerá, e as versões de teste de IsolateOrigins e SitePerProcess serão desativadas. Os usuários ainda poderão ativar SitePerProcess manualmente.
       Se a política não estiver configurada, o usuário conseguirá alterar essa configuração.
       </translation>
+<translation id="7902255855035461275">Os padrões desta lista serão comparados com a origem de
+      segurança do URL solicitante. Se uma correspondência for encontrada, o acesso aos
+      dispositivos de captura de vídeo será concedido sem solicitação.
+
+      OBSERVAÇÃO: até a versão 45, esta política era compatível apenas com o modo quiosque.</translation>
 <translation id="7912255076272890813">Configurar tipos permitidos de aplicativo/extensão</translation>
 <translation id="7915236031252389808">É possível especificar um URL para um arquivo proxy .pac aqui.
 
diff --git a/components/policy/resources/policy_templates_pt-PT.xtb b/components/policy/resources/policy_templates_pt-PT.xtb
index fd4247e..b47b545 100644
--- a/components/policy/resources/policy_templates_pt-PT.xtb
+++ b/components/policy/resources/policy_templates_pt-PT.xtb
@@ -519,6 +519,11 @@
       Se esta definição não for definida, o utilizador poderá decidir utilizar esta função ou não.
 
       Esta definição foi removida do <ph name="PRODUCT_NAME" /> 29 e versões superiores.</translation>
+<translation id="2433412232489478893">Esta política controla se a funcionalidade Partilhas de ficheiros na rede para o <ph name="PRODUCT_NAME" /> é permitida para um utilizador.
+
+      Se esta política não estiver configurada ou estiver definida como verdadeira, os utilizadores podem utilizar as Partilhas de ficheiros na rede.
+
+      Se esta política estiver definida como falsa, os utilizadores não podem utilizar as Partilhas de ficheiros na rede.</translation>
 <translation id="2438609638493026652">Ativa a comunicação dos eventos principais durante a instalação de aplicações para Android no Google. Os eventos são capturados apenas para as aplicações cuja instalação foi acionada através da política.
 
       Se a política estiver definida como verdadeira, os eventos são registados.
@@ -596,6 +601,7 @@
 <translation id="2598508021807251719">Configura os locais em que o <ph name="PRODUCT_OS_NAME" /> pode ser apresentado.
 
       Se esta política estiver definida, o utilizador pode configurar a apresentação do <ph name="PRODUCT_OS_NAME" /> apenas num dos locais especificados por esta política. Se esta política não for definida ou for definida com uma lista vazia, o <ph name="PRODUCT_OS_NAME" /> pode ser apresentado em todos os locais da IU compatíveis. Se esta política estiver definida com uma lista com valores inválidos, os mesmos serão ignorados. Se um utilizador configurou o <ph name="PRODUCT_OS_NAME" /> anteriormente de forma a ser apresentado num local não permitido por esta política, o local da apresentação será alterado para um local da IU permitido da próxima vez que o utilizador iniciar sessão. Se o utilizador tiver configurado locais preferidos e um destes for permitido por esta política, o <ph name="PRODUCT_OS_NAME" /> mudará para esse local. Caso contrário, o <ph name="PRODUCT_OS_NAME" /> mudará para o primeiro valor válido especificado por esta política ou para um local alternativo (atualmente, en-US), se esta política incluir apenas entradas inválidas.</translation>
+<translation id="2604182581880595781">Configure as políticas relacionadas com a Partilha de ficheiros na rede.</translation>
 <translation id="2623014935069176671">Aguardar atividade inicial do utilizador</translation>
 <translation id="262740370354162807">Permitir o envio de documentos para o <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Fornece configurações para impressoras empresariais.
@@ -674,6 +680,7 @@
 <translation id="2823870601012066791">Localização da base de dados de registo do Windows para os clientes <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Ativar o modo de navegação anónima</translation>
 <translation id="2838830882081735096">Não permitir a migração de dados nem ARC</translation>
+<translation id="2839294585867804686">Definições das Partilhas de ficheiros na rede</translation>
 <translation id="2840269525054388612">Especifica as impressoras disponíveis para um utilizador.
 
       Esta política é apenas utilizada se <ph name="PRINTERS_WHITELIST" /> for selecionado para <ph name="DEVICE_PRINTERS_ACCESS_MODE" />.
@@ -1155,6 +1162,7 @@
       Se esta política não estiver definida, a recolha de dados anónimos com chave de URL é ativada, mas o utilizador pode alterá-la.</translation>
 <translation id="4250680216510889253">Não</translation>
 <translation id="4261820385751181068">Local do ecrã de início de sessão do dispositivo</translation>
+<translation id="4264607809747169568">Controla a disponibilidade das Partilhas de ficheiros na rede para o Chrome OS</translation>
 <translation id="427220754384423013">Especifica as impressoras disponíveis para um utilizador.
 
       Esta política é apenas utilizada se <ph name="PRINTERS_WHITELIST" /> for selecionado para <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1556,6 +1564,15 @@
       O valor da política deverá ser especificado em milissegundos.</translation>
 <translation id="5511702823008968136">Ativar Barra de Marcadores</translation>
 <translation id="5512418063782665071">URL da página inicial</translation>
+<translation id="551639594034811656">Esta política define uma lista de percentagens que definem a fração de dispositivos <ph name="PRODUCT_OS_NAME" /> na UO a atualizar por dia, com início a partir do dia em que a atualização é detetada pela primeira vez. A hora da deteção é posterior à hora da publicação da atualização, uma vez que pode demorar algum tempo após a publicação da atualização até que o dispositivo verifique a existência de atualizações.
+
+      Cada par (dia, percentagem) contém a percentagem da frota que tem de ser atualizada até ao dia de números indicado após a deteção da atualização. Por exemplo, se tivermos os pares [(4, 40), (10, 70), (15, 100)], significa que 40% da frota deveria ter sido atualizada 4 dias após a deteção da atualização, 70% deveria ter sido atualizada 10 dias depois e assim sucessivamente.
+
+      Se existir algum valor definido para esta política, as atualizações ignoram a política <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> e seguem esta política.
+
+      Se esta lista estiver vazia, as atualizações não são experimentais e são aplicadas de acordo com as outras políticas do dispositivo.
+
+      Esta política não se aplica às mudanças de canais.</translation>
 <translation id="5523812257194833591">O início automático de uma sessão pública após um atraso.
 
       Se esta política estiver definida, a sessão especificada será iniciada automaticamente após ter decorrido um período de tempo no ecrã de início de sessão sem a interação do utilizador. A sessão pública já tem de estar configurada (ver |DeviceLocalAccounts|).
@@ -2450,6 +2467,11 @@
       Se a política estiver desativada, não ocorre um isolamento de sites explícito e os testes de campo IsolateOrigins e SitePerProcess serão desativados. Os utilizadores continuam a poder ativar SitePerProcess manualmente.
       Se a política não estiver configurada, o utilizador pode alterar esta definição.
       </translation>
+<translation id="7902255855035461275">Os padrões nesta lista vão ser comparados com a origem
+      de segurança do URL que faz o pedido. Caso seja encontrada uma correspondência,
+      o acesso a dispositivos de captura de vídeo é concedido imediatamente.
+
+      NOTA: até à versão 45, esta política apenas era suportada no modo quiosque.</translation>
 <translation id="7912255076272890813">Configurar tipos de aplicações/extensões permitidos</translation>
 <translation id="7915236031252389808">Pode especificar um URL para um ficheiro .pac de proxy aqui.
 
diff --git a/components/policy/resources/policy_templates_ro.xtb b/components/policy/resources/policy_templates_ro.xtb
index 77bdc1d..149850c 100644
--- a/components/policy/resources/policy_templates_ro.xtb
+++ b/components/policy/resources/policy_templates_ro.xtb
@@ -514,6 +514,11 @@
       Dacă această setare nu este configurată, utilizatorul poate alege să folosească sau nu această funcție.
 
       Această setare a fost eliminată din <ph name="PRODUCT_NAME" /> versiunea 29 și din versiunile ulterioare.</translation>
+<translation id="2433412232489478893">Această politică stabilește dacă funcția Dispozitive de stocare în rețea pentru <ph name="PRODUCT_NAME" /> este permisă unui utilizator.
+
+      Dacă politica nu este configurată sau dacă este activată, utilizatorii vor putea folosi Dispozitive de stocare în rețea.
+
+      Dacă politica este dezactivată, utilizatorii nu vor putea folosi Dispozitive de stocare în rețea.</translation>
 <translation id="2438609638493026652">Activează raportarea evenimentelor cheie la Google în timpul instalării aplicației pentru Android. Evenimentele sunt înregistrate numai pentru aplicațiile a căror instalare a fost declanșată în baza politicii.
 
       Dacă politica este activată, vor fi înregistrate evenimente.
@@ -591,6 +596,7 @@
 <translation id="2598508021807251719">Configurează codurile locale în care poate fi afișat <ph name="PRODUCT_OS_NAME" />.
 
       Dacă această politică este configurată, utilizatorul poate să configureze afișarea <ph name="PRODUCT_OS_NAME" /> numai într-unul dintre codurile locale specificate de această politică. Dacă această politică nu este configurată sau dacă este configurată la o listă necompletată, <ph name="PRODUCT_OS_NAME" /> poate fi afișat în toate codurile locale IU acceptate. Dacă această politică este configurată la o listă cu valori nevalide, toate valorile nevalide vor fi ignorate. Dacă un utilizator a configurat anterior afișarea <ph name="PRODUCT_OS_NAME" /> într-un cod local care nu este permis de această politică, codul local de afișare va fi înlocuit cu un cod local IU permis la următoarea conectare a utilizatorului. Dacă utilizatorul a configurat codurile locale preferate și unul dintre ele este permis de această politică, <ph name="PRODUCT_OS_NAME" /> va comuta la codul local respectiv. În caz contrar, <ph name="PRODUCT_OS_NAME" /> va comuta la prima valoare validă specificată de această politică sau la un cod local alternativ (în prezent, en-US), în cazul în care politica nu conține decât intrări nevalide.</translation>
+<translation id="2604182581880595781">Configurează politicile pentru Dispozitive de stocare în rețea.</translation>
 <translation id="2623014935069176671">Se așteaptă prima activitate a utilizatorului</translation>
 <translation id="262740370354162807">Activează trimiterea documentelor la <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Specifică configurațiile pentru imprimantele companiei.
@@ -670,6 +676,7 @@
 <translation id="2823870601012066791">Locația din registry-ul Windows pentru clienții <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Activează modul incognito</translation>
 <translation id="2838830882081735096">Nu permite migrarea datelor și ARC</translation>
+<translation id="2839294585867804686">Setări pentru Dispozitive de stocare în rețea</translation>
 <translation id="2840269525054388612">Specifică imprimantele pe care le poate folosi un utilizator.
 
       Această politică este folosită numai dacă opțiunea <ph name="PRINTERS_WHITELIST" /> este aleasă pentru <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1157,6 +1164,7 @@
       Dacă politica nu este configurată, colectarea datelor anonimizate cu cheie URL va fi activă, dar utilizatorul o va putea modifica.</translation>
 <translation id="4250680216510889253">Nu</translation>
 <translation id="4261820385751181068">Limba de pe ecranul de conectare al dispozitivului</translation>
+<translation id="4264607809747169568">Controlează funcția Dispozitive de stocare în rețea pentru disponibilitatea sistemului de operare Chrome</translation>
 <translation id="427220754384423013">Specifică imprimantele pe care le poate folosi un utilizator.
 
       Această politică este folosită numai dacă opțiunea <ph name="PRINTERS_WHITELIST" /> este aleasă pentru <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1562,6 +1570,15 @@
       Valoarea pentru politică trebuie specificată în milisecunde.</translation>
 <translation id="5511702823008968136">Activează bara de marcaje</translation>
 <translation id="5512418063782665071">Adresa URL a paginii de pornire</translation>
+<translation id="551639594034811656">Această politică definește o listă de procente care vor defini proporția de dispozitive <ph name="PRODUCT_OS_NAME" /> din UO de actualizat pe zi, începând din ziua în care se descoperă actualizarea. Momentul descoperirii apare după momentul publicării actualizării, deoarece este posibil să treacă un timp după publicare până când dispozitivul va căuta actualizări.
+
+      Fiecare pereche (ziua, procentul) conține procentul din flotă care trebuie actualizat în funcție de numărul de zile de când a fost descoperită actualizarea. De exemplu, dacă avem perechile [(4, 40), (10, 70), (15, 100)], 40% din flotă trebuie actualizată la 4 zile după descoperirea actualizării, 70% trebuie actualizată după 10 zile și așa mai departe.
+
+      Dacă există o valoare definită pentru această politică, actualizările vor ignora politica <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> și o vor urma pe aceasta.
+
+      Dacă lista este goală, nu va exista nicio simulare și actualizările vor fi aplicate conform altor politici privind dispozitivele.
+
+      Această politică nu se aplică pentru comutările de canal.</translation>
 <translation id="5523812257194833591">O sesiune publică pentru conectare automată după un interval de inactivitate.
 
       Dacă această politică este setată, sesiunea specificată va fi conectată în mod automat după o perioadă de timp care s-a scurs după afișarea ecranului de conectare fără ca utilizatorul să interacționeze cu acesta. Sesiunea publică trebuie să fie deja configurată (vedeți |DeviceLocalAccounts|).
@@ -2453,6 +2470,11 @@
       Dacă politica este dezactivată, nu va avea loc o izolare explicită a site-ului, iar testările pentru IsolateOrigins și SitePerProcess vor fi dezactivate. Utilizatorii vor putea activa manual SitePerProcess.
       Dacă politica nu este configurată, utilizatorul va putea modifica această setare.
       </translation>
+<translation id="7902255855035461275">Șabloanele din această listă vor fi comparate cu originea
+      de securitate a adresei URL solicitante. Dacă este identificată o potrivire,
+      accesul la dispozitivele de capturare a conținutului video va fi acordat automat.
+
+      NOTĂ: până la versiunea 45, această politică era acceptată doar în modul Chioșc.</translation>
 <translation id="7912255076272890813">Configurați tipurile de aplicații/extensii permise</translation>
 <translation id="7915236031252389808">Poți specifica adresa URL a unui fișier .pac pentru proxy aici.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 96b8249..c6f477fc 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -278,6 +278,11 @@
       Если не задана какая-либо из настроек, для нее используется значение по умолчанию.
 
       Если не задано правило, значения по умолчанию используются для всех настроек.</translation>
+<translation id="1958138414749279167">Правило включает в <ph name="PRODUCT_NAME" /> функцию автозаполнения и разрешает пользователям автоматически заполнять веб-формы, используя ранее сохраненную информацию об адресах.
+
+      Если правило отключено, пользователи не будут видеть предложение внести информацию автоматически. Сведения об адресе, указываемые пользователями на веб-сайтах, также сохраняться не будут.
+
+      Если правило включено или его значение не указано, пользователи смогут сами управлять автозаполнением через интерфейс.</translation>
 <translation id="1960840544413786116">Разрешены ли сертификаты без расширения subjectAlternativeName, выданные надежными якорями доверия</translation>
 <translation id="1964634611280150550">Режим инкогнито отключен</translation>
 <translation id="1964802606569741174">Правило не влияет на приложение YouTube для Android. Чтобы принудительно включить режим Безопасного просмотра на YouTube, необходимо запретить установку приложения YouTube для Android.</translation>
@@ -488,6 +493,11 @@
       Если настройка не задана, пользователи могут устанавливать ее по своему желанию.
 
       Эта настройка недоступна в <ph name="PRODUCT_NAME" /> 29 и более поздних версиях.</translation>
+<translation id="2433412232489478893">Это правило определяет, может ли пользователь <ph name="PRODUCT_NAME" /> настраивать совместный доступ к файлам в сети.
+
+      Когда правило не настроено или включено, пользователи могут настраивать совместный доступ.
+
+      Когда правило отключено, пользователи не могут настраивать совместный доступ.</translation>
 <translation id="2438609638493026652">Позволяет отправлять в Google сведения об основных событиях, связанных с установкой приложений на Android. События сохраняются только для приложений, установленных при помощи правила.
 
 Если правило включено, события записываются в журнал.
@@ -565,6 +575,7 @@
 <translation id="2598508021807251719">Правило устанавливает региональные настройки для <ph name="PRODUCT_OS_NAME" />.
 
       Если правило настроено, пользователи могут задать для <ph name="PRODUCT_OS_NAME" /> только один из указанных в этом правиле языков. Если правило не настроено или задан пустой список, в <ph name="PRODUCT_OS_NAME" /> могут использоваться все поддерживаемые языки. Если в списке правила указаны недействительные значения, они не будут учитываться. Если для <ph name="PRODUCT_OS_NAME" /> были заданы региональные настройки, запрещенные этим правилом, язык будет изменен на разрешенный при следующем входе в систему. Если указаны предпочитаемые языки и один из них разрешен в этом правиле, <ph name="PRODUCT_OS_NAME" /> будет запускаться на этом языке. В ином случае в <ph name="PRODUCT_OS_NAME" /> будет использоваться первое допустимое значение из этого правила или резервный язык (в настоящее время это en-US), если правило содержит только недопустимые значения.</translation>
+<translation id="2604182581880595781">Настраивает правила, связанные с функцией совместного доступа к файлам в сети.</translation>
 <translation id="2623014935069176671">Ждать действий пользователя</translation>
 <translation id="262740370354162807">Разрешить отправку документов на виртуальный принтер <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Позволяет установить конфигурацию принтеров компании.
@@ -644,6 +655,7 @@
 <translation id="2823870601012066791">Расположение клиентов <ph name="PRODUCT_OS_NAME" /> в реестре Windows:</translation>
 <translation id="2824715612115726353">Включить режим инкогнито</translation>
 <translation id="2838830882081735096">Запретить перенос данных и ARC</translation>
+<translation id="2839294585867804686">Настройка совместного доступа к файлам в сети</translation>
 <translation id="2840269525054388612">Определяет принтеры, с которыми может работать пользователь.
 
       Применимо только в том случае, если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> задан параметр <ph name="PRINTERS_WHITELIST" />.
@@ -1119,6 +1131,7 @@
       Если это правило не настроено, анонимный сбор данных с помощью URL будет осуществляться, но пользователи смогут изменять его.</translation>
 <translation id="4250680216510889253">Нет</translation>
 <translation id="4261820385751181068">Региональные настройки экрана входа</translation>
+<translation id="4264607809747169568">Управление функцией совместного доступа к файлам в сети для Chrome OS</translation>
 <translation id="427220754384423013">Определяет принтеры, с которыми может работать пользователь.
 
       Применимо только в том случае, если в правиле <ph name="BULK_PRINTERS_ACCESS_MODE" /> задан параметр <ph name="PRINTERS_WHITELIST" />.
@@ -1521,6 +1534,15 @@
       Значение устанавливается в миллисекундах.</translation>
 <translation id="5511702823008968136">Включить панель закладок</translation>
 <translation id="5512418063782665071">URL главной страницы</translation>
+<translation id="551639594034811656">Правило формирует список значений в процентах, которые определяют долю устройств <ph name="PRODUCT_OS_NAME" /> в ОП, которые должны обновляться ежедневно, начиная с того дня, когда обновление было обнаружено. Проверка происходит в определенное время, поэтому обновление может быть обнаружено только через некоторое время после публикации.
+
+      В каждой паре значений (день, процентная величина) указывается, какая доля устройств должна быть обновлена через определенное количество дней после того, как обновление было обнаружено. Например, если мы видим пары [(4, 40), (10, 70), (15, 100)], это означает, что 40 % устройств должны быть обновлены через 4 дня после того, как обнаружено обновление, 70 % – через 10 дней и т. д.
+
+      Если для этого правила задано значение, обновления будут выполняться в соответствии с этим правилом независимо от значения правила <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" />.
+
+      Если в списке нет ни одного значения, обновления будут применяться в соответствии с остальными правилами, действующими на устройстве.
+
+      Это правило не применяется к переключателям каналов.</translation>
 <translation id="5523812257194833591">Сеанс общего доступа, в который будет автоматически выполнен вход по прошествии времени задержки.
 
       Если правило задано, по прошествии заданного времени бездействия на экране входа будет выполнен автоматический вход в указанный сеанс общего доступа. Сеанс общего доступа необходимо настроить заранее (см. |DeviceLocalAccounts|).
@@ -1819,6 +1841,7 @@
 <translation id="6440051664870270040">Разрешить сайтам одновременно открывать всплывающее окно и переходить на новую страницу</translation>
 <translation id="6447948611083700881">Резервное копирование и восстановление системы отключено</translation>
 <translation id="645425387487868471">Включить обязательный вход в <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Включить автозаполнение адресов</translation>
 <translation id="6473623140202114570">Настроить список доменов, в которых Безопасный просмотр не будет показывать уведомления об угрозах.</translation>
 <translation id="6491139795995924304">Разрешить Bluetooth-подключение на устройстве</translation>
 <translation id="6520802717075138474">Импорт сведений о поисковых системах из браузера, используемого по умолчанию, при первом запуске.</translation>
@@ -2407,6 +2430,9 @@
       Если правило отключено, то явной изоляции сайтов не происходит, а экспериментальные функции IsolateOrigins и SitePerProcess перестают работать. При этом пользователи могут включать правило SitePerProcess вручную.
       Если правило не настроено, пользователи могут настраивать этот параметр по своему усмотрению.
       </translation>
+<translation id="7902255855035461275">Шаблоны, указанные в списке, сверяются с запрашивающим URL. При обнаружении соответствий доступ к видеоустройствам предоставляется без предварительного запроса.
+
+      ПРИМЕЧАНИЕ. До версии 45 это правило поддерживалось только в режиме киоска.</translation>
 <translation id="7912255076272890813">Разрешенные типы приложений и расширений</translation>
 <translation id="7915236031252389808">Здесь указывается URL PAC-файла прокси-сервера.
 
diff --git a/components/policy/resources/policy_templates_sl.xtb b/components/policy/resources/policy_templates_sl.xtb
index d0e693f..be5cffe 100644
--- a/components/policy/resources/policy_templates_sl.xtb
+++ b/components/policy/resources/policy_templates_sl.xtb
@@ -302,6 +302,11 @@
       Če nastavitev ni določena, se uporabi privzeta vrednost.
 
       Če ta pravilnik ni nastavljen, se za vse nastavitve uporabijo privzete vrednosti.</translation>
+<translation id="1958138414749279167">Omogoči funkcijo za samodejno izpolnjevanje v brskalniku <ph name="PRODUCT_NAME" /> in uporabnikom omogoča samodejno izpolnjevanje podatkov o naslovu v spletnih obrazcih s predhodno shranjenimi podatki.
+
+      Če je ta nastavitev onemogočena, samodejno izpolnjevanje ne bo nikoli predlagalo ali vneslo podatkov o naslovu in prav tako ne bo shranilo dodatnih podatkov o naslovu, ki jih uporabnik lahko pošlje med brskanjem v spletu.
+
+      Če je ta nastavitev omogočena ali nima nastavljene vrednosti, bo uporabnik lahko nadziral samodejno izpolnjevanje za naslove v uporabniškem vmesniku.</translation>
 <translation id="1960840544413786116">Ali naj se dovoli potrdila, ki jih izdajo lokalna sidra zaupanja in jim manjka razširitev subjectAlternativeName</translation>
 <translation id="1964634611280150550">Način brez beleženja zgodovine je onemogočen</translation>
 <translation id="1964802606569741174">Ta pravilnik ne vpliva na aplikacijo YouTube za Android. Če naj bo varni način v YouTubu uveljavljen, mora biti namestitev aplikacije YouTube za Android onemogočena.</translation>
@@ -520,6 +525,11 @@
       Če te nastavitve ne nastavite, se lahko uporabnik odloči, ali želi uporabljati to funkcijo.
 
       Ta nastavitev je bila odstranjena iz programa <ph name="PRODUCT_NAME" /> 29 in novejših različic.</translation>
+<translation id="2433412232489478893">Ta pravilnik nadzira, ali je funkcija omrežnih naprav za skupno rabo datotek za izdelek <ph name="PRODUCT_NAME" /> dovoljena za uporabnika.
+
+      Če ta pravilnik ni konfiguriran ali je omogočen, bodo uporabniki lahko uporabljali omrežne naprave za skupno rabo datotek.
+
+      Če je ta pravilnik onemogočen, uporabniki ne bodo mogli uporabljati omrežnih naprav za skupno rabo datotek.</translation>
 <translation id="2438609638493026652">Omogoča poročanje Googlu o ključnih dogodkih pri namestitvi aplikacije za Android. Dogodki so zajeti samo za aplikacije, katerih namestitev je bila sprožena s pravilnikom.
 
       Če je pravilnik omogočen, bodo dogodki zabeleženi.
@@ -601,6 +611,7 @@
 <translation id="2598508021807251719">Konfigurira jezike, v katerih je lahko prikazan <ph name="PRODUCT_OS_NAME" />.
 
       Če je ta pravilnik nastavljen, lahko uporabnik konfigurira <ph name="PRODUCT_OS_NAME" /> za prikaz samo v enem od jezikov, ki jih določa ta pravilnik. Če ta pravilnik ni nastavljen ali je nastavljen na prazen seznam, je <ph name="PRODUCT_OS_NAME" /> lahko prikazan v vseh podprtih jezikih uporabniškega vmesnika. Če je ta pravilnik nastavljen na seznam z neveljavnimi vrednostmi, bodo vse neveljavne vrednosti prezrte. Če je uporabnik <ph name="PRODUCT_OS_NAME" /> v preteklosti konfiguriral za prikaz v jeziku, ki ga ta pravilnik ne dovoljuje, bo jezik prikaza preklopljen v dovoljen jezik uporabniškega vmesnika, ko se uporabnik naslednjič prijavi. Če je uporabnik konfiguriral prednostne jezike in enega izmed njih dovoljuje ta pravilnik, bo <ph name="PRODUCT_OS_NAME" /> preklopil v ta jezik. V nasprotnem primeru bo <ph name="PRODUCT_OS_NAME" /> preklopil na prvo veljavno vrednost, ki jo določa ta pravilnik, ali rezervni jezik (trenutno je to ameriška angleščina, en-US), če ta pravilnik vsebuje samo neveljavne vnose.</translation>
+<translation id="2604182581880595781">Konfiguriranje pravilnikov, povezanih z omrežnimi napravami za skupno rabo datotek.</translation>
 <translation id="2623014935069176671">Čakanje na začetno dejavnost uporabnika</translation>
 <translation id="262740370354162807">Omogoča pošiljanje dokumentov v storitev <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Posreduje konfiguracije za tiskalnike v podjetjih.
@@ -686,6 +697,7 @@
 <translation id="2823870601012066791">Lokacija registra sistema Windows za odjemalce s sistemom <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Omogoči način brez beleženja zgodovine</translation>
 <translation id="2838830882081735096">Prepoved selitve podatkov in ARC-ja</translation>
+<translation id="2839294585867804686">Nastavitve omrežnih naprav za skupno rabo datotek</translation>
 <translation id="2840269525054388612">Določa tiskalnike, ki jih uporabnik lahko uporablja.
 
       Ta pravilnik se uporablja samo, če je za pravilnik <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> izbrana možnost <ph name="PRINTERS_WHITELIST" />.
@@ -1176,17 +1188,18 @@
 
           Če ta pravilnik ni nastavljen, bo za vsa spletna mesta uporabljena splošna privzeta vrednost iz pravilnika »DefaultKeygenSetting«, kadar je ta nastavljen, ali iz uporabnikove osebne konfiguracije, kadar pravilnik »DefaultKeygenSetting« ni nastavljen.</translation>
 <translation id="4239720644496144453">Predpomnilnik se ne uporablja za aplikacije za Android. Če več uporabnikov namesti enako aplikacijo za Android, bo za vsakega uporabnika znova prenesena.</translation>
-<translation id="4243336580717651045">Omogoča zbiranje anonimiziranih podatkov, ki so vezani na spletna mesta z gesli, v brskalniku <ph name="PRODUCT_NAME" /> in uporabnikom preprečuje spreminjanje te nastavitve.
+<translation id="4243336580717651045">Omogoča zbiranje anonimiziranih podatkov, ki vključujejo URL-je, v brskalniku <ph name="PRODUCT_NAME" /> in uporabnikom preprečuje spreminjanje te nastavitve.
 
-      Zbiranje anonimiziranih podatkov, ki so vezani na spletna mesta z gesli, pošlje Googlu URL-je, ki jih obišče uporabnik, zaradi izboljšanja iskanj in brskanja.
+      Zbiranje anonimiziranih podatkov, ki vključujejo URL-je, pošlje Googlu URL-je strani, ki jih obišče uporabnik, zaradi izboljšanja iskanj in brskanja.
 
-      Če ta pravilnik omogočite, je zbiranje anonimiziranih podatkov, ki so vezani na spletna mesta z gesli, vedno aktivno.
+      Če ta pravilnik omogočite, je zbiranje anonimiziranih podatkov, ki vključujejo URL-je, vedno aktivno.
 
-      Če ta pravilnik onemogočite, ni zbiranje anonimiziranih podatkov, ki so vezani na spletna mesta z gesli, nikoli aktivno.
+      Če ta pravilnik onemogočite, ni zbiranje anonimiziranih podatkov, ki vključujejo URL-je, nikoli aktivno.
 
-      Če ta pravilnik ni nastavljen, bo zbiranje anonimiziranih podatkov, ki so vezani na spletna mesta z gesli, omogočeno, vendar bo lahko uporabnik to spremenil.</translation>
+      Če ta pravilnik ni nastavljen, bo zbiranje anonimiziranih podatkov, ki vključujejo URL-je, omogočeno, vendar bo lahko uporabnik to spremenil.</translation>
 <translation id="4250680216510889253">Ne</translation>
 <translation id="4261820385751181068">Jezik na zaslonu za prijavo v napravi</translation>
+<translation id="4264607809747169568">Nadzira razpoložljivost omrežnih naprav za skupno rabo datotek v okolju OS Chrome</translation>
 <translation id="427220754384423013">Določa tiskalnike, ki jih uporabnik lahko uporablja.
 
       Ta pravilnik se uporablja samo, če je za pravilnik <ph name="BULK_PRINTERS_ACCESS_MODE" /> izbrana možnost <ph name="PRINTERS_WHITELIST" />.
@@ -1619,6 +1632,15 @@
       Vrednost pravilnika mora biti v milisekundah.</translation>
 <translation id="5511702823008968136">Omogoči vrstico z zaznamki</translation>
 <translation id="5512418063782665071">URL domače strani</translation>
+<translation id="551639594034811656">Ta pravilnik opredeljuje seznam odstotkov, ki določajo delež naprav s sistemom <ph name="PRODUCT_OS_NAME" /> v organizacijski enoti, ki prejmejo posodobitev dnevno od dneva, ko je posodobitev prvič odkrita. Čas odkrivanja je poznejši od časa objave posodobitve, saj lahko po objavi posodobitve preteče nekaj časa, preden naprava preveri, ali je na voljo posodobitev.
+
+      Vsak par (dan, odstotek) vsebuje odstotek opreme, ki mora biti posodobljena v danem številu dni po odkritju posodobitve. Če so na primer na voljo pari [(4, 40), (10, 70), (15, 100)], mora biti 40 % naprav posodobljenih v 4 dneh po odkritju posodobitve, 70 % naprav v 10 dneh po odkritju in tako naprej.
+
+      Če je za ta pravilnik določena vrednost, posodobitve prezrejo pravilnik <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> in upoštevajo ta pravilnik.
+
+      Če je seznam prazen, ni priprav in posodobitve bodo uveljavljene glede na druge pravilnike naprave.
+
+      Ta pravilnik se ne uporablja pri preklapljanju med kanali.</translation>
 <translation id="5523812257194833591">Samodejna prijava javne seje po časovnem zamiku.
 
       Če je ta pravilnik nastavljen, bo po preteku določenega časa nedejavnosti uporabnika na zaslonu za prijavo določena seja prijavljena samodejno. Javna seja mora biti pred tem konfigurirana (glejte |DeviceLocalAccounts|).
@@ -1846,7 +1868,7 @@
           Priporočljivo je, da za zaklep zaslona ob nedejavnosti omogočite zaklepanje ob prekinitvi, da se <ph name="PRODUCT_OS_NAME" /> prekine po preteku zakasnitve zaradi nedejavnosti. Ta pravilnik uporabite samo, če želite, da se zaslon zaklene bistveno prej pred prekinitvijo, ali če ne želite prekinitve ob nedejavnosti.
 
           Vrednost pravilnika naj bo navedena v milisekundah. Vrednosti morajo biti manjše od zakasnitve zaradi nedejavnosti.</translation>
-<translation id="6097601282776163274">Omogočanje zbiranja anonimiziranih podatkov, ki so vezani na spletna mesta z gesli</translation>
+<translation id="6097601282776163274">Omogočanje zbiranja anonimiziranih podatkov, ki vključujejo URL-je</translation>
 <translation id="6111936128861357925">Dovoli skrito igro z dinozavrom</translation>
 <translation id="6114416803310251055">zastarelo</translation>
 <translation id="6133088669883929098">Vsem spletnim mestom dovoli uporabo ustvarjanja ključev</translation>
@@ -1931,6 +1953,7 @@
 <translation id="6440051664870270040">Spletnim mestom dovoli hkratno krmarjenje in odpiranje pojavnih oken</translation>
 <translation id="6447948611083700881">Varnostno kopiranje in obnovitev sta onemogočena</translation>
 <translation id="645425387487868471">Omogoči vsiljeno prijavo za izdelek <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Omogočanje samodejnega izpolnjevanja za naslove</translation>
 <translation id="6473623140202114570">Konfigurirajte seznam domen, v katerih funkcija varnega brskanja ne bo sprožila opozoril.</translation>
 <translation id="6491139795995924304">Omogočanje Bluetootha v napravi</translation>
 <translation id="6520802717075138474">Uvoz iskalnikov privzetega brskalnika ob prvem zagonu</translation>
@@ -2549,6 +2572,11 @@
       Če je pravilnik onemogočen, ne pride do eksplicitne osamitve spletnih mest in preizkusi pravilnikov IsolateOrigins in SitePerProcess so onemogočeni. Uporabniki bodo še vedno lahko ročno omogočili pravilnik SitePerProcess.
       Če pravilnik ni konfiguriran, bo uporabnik lahko spremenil to nastavitev.
       </translation>
+<translation id="7902255855035461275">Vzorci na tem seznamu se bodo primerjali z varnostnim
+      izvorom zahtevajočega URL-ja. Če je najdeno ujemanje, bo dostop do naprav
+      za zajem videa dovoljen brez poziva.
+
+      OPOMBA: ta pravilnik je bil do različice 45 podprt samo v načinu kioska.</translation>
 <translation id="7912255076272890813">Konfiguracija dovoljenih vrst aplikacij/razširitev</translation>
 <translation id="7915236031252389808">Tu lahko določite URL za datoteko .pac strežnika proxy.
 
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 1cae5ca..0c28b172 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -301,6 +301,11 @@
       Ако не наведете подешавање, користи се подразумевана вредност.
 
       Ако не подесите ове смернице, користе се подразумеване вредности за сва подешавања.</translation>
+<translation id="1958138414749279167">Омогућавају функцију Аутоматско попуњавање у <ph name="PRODUCT_NAME" />-у и омогућавају корисницима да аутоматски довршавају податке о адреси у веб-обрасцима помоћу раније сачуваних података.
+
+      Ако је ово подешавање онемогућено, Аутоматско попуњавање никада неће предлагати или попуњавати податке о адреси нити ће чувати додатне податке о адреси које корисник може да пошаље док прегледа веб.
+
+      Ако је ово подешавање омогућено или није подешено, корисник ће моћи да контролише функцију аутоматског попуњавања за адресе у корисничком интерфејсу.</translation>
 <translation id="1960840544413786116">Да ли ће дозволити сертификате које издају локална поуздана полазишта, а којима недостаје ознака subjectAlternativeName</translation>
 <translation id="1964634611280150550">Режим Без архивирања је онемогућен</translation>
 <translation id="1964802606569741174">Ове смернице немају никаквог утицаја на апликацију YouTube за Android. Ако треба да се примени безбедни режим на YouTube-у, инсталација апликације YouTube за Android не би требало да буде дозвољена.</translation>
@@ -517,6 +522,11 @@
       Ако не подесите ово подешавање, корисник може да одлучи да ли ће користити ову функцију или неће.
 
       Ово подешавање је уклоњено из <ph name="PRODUCT_NAME" />-а 29 и новијих верзија.</translation>
+<translation id="2433412232489478893">Ове смернице контролишу да ли је функција Дељења датотека на мрежи за <ph name="PRODUCT_NAME" /> дозвољена за корисника.
+
+      Када ове смернице нису подешене или су подешене на вредност Тачно, корисник ће моћи да користе Дељења датотека на мрежи.
+
+      Када су ове смернице подешене на вредност Нетачно, корисници неће моћи да користе Дељења датотека на мрежи.</translation>
 <translation id="2438609638493026652">Омогућава извештавање Google-а о кључним догађајима током инсталирања Android апликација. Догађаји се евидентирају само за апликације чије инсталирање су активирале смернице.
 
       Ако су смернице подешене на вредност Тачно, догађаји ће се евидентирати.
@@ -598,6 +608,7 @@
 <translation id="2598508021807251719">Конфигуришу локалитете на којима <ph name="PRODUCT_OS_NAME" /> може да се приказује.
 
       Ако подесите ове смернице, корисник може да конфигурише <ph name="PRODUCT_OS_NAME" /> само тако да се приказује на једном од локалитета који наводе ове смернице. Ако не подесите ове смернице или их подесите на празну листу, <ph name="PRODUCT_OS_NAME" /> може да се приказује на свим подржаним локалитетима корисничког интерфејса. Ако подесите ове смернице на листу са неважећим вредностима, све неважеће вредности се игноришу. Ако је корисник претходно конфигурисао <ph name="PRODUCT_OS_NAME" /> тако да се приказује на локалитету који ове смернице не дозвољавају, локалитет приказа се мења у дозвољени локалитет корисничког интерфејса када се корисник следећи пут пријави. Ако је корисник конфигурисао жељене локалитете и ако ове смернице дозвољавају један од њих, <ph name="PRODUCT_OS_NAME" /> се пребацује на тај локалитет. У супротном, <ph name="PRODUCT_OS_NAME" /> се пребацује на прву важећу вредност коју наводе ове смернице или на резервни локалитет (тренутно је то en-US) ако ове смернице садрже само неважеће локалитете.</translation>
+<translation id="2604182581880595781">Конфигуришу сродне смернице за Дељења датотека на мрежи.</translation>
 <translation id="2623014935069176671">Чекај првобитну активност корисника</translation>
 <translation id="262740370354162807">Омогући слање докумената на услугу <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Пружају конфигурације за штампаче предузећа.
@@ -683,6 +694,7 @@
 <translation id="2823870601012066791">Локација <ph name="PRODUCT_OS_NAME" /> клијената у Windows регистру:</translation>
 <translation id="2824715612115726353">Омогући режим без архивирања</translation>
 <translation id="2838830882081735096">Онемогући пренос података и ARC</translation>
+<translation id="2839294585867804686">Подешавања функције Дељења датотека на мрежи</translation>
 <translation id="2840269525054388612">Наводе штампаче које корисник може да користи.
 
       Ове смернице се користе само ако изаберете <ph name="PRINTERS_WHITELIST" /> за <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1174,6 +1186,7 @@
       Ако не подесите ове смернице, прикупљање анонимних података преко URL кључева ће бити омогућено, али ће корисник моћи то да промени.</translation>
 <translation id="4250680216510889253">Не</translation>
 <translation id="4261820385751181068">Локалитет екрана за пријављивање на уређају</translation>
+<translation id="4264607809747169568">Контролишу доступност функције Дељења датотека на мрежи за Chrome ОС</translation>
 <translation id="427220754384423013">Наводе штампаче које корисник може да користи.
 
       Ове смернице се користе само ако изаберете <ph name="PRINTERS_WHITELIST" /> за <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1605,6 +1618,15 @@
       Вредност смернице треба да се наведе у милисекундама.</translation>
 <translation id="5511702823008968136">Омогући Траку са обележивачима</translation>
 <translation id="5512418063782665071">URL адреса почетне странице</translation>
+<translation id="551639594034811656">Ове смернице дефинишу листу процената којим ће се дефинисати удео <ph name="PRODUCT_OS_NAME" /> уређаја у ОЈ за дневно ажурирање, почев од дана када је ажурирање први пут откривено. Време откривања је касније од времена објављивања ажурирања јер после објављивања ажурирања може да прође одређено време док уређај не провери да ли постоје ажурирања.
+
+      Сваки пар (дан, проценат) садржи проценат уређаја који треба да се ажурирају за одређени број дана од времена откривања ажурирања. На пример, ако постоје парови [(4, 40), (10, 70), (15, 100)], то значи да 40% уређаја треба да се ажурира у року од четири дана од откривања ажурирања, 70% треба да се ажурира у року од 10 дана и тако даље.
+
+      Ако ове смернице дефинишу вредност, ажурирања ће занемарити смернице <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> и примениће ове смернице уместо тих.
+
+      Ако је ова листа празна, неће бити постепеног представљања и ажурирања ће се примењивати у складу са другим смерницама за уређај.
+
+      Ове смернице се не примењују на пребацивање канала.</translation>
 <translation id="5523812257194833591">Јавна сесија коју треба аутоматски пријавити после одређеног периода.
 
       Ако су ове смернице подешене, наведена сесија ће бити аутоматски пријављена када истекне одређени период на екрану за пријављивање без корисничке интеракције. Јавна сесија мора већ да буде конфигурисана (погледајте |DeviceLocalAccounts|).
@@ -1913,6 +1935,7 @@
 <translation id="6440051664870270040">Дозвољавају сајтовима да се истовремено померају и отварају искачуће прозоре</translation>
 <translation id="6447948611083700881">Прављење резервних копија и враћање је онемогућено</translation>
 <translation id="645425387487868471">Омогућавају принудно пријављивање у <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Омогућавају Аутоматско попуњавање за адресе</translation>
 <translation id="6473623140202114570">Конфигуришите листу домена на којима Безбедно прегледање неће активирати упозорења.</translation>
 <translation id="6491139795995924304">Омогућите Bluetooth на уређају</translation>
 <translation id="6520802717075138474">Увези претраживач из подразумеваног прегледача при првом покретању</translation>
@@ -2529,6 +2552,11 @@
       Ако онемогућите ове смернице, не долази до експлицитне изолације сајтова, а пробне верзије смерница IsolateOrigins и SitePerProcess се онемогућавају. Корисници и даље могу ручно да омогуће SitePerProcess.
       Ако не конфигуришете смернице, корисник може да промени ово подешавање.
       </translation>
+<translation id="7902255855035461275">Обрасци на овој листи ће се поредити са безбедносним
+      пореклом URL-а који шаље захтев. Ако се пронађе подударање, приступ уређајима за
+      снимање видео садржаја ће бити одобрен без слања упита.
+
+      НАПОМЕНА: До верзије 45 ове смернице су биле подржане само у режиму киоска.</translation>
 <translation id="7912255076272890813">Конфигурисање дозвољених типова апликација/додатака</translation>
 <translation id="7915236031252389808">Овде можете да наведете URL за .pac датотеку проксија.
 
diff --git a/components/policy/resources/policy_templates_sv.xtb b/components/policy/resources/policy_templates_sv.xtb
index 50cef869..01c0a8e7 100644
--- a/components/policy/resources/policy_templates_sv.xtb
+++ b/components/policy/resources/policy_templates_sv.xtb
@@ -302,6 +302,11 @@
       Ett standardvärde används om en inställning inte specificeras.
 
       Om principen inte ställs in används standardvärden för alla inställningar.</translation>
+<translation id="1958138414749279167">Aktiverar funktionen Autofyll i <ph name="PRODUCT_NAME" /> så att användarna kan fylla i webbformulär automatiskt med adressuppgifter som har sparats sedan tidigare.
+
+      Om inställningen inaktiveras visas inga förslag med Autofyll och inga adressuppgifter fylls i. Ytterligare adressuppgifter som användaren kan ange på webben sparas inte heller.
+
+      Om inställningen aktiveras eller lämnas utan värde kan användarna själva styra Autofyll för adresser i användargränssnittet.</translation>
 <translation id="1960840544413786116">Om certifikat som utfärdats av lokala tillitsankare och saknar tillägget subjectAlternativeName tillåts eller inte</translation>
 <translation id="1964634611280150550">Inkognitoläget är inaktiverat</translation>
 <translation id="1964802606569741174">Den här principen gäller inte YouTube-appen för Android. Om Säkert läge på YouTube ska vara obligatoriskt bör du blockera möjligheten att installera YouTube-appen för Android.</translation>
@@ -519,6 +524,11 @@
       Om ingen inställning anges kan användaren välja att använda eller inte använda denna funktion.
 
       Den här inställningen har tagits bort från och med version 29 av <ph name="PRODUCT_NAME" />.</translation>
+<translation id="2433412232489478893">Principen styr om funktionen Network File Share i <ph name="PRODUCT_NAME" /> är tillåten för användare.
+
+      När principen inte är konfigurerad eller har ställts in på Sant kan användarna använda Network File Share.
+
+      När principen har ställts in på Falskt kan användarna inte använda Network File Share.</translation>
 <translation id="2438609638493026652">Aktiverar rapportering av centrala händelser vid installation av Android-appar till Google. Händelser registreras bara för appar som installerats via en princip.
 
       Om principen är inställd på sant loggas händelser.
@@ -600,6 +610,7 @@
 <translation id="2598508021807251719">Konfigurerar de språk som <ph name="PRODUCT_OS_NAME" /> får visas på.
 
       Om principen har ställts in får användaren bara välja någon av de språkkoder som har angetts i principen som visningsspråk i <ph name="PRODUCT_OS_NAME" />. Om principen har lämnats utan inställning eller ställts in på en tom lista kan <ph name="PRODUCT_OS_NAME" /> visas på alla språk som användargränssnittet har stöd för. Om en lista med ogiltiga värden anges för principen ignoreras de ogiltiga värdena. Om en användare tidigare har ställt in <ph name="PRODUCT_OS_NAME" /> på en språkkod som inte är tillåten enligt denna princip byts visningsspråket ut mot ett tillåtet gränssnittsspråk nästa gång användaren loggar in. Om användaren har konfigurerat föredragna språkkoder och en av dem är tillåten enligt denna princip används den språkkoden i <ph name="PRODUCT_OS_NAME" />. I annat fall används det första giltiga värdet i denna princip eller, om principen bara innehåller ogiltiga värden, en standardspråkkod (för närvarande en-US) i <ph name="PRODUCT_OS_NAME" />.</translation>
+<translation id="2604182581880595781">Konfigurera principer relaterade till Network File Share.</translation>
 <translation id="2623014935069176671">Vänta på inledande användaraktivitet</translation>
 <translation id="262740370354162807">Aktivera sändning av dokument till <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Tillhandahåller skrivarkonfigurationer för företagsenheter.
@@ -685,6 +696,7 @@
 <translation id="2823870601012066791">Windows-registerplats för <ph name="PRODUCT_OS_NAME" />-klienter:</translation>
 <translation id="2824715612115726353">Aktivera inkognitoläge</translation>
 <translation id="2838830882081735096">Tillåt inte datamigrering och ARC</translation>
+<translation id="2839294585867804686">Inställningar för Network File Share</translation>
 <translation id="2840269525054388612">Anger vilka skrivare som får användas.
 
       Den här principen används bara när <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> är inställd på <ph name="PRINTERS_WHITELIST" />.
@@ -1182,6 +1194,7 @@
       Om principen lämnas utan inställning aktiveras insamling av anonymiserad data kopplad till webbadresser men användaren kan ändra detta.</translation>
 <translation id="4250680216510889253">Nej</translation>
 <translation id="4261820385751181068">Språkkod för enhetens inloggningsskärm</translation>
+<translation id="4264607809747169568">Styr om Network File Share är tillgängligt i ChromeOS</translation>
 <translation id="427220754384423013">Anger vilka skrivare som får användas.
 
       Den här principen används bara när <ph name="BULK_PRINTERS_ACCESS_MODE" /> är inställd på <ph name="PRINTERS_WHITELIST" />.
@@ -1615,6 +1628,15 @@
       Policyvärdet ska anges i millisekunder.</translation>
 <translation id="5511702823008968136">Aktivera bokmärkesfältet</translation>
 <translation id="5512418063782665071">Webbadress för startsida</translation>
+<translation id="551639594034811656">Med den här principen definieras en lista med procentvärden som anger hur stor andel av organisationsenhetens <ph name="PRODUCT_OS_NAME" />-enheter som ska uppdateras per dag från den dag då uppdateringen hittades. Tiden när uppdateringen hittas är senare än uppdateringens publiceringsdatum, eftersom det kan dröja ett tag efter publiceringen innan enheten söker efter uppdateringar.
+
+      Varje värdepar av typen (dag, procentandel) anger hur stor del av det totala antalet enheter som måste ha uppdaterats efter det angivna antalet dagar efter att uppdateringen hittades. Om listan till exempel består av paren [(4, 40), (10, 70), (15, 100)] ska 40 % av enheterna ha uppdaterats fyra dagar efter att uppdateringen hittades, 70 % av dem ska ha uppdaterats efter tio dagar och så vidare.
+
+      Om ett värde har definierats för principen ignoreras principen <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> för uppdateringar och den här principen gäller i stället.
+
+      Om listan är tom görs ingen lansering i etapper och uppdateringarna tillämpas utifrån andra enhetsprinciper.
+
+      Principen gäller inte för kanalbyten.</translation>
 <translation id="5523812257194833591">En offentlig session för att logga in automatiskt efter en fördröjning.
 
       Om policyn har angetts kommer den angivna sessionen automatiskt att loggas in efter att en viss tid har förflutit på inloggningsskärmen utan åtgärder från användaren. Den offentliga sessionen måste redan vara konfigurerad (se |DeviceLocalAccounts|).
@@ -1928,6 +1950,7 @@
 <translation id="6440051664870270040">Tillåt att webbplatser navigerar och öppnar popup-fönster samtidigt</translation>
 <translation id="6447948611083700881">Säkerhetskopiering och återställning har inaktiverats</translation>
 <translation id="645425387487868471">Aktivera tvingad inloggning för <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Aktivera autofyll för adresser</translation>
 <translation id="6473623140202114570">Konfigurera listan över domäner där Säker webbsökning inte utlöser varningar.</translation>
 <translation id="6491139795995924304">Tillåt Bluetooth på enheten</translation>
 <translation id="6520802717075138474">Importera sökmotorer från standardwebbläsaren första gången den körs</translation>
@@ -2546,6 +2569,11 @@
       Om principen inaktiveras görs ingen uttrycklig webbplatsisolering och testfunktionerna IsolateOrigins och SitePerProcess inaktiveras. Användarna kan fortfarande aktivera SitePerProcess manuellt.
       Om principen inte konfigureras kan användaren ändra inställningen.
       </translation>
+<translation id="7902255855035461275">Mönster i den här listan matchas mot den begärande
+      webbadressens säkerhetsursprung. Om det blir en träff får
+      adressen åtkomst till videoinspelningsenheter utan meddelande.
+
+      OBS! Före version 45 stöddes den här principen enbart i kioskläge.</translation>
 <translation id="7912255076272890813">Konfigurera tillåtna app- och tilläggstyper</translation>
 <translation id="7915236031252389808">Här kan du ange webbadressen till en PAC-fil för proxy.
 
diff --git a/components/policy/resources/policy_templates_sw.xtb b/components/policy/resources/policy_templates_sw.xtb
index eae4518..9d199f97 100644
--- a/components/policy/resources/policy_templates_sw.xtb
+++ b/components/policy/resources/policy_templates_sw.xtb
@@ -288,6 +288,11 @@
 Kama mpangilio usipobainishwa, thamani chaguomsingi inatumika.
 
 Sera hii ikiondolewa, chaguomsingi zitatumika kwa mipangilio yote.</translation>
+<translation id="1958138414749279167">Huwasha kipengele cha Kujaza Kiotomatiki cha <ph name="PRODUCT_NAME" /> na kuruhusu watumiaji wajaze kiotomatiki maelezo ya anwani katika fomu za wavuti wakitumia maelezo waliyohifadhi awali.
+
+      Iwapo mipangilio hii imezimwa, kipengele cha Kujaza Kiotomatiki hakitawahi kupendekeza wala kujaza maelezo ya anwani. Pia hakitahifadhi maelezo ya ziada ya anwani ambayo huenda mtumiaji atawasilisha anapovinjari wavuti.
+
+      Iwapo mipangilio hii imewashwa au haina thamani yoyote, mtumiaji ataweza kudhibiti kipengele cha Kujaza Kiotomatiki kwa anwani kwenye kiolesura.</translation>
 <translation id="1960840544413786116">Ikiwa utaruhusu vyeti vilivyotolewa na nanga za ndani zinazoaminika visivyo na kiendelezi cha subjectAlternativeName</translation>
 <translation id="1964634611280150550">Hali fiche imezimwa</translation>
 <translation id="1964802606569741174">Sera hii haiathiri progamu ya Android YouTube. Ikiwa Hali ya Usalama kwenye YouTube inapaswa kutekelezwa, kusakinishwa kwa programu ya Android YouTube haipaswi kuruhusiwa.</translation>
@@ -496,6 +501,11 @@
      Ukiwasha au kuzima mipangilio hii, watumiaji hawawezi kubadilisha au kubatilisha mipangilio hii.
      Ikiwa mipangilio hii itaachwa bila kuwekwa mtumiaji anaweza kuamua kutumia au kutotumia chaguo hizi za kukokotoa. 
      Mipangilio hii imeondolewa kwenye <ph name="PRODUCT_NAME" /> 29 na matoleo mapya zaidi.</translation>
+<translation id="2433412232489478893">Sera hii inadhibiti iwapo kipengele cha Faili za Kushiriki katika Mtandao kwenye <ph name="PRODUCT_NAME" /> kinaruhusiwa kwa mtumiaji.
+
+      Iwapo hujaweka mipangilio ya sera hii au umeiweka kuwa Ndiyo, watumiaji wataweza kutumia Faili za Kushiriki katika Mtandao.
+
+      Iwapo umeweka sera hii kuwa Sivyo, watumiaji hawataweza kutumia Faili za Kushiriki katika Mtandao.</translation>
 <translation id="2438609638493026652">Huruhusu kuripotiwa kwa matukio muhimu wakati wa kusakinisha programu ya Android kwenye Google. Matukio hurekodiwa tu kwa programu ambazo usakinishaji wake unatokana na sera.
       
 Ikiwa sera imewekwa kuwa ndivyo, matukio yatarekodiwa.
@@ -577,6 +587,7 @@
 <translation id="2598508021807251719">Huweka mipangilio ya lugha ambazo huenda zikatumika kuonyesha <ph name="PRODUCT_OS_NAME" />.
 
       Ikiwa sera hii imewekwa, mtumiaji anaweza tu kuweka mipangilio ya <ph name="PRODUCT_OS_NAME" /> ili ionyeshwe katika mojawapo ya lugha zilizobainishwa kwenye sera hii. Ikiwa sera hii haijawekwa au imewekewa kuwa orodha isiyo na chochote, <ph name="PRODUCT_OS_NAME" /> inaweza kuonyeshwa katika lugha zote zinazotumika. Ikiwa sera hii imewekewa kuwa orodha yenye thamani zisizo sahihi, thamani zote zisizo sahihi zitapuuzwa. Ikiwa mtumiaji aliweka mipangilio ya <ph name="PRODUCT_OS_NAME" /> awali ili ionyeshwe katika lugha isiyokubalika na sera hii, lugha inayotumika kuonyesha itabadilishwa iwe lugha ya kiolesura inayokubalika mtumiaji atakapoingia tena katika akaunti. Ikiwa mtumiaji alikuwa ameweka lugha zinazopendelewa na mojawapo ya lugha zinazopendelewa imeruhusiwa na sera hii, <ph name="PRODUCT_OS_NAME" /> itatumia lugha hii. Vinginevyo, <ph name="PRODUCT_OS_NAME" /> itabadilisha itumie thamani ya kwanza inayoweza kutumika na iliyobainishwa kwenye sera hii au kwenye lugha mbadala (kwa sasa ni en-US), ikiwa sera hii ina maelezo ambayo si sahihi pekee.</translation>
+<translation id="2604182581880595781">Weka mipangilio ya sera zinazohusiana na Faili ya Kushiriki katika Mtandao.</translation>
 <translation id="2623014935069176671">Subiri shughuli ya kwanza ya mtumiaji</translation>
 <translation id="262740370354162807">Wezesha uwasilishaji wa nyaraka kwenye <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Hutoa mipangilio ya printa za biashara.
@@ -662,6 +673,7 @@
 <translation id="2823870601012066791">Eneo la sajili ya Windows la viteja vya <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Washa hali Fiche</translation>
 <translation id="2838830882081735096">Usiruhusu uhamishaji data na ARC</translation>
+<translation id="2839294585867804686">Mipangilio ya Faili za Kushiriki katika Mtandao</translation>
 <translation id="2840269525054388612">Hubainisha printa ambazo mtumiaji anaweza kutumia.
 
       Sera hii hutumika tu ikiwa mipangilio ya <ph name="PRINTERS_WHITELIST" /> imechaguliwa katika <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1160,6 +1172,7 @@
       Sera hii isipowekwa, kipengele cha ukusanyaji wa faragha wa data ukitumia ufunguo wa URL kitabaki kikiwa kimewashwa lakini mtumiaji ataweza kukibadilisha.</translation>
 <translation id="4250680216510889253">La</translation>
 <translation id="4261820385751181068">Lugha ya skrini ya kuingia katika kifaa</translation>
+<translation id="4264607809747169568">Hudhibiti Faili za Kushiriki katika Mtandao kwa ajili ya upatikanaji wa ChromeOS</translation>
 <translation id="427220754384423013">Hubainisha printa ambazo mtumiaji anaweza kutumia.
 
       Sera hii hutumika tu ikiwa mipangilio ya <ph name="PRINTERS_WHITELIST" /> imechaguliwa katika <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1587,6 +1600,15 @@
       Thamani ya sera inafaa kubainishwa katika milisekunde.</translation>
 <translation id="5511702823008968136">Wezesha Upau wa Alamisho</translation>
 <translation id="5512418063782665071">URL ya ukurasa wa kwanza</translation>
+<translation id="551639594034811656">Sera hii hufafanua orodha ya asilimia ambazo zitabaini sehemu ya vifaa vya <ph name="PRODUCT_OS_NAME" /> katika OU vitakavyosasishwa kila siku kuanzia siku ambapo sasisho limegunduliwa. Wakati wa kugundua ni wa baadaye ikilinganishwa na wakati ambao sasisho limechapishwa, kwa kuwa inaweza kuwa muda mfupi uliopita baada ya kuchapisha sasisho hadi wakati kifaa kitakapokagua masasisho.
+
+      Kila jozi (siku, asilimia) linajumuisha kiasi cha asilimia ya kikundi ambacho kimesasishwa kufikia idadi fulani ya siku kuanzia wakati sasisho limegunduliwa. Kwa mfano, iwapo tuna majozi ya [(4, 40), (10, 70), (15, 100)], inaamanisha kuwa 40% ya kundi inapaswa kuwa imesasishwa siku 4 baada ya kuona sasisho. 70% inapaswa kusasishwa baada ya siku 10 na kadhalika.
+
+      Iwapo kuna thamani inayobainishwa katika sera hii, masasisho hayatazingatia sera ya <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> na yatafuata sera hii badala yake.
+
+      Iwapo orodha hii haina maudhui, mchakato hautaanzishwa na masasisho yatatumika kulingana na sera za vifaa vingine.
+
+      Sera hii haitumiki katika swichi za vituo.</translation>
 <translation id="5523812257194833591">Kipindi cha uma cha kuingia otomatiki baada ya kuchelewa.
 
       Endapo sera imewekwa, kipindi kilichobainishwa kitawekewa kumbukumbu kiotomatiki baada ya kipindi cha muda kupita katika skrini ya kuingia bila muingiliano wa mtumiaji. Kipindi cha umma lazima kiwe kimesanidiwa tayari (tazama |DeviceLocalAccounts|).
@@ -1894,6 +1916,7 @@
 <translation id="6440051664870270040">Ruhusu tovuti zivinjari kwa wakati mmoja na zifungue madirisha ibukizi</translation>
 <translation id="6447948611083700881">Vipengele vya kuhifadhi nakala na kurejesha vimezimwa</translation>
 <translation id="645425387487868471">Washa kulazimisha kuingia katika akaunti ya <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">Washa kipengele cha Kujaza Kiotomatiki kwa anwani</translation>
 <translation id="6473623140202114570">Weka mipangilio ya orodha ya vikoa ambavyo kipengele cha Kuvinjari Salama hakisababishi onyo.</translation>
 <translation id="6491139795995924304">Ruhusu Bluetooth kwenye kifaa</translation>
 <translation id="6520802717075138474">Leta injini za utafutaji kutoka kwenye kivinjari chaguomsingi wakati wa uendeshaji wa kwanza</translation>
@@ -2511,6 +2534,7 @@
     Ikiwa sera imezimwa, hakuna Utengaji kwa kila Tovuti uliobainishwa wazi utakaotokea na majaribio ya sehemu za IsolateOrigins na SitePerProcess yatazimwa. Watumaji bado wataweza kuwasha SitePerProcess wenyewe.
      Ikiwa mipangilio ya sera haijawekwa, mtumiaji ataweza kubadilisha mipangilio hii.
       </translation>
+<translation id="7902255855035461275">Michoro katika orodha hii italinganishwa dhidi ya asili ya usalama wa ombi la URL.  Ikilingana, idhini ya kufikia vifaa vya kurekodi video itatolewa bila ombi. KUMBUKA: Kabla ya toleo la 45, sera hii ilitumika katika hali ya Skrini nzima pekee.</translation>
 <translation id="7912255076272890813">Sanidi aina za programu/viendelezi zinazoruhusiwa</translation>
 <translation id="7915236031252389808">Unaweza kubainisha URL ya seva mbadala ya faili ya .pac hapa.
 
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index bdb81d4..988dbaf 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -495,6 +495,11 @@
       இந்த அமைப்பை அமைக்கப்படாமல் விட்டால், இந்தச் செயல்பாட்டைப் பயன்படுத்தவோ அல்லது பயன்படுத்தாமல் இருக்கவோ பயனர் தீர்மானிக்கலாம்
 
       <ph name="PRODUCT_NAME" /> 29 மற்றும் அதற்கு மேற்பட்ட பதிப்புகளில் இந்த அமைப்பு அகற்றப்பட்டுள்ளது.</translation>
+<translation id="2433412232489478893">இந்தக் கொள்கை, <ph name="PRODUCT_NAME" /> இன் ‘நெட்வொர்க் கோப்புப் பகிர்வுகள்’ அம்சத்தை ஒரு பயனர் பயன்படுத்துவதற்கு அனுமதிக்கலாமா என்பதைக் கட்டுப்படுத்தும்.
+
+      இந்தக் கொள்கை அமைக்கப்படவில்லை என்றால் அல்லது ‘சரி’ என்பதற்கு அமைக்கப்பட்டால், பயனர்கள் ‘நெட்வொர்க் கோப்புப் பகிர்வுகள்’ அம்சத்தைப் பயன்படுத்தலாம்.
+
+      இந்தக் கொள்கை ‘தவறு’ என்பதற்கு அமைக்கப்பட்டால், பயனர்களால் ‘நெட்வொர்க் கோப்புப் பகிர்வுகள்’ அம்சத்தைப் பயன்படுத்த முடியாது.</translation>
 <translation id="2438609638493026652">Android பயன்பாட்டின் நிறுவலின் போது, முக்கிய நிகழ்வுகளை Googleக்கு அறிக்கையிடுவதை இயக்கும். கொள்கை வழியாகத் தூண்டப்பட்டு நிறுவிய பயன்பாடுகளுக்கு மட்டுமே நிகழ்வுகள் பதிவுசெய்யப்படும்.
 
       கொள்கை "சரி" என அமைக்கப்பட்டால், நிகழ்வுகள் பதிவுசெய்யப்படும்.
@@ -572,6 +577,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> இல் காட்டப்படக்கூடிய மொழிகளை உள்ளமைக்கிறது.
 
       இந்தக் கொள்கை அமைக்கப்பட்டால், பயனரால் இந்தக் கொள்கையில் குறிப்பிடப்படும் மொழிகளில் ஒன்றில் மட்டுமே <ph name="PRODUCT_OS_NAME" />ஐக் காட்டும்படி உள்ளமைக்க முடியும். இந்தக் கொள்கை அமைக்கப்படவில்லை என்றாலோ அல்லது வெற்றுப் பட்டியலாக அமைக்கப்பட்டாலோ, ஆதரிக்கப்படும் எல்லா மொழிகளிலும், <ph name="PRODUCT_OS_NAME" />ஐக் காட்ட முடியும். இந்தக் கொள்கையானது தவறான மதிப்புகளைக் கொண்ட பட்டியலாக அமைக்கப்பட்டால், எல்லா தவறான மதிப்புகளும் புறக்கணிக்கப்படும். இந்தக் கொள்கை அனுமதிக்காத மொழியில் <ph name="PRODUCT_OS_NAME" /> ஐக் காட்டும்படி ஏற்கனவே பயனர் உள்ளமைத்திருந்தால், அடுத்தமுறை பயனர் உள்நுழையும் போது, காட்டப்படும் மொழியானது அனுமதிக்கப்படும் மொழிக்கு மாறும். விருப்ப மொழிகளை பயனர் உள்ளமைத்திருந்து, அந்த விருப்ப மொழிகளில் ஒன்று இந்தக் கொள்கையால் அனுமதிக்கப்பட்டால், அந்த மொழிக்கு <ph name="PRODUCT_OS_NAME" /> மாறும். இல்லையெனில், இந்தக் கொள்கையால் குறிப்பிடப்படும் சரியான முதல் மதிப்பில் <ph name="PRODUCT_OS_NAME" /> காட்டப்படும் அல்லது இந்தக் கொள்கையில் தவறான உள்ளீடுகள் மட்டுமே இருந்தால், இயல்பு மொழியில் (தற்சமயம் en-US) காட்டப்படும்.</translation>
+<translation id="2604182581880595781">’நெட்வொர்க் கோப்புப் பகிர்வு’ அம்சம் தொடர்பான கொள்கைகளை உள்ளமைக்கும்.</translation>
 <translation id="2623014935069176671">துவக்கப் பயனர் செயல்பாட்டிற்காக காத்திரு</translation>
 <translation id="262740370354162807"><ph name="CLOUD_PRINT_NAME" /> இல் ஆவணங்களைச் சமர்ப்பித்தலை இயக்கு</translation>
 <translation id="2627554163382448569">நிறுவனப் பிரிண்டர்களுக்கு உள்ளமைவுகளை வழங்கும்.
@@ -651,6 +657,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> கிளையன்ட்டுகளுக்கான Windows பதிவக இருப்பிடம்:</translation>
 <translation id="2824715612115726353">மறைநிலை பயன்முறையை இயக்கு</translation>
 <translation id="2838830882081735096">தரவு நகர்த்துதலையும் ARCஐயும் அனுமதிக்காதே</translation>
+<translation id="2839294585867804686">’நெட்வொர்க் கோப்புப் பகிர்வு’ அமைப்புகள்</translation>
 <translation id="2840269525054388612">பயனர் பயன்படுத்தக்கூடிய பிரிண்டர்களைக் குறிப்பிடும்.
 
       <ph name="DEVICE_PRINTERS_ACCESS_MODE" />க்கு <ph name="PRINTERS_WHITELIST" /> தேர்வு செய்யப்பட்டால் மட்டுமே, இந்தக் கொள்கை பயன்படுத்தப்படும்.
@@ -1160,6 +1167,7 @@
       இந்தக் கொள்கையை அமைக்காவிட்டால், URLகளோடு சேகரிக்கப்படும் அடையாளமற்ற தரவுத் தொகுப்பு இயக்கப்படும், எனினும் பயனரால் அதை மாற்ற முடியும்.</translation>
 <translation id="4250680216510889253">இல்லை</translation>
 <translation id="4261820385751181068">சாதன உள்நுழைவுத் திரையின் மொழி</translation>
+<translation id="4264607809747169568">ChromeOSஸின் கிடைக்கும்நிலைக்கான ‘நெட்வொர்க் கோப்புப் பகிர்வுகள்’ அம்சத்தைக் கட்டுப்படுத்தும்</translation>
 <translation id="427220754384423013">பயனர் பயன்படுத்தக்கூடிய பிரிண்டர்களைக் குறிப்பிடும்.
 
       <ph name="BULK_PRINTERS_ACCESS_MODE" />க்கு <ph name="PRINTERS_WHITELIST" /> தேர்வு செய்யப்பட்டால் மட்டுமே, இந்தக் கொள்கை பயன்படுத்தப்படும்.
@@ -1566,6 +1574,15 @@
       கொள்கை மதிப்பை மில்லிவினாடிகளில் குறிப்பிட வேண்டும்.</translation>
 <translation id="5511702823008968136">புக்மார்க் பட்டியை இயக்கு</translation>
 <translation id="5512418063782665071">முகப்புப் பக்க URL</translation>
+<translation id="551639594034811656">இந்தக் கொள்கை, OUவில் உள்ள <ph name="PRODUCT_OS_NAME" /> சாதனங்களின் ஒரு பகுதியை, புதுப்பிப்பு முதலில் கண்டறியப்பட்ட நாளிலிருந்து தொடங்கி ஒவ்வொரு நாளும் ஒரு புதுப்பிப்பைச் செய்வதை வரையறுப்பதற்கான சதவிகிதங்களின் பட்டியலை வரையறுக்கிறது. புதுப்பிப்பு கண்டறியப்படும் நேரமானது புதுப்பிப்பு வெளியிடப்பட்ட நேரத்தை விடப் பிந்தையதாக இருக்கும், ஏனெனில் சாதனம் புதுப்பிப்புகளைச் சரிபார்க்கும் நேரத்தை விட புதுப்பிப்பு வெளியிடப்பட்ட நேரம் பிந்தையதாக இருக்க வாய்ப்புள்ளது.
+
+      ஒவ்வொரு (நாள், சதவிகிதம்) இணையிலும், புதுப்பிப்பு கண்டறியப்பட்ட நாளிலிருந்து கணக்கிடப்படும் நாட்களுக்குள் புதுப்பிக்கப்பட வேண்டிய சாதனங்களின் சதவிகிதம் இருக்கும். எடுத்துக்காட்டாக, இணைகளின் மதிப்பானது [(4, 40), (10, 70), (15, 100)] என்று இருந்தால், புதுப்பிப்பு கண்டறியப்பட்டதிலிருந்து 4 நாட்களுக்குப் பிறகு 40% சாதனங்கள் புதுப்பிக்கப்பட வேண்டும்.10 நாட்களுக்குப் பிறகு 70% சாதனங்கள் புதுப்பிக்கப்பட வேண்டும். அதற்கடுத்த மதிப்புகள் முறையே அதற்கடுத்த பதிப்புப் புதுப்பிப்புக்கான சாதனங்களின் சதவிகிதங்களை வரையறுக்கும்.
+
+      இந்தக் கொள்கைக்கென ஒரு மதிப்பு அமைக்கப்பட்டிருந்தால், புதுப்பிப்புகள் <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> கொள்கையைப் புறக்கணித்து, பதிலாக இந்தக் கொள்கையை நடைமுறைப்படுத்தும்.
+
+      பட்டியல் காலியாக இருந்தால், பதிப்புகள் படிப்படியாகப் புதுப்பிக்கப்படாமல், பிற சாதனக் கொள்கைகளின்படி புதுப்பிக்கப்படும்.
+
+      சேனல் மாற்றங்களுக்கு இந்தக் கொள்கை பொருந்தாது.</translation>
 <translation id="5523812257194833591">தாமதத்திற்குப் பிறகு தானாக உள்நுழைவதற்கான பொது அமர்வு.
 
       இந்தக் கொள்கை அமைக்கப்பட்டால், பயனர் இடையீட்டுச் செயலில்லாமல் உள்நுழைவுத் திரையில் குறிப்பிட்ட காலம் கடந்த பிறகு குறிப்பிட்ட அமர்வானது தானாக உள்நுழைந்துவிடும். ஏற்கனவே பொது அமர்வு உள்ளமைக்கப்பட்டிருக்க வேண்டும் (|DeviceLocalAccounts| ஐக் காண்க).
@@ -2458,6 +2475,9 @@
       கொள்கை முடக்கப்பட்டிருந்தால், வெளிப்படையாகத் தளத்தைத் தனிப்படுத்தும் செயல்முறை எதுவும் நடக்காது. IsolateOrigins மற்றும் SitePerProcessஸின் புலச் சோதனைகள் முடக்கப்படும். பயனர்களால் SitePerProcessஸை கைமுறையாக இயக்க முடியும்.
       கொள்கை உள்ளமைக்கப்படவில்லை என்றால், பயனரால் இந்த அமைப்பை மாற்ற முடியும்.
       </translation>
+<translation id="7902255855035461275">இந்தப் பட்டியலில் உள்ள பேட்டர்ன்கள், கோரப்படும் URLலின் பாதுகாப்பு மூலத்துடன் ஒப்பிடப்படும்.  பொருத்தம் கண்டறிப்பட்டால், எந்த அறிவிப்பும் இல்லாமல், வீடியோப் படமெடுக்கும் சாதனங்களுக்கு அணுகல் வழங்கப்படும்.
+
+      குறிப்பு: பதிப்பு 45 வரை, கியோஸ்க் பயன்முறையில் மட்டுமே இந்தக் கொள்கை ஆதரிக்கப்பட்டது.</translation>
 <translation id="7912255076272890813">அனுமதிக்கப்படும் பயன்பாடு/நீட்டிப்பு வகைகளை உள்ளமை</translation>
 <translation id="7915236031252389808">ப்ராக்ஸி .pac கோப்பின் URLஐ இங்கே குறிப்பிடலாம்.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index a9f7a63..4b488655 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -339,6 +339,11 @@
       ఈ సెట్టింగ్‌ను నిర్దేశించకుండా వదిలేస్తే, డిఫాల్ట్ విలువ ఉపయోగించబడుతుంది.
 
       ఈ విధానాన్ని సెట్ చేయకపోతే, అన్ని సెట్టింగ్‌ల కోసం డిఫాల్ట్‌లు ఉపయోగించబడతాయి.</translation>
+<translation id="1958138414749279167"><ph name="PRODUCT_NAME" />లో ఆటోఫిల్‌ ఫీచర్‌ని ప్రారంభించడంతో పాటు ఇంతకముందు నిల్వ చేసిన సమాచారాన్ని ఉపయోగించి వెబ్ ఫారమ్‌లలో చిరునామా సమాచారాన్ని ఆటోమేటిక్‌గా పూర్తి చేయడానికి వినియోగదారులను అనుమతిస్తుంది.
+
+      ఒకవేళ ఈ సెట్టింగ్ నిలిపివేయబడితే, వినియోగదారు బ్రౌజ్ చేసేటప్పుడు చిరునామా సమాచారం ఏదీ సూచించదు, ఆటోమేటిక్‌గా పూరించదు, అలాగే వినియోగదారు ఏదైనా అదనపు చిరునామా సమాచారాన్ని సమర్పిస్తే, దానిని కూడా నిల్వ చేయదు.
+
+      ఒకవేళ ఈ సెట్టింగ్‌ని ప్రారంభించినట్లైతే లేదా సెట్ చేయనట్లైతే, UIకి సంబంధించిన వరకు చిరునామాలు ఏవి ఆటోఫిల్‌ చేయాలో, చేయకూడదో వినియోగదారులు నియంత్రించవచ్చు.</translation>
 <translation id="1960840544413786116">subjectAlternativeName పొడిగింపు లేని స్థానిక విశ్వసనీయ యాంకర్‌ల ద్వారా మంజూరు చేయబడిన ప్రమాణపత్రాలను అనుమతించాలో లేదో నిశ్చయించండి</translation>
 <translation id="1964634611280150550">అజ్ఞాత మోడ్ నిలిపివేయబడింది</translation>
 <translation id="1964802606569741174">ఈ విధానం Android YouTube అనువర్తనంపై ఎలాంటి ప్రభావాన్ని చూపదు. YouTubeలో సురక్షిత మోడ్ అమలు చేయదలిస్తే, Android YouTube అనువర్తనం ఇన్‌స్టాలేషన్ అనుమతించకూడదు.</translation>
@@ -1337,6 +1342,15 @@
 
 ఈ విధానం సెట్ చేయకపోతే, డిఫాల్ట్ రోమింగ్ ప్రొఫైల్ పథం ఉపయోగించబడుతుంది.</translation>
 <translation id="4239720644496144453">Android అనువర్తనాల కోసం కాష్ ఉపయోగించబడదు. అనేకమంది వినియోగదారులు ఒకే Android అనువర్తనాన్ని ఇన్‌స్టాల్ చేస్తే, ప్రతి వినియోగదారు కోసం అది కొత్తగా డౌన్‌లోడ్ చేయబడుతుంది.</translation>
+<translation id="4243336580717651045"><ph name="PRODUCT_NAME" />లో URL కీ ఉన్న అజ్ఞాతీకరించిన డేటా సేకరణను ప్రారంభించి, ఈ సెట్టింగ్‌ను మార్చనీయకుండా వినియోగదారులను నిరోధిస్తుంది.
+
+      URL-కీ ఉన్న అజ్ఞాతీకరించిన డేటా సేకరణ శోధనలు మరియు బ్రౌజింగ్‌ను మెరుగ్గా చేయడానికి వినియోగదారు సందర్శించే పేజీల URLలను Googleకు పంపుతుంది.
+
+      మీరు ఈ విధానాన్ని ప్రారంభిస్తే, URL-కీ ఉన్న అజ్ఞాతీకరించిన డేటా సేకరణ ఎల్లప్పుడూ యాక్టివ్‌గా ఉంటుంది.
+
+      మీరు ఈ విధానాన్ని నిలిపివేస్తే, URL-కీ ఉన్న అజ్ఞాతీకరించిన డేటా సేకరణ ఎప్పుడూ యాక్టివ్ కాదు.
+
+      ఈ విధానాన్ని సెట్ చేయకపోతే, URL-కీ ఉన్న అజ్ఞాతీకరించిన డేటా సేకరణ ప్రారంభించబడుతుంది, కానీ వినియోగదారు దీన్ని మార్చగలుగుతారు.</translation>
 <translation id="4250680216510889253">కాదు</translation>
 <translation id="4261820385751181068">పరికర సైన్-ఇన్ స్క్రీన్ లొకేల్</translation>
 <translation id="427220754384423013">వినియోగదారు ఉపయోగించగల ప్రింటర్‌లను పేర్కొంటుంది.
@@ -2103,6 +2117,7 @@
           తాత్కాలికంగా నిలిపివేసినప్పుడు స్క్రీన్ లాక్‌ను ప్రారంభించడం అనేది నిష్క్రియంగా ఉన్నప్పుడు స్క్రీన్ లాక్ చేయడానికి సిఫార్సు చేయదగిన పద్ధతి మరియు ఈ పద్ధతిలో నిష్క్రియ ఆలస్యం తర్వాత <ph name="PRODUCT_OS_NAME" /> తాత్కాలికంగా నిలిపివేయబడుతుంది. స్క్రీన్ లాక్ చేయడం అనేది తాత్కాలికంగా నిలిపివేయడానికి గణనీయ సమయం కంటే ముందు సంభవించాలన్నప్పుడు లేదా నిష్క్రియంగా ఉన్నప్పుడు ఆపివేయడం అసలు అవసరం కానప్పుడు మాత్రమే ఈ విధానాన్ని ఉపయోగించాలి.
 
           విధానం విలువను మిల్లీసెకన్లలో పేర్కొనాలి. విలువలు నిష్క్రియ ఆలస్యం కంటే తక్కువకు అమర్చాలి.</translation>
+<translation id="6097601282776163274">URL-కీ ఉన్న అజ్ఞాతీకరించిన డేటా సేకరణను ప్రారంభించండి</translation>
 <translation id="6111936128861357925">డైనోసార్ ఈస్టర్ ఎగ్ గేమ్‌ను అనుమతించండి</translation>
 <translation id="6114416803310251055">తగ్గిన విలువ</translation>
 <translation id="6133088669883929098">కీ ఉత్పాదనను ఉపయోగించడానికి అన్ని సైట్‌లను అనుమతించు</translation>
@@ -2178,6 +2193,7 @@
 <translation id="6440051664870270040">ఏకకాలంలో నావిగేట్ చేయడానికి మరియు పాప్-అప్‌లను తెరవడానికి సైట్‌లను అనుమతించండి</translation>
 <translation id="6447948611083700881">బ్యాకప్ మరియు పునరుద్ధరణ నిలిపివేయబడింది</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> కోసం నిర్బంధ సైన్ ఇన్‌ను ప్రారంభించండి</translation>
+<translation id="6464074037294098618">చిరునామాల కోసం ఆటోఫిల్‌ను ప్రారంభించండి</translation>
 <translation id="6467613372414922590">వినియోగదారు స్థాయి స్థానిక సందేశ హోస్ట్‌లను (నిర్వాహకుల అనుమతులు లేకుండా ఇన్‌స్టాల్ చేయబడినవి) అనుమతించండి</translation>
 <translation id="6468980648680553776">ఈ విధానం నిలిపివేయబడింది. దయచేసి బదులుగా RemoteAccessHostClientDomainListని ఉపయోగించండి.</translation>
 <translation id="6473623140202114570">హెచ్చరికలను సక్రియం చేయని సురక్షిత బ్రౌజింగ్‌ డొమైన్‌ల జాబితాను కాన్ఫిగర్ చేయండి.</translation>
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index ad137e7e..88ca203 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -289,6 +289,11 @@
       หากไม่ได้ระบุการตั้งค่า ระบบจะใช้ค่าเริ่มต้น
 
       หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้ค่าเริ่มต้นสำหรับการตั้งค่าทั้งหมด</translation>
+<translation id="1958138414749279167">เปิดใช้ฟีเจอร์ป้อนข้อความอัตโนมัติของ <ph name="PRODUCT_NAME" /> และอนุญาตให้ผู้ใช้ป้อนข้อมูลที่อยู่ในเว็บฟอร์มโดยอัตโนมัติด้วยข้อมูลที่เก็บไว้ก่อนหน้านี้
+
+      หากคุณปิดใช้การตั้งค่านี้ ฟีเจอร์ป้อนข้อความอัตโนมัติจะไม่แนะนำหรือกรอกข้อมูลที่อยู่ให้โดยอัตโนมัติ และจะไม่บันทึกข้อมูลที่อยู่ที่ผู้ใช้อาจส่งมาขณะเรียกดูเว็บ
+
+      หากคุณเปิดใช้การตั้งค่านี้หรือไม่ได้กำหนดค่าไว้ ผู้ใช้จะควบคุมฟีเจอร์ป้อนข้อความอัตโนมัติสำหรับที่อยู่ได้ใน UI</translation>
 <translation id="1960840544413786116">จะอนุญาตใบรับรองที่ออกโดย Trust Anchor ในพื้นที่ที่ไม่มีส่วนขยาย subjectAlternativeName หรือไม่</translation>
 <translation id="1964634611280150550">ปิดใช้งานโหมดไม่ระบุตัวตน</translation>
 <translation id="1964802606569741174">นโยบายนี้ไม่มีผลสำหรับแอป YouTube ของ Android หากมีการใช้โหมดปลอดภัยใน YouTube ควรยกเลิกการอนุญาตการติดตั้งแอป YouTube ใน Android</translation>
@@ -499,6 +504,11 @@
       หากไม่ได้กำหนดการตั้งค่านี้ ผู้ใช้จะสามารถตัดสินใจว่าจะใช้หรือไม่ใช้ฟังก์ชันนี้
 
       การตั้งค่านี้ได้ถูกนำออกจาก <ph name="PRODUCT_NAME" /> 29 และเวอร์ชันที่สูงกว่าแล้ว</translation>
+<translation id="2433412232489478893">นโยบายนี้ใช้กำหนดว่าผู้ใช้ได้รับอนุญาตให้ใช้ฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายสำหรับ <ph name="PRODUCT_NAME" /> หรือไม่
+
+      ถ้าไม่ได้กำหนดค่านโยบายนี้หรือตั้งค่าเป็น "จริง" ผู้ใช้จะใช้ฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายได้
+
+      ถ้าตั้งค่านโยบายนี้เป็น "เท็จ" ผู้ใช้จะใช้ฟีเจอร์พื้นที่แชร์ไฟล์ของเครือข่ายไม่ได้</translation>
 <translation id="2438609638493026652">เปิดใช้การรายงานเหตุการณ์สำคัญระหว่างการติดตั้งแอป Android ไปยัง Google รายงานจะบันทึกเหตุการณ์ของแอปที่มีการเรียกใช้การติดตั้งผ่านนโยบายเท่านั้น
 
       หากตั้งค่านโยบายเป็น "จริง" ระบบจะบันทึกเหตุการณ์
@@ -575,6 +585,7 @@
 <translation id="2598508021807251719">กำหนดค่าภาษาที่ <ph name="PRODUCT_OS_NAME" /> แสดงได้
 
       หากตั้งค่านโยบายนี้ ผู้ใช้จะสามารถกำหนดค่าให้ <ph name="PRODUCT_OS_NAME" /> แสดงในภาษาที่ระบุไว้ในนโยบายนี้เท่านั้น หากไม่ได้ตั้งค่านโยบายนี้หรือตั้งค่าเป็นรายการว่างเปล่า <ph name="PRODUCT_OS_NAME" /> จะแสดงได้ในทุกภาษา UI ที่รองรับ หากตั้งค่านโยบายเป็นรายการที่มีค่าที่ไม่ถูกต้อง ระบบจะเพิกเฉยต่อค่าที่ไม่ถูกต้องทั้งหมด หากผู้ใช้เคยกำหนดค่า <ph name="PRODUCT_OS_NAME" /> ให้แสดงในภาษาที่นโยบายนี้ไม่อนุญาต ระบบจะเปลี่ยนภาษาที่แสดงเป็นภาษา UI ที่อนุญาตในครั้งถัดไปที่ผู้ใช้ลงชื่อเข้าใช้ หากเคยกำหนดค่าภาษาที่ต้องการและนโยบายอนุญาตภาษาที่ต้องการ <ph name="PRODUCT_OS_NAME" /> จะเปลี่ยนไปใช้ภาษานี้ มิเช่นนั้น <ph name="PRODUCT_OS_NAME" /> จะเปลี่ยนไปใช้ค่าที่ถูกต้องค่าแรกที่นโยบายระบุไว้หรือเปลี่ยนไปใช้ภาษาสำรอง (ซึ่งตอนนี้คือ en-US) หากนโยบายนี้มีแต่รายการที่ไม่ถูกต้อง</translation>
+<translation id="2604182581880595781">กำหนดค่านโยบายที่เกี่ยวข้องกับพื้นที่แชร์ไฟล์ของเครือข่าย</translation>
 <translation id="2623014935069176671">รอกิจกรรมเริ่มต้นของผู้ใช้</translation>
 <translation id="262740370354162807">เปิดใช้งานการส่งเอกสารไปยัง <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">ระบุการกำหนดค่าสำหรับเครื่องพิมพ์ขององค์กร
@@ -653,6 +664,7 @@
 <translation id="2823870601012066791">ตำแหน่งรีจิสทรีของ Windows สำหรับไคลเอ็นต์ของ <ph name="PRODUCT_OS_NAME" /> คือ</translation>
 <translation id="2824715612115726353">เปิดใช้งานโหมดไม่ระบุตัวตน</translation>
 <translation id="2838830882081735096">ไม่อนุญาตให้ย้ายข้อมูลและใช้ ARC</translation>
+<translation id="2839294585867804686">การตั้งค่าพื้นที่แชร์ไฟล์ของเครือข่าย</translation>
 <translation id="2840269525054388612">ระบุเครื่องพิมพ์ที่ผู้ใช้ใช้งานได้
 
       ใช้นโยบายนี้ต่อเมื่อเลือก <ph name="PRINTERS_WHITELIST" /> สำหรับโหมด <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> เท่านั้น
@@ -1129,6 +1141,7 @@
       หากไม่ได้ตั้งค่านโยบายนี้ จะมีการเปิดใช้การรวบรวมข้อมูลที่ไม่ระบุตัวบุคคลซึ่งผูกกับ URL แต่ผู้ใช้จะเปลี่ยนการตั้งค่าได้</translation>
 <translation id="4250680216510889253">ไม่มี</translation>
 <translation id="4261820385751181068">ภาษาในหน้าจอการลงชื่อเข้าใช้อุปกรณ์</translation>
+<translation id="4264607809747169568">ควบคุมพื้นที่แชร์ไฟล์ของเครือข่ายเพื่อการพร้อมใช้งานของ ChromeOS</translation>
 <translation id="427220754384423013">ระบุเครื่องพิมพ์ที่ผู้ใช้ใช้งานได้
 
       ใช้นโยบายนี้ต่อเมื่อเลือก <ph name="PRINTERS_WHITELIST" /> สำหรับโหมด <ph name="BULK_PRINTERS_ACCESS_MODE" /> เท่านั้น
@@ -1530,6 +1543,14 @@
       ค่าในนโยบายควรระบุด้วยหน่วยมิลลิวินาที</translation>
 <translation id="5511702823008968136">เปิดใช้งานแถบบุ๊กมาร์ก</translation>
 <translation id="5512418063782665071">URL ของหน้าแรก</translation>
+<translation id="551639594034811656">นโยบายนี้จะกำหนดรายการเปอร์เซ็นต์ที่จะแบ่งส่วนของอุปกรณ์ <ph name="PRODUCT_OS_NAME" /> ใน OU ที่จะอัปเดตต่อวันโดยเริ่มจากวันที่พบอัปเดตเป็นครั้งแรก เวลาที่พบจะมาทีหลังเวลาเผยแพร่การอัปเดตเพราะอาจต้องใช้เวลาสักระยะ ก่อนที่อุปกรณ์จะตรวจหาอัปเดตหลังจากที่มีการเผยแพร่อัปเดต
+
+      คู่รายการ (วัน เปอร์เซ็นต์) แต่ละคู่จะบอกจำนวนเปอร์เซ็นต์ของอุปกรณ์ที่จะต้องอัปเดตภายในจำนวนวันที่ระบุนับจากที่พบอัปเดต เช่น คู่รายการ [(4, 40), (10, 70), (15, 100)] หมายความว่า 40% ของอุปกรณ์ควรต้องอัปเดตภายใน 4 วันนับจากที่พบอัปเดต, 70% ของอุปกรณ์ควรจะต้องอัปเดตภายใน 10 วัน คู่รายการต่อไปก็เป็นไปในทำนองเดียวกัน
+      หากมีการกำหนดค่าไว้ในนโยบายนี้ ระบบจะไม่ใช้นโยบาย <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> ในการอัปเดต แต่จะใช้นโยบายนี้แทน
+
+      หากรายการนี้ว่างเปล่า จะไม่มีการกำหนดแบบทีละขั้นและระบบจะทำการอัปเดตตามนโยบายอื่นๆ ของอุปกรณ์
+
+      นโยบายนี้ไม่มีผลกับการเปลี่ยนช่อง</translation>
 <translation id="5523812257194833591">เซสชันสาธารณะเพื่อการเข้าสู่ระบบอัตโนมัติหลังจากความล่าช้า
 
       หากมีการตั้งค่านโยบายนี้ เซสชันที่ระบุจะถูกลงชื่อเข้าใช้อัตโนมัติหลังจากช่วงเวลาหนึ่งได้ล่วงเลยไปบนหน้าจอการเข้าสู่ระบบโดยไม่มีการโต้ตอบของผู้ใช้ เซสชันสาธารณะต้องได้รับการกำหนดค่าไว้แล้ว (ดู |DeviceLocalAccounts|)
@@ -1826,6 +1847,7 @@
 <translation id="6440051664870270040">อนุญาตให้เว็บไซต์นำทางและเปิดป๊อปอัปพร้อมกันได้</translation>
 <translation id="6447948611083700881">การสำรองและกู้คืนข้อมูลปิดใช้อยู่</translation>
 <translation id="645425387487868471">เปิดใช้การบังคับลงชื่อเข้าใช้สำหรับ <ph name="PRODUCT_NAME" /></translation>
+<translation id="6464074037294098618">เปิดใช้ป้อนข้อความอัตโนมัติสำหรับที่อยู่</translation>
 <translation id="6473623140202114570">กำหนดค่ารายการโดเมนที่ Safe Browsing จะไม่เรียกให้คำเตือนแสดง</translation>
 <translation id="6491139795995924304">อนุญาตบลูทูธบนอุปกรณ์</translation>
 <translation id="6520802717075138474">นำเข้าเครื่องมือค้นหาจากเบราว์เซอร์เริ่มต้นในการเรียกใช้งานครั้งแรก</translation>
@@ -2428,6 +2450,11 @@
       หากปิดใช้นโยบาย จะไม่มีการแยกเว็บไซต์อย่างชัดเจนและระบบจะปิดใช้การทดลองใช้งานจริงของ IsolateOrigins และ SitePerProcess โดยที่ผู้ใช้จะยังเปิดใช้ SitePerProcess ด้วยตนเองได้อยู่
       หากไม่ได้กำหนดค่านโยบายไว้ ผู้ใช้จะเปลี่ยนการตั้งค่านี้ได้
       </translation>
+<translation id="7902255855035461275">รูปแบบในรายการนี้จะจับคู่กับต้นทาง
+      การรักษาความปลอดภัยของ URL ที่ขอ หากพบต้นทางที่ตรงกัน ระบบจะอนุญาตให้
+      เข้าถึงอุปกรณ์จับภาพวิดีโอโดยไม่แจ้งเตือน
+
+      หมายเหตุ: ใช้นโยบายนี้ได้ในโหมดคีออสก์เท่านั้นจนถึงเวอร์ชัน 45</translation>
 <translation id="7912255076272890813">กำหนดค่าประเภทแอปพลิเคชัน/ส่วนขยายที่อนุญาต</translation>
 <translation id="7915236031252389808">คุณสามารถระบุ URL ไปยังไฟล์ .pac ของพร็อกซีได้ที่นี่
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 4f2b0c71..5b24cc7e 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -301,6 +301,11 @@
       Bir ayar yapılandırılmadan bırakılırsa varsayılan bir değer kullanılır.
 
       Bu politika ayarlanmazsa tüm ayarlar için varsayılanlar kullanılır.</translation>
+<translation id="1958138414749279167"><ph name="PRODUCT_NAME" /> Otomatik Doldurma özelliğini etkinleştirir ve kullanıcıların web formlarındaki  adres bilgilerini önceden kaydedilmiş bilgilerle otomatik olarak doldurmasına olanak tanır.
+
+      Bu ayar devre dışı bırakılırsa Otomatik Doldurma hiçbir zaman öneride bulunmaz, adres bilgilerini doldurmaz veya kullanıcının internette gezerken gönderebileceği ek adres bilgilerini kaydetmez.
+
+      Bu ayar etkinleştirilirse veya bir değer ayarlanmazsa kullanıcı, kullanıcı arayüzündeki adresler için Otomatik Doldurma özelliğini kontrol edebilir.</translation>
 <translation id="1960840544413786116">Yerel güven bağlantıları tarafından yayınlanan ve subjectAlternativeName uzantısı bulunmayan sertifikalara izin verilip verilmeyeceği</translation>
 <translation id="1964634611280150550">Gizli mod devre dışı</translation>
 <translation id="1964802606569741174">Bu politikanın Android YouTube uygulaması üzerinde hiçbir etkisi yoktur. YouTube'da Güvenlik Modu uygulanacaksa Android YouTube uygulamasının yüklenmesine izin verilmemelidir.</translation>
@@ -515,6 +520,11 @@
       Bu ayar belirlenmemiş olarak bırakılırsa kullanıcı bu işlevi kullanıp kullanmayacağına karar verebilir.
 
       Bu ayar, <ph name="PRODUCT_NAME" /> 29 ve sonraki sürümlerinde kaldırılmıştır.</translation>
+<translation id="2433412232489478893">Bu politika, <ph name="PRODUCT_NAME" /> için Ağ Üzerinde Dosya Paylaşımı özelliğine belirli bir kullanıcı için izin verilip verilmediğini kontrol eder.
+
+      Bu politika True (Doğru) değerine yapılandırılmaz veya ayarlanmazsa, kullanıcılar Ağ Üzerinde Dosya Paylaşımı özelliğini kullanabilirler.
+
+      Bu politika False (Yanlış) değerine ayarlanırsa, kullanıcılar Ağ Üzerinde Dosya Paylaşımı özelliğini kullanamazlar</translation>
 <translation id="2438609638493026652">Android uygulaması yüklemesi sırasında önemli etkinliklerin Google'a bildirilmesini sağlar. Etkinlikler yalnızca yüklemesini politikanın tetiklediği uygulamalar için yakalanır.
 
       Politika true (doğru) değerine ayarlanırsa etkinlikler günlüğe kaydedilir.
@@ -596,6 +606,7 @@
 <translation id="2598508021807251719"><ph name="PRODUCT_OS_NAME" /> ürününün görüntülenebileceği yerel ayarları yapılandırır.
 
       Bu politika ayarlanırsa kullanıcı, <ph name="PRODUCT_OS_NAME" /> ürününü yalnızca bu politikada belirtilen yerel ayarların birinde görüntülenecek şekilde yapılandırabilir. Bu politika ayarlanmazsa veya boş bir listeye ayarlanırsa <ph name="PRODUCT_OS_NAME" />, desteklenen tüm kullanıcı arayüzü yerel ayarlarında görüntülenebilir. Bu politika geçersiz değerler içeren bir listeye ayarlanırsa tüm geçersiz değerler yoksayılır. Bir kullanıcı daha önce <ph name="PRODUCT_OS_NAME" /> ürününü bu politika tarafından izin verilmeyen bir yerel ayarda görüntülenecek şekilde yapılandırmışsa, kullanıcı tekrar oturum açtığında görüntüleme yerel ayarı izin verilen bir kullanıcı arayüzü yerel ayarıyla değiştirilir. Kullanıcı tercih edilen yerel ayarları yapılandırdıysa ve bu politika, tercih edilen yerel ayarlardan birine izin veriyorsa <ph name="PRODUCT_OS_NAME" />, bu yerel ayara geçiş yapar. Aksi halde, <ph name="PRODUCT_OS_NAME" /> bu politika tarafından belirtilen geçerli değere veya bu politika yalnızca geçersiz girişler içerirse bir yedek yerel ayara (şu anda en-US) geçiş yapar.</translation>
+<translation id="2604182581880595781">Ağ Üzerinde Dosya Paylaşımı ile ilgili politikaları yapılandırın.</translation>
 <translation id="2623014935069176671">İlk kullanıcı etkinliğini bekle</translation>
 <translation id="262740370354162807">Dokümanların <ph name="CLOUD_PRINT_NAME" /> için gönderilmesini etkinleştir</translation>
 <translation id="2627554163382448569">Kurumsal yazıcılar için yapılandırmalar sağlar.
@@ -681,6 +692,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" /> istemcileri için Windows kayıt defteri konumu:</translation>
 <translation id="2824715612115726353">Gizli modu etkinleştir</translation>
 <translation id="2838830882081735096">Veri taşıma ve ARC'ye izin verme</translation>
+<translation id="2839294585867804686">Ağ Üzerinde Dosya Paylaşımı ayarları</translation>
 <translation id="2840269525054388612">Bir kullanıcının kullanabileceği yazıcıları belirtir.
 
       Bu politika yalnızca <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> için <ph name="PRINTERS_WHITELIST" /> değeri seçilirse kullanılır.
@@ -1167,6 +1179,7 @@
       Bu politika ayarlanmadan bırakılırsa URL içeren veya URL'lerle ilişkili anonim veri toplama özelliği etkinleştirilir ancak kullanıcı tarafından kapatılabilir.</translation>
 <translation id="4250680216510889253">Hayır</translation>
 <translation id="4261820385751181068">Cihaz oturum açma ekranı yerel ayarı</translation>
+<translation id="4264607809747169568">ChromeOS için Ağ Üzerinde Dosya Paylaşımı'nın kullanılabilirliğini kontrol eder</translation>
 <translation id="427220754384423013">Kullanıcının kullanabileceği yazıcıları belirtir.
 
       Bu politika yalnızca <ph name="BULK_PRINTERS_ACCESS_MODE" /> için <ph name="PRINTERS_WHITELIST" /> değeri seçilirse kullanılır.
@@ -1596,6 +1609,15 @@
       Politika değeri milisaniye cinsinden belirtilmelidir.</translation>
 <translation id="5511702823008968136">Yer İşareti Çubuğunu etkinleştir</translation>
 <translation id="5512418063782665071">Ana sayfa URL'si</translation>
+<translation id="551639594034811656">Bu politika, güncellemenin ilk keşfedildiği günden başlamak üzere kuruluş biriminde günlük olarak güncellenecek <ph name="PRODUCT_OS_NAME" /> cihazlarının oranını gösteren yüzde değerlerin listesini tanımlar. Güncelleme yayınlandıktan sonra cihazın güncellemeleri kontrol etmesi biraz zaman aldığından, keşif zamanı güncelleme zamanından sonradır.
+
+      Gün ve yüzde değerinden oluşan her çift, güncelleme yayınlandıktan sonra hangi günde cihaz grubunun yüzde kaçının güncelleneceğini gösterir. Örneğin, politikada [(4, 40), (10, 70), (15, 100)] çiftleri ayarlandıysa, grubun %40'ı güncelleme görüldükten 4 gün sonra, %70'i 10 gün sonra vb. güncellenmelidir.
+
+      Bu politika için tanımlanmış bir değer varsa güncellemeler <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> politikasını yoksayıp bu politikayı uygular.
+
+      Bu liste boşsa aşama olmaz ve güncellemeler diğer cihaz politikalarına göre uygulanır.
+
+      Bu politika kanal geçişlerine uygulanmaz.</translation>
 <translation id="5523812257194833591">Gecikme sonrasında otomatik olarak giriş yapılacak herkese açık oturum.
 
       Bu politika ayarlanırsa, giriş ekranında kullanıcı etkileşimi olmadan bir süre geçtikten sonra, belirlenen oturuma otomatik olarak giriş yapılır. Herkese açık oturumun önceden yapılandırılmış olması gerekir (Bkz. |DeviceLocalAccounts|).
@@ -1907,6 +1929,7 @@
 <translation id="6440051664870270040">Sitelerin eşzamanlı olarak gezinmesine ve pop-up açmasına için izin ver</translation>
 <translation id="6447948611083700881">Yedekleme ve geri yükleme devre dışı</translation>
 <translation id="645425387487868471"><ph name="PRODUCT_NAME" /> için oturum açmaya zorlamayı etkinleştir</translation>
+<translation id="6464074037294098618">Adresleri otomatik doldurmayı etkinleştir</translation>
 <translation id="6473623140202114570">Güvenli Tarama'nın uyarıları tetiklemeyeceği alan adlarının listesini yapılandırır.</translation>
 <translation id="6491139795995924304">Cihazda Bluetooth'a izin ver</translation>
 <translation id="6520802717075138474">İlk çalıştırmada arama motorlarını varsayılan tarayıcıdan içe aktar</translation>
@@ -2525,6 +2548,11 @@
       Bu politika devre dışı bırakılırsa herhangi bir Site İzolasyonu yapılmaz ve IsolateOrigins ile SitePerProcess'in saha denemeleri devre dışı kalır. Ancak kullanıcılar yine de SitePerProcess'i manuel olarak etkinleştirebilirler.
       Bu politika yapılandırılmazsa kullanıcı bu ayarı değiştirebilir.
       </translation>
+<translation id="7902255855035461275">Bu listedeki kalıplar, istek yapan URL'nin güvenlik
+      kaynağı ile karşılaştırılır. Bir eşleşme bulunursa, herhangi bir istemde
+      bulunulmadan görüntü yakalama cihazlarına erişim izni verilir.
+
+      NOT: Sürüm 45'e kadar bu politika sadece Kiosk modunda destekleniyordu.</translation>
 <translation id="7912255076272890813">İzin verilen uygulama/uzantı türlerini yapılandır</translation>
 <translation id="7915236031252389808">Bir proxy .pac dosyasının URL'sini burada belirtebilirsiniz.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index cfb10515..ff5d1c7 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -513,6 +513,11 @@
       Якщо це налаштування не встановлено, користувач зможе сам вирішувати, чи використовувати цю функцію.
 
       Це налаштування видалено з <ph name="PRODUCT_NAME" /> 29 і новіших версій.</translation>
+<translation id="2433412232489478893">Це правило визначає, чи функція спільних мережевих файлів у <ph name="PRODUCT_NAME" /> доступна для користувача.
+
+      Якщо це правило не налаштовано або для нього вибрано значення true, користувачі можуть застосовувати спільні мережеві файли.
+
+      Якщо для цього правила вибрано значення false, користувачі не можуть застосовувати спільні мережеві файли.</translation>
 <translation id="2438609638493026652">Дає змогу надсилати звіти в Google про основні події під час встановлення додатків Android. Записи робляться лише для тих додатків, встановлення яких активоване цим правилом.
 
       Якщо для правила вибрано значення true, події реєструватимуться.
@@ -590,6 +595,7 @@
 <translation id="2598508021807251719">Налаштовує мови, якими може відображатися <ph name="PRODUCT_OS_NAME" />.
 
       Якщо це правило налаштовано, у <ph name="PRODUCT_OS_NAME" /> може використовуватися лише одна мова з указаних у ньому. Якщо це правило не налаштовано або для нього вказано порожній список, <ph name="PRODUCT_OS_NAME" /> може відображатися всіма підтримуваними мовами інтерфейсу. Якщо для цього правила вказано список із недійсними значеннями, усі вони ігноруватимуться. Якщо користувач раніше налаштував у <ph name="PRODUCT_OS_NAME" /> мову інтерфейсу, що забороняється цим правилом, під час наступного входу її буде змінено на дозволену. Якщо користувач вказав бажані мови й одна з них дозволена цим правилом, <ph name="PRODUCT_OS_NAME" /> використовуватиме її. В іншому випадку в <ph name="PRODUCT_OS_NAME" /> застосовуватиметься перше дійсне значення, указане в цьому правилі, або вихідна мова (наразі en-US), якщо правило містить лише недійсні значення.</translation>
+<translation id="2604182581880595781">Налаштовує правила, пов’язані зі спільними мережевими файлами.</translation>
 <translation id="2623014935069176671">Чекати на першу дію користувача</translation>
 <translation id="262740370354162807">Дозволяє надсилати документи в службу <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Указує налаштування принтерів підприємства.
@@ -669,6 +675,7 @@
 <translation id="2823870601012066791">Розділ реєстру Windows для клієнтів <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Увімкнути режим анонімного перегляду</translation>
 <translation id="2838830882081735096">Заборонити перенесення даних і ARC</translation>
+<translation id="2839294585867804686">Налаштування спільних мережевих файлів</translation>
 <translation id="2840269525054388612">Указує принтери, доступні для користувачів.
 
       Це правило застосовується, якщо для <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> вибрано <ph name="PRINTERS_WHITELIST" />.
@@ -1148,6 +1155,7 @@
       Якщо це правило не налаштовано, збір анонімних даних, захищених паролем URL-адрес, буде ввімкнено, але користувач зможе змінити це.</translation>
 <translation id="4250680216510889253">ні</translation>
 <translation id="4261820385751181068">Мовний код на екрані входу на пристрої</translation>
+<translation id="4264607809747169568">Керує доступністю спільних мережевих файлів в ОС Chrome</translation>
 <translation id="427220754384423013">Указує принтери, доступні для користувачів.
 
       Це правило застосовується, якщо для <ph name="BULK_PRINTERS_ACCESS_MODE" /> вибрано <ph name="PRINTERS_WHITELIST" />.
@@ -1547,6 +1555,15 @@
       Значення правила вказується в мілісекундах.</translation>
 <translation id="5511702823008968136">Увімкнути панель закладок</translation>
 <translation id="5512418063782665071">URL-адреса домашньої сторінки</translation>
+<translation id="551639594034811656">Це правило надає список із відсотковою часткою пристроїв <ph name="PRODUCT_OS_NAME" /> в організаційному підрозділі, які оновлюватимуться впродовж тижня, починаючи від дня, коли оновлення виявлено вперше. Час виявлення пізніший за час публікації оновлення, оскільки може пройти певний час, перш ніж пристрій перевірить наявність оновлень.
+
+      Кожна пара (день, відсоток) показує, яка відсоткова частка ресурсів має оновитися впродовж зазначеної кількості днів після того, як виявлено оновлення. Наприклад, якщо є пари [(4, 40), (10, 70), (15, 100)], то 40% ресурсів має оновитися впродовж 4 днів; 70% – упродовж 10 днів тощо.
+
+      Якщо для цього правила встановлено значення, оновлення ігноруватимуть правило <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> і натомість застосовуватимуть це правило.
+
+      Якщо список порожній, оновлення не буде поетапним і виконуватиметься відповідно до правил пристрою.
+
+      Це правило не застосовується до змін каналів.</translation>
 <translation id="5523812257194833591">Автоматичний вхід у загальнодоступний сеанс після затримки.
 
       Якщо це правило встановлено, вхід у вказаний сеанс здійснюється автоматично, щойно мине період часу на екрані входу без жодних дій із боку користувача. Загальнодоступний сеанс потрібно налаштувати до цього (див. правило |DeviceLocalAccounts|).
@@ -2434,6 +2451,11 @@
       Якщо це правило вимкнено, явна Ізоляція сайтів не застосовується, а тестування IsolateOrigins і SitePerProcess вимикається. Користувачі зможуть увімкнути SitePerProcess вручну.
       Якщо це правило не налаштовано, користувач зможе змінити цей параметр.
       </translation>
+<translation id="7902255855035461275">Зразки в цьому списку зіставлятимуться з джерелом
+      безпеки запитаної URL-адреси. Якщо буде знайдено збіг, доступ до пристроїв
+      запису відео надаватиметься негайно.
+
+      ПРИМІТКА. До версії 45 це правило підтримувалося лише в режимі термінала.</translation>
 <translation id="7912255076272890813">Налаштувати типи дозволених додатків або розширень</translation>
 <translation id="7915236031252389808">Тут можна вказати URL-адресу файлу .pac проксі-сервера.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index eeafa8c9..61a0d8a 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -523,6 +523,11 @@
       Nếu cài đặt này không được đặt, người dùng có thể quyết định sử dụng chức năng này hay không.
 
       Cài đặt này đã bị xóa khỏi phiên bản <ph name="PRODUCT_NAME" /> 29 và các phiên bản cao hơn.</translation>
+<translation id="2433412232489478893">Chính sách này kiểm soát có cho phép người dùng sử dụng tính năng Chia sẻ tệp trong mạng cho <ph name="PRODUCT_NAME" /> hay không.
+
+      Khi chưa định cấu hình chính sách này hoặc khi đặt chính sách thành True, người dùng sẽ có thể sử dụng tính năng Chia sẻ tệp trong mạng.
+
+      Khi đặt chính sách này thành False, người dùng sẽ không thể sử dụng tính năng Chia sẻ tệp trong mạng.</translation>
 <translation id="2438609638493026652">Bật tính năng báo cáo các sự kiện quan trọng trong quá trình cài đặt ứng dụng Android cho Google. Các sự kiện chỉ được ghi lại cho các ứng dụng có quá trình cài đặt được kích hoạt qua chính sách.
 
       Nếu bạn đặt chính sách này là true thì các sự kiện sẽ được ghi lại.
@@ -604,6 +609,7 @@
 <translation id="2598508021807251719">Định cấu hình các ngôn ngữ có thể hiển thị trong <ph name="PRODUCT_OS_NAME" />.
 
       Nếu đặt chính sách này, thì người dùng chỉ có thể định cấu hình hiển thị <ph name="PRODUCT_OS_NAME" /> bằng một trong các ngôn ngữ mà chính sách này chỉ định. Nếu không đặt hoặc đặt chính sách này thành một danh sách trống, thì có thể hiển thị <ph name="PRODUCT_OS_NAME" /> bằng tất cả các ngôn ngữ giao diện người dùng được hỗ trợ. Nếu đặt chính sách này thành một danh sách gồm các giá trị không hợp lệ, thì tất cả các giá trị không hợp lệ sẽ bị bỏ qua. Nếu trước đây người dùng đã định cấu hình hiển thị <ph name="PRODUCT_OS_NAME" /> bằng một ngôn ngữ không được chính sách này cho phép, thì ngôn ngữ hiển thị sẽ được chuyển thành một ngôn ngữ giao diện người dùng được phép trong lần tiếp theo người dùng đăng nhập. Nếu người dùng đã định cấu hình các ngôn ngữ ưu tiên và chính sách này cho phép sử dụng một trong các ngôn ngữ ưu tiên đó, thì <ph name="PRODUCT_OS_NAME" /> sẽ chuyển sang ngôn ngữ đó. Nếu không, <ph name="PRODUCT_OS_NAME" /> sẽ chuyển sang giá trị hợp lệ đầu tiên được chính sách này chỉ định hoặc chuyển về ngôn ngữ dự phòng (hiện đang là en-US), nếu chính sách này chỉ chứa các mục không hợp lệ.</translation>
+<translation id="2604182581880595781">Định cấu hình các chính sách liên quan đến tính năng Chia sẻ tệp trong mạng.</translation>
 <translation id="2623014935069176671">Đợi hoạt động người dùng đầu tiên</translation>
 <translation id="262740370354162807">Cho phép gửi tài liệu tới <ph name="CLOUD_PRINT_NAME" /></translation>
 <translation id="2627554163382448569">Cung cấp cấu hình máy in dành cho doanh nghiệp.
@@ -690,6 +696,7 @@
 <translation id="2823870601012066791">Vị trí sổ đăng ký Windows cho các ứng dụng <ph name="PRODUCT_OS_NAME" />:</translation>
 <translation id="2824715612115726353">Bật chế độ Ẩn danh</translation>
 <translation id="2838830882081735096">Không cho phép di chuyển dữ liệu và ARC</translation>
+<translation id="2839294585867804686">Tùy chọn cài đặt tính năng Chia sẻ tệp trong mạng</translation>
 <translation id="2840269525054388612">Chỉ định các máy in mà người dùng có thể sử dụng.
 
       Chỉ dùng chính sách này nếu đã chọn <ph name="PRINTERS_WHITELIST" /> cho <ph name="DEVICE_PRINTERS_ACCESS_MODE" />
@@ -1179,6 +1186,7 @@
       Nếu bạn không đặt chính sách này, tính năng thu thập dữ liệu ẩn danh có khóa URL sẽ bật nhưng người dùng có thể thay đổi mục cài đặt này.</translation>
 <translation id="4250680216510889253">Không</translation>
 <translation id="4261820385751181068">Ngôn ngữ màn hình đăng nhập thiết bị</translation>
+<translation id="4264607809747169568">Kiểm soát tính năng Chia sẻ tệp trong mạng cho hoạt động của ChromeOS</translation>
 <translation id="427220754384423013">Chỉ định các máy in mà người dùng có thể sử dụng.
 
       Chỉ sử dụng chính sách này nếu đã chọn <ph name="PRINTERS_WHITELIST" /> cho <ph name="BULK_PRINTERS_ACCESS_MODE" />.
@@ -1612,6 +1620,15 @@
       Giá trị của chính sách này sẽ được chỉ định theo mili giây.</translation>
 <translation id="5511702823008968136">Bật Thanh dấu trang</translation>
 <translation id="5512418063782665071">URL trang chủ</translation>
+<translation id="551639594034811656">Chính sách này xác định danh sách tỷ lệ phần trăm để xác định tỷ lệ thiết bị <ph name="PRODUCT_OS_NAME" /> trong đơn vị tổ chức sẽ cập nhật mỗi ngày, bắt đầu từ ngày phát hiện bản cập nhật đầu tiên. Thời điểm phát hiện muộn hơn thời điểm phát hành bản cập nhật vì có thể mất một khoảng thời gian từ khi phát hành bản cập nhật cho tới khi thiết bị kiểm tra các bản cập nhật.
+
+      Mỗi cặp (ngày, tỷ lệ phần trăm) chứa tỷ lệ phần trăm của nhóm phải được cập nhật trong một số ngày nhất định kể từ khi phát hiện thấy bản cập nhật. Ví dụ: nếu chúng ta có các cặp [(4, 40), (10, 70), (15, 100)], thì 40% của nhóm đã được cập nhật sau 4 ngày phát hiện thấy bản cập nhật. 70% sẽ được cập nhật sau 10 ngày, v.v.
+
+      Nếu có một giá trị xác định cho chính sách này, thì bản cập nhật sẽ bỏ qua chính sách <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> và tuân thủ chính sách này.
+
+      Nếu danh sách này trống, thì sẽ không có giai đoạn và bản cập nhật nào được áp dụng theo các chính sách khác của thiết bị.
+
+      Chính sách này không áp dụng cho quá trình chuyển đổi giữa các kênh.</translation>
 <translation id="5523812257194833591">Tự động đăng nhập vào phiên công khai sau thời gian chờ.
 
       Nếu chính sách này được đặt, sẽ tự động đăng nhập vào phiên được chỉ định sau khi một khoảng thời gian trôi qua ở màn hình đăng nhập mà không có tương tác của người dùng (xem |DeviceLocalAccounts|).
@@ -2530,6 +2547,11 @@
       Nếu bạn tắt chính sách này, sẽ không có sự Cô lập trang web rõ ràng nào xảy ra và các phiên bản dùng thử tại chỗ của IsolateOrigins và SitePerProcess sẽ bị tắt. Người dùng sẽ vẫn có thể bật SitePerProcess theo cách thủ công.
       Nếu bạn không định cấu hình chính sách này, thì người dùng sẽ có thể thay đổi tùy chọn cài đặt này.
       </translation>
+<translation id="7902255855035461275">Các mẫu trong danh sách này sẽ được đối sánh dựa trên nguồn gốc bảo mật
+      của URL yêu cầu. Nếu tìm thấy mẫu phù hợp, quyền truy cập
+      vào thiết bị quay video sẽ được cấp mà không có lời nhắc.
+
+      LƯU Ý: Cho tới phiên bản 45 thì chính sách này chỉ được hỗ trợ ở chế độ Kiosk.</translation>
 <translation id="7912255076272890813">Định cấu hình loại ứng dụng/tiện ích được cho phép</translation>
 <translation id="7915236031252389808">Bạn có thể chỉ định URL cho tệp .pac proxy tại đây.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 180b3a3..19fa47e 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -278,6 +278,11 @@
       如果某个设置未指定,系统会为其使用默认值。
 
       如果此政策未设置,系统会为所有设置使用默认值。</translation>
+<translation id="1958138414749279167">启用 <ph name="PRODUCT_NAME" /> 的“自动填充”功能,并允许用户使用以前存储的地址信息在网络表单中自动填写相应信息。
+
+      如果停用了此设置,“自动填充”功能便绝不会提供相关建议或填充地址信息,也不会保存用户可能会在浏览网页时提交的其他地址信息。
+
+      如果启用了此设置或未设定任何值,用户将能够控制是否要在界面中自动填充地址信息。</translation>
 <translation id="1960840544413786116">是否允许使用由本地信任锚颁发的缺少 subjectAlternativeName 扩展项的证书</translation>
 <translation id="1964634611280150550">隐身模式已停用</translation>
 <translation id="1964802606569741174">此政策对 Android 版 YouTube 应用没有任何影响。如果应在 YouTube 中强制启用安全模式,则应禁止安装 Android 版 YouTube 应用。</translation>
@@ -1793,6 +1798,7 @@
 <translation id="6440051664870270040">允许网站在导航的同时打开弹出式窗口</translation>
 <translation id="6447948611083700881">已停用备份和恢复服务</translation>
 <translation id="645425387487868471">为 <ph name="PRODUCT_NAME" /> 启用强制登录功能</translation>
+<translation id="6464074037294098618">自动填充地址信息</translation>
 <translation id="6473623140202114570">配置安全浏览功能在哪些网域中不会触发警告。</translation>
 <translation id="6491139795995924304">允许在设备上使用蓝牙功能</translation>
 <translation id="6520802717075138474">首次运行时,从默认浏览器导入搜索引擎</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index c266e16..3bbee9e 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -293,6 +293,11 @@
       如果沒有任何設定值,將會自動採用預設值。
 
       如未設定這項政策,所有設定將自動套用預設值。</translation>
+<translation id="1958138414749279167">啟用 <ph name="PRODUCT_NAME" /> 的自動填入功能,並允許使用者利用先前儲存的地址資訊自動填寫網路表單。
+
+      如果停用這項設定,自動填入功能就不會提出填寫建議或填入地址資訊,也無法儲存使用者在瀏覽網路時提交的其他地址資訊。
+
+      如果啟用這項設定或未設定任何值,使用者就能透過 UI 控制地址資訊的自動填入功能。</translation>
 <translation id="1960840544413786116">是否允許由本機信任錨點核發但缺少 subjectAlternativeName 延伸的憑證</translation>
 <translation id="1964634611280150550">無痕模式已停用</translation>
 <translation id="1964802606569741174">這項政策對 Android YouTube 應用程式沒有影響。如要強制採用 YouTube 安全模式,則必須禁止下載 Android YouTube 應用程式。</translation>
@@ -505,6 +510,11 @@
       如果你未設定這項政策,使用者可以自行決定是否要使用這項功能。
 
       我們已於 <ph name="PRODUCT_NAME" /> 版本 29 及更高版本中移除這項設定。</translation>
+<translation id="2433412232489478893">這項政策可控管是否要允許使用者在 <ph name="PRODUCT_NAME" />使用網路檔案共用功能。
+
+      如果未設定這項政策,或是將這項政策設定為「True」,使用者將可以使用網路檔案共用功能。
+
+      如果將這項政策設定為「False」,則使用者將無法使用網路檔案共用功能。</translation>
 <translation id="2438609638493026652">允許將 Android 應用程式安裝期間的重要事件回報給 Google。系統只會記錄透過政策觸發的應用程式安裝事件。
 
       如果將這項政策設為 true,系統就會記錄事件。
@@ -582,6 +592,7 @@
 <translation id="2598508021807251719">控制 <ph name="PRODUCT_OS_NAME" />顯示語言的語言代碼。
 
       如果設定這項政策,使用者就只能將 <ph name="PRODUCT_OS_NAME" />的顯示語言設為這項政策指定的其中一個語言代碼。如果未設定這項政策,或是設定了空白清單,則可將 <ph name="PRODUCT_OS_NAME" />的顯示語言設為任一支援的語言代碼。如果將這項政策設為無效值清單,所有無效的值都會遭到忽略。如果使用者先前設定的 <ph name="PRODUCT_OS_NAME" />顯示語言代碼不是這項政策所允許的值,當使用者下次登入時,顯示語言代碼將切換成允許的 UI 語言代碼。如果使用者已設定偏好的語言代碼,而其中一個偏好的語言代碼是這項政策所允許的值,<ph name="PRODUCT_OS_NAME" />將改用該語言代碼,否則 <ph name="PRODUCT_OS_NAME" />將改用這項政策指定的第一個有效值,或是在這項政策指定的值均無效時改用備用語言代碼 (目前為 en-US)。</translation>
+<translation id="2604182581880595781">設定網路檔案共用功能相關政策。</translation>
 <translation id="2623014935069176671">等待初始使用者活動</translation>
 <translation id="262740370354162807">啟用「<ph name="CLOUD_PRINT_NAME" />」文件提交功能</translation>
 <translation id="2627554163382448569">為企業印表機進行設定。
@@ -661,6 +672,7 @@
 <translation id="2823870601012066791"><ph name="PRODUCT_OS_NAME" />用戶端的 Windows 登錄檔位置:</translation>
 <translation id="2824715612115726353">啟用無痕模式</translation>
 <translation id="2838830882081735096">不允許資料遷移和 ARC</translation>
+<translation id="2839294585867804686">網路檔案共用功能設定</translation>
 <translation id="2840269525054388612">指定哪些印表機是可以使用的。
 
       只有在為 <ph name="DEVICE_PRINTERS_ACCESS_MODE" /> 選擇 <ph name="PRINTERS_WHITELIST" /> 的情況下,這項政策才有作用。
@@ -1140,6 +1152,7 @@
       如果未設定這項政策,系統將啟用輸入網址匿名資料收集功能,但使用者可以變更這項設定。</translation>
 <translation id="4250680216510889253">否</translation>
 <translation id="4261820385751181068">裝置登入畫面語言代碼</translation>
+<translation id="4264607809747169568">控管是否允許在 Chrome 作業系統使用網路檔案共用功能</translation>
 <translation id="427220754384423013">指定哪些印表機是可以使用的。
 
       只有在為 <ph name="BULK_PRINTERS_ACCESS_MODE" /> 選擇 <ph name="PRINTERS_WHITELIST" /> 的情況下,這項政策才有作用。
@@ -1541,6 +1554,15 @@
       該政策的指定值單位為毫秒。</translation>
 <translation id="5511702823008968136">啟用書籤列</translation>
 <translation id="5512418063782665071">首頁網址</translation>
+<translation id="551639594034811656">這項政策是用來定義一份百分比清單,藉此指定首次偵測到更新的當天開始起算的各天內,機構單位中應安裝更新的 <ph name="PRODUCT_OS_NAME" />裝置百分比。偵測到更新的時間會晚於更新發佈時間,因為更新發佈後,裝置可能要經過一段時間才會檢查是否有更新。
+
+      每組 (天數, 百分比) 配對代表自偵測到更新當天起的指定天數內,必須完成更新的裝置百分比。舉例來說,如果有以下配對:[(4, 40), (10, 70), (15, 100)],即表示偵測到更新後的 4 天內,應完成 40% 的裝置更新,10 天內應完成 70% 的裝置更新,依此類推。
+
+      如果為這項政策定義了任何值,更新會忽略 <ph name="DEVICE_UPDATE_SCATTER_FACTOR_POLICY_NAME" /> 政策並改為遵循這項政策。
+
+      如果這份清單未包含任何內容,系統就不會分階段安裝更新,而會依其他裝置政策套用更新。
+
+      版本切換不適用這項政策。</translation>
 <translation id="5523812257194833591">要在延遲時間過後自動登入的公開工作階段。
 
       如果設定這項政策,系統會在使用者於登入畫面停止互動後的一段時間過後,自動登入指定的工作階段。你必須已設定公開工作階段 (請參閱 |DeviceLocalAccounts|)。
@@ -1837,6 +1859,7 @@
 <translation id="6440051664870270040">允許同時在多個網站中進行瀏覽及開啟彈出式視窗</translation>
 <translation id="6447948611083700881">備份與還原功能已停用</translation>
 <translation id="645425387487868471">啟用 <ph name="PRODUCT_NAME" /> 的強制登入功能</translation>
+<translation id="6464074037294098618">啟用地址的自動填入功能</translation>
 <translation id="6473623140202114570">設定安全瀏覽功能在哪些網域中不會觸發警告。</translation>
 <translation id="6491139795995924304">允許在裝置上使用藍牙功能</translation>
 <translation id="6520802717075138474">第一次執行時從預設瀏覽器匯入搜尋引擎</translation>
@@ -2432,6 +2455,11 @@
       如果停用這項政策,系統就不會明確隔離任何網站,且 IsolateOrigins 和 SitePerProcess 的實場測試將會停用。使用者還是可以手動啟用 SitePerProcess。
       如果未設定這項政策,使用者將可以變更這項設定。
       </translation>
+<translation id="7902255855035461275">系統會將這份清單中的模式與要求網址的安全性
+      來源進行比對。如果找到相符的結果,系統就會授權存取
+      影片擷取裝置,並且不會提示使用者。
+
+      注意:45 以下的版本僅在執行 Kiosk 模式時才支援這項政策。</translation>
 <translation id="7912255076272890813">設定允許的應用程式/擴充功能類型</translation>
 <translation id="7915236031252389808">您可以在這裡為 Proxy .pac 檔案指定網址。
 
diff --git a/components/prefs/json_pref_store.h b/components/prefs/json_pref_store.h
index ab40a3d2..383a257f 100644
--- a/components/prefs/json_pref_store.h
+++ b/components/prefs/json_pref_store.h
@@ -20,7 +20,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/prefs/persistent_pref_store.h"
 #include "components/prefs/pref_filter.h"
 #include "components/prefs/prefs_export.h"
diff --git a/components/previews/content/previews_optimization_guide.cc b/components/previews/content/previews_optimization_guide.cc
index 1374963..a23fa01 100644
--- a/components/previews/content/previews_optimization_guide.cc
+++ b/components/previews/content/previews_optimization_guide.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "components/optimization_guide/proto/hints.pb.h"
 #include "components/previews/content/previews_hints.h"
diff --git a/components/quirks/quirks_manager.cc b/components/quirks/quirks_manager.cc
index e85a090dc..f595dd9 100644
--- a/components/quirks/quirks_manager.cc
+++ b/components/quirks/quirks_manager.cc
@@ -11,8 +11,8 @@
 #include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
 #include "components/prefs/pref_registry_simple.h"
diff --git a/components/rlz/rlz_tracker.cc b/components/rlz/rlz_tracker.cc
index de977df..7c92c0dd 100644
--- a/components/rlz/rlz_tracker.cc
+++ b/components/rlz/rlz_tracker.cc
@@ -16,8 +16,8 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "components/rlz/rlz_tracker_delegate.h"
diff --git a/components/safe_browsing/browser/safe_browsing_url_request_context_getter.cc b/components/safe_browsing/browser/safe_browsing_url_request_context_getter.cc
index b42002f1..31d8608 100644
--- a/components/safe_browsing/browser/safe_browsing_url_request_context_getter.cc
+++ b/components/safe_browsing/browser/safe_browsing_url_request_context_getter.cc
@@ -5,7 +5,7 @@
 #include "components/safe_browsing/browser/safe_browsing_url_request_context_getter.h"
 
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/safe_browsing/common/safebrowsing_constants.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/cookie_store_factory.h"
diff --git a/components/safe_browsing/browser/threat_details.cc b/components/safe_browsing/browser/threat_details.cc
index 450e2e3..4f18bd5e 100644
--- a/components/safe_browsing/browser/threat_details.cc
+++ b/components/safe_browsing/browser/threat_details.cc
@@ -580,7 +580,7 @@
   frame->GetRemoteInterfaces()->GetInterface(&threat_reporter);
   safe_browsing::mojom::ThreatReporter* raw_threat_report =
       threat_reporter.get();
-  pending_render_frame_hosts_.insert(frame);
+  pending_render_frame_hosts_.push_back(frame);
   raw_threat_report->GetThreatDOMDetails(
       base::BindOnce(&ThreatDetails::OnReceivedThreatDOMDetails, this,
                      std::move(threat_reporter), frame));
@@ -593,8 +593,13 @@
     std::vector<mojom::ThreatDOMDetailsNodePtr> params) {
   // If the RenderFrameHost was closed between sending the IPC and this callback
   // running, |sender| will be invalid.
-  if (pending_render_frame_hosts_.erase(sender) == 0)
+  const auto sender_it = std::find(pending_render_frame_hosts_.begin(),
+                                   pending_render_frame_hosts_.end(), sender);
+  if (sender_it == pending_render_frame_hosts_.end()) {
     return;
+  }
+
+  pending_render_frame_hosts_.erase(sender_it);
 
   // Lookup the FrameTreeNode ID of any child frames in the list of DOM nodes.
   const int sender_process_id = sender->GetProcess()->GetID();
@@ -815,7 +820,17 @@
 }
 
 void ThreatDetails::FrameDeleted(RenderFrameHost* render_frame_host) {
-  pending_render_frame_hosts_.erase(render_frame_host);
+  auto render_frame_host_it =
+      std::find(pending_render_frame_hosts_.begin(),
+                pending_render_frame_hosts_.end(), render_frame_host);
+  if (render_frame_host_it != pending_render_frame_hosts_.end()) {
+    pending_render_frame_hosts_.erase(render_frame_host_it);
+  }
+}
+
+void ThreatDetails::RenderFrameHostChanged(RenderFrameHost* old_host,
+                                           RenderFrameHost* new_host) {
+  FrameDeleted(old_host);
 }
 
 }  // namespace safe_browsing
diff --git a/components/safe_browsing/browser/threat_details.h b/components/safe_browsing/browser/threat_details.h
index 61db996..d146807 100644
--- a/components/safe_browsing/browser/threat_details.h
+++ b/components/safe_browsing/browser/threat_details.h
@@ -103,6 +103,8 @@
 
   // WebContentsObserver implementation:
   void FrameDeleted(content::RenderFrameHost* render_frame_host) override;
+  void RenderFrameHostChanged(content::RenderFrameHost* old_host,
+                              content::RenderFrameHost* new_host) override;
 
  protected:
   friend class ThreatDetailsFactoryImpl;
@@ -266,7 +268,7 @@
 
   // The set of RenderFrameHosts that have pending requests and haven't been
   // deleted.
-  std::set<content::RenderFrameHost*> pending_render_frame_hosts_;
+  std::vector<content::RenderFrameHost*> pending_render_frame_hosts_;
 
   FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, HistoryServiceUrls);
   FRIEND_TEST_ALL_PREFIXES(ThreatDetailsTest, HttpsResourceSanitization);
diff --git a/components/safe_browsing/common/safe_browsing_prefs.h b/components/safe_browsing/common/safe_browsing_prefs.h
index 3bc20af2..fe62b85 100644
--- a/components/safe_browsing/common/safe_browsing_prefs.h
+++ b/components/safe_browsing/common/safe_browsing_prefs.h
@@ -25,6 +25,9 @@
 extern const char kSafeBrowsingExtendedReportingOptInAllowed[];
 
 // A dictionary mapping incident types to a dict of incident key:digest pairs.
+// The key is a string: a filename or pref name. Digests are 4 bytes. This pref
+// is only set/updated if Chrome (Windows only) notices certain security
+// incidents, e.g. the user downloaded binaries with invalid signatures.
 extern const char kSafeBrowsingIncidentsSent[];
 
 // Boolean that is true when the SafeBrowsing interstitial should not allow
@@ -49,21 +52,25 @@
 extern const char kSafeBrowsingScoutReportingEnabled[];
 
 // Dictionary containing safe browsing triggers and the list of times they have
-// fired recently.
+// fired recently. The keys are TriggerTypes (4-byte ints) and the values are
+// lists of doubles.
 extern const char kSafeBrowsingTriggerEventTimestamps[];
 
 // Dictionary that records the origin and navigation ID pairs of unhandled sync
-// password reuses.
+// password reuses. The keys are origin strings and the ID values are 8-byte
+// ints. Only set/update if a Chrome Sync user reuses their Gaia password on
+// phishing site.
 extern const char kSafeBrowsingUnhandledSyncPasswordReuses[];
 
 // List of domains where Safe Browsing should trust. That means Safe Browsing
 // won't check for malware/phishing/Uws on resources on these domains, or
-// trigger warnings.
+// trigger warnings. Used for enterprise only.
 extern const char kSafeBrowsingWhitelistDomains[];
 
 // String indicating the URL where password protection service should send user
 // to change their password if they've been phished. Password protection service
-// also captures new password on this page in a change password event.
+// also captures new password on this page in a change password event. Used for
+// enterprise only.
 extern const char kPasswordProtectionChangePasswordURL[];
 
 // List of string indicating the URL(s) users use to log in. Password protection
diff --git a/components/safe_browsing/db/v4_local_database_manager.cc b/components/safe_browsing/db/v4_local_database_manager.cc
index 8fd266a..55e745d1 100644
--- a/components/safe_browsing/db/v4_local_database_manager.cc
+++ b/components/safe_browsing/db/v4_local_database_manager.cc
@@ -17,7 +17,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/timer/elapsed_timer.h"
 #include "components/safe_browsing/db/v4_feature_list.h"
 #include "components/safe_browsing/db/v4_protocol_manager_util.h"
diff --git a/components/search_provider_logos/logo_tracker.cc b/components/search_provider_logos/logo_tracker.cc
index dae703ca..c2adf4f 100644
--- a/components/search_provider_logos/logo_tracker.cc
+++ b/components/search_provider_logos/logo_tracker.cc
@@ -9,7 +9,7 @@
 
 #include "base/bind_helpers.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/clock.h"
diff --git a/components/services/heap_profiling/public/cpp/client.cc b/components/services/heap_profiling/public/cpp/client.cc
index 0512062..a4420fb 100644
--- a/components/services/heap_profiling/public/cpp/client.cc
+++ b/components/services/heap_profiling/public/cpp/client.cc
@@ -7,8 +7,8 @@
 #include "base/allocator/allocator_interception_mac.h"
 #include "base/files/platform_file.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/trace_event/malloc_dump_provider.h"
 #include "build/build_config.h"
 #include "components/services/heap_profiling/public/cpp/allocator_shim.h"
diff --git a/components/services/leveldb/env_mojo.cc b/components/services/leveldb/env_mojo.cc
index bb5320d..0273420 100644
--- a/components/services/leveldb/env_mojo.cc
+++ b/components/services/leveldb/env_mojo.cc
@@ -12,7 +12,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "third_party/leveldatabase/chromium_logger.h"
 #include "third_party/leveldatabase/src/include/leveldb/status.h"
diff --git a/components/services/leveldb/leveldb_app.cc b/components/services/leveldb/leveldb_app.cc
index b7ba5f41..7de8011 100644
--- a/components/services/leveldb/leveldb_app.cc
+++ b/components/services/leveldb/leveldb_app.cc
@@ -4,7 +4,7 @@
 
 #include "components/services/leveldb/leveldb_app.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/services/leveldb/leveldb_service_impl.h"
 #include "services/service_manager/public/cpp/service_context.h"
 
diff --git a/components/services/unzip/public/cpp/unzip.cc b/components/services/unzip/public/cpp/unzip.cc
index 7afb0c3..fa2df5f7 100644
--- a/components/services/unzip/public/cpp/unzip.cc
+++ b/components/services/unzip/public/cpp/unzip.cc
@@ -14,7 +14,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string16.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/services/filesystem/directory_impl.h"
 #include "components/services/filesystem/lock_table.h"
diff --git a/components/sessions/core/base_session_service.cc b/components/sessions/core/base_session_service.cc
index dc8a9ef1..8a5108c3 100644
--- a/components/sessions/core/base_session_service.cc
+++ b/components/sessions/core/base_session_service.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/sessions/core/base_session_service_delegate.h"
diff --git a/components/signin/core/browser/account_tracker_service.cc b/components/signin/core/browser/account_tracker_service.cc
index a702c4b3..8394a944 100644
--- a/components/signin/core/browser/account_tracker_service.cc
+++ b/components/signin/core/browser/account_tracker_service.cc
@@ -13,8 +13,8 @@
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_split.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
diff --git a/components/storage_monitor/image_capture_device.mm b/components/storage_monitor/image_capture_device.mm
index 53358cc9..2a9ed02 100644
--- a/components/storage_monitor/image_capture_device.mm
+++ b/components/storage_monitor/image_capture_device.mm
@@ -5,8 +5,8 @@
 #import "components/storage_monitor/image_capture_device.h"
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/components/storage_monitor/media_storage_util.cc b/components/storage_monitor/media_storage_util.cc
index b24ff0f1..229141d 100644
--- a/components/storage_monitor/media_storage_util.cc
+++ b/components/storage_monitor/media_storage_util.cc
@@ -11,8 +11,8 @@
 #include "base/logging.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "components/storage_monitor/removable_device_constants.h"
diff --git a/components/storage_monitor/media_storage_util_unittest.cc b/components/storage_monitor/media_storage_util_unittest.cc
index 64003a6..ba7386d 100644
--- a/components/storage_monitor/media_storage_util_unittest.cc
+++ b/components/storage_monitor/media_storage_util_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/storage_monitor/media_storage_util.h"
 #include "components/storage_monitor/removable_device_constants.h"
diff --git a/components/storage_monitor/portable_device_watcher_win.cc b/components/storage_monitor/portable_device_watcher_win.cc
index ecd3f33d..76dc3f2 100644
--- a/components/storage_monitor/portable_device_watcher_win.cc
+++ b/components/storage_monitor/portable_device_watcher_win.cc
@@ -18,7 +18,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/win/scoped_co_mem.h"
 #include "base/win/scoped_propvariant.h"
diff --git a/components/storage_monitor/storage_monitor_chromeos.cc b/components/storage_monitor/storage_monitor_chromeos.cc
index 66e0b45..a5909ef3 100644
--- a/components/storage_monitor/storage_monitor_chromeos.cc
+++ b/components/storage_monitor/storage_monitor_chromeos.cc
@@ -15,10 +15,11 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
+#include "chromeos/disks/disk.h"
 #include "components/storage_monitor/media_storage_util.h"
 #include "components/storage_monitor/mtp_manager_client_chromeos.h"
 #include "components/storage_monitor/removable_device_constants.h"
@@ -26,6 +27,7 @@
 #include "services/device/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
+using chromeos::disks::Disk;
 using chromeos::disks::DiskMountManager;
 
 namespace storage_monitor {
@@ -34,7 +36,7 @@
 
 // Constructs a device id using uuid or manufacturer (vendor and product) id
 // details.
-std::string MakeDeviceUniqueId(const DiskMountManager::Disk& disk) {
+std::string MakeDeviceUniqueId(const Disk& disk) {
   std::string uuid = disk.fs_uuid();
   if (!uuid.empty())
     return kFSUniqueIdPrefix + uuid;
@@ -59,7 +61,7 @@
   DCHECK(info);
   std::string source_path = mount_info.source_path;
 
-  const DiskMountManager::Disk* disk =
+  const Disk* disk =
       DiskMountManager::GetInstance()->FindDiskBySourcePath(source_path);
   if (!disk || disk->device_type() == chromeos::DEVICE_TYPE_UNKNOWN)
     return false;
@@ -82,8 +84,7 @@
 
 // Returns whether the requested device is valid. On success |info| will contain
 // fixed storage device information.
-bool GetFixedStorageInfo(const DiskMountManager::Disk& disk,
-                         StorageInfo* info) {
+bool GetFixedStorageInfo(const Disk& disk, StorageInfo* info) {
   DCHECK(info);
 
   std::string unique_id = MakeDeviceUniqueId(disk);
@@ -164,7 +165,7 @@
 
 void StorageMonitorCros::OnBootDeviceDiskEvent(
     DiskMountManager::DiskEvent event,
-    const DiskMountManager::Disk& disk) {
+    const Disk& disk) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (!disk.IsStatefulPartition())
@@ -341,8 +342,7 @@
   receiver()->ProcessAttach(info);
 }
 
-void StorageMonitorCros::AddFixedStorageDisk(
-    const DiskMountManager::Disk& disk) {
+void StorageMonitorCros::AddFixedStorageDisk(const Disk& disk) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(disk.IsStatefulPartition());
 
@@ -357,8 +357,7 @@
   receiver()->ProcessAttach(info);
 }
 
-void StorageMonitorCros::RemoveFixedStorageDisk(
-    const DiskMountManager::Disk& disk) {
+void StorageMonitorCros::RemoveFixedStorageDisk(const Disk& disk) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(disk.IsStatefulPartition());
 
diff --git a/components/storage_monitor/storage_monitor_chromeos.h b/components/storage_monitor/storage_monitor_chromeos.h
index 1eb3bb92..97a4e06 100644
--- a/components/storage_monitor/storage_monitor_chromeos.h
+++ b/components/storage_monitor/storage_monitor_chromeos.h
@@ -46,9 +46,8 @@
       device::mojom::MtpManagerPtr test_manager);
 
   // chromeos::disks::DiskMountManager::Observer implementation.
-  void OnBootDeviceDiskEvent(
-      chromeos::disks::DiskMountManager::DiskEvent event,
-      const chromeos::disks::DiskMountManager::Disk& disk) override;
+  void OnBootDeviceDiskEvent(chromeos::disks::DiskMountManager::DiskEvent event,
+                             const chromeos::disks::Disk& disk) override;
   void OnMountEvent(chromeos::disks::DiskMountManager::MountEvent event,
                     chromeos::MountError error_code,
                     const chromeos::disks::DiskMountManager::MountPointInfo&
@@ -78,12 +77,11 @@
 
   // Adds the mount point in |disk| to |mount_map_| and send a device
   // attach notification.
-  void AddFixedStorageDisk(const chromeos::disks::DiskMountManager::Disk& disk);
+  void AddFixedStorageDisk(const chromeos::disks::Disk& disk);
 
   // Removes the mount point in |disk| from |mount_map_| and send a device
   // detach notification.
-  void RemoveFixedStorageDisk(
-      const chromeos::disks::DiskMountManager::Disk& disk);
+  void RemoveFixedStorageDisk(const chromeos::disks::Disk& disk);
 
   // Mapping of relevant mount points and their corresponding mount devices.
   MountMap mount_map_;
diff --git a/components/storage_monitor/storage_monitor_chromeos_unittest.cc b/components/storage_monitor/storage_monitor_chromeos_unittest.cc
index 8168cbf..d816031 100644
--- a/components/storage_monitor/storage_monitor_chromeos_unittest.cc
+++ b/components/storage_monitor/storage_monitor_chromeos_unittest.cc
@@ -17,6 +17,7 @@
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
+#include "chromeos/disks/disk.h"
 #include "chromeos/disks/mock_disk_mount_manager.h"
 #include "components/storage_monitor/mock_removable_storage_observer.h"
 #include "components/storage_monitor/removable_device_constants.h"
@@ -84,9 +85,8 @@
     StorageMonitorCros::OnMountEvent(event, error_code, mount_info);
   }
 
-  void OnBootDeviceDiskEvent(
-      DiskMountManager::DiskEvent event,
-      const chromeos::disks::DiskMountManager::Disk& disk) override {
+  void OnBootDeviceDiskEvent(DiskMountManager::DiskEvent event,
+                             const chromeos::disks::Disk& disk) override {
     StorageMonitorCros::OnBootDeviceDiskEvent(event, disk);
   }
 
@@ -549,10 +549,10 @@
 
   // Fixed storage (stateful partition) added.
   const std::string label = "fixed1";
-  const chromeos::disks::DiskMountManager::Disk disk(
-      "", mount_point, false, "", "", label, "", "", "", "", "", uuid, "",
-      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
-      false, "", "");
+  const chromeos::disks::Disk disk("", mount_point, false, "", "", label, "",
+                                   "", "", "", "", uuid, "",
+                                   chromeos::DEVICE_TYPE_UNKNOWN, 0, false,
+                                   false, false, false, false, false, "", "");
   monitor_->OnBootDeviceDiskEvent(DiskMountManager::DiskEvent::DISK_ADDED,
                                   disk);
   std::vector<StorageInfo> disks = monitor_->GetAllAvailableStorages();
@@ -561,7 +561,7 @@
   EXPECT_EQ(base::ASCIIToUTF16(label), disks[0].storage_label());
 
   // Fixed storage (not stateful partition) added - ignore.
-  const chromeos::disks::DiskMountManager::Disk ignored_disk(
+  const chromeos::disks::Disk ignored_disk(
       "", "usr/share/OEM", false, "", "", "fixed2", "", "", "", "", "",
       "fixed2-uuid", "", chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false,
       false, false, false, "", "");
diff --git a/components/storage_monitor/storage_monitor_linux.cc b/components/storage_monitor/storage_monitor_linux.cc
index 071cd96..1f07f9a 100644
--- a/components/storage_monitor/storage_monitor_linux.cc
+++ b/components/storage_monitor/storage_monitor_linux.cc
@@ -27,7 +27,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/components/storage_monitor/storage_monitor_linux_unittest.cc b/components/storage_monitor/storage_monitor_linux_unittest.cc
index 66a503f3..b99e207 100644
--- a/components/storage_monitor/storage_monitor_linux_unittest.cc
+++ b/components/storage_monitor/storage_monitor_linux_unittest.cc
@@ -20,7 +20,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/storage_monitor/mock_removable_storage_observer.h"
diff --git a/components/storage_monitor/storage_monitor_mac.mm b/components/storage_monitor/storage_monitor_mac.mm
index f70ce65..233f4f6 100644
--- a/components/storage_monitor/storage_monitor_mac.mm
+++ b/components/storage_monitor/storage_monitor_mac.mm
@@ -10,8 +10,8 @@
 #include "base/mac/mac_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/storage_monitor/image_capture_device_manager.h"
 #include "components/storage_monitor/media_storage_util.h"
diff --git a/components/storage_monitor/volume_mount_watcher_win.cc b/components/storage_monitor/volume_mount_watcher_win.cc
index 3517d05..2fcf985 100644
--- a/components/storage_monitor/volume_mount_watcher_win.cc
+++ b/components/storage_monitor/volume_mount_watcher_win.cc
@@ -22,7 +22,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/time/time.h"
 #include "base/win/scoped_handle.h"
diff --git a/components/strings/components_strings_am.xtb b/components/strings/components_strings_am.xtb
index 2a1c6e4..3ccbda5 100644
--- a/components/strings/components_strings_am.xtb
+++ b/components/strings/components_strings_am.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">ተጨማሪ ዝርዝሮችን ያቅርቡ</translation>
 <translation id="1021110881106174305">ተቀባይነት ያላቸው ካርዶች</translation>
 <translation id="1032854598605920125">በሰዓት አቅጣጫ አሽከርክር</translation>
+<translation id="1035334672863811645">ወደ Chrome ይግቡ</translation>
 <translation id="1038842779957582377">ያልታወቀ ስም</translation>
 <translation id="1050038467049342496">ሌሎች መተግበሪያዎችን ይዝጉ</translation>
 <translation id="1055184225775184556">&amp;አክልን ቀልብስ</translation>
@@ -487,6 +488,7 @@
 <translation id="4277028893293644418">የይለፍ ቃል ዳግም አቀናብር</translation>
 <translation id="4280429058323657511">፣ አገልግሎቱ የሚያበቃው በ<ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">ቀይር</translation>
+<translation id="4308131620840579419">ሁሉም ካርዶችዎ በአንዲት ቦታ ይቀመጡ?</translation>
 <translation id="4312866146174492540">አግድ (ነባሪ)</translation>
 <translation id="4325863107915753736">ጽሑፉን ማግኘት አልተቻለም</translation>
 <translation id="4326324639298822553">የእርስዎን የአገልግሎት ማብቂያ ቀን ይመልከቱ እና እንደገና ይሞክሩ</translation>
@@ -597,6 +599,7 @@
 <translation id="5190835502935405962">የዕልባቶች አሞሌ</translation>
 <translation id="5201306358585911203">በዚህ ድረ-ገጽ ላይ ያለ የተካተተ ገጽ እንዲህ ይላል፦</translation>
 <translation id="5205222826937269299">ስም ያስፈልጋል</translation>
+<translation id="5215116848420601511">Google Payን የሚጠቀሙ የመክፈያ ዘዴዎች እና አድራሻዎች</translation>
 <translation id="5222812217790122047">ኢሜይል ያስፈልጋል</translation>
 <translation id="5230733896359313003">የሚላክበት አድራሻ</translation>
 <translation id="5250209940322997802">«ከአውታረ መረብ ጋር ይገናኙ»</translation>
@@ -673,6 +676,7 @@
 <translation id="5689199277474810259">ወደ JSON ላክ</translation>
 <translation id="5689516760719285838">አካባቢ</translation>
 <translation id="570530837424789914">ያቀናብሩ...</translation>
+<translation id="5705882733397021510">ተመለስ</translation>
 <translation id="57094364128775171">ጠንካራ የይለፍ ቃል ጠቁም...</translation>
 <translation id="5710435578057952990">የዚህ ድረ-ገጽ ማንነት አልተረጋገጠም።</translation>
 <translation id="5719499550583120431">የቅድመ-ክፍያ ካርዶች ተቀባይነት አላቸው።</translation>
@@ -690,6 +694,7 @@
 <translation id="5810442152076338065">ወደ <ph name="DOMAIN" /> ግንኙነትዎ ፍጹማዊ ስነ መሰውር ጥቅል በመጠቀም የተመሳጠረ ነው።</translation>
 <translation id="5813119285467412249">&amp;አክልን ድገም</translation>
 <translation id="5838278095973806738">በአጥቂዎች ሊሰረቅ ስለሚችል በዚህ ጣቢያ ላይ ማናቸውም አደጋን ሊያስከትል የሚችል መረጃ (ለምሳሌ፦ የይለፍ ቃሎች ወይም የክሬዲት ካርዶች) ማስገባት የለብዎትም።</translation>
+<translation id="5863847714970149516">ከፊት ያለው ገጽ እርስዎን ገንዘብ ለማስከፈል ሊሞክር ይችላል</translation>
 <translation id="5866257070973731571">ስልክ ቁጥር ያክሉ</translation>
 <translation id="5869405914158311789">ይህ ጣቢያ ሊደረስበት አይችልም</translation>
 <translation id="5869522115854928033">የተቀመጡ የይለፍ ቃሎች</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">ሁለቱም ቋሚ ተኪ አገልጋዮች እና የ.pac ስክሪፕት ዩአርኤል ተገልጸዋል።</translation>
 <translation id="6989763994942163495">የላቁ ቅንብሮችን አሳይ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">እነዚህ ክፍያዎች የአንድ ጊዜ ወይም ተደጋጋሚ፣ እና የማያስታውቁ ሊሆኑ ይችላሉ።</translation>
 <translation id="7029809446516969842">የይለፍ ቃላት</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> ጋር ለመድረስ ሞክረዋል፣ ነገር ግን አገልጋዩ አስተማማኝ ለመሆን የሚያስቸግር በጣም ረጅም የሆነ የማረጋገጫ ጊዜ ነው ያለው።</translation>
 <translation id="7053983685419859001">አግድ</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">የተያዥ መግቢያ ፈቀዳ</translation>
 <translation id="8971063699422889582">የአገልጋይ እውቅና ማረጋገጫ ጊዜው አልፎበታል።</translation>
 <translation id="8978053250194585037">Google የጥንቃቄ አሰሳ በቅርቡ በ<ph name="SITE" /> ላይ <ph name="BEGIN_LINK" />ማስገር አግኝቷል<ph name="END_LINK" />። የማስገር ጣቢያዎች እርስዎን ለማታለል ሌሎች ድር ጣቢያዎች እንደሆኑ ያስመስላሉ።</translation>
+<translation id="8983003182662520383">Google Payን የሚጠቀሙ የመክፈያ ዘዴዎች እና አድራሻዎች</translation>
 <translation id="8987927404178983737">ወር</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">ቀጥሎ ያለው ጣቢያ ጎጂ ፕሮግራሙች አሉት</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index ff93380..ae45b5a 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">تقديم تفاصيل إضافية</translation>
 <translation id="1021110881106174305">البطاقات المقبولة</translation>
 <translation id="1032854598605920125">تدوير في اتجاه عقارب الساعة</translation>
+<translation id="1035334672863811645">‏تسجيل الدخول إلى Chrome</translation>
 <translation id="1038842779957582377">اسم غير معروف</translation>
 <translation id="1050038467049342496">إغلاق التطبيقات الأخرى</translation>
 <translation id="1055184225775184556">تراجع عن الإ&amp;ضافة</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">إعادة تعيين كلمة المرور</translation>
 <translation id="4280429058323657511">، تاريخ انتهاء الصلاحية <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">تبديل</translation>
+<translation id="4308131620840579419">هل ترغب في حفظ جميع بطاقاتك في مكانٍ واحد؟</translation>
 <translation id="4312866146174492540">حظر (تلقائي)</translation>
 <translation id="4325863107915753736">تعذّر العثور على المقالة</translation>
 <translation id="4326324639298822553">تحقق من تاريخ انتهاء الصلاحية وأعِد المحاولة مرة أخرى</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">شريط الإشارات</translation>
 <translation id="5201306358585911203">تعرض صفحة مضمّنة في هذه الصفحة</translation>
 <translation id="5205222826937269299">الاسم مطلوب</translation>
+<translation id="5215116848420601511">‏طرق الدفع والعناوين باستخدام Google Pay</translation>
 <translation id="5222812217790122047">البريد الإلكتروني مطلوب</translation>
 <translation id="5230733896359313003">عنوان الشحن</translation>
 <translation id="5250209940322997802">"الاتصال بالشبكة"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">‏تصدير إلى JSON</translation>
 <translation id="5689516760719285838">الموقع</translation>
 <translation id="570530837424789914">إدارة...</translation>
+<translation id="5705882733397021510">رجوع</translation>
 <translation id="57094364128775171">اقتراح كلمة مرور قوية…</translation>
 <translation id="5710435578057952990">لم  يتمّ التحقق من هوية هذا الموقع.</translation>
 <translation id="5719499550583120431">يتم قبول بطاقات الدفع المسبق.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">يتم ترميز اتصالك بالنطاق <ph name="DOMAIN" /> باستخدام مجموعة تشفير قديمة.</translation>
 <translation id="5813119285467412249">إعا&amp;دة الإضافة</translation>
 <translation id="5838278095973806738">يجب عدم إدخال معلومات حسّاسة على هذا الموقع (على سبيل المثال، كلمات المرور أو بطاقات الائتمان)، نظرًا لأنه قد تتم سرقتها من قِبل المهاجمين.</translation>
+<translation id="5863847714970149516">قد تُحاول الصفحة التالية تحصيل رسوم منك</translation>
 <translation id="5866257070973731571">إضافة رقم الهاتف</translation>
 <translation id="5869405914158311789">لا يمكن الوصول إلى موقع الويب هذا</translation>
 <translation id="5869522115854928033">كلمات المرور المحفوظة</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">‏تم تحديد كل من الخوادم الوكيلة الثابتة وعنوان URL للنص البرمجي pac.</translation>
 <translation id="6989763994942163495">عرض الإعدادات المتقدمة...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">قد تُمثل هذه الرسوم رسومًا لمرة واحدة أو رسومًا متكررة وقد تكون غير واضحة.</translation>
 <translation id="7029809446516969842">كلمات المرور</translation>
 <translation id="7050187094878475250">لقد حاولت الوصول إلى <ph name="DOMAIN" />، ولكن الخادم قدم شهادة مدة صلاحيتها طويلة جدًا مما يجعلها غير جديرة بالثقة.</translation>
 <translation id="7053983685419859001">منع</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">تفويض المدخل المقيد</translation>
 <translation id="8971063699422889582">انتهت صلاحية شهادة الخادم.</translation>
 <translation id="8978053250194585037">‏رصد التصفح الآمن من Google عن وجود‬ <ph name="BEGIN_LINK" />تصيّد احتيالي<ph name="END_LINK" /> مؤخرًا على موقع <ph name="SITE" />، إذ تتظاهر مواقع التصيد الاحتيالي بكونها مواقع ويب أخرى لخداعك.</translation>
+<translation id="8983003182662520383">‏طرق الدفع والعناوين باستخدام Google Pay</translation>
 <translation id="8987927404178983737">شهر</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" />‏ [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">تحتوي مقدمة الموقع على برامج ضارة</translation>
diff --git a/components/strings/components_strings_bg.xtb b/components/strings/components_strings_bg.xtb
index 962c635..65d8e78 100644
--- a/components/strings/components_strings_bg.xtb
+++ b/components/strings/components_strings_bg.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Въвеждане на допълнителни подробности</translation>
 <translation id="1021110881106174305">Приемани карти</translation>
 <translation id="1032854598605920125">Завъртане по часовниковата стрелка</translation>
+<translation id="1035334672863811645">Влезте в Chrome</translation>
 <translation id="1038842779957582377">неизвестно име</translation>
 <translation id="1050038467049342496">Затворете другите приложения.</translation>
 <translation id="1055184225775184556">&amp;Отмяна на добавянето</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Повторно задаване на паролата</translation>
 <translation id="4280429058323657511">, изтича: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Превключване</translation>
+<translation id="4308131620840579419">Искате ли да запазите всичките си карти на едно място?</translation>
 <translation id="4312866146174492540">Блокиране (по подразбиране)</translation>
 <translation id="4325863107915753736">Намирането на статията не бе успешно</translation>
 <translation id="4326324639298822553">Проверете датата на валидност и опитайте отново</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Лента на отметките</translation>
 <translation id="5201306358585911203">Страница, вградена в тази страница, изпраща съобщение</translation>
 <translation id="5205222826937269299">Името е задължително</translation>
+<translation id="5215116848420601511">Начини на плащане и адреси посредством Google Pay</translation>
 <translation id="5222812217790122047">Имейл адресът е задължителен</translation>
 <translation id="5230733896359313003">Адрес за доставка</translation>
 <translation id="5250209940322997802">„Свързване с мрежа“</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Експортиране във формат JSON</translation>
 <translation id="5689516760719285838">Местоположение</translation>
 <translation id="570530837424789914">Управление...</translation>
+<translation id="5705882733397021510">Назад</translation>
 <translation id="57094364128775171">Предложение за надеждна парола…</translation>
 <translation id="5710435578057952990">Самоличността на този уебсайт не е потвърдена.</translation>
 <translation id="5719499550583120431">Приемат се предплатени карти.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Връзката ви с/ъс <ph name="DOMAIN" /> е шифрована с остарял криптографски пакет.</translation>
 <translation id="5813119285467412249">&amp;Възстановяване на добавянето</translation>
 <translation id="5838278095973806738">Не ви препоръчваме да въвеждате поверителна информация в този сайт (например пароли или номера на кредитни карти), тъй като може да бъде открадната от извършители на атаки.</translation>
+<translation id="5863847714970149516">Страницата, която сте напът да посетите, може да опита да ви таксува пари</translation>
 <translation id="5866257070973731571">Добавяне на телефонен номер</translation>
 <translation id="5869405914158311789">Няма достъп до този сайт</translation>
 <translation id="5869522115854928033">Запазени пароли</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Посочени са както фиксирани прокси сървъри, така и URL адрес на скрипт във формат .pac.</translation>
 <translation id="6989763994942163495">Показване на разширените настройки...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Тези таксувания може да са еднократни или повтарящи се и е възможно да не са явни.</translation>
 <translation id="7029809446516969842">Пароли</translation>
 <translation id="7050187094878475250">Опитахте да се свържете с/ъс <ph name="DOMAIN" />, но сървърът предостави сертификат, чийто период на валидност е твърде дълъг, за да е надежден.</translation>
 <translation id="7053983685419859001">Блокиране</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Упълномощаване в портал за удостоверяване</translation>
 <translation id="8971063699422889582">Сертификатът на сървъра е с изтекла валидност.</translation>
 <translation id="8978053250194585037">Google Безопасно сърфиране наскоро <ph name="BEGIN_LINK" />откри фишинг<ph name="END_LINK" /> на <ph name="SITE" />. Сайтовете за фишинг се представят за други уебсайтове с цел да ви подведат.</translation>
+<translation id="8983003182662520383">Начини на плащане и адреси посредством Google Pay</translation>
 <translation id="8987927404178983737">Месец</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">На хоризонта се задава сайт с опасни програми</translation>
diff --git a/components/strings/components_strings_bn.xtb b/components/strings/components_strings_bn.xtb
index c28bc91..d3180dc 100644
--- a/components/strings/components_strings_bn.xtb
+++ b/components/strings/components_strings_bn.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">অতিরিক্ত বিবরণ দিন</translation>
 <translation id="1021110881106174305">এই কার্ডগুলি গ্রহণ করা হয়</translation>
 <translation id="1032854598605920125">ঘড়ির কাঁটার দিকে ঘোরান</translation>
+<translation id="1035334672863811645">Chrome এ প্রবেশ করুন</translation>
 <translation id="1038842779957582377">অজানা নাম</translation>
 <translation id="1050038467049342496">অন্যান্য অ্যাপ্লিকেশানগুলি বন্ধ করুন</translation>
 <translation id="1055184225775184556">&amp;যোগ করাকে পূর্বাবস্থায় ফেরান</translation>
diff --git a/components/strings/components_strings_ca.xtb b/components/strings/components_strings_ca.xtb
index a32ae0e..5e2f2c7 100644
--- a/components/strings/components_strings_ca.xtb
+++ b/components/strings/components_strings_ca.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Proporcioneu més informació</translation>
 <translation id="1021110881106174305">Targetes acceptades</translation>
 <translation id="1032854598605920125">Gira en el sentit de les agulles del rellotge</translation>
+<translation id="1035334672863811645">Inicia la sessió a Chrome</translation>
 <translation id="1038842779957582377">nom desconegut</translation>
 <translation id="1050038467049342496">Tanca altres aplicacions</translation>
 <translation id="1055184225775184556">&amp;Desfés l'addició</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Restableix la contrasenya</translation>
 <translation id="4280429058323657511">, caduca el dia <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Canvia</translation>
+<translation id="4308131620840579419">Vols desar totes les teves targetes en un sol lloc?</translation>
 <translation id="4312866146174492540">Bloqueja (opció predeterminada)</translation>
 <translation id="4325863107915753736">No s'ha pogut trobar l'article</translation>
 <translation id="4326324639298822553">Comprova la data de caducitat i torna-ho a provar</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Barra d'adreces d'interès</translation>
 <translation id="5201306358585911203">Una pàgina inserida en aquesta pàgina diu</translation>
 <translation id="5205222826937269299">El nom és obligatori</translation>
+<translation id="5215116848420601511">Formes de pagament i adreces que fan servir Google Pay</translation>
 <translation id="5222812217790122047">El correu electrònic és obligatori</translation>
 <translation id="5230733896359313003">Adreça d'enviament</translation>
 <translation id="5250209940322997802">"Connecteu-vos a la xarxa"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exporta a JSON</translation>
 <translation id="5689516760719285838">Ubicació</translation>
 <translation id="570530837424789914">Gestiona...</translation>
+<translation id="5705882733397021510">Enrere</translation>
 <translation id="57094364128775171">Suggereix una contrasenya segura…</translation>
 <translation id="5710435578057952990">La identitat d'aquest lloc web no ha estat verificada.</translation>
 <translation id="5719499550583120431">S'accepten targetes de prepagament.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">La connexió a <ph name="DOMAIN" /> s'ha encriptat amb un sistema de xifratge obsolet.</translation>
 <translation id="5813119285467412249">&amp;Refés l'addició</translation>
 <translation id="5838278095973806738">No introdueixis informació sensible en aquest lloc (com ara contrasenyes o targetes de crèdit), ja que alguns atacants podrien robar-la.</translation>
+<translation id="5863847714970149516">És possible que la pàgina següent provi de fer-te algun càrrec</translation>
 <translation id="5866257070973731571">Afegeix un número de telèfon</translation>
 <translation id="5869405914158311789">No es pot accedir a aquest lloc</translation>
 <translation id="5869522115854928033">Contrasenyes desades</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">S'especifiquen tant els servidors intermediaris fixos com un URL d'script .pac.</translation>
 <translation id="6989763994942163495">Mostra la configuració avançada...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Aquests càrrecs poden ser únics o periòdics i és possible que no s'indiquin d'una manera evident.</translation>
 <translation id="7029809446516969842">Contrasenyes</translation>
 <translation id="7050187094878475250">Heu provat de connectar-vos a <ph name="DOMAIN" />, però el servidor ha presentat un certificat amb un període de validesa massa gran per poder confiar-hi.</translation>
 <translation id="7053983685419859001">Bloqueja</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Autorització de portals captius</translation>
 <translation id="8971063699422889582">El certificat del servidor ha caducat.</translation>
 <translation id="8978053250194585037">Navegació segura de Google ha <ph name="BEGIN_LINK" />detectat recentment activitat de pesca<ph name="END_LINK" /> a <ph name="SITE" />. Els llocs web de pesca es fan passar per altres llocs web per enganyar-te.</translation>
+<translation id="8983003182662520383">Formes de pagament i adreces que fan servir Google Pay</translation>
 <translation id="8987927404178983737">Mes</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Aquest lloc web conté programes perjudicials</translation>
diff --git a/components/strings/components_strings_cs.xtb b/components/strings/components_strings_cs.xtb
index 5105b1a7..85e4d7db 100644
--- a/components/strings/components_strings_cs.xtb
+++ b/components/strings/components_strings_cs.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Zadejte další podrobnosti</translation>
 <translation id="1021110881106174305">Přijímané karty</translation>
 <translation id="1032854598605920125">Otočit ve směru hodinových ručiček</translation>
+<translation id="1035334672863811645">přihlaste se do Chromu</translation>
 <translation id="1038842779957582377">neznámé jméno</translation>
 <translation id="1050038467049342496">Zavřete ostatní aplikace</translation>
 <translation id="1055184225775184556">&amp;Vrátit přidání zpět</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb
index 3ff51f9..a108a47 100644
--- a/components/strings/components_strings_da.xtb
+++ b/components/strings/components_strings_da.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Angiv yderligere oplysninger</translation>
 <translation id="1021110881106174305">Accepterede kort</translation>
 <translation id="1032854598605920125">Rotér med uret</translation>
+<translation id="1035334672863811645">log ind på Chrome</translation>
 <translation id="1038842779957582377">ukendt navn</translation>
 <translation id="1050038467049342496">Luk andre apps</translation>
 <translation id="1055184225775184556">&amp;Fortryd tilføjelse</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Nulstil adgangskoden</translation>
 <translation id="4280429058323657511">udløber <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Skift</translation>
+<translation id="4308131620840579419">Vil du gemme alle dine kort på ét sted?</translation>
 <translation id="4312866146174492540">Bloker (standardindstilling)</translation>
 <translation id="4325863107915753736">Artiklen blev ikke fundet.</translation>
 <translation id="4326324639298822553">Kontrollér, om udløbsdatoen er korrekt, og prøv igen.</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Bogmærkelinje</translation>
 <translation id="5201306358585911203">En integreret side på denne side siger</translation>
 <translation id="5205222826937269299">Navn påkrævet</translation>
+<translation id="5215116848420601511">Betalingsmetoder og adresser, der bruger Google Pay</translation>
 <translation id="5222812217790122047">Mail påkrævet</translation>
 <translation id="5230733896359313003">Leveringsadresse</translation>
 <translation id="5250209940322997802">"Opret forbindelse til netværk"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Eksportér i JSON</translation>
 <translation id="5689516760719285838">Placering</translation>
 <translation id="570530837424789914">Administrer...</translation>
+<translation id="5705882733397021510">Gå tilbage</translation>
 <translation id="57094364128775171">Foreslå stærk adgangskode…</translation>
 <translation id="5710435578057952990">Dette websites identitet er ikke blevet bekræftet.</translation>
 <translation id="5719499550583120431">Forudbetalte kort accepteres.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Din forbindelse til <ph name="DOMAIN" /> er krypteret ved hjælp af en forældet krypteringspakke.</translation>
 <translation id="5813119285467412249">&amp;Annuller fortryd tilføjelse</translation>
 <translation id="5838278095973806738">Du bør ikke indtaste følsomme oplysninger på dette website (f.eks. adgangskoder eller kreditkortoplysninger), da de kan blive stjålet af hackere.</translation>
+<translation id="5863847714970149516">Siden forude kan forsøge at opkræve dig penge</translation>
 <translation id="5866257070973731571">Tilføj telefonnummer</translation>
 <translation id="5869405914158311789">Der kan ikke oprettes forbindelse til dette website</translation>
 <translation id="5869522115854928033">Gemte adgangskoder</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Både faste proxyservere og en webadresse for .pac-script angives.</translation>
 <translation id="6989763994942163495">Vis avancerede indstillinger...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Disse debiteringer kan være enkeltstående eller gentagne og fremgår muligvis ikke tydeligt.</translation>
 <translation id="7029809446516969842">Adgangskoder</translation>
 <translation id="7050187094878475250">Du forsøgte at gå til <ph name="DOMAIN" />, men serveren præsenterede et certifikat, hvis gyldighedsperiode er for lang til at være pålidelig.</translation>
 <translation id="7053983685419859001">Bloker</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Godkendelse af captive portal</translation>
 <translation id="8971063699422889582">Serverens certifikat er udløbet.</translation>
 <translation id="8978053250194585037">Google Beskyttet browsing <ph name="BEGIN_LINK" />registrerede phishing<ph name="END_LINK" /> på <ph name="SITE" /> for nylig. Phishing-websites udgiver sig for at være andre websites med det formål at narre dig.</translation>
+<translation id="8983003182662520383">Betalingsmetoder og adresser, der bruger Google Pay</translation>
 <translation id="8987927404178983737">Måned</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Det website, du er på vej til, indeholder skadelige programmer</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb
index 216382e..839404b 100644
--- a/components/strings/components_strings_de.xtb
+++ b/components/strings/components_strings_de.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Weitere Details angeben</translation>
 <translation id="1021110881106174305">Akzeptierte Karten</translation>
 <translation id="1032854598605920125">Im Uhrzeigersinn drehen</translation>
+<translation id="1035334672863811645">In Chrome anmelden</translation>
 <translation id="1038842779957582377">Unbekannter Name</translation>
 <translation id="1050038467049342496">Andere Apps schließen</translation>
 <translation id="1055184225775184556">&amp;Hinzufügen rückgängig machen</translation>
@@ -487,6 +488,7 @@
 <translation id="4277028893293644418">Passwort zurücksetzen</translation>
 <translation id="4280429058323657511">Gültig bis: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Wechseln</translation>
+<translation id="4308131620840579419">Möchten Sie alle Ihre Karten an einem Ort speichern?</translation>
 <translation id="4312866146174492540">Blockieren (Standardeinstellung)</translation>
 <translation id="4325863107915753736">Der Artikel wurde nicht gefunden.</translation>
 <translation id="4326324639298822553">Prüfen Sie Ihr Ablaufdatum und versuchen Sie es dann erneut</translation>
@@ -597,6 +599,7 @@
 <translation id="5190835502935405962">Lesezeichenleiste</translation>
 <translation id="5201306358585911203">Auf einer in dieser Seite eingebetteten Seite wird Folgendes angezeigt</translation>
 <translation id="5205222826937269299">Name erforderlich</translation>
+<translation id="5215116848420601511">Zahlungsmethoden und Adressen bei Google Pay</translation>
 <translation id="5222812217790122047">E-Mail-Adresse erforderlich</translation>
 <translation id="5230733896359313003">Versandadresse</translation>
 <translation id="5250209940322997802">"Mit Netzwerk verbinden"</translation>
@@ -673,6 +676,7 @@
 <translation id="5689199277474810259">Als JSON exportieren</translation>
 <translation id="5689516760719285838">Ort</translation>
 <translation id="570530837424789914">Verwalten…</translation>
+<translation id="5705882733397021510">Zurück</translation>
 <translation id="57094364128775171">Starkes Passwort vorschlagen…</translation>
 <translation id="5710435578057952990">Die Identität dieser Website wurde nicht verifiziert.</translation>
 <translation id="5719499550583120431">Prepaidkarten werden akzeptiert.</translation>
@@ -690,6 +694,7 @@
 <translation id="5810442152076338065">Ihre Verbindung zu <ph name="DOMAIN" /> ist mit einer veralteten Codier-Suite verschlüsselt.</translation>
 <translation id="5813119285467412249">&amp;Hinzufügen wiederholen</translation>
 <translation id="5838278095973806738">Sie sollten keine vertraulichen Informationen wie Passwörter oder Kreditkartennummern auf dieser Website eingeben, da sie von Angreifern gestohlen werden könnten.</translation>
+<translation id="5863847714970149516">Auf der nächsten Seite wird möglicherweise versucht, Ihnen etwas in Rechnung zu stellen</translation>
 <translation id="5866257070973731571">Telefonnummer hinzufügen</translation>
 <translation id="5869405914158311789">Diese Website ist nicht erreichbar</translation>
 <translation id="5869522115854928033">Gespeicherte Passwörter</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">Sowohl feste Proxyserver als auch eine PAC-Skript-URL sind festgelegt.</translation>
 <translation id="6989763994942163495">Erweiterte Einstellungen anzeigen</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Diese Belastungen können einmalig oder wiederkehrend sein und sind vielleicht nicht offensichtlich.</translation>
 <translation id="7029809446516969842">Passwörter</translation>
 <translation id="7050187094878475250">Sie haben versucht, <ph name="DOMAIN" /> zu erreichen. Der Server hat jedoch ein Zertifikat präsentiert, dessen Gültigkeitsdauer zu lang ist, um vertrauenswürdig zu sein.</translation>
 <translation id="7053983685419859001">Blockieren</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Erfassungsportal-Autorisierung</translation>
 <translation id="8971063699422889582">Das Serverzertifikat ist abgelaufen.</translation>
 <translation id="8978053250194585037">Google Safe Browsing hat kürzlich <ph name="BEGIN_LINK" />Phishingaktivitäten<ph name="END_LINK" /> auf <ph name="SITE" /> festgestellt. Phishingwebsites geben sich als andere Websites aus, um Sie zu täuschen.</translation>
+<translation id="8983003182662520383">Zahlungsmethoden und Adressen bei Google Pay</translation>
 <translation id="8987927404178983737">Monat</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Die Website, die Sie aufrufen möchten, enthält schädliche Programme</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb
index 75fe8a79..865e29b 100644
--- a/components/strings/components_strings_el.xtb
+++ b/components/strings/components_strings_el.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Καταχωρίστε επιπλέον λεπτομέρειες</translation>
 <translation id="1021110881106174305">Αποδεκτές κάρτες</translation>
 <translation id="1032854598605920125">Περιστροφή προς τα δεξιά</translation>
+<translation id="1035334672863811645">σύνδεση στο Chrome</translation>
 <translation id="1038842779957582377">άγνωστο όνομα</translation>
 <translation id="1050038467049342496">Κλείστε τις άλλες εφαρμογές</translation>
 <translation id="1055184225775184556">&amp;Αναίρεση προσθήκης</translation>
@@ -489,6 +490,7 @@
 <translation id="4277028893293644418">Επαναφορά κωδικού πρόσβασης</translation>
 <translation id="4280429058323657511">, λήξη <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Εναλλαγή</translation>
+<translation id="4308131620840579419">Θέλετε να αποθηκεύσετε όλες τις κάρτες σας σε ένα σημείο;</translation>
 <translation id="4312866146174492540">Αποκλεισμός (προεπιλογή)</translation>
 <translation id="4325863107915753736">Αποτυχία εύρεσης άρθρου</translation>
 <translation id="4326324639298822553">Ελέγξτε την ημερομηνία λήξης σας και δοκιμάστε ξανά</translation>
@@ -599,6 +601,7 @@
 <translation id="5190835502935405962">Γραμμή σελιδοδεικτών</translation>
 <translation id="5201306358585911203">Μια ενσωματωμένη σελίδα σε αυτήν τη σελίδα λέει</translation>
 <translation id="5205222826937269299">Απαιτείται όνομα</translation>
+<translation id="5215116848420601511">Τρόποι πληρωμής και διευθύνσεις που χρησιμοποιούν το Google Pay</translation>
 <translation id="5222812217790122047">Απαιτείται διεύθυνση ηλεκτρονικού ταχυδρομείου</translation>
 <translation id="5230733896359313003">Διεύθυνση αποστολής</translation>
 <translation id="5250209940322997802">"Σύνδεση σε δίκτυο"</translation>
@@ -675,6 +678,7 @@
 <translation id="5689199277474810259">Εξαγωγή σε JSON</translation>
 <translation id="5689516760719285838">Τοποθεσία</translation>
 <translation id="570530837424789914">Διαχείριση…</translation>
+<translation id="5705882733397021510">Επιστροφή</translation>
 <translation id="57094364128775171">Πρόταση για ισχυρό κωδικό πρόσβασης…</translation>
 <translation id="5710435578057952990">Η ταυτότητα αυτού του ιστότοπου δεν έχει επαληθευτεί.</translation>
 <translation id="5719499550583120431">Οι προπληρωμένες κάρτες γίνονται δεκτές.</translation>
@@ -692,6 +696,7 @@
 <translation id="5810442152076338065">Η σύνδεσή σας στο <ph name="DOMAIN" /> κρυπτογραφείται χρησιμοποιώντας ένα απαρχαιωμένο πρόγραμμα κρυπτογράφησης.</translation>
 <translation id="5813119285467412249">&amp;Επανάληψη προσθήκης</translation>
 <translation id="5838278095973806738">Δεν θα πρέπει να εισαγάγετε ευαίσθητες πληροφορίες σε αυτόν τον ιστότοπο (για παράδειγμα, κωδικούς πρόσβασης ή πιστωτικές κάρτες), επειδή ενδέχεται να υποκλαπούν από εισβολείς.</translation>
+<translation id="5863847714970149516">Η σελίδα που ακολουθεί μπορεί να προσπαθήσει να σας χρεώσει</translation>
 <translation id="5866257070973731571">Προσθήκη αριθμού τηλεφώνου</translation>
 <translation id="5869405914158311789">Δεν είναι δυνατή η πρόσβαση σε αυτόν τον ιστότοπο</translation>
 <translation id="5869522115854928033">Αποθηκευμένοι κωδικοί πρόσβασης</translation>
@@ -822,6 +827,7 @@
 <translation id="6973656660372572881">Καθορίζονται τόσο οι σταθεροί διακομιστές μεσολάβησης όσο και μια διεύθυνση URL σεναρίου .pac.</translation>
 <translation id="6989763994942163495">Εμφάνιση σύνθετων ρυθμίσεων…</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Αυτές οι χρεώσεις μπορεί να είναι εφάπαξ ή επαναλαμβανόμενες και ίσως να μην είναι εμφανείς.</translation>
 <translation id="7029809446516969842">Κωδικοί πρόσβασης</translation>
 <translation id="7050187094878475250">Επιχειρήσατε να μεταβείτε στο <ph name="DOMAIN" />, αλλά ο διακομιστής παρουσίασε ένα πιστοποιητικό με περίοδο εγκυρότητας η οποία είναι πολύ μεγάλη για να θεωρηθεί αξιόπιστη.</translation>
 <translation id="7053983685419859001">Αποκλεισμός</translation>
@@ -1087,6 +1093,7 @@
 <translation id="8957210676456822347">Εξουσιοδότηση πύλης υποδοχής</translation>
 <translation id="8971063699422889582">Το πιστοποιητικό του διακομιστή έχει λήξει.</translation>
 <translation id="8978053250194585037">Πρόσφατα, η Ασφαλής περιήγηση Google <ph name="BEGIN_LINK" />εντόπισε εκδηλώσεις ηλεκτρονικού ψαρέματος (phishing)<ph name="END_LINK" /> στον ιστότοπο <ph name="SITE" />. Οι ιστότοποι ηλεκτρονικού ψαρέματος (phishing) παρουσιάζονται ψευδώς σαν άλλου τύπου ιστότοποι, για να σας εξαπατήσουν.</translation>
+<translation id="8983003182662520383">Τρόποι πληρωμής και διευθύνσεις που χρησιμοποιούν το Google Pay</translation>
 <translation id="8987927404178983737">Μήνας</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Ο ιστότοπος που πρόκειται να επισκεφτείτε περιέχει κακόβουλα προγράμματα</translation>
diff --git a/components/strings/components_strings_en-GB.xtb b/components/strings/components_strings_en-GB.xtb
index 33fd66b..37f55cde 100644
--- a/components/strings/components_strings_en-GB.xtb
+++ b/components/strings/components_strings_en-GB.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Provide additional details.</translation>
 <translation id="1021110881106174305">Accepted cards</translation>
 <translation id="1032854598605920125">Rotate clockwise</translation>
+<translation id="1035334672863811645">sign in to Chrome</translation>
 <translation id="1038842779957582377">unknown name</translation>
 <translation id="1050038467049342496">Close other apps</translation>
 <translation id="1055184225775184556">&amp;Undo Add</translation>
diff --git a/components/strings/components_strings_es-419.xtb b/components/strings/components_strings_es-419.xtb
index 84bc9c3d..11390786 100644
--- a/components/strings/components_strings_es-419.xtb
+++ b/components/strings/components_strings_es-419.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Proporciona más detalles</translation>
 <translation id="1021110881106174305">Tarjetas aceptadas</translation>
 <translation id="1032854598605920125">Girar a la derecha</translation>
+<translation id="1035334672863811645">acceder a Chrome</translation>
 <translation id="1038842779957582377">nombre desconocido</translation>
 <translation id="1050038467049342496">Cierra las demás apps.</translation>
 <translation id="1055184225775184556">&amp;Deshacer Agregar</translation>
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index afb62b9..a8a136e1 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Proporciónanos más detalles</translation>
 <translation id="1021110881106174305">Tarjetas aceptadas</translation>
 <translation id="1032854598605920125">Girar hacia la derecha</translation>
+<translation id="1035334672863811645">iniciar sesión en Chrome</translation>
 <translation id="1038842779957582377">nombre desconocido</translation>
 <translation id="1050038467049342496">Cierra otras aplicaciones</translation>
 <translation id="1055184225775184556">&amp;Deshacer acción de añadir</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Cambiar contraseña</translation>
 <translation id="4280429058323657511">Vcto. <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Cambiar</translation>
+<translation id="4308131620840579419">¿Quieres guardar todas tus tarjetas en un mismo lugar?</translation>
 <translation id="4312866146174492540">Bloquear (predeterminado)</translation>
 <translation id="4325863107915753736">Error al buscar el artículo</translation>
 <translation id="4326324639298822553">Consulta la fecha de vencimiento y vuelve a intentarlo</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Barra de marcadores</translation>
 <translation id="5201306358585911203">Una página insertada en esta dice</translation>
 <translation id="5205222826937269299">Nombre obligatorio</translation>
+<translation id="5215116848420601511">Métodos de pago y direcciones con Google Pay</translation>
 <translation id="5222812217790122047">Correo electrónico obligatorio</translation>
 <translation id="5230733896359313003">Dirección de envío</translation>
 <translation id="5250209940322997802">"Conectarse a la red"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exportar a JSON</translation>
 <translation id="5689516760719285838">Ubicación</translation>
 <translation id="570530837424789914">Gestionar...</translation>
+<translation id="5705882733397021510">Volver</translation>
 <translation id="57094364128775171">Sugerir contraseña segura…</translation>
 <translation id="5710435578057952990">No se ha verificado la identidad de este sitio web.</translation>
 <translation id="5719499550583120431">Se aceptan tarjetas prepago.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Tu conexión con <ph name="DOMAIN" /> está cifrada con un conjunto de cifrado obsoleto.</translation>
 <translation id="5813119285467412249">&amp;Rehacer acción de añadir</translation>
 <translation id="5838278095973806738">No deberías introducir información confidencial en este sitio web (por ejemplo, contraseñas o tarjetas de crédito) porque los atacantes podrían robarla.</translation>
+<translation id="5863847714970149516">Es posible que la página a la que vas a acceder intente aplicar algún cargo</translation>
 <translation id="5866257070973731571">Añade un número de teléfono</translation>
 <translation id="5869405914158311789">No se puede acceder a este sitio web</translation>
 <translation id="5869522115854928033">Contraseñas guardadas</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Se especifican tanto servidores proxy fijos como una URL de secuencia de comandos .pac.</translation>
 <translation id="6989763994942163495">Mostrar configuración avanzada...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Estos cargos pueden ser únicos o periódicos, y es posible que no se indiquen de una forma evidente.</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
 <translation id="7050187094878475250">Has intentado acceder a <ph name="DOMAIN" />, pero el servidor ha presentado un certificado cuyo periodo de validez es demasiado largo para que se considere de confianza.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Autorización de portal cautivo</translation>
 <translation id="8971063699422889582">El certificado del servidor ha caducado.</translation>
 <translation id="8978053250194585037">La función Navegación Segura de Google <ph name="BEGIN_LINK" />ha detectado phishing<ph name="END_LINK" /> en <ph name="SITE" />. Los sitios web de phishing suplantan la identidad de otros sitios web para engañarte.</translation>
+<translation id="8983003182662520383">Métodos de pago y direcciones con Google Pay</translation>
 <translation id="8987927404178983737">Mes</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">El sitio web al que vas a acceder contiene programas dañinos</translation>
diff --git a/components/strings/components_strings_et.xtb b/components/strings/components_strings_et.xtb
index df2bb3a..3009960 100644
--- a/components/strings/components_strings_et.xtb
+++ b/components/strings/components_strings_et.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Esitage lisateavet</translation>
 <translation id="1021110881106174305">Aktsepteeritud kaardid</translation>
 <translation id="1032854598605920125">Pööra päripäeva</translation>
+<translation id="1035334672863811645">logige Chromeʼi sisse</translation>
 <translation id="1038842779957582377">tundmatu nimi</translation>
 <translation id="1050038467049342496">Sulgege muud rakendused</translation>
 <translation id="1055184225775184556">&amp;Võta lisamine tagasi</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Lähtesta parool</translation>
 <translation id="4280429058323657511">, aegub <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Lüliti</translation>
+<translation id="4308131620840579419">Kas soovite salvestada kõik kaardid ühte kohta?</translation>
 <translation id="4312866146174492540">Blokeeri (vaikimisi)</translation>
 <translation id="4325863107915753736">Artiklit ei leitud</translation>
 <translation id="4326324639298822553">Kontrollige aegumiskuupäeva ja proovige uuesti</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Järjehoidjariba</translation>
 <translation id="5201306358585911203">Selle lehe manustatud leht ütleb</translation>
 <translation id="5205222826937269299">Nimi on nõutav</translation>
+<translation id="5215116848420601511">Makseviisid ja aadressid, mis kasutavad teenust Google Pay.</translation>
 <translation id="5222812217790122047">E-posti aadress on nõutav</translation>
 <translation id="5230733896359313003">Tarneaadress</translation>
 <translation id="5250209940322997802">„Looge võrguühendus”</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Ekspordi JSON-vormingus</translation>
 <translation id="5689516760719285838">Asukoht</translation>
 <translation id="570530837424789914">Halda …</translation>
+<translation id="5705882733397021510">Mine tagasi</translation>
 <translation id="57094364128775171">Soovita tugevat parooli …</translation>
 <translation id="5710435578057952990">Selle veebisaidi identiteeti pole kinnitanud.</translation>
 <translation id="5719499550583120431">Kaupmees aktsepteerib ettemakstud kaarte.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Teie ühendus domeeniga <ph name="DOMAIN" /> on krüpteeritud aegunud šifreerimiskomplektiga.</translation>
 <translation id="5813119285467412249">&amp;Lisa uuesti</translation>
 <translation id="5838278095973806738">Te ei tohiks sellele saidile sisestada tundlikku teavet (nt paroolid või krediitkaardid), kuna ründajad võivad selle varastada.</translation>
+<translation id="5863847714970149516">Järgmisel lehel võidakse teilt üritada tasu võtta</translation>
 <translation id="5866257070973731571">Telefoninumbri lisamine</translation>
 <translation id="5869405914158311789">Selle saidiga ei saa ühendust</translation>
 <translation id="5869522115854928033">Salvestatud paroolid</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Määratud on nii fikseeritud puhverserverid kui ka pac-skriptiga URL.</translation>
 <translation id="6989763994942163495">Kuva täpsemad seaded ...</translation>
 <translation id="7012363358306927923">Hiina UnionPay</translation>
+<translation id="7016992613359344582">Tasud võivad olla ühekordsed või korduvad ja need ei pruugi olla ilmselged.</translation>
 <translation id="7029809446516969842">Paroolid</translation>
 <translation id="7050187094878475250">Üritasite jõuda domeenile <ph name="DOMAIN" />, kuid server esitas sertifikaadi, mille kehtivusaeg on liiga pikk, et olla usaldusväärne.</translation>
 <translation id="7053983685419859001">Blokeeri</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Kontrollportaali volitamine</translation>
 <translation id="8971063699422889582">Serveri sertifikaat on aegunud.</translation>
 <translation id="8978053250194585037">Google'i ohutu sirvimise funktsioon <ph name="BEGIN_LINK" />tuvastas hiljuti andmepüügi<ph name="END_LINK" /> saidil <ph name="SITE" />. Andmepüügisaidid teesklevad teie petmiseks, et tegemist on teise saidiga.</translation>
+<translation id="8983003182662520383">Makseviisid ja aadressid, mis kasutavad teenust Google Pay</translation>
 <translation id="8987927404178983737">kuu</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Sait, mille soovite avada, sisaldab kahjulikke programme</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb
index e400bf0..351177a 100644
--- a/components/strings/components_strings_fa.xtb
+++ b/components/strings/components_strings_fa.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">جزئیات بیشتری ارائه دهید</translation>
 <translation id="1021110881106174305">کارت‌های قابل‌ قبول</translation>
 <translation id="1032854598605920125">چرخش در جهت عقربه‌های ساعت</translation>
+<translation id="1035334672863811645">‏ورود به سیستم Chrome</translation>
 <translation id="1038842779957582377">نام ناشناس</translation>
 <translation id="1050038467049342496">برنامه‌های دیگر را ببندید</translation>
 <translation id="1055184225775184556">&amp;واگرد افزودن</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">بازنشانی گذرواژه</translation>
 <translation id="4280429058323657511">، انقضا <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">جابه‌جایی</translation>
+<translation id="4308131620840579419">همه کارت‌هایتان در یک مکان ذخیره شود؟</translation>
 <translation id="4312866146174492540">مسدود کردن (پیش‌فرض)</translation>
 <translation id="4325863107915753736">مقاله یافت نشد.</translation>
 <translation id="4326324639298822553">تاریخ انقضا را بررسی و دوباره امتحان کنید</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">نوار نشانک‌ها</translation>
 <translation id="5201306358585911203">صفحه جاسازی‌شده‌ای در این صفحه می‌گوید</translation>
 <translation id="5205222826937269299">نام ضروری است</translation>
+<translation id="5215116848420601511">‏روش‌های پرداخت و نشانی‌های مورداستفاده در Google Pay</translation>
 <translation id="5222812217790122047">ایمیل ضروری است</translation>
 <translation id="5230733896359313003">نشانی تحویل کالا</translation>
 <translation id="5250209940322997802">«به شبکه متصل شوید»</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">‏صادر کردن به JSON</translation>
 <translation id="5689516760719285838">مکان</translation>
 <translation id="570530837424789914">مدیریت…</translation>
+<translation id="5705882733397021510">برگشت</translation>
 <translation id="57094364128775171">پیشنهاد گذرواژه قوی…</translation>
 <translation id="5710435578057952990">هویت این وب سایت تأیید نشده است.</translation>
 <translation id="5719499550583120431">کارت‌های پیش‌پرداخت پذیرفته می‌شوند.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">اتصال شما به <ph name="DOMAIN" /> با استفاده از یک مجموعه رمز منسوخ، رمزگذاری شده است.</translation>
 <translation id="5813119285467412249">&amp;انجام مجدد افزودن</translation>
 <translation id="5838278095973806738">نباید هیچ اطلاعات حساسی (مثل گذرواژه یا کارت اعتباری) را در این سایت وارد کنید، زیرا ممکن است مهاجمین آن‌ها را سرقت کنند.</translation>
+<translation id="5863847714970149516">صفحه پیش‌رو ممکن است تلاش کند از شما پول دریافت کند</translation>
 <translation id="5866257070973731571">افزودن شماره تلفن</translation>
 <translation id="5869405914158311789">دسترسی به این سایت امکان‌پذیر نیست</translation>
 <translation id="5869522115854928033">گذرواژه‌های ذخیره‌شده</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">‏هم سرورهای پروکسی ثابت و هم آدرس اسکریپت pac. مشخص شده‌اند.</translation>
 <translation id="6989763994942163495">نمایش تنظیمات پیشرفته ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">ممکن است این هزینه‌ها یک‌باره یا تکرارشونده باشند یا واضح نباشند.</translation>
 <translation id="7029809446516969842">گذرواژه‌ها</translation>
 <translation id="7050187094878475250">تلاش کردید به دامنه <ph name="DOMAIN" /> بروید اما گواهینامه‌ای که سرور ارائه کرد، دارای یک تاریخ اعتبار بسیار طولانی است و مورداعتماد نیست.</translation>
 <translation id="7053983685419859001">مسدود کردن</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">مجوز پورتال محدود</translation>
 <translation id="8971063699422889582">گواهی سرور منقضی شده است.</translation>
 <translation id="8978053250194585037">‏Google Safe Browsing اخیراً در <ph name="SITE" />، <ph name="BEGIN_LINK" />فیشینگ شناسایی کرده است<ph name="END_LINK" />. سایت‌های فیشینگ وانمود می‌کنند وب‌سایت‌های دیگری هستند تا شما را فریب دهند.</translation>
+<translation id="8983003182662520383">‏روش‌های پرداخت و نشانی‌های مورداستفاده در Google Pay</translation>
 <translation id="8987927404178983737">ماه</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">سایت در پیش‌رو حاوی برنامه‌های خطرناک است</translation>
diff --git a/components/strings/components_strings_fi.xtb b/components/strings/components_strings_fi.xtb
index 23ddb2a0..a6b734b 100644
--- a/components/strings/components_strings_fi.xtb
+++ b/components/strings/components_strings_fi.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Lisätietoja</translation>
 <translation id="1021110881106174305">Hyväksytyt kortit</translation>
 <translation id="1032854598605920125">Käännä myötäpäivään</translation>
+<translation id="1035334672863811645">Kirjaudu Chromeen</translation>
 <translation id="1038842779957582377">tuntematon nimi</translation>
 <translation id="1050038467049342496">Sulje muita sovelluksia.</translation>
 <translation id="1055184225775184556">K&amp;umoa lisäys</translation>
@@ -489,6 +490,7 @@
 <translation id="4277028893293644418">Pyydä uusi salasana</translation>
 <translation id="4280429058323657511">, vanhentumispäivä <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Vaihda</translation>
+<translation id="4308131620840579419">Tallennetaanko kaikki kortit samaan paikkaan?</translation>
 <translation id="4312866146174492540">Estä (oletus)</translation>
 <translation id="4325863107915753736">Artikkelia ei löydy</translation>
 <translation id="4326324639298822553">Tarkista vanhentumispäivä ja yritä uudelleen.</translation>
@@ -599,6 +601,7 @@
 <translation id="5190835502935405962">Kirjanmerkkipalkki</translation>
 <translation id="5201306358585911203">Viesti tälle sivulle upotetulta sivulta</translation>
 <translation id="5205222826937269299">Nimi vaaditaan</translation>
+<translation id="5215116848420601511">Maksutavat ja osoitteet Google Paysta</translation>
 <translation id="5222812217790122047">Sähköposti vaaditaan</translation>
 <translation id="5230733896359313003">Toimitusosoite</translation>
 <translation id="5250209940322997802">Yhdistä verkkoon</translation>
@@ -675,6 +678,7 @@
 <translation id="5689199277474810259">Vie JSON-tiedostoon</translation>
 <translation id="5689516760719285838">Sijainti</translation>
 <translation id="570530837424789914">Hallinnoi…</translation>
+<translation id="5705882733397021510">Takaisin</translation>
 <translation id="57094364128775171">Ehdota vahvaa salasanaa…</translation>
 <translation id="5710435578057952990">Tämän sivuston identiteettiä ei ole vahvistettu.</translation>
 <translation id="5719499550583120431">Prepaid-kortit hyväksytään.</translation>
@@ -692,6 +696,7 @@
 <translation id="5810442152076338065">Yhteytesi kohteeseen <ph name="DOMAIN" /> on salattu vanhentuneella salaustekniikalla.</translation>
 <translation id="5813119285467412249">&amp;Toista lisäys</translation>
 <translation id="5838278095973806738">Älä anna tälle sivustolle salasanoja, luottokorttinumeroita tai muita arkaluonteisia tietoja, sillä hyökkääjät saattavat varastaa ne.</translation>
+<translation id="5863847714970149516">Avaamasi sivu voi yrittää veloittaa sinulta rahaa</translation>
 <translation id="5866257070973731571">Lisää puhelinnumero</translation>
 <translation id="5869405914158311789">Sivustoon ei saada yhteyttä</translation>
 <translation id="5869522115854928033">Tallennetut salasanat</translation>
@@ -822,6 +827,7 @@
 <translation id="6973656660372572881">Sekä kiinteät välityspalvelimet että .pac-URL-osoite on määritetty.</translation>
 <translation id="6989763994942163495">Näytä lisäasetukset...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Veloitukset voivat olla kertaluontoisia tai toistuvia, eikä niitä välttämättä esitetä selkeästi.</translation>
 <translation id="7029809446516969842">Salasanat</translation>
 <translation id="7050187094878475250">Yritit muodostaa yhteyden verkkotunnukseen <ph name="DOMAIN" />, mutta palvelin esitti varmenteen, joka on voimassa liian kauan ollakseen luotettava.</translation>
 <translation id="7053983685419859001">Estä</translation>
@@ -1087,6 +1093,7 @@
 <translation id="8957210676456822347">Captive portal -valtuutus</translation>
 <translation id="8971063699422889582">Palvelimen varmenne on vanhentunut.</translation>
 <translation id="8978053250194585037">Googlen selaussuoja havaitsi äskettäin <ph name="BEGIN_LINK" />tietojenkalasteluyrityksen<ph name="END_LINK" /> sivustolla <ph name="SITE" />. Tietojenkalastelusivustot yrittävät huijata käyttäjiä tekeytymällä toisiksi sivustoiksi.</translation>
+<translation id="8983003182662520383">Maksutavat ja osoitteet Google Paysta</translation>
 <translation id="8987927404178983737">Kuukausi</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Sivusto sisältää haitallisia ohjelmia</translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index 8eed196..11143cc 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Magbigay ng mga karagdagang detalye</translation>
 <translation id="1021110881106174305">Mga tinatanggap na card</translation>
 <translation id="1032854598605920125">I-rotate pakanan</translation>
+<translation id="1035334672863811645">mag-sign in sa Chrome</translation>
 <translation id="1038842779957582377">Hindi kilalang pangalan</translation>
 <translation id="1050038467049342496">Isara ang iba pang app</translation>
 <translation id="1055184225775184556">&amp;I-undo ang Pagdagdag</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">I-reset ang password</translation>
 <translation id="4280429058323657511">, exp <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Lumipat</translation>
+<translation id="4308131620840579419">I-save ang lahat ng iyong card sa iisang lugar?</translation>
 <translation id="4312866146174492540">I-block (default)</translation>
 <translation id="4325863107915753736">Hindi nahanap ang artikulo</translation>
 <translation id="4326324639298822553">Tingnan ang iyong petsa ng pag-expire at subukang muli</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Bar ng Mga Bookmark</translation>
 <translation id="5201306358585911203">Isinasaad ng naka-embed na page sa page na ito na</translation>
 <translation id="5205222826937269299">Kailangan ng pangalan</translation>
+<translation id="5215116848420601511">Mga paraan ng pagbabayad at address gamit ang Google Pay</translation>
 <translation id="5222812217790122047">Kailangan ng email</translation>
 <translation id="5230733896359313003">Address na Padadalhan</translation>
 <translation id="5250209940322997802">"Kumonekta sa network"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">I-export sa JSON</translation>
 <translation id="5689516760719285838">Lokasyon</translation>
 <translation id="570530837424789914">Pamahalaan...</translation>
+<translation id="5705882733397021510">Bumalik</translation>
 <translation id="57094364128775171">Magmungkahi ng malakas na password...</translation>
 <translation id="5710435578057952990">Ang pagkilala ng website na ito ay hindi natukoy.</translation>
 <translation id="5719499550583120431">Tinatanggap ang mga prepaid card.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Naka-encrypt ang iyong koneksyon sa <ph name="DOMAIN" /> gamit ang isang hindi na ginagamit na cipher suite.</translation>
 <translation id="5813119285467412249">&amp;Gawing Muli ang Pagdagdag</translation>
 <translation id="5838278095973806738">Hindi ka dapat maglagay ng anumang sensitibong impormasyon sa site na ito (halimbawa, mga password o credit card), dahil maaari itong nakawin ng mga umaatake.</translation>
+<translation id="5863847714970149516">Maaari kang singilin sa susunod na page</translation>
 <translation id="5866257070973731571">Magdagdag ng Numero ng Telepono</translation>
 <translation id="5869405914158311789">Hindi makakonekta sa site na ito</translation>
 <translation id="5869522115854928033">Mga naka-save na password</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Tinukoy ang parehong mga hindi nababagong proxy server at isang .pac script URL.</translation>
 <translation id="6989763994942163495">Ipakita ang mga advanced na setting...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Ang mga singil na ito ay maaaring isang beses lang o umuulit at maaaring hindi mo mapansin.</translation>
 <translation id="7029809446516969842">Mga Password</translation>
 <translation id="7050187094878475250">Sinubukan mong puntahan ang <ph name="DOMAIN" />, ngunit nagpakita ang server ng certificate na masyadong mahaba ang panahon ng pagkakaroon ng bisa upang maging mapagkakatiwalaan.</translation>
 <translation id="7053983685419859001">I-block</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Pagpapahintulot sa Captive Portal</translation>
 <translation id="8971063699422889582">Nag-expire na ang certificate ng server.</translation>
 <translation id="8978053250194585037">May <ph name="BEGIN_LINK" />na-detect na phishing<ph name="END_LINK" /> sa <ph name="SITE" /> kamakailan ang Ligtas na Pag-browse sa Google. Nagpapanggap ang mga phishing site bilang ibang website upang linlangin ka.</translation>
+<translation id="8983003182662520383">Mga Paraan ng Pagbabayad at Address Gamit ang Google Pay</translation>
 <translation id="8987927404178983737">Buwan</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Ang susunod na site ay naglalaman ng mga mapanirang program</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb
index b7c21112..72bd6d0 100644
--- a/components/strings/components_strings_fr.xtb
+++ b/components/strings/components_strings_fr.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Fournir des informations supplémentaires</translation>
 <translation id="1021110881106174305">Cartes acceptées</translation>
 <translation id="1032854598605920125">Faire pivoter vers la droite</translation>
+<translation id="1035334672863811645">connectez-vous à Chrome</translation>
 <translation id="1038842779957582377">Nom inconnu</translation>
 <translation id="1050038467049342496">Fermez les autres applications</translation>
 <translation id="1055184225775184556">&amp;Annuler l'ajout</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Réinitialiser le mot de passe</translation>
 <translation id="4280429058323657511">, expiration le <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Changer</translation>
+<translation id="4308131620840579419">Vous souhaitez enregistrer toutes vos cartes au même endroit ?</translation>
 <translation id="4312866146174492540">Bloquer (par défaut)</translation>
 <translation id="4325863107915753736">Échec de la recherche de l'article.</translation>
 <translation id="4326324639298822553">Veuillez vérifier la date d'expiration, puis réessayer</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Barre de favoris</translation>
 <translation id="5201306358585911203">Une page intégrée à cette page Web indique</translation>
 <translation id="5205222826937269299">Veuillez saisir un nom</translation>
+<translation id="5215116848420601511">Modes de paiement et adresses utilisés dans Google Pay</translation>
 <translation id="5222812217790122047">Veuillez saisir une adresse e-mail</translation>
 <translation id="5230733896359313003">Adresse de livraison</translation>
 <translation id="5250209940322997802">"Se connecter au réseau"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exporter au format JSON</translation>
 <translation id="5689516760719285838">Position</translation>
 <translation id="570530837424789914">Gérer…</translation>
+<translation id="5705882733397021510">Retour</translation>
 <translation id="57094364128775171">Suggérer un mot de passe sécurisé…</translation>
 <translation id="5710435578057952990">L'identité de ce site Web n'a pas été vérifiée.</translation>
 <translation id="5719499550583120431">Les cartes prépayées sont acceptées.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Votre connexion à <ph name="DOMAIN" /> est chiffrée à l'aide d'une méthode de chiffrement obsolète.</translation>
 <translation id="5813119285467412249">&amp;Rétablir l'ajout</translation>
 <translation id="5838278095973806738">Vous ne devriez pas saisir d'informations sensibles sur ce site (par exemple, vos mots de passe ou les informations de votre carte de paiement), car elles risquent d'être dérobées par des pirates informatiques.</translation>
+<translation id="5863847714970149516">Il se peut que l'accès à la page suivante engendre des frais</translation>
 <translation id="5866257070973731571">Ajouter un numéro de téléphone</translation>
 <translation id="5869405914158311789">Ce site est inaccessible</translation>
 <translation id="5869522115854928033">Mots de passe enregistrés</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Les serveurs proxy déterminés et une URL de script .pac sont spécifiés tous les deux.</translation>
 <translation id="6989763994942163495">Afficher les paramètres avancés…</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Il peut s'agir de frais uniques ou récurrents qui ne sont pas toujours clairement signalés.</translation>
 <translation id="7029809446516969842">Mots de passe</translation>
 <translation id="7050187094878475250">Vous avez essayé d'accéder à <ph name="DOMAIN" />, mais la durée de validité du certificat du serveur est trop longue pour être fiable.</translation>
 <translation id="7053983685419859001">Bloquer</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Autorisation du portail captif</translation>
 <translation id="8971063699422889582">Le certificat du serveur a expiré.</translation>
 <translation id="8978053250194585037">La fonctionnalité de navigation sécurisée Google a récemment permis de <ph name="BEGIN_LINK" />détecter une tentative d'hameçonnage<ph name="END_LINK" /> sur le site <ph name="SITE" />. Un site d'hameçonnage se présente comme un site légitime dans le but de vous tromper.</translation>
+<translation id="8983003182662520383">Modes de paiement et adresses utilisés dans Google Pay</translation>
 <translation id="8987927404178983737">Mois</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Le site Web que vous allez ouvrir contient des programmes dangereux</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb
index 4641af3..c866de1 100644
--- a/components/strings/components_strings_gu.xtb
+++ b/components/strings/components_strings_gu.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">અતિરિક્ત વિગતો પ્રદાન કરો</translation>
 <translation id="1021110881106174305">સ્વીકારેલ કાર્ડ</translation>
 <translation id="1032854598605920125">ઘડિયાળની દિશામાં ફેરવો</translation>
+<translation id="1035334672863811645">Chrome માં સાઇન ઇન કરો</translation>
 <translation id="1038842779957582377">અજ્ઞાત નામ</translation>
 <translation id="1050038467049342496">અન્ય ઍપ્લિકેશનો બંધ કરો</translation>
 <translation id="1055184225775184556">&amp;ઉમેરવું પૂર્વવત્ કરો</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">પાસવર્ડ રીસેટ કરો</translation>
 <translation id="4280429058323657511">, સમાપ્તિ તારીખ <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">સ્વિચ</translation>
+<translation id="4308131620840579419">તમારા બધાં કાર્ડ એક જ જગ્યાએ સાચવીએ?</translation>
 <translation id="4312866146174492540">અવરોધિત કરો (ડિફૉલ્ટ)</translation>
 <translation id="4325863107915753736">લેખ શોધવામાં નિષ્ફળ થયાં</translation>
 <translation id="4326324639298822553">તમારી સમાપ્તિ તારીખ તપાસો અને ફરી પ્રયાસ કરો</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">બુકમાર્ક્સ બાર</translation>
 <translation id="5201306358585911203">આ પેજ પરનું શામેલ કરેલ પેજ કહે છે કે</translation>
 <translation id="5205222826937269299">નામ આવશ્યક છે</translation>
+<translation id="5215116848420601511">Google Payનો ઉપયોગ કરતી ચુકવણી પદ્ધતિઓ અને ઍડ્રેસ</translation>
 <translation id="5222812217790122047">ઇમેઇલ આવશ્યક છે</translation>
 <translation id="5230733896359313003">વિતરણ માટેનું સરનામું</translation>
 <translation id="5250209940322997802">"નેટવર્ક સાથે કનેક્ટ કરો"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">JSON પર નિકાસ કરો</translation>
 <translation id="5689516760719285838">સ્થાન</translation>
 <translation id="570530837424789914">મેનેજ કરો…</translation>
+<translation id="5705882733397021510">પાછળ જાઓ</translation>
 <translation id="57094364128775171">સશક્ત પાસવર્ડ સૂચવો…</translation>
 <translation id="5710435578057952990">આ વેબસાઇટની ઓળખ ચકાસવામાં આવી નથી.</translation>
 <translation id="5719499550583120431">પ્રીપેઇડ કાર્ડ સ્વીકારવામાં આવે છે.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" /> સાથેના તમારા કનેક્શનને ઑબ્સોલિટ સાઇફર સ્યૂટનો ઉપયોગ કરીને એન્ક્રિપ્ટ કરાયું છે.</translation>
 <translation id="5813119285467412249">&amp;ઉમેરવું ફરી કરો</translation>
 <translation id="5838278095973806738">તમારે આ સાઇટ પર કોઈપણ સંવેદનશીલ માહિતી (ઉદાહરણ તરીકે, પાસવર્ડ્સ અથવા ક્રેડિટ કાર્ડ્સ) દાખલ કરવી જોઈએ નહીં, કારણ કે તે હુમલાખોર દ્વારા ચોરવામાં આવી શકે છે.</translation>
+<translation id="5863847714970149516">આગળનું પેજ તમને શુલ્ક લાગુ કરી શકે છે</translation>
 <translation id="5866257070973731571">ફોન નંબર ઉમેરો</translation>
 <translation id="5869405914158311789">આ સાઇટ પર પહોંચી શકાતું નથી</translation>
 <translation id="5869522115854928033">સાચવેલા પાસવર્ડ્સ</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">નિયત પ્રોક્સી સર્વર્સ અને .pac script URL બન્નેનો ઉલ્લેખ કરેલો છે.</translation>
 <translation id="6989763994942163495">વિગતવાર સેટિંગ્સ બતાવો...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">આ શુલ્ક એક-સમયનું અથવા પુનરાવર્તિત હોઈ શકે છે અને કદાચ દેખીતા શુલ્ક ન પણ હોય.</translation>
 <translation id="7029809446516969842">પાસવર્ડ્સ</translation>
 <translation id="7050187094878475250">તમે <ph name="DOMAIN" /> પર પહોંચવાનો પ્રયાસ કરેલો, પરંતુ સર્વરે એવું પ્રમાણપત્ર પ્રસ્તુત કર્યું જેની માન્યતા અવધિ, વિશ્વસનીય હોવા માટે ખૂબ લાંબી છે.</translation>
 <translation id="7053983685419859001">અવરોધિત કરો</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">કૅપ્ટિવ પોર્ટલ અધિકૃતતા</translation>
 <translation id="8971063699422889582">સર્વરના પ્રમાણપત્રની સમયસીમા સમાપ્ત થઈ છે.</translation>
 <translation id="8978053250194585037">Google Safe Browsingને <ph name="SITE" /> પર તાજેતરમાં <ph name="BEGIN_LINK" />ફિશિંગ થયાનું જાણવા મળ્યું છે<ph name="END_LINK" />. ફિશિંગ વેબસાઇટ તમને છેતરવા માટે અન્ય વેબસાઇટ હોવાનો ઢોંગ કરે છે.</translation>
+<translation id="8983003182662520383">Google Payનો ઉપયોગ કરતી ચુકવણી પદ્ધતિઓ અને ઍડ્રેસ</translation>
 <translation id="8987927404178983737">મહિનો</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">સાઇટમાં આગળ હાનિકારક પ્રોગ્રામ્સ છે</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 430ff828..dc36e78a 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">अतिरिक्त विवरण प्रदान करें</translation>
 <translation id="1021110881106174305">स्वीकार्य कार्ड</translation>
 <translation id="1032854598605920125">घड़ी की दिशा में घुमाएं</translation>
+<translation id="1035334672863811645">Chrome में प्रवेश करें</translation>
 <translation id="1038842779957582377">अज्ञात नाम</translation>
 <translation id="1050038467049342496">दूूूूसरे ऐप्लिकेशन बंद करें</translation>
 <translation id="1055184225775184556">&amp;जोड़ना वापस लाएं</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">पासवर्ड रीसेट करें</translation>
 <translation id="4280429058323657511">, समाप्ति दिनांक <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">बदलें</translation>
+<translation id="4308131620840579419">अपने सभी कार्ड एक ही जगह सेव करना चाहते हैं?</translation>
 <translation id="4312866146174492540">अवरुद्ध करें (डिफ़ॉल्ट)</translation>
 <translation id="4325863107915753736">लेख ढूंढ़ने में विफल</translation>
 <translation id="4326324639298822553">अपना समाप्ति दिनांक जाँचें और फिर से कोशिश करें</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">बुकमार्क बार</translation>
 <translation id="5201306358585911203">इस पेज पर एम्बेड किए गए पेज का कहना है कि</translation>
 <translation id="5205222826937269299">नाम आवश्यक है</translation>
+<translation id="5215116848420601511">Google Pay का इस्तेमाल करने वाले भुगतान के तरीके और पते</translation>
 <translation id="5222812217790122047">ईमेल आवश्यक है</translation>
 <translation id="5230733896359313003">शिपिंग पता</translation>
 <translation id="5250209940322997802">"नेटवर्क से कनेक्ट करें"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">JSON में निर्यात करें</translation>
 <translation id="5689516760719285838">स्थान</translation>
 <translation id="570530837424789914">प्रबंधित करें...</translation>
+<translation id="5705882733397021510">वापस जाएं</translation>
 <translation id="57094364128775171">मज़बूत पासवर्ड सुझाएं…</translation>
 <translation id="5710435578057952990">इस वेबसाइट की पहचान सत्यापित नहीं की गई है.</translation>
 <translation id="5719499550583120431">प्रीपेड कार्ड स्वीकार किए जाते हैं.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" /> से आपके कनेक्शन को किसी अप्रचलित सिफ़र सुइट का उपयोग करके एन्‍क्रिप्‍ट किया गया है.</translation>
 <translation id="5813119285467412249">&amp;जोड़ना फिर से करें</translation>
 <translation id="5838278095973806738">आपको इस साइट पर कोई भी संवेदनशील जानकारी (उदाहरण के लिए, पासवर्ड या क्रेडिट कार्ड) नहीं डालनी चाहिए, क्योंकि उसे हमलावर चुरा सकते हैं.</translation>
+<translation id="5863847714970149516">आगे आने वाला पेज आपसे शुल्क लेने की कोशिश कर सकता है</translation>
 <translation id="5866257070973731571">फ़ोन नंबर जोड़ें</translation>
 <translation id="5869405914158311789">इस साइट तक नहीं पहुंचा जा सकता</translation>
 <translation id="5869522115854928033">सहेजे गए पासवर्ड</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">फ़िक्‍स्‍ड प्रॉक्‍सी सर्वर और .pac स्‍क्रिप्‍ट URL दोनों ही बताए गए हैं.</translation>
 <translation id="6989763994942163495">अतिरिक्त सेटिंग दिखाएं...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">ये शुल्क एक बार लगने वाले या बार-बार लगने वाले हो सकते हैं और हो सकता है कि इनके बारे में स्पष्ट जानकारी न दी जाए.</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
 <translation id="7050187094878475250">आपने <ph name="DOMAIN" /> तक पहुंचने का प्रयास किया था, लेकिन सर्वर ने ऐसा प्रमाणपत्र प्रस्‍तुत किया जिसकी मान्‍यता अवधि विश्‍वसनीय होने के लिए बहुत लंबी है.</translation>
 <translation id="7053983685419859001">अवरोधित करें</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">कैप्‍टिव पोर्टल प्राधिकरण</translation>
 <translation id="8971063699422889582">सर्वर के प्रमाणपत्र की समय-सीमा समाप्त हो चुकी है.</translation>
 <translation id="8978053250194585037">Google सुरक्षित ब्राउज़िंग को <ph name="SITE" /> पर हाल ही में <ph name="BEGIN_LINK" />फ़िशिंग का पता चला है<ph name="END_LINK" />. फ़िशिंग साइटें आपको भ्रमित करने के लिए अन्य वेबसाइटें होने का दिखावा करती हैं.</translation>
+<translation id="8983003182662520383">Google Pay का इस्तेमाल करने वाले भुगतान के तरीके और पते</translation>
 <translation id="8987927404178983737">माह</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">साइट में आगे हानिकारक प्रोग्राम हैं</translation>
diff --git a/components/strings/components_strings_hr.xtb b/components/strings/components_strings_hr.xtb
index 66d3910..d63eaa54 100644
--- a/components/strings/components_strings_hr.xtb
+++ b/components/strings/components_strings_hr.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Navedite dodatne pojedinosti</translation>
 <translation id="1021110881106174305">Prihvaćene kartice</translation>
 <translation id="1032854598605920125">Zakretanje u smjeru kazaljke na satu</translation>
+<translation id="1035334672863811645">prijavite se na Chrome</translation>
 <translation id="1038842779957582377">nepoznati naziv</translation>
 <translation id="1050038467049342496">Zatvorite ostale aplikacije</translation>
 <translation id="1055184225775184556">&amp;Poništi dodavanje</translation>
@@ -487,6 +488,7 @@
 <translation id="4277028893293644418">Poništi zaporku</translation>
 <translation id="4280429058323657511">, istek <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Prebaci</translation>
+<translation id="4308131620840579419">Spremiti sve kartice na jedno mjesto?</translation>
 <translation id="4312866146174492540">Blokiraj (zadano)</translation>
 <translation id="4325863107915753736">Članak nije pronađen</translation>
 <translation id="4326324639298822553">Provjerite datum isteka, pa pokušajte ponovo</translation>
@@ -597,6 +599,7 @@
 <translation id="5190835502935405962">Traka oznaka</translation>
 <translation id="5201306358585911203">Na ugrađenoj stranici na ovoj stranici navodi se sljedeće</translation>
 <translation id="5205222826937269299">Ime je obavezno</translation>
+<translation id="5215116848420601511">Načini plaćanja i adrese s Google Paya</translation>
 <translation id="5222812217790122047">E-pošta (obavezno)</translation>
 <translation id="5230733896359313003">Adresa za dostavu</translation>
 <translation id="5250209940322997802">"Povezivanje s mrežom"</translation>
@@ -673,6 +676,7 @@
 <translation id="5689199277474810259">Izvezi u JSON</translation>
 <translation id="5689516760719285838">Lokacija</translation>
 <translation id="570530837424789914">Upravljajte...</translation>
+<translation id="5705882733397021510">Natrag</translation>
 <translation id="57094364128775171">Predloži snažnu zaporku…</translation>
 <translation id="5710435578057952990">Identitet ove web lokacije nije ovjeren.</translation>
 <translation id="5719499550583120431">Prihvaćaju se pretplatne kartice.</translation>
@@ -690,6 +694,7 @@
 <translation id="5810442152076338065">Vaša veza s domenom <ph name="DOMAIN" /> kriptirana je zastarjelim kriptografskim paketom.</translation>
 <translation id="5813119285467412249">&amp;Ponovi dodavanje</translation>
 <translation id="5838278095973806738">Na ovu web-lokaciju nemojte unositi osjetljive podatke (na primjer, zaporke ili kreditne kartice) jer su je možda ukrali napadači.</translation>
+<translation id="5863847714970149516">Stranica koja će se otvoriti može vam pokušati nešto naplatiti</translation>
 <translation id="5866257070973731571">Dodajte telefonski broj</translation>
 <translation id="5869405914158311789">Web-lokacija ne može se dohvatiti</translation>
 <translation id="5869522115854928033">Spremljene zaporke</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">Određeni su fiksni proxy poslužitelji i URL .pac skripte.</translation>
 <translation id="6989763994942163495">Pokaži napredne postavke...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Ta terećenja mogu biti jednokratna ili ponavljajuća i možda nisu odmah vidljiva.</translation>
 <translation id="7029809446516969842">Zaporke</translation>
 <translation id="7050187094878475250">Pokušali ste pristupiti domeni <ph name="DOMAIN" />, ali je poslužitelj pružio certifikat koji nije pouzdan zbog predugog razdoblja valjanosti.</translation>
 <translation id="7053983685419859001">Blokiraj</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Autorizacija obaveznog portala za autentifikaciju</translation>
 <translation id="8971063699422889582">Istekao je certifikat poslužitelja.</translation>
 <translation id="8978053250194585037">Google sigurno pregledavanje nedavno je <ph name="BEGIN_LINK" />otkrilo krađu identiteta<ph name="END_LINK" /> na web-lokaciji <ph name="SITE" />. Web-lokacije za krađu identiteta predstavljaju se kao druge web-lokacije kako bi vas prevarile.</translation>
+<translation id="8983003182662520383">Načini plaćanja i adrese s Google Paya</translation>
 <translation id="8987927404178983737">Mjesec</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Sljedeća web-lokacija sadrži štetne programe</translation>
diff --git a/components/strings/components_strings_hu.xtb b/components/strings/components_strings_hu.xtb
index 3bb6dd2..c54b9d62 100644
--- a/components/strings/components_strings_hu.xtb
+++ b/components/strings/components_strings_hu.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">További részletek megadása</translation>
 <translation id="1021110881106174305">Elfogadott kártyák</translation>
 <translation id="1032854598605920125">Forgatás jobbra</translation>
+<translation id="1035334672863811645">bejelentkezés a Chrome-ba</translation>
 <translation id="1038842779957582377">Ismeretlen név</translation>
 <translation id="1050038467049342496">Zárja be a többi alkalmazást</translation>
 <translation id="1055184225775184556">&amp;Hozzáadás visszavonása</translation>
@@ -486,6 +487,7 @@
 <translation id="4277028893293644418">Jelszó visszaállítása</translation>
 <translation id="4280429058323657511">, lejár: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Váltás</translation>
+<translation id="4308131620840579419">Egyetlen helyre menti az összes kártyát?</translation>
 <translation id="4312866146174492540">Letiltás (alapértelmezett)</translation>
 <translation id="4325863107915753736">Nem sikerült megtalálni a cikket</translation>
 <translation id="4326324639298822553">Ellenőrizze a lejárati dátumot, majd próbálja újra</translation>
@@ -596,6 +598,7 @@
 <translation id="5190835502935405962">Könyvjelzősáv</translation>
 <translation id="5201306358585911203">Az oldal egyik beágyazott oldalának közlendője</translation>
 <translation id="5205222826937269299">A név megadása kötelező</translation>
+<translation id="5215116848420601511">A Google Pay szolgáltatásban használt fizetési módok és címek</translation>
 <translation id="5222812217790122047">Az e-mail-cím megadása kötelező</translation>
 <translation id="5230733896359313003">Szállítási cím</translation>
 <translation id="5250209940322997802">„Csatlakozás a hálózathoz”</translation>
@@ -672,6 +675,7 @@
 <translation id="5689199277474810259">Exportálás JSON formátumba</translation>
 <translation id="5689516760719285838">Tartózkodási hely</translation>
 <translation id="570530837424789914">Kezelés…</translation>
+<translation id="5705882733397021510">Visszalépés</translation>
 <translation id="57094364128775171">Erős jelszó ajánlása…</translation>
 <translation id="5710435578057952990">A webhely valódiságát nem ellenőriztük.</translation>
 <translation id="5719499550583120431">Elfogadott feltöltőkártyák.</translation>
@@ -689,6 +693,7 @@
 <translation id="5810442152076338065">A(z) <ph name="DOMAIN" /> domainnel való kapcsolata elavult kriptográfiával van titkosítva.</translation>
 <translation id="5813119285467412249">&amp;Hozzáadás újra</translation>
 <translation id="5838278095973806738">Ne írjon be semmilyen bizalmas adatot (például jelszót vagy hitelkártyaadatot) a webhelyen, mivel a támadók ellophatják.</translation>
+<translation id="5863847714970149516">Előfordulhat, hogy a következő oldal megpróbál pénzt felszámolni Önnek</translation>
 <translation id="5866257070973731571">Telefonszám hozzáadása</translation>
 <translation id="5869405914158311789">A webhely nem érhető el</translation>
 <translation id="5869522115854928033">Mentett jelszavak</translation>
@@ -819,6 +824,7 @@
 <translation id="6973656660372572881">Mindkét fix proxyszerver és egy .Pac típusú szkript URL-címe meg van adva.</translation>
 <translation id="6989763994942163495">Speciális beállítások megjelenítése...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Ezek egyszeri vagy ismétlődő díjak lehetnek, és nem feltétlenül nyilvánvalóak.</translation>
 <translation id="7029809446516969842">Jelszavak</translation>
 <translation id="7050187094878475250">Ön megpróbálta elérni a(z) <ph name="DOMAIN" /> domaint, de a szerver olyan tanúsítványt küldött, amelynek érvényességi ideje túl hosszú ahhoz, hogy megbízható legyen.</translation>
 <translation id="7053983685419859001">Letiltás</translation>
@@ -1084,6 +1090,7 @@
 <translation id="8957210676456822347">Hitelesítés hitelesítési portállal</translation>
 <translation id="8971063699422889582">A szerver tanúsítványa lejárt.</translation>
 <translation id="8978053250194585037">A Google Biztonságos Böngészés funkciója nemrégiben <ph name="BEGIN_LINK" />adathalászatot észlelt<ph name="END_LINK" /> a következő webhelyen: <ph name="SITE" />. Az adathalász webhelyek más webhelynek adják ki magukat, hogy félrevezessék Önt.</translation>
+<translation id="8983003182662520383">A Google Pay szolgáltatásban használt fizetési módok és címek</translation>
 <translation id="8987927404178983737">hónap</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">A felkeresni kívánt webhely ártalmas programokat tartalmaz</translation>
diff --git a/components/strings/components_strings_id.xtb b/components/strings/components_strings_id.xtb
index 71004d4d..912d70c2 100644
--- a/components/strings/components_strings_id.xtb
+++ b/components/strings/components_strings_id.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Berikan detail tambahan</translation>
 <translation id="1021110881106174305">Kartu yang diterima</translation>
 <translation id="1032854598605920125">Putar searah jarum jam</translation>
+<translation id="1035334672863811645">masuk ke Chrome</translation>
 <translation id="1038842779957582377">nama tidak diketahui</translation>
 <translation id="1050038467049342496">Tutup aplikasi lain</translation>
 <translation id="1055184225775184556">&amp;Urungkan Penambahan</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Setel ulang sandi</translation>
 <translation id="4280429058323657511">, kedaluwarsa <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Alihkan</translation>
+<translation id="4308131620840579419">Simpan semua kartu Anda di satu tempat?</translation>
 <translation id="4312866146174492540">Blokir (default)</translation>
 <translation id="4325863107915753736">Gagal menemukan artikel</translation>
 <translation id="4326324639298822553">Periksa tanggal kedaluwarsa dan coba lagi</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Bilah Bookmark</translation>
 <translation id="5201306358585911203">Halaman tersemat di halaman ini menyatakan</translation>
 <translation id="5205222826937269299">Nama wajib diisi</translation>
+<translation id="5215116848420601511">Metode pembayaran dan alamat yang menggunakan Google Pay</translation>
 <translation id="5222812217790122047">Email wajib diisi</translation>
 <translation id="5230733896359313003">Alamat Pengiriman</translation>
 <translation id="5250209940322997802">"Sambungkan ke jaringan"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Ekspor ke JSON</translation>
 <translation id="5689516760719285838">Lokasi</translation>
 <translation id="570530837424789914">Kelola...</translation>
+<translation id="5705882733397021510">Kembali</translation>
 <translation id="57094364128775171">Sarankan sandi yang kuat…</translation>
 <translation id="5710435578057952990">Identitas situs Web ini belum diverifikasi.</translation>
 <translation id="5719499550583120431">Kartu prabayar diterima.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Sambungan Anda ke <ph name="DOMAIN" /> dienkripsi menggunakan cipher suite yang sudah usang.</translation>
 <translation id="5813119285467412249">&amp;Ulangi Penambahan</translation>
 <translation id="5838278095973806738">Jangan masukkan informasi sensitif apa pun di situs ini (misalnya, sandi atau kartu kredit), karena penyerang dapat mencurinya.</translation>
+<translation id="5863847714970149516">Halaman berikutnya mungkin mencoba menagih Anda.</translation>
 <translation id="5866257070973731571">Tambahkan Nomor Telepon</translation>
 <translation id="5869405914158311789">Situs ini tidak dapat dijangkau</translation>
 <translation id="5869522115854928033">Sandi tersimpan</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Server proxy tetap dan URL skrip .pac telah ditentukan.</translation>
 <translation id="6989763994942163495">Tampilkan setelan lanjutan...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Tagihan ini bisa hanya satu kali atau berulang, dan mungkin tidak pasti.</translation>
 <translation id="7029809446516969842">Sandi</translation>
 <translation id="7050187094878475250">Anda berusaha menjangkau <ph name="DOMAIN" />, namun server memberikan sertifikat yang masa berlakunya terlalu lama untuk dapat dipercaya.</translation>
 <translation id="7053983685419859001">Blokir</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Otorisasi Portal Tawanan</translation>
 <translation id="8971063699422889582">Sertifikat server telah kedaluwarsa.</translation>
 <translation id="8978053250194585037">Google Safe Browsing baru-baru ini <ph name="BEGIN_LINK" />mendeteksi phishing<ph name="END_LINK" /> di <ph name="SITE" />. Situs phishing berpura-pura menjadi situs lain untuk mengelabui Anda.</translation>
+<translation id="8983003182662520383">Metode Pembayaran dan Alamat yang Menggunakan Google Pay</translation>
 <translation id="8987927404178983737">Bulan</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Situs yang akan dibuka berisi program berbahaya</translation>
diff --git a/components/strings/components_strings_it.xtb b/components/strings/components_strings_it.xtb
index 2e38aab..bee5498 100644
--- a/components/strings/components_strings_it.xtb
+++ b/components/strings/components_strings_it.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Fornisci ulteriori dettagli</translation>
 <translation id="1021110881106174305">Carte di credito accettate</translation>
 <translation id="1032854598605920125">Ruota in senso orario</translation>
+<translation id="1035334672863811645">accedi a Chrome</translation>
 <translation id="1038842779957582377">nome sconosciuto</translation>
 <translation id="1050038467049342496">Chiudi altre app</translation>
 <translation id="1055184225775184556">&amp;Annulla aggiunta</translation>
@@ -485,6 +486,7 @@
 <translation id="4277028893293644418">Reimposta password</translation>
 <translation id="4280429058323657511">, scad.: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Cambia</translation>
+<translation id="4308131620840579419">Salvare tutte le schede in un unico posto?</translation>
 <translation id="4312866146174492540">Blocca (predefinita)</translation>
 <translation id="4325863107915753736">Impossibile trovare l'articolo</translation>
 <translation id="4326324639298822553">Controlla la data di scadenza e riprova</translation>
@@ -595,6 +597,7 @@
 <translation id="5190835502935405962">Barra dei Preferiti</translation>
 <translation id="5201306358585911203">Una pagina incorporata in questa pagina dice</translation>
 <translation id="5205222826937269299">Nome obbligatorio</translation>
+<translation id="5215116848420601511">Metodi di pagamento e indirizzi che utilizzano Google Pay</translation>
 <translation id="5222812217790122047">Email obbligatoria</translation>
 <translation id="5230733896359313003">Indirizzo di spedizione</translation>
 <translation id="5250209940322997802">"Collegati alla rete"</translation>
@@ -671,6 +674,7 @@
 <translation id="5689199277474810259">Esporta in JSON</translation>
 <translation id="5689516760719285838">Posizione</translation>
 <translation id="570530837424789914">Gestisci…</translation>
+<translation id="5705882733397021510">Indietro</translation>
 <translation id="57094364128775171">Suggerisci password efficace…</translation>
 <translation id="5710435578057952990">L'identità di questo sito web non è stata verificata.</translation>
 <translation id="5719499550583120431">Le carte prepagate sono accettate.</translation>
@@ -688,6 +692,7 @@
 <translation id="5810442152076338065">La connessione a <ph name="DOMAIN" /> è criptata tramite un pacchetto di crittografia obsoleto.</translation>
 <translation id="5813119285467412249">&amp;Ripeti aggiunta</translation>
 <translation id="5838278095973806738">Non dovresti inserire dati sensibili in questo sito (ad esempio password o carte di credito) perché potrebbero essere intercettati da utenti malintenzionati.</translation>
+<translation id="5863847714970149516">La pagina che segue potrebbe tentare di addebitarti dei costi</translation>
 <translation id="5866257070973731571">Aggiungi numero di telefono</translation>
 <translation id="5869405914158311789">Impossibile raggiungere il sito</translation>
 <translation id="5869522115854928033">Password salvate</translation>
@@ -817,6 +822,7 @@
 <translation id="6973656660372572881">Sono stati specificati sia i server proxy fissi che un URL script .pac.</translation>
 <translation id="6989763994942163495">Mostra impostazioni avanzate...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">L'addebito potrebbe essere singolo oppure ricorrente e potrebbe non essere evidente.</translation>
 <translation id="7029809446516969842">Password</translation>
 <translation id="7050187094878475250">Hai tentato di visitare il sito <ph name="DOMAIN" />, ma il server ha presentato un certificato con periodo di validità troppo lungo per poter essere ritenuto attendibile.</translation>
 <translation id="7053983685419859001">Blocca</translation>
@@ -1081,6 +1087,7 @@
 <translation id="8957210676456822347">Autorizzazione Captive Portal</translation>
 <translation id="8971063699422889582">Il certificato del server è scaduto.</translation>
 <translation id="8978053250194585037">La funzione Google Navigazione sicura <ph name="BEGIN_LINK" />ha rilevato di recente attività di phishing<ph name="END_LINK" /> sul sito <ph name="SITE" />. I siti di phishing si spacciano per altri siti web per ingannarti.</translation>
+<translation id="8983003182662520383">Metodi di pagamento e indirizzi che utilizzano Google Pay</translation>
 <translation id="8987927404178983737">Mese</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Il sito che stai per visitare contiene programmi dannosi</translation>
diff --git a/components/strings/components_strings_iw.xtb b/components/strings/components_strings_iw.xtb
index 3eea8971..5e0df75f 100644
--- a/components/strings/components_strings_iw.xtb
+++ b/components/strings/components_strings_iw.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">ספק פרטים נוספים</translation>
 <translation id="1021110881106174305">כרטיסים מאושרים</translation>
 <translation id="1032854598605920125">סובב בכיוון השעון</translation>
+<translation id="1035334672863811645">‏היכנס ל-Chrome</translation>
 <translation id="1038842779957582377">שם לא ידוע</translation>
 <translation id="1050038467049342496">סגירת יישומים אחרים</translation>
 <translation id="1055184225775184556">&amp;ביטול הוספה</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">איפוס סיסמה</translation>
 <translation id="4280429058323657511">, בתוקף עד <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">מעבר</translation>
+<translation id="4308131620840579419">לשמור את כל הכרטיסים במקום אחד?</translation>
 <translation id="4312866146174492540">חסום (ברירת מחדל)</translation>
 <translation id="4325863107915753736">לא ניתן היה למצוא את הפריט</translation>
 <translation id="4326324639298822553">בדוק את תאריך התפוגה ונסה שוב</translation>
@@ -602,6 +604,7 @@
 <translation id="5190835502935405962">סרגל הסימניות</translation>
 <translation id="5201306358585911203">דף מוטמע בדף הזה אומר</translation>
 <translation id="5205222826937269299">שם (חובה)</translation>
+<translation id="5215116848420601511">‏אמצעי תשלום וכתובות שנשמרו ב-Google Pay</translation>
 <translation id="5222812217790122047">אימייל (חובה)</translation>
 <translation id="5230733896359313003">כתובת למשלוח</translation>
 <translation id="5250209940322997802">"יש להתחבר לרשת"</translation>
@@ -679,6 +682,7 @@
 <translation id="5689199277474810259">‏ייצוא אל JSON</translation>
 <translation id="5689516760719285838">מיקום</translation>
 <translation id="570530837424789914">ניהול...</translation>
+<translation id="5705882733397021510">חזרה</translation>
 <translation id="57094364128775171">הצעת סיסמה חזקה…</translation>
 <translation id="5710435578057952990">הזהות של אתר זה לא אומתה.</translation>
 <translation id="5719499550583120431">אפשר לשלם באמצעות כרטיסים משולמים מראש.</translation>
@@ -696,6 +700,7 @@
 <translation id="5810442152076338065">החיבור שלך אל <ph name="DOMAIN" /> מוצפן באמצעות חבילת צופן מיושנת.</translation>
 <translation id="5813119285467412249">&amp;ביצוע מחדש של הוספה</translation>
 <translation id="5838278095973806738">אין להזין מידע רגיש באתר הזה (כמו סיסמאות או מספרי כרטיסי אשראי), מאחר שתוקפים עלולים לקבל אליו גישה.</translation>
+<translation id="5863847714970149516">בדף הבא עשויה להיות דרישה לתשלום</translation>
 <translation id="5866257070973731571">הוספת מספר טלפון</translation>
 <translation id="5869405914158311789">לא ניתן לגשת לאתר הזה</translation>
 <translation id="5869522115854928033">סיסמאות שמורות</translation>
@@ -826,6 +831,7 @@
 <translation id="6973656660372572881">‏צוינו שרתי Proxy קבועים וכתובת אתר של הסקריפט מסוג ‎.Pac</translation>
 <translation id="6989763994942163495">הצג הגדרות מתקדמות...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">התשלום עשוי להיות חד-פעמי או לכלול חיובים חוזרים וייתכן שהדרישה לתשלום לא תוצג בצורה ברורה וחד-משמעית.</translation>
 <translation id="7029809446516969842">סיסמאות</translation>
 <translation id="7050187094878475250">ניסית להגיע אל <ph name="DOMAIN" />, אך השרת הציג אישור שתקופת התוקף שלו ארוכה מדי ולכן אינו מהימן.</translation>
 <translation id="7053983685419859001">חסום</translation>
@@ -1091,6 +1097,7 @@
 <translation id="8957210676456822347">הרשאת פורטל חובה</translation>
 <translation id="8971063699422889582">פג תוקפו של אישור השרת.</translation>
 <translation id="8978053250194585037">‏לאחרונה <ph name="BEGIN_LINK" />זוהה דיוג<ph name="END_LINK" /> באתר <ph name="SITE" /> על-ידי הגלישה הבטוחה של Google. אתרי דיוג מתחזים לאתרים אחרים כדי להונות אותך.</translation>
+<translation id="8983003182662520383">‏אמצעי תשלום וכתובות שנשמרו ב-Google Pay</translation>
 <translation id="8987927404178983737">חודש</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">האתר שאתה עומד לעבור אליו מכיל תוכניות מזיקות</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb
index 1cdedee..208e831 100644
--- a/components/strings/components_strings_ja.xtb
+++ b/components/strings/components_strings_ja.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">詳細を報告する</translation>
 <translation id="1021110881106174305">利用可能なカード</translation>
 <translation id="1032854598605920125">時計回りに回転</translation>
+<translation id="1035334672863811645">Chrome にログイン</translation>
 <translation id="1038842779957582377">不明な名前</translation>
 <translation id="1050038467049342496">他のアプリを終了する</translation>
 <translation id="1055184225775184556">追加の取り消し(&amp;U)</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">パスワードを再設定</translation>
 <translation id="4280429058323657511">、有効期限: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">切り替え</translation>
+<translation id="4308131620840579419">すべてのカードを 1 か所で管理できます</translation>
 <translation id="4312866146174492540">ブロック(デフォルト)</translation>
 <translation id="4325863107915753736">記事が見つかりませんでした</translation>
 <translation id="4326324639298822553">有効期限の「日」を確認してもう一度お試しください</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">ブックマーク バー</translation>
 <translation id="5201306358585911203">このページに埋め込まれているページの内容</translation>
 <translation id="5205222826937269299">名前は必須です</translation>
+<translation id="5215116848420601511">Google Pay のお支払い方法と住所</translation>
 <translation id="5222812217790122047">メールアドレスは必須です</translation>
 <translation id="5230733896359313003">配送先住所</translation>
 <translation id="5250209940322997802">「ネットワークに接続してください」</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">JSON にエクスポート</translation>
 <translation id="5689516760719285838">現在地</translation>
 <translation id="570530837424789914">管理...</translation>
+<translation id="5705882733397021510">戻る</translation>
 <translation id="57094364128775171">安全なパスワードを自動生成…</translation>
 <translation id="5710435578057952990">このウェブサイトの ID は確認されていません。</translation>
 <translation id="5719499550583120431">プリペイド カードをご利用いただけます。</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" /> への接続は古い暗号スイートにより暗号化されています。</translation>
 <translation id="5813119285467412249">追加のやり直し(&amp;R)</translation>
 <translation id="5838278095973806738">このサイトでは機密情報(パスワード、クレジット カードなど)を入力しないでください。悪意のあるユーザーに情報が盗まれる恐れがあります。</translation>
+<translation id="5863847714970149516">表示しようとしているページでは課金される恐れがあります</translation>
 <translation id="5866257070973731571">電話番号の追加</translation>
 <translation id="5869405914158311789">このサイトにアクセスできません</translation>
 <translation id="5869522115854928033">保存したパスワード</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">固定プロキシ サーバーと .pac スクリプト URL の両方が指定されています。</translation>
 <translation id="6989763994942163495">詳細設定を表示...</translation>
 <translation id="7012363358306927923">中国銀聯</translation>
+<translation id="7016992613359344582">料金の請求は 1 回限りの場合も毎月行われる場合もあり、課金されたかどうかわからないこともあります。</translation>
 <translation id="7029809446516969842">パスワード</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> にアクセスしようとしましたが、サーバーに提示された証明書の有効期限が長すぎて信頼性を確認できませんでした。</translation>
 <translation id="7053983685419859001">ブロック</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">キャプティブ ポータル認証</translation>
 <translation id="8971063699422889582">サーバーの証明書の有効期限が切れています。</translation>
 <translation id="8978053250194585037"><ph name="SITE" /> では最近、Google セーフ ブラウジングにより、<ph name="BEGIN_LINK" />フィッシング行為が検出されました<ph name="END_LINK" />。フィッシング サイトは、他のウェブサイトになりすましてユーザーを欺こうとするサイトです。</translation>
+<translation id="8983003182662520383">Google Pay のお支払い方法と住所</translation>
 <translation id="8987927404178983737">月</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">この先のサイトには有害なプログラムがあります</translation>
diff --git a/components/strings/components_strings_kn.xtb b/components/strings/components_strings_kn.xtb
index 1ca746c..9b5b148 100644
--- a/components/strings/components_strings_kn.xtb
+++ b/components/strings/components_strings_kn.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">ಹೆಚ್ಚುವರಿ ವಿವರಗಳನ್ನು ಒದಗಿಸಿ</translation>
 <translation id="1021110881106174305">ಸ್ವೀಕೃತ ಕಾರ್ಡ್‌ಗಳು</translation>
 <translation id="1032854598605920125">ಪ್ರದಕ್ಷಿಣಾಕಾರದಲ್ಲಿ ತಿರುಗಿಸು</translation>
+<translation id="1035334672863811645">Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ</translation>
 <translation id="1038842779957582377">ಆಜ್ಞಾತ ಹೆಸರು</translation>
 <translation id="1050038467049342496">ಇತರ ಅಪ್ಲಿಕೇಶನ್‍ಗಳನ್ನು ಮುಚ್ಚಿ</translation>
 <translation id="1055184225775184556">&amp;ಸೇರಿಸುವುದನ್ನು ರದ್ದುಗೊಳಿಸಿ</translation>
@@ -484,6 +485,7 @@
 <translation id="4277028893293644418">ಪಾಸ್‌ವರ್ಡ್ ಮರುಹೊಂದಿಸಿ</translation>
 <translation id="4280429058323657511">, ಅವಧಿ ಮುಕ್ತಾಯ <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">ಬದಲಿಸಿ</translation>
+<translation id="4308131620840579419">ನಿಮ್ಮ ಎಲ್ಲಾ ಕಾರ್ಡ್‌ಗಳನ್ನು ಒಂದೇ ಸ್ಥಳದಲ್ಲಿ ಇರಿಸುವುದೇ?</translation>
 <translation id="4312866146174492540">ನಿರ್ಬಂಧಿಸು (ಡಿಫಾಲ್ಟ್)</translation>
 <translation id="4325863107915753736">ಲೇಖನ ಕಂಡುಬರಲಿಲ್ಲ</translation>
 <translation id="4326324639298822553">ನಿಮ್ಮ ಮುಕ್ತಾಯ ದಿನಾಂಕವನ್ನು ಪರಿಶೀಲಿಸಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ</translation>
@@ -594,6 +596,7 @@
 <translation id="5190835502935405962">ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳ ಬಾರ್</translation>
 <translation id="5201306358585911203">ಈ ಪುಟದಲ್ಲಿ ಎಂಬೆಡ್ ಮಾಡಲಾದ ಪುಟವು ಹೀಗೆ ಹೇಳುತ್ತದೆ</translation>
 <translation id="5205222826937269299">ಹೆಸರು ಅವಶ್ಯವಾಗಿದೆ</translation>
+<translation id="5215116848420601511">Google Pay ಅನ್ನು ಬಳಸುವ ಪಾವತಿ ವಿಧಾನಗಳು ಮತ್ತು ವಿಳಾಸಗಳು</translation>
 <translation id="5222812217790122047">ಇಮೇಲ್ ಅಗತ್ಯವಿದೆ</translation>
 <translation id="5230733896359313003">ಶಿಪ್ಪಿಂಗ್ ವಿಳಾಸ</translation>
 <translation id="5250209940322997802">"ನೆಟ್‌ವರ್ಕ್‌ಗೆ ಸಂಪರ್ಕಿಸಿ"</translation>
@@ -669,6 +672,7 @@
 <translation id="5689199277474810259">JSON ಗೆ ರಫ್ತು ಮಾಡಿ</translation>
 <translation id="5689516760719285838">ಸ್ಥಳ</translation>
 <translation id="570530837424789914">ನಿರ್ವಹಿಸಿ...</translation>
+<translation id="5705882733397021510">ಹಿಂದೆ ಹೋಗಿ</translation>
 <translation id="57094364128775171">ಸದೃಢವಾದ ಪಾಸ್‌ವರ್ಡ್ ಸೂಚಿಸಿ…</translation>
 <translation id="5710435578057952990">ಈ ವೆಬ್‌ಸೈಟ್‌ನ ಗುರುತಿಸುವಿಕೆಯನ್ನು ಇನ್ನೂ ಪರಿಶೀಲಿಸಲಾಗಿಲ್ಲ.</translation>
 <translation id="5719499550583120431">ಪ್ರೀಪೇಯ್ಡ್ ಕಾರ್ಡ್‌ಗಳನ್ನು ಸಮ್ಮತಿಸಲಾಗಿದೆ.</translation>
@@ -686,6 +690,7 @@
 <translation id="5810442152076338065">ಬಳಕೆಯಲ್ಲಿಲ್ಲದ ಸೈಫರ್ ಸೂಟ್ ಬಳಸುವ ಮೂಲಕ <ph name="DOMAIN" /> ಗೆ ನಿಮ್ಮ ಸಂಪರ್ಕವನ್ನು ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="5813119285467412249">&amp;ಸೇರಿಸುವುದನ್ನು ಮತ್ತೆಮಾಡು</translation>
 <translation id="5838278095973806738">ಈ ಸೈಟ್‌ನಲ್ಲಿ ನೀವು ಯಾವುದೇ ಸೂಕ್ಷ್ಮ ಮಾಹಿತಿಯನ್ನು (ಉದಾಹರಣೆಗೆ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಥವಾ ಕ್ರೆಡಿಟ್ ಕಾರ್ಡ್‌ಗಳು) ನಮೂದಿಸಬಾರದು, ಏಕೆಂದರೆ ಅದು ದಾಳಿಕೋರರ ಮೂಲಕ ಕಳುವಾಗಬಹುದು.</translation>
+<translation id="5863847714970149516">ಮುಂದಿನ ಪುಟವು ನಿಮಗೆ ಶುಲ್ಕ ವಿಧಿಸಲು ಪ್ರಯತ್ನಿಸಬಹುದು</translation>
 <translation id="5866257070973731571">ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ಸೇರಿಸಿ</translation>
 <translation id="5869405914158311789">ಈ ಸೈಟ್ ತಲುಪಲಾಗುವುದಿಲ್ಲ</translation>
 <translation id="5869522115854928033">ಉಳಿಸಲಾದ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
@@ -815,6 +820,7 @@
 <translation id="6973656660372572881">ಹೊಂದಿಸಿದ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ಗಳು ಮತ್ತು .pac ಸ್ಕ್ರಿಪ್ಟ್ URL ಎರಡನ್ನೂ ನಿರ್ದಿಷ್ಟಪಡಿಸಲಾಗಿದೆ.</translation>
 <translation id="6989763994942163495">ಸುಧಾರಿತ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸು...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">ಇವುಗಳು ಒಂದು ಬಾರಿ ಪಾವತಿಸುವಂತಹ ಶುಲ್ಕಗಳಾಗಿರಬಹುದು, ಮರುಕಳಿಸುವ ಶುಲ್ಕಗಳಾಗಿರಬಹುದು ಅಥವಾ ಸ್ಪಷ್ಟವಾಗಿಲ್ಲದೇ ಇರಬಹುದು.</translation>
 <translation id="7029809446516969842">ಪಾಸ್‌ವರ್ಡ್‌ಗಳು</translation>
 <translation id="7050187094878475250">ನೀವು <ph name="DOMAIN" /> ಅನ್ನು ತಲುಪಲು ಪ್ರಯತ್ನಿಸಿರುವಿರಿ, ಆದರೆ ಸರ್ವರ್ ವಿಶ್ವಾಸಾರ್ಹವಾಗಿರಲು ತುಂಬ ಉದ್ದವಾದ ವಾಯಿದೆ ಅವಧಿಯನ್ನು ಹೊಂದಿರುವ ಪ್ರಮಾಣಪತ್ರವನ್ನು ಸಲ್ಲಿಸಿದೆ.</translation>
 <translation id="7053983685419859001">ನಿರ್ಬಂಧಿಸು</translation>
@@ -1079,6 +1085,7 @@
 <translation id="8957210676456822347">ಕ್ಯಾಪ್ಟಿವ್ ಪೋರ್ಟಲ್ ದೃಢೀಕರಣ</translation>
 <translation id="8971063699422889582">ಸರ್ವರ್‌ನ ಪ್ರಕಮಾಣಪತ್ರದ ಅವಧಿ ಮುಕ್ತಾಯಗೊಂಡಿದೆ.</translation>
 <translation id="8978053250194585037">Google ಸುರಕ್ಷಿತ ಬ್ರೌಸಿಂಗ್ ಇತ್ತೀಚೆಗೆ <ph name="SITE" /> ನಲ್ಲಿ <ph name="BEGIN_LINK" />ಫಿಶಿಂಗ್ ಪತ್ತೆಹಚ್ಚಿದೆ<ph name="END_LINK" />. ಫಿಶಿಂಗ್ ಸೈಟ್‌ಗಳು ನಿಮ್ಮನ್ನು ಮೋಸಗೊಳಿಸಲು ಇತರ ಸೈಟ್‌ಗಳಂತೆ ನಟಿಸುತ್ತವೆ.</translation>
+<translation id="8983003182662520383">Google Pay ಅನ್ನು ಬಳಸುವ ಪಾವತಿ ವಿಧಾನಗಳು ಮತ್ತು ವಿಳಾಸಗಳು</translation>
 <translation id="8987927404178983737">ತಿಂಗಳು</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">ಈ ಮುಂದಕ್ಕೆ ಸೈಟ್ ಹಾನಿಕಾರಕ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಹೊಂದಿದೆ</translation>
diff --git a/components/strings/components_strings_ko.xtb b/components/strings/components_strings_ko.xtb
index 98e03bf..3b6f015 100644
--- a/components/strings/components_strings_ko.xtb
+++ b/components/strings/components_strings_ko.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">추가 세부정보 제공</translation>
 <translation id="1021110881106174305">사용할 수 있는 카드</translation>
 <translation id="1032854598605920125">시계 방향으로 회전</translation>
+<translation id="1035334672863811645">Chrome에 로그인</translation>
 <translation id="1038842779957582377">알 수 없는 이름</translation>
 <translation id="1050038467049342496">다른 앱 닫기</translation>
 <translation id="1055184225775184556">추가 실행 취소(&amp;U)</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">비밀번호 재설정</translation>
 <translation id="4280429058323657511">, 만료일 <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">전환</translation>
+<translation id="4308131620840579419">모든 카드를 한곳에 보관하시겠어요?</translation>
 <translation id="4312866146174492540">차단(기본값)</translation>
 <translation id="4325863107915753736">도움말을 찾지 못했습니다.</translation>
 <translation id="4326324639298822553">만료일을 확인한 후 다시 시도해 주세요.</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">북마크바</translation>
 <translation id="5201306358585911203">이 페이지에 삽입된 페이지 내용:</translation>
 <translation id="5205222826937269299">이름은 필수입니다.</translation>
+<translation id="5215116848420601511">Google Pay에 사용되는 결제 수단 및 주소</translation>
 <translation id="5222812217790122047">이메일은 필수입니다.</translation>
 <translation id="5230733896359313003">배송지 주소</translation>
 <translation id="5250209940322997802">'네트워크에 연결'</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">JSON 형식으로 내보내기</translation>
 <translation id="5689516760719285838">위치</translation>
 <translation id="570530837424789914">관리...</translation>
+<translation id="5705882733397021510">뒤로</translation>
 <translation id="57094364128775171">강력한 비밀번호 추천...</translation>
 <translation id="5710435578057952990">이 웹사이트의 주소가 확인되지 않았습니다.</translation>
 <translation id="5719499550583120431">선불카드를 사용할 수 있습니다.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" />에 대한 연결이 더 이상 사용되지 않는 암호화 기술을 사용하여 암호화됩니다.</translation>
 <translation id="5813119285467412249">추가 다시 실행(&amp;R)</translation>
 <translation id="5838278095973806738">이 사이트에 입력하는 비밀번호나 신용카드 번호 등의 정보는 공격자에 의해 도난당할 수 있습니다.</translation>
+<translation id="5863847714970149516">앞 페이지에서 금액을 청구할 수 있습니다.</translation>
 <translation id="5866257070973731571">전화번호 추가</translation>
 <translation id="5869405914158311789">사이트에 연결할 수 없음</translation>
 <translation id="5869522115854928033">저장된 비밀번호</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">고정 프록시 서버와 .pac 스크립트 URL이 모두 지정되어 있습니다.</translation>
 <translation id="6989763994942163495">고급 설정 표시</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">이러한 청구는 일회성일 수도 있고 반복적일 수도 있으며 명확하지 않을 수도 있습니다.</translation>
 <translation id="7029809446516969842">비밀번호</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" />에 접속하려고 했지만 서버가 제시한 인증서의 유효 기간이 너무 길어서 신뢰할 수 없습니다.</translation>
 <translation id="7053983685419859001">차단</translation>
@@ -1084,6 +1090,7 @@
 <translation id="8957210676456822347">캡티브 포털 승인</translation>
 <translation id="8971063699422889582">서버 인증서가 만료되었습니다.</translation>
 <translation id="8978053250194585037">Google 세이프 브라우징이 최근 <ph name="SITE" />에서 <ph name="BEGIN_LINK" />피싱을 감지<ph name="END_LINK" />했습니다. 피싱 사이트는 사용자를 속이기 위해 다른 웹사이트인 것처럼 가장합니다.</translation>
+<translation id="8983003182662520383">Google Pay에 사용되는 결제 수단 및 주소</translation>
 <translation id="8987927404178983737">월</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">방문하려는 사이트에 유해한 프로그램이 있습니다.</translation>
diff --git a/components/strings/components_strings_lt.xtb b/components/strings/components_strings_lt.xtb
index 99d5f623a..9cb5d0b6 100644
--- a/components/strings/components_strings_lt.xtb
+++ b/components/strings/components_strings_lt.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Pateikti papildomos išsamios informacijos</translation>
 <translation id="1021110881106174305">Tinkamos kortelės</translation>
 <translation id="1032854598605920125">Pasukti pagal laikrodžio rodyklę</translation>
+<translation id="1035334672863811645">prisijunkite prie „Chrome“</translation>
 <translation id="1038842779957582377">nežinomas pavadinimas</translation>
 <translation id="1050038467049342496">Uždarykite kitas programas</translation>
 <translation id="1055184225775184556">&amp;Anuliuoti pridėjimą</translation>
diff --git a/components/strings/components_strings_lv.xtb b/components/strings/components_strings_lv.xtb
index b95d137..27a355b 100644
--- a/components/strings/components_strings_lv.xtb
+++ b/components/strings/components_strings_lv.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Sniegt papildu informāciju</translation>
 <translation id="1021110881106174305">Pieņemtās kartes</translation>
 <translation id="1032854598605920125">Pagriezt pulksteņrādītāju kustības virzienā</translation>
+<translation id="1035334672863811645">pierakstieties pārlūkā Chrome</translation>
 <translation id="1038842779957582377">nezināms nosaukums</translation>
 <translation id="1050038467049342496">Aizveriet citas lietotnes</translation>
 <translation id="1055184225775184556">&amp;Pievienošanas atsaukšana</translation>
@@ -487,6 +488,7 @@
 <translation id="4277028893293644418">Atiestatīt paroli</translation>
 <translation id="4280429058323657511">, derīga līdz <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Pāriet</translation>
+<translation id="4308131620840579419">Vai saglabāt visas jūsu kartes vienuviet?</translation>
 <translation id="4312866146174492540">Bloķēt (pēc noklusējuma)</translation>
 <translation id="4325863107915753736">Rakstu neizdevās atrast.</translation>
 <translation id="4326324639298822553">Pārbaudiet derīguma termiņa datumu un mēģiniet vēlreiz.</translation>
@@ -597,6 +599,7 @@
 <translation id="5190835502935405962">Grāmatzīmju josla</translation>
 <translation id="5201306358585911203">Šajā lapā iegultā lapā ir rakstīts</translation>
 <translation id="5205222826937269299">Jānorāda vārds vai nosaukums.</translation>
+<translation id="5215116848420601511">Adreses un maksājumu veidi, kuros tiek izmantots pakalpojums Google Pay</translation>
 <translation id="5222812217790122047">Jānorāda e-pasta adrese.</translation>
 <translation id="5230733896359313003">Piegādes adrese</translation>
 <translation id="5250209940322997802">“Izveidojiet savienojumu ar tīklu”</translation>
@@ -673,6 +676,7 @@
 <translation id="5689199277474810259">Eksportēt JSON formātā</translation>
 <translation id="5689516760719285838">Atrašanās vieta</translation>
 <translation id="570530837424789914">Pārvaldīt...</translation>
+<translation id="5705882733397021510">Atpakaļ</translation>
 <translation id="57094364128775171">Ieteikt drošu paroli…</translation>
 <translation id="5710435578057952990">Tīmekļa vietnes identitāte nav apstiprināta.</translation>
 <translation id="5719499550583120431">Tiek pieņemtas priekšapmaksas kartes.</translation>
@@ -690,6 +694,7 @@
 <translation id="5810442152076338065">Savienojums ar domēnu <ph name="DOMAIN" /> ir šifrēts, izmantojot novecojušu šifra komplektu.</translation>
 <translation id="5813119285467412249">&amp;Pievienošanas atsaukuma atcelšana</translation>
 <translation id="5838278095973806738">Neievadiet šajā vietnē sensitīvu informāciju (piemēram, paroles vai kredītkartes), jo to var nozagt uzbrucēji.</translation>
+<translation id="5863847714970149516">Nākamā lapa var mēģināt pieprasīt naudu</translation>
 <translation id="5866257070973731571">Tālruņa numura pievienošana</translation>
 <translation id="5869405914158311789">Šī vietne nav sasniedzama</translation>
 <translation id="5869522115854928033">Saglabātās paroles</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">Ir norādīti gan fiksēti starpniekserveri, gan .pac skripta URL.</translation>
 <translation id="6989763994942163495">Rādīt papildu iestatījumus...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Šie naudas pieprasījumi var būt vienreizēji vai atkārtoti, un tie var nebūt uzreiz pamanāmi.</translation>
 <translation id="7029809446516969842">Paroles</translation>
 <translation id="7050187094878475250">Jūs mēģinājāt sasniegt domēnu <ph name="DOMAIN" />, bet serveris uzrādīja sertifikātu, kura derīguma periods ir pārāk ilgs, lai būtu uzticams.</translation>
 <translation id="7053983685419859001">Bloķēt</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Caurlaides lapas autorizācija</translation>
 <translation id="8971063699422889582">Servera sertifikātam ir beidzies derīguma termiņš.</translation>
 <translation id="8978053250194585037">Google drošā pārlūkošana nesen <ph name="BEGIN_LINK" />konstatēja pikšķerēšanu<ph name="END_LINK" /> vietnē <ph name="SITE" />. Pikšķerēšanas vietnes uzdodas par citām vietnēm, lai jūs maldinātu.</translation>
+<translation id="8983003182662520383">Adreses un maksājumu veidi, kuros tiek izmantots pakalpojums Google Pay</translation>
 <translation id="8987927404178983737">Mēnesis</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Vietnē, kura tiks atvērta, ir kaitīgas programmas</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index d4b7218..fbfa106 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">കൂടുതൽ വിശദാംശങ്ങൾ നൽകുക</translation>
 <translation id="1021110881106174305">സ്വീകരിച്ച കാർഡുകൾ</translation>
 <translation id="1032854598605920125">ഘടികാരദിശയിൽ‌ തിരിക്കുക</translation>
+<translation id="1035334672863811645">Chrome-ലേക്ക് സൈൻ ഇൻ ചെയ്യുക</translation>
 <translation id="1038842779957582377">അജ്ഞാത നാമം</translation>
 <translation id="1050038467049342496">മറ്റ് ആപ്പുകൾ അടയ്‌ക്കുക</translation>
 <translation id="1055184225775184556">&amp;ചേർക്കുന്നത് പഴയപടിയാക്കുക</translation>
@@ -487,6 +488,7 @@
 <translation id="4277028893293644418">പാസ്‌വേഡ് റീസെറ്റ് ചെയ്യുക</translation>
 <translation id="4280429058323657511">, <ph name="EXPIRATION_DATE_ABBR" />-ന് കാലാവധി തീരുന്നു</translation>
 <translation id="4305817255990598646">സ്വിച്ച് ചെയ്യുക</translation>
+<translation id="4308131620840579419">എല്ലാ കാർഡുകളും നിങ്ങൾക്ക് ഒരു സ്ഥലത്ത് സംരക്ഷിക്കണോ?</translation>
 <translation id="4312866146174492540">ബ്ലോക്കുചെയ്യുക (ഡിഫോൾട്ട്)</translation>
 <translation id="4325863107915753736">ലേഖനം കണ്ടെത്തുന്നത് പരാജയപ്പെട്ടു</translation>
 <translation id="4326324639298822553">കാലാവധി തീരുന്ന തീയതി പരിശോധിച്ച് വീണ്ടും ശ്രമിച്ചുനോക്കൂ</translation>
@@ -597,6 +599,7 @@
 <translation id="5190835502935405962">ബുക്ക്‌മാര്‍‌ക്കുകള്‍‌ ബാര്‍‌</translation>
 <translation id="5201306358585911203">ഈ പേജിലെ ഉൾച്ചേർത്ത പേജ് പറയുന്നത്:</translation>
 <translation id="5205222826937269299">പേര് ആവശ്യമാണ്</translation>
+<translation id="5215116848420601511">Google Pay ഉപയോഗിക്കുന്ന വിലാസങ്ങളും പേയ്മെന്റ് രീതികളും</translation>
 <translation id="5222812217790122047">ഇമെയിൽ ആവശ്യമാണ്</translation>
 <translation id="5230733896359313003">ഷിപ്പിംഗ് വിലാസം</translation>
 <translation id="5250209940322997802">"നെറ്റ്‌വർക്കിലേക്ക് കണക്‌റ്റ് ചെയ്യുക"</translation>
@@ -673,6 +676,7 @@
 <translation id="5689199277474810259">JSON-ലേക്ക് ‌എക്‌സ്‌പോർട്ട് ചെയ്യുക</translation>
 <translation id="5689516760719285838">ലൊക്കേഷൻ</translation>
 <translation id="570530837424789914">മാനേജ് ചെയ്യുക...</translation>
+<translation id="5705882733397021510">മടങ്ങുക</translation>
 <translation id="57094364128775171">ശക്തമായ പാസ്‌വേഡ് നിർദ്ദേശിക്കുക…</translation>
 <translation id="5710435578057952990">ഈ വെബ്സൈറ്റിന്റെ വ്യക്തിത്വം പരിശോധിച്ചിട്ടില്ല.</translation>
 <translation id="5719499550583120431">പ്രീപെയ്ഡ് കാർഡുകൾ സ്വീകരിക്കുന്നു.</translation>
@@ -690,6 +694,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" /> എന്നതിലേക്കുള്ള നിങ്ങളുടെ കണക്ഷൻ കാലഹരണപ്പെട്ട സൈഫർ സ്യൂട്ട് ഉപയോഗിച്ച് എൻക്രിപ്റ്റുചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="5813119285467412249">&amp;ചേർക്കുന്നത് വീണ്ടും ചെയ്യുക</translation>
 <translation id="5838278095973806738">അക്രമകാരികൾ മോഷ്‌ടിക്കാൻ സാധ്യതയുള്ളതിനാൽ ഈ സൈറ്റിൽ നിങ്ങളുടെ രഹസ്യ വിവരങ്ങളൊന്നും (ഉദാഹരണത്തിന്, പാസ്‌വേഡുകളോ ക്രെഡിറ്റ് കാർഡുകളോ പോലുള്ളവ) നൽകരുത്.</translation>
+<translation id="5863847714970149516">മുമ്പോട്ടുള്ള പേജ് നിങ്ങളിൽ നിന്ന് പണമീടാക്കാൻ ശ്രമിച്ചേക്കാം</translation>
 <translation id="5866257070973731571">ഫോണ്‍ നമ്പര്‍ ചേര്‍ക്കുക</translation>
 <translation id="5869405914158311789">ഈ സൈറ്റ് ലഭ്യമാക്കാനാകുന്നില്ല</translation>
 <translation id="5869522115854928033">സംരക്ഷിച്ച പാസ്‌വേഡുകള്‍</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">സ്ഥിരമായ പ്രോക്‌സി സെർവറുകളും ഒരു സ്‌ക്രിപ്റ്റ് URL-ഉം വ്യക്തമാക്കിയിരിക്കുന്നു.</translation>
 <translation id="6989763994942163495">വിപുലമായ ക്രമീകരണങ്ങൾ കാണിക്കുക...</translation>
 <translation id="7012363358306927923">ചൈന UnionPay</translation>
+<translation id="7016992613359344582">ഈ നിരക്കുകൾ ഒറ്റത്തവണ അടയ്ക്കുന്നതോ അല്ലെങ്കിൽ ആവർത്തിക്കുന്നവയോ ആവാം, ഒപ്പം വ്യക്തമല്ലായിരിക്കാം.</translation>
 <translation id="7029809446516969842">പാസ്‌വേഡുകള്‍</translation>
 <translation id="7050187094878475250">നിങ്ങൾ <ph name="DOMAIN" /> എന്നതിലെത്താൻ ശ്രമിച്ചു, എന്നാൽ തീരെ വിശ്വാസയോഗ്യമല്ലാത്ത ഒരു കാലാവധിയുള്ള സർട്ടിഫിക്കറ്റാണ് സെർവർ കാണിക്കുന്നത്.</translation>
 <translation id="7053983685419859001">തടയുക</translation>
@@ -1083,6 +1089,7 @@
 <translation id="8957210676456822347">ക്യാപ്‌റ്റീവ് പോർട്ടൽ അംഗീകരിക്കൽ</translation>
 <translation id="8971063699422889582">സെര്‍വറിന്‍റെ സര്‍ട്ടിഫിക്കറ്റ് കാലഹരണപ്പെട്ടു.</translation>
 <translation id="8978053250194585037">Google സുരക്ഷിത ബ്രൗസിംഗ് ഈയിടെ <ph name="SITE" />-ൽ <ph name="BEGIN_LINK" />ഫിഷിംഗ് കണ്ടെത്തി<ph name="END_LINK" />. നിങ്ങളെ കബളിപ്പിക്കാൻ ഫിഷിംഗ് സൈറ്റുകൾ മറ്റു വെബ്‌സൈറ്റുകളെന്ന നിലയിൽ ഭാവിക്കും.</translation>
+<translation id="8983003182662520383">Google Pay ഉപയോഗിക്കുന്ന വിലാസങ്ങളും പേയ്മെന്റ് രീതികളും</translation>
 <translation id="8987927404178983737">മാസം</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">നിങ്ങൾ പോകാനിരിക്കുന്ന സൈറ്റിൽ ദോഷകരമായ പ്രോഗ്രാമുകളുണ്ട്</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb
index 614da3c..6ad94e6 100644
--- a/components/strings/components_strings_mr.xtb
+++ b/components/strings/components_strings_mr.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">अतिरिक्त तपशील प्रदान करा</translation>
 <translation id="1021110881106174305">स्वीकारलेली कार्ड</translation>
 <translation id="1032854598605920125">घड्याळाच्या दिशेने फिरवा</translation>
+<translation id="1035334672863811645">Chrome मध्ये साइन इन करा</translation>
 <translation id="1038842779957582377">अज्ञात नाव</translation>
 <translation id="1050038467049342496">अन्य अॅप्स बंद करा</translation>
 <translation id="1055184225775184556">&amp;जोडा पूर्ववत करा</translation>
diff --git a/components/strings/components_strings_ms.xtb b/components/strings/components_strings_ms.xtb
index 39640c5..994de30 100644
--- a/components/strings/components_strings_ms.xtb
+++ b/components/strings/components_strings_ms.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Berikan butiran tambahan</translation>
 <translation id="1021110881106174305">Kad diterima</translation>
 <translation id="1032854598605920125">Putar ikut arah jam</translation>
+<translation id="1035334672863811645">log masuk ke Chrome</translation>
 <translation id="1038842779957582377">nama tidak diketahui</translation>
 <translation id="1050038467049342496">Tutup apl lain</translation>
 <translation id="1055184225775184556">&amp;Buat Asal Tambahkan</translation>
@@ -489,6 +490,7 @@
 <translation id="4277028893293644418">Tetapkan semula kata laluan</translation>
 <translation id="4280429058323657511">, tamat tempoh <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Tukar</translation>
+<translation id="4308131620840579419">Simpan semua kad anda di satu tempat?</translation>
 <translation id="4312866146174492540">Sekat (lalai)</translation>
 <translation id="4325863107915753736">Gagal menemui artikel</translation>
 <translation id="4326324639298822553">Semak tarikh tamat tempoh anda dan cuba lagi</translation>
@@ -599,6 +601,7 @@
 <translation id="5190835502935405962">Bar Penanda Halaman</translation>
 <translation id="5201306358585911203">Halaman terbenam pada halaman ini menyatakan</translation>
 <translation id="5205222826937269299">Nama diperlukan</translation>
+<translation id="5215116848420601511">Kaedah pembayaran dan alamat yang menggunakan Google Pay</translation>
 <translation id="5222812217790122047">E-mel diperlukan</translation>
 <translation id="5230733896359313003">Alamat Penghantaran</translation>
 <translation id="5250209940322997802">"Sambung kepada rangkaian"</translation>
@@ -675,6 +678,7 @@
 <translation id="5689199277474810259">Eksport ke JSON</translation>
 <translation id="5689516760719285838">Lokasi</translation>
 <translation id="570530837424789914">Urus...</translation>
+<translation id="5705882733397021510">Kembali</translation>
 <translation id="57094364128775171">Cadangkan kata laluan yang kukuh…</translation>
 <translation id="5710435578057952990">Identiti tapak web ini belum disahkan.</translation>
 <translation id="5719499550583120431">Kad prabayar diterima.</translation>
@@ -692,6 +696,7 @@
 <translation id="5810442152076338065">Sambungan anda ke <ph name="DOMAIN" /> disulitkan menggunakan suit sifer yang sudah usang.</translation>
 <translation id="5813119285467412249">&amp;Buat Semula Tambahkan</translation>
 <translation id="5838278095973806738">Anda tidak seharusnya memasukkan sebarang maklumat sensitif pada tapak ini (contohnya, kata laluan atau maklumat kad kredit) kerana maklumat ini boleh dicuri oleh penyerang.</translation>
+<translation id="5863847714970149516">Halaman yang seterusnya mungkin cuba mengenakan bayaran kepada anda</translation>
 <translation id="5866257070973731571">Tambahkan Nombor Telefon</translation>
 <translation id="5869405914158311789">Tapak ini tidak dapat dicapai</translation>
 <translation id="5869522115854928033">Kata laluan disimpan</translation>
@@ -822,6 +827,7 @@
 <translation id="6973656660372572881">Pelayan proksi tetap dan juga URL skrip .pac tidak ditetapkan.</translation>
 <translation id="6989763994942163495">Paparkan tetapan lanjutan...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Caj ini mungkin caj sekali atau caj berulang dan mungkin tidak ketara.</translation>
 <translation id="7029809446516969842">Kata laluan</translation>
 <translation id="7050187094878475250">Anda cuba untuk mencapai <ph name="DOMAIN" />, tetapi pelayan memberikan sijil yang tempoh sahnya terlalu panjang untuk boleh dipercayai.</translation>
 <translation id="7053983685419859001">Sekat</translation>
@@ -1087,6 +1093,7 @@
 <translation id="8957210676456822347">Keizinan Portal Tawanan</translation>
 <translation id="8971063699422889582">Sijil pelayan telah tamat tempoh.</translation>
 <translation id="8978053250194585037">Penyemakan Imbas Selamat Google <ph name="BEGIN_LINK" />mengesan pancingan data<ph name="END_LINK" /> di <ph name="SITE" /> baru-baru ini. Tapak pancingan data menyamar sebagai tapak web lain untuk menipu anda.</translation>
+<translation id="8983003182662520383">Kaedah Pembayaran dan Alamat yang Menggunakan Google Pay</translation>
 <translation id="8987927404178983737">Bulan</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Laman web yang akan dilayari mengandungi atur cara berbahaya</translation>
diff --git a/components/strings/components_strings_nl.xtb b/components/strings/components_strings_nl.xtb
index edd71322..94087dde 100644
--- a/components/strings/components_strings_nl.xtb
+++ b/components/strings/components_strings_nl.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Aanvullende gegevens verzenden</translation>
 <translation id="1021110881106174305">Geaccepteerde kaarten</translation>
 <translation id="1032854598605920125">Rechtsom draaien</translation>
+<translation id="1035334672863811645">inloggen bij Chrome</translation>
 <translation id="1038842779957582377">onbekende naam</translation>
 <translation id="1050038467049342496">Andere apps sluiten</translation>
 <translation id="1055184225775184556">&amp;Toevoegen ongedaan maken</translation>
@@ -484,6 +485,7 @@
 <translation id="4277028893293644418">Wachtwoord opnieuw instellen</translation>
 <translation id="4280429058323657511">, vervalt <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Overschakelen</translation>
+<translation id="4308131620840579419">Al je kaarten op één plek opslaan?</translation>
 <translation id="4312866146174492540">Blokkeren (standaard)</translation>
 <translation id="4325863107915753736">Kan artikel niet vinden</translation>
 <translation id="4326324639298822553">Controleer de vervaldatum en probeer het opnieuw</translation>
@@ -594,6 +596,7 @@
 <translation id="5190835502935405962">Bladwijzerbalk</translation>
 <translation id="5201306358585911203">Een ingesloten pagina op deze pagina meldt het volgende</translation>
 <translation id="5205222826937269299">Naam vereist</translation>
+<translation id="5215116848420601511">Betaalmethoden en adressen die Google Pay gebruiken</translation>
 <translation id="5222812217790122047">E-mailadres vereist</translation>
 <translation id="5230733896359313003">Verzendadres</translation>
 <translation id="5250209940322997802">'Verbinding maken met netwerk'</translation>
@@ -670,6 +673,7 @@
 <translation id="5689199277474810259">Exporteren naar JSON</translation>
 <translation id="5689516760719285838">Locatie</translation>
 <translation id="570530837424789914">Beheren...</translation>
+<translation id="5705882733397021510">Terug</translation>
 <translation id="57094364128775171">Sterk wachtwoord voorstellen…</translation>
 <translation id="5710435578057952990">De identiteit van deze website is niet geverifieerd.</translation>
 <translation id="5719499550583120431">Prepaidkaarten worden geaccepteerd.</translation>
@@ -687,6 +691,7 @@
 <translation id="5810442152076338065">Je verbinding met <ph name="DOMAIN" /> is versleuteld via een verouderde Cipher Suite.</translation>
 <translation id="5813119285467412249">&amp;Opnieuw toevoegen</translation>
 <translation id="5838278095973806738">Je moet geen gevoelige gegevens (zoals wachtwoorden of creditcards) opgeven op deze site omdat ze kunnen worden gestolen door aanvallers.</translation>
+<translation id="5863847714970149516">Op de komende pagina kan worden geprobeerd kosten in rekening te brengen</translation>
 <translation id="5866257070973731571">Telefoonnummer toevoegen</translation>
 <translation id="5869405914158311789">Deze site is niet bereikbaar</translation>
 <translation id="5869522115854928033">Opgeslagen wachtwoorden</translation>
@@ -816,6 +821,7 @@
 <translation id="6973656660372572881">Zowel vaste proxyservers als een pac-script-URL worden gespecificeerd.</translation>
 <translation id="6989763994942163495">Geavanceerde instellingen weergeven...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Deze kosten kunnen eenmalig of terugkerend zijn en zijn mogelijk niet duidelijk.</translation>
 <translation id="7029809446516969842">Wachtwoorden</translation>
 <translation id="7050187094878475250">Je hebt geprobeerd <ph name="DOMAIN" /> te bereiken, maar de server heeft een certificaat gepresenteerd waarvan de geldigheidsperiode te lang is om betrouwbaar te zijn.</translation>
 <translation id="7053983685419859001">Blokkeren</translation>
@@ -1080,6 +1086,7 @@
 <translation id="8957210676456822347">Autorisatie van captive portal</translation>
 <translation id="8971063699422889582">Het servercertificaat is verlopen.</translation>
 <translation id="8978053250194585037">Google Safe Browsing heeft onlangs <ph name="BEGIN_LINK" />phishing gedetecteerd<ph name="END_LINK" /> op <ph name="SITE" />. Phishingsites doen zich voor als een andere website om je te misleiden.</translation>
+<translation id="8983003182662520383">Betaalmethoden en adressen die Google Pay gebruiken</translation>
 <translation id="8987927404178983737">Maand</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">De volgende site bevat schadelijke programma's</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 0cd3e82b..f0401b7 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Oppgi flere detaljer</translation>
 <translation id="1021110881106174305">Godkjente kort</translation>
 <translation id="1032854598605920125">Rotér med klokken</translation>
+<translation id="1035334672863811645">logg på Chrome</translation>
 <translation id="1038842779957582377">ukjent navn</translation>
 <translation id="1050038467049342496">Lukk andre apper</translation>
 <translation id="1055184225775184556">&amp;Angre tilleggingen</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Tilbakestill passordet</translation>
 <translation id="4280429058323657511">, utløper <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Bytt</translation>
+<translation id="4308131620840579419">Alle kortene dine på ett sted?</translation>
 <translation id="4312866146174492540">Blokkér (standard)</translation>
 <translation id="4325863107915753736">Artikkelen ble ikke funnet</translation>
 <translation id="4326324639298822553">Kontrollér utløpsdatoen, og prøv igjen</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Bokmerkerad</translation>
 <translation id="5201306358585911203">På en innebygd side på denne siden står det</translation>
 <translation id="5205222826937269299">Navn er obligatorisk</translation>
+<translation id="5215116848420601511">Betalingsmåter og adresser ved bruk av Google Pay</translation>
 <translation id="5222812217790122047">E-post er obligatorisk</translation>
 <translation id="5230733896359313003">Leveringsadresse</translation>
 <translation id="5250209940322997802">«Koble til nettverk»</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Eksportér til JSON</translation>
 <translation id="5689516760719285838">Sted</translation>
 <translation id="570530837424789914">Administrer…</translation>
+<translation id="5705882733397021510">Tilbake</translation>
 <translation id="57094364128775171">Foreslå et sterkt passord…</translation>
 <translation id="5710435578057952990">Identiteten til dette nettstedet er ikke verifisert.</translation>
 <translation id="5719499550583120431">Forhåndsbetalte kort godtas.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Tilkoblingen til <ph name="DOMAIN" /> er kryptert med en foreldet chifferserie.</translation>
 <translation id="5813119285467412249">&amp;Legg til likevel</translation>
 <translation id="5838278095973806738">Du bør ikke oppgi sensitiv informasjon på dette nettstedet (for eksempel passord eller kredittkort) fordi den kan bli stjålet av angripere.</translation>
+<translation id="5863847714970149516">Siden som kommer kan prøve å belaste deg for penger</translation>
 <translation id="5866257070973731571">Legg til telefonnummer</translation>
 <translation id="5869405914158311789">Dette nettstedet er ikke tilgjengelig</translation>
 <translation id="5869522115854928033">Lagrede passord</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Både statiske proxytjenere og en .pac-skriptnettadresse er angitt.</translation>
 <translation id="6989763994942163495">Vis avanserte innstillinger</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Disse belastningene kan være engangs eller gjentakende, og kan være skjult.</translation>
 <translation id="7029809446516969842">Passord</translation>
 <translation id="7050187094878475250">Du prøvde å nå <ph name="DOMAIN" />. Tjeneren presenterte et sertifikat som har en gyldighetsperiode som er for lang til å være pålitelig.</translation>
 <translation id="7053983685419859001">Blokkér</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Captive Portal-autorisasjon</translation>
 <translation id="8971063699422889582">Tjenerens sertifikat er utløpt.</translation>
 <translation id="8978053250194585037">Google Safe Browsing <ph name="BEGIN_LINK" />oppdaget nylig nettfisking<ph name="END_LINK" /> på <ph name="SITE" />. Nettsteder for nettfisking er laget for å ligne på andre nettsteder, for å prøve å lure deg.</translation>
+<translation id="8983003182662520383">Betalingsmåter og adresser ved bruk av Google Pay</translation>
 <translation id="8987927404178983737">Måned</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Nettstedet du er i ferd med å åpne, inneholder skadelige programmer</translation>
diff --git a/components/strings/components_strings_pl.xtb b/components/strings/components_strings_pl.xtb
index 3fa12fc..4eddd90 100644
--- a/components/strings/components_strings_pl.xtb
+++ b/components/strings/components_strings_pl.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Podaj dodatkowe informacje</translation>
 <translation id="1021110881106174305">Akceptowane karty</translation>
 <translation id="1032854598605920125">Obróć w prawo</translation>
+<translation id="1035334672863811645">zaloguj się w Chrome</translation>
 <translation id="1038842779957582377">nieznana nazwa</translation>
 <translation id="1050038467049342496">Zamknij inne aplikacje</translation>
 <translation id="1055184225775184556">&amp;Cofnij dodanie</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Resetuj hasło</translation>
 <translation id="4280429058323657511">, ważna do: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Przełącz</translation>
+<translation id="4308131620840579419">Zapisać wszystkie karty w jednym miejscu?</translation>
 <translation id="4312866146174492540">Blokuj (domyślnie)</translation>
 <translation id="4325863107915753736">Nie udało się znaleźć artykułu</translation>
 <translation id="4326324639298822553">Sprawdź datę ważności i spróbuj ponownie</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Pasek zakładek</translation>
 <translation id="5201306358585911203">Komunikat z elementu umieszczonego na bieżącej stronie</translation>
 <translation id="5205222826937269299">Nazwa jest wymagana</translation>
+<translation id="5215116848420601511">Formy płatności i adresy z Google Pay</translation>
 <translation id="5222812217790122047">E-mail jest wymagany</translation>
 <translation id="5230733896359313003">Adres wysyłki</translation>
 <translation id="5250209940322997802">„Połącz z siecią”</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Eksportuj w formacie JSON</translation>
 <translation id="5689516760719285838">Lokalizacja</translation>
 <translation id="570530837424789914">Zarządzaj…</translation>
+<translation id="5705882733397021510">Wróć</translation>
 <translation id="57094364128775171">Zaproponuj silne hasło…</translation>
 <translation id="5710435578057952990">Tożsamość witryny nie została zweryfikowana.</translation>
 <translation id="5719499550583120431">Karty przedpłacone są akceptowane.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Połączenie z <ph name="DOMAIN" /> jest szyfrowane przy użyciu przestarzałego zestawu szyfrów.</translation>
 <translation id="5813119285467412249">&amp;Ponów dodanie</translation>
 <translation id="5838278095973806738">Nie podawaj żadnych informacji poufnych (takich jak hasła czy karty kredytowe) w tej witrynie, bo osoby atakujące będą mogły je wykraść.</translation>
+<translation id="5863847714970149516">Otwierana strona może próbować obciążyć Cię płatnością</translation>
 <translation id="5866257070973731571">Dodaj numer telefonu</translation>
 <translation id="5869405914158311789">Ta witryna jest nieosiągalna</translation>
 <translation id="5869522115854928033">Zapisane hasła</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Określono zarówno stałe serwery proxy, jak i URL skryptu PAC.</translation>
 <translation id="6989763994942163495">Pokaż ustawienia zaawansowane...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Może to być opłata jednorazowa lub cykliczna, a informacje o niej mogą nie być wyraźnie podane.</translation>
 <translation id="7029809446516969842">Hasła</translation>
 <translation id="7050187094878475250">Próbujesz połączyć się z domeną <ph name="DOMAIN" />, ale serwer przedstawił certyfikat, którego okres ważności jest za długi, by był wiarygodny.</translation>
 <translation id="7053983685419859001">Blokuj</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Autoryzacja portalu przechwytującego</translation>
 <translation id="8971063699422889582">Ważność certyfikatu serwera wygasła.</translation>
 <translation id="8978053250194585037">Bezpieczne przeglądanie Google <ph name="BEGIN_LINK" />wykryło ostatnio próbę wyłudzenia informacji<ph name="END_LINK" /> na stronie <ph name="SITE" />. Strony wyłudzające informacje udają inne strony, by Cię oszukać.</translation>
+<translation id="8983003182662520383">Formy płatności i adresy z Google Pay</translation>
 <translation id="8987927404178983737">Miesiąc</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Na następnej stronie znajdują się szkodliwe programy</translation>
diff --git a/components/strings/components_strings_pt-BR.xtb b/components/strings/components_strings_pt-BR.xtb
index c186754c..26be4a99 100644
--- a/components/strings/components_strings_pt-BR.xtb
+++ b/components/strings/components_strings_pt-BR.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Forneça detalhes adicionais</translation>
 <translation id="1021110881106174305">Cartões aceitos</translation>
 <translation id="1032854598605920125">Girar no sentido horário</translation>
+<translation id="1035334672863811645">fazer login no Chrome</translation>
 <translation id="1038842779957582377">nome desconhecido</translation>
 <translation id="1050038467049342496">Fechar outros apps</translation>
 <translation id="1055184225775184556">&amp;Desfazer adicionar</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Redefinir senha</translation>
 <translation id="4280429058323657511">, validade <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Alternar</translation>
+<translation id="4308131620840579419">Salvar todos os cartões em um só lugar?</translation>
 <translation id="4312866146174492540">Bloquear (padrão)</translation>
 <translation id="4325863107915753736">Falha ao encontrar artigo</translation>
 <translation id="4326324639298822553">Verifique a data de validade e tente novamente</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Barra de favoritos</translation>
 <translation id="5201306358585911203">Uma página incorporada nesta página diz</translation>
 <translation id="5205222826937269299">Nome obrigatório</translation>
+<translation id="5215116848420601511">Formas de pagamento e endereços que usam o Google Pay</translation>
 <translation id="5222812217790122047">E-mail obrigatório</translation>
 <translation id="5230733896359313003">Endereço de entrega</translation>
 <translation id="5250209940322997802">"Conectar-se à rede"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exportar para JSON</translation>
 <translation id="5689516760719285838">Local</translation>
 <translation id="570530837424789914">Gerenciar…</translation>
+<translation id="5705882733397021510">Voltar</translation>
 <translation id="57094364128775171">Sugerir senha forte…</translation>
 <translation id="5710435578057952990">A identidade deste site não foi confirmada.</translation>
 <translation id="5719499550583120431">Cartões pré-pagos são aceitos.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Sua conexão com <ph name="DOMAIN" /> está criptografada com um pacote de criptografia obsoleto.</translation>
 <translation id="5813119285467412249">&amp;Refazer adicionar</translation>
 <translation id="5838278095973806738">Você não deve fornecer nenhuma informação confidencial nesse site (por exemplo, senhas ou cartões de crédito), porque elas podem ser roubadas por invasores.</translation>
+<translation id="5863847714970149516">A página adiante pode tentar cobrar pagamento em dinheiro</translation>
 <translation id="5866257070973731571">Adicione um Número de Telefone</translation>
 <translation id="5869405914158311789">Não é possível acessar esse site</translation>
 <translation id="5869522115854928033">Senhas salvas</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Ambos os servidores proxy fixo e um URL de script .pac foram especificados.</translation>
 <translation id="6989763994942163495">Mostrar configurações avançadas...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Essas cobranças podem ser únicas ou recorrentes e talvez não sejam óbvias.</translation>
 <translation id="7029809446516969842">Senhas</translation>
 <translation id="7050187094878475250">Você tentou acessar <ph name="DOMAIN" />, mas o servidor apresentou um certificado cujo período de validade é extremamente longo, o que não é confiável.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Autorização de portal cativo</translation>
 <translation id="8971063699422889582">O certificado do servidor expirou.</translation>
 <translation id="8978053250194585037">Recentemente, o recurso "Navegação segura" do Google <ph name="BEGIN_LINK" />detectou phishing<ph name="END_LINK" /> em <ph name="SITE" />. Os sites de phishing fingem ser outros sites para enganar você.</translation>
+<translation id="8983003182662520383">Formas de pagamento e endereços que usam o Google Pay</translation>
 <translation id="8987927404178983737">Mês</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">O site a seguir contém programas prejudiciais</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb
index 2aa005e..e77d9c9 100644
--- a/components/strings/components_strings_pt-PT.xtb
+++ b/components/strings/components_strings_pt-PT.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Forneça mais detalhes</translation>
 <translation id="1021110881106174305">Cartões admitidos</translation>
 <translation id="1032854598605920125">Rodar para a direita</translation>
+<translation id="1035334672863811645">inicie sessão no Chrome</translation>
 <translation id="1038842779957582377">nome desconhecido</translation>
 <translation id="1050038467049342496">Fechar outras aplicações</translation>
 <translation id="1055184225775184556">&amp;Anular adição</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Repor palavra-passe</translation>
 <translation id="4280429058323657511">, exp. <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Mudar</translation>
+<translation id="4308131620840579419">Pretende guardar todos os seus cartões num único local?</translation>
 <translation id="4312866146174492540">Bloquear (predefinição)</translation>
 <translation id="4325863107915753736">Falha ao encontrar o artigo</translation>
 <translation id="4326324639298822553">Verifique a data de validade e tente novamente</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Barra de marcadores</translation>
 <translation id="5201306358585911203">Uma página incorporada nesta página diz</translation>
 <translation id="5205222826937269299">Nome obrigatório</translation>
+<translation id="5215116848420601511">Métodos de pagamento e endereços com o Google Pay</translation>
 <translation id="5222812217790122047">Email obrigatório</translation>
 <translation id="5230733896359313003">Endereço de envio</translation>
 <translation id="5250209940322997802">"Ligar à rede"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exportar para JSON</translation>
 <translation id="5689516760719285838">Local</translation>
 <translation id="570530837424789914">Gerir…</translation>
+<translation id="5705882733397021510">Retroceder</translation>
 <translation id="57094364128775171">Sugerir palavra-passe forte…</translation>
 <translation id="5710435578057952990">A identidade deste Web site não foi verificada.</translation>
 <translation id="5719499550583120431">Os cartões pré-pagos são admitidos.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">A sua ligação a <ph name="DOMAIN" /> está encriptada através de um conjunto de cifras obsoleto.</translation>
 <translation id="5813119285467412249">&amp;Refazer adição</translation>
 <translation id="5838278095973806738">Não deve introduzir informações confidenciais neste site (por exemplo, palavras-passe ou números de cartões de crédito), porque podem ser roubadas por atacantes.</translation>
+<translation id="5863847714970149516">A próxima página pode tentar cobrar-lhe dinheiro</translation>
 <translation id="5866257070973731571">Adicionar número de telefone</translation>
 <translation id="5869405914158311789">Não é possível aceder a este site</translation>
 <translation id="5869522115854928033">Palavras-passe guardadas</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Foram especificados servidores proxy fixos e um URL de script .pac.</translation>
 <translation id="6989763994942163495">Mostrar definições avançadas...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Estas cobranças podem ser únicas ou recorrentes e podem não ser óbvias.</translation>
 <translation id="7029809446516969842">Palavras-passe</translation>
 <translation id="7050187094878475250">Tentou aceder a <ph name="DOMAIN" />, mas o servidor apresentou um certificado cujo período de validade é demasiado longo para ser fidedigno.</translation>
 <translation id="7053983685419859001">Bloquear</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Autorização de portal cativo</translation>
 <translation id="8971063699422889582">O certificado do servidor expirou.</translation>
 <translation id="8978053250194585037">A Navegação segura do Google <ph name="BEGIN_LINK" />detetou phishing<ph name="END_LINK" /> recentemente em <ph name="SITE" />. Os sites de phishing simulam ser outros Websites para o enganar.</translation>
+<translation id="8983003182662520383">Métodos de pagamento e endereços com o Google Pay</translation>
 <translation id="8987927404178983737">Mês</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">O site que se segue contém programas prejudiciais</translation>
diff --git a/components/strings/components_strings_ro.xtb b/components/strings/components_strings_ro.xtb
index c20ee4e..fd8beee 100644
--- a/components/strings/components_strings_ro.xtb
+++ b/components/strings/components_strings_ro.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Specifică detalii suplimentare</translation>
 <translation id="1021110881106174305">Carduri acceptate</translation>
 <translation id="1032854598605920125">Rotește în sensul acelor de ceasornic</translation>
+<translation id="1035334672863811645">conectează-te la Chrome</translation>
 <translation id="1038842779957582377">nume necunoscut</translation>
 <translation id="1050038467049342496">închide celelalte aplicații;</translation>
 <translation id="1055184225775184556">&amp;Anulați adăugarea</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Resetează parola</translation>
 <translation id="4280429058323657511">data expirării: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Comută</translation>
+<translation id="4308131620840579419">Salvezi toate cardurile într-un singur loc?</translation>
 <translation id="4312866146174492540">Blochează (în mod prestabilit)</translation>
 <translation id="4325863107915753736">Articolul nu a fost găsit</translation>
 <translation id="4326324639298822553">Verifică data de expirare și încearcă din nou</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Bară de marcaje</translation>
 <translation id="5201306358585911203">O pagină încorporată de pe această pagină afișează mesajul</translation>
 <translation id="5205222826937269299">Numele este obligatoriu</translation>
+<translation id="5215116848420601511">Metodele de plată și adresele care folosesc Google Pay</translation>
 <translation id="5222812217790122047">Adresa de e-mail este obligatorie</translation>
 <translation id="5230733896359313003">Adresă de expediere</translation>
 <translation id="5250209940322997802">„Conectează-te la rețea”</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exportă în format JSON</translation>
 <translation id="5689516760719285838">Locație</translation>
 <translation id="570530837424789914">Gestionează...</translation>
+<translation id="5705882733397021510">Înapoi</translation>
 <translation id="57094364128775171">Sugerează o parolă puternică…</translation>
 <translation id="5710435578057952990">Identitatea acestui site nu a fost confirmată.</translation>
 <translation id="5719499550583120431">Se acceptă carduri preplătite.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Conexiunea la <ph name="DOMAIN" /> este criptată folosind o suită de codificare învechită.</translation>
 <translation id="5813119285467412249">&amp;Repetați adăugarea</translation>
 <translation id="5838278095973806738">Nu ar trebui să introduci informații sensibile pe acest site (de exemplu, parole sau carduri de credit), deoarece ar putea fi furate de atacatori.</translation>
+<translation id="5863847714970149516">Următoarea pagină poate să genereze costuri</translation>
 <translation id="5866257070973731571">Adaugă un număr de telefon</translation>
 <translation id="5869405914158311789">Acest site nu poate fi accesat</translation>
 <translation id="5869522115854928033">Parole salvate</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Sunt specificate atât servere proxy fixe, cât și o adresă URL pentru scripturi .pac.</translation>
 <translation id="6989763994942163495">Afișează setările avansate...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Aceste costuri pot fi unice sau recurente și ascunse.</translation>
 <translation id="7029809446516969842">Parole</translation>
 <translation id="7050187094878475250">Ai încercat să accesezi <ph name="DOMAIN" />, dar serverul a prezentat un certificat a cărui perioadă de validitate este prea lungă pentru a fi de încredere.</translation>
 <translation id="7053983685419859001">Blochează</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Autorizarea prin portalul captiv</translation>
 <translation id="8971063699422889582">Certificatul serverului a expirat.</translation>
 <translation id="8978053250194585037">Recent, Navigarea sigură Google <ph name="BEGIN_LINK" />a detectat phishing<ph name="END_LINK" /> pe <ph name="SITE" />. Site-urile de phishing falsifică alte site-uri, pentru a te înșela.</translation>
+<translation id="8983003182662520383">Metodele de plată și adresele care folosesc Google Pay</translation>
 <translation id="8987927404178983737">Lună</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Site-ul pe care urmează să îl accesezi conține programe dăunătoare</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index fcf21a3..df98bd9 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Сообщить дополнительную информацию</translation>
 <translation id="1021110881106174305">Карты, которые принимаются к оплате</translation>
 <translation id="1032854598605920125">Повернуть по часовой стрелке</translation>
+<translation id="1035334672863811645">войдите в Chrome</translation>
 <translation id="1038842779957582377">неизвестное имя</translation>
 <translation id="1050038467049342496">Закройте другие приложения.</translation>
 <translation id="1055184225775184556">&amp;Отменить добавление</translation>
@@ -487,6 +488,7 @@
 <translation id="4277028893293644418">Сбросить пароль</translation>
 <translation id="4280429058323657511">, действует до <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Переключиться</translation>
+<translation id="4308131620840579419">Сохранить все карты в одном аккаунте?</translation>
 <translation id="4312866146174492540">Блокировать (по умолчанию)</translation>
 <translation id="4325863107915753736">Не удалось найти статью</translation>
 <translation id="4326324639298822553">Проверьте срок действия и повторите попытку</translation>
@@ -597,6 +599,7 @@
 <translation id="5190835502935405962">Панель закладок</translation>
 <translation id="5201306358585911203">Подтвердите действие</translation>
 <translation id="5205222826937269299">Введите имя или название</translation>
+<translation id="5215116848420601511">Способы оплаты и адреса из Google Pay</translation>
 <translation id="5222812217790122047">Введите адрес электронной почты</translation>
 <translation id="5230733896359313003">Адрес доставки</translation>
 <translation id="5250209940322997802">"Подключитесь к сети"</translation>
@@ -673,6 +676,7 @@
 <translation id="5689199277474810259">Экспортировать как JSON</translation>
 <translation id="5689516760719285838">Геоданные</translation>
 <translation id="570530837424789914">Управление…</translation>
+<translation id="5705882733397021510">Назад</translation>
 <translation id="57094364128775171">Сгенерировать надежный пароль</translation>
 <translation id="5710435578057952990">Идентификационные данные этого сайта не проверены.</translation>
 <translation id="5719499550583120431">Принимаются карты предоплаты.</translation>
@@ -690,6 +694,7 @@
 <translation id="5810442152076338065">Соединение с <ph name="DOMAIN" /> зашифровано с помощью устаревшего набора шифров.</translation>
 <translation id="5813119285467412249">&amp;Повторить добавление</translation>
 <translation id="5838278095973806738">Не сообщайте этому сайту конфиденциальную информацию (например, пароли и номера банковских карт). К ней могут получить доступ злоумышленники.</translation>
+<translation id="5863847714970149516">При открытии этой страницы с вашего счета могут быть списаны средства</translation>
 <translation id="5866257070973731571">Добавьте номер телефона</translation>
 <translation id="5869405914158311789">Не удается получить доступ к сайту</translation>
 <translation id="5869522115854928033">Сайты с сохраненными паролями</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">Указаны как фиксированные прокси-серверы, так и URL PAC-скриптов.</translation>
 <translation id="6989763994942163495">Показать дополнительные настройки</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Списание может быть разовым или повторяющимся без каких-либо уведомлений.</translation>
 <translation id="7029809446516969842">Пароли</translation>
 <translation id="7050187094878475250">Вы попытались перейти на сайт <ph name="DOMAIN" />, но сервер предоставил не заслуживающий доверия сертификат со слишком долгим сроком действия.</translation>
 <translation id="7053983685419859001">Блокировать</translation>
@@ -1084,6 +1090,7 @@
 <translation id="8957210676456822347">Авторизация через адаптивный портал</translation>
 <translation id="8971063699422889582">Сертификат сервера устарел.</translation>
 <translation id="8978053250194585037">Функция "Google Безопасный просмотр" недавно <ph name="BEGIN_LINK" />обнаружила попытку фишинга<ph name="END_LINK" /> на сайте <ph name="SITE" />. Будьте внимательны! Мошенники часто создают веб-страницы, похожие на знакомые вам сайты.</translation>
+<translation id="8983003182662520383">Способы оплаты и адреса из Google Pay</translation>
 <translation id="8987927404178983737">Месяц</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Сайт содержит нежелательное ПО</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb
index d09da233..e22d2d6 100644
--- a/components/strings/components_strings_sk.xtb
+++ b/components/strings/components_strings_sk.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Poskytnite ďalšie podrobnosti</translation>
 <translation id="1021110881106174305">Prijímané karty</translation>
 <translation id="1032854598605920125">Otočiť v smere hodinových ručičiek</translation>
+<translation id="1035334672863811645">prihláste sa do prehliadača Chrome</translation>
 <translation id="1038842779957582377">neznámy názov</translation>
 <translation id="1050038467049342496">Zavrite ostatné aplikácie</translation>
 <translation id="1055184225775184556">&amp;Vrátiť späť pridanie</translation>
diff --git a/components/strings/components_strings_sl.xtb b/components/strings/components_strings_sl.xtb
index 61622370..dcd61f8 100644
--- a/components/strings/components_strings_sl.xtb
+++ b/components/strings/components_strings_sl.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Navedite dodatne podrobnosti</translation>
 <translation id="1021110881106174305">Sprejete kartice</translation>
 <translation id="1032854598605920125">Sukanje v smeri urnega kazalca</translation>
+<translation id="1035334672863811645">se prijavite v Chrome</translation>
 <translation id="1038842779957582377">neznano ime</translation>
 <translation id="1050038467049342496">Zaprite druge aplikacije</translation>
 <translation id="1055184225775184556">&amp;Razveljavi dodajanje</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Ponastavi geslo</translation>
 <translation id="4280429058323657511">, datum poteka veljavnosti: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Preklopi</translation>
+<translation id="4308131620840579419">Želite shraniti vse kartice na enem mestu?</translation>
 <translation id="4312866146174492540">Blokira (privzeto)</translation>
 <translation id="4325863107915753736">Članka ni bilo mogoče najti</translation>
 <translation id="4326324639298822553">Preverite datum poteka veljavnosti in poskusite znova.</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Vrstica z zaznamki</translation>
 <translation id="5201306358585911203">Vdelana stran na tej spletni strani sporoča:</translation>
 <translation id="5205222826937269299">Ime je obvezno</translation>
+<translation id="5215116848420601511">Plačilna sredstva in naslovi z Googlom Pay</translation>
 <translation id="5222812217790122047">E-poštni naslov je obvezen</translation>
 <translation id="5230733896359313003">Naslov za pošiljanje</translation>
 <translation id="5250209940322997802">»Vzpostavite povezavo z omrežjem«</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Izvozi v JSON</translation>
 <translation id="5689516760719285838">Lokacija</translation>
 <translation id="570530837424789914">Upravljanje ...</translation>
+<translation id="5705882733397021510">Nazaj</translation>
 <translation id="57094364128775171">Predlagaj zapleteno geslo …</translation>
 <translation id="5710435578057952990">Identiteta tega spletnega mesta ni bila potrjena.</translation>
 <translation id="5719499550583120431">Sprejema predplačniške kartice.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Povezava z domeno <ph name="DOMAIN" /> je šifrirana z zastarelo šifrirno zbirko.</translation>
 <translation id="5813119285467412249">&amp;Uveljavi dodajanje</translation>
 <translation id="5838278095973806738">Na tem spletnem mestu ne vnašajte občutljivih informacij (npr. gesel ali številk kreditnih kartic), ker jih lahko ukradejo napadalci.</translation>
+<translation id="5863847714970149516">Stran, ki se bo odprla, vam bo morda poskusila kaj zaračunati</translation>
 <translation id="5866257070973731571">Dodajanje telefonske številke</translation>
 <translation id="5869405914158311789">Tega spletnega mesta ni mogoče doseči</translation>
 <translation id="5869522115854928033">Shranjena gesla</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Določeni so stalni strežniki proxy in URL skripta .pac.</translation>
 <translation id="6989763994942163495">Prikaži dodatne nastavitve ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Te bremenitve so lahko enkratne ali ponavljajoče se in morda niso očitne.</translation>
 <translation id="7029809446516969842">Gesla</translation>
 <translation id="7050187094878475250">Poskusili ste odpreti <ph name="DOMAIN" />, vendar je strežnik uporabil potrdilo, ki ima predolgo obdobje veljavnosti, da bi bilo verodostojno.</translation>
 <translation id="7053983685419859001">Blokiraj</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Odobritev prestreznega portala</translation>
 <translation id="8971063699422889582">Potrdilo strežnika je poteklo.</translation>
 <translation id="8978053250194585037">Google Varno brskanje je nedavno <ph name="BEGIN_LINK" />zaznalo lažno predstavljanje<ph name="END_LINK" /> na spletnem mestu <ph name="SITE" />. Spletna mesta z lažnim predstavljanjem zavajajo ljudi, tako da se izdajajo za druga spletna mesta.</translation>
+<translation id="8983003182662520383">Plačilna sredstva in naslovi z Googlom Pay</translation>
 <translation id="8987927404178983737">Mesec</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Pozor: Spletno mesto vsebuje škodljive programe.</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb
index daafb8d..f3743723 100644
--- a/components/strings/components_strings_sr.xtb
+++ b/components/strings/components_strings_sr.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Наведите додатне детаље</translation>
 <translation id="1021110881106174305">Прихваћене картице</translation>
 <translation id="1032854598605920125">Окрените у смеру казаљке на сату</translation>
+<translation id="1035334672863811645">пријавите се у Chrome</translation>
 <translation id="1038842779957582377">непознато име</translation>
 <translation id="1050038467049342496">Затворите друге апликације</translation>
 <translation id="1055184225775184556">&amp;Опозови додавање</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Ресетујте лозинку</translation>
 <translation id="4280429058323657511">, истиче <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Пређи</translation>
+<translation id="4308131620840579419">Желите ли да сачувате све картице на једном месту?</translation>
 <translation id="4312866146174492540">Блокирај (подразумевано)</translation>
 <translation id="4325863107915753736">Нисмо успели да пронађемо чланак</translation>
 <translation id="4326324639298822553">Проверите датум истека и пробајте поново</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Трака са обележивачима</translation>
 <translation id="5201306358585911203">Уграђена страница на овој веб-страници наводи:</translation>
 <translation id="5205222826937269299">Име је обавезно</translation>
+<translation id="5215116848420601511">Начини плаћања и адресе из Google Pay-а</translation>
 <translation id="5222812217790122047">Имејл је обавезан</translation>
 <translation id="5230733896359313003">Адреса за слање</translation>
 <translation id="5250209940322997802">„Повежите се на мрежу“</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Извези у JSON</translation>
 <translation id="5689516760719285838">Локација</translation>
 <translation id="570530837424789914">Управљајте...</translation>
+<translation id="5705882733397021510">Назад</translation>
 <translation id="57094364128775171">Предложи јаку лозинку…</translation>
 <translation id="5710435578057952990">Идентитет овог веб-сајта није верификован.</translation>
 <translation id="5719499550583120431">Прихватају се припејд картице.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Веза са доменом <ph name="DOMAIN" /> је шифрована помоћу застарелог пакета за шифровање.</translation>
 <translation id="5813119285467412249">&amp;Понови додавање</translation>
 <translation id="5838278095973806738">Немојте да уносите осетљиве информације на овом сајту (на пример, лозинке или кредитне картице) јер нападачи могу да их украду.</translation>
+<translation id="5863847714970149516">Следећа страница може да покуша да вам нешто наплати</translation>
 <translation id="5866257070973731571">Додајте број телефона</translation>
 <translation id="5869405914158311789">Овај сајт није доступан</translation>
 <translation id="5869522115854928033">Сачуване лозинке</translation>
@@ -820,6 +825,7 @@
 <translation id="6973656660372572881">Наведени су и фиксни прокси сервери и URL адреса .pac скрипте.</translation>
 <translation id="6989763994942163495">Прикажи напредна подешавања...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Те наплате могу да буду једнократне или периодичне и можда нису одмах видљиве.</translation>
 <translation id="7029809446516969842">Лозинке</translation>
 <translation id="7050187094878475250">Покушали сте да посетите <ph name="DOMAIN" />, али је сервер представио сертификат са периодом важења који је предугачак да би био поуздан.</translation>
 <translation id="7053983685419859001">Блокирај</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">Овлашћење на улазном порталу</translation>
 <translation id="8971063699422889582">Сертификат сервера је истекао.</translation>
 <translation id="8978053250194585037">Google безбедно прегледање је недавно <ph name="BEGIN_LINK" />открило „пецање“<ph name="END_LINK" /> на <ph name="SITE" />. Сајтови са „пецањем“ се представљају као неки други веб-сајтови да би вас преварили.</translation>
+<translation id="8983003182662520383">Начини плаћања и адресе из Google Pay-а</translation>
 <translation id="8987927404178983737">Месец</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Сајт који ћете посетити садржи штетне програме</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb
index a66aff2..81bf5f1 100644
--- a/components/strings/components_strings_sv.xtb
+++ b/components/strings/components_strings_sv.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Ange ytterligare information</translation>
 <translation id="1021110881106174305">Godkända kort</translation>
 <translation id="1032854598605920125">Rotera medurs</translation>
+<translation id="1035334672863811645">Logga in i Chrome</translation>
 <translation id="1038842779957582377">okänt namn</translation>
 <translation id="1050038467049342496">Stäng andra appar</translation>
 <translation id="1055184225775184556">&amp;Ångra Lägg till</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Återställ lösenord</translation>
 <translation id="4280429058323657511">, utgångsdatum <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Byt</translation>
+<translation id="4308131620840579419">Vill du spara alla kort på ett ställe?</translation>
 <translation id="4312866146174492540">Blockera (standard)</translation>
 <translation id="4325863107915753736">Det gick inte att hitta artikeln</translation>
 <translation id="4326324639298822553">Kontrollera utgångsdatum och försök igen</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Bokmärkesfältet</translation>
 <translation id="5201306358585911203">På en inbäddad sida på den här sidan står det</translation>
 <translation id="5205222826937269299">Namn måste anges</translation>
+<translation id="5215116848420601511">Betalningsmetoder och adresser som används med Google Pay</translation>
 <translation id="5222812217790122047">E-postadress måste anges</translation>
 <translation id="5230733896359313003">Leveransadress</translation>
 <translation id="5250209940322997802">Anslut till ett nätverk</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Exportera som JSON</translation>
 <translation id="5689516760719285838">Plats</translation>
 <translation id="570530837424789914">Hantera …</translation>
+<translation id="5705882733397021510">Tillbaka</translation>
 <translation id="57094364128775171">Föreslå ett starkt lösenord …</translation>
 <translation id="5710435578057952990">Webbplatsens identitet har inte verifierats.</translation>
 <translation id="5719499550583120431">Förbetalda kort kan användas.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Anslutningen till <ph name="DOMAIN" /> är krypterad med en gammal krypteringssvit.</translation>
 <translation id="5813119285467412249">&amp;Gör om Lägg till</translation>
 <translation id="5838278095973806738">Du bör inte ange några känsliga uppgifter på den här webbplatsen (till exempel lösenord eller kreditkortsuppgifter) eftersom hackare kan stjäla dem.</translation>
+<translation id="5863847714970149516">Sidan du är på väg till kan försöka debitera dig</translation>
 <translation id="5866257070973731571">Ange telefonnummer</translation>
 <translation id="5869405914158311789">Webbplatsen kan inte nås</translation>
 <translation id="5869522115854928033">Sparade lösenord</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Både fasta proxyservrar och en webbadress för PAC-skript anges.</translation>
 <translation id="6989763994942163495">Visa avancerade inställningar ...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Debiteringen kan göras en gång eller återkommande och det behöver inte framgå tydligt att detta händer.</translation>
 <translation id="7029809446516969842">Lösenord</translation>
 <translation id="7050187094878475250">Du försökte nå <ph name="DOMAIN" />, men servern svarade med ett certifikat vars giltighetstid är för lång för att det ska vara trovärdigt.</translation>
 <translation id="7053983685419859001">Blockera</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Auktorisering av infångstportal</translation>
 <translation id="8971063699422889582">Servercertifikatet har gått ut.</translation>
 <translation id="8978053250194585037"><ph name="BEGIN_LINK" />Nätfiske<ph name="END_LINK" /> upptäcktes nyligen av Google Säker webbsökning på <ph name="SITE" />. Webbplatser som används för nätfiske imiterar andra webbplatser i syfte att lura dig.</translation>
+<translation id="8983003182662520383">Betalningsmetoder och adresser som används med Google Pay</translation>
 <translation id="8987927404178983737">Månad</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Webbplatsen som öppnas innehåller skadliga program</translation>
diff --git a/components/strings/components_strings_sw.xtb b/components/strings/components_strings_sw.xtb
index f6678c57..455de2d 100644
--- a/components/strings/components_strings_sw.xtb
+++ b/components/strings/components_strings_sw.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Toa maelezo ya ziada</translation>
 <translation id="1021110881106174305">Kadi zinazokubaliwa</translation>
 <translation id="1032854598605920125">Zungusha kwenye mwendo wa saa</translation>
+<translation id="1035334672863811645">ingia katika Chrome</translation>
 <translation id="1038842779957582377">jina lisilojulikana</translation>
 <translation id="1050038467049342496">Funga programu nyingine</translation>
 <translation id="1055184225775184556">Tendua Kuongeza</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Badilisha nenosiri</translation>
 <translation id="4280429058323657511">, muda wa kutumika utakwisha <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Badilisha</translation>
+<translation id="4308131620840579419">Ungependa kuhifadhi kadi zako zote katika sehemu moja?</translation>
 <translation id="4312866146174492540">Zuia (chaguomsingi)</translation>
 <translation id="4325863107915753736">Haikupata makala</translation>
 <translation id="4326324639298822553">Angalia tarehe kuisha kwa muda wa matumizi halafu ujajibu tena</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Sehemu ya Alamisho</translation>
 <translation id="5201306358585911203">Ukurasa uliopachikwa kwenye ukurasa huu unasema</translation>
 <translation id="5205222826937269299">Jina linahitajika</translation>
+<translation id="5215116848420601511">Njia za kulipa na anwani zinazotumia Google Pay</translation>
 <translation id="5222812217790122047">Anwani ya barua pepe inahitajika</translation>
 <translation id="5230733896359313003">Anwani ya Mahali Bidhaa Zitakapopelekwa</translation>
 <translation id="5250209940322997802">"Unganisha kwenye mtandao"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Tuma katika mfumo wa JSON</translation>
 <translation id="5689516760719285838">Mahali</translation>
 <translation id="570530837424789914">Dhibiti...</translation>
+<translation id="5705882733397021510">Rudi Nyuma</translation>
 <translation id="57094364128775171">Pendekeza nenosiri thabiti…</translation>
 <translation id="5710435578057952990">Utambulisho wa tovuti hii haujathibitishwa.</translation>
 <translation id="5719499550583120431">Kadi za kulipia awali zinakubaliwa.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Muunganisho wako kwenye <ph name="DOMAIN" /> umesimbwa kwa njia fiche kwa kutumia mipangilio ya kriptografia ya zamani.</translation>
 <translation id="5813119285467412249">Rudia Kuongeza</translation>
 <translation id="5838278095973806738">Hupaswi kuweka maelezo nyeti kwenye tovuti hii (kwa mfano, manenosiri au kadi za mikopo), kwa sababu wavamizi wanaweza kuyaiba.</translation>
+<translation id="5863847714970149516">Huenda ukurasa unaofuata ukajaribu kukutoza pesa</translation>
 <translation id="5866257070973731571">Ongeza Nambari ya Simu</translation>
 <translation id="5869405914158311789">Imeshindwa kufungua tovuti hii</translation>
 <translation id="5869522115854928033">Manenosiri yaliyohifadhiwa</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Seva zote za proksi thabiti na URL ya hati ya .pac zimebainishwa.</translation>
 <translation id="6989763994942163495">Onyesha mipangilio ya kina...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Gharama hizi zinaweza kuwa za mara moja au za kujirudia na huenda zisiwe za moja kwa moja.</translation>
 <translation id="7029809446516969842">Manenosiri</translation>
 <translation id="7050187094878475250">Ulijaribu kufikia <ph name="DOMAIN" />, lakini seva ikawasilisha cheti ambacho muda wake sahihi ni mrefu sana wa kuweza kuaminika.</translation>
 <translation id="7053983685419859001">Zuia</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Uidhinishaji wa Ukurasa wa Wavuti</translation>
 <translation id="8971063699422889582">Cheti cha seva kimechina.</translation>
 <translation id="8978053250194585037">Mfumo wa Kuvinjari Salama kwenye Google umegundua <ph name="BEGIN_LINK" />jaribio la kuiba data ya binafsi<ph name="END_LINK" /> kwenye <ph name="SITE" /> hivi majuzi. Tovuti zanazoiba data ya binafsi huiga tovuti nyingine ili kukuhadaa.</translation>
+<translation id="8983003182662520383">Njia za Kulipa na Anwani Zinazotumia Google Pay</translation>
 <translation id="8987927404178983737">Mwezi</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Tovuti unayoelekea kufungua ina programu zinazodhuru</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index 985551c5..5b13d946 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">கூடுதல் விவரங்களை வழங்கவும்</translation>
 <translation id="1021110881106174305">ஏற்கப்படும் கார்டுகள்</translation>
 <translation id="1032854598605920125">கடிகாரத்திசையில் சுழற்று</translation>
+<translation id="1035334672863811645">Chrome இல் உள்நுழைக</translation>
 <translation id="1038842779957582377">அறியப்படாத பெயர்</translation>
 <translation id="1050038467049342496">பிற பயன்பாடுகளை மூடவும்</translation>
 <translation id="1055184225775184556">&amp;சேர்த்தலைச் செயல்தவிர்</translation>
@@ -485,6 +486,7 @@
 <translation id="4277028893293644418">கடவுச்சொல்லை மீட்டமை</translation>
 <translation id="4280429058323657511">, காலாவதித் தேதி: <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">மாறு</translation>
+<translation id="4308131620840579419">உங்கள் கார்டுகள் அனைத்தையும் ஒரே இடத்தில் சேமிக்கவா?</translation>
 <translation id="4312866146174492540">தடு (இயல்பு)</translation>
 <translation id="4325863107915753736">கட்டுரையைக் கண்டறிய முடியவில்லை</translation>
 <translation id="4326324639298822553">காலாவதித் தேதியைச் சரிபார்த்து, மீண்டும் முயலவும்</translation>
@@ -595,6 +597,7 @@
 <translation id="5190835502935405962">புக்மார்க்குகள் பட்டி</translation>
 <translation id="5201306358585911203">இந்தப் பக்கத்திலுள்ள உட்பொதிக்கப்பட்ட பக்கம் தெரிவிப்பது:</translation>
 <translation id="5205222826937269299">பெயர் தேவை</translation>
+<translation id="5215116848420601511">Google Payவைப் பயன்படுத்தும் கட்டண முறைகளும் முகவரிகளும்</translation>
 <translation id="5222812217790122047">மின்னஞ்சல் தேவை</translation>
 <translation id="5230733896359313003">ஷிப்பிங் முகவரி</translation>
 <translation id="5250209940322997802">"நெட்வொர்க்குடன் இணைக்கவும்"</translation>
@@ -671,6 +674,7 @@
 <translation id="5689199277474810259">JSONக்கு ஏற்று</translation>
 <translation id="5689516760719285838">இருப்பிடம்</translation>
 <translation id="570530837424789914">நிர்வகி...</translation>
+<translation id="5705882733397021510">பின்செல்</translation>
 <translation id="57094364128775171">வலுவான கடவுச்சொல்லைப் பரிந்துரைசெய்…</translation>
 <translation id="5710435578057952990">இந்த தளத்தின் அடையாளம் சரிபார்க்கப்படவில்லை.</translation>
 <translation id="5719499550583120431">ப்ரீபெய்டு கார்டுகள் ஏற்கப்படுகின்றன.</translation>
@@ -688,6 +692,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" />க்கான உங்கள் இணைப்பு, நடைமுறையில் இல்லாத சைபர் சூட்டைப் பயன்படுத்தி என்க்ரிப்ட் செய்யப்பட்டது.</translation>
 <translation id="5813119285467412249">&amp;சேர்த்தலை மீண்டும் செய்</translation>
 <translation id="5838278095973806738">தீங்கிழைப்பவர்கள் திருடிவிடலாம் என்பதால், இந்தத் தளத்தில் முக்கியத் தகவலை (எடுத்துக்காட்டு: கடவுச்சொற்கள் அல்லது கிரெடிட் கார்டுகள்) உள்ளிட வேண்டாம்.</translation>
+<translation id="5863847714970149516">அடுத்த பக்கத்தில் உங்களிடமிருந்து கட்டணம் வசூலிக்கப்படலாம்</translation>
 <translation id="5866257070973731571">மொபைல் எண்ணைச் சேர்க்கவும்</translation>
 <translation id="5869405914158311789">இந்தத் தளத்தை அணுக முடியவில்லை</translation>
 <translation id="5869522115854928033">சேமிக்கப்பட்ட கடவுச்சொற்கள்</translation>
@@ -817,6 +822,7 @@
 <translation id="6973656660372572881">நிலையான ப்ராக்ஸி சேவையகங்களும் .pac ஸ்கிரிப்ட் URL ஆகிய இரண்டும் குறிப்பிடப்பட்டுள்ளது.</translation>
 <translation id="6989763994942163495">மேம்பட்ட அமைப்புகளைக் காண்பி...</translation>
 <translation id="7012363358306927923">சீனா UnionPay</translation>
+<translation id="7016992613359344582">இந்தக் கட்டணங்கள் ஒருமுறை அல்லது தொடர்ந்து வசூலிக்கப்படலாம், அவை வெளிப்படையாகத் தெரிவிக்கப்படாமல் இருக்கலாம்.</translation>
 <translation id="7029809446516969842">கடவுச்சொற்கள்</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" />ஐ அடைய முயற்சித்துள்ளீர்கள், சேவையகம் வழங்கிய சான்றிதழ் நம்புவதற்கு சாத்தியமற்ற நீண்ட செல்லுபடிக்காலத்தைக் கொண்டுள்ளது.</translation>
 <translation id="7053983685419859001">தடு</translation>
@@ -1081,6 +1087,7 @@
 <translation id="8957210676456822347">கேப்டிவ் போர்டல் அங்கீகாரம்</translation>
 <translation id="8971063699422889582">சேவையகச் சான்றிதழ் காலாவதியானது.</translation>
 <translation id="8978053250194585037">சமீபத்தில் Google பாதுகாப்பான உலாவலானது <ph name="SITE" /> தளத்தில் <ph name="BEGIN_LINK" />ஃபிஷிங்கைக் கண்டறிந்தது<ph name="END_LINK" />. ஃபிஷிங் தளங்கள் பிற இணையதளங்களைப் போல் காண்பித்து, உங்களை ஏமாற்ற முயற்சிக்கக்கூடும்.</translation>
+<translation id="8983003182662520383">Google Payவைப் பயன்படுத்தும் கட்டண முறைகளும் முகவரிகளும்</translation>
 <translation id="8987927404178983737">மாதம்</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">தளத்தில் தீங்கிழைக்கும் நிரல்கள் அதிகளவில் உள்ளன</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 883ef0e..b1c9028 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">అదనపు వివరాలను అందించండి</translation>
 <translation id="1021110881106174305">ఆమోదించబడే కార్డ్‌లు</translation>
 <translation id="1032854598605920125">సవ్యదిశలో తిప్పు</translation>
+<translation id="1035334672863811645">Chromeకు సైన్ ఇన్ చేయండి</translation>
 <translation id="1038842779957582377">తెలియని పేరు</translation>
 <translation id="1050038467049342496">ఇతర అనువర్తనాలను మూసివేయండి</translation>
 <translation id="1055184225775184556">&amp;జోడించడాన్ని రద్దు చేయి</translation>
@@ -809,6 +810,7 @@
 <translation id="6897140037006041989">వినియోగదారు ప్రతినిధి</translation>
 <translation id="6903319715792422884"><ph name="BEGIN_WHITEPAPER_LINK" />కొంత సిస్టమ్ సమాచారం మరియు పేజీ కంటెంట్‌<ph name="END_WHITEPAPER_LINK" />ను Googleకి పంపడం ద్వారా సురక్షిత బ్రౌజింగ్‌ని మెరుగుపరచడంలో సహాయపడండి. <ph name="PRIVACY_PAGE_LINK" /></translation>
 <translation id="6915804003454593391">వినియోగదారు:</translation>
+<translation id="6944692733090228304"><ph name="BEGIN_BOLD" /><ph name="ORG_NAME" /><ph name="END_BOLD" /> నిర్వహించని ఒక సైట్‌లో మీరు మీ పాస్‌వర్డ్‌ని నమోదు చేసారు. మీ ఖాతాని రక్షించడం కోసం, మీ పాస్‌వర్డ్‌ని ఇతర యాప్‌లు మరియు సైట్‌లలో తిరిగి ఉపయోగించవద్దు.</translation>
 <translation id="6945221475159498467">ఎంచుకోండి</translation>
 <translation id="6948701128805548767">పికప్ పద్ధతులు మరియు అవసరాలను చూడాలంటే, చిరునామాని ఎంచుకోండి</translation>
 <translation id="6949872517221025916">పాస్‌వర్డ్‌ను రీసెట్ చేయండి</translation>
@@ -1034,6 +1036,7 @@
 <translation id="8498891568109133222"><ph name="HOST_NAME" /> ప్రతిస్పందించడానికి చాలా ఎక్కువ సమయం పట్టింది.</translation>
 <translation id="8503559462189395349">Chrome పాస్‌వర్డ్‌లు</translation>
 <translation id="8503813439785031346">యూజర్‌పేరు</translation>
+<translation id="8508648098325802031">శోధన చిహ్నం</translation>
 <translation id="8543181531796978784">మీరు <ph name="BEGIN_ERROR_LINK" />గుర్తింపు సమస్యను నివేదించవచ్చు<ph name="END_ERROR_LINK" /> లేదా మీకు మీ భద్రతకు పొంచి ఉన్న ప్రమాదాలు అర్థం అయ్యి ఉంటే, <ph name="BEGIN_LINK" />ఈ అసురక్షిత సైట్‌ను సందర్శించండి<ph name="END_LINK" />.</translation>
 <translation id="8543556556237226809">ప్రశ్నలు ఏమైనా ఉన్నాయా? మీ ప్రొఫైల్‌ను పర్యవేక్షించే వ్యక్తిని సంప్రదించండి.</translation>
 <translation id="8553075262323480129">పేజీ భాష నిర్థారించలేకపోయినందున అనువాదం విఫలమైంది.</translation>
diff --git a/components/strings/components_strings_th.xtb b/components/strings/components_strings_th.xtb
index 6ad3f3f..5796498 100644
--- a/components/strings/components_strings_th.xtb
+++ b/components/strings/components_strings_th.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">ให้รายละเอียดเพิ่มเติม</translation>
 <translation id="1021110881106174305">บัตรที่ยอมรับ</translation>
 <translation id="1032854598605920125">หมุนตามเข็มนาฬิกา</translation>
+<translation id="1035334672863811645">ลงชื่อเข้าใช้ Chrome</translation>
 <translation id="1038842779957582377">ไม่ทราบชื่อ</translation>
 <translation id="1050038467049342496">ปิดแอปอื่นๆ</translation>
 <translation id="1055184225775184556">&amp;เลิกทำการเพิ่ม</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">รีเซ็ตรหัสผ่าน</translation>
 <translation id="4280429058323657511">หมดอายุ <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">สลับ</translation>
+<translation id="4308131620840579419">เก็บบัตรทุกใบไว้ในที่เดียวไหม</translation>
 <translation id="4312866146174492540">บล็อก (ค่าเริ่มต้น)</translation>
 <translation id="4325863107915753736">การค้นหาบทความล้มเหลว</translation>
 <translation id="4326324639298822553">ตรวจสอบวันหมดอายุแล้วลองอีกครั้ง</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">แถบบุ๊กมาร์ก</translation>
 <translation id="5201306358585911203">หน้าที่ฝังไว้ในหน้าเว็บนี้บอกว่า</translation>
 <translation id="5205222826937269299">ต้องระบุชื่อ</translation>
+<translation id="5215116848420601511">วิธีการชำระเงินและที่อยู่จาก Google Pay</translation>
 <translation id="5222812217790122047">ต้องระบุอีเมล</translation>
 <translation id="5230733896359313003">ที่อยู่ในการจัดส่ง</translation>
 <translation id="5250209940322997802">"เชื่อมต่อกับเครือข่าย"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">ส่งออกไปยัง JSON</translation>
 <translation id="5689516760719285838">ตำแหน่ง</translation>
 <translation id="570530837424789914">จัดการ...</translation>
+<translation id="5705882733397021510">ย้อนกลับ</translation>
 <translation id="57094364128775171">แนะนำรหัสผ่านที่รัดกุม…</translation>
 <translation id="5710435578057952990">ข้อมูลประจำตัวของเว็บไซต์นี้ยังไม่ได้รับการยืนยัน</translation>
 <translation id="5719499550583120431">รับบัตรเติมเงิน</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">มีการเข้ารหัสการเชื่อมต่อของคุณกับ <ph name="DOMAIN" /> ด้วยชุดการเข้ารหัสที่ล้าสมัยแล้ว</translation>
 <translation id="5813119285467412249">&amp;ทำซ้ำการเพิ่ม</translation>
 <translation id="5838278095973806738">คุณไม่ควรป้อนข้อมูลที่ละเอียดอ่อนบนเว็บไซต์นี้ (ตัวอย่างเช่น รหัสผ่านหรือบัตรเครดิต) เนื่องจากผู้โจมตีอาจขโมยข้อมูลดังกล่าวไปได้</translation>
+<translation id="5863847714970149516">อาจมีการพยายามเรียกเก็บเงินจากคุณในหน้าถัดไป</translation>
 <translation id="5866257070973731571">เพิ่มหมายเลขโทรศัพท์</translation>
 <translation id="5869405914158311789">ไม่สามารถเข้าถึงเว็บไซต์นี้</translation>
 <translation id="5869522115854928033">รหัสผ่านที่บันทึกไว้</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">มีการระบุทั้งพร็อกซีเซิร์ฟเวอร์แบบคงที่และ URL สคริปต์ .pac ไว้</translation>
 <translation id="6989763994942163495">แสดงการตั้งค่าขั้นสูง...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">การเรียกเก็บเงินเหล่านี้อาจเกิดขึ้นครั้งเดียวหรือเป็นประจำ และอาจไม่แสดงอย่างชัดแจ้ง</translation>
 <translation id="7029809446516969842">รหัสผ่าน</translation>
 <translation id="7050187094878475250">คุณพยายามเข้าถึง <ph name="DOMAIN" /> แต่เซิร์ฟเวอร์ได้แสดงใบรับรองที่มีระยะเวลาที่สามารถใช้ได้นานเกินกว่าที่จะเชื่อถือได้</translation>
 <translation id="7053983685419859001">บล็อก</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">การให้สิทธิ์แคปทีฟพอร์ทัล</translation>
 <translation id="8971063699422889582">ใบรับรองของเซิร์ฟเวอร์หมดอายุแล้ว</translation>
 <translation id="8978053250194585037">เมื่อเร็วๆ นี้ Google Safe Browsing <ph name="BEGIN_LINK" />ตรวจพบฟิชชิง<ph name="END_LINK" />ใน <ph name="SITE" /> เว็บไซต์ฟิชชิงปลอมเป็นเว็บไซต์อื่นๆ เพื่อหลอกคุณ</translation>
+<translation id="8983003182662520383">วิธีการชำระเงินและที่อยู่จาก Google Pay</translation>
 <translation id="8987927404178983737">เดือน</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">ไซต์ที่จะเปิดมีโปรแกรมที่เป็นอันตราย</translation>
diff --git a/components/strings/components_strings_tr.xtb b/components/strings/components_strings_tr.xtb
index 99267be..6da1727 100644
--- a/components/strings/components_strings_tr.xtb
+++ b/components/strings/components_strings_tr.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Diğer ayrıntıları sağlayın</translation>
 <translation id="1021110881106174305">Kabul edilen kartlar</translation>
 <translation id="1032854598605920125">Saat yönünde döndür</translation>
+<translation id="1035334672863811645">Chrome'da oturum açın</translation>
 <translation id="1038842779957582377">bilinmeyen ad</translation>
 <translation id="1050038467049342496">Diğer uygulamaları kapatın</translation>
 <translation id="1055184225775184556">Eklemeyi &amp;Geri Al</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Şifreyi sıfırla</translation>
 <translation id="4280429058323657511">, son kullanma tarihi <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Anahtar</translation>
+<translation id="4308131620840579419">Tüm kartlarınız tek bir yere kaydedilsin mi?</translation>
 <translation id="4312866146174492540">Engelle (varsayılan)</translation>
 <translation id="4325863107915753736">Makale bulunamadı</translation>
 <translation id="4326324639298822553">Son kullanma tarihini kontrol edip tekrar deneyin</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Yer İşareti Çubuğu</translation>
 <translation id="5201306358585911203">Bu sayfadaki yerleşik bir sayfanın mesajı</translation>
 <translation id="5205222826937269299">Ad gerekli</translation>
+<translation id="5215116848420601511">Google Pay'i kullanan ödeme yöntemleri ve adresler</translation>
 <translation id="5222812217790122047">E-posta gerekli</translation>
 <translation id="5230733896359313003">Gönderim Adresi</translation>
 <translation id="5250209940322997802">"Ağa bağlanın"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">JSON'a aktar</translation>
 <translation id="5689516760719285838">Konum</translation>
 <translation id="570530837424789914">Yönet...</translation>
+<translation id="5705882733397021510">Geri Git</translation>
 <translation id="57094364128775171">Güçlü şifre öner…</translation>
 <translation id="5710435578057952990">Bu web sitesinin kimliği doğrulanmadı.</translation>
 <translation id="5719499550583120431">Ön ödemeli kartlar kabul edilir.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065"><ph name="DOMAIN" /> ile olan bağlantınız eski bir şifre seti kullanılarak şifrelendi.</translation>
 <translation id="5813119285467412249">Eklemeyi &amp;Yeniden Yap</translation>
 <translation id="5838278095973806738">Bu sitede hiçbir hassas bilginizi (örneğin şifrelerinizi veya kredi kartı bilgilerinizi) girmemelisiniz. Aksi takdirde bu bilgiler saldırganlar tarafından çalınabilir.</translation>
+<translation id="5863847714970149516">Gireceğiniz sayfa sizden para almaya çalışabilir</translation>
 <translation id="5866257070973731571">Telefon Numarası Ekleyin</translation>
 <translation id="5869405914158311789">Bu siteye ulaşılamıyor</translation>
 <translation id="5869522115854928033">Kayıtlı şifreler</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Hem sabit proxy sunucular hem de bir .pac komut dosyası URL'si belirtildi.</translation>
 <translation id="6989763994942163495">Gelişmiş ayarları göster...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Bu ödemeler bir defalık alınabileceği gibi yinelenen ödemeler de olabilir ve açıkça belli olmayabilir.</translation>
 <translation id="7029809446516969842">Şifreler</translation>
 <translation id="7050187094878475250"><ph name="DOMAIN" /> alan adına erişmeyi denediniz, ancak sunucu, geçerlilik dönemi güvenilir olmayacak kadar uzun olan bir sertifika sundu.</translation>
 <translation id="7053983685419859001">Engelle</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Giriş Portalı Yetkilendirmesi</translation>
 <translation id="8971063699422889582">Sunucu sertifikasının süresi doldu.</translation>
 <translation id="8978053250194585037">Google Güvenli Tarama yakın bir zamanda <ph name="SITE" /> sitesinde <ph name="BEGIN_LINK" />kimlik avı yapıldığını tespit etti<ph name="END_LINK" />. Kimlik avı siteleri sizi aldatmak için başka web siteleri gibi görünür.</translation>
+<translation id="8983003182662520383">Google Pay'i Kullanan Ödeme Yöntemleri ve Adresler</translation>
 <translation id="8987927404178983737">Ay</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Girmekte olduğunuz site zararlı programlar içermektedir</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index 9546a4b7..4916ce4f 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Надати додаткову інформацію</translation>
 <translation id="1021110881106174305">Прийняті картки</translation>
 <translation id="1032854598605920125">Обернути за годинниковою стрілкою</translation>
+<translation id="1035334672863811645">увійдіть в обліковий запис Chrome</translation>
 <translation id="1038842779957582377">Невідоме ім’я</translation>
 <translation id="1050038467049342496">Закрийте інші додатки</translation>
 <translation id="1055184225775184556">&amp;Відмінити додавання</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Скинути пароль</translation>
 <translation id="4280429058323657511">, дійсна до <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Перейти</translation>
+<translation id="4308131620840579419">Зберегти всі ваші картки в одному додатку?</translation>
 <translation id="4312866146174492540">Блокувати (за умовчанням)</translation>
 <translation id="4325863107915753736">Статтю не знайдено</translation>
 <translation id="4326324639298822553">Перевірте дату закінчення терміну дії та повторіть спробу</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Панель закладок</translation>
 <translation id="5201306358585911203">Повідомлення з вбудованої сторінки на цій сторінці</translation>
 <translation id="5205222826937269299">Укажіть ім’я</translation>
+<translation id="5215116848420601511">Способи оплати й адреси, пов’язані з Google Pay</translation>
 <translation id="5222812217790122047">Укажіть електронну адресу</translation>
 <translation id="5230733896359313003">Адреса доставки</translation>
 <translation id="5250209940322997802">"Під’єднайте пристрій до мережі"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Експортувати у формат JSON</translation>
 <translation id="5689516760719285838">Місцезнаходження</translation>
 <translation id="570530837424789914">Керувати…</translation>
+<translation id="5705882733397021510">Назад</translation>
 <translation id="57094364128775171">Запропонувати надійний пароль…</translation>
 <translation id="5710435578057952990">Ідентифікаційну інформацію цього веб-сайта не було перевірено.</translation>
 <translation id="5719499550583120431">Передплачені картки, які приймаються.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">З’єднання з доменом <ph name="DOMAIN" /> шифрується за допомогою застарілого набору шифрів.</translation>
 <translation id="5813119285467412249">&amp;Повторити додавання</translation>
 <translation id="5838278095973806738">Не вводьте конфіденційну інформацію на цьому сайті (як-от паролі й дані кредитних карток). Зловмисники можуть викрасти її.</translation>
+<translation id="5863847714970149516">Наступна сторінка може спробувати стягнути плату</translation>
 <translation id="5866257070973731571">Додайте номер телефону</translation>
 <translation id="5869405914158311789">Немає зв’язку із сайтом</translation>
 <translation id="5869522115854928033">Збережені паролі</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Указано фіксовані проксі-сервери та URL-адреса сценарію .pac.</translation>
 <translation id="6989763994942163495">Показати розширені налаштування...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Такі стягнення можуть бути одноразовими чи регулярними й неочевидними.</translation>
 <translation id="7029809446516969842">Паролі</translation>
 <translation id="7050187094878475250">Ви намагалися зв’язатися з доменом <ph name="DOMAIN" />, але сервер надав сертифікат із задовгим терміном дії.</translation>
 <translation id="7053983685419859001">Блокувати</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Авторизація приєднаного порталу</translation>
 <translation id="8971063699422889582">Термін дії сертифіката сервера завершився.</translation>
 <translation id="8978053250194585037">Функція безпечного перегляду від Google нещодавно <ph name="BEGIN_LINK" />виявила фішинг<ph name="END_LINK" /> на сайті <ph name="SITE" />. Фішингові сайти видають себе за інші сайти, щоб ошукати вас.</translation>
+<translation id="8983003182662520383">Способи оплати й адреси, пов’язані з Google Pay</translation>
 <translation id="8987927404178983737">Місяць</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Сайт містить шкідливі програми</translation>
diff --git a/components/strings/components_strings_vi.xtb b/components/strings/components_strings_vi.xtb
index f5f453a..ad78e75 100644
--- a/components/strings/components_strings_vi.xtb
+++ b/components/strings/components_strings_vi.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">Cung cấp chi tiết bổ sung</translation>
 <translation id="1021110881106174305">Thẻ được chấp nhận</translation>
 <translation id="1032854598605920125">Xoay theo chiều kim đồng hồ</translation>
+<translation id="1035334672863811645">đăng nhập vào Chrome</translation>
 <translation id="1038842779957582377">tên không biết</translation>
 <translation id="1050038467049342496">Đóng các ứng dụng khác</translation>
 <translation id="1055184225775184556">&amp;Hoàn tác thêm</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">Đặt lại mật khẩu</translation>
 <translation id="4280429058323657511">, hết hạn <ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">Chuyển</translation>
+<translation id="4308131620840579419">Lưu tất cả thẻ của bạn ở cùng một nơi?</translation>
 <translation id="4312866146174492540">Chặn (mặc định)</translation>
 <translation id="4325863107915753736">Không tìm được bài viết</translation>
 <translation id="4326324639298822553">Kiểm tra ngày hết hạn của bạn và thử lại</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">Thanh Dấu trang</translation>
 <translation id="5201306358585911203">Một trang được nhúng trên trang này cho biết</translation>
 <translation id="5205222826937269299">Cần có tên</translation>
+<translation id="5215116848420601511">Địa chỉ và phương thức thanh toán sử dụng Google Pay</translation>
 <translation id="5222812217790122047">Cần có email</translation>
 <translation id="5230733896359313003">Địa chỉ giao hàng</translation>
 <translation id="5250209940322997802">"Kết nối với mạng"</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">Xuất sang định dạng JSON</translation>
 <translation id="5689516760719285838">Vị trí</translation>
 <translation id="570530837424789914">Quản lý...</translation>
+<translation id="5705882733397021510">Quay lại</translation>
 <translation id="57094364128775171">Đề xuất mật khẩu mạnh…</translation>
 <translation id="5710435578057952990">Nhận dạng trang web này chưa được xác minh.</translation>
 <translation id="5719499550583120431">Thẻ trả trước được chấp nhận.</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">Kết nối của bạn tới <ph name="DOMAIN" /> được mã hóa bằng bộ số 0 đã lỗi thời.</translation>
 <translation id="5813119285467412249">&amp;Làm lại thêm</translation>
 <translation id="5838278095973806738">Bạn không nên nhập bất kỳ thông tin nhạy cảm nào trên trang web này (ví dụ: mật khẩu hoặc thẻ tín dụng), vì những kẻ tấn công có thể đánh cắp thông tin đó.</translation>
+<translation id="5863847714970149516">Trang phía trước có thể tìm cách tính phí bạn</translation>
 <translation id="5866257070973731571">Thêm số điện thoại</translation>
 <translation id="5869405914158311789">Không thể truy cập trang web này</translation>
 <translation id="5869522115854928033">Mật khẩu đã lưu</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">Cả hai máy chủ proxy cố định và URL tập lệnh .pac đều được chỉ định.</translation>
 <translation id="6989763994942163495">Hiển thị cài đặt nâng cao...</translation>
 <translation id="7012363358306927923">China UnionPay</translation>
+<translation id="7016992613359344582">Các khoản phí này có thể là khoản thu một lần hoặc định kỳ và có thể không rõ ràng.</translation>
 <translation id="7029809446516969842">Mật khẩu</translation>
 <translation id="7050187094878475250">Bạn đã cố gắng truy cập <ph name="DOMAIN" /> nhưng máy chủ đã hiển thị chứng chỉ có thời gian hiệu lực quá dài để có thể tin cậy.</translation>
 <translation id="7053983685419859001">Chặn</translation>
@@ -1086,6 +1092,7 @@
 <translation id="8957210676456822347">Ủy quyền cổng bị khóa</translation>
 <translation id="8971063699422889582">Chứng chỉ của máy chủ đã hết hạn.</translation>
 <translation id="8978053250194585037">Tính năng Duyệt web an toàn của Google gần đây đã <ph name="BEGIN_LINK" />phát hiện dấu hiệu lừa đảo<ph name="END_LINK" /> trên <ph name="SITE" />. Các trang web lừa đảo sẽ giả mạo các trang web khác để đánh lừa bạn.</translation>
+<translation id="8983003182662520383">Địa chỉ và phương thức thanh toán sử dụng Google Pay</translation>
 <translation id="8987927404178983737">Tháng</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">Trang web sắp truy cập chứa chương trình độc hại</translation>
diff --git a/components/strings/components_strings_zh-CN.xtb b/components/strings/components_strings_zh-CN.xtb
index eff79491..ea7daf0 100644
--- a/components/strings/components_strings_zh-CN.xtb
+++ b/components/strings/components_strings_zh-CN.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">提供其他详细信息</translation>
 <translation id="1021110881106174305">接受的信用卡</translation>
 <translation id="1032854598605920125">顺时针旋转</translation>
+<translation id="1035334672863811645">登录 Chrome</translation>
 <translation id="1038842779957582377">未知名称</translation>
 <translation id="1050038467049342496">关闭其他应用</translation>
 <translation id="1055184225775184556">撤消添加(&amp;U)</translation>
diff --git a/components/strings/components_strings_zh-TW.xtb b/components/strings/components_strings_zh-TW.xtb
index 617d037..a81e4e8 100644
--- a/components/strings/components_strings_zh-TW.xtb
+++ b/components/strings/components_strings_zh-TW.xtb
@@ -6,6 +6,7 @@
 <translation id="1015730422737071372">提供其他詳細資訊</translation>
 <translation id="1021110881106174305">接受的信用卡</translation>
 <translation id="1032854598605920125">順時針旋轉</translation>
+<translation id="1035334672863811645">登入 Chrome</translation>
 <translation id="1038842779957582377">不明名稱</translation>
 <translation id="1050038467049342496">關閉其他應用程式</translation>
 <translation id="1055184225775184556">復原新增(&amp;U)</translation>
@@ -488,6 +489,7 @@
 <translation id="4277028893293644418">重設密碼</translation>
 <translation id="4280429058323657511">,到期日:<ph name="EXPIRATION_DATE_ABBR" /></translation>
 <translation id="4305817255990598646">切換</translation>
+<translation id="4308131620840579419">要集中儲存所有卡片嗎?</translation>
 <translation id="4312866146174492540">封鎖 (預設)</translation>
 <translation id="4325863107915753736">找不到文章</translation>
 <translation id="4326324639298822553">請檢查信用卡到期日,然後再試一次</translation>
@@ -598,6 +600,7 @@
 <translation id="5190835502935405962">書籤列</translation>
 <translation id="5201306358585911203">這個網頁上的嵌入式網頁顯示</translation>
 <translation id="5205222826937269299">請輸入名稱</translation>
+<translation id="5215116848420601511">儲存在 Google Pay 的付款方式和地址資訊</translation>
 <translation id="5222812217790122047">請輸入電子郵件地址</translation>
 <translation id="5230733896359313003">運送地址</translation>
 <translation id="5250209940322997802">「連線至網路」</translation>
@@ -674,6 +677,7 @@
 <translation id="5689199277474810259">以 JSON 格式匯出</translation>
 <translation id="5689516760719285838">位置</translation>
 <translation id="570530837424789914">管理...</translation>
+<translation id="5705882733397021510">返回</translation>
 <translation id="57094364128775171">建議高強度密碼…</translation>
 <translation id="5710435578057952990">此網頁的身分未經驗證。</translation>
 <translation id="5719499550583120431">接受預付卡。</translation>
@@ -691,6 +695,7 @@
 <translation id="5810442152076338065">您的 <ph name="DOMAIN" /> 連線使用過舊的加密套件進行加密。</translation>
 <translation id="5813119285467412249">重做新增(&amp;R)</translation>
 <translation id="5838278095973806738">請勿在這個網站上輸入任何機密資訊 (例如密碼或信用卡號碼),以免遭到攻擊者竊取。</translation>
+<translation id="5863847714970149516">進入接下來的頁面後,系統可能會向您收取費用</translation>
 <translation id="5866257070973731571">新增電話號碼</translation>
 <translation id="5869405914158311789">無法連上這個網站</translation>
 <translation id="5869522115854928033">已儲存的密碼</translation>
@@ -821,6 +826,7 @@
 <translation id="6973656660372572881">已指定固定的 Proxy 伺服器和 .pac 指令碼網址。</translation>
 <translation id="6989763994942163495">顯示進階設定...</translation>
 <translation id="7012363358306927923">中國銀聯</translation>
+<translation id="7016992613359344582">這些費用可能只收取一次,也可能週期性收取,而且您可能不會注意到這筆費用。</translation>
 <translation id="7029809446516969842">密碼</translation>
 <translation id="7050187094878475250">您嘗試連線至 <ph name="DOMAIN" />,但伺服器提供的憑證有效期限太長,因此難以信任。</translation>
 <translation id="7053983685419859001">封鎖</translation>
@@ -1085,6 +1091,7 @@
 <translation id="8957210676456822347">監控式入口網站授權</translation>
 <translation id="8971063699422889582">伺服器憑證已過期。</translation>
 <translation id="8978053250194585037">Google 安全瀏覽功能最近在 <ph name="SITE" /> 上<ph name="BEGIN_LINK" />偵測到網路詐騙行為<ph name="END_LINK" />。詐騙網站會偽裝成其他網站,藉此騙取你的資訊。</translation>
+<translation id="8983003182662520383">儲存在 Google Pay 的付款方式和地址資訊</translation>
 <translation id="8987927404178983737">月</translation>
 <translation id="8989148748219918422"><ph name="ORGANIZATION" /> [<ph name="COUNTRY" />]</translation>
 <translation id="8996941253935762404">你要瀏覽的網站含有有害程式</translation>
diff --git a/components/subresource_filter/content/browser/content_ruleset_service.cc b/components/subresource_filter/content/browser/content_ruleset_service.cc
index a78b249b..03d3ead 100644
--- a/components/subresource_filter/content/browser/content_ruleset_service.cc
+++ b/components/subresource_filter/content/browser/content_ruleset_service.cc
@@ -10,7 +10,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/subresource_filter/content/common/subresource_filter_messages.h"
 #include "components/subresource_filter/core/browser/ruleset_service.h"
 #include "components/subresource_filter/core/common/common_features.h"
diff --git a/components/suggestions/image_manager.cc b/components/suggestions/image_manager.cc
index 275ac3f..2466524 100644
--- a/components/suggestions/image_manager.cc
+++ b/components/suggestions/image_manager.cc
@@ -9,7 +9,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "components/image_fetcher/core/image_fetcher.h"
 #include "components/suggestions/image_encoder.h"
diff --git a/components/suggestions/suggestions_service_impl_unittest.cc b/components/suggestions/suggestions_service_impl_unittest.cc
index f836aa9..3e0b927 100644
--- a/components/suggestions/suggestions_service_impl_unittest.cc
+++ b/components/suggestions/suggestions_service_impl_unittest.cc
@@ -89,7 +89,7 @@
   MockSyncService() {}
   ~MockSyncService() override {}
   MOCK_CONST_METHOD0(GetDisableReasons, int());
-  MOCK_CONST_METHOD0(GetState, State());
+  MOCK_CONST_METHOD0(GetTransportState, TransportState());
   MOCK_CONST_METHOD0(IsLocalSyncEnabled, bool());
   MOCK_CONST_METHOD0(IsUsingSecondaryPassphrase, bool());
   MOCK_CONST_METHOD0(GetPreferredDataTypes, syncer::ModelTypeSet());
@@ -153,9 +153,9 @@
     EXPECT_CALL(*sync_service(), GetDisableReasons())
         .Times(AnyNumber())
         .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE));
-    EXPECT_CALL(*sync_service(), GetState())
+    EXPECT_CALL(*sync_service(), GetTransportState())
         .Times(AnyNumber())
-        .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+        .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
     EXPECT_CALL(*sync_service(), IsLocalSyncEnabled())
         .Times(AnyNumber())
         .WillRepeatedly(Return(false));
@@ -357,8 +357,9 @@
 // This should *not* result in an automatic fetch.
 TEST_F(SuggestionsServiceTest, DoesNotFetchOnStartup) {
   // The sync service starts out inactive.
-  EXPECT_CALL(*sync_service(), GetState())
-      .WillRepeatedly(Return(syncer::SyncService::State::INITIALIZING));
+  EXPECT_CALL(*sync_service(), GetTransportState())
+      .WillRepeatedly(
+          Return(syncer::SyncService::TransportState::INITIALIZING));
   static_cast<SyncServiceObserver*>(suggestions_service())
       ->OnStateChanged(sync_service());
 
@@ -366,8 +367,8 @@
   ASSERT_FALSE(suggestions_service()->HasPendingRequestForTesting());
 
   // Sync getting enabled should not result in a fetch.
-  EXPECT_CALL(*sync_service(), GetState())
-      .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+  EXPECT_CALL(*sync_service(), GetTransportState())
+      .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
   static_cast<SyncServiceObserver*>(suggestions_service())
       ->OnStateChanged(sync_service());
 
@@ -400,8 +401,9 @@
 }
 
 TEST_F(SuggestionsServiceTest, FetchSuggestionsDataSyncNotInitializedEnabled) {
-  EXPECT_CALL(*sync_service(), GetState())
-      .WillRepeatedly(Return(syncer::SyncService::State::INITIALIZING));
+  EXPECT_CALL(*sync_service(), GetTransportState())
+      .WillRepeatedly(
+          Return(syncer::SyncService::TransportState::INITIALIZING));
   static_cast<SyncServiceObserver*>(suggestions_service())
       ->OnStateChanged(sync_service());
 
@@ -427,8 +429,8 @@
   EXPECT_CALL(*sync_service(), GetDisableReasons())
       .Times(AnyNumber())
       .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_USER_CHOICE));
-  EXPECT_CALL(*sync_service(), GetState())
-      .WillRepeatedly(Return(syncer::SyncService::State::DISABLED));
+  EXPECT_CALL(*sync_service(), GetTransportState())
+      .WillRepeatedly(Return(syncer::SyncService::TransportState::DISABLED));
 
   base::MockCallback<SuggestionsService::ResponseCallback> callback;
   auto subscription = suggestions_service()->AddCallback(callback.Get());
diff --git a/components/sync/device_info/local_device_info_provider_impl.cc b/components/sync/device_info/local_device_info_provider_impl.cc
index 00b4a44..86499009 100644
--- a/components/sync/device_info/local_device_info_provider_impl.cc
+++ b/components/sync/device_info/local_device_info_provider_impl.cc
@@ -5,7 +5,7 @@
 #include "components/sync/device_info/local_device_info_provider_impl.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/sync/base/get_session_name.h"
 #include "components/sync/driver/sync_util.h"
diff --git a/components/sync/driver/about_sync_util.cc b/components/sync/driver/about_sync_util.cc
index ad69928..44c91e02 100644
--- a/components/sync/driver/about_sync_util.cc
+++ b/components/sync/driver/about_sync_util.cc
@@ -176,6 +176,9 @@
 };
 
 std::string GetDisableReasonsString(int disable_reasons) {
+  if (disable_reasons == syncer::SyncService::DISABLE_REASON_NONE) {
+    return "None";
+  }
   std::vector<std::string> reason_strings;
   if (disable_reasons & syncer::SyncService::DISABLE_REASON_PLATFORM_OVERRIDE)
     reason_strings.push_back("Platform override");
@@ -190,22 +193,21 @@
   return base::JoinString(reason_strings, ", ");
 }
 
-std::string GetSummaryString(syncer::SyncService::State state,
-                             int disable_reasons) {
+std::string GetTransportStateString(syncer::SyncService::TransportState state) {
   switch (state) {
-    case syncer::SyncService::State::DISABLED:
-      return "Disabled (" + GetDisableReasonsString(disable_reasons) + ")";
-    case syncer::SyncService::State::WAITING_FOR_START_REQUEST:
+    case syncer::SyncService::TransportState::DISABLED:
+      return "Disabled";
+    case syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST:
       return "Waiting for start request";
-    case syncer::SyncService::State::START_DEFERRED:
+    case syncer::SyncService::TransportState::START_DEFERRED:
       return "Start deferred";
-    case syncer::SyncService::State::INITIALIZING:
+    case syncer::SyncService::TransportState::INITIALIZING:
       return "Initializing";
-    case syncer::SyncService::State::PENDING_DESIRED_CONFIGURATION:
+    case syncer::SyncService::TransportState::PENDING_DESIRED_CONFIGURATION:
       return "Pending desired configuration";
-    case syncer::SyncService::State::CONFIGURING:
+    case syncer::SyncService::TransportState::CONFIGURING:
       return "Configuring data types";
-    case syncer::SyncService::State::ACTIVE:
+    case syncer::SyncService::TransportState::ACTIVE:
       return "Active";
   }
   NOTREACHED();
@@ -299,7 +301,12 @@
   SectionList section_list;
 
   Section* section_summary = section_list.AddSection("Summary");
-  Stat<std::string>* summary_string = section_summary->AddStringStat("Summary");
+  Stat<std::string>* transport_state =
+      section_summary->AddStringStat("Transport State");
+  Stat<std::string>* disable_reasons =
+      section_summary->AddStringStat("Disable Reasons");
+  Stat<bool>* feature_enabled =
+      section_summary->AddBoolStat("Sync Feature Enabled");
 
   Section* section_version = section_list.AddSection("Version Info");
   Stat<std::string>* client_version =
@@ -422,14 +429,15 @@
   client_version->Set(GetVersionString(channel));
 
   if (!service) {
-    summary_string->Set("Sync service does not exist");
+    transport_state->Set("Sync service does not exist");
     about_info->SetKey(kDetailsKey, section_list.ToValue());
     return about_info;
   }
 
   // Summary.
-  summary_string->Set(
-      GetSummaryString(service->GetState(), service->GetDisableReasons()));
+  transport_state->Set(GetTransportStateString(service->GetTransportState()));
+  disable_reasons->Set(GetDisableReasonsString(service->GetDisableReasons()));
+  feature_enabled->Set(service->IsSyncFeatureEnabled());
 
   SyncStatus full_status;
   bool is_status_valid = service->QueryDetailedSyncStatus(&full_status);
diff --git a/components/sync/driver/async_directory_type_controller.cc b/components/sync/driver/async_directory_type_controller.cc
index f02509b..f91881f 100644
--- a/components/sync/driver/async_directory_type_controller.cc
+++ b/components/sync/driver/async_directory_type_controller.cc
@@ -47,8 +47,8 @@
     const ConfigureContext& configure_context,
     const ModelLoadCallback& model_load_callback) {
   DCHECK(CalledOnValidThread());
-  DCHECK_EQ(configure_context.storage_option,
-            ConfigureContext::STORAGE_ON_DISK);
+  DCHECK_EQ(configure_context.storage_option, ConfigureContext::STORAGE_ON_DISK)
+      << " for type " << ModelTypeToString(type());
 
   model_load_callback_ = model_load_callback;
 
diff --git a/components/sync/driver/fake_sync_client.cc b/components/sync/driver/fake_sync_client.cc
index 321b253..6f67be799 100644
--- a/components/sync/driver/fake_sync_client.cc
+++ b/components/sync/driver/fake_sync_client.cc
@@ -103,7 +103,7 @@
 
 base::WeakPtr<ModelTypeControllerDelegate>
 FakeSyncClient::GetControllerDelegateForModelType(ModelType type) {
-  return bridge_->change_processor()->GetControllerDelegateOnUIThread();
+  return bridge_->change_processor()->GetControllerDelegate();
 }
 
 scoped_refptr<ModelSafeWorker> FakeSyncClient::CreateModelWorkerForGroup(
diff --git a/components/sync/driver/fake_sync_service.cc b/components/sync/driver/fake_sync_service.cc
index a23790f..15d7f086 100644
--- a/components/sync/driver/fake_sync_service.cc
+++ b/components/sync/driver/fake_sync_service.cc
@@ -39,23 +39,23 @@
   return DISABLE_REASON_PLATFORM_OVERRIDE;
 }
 
-syncer::SyncService::State FakeSyncService::GetState() const {
+syncer::SyncService::TransportState FakeSyncService::GetTransportState() const {
   // This is a temporary partial copy of the real implementation in
   // ProfileSyncService, containing only the things that exist in the
   // FakeSyncService. If subclasses override some of the individual getters,
   // this should still return a reasonable result.
   if (GetDisableReasons() != DISABLE_REASON_NONE) {
-    return State::DISABLED;
+    return TransportState::DISABLED;
   }
   // From this point on, Sync can start in principle.
   DCHECK(CanSyncStart());
   if (!IsFirstSetupComplete()) {
-    return State::PENDING_DESIRED_CONFIGURATION;
+    return TransportState::PENDING_DESIRED_CONFIGURATION;
   }
   if (!configuration_done_) {
-    return State::CONFIGURING;
+    return TransportState::CONFIGURING;
   }
-  return State::ACTIVE;
+  return TransportState::ACTIVE;
 }
 
 bool FakeSyncService::IsFirstSetupComplete() const {
diff --git a/components/sync/driver/fake_sync_service.h b/components/sync/driver/fake_sync_service.h
index 80ef4e7..721af211 100644
--- a/components/sync/driver/fake_sync_service.h
+++ b/components/sync/driver/fake_sync_service.h
@@ -40,7 +40,7 @@
   // Dummy methods.
   // SyncService implementation.
   int GetDisableReasons() const override;
-  State GetState() const override;
+  TransportState GetTransportState() const override;
   bool IsFirstSetupComplete() const override;
   bool IsLocalSyncEnabled() const override;
   void TriggerRefresh(const ModelTypeSet& types) override;
diff --git a/components/sync/driver/sync_service.cc b/components/sync/driver/sync_service.cc
index aa3e6846..dc67a40e 100644
--- a/components/sync/driver/sync_service.cc
+++ b/components/sync/driver/sync_service.cc
@@ -22,15 +22,15 @@
 }
 
 bool SyncService::IsEngineInitialized() const {
-  switch (GetState()) {
-    case State::DISABLED:
-    case State::WAITING_FOR_START_REQUEST:
-    case State::START_DEFERRED:
-    case State::INITIALIZING:
+  switch (GetTransportState()) {
+    case TransportState::DISABLED:
+    case TransportState::WAITING_FOR_START_REQUEST:
+    case TransportState::START_DEFERRED:
+    case TransportState::INITIALIZING:
       return false;
-    case State::PENDING_DESIRED_CONFIGURATION:
-    case State::CONFIGURING:
-    case State::ACTIVE:
+    case TransportState::PENDING_DESIRED_CONFIGURATION:
+    case TransportState::CONFIGURING:
+    case TransportState::ACTIVE:
       return true;
   }
   NOTREACHED();
@@ -41,15 +41,15 @@
   if (!IsSyncFeatureEnabled()) {
     return false;
   }
-  switch (GetState()) {
-    case State::DISABLED:
-    case State::WAITING_FOR_START_REQUEST:
-    case State::START_DEFERRED:
-    case State::INITIALIZING:
-    case State::PENDING_DESIRED_CONFIGURATION:
+  switch (GetTransportState()) {
+    case TransportState::DISABLED:
+    case TransportState::WAITING_FOR_START_REQUEST:
+    case TransportState::START_DEFERRED:
+    case TransportState::INITIALIZING:
+    case TransportState::PENDING_DESIRED_CONFIGURATION:
       return false;
-    case State::CONFIGURING:
-    case State::ACTIVE:
+    case TransportState::CONFIGURING:
+    case TransportState::ACTIVE:
       return true;
   }
   NOTREACHED();
diff --git a/components/sync/driver/sync_service.h b/components/sync/driver/sync_service.h
index 7f4e1cda..9a909596 100644
--- a/components/sync/driver/sync_service.h
+++ b/components/sync/driver/sync_service.h
@@ -84,7 +84,7 @@
   };
 
   // The overall state of the SyncService, in ascending order of "activeness".
-  enum class State {
+  enum class TransportState {
     // Sync is inactive, e.g. due to enterprise policy, or simply because there
     // is no authenticated user.
     DISABLED,
@@ -152,14 +152,14 @@
     return GetDisableReasons() & reason;
   }
 
-  // Returns the overall state of the SyncService. See the enum definition for
-  // what the individual states mean.
+  // Returns the overall state of the SyncService transport layer. See the enum
+  // definition for what the individual states mean.
   // Note: This refers to Sync-the-transport, which may be active even if
   // Sync-the-feature is disabled by the user, by enterprise policy, etc.
   // Note: If your question is "Are we actually sending this data to Google?" or
   // "Am I allowed to send this type of data to Google?", you probably want
   // syncer::GetUploadToGoogleState instead of this.
-  virtual State GetState() const = 0;
+  virtual TransportState GetTransportState() const = 0;
 
   // Returns true if the local sync backend server has been enabled through a
   // command line flag or policy. In this case sync is considered active but any
diff --git a/components/sync/driver/sync_service_utils.cc b/components/sync/driver/sync_service_utils.cc
index 4c088772..185d2bf 100644
--- a/components/sync/driver/sync_service_utils.cc
+++ b/components/sync/driver/sync_service_utils.cc
@@ -38,18 +38,18 @@
     return UploadState::NOT_ACTIVE;
   }
 
-  switch (sync_service->GetState()) {
-    case SyncService::State::DISABLED:
+  switch (sync_service->GetTransportState()) {
+    case SyncService::TransportState::DISABLED:
       return UploadState::NOT_ACTIVE;
 
-    case SyncService::State::WAITING_FOR_START_REQUEST:
-    case SyncService::State::START_DEFERRED:
-    case SyncService::State::INITIALIZING:
-    case SyncService::State::PENDING_DESIRED_CONFIGURATION:
-    case SyncService::State::CONFIGURING:
+    case SyncService::TransportState::WAITING_FOR_START_REQUEST:
+    case SyncService::TransportState::START_DEFERRED:
+    case SyncService::TransportState::INITIALIZING:
+    case SyncService::TransportState::PENDING_DESIRED_CONFIGURATION:
+    case SyncService::TransportState::CONFIGURING:
       return UploadState::INITIALIZING;
 
-    case SyncService::State::ACTIVE:
+    case SyncService::TransportState::ACTIVE:
       // If sync is active, but the data type in question still isn't, then
       // something must have gone wrong with that data type.
       if (!sync_service->GetActiveDataTypes().Has(type)) {
diff --git a/components/sync/driver/sync_service_utils_unittest.cc b/components/sync/driver/sync_service_utils_unittest.cc
index ec7cab8..5c45ae41 100644
--- a/components/sync/driver/sync_service_utils_unittest.cc
+++ b/components/sync/driver/sync_service_utils_unittest.cc
@@ -20,7 +20,7 @@
   void SetDisableReasons(int disable_reasons) {
     disable_reasons_ = disable_reasons;
   }
-  void SetState(State state) { state_ = state; }
+  void SetTransportState(TransportState state) { state_ = state; }
   void SetLocalSyncEnabled(bool local) { local_sync_enabled_ = local; }
   void SetPreferredDataTypes(const ModelTypeSet& types) {
     preferred_data_types_ = types;
@@ -35,7 +35,7 @@
 
   // SyncService implementation.
   int GetDisableReasons() const override { return disable_reasons_; }
-  State GetState() const override { return state_; }
+  TransportState GetTransportState() const override { return state_; }
   bool IsLocalSyncEnabled() const override { return local_sync_enabled_; }
   bool IsFirstSetupComplete() const override { return true; }
   ModelTypeSet GetPreferredDataTypes() const override {
@@ -76,7 +76,7 @@
 
  private:
   int disable_reasons_ = DISABLE_REASON_PLATFORM_OVERRIDE;
-  State state_ = State::DISABLED;
+  TransportState state_ = TransportState::DISABLED;
   bool sync_cycle_complete_ = false;
   bool local_sync_enabled_ = false;
   ModelTypeSet preferred_data_types_;
@@ -101,7 +101,8 @@
   // Once sync gets allowed (e.g. policy is updated), uploading should not be
   // disabled anymore (though not necessarily active yet).
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
-  service.SetState(syncer::SyncService::State::WAITING_FOR_START_REQUEST);
+  service.SetTransportState(
+      syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST);
 
   EXPECT_NE(UploadState::NOT_ACTIVE,
             GetUploadToGoogleState(&service, syncer::BOOKMARKS));
@@ -111,7 +112,8 @@
      UploadToGoogleInitializingUntilConfiguredAndActiveAndSyncCycleComplete) {
   TestSyncService service;
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
-  service.SetState(syncer::SyncService::State::WAITING_FOR_START_REQUEST);
+  service.SetTransportState(
+      syncer::SyncService::TransportState::WAITING_FOR_START_REQUEST);
   service.SetPreferredDataTypes(ProtocolTypes());
   service.SetActiveDataTypes(ProtocolTypes());
 
@@ -120,7 +122,7 @@
             GetUploadToGoogleState(&service, syncer::BOOKMARKS));
 
   // Finished configuration is not enough, still INITIALIZING.
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   EXPECT_EQ(UploadState::INITIALIZING,
             GetUploadToGoogleState(&service, syncer::BOOKMARKS));
 
@@ -133,7 +135,7 @@
 TEST(SyncServiceUtilsTest, UploadToGoogleDisabledForModelType) {
   TestSyncService service;
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   service.SetSyncCycleComplete(true);
 
   // Sync is enabled only for a specific model type.
@@ -156,7 +158,7 @@
      UploadToGoogleDisabledForModelTypeThatFailedToStart) {
   TestSyncService service;
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   service.SetSyncCycleComplete(true);
 
   // Sync is enabled for some model types.
@@ -179,7 +181,7 @@
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
   service.SetPreferredDataTypes(ProtocolTypes());
   service.SetActiveDataTypes(ProtocolTypes());
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   service.SetSyncCycleComplete(true);
 
   // Sanity check: Upload is active now.
@@ -199,7 +201,7 @@
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
   service.SetPreferredDataTypes(ProtocolTypes());
   service.SetActiveDataTypes(ProtocolTypes());
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   service.SetSyncCycleComplete(true);
 
   // Sanity check: Upload is active now.
@@ -228,7 +230,7 @@
   // Once the auth error is resolved (e.g. user re-authenticated), uploading is
   // active again.
   service.set_auth_error(GoogleServiceAuthError(GoogleServiceAuthError::NONE));
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
 
   EXPECT_EQ(UploadState::ACTIVE,
             GetUploadToGoogleState(&service, syncer::BOOKMARKS));
@@ -239,7 +241,7 @@
   service.SetDisableReasons(syncer::SyncService::DISABLE_REASON_NONE);
   service.SetPreferredDataTypes(ProtocolTypes());
   service.SetActiveDataTypes(ProtocolTypes());
-  service.SetState(syncer::SyncService::State::ACTIVE);
+  service.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   service.SetSyncCycleComplete(true);
 
   // Sanity check: Upload is ACTIVE, even for data types that are always
diff --git a/components/sync/engine/sequenced_model_worker_unittest.cc b/components/sync/engine/sequenced_model_worker_unittest.cc
index 99f58353..ace1540 100644
--- a/components/sync/engine/sequenced_model_worker_unittest.cc
+++ b/components/sync/engine/sequenced_model_worker_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/location.h"
 #include "base/memory/weak_ptr.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/components/sync/engine_impl/uss_migrator.cc b/components/sync/engine_impl/uss_migrator.cc
index 020d4025..2f63f19 100644
--- a/components/sync/engine_impl/uss_migrator.cc
+++ b/components/sync/engine_impl/uss_migrator.cc
@@ -42,6 +42,16 @@
   entity->set_name(entry.GetServerNonUniqueName());
   entity->set_deleted(entry.GetServerIsDel());
   entity->set_client_defined_unique_tag(entry.GetUniqueClientTag());
+  // Required fields for bookmarks only.
+  entity->set_folder(entry.GetServerIsDir());
+  if (!entry.GetServerParentId().IsNull()) {
+    entity->set_parent_id_string(entry.GetServerParentId().GetServerId());
+  }
+  if (entry.GetServerUniquePosition().IsValid()) {
+    *entity->mutable_unique_position() =
+        entry.GetServerUniquePosition().ToProto();
+  }
+  entity->set_server_defined_unique_tag(entry.GetUniqueServerTag());
 
   // It looks like there are fancy other ways to get e.g. passwords specifics
   // out of Entry. Do we need to special-case them when we ship those types?
@@ -61,7 +71,6 @@
                                        UserShare* user_share,
                                        ModelTypeWorker* worker,
                                        int batch_size) {
-  DCHECK_NE(BOOKMARKS, type);
   DCHECK_NE(PASSWORDS, type);
   ReadTransaction trans(FROM_HERE, user_share);
 
diff --git a/components/sync/model/fake_model_type_change_processor.cc b/components/sync/model/fake_model_type_change_processor.cc
index 0eb8f15b..92fd5dd5 100644
--- a/components/sync/model/fake_model_type_change_processor.cc
+++ b/components/sync/model/fake_model_type_change_processor.cc
@@ -62,7 +62,7 @@
 }
 
 base::WeakPtr<ModelTypeControllerDelegate>
-FakeModelTypeChangeProcessor::GetControllerDelegateOnUIThread() {
+FakeModelTypeChangeProcessor::GetControllerDelegate() {
   return delegate_;
 }
 
diff --git a/components/sync/model/fake_model_type_change_processor.h b/components/sync/model/fake_model_type_change_processor.h
index 581abb0..3a23d50d 100644
--- a/components/sync/model/fake_model_type_change_processor.h
+++ b/components/sync/model/fake_model_type_change_processor.h
@@ -41,8 +41,7 @@
   void ModelReadyToSync(std::unique_ptr<MetadataBatch> batch) override;
   bool IsTrackingMetadata() override;
   void ReportError(const ModelError& error) override;
-  base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegateOnUIThread()
-      override;
+  base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegate() override;
 
   // Indicates that ReportError should be called in the future.
   void ExpectError();
diff --git a/components/sync/model/mock_model_type_change_processor.cc b/components/sync/model/mock_model_type_change_processor.cc
index 80dbd23..8d240d3 100644
--- a/components/sync/model/mock_model_type_change_processor.cc
+++ b/components/sync/model/mock_model_type_change_processor.cc
@@ -62,9 +62,8 @@
     other_->ReportError(error);
   }
 
-  base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegateOnUIThread()
-      override {
-    return other_->GetControllerDelegateOnUIThread();
+  base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegate() override {
+    return other_->GetControllerDelegate();
   }
 
  private:
@@ -117,10 +116,9 @@
           Invoke(delegate, &ModelTypeChangeProcessor::IsTrackingMetadata));
   ON_CALL(*this, ReportError(_))
       .WillByDefault(Invoke(delegate, &ModelTypeChangeProcessor::ReportError));
-  ON_CALL(*this, GetControllerDelegateOnUIThread())
+  ON_CALL(*this, GetControllerDelegate())
       .WillByDefault(
-          Invoke(delegate,
-                 &ModelTypeChangeProcessor::GetControllerDelegateOnUIThread));
+          Invoke(delegate, &ModelTypeChangeProcessor::GetControllerDelegate));
 }
 
 }  //  namespace syncer
diff --git a/components/sync/model/mock_model_type_change_processor.h b/components/sync/model/mock_model_type_change_processor.h
index 0b9ad6f..b870c806 100644
--- a/components/sync/model/mock_model_type_change_processor.h
+++ b/components/sync/model/mock_model_type_change_processor.h
@@ -37,7 +37,7 @@
   MOCK_METHOD1(ModelReadyToSync, void(std::unique_ptr<MetadataBatch> batch));
   MOCK_METHOD0(IsTrackingMetadata, bool());
   MOCK_METHOD1(ReportError, void(const ModelError& error));
-  MOCK_METHOD0(GetControllerDelegateOnUIThread,
+  MOCK_METHOD0(GetControllerDelegate,
                base::WeakPtr<ModelTypeControllerDelegate>());
 
   // Returns a processor that forwards all calls to
diff --git a/components/sync/model/model_type_change_processor.h b/components/sync/model/model_type_change_processor.h
index 2cb60b7..69c535e8 100644
--- a/components/sync/model/model_type_change_processor.h
+++ b/components/sync/model/model_type_change_processor.h
@@ -90,12 +90,9 @@
   // disabled for the model type (generally until the next restart).
   virtual void ReportError(const ModelError& error) = 0;
 
-  // Returns the delegate for the controller. This function must be thread-safe!
-  // It is run on the UI thread by the ModelTypeController.
-  // TODO(mastiz): Remove the inaccurate suffix OnUIThread and the thread-safety
-  // requirement documented above, since it actually runs on the model thread.
+  // Returns the delegate for the controller.
   virtual base::WeakPtr<ModelTypeControllerDelegate>
-  GetControllerDelegateOnUIThread() = 0;
+  GetControllerDelegate() = 0;
 };
 
 }  // namespace syncer
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.cc b/components/sync/model_impl/client_tag_based_model_type_processor.cc
index 8cc9fbd..5ad0312 100644
--- a/components/sync/model_impl/client_tag_based_model_type_processor.cc
+++ b/components/sync/model_impl/client_tag_based_model_type_processor.cc
@@ -282,7 +282,7 @@
 }
 
 base::WeakPtr<ModelTypeControllerDelegate>
-ClientTagBasedModelTypeProcessor::GetControllerDelegateOnUIThread() {
+ClientTagBasedModelTypeProcessor::GetControllerDelegate() {
   return weak_ptr_factory_for_controller_.GetWeakPtr();
 }
 
diff --git a/components/sync/model_impl/client_tag_based_model_type_processor.h b/components/sync/model_impl/client_tag_based_model_type_processor.h
index a00a5859..63e3b81 100644
--- a/components/sync/model_impl/client_tag_based_model_type_processor.h
+++ b/components/sync/model_impl/client_tag_based_model_type_processor.h
@@ -70,8 +70,7 @@
   void ModelReadyToSync(std::unique_ptr<MetadataBatch> batch) override;
   bool IsTrackingMetadata() override;
   void ReportError(const ModelError& error) override;
-  base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegateOnUIThread()
-      override;
+  base::WeakPtr<ModelTypeControllerDelegate> GetControllerDelegate() override;
 
   // ModelTypeProcessor implementation.
   void ConnectSync(std::unique_ptr<CommitQueue> worker) override;
diff --git a/components/sync/model_impl/model_type_store_service_impl.cc b/components/sync/model_impl/model_type_store_service_impl.cc
index 43624dfe..fe5d6db 100644
--- a/components/sync/model_impl/model_type_store_service_impl.cc
+++ b/components/sync/model_impl/model_type_store_service_impl.cc
@@ -9,8 +9,8 @@
 #include "base/bind_helpers.h"
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/sync/model_impl/blocking_model_type_store_impl.h"
diff --git a/components/sync/protocol/autofill_specifics.proto b/components/sync/protocol/autofill_specifics.proto
index c20ed44..cc6a769 100644
--- a/components/sync/protocol/autofill_specifics.proto
+++ b/components/sync/protocol/autofill_specifics.proto
@@ -175,11 +175,18 @@
   optional string phone_number = 13;
 }
 
+// Contains information about a Payments Customer.
+message PaymentsCustomerData {
+  // The billable customer ID associated with the account.
+  optional string id = 1;
+}
+
 message AutofillWalletSpecifics {
   enum WalletInfoType {
     UNKNOWN = 0;
     MASKED_CREDIT_CARD = 1;
     POSTAL_ADDRESS = 2;
+    CUSTOMER_DATA = 3;
   }
 
   optional WalletInfoType type = 1;
@@ -190,6 +197,9 @@
 
   // This field exists if and only if the "type" field equals to ADDRESS.
   optional WalletPostalAddress address = 3;
+
+  // This field exists if and only if the "type" field equals to CUSTOMER_DATA.
+  optional PaymentsCustomerData customer_data = 4;
 }
 
 // Wallet card and address usage information that can be synced.
diff --git a/components/sync/protocol/proto_enum_conversions.cc b/components/sync/protocol/proto_enum_conversions.cc
index 7e04e562..050535f 100644
--- a/components/sync/protocol/proto_enum_conversions.cc
+++ b/components/sync/protocol/proto_enum_conversions.cc
@@ -48,11 +48,12 @@
 const char* ProtoEnumToString(
     sync_pb::AutofillWalletSpecifics::WalletInfoType wallet_info_type) {
   ASSERT_ENUM_BOUNDS(sync_pb::AutofillWalletSpecifics, WalletInfoType, UNKNOWN,
-                     POSTAL_ADDRESS);
+                     CUSTOMER_DATA);
   switch (wallet_info_type) {
     ENUM_CASE(sync_pb::AutofillWalletSpecifics, UNKNOWN);
     ENUM_CASE(sync_pb::AutofillWalletSpecifics, MASKED_CREDIT_CARD);
     ENUM_CASE(sync_pb::AutofillWalletSpecifics, POSTAL_ADDRESS);
+    ENUM_CASE(sync_pb::AutofillWalletSpecifics, CUSTOMER_DATA);
   }
   NOTREACHED();
   return "";
diff --git a/components/sync/protocol/proto_value_conversions.cc b/components/sync/protocol/proto_value_conversions.cc
index 00f1b28..0d3d11b0 100644
--- a/components/sync/protocol/proto_value_conversions.cc
+++ b/components/sync/protocol/proto_value_conversions.cc
@@ -214,6 +214,9 @@
     if (proto.type() != sync_pb::AutofillWalletSpecifics::MASKED_CREDIT_CARD) {
       value->Remove("masked_card", nullptr);
     }
+    if (proto.type() != sync_pb::AutofillWalletSpecifics::CUSTOMER_DATA) {
+      value->Remove("customer_data", nullptr);
+    }
     return value;
   }
 
@@ -333,6 +336,7 @@
 IMPLEMENT_PROTO_TO_VALUE(NigoriSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(PasswordSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(PasswordSpecificsData)
+IMPLEMENT_PROTO_TO_VALUE(PaymentsCustomerData)
 IMPLEMENT_PROTO_TO_VALUE(PreferenceSpecifics)
 IMPLEMENT_PROTO_TO_VALUE(PrinterPPDReference)
 IMPLEMENT_PROTO_TO_VALUE(PrinterSpecifics)
diff --git a/components/sync/protocol/proto_value_conversions.h b/components/sync/protocol/proto_value_conversions.h
index 9306d0ac..2a20db94 100644
--- a/components/sync/protocol/proto_value_conversions.h
+++ b/components/sync/protocol/proto_value_conversions.h
@@ -51,6 +51,7 @@
 class NigoriSpecifics;
 class PasswordSpecifics;
 class PasswordSpecificsData;
+class PaymentsCustomerData;
 class PreferenceSpecifics;
 class PrinterPPDReference;
 class PrinterSpecifics;
@@ -200,6 +201,9 @@
 std::unique_ptr<base::DictionaryValue> PasswordSpecificsDataToValue(
     const sync_pb::PasswordSpecificsData& password_specifics_data);
 
+std::unique_ptr<base::DictionaryValue> PaymentsCustomerDataToValue(
+    const sync_pb::PaymentsCustomerData& payments_customer_data);
+
 std::unique_ptr<base::DictionaryValue> PreferenceSpecificsToValue(
     const sync_pb::PreferenceSpecifics& password_specifics);
 
diff --git a/components/sync/protocol/proto_value_conversions_unittest.cc b/components/sync/protocol/proto_value_conversions_unittest.cc
index 40f990c..328dd39 100644
--- a/components/sync/protocol/proto_value_conversions_unittest.cc
+++ b/components/sync/protocol/proto_value_conversions_unittest.cc
@@ -142,21 +142,31 @@
   sync_pb::AutofillWalletSpecifics specifics;
   specifics.mutable_masked_card()->set_name_on_card("Igloo");
   specifics.mutable_address()->set_recipient_name("John");
+  specifics.mutable_customer_data()->set_id("123456");
 
   specifics.set_type(sync_pb::AutofillWalletSpecifics::UNKNOWN);
   auto value = AutofillWalletSpecificsToValue(specifics);
   EXPECT_FALSE(value->Get("masked_card", nullptr));
   EXPECT_FALSE(value->Get("address", nullptr));
+  EXPECT_FALSE(value->Get("customer_data", nullptr));
 
   specifics.set_type(sync_pb::AutofillWalletSpecifics::MASKED_CREDIT_CARD);
   value = AutofillWalletSpecificsToValue(specifics);
   EXPECT_TRUE(value->Get("masked_card", nullptr));
   EXPECT_FALSE(value->Get("address", nullptr));
+  EXPECT_FALSE(value->Get("customer_data", nullptr));
 
   specifics.set_type(sync_pb::AutofillWalletSpecifics::POSTAL_ADDRESS);
   value = AutofillWalletSpecificsToValue(specifics);
   EXPECT_FALSE(value->Get("masked_card", nullptr));
   EXPECT_TRUE(value->Get("address", nullptr));
+  EXPECT_FALSE(value->Get("customer_data", nullptr));
+
+  specifics.set_type(sync_pb::AutofillWalletSpecifics::CUSTOMER_DATA);
+  value = AutofillWalletSpecificsToValue(specifics);
+  EXPECT_FALSE(value->Get("masked_card", nullptr));
+  EXPECT_FALSE(value->Get("address", nullptr));
+  EXPECT_TRUE(value->Get("customer_data", nullptr));
 }
 
 TEST(ProtoValueConversionsTest, BookmarkSpecificsData) {
diff --git a/components/sync/protocol/proto_visitors.h b/components/sync/protocol/proto_visitors.h
index b3ab317..90b136a 100644
--- a/components/sync/protocol/proto_visitors.h
+++ b/components/sync/protocol/proto_visitors.h
@@ -188,6 +188,7 @@
   VISIT_ENUM(type);
   VISIT(masked_card);
   VISIT(address);
+  VISIT(customer_data);
 }
 
 VISIT_PROTO_FIELDS(const sync_pb::BookmarkSpecifics& proto) {
@@ -1025,6 +1026,10 @@
   VISIT(language_code);
 }
 
+VISIT_PROTO_FIELDS(const sync_pb::PaymentsCustomerData& proto) {
+  VISIT(id);
+}
+
 VISIT_PROTO_FIELDS(const sync_pb::WalletSyncFlags& proto) {
   VISIT(enabled);
 }
diff --git a/components/sync/user_events/user_event_service_impl_unittest.cc b/components/sync/user_events/user_event_service_impl_unittest.cc
index 765090d7..b430e9e 100644
--- a/components/sync/user_events/user_event_service_impl_unittest.cc
+++ b/components/sync/user_events/user_event_service_impl_unittest.cc
@@ -80,8 +80,9 @@
         is_using_secondary_passphrase_(is_using_secondary_passphrase),
         preferred_data_types_(preferred_data_types) {}
 
-  State GetState() const override {
-    return is_engine_initialized_ ? State::ACTIVE : State::INITIALIZING;
+  TransportState GetTransportState() const override {
+    return is_engine_initialized_ ? TransportState::ACTIVE
+                                  : TransportState::INITIALIZING;
   }
 
   bool IsUsingSecondaryPassphrase() const override {
diff --git a/components/sync_bookmarks/bookmark_change_processor.cc b/components/sync_bookmarks/bookmark_change_processor.cc
index 644bd9a6..e9306bd 100644
--- a/components/sync_bookmarks/bookmark_change_processor.cc
+++ b/components/sync_bookmarks/bookmark_change_processor.cc
@@ -20,7 +20,6 @@
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_utils.h"
 #include "components/favicon/core/favicon_service.h"
-#include "components/history/core/browser/history_service.h"
 #include "components/sync/driver/sync_client.h"
 #include "components/sync/syncable/change_record.h"
 #include "components/sync/syncable/entry.h"  // TODO(tim): Investigating bug 121587.
@@ -777,7 +776,7 @@
         node,
         base::Time::FromInternalValue(specifics.creation_time_us()));
   }
-  SetBookmarkFavicon(&sync_node, node, model, sync_client);
+  SetBookmarkFavicon(&sync_node, node, sync_client);
   model->SetNodeMetaInfoMap(node, *GetBookmarkMetaInfo(&sync_node));
 }
 
@@ -836,7 +835,7 @@
         parent, index, title, url, create_time,
         GetBookmarkMetaInfo(sync_node).get());
     if (node)
-      SetBookmarkFavicon(sync_node, node, model, sync_client);
+      SetBookmarkFavicon(sync_node, node, sync_client);
   }
 
   return node;
@@ -847,7 +846,6 @@
 void BookmarkChangeProcessor::SetBookmarkFavicon(
     const syncer::BaseNode* sync_node,
     const BookmarkNode* bookmark_node,
-    BookmarkModel* bookmark_model,
     syncer::SyncClient* sync_client) {
   const sync_pb::BookmarkSpecifics& specifics =
       sync_node->GetBookmarkSpecifics();
@@ -929,16 +927,14 @@
     syncer::SyncClient* sync_client,
     const GURL& icon_url,
     const scoped_refptr<base::RefCountedMemory>& bitmap_data) {
-  history::HistoryService* history = sync_client->GetHistoryService();
   favicon::FaviconService* favicon_service = sync_client->GetFaviconService();
 
   // Some tests (that use FakeSyncClient) use no services.
-  if (history == nullptr)
+  if (favicon_service == nullptr)
     return;
 
-  DCHECK(favicon_service);
-  history->AddPageNoVisitForBookmark(bookmark_node->url(),
-                                     bookmark_node->GetTitle());
+  favicon_service->AddPageNoVisitForBookmark(bookmark_node->url(),
+                                             bookmark_node->GetTitle());
 
   GURL icon_url_to_use = icon_url;
 
diff --git a/components/sync_bookmarks/bookmark_change_processor.h b/components/sync_bookmarks/bookmark_change_processor.h
index bfbd55c..72234f5 100644
--- a/components/sync_bookmarks/bookmark_change_processor.h
+++ b/components/sync_bookmarks/bookmark_change_processor.h
@@ -119,11 +119,8 @@
       int index);
 
   // Sets the favicon of the given bookmark node from the given sync node.
-  // |profile| is the profile that contains the HistoryService and BookmarkModel
-  // for the bookmark in question.
   static void SetBookmarkFavicon(const syncer::BaseNode* sync_node,
                                  const bookmarks::BookmarkNode* bookmark_node,
-                                 bookmarks::BookmarkModel* model,
                                  syncer::SyncClient* sync_client);
 
   // Applies the 1x favicon |bitmap_data| and |icon_url| to |bookmark_node|.
diff --git a/components/sync_bookmarks/bookmark_local_changes_builder.cc b/components/sync_bookmarks/bookmark_local_changes_builder.cc
index ad86cbe..2de8a12 100644
--- a/components/sync_bookmarks/bookmark_local_changes_builder.cc
+++ b/components/sync_bookmarks/bookmark_local_changes_builder.cc
@@ -11,37 +11,11 @@
 #include "components/bookmarks/browser/bookmark_node.h"
 #include "components/sync/base/time.h"
 #include "components/sync/protocol/bookmark_model_metadata.pb.h"
+#include "components/sync_bookmarks/bookmark_specifics_conversions.h"
 #include "components/sync_bookmarks/synced_bookmark_tracker.h"
 
 namespace sync_bookmarks {
 
-namespace {
-
-sync_pb::EntitySpecifics SpecificsFromBookmarkNode(
-    const bookmarks::BookmarkNode* node) {
-  sync_pb::EntitySpecifics specifics;
-  sync_pb::BookmarkSpecifics* bm_specifics = specifics.mutable_bookmark();
-  bm_specifics->set_url(node->url().spec());
-  // TODO(crbug.com/516866): Set the favicon.
-  bm_specifics->set_title(base::UTF16ToUTF8(node->GetTitle()));
-  bm_specifics->set_creation_time_us(
-      node->date_added().ToDeltaSinceWindowsEpoch().InMicroseconds());
-
-  bm_specifics->set_icon_url(node->icon_url() ? node->icon_url()->spec()
-                                              : std::string());
-  if (node->GetMetaInfoMap()) {
-    for (const std::pair<std::string, std::string>& pair :
-         *node->GetMetaInfoMap()) {
-      sync_pb::MetaInfo* meta_info = bm_specifics->add_meta_info();
-      meta_info->set_key(pair.first);
-      meta_info->set_value(pair.second);
-    }
-  }
-  return specifics;
-}
-
-}  // namespace
-
 BookmarkLocalChangesBuilder::BookmarkLocalChangesBuilder(
     const SyncedBookmarkTracker* const bookmark_tracker)
     : bookmark_tracker_(bookmark_tracker) {
@@ -90,7 +64,7 @@
       data.unique_position = metadata->unique_position();
       // Assign specifics only for the non-deletion case. In case of deletion,
       // EntityData should contain empty specifics to indicate deletion.
-      data.specifics = SpecificsFromBookmarkNode(node);
+      data.specifics = CreateSpecificsFromBookmarkNode(node);
     }
     request.entity = data.PassToPtr();
     request.sequence_number = metadata->sequence_number();
diff --git a/components/sync_bookmarks/bookmark_model_observer_impl.cc b/components/sync_bookmarks/bookmark_model_observer_impl.cc
index 073fd7a..e273c2c 100644
--- a/components/sync_bookmarks/bookmark_model_observer_impl.cc
+++ b/components/sync_bookmarks/bookmark_model_observer_impl.cc
@@ -141,7 +141,21 @@
 
   const SyncedBookmarkTracker::Entity* entity =
       bookmark_tracker_->GetEntityForBookmarkNode(node);
-  DCHECK(entity);
+  if (!entity) {
+    // If the node hasn't been added to the tracker yet, we do nothing. It will
+    // be added later. It's how BookmarkModel currently notifies observers, if
+    // further changes are triggered *during* observer notification. Consider
+    // the following scenario:
+    // 1. New bookmark added.
+    // 2. BookmarkModel notifies all the observers about the new node.
+    // 3. One observer A get's notified before us.
+    // 4. Observer A decided to update the bookmark node.
+    // 5. BookmarkModel notifies all observers about the update.
+    // 6. We received the notification about the update before the creation.
+    // 7. We will get the notification about the addition later and then we can
+    //    start tracking the node.
+    return;
+  }
   const std::string& sync_id = entity->metadata()->server_id();
   const base::Time modification_time = base::Time::Now();
   sync_pb::EntitySpecifics specifics = CreateSpecificsFromBookmarkNode(node);
diff --git a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
index 917bbbe..7d8acf7 100644
--- a/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
+++ b/components/sync_bookmarks/bookmark_model_type_processor_unittest.cc
@@ -41,7 +41,8 @@
 
 syncer::UpdateResponseData CreateUpdateResponseData(
     const BookmarkInfo& bookmark_info,
-    const syncer::UniquePosition& unique_position) {
+    const syncer::UniquePosition& unique_position,
+    int response_version) {
   syncer::EntityData data;
   data.id = bookmark_info.server_id;
   data.parent_id = bookmark_info.parent_id;
@@ -59,8 +60,7 @@
 
   syncer::UpdateResponseData response_data;
   response_data.entity = data.PassToPtr();
-  // Similar to what's done in the loopback_server.
-  response_data.response_version = 0;
+  response_data.response_version = response_version;
   return response_data;
 }
 
@@ -104,11 +104,12 @@
   updates.push_back(
       CreateUpdateResponseData({kBookmarkBarId, std::string(), std::string(),
                                 kBookmarksRootId, kBookmarkBarTag},
-                               pos));
+                               pos, /*response_version=*/0));
   for (BookmarkInfo bookmark : bookmarks) {
     pos = syncer::UniquePosition::After(pos,
                                         syncer::UniquePosition::RandomSuffix());
-    updates.push_back(CreateUpdateResponseData(bookmark, pos));
+    updates.push_back(
+        CreateUpdateResponseData(bookmark, pos, /*response_version=*/0));
   }
   // TODO(crbug.com/516866): Remove after a proper positioning for remote
   // updates is implemented. Reversing the updates because the sorting algorithm
@@ -174,7 +175,7 @@
   updates.push_back(
       CreateUpdateResponseData({kBookmarkBarId, std::string(), std::string(),
                                 kBookmarksRootId, kBookmarkBarTag},
-                               kRandomPosition));
+                               kRandomPosition, /*response_version=*/0));
 
   // Add update for another node under the bookmarks bar.
   const std::string kNodeId = "node_id";
@@ -183,7 +184,7 @@
   updates.push_back(
       CreateUpdateResponseData({kNodeId, kTitle, kUrl, kBookmarkBarId,
                                 /*server_tag=*/std::string()},
-                               kRandomPosition));
+                               kRandomPosition, /*response_version=*/0));
 
   const bookmarks::BookmarkNode* bookmarkbar =
       bookmark_model()->bookmark_bar_node();
@@ -224,7 +225,7 @@
   updates.push_back(
       CreateUpdateResponseData({kNodeId, kNewTitle, kNewUrl, kBookmarkBarId,
                                 /*server_tag=*/std::string()},
-                               kRandomPosition));
+                               kRandomPosition, /*response_version=*/1));
 
   processor()->OnUpdateReceived(CreateDummyModelTypeState(), updates);
 
@@ -259,7 +260,7 @@
   updates.push_back(
       CreateUpdateResponseData({kNodeId, kTitle, kUrl, kBookmarkBarId,
                                 /*server_tag=*/std::string()},
-                               kRandomPosition));
+                               kRandomPosition, /*response_version=*/1));
   updates[0].response_version++;
 
   EXPECT_CALL(*schedule_save_closure(), Run());
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.cc b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
index 3c8bd6d4..b9f5770 100644
--- a/components/sync_bookmarks/bookmark_remote_updates_handler.cc
+++ b/components/sync_bookmarks/bookmark_remote_updates_handler.cc
@@ -9,10 +9,12 @@
 #include <unordered_map>
 #include <utility>
 
+#include "base/metrics/histogram_macros.h"
 #include "base/strings/string_piece.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/bookmark_node.h"
 #include "components/sync/base/unique_position.h"
+#include "components/sync/model/conflict_resolution.h"
 #include "components/sync/protocol/unique_position.pb.h"
 #include "components/sync_bookmarks/bookmark_specifics_conversions.h"
 
@@ -71,6 +73,51 @@
   return parent->child_count();
 }
 
+void ApplyRemoteUpdate(
+    const syncer::UpdateResponseData& update,
+    const SyncedBookmarkTracker::Entity* tracked_entity,
+    const SyncedBookmarkTracker::Entity* new_parent_tracked_entity,
+    bookmarks::BookmarkModel* model,
+    SyncedBookmarkTracker* tracker) {
+  const syncer::EntityData& update_entity = update.entity.value();
+  DCHECK(!update_entity.is_deleted());
+  DCHECK(tracked_entity);
+  DCHECK(new_parent_tracked_entity);
+  DCHECK(model);
+  DCHECK(tracker);
+  const bookmarks::BookmarkNode* node = tracked_entity->bookmark_node();
+  const bookmarks::BookmarkNode* old_parent = node->parent();
+  const bookmarks::BookmarkNode* new_parent =
+      new_parent_tracked_entity->bookmark_node();
+
+  if (update_entity.is_folder != node->is_folder()) {
+    DLOG(ERROR) << "Could not update node. Remote node is a "
+                << (update_entity.is_folder ? "folder" : "bookmark")
+                << " while local node is a "
+                << (node->is_folder() ? "folder" : "bookmark");
+    return;
+  }
+  UpdateBookmarkNodeFromSpecifics(update_entity.specifics.bookmark(), node,
+                                  model);
+  // Compute index information before updating the |tracker|.
+  const int old_index = old_parent->GetIndexOf(node);
+  const int new_index =
+      ComputeChildNodeIndex(new_parent, update_entity.unique_position, tracker);
+  tracker->Update(update_entity.id, update.response_version,
+                  update_entity.modification_time,
+                  update_entity.unique_position, update_entity.specifics);
+
+  if (new_parent == old_parent &&
+      (new_index == old_index || new_index == old_index + 1)) {
+    // Node hasn't moved. No more work to do.
+    return;
+  }
+  // Node has moved to another position under the same parent. Update the model.
+  // BookmarkModel takes care of placing the node in the correct position if the
+  // node is move to the left. (i.e. no need to subtract one from |new_index|).
+  model->Move(node, new_parent, new_index);
+}
+
 }  // namespace
 
 BookmarkRemoteUpdatesHandler::BookmarkRemoteUpdatesHandler(
@@ -85,12 +132,38 @@
     const syncer::UpdateResponseDataList& updates) {
   for (const syncer::UpdateResponseData* update : ReorderUpdates(&updates)) {
     const syncer::EntityData& update_entity = update->entity.value();
-    // TODO(crbug.com/516866): Check |update_entity| for sanity.
-    // 1. Has bookmark specifics or no specifics in case of delete.
-    // 2. All meta info entries in the specifics have unique keys.
-    // 3. Unique position is valid.
+    // Only non deletions and non premanent node should have valid specifics and
+    // unique positions.
+    if (!update_entity.is_deleted() &&
+        update_entity.parent_id != kBookmarksRootId) {
+      if (!IsValidBookmarkSpecifics(update_entity.specifics.bookmark(),
+                                    update_entity.is_folder)) {
+        // Ignore updates with invalid specifics.
+        DLOG(ERROR)
+            << "Couldn't process an update bookmark with an invalid specifics.";
+        continue;
+      }
+      if (!syncer::UniquePosition::FromProto(update_entity.unique_position)
+               .IsValid()) {
+        // Ignore updates with invalid unique position.
+        DLOG(ERROR) << "Couldn't process an update bookmark with an invalid "
+                       "unique position.";
+        continue;
+      }
+    }
     const SyncedBookmarkTracker::Entity* tracked_entity =
         bookmark_tracker_->GetEntityForSyncId(update_entity.id);
+    if (tracked_entity && tracked_entity->metadata()->server_version() >=
+                              update->response_version) {
+      // Seen this update before; just ignore it.
+      continue;
+    }
+    // TODO(crbug.com/516866): Handle the case of conflict as a result of
+    // re-encryption request.
+    if (tracked_entity && tracked_entity->IsUnsynced()) {
+      ProcessConflict(*update, tracked_entity);
+      continue;
+    }
     if (update_entity.is_deleted()) {
       ProcessRemoteDelete(update_entity, tracked_entity);
       continue;
@@ -212,12 +285,10 @@
                    "should have been merged during intial sync.";
     return;
   }
-  if (!IsValidBookmarkSpecifics(update_entity.specifics.bookmark(),
-                                update_entity.is_folder)) {
-    // Ignore creations with invalid specifics.
-    DLOG(ERROR) << "Couldn't add bookmark with an invalid specifics.";
-    return;
-  }
+
+  DCHECK(IsValidBookmarkSpecifics(update_entity.specifics.bookmark(),
+                                  update_entity.is_folder));
+
   const bookmarks::BookmarkNode* parent_node = GetParentNode(update_entity);
   if (!parent_node) {
     // If we cannot find the parent, we can do nothing.
@@ -255,16 +326,10 @@
             bookmark_tracker_->GetEntityForSyncId(update_entity.id));
   // Must not be a deletion.
   DCHECK(!update_entity.is_deleted());
-  if (!IsValidBookmarkSpecifics(update_entity.specifics.bookmark(),
-                                update_entity.is_folder)) {
-    // Ignore updates with invalid specifics.
-    DLOG(ERROR) << "Couldn't update bookmark with an invalid specifics.";
-    return;
-  }
-  if (tracked_entity->IsUnsynced()) {
-    // TODO(crbug.com/516866): Handle conflict resolution.
-    return;
-  }
+
+  DCHECK(IsValidBookmarkSpecifics(update_entity.specifics.bookmark(),
+                                  update_entity.is_folder));
+  DCHECK(!tracked_entity->IsUnsynced());
 
   const bookmarks::BookmarkNode* node = tracked_entity->bookmark_node();
   const bookmarks::BookmarkNode* old_parent = node->parent();
@@ -295,33 +360,8 @@
                               update_entity.specifics);
     return;
   }
-  if (update_entity.is_folder != node->is_folder()) {
-    DLOG(ERROR) << "Could not update node. Remote node is a "
-                << (update_entity.is_folder ? "folder" : "bookmark")
-                << " while local node is a "
-                << (node->is_folder() ? "folder" : "bookmark");
-    return;
-  }
-  UpdateBookmarkNodeFromSpecifics(update_entity.specifics.bookmark(), node,
-                                  bookmark_model_);
-  // Compute index information before updating the |bookmark_tracker_|.
-  const int old_index = old_parent->GetIndexOf(node);
-  const int new_index = ComputeChildNodeIndex(
-      new_parent, update_entity.unique_position, bookmark_tracker_);
-  bookmark_tracker_->Update(update_entity.id, update.response_version,
-                            update_entity.modification_time,
-                            update_entity.unique_position,
-                            update_entity.specifics);
-
-  if (new_parent == old_parent &&
-      (new_index == old_index || new_index == old_index + 1)) {
-    // Node hasn't moved. No more work to do.
-    return;
-  }
-  // Node has moved to another position under the same parent. Update the model.
-  // BookmarkModel takes care of placing the node in the correct position if the
-  // node is move to the left. (i.e. no need to subtract one from |new_index|).
-  bookmark_model_->Move(node, new_parent, new_index);
+  ApplyRemoteUpdate(update, tracked_entity, new_parent_entity, bookmark_model_,
+                    bookmark_tracker_);
 }
 
 void BookmarkRemoteUpdatesHandler::ProcessRemoteDelete(
@@ -353,6 +393,111 @@
   bookmark_model_->Remove(node);
 }
 
+void BookmarkRemoteUpdatesHandler::ProcessConflict(
+    const syncer::UpdateResponseData& update,
+    const SyncedBookmarkTracker::Entity* tracked_entity) {
+  const syncer::EntityData& update_entity = update.entity.value();
+  // TODO(crbug.com/516866): Add basic unit test for this function.
+
+  // Can only conflict with existing nodes.
+  DCHECK(tracked_entity);
+  DCHECK_EQ(tracked_entity,
+            bookmark_tracker_->GetEntityForSyncId(update_entity.id));
+
+  if (tracked_entity->metadata()->is_deleted() && update_entity.is_deleted()) {
+    // Both have been deleted, delete the corresponding entity from the tracker.
+    bookmark_tracker_->Remove(update_entity.id);
+    DLOG(WARNING) << "Conflict: CHANGES_MATCH";
+    UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict",
+                              syncer::ConflictResolution::CHANGES_MATCH,
+                              syncer::ConflictResolution::TYPE_SIZE);
+    return;
+  }
+
+  if (update_entity.is_deleted()) {
+    // Only remote has been deleted. Local wins. Record that we received the
+    // update from the server but leave the pending commit intact.
+    bookmark_tracker_->UpdateServerVersion(update_entity.id,
+                                           update.response_version);
+    DLOG(WARNING) << "Conflict: USE_LOCAL";
+    UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict",
+                              syncer::ConflictResolution::USE_LOCAL,
+                              syncer::ConflictResolution::TYPE_SIZE);
+    return;
+  }
+
+  if (tracked_entity->metadata()->is_deleted()) {
+    // Only local node has been deleted. It should be restored from the server
+    // data as a remote creation.
+    bookmark_tracker_->Remove(update_entity.id);
+    ProcessRemoteCreate(update);
+    DLOG(WARNING) << "Conflict: USE_REMOTE";
+    UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict",
+                              syncer::ConflictResolution::USE_REMOTE,
+                              syncer::ConflictResolution::TYPE_SIZE);
+    return;
+  }
+
+  // No deletions, there are potentially conflicting updates.
+  const bookmarks::BookmarkNode* node = tracked_entity->bookmark_node();
+  const bookmarks::BookmarkNode* old_parent = node->parent();
+
+  const SyncedBookmarkTracker::Entity* new_parent_entity =
+      bookmark_tracker_->GetEntityForSyncId(update_entity.parent_id);
+  // The |new_parent_entity| could be null in some racy conditions.  For
+  // example, when a client A moves a node and deletes the old parent and
+  // commits, and then updates the node again, and at the same time client B
+  // updates before receiving the move updates. The client B update will arrive
+  // at client A after the parent entity has been deleted already.
+  if (!new_parent_entity) {
+    DLOG(ERROR) << "Could not update node. Parent node doesn't exist: "
+                << update_entity.parent_id;
+    return;
+  }
+  const bookmarks::BookmarkNode* new_parent =
+      new_parent_entity->bookmark_node();
+  // |new_parent| would be null if the parent has been deleted locally and not
+  // committed yet. Deletions are excuted recusively, so a parent deletions
+  // entails child deletion, and if this child has been updated on another
+  // client, this would cause conflict.
+  if (!new_parent) {
+    DLOG(ERROR)
+        << "Could not update node. Parent node has been deleted already.";
+    return;
+  }
+  // Either local and remote data match or server wins, and in both cases we
+  // should squash any pending commits.
+  bookmark_tracker_->AckSequenceNumber(update_entity.id);
+
+  // Node update could be either in the node data (e.g. title or
+  // unique_position), or it could be that the node has moved under another
+  // parent without any data change. Should check both the data and the parent
+  // to confirm that no updates to the model are needed.
+  if (tracked_entity->MatchesDataIgnoringParent(update_entity) &&
+      new_parent == old_parent) {
+    bookmark_tracker_->Update(update_entity.id, update.response_version,
+                              update_entity.modification_time,
+                              update_entity.unique_position,
+                              update_entity.specifics);
+
+    // The changes are identical so there isn't a real conflict.
+    DLOG(WARNING) << "Conflict: CHANGES_MATCH";
+    UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict",
+                              syncer::ConflictResolution::CHANGES_MATCH,
+                              syncer::ConflictResolution::TYPE_SIZE);
+    return;
+  }
+
+  // Conflict where data don't match and no remote deletion, and hence server
+  // wins. Update the model from server data.
+  DLOG(WARNING) << "Conflict: USE_REMOTE";
+  UMA_HISTOGRAM_ENUMERATION("Sync.ResolveConflict",
+                            syncer::ConflictResolution::USE_REMOTE,
+                            syncer::ConflictResolution::TYPE_SIZE);
+  ApplyRemoteUpdate(update, tracked_entity, new_parent_entity, bookmark_model_,
+                    bookmark_tracker_);
+}
+
 void BookmarkRemoteUpdatesHandler::RemoveEntityAndChildrenFromTracker(
     const bookmarks::BookmarkNode* node) {
   const SyncedBookmarkTracker::Entity* entity =
diff --git a/components/sync_bookmarks/bookmark_remote_updates_handler.h b/components/sync_bookmarks/bookmark_remote_updates_handler.h
index c39f8d4..9620e3c 100644
--- a/components/sync_bookmarks/bookmark_remote_updates_handler.h
+++ b/components/sync_bookmarks/bookmark_remote_updates_handler.h
@@ -65,7 +65,7 @@
   void ProcessRemoteUpdate(const syncer::UpdateResponseData& update,
                            const SyncedBookmarkTracker::Entity* tracked_entity);
 
-  // Process a remote delete of a bookmark node. |update_entity| must not be a
+  // Processes a remote delete of a bookmark node. |update_entity| must not be a
   // deletion. |tracked_entity| is the tracked entity for that server_id. It is
   // passed as a dependency instead of performing a lookup inside
   // ProcessRemoteDelete() to avoid wasting CPU cycles for doing another lookup
@@ -73,6 +73,15 @@
   void ProcessRemoteDelete(const syncer::EntityData& update_entity,
                            const SyncedBookmarkTracker::Entity* tracked_entity);
 
+  // Processes a conflict where the bookmark has been changed both locally and
+  // remotely. It applies the general policy the server wins expcet in the case
+  // of remote deletions in which local wins. |tracked_entity| is the tracked
+  // entity for that server_id. It is passed as a dependency instead of
+  // performing a lookup inside ProcessRemoteDelete() to avoid wasting CPU
+  // cycles for doing another lookup (this code runs on the UI thread).
+  void ProcessConflict(const syncer::UpdateResponseData& update,
+                       const SyncedBookmarkTracker::Entity* tracked_entity);
+
   // Recursively removes the entities corresponding to |node| and its children
   // from |bookmark_tracker_|.
   void RemoveEntityAndChildrenFromTracker(const bookmarks::BookmarkNode* node);
diff --git a/components/sync_bookmarks/bookmark_sync_service.cc b/components/sync_bookmarks/bookmark_sync_service.cc
index 8a3d8e50..7ecb5efe 100644
--- a/components/sync_bookmarks/bookmark_sync_service.cc
+++ b/components/sync_bookmarks/bookmark_sync_service.cc
@@ -44,7 +44,7 @@
 }
 
 base::WeakPtr<syncer::ModelTypeControllerDelegate>
-BookmarkSyncService::GetBookmarkSyncControllerDelegateOnUIThread() {
+BookmarkSyncService::GetBookmarkSyncControllerDelegate() {
   if (!bookmark_model_type_processor_) {
     return nullptr;
   }
diff --git a/components/sync_bookmarks/bookmark_sync_service.h b/components/sync_bookmarks/bookmark_sync_service.h
index 92a4a66..0c407db0 100644
--- a/components/sync_bookmarks/bookmark_sync_service.h
+++ b/components/sync_bookmarks/bookmark_sync_service.h
@@ -44,7 +44,7 @@
 
   // Returns the ModelTypeControllerDelegate for syncer::BOOKMARKS.
   virtual base::WeakPtr<syncer::ModelTypeControllerDelegate>
-  GetBookmarkSyncControllerDelegateOnUIThread();
+  GetBookmarkSyncControllerDelegate();
 
  private:
   // BookmarkModelTypeProcessor handles communications between sync engine and
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.cc b/components/sync_bookmarks/synced_bookmark_tracker.cc
index 22650b66..b681e700 100644
--- a/components/sync_bookmarks/synced_bookmark_tracker.cc
+++ b/components/sync_bookmarks/synced_bookmark_tracker.cc
@@ -134,9 +134,10 @@
     const sync_pb::EntitySpecifics& specifics) {
   DCHECK_GT(specifics.ByteSize(), 0);
   auto it = sync_id_to_entities_map_.find(sync_id);
+  DCHECK(it != sync_id_to_entities_map_.end());
   Entity* entity = it->second.get();
   DCHECK(entity);
-  entity->metadata()->set_server_id(sync_id);
+  DCHECK_EQ(entity->metadata()->server_id(), sync_id);
   entity->metadata()->set_server_version(server_version);
   entity->metadata()->set_modification_time(
       syncer::TimeToProtoTime(modification_time));
@@ -146,6 +147,15 @@
   // |ordered_local_tombstones_| as well if it has been locally deleted.
 }
 
+void SyncedBookmarkTracker::UpdateServerVersion(const std::string& sync_id,
+                                                int64_t server_version) {
+  auto it = sync_id_to_entities_map_.find(sync_id);
+  DCHECK(it != sync_id_to_entities_map_.end());
+  Entity* entity = it->second.get();
+  DCHECK(entity);
+  entity->metadata()->set_server_version(server_version);
+}
+
 void SyncedBookmarkTracker::MarkDeleted(const std::string& sync_id) {
   auto it = sync_id_to_entities_map_.find(sync_id);
   Entity* entity = it->second.get();
@@ -225,7 +235,7 @@
        sync_id_to_entities_map_) {
     Entity* entity = pair.second.get();
     if (entity->metadata()->is_deleted()) {
-      // Deletion are stored sorted in |ordered_local_tombstones_| and will be
+      // Deletions are stored sorted in |ordered_local_tombstones_| and will be
       // added later.
       continue;
     }
@@ -344,6 +354,15 @@
   }
 }
 
+void SyncedBookmarkTracker::AckSequenceNumber(const std::string& sync_id) {
+  auto it = sync_id_to_entities_map_.find(sync_id);
+  Entity* entity =
+      it != sync_id_to_entities_map_.end() ? it->second.get() : nullptr;
+  DCHECK(entity);
+  entity->metadata()->set_acked_sequence_number(
+      entity->metadata()->sequence_number());
+}
+
 bool SyncedBookmarkTracker::IsEmpty() const {
   return sync_id_to_entities_map_.empty();
 }
diff --git a/components/sync_bookmarks/synced_bookmark_tracker.h b/components/sync_bookmarks/synced_bookmark_tracker.h
index a8bd878..f101a4f 100644
--- a/components/sync_bookmarks/synced_bookmark_tracker.h
+++ b/components/sync_bookmarks/synced_bookmark_tracker.h
@@ -106,6 +106,9 @@
               const sync_pb::UniquePosition& unique_position,
               const sync_pb::EntitySpecifics& specifics);
 
+  // Updates the server version of an existing entry for the |sync_id|.
+  void UpdateServerVersion(const std::string& sync_id, int64_t server_version);
+
   // This class maintains the order of calls to this method and the same order
   // is gauaranteed when returning local changes in
   // GetEntitiesWithLocalChanges() as well as in BuildBookmarkModelMetadata().
@@ -146,6 +149,11 @@
                                 int64_t acked_sequence_number,
                                 int64_t server_version);
 
+  // Set the value of |EntityMetadata.acked_sequence_number| in the entity with
+  // |sync_id| to be equal to |EntityMetadata.sequence_number| such that it is
+  // not returned in GetEntitiesWithLocalChanges().
+  void AckSequenceNumber(const std::string& sync_id);
+
   // Whether the tracker is empty or not.
   bool IsEmpty() const;
 
diff --git a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
index d609420c..f368bc25 100644
--- a/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
+++ b/components/sync_bookmarks/synced_bookmark_tracker_unittest.cc
@@ -150,6 +150,38 @@
   // request in a separate test probably.
 }
 
+TEST(SyncedBookmarkTrackerTest, ShouldAckSequenceNumber) {
+  SyncedBookmarkTracker tracker(std::vector<NodeMetadataPair>(),
+                                std::make_unique<sync_pb::ModelTypeState>());
+  const std::string kSyncId = "SYNC_ID";
+  const int64_t kId = 1;
+  const int64_t kServerVersion = 1000;
+  const base::Time kModificationTime(base::Time::Now() -
+                                     base::TimeDelta::FromSeconds(1));
+  const sync_pb::UniquePosition unique_position;
+  const sync_pb::EntitySpecifics specifics =
+      GenerateSpecifics(/*title=*/std::string(), /*url=*/std::string());
+  bookmarks::BookmarkNode node(kId, GURL());
+  tracker.Add(kSyncId, &node, kServerVersion, kModificationTime,
+              unique_position, specifics);
+
+  // Test simple scenario of ack'ing an incrememented sequence number.
+  EXPECT_THAT(tracker.HasLocalChanges(), Eq(false));
+  tracker.IncrementSequenceNumber(kSyncId);
+  EXPECT_THAT(tracker.HasLocalChanges(), Eq(true));
+  tracker.AckSequenceNumber(kSyncId);
+  EXPECT_THAT(tracker.HasLocalChanges(), Eq(false));
+
+  // Test ack'ing of a mutliple times incremented sequence number.
+  tracker.IncrementSequenceNumber(kSyncId);
+  EXPECT_THAT(tracker.HasLocalChanges(), Eq(true));
+  tracker.IncrementSequenceNumber(kSyncId);
+  tracker.IncrementSequenceNumber(kSyncId);
+  EXPECT_THAT(tracker.HasLocalChanges(), Eq(true));
+  tracker.AckSequenceNumber(kSyncId);
+  EXPECT_THAT(tracker.HasLocalChanges(), Eq(false));
+}
+
 TEST(SyncedBookmarkTrackerTest, ShouldUpdateUponCommitResponseWithNewId) {
   SyncedBookmarkTracker tracker(std::vector<NodeMetadataPair>(),
                                 std::make_unique<sync_pb::ModelTypeState>());
diff --git a/components/task_scheduler_util/variations_util.cc b/components/task_scheduler_util/variations_util.cc
index 184bdda..a184f52 100644
--- a/components/task_scheduler_util/variations_util.cc
+++ b/components/task_scheduler_util/variations_util.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/task_scheduler/initialization_util_forward.h"
+#include "base/task/task_scheduler/initialization_util.h"
 #include "base/time/time.h"
 
 namespace task_scheduler_util {
diff --git a/components/task_scheduler_util/variations_util.h b/components/task_scheduler_util/variations_util.h
index 30257db..c09c4320 100644
--- a/components/task_scheduler_util/variations_util.h
+++ b/components/task_scheduler_util/variations_util.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/strings/string_piece.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 
 namespace task_scheduler_util {
 
diff --git a/components/task_scheduler_util/variations_util_unittest.cc b/components/task_scheduler_util/variations_util_unittest.cc
index 4264359..a3a3627b 100644
--- a/components/task_scheduler_util/variations_util_unittest.cc
+++ b/components/task_scheduler_util/variations_util_unittest.cc
@@ -9,8 +9,8 @@
 
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
-#include "base/task_scheduler/scheduler_worker_params.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/scheduler_worker_params.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
 #include "components/variations/variations_params_manager.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
diff --git a/components/test/data/arc/icon_app_128.png b/components/test/data/arc/icon_app_128.png
new file mode 100644
index 0000000..b1a7a430
--- /dev/null
+++ b/components/test/data/arc/icon_app_128.png
Binary files differ
diff --git a/components/test/data/arc/icon_shortcut_128.png b/components/test/data/arc/icon_shortcut_128.png
new file mode 100644
index 0000000..db01625c
--- /dev/null
+++ b/components/test/data/arc/icon_shortcut_128.png
Binary files differ
diff --git a/components/tracing/common/stack_unwinder_android_unittest.cc b/components/tracing/common/stack_unwinder_android_unittest.cc
index a20e4b3f..af841a2 100644
--- a/components/tracing/common/stack_unwinder_android_unittest.cc
+++ b/components/tracing/common/stack_unwinder_android_unittest.cc
@@ -5,7 +5,7 @@
 #include "components/tracing/common/stack_unwinder_android.h"
 
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/trace_event/cfi_backtrace_android.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/translate/core/browser/translate_ranker_impl_unittest.cc b/components/translate/core/browser/translate_ranker_impl_unittest.cc
index c55f3e10..6706a220 100644
--- a/components/translate/core/browser/translate_ranker_impl_unittest.cc
+++ b/components/translate/core/browser/translate_ranker_impl_unittest.cc
@@ -10,7 +10,7 @@
 #include "base/feature_list.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/assist_ranker/proto/ranker_model.pb.h"
diff --git a/components/ukm/observers/sync_disable_observer_unittest.cc b/components/ukm/observers/sync_disable_observer_unittest.cc
index 86ee238..7f76105c 100644
--- a/components/ukm/observers/sync_disable_observer_unittest.cc
+++ b/components/ukm/observers/sync_disable_observer_unittest.cc
@@ -57,8 +57,8 @@
   void RemoveObserver(syncer::SyncServiceObserver* observer) override {
     observers_.RemoveObserver(observer);
   }
-  State GetState() const override {
-    return initialized_ ? State::ACTIVE : State::INITIALIZING;
+  TransportState GetTransportState() const override {
+    return initialized_ ? TransportState::ACTIVE : TransportState::INITIALIZING;
   }
   bool IsUsingSecondaryPassphrase() const override { return has_passphrase_; }
   syncer::ModelTypeSet GetPreferredDataTypes() const override {
diff --git a/components/ukm/test_ukm_recorder.cc b/components/ukm/test_ukm_recorder.cc
index 913cb1f..827e613e 100644
--- a/components/ukm/test_ukm_recorder.cc
+++ b/components/ukm/test_ukm_recorder.cc
@@ -9,7 +9,7 @@
 
 #include "base/logging.h"
 #include "base/metrics/metrics_hashes.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/ukm/ukm_source.h"
 #include "services/metrics/public/cpp/delegating_ukm_recorder.h"
diff --git a/components/unified_consent/unified_consent_service.cc b/components/unified_consent/unified_consent_service.cc
index f3e7523..cfed849 100644
--- a/components/unified_consent/unified_consent_service.cc
+++ b/components/unified_consent/unified_consent_service.cc
@@ -91,9 +91,20 @@
          MigrationState::IN_PROGRESS_SHOULD_SHOW_CONSENT_BUMP;
 }
 
-void UnifiedConsentService::MarkMigrationComplete() {
+void UnifiedConsentService::MarkMigrationComplete(
+    ConsentBumpSuppressReason suppress_reason) {
   pref_service_->SetInteger(prefs::kUnifiedConsentMigrationState,
                             static_cast<int>(MigrationState::COMPLETED));
+  // Record the suppress reason for the consent bump. After the migration is
+  // marked complete, the consent bump should not be shown anymore. Note:
+  // |suppress_reason| can be kNone in case the consent bump was actually shown.
+  RecordConsentBumpSuppressReason(suppress_reason);
+}
+
+void UnifiedConsentService::RecordConsentBumpSuppressReason(
+    ConsentBumpSuppressReason suppress_reason) {
+  UMA_HISTOGRAM_ENUMERATION("UnifiedConsent.ConsentBump.SuppressReason",
+                            suppress_reason);
 }
 
 void UnifiedConsentService::Shutdown() {
@@ -130,7 +141,7 @@
       // Only users that were signed in and have opted into sync before unified
       // consent are eligible to see the unified consent bump. Since the user
       // signs out of Chrome, mark the migration to unified consent as complete.
-      MarkMigrationComplete();
+      MarkMigrationComplete(ConsentBumpSuppressReason::kUserSignedOut);
       break;
     case MigrationState::COMPLETED:
       break;
@@ -167,7 +178,7 @@
   // If the user opts into unified consent throught settings, the consent bump
   // doesn't need to be shown. Therefore mark the migration as complete.
   if (GetMigrationState() != MigrationState::COMPLETED)
-    MarkMigrationComplete();
+    MarkMigrationComplete(ConsentBumpSuppressReason::kSettingsOptIn);
 
   // Enable all sync data types if possible, otherwise they will be enabled with
   // |OnStateChanged| once sync is active;
@@ -210,31 +221,34 @@
   DCHECK(!IsUnifiedConsentGiven());
 
   if (!identity_manager_->HasPrimaryAccount()) {
-    MarkMigrationComplete();
+    MarkMigrationComplete(ConsentBumpSuppressReason::kNotSignedIn);
     return;
   }
 
   bool is_syncing_everything =
       syncer::SyncPrefs(pref_service_).HasKeepEverythingSynced();
-  // Record whether the user was syncing everything during Migration.
-  UMA_HISTOGRAM_BOOLEAN("UnifiedConsent.Migration.SyncEverythingWasOn",
-                        is_syncing_everything);
   if (!is_syncing_everything) {
-    MarkMigrationComplete();
+    MarkMigrationComplete(ConsentBumpSuppressReason::kSyncEverythingOff);
     return;
   }
 
-  // When the user was syncing everything, the consent bump should be shown
-  // when this is possible.
-  pref_service_->SetInteger(
-      prefs::kUnifiedConsentMigrationState,
-      static_cast<int>(MigrationState::IN_PROGRESS_SHOULD_SHOW_CONSENT_BUMP));
   // Set sync-everything to false to match the |kUnifiedConsentGiven| pref.
   // Note: If the sync engine isn't initialized at this point,
   // sync-everything is set to false once the sync engine state changes.
   // Sync-everything can then be set to true again after going through the
   // consent bump and opting into unified consent.
   SetSyncEverythingIfPossible(false);
+
+  if (!AreAllOnByDefaultPrivacySettingsOn()) {
+    MarkMigrationComplete(ConsentBumpSuppressReason::kPrivacySettingOff);
+    return;
+  }
+
+  // When the user was syncing everything, and all on-by-default privacy
+  // settings were on, the consent bump should be shown when this is possible.
+  pref_service_->SetInteger(
+      prefs::kUnifiedConsentMigrationState,
+      static_cast<int>(MigrationState::IN_PROGRESS_SHOULD_SHOW_CONSENT_BUMP));
 }
 
 bool UnifiedConsentService::AreAllNonPersonalizedServicesEnabled() {
@@ -250,4 +264,14 @@
   return true;
 }
 
+bool UnifiedConsentService::AreAllOnByDefaultPrivacySettingsOn() {
+  for (auto service : {Service::kAlternateErrorPages,
+                       Service::kMetricsReporting, Service::kNetworkPrediction,
+                       Service::kSafeBrowsing, Service::kSearchSuggest}) {
+    if (service_client_->GetServiceState(service) == ServiceState::kDisabled)
+      return false;
+  }
+  return true;
+}
+
 }  //  namespace unified_consent
diff --git a/components/unified_consent/unified_consent_service.h b/components/unified_consent/unified_consent_service.h
index 022aecc7..20674ed 100644
--- a/components/unified_consent/unified_consent_service.h
+++ b/components/unified_consent/unified_consent_service.h
@@ -37,6 +37,17 @@
   COMPLETED = 10,
 };
 
+enum class ConsentBumpSuppressReason {
+  kNone,
+  kNotSignedIn,
+  kSyncEverythingOff,
+  kPrivacySettingOff,
+  kSettingsOptIn,
+  kUserSignedOut,
+  kSyncPaused,
+  kMaxValue = kSyncPaused
+};
+
 // A browser-context keyed service that is used to manage the user consent
 // when UnifiedConsent feature is enabled.
 class UnifiedConsentService : public KeyedService,
@@ -67,7 +78,13 @@
   bool ShouldShowConsentBump();
   // Finishes the migration to unified consent. All future calls to
   // |GetMigrationState| are guranteed to return |MIGRATION_COMPLETED|.
-  void MarkMigrationComplete();
+  // Takes as argument the suppress reason for not showing the consent
+  // bump if it wasn't shown.
+  void MarkMigrationComplete(ConsentBumpSuppressReason suppress_reason);
+  // Records the suppress reason for the consent bump without changing the
+  // migration state.
+  void RecordConsentBumpSuppressReason(
+      ConsentBumpSuppressReason suppress_reason);
 
   // KeyedService:
   void Shutdown() override;
@@ -100,6 +117,9 @@
   // Returns true if all non-personalized services are enabled.
   bool AreAllNonPersonalizedServicesEnabled();
 
+  // Checks if all on-by-default non-personalized services are on.
+  bool AreAllOnByDefaultPrivacySettingsOn();
+
   std::unique_ptr<UnifiedConsentServiceClient> service_client_;
   PrefService* pref_service_;
   identity::IdentityManager* identity_manager_;
diff --git a/components/unified_consent/unified_consent_service_unittest.cc b/components/unified_consent/unified_consent_service_unittest.cc
index bd7b839..645da65 100644
--- a/components/unified_consent/unified_consent_service_unittest.cc
+++ b/components/unified_consent/unified_consent_service_unittest.cc
@@ -24,7 +24,7 @@
 class TestSyncService : public syncer::FakeSyncService {
  public:
   int GetDisableReasons() const override { return DISABLE_REASON_NONE; }
-  State GetState() const override { return state_; }
+  TransportState GetTransportState() const override { return state_; }
   bool IsFirstSetupComplete() const override { return true; }
   void AddObserver(syncer::SyncServiceObserver* observer) override {
     observer_ = observer;
@@ -34,7 +34,7 @@
     is_syncing_everything_ = sync_everything;
   }
 
-  void SetState(State state) { state_ = state; }
+  void SetTransportState(TransportState state) { state_ = state; }
   void FireStateChanged() {
     if (observer_)
       observer_->OnStateChanged(this);
@@ -46,7 +46,7 @@
 
  private:
   syncer::SyncServiceObserver* observer_ = nullptr;
-  State state_ = State::ACTIVE;
+  TransportState state_ = TransportState::ACTIVE;
   bool is_syncing_everything_ = false;
 };
 
@@ -117,11 +117,20 @@
 
   void TearDown() override { consent_service_->Shutdown(); }
 
-  void CreateConsentService() {
+  void CreateConsentService(bool client_services_on_by_default = false) {
+    auto client =
+        std::make_unique<FakeUnifiedConsentServiceClient>(&pref_service_);
+    if (client_services_on_by_default) {
+      for (int i = 0; i <= static_cast<int>(Service::kLast); ++i) {
+        Service service = static_cast<Service>(i);
+        client->SetServiceEnabled(service, true);
+      }
+      pref_service_.SetBoolean(prefs::kUrlKeyedAnonymizedDataCollectionEnabled,
+                               true);
+    }
     consent_service_ = std::make_unique<UnifiedConsentService>(
-        std::make_unique<FakeUnifiedConsentServiceClient>(&pref_service_),
-        &pref_service_, identity_test_environment_.identity_manager(),
-        &sync_service_);
+        std::move(client), &pref_service_,
+        identity_test_environment_.identity_manager(), &sync_service_);
     service_client_ = (FakeUnifiedConsentServiceClient*)
                           consent_service_->service_client_.get();
   }
@@ -130,6 +139,10 @@
     return consent_service_->AreAllNonPersonalizedServicesEnabled();
   }
 
+  bool AreAllOnByDefaultPrivacySettingsOn() {
+    return consent_service_->AreAllOnByDefaultPrivacySettingsOn();
+  }
+
  protected:
   base::MessageLoop message_loop_;
   sync_preferences::TestingPrefServiceSyncable pref_service_;
@@ -201,9 +214,11 @@
   EXPECT_FALSE(consent_service_->IsUnifiedConsentGiven());
 
   // Make sure sync is not active.
-  sync_service_.SetState(syncer::SyncService::State::INITIALIZING);
+  sync_service_.SetTransportState(
+      syncer::SyncService::TransportState::INITIALIZING);
   EXPECT_FALSE(sync_service_.IsEngineInitialized());
-  EXPECT_NE(sync_service_.GetState(), syncer::SyncService::State::ACTIVE);
+  EXPECT_NE(sync_service_.GetTransportState(),
+            syncer::SyncService::TransportState::ACTIVE);
 
   // Opt into unified consent.
   consent_service_->SetUnifiedConsentGiven(true);
@@ -213,7 +228,7 @@
   EXPECT_FALSE(sync_service_.IsSyncingEverything());
 
   // Initalize sync engine and therefore activate sync.
-  sync_service_.SetState(syncer::SyncService::State::ACTIVE);
+  sync_service_.SetTransportState(syncer::SyncService::TransportState::ACTIVE);
   sync_service_.FireStateChanged();
 
   // UnifiedConsentService starts syncing everything.
@@ -272,7 +287,45 @@
 }
 
 #if !defined(OS_CHROMEOS)
-TEST_F(UnifiedConsentServiceTest, Migration_SyncingEverything) {
+TEST_F(UnifiedConsentServiceTest, Migration_SyncingEverythingAndAllServicesOn) {
+  base::HistogramTester histogram_tester;
+
+  // Create inconsistent state.
+  identity_test_environment_.SetPrimaryAccount("testaccount");
+  syncer::SyncPrefs sync_prefs(&pref_service_);
+  sync_prefs.SetKeepEverythingSynced(true);
+  EXPECT_TRUE(sync_prefs.HasKeepEverythingSynced());
+  sync_service_.OnUserChoseDatatypes(true, {});
+  EXPECT_TRUE(sync_service_.IsSyncingEverything());
+  EXPECT_FALSE(pref_service_.GetBoolean(prefs::kUnifiedConsentGiven));
+
+  CreateConsentService(true /* client services on by default */);
+  EXPECT_TRUE(AreAllNonPersonalizedServicesEnabled());
+  // After the creation of the consent service, inconsistencies are resolved and
+  // the migration state should be in-progress (i.e. the consent bump should be
+  // shown).
+  EXPECT_FALSE(pref_service_.GetBoolean(prefs::kUnifiedConsentGiven));
+  EXPECT_FALSE(sync_service_.IsSyncingEverything());
+  EXPECT_EQ(
+      consent_service_->GetMigrationState(),
+      unified_consent::MigrationState::IN_PROGRESS_SHOULD_SHOW_CONSENT_BUMP);
+  // No metric for the consent bump suppress reason should have been recorded at
+  // this point.
+  histogram_tester.ExpectTotalCount("UnifiedConsent.ConsentBump.SuppressReason",
+                                    0);
+
+  // When the user signs out, the migration state changes to completed.
+  identity_test_environment_.ClearPrimaryAccount();
+  EXPECT_EQ(consent_service_->GetMigrationState(),
+            unified_consent::MigrationState::COMPLETED);
+  // A metric for the consent bump suppress reason should have been recorded at
+  // this point.
+  histogram_tester.ExpectBucketCount(
+      "UnifiedConsent.ConsentBump.SuppressReason",
+      unified_consent::ConsentBumpSuppressReason::kUserSignedOut, 1);
+}
+
+TEST_F(UnifiedConsentServiceTest, Migration_SyncingEverythingAndServicesOff) {
   base::HistogramTester histogram_tester;
 
   // Create inconsistent state.
@@ -285,22 +338,20 @@
   EXPECT_FALSE(pref_service_.GetBoolean(prefs::kUnifiedConsentGiven));
 
   CreateConsentService();
+  EXPECT_FALSE(AreAllOnByDefaultPrivacySettingsOn());
   // After the creation of the consent service, inconsistencies are resolved and
-  // the migration state should be in-progress (i.e. the consent bump should be
-  // shown).
+  // the migration state should be completed because not all on-by-default
+  // privacy settings were on.
   EXPECT_FALSE(pref_service_.GetBoolean(prefs::kUnifiedConsentGiven));
   EXPECT_FALSE(sync_service_.IsSyncingEverything());
-  EXPECT_EQ(
-      consent_service_->GetMigrationState(),
-      unified_consent::MigrationState::IN_PROGRESS_SHOULD_SHOW_CONSENT_BUMP);
-  // A metric should be recorded that the user was syncing everything.
-  histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.Migration.SyncEverythingWasOn", true, 1);
-
-  // When the user signs out, the migration state changes to completed.
-  identity_test_environment_.ClearPrimaryAccount();
   EXPECT_EQ(consent_service_->GetMigrationState(),
             unified_consent::MigrationState::COMPLETED);
+
+  // A metric for the consent bump suppress reason should have been recorded at
+  // this point.
+  histogram_tester.ExpectBucketCount(
+      "UnifiedConsent.ConsentBump.SuppressReason",
+      unified_consent::ConsentBumpSuppressReason::kPrivacySettingOff, 1);
 }
 #endif  // !defined(OS_CHROMEOS)
 
@@ -318,9 +369,10 @@
   // creation of the consent service.
   EXPECT_EQ(consent_service_->GetMigrationState(),
             unified_consent::MigrationState::COMPLETED);
-  // A metric should be recorded that the user wasn't syncing everything.
+  // The suppress reason for not showing the consent bump should be recorded.
   histogram_tester.ExpectBucketCount(
-      "UnifiedConsent.Migration.SyncEverythingWasOn", false, 1);
+      "UnifiedConsent.ConsentBump.SuppressReason",
+      unified_consent::ConsentBumpSuppressReason::kSyncEverythingOff, 1);
 }
 
 #if !defined(OS_CHROMEOS)
@@ -357,6 +409,22 @@
   EXPECT_EQ(service_client_->GetServiceState(Service::kSafeBrowsing),
             ServiceState::kEnabled);
 }
+
+TEST_F(UnifiedConsentServiceTest, Migration_NotSignedIn) {
+  base::HistogramTester histogram_tester;
+
+  EXPECT_FALSE(pref_service_.GetBoolean(prefs::kUnifiedConsentGiven));
+
+  CreateConsentService();
+  // Since there were not inconsistencies, the migration is completed after the
+  // creation of the consent service.
+  EXPECT_EQ(consent_service_->GetMigrationState(),
+            unified_consent::MigrationState::COMPLETED);
+  // The suppress reason for not showing the consent bump should be recorded.
+  histogram_tester.ExpectBucketCount(
+      "UnifiedConsent.ConsentBump.SuppressReason",
+      unified_consent::ConsentBumpSuppressReason::kNotSignedIn, 1);
+}
 #endif  // !defined(OS_CHROMEOS)
 
 }  // namespace unified_consent
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper.cc b/components/unified_consent/url_keyed_data_collection_consent_helper.cc
index 6ad5213..17f2e88e 100644
--- a/components/unified_consent/url_keyed_data_collection_consent_helper.cc
+++ b/components/unified_consent/url_keyed_data_collection_consent_helper.cc
@@ -13,6 +13,9 @@
 #include "components/sync/driver/sync_service_utils.h"
 #include "components/unified_consent/pref_names.h"
 
+#include <map>
+#include <set>
+
 namespace unified_consent {
 
 namespace {
@@ -41,7 +44,7 @@
  public:
   SyncBasedUrlKeyedDataCollectionConsentHelper(
       syncer::SyncService* sync_service,
-      syncer::ModelType sync_data_type);
+      std::set<syncer::ModelType> sync_data_types);
   ~SyncBasedUrlKeyedDataCollectionConsentHelper() override;
 
   // UrlKeyedDataCollectionConsentHelper:
@@ -52,9 +55,10 @@
   void OnSyncShutdown(syncer::SyncService* sync) override;
 
  private:
+  void UpdateSyncDataTypeStates();
+
   syncer::SyncService* sync_service_;
-  syncer::ModelType sync_data_type_;
-  syncer::UploadState sync_data_type_upload_state_;
+  std::map<syncer::ModelType, syncer::UploadState> sync_data_type_states_;
 
   DISALLOW_COPY_AND_ASSIGN(SyncBasedUrlKeyedDataCollectionConsentHelper);
 };
@@ -82,15 +86,17 @@
 SyncBasedUrlKeyedDataCollectionConsentHelper::
     SyncBasedUrlKeyedDataCollectionConsentHelper(
         syncer::SyncService* sync_service,
-        syncer::ModelType sync_data_type)
-    : sync_service_(sync_service),
-      sync_data_type_(sync_data_type),
-      sync_data_type_upload_state_(
-          syncer::GetUploadToGoogleState(sync_service_, sync_data_type_)) {
+        std::set<syncer::ModelType> sync_data_types)
+    : sync_service_(sync_service) {
+  DCHECK(!sync_data_types.empty());
+
+  for (const auto& sync_data_type : sync_data_types) {
+    sync_data_type_states_[sync_data_type] = syncer::UploadState::NOT_ACTIVE;
+  }
+  UpdateSyncDataTypeStates();
+
   if (sync_service_)
     sync_service_->AddObserver(this);
-  else
-    DCHECK_EQ(syncer::UploadState::NOT_ACTIVE, sync_data_type_upload_state_);
 }
 
 SyncBasedUrlKeyedDataCollectionConsentHelper::
@@ -100,16 +106,18 @@
 }
 
 bool SyncBasedUrlKeyedDataCollectionConsentHelper::IsEnabled() {
-  return sync_data_type_upload_state_ == syncer::UploadState::ACTIVE;
+  for (const auto& sync_data_type_states : sync_data_type_states_) {
+    if (sync_data_type_states.second != syncer::UploadState::ACTIVE)
+      return false;
+  }
+  return true;
 }
 
 void SyncBasedUrlKeyedDataCollectionConsentHelper::OnStateChanged(
     syncer::SyncService* sync_service) {
   DCHECK_EQ(sync_service_, sync_service);
   bool enabled_before_state_updated = IsEnabled();
-  sync_data_type_upload_state_ =
-      syncer::GetUploadToGoogleState(sync_service_, sync_data_type_);
-
+  UpdateSyncDataTypeStates();
   if (enabled_before_state_updated != IsEnabled())
     FireOnStateChanged();
 }
@@ -121,6 +129,13 @@
   sync_service_ = nullptr;
 }
 
+void SyncBasedUrlKeyedDataCollectionConsentHelper::UpdateSyncDataTypeStates() {
+  for (auto iter = sync_data_type_states_.begin();
+       iter != sync_data_type_states_.end(); ++iter) {
+    iter->second = syncer::GetUploadToGoogleState(sync_service_, iter->first);
+  }
+}
+
 }  // namespace
 
 UrlKeyedDataCollectionConsentHelper::UrlKeyedDataCollectionConsentHelper() =
@@ -140,7 +155,8 @@
   }
 
   return std::make_unique<SyncBasedUrlKeyedDataCollectionConsentHelper>(
-      sync_service, syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
+      sync_service, std::set<syncer::ModelType>(
+                        {syncer::ModelType::HISTORY_DELETE_DIRECTIVES}));
 }
 
 // static
@@ -148,11 +164,16 @@
 UrlKeyedDataCollectionConsentHelper::NewPersonalizedDataCollectionConsentHelper(
     bool is_unified_consent_enabled,
     syncer::SyncService* sync_service) {
-  syncer::ModelType sync_type =
-      is_unified_consent_enabled ? syncer::ModelType::USER_EVENTS
-                                 : syncer::ModelType::HISTORY_DELETE_DIRECTIVES;
-  return std::make_unique<SyncBasedUrlKeyedDataCollectionConsentHelper>(
-      sync_service, sync_type);
+  if (is_unified_consent_enabled) {
+    return std::make_unique<SyncBasedUrlKeyedDataCollectionConsentHelper>(
+        sync_service, std::set<syncer::ModelType>(
+                          {syncer::ModelType::HISTORY_DELETE_DIRECTIVES,
+                           syncer::ModelType::USER_EVENTS}));
+  } else {
+    return std::make_unique<SyncBasedUrlKeyedDataCollectionConsentHelper>(
+        sync_service, std::set<syncer::ModelType>(
+                          {syncer::ModelType::HISTORY_DELETE_DIRECTIVES}));
+  }
 }
 
 void UrlKeyedDataCollectionConsentHelper::AddObserver(Observer* observer) {
diff --git a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
index d677ccb..7b12a12 100644
--- a/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
+++ b/components/unified_consent/url_keyed_data_collection_consent_helper_unittest.cc
@@ -21,9 +21,10 @@
   void set_sync_initialized(bool sync_initialized) {
     sync_initialized_ = sync_initialized;
   }
-  void set_sync_active_data_type(syncer::ModelType type) {
-    sync_active_data_type_ = type;
+  void AddActiveDataType(syncer::ModelType type) {
+    sync_active_data_types_.Put(type);
   }
+  void ClearActiveDataTypes() { sync_active_data_types_.Clear(); }
   void FireOnStateChangeOnAllObservers() {
     for (auto& observer : observers_)
       observer.OnStateChanged(this);
@@ -31,10 +32,13 @@
 
   // syncer::FakeSyncService:
   int GetDisableReasons() const override { return DISABLE_REASON_NONE; }
-  State GetState() const override { return State::ACTIVE; }
+  TransportState GetTransportState() const override {
+    return TransportState::ACTIVE;
+  }
   syncer::ModelTypeSet GetPreferredDataTypes() const override {
     return syncer::ModelTypeSet(syncer::ModelType::HISTORY_DELETE_DIRECTIVES,
-                                syncer::ModelType::USER_EVENTS);
+                                syncer::ModelType::USER_EVENTS,
+                                syncer::ModelType::EXTENSIONS);
   }
   bool IsFirstSetupComplete() const override { return true; }
 
@@ -53,10 +57,7 @@
   }
 
   syncer::ModelTypeSet GetActiveDataTypes() const override {
-    if (sync_active_data_type_ != syncer::ModelType::UNSPECIFIED) {
-      return syncer::ModelTypeSet(sync_active_data_type_);
-    }
-    return syncer::ModelTypeSet();
+    return sync_active_data_types_;
   }
 
   void AddObserver(syncer::SyncServiceObserver* observer) override {
@@ -68,7 +69,7 @@
 
  private:
   bool sync_initialized_ = false;
-  syncer::ModelType sync_active_data_type_ = syncer::ModelType::UNSPECIFIED;
+  syncer::ModelTypeSet sync_active_data_types_;
   base::ObserverList<syncer::SyncServiceObserver> observers_;
 };
 
@@ -128,11 +129,10 @@
   EXPECT_TRUE(state_changed_notifications.empty());
 
   sync_service_.set_sync_initialized(true);
-  sync_service_.set_sync_active_data_type(
-      syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
+  sync_service_.AddActiveDataType(syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
   sync_service_.FireOnStateChangeOnAllObservers();
   EXPECT_TRUE(helper->IsEnabled());
-  ASSERT_EQ(1U, state_changed_notifications.size());
+  EXPECT_EQ(1U, state_changed_notifications.size());
   helper->RemoveObserver(this);
 }
 
@@ -154,12 +154,30 @@
   helper->AddObserver(this);
   EXPECT_FALSE(helper->IsEnabled());
   EXPECT_TRUE(state_changed_notifications.empty());
-
   sync_service_.set_sync_initialized(true);
-  sync_service_.set_sync_active_data_type(syncer::ModelType::USER_EVENTS);
+
+  // Peronalized data collection is disabled when only USER_EVENTS are enabled.
+  sync_service_.AddActiveDataType(syncer::ModelType::USER_EVENTS);
+  sync_service_.FireOnStateChangeOnAllObservers();
+  EXPECT_FALSE(helper->IsEnabled());
+  EXPECT_TRUE(state_changed_notifications.empty());
+
+  // Peronalized data collection is disabled when only HISTORY_DELETE_DIRECTIVES
+  // are enabled.
+  sync_service_.ClearActiveDataTypes();
+  sync_service_.AddActiveDataType(syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
+  sync_service_.FireOnStateChangeOnAllObservers();
+  EXPECT_FALSE(helper->IsEnabled());
+  EXPECT_TRUE(state_changed_notifications.empty());
+
+  // Personalized data collection is enabled iff USER_EVENTS and
+  // HISTORY_DELETE_DIRECTIVES are enabled.
+  sync_service_.ClearActiveDataTypes();
+  sync_service_.AddActiveDataType(syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
+  sync_service_.AddActiveDataType(syncer::ModelType::USER_EVENTS);
   sync_service_.FireOnStateChangeOnAllObservers();
   EXPECT_TRUE(helper->IsEnabled());
-  ASSERT_EQ(1U, state_changed_notifications.size());
+  EXPECT_EQ(1U, state_changed_notifications.size());
   helper->RemoveObserver(this);
 }
 
@@ -173,11 +191,10 @@
   EXPECT_TRUE(state_changed_notifications.empty());
 
   sync_service_.set_sync_initialized(true);
-  sync_service_.set_sync_active_data_type(
-      syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
+  sync_service_.AddActiveDataType(syncer::ModelType::HISTORY_DELETE_DIRECTIVES);
   sync_service_.FireOnStateChangeOnAllObservers();
   EXPECT_TRUE(helper->IsEnabled());
-  ASSERT_EQ(1U, state_changed_notifications.size());
+  EXPECT_EQ(1U, state_changed_notifications.size());
   helper->RemoveObserver(this);
 }
 
diff --git a/components/update_client/action_runner.cc b/components/update_client/action_runner.cc
index ea5a431..7b823bb 100644
--- a/components/update_client/action_runner.cc
+++ b/components/update_client/action_runner.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/update_client/component.h"
 #include "components/update_client/configurator.h"
diff --git a/components/update_client/action_runner_win.cc b/components/update_client/action_runner_win.cc
index 2240b46..b257c38 100644
--- a/components/update_client/action_runner_win.cc
+++ b/components/update_client/action_runner_win.cc
@@ -12,7 +12,7 @@
 #include "base/process/launch.h"
 #include "base/process/process.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/update_client/component.h"
 #include "components/update_client/configurator.h"
 #include "components/update_client/task_traits.h"
diff --git a/components/update_client/background_downloader_win.cc b/components/update_client/background_downloader_win.cc
index f639576..185e6ec 100644
--- a/components/update_client/background_downloader_win.cc
+++ b/components/update_client/background_downloader_win.cc
@@ -26,8 +26,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/win/scoped_co_mem.h"
 #include "components/update_client/task_traits.h"
 #include "components/update_client/update_client_errors.h"
diff --git a/components/update_client/component.cc b/components/update_client/component.cc
index 7a030fc..19339f4 100644
--- a/components/update_client/component.cc
+++ b/components/update_client/component.cc
@@ -13,7 +13,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/update_client/action_runner.h"
 #include "components/update_client/component_unpacker.h"
diff --git a/components/update_client/component_patcher_operation.cc b/components/update_client/component_patcher_operation.cc
index de1a5dc..b3a1ec1c 100644
--- a/components/update_client/component_patcher_operation.cc
+++ b/components/update_client/component_patcher_operation.cc
@@ -13,7 +13,7 @@
 #include "base/files/memory_mapped_file.h"
 #include "base/location.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/services/patch/public/cpp/patch.h"
 #include "components/update_client/update_client.h"
diff --git a/components/update_client/component_unpacker_unittest.cc b/components/update_client/component_unpacker_unittest.cc
index cf0204c..08f22ed 100644
--- a/components/update_client/component_unpacker_unittest.cc
+++ b/components/update_client/component_unpacker_unittest.cc
@@ -16,7 +16,7 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/crx_file/crx_verifier.h"
diff --git a/components/update_client/crx_downloader.cc b/components/update_client/crx_downloader.cc
index ff5f424..7af00a8 100644
--- a/components/update_client/crx_downloader.cc
+++ b/components/update_client/crx_downloader.cc
@@ -10,8 +10,8 @@
 #include "base/files/file_util.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #if defined(OS_WIN)
diff --git a/components/update_client/task_traits.h b/components/update_client/task_traits.h
index eb10d36..d14bbea 100644
--- a/components/update_client/task_traits.h
+++ b/components/update_client/task_traits.h
@@ -5,7 +5,7 @@
 #ifndef COMPONENTS_UPDATE_CLIENT_TASK_TRAITS_H_
 #define COMPONENTS_UPDATE_CLIENT_TASK_TRAITS_H_
 
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 
 namespace update_client {
 
diff --git a/components/update_client/test_installer.cc b/components/update_client/test_installer.cc
index 5278dcb..d0febe5 100644
--- a/components/update_client/test_installer.cc
+++ b/components/update_client/test_installer.cc
@@ -8,8 +8,8 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/values.h"
 #include "components/update_client/update_client_errors.h"
 #include "components/update_client/utils.h"
diff --git a/components/update_client/update_checker.cc b/components/update_client/update_checker.cc
index c497752..d915d383 100644
--- a/components/update_client/update_checker.cc
+++ b/components/update_client/update_checker.cc
@@ -17,7 +17,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_checker.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/components/update_client/update_checker_unittest.cc b/components/update_client/update_checker_unittest.cc
index 21890708..dd521b3f6 100644
--- a/components/update_client/update_checker_unittest.cc
+++ b/components/update_client/update_checker_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/run_loop.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/update_client/update_client_unittest.cc b/components/update_client/update_client_unittest.cc
index 960133ee8..d0c9bc14 100644
--- a/components/update_client/update_client_unittest.cc
+++ b/components/update_client/update_client_unittest.cc
@@ -15,8 +15,8 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/scoped_path_override.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/components/update_client/url_fetcher_downloader.cc b/components/update_client/url_fetcher_downloader.cc
index e26e986..2a058555 100644
--- a/components/update_client/url_fetcher_downloader.cc
+++ b/components/update_client/url_fetcher_downloader.cc
@@ -12,8 +12,8 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
 #include "components/update_client/utils.h"
 #include "net/base/load_flags.h"
diff --git a/components/upload_list/upload_list.cc b/components/upload_list/upload_list.cc
index 547fd0e8..536ac040 100644
--- a/components/upload_list/upload_list.cc
+++ b/components/upload_list/upload_list.cc
@@ -9,7 +9,7 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 UploadList::UploadInfo::UploadInfo(const std::string& upload_id,
                                    const base::Time& upload_time,
diff --git a/components/upload_list/upload_list.h b/components/upload_list/upload_list.h
index bc28d10..d2a3a3b 100644
--- a/components/upload_list/upload_list.h
+++ b/components/upload_list/upload_list.h
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequence_checker.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 
 // An UploadList is an abstraction over a list of client-side data files that
diff --git a/components/variations/service/variations_service.cc b/components/variations/service/variations_service.cc
index 4b36fc0..8195705 100644
--- a/components/variations/service/variations_service.cc
+++ b/components/variations/service/variations_service.cc
@@ -20,7 +20,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/timer/elapsed_timer.h"
 #include "base/values.h"
diff --git a/components/visitedlink/browser/visitedlink_master.h b/components/visitedlink/browser/visitedlink_master.h
index d78724b..544c999 100644
--- a/components/visitedlink/browser/visitedlink_master.h
+++ b/components/visitedlink/browser/visitedlink_master.h
@@ -22,7 +22,7 @@
 #include "base/memory/shared_memory_mapping.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/visitedlink/common/visitedlink_common.h"
 
diff --git a/components/viz/common/BUILD.gn b/components/viz/common/BUILD.gn
index 44ea7ef9..9ed1b00b 100644
--- a/components/viz/common/BUILD.gn
+++ b/components/viz/common/BUILD.gn
@@ -53,8 +53,6 @@
     "frame_sinks/delay_based_time_source.h",
     "gl_helper.cc",
     "gl_helper.h",
-    "gl_helper_readback_support.cc",
-    "gl_helper_readback_support.h",
     "gl_helper_scaling.cc",
     "gl_helper_scaling.h",
     "gpu/context_cache_controller.cc",
diff --git a/components/viz/common/gl_helper.cc b/components/viz/common/gl_helper.cc
index 34ea8dd..29bfd28 100644
--- a/components/viz/common/gl_helper.cc
+++ b/components/viz/common/gl_helper.cc
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/containers/queue.h"
@@ -19,7 +20,6 @@
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
-#include "components/viz/common/gl_helper_readback_support.h"
 #include "components/viz/common/gl_helper_scaling.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/context_support.h"
@@ -132,9 +132,7 @@
 
 }  // namespace
 
-typedef GLHelperReadbackSupport::FormatSupport FormatSupport;
-
-// Implements GLHelper::CropScaleReadbackAndCleanTexture and encapsulates
+// Implements texture consumption/readback and encapsulates
 // the data needed for it.
 class GLHelper::CopyTextureToImpl
     : public base::SupportsWeakPtr<GLHelper::CopyTextureToImpl> {
@@ -145,17 +143,7 @@
       : gl_(gl),
         context_support_(context_support),
         helper_(helper),
-        flush_(gl),
-        max_draw_buffers_(0) {
-    const GLubyte* extensions = gl_->GetString(GL_EXTENSIONS);
-    if (!extensions)
-      return;
-    std::string extensions_string =
-        " " + std::string(reinterpret_cast<const char*>(extensions)) + " ";
-    if (extensions_string.find(" GL_EXT_draw_buffers ") != std::string::npos) {
-      gl_->GetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &max_draw_buffers_);
-    }
-  }
+        flush_(gl) {}
   ~CopyTextureToImpl() { CancelRequests(); }
 
   GLuint ConsumeMailboxToTexture(const gpu::Mailbox& mailbox,
@@ -163,25 +151,11 @@
     return helper_->ConsumeMailboxToTexture(mailbox, sync_token);
   }
 
-  void CropScaleReadbackAndCleanTexture(
-      GLuint src_texture,
-      const gfx::Size& src_size,
-      const gfx::Size& dst_size,
-      unsigned char* out,
-      const SkColorType out_color_type,
-      const base::Callback<void(bool)>& callback,
-      GLHelper::ScalerQuality quality);
-
-  void ReadbackTextureSync(GLuint texture,
-                           const gfx::Rect& src_rect,
-                           unsigned char* out,
-                           SkColorType format);
-
   void ReadbackTextureAsync(GLuint texture,
                             const gfx::Size& dst_size,
                             unsigned char* out,
                             SkColorType color_type,
-                            const base::Callback<void(bool)>& callback);
+                            base::OnceCallback<void(bool)> callback);
 
   // Reads back bytes from the currently bound frame buffer.
   // Note that dst_size is specified in bytes, not pixels.
@@ -192,7 +166,7 @@
                      GLenum format,
                      GLenum type,
                      size_t bytes_per_pixel,
-                     const base::Callback<void(bool)>& callback);
+                     base::OnceCallback<void(bool)> callback);
 
   void ReadbackPlane(const gfx::Size& texture_size,
                      int row_stride_bytes,
@@ -200,30 +174,14 @@
                      int size_shift,
                      const gfx::Rect& paste_rect,
                      ReadbackSwizzle swizzle,
-                     const base::Callback<void(bool)>& callback);
-
-  GLuint CopyAndScaleTexture(GLuint texture,
-                             const gfx::Size& src_size,
-                             const gfx::Size& dst_size,
-                             bool vertically_flip_texture,
-                             GLHelper::ScalerQuality quality);
+                     base::OnceCallback<void(bool)> callback);
 
   std::unique_ptr<ReadbackYUVInterface> CreateReadbackPipelineYUV(
       bool flip_vertically,
       bool use_mrt);
 
-  // Returns the maximum number of draw buffers available,
-  // 0 if GL_EXT_draw_buffers is not available.
-  GLint MaxDrawBuffers() const { return max_draw_buffers_; }
-
-  FormatSupport GetReadbackConfig(SkColorType color_type,
-                                  bool can_swizzle,
-                                  GLenum* format,
-                                  GLenum* type,
-                                  size_t* bytes_per_pixel);
-
  private:
-  // A single request to CropScaleReadbackAndCleanTexture.
+  // Represents the state of a single readback request.
   // The main thread can cancel the request, before it's handled by the helper
   // thread, by resetting the texture and pixels fields. Alternatively, the
   // thread marks that it handles the request by resetting the pixels field
@@ -235,13 +193,13 @@
             size_t bytes_per_row_,
             size_t row_stride_bytes_,
             unsigned char* pixels_,
-            const base::Callback<void(bool)>& callback_)
+            base::OnceCallback<void(bool)> callback_)
         : done(false),
           size(size_),
           bytes_per_row(bytes_per_row_),
           row_stride_bytes(row_stride_bytes_),
           pixels(pixels_),
-          callback(callback_),
+          callback(std::move(callback_)),
           buffer(0),
           query(0) {}
 
@@ -251,7 +209,7 @@
     size_t bytes_per_row;
     size_t row_stride_bytes;
     unsigned char* pixels;
-    base::Callback<void(bool)> callback;
+    base::OnceCallback<void(bool)> callback;
     GLuint buffer;
     GLuint query;
   };
@@ -267,7 +225,7 @@
       while (!requests_.empty()) {
         Request* request = requests_.front();
         requests_.pop();
-        request->callback.Run(request->result);
+        std::move(request->callback).Run(request->result);
         delete request;
       }
     }
@@ -309,7 +267,7 @@
                      int v_plane_row_stride_bytes,
                      unsigned char* v_plane_data,
                      const gfx::Point& paste_location,
-                     const base::Callback<void(bool)>& callback) override;
+                     base::OnceCallback<void(bool)> callback) override;
 
    private:
     GLES2Interface* gl_;
@@ -334,43 +292,14 @@
     DISALLOW_COPY_AND_ASSIGN(ReadbackYUVImpl);
   };
 
-  // Copies everything from |src_texture| (of size |src_size|),
-  // scales it to |dst_size|, writes it into a texture, and returns its ID.
-  // |src_size| is the size of |src_texture|.
-  GLuint ScaleTexture(GLuint src_texture,
-                      const gfx::Size& src_size,
-                      const gfx::Size& dst_size,
-                      bool vertically_flip_texture,
-                      bool swizzle,
-                      SkColorType color_type,
-                      GLHelper::ScalerQuality quality);
-
-  // Converts each four consecutive pixels of the source texture into one pixel
-  // in the result texture with each pixel channel representing the grayscale
-  // color of one of the four original pixels:
-  // R1G1B1A1 R2G2B2A2 R3G3B3A3 R4G4B4A4 -> X1X2X3X4
-  // The resulting texture is still an RGBA texture (which is ~4 times narrower
-  // than the original). If rendered directly, it wouldn't show anything useful,
-  // but the data in it can be used to construct a grayscale image.
-  // |encoded_texture_size| is the exact size of the resulting RGBA texture. It
-  // is equal to src_size.width()/4 rounded upwards. Some channels in the last
-  // pixel ((-src_size.width()) % 4) to be exact) are padding and don't contain
-  // useful data.
-  // If swizzle is set to true, the transformed pixels are reordered:
-  // R1G1B1A1 R2G2B2A2 R3G3B3A3 R4G4B4A4 -> X3X2X1X4.
-  GLuint EncodeTextureAsGrayscale(GLuint src_texture,
-                                  const gfx::Size& src_size,
-                                  gfx::Size* const encoded_texture_size,
-                                  bool vertically_flip_texture,
-                                  bool swizzle);
-
-  static void nullcallback(bool success) {}
   void ReadbackDone(Request* request, size_t bytes_per_pixel);
   void FinishRequest(Request* request,
                      bool result,
                      FinishRequestHelper* helper);
   void CancelRequests();
 
+  bool IsBGRAReadbackSupported();
+
   GLES2Interface* gl_;
   gpu::ContextSupport* context_support_;
   GLHelper* helper_;
@@ -380,7 +309,21 @@
   ScopedFlush flush_;
 
   base::queue<Request*> request_queue_;
-  GLint max_draw_buffers_;
+
+  // Lazily set by IsBGRAReadbackSupported().
+  enum {
+    BGRA_SUPPORT_UNKNOWN,
+    BGRA_SUPPORTED,
+    BGRA_NOT_SUPPORTED
+  } bgra_support_ = BGRA_SUPPORT_UNKNOWN;
+
+  // A run-once test is lazy executed in CreateReadbackPipelineYUV(), to
+  // determine whether the GL_BGRA_EXT format is preferred for readback.
+  enum {
+    BGRA_PREFERENCE_UNKNOWN,
+    BGRA_PREFERRED,
+    BGRA_NOT_PREFERRED
+  } bgra_preference_ = BGRA_PREFERENCE_UNKNOWN;
 };
 
 std::unique_ptr<GLHelper::ScalerInterface> GLHelper::CreateScaler(
@@ -395,69 +338,6 @@
                                     flipped_source, flip_output, swizzle);
 }
 
-GLuint GLHelper::CopyTextureToImpl::ScaleTexture(
-    GLuint src_texture,
-    const gfx::Size& src_size,
-    const gfx::Size& dst_size,
-    bool vertically_flip_texture,
-    bool swizzle,
-    SkColorType color_type,
-    GLHelper::ScalerQuality quality) {
-  if (src_size.IsEmpty() || dst_size.IsEmpty())
-    return 0;
-
-  GLuint dst_texture = 0u;
-  gl_->GenTextures(1, &dst_texture);
-  {
-    GLenum format = GL_RGBA, type = GL_UNSIGNED_BYTE;
-    ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, dst_texture);
-
-    // Use GL_RGBA for destination/temporary texture unless we're working with
-    // 16-bit data
-    if (color_type == kRGB_565_SkColorType) {
-      format = GL_RGB;
-      type = GL_UNSIGNED_SHORT_5_6_5;
-    }
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, format, dst_size.width(),
-                    dst_size.height(), 0, format, type, nullptr);
-  }
-
-  const std::unique_ptr<ScalerInterface> scaler = helper_->CreateScaler(
-      quality, gfx::Vector2d(src_size.width(), src_size.height()),
-      gfx::Vector2d(dst_size.width(), dst_size.height()), false,
-      vertically_flip_texture, swizzle);
-  scaler->Scale(src_texture, src_size, gfx::Vector2dF(), dst_texture,
-                gfx::Rect(dst_size));
-  return dst_texture;
-}
-
-GLuint GLHelper::CopyTextureToImpl::EncodeTextureAsGrayscale(
-    GLuint src_texture,
-    const gfx::Size& src_size,
-    gfx::Size* const encoded_texture_size,
-    bool vertically_flip_texture,
-    bool swizzle) {
-  GLuint dst_texture = 0u;
-  gl_->GenTextures(1, &dst_texture);
-  // The size of the encoded texture.
-  *encoded_texture_size =
-      gfx::Size((src_size.width() + 3) / 4, src_size.height());
-  {
-    ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, dst_texture);
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, encoded_texture_size->width(),
-                    encoded_texture_size->height(), 0, GL_RGBA,
-                    GL_UNSIGNED_BYTE, nullptr);
-  }
-
-  helper_->InitScalerImpl();
-  const std::unique_ptr<ScalerInterface> planerizer =
-      helper_->scaler_impl_->CreateGrayscalePlanerizer(
-          false, vertically_flip_texture, swizzle);
-  planerizer->Scale(src_texture, src_size, gfx::Vector2dF(), dst_texture,
-                    gfx::Rect(*encoded_texture_size));
-  return dst_texture;
-}
-
 void GLHelper::CopyTextureToImpl::ReadbackAsync(
     const gfx::Size& dst_size,
     size_t bytes_per_row,
@@ -466,10 +346,10 @@
     GLenum format,
     GLenum type,
     size_t bytes_per_pixel,
-    const base::Callback<void(bool)>& callback) {
+    base::OnceCallback<void(bool)> callback) {
   TRACE_EVENT0("gpu.capture", "GLHelper::CopyTextureToImpl::ReadbackAsync");
-  Request* request =
-      new Request(dst_size, bytes_per_row, row_stride_bytes, out, callback);
+  Request* request = new Request(dst_size, bytes_per_row, row_stride_bytes, out,
+                                 std::move(callback));
   request_queue_.push(request);
   request->buffer = 0u;
 
@@ -491,129 +371,25 @@
                                      AsWeakPtr(), request, bytes_per_pixel));
 }
 
-void GLHelper::CopyTextureToImpl::CropScaleReadbackAndCleanTexture(
-    GLuint src_texture,
-    const gfx::Size& src_size,
-    const gfx::Size& dst_size,
-    unsigned char* out,
-    const SkColorType out_color_type,
-    const base::Callback<void(bool)>& callback,
-    GLHelper::ScalerQuality quality) {
-  GLenum format, type;
-  size_t bytes_per_pixel;
-  SkColorType readback_color_type = out_color_type;
-  // Single-component textures are not supported by all GPUs, so  we implement
-  // kAlpha_8_SkColorType support here via a special encoding (see below) using
-  // a 32-bit texture to represent an 8-bit image.
-  // Thus we use generic 32-bit readback in this case.
-  if (out_color_type == kAlpha_8_SkColorType) {
-    readback_color_type = kRGBA_8888_SkColorType;
-  }
-
-  FormatSupport supported = GetReadbackConfig(readback_color_type, true,
-                                              &format, &type, &bytes_per_pixel);
-
-  if (supported == GLHelperReadbackSupport::NOT_SUPPORTED) {
-    callback.Run(false);
-    return;
-  }
-
-  GLuint texture = src_texture;
-
-  // Scale texture if needed
-  // Optimization: SCALER_QUALITY_FAST is just a single bilinear pass, which we
-  // can do just as well in EncodeTextureAsGrayscale, which we will do if
-  // out_color_type is kAlpha_8_SkColorType, so let's skip the scaling step
-  // in that case.
-  bool scale_texture = out_color_type != kAlpha_8_SkColorType ||
-                       quality != GLHelper::SCALER_QUALITY_FAST;
-  if (scale_texture) {
-    // Don't swizzle during the scale step for kAlpha_8_SkColorType.
-    // We will swizzle in the encode step below if needed.
-    bool scale_swizzle = out_color_type == kAlpha_8_SkColorType
-                             ? false
-                             : supported == GLHelperReadbackSupport::SWIZZLE;
-    texture =
-        ScaleTexture(src_texture, src_size, dst_size, true, scale_swizzle,
-                     out_color_type == kAlpha_8_SkColorType ? kN32_SkColorType
-                                                            : out_color_type,
-                     quality);
-    if (!texture) {
-      callback.Run(false);
-      return;
-    }
-  }
-
-  gfx::Size readback_texture_size = dst_size;
-  // Encode texture to grayscale if needed.
-  if (out_color_type == kAlpha_8_SkColorType) {
-    // Do the vertical flip here if we haven't already done it when we scaled
-    // the texture.
-    bool encode_as_grayscale_vertical_flip = !scale_texture;
-    // EncodeTextureAsGrayscale by default creates a texture which should be
-    // read back as RGBA, so need to swizzle if the readback format is BGRA.
-    bool encode_as_grayscale_swizzle = format == GL_BGRA_EXT;
-    GLuint tmp_texture = EncodeTextureAsGrayscale(
-        texture, dst_size, &readback_texture_size,
-        encode_as_grayscale_vertical_flip, encode_as_grayscale_swizzle);
-    // If the scaled texture was created - delete it
-    if (scale_texture)
-      gl_->DeleteTextures(1, &texture);
-    texture = tmp_texture;
-    DCHECK(texture);
-  }
-
-  // Readback the pixels of the resulting texture
-  ScopedFramebuffer dst_framebuffer(gl_);
-  ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
-                                                             dst_framebuffer);
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            texture, 0);
-
-  size_t bytes_per_row = out_color_type == kAlpha_8_SkColorType
-                             ? dst_size.width()
-                             : dst_size.width() * bytes_per_pixel;
-
-  ReadbackAsync(readback_texture_size, bytes_per_row, bytes_per_row, out,
-                format, type, bytes_per_pixel, callback);
-  gl_->DeleteTextures(1, &texture);
-}
-
-void GLHelper::CopyTextureToImpl::ReadbackTextureSync(GLuint texture,
-                                                      const gfx::Rect& src_rect,
-                                                      unsigned char* out,
-                                                      SkColorType color_type) {
-  GLenum format, type;
-  size_t bytes_per_pixel;
-  FormatSupport supported =
-      GetReadbackConfig(color_type, false, &format, &type, &bytes_per_pixel);
-  if (supported == GLHelperReadbackSupport::NOT_SUPPORTED) {
-    return;
-  }
-
-  ScopedFramebuffer dst_framebuffer(gl_);
-  ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
-                                                             dst_framebuffer);
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            texture, 0);
-  gl_->ReadPixels(src_rect.x(), src_rect.y(), src_rect.width(),
-                  src_rect.height(), format, type, out);
-}
-
 void GLHelper::CopyTextureToImpl::ReadbackTextureAsync(
     GLuint texture,
     const gfx::Size& dst_size,
     unsigned char* out,
     SkColorType color_type,
-    const base::Callback<void(bool)>& callback) {
-  GLenum format, type;
-  size_t bytes_per_pixel;
-  FormatSupport supported =
-      GetReadbackConfig(color_type, false, &format, &type, &bytes_per_pixel);
-  if (supported == GLHelperReadbackSupport::NOT_SUPPORTED) {
-    callback.Run(false);
+    base::OnceCallback<void(bool)> callback) {
+  constexpr size_t kBytesPerPixel = 4;
+
+  GLenum format;
+  if (color_type == kRGBA_8888_SkColorType) {
+    format = GL_RGBA;
+  } else if (color_type == kBGRA_8888_SkColorType &&
+             IsBGRAReadbackSupported()) {
+    format = GL_BGRA_EXT;
+  } else {
+    // Note: It's possible the GL implementation supports other readback types.
+    // However, as of this writing, no caller of this method will request a
+    // different |color_type| (i.e., requiring using some other GL format).
+    std::move(callback).Run(false);
     return;
   }
 
@@ -623,19 +399,9 @@
   ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
   gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
                             texture, 0);
-  ReadbackAsync(dst_size, dst_size.width() * bytes_per_pixel,
-                dst_size.width() * bytes_per_pixel, out, format, type,
-                bytes_per_pixel, callback);
-}
-
-GLuint GLHelper::CopyTextureToImpl::CopyAndScaleTexture(
-    GLuint src_texture,
-    const gfx::Size& src_size,
-    const gfx::Size& dst_size,
-    bool vertically_flip_texture,
-    GLHelper::ScalerQuality quality) {
-  return ScaleTexture(src_texture, src_size, dst_size, vertically_flip_texture,
-                      false, kRGBA_8888_SkColorType, quality);
+  ReadbackAsync(dst_size, dst_size.width() * kBytesPerPixel,
+                dst_size.width() * kBytesPerPixel, out, format,
+                GL_UNSIGNED_BYTE, kBytesPerPixel, std::move(callback));
 }
 
 void GLHelper::CopyTextureToImpl::ReadbackDone(Request* finished_request,
@@ -709,15 +475,20 @@
   }
 }
 
-FormatSupport GLHelper::CopyTextureToImpl::GetReadbackConfig(
-    SkColorType color_type,
-    bool can_swizzle,
-    GLenum* format,
-    GLenum* type,
-    size_t* bytes_per_pixel) {
-  helper_->LazyInitReadbackSupportImpl();
-  return helper_->readback_support_->GetReadbackConfig(
-      color_type, can_swizzle, format, type, bytes_per_pixel);
+bool GLHelper::CopyTextureToImpl::IsBGRAReadbackSupported() {
+  if (bgra_support_ == BGRA_PREFERENCE_UNKNOWN) {
+    bgra_support_ = BGRA_NOT_SUPPORTED;
+    if (auto* extensions = gl_->GetString(GL_EXTENSIONS)) {
+      const std::string extensions_string =
+          " " + std::string(reinterpret_cast<const char*>(extensions)) + " ";
+      if (extensions_string.find(" GL_EXT_read_format_bgra ") !=
+          std::string::npos) {
+        bgra_support_ = BGRA_SUPPORTED;
+      }
+    }
+  }
+
+  return bgra_support_ == BGRA_SUPPORTED;
 }
 
 GLHelper::GLHelper(GLES2Interface* gl, gpu::ContextSupport* context_support)
@@ -725,84 +496,14 @@
 
 GLHelper::~GLHelper() {}
 
-void GLHelper::CropScaleReadbackAndCleanTexture(
-    GLuint src_texture,
-    const gfx::Size& src_size,
-    const gfx::Size& dst_size,
-    unsigned char* out,
-    const SkColorType out_color_type,
-    const base::Callback<void(bool)>& callback,
-    GLHelper::ScalerQuality quality) {
-  InitCopyTextToImpl();
-  copy_texture_to_impl_->CropScaleReadbackAndCleanTexture(
-      src_texture, src_size, dst_size, out, out_color_type, callback, quality);
-}
-
-void GLHelper::CropScaleReadbackAndCleanMailbox(
-    const gpu::Mailbox& src_mailbox,
-    const gpu::SyncToken& sync_token,
-    const gfx::Size& src_size,
-    const gfx::Size& dst_size,
-    unsigned char* out,
-    const SkColorType out_color_type,
-    const base::Callback<void(bool)>& callback,
-    GLHelper::ScalerQuality quality) {
-  GLuint mailbox_texture = ConsumeMailboxToTexture(src_mailbox, sync_token);
-  CropScaleReadbackAndCleanTexture(mailbox_texture, src_size, dst_size, out,
-                                   out_color_type, callback, quality);
-  gl_->DeleteTextures(1, &mailbox_texture);
-}
-
-void GLHelper::ReadbackTextureSync(GLuint texture,
-                                   const gfx::Rect& src_rect,
-                                   unsigned char* out,
-                                   SkColorType format) {
-  InitCopyTextToImpl();
-  copy_texture_to_impl_->ReadbackTextureSync(texture, src_rect, out, format);
-}
-
-void GLHelper::ReadbackTextureAsync(
-    GLuint texture,
-    const gfx::Size& dst_size,
-    unsigned char* out,
-    SkColorType color_type,
-    const base::Callback<void(bool)>& callback) {
+void GLHelper::ReadbackTextureAsync(GLuint texture,
+                                    const gfx::Size& dst_size,
+                                    unsigned char* out,
+                                    SkColorType color_type,
+                                    base::OnceCallback<void(bool)> callback) {
   InitCopyTextToImpl();
   copy_texture_to_impl_->ReadbackTextureAsync(texture, dst_size, out,
-                                              color_type, callback);
-}
-
-GLuint GLHelper::CopyAndScaleTexture(GLuint texture,
-                                     const gfx::Size& src_size,
-                                     const gfx::Size& dst_size,
-                                     bool vertically_flip_texture,
-                                     ScalerQuality quality) {
-  InitCopyTextToImpl();
-  return copy_texture_to_impl_->CopyAndScaleTexture(
-      texture, src_size, dst_size, vertically_flip_texture, quality);
-}
-
-GLuint GLHelper::CompileShaderFromSource(const GLchar* source, GLenum type) {
-  GLuint shader = gl_->CreateShader(type);
-  GLint length = base::checked_cast<GLint>(strlen(source));
-  gl_->ShaderSource(shader, 1, &source, &length);
-  gl_->CompileShader(shader);
-  GLint compile_status = 0;
-  gl_->GetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
-  if (!compile_status) {
-    GLint log_length = 0;
-    gl_->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
-    if (log_length) {
-      std::unique_ptr<GLchar[]> log(new GLchar[log_length]);
-      GLsizei returned_log_length = 0;
-      gl_->GetShaderInfoLog(shader, log_length, &returned_log_length,
-                            log.get());
-      LOG(ERROR) << std::string(log.get(), returned_log_length);
-    }
-    gl_->DeleteShader(shader);
-    return 0;
-  }
-  return shader;
+                                              color_type, std::move(callback));
 }
 
 void GLHelper::InitCopyTextToImpl() {
@@ -818,61 +519,22 @@
     scaler_impl_.reset(new GLHelperScaling(gl_, this));
 }
 
-void GLHelper::LazyInitReadbackSupportImpl() {
-  // Lazily initialize |readback_support_|.
-  if (!readback_support_)
-    readback_support_.reset(new GLHelperReadbackSupport(gl_));
-}
-
 GLint GLHelper::MaxDrawBuffers() {
-  InitCopyTextToImpl();
-  return copy_texture_to_impl_->MaxDrawBuffers();
-}
-
-void GLHelper::CopySubBufferDamage(GLenum target,
-                                   GLuint texture,
-                                   GLuint previous_texture,
-                                   const SkRegion& new_damage,
-                                   const SkRegion& old_damage) {
-  SkRegion region(old_damage);
-  if (region.op(new_damage, SkRegion::kDifference_Op)) {
-    ScopedFramebuffer dst_framebuffer(gl_);
-    ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
-                                                               dst_framebuffer);
-    gl_->BindTexture(target, texture);
-    gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
-                              previous_texture, 0);
-    for (SkRegion::Iterator it(region); !it.done(); it.next()) {
-      const SkIRect& rect = it.rect();
-      gl_->CopyTexSubImage2D(target, 0, rect.x(), rect.y(), rect.x(), rect.y(),
-                             rect.width(), rect.height());
+  if (max_draw_buffers_ < 0) {
+    max_draw_buffers_ = 0;
+    const GLubyte* extensions = gl_->GetString(GL_EXTENSIONS);
+    if (extensions) {
+      const std::string extensions_string =
+          " " + std::string(reinterpret_cast<const char*>(extensions)) + " ";
+      if (extensions_string.find(" GL_EXT_draw_buffers ") !=
+          std::string::npos) {
+        gl_->GetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &max_draw_buffers_);
+        DCHECK_GE(max_draw_buffers_, 0);
+      }
     }
-    gl_->BindTexture(target, 0);
-    gl_->Flush();
   }
-}
 
-GLuint GLHelper::CreateTexture() {
-  GLuint texture = 0u;
-  gl_->GenTextures(1, &texture);
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-  return texture;
-}
-
-void GLHelper::DeleteTexture(GLuint texture_id) {
-  gl_->DeleteTextures(1, &texture_id);
-}
-
-void GLHelper::GenerateSyncToken(gpu::SyncToken* sync_token) {
-  gl_->GenSyncTokenCHROMIUM(sync_token->GetData());
-}
-
-void GLHelper::WaitSyncToken(const gpu::SyncToken& sync_token) {
-  gl_->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
+  return max_draw_buffers_;
 }
 
 gpu::MailboxHolder GLHelper::ProduceMailboxHolderFromTexture(
@@ -881,7 +543,7 @@
   gl_->ProduceTextureDirectCHROMIUM(texture_id, mailbox.name);
 
   gpu::SyncToken sync_token;
-  GenerateSyncToken(&sync_token);
+  gl_->GenSyncTokenCHROMIUM(sync_token.GetData());
 
   return gpu::MailboxHolder(mailbox, sync_token, GL_TEXTURE_2D);
 }
@@ -891,37 +553,11 @@
   if (mailbox.IsZero())
     return 0;
   if (sync_token.HasData())
-    WaitSyncToken(sync_token);
+    gl_->WaitSyncTokenCHROMIUM(sync_token.GetConstData());
   GLuint texture = gl_->CreateAndConsumeTextureCHROMIUM(mailbox.name);
   return texture;
 }
 
-void GLHelper::ResizeTexture(GLuint texture, const gfx::Size& size) {
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
-  gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.width(), size.height(), 0,
-                  GL_RGB, GL_UNSIGNED_BYTE, nullptr);
-}
-
-void GLHelper::CopyTextureSubImage(GLuint texture, const gfx::Rect& rect) {
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
-  gl_->CopyTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.x(),
-                         rect.y(), rect.width(), rect.height());
-}
-
-void GLHelper::CopyTextureFullImage(GLuint texture, const gfx::Size& size) {
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, texture);
-  gl_->CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, size.width(),
-                      size.height(), 0);
-}
-
-void GLHelper::Flush() {
-  gl_->Flush();
-}
-
-void GLHelper::InsertOrderingBarrier() {
-  gl_->OrderingBarrierCHROMIUM();
-}
-
 void GLHelper::CopyTextureToImpl::ReadbackPlane(
     const gfx::Size& texture_size,
     int row_stride_bytes,
@@ -929,13 +565,13 @@
     int size_shift,
     const gfx::Rect& paste_rect,
     ReadbackSwizzle swizzle,
-    const base::Callback<void(bool)>& callback) {
+    base::OnceCallback<void(bool)> callback) {
   const size_t offset = row_stride_bytes * (paste_rect.y() >> size_shift) +
                         (paste_rect.x() >> size_shift);
   ReadbackAsync(texture_size, paste_rect.width() >> size_shift,
                 row_stride_bytes, data + offset,
                 (swizzle == kSwizzleBGRA) ? GL_BGRA_EXT : GL_RGBA,
-                GL_UNSIGNED_BYTE, 4, callback);
+                GL_UNSIGNED_BYTE, 4, std::move(callback));
 }
 
 I420Converter::I420Converter() = default;
@@ -1130,7 +766,7 @@
     int v_plane_row_stride_bytes,
     unsigned char* v_plane_data,
     const gfx::Point& paste_location,
-    const base::Callback<void(bool)>& callback) {
+    base::OnceCallback<void(bool)> callback) {
   DCHECK(!(paste_location.x() & 1));
   DCHECK(!(paste_location.y() & 1));
 
@@ -1151,31 +787,22 @@
                               GL_TEXTURE_2D, texture, 0);
   };
   SetUpAndBindFramebuffer(y_readback_framebuffer_, y_);
-  copy_impl_->ReadbackPlane(GetYPlaneTextureSize(output_rect.size()),
-                            y_plane_row_stride_bytes, y_plane_data, 0,
-                            paste_rect, swizzle_, base::Bind(&nullcallback));
+  copy_impl_->ReadbackPlane(
+      GetYPlaneTextureSize(output_rect.size()), y_plane_row_stride_bytes,
+      y_plane_data, 0, paste_rect, swizzle_, base::DoNothing::Once<bool>());
   SetUpAndBindFramebuffer(u_readback_framebuffer_, u_);
   const gfx::Size chroma_texture_size =
       GetChromaPlaneTextureSize(output_rect.size());
   copy_impl_->ReadbackPlane(chroma_texture_size, u_plane_row_stride_bytes,
                             u_plane_data, 1, paste_rect, swizzle_,
-                            base::Bind(&nullcallback));
+                            base::DoNothing::Once<bool>());
   SetUpAndBindFramebuffer(v_readback_framebuffer_, v_);
   copy_impl_->ReadbackPlane(chroma_texture_size, v_plane_row_stride_bytes,
-                            v_plane_data, 1, paste_rect, swizzle_, callback);
+                            v_plane_data, 1, paste_rect, swizzle_,
+                            std::move(callback));
   gl_->BindFramebuffer(GL_FRAMEBUFFER, 0);
 }
 
-bool GLHelper::IsReadbackConfigSupported(SkColorType color_type) {
-  LazyInitReadbackSupportImpl();
-  GLenum format, type;
-  size_t bytes_per_pixel;
-  FormatSupport support = readback_support_->GetReadbackConfig(
-      color_type, false, &format, &type, &bytes_per_pixel);
-
-  return (support == GLHelperReadbackSupport::SUPPORTED);
-}
-
 std::unique_ptr<I420Converter> GLHelper::CreateI420Converter(
     bool flipped_source,
     bool flip_output,
@@ -1185,29 +812,57 @@
   InitScalerImpl();
   return std::make_unique<I420ConverterImpl>(
       gl_, scaler_impl_.get(), flipped_source, flip_output, swizzle,
-      use_mrt && (copy_texture_to_impl_->MaxDrawBuffers() >= 2));
+      use_mrt && (MaxDrawBuffers() >= 2));
 }
 
 std::unique_ptr<ReadbackYUVInterface>
 GLHelper::CopyTextureToImpl::CreateReadbackPipelineYUV(bool flip_vertically,
                                                        bool use_mrt) {
   helper_->InitScalerImpl();
-  // Just query if the best readback configuration needs a swizzle In
-  // ReadbackPlane() we will choose GL_RGBA/GL_BGRA_EXT based on swizzle
-  GLenum format, type;
-  size_t bytes_per_pixel;
-  FormatSupport supported = GetReadbackConfig(kRGBA_8888_SkColorType, true,
-                                              &format, &type, &bytes_per_pixel);
-  DCHECK((format == GL_RGBA || format == GL_BGRA_EXT) &&
-         type == GL_UNSIGNED_BYTE);
 
-  ReadbackSwizzle swizzle = kSwizzleNone;
-  if (supported == GLHelperReadbackSupport::SWIZZLE)
-    swizzle = kSwizzleBGRA;
+  if (bgra_preference_ == BGRA_PREFERENCE_UNKNOWN) {
+    if (IsBGRAReadbackSupported()) {
+      // Test whether GL_BRGA_EXT is preferred for readback by creating a test
+      // texture, binding it to a framebuffer as a color attachment, and then
+      // querying the implementation for the framebuffer's readback format.
+      constexpr int kTestSize = 64;
+      GLuint texture = 0;
+      gl_->GenTextures(1, &texture);
+      gl_->BindTexture(GL_TEXTURE_2D, texture);
+      gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+      gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+      gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+      gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+      gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kTestSize, kTestSize, 0,
+                      GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
+      GLuint framebuffer = 0;
+      gl_->GenFramebuffers(1, &framebuffer);
+      gl_->BindFramebuffer(GL_FRAMEBUFFER, framebuffer);
+      gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                                GL_TEXTURE_2D, texture, 0);
+      GLint readback_format = 0;
+      GLint readback_type = 0;
+      gl_->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &readback_format);
+      gl_->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &readback_type);
+      if (readback_format == GL_BGRA_EXT && readback_type == GL_UNSIGNED_BYTE) {
+        bgra_preference_ = BGRA_PREFERRED;
+      } else {
+        bgra_preference_ = BGRA_NOT_PREFERRED;
+      }
+      if (framebuffer != 0)
+        gl_->DeleteFramebuffers(1, &framebuffer);
+      if (texture != 0)
+        gl_->DeleteTextures(1, &texture);
+    } else {
+      bgra_preference_ = BGRA_NOT_PREFERRED;
+    }
+  }
 
+  const ReadbackSwizzle swizzle =
+      (bgra_preference_ == BGRA_PREFERRED) ? kSwizzleBGRA : kSwizzleNone;
   return std::make_unique<ReadbackYUVImpl>(
       gl_, this, helper_->scaler_impl_.get(), flip_vertically, swizzle,
-      use_mrt && (max_draw_buffers_ >= 2));
+      use_mrt && (helper_->MaxDrawBuffers() >= 2));
 }
 
 std::unique_ptr<ReadbackYUVInterface> GLHelper::CreateReadbackPipelineYUV(
@@ -1238,9 +893,4 @@
   return yuv_reader;
 }
 
-GLHelperReadbackSupport* GLHelper::GetReadbackSupport() {
-  LazyInitReadbackSupportImpl();
-  return readback_support_.get();
-}
-
 }  // namespace viz
diff --git a/components/viz/common/gl_helper.h b/components/viz/common/gl_helper.h
index a142e9c..e647271a 100644
--- a/components/viz/common/gl_helper.h
+++ b/components/viz/common/gl_helper.h
@@ -7,13 +7,12 @@
 
 #include <memory>
 
-#include "base/atomicops.h"
 #include "base/callback.h"
 #include "base/macros.h"
 #include "components/viz/common/viz_common_export.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/common/mailbox_holder.h"
-#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkImageInfo.h"
 #include "ui/gfx/geometry/size.h"
 
 namespace gfx {
@@ -28,8 +27,6 @@
 struct Mailbox;
 }  // namespace gpu
 
-class SkRegion;
-
 namespace viz {
 
 class GLHelperScaling;
@@ -131,12 +128,14 @@
   }
 };
 
-class GLHelperReadbackSupport;
 class I420Converter;
 class ReadbackYUVInterface;
 
 // Provides higher level operations on top of the gpu::gles2::GLES2Interface
 // interfaces.
+//
+// TODO(crbug.com/870036): DEPRECATED. Please contact the crbug owner before
+// adding any new dependencies on this code.
 class VIZ_COMMON_EXPORT GLHelper {
  public:
   GLHelper(gpu::gles2::GLES2Interface* gl,
@@ -159,119 +158,36 @@
     SCALER_QUALITY_BEST = 3,
   };
 
-  // Copies the block of pixels specified with |src_subrect| from |src_texture|,
-  // scales it to |dst_size|, and writes it into |out|.
-  // |src_size| is the size of |src_texture|. The result is in |out_color_type|
-  // format and is potentially flipped vertically to make it a correct image
-  // representation.  |callback| is invoked with the copy result when the copy
-  // operation has completed.
-  // Note that the src_texture will have the min/mag filter set to GL_LINEAR
-  // and wrap_s/t set to CLAMP_TO_EDGE in this call.
-  void CropScaleReadbackAndCleanTexture(
-      GLuint src_texture,
-      const gfx::Size& src_size,
-      const gfx::Size& dst_size,
-      unsigned char* out,
-      const SkColorType out_color_type,
-      const base::Callback<void(bool)>& callback,
-      GLHelper::ScalerQuality quality);
-
-  // Copies the all pixels from the texture in |src_mailbox| of |src_size|,
-  // scales it to |dst_size|, and writes it into |out|. The result is in
-  // |out_color_type| format and is potentially flipped vertically to make it a
-  // correct image representation. |callback| is invoked with the copy result
-  // when the copy operation has completed.
-  // Note that the texture bound to src_mailbox will have the min/mag filter set
-  // to GL_LINEAR and wrap_s/t set to CLAMP_TO_EDGE in this call. src_mailbox is
-  // assumed to be GL_TEXTURE_2D.
-  void CropScaleReadbackAndCleanMailbox(
-      const gpu::Mailbox& src_mailbox,
-      const gpu::SyncToken& sync_token,
-      const gfx::Size& src_size,
-      const gfx::Size& dst_size,
-      unsigned char* out,
-      const SkColorType out_color_type,
-      const base::Callback<void(bool)>& callback,
-      GLHelper::ScalerQuality quality);
-
-  // Copies the texture data out of |texture| into |out|.  |size| is the
+  // Copies the texture data out of |texture| into |out|.  |dst_size| is the
   // size of the texture.  No post processing is applied to the pixels.  The
-  // texture is assumed to have a format of GL_RGBA with a pixel type of
-  // GL_UNSIGNED_BYTE.  This is a blocking call that calls glReadPixels on the
-  // current OpenGL context.
-  void ReadbackTextureSync(GLuint texture,
-                           const gfx::Rect& src_rect,
-                           unsigned char* out,
-                           SkColorType format);
-
+  // texture is assumed to have a format of GL_RGBA or GL_BGRA_EXT with a pixel
+  // type of GL_UNSIGNED_BYTE.
+  //
+  // TODO(crbug.com/870036): DEPRECATED. This will be moved to be closer to its
+  // one caller soon.
   void ReadbackTextureAsync(GLuint texture,
                             const gfx::Size& dst_size,
                             unsigned char* out,
                             SkColorType color_type,
-                            const base::Callback<void(bool)>& callback);
-
-  // Creates a scaled copy of the specified texture. |src_size| is the size of
-  // the texture and |dst_size| is the size of the resulting copy.
-  // Note that the |texture| will have the min/mag filter set to GL_LINEAR
-  // and wrap_s/t set to CLAMP_TO_EDGE in this call. Returns 0 on invalid
-  // arguments.
-  GLuint CopyAndScaleTexture(GLuint texture,
-                             const gfx::Size& src_size,
-                             const gfx::Size& dst_size,
-                             bool vertically_flip_texture,
-                             ScalerQuality quality);
-
-  // Returns the shader compiled from the source.
-  GLuint CompileShaderFromSource(const GLchar* source, GLenum type);
-
-  // Copies all pixels from |previous_texture| into |texture| that are
-  // inside the region covered by |old_damage| but not part of |new_damage|.
-  void CopySubBufferDamage(GLenum target,
-                           GLuint texture,
-                           GLuint previous_texture,
-                           const SkRegion& new_damage,
-                           const SkRegion& old_damage);
-
-  // Simply creates a texture.
-  GLuint CreateTexture();
-  // Deletes a texture.
-  void DeleteTexture(GLuint texture_id);
-
-  // Inserts a fence sync, flushes, and generates a sync token.
-  void GenerateSyncToken(gpu::SyncToken* sync_token);
-
-  // Wait for the sync token before executing further GL commands.
-  void WaitSyncToken(const gpu::SyncToken& sync_token);
+                            base::OnceCallback<void(bool)> callback);
 
   // Creates a mailbox holder that is attached to the given texture id, with a
   // sync point to wait on before using the mailbox. Returns a holder with an
   // empty mailbox on failure.
   // Note the texture is assumed to be GL_TEXTURE_2D.
+  //
+  // TODO(crbug.com/870036): DEPRECATED. This will be moved to be closer to its
+  // one caller soon.
   gpu::MailboxHolder ProduceMailboxHolderFromTexture(GLuint texture_id);
 
   // Creates a texture and consumes a mailbox into it. Returns 0 on failure.
   // Note the mailbox is assumed to be GL_TEXTURE_2D.
+  //
+  // TODO(crbug.com/870036): DEPRECATED. This will be moved to be closer to its
+  // one caller soon.
   GLuint ConsumeMailboxToTexture(const gpu::Mailbox& mailbox,
                                  const gpu::SyncToken& sync_token);
 
-  // Resizes the texture's size to |size|.
-  void ResizeTexture(GLuint texture, const gfx::Size& size);
-
-  // Copies the framebuffer data given in |rect| to |texture|.
-  void CopyTextureSubImage(GLuint texture, const gfx::Rect& rect);
-
-  // Copies the all framebuffer data to |texture|. |size| specifies the
-  // size of the framebuffer.
-  void CopyTextureFullImage(GLuint texture, const gfx::Size& size);
-
-  // Flushes GL commands.
-  void Flush();
-
-  // Force commands in the current command buffer to be executed before commands
-  // in other command buffers from the same process (ie channel to the GPU
-  // process).
-  void InsertOrderingBarrier();
-
   // Caches all intermediate textures and programs needed to scale any subset of
   // a source texture at a fixed scaling ratio.
   class ScalerInterface {
@@ -427,7 +343,7 @@
   // WARNING: The returned ReadbackYUVInterface instance assumes both this
   // GLHelper and its GLES2Interface/ContextSupport will outlive it!
   //
-  // TODO(crbug/754872): DEPRECATED. This will be removed soon, in favor of
+  // TODO(crbug.com/870036): DEPRECATED. This will be removed soon, in favor of
   // CreateI420Converter().
   std::unique_ptr<ReadbackYUVInterface> CreateReadbackPipelineYUV(
       bool vertically_flip_texture,
@@ -435,20 +351,15 @@
 
   // Returns a ReadbackYUVInterface instance that is lazily created and owned by
   // this class. |use_mrt| is always true for these instances.
+  //
+  // TODO(crbug.com/870036): DEPRECATED. This will be moved to be closer to its
+  // one caller soon.
   ReadbackYUVInterface* GetReadbackPipelineYUV(bool vertically_flip_texture);
 
   // Returns the maximum number of draw buffers available,
   // 0 if GL_EXT_draw_buffers is not available.
   GLint MaxDrawBuffers();
 
-  // Checks whether the readbback is supported for texture with the
-  // matching config. This doesnt check for cross format readbacks.
-  bool IsReadbackConfigSupported(SkColorType texture_format);
-
-  // Returns a GLHelperReadbackSupport instance, for querying platform readback
-  // capabilities and to determine the more-performant configurations.
-  GLHelperReadbackSupport* GetReadbackSupport();
-
  protected:
   class CopyTextureToImpl;
 
@@ -456,8 +367,6 @@
   void InitCopyTextToImpl();
   // Creates |scaler_impl_| if NULL.
   void InitScalerImpl();
-  // Creates |readback_support_| if NULL.
-  void LazyInitReadbackSupportImpl();
 
   enum ReadbackSwizzle { kSwizzleNone = 0, kSwizzleBGRA };
 
@@ -465,10 +374,13 @@
   gpu::ContextSupport* context_support_;
   std::unique_ptr<CopyTextureToImpl> copy_texture_to_impl_;
   std::unique_ptr<GLHelperScaling> scaler_impl_;
-  std::unique_ptr<GLHelperReadbackSupport> readback_support_;
   std::unique_ptr<ReadbackYUVInterface> shared_readback_yuv_flip_;
   std::unique_ptr<ReadbackYUVInterface> shared_readback_yuv_noflip_;
 
+  // Memoized result for MaxDrawBuffers(), if >= 0. Otherwise, MaxDrawBuffers()
+  // will need to query the GL implementation.
+  GLint max_draw_buffers_ = -1;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(GLHelper);
 };
@@ -531,7 +443,7 @@
 // and read back a texture from the GPU into CPU-accessible RAM. A single
 // readback pipeline can handle multiple outstanding readbacks at the same time.
 //
-// TODO(crbug/754872): DEPRECATED. This will be removed soon, in favor of
+// TODO(crbug.com/870036): DEPRECATED. This will be removed soon, in favor of
 // I420Converter and readback implementation in GLRendererCopier.
 class VIZ_COMMON_EXPORT ReadbackYUVInterface {
  public:
@@ -573,7 +485,7 @@
                            int v_plane_row_stride_bytes,
                            unsigned char* v_plane_data,
                            const gfx::Point& paste_location,
-                           const base::Callback<void(bool)>& callback) = 0;
+                           base::OnceCallback<void(bool)> callback) = 0;
 };
 
 }  // namespace viz
diff --git a/components/viz/common/gl_helper_benchmark.cc b/components/viz/common/gl_helper_benchmark.cc
index a2ff1361..b54d6ab 100644
--- a/components/viz/common/gl_helper_benchmark.cc
+++ b/components/viz/common/gl_helper_benchmark.cc
@@ -22,6 +22,7 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
+#include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -207,55 +208,4 @@
   }
 }
 
-// This is more of a test utility than a test.
-// Put an PNG image called "testimage.png" in your
-// current directory, then run this test. It will
-// create testoutput_Q_P.png, where Q is the scaling
-// mode and P is the scaling percentage taken from
-// the table below.
-TEST_F(GLHelperBenchmark, DISABLED_ScaleTestImage) {
-  int percents[] = {
-      230, 180, 150, 110, 90, 70, 50, 49, 40, 20, 10,
-  };
-
-  SkBitmap input;
-  LoadPngFileToSkBitmap(base::FilePath(FILE_PATH_LITERAL("testimage.png")),
-                        &input);
-
-  uint32_t framebuffer;
-  gl_->GenFramebuffers(1, &framebuffer);
-  uint32_t src_texture;
-  gl_->GenTextures(1, &src_texture);
-  const gfx::Size src_size(input.width(), input.height());
-  gl_->BindFramebuffer(GL_FRAMEBUFFER, framebuffer);
-  gl_->BindTexture(GL_TEXTURE_2D, src_texture);
-  gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, src_size.width(),
-                  src_size.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
-                  input.getPixels());
-
-  for (size_t q = 0; q < arraysize(kQualities); q++) {
-    for (size_t p = 0; p < arraysize(percents); p++) {
-      const gfx::Size dst_size(input.width() * percents[p] / 100,
-                               input.height() * percents[p] / 100);
-      uint32_t dst_texture = helper_->CopyAndScaleTexture(
-          src_texture, src_size, dst_size, false, kQualities[q]);
-
-      SkBitmap output_pixels;
-      output_pixels.allocN32Pixels(dst_size.width(), dst_size.height());
-
-      helper_->ReadbackTextureSync(
-          dst_texture, gfx::Rect(0, 0, dst_size.width(), dst_size.height()),
-          static_cast<unsigned char*>(output_pixels.getPixels()),
-          kN32_SkColorType);
-      gl_->DeleteTextures(1, &dst_texture);
-      std::string filename = base::StringPrintf("testoutput_%s_%d.ppm",
-                                                kQualityNames[q], percents[p]);
-      VLOG(0) << "Writing " << filename;
-      SaveToFile(&output_pixels, base::FilePath::FromUTF8Unsafe(filename));
-    }
-  }
-  gl_->DeleteTextures(1, &src_texture);
-  gl_->DeleteFramebuffers(1, &framebuffer);
-}
-
 }  // namespace viz
diff --git a/components/viz/common/gl_helper_readback_support.cc b/components/viz/common/gl_helper_readback_support.cc
deleted file mode 100644
index 8d1644e..0000000
--- a/components/viz/common/gl_helper_readback_support.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/viz/common/gl_helper_readback_support.h"
-#include "base/logging.h"
-#include "gpu/GLES2/gl2extchromium.h"
-#include "third_party/skia/include/core/SkImageInfo.h"
-
-namespace viz {
-
-GLHelperReadbackSupport::GLHelperReadbackSupport(gpu::gles2::GLES2Interface* gl)
-    : gl_(gl) {
-  InitializeReadbackSupport();
-}
-
-GLHelperReadbackSupport::~GLHelperReadbackSupport() {}
-
-void GLHelperReadbackSupport::InitializeReadbackSupport() {
-  // We are concerned about 16, 32-bit formats only.  The below are the most
-  // used 16, 32-bit formats.  In future if any new format support is needed
-  // that should be added here.  Initialize the array with
-  // GLHelperReadbackSupport::NOT_SUPPORTED as we dont know the supported
-  // formats yet.
-  for (int i = 0; i <= kLastEnum_SkColorType; ++i) {
-    format_support_table_[i] = GLHelperReadbackSupport::NOT_SUPPORTED;
-  }
-  // TODO(sikugu): kAlpha_8_SkColorType support check is failing on mesa.
-  // See crbug.com/415667.
-  CheckForReadbackSupport(kRGB_565_SkColorType);
-  CheckForReadbackSupport(kARGB_4444_SkColorType);
-  CheckForReadbackSupport(kRGBA_8888_SkColorType);
-  CheckForReadbackSupport(kBGRA_8888_SkColorType);
-  // Further any formats, support should be checked here.
-}
-
-void GLHelperReadbackSupport::CheckForReadbackSupport(
-    SkColorType texture_format) {
-  bool supports_format = false;
-  switch (texture_format) {
-    case kRGB_565_SkColorType:
-      supports_format = SupportsFormat(GL_RGB, GL_UNSIGNED_SHORT_5_6_5);
-      break;
-    case kRGBA_8888_SkColorType:
-      // This is the baseline, assume always true.
-      supports_format = true;
-      break;
-    case kBGRA_8888_SkColorType:
-      supports_format = SupportsFormat(GL_BGRA_EXT, GL_UNSIGNED_BYTE);
-      break;
-    case kARGB_4444_SkColorType:
-      supports_format = false;
-      break;
-    default:
-      NOTREACHED();
-      supports_format = false;
-      break;
-  }
-  DCHECK((int)texture_format <= (int)kLastEnum_SkColorType);
-  format_support_table_[texture_format] =
-      supports_format ? GLHelperReadbackSupport::SUPPORTED
-                      : GLHelperReadbackSupport::NOT_SUPPORTED;
-}
-
-void GLHelperReadbackSupport::GetAdditionalFormat(GLenum format,
-                                                  GLenum type,
-                                                  GLenum* format_out,
-                                                  GLenum* type_out) {
-  for (unsigned int i = 0; i < format_cache_.size(); i++) {
-    if (format_cache_[i].format == format && format_cache_[i].type == type) {
-      *format_out = format_cache_[i].read_format;
-      *type_out = format_cache_[i].read_type;
-      return;
-    }
-  }
-
-  const int kTestSize = 64;
-  ScopedTexture dst_texture(gl_);
-  ScopedTextureBinder<GL_TEXTURE_2D> texture_binder(gl_, dst_texture);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-  gl_->TexImage2D(GL_TEXTURE_2D, 0, format, kTestSize, kTestSize, 0, format,
-                  type, nullptr);
-  ScopedFramebuffer dst_framebuffer(gl_);
-  ScopedFramebufferBinder<GL_FRAMEBUFFER> framebuffer_binder(gl_,
-                                                             dst_framebuffer);
-  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
-                            dst_texture, 0);
-  GLint format_tmp = 0, type_tmp = 0;
-  gl_->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT, &format_tmp);
-  gl_->GetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE, &type_tmp);
-  *format_out = format_tmp;
-  *type_out = type_tmp;
-
-  struct FormatCacheEntry entry = {format, type, *format_out, *type_out};
-  format_cache_.push_back(entry);
-}
-
-bool GLHelperReadbackSupport::SupportsFormat(GLenum format, GLenum type) {
-  // GLES2.0 Specification says this pairing is always supported
-  // with additional format from GL_IMPLEMENTATION_COLOR_READ_FORMAT/TYPE
-  if (format == GL_RGBA && type == GL_UNSIGNED_BYTE)
-    return true;
-
-  bool supports_format = false;
-  GLenum ext_format = 0, ext_type = 0;
-  GetAdditionalFormat(format, type, &ext_format, &ext_type);
-  if ((ext_format == format) && (ext_type == type)) {
-    supports_format = true;
-  }
-  return supports_format;
-}
-
-GLHelperReadbackSupport::FormatSupport
-GLHelperReadbackSupport::GetReadbackConfig(SkColorType color_type,
-                                           bool can_swizzle,
-                                           GLenum* format,
-                                           GLenum* type,
-                                           size_t* bytes_per_pixel) {
-  DCHECK(format && type && bytes_per_pixel);
-  *bytes_per_pixel = 4;
-  *type = GL_UNSIGNED_BYTE;
-  GLenum new_format = 0, new_type = 0;
-  switch (color_type) {
-    case kRGB_565_SkColorType:
-      if (format_support_table_[color_type] ==
-          GLHelperReadbackSupport::SUPPORTED) {
-        *format = GL_RGB;
-        *type = GL_UNSIGNED_SHORT_5_6_5;
-        *bytes_per_pixel = 2;
-        return GLHelperReadbackSupport::SUPPORTED;
-      }
-      break;
-    case kRGBA_8888_SkColorType:
-      *format = GL_RGBA;
-      if (can_swizzle) {
-        // If GL_BGRA_EXT is advertised as the readback format through
-        // GL_IMPLEMENTATION_COLOR_READ_FORMAT then assume it is preferred by
-        // the implementation for performance.
-        GetAdditionalFormat(*format, *type, &new_format, &new_type);
-
-        if (new_format == GL_BGRA_EXT && new_type == GL_UNSIGNED_BYTE) {
-          *format = GL_BGRA_EXT;
-          return GLHelperReadbackSupport::SWIZZLE;
-        }
-      }
-      return GLHelperReadbackSupport::SUPPORTED;
-    case kBGRA_8888_SkColorType:
-      *format = GL_BGRA_EXT;
-      if (format_support_table_[color_type] ==
-          GLHelperReadbackSupport::SUPPORTED)
-        return GLHelperReadbackSupport::SUPPORTED;
-
-      if (can_swizzle) {
-        *format = GL_RGBA;
-        return GLHelperReadbackSupport::SWIZZLE;
-      }
-
-      break;
-    case kARGB_4444_SkColorType:
-      return GLHelperReadbackSupport::NOT_SUPPORTED;
-    default:
-      NOTREACHED();
-      break;
-  }
-
-  return GLHelperReadbackSupport::NOT_SUPPORTED;
-}
-
-}  // namespace viz
diff --git a/components/viz/common/gl_helper_readback_support.h b/components/viz/common/gl_helper_readback_support.h
deleted file mode 100644
index 0bb76d5..0000000
--- a/components/viz/common/gl_helper_readback_support.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_VIZ_COMMON_GL_HELPER_READBACK_SUPPORT_H_
-#define COMPONENTS_VIZ_COMMON_GL_HELPER_READBACK_SUPPORT_H_
-
-#include <stddef.h>
-
-#include <vector>
-
-#include "components/viz/common/gl_helper.h"
-
-namespace viz {
-
-class GLHelperReadbackSupport {
- public:
-  enum FormatSupport { SUPPORTED, SWIZZLE, NOT_SUPPORTED };
-
-  explicit GLHelperReadbackSupport(gpu::gles2::GLES2Interface* gl);
-
-  ~GLHelperReadbackSupport();
-
-  // For a given color type retrieve whether readback is supported and if so
-  // how it should be performed. The |format|, |type| and |bytes_per_pixel| are
-  // the values that should be used with glReadPixels to facilitate the
-  // readback. If |can_swizzle| is true then this method will return SWIZZLE if
-  // the data needs to be swizzled before using the returned |format| otherwise
-  // the method will return SUPPORTED to indicate that readback is permitted of
-  // this color othewise NOT_SUPPORTED will be returned.  This method always
-  // overwrites the out values irrespective of the return value.
-  FormatSupport GetReadbackConfig(SkColorType color_type,
-                                  bool can_swizzle,
-                                  GLenum* format,
-                                  GLenum* type,
-                                  size_t* bytes_per_pixel);
-  // Provides the additional readback format/type pairing for a render target
-  // of a given format/type pairing
-  void GetAdditionalFormat(GLenum format,
-                           GLenum type,
-                           GLenum* format_out,
-                           GLenum* type_out);
-
- private:
-  struct FormatCacheEntry {
-    GLenum format;
-    GLenum type;
-    GLenum read_format;
-    GLenum read_type;
-  };
-
-  // This populates the format_support_table with the list of supported
-  // formats.
-  void InitializeReadbackSupport();
-
-  // This api is called  once per format and it is done in the
-  // InitializeReadbackSupport. We should not use this any where
-  // except the InitializeReadbackSupport.Calling this at other places
-  // can distrub the state of normal gl operations.
-  void CheckForReadbackSupport(SkColorType texture_format);
-
-  // Helper functions for checking the supported texture formats.
-  // Avoid using this API in between texture operations, as this does some
-  // teture opertions (bind, attach) internally.
-  bool SupportsFormat(GLenum format, GLenum type);
-
-  FormatSupport format_support_table_[kLastEnum_SkColorType + 1];
-
-  gpu::gles2::GLES2Interface* gl_;
-  std::vector<struct FormatCacheEntry> format_cache_;
-};
-
-}  // namespace viz
-
-#endif  // COMPONENTS_VIZ_COMMON_GL_HELPER_READBACK_SUPPORT_H_
diff --git a/components/viz/common/gl_helper_scaling.cc b/components/viz/common/gl_helper_scaling.cc
index f0c02c3..d46ab2c0 100644
--- a/components/viz/common/gl_helper_scaling.cc
+++ b/components/viz/common/gl_helper_scaling.cc
@@ -8,6 +8,7 @@
 
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
@@ -1164,19 +1165,45 @@
   return cache_entry;
 }
 
+namespace {
+GLuint CompileShaderFromSource(GLES2Interface* gl,
+                               const GLchar* source,
+                               GLenum type) {
+  GLuint shader = gl->CreateShader(type);
+  GLint length = base::checked_cast<GLint>(strlen(source));
+  gl->ShaderSource(shader, 1, &source, &length);
+  gl->CompileShader(shader);
+  GLint compile_status = 0;
+  gl->GetShaderiv(shader, GL_COMPILE_STATUS, &compile_status);
+  if (!compile_status) {
+    GLint log_length = 0;
+    gl->GetShaderiv(shader, GL_INFO_LOG_LENGTH, &log_length);
+    if (log_length) {
+      std::unique_ptr<GLchar[]> log(new GLchar[log_length]);
+      GLsizei returned_log_length = 0;
+      gl->GetShaderInfoLog(shader, log_length, &returned_log_length, log.get());
+      LOG(ERROR) << std::string(log.get(), returned_log_length);
+    }
+    gl->DeleteShader(shader);
+    return 0;
+  }
+  return shader;
+}
+}  // namespace
+
 void ShaderProgram::Setup(const GLchar* vertex_shader_text,
                           const GLchar* fragment_shader_text) {
   // Shaders to map the source texture to |dst_texture_|.
-  GLuint vertex_shader =
-      helper_->CompileShaderFromSource(vertex_shader_text, GL_VERTEX_SHADER);
+  const GLuint vertex_shader =
+      CompileShaderFromSource(gl_, vertex_shader_text, GL_VERTEX_SHADER);
   if (vertex_shader == 0)
     return;
 
   gl_->AttachShader(program_, vertex_shader);
   gl_->DeleteShader(vertex_shader);
 
-  GLuint fragment_shader = helper_->CompileShaderFromSource(
-      fragment_shader_text, GL_FRAGMENT_SHADER);
+  const GLuint fragment_shader =
+      CompileShaderFromSource(gl_, fragment_shader_text, GL_FRAGMENT_SHADER);
   if (fragment_shader == 0)
     return;
   gl_->AttachShader(program_, fragment_shader);
diff --git a/components/viz/common/gl_helper_unittest.cc b/components/viz/common/gl_helper_unittest.cc
index 0522776..2b3ee2a3 100644
--- a/components/viz/common/gl_helper_unittest.cc
+++ b/components/viz/common/gl_helper_unittest.cc
@@ -28,7 +28,6 @@
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "components/viz/common/gl_helper.h"
-#include "components/viz/common/gl_helper_readback_support.h"
 #include "components/viz/common/gl_helper_scaling.h"
 #include "gpu/command_buffer/client/gles2_implementation.h"
 #include "gpu/command_buffer/client/shared_memory_limits.h"
@@ -424,30 +423,6 @@
             ChannelAsFloat(pixels, base_x + 1, base_y + 1, c) * x * y);
   }
 
-  // Encodes an RGBA bitmap to grayscale.
-  // Reference implementation for
-  // GLHelper::CopyToTextureImpl::EncodeTextureAsGrayscale.
-  void EncodeToGrayscaleSlow(SkBitmap* input, SkBitmap* output) {
-    const float kRGBtoGrayscaleColorWeights[3] = {0.213f, 0.715f, 0.072f};
-    CHECK_EQ(kAlpha_8_SkColorType, output->colorType());
-    CHECK_EQ(input->width(), output->width());
-    CHECK_EQ(input->height(), output->height());
-    CHECK_EQ(input->colorType(), kRGBA_8888_SkColorType);
-
-    for (int dst_y = 0; dst_y < output->height(); dst_y++) {
-      for (int dst_x = 0; dst_x < output->width(); dst_x++) {
-        float c0 = ChannelAsFloat(input, dst_x, dst_y, 0);
-        float c1 = ChannelAsFloat(input, dst_x, dst_y, 1);
-        float c2 = ChannelAsFloat(input, dst_x, dst_y, 2);
-        float value = c0 * kRGBtoGrayscaleColorWeights[0] +
-                      c1 * kRGBtoGrayscaleColorWeights[1] +
-                      c2 * kRGBtoGrayscaleColorWeights[2];
-        SetChannel(output, dst_x, dst_y, 0,
-                   static_cast<int>(value * 255.0f + 0.5f));
-      }
-    }
-  }
-
   // Very slow bicubic / bilinear scaler for reference.
   void ScaleSlow(SkBitmap* input,
                  const gfx::Rect& source_rect,
@@ -548,21 +523,6 @@
     }
   }
 
-  // Swaps red and blue channels in each pixel in a 32-bit bitmap.
-  void SwizzleSKBitmap(SkBitmap* bitmap) {
-    int bpp = bitmap->bytesPerPixel();
-    DCHECK_EQ(bpp, 4);
-    for (int y = 0; y < bitmap->height(); y++) {
-      for (int x = 0; x < bitmap->width(); x++) {
-        // Swap channels 0 and 2 (red and blue)
-        int c0 = Channel(bitmap, x, y, 0);
-        int c2 = Channel(bitmap, x, y, 2);
-        SetChannel(bitmap, x, y, 2, c0);
-        SetChannel(bitmap, x, y, 0, c2);
-      }
-    }
-  }
-
   // gl_helper scales recursively, so we'll need to do that
   // in the reference implementation too.
   void ScaleSlowRecursive(SkBitmap* input,
@@ -657,100 +617,6 @@
     return bitmap;
   }
 
-  // Binds texture and framebuffer and loads the bitmap pixels into the texture.
-  void BindTextureAndFrameBuffer(GLuint texture,
-                                 GLuint framebuffer,
-                                 SkBitmap* bitmap,
-                                 int width,
-                                 int height) {
-    gl_->BindFramebuffer(GL_FRAMEBUFFER, framebuffer);
-    gl_->BindTexture(GL_TEXTURE_2D, texture);
-    gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA,
-                    GL_UNSIGNED_BYTE, bitmap->getPixels());
-  }
-
-  // Create a test image, transform it using
-  // GLHelper::CropScaleReadbackAndCleanTexture and a reference implementation
-  // and compare the results.
-  void TestCropScaleReadbackAndCleanTexture(int xsize,
-                                            int ysize,
-                                            int scaled_xsize,
-                                            int scaled_ysize,
-                                            int test_pattern,
-                                            SkColorType out_color_type,
-                                            bool swizzle,
-                                            size_t quality_index) {
-    DCHECK(out_color_type == kAlpha_8_SkColorType ||
-           out_color_type == kRGBA_8888_SkColorType ||
-           out_color_type == kBGRA_8888_SkColorType);
-    GLuint src_texture;
-    gl_->GenTextures(1, &src_texture);
-    GLuint framebuffer;
-    gl_->GenFramebuffers(1, &framebuffer);
-    std::unique_ptr<SkBitmap> input_pixels =
-        CreateTestBitmap(gfx::Size(xsize, ysize), gfx::Point(), test_pattern);
-    BindTextureAndFrameBuffer(src_texture, framebuffer, input_pixels.get(),
-                              xsize, ysize);
-
-    std::string message = base::StringPrintf(
-        "input size: %dx%d "
-        "output size: %dx%d "
-        "pattern: %d , quality: %s, "
-        "out_color_type: %d",
-        xsize, ysize, scaled_xsize, scaled_ysize, test_pattern,
-        kQualityNames[quality_index], out_color_type);
-
-    // Transform the bitmap using GLHelper::CropScaleReadbackAndCleanTexture.
-    SkBitmap output_pixels;
-    output_pixels.allocPixels(SkImageInfo::Make(
-        scaled_xsize, scaled_ysize, out_color_type, kPremul_SkAlphaType));
-    base::RunLoop run_loop;
-    helper_->CropScaleReadbackAndCleanTexture(
-        src_texture, gfx::Size(xsize, ysize),
-        gfx::Size(scaled_xsize, scaled_ysize),
-        static_cast<unsigned char*>(output_pixels.getPixels()), out_color_type,
-        base::Bind(&callcallback, run_loop.QuitClosure()),
-        kQualities[quality_index]);
-    run_loop.Run();
-    // CropScaleReadbackAndCleanTexture flips the pixels. Flip them back.
-    FlipSKBitmap(&output_pixels);
-
-    // If the bitmap shouldn't have changed - compare against input.
-    if (xsize == scaled_xsize && ysize == scaled_ysize &&
-        out_color_type != kAlpha_8_SkColorType) {
-      const std::vector<GLHelperScaling::ScalerStage> dummy_stages;
-      Compare(input_pixels.get(), &output_pixels, 0, nullptr, dummy_stages,
-              message + " comparing against input");
-      return;
-    }
-
-    // Now transform the bitmap using the reference implementation.
-    SkBitmap scaled_pixels;
-    scaled_pixels.allocPixels(SkImageInfo::Make(scaled_xsize, scaled_ysize,
-                                                kRGBA_8888_SkColorType,
-                                                kPremul_SkAlphaType));
-    SkBitmap truth_pixels;
-    // Step 1: Scale
-    ScaleSlowRecursive(input_pixels.get(), gfx::Rect(0, 0, xsize, ysize),
-                       kQualities[quality_index], &scaled_pixels);
-    // Step 2: Encode to grayscale if needed.
-    if (out_color_type == kAlpha_8_SkColorType) {
-      truth_pixels.allocPixels(SkImageInfo::Make(
-          scaled_xsize, scaled_ysize, out_color_type, kPremul_SkAlphaType));
-      EncodeToGrayscaleSlow(&scaled_pixels, &truth_pixels);
-    } else {
-      truth_pixels = scaled_pixels;
-    }
-
-    // Now compare the results.
-    const std::vector<GLHelperScaling::ScalerStage> dummy_stages;
-    Compare(&truth_pixels, &output_pixels, 2, input_pixels.get(), dummy_stages,
-            message + " comparing against transformed/scaled");
-
-    gl_->DeleteTextures(1, &src_texture);
-    gl_->DeleteFramebuffers(1, &framebuffer);
-  }
-
   // Scaling test: Create a test image, scale it using GLHelperScaling
   // and a reference implementation and compare the results.
   void TestScale(const gfx::Rect& source_rect,
@@ -791,39 +657,30 @@
                          scale_to, message);
 
     // Scale the source texture, producing the results in a new output
-    // texture. When there is no source re-positioning, test the higher-level
-    // CopyAndScaleTexture() API. Otherwise, use the lower-level API that can
-    // apply source re-positioning.
+    // texture.
+    std::unique_ptr<GLHelper::ScalerInterface> scaler =
+        helper_->CreateScaler(kQualities[quality_index], scale_from, scale_to,
+                              false, flip_output, false);
+    ASSERT_FALSE(scaler->IsSamplingFlippedSource());
+    ASSERT_EQ(flip_output, scaler->IsFlippingOutput());
     GLuint dst_texture = 0;
-    if (source_rect == gfx::Rect(framebuffer_size)) {
-      dst_texture = helper_->CopyAndScaleTexture(
-          src_texture, source_rect.size(), scaled_size, flip_output,
-          kQualities[quality_index]);
-    } else {
-      std::unique_ptr<GLHelper::ScalerInterface> scaler =
-          helper_->CreateScaler(kQualities[quality_index], scale_from, scale_to,
-                                false, flip_output, false);
-      ASSERT_FALSE(scaler->IsSamplingFlippedSource());
-      ASSERT_EQ(flip_output, scaler->IsFlippingOutput());
-      gl_->GenTextures(1, &dst_texture);
-      gl_->BindTexture(GL_TEXTURE_2D, dst_texture);
-      gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, scaled_size.width(),
-                      scaled_size.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
-                      nullptr);
-      scaler->Scale(src_texture, framebuffer_size,
-                    source_rect.OffsetFromOrigin(), dst_texture,
-                    gfx::Rect(scaled_size));
-    }
+    gl_->GenTextures(1, &dst_texture);
+    gl_->BindTexture(GL_TEXTURE_2D, dst_texture);
+    gl_->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, scaled_size.width(),
+                    scaled_size.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
+                    nullptr);
+    scaler->Scale(src_texture, framebuffer_size, source_rect.OffsetFromOrigin(),
+                  dst_texture, gfx::Rect(scaled_size));
 
     SkBitmap output_pixels;
     output_pixels.allocPixels(
         SkImageInfo::Make(scaled_size.width(), scaled_size.height(),
                           kRGBA_8888_SkColorType, kPremul_SkAlphaType));
 
-    helper_->ReadbackTextureSync(
-        dst_texture, gfx::Rect(scaled_size),
-        static_cast<unsigned char*>(output_pixels.getPixels()),
-        kRGBA_8888_SkColorType);
+    EXPECT_TRUE(
+        ReadBackTexture(dst_texture, scaled_size,
+                        static_cast<unsigned char*>(output_pixels.getPixels()),
+                        kRGBA_8888_SkColorType));
     if (flip_output) {
       // Flip the pixels back.
       FlipSKBitmap(&output_pixels);
@@ -908,10 +765,11 @@
     entire_output.allocPixels(SkImageInfo::Make(
         entire_output_size.width(), entire_output_size.height(),
         kRGBA_8888_SkColorType, kPremul_SkAlphaType));
-    helper_->ReadbackTextureSync(
-        dst_texture, gfx::Rect(entire_output_size),
-        static_cast<unsigned char*>(entire_output.getPixels()),
-        kRGBA_8888_SkColorType);
+
+    EXPECT_TRUE(
+        ReadBackTexture(dst_texture, entire_output_size,
+                        static_cast<unsigned char*>(entire_output.getPixels()),
+                        kRGBA_8888_SkColorType));
 
     const std::string human_readable_test_params = base::StringPrintf(
         "scale from: %s "
@@ -951,10 +809,10 @@
         patch_output.allocPixels(
             SkImageInfo::Make(patch_size.width(), patch_size.height(),
                               kRGBA_8888_SkColorType, kPremul_SkAlphaType));
-        helper_->ReadbackTextureSync(
-            dst_texture, gfx::Rect(patch_size),
+        EXPECT_TRUE(ReadBackTexture(
+            dst_texture, patch_size,
             static_cast<unsigned char*>(patch_output.getPixels()),
-            kRGBA_8888_SkColorType);
+            kRGBA_8888_SkColorType));
         SkBitmap expected;
         SkIRect expected_subrect{patch_rect.x(), patch_rect.y(),
                                  patch_rect.right(), patch_rect.bottom()};
@@ -995,10 +853,10 @@
           scaler->Scale(src_subset_texture, sampling_rect.size(), offset,
                         dst_texture, gfx::Rect(patch_size));
           gl_->DeleteTextures(1, &src_subset_texture);
-          helper_->ReadbackTextureSync(
-              dst_texture, gfx::Rect(patch_size),
+          EXPECT_TRUE(ReadBackTexture(
+              dst_texture, patch_size,
               static_cast<unsigned char*>(patch_output.getPixels()),
-              kRGBA_8888_SkColorType);
+              kRGBA_8888_SkColorType));
           Compare(&expected, &patch_output, 2, test_bitmap.get(), stages,
                   "METHOD2 " + human_readable_test_params +
                       " patch rect: " + patch_rect.ToString());
@@ -1051,11 +909,6 @@
     EXPECT_EQ(PrintStages(stages), description);
   }
 
-  static void callcallback(const base::Callback<void()>& callback,
-                           bool result) {
-    callback.Run();
-  }
-
   void DrawGridToBitmap(int w,
                         int h,
                         SkColor background_color,
@@ -1073,12 +926,7 @@
       for (int x = 0; x < w; ++x) {
         bool on_grid = (y_on_grid || ((x % grid_pitch) < grid_width));
 
-        if (bmp.colorType() == kRGBA_8888_SkColorType ||
-            bmp.colorType() == kBGRA_8888_SkColorType) {
-          *bmp.getAddr32(x, y) = (on_grid ? grid_color : background_color);
-        } else if (bmp.colorType() == kRGB_565_SkColorType) {
-          *bmp.getAddr16(x, y) = (on_grid ? grid_color : background_color);
-        }
+        *bmp.getAddr32(x, y) = (on_grid ? grid_color : background_color);
       }
     }
   }
@@ -1101,48 +949,22 @@
         bool x_bit = (((x / rect_w) & 0x1) == 0);
 
         bool use_color2 = (x_bit != y_bit);  // xor
-        if (bmp.colorType() == kRGBA_8888_SkColorType ||
-            bmp.colorType() == kBGRA_8888_SkColorType) {
-          *bmp.getAddr32(x, y) = (use_color2 ? color2 : color1);
-        } else if (bmp.colorType() == kRGB_565_SkColorType) {
-          *bmp.getAddr16(x, y) = (use_color2 ? color2 : color1);
-        }
+        *bmp.getAddr32(x, y) = (use_color2 ? color2 : color1);
       }
     }
   }
 
-  bool ColorComponentsClose(SkColor component1,
-                            SkColor component2,
-                            SkColorType color_type) {
+  bool ColorComponentsClose(SkColor component1, SkColor component2) {
     int c1 = static_cast<int>(component1);
     int c2 = static_cast<int>(component2);
-    bool result = false;
-    switch (color_type) {
-      case kRGBA_8888_SkColorType:
-      case kBGRA_8888_SkColorType:
-        result = (std::abs(c1 - c2) == 0);
-        break;
-      case kRGB_565_SkColorType:
-        result = (std::abs(c1 - c2) <= 7);
-        break;
-      default:
-        break;
-    }
-    return result;
+    return (std::abs(c1 - c2) == 0);
   }
 
-  bool ColorsClose(SkColor color1, SkColor color2, SkColorType color_type) {
-    bool red = ColorComponentsClose(SkColorGetR(color1), SkColorGetR(color2),
-                                    color_type);
-    bool green = ColorComponentsClose(SkColorGetG(color1), SkColorGetG(color2),
-                                      color_type);
-    bool blue = ColorComponentsClose(SkColorGetB(color1), SkColorGetB(color2),
-                                     color_type);
-    bool alpha = ColorComponentsClose(SkColorGetA(color1), SkColorGetA(color2),
-                                      color_type);
-    if (color_type == kRGB_565_SkColorType) {
-      return red && blue && green;
-    }
+  bool ColorsClose(SkColor color1, SkColor color2) {
+    bool red = ColorComponentsClose(SkColorGetR(color1), SkColorGetR(color2));
+    bool green = ColorComponentsClose(SkColorGetG(color1), SkColorGetG(color2));
+    bool blue = ColorComponentsClose(SkColorGetB(color1), SkColorGetB(color2));
+    bool alpha = ColorComponentsClose(SkColorGetA(color1), SkColorGetA(color2));
     return red && blue && green && alpha;
   }
 
@@ -1162,8 +984,7 @@
     }
     for (int y = 0; y < bmp1.height(); ++y) {
       for (int x = 0; x < bmp1.width(); ++x) {
-        if (!ColorsClose(bmp1.getColor(x, y), bmp2.getColor(x, y),
-                         bmp1.colorType())) {
+        if (!ColorsClose(bmp1.getColor(x, y), bmp2.getColor(x, y))) {
           LOG(ERROR) << "Bitmap color comparison failure";
           return false;
         }
@@ -1177,53 +998,36 @@
                                       const gfx::Size& src_size,
                                       const SkBitmap& input_pixels) {
     gl_->BindTexture(GL_TEXTURE_2D, src_texture);
-    GLenum format = 0;
-    switch (color_type) {
-      case kBGRA_8888_SkColorType:
-        format = GL_BGRA_EXT;
-        break;
-      case kRGBA_8888_SkColorType:
-        format = GL_RGBA;
-        break;
-      case kRGB_565_SkColorType:
-        format = GL_RGB;
-        break;
-      default:
-        NOTREACHED();
-    }
-    GLenum type = (color_type == kRGB_565_SkColorType) ? GL_UNSIGNED_SHORT_5_6_5
-                                                       : GL_UNSIGNED_BYTE;
+    const GLenum format =
+        (color_type == kBGRA_8888_SkColorType) ? GL_BGRA_EXT : GL_RGBA;
     gl_->TexImage2D(GL_TEXTURE_2D, 0, format, src_size.width(),
-                    src_size.height(), 0, format, type,
+                    src_size.height(), 0, format, GL_UNSIGNED_BYTE,
                     input_pixels.getPixels());
   }
 
-  void ReadBackTexture(GLuint src_texture,
+  bool ReadBackTexture(GLuint src_texture,
                        const gfx::Size& src_size,
                        unsigned char* pixels,
-                       SkColorType color_type,
-                       bool async) {
-    if (async) {
-      base::RunLoop run_loop;
-      helper_->ReadbackTextureAsync(
-          src_texture, src_size, pixels, color_type,
-          base::Bind(&callcallback, run_loop.QuitClosure()));
-      run_loop.Run();
-    } else {
-      helper_->ReadbackTextureSync(src_texture, gfx::Rect(src_size), pixels,
-                                   color_type);
-    }
+                       SkColorType color_type) {
+    base::RunLoop run_loop;
+    bool success = false;
+    helper_->ReadbackTextureAsync(
+        src_texture, src_size, pixels, color_type,
+        base::BindOnce(
+            [](bool* success, base::OnceClosure callback, bool result) {
+              *success = result;
+              std::move(callback).Run();
+            },
+            &success, run_loop.QuitClosure()));
+    run_loop.Run();
+    return success;
   }
+
   // Test basic format readback.
   bool TestTextureFormatReadback(const gfx::Size& src_size,
-                                 SkColorType color_type,
-                                 bool async) {
+                                 SkColorType color_type) {
     SkImageInfo info = SkImageInfo::Make(src_size.width(), src_size.height(),
                                          color_type, kPremul_SkAlphaType);
-    if (!helper_->IsReadbackConfigSupported(color_type)) {
-      LOG(INFO) << "Skipping test format not supported" << color_type;
-      return true;
-    }
     GLuint src_texture;
     gl_->GenTextures(1, &src_texture);
     SkBitmap input_pixels;
@@ -1239,9 +1043,8 @@
     // When the readback is over output bitmap should have the red color.
     output_pixels.eraseColor(SK_ColorGREEN);
     uint8_t* pixels = static_cast<uint8_t*>(output_pixels.getPixels());
-    ReadBackTexture(src_texture, src_size, pixels, color_type, async);
-    bool result = IsEqual(input_pixels, output_pixels);
-    if (!result) {
+    if (!ReadBackTexture(src_texture, src_size, pixels, color_type) ||
+        !IsEqual(input_pixels, output_pixels)) {
       LOG(ERROR) << "Bitmap comparison failure Pattern-1";
       return false;
     }
@@ -1252,9 +1055,8 @@
                      src_grid_pitch, src_grid_width, input_pixels);
     BindAndAttachTextureWithPixels(src_texture, color_type, src_size,
                                    input_pixels);
-    ReadBackTexture(src_texture, src_size, pixels, color_type, async);
-    result = IsEqual(input_pixels, output_pixels);
-    if (!result) {
+    if (!ReadBackTexture(src_texture, src_size, pixels, color_type) ||
+        !IsEqual(input_pixels, output_pixels)) {
       LOG(ERROR) << "Bitmap comparison failure Pattern-2";
       return false;
     }
@@ -1263,9 +1065,8 @@
                         rect_w, rect_h, input_pixels);
     BindAndAttachTextureWithPixels(src_texture, color_type, src_size,
                                    input_pixels);
-    ReadBackTexture(src_texture, src_size, pixels, color_type, async);
-    result = IsEqual(input_pixels, output_pixels);
-    if (!result) {
+    if (!ReadBackTexture(src_texture, src_size, pixels, color_type) ||
+        !IsEqual(input_pixels, output_pixels)) {
       LOG(ERROR) << "Bitmap comparison failure Pattern-3";
       return false;
     }
@@ -1461,45 +1262,17 @@
   gl::DisableNullDrawGLBindings enable_pixel_output_;
 };
 
-TEST_F(GLHelperTest, RGBASyncReadbackTest) {
-  const int kTestSize = 64;
-  bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
-                                          kRGBA_8888_SkColorType, false);
-  EXPECT_EQ(result, true);
-}
-
-TEST_F(GLHelperTest, BGRASyncReadbackTest) {
-  const int kTestSize = 64;
-  bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
-                                          kBGRA_8888_SkColorType, false);
-  EXPECT_EQ(result, true);
-}
-
-TEST_F(GLHelperTest, RGB565SyncReadbackTest) {
-  const int kTestSize = 64;
-  bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
-                                          kRGB_565_SkColorType, false);
-  EXPECT_EQ(result, true);
-}
-
 TEST_F(GLHelperTest, RGBAASyncReadbackTest) {
   const int kTestSize = 64;
   bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
-                                          kRGBA_8888_SkColorType, true);
+                                          kRGBA_8888_SkColorType);
   EXPECT_EQ(result, true);
 }
 
 TEST_F(GLHelperTest, BGRAASyncReadbackTest) {
   const int kTestSize = 64;
   bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
-                                          kBGRA_8888_SkColorType, true);
-  EXPECT_EQ(result, true);
-}
-
-TEST_F(GLHelperTest, RGB565ASyncReadbackTest) {
-  const int kTestSize = 64;
-  bool result = TestTextureFormatReadback(gfx::Size(kTestSize, kTestSize),
-                                          kRGB_565_SkColorType, true);
+                                          kBGRA_8888_SkColorType);
   EXPECT_EQ(result, true);
 }
 
@@ -1556,30 +1329,6 @@
   }
 }
 
-// Per pixel tests, all sizes are small so that we can print
-// out the generated bitmaps.
-TEST_P(GLHelperPixelReadbackTest, CropScaleReadbackAndCleanTextureTest) {
-  unsigned int q_index = std::get<0>(GetParam());
-  unsigned int x = std::get<1>(GetParam());
-  unsigned int y = std::get<2>(GetParam());
-  unsigned int dst_x = std::get<3>(GetParam());
-  unsigned int dst_y = std::get<4>(GetParam());
-
-  const SkColorType kColorTypes[] = {
-      kAlpha_8_SkColorType, kRGBA_8888_SkColorType, kBGRA_8888_SkColorType};
-  for (size_t color_type = 0; color_type < arraysize(kColorTypes);
-       color_type++) {
-    for (int pattern = 0; pattern < 3; pattern++) {
-      TestCropScaleReadbackAndCleanTexture(
-          kRGBReadBackSizes[x], kRGBReadBackSizes[y], kRGBReadBackSizes[dst_x],
-          kRGBReadBackSizes[dst_y], pattern, kColorTypes[color_type], false,
-          q_index);
-      if (HasFailure())
-        return;
-    }
-  }
-}
-
 INSTANTIATE_TEST_CASE_P(
     ,
     GLHelperPixelReadbackTest,
diff --git a/components/viz/service/display/overlay_processor.cc b/components/viz/service/display/overlay_processor.cc
index 1be1495..7a9b6d9 100644
--- a/components/viz/service/display/overlay_processor.cc
+++ b/components/viz/service/display/overlay_processor.cc
@@ -189,8 +189,7 @@
 // Also subtract unoccluded underlays from the damage rect if we know that the
 // same underlay was scheduled on the previous frame. If the renderer decides
 // not to swap the framebuffer there will still be a transparent hole in the
-// previous frame. This only handles the common case of a single underlay quad
-// for fullscreen video.
+// previous frame.
 void OverlayProcessor::UpdateDamageRect(
     OverlayCandidateList* candidates,
     const gfx::Rect& previous_frame_underlay_rect,
@@ -209,13 +208,26 @@
         if (overlay.is_opaque)
           damage_rect->Subtract(overlay_display_rect);
       }
-    } else if (overlay.is_unoccluded && this_frame_underlay_rect.IsEmpty()) {
+    } else if (this_frame_underlay_rect.IsEmpty()) {
+      // Process underlay candidates:
+      // Track the underlay_rect from frame to frame.  If it is the same
+      // and nothing is on top of it then that rect doesn't need to
+      // be damaged because the drawing is occurring on a different plane.
+      // If it is different then that indicates that a different underlay
+      // has been chosen and the previous underlay rect should be damaged
+      // because it has changed planes from the underlay plane to the
+      // main plane.
       this_frame_underlay_rect = ToEnclosedRect(overlay.display_rect);
+      if ((this_frame_underlay_rect == previous_frame_underlay_rect) &&
+          overlay.is_unoccluded) {
+        damage_rect->Subtract(this_frame_underlay_rect);
+      }
     }
   }
 
-  if (this_frame_underlay_rect == previous_frame_underlay_rect)
-    damage_rect->Subtract(this_frame_underlay_rect);
+  if (this_frame_underlay_rect != previous_frame_underlay_rect)
+    damage_rect->Union(previous_frame_underlay_rect);
+
   previous_frame_underlay_rect_ = this_frame_underlay_rect;
 
   damage_rect->Union(output_surface_overlay_damage_rect);
diff --git a/components/viz/service/display/overlay_unittest.cc b/components/viz/service/display/overlay_unittest.cc
index 70e347a3..775f27b 100644
--- a/components/viz/service/display/overlay_unittest.cc
+++ b/components/viz/service/display/overlay_unittest.cc
@@ -1893,6 +1893,39 @@
   ASSERT_EQ(false, candidate_list[0].is_opaque);
 }
 
+TEST_F(UnderlayTest, UpdateDamageWhenChangingUnderlays) {
+  output_surface_->GetOverlayCandidateValidator()->AddExpectedRect(
+      gfx::RectF(kOverlayTopLeftRect));
+
+  for (size_t i = 0; i < 2; ++i) {
+    std::unique_ptr<RenderPass> pass = CreateRenderPass();
+
+    if (i == 0) {
+      CreateCandidateQuadAt(
+          resource_provider_.get(), child_resource_provider_.get(),
+          child_provider_.get(), pass->shared_quad_state_list.back(),
+          pass.get(), kOverlayRect);
+    }
+
+    CreateCandidateQuadAt(resource_provider_.get(),
+                          child_resource_provider_.get(), child_provider_.get(),
+                          pass->shared_quad_state_list.back(), pass.get(),
+                          kOverlayTopLeftRect);
+
+    OverlayCandidateList candidate_list;
+    OverlayProcessor::FilterOperationsMap render_pass_filters;
+    OverlayProcessor::FilterOperationsMap render_pass_background_filters;
+    RenderPassList pass_list;
+    pass_list.push_back(std::move(pass));
+    overlay_processor_->ProcessForOverlays(
+        resource_provider_.get(), &pass_list, GetIdentityColorMatrix(),
+        render_pass_filters, render_pass_background_filters, &candidate_list,
+        nullptr, nullptr, &damage_rect_, &content_bounds_);
+  }
+
+  EXPECT_EQ(kOverlayRect, damage_rect_);
+}
+
 TEST_F(UnderlayCastTest, NoOverlayContentBounds) {
   std::unique_ptr<RenderPass> pass = CreateRenderPass();
 
diff --git a/components/viz/service/display_embedder/buffer_queue.cc b/components/viz/service/display_embedder/buffer_queue.cc
index 2a8e2a0..a198638b 100644
--- a/components/viz/service/display_embedder/buffer_queue.cc
+++ b/components/viz/service/display_embedder/buffer_queue.cc
@@ -4,9 +4,10 @@
 
 #include "components/viz/service/display_embedder/buffer_queue.h"
 
+#include <utility>
+
 #include "base/containers/adapters.h"
 #include "build/build_config.h"
-#include "components/viz/common/gl_helper.h"
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
@@ -23,7 +24,6 @@
                          uint32_t texture_target,
                          uint32_t internal_format,
                          gfx::BufferFormat format,
-                         GLHelper* gl_helper,
                          gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
                          gpu::SurfaceHandle surface_handle)
     : gl_(gl),
@@ -32,7 +32,6 @@
       texture_target_(texture_target),
       internal_format_(internal_format),
       format_(format),
-      gl_helper_(gl_helper),
       gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
       surface_handle_(surface_handle) {
   DCHECK(gpu::IsImageFormatCompatibleWithGpuMemoryBufferFormat(internal_format,
@@ -70,9 +69,25 @@
                                    int source_texture,
                                    const gfx::Rect& new_damage,
                                    const gfx::Rect& old_damage) {
-  gl_helper_->CopySubBufferDamage(texture_target_, texture, source_texture,
-                                  SkRegion(gfx::RectToSkIRect(new_damage)),
-                                  SkRegion(gfx::RectToSkIRect(old_damage)));
+  SkRegion region(gfx::RectToSkIRect(old_damage));
+  if (!region.op(gfx::RectToSkIRect(new_damage), SkRegion::kDifference_Op))
+    return;
+
+  GLuint dst_framebuffer = 0;
+  gl_->GenFramebuffers(1, &dst_framebuffer);
+  gl_->BindFramebuffer(GL_FRAMEBUFFER, dst_framebuffer);
+  gl_->BindTexture(texture_target_, texture);
+  gl_->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+                            texture_target_, source_texture, 0);
+  for (SkRegion::Iterator it(region); !it.done(); it.next()) {
+    const SkIRect& rect = it.rect();
+    gl_->CopyTexSubImage2D(texture_target_, 0, rect.x(), rect.y(), rect.x(),
+                           rect.y(), rect.width(), rect.height());
+  }
+  gl_->BindTexture(texture_target_, 0);
+  gl_->Flush();
+  if (dst_framebuffer != 0)
+    gl_->DeleteFramebuffers(1, &dst_framebuffer);
 }
 
 void BufferQueue::UpdateBufferDamage(const gfx::Rect& damage) {
@@ -116,7 +131,7 @@
   }
   UpdateBufferDamage(damage);
   in_flight_surfaces_.push_back(std::move(current_surface_));
-  // Some things reset the framebuffer (CopySubBufferDamage, some GLRenderer
+  // Some things reset the framebuffer (CopyBufferDamage, some GLRenderer
   // paths), so ensure we restore it here.
   gl_->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
 }
diff --git a/components/viz/service/display_embedder/buffer_queue.h b/components/viz/service/display_embedder/buffer_queue.h
index 3fa44ab..8b26330 100644
--- a/components/viz/service/display_embedder/buffer_queue.h
+++ b/components/viz/service/display_embedder/buffer_queue.h
@@ -34,8 +34,6 @@
 
 namespace viz {
 
-class GLHelper;
-
 // Provides a surface that manages its own buffers, backed by GpuMemoryBuffers
 // created using CHROMIUM_image. Double/triple buffering is implemented
 // internally. Doublebuffering occurs if PageFlipComplete is called before the
@@ -46,7 +44,6 @@
               uint32_t texture_target,
               uint32_t internal_format,
               gfx::BufferFormat format,
-              GLHelper* gl_helper,
               gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
               gpu::SurfaceHandle surface_handle);
   virtual ~BufferQueue();
@@ -125,7 +122,6 @@
   // These have been swapped but are not displayed yet. Entries of this deque
   // may be nullptr, if they represent frames that have been destroyed.
   base::circular_deque<std::unique_ptr<AllocatedSurface>> in_flight_surfaces_;
-  GLHelper* gl_helper_;
   gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
   gpu::SurfaceHandle surface_handle_;
 
diff --git a/components/viz/service/display_embedder/buffer_queue_unittest.cc b/components/viz/service/display_embedder/buffer_queue_unittest.cc
index 3afe4534..6dddb7b 100644
--- a/components/viz/service/display_embedder/buffer_queue_unittest.cc
+++ b/components/viz/service/display_embedder/buffer_queue_unittest.cc
@@ -12,7 +12,6 @@
 
 #include "base/memory/ptr_util.h"
 #include "build/build_config.h"
-#include "components/viz/common/gl_helper.h"
 #include "components/viz/test/test_context_provider.h"
 #include "components/viz/test/test_gles2_interface.h"
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
@@ -115,7 +114,6 @@
                     target,
                     kBufferQueueInternalformat,
                     kBufferQueueFormat,
-                    nullptr,
                     gpu_memory_buffer_manager,
                     kFakeSurfaceHandle) {}
   MOCK_METHOD4(CopyBufferDamage,
@@ -277,7 +275,7 @@
     gpu::gles2::GLES2Interface* gl,
     gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager) {
   std::unique_ptr<BufferQueue> buffer_queue(new BufferQueue(
-      gl, target, kBufferQueueInternalformat, kBufferQueueFormat, nullptr,
+      gl, target, kBufferQueueInternalformat, kBufferQueueFormat,
       gpu_memory_buffer_manager, kFakeSurfaceHandle));
   buffer_queue->Initialize();
   return buffer_queue;
@@ -342,14 +340,9 @@
   std::unique_ptr<BufferQueue> output_surface;
   gpu_memory_buffer_manager.reset(new StubGpuMemoryBufferManager);
 
-  std::unique_ptr<GLHelper> gl_helper;
-  gl_helper.reset(new GLHelper(context_provider->ContextGL(),
-                               context_provider->ContextSupport()));
-
   output_surface.reset(new BufferQueue(
       context_provider->ContextGL(), GL_TEXTURE_2D,
       kBufferQueueInternalformat, kBufferQueueFormat,
-      gl_helper.get(),
       gpu_memory_buffer_manager.get(), kFakeSurfaceHandle));
   output_surface->Initialize();
   output_surface->Reshape(screen_size, 1.0f, gfx::ColorSpace(), false);
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
index 279daf5..7f0ae29 100644
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
+++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.cc
@@ -25,9 +25,7 @@
     uint32_t target,
     uint32_t internalformat,
     gfx::BufferFormat buffer_format)
-    : GLOutputSurface(context_provider, synthetic_begin_frame_source),
-      gl_helper_(context_provider->ContextGL(),
-                 context_provider->ContextSupport()) {
+    : GLOutputSurface(context_provider, synthetic_begin_frame_source) {
   capabilities_.uses_default_gl_framebuffer = false;
   capabilities_.flipped_output_surface = true;
   // Set |max_frames_pending| to 2 for buffer_queue, which aligns scheduling
@@ -41,7 +39,7 @@
 
   buffer_queue_.reset(new BufferQueue(
       context_provider->ContextGL(), target, internalformat, buffer_format,
-      &gl_helper_, gpu_memory_buffer_manager, surface_handle));
+      gpu_memory_buffer_manager, surface_handle));
   buffer_queue_->Initialize();
 }
 
diff --git a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
index 3703297..817ebee 100644
--- a/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
+++ b/components/viz/service/display_embedder/gl_output_surface_buffer_queue.h
@@ -8,7 +8,6 @@
 #include <memory>
 
 #include "base/memory/weak_ptr.h"
-#include "components/viz/common/gl_helper.h"
 #include "components/viz/common/gpu/context_provider.h"
 #include "components/viz/service/display/output_surface.h"
 #include "components/viz/service/display_embedder/gl_output_surface.h"
@@ -63,7 +62,6 @@
   // GLOutputSurface:
   void DidReceiveSwapBuffersAck(gfx::SwapResult result) override;
 
-  GLHelper gl_helper_;
   std::unique_ptr<BufferQueue> buffer_queue_;
 
   gfx::Size reshape_size_;
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc
index f22d0c6..583bf7e 100644
--- a/components/viz/service/gl/gpu_service_impl.cc
+++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -13,7 +13,7 @@
 #include "base/lazy_instance.h"
 #include "base/memory/shared_memory.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
@@ -54,6 +54,7 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
+#include "ui/gl/gl_utils.h"
 #include "ui/gl/gpu_switching_manager.h"
 #include "ui/gl/init/create_gr_gl_interface.h"
 #include "ui/gl/init/gl_factory.h"
@@ -843,10 +844,7 @@
 
 void GpuServiceImpl::Crash() {
   DCHECK(io_runner_->BelongsToCurrentThread());
-  DVLOG(1) << "GPU: Simulating GPU crash";
-  // Good bye, cruel world.
-  volatile int* it_s_the_end_of_the_world_as_we_know_it = nullptr;
-  *it_s_the_end_of_the_world_as_we_know_it = 0xdead;
+  gl::Crash();
 }
 
 void GpuServiceImpl::Hang() {
diff --git a/components/viz/service/surfaces/surface_dependency_tracker.cc b/components/viz/service/surfaces/surface_dependency_tracker.cc
index 92884b1..12a6310 100644
--- a/components/viz/service/surfaces/surface_dependency_tracker.cc
+++ b/components/viz/service/surfaces/surface_dependency_tracker.cc
@@ -58,40 +58,28 @@
 
   for (const FrameSinkId& frame_sink_id : removed_dependencies) {
     auto it = blocked_surfaces_from_dependency_.find(frame_sink_id);
-    it->second.erase(surface->surface_id());
-    if (it->second.empty())
-      blocked_surfaces_from_dependency_.erase(it);
+    if (it != blocked_surfaces_from_dependency_.end()) {
+      it->second.erase(surface->surface_id());
+      if (it->second.empty())
+        blocked_surfaces_from_dependency_.erase(it);
+    }
   }
 }
 
 void SurfaceDependencyTracker::OnSurfaceDiscarded(Surface* surface) {
   surfaces_with_missing_dependencies_.erase(surface->surface_id());
 
-  // If the surface being destroyed doesn't have a pending frame then we have
-  // nothing to do here.
-  if (!surface->HasPendingFrame())
-    return;
+  base::flat_set<FrameSinkId> removed_dependencies;
+  for (const SurfaceId& surface_id : surface->activation_dependencies())
+    removed_dependencies.insert(surface_id.frame_sink_id());
 
-  for (const SurfaceId& surface_id : surface->activation_dependencies()) {
-    auto it =
-        blocked_surfaces_from_dependency_.find(surface_id.frame_sink_id());
-    if (it == blocked_surfaces_from_dependency_.end())
-      continue;
-
-    auto& blocked_surface_ids = it->second;
-    auto blocked_surface_ids_it =
-        blocked_surface_ids.find(surface->surface_id());
-    if (blocked_surface_ids_it != blocked_surface_ids.end()) {
-      blocked_surface_ids.erase(surface->surface_id());
-      if (blocked_surface_ids.empty())
-        blocked_surfaces_from_dependency_.erase(surface_id.frame_sink_id());
-    }
-  }
+  OnSurfaceDependenciesChanged(surface, {}, removed_dependencies);
 
   // Pretend that the discarded surface's SurfaceId is now available to
   // unblock dependencies because we now know the surface will never activate.
   NotifySurfaceIdAvailable(surface->surface_id());
 }
+
 void SurfaceDependencyTracker::OnFrameSinkInvalidated(
     const FrameSinkId& frame_sink_id) {
   // We now know the frame sink will never generated any more frames,
diff --git a/components/web_restrictions/browser/web_restrictions_client.cc b/components/web_restrictions/browser/web_restrictions_client.cc
index 6ae980e25..bfef228 100644
--- a/components/web_restrictions/browser/web_restrictions_client.cc
+++ b/components/web_restrictions/browser/web_restrictions_client.cc
@@ -8,7 +8,7 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
 #include "jni/WebRestrictionsClient_jni.h"
diff --git a/components/webdata/common/web_data_request_manager.cc b/components/webdata/common/web_data_request_manager.cc
index 23728f4..acdf95e84 100644
--- a/components/webdata/common/web_data_request_manager.cc
+++ b/components/webdata/common/web_data_request_manager.cc
@@ -10,7 +10,7 @@
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
 
diff --git a/components/webdata_services/web_data_service_wrapper.cc b/components/webdata_services/web_data_service_wrapper.cc
index a54e1fd..5c30c26 100644
--- a/components/webdata_services/web_data_service_wrapper.cc
+++ b/components/webdata_services/web_data_service_wrapper.cc
@@ -11,7 +11,7 @@
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h"
 #include "components/autofill/core/browser/webdata/autofill_profile_sync_bridge.h"
diff --git a/components/webrtc_logging/browser/log_list.cc b/components/webrtc_logging/browser/log_list.cc
index d0006b8..fb55fc9 100644
--- a/components/webrtc_logging/browser/log_list.cc
+++ b/components/webrtc_logging/browser/log_list.cc
@@ -6,7 +6,7 @@
 
 #include "base/files/file.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/upload_list/text_log_upload_list.h"
 #include "content/public/browser/browser_context.h"
 
diff --git a/content/app/android/content_child_process_service_delegate.cc b/content/app/android/content_child_process_service_delegate.cc
index e1952b7..ba226724 100644
--- a/content/app/android/content_child_process_service_delegate.cc
+++ b/content/app/android/content_child_process_service_delegate.cc
@@ -46,16 +46,16 @@
   }
 
   // Overriden from ScopedSurfaceRequestConduit:
-  void ForwardSurfaceTextureForSurfaceRequest(
+  void ForwardSurfaceOwnerForSurfaceRequest(
       const base::UnguessableToken& request_token,
-      const gl::SurfaceTexture* surface_texture) override {
+      const gpu::SurfaceOwner* surface_owner) override {
     JNIEnv* env = base::android::AttachCurrentThread();
 
     content::
-        Java_ContentChildProcessServiceDelegate_forwardSurfaceTextureForSurfaceRequest(
+        Java_ContentChildProcessServiceDelegate_forwardSurfaceForSurfaceRequest(
             env, service_impl_,
             base::android::UnguessableTokenAndroid::Create(env, request_token),
-            surface_texture->j_surface_texture());
+            surface_owner->CreateJavaSurface().j_surface());
   }
 
   // Overridden from GpuSurfaceLookup:
diff --git a/content/app/sandbox_helper_win.cc b/content/app/sandbox_helper_win.cc
index 233edc3..225d82e9 100644
--- a/content/app/sandbox_helper_win.cc
+++ b/content/app/sandbox_helper_win.cc
@@ -17,7 +17,8 @@
     // Ensure the proper mitigations are enforced for the browser process.
     sandbox::ApplyProcessMitigationsToCurrentProcess(
         sandbox::MITIGATION_DEP | sandbox::MITIGATION_DEP_NO_ATL_THUNK |
-        sandbox::MITIGATION_HARDEN_TOKEN_IL_POLICY);
+        sandbox::MITIGATION_HARDEN_TOKEN_IL_POLICY |
+        sandbox::MITIGATION_DLL_SEARCH_ORDER);
     // Note: these mitigations are "post-startup".  Some mitigations that need
     // to be enabled sooner (e.g. MITIGATION_EXTENSION_POINT_DISABLE) are done
     // so in Chrome_ELF.
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 0f8f1a8..440979ab 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -98,7 +98,6 @@
     "//gpu/ipc:gl_in_process_context",
     "//gpu/ipc/host",
     "//gpu/vulkan:buildflags",
-    "//jingle:jingle_glue",
     "//media",
     "//media:media_buildflags",
     "//media/capture",
@@ -179,7 +178,6 @@
     "//third_party/libyuv",
     "//third_party/re2",
     "//third_party/sqlite",
-    "//third_party/webrtc/media:rtc_media_base",
     "//third_party/webrtc/modules/desktop_capture:primitives",
     "//third_party/webrtc/rtc_base:rtc_base",
     "//third_party/zlib",
@@ -1114,6 +1112,8 @@
     "media/flinging_renderer.h",
     "media/forwarding_audio_stream_factory.cc",
     "media/forwarding_audio_stream_factory.h",
+    "media/in_process_audio_loopback_stream_creator.cc",
+    "media/in_process_audio_loopback_stream_creator.h",
     "media/media_devices_permission_checker.cc",
     "media/media_devices_permission_checker.h",
     "media/media_devices_util.cc",
@@ -1445,16 +1445,6 @@
     "renderer_host/overscroll_controller_delegate.h",
     "renderer_host/p2p/socket_dispatcher_host.cc",
     "renderer_host/p2p/socket_dispatcher_host.h",
-    "renderer_host/p2p/socket_host.cc",
-    "renderer_host/p2p/socket_host.h",
-    "renderer_host/p2p/socket_host_tcp.cc",
-    "renderer_host/p2p/socket_host_tcp.h",
-    "renderer_host/p2p/socket_host_tcp_server.cc",
-    "renderer_host/p2p/socket_host_tcp_server.h",
-    "renderer_host/p2p/socket_host_throttler.cc",
-    "renderer_host/p2p/socket_host_throttler.h",
-    "renderer_host/p2p/socket_host_udp.cc",
-    "renderer_host/p2p/socket_host_udp.h",
     "renderer_host/render_frame_metadata_provider_impl.cc",
     "renderer_host/render_frame_metadata_provider_impl.h",
     "renderer_host/render_message_filter.cc",
@@ -1902,8 +1892,6 @@
   if (is_linux || is_mac || is_win) {
     defines += [ "ENABLE_SCREEN_CAPTURE=1" ]
     sources += [
-      "media/capture/cursor_renderer.cc",
-      "media/capture/cursor_renderer.h",
       "media/capture/desktop_capture_device.cc",
       "media/capture/desktop_capture_device.h",
       "media/capture/frame_sink_video_capture_device.cc",
@@ -1919,8 +1907,6 @@
       sources += [
         "media/capture/aura_window_video_capture_device.cc",
         "media/capture/aura_window_video_capture_device.h",
-        "media/capture/cursor_renderer_aura.cc",
-        "media/capture/cursor_renderer_aura.h",
         "media/capture/mouse_cursor_overlay_controller_aura.cc",
       ]
     }
@@ -1933,11 +1919,7 @@
       ]
     }
     if (is_mac) {
-      sources += [
-        "media/capture/cursor_renderer_mac.h",
-        "media/capture/cursor_renderer_mac.mm",
-        "media/capture/mouse_cursor_overlay_controller_mac.mm",
-      ]
+      sources += [ "media/capture/mouse_cursor_overlay_controller_mac.mm" ]
       deps += [
         "//sandbox/mac:seatbelt",
         "//sandbox/mac:seatbelt_extension",
diff --git a/content/browser/DEPS b/content/browser/DEPS
index 42e79d6..c1e6ddc 100644
--- a/content/browser/DEPS
+++ b/content/browser/DEPS
@@ -149,8 +149,8 @@
   "+third_party/blink/public/platform/modules/payments/payment_app.mojom.h",
   "+third_party/blink/public/platform/modules/permissions/permission.mojom.h",
   "+third_party/blink/public/platform/modules/permissions/permission_status.mojom.h",
-  "+third_party/blink/public/platform/modules/webauth/authenticator.mojom.h",
-  "+third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.h",
+  "+third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h",
+  "+third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.h",
   "+third_party/blink/public/platform/modules/webdatabase/web_database.mojom.h",
   "+third_party/blink/public/platform/modules/websockets/websocket.mojom.h",
   "+third_party/blink/public/platform/oom_intervention.mojom.h",
diff --git a/content/browser/accessibility/browser_accessibility_state_impl.cc b/content/browser/accessibility/browser_accessibility_state_impl.cc
index 045d2be..15faf68 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl.cc
@@ -8,7 +8,7 @@
 
 #include "base/command_line.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/web_contents/web_contents_impl.h"
diff --git a/content/browser/android/javascript_injector.cc b/content/browser/android/javascript_injector.cc
index a458548..2c60177 100644
--- a/content/browser/android/javascript_injector.cc
+++ b/content/browser/android/javascript_injector.cc
@@ -15,8 +15,6 @@
 
 namespace content {
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(JavascriptInjector);
-
 JavascriptInjector::JavascriptInjector(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>& obj,
diff --git a/content/browser/android/scoped_surface_request_manager.cc b/content/browser/android/scoped_surface_request_manager.cc
index 0a092c5..6d67c9f 100644
--- a/content/browser/android/scoped_surface_request_manager.cc
+++ b/content/browser/android/scoped_surface_request_manager.cc
@@ -52,11 +52,11 @@
   return request;
 }
 
-void ScopedSurfaceRequestManager::ForwardSurfaceTextureForSurfaceRequest(
+void ScopedSurfaceRequestManager::ForwardSurfaceOwnerForSurfaceRequest(
     const base::UnguessableToken& request_token,
-    const gl::SurfaceTexture* surface_texture) {
+    const gpu::SurfaceOwner* surface_owner) {
   FulfillScopedSurfaceRequest(request_token,
-                              gl::ScopedJavaSurface(surface_texture));
+                              surface_owner->CreateJavaSurface());
 }
 
 void ScopedSurfaceRequestManager::FulfillScopedSurfaceRequest(
diff --git a/content/browser/android/scoped_surface_request_manager.h b/content/browser/android/scoped_surface_request_manager.h
index aee96e95..2030ec8 100644
--- a/content/browser/android/scoped_surface_request_manager.h
+++ b/content/browser/android/scoped_surface_request_manager.h
@@ -49,9 +49,9 @@
   // Implementation of ScopedSurfaceRequestConduit.
   // To be used in the single process case.
   // Can be called from any thread.
-  void ForwardSurfaceTextureForSurfaceRequest(
+  void ForwardSurfaceOwnerForSurfaceRequest(
       const base::UnguessableToken& request_token,
-      const gl::SurfaceTexture* surface_texture) override;
+      const gpu::SurfaceOwner* surface_owner) override;
 
   void clear_requests_for_testing() { request_callbacks_.clear(); }
 
diff --git a/content/browser/android/scoped_surface_request_manager_unittest.cc b/content/browser/android/scoped_surface_request_manager_unittest.cc
index 30e8fa3..bdff6917 100644
--- a/content/browser/android/scoped_surface_request_manager_unittest.cc
+++ b/content/browser/android/scoped_surface_request_manager_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/callback_forward.h"
 #include "base/run_loop.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "gpu/ipc/common/android/surface_owner_android.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gl/android/scoped_java_surface.h"
 #include "ui/gl/android/surface_texture.h"
@@ -26,7 +27,7 @@
     last_received_request_ = 0;
     dummy_token_ = base::UnguessableToken::Deserialize(123, 456);
 
-    surface_texture = gl::SurfaceTexture::Create(0);
+    surface_owner = gpu::SurfaceOwner::Create(0);
     dummy_request_ =
         base::Bind(&ScopedSurfaceRequestManagerUnitTest::DummyCallback,
                    base::Unretained(this));
@@ -46,7 +47,7 @@
 
   ScopedSurfaceRequestManager::ScopedSurfaceRequestCB dummy_request_;
   ScopedSurfaceRequestManager::ScopedSurfaceRequestCB specific_logging_request_;
-  scoped_refptr<gl::SurfaceTexture> surface_texture;
+  std::unique_ptr<gpu::SurfaceOwner> surface_owner;
 
   int last_received_request_;
   const int kSpecificCallbackId = 1357;
@@ -139,8 +140,8 @@
        FulfillUnregisteredRequest_ShouldDoNothing) {
   manager_->RegisterScopedSurfaceRequest(specific_logging_request_);
 
-  manager_->FulfillScopedSurfaceRequest(
-      dummy_token_, gl::ScopedJavaSurface(surface_texture.get()));
+  manager_->FulfillScopedSurfaceRequest(dummy_token_,
+                                        surface_owner->CreateJavaSurface());
 
   EXPECT_EQ(1, manager_->request_count_for_testing());
   EXPECT_NE(kSpecificCallbackId, last_received_request_);
@@ -158,8 +159,8 @@
       base::Bind(&ScopedSurfaceRequestManagerUnitTest::LoggingCallback,
                  base::Unretained(this), kOtherCallbackId));
 
-  manager_->FulfillScopedSurfaceRequest(
-      specific_token, gl::ScopedJavaSurface(surface_texture.get()));
+  manager_->FulfillScopedSurfaceRequest(specific_token,
+                                        surface_owner->CreateJavaSurface());
 
   base::RunLoop().RunUntilIdle();
 
@@ -170,12 +171,11 @@
 // Makes sure that the ScopedSurfaceRequestConduit implementation properly
 // fulfills requests.
 TEST_F(ScopedSurfaceRequestManagerUnitTest,
-       ForwardSurfaceTexture_ShouldFulfillRequest) {
+       ForwardSurfaceOwner_ShouldFulfillRequest) {
   base::UnguessableToken token =
       manager_->RegisterScopedSurfaceRequest(specific_logging_request_);
 
-  manager_->ForwardSurfaceTextureForSurfaceRequest(token,
-                                                   surface_texture.get());
+  manager_->ForwardSurfaceOwnerForSurfaceRequest(token, surface_owner.get());
 
   base::RunLoop().RunUntilIdle();
 
diff --git a/content/browser/appcache/appcache_service_impl.cc b/content/browser/appcache/appcache_service_impl.cc
index 498cbbd..daf00d06 100644
--- a/content/browser/appcache/appcache_service_impl.cc
+++ b/content/browser/appcache/appcache_service_impl.cc
@@ -14,7 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "content/browser/appcache/appcache.h"
 #include "content/browser/appcache/appcache_backend_impl.h"
diff --git a/content/browser/background_fetch/OWNERS b/content/browser/background_fetch/OWNERS
index a7cd217..43e2da2a 100644
--- a/content/browser/background_fetch/OWNERS
+++ b/content/browser/background_fetch/OWNERS
@@ -3,7 +3,6 @@
 # //chrome/browser/background_fetch/
 # //content/common/background_fetch/
 
-awdf@chromium.org
 peter@chromium.org
 delphick@chromium.org
 
diff --git a/content/browser/background_fetch/storage/get_initialization_data_task.cc b/content/browser/background_fetch/storage/get_initialization_data_task.cc
index 36455185..0e1d38cc 100644
--- a/content/browser/background_fetch/storage/get_initialization_data_task.cc
+++ b/content/browser/background_fetch/storage/get_initialization_data_task.cc
@@ -6,8 +6,8 @@
 
 #include "base/barrier_closure.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "content/browser/background_fetch/background_fetch.pb.h"
 #include "content/browser/background_fetch/background_fetch_data_manager.h"
 #include "content/browser/background_fetch/background_fetch_request_info.h"
diff --git a/content/browser/background_fetch/storage/image_helpers.cc b/content/browser/background_fetch/storage/image_helpers.cc
index e64c078..8dc2076 100644
--- a/content/browser/background_fetch/storage/image_helpers.cc
+++ b/content/browser/background_fetch/storage/image_helpers.cc
@@ -5,8 +5,8 @@
 #include "content/browser/background_fetch/storage/image_helpers.h"
 
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "ui/gfx/image/image.h"
 
 namespace content {
diff --git a/content/browser/background_fetch/storage/mark_request_complete_task.cc b/content/browser/background_fetch/storage/mark_request_complete_task.cc
index f509d64..998eaa41 100644
--- a/content/browser/background_fetch/storage/mark_request_complete_task.cc
+++ b/content/browser/background_fetch/storage/mark_request_complete_task.cc
@@ -19,44 +19,6 @@
 #include "storage/browser/blob/blob_storage_context.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom.h"
 
-namespace mojo {
-
-// TODO(leonhsl): Deprecate this converter once we replace usages of
-// content::ServiceWorkerResponse with blink::mojom::FetchAPIResponse in
-// background_fetch codes.
-template <>
-struct TypeConverter<blink::mojom::FetchAPIResponsePtr,
-                     content::ServiceWorkerResponse> {
-  static blink::mojom::FetchAPIResponsePtr Convert(
-      const content::ServiceWorkerResponse& input) {
-    blink::mojom::SerializedBlobPtr blob;
-    if (input.blob) {
-      blob = blink::mojom::SerializedBlob::New();
-      blob->uuid = input.blob_uuid;
-      blob->size = input.blob_size;
-      blob->blob = input.blob->TakeBlobPtr().PassInterface();
-    }
-    blink::mojom::SerializedBlobPtr side_data_blob;
-    if (input.side_data_blob) {
-      side_data_blob = blink::mojom::SerializedBlob::New();
-      side_data_blob->uuid = input.side_data_blob_uuid;
-      side_data_blob->size = input.side_data_blob_size;
-      side_data_blob->blob =
-          input.side_data_blob->TakeBlobPtr().PassInterface();
-    }
-    base::flat_map<std::string, std::string> headers(input.headers.begin(),
-                                                     input.headers.end());
-    return blink::mojom::FetchAPIResponse::New(
-        input.url_list, input.status_code, input.status_text,
-        input.response_type, headers, std::move(blob), input.error,
-        input.response_time, input.cache_storage_cache_name,
-        input.cors_exposed_header_names, input.is_in_cache_storage,
-        std::move(side_data_blob));
-  }
-};
-
-}  // namespace mojo
-
 namespace content {
 
 namespace background_fetch {
@@ -97,7 +59,7 @@
 }
 
 void MarkRequestCompleteTask::StoreResponse(base::OnceClosure done_closure) {
-  auto response = std::make_unique<ServiceWorkerResponse>();
+  auto response = blink::mojom::FetchAPIResponse::New();
   response->url_list = request_info_->GetURLChain();
   // TODO(crbug.com/838837): fill error and cors_exposed_header_names in
   // response.
@@ -129,7 +91,7 @@
 }
 
 void MarkRequestCompleteTask::PopulateResponseBody(
-    ServiceWorkerResponse* response) {
+    blink::mojom::FetchAPIResponse* response) {
   // Include the status code, status text and the response's body as a blob
   // when this is allowed by the CORS protocol.
   response->status_code = request_info_->GetResponseCode();
@@ -164,19 +126,16 @@
   if (!blob_data_handle)
     return;
 
-  response->blob_uuid = blob_data_handle->uuid();
-  response->blob_size = blob_data_handle->size();
-  blink::mojom::BlobPtr blob_ptr;
+  response->blob = blink::mojom::SerializedBlob::New();
+  response->blob->uuid = blob_data_handle->uuid();
+  response->blob->size = blob_data_handle->size();
   storage::BlobImpl::Create(
       std::make_unique<storage::BlobDataHandle>(*blob_data_handle),
-      MakeRequest(&blob_ptr));
-
-  response->blob =
-      base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr));
+      MakeRequest(&response->blob->blob));
 }
 
 void MarkRequestCompleteTask::DidOpenCache(
-    std::unique_ptr<ServiceWorkerResponse> response,
+    blink::mojom::FetchAPIResponsePtr response,
     base::OnceClosure done_closure,
     CacheStorageCacheHandle handle,
     blink::mojom::CacheStorageError error) {
@@ -193,7 +152,7 @@
   // We need to keep the handle refcounted while the write is happening,
   // so it's passed along to the callback.
   handle.value()->Put(
-      std::move(request), blink::mojom::FetchAPIResponse::From(*response),
+      std::move(request), std::move(response),
       base::BindOnce(&MarkRequestCompleteTask::DidWriteToCache,
                      weak_factory_.GetWeakPtr(), std::move(handle),
                      std::move(done_closure)));
diff --git a/content/browser/background_fetch/storage/mark_request_complete_task.h b/content/browser/background_fetch/storage/mark_request_complete_task.h
index 9e96d1d..4bc6895 100644
--- a/content/browser/background_fetch/storage/mark_request_complete_task.h
+++ b/content/browser/background_fetch/storage/mark_request_complete_task.h
@@ -37,9 +37,9 @@
  private:
   void StoreResponse(base::OnceClosure done_closure);
 
-  void PopulateResponseBody(ServiceWorkerResponse* response);
+  void PopulateResponseBody(blink::mojom::FetchAPIResponse* response);
 
-  void DidOpenCache(std::unique_ptr<ServiceWorkerResponse> response,
+  void DidOpenCache(blink::mojom::FetchAPIResponsePtr response,
                     base::OnceClosure done_closure,
                     CacheStorageCacheHandle handle,
                     blink::mojom::CacheStorageError error);
@@ -83,4 +83,4 @@
 
 }  // namespace content
 
-#endif  // CONTENT_BROWSER_BACKGROUND_FETCH_STORAGE_MARK_REQUEST_COMPLETE_TASK_H_
\ No newline at end of file
+#endif  // CONTENT_BROWSER_BACKGROUND_FETCH_STORAGE_MARK_REQUEST_COMPLETE_TASK_H_
diff --git a/content/browser/blob_storage/chrome_blob_storage_context.cc b/content/browser/blob_storage/chrome_blob_storage_context.cc
index e4c46cae..203e9c7 100644
--- a/content/browser/blob_storage/chrome_blob_storage_context.cc
+++ b/content/browser/blob_storage/chrome_blob_storage_context.cc
@@ -16,7 +16,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/supports_user_data.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "content/browser/resource_context_impl.h"
 #include "content/public/browser/blob_handle.h"
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index 0e6c82b..840cafc 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -22,7 +22,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/rand_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/unguessable_token.h"
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc
index 3fa76a40..aea8bf88 100644
--- a/content/browser/browser_main_loop.cc
+++ b/content/browser/browser_main_loop.cc
@@ -38,7 +38,7 @@
 #include "base/strings/string_split.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/system_monitor/system_monitor.h"
-#include "base/task/task_scheduler/initialization_util_forward.h"
+#include "base/task/task_scheduler/initialization_util.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/browser_main_loop_unittest.cc b/content/browser/browser_main_loop_unittest.cc
index f8d7d34..a4bebc6 100644
--- a/content/browser/browser_main_loop_unittest.cc
+++ b/content/browser/browser_main_loop_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/command_line.h"
 #include "base/message_loop/message_loop.h"
 #include "base/sys_info.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_command_line.h"
 #include "content/browser/browser_thread_impl.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/browsing_data/clear_site_data_throttle_browsertest.cc b/content/browser/browsing_data/clear_site_data_throttle_browsertest.cc
index 8fba2e4..01c3a98 100644
--- a/content/browser/browsing_data/clear_site_data_throttle_browsertest.cc
+++ b/content/browser/browsing_data/clear_site_data_throttle_browsertest.cc
@@ -137,6 +137,7 @@
 
   // ServiceWorkerContextCoreObserver overrides.
   void OnVersionStateChanged(int64_t version_id,
+                             const GURL& scope,
                              ServiceWorkerVersion::Status) override {
     if (context_->GetLiveVersion(version_id)->status() ==
         ServiceWorkerVersion::ACTIVATED) {
diff --git a/content/browser/cache_storage/cache_storage_context_impl.cc b/content/browser/cache_storage/cache_storage_context_impl.cc
index 91bf00e..0c1eded 100644
--- a/content/browser/cache_storage/cache_storage_context_impl.cc
+++ b/content/browser/cache_storage/cache_storage_context_impl.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
 #include "content/browser/cache_storage/cache_storage_manager.h"
 #include "content/public/browser/browser_context.h"
diff --git a/content/browser/child_process_launcher_helper.cc b/content/browser/child_process_launcher_helper.cc
index 6a33a8b..6e0eebe2 100644
--- a/content/browser/child_process_launcher_helper.cc
+++ b/content/browser/child_process_launcher_helper.cc
@@ -8,10 +8,10 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/no_destructor.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/single_thread_task_runner_thread_mode_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
+#include "base/task/single_thread_task_runner_thread_mode.h"
+#include "base/task/task_traits.h"
 #include "content/browser/child_process_launcher.h"
 #include "content/public/browser/child_process_launcher_utils.h"
 #include "content/public/common/content_switches.h"
diff --git a/content/browser/child_process_launcher_helper_mac.cc b/content/browser/child_process_launcher_helper_mac.cc
index ce5e20ec1..8d4b1bf1 100644
--- a/content/browser/child_process_launcher_helper_mac.cc
+++ b/content/browser/child_process_launcher_helper_mac.cc
@@ -22,7 +22,6 @@
 #include "content/public/common/sandboxed_process_launcher_delegate.h"
 #include "sandbox/mac/seatbelt_exec.h"
 #include "services/service_manager/embedder/result_codes.h"
-#include "services/service_manager/sandbox/mac/audio.sb.h"
 #include "services/service_manager/sandbox/mac/cdm.sb.h"
 #include "services/service_manager/sandbox/mac/common_v2.sb.h"
 #include "services/service_manager/sandbox/mac/gpu_v2.sb.h"
@@ -74,8 +73,7 @@
       service_manager::IsUnsandboxedSandboxType(sandbox_type);
 
   // TODO(kerrnel): Delete this switch once the V2 sandbox is always enabled.
-  bool use_v2 = base::FeatureList::IsEnabled(features::kMacV2Sandbox);
-
+  bool v2_process = false;
   switch (sandbox_type) {
     case service_manager::SANDBOX_TYPE_NO_SANDBOX:
       break;
@@ -86,13 +84,7 @@
     case service_manager::SANDBOX_TYPE_NACL_LOADER:
     case service_manager::SANDBOX_TYPE_PDF_COMPOSITOR:
     case service_manager::SANDBOX_TYPE_PROFILING:
-      // If the feature experiment is enabled and this process type supports
-      // the v2 sandbox, use it.
-      use_v2 &= true;
-      break;
-    case service_manager::SANDBOX_TYPE_AUDIO:
-      // The audio service only exists with the v2 sandbox.
-      use_v2 |= true;
+      v2_process = true;
       break;
     default:
       // This is a 'break' because the V2 sandbox is not enabled for all
@@ -101,6 +93,9 @@
       break;
   }
 
+  bool use_v2 =
+      v2_process && base::FeatureList::IsEnabled(features::kMacV2Sandbox);
+
   if (use_v2 && !no_sandbox) {
     // Generate the profile string.
     std::string profile =
@@ -125,9 +120,6 @@
       case service_manager::SANDBOX_TYPE_PDF_COMPOSITOR:
         profile += service_manager::kSeatbeltPolicyString_pdf_compositor;
         break;
-      case service_manager::SANDBOX_TYPE_AUDIO:
-        profile += service_manager::kSeatbeltPolicyString_audio;
-        break;
       case service_manager::SANDBOX_TYPE_UTILITY:
       case service_manager::SANDBOX_TYPE_PROFILING:
         profile += service_manager::kSeatbeltPolicyString_utility;
@@ -151,7 +143,6 @@
       case service_manager::SANDBOX_TYPE_NACL_LOADER:
       case service_manager::SANDBOX_TYPE_RENDERER:
       case service_manager::SANDBOX_TYPE_PDF_COMPOSITOR:
-      case service_manager::SANDBOX_TYPE_AUDIO:
         SetupCommonSandboxParameters(seatbelt_exec_client_.get());
         break;
       case service_manager::SANDBOX_TYPE_PPAPI:
diff --git a/content/browser/cocoa/system_hotkey_helper_mac.mm b/content/browser/cocoa/system_hotkey_helper_mac.mm
index e0a488b..275b5f2 100644
--- a/content/browser/cocoa/system_hotkey_helper_mac.mm
+++ b/content/browser/cocoa/system_hotkey_helper_mac.mm
@@ -8,8 +8,8 @@
 #include "base/files/file_path.h"
 #include "base/mac/foundation_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/browser/cocoa/system_hotkey_map.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 511d805..fe8a7cc 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -266,7 +266,7 @@
       ozone_platform->GetOverlayManager();
   if (!command_line->HasSwitch(switches::kEnableHardwareOverlays) &&
       overlay_manager->SupportsOverlays()) {
-    enable_overlay_flag = "single-fullscreen,single-on-top";
+    enable_overlay_flag = "single-fullscreen,single-on-top,underlay";
   }
   if (!enable_overlay_flag.empty()) {
     std::unique_ptr<ui::OverlayCandidatesOzone> overlay_candidates =
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
index c2a3a8d..849e1d7 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
@@ -6,7 +6,6 @@
 
 #include <utility>
 
-#include "components/viz/common/gl_helper.h"
 #include "components/viz/service/display/output_surface_client.h"
 #include "components/viz/service/display/output_surface_frame.h"
 #include "components/viz/service/display_embedder/buffer_queue.h"
@@ -50,11 +49,9 @@
   // implementation.
   capabilities_.max_frames_pending = 2;
 
-  gl_helper_.reset(new viz::GLHelper(context_provider_->ContextGL(),
-                                     context_provider_->ContextSupport()));
   buffer_queue_.reset(new viz::BufferQueue(
       context_provider_->ContextGL(), target, internalformat, format,
-      gl_helper_.get(), gpu_memory_buffer_manager_, surface_handle));
+      gpu_memory_buffer_manager_, surface_handle));
   buffer_queue_->Initialize();
 }
 
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
index 439c855..7f836f6 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
@@ -6,6 +6,7 @@
 #define CONTENT_BROWSER_COMPOSITOR_GPU_SURFACELESS_BROWSER_COMPOSITOR_OUTPUT_SURFACE_H_
 
 #include <memory>
+#include <vector>
 
 #include "content/browser/compositor/gpu_browser_compositor_output_surface.h"
 #include "gpu/ipc/common/surface_handle.h"
@@ -16,7 +17,6 @@
 
 namespace viz {
 class BufferQueue;
-class GLHelper;
 }
 
 namespace content {
@@ -61,7 +61,6 @@
   bool use_gpu_fence_;
   unsigned gpu_fence_id_;
 
-  std::unique_ptr<viz::GLHelper> gl_helper_;
   std::unique_ptr<viz::BufferQueue> buffer_queue_;
   gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
 };
diff --git a/content/browser/compositor/image_transport_factory_browsertest.cc b/content/browser/compositor/image_transport_factory_browsertest.cc
index 659533c..c9ae05f 100644
--- a/content/browser/compositor/image_transport_factory_browsertest.cc
+++ b/content/browser/compositor/image_transport_factory_browsertest.cc
@@ -91,9 +91,11 @@
   if (factory->IsGpuCompositingDisabled())
     return;
 
-  viz::GLHelper* helper = factory->GetGLHelper();
-  ASSERT_TRUE(helper);
-  mailbox_ = base::MakeRefCounted<OwnedMailbox>(helper);
+  gpu::gles2::GLES2Interface* const gl = factory->GetContextFactory()
+                                             ->SharedMainThreadContextProvider()
+                                             ->ContextGL();
+  ASSERT_TRUE(gl);
+  mailbox_ = base::MakeRefCounted<OwnedMailbox>(gl);
   EXPECT_FALSE(mailbox_->mailbox().IsZero());
 
   // See TearDown() for the test expectation that |mailbox_| has been reset.
diff --git a/content/browser/compositor/owned_mailbox.cc b/content/browser/compositor/owned_mailbox.cc
index f1eddad0..d1509b6c 100644
--- a/content/browser/compositor/owned_mailbox.cc
+++ b/content/browser/compositor/owned_mailbox.cc
@@ -4,26 +4,36 @@
 
 #include "content/browser/compositor/owned_mailbox.h"
 
-#include "base/logging.h"
-#include "components/viz/common/gl_helper.h"
 #include "content/browser/compositor/image_transport_factory.h"
+#include "gpu/command_buffer/client/gles2_interface.h"
 
 namespace content {
 
-OwnedMailbox::OwnedMailbox(viz::GLHelper* gl_helper)
-    : texture_id_(0), gl_helper_(gl_helper) {
-  texture_id_ = gl_helper_->CreateTexture();
-  mailbox_holder_ = gl_helper_->ProduceMailboxHolderFromTexture(texture_id_);
-  // The texture target is not exposed on this class, as GLHelper assumes
-  // GL_TEXTURE_2D.
-  DCHECK_EQ(mailbox_holder_.texture_target,
-            static_cast<uint32_t>(GL_TEXTURE_2D));
+OwnedMailbox::OwnedMailbox(gpu::gles2::GLES2Interface* gl)
+    : gl_(gl), texture_id_(0) {
+  DCHECK(gl_);
+
+  // Create the texture.
+  static_assert(sizeof(texture_id_) == sizeof(GLuint),
+                "need to adjust type of texture_id_ in its declaration");
+  gl_->GenTextures(1, &texture_id_);
+  gl_->BindTexture(GL_TEXTURE_2D, texture_id_);
+  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+  gl_->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+  gl_->BindTexture(GL_TEXTURE_2D, 0);
+
+  // Initialize the MailboxHolder for the texture.
+  gl_->ProduceTextureDirectCHROMIUM(texture_id_, mailbox_holder_.mailbox.name);
+  gl_->GenSyncTokenCHROMIUM(mailbox_holder_.sync_token.GetData());
+  mailbox_holder_.texture_target = GL_TEXTURE_2D;
+
   ImageTransportFactory::GetInstance()->GetContextFactory()->AddObserver(this);
 }
 
 OwnedMailbox::~OwnedMailbox() {
-  if (gl_helper_)
-    Destroy();
+  Destroy();
 }
 
 void OwnedMailbox::UpdateSyncToken(const gpu::SyncToken& sync_token) {
@@ -32,18 +42,20 @@
 }
 
 void OwnedMailbox::Destroy() {
+  if (texture_id_ == 0)
+    return;
+
   ImageTransportFactory::GetInstance()->GetContextFactory()->RemoveObserver(
       this);
-  gl_helper_->WaitSyncToken(mailbox_holder_.sync_token);
-  gl_helper_->DeleteTexture(texture_id_);
+
+  gl_->WaitSyncTokenCHROMIUM(mailbox_holder_.sync_token.GetConstData());
+  gl_->DeleteTextures(1, &texture_id_);
   texture_id_ = 0;
   mailbox_holder_ = gpu::MailboxHolder();
-  gl_helper_ = nullptr;
 }
 
 void OwnedMailbox::OnLostSharedContext() {
-  if (gl_helper_)
-    Destroy();
+  Destroy();
 }
 
 void OwnedMailbox::OnLostVizProcess() {}
diff --git a/content/browser/compositor/owned_mailbox.h b/content/browser/compositor/owned_mailbox.h
index 9880759..af3fa1a9 100644
--- a/content/browser/compositor/owned_mailbox.h
+++ b/content/browser/compositor/owned_mailbox.h
@@ -13,20 +13,20 @@
 #include "gpu/command_buffer/common/mailbox_holder.h"
 #include "ui/compositor/compositor.h"
 
-namespace viz {
-class GLHelper;
+namespace gpu {
+namespace gles2 {
+class GLES2Interface;
+}
 }
 
 namespace content {
 
-
 // This class holds a texture id and gpu::Mailbox, and deletes the texture
-// id when the object itself is destroyed. Should only be created if a GLHelper
-// exists on the ImageTransportFactory.
+// id when the object itself is destroyed.
 class CONTENT_EXPORT OwnedMailbox : public base::RefCounted<OwnedMailbox>,
                                     public ui::ContextFactoryObserver {
  public:
-  explicit OwnedMailbox(viz::GLHelper* gl_helper);
+  explicit OwnedMailbox(gpu::gles2::GLES2Interface* gl);
 
   const gpu::MailboxHolder& holder() const { return mailbox_holder_; }
   const gpu::Mailbox& mailbox() const { return mailbox_holder_.mailbox; }
@@ -47,9 +47,9 @@
  private:
   friend class base::RefCounted<OwnedMailbox>;
 
+  gpu::gles2::GLES2Interface* const gl_;
   uint32_t texture_id_;
   gpu::MailboxHolder mailbox_holder_;
-  viz::GLHelper* gl_helper_;
 };
 
 }  // namespace content
diff --git a/content/browser/compositor/reflector_texture.cc b/content/browser/compositor/reflector_texture.cc
index 35dcfff..fdc5680 100644
--- a/content/browser/compositor/reflector_texture.cc
+++ b/content/browser/compositor/reflector_texture.cc
@@ -4,7 +4,6 @@
 
 #include "content/browser/compositor/reflector_texture.h"
 
-#include "components/viz/common/gl_helper.h"
 #include "content/browser/compositor/owned_mailbox.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
@@ -13,36 +12,43 @@
 namespace content {
 
 ReflectorTexture::ReflectorTexture(viz::ContextProvider* context_provider)
-    : texture_id_(0) {
-  viz::GLHelper* shared_helper =
-      ImageTransportFactory::GetInstance()->GetGLHelper();
-  mailbox_ = new OwnedMailbox(shared_helper);
-  gpu::gles2::GLES2Interface* gl = context_provider->ContextGL();
+    : gl_(context_provider->ContextGL()), texture_id_(0) {
+  mailbox_ = new OwnedMailbox(gl_);
 
-  gl_helper_.reset(new viz::GLHelper(gl, context_provider->ContextSupport()));
-
-  texture_id_ = gl_helper_->ConsumeMailboxToTexture(mailbox_->mailbox(),
-                                                    mailbox_->sync_token());
+  if (!mailbox_->mailbox().IsZero()) {
+    if (mailbox_->sync_token().HasData())
+      gl_->WaitSyncTokenCHROMIUM(mailbox_->sync_token().GetConstData());
+    texture_id_ =
+        gl_->CreateAndConsumeTextureCHROMIUM(mailbox_->mailbox().name);
+  }
 }
 
 ReflectorTexture::~ReflectorTexture() {
-  gl_helper_->DeleteTexture(texture_id_);
+  if (texture_id_ != 0)
+    gl_->DeleteTextures(1, &texture_id_);
 }
 
 void ReflectorTexture::CopyTextureFullImage(const gfx::Size& size) {
-  gl_helper_->CopyTextureFullImage(texture_id_, size);
+  gl_->BindTexture(GL_TEXTURE_2D, texture_id_);
+  gl_->CopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, size.width(),
+                      size.height(), 0);
+  gl_->BindTexture(GL_TEXTURE_2D, 0);
+
   // Insert a barrier to make the copy show up in the mirroring compositor's
-  // mailbox. Since the the compositor contexts and the
-  // ImageTransportFactory's
-  // GLHelper are all on the same GPU channel, this is sufficient instead of
+  // mailbox. Since the the compositor contexts and the ImageTransportFactory's
+  // GL context are all on the same GPU channel, this is sufficient instead of
   // plumbing through a sync point.
-  gl_helper_->InsertOrderingBarrier();
+  gl_->OrderingBarrierCHROMIUM();
 }
 
 void ReflectorTexture::CopyTextureSubImage(const gfx::Rect& rect) {
-  gl_helper_->CopyTextureSubImage(texture_id_, rect);
+  gl_->BindTexture(GL_TEXTURE_2D, texture_id_);
+  gl_->CopyTexSubImage2D(GL_TEXTURE_2D, 0, rect.x(), rect.y(), rect.x(),
+                         rect.y(), rect.width(), rect.height());
+  gl_->BindTexture(GL_TEXTURE_2D, 0);
+
   // Insert a barrier for the same reason above.
-  gl_helper_->InsertOrderingBarrier();
+  gl_->OrderingBarrierCHROMIUM();
 }
 
 }  // namespace content
diff --git a/content/browser/compositor/reflector_texture.h b/content/browser/compositor/reflector_texture.h
index d5531a36..ae1a3d7f 100644
--- a/content/browser/compositor/reflector_texture.h
+++ b/content/browser/compositor/reflector_texture.h
@@ -19,9 +19,14 @@
 class Size;
 }
 
+namespace gpu {
+namespace gles2 {
+class GLES2Interface;
+}
+}  // namespace gpu
+
 namespace viz {
 class ContextProvider;
-class GLHelper;
 }
 
 namespace content {
@@ -39,8 +44,8 @@
   scoped_refptr<OwnedMailbox> mailbox() { return mailbox_; }
 
  private:
+  gpu::gles2::GLES2Interface* const gl_;
   scoped_refptr<OwnedMailbox> mailbox_;
-  std::unique_ptr<viz::GLHelper> gl_helper_;
   uint32_t texture_id_;
 
   DISALLOW_COPY_AND_ASSIGN(ReflectorTexture);
@@ -48,4 +53,4 @@
 
 }  // namespace content
 
-#endif
+#endif  // CONTENT_BROWSER_COMPOSITOR_REFLECTOR_TEXTURE_H_
diff --git a/content/browser/devtools/devtools_http_handler.cc b/content/browser/devtools/devtools_http_handler.cc
index a33c464..a0ce6d62 100644
--- a/content/browser/devtools/devtools_http_handler.cc
+++ b/content/browser/devtools/devtools_http_handler.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/content/browser/devtools/devtools_pipe_handler.cc b/content/browser/devtools/devtools_pipe_handler.cc
index 0d7d1d24..8552cf2 100644
--- a/content/browser/devtools/devtools_pipe_handler.cc
+++ b/content/browser/devtools/devtools_pipe_handler.cc
@@ -20,7 +20,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/devtools/devtools_session.cc b/content/browser/devtools/devtools_session.cc
index 7e85f6d..0d91850 100644
--- a/content/browser/devtools/devtools_session.cc
+++ b/content/browser/devtools/devtools_session.cc
@@ -81,10 +81,9 @@
     const blink::mojom::DevToolsAgentAssociatedPtr& agent) {
   blink::mojom::DevToolsSessionHostAssociatedPtrInfo host_ptr_info;
   binding_.Bind(mojo::MakeRequest(&host_ptr_info));
-  agent->AttachDevToolsSession(std::move(host_ptr_info),
-                               mojo::MakeRequest(&session_ptr_),
-                               mojo::MakeRequest(&io_session_ptr_),
-                               state_cookie_, session_state_cookie_.Clone());
+  agent->AttachDevToolsSession(
+      std::move(host_ptr_info), mojo::MakeRequest(&session_ptr_),
+      mojo::MakeRequest(&io_session_ptr_), session_state_cookie_.Clone());
   session_ptr_.set_connection_error_handler(base::BindOnce(
       &DevToolsSession::MojoConnectionDestroyed, base::Unretained(this)));
 
@@ -103,9 +102,7 @@
     waiting_for_response_messages_.clear();
   }
 
-  // Set cookie to an empty string to reattach next time instead of attaching.
-  if (!state_cookie_.has_value())
-    state_cookie_ = std::string();
+  // Set cookie to an empty struct to reattach next time instead of attaching.
   if (!session_state_cookie_)
     session_state_cookie_ = blink::mojom::DevToolsSessionState::New();
 }
@@ -221,10 +218,7 @@
 void DevToolsSession::DispatchProtocolResponse(
     const std::string& message,
     int call_id,
-    const base::Optional<std::string>& state,
     blink::mojom::DevToolsSessionStatePtr updates) {
-  if (state.has_value())
-    state_cookie_ = state.value();
   ApplySessionStateUpdates(std::move(updates));
   waiting_for_response_messages_.erase(call_id);
   client_->DispatchProtocolMessage(agent_host_, message);
@@ -233,10 +227,7 @@
 
 void DevToolsSession::DispatchProtocolNotification(
     const std::string& message,
-    const base::Optional<std::string>& state,
     blink::mojom::DevToolsSessionStatePtr updates) {
-  if (state.has_value())
-    state_cookie_ = state.value();
   ApplySessionStateUpdates(std::move(updates));
   client_->DispatchProtocolMessage(agent_host_, message);
   // |this| may be deleted at this point.
diff --git a/content/browser/devtools/devtools_session.h b/content/browser/devtools/devtools_session.h
index b7f372d..467edb4 100644
--- a/content/browser/devtools/devtools_session.h
+++ b/content/browser/devtools/devtools_session.h
@@ -88,11 +88,9 @@
   void DispatchProtocolResponse(
       const std::string& message,
       int call_id,
-      const base::Optional<std::string>& state,
       blink::mojom::DevToolsSessionStatePtr updates) override;
   void DispatchProtocolNotification(
       const std::string& message,
-      const base::Optional<std::string>& state,
       blink::mojom::DevToolsSessionStatePtr updates) override;
 
   // Merges the |updates| received from the renderer into session_state_cookie_.
@@ -128,10 +126,9 @@
   };
   std::map<int, WaitingMessage> waiting_for_response_messages_;
 
-  // |state_cookie_| always corresponds to a state before
+  // |session_state_cookie_| always corresponds to a state before
   // any of the waiting for response messages have been handled.
-  // Note that |state_cookie_| is not present only before first attach.
-  base::Optional<std::string> state_cookie_;
+  // |session_state_cookie_| is nullptr before first attach.
   blink::mojom::DevToolsSessionStatePtr session_state_cookie_;
 
   base::WeakPtrFactory<DevToolsSession> weak_factory_;
diff --git a/content/browser/devtools/devtools_stream_file.cc b/content/browser/devtools/devtools_stream_file.cc
index bb0e500..1e0aa6b 100644
--- a/content/browser/devtools/devtools_stream_file.cc
+++ b/content/browser/devtools/devtools_stream_file.cc
@@ -9,8 +9,8 @@
 #include "base/files/file_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
 #include "base/third_party/icu/icu_utf.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/devtools/protocol/devtools_download_manager_delegate.cc b/content/browser/devtools/protocol/devtools_download_manager_delegate.cc
index c3a45349..bfaa525 100644
--- a/content/browser/devtools/protocol/devtools_download_manager_delegate.cc
+++ b/content/browser/devtools/protocol/devtools_download_manager_delegate.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/browser/devtools/protocol/devtools_download_manager_helper.h"
 #include "content/public/browser/browser_context.h"
diff --git a/content/browser/devtools/protocol/devtools_download_manager_helper.cc b/content/browser/devtools/protocol/devtools_download_manager_helper.cc
index d1b63f6..736caf3 100644
--- a/content/browser/devtools/protocol/devtools_download_manager_helper.cc
+++ b/content/browser/devtools/protocol/devtools_download_manager_helper.cc
@@ -6,9 +6,6 @@
 
 #include "base/bind.h"
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(
-    content::protocol::DevToolsDownloadManagerHelper);
-
 namespace content {
 namespace protocol {
 
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index c7732ec2..7a9b40cc 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -20,7 +20,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/viz/common/features.h"
diff --git a/content/browser/devtools/protocol/tracing_handler.cc b/content/browser/devtools/protocol/tracing_handler.cc
index 296270a..9546e5d 100644
--- a/content/browser/devtools/protocol/tracing_handler.cc
+++ b/content/browser/devtools/protocol/tracing_handler.cc
@@ -42,6 +42,10 @@
 #include "services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.h"
 #include "services/tracing/public/mojom/constants.mojom.h"
 
+#ifdef OS_ANDROID
+#include "content/browser/renderer_host/compositor_impl_android.h"
+#endif
+
 namespace content {
 namespace protocol {
 
@@ -214,9 +218,16 @@
       return_as_stream_(false),
       gzip_compression_(false),
       weak_factory_(this) {
-  if (base::FeatureList::IsEnabled(features::kVizDisplayCompositor) ||
+  bool use_video_capture_api =
+      base::FeatureList::IsEnabled(features::kVizDisplayCompositor) ||
       base::FeatureList::IsEnabled(
-          features::kUseVideoCaptureApiForDevToolsSnapshots)) {
+          features::kUseVideoCaptureApiForDevToolsSnapshots);
+#ifdef OS_ANDROID
+  // Video capture API cannot be used on Android WebView.
+  if (!CompositorImpl::IsInitialized())
+    use_video_capture_api = false;
+#endif
+  if (use_video_capture_api) {
     video_consumer_ =
         std::make_unique<DevToolsVideoConsumer>(base::BindRepeating(
             &TracingHandler::OnFrameFromVideoConsumer, base::Unretained(this)));
diff --git a/content/browser/devtools/render_frame_devtools_agent_host.cc b/content/browser/devtools/render_frame_devtools_agent_host.cc
index f131c03..9493103 100644
--- a/content/browser/devtools/render_frame_devtools_agent_host.cc
+++ b/content/browser/devtools/render_frame_devtools_agent_host.cc
@@ -60,6 +60,7 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 
 #if defined(OS_ANDROID)
+#include "content/browser/renderer_host/compositor_impl_android.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "services/device/public/mojom/wake_lock_context.mojom.h"
 #endif
@@ -476,12 +477,19 @@
     session->AttachToAgent(agent_ptr_);
 
   if (sessions().size() == 1) {
-    // Taking screenshots using the video capture API is done in TracingHandler.
-    if (!base::FeatureList::IsEnabled(features::kVizDisplayCompositor) &&
-        !base::FeatureList::IsEnabled(
-            features::kUseVideoCaptureApiForDevToolsSnapshots)) {
+    bool use_video_capture_api =
+        base::FeatureList::IsEnabled(features::kVizDisplayCompositor) ||
+        base::FeatureList::IsEnabled(
+            features::kUseVideoCaptureApiForDevToolsSnapshots);
+#ifdef OS_ANDROID
+    // Video capture API cannot be used on Android WebView.
+    if (!CompositorImpl::IsInitialized())
+      use_video_capture_api = false;
+#endif
+    // When video capture API is used, don't instantiate
+    // DevToolsFrameTraceRecorder. Taking snapshots happens in TracingHandler.
+    if (!use_video_capture_api)
       frame_trace_recorder_.reset(new DevToolsFrameTraceRecorder());
-    }
     GrantPolicy();
 #if defined(OS_ANDROID)
     GetWakeLock()->RequestWakeLock();
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc
index 90c9b43..1f5335f 100644
--- a/content/browser/dom_storage/dom_storage_context_wrapper.cc
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc
@@ -19,7 +19,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "content/browser/dom_storage/dom_storage_area.h"
diff --git a/content/browser/dom_storage/session_storage_area_impl_unittest.cc b/content/browser/dom_storage/session_storage_area_impl_unittest.cc
index 8e538f3..30a5802 100644
--- a/content/browser/dom_storage/session_storage_area_impl_unittest.cc
+++ b/content/browser/dom_storage/session_storage_area_impl_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
diff --git a/content/browser/dom_storage/storage_area_impl_unittest.cc b/content/browser/dom_storage/storage_area_impl_unittest.cc
index c849b0ce..1d311f1 100644
--- a/content/browser/dom_storage/storage_area_impl_unittest.cc
+++ b/content/browser/dom_storage/storage_area_impl_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/test/test_simple_task_runner.h"
 #include "base/threading/thread.h"
diff --git a/content/browser/download/download_utils.cc b/content/browser/download/download_utils.cc
index c1052057..0fd90091 100644
--- a/content/browser/download/download_utils.cc
+++ b/content/browser/download/download_utils.cc
@@ -8,7 +8,7 @@
 #include "base/process/process_handle.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/download/database/in_progress/download_entry.h"
 #include "components/download/database/in_progress/in_progress_cache.h"
 #include "components/download/public/common/download_create_info.h"
diff --git a/content/browser/download/file_download_url_loader_factory_getter.cc b/content/browser/download/file_download_url_loader_factory_getter.cc
index 113d2e85..86dfd9a 100644
--- a/content/browser/download/file_download_url_loader_factory_getter.cc
+++ b/content/browser/download/file_download_url_loader_factory_getter.cc
@@ -4,8 +4,8 @@
 
 #include "content/browser/download/file_download_url_loader_factory_getter.h"
 
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "components/download/public/common/download_task_runner.h"
 #include "content/browser/file_url_loader_factory.h"
 #include "content/browser/url_loader_factory_getter.h"
diff --git a/content/browser/download/file_system_download_url_loader_factory_getter.cc b/content/browser/download/file_system_download_url_loader_factory_getter.cc
index 004b9aca..3c4780e 100644
--- a/content/browser/download/file_system_download_url_loader_factory_getter.cc
+++ b/content/browser/download/file_system_download_url_loader_factory_getter.cc
@@ -4,8 +4,8 @@
 
 #include "content/browser/download/file_system_download_url_loader_factory_getter.h"
 
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "components/download/public/common/download_task_runner.h"
 #include "content/browser/fileapi/file_system_url_loader_factory.h"
 #include "content/browser/url_loader_factory_getter.h"
diff --git a/content/browser/file_url_loader_factory.cc b/content/browser/file_url_loader_factory.cc
index 8fcebce5..32af22b 100644
--- a/content/browser/file_url_loader_factory.cc
+++ b/content/browser/file_url_loader_factory.cc
@@ -19,7 +19,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/public/browser/content_browser_client.h"
diff --git a/content/browser/fileapi/browser_file_system_helper.cc b/content/browser/fileapi/browser_file_system_helper.cc
index bb4c33d7e..7227c69 100644
--- a/content/browser/fileapi/browser_file_system_helper.cc
+++ b/content/browser/fileapi/browser_file_system_helper.cc
@@ -14,7 +14,7 @@
 #include "base/files/file_path.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/fileapi/file_system_operation_runner_unittest.cc b/content/browser/fileapi/file_system_operation_runner_unittest.cc
index d4364ed..8b520d2 100644
--- a/content/browser/fileapi/file_system_operation_runner_unittest.cc
+++ b/content/browser/fileapi/file_system_operation_runner_unittest.cc
@@ -8,9 +8,9 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_traits.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/browser/fileapi/file_system_url_loader_factory.cc b/content/browser/fileapi/file_system_url_loader_factory.cc
index 247dc4d..7489377 100644
--- a/content/browser/fileapi/file_system_url_loader_factory.cc
+++ b/content/browser/fileapi/file_system_url_loader_factory.cc
@@ -15,8 +15,8 @@
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "components/services/filesystem/public/interfaces/types.mojom.h"
 #include "content/browser/child_process_security_policy_impl.h"
diff --git a/content/browser/font_unique_name_lookup/font_unique_name_lookup_service.cc b/content/browser/font_unique_name_lookup/font_unique_name_lookup_service.cc
index 7fbdd56..79c4fa1 100644
--- a/content/browser/font_unique_name_lookup/font_unique_name_lookup_service.cc
+++ b/content/browser/font_unique_name_lookup/font_unique_name_lookup_service.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/font_unique_name_lookup/font_unique_name_lookup.h"
 #include "content/public/common/content_features.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
diff --git a/content/browser/frame_host/navigation_entry_screenshot_manager.cc b/content/browser/frame_host/navigation_entry_screenshot_manager.cc
index d8d41b5..5930c7d 100644
--- a/content/browser/frame_host/navigation_entry_screenshot_manager.cc
+++ b/content/browser/frame_host/navigation_entry_screenshot_manager.cc
@@ -8,7 +8,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/frame_host/navigation_controller_impl.h"
 #include "content/browser/frame_host/navigation_entry_impl.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc
index 201f23b..836668c 100644
--- a/content/browser/frame_host/navigation_handle_impl.cc
+++ b/content/browser/frame_host/navigation_handle_impl.cc
@@ -6,8 +6,10 @@
 
 #include <iterator>
 
+#include "base/bind.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/time/time.h"
 #include "content/browser/appcache/appcache_navigation_handle.h"
 #include "content/browser/appcache/appcache_service_impl.h"
 #include "content/browser/child_process_security_policy_impl.h"
@@ -25,6 +27,7 @@
 #include "content/browser/frame_host/origin_policy_throttle.h"
 #include "content/browser/frame_host/webui_navigation_throttle.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_impl.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/service_worker/service_worker_navigation_handle.h"
 #include "content/common/child_process_host_impl.h"
@@ -46,6 +49,15 @@
 
 namespace {
 
+// Default timeout for the READY_TO_COMMIT -> COMMIT transition.
+// Chosen based on the Navigation.ReadyToCommitUntilCommit UMA.
+constexpr base::TimeDelta kDefaultCommitTimeout =
+    base::TimeDelta::FromSeconds(10);
+
+// Timeout for the READY_TO_COMMIT -> COMMIT transition.
+// Overrideable via SetCommitTimeoutForTesting.
+base::TimeDelta g_commit_timeout = kDefaultCommitTimeout;
+
 // Use this to get a new unique ID for a NavigationHandle during construction.
 // The returned ID is guaranteed to be nonzero (zero is the "no ID" indicator).
 int64_t CreateUniqueHandleID() {
@@ -822,6 +834,7 @@
   render_frame_host_ = render_frame_host;
   state_ = READY_TO_COMMIT;
   ready_to_commit_time_ = base::TimeTicks::Now();
+  RestartCommitTimeout();
 
   // Record metrics for the time it takes to get to this state from the
   // beginning of the navigation.
@@ -897,6 +910,8 @@
                                  "DidCommitNavigation");
     state_ = DID_COMMIT;
   }
+  commit_timeout_timer_.Stop();
+  GetRenderFrameHost()->GetRenderWidgetHost()->RendererIsResponsive();
 
   // Record metrics for the time it took to commit the navigation if it was to
   // another document without error.
@@ -1381,4 +1396,31 @@
   return throttles_[next_index_ - 1].get();
 }
 
+void NavigationHandleImpl::RestartCommitTimeout() {
+  commit_timeout_timer_.Stop();
+  if (state_ >= DID_COMMIT)
+    return;
+
+  commit_timeout_timer_.Start(
+      FROM_HERE, g_commit_timeout,
+      base::BindRepeating(&NavigationHandleImpl::OnCommitTimeout,
+                          weak_factory_.GetWeakPtr()));
+}
+
+void NavigationHandleImpl::OnCommitTimeout() {
+  DCHECK_EQ(READY_TO_COMMIT, state_);
+  GetRenderFrameHost()->GetRenderWidgetHost()->RendererIsUnresponsive(
+      base::BindRepeating(&NavigationHandleImpl::RestartCommitTimeout,
+                          weak_factory_.GetWeakPtr()));
+}
+
+// static
+void NavigationHandleImpl::SetCommitTimeoutForTesting(
+    const base::TimeDelta& timeout) {
+  if (timeout.is_zero())
+    g_commit_timeout = kDefaultCommitTimeout;
+  else
+    g_commit_timeout = timeout;
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/navigation_handle_impl.h b/content/browser/frame_host/navigation_handle_impl.h
index fe477a94..29e2978 100644
--- a/content/browser/frame_host/navigation_handle_impl.h
+++ b/content/browser/frame_host/navigation_handle_impl.h
@@ -18,6 +18,8 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/optional.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "content/browser/frame_host/frame_tree_node.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
 #include "content/common/content_export.h"
@@ -377,6 +379,10 @@
     return GetDeferringThrottle();
   }
 
+  // Sets the READY_TO_COMMIT -> DID_COMMIT timeout.  Resets the timeout to the
+  // default value if |timeout| is zero.
+  static void SetCommitTimeoutForTesting(const base::TimeDelta& timeout);
+
  private:
   friend class NavigationHandleImplTest;
 
@@ -440,6 +446,12 @@
   // nullptr;
   NavigationThrottle* GetDeferringThrottle() const;
 
+  // Called if READY_TO_COMMIT -> COMMIT state transition takes an unusually
+  // long time.
+  void OnCommitTimeout();
+
+  void RestartCommitTimeout();
+
   // See NavigationHandle for a description of those member variables.
   GURL url_;
   scoped_refptr<SiteInstance> starting_site_instance_;
@@ -495,6 +507,9 @@
   // The time this naviagtion was ready to commit.
   base::TimeTicks ready_to_commit_time_;
 
+  // Timer for detecting an unexpectedly long time to commit a navigation.
+  base::OneShotTimer commit_timeout_timer_;
+
   // The unique id of the corresponding NavigationEntry.
   int pending_nav_entry_id_;
 
diff --git a/content/browser/frame_host/render_frame_host_delegate.cc b/content/browser/frame_host/render_frame_host_delegate.cc
index 26b8eec2..623cd42 100644
--- a/content/browser/frame_host/render_frame_host_delegate.cc
+++ b/content/browser/frame_host/render_frame_host_delegate.cc
@@ -126,4 +126,9 @@
   return Visibility::HIDDEN;
 }
 
+ukm::SourceId RenderFrameHostDelegate::GetUkmSourceIdForLastCommittedSource()
+    const {
+  return ukm::kInvalidSourceId;
+}
+
 }  // namespace content
diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h
index 7919ac1..e7971e0 100644
--- a/content/browser/frame_host/render_frame_host_delegate.h
+++ b/content/browser/frame_host/render_frame_host_delegate.h
@@ -27,6 +27,7 @@
 #include "net/http/http_response_headers.h"
 #include "services/device/public/mojom/geolocation_context.mojom.h"
 #include "services/device/public/mojom/wake_lock.mojom.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/base/window_open_disposition.h"
 
 #if defined(OS_WIN)
@@ -378,6 +379,11 @@
   // Returns the visibility of the delegate.
   virtual Visibility GetVisibility() const;
 
+  // Get the UKM source ID for current content. This is used for providing
+  // data about the content to the URL-keyed metrics service.
+  // Note: This is also exposed by the RenderWidgetHostDelegate.
+  virtual ukm::SourceId GetUkmSourceIdForLastCommittedSource() const;
+
  protected:
   virtual ~RenderFrameHostDelegate() {}
 };
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index b9915e7..f1df2ee8 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -23,7 +23,7 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/process/kill.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -168,7 +168,7 @@
 #include "third_party/blink/public/common/frame/frame_policy.h"
 #include "third_party/blink/public/mojom/page/page_visibility_state.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
-#include "third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.h"
 #include "ui/accessibility/ax_tree.h"
 #include "ui/accessibility/ax_tree_id_registry.h"
 #include "ui/accessibility/ax_tree_update.h"
@@ -3542,8 +3542,15 @@
                         ->GetVideoDecodePerfHistory()
                         ->GetSaveCallback();
   }
+
   registry_->AddInterface(base::BindRepeating(
-      &media::MediaMetricsProvider::Create, std::move(save_stats_cb)));
+      &media::MediaMetricsProvider::Create, frame_tree_node_->IsMainFrame(),
+      base::BindRepeating(
+          &RenderFrameHostDelegate::GetUkmSourceIdForLastCommittedSource,
+          // This callback is only executed when Create() is called, during
+          // which the lifetime of the |delegate_| is guaranteed.
+          base::Unretained(delegate_)),
+      std::move(save_stats_cb)));
 
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           cc::switches::kEnableGpuBenchmarking)) {
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index 0868ce6..d087251 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -68,7 +68,7 @@
 #include "third_party/blink/public/mojom/presentation/presentation.mojom.h"
 #include "third_party/blink/public/platform/dedicated_worker_factory.mojom.h"
 #include "third_party/blink/public/platform/modules/bluetooth/web_bluetooth.mojom.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h"
 #include "third_party/blink/public/platform/web_focus_type.h"
 #include "third_party/blink/public/platform/web_insecure_request_policy.h"
 #include "third_party/blink/public/platform/web_scroll_types.h"
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc
index 2938626..406302b 100644
--- a/content/browser/frame_host/render_frame_host_manager.cc
+++ b/content/browser/frame_host/render_frame_host_manager.cc
@@ -1971,7 +1971,7 @@
     // allowed to swap processes.
     no_renderer_swap_allowed |= !CanSubframeSwapProcess(
         request.common_params().url, request.source_site_instance(),
-        request.dest_site_instance(), was_server_redirect);
+        request.dest_site_instance());
   }
 
   if (no_renderer_swap_allowed)
@@ -2543,8 +2543,7 @@
 bool RenderFrameHostManager::CanSubframeSwapProcess(
     const GURL& dest_url,
     SiteInstance* source_instance,
-    SiteInstance* dest_instance,
-    bool was_server_redirect) {
+    SiteInstance* dest_instance) {
   // On renderer-initiated navigations, when the frame initiating the navigation
   // and the frame being navigated differ, |source_instance| is set to the
   // SiteInstance of the initiating frame. |dest_instance| is present on session
@@ -2561,22 +2560,25 @@
       resolved_url = dest_instance->GetSiteURL();
     } else {
       // If there is no SiteInstance this unique origin can be associated with,
-      // there are two cases:
-      // (1) If there was a server redirect, allow a process swap.  Normally,
-      // redirects to data: or about: URLs are disallowed as
+      // then check whether it is safe to put into the parent frame's process.
+      // This is the case for about:blank URLs (with or without fragments),
+      // since they contain no active data.  This is also the case for
+      // about:srcdoc, since such URLs only get active content from their parent
+      // frame.  Using the parent frame's process avoids putting blank frames
+      // into OOPIFs and preserves scripting for about:srcdoc.
+      //
+      // Allow a process swap for other unique origin URLs, such as data: URLs.
+      // These have active content and may have come from an untrusted source,
+      // such as a restored frame from a different site or a redirect.
+      // (Normally, redirects to data: or about: URLs are disallowed as
       // net::ERR_UNSAFE_REDIRECT. However, extensions can still redirect
       // arbitary requests to those URLs using the chrome.webRequest or
       // chrome.declarativeWebRequest API, which will end up here (for an
-      // example, see ExtensionWebRequestApiTest.WebRequestDeclarative1).  It's
-      // safest to swap processes for those redirects if we are in an
-      // appropriate OOPIF-enabled mode.
-      //
-      // (2) Otherwise, avoid a process swap.  We can get here during session
-      // restore, and this avoids putting all data: and about:blank subframes
-      // in OOPIFs. We can also get here in tests with browser-initiated
-      // subframe navigations (NavigateFrameToURL).
-      if (!was_server_redirect)
+      // example, see ExtensionWebRequestApiTest.WebRequestDeclarative1).)
+      if (resolved_url.IsAboutBlank() ||
+          resolved_url == GURL(content::kAboutSrcDocURL)) {
         return false;
+      }
     }
   }
 
diff --git a/content/browser/frame_host/render_frame_host_manager.h b/content/browser/frame_host/render_frame_host_manager.h
index 07c2254..d8cf377 100644
--- a/content/browser/frame_host/render_frame_host_manager.h
+++ b/content/browser/frame_host/render_frame_host_manager.h
@@ -730,8 +730,7 @@
   // Returns true if a subframe can navigate cross-process.
   bool CanSubframeSwapProcess(const GURL& dest_url,
                               SiteInstance* source_instance,
-                              SiteInstance* dest_instance,
-                              bool was_server_redirect);
+                              SiteInstance* dest_instance);
 
   // After a renderer process crash we'd have marked the host as invisible, so
   // we need to set the visibility of the new View to the correct value here
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc
index 21b77535..2be1a07d 100644
--- a/content/browser/gpu/gpu_process_host.cc
+++ b/content/browser/gpu/gpu_process_host.cc
@@ -703,8 +703,9 @@
       process_launched_(false),
       status_(UNKNOWN),
 #if defined(OS_MACOSX)
-      ca_transaction_gpu_coordinator_(
-          base::MakeRefCounted<CATransactionGPUCoordinator>(this)),
+      // TODO(ccameron): This is temporarily disabled to see if it is the cause
+      // of https://crbug.com/871430
+      ca_transaction_gpu_coordinator_(nullptr),
 #endif
       gpu_host_binding_(this),
       weak_ptr_factory_(this) {
@@ -733,8 +734,10 @@
   SendOutstandingReplies(EstablishChannelStatus::GPU_HOST_INVALID);
 
 #if defined(OS_MACOSX)
-  ca_transaction_gpu_coordinator_->HostWillBeDestroyed();
-  ca_transaction_gpu_coordinator_ = nullptr;
+  if (ca_transaction_gpu_coordinator_) {
+    ca_transaction_gpu_coordinator_->HostWillBeDestroyed();
+    ca_transaction_gpu_coordinator_ = nullptr;
+  }
 #endif
 
   if (status_ == UNKNOWN) {
diff --git a/content/browser/hyphenation/hyphenation_impl.cc b/content/browser/hyphenation/hyphenation_impl.cc
index 38900de..8d2cb168 100644
--- a/content/browser/hyphenation/hyphenation_impl.cc
+++ b/content/browser/hyphenation/hyphenation_impl.cc
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/timer/elapsed_timer.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
diff --git a/content/browser/indexed_db/indexed_db_context_impl.cc b/content/browser/indexed_db/indexed_db_context_impl.cc
index f2f88f9d..b6209f1 100644
--- a/content/browser/indexed_db/indexed_db_context_impl.cc
+++ b/content/browser/indexed_db/indexed_db_context_impl.cc
@@ -16,7 +16,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/default_clock.h"
 #include "base/time/time.h"
diff --git a/content/browser/indexed_db/indexed_db_internals_ui.cc b/content/browser/indexed_db/indexed_db_internals_ui.cc
index 9bd087a..31a649a1 100644
--- a/content/browser/indexed_db/indexed_db_internals_ui.cc
+++ b/content/browser/indexed_db/indexed_db_internals_ui.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/platform_thread.h"
 #include "base/values.h"
 #include "content/browser/indexed_db/indexed_db_context_impl.h"
diff --git a/content/browser/loader/cross_site_document_blocking_browsertest.cc b/content/browser/loader/cross_site_document_blocking_browsertest.cc
index 321ab2c..fa11009d 100644
--- a/content/browser/loader/cross_site_document_blocking_browsertest.cc
+++ b/content/browser/loader/cross_site_document_blocking_browsertest.cc
@@ -89,7 +89,7 @@
                        const std::string& resource_name,
                        ResourceType resource_type) {
   // //services/network doesn't have access to content::ResourceType and
-  // therefore cannot log some XSDB UMAs.
+  // therefore cannot log some CORB UMAs.
   bool is_restricted_uma_expected = false;
   if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
     is_restricted_uma_expected = true;
@@ -613,38 +613,21 @@
   ASSERT_EQ(net::OK, interceptor.completion_status().error_code);
   ASSERT_TRUE(interceptor.completion_status().should_report_corb_blocking);
 
-  // Verify that safelisted headers have not been removed by XSDB.
-  // See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name.
+  // Verify that most response headers have been removed by CORB.
   const std::string& headers =
       interceptor.response_head().headers->raw_headers();
-  EXPECT_THAT(headers,
-              HasSubstr("Cache-Control: no-cache, no-store, must-revalidate"));
-  EXPECT_THAT(headers, HasSubstr("Content-Language: TestLanguage"));
-  EXPECT_THAT(headers,
-              HasSubstr("Content-Type: application/json; charset=utf-8"));
-  EXPECT_THAT(headers, HasSubstr("Expires: Wed, 21 Oct 2199 07:28:00 GMT"));
-  EXPECT_THAT(headers,
-              HasSubstr("Last-Modified: Wed, 07 Feb 2018 13:55:00 PST"));
-  EXPECT_THAT(headers, HasSubstr("Pragma: TestPragma"));
-
-  // Make sure the test covers all the safelisted headers known to the product
-  // code.
-  for (const std::string& safelisted_header :
-       network::CrossOriginReadBlocking::GetCorsSafelistedHeadersForTesting()) {
-    EXPECT_TRUE(
-        interceptor.response_head().headers->HasHeader(safelisted_header));
-
-    std::string value;
-    interceptor.response_head().headers->EnumerateHeader(
-        nullptr, safelisted_header, &value);
-    EXPECT_FALSE(value.empty());
-  }
-
-  // Verify that other response headers have been removed by XSDB.
+  EXPECT_THAT(headers, HasSubstr("Access-Control-Allow-Origin: https://other"));
+  EXPECT_THAT(headers, Not(HasSubstr("Cache-Control")));
+  EXPECT_THAT(headers, Not(HasSubstr("Content-Language")));
   EXPECT_THAT(headers, Not(HasSubstr("Content-Length")));
-  EXPECT_THAT(headers, Not(HasSubstr("X-My-Secret-Header")));
+  EXPECT_THAT(headers, Not(HasSubstr("Content-Type")));
+  EXPECT_THAT(headers, Not(HasSubstr("Expires")));
+  EXPECT_THAT(headers, Not(HasSubstr("Last-Modified")));
   EXPECT_THAT(headers, Not(HasSubstr("MySecretCookieKey")));
   EXPECT_THAT(headers, Not(HasSubstr("MySecretCookieValue")));
+  EXPECT_THAT(headers, Not(HasSubstr("Pragma")));
+  EXPECT_THAT(headers, Not(HasSubstr("X-Content-Type-Options")));
+  EXPECT_THAT(headers, Not(HasSubstr("X-My-Secret-Header")));
 
   // Verify that the body is empty.
   EXPECT_EQ("", interceptor.response_body());
@@ -899,7 +882,7 @@
           }); )";
   EXPECT_TRUE(ExecuteScriptAndExtractString(shell(), script, &response));
 
-  // Verify that XSDB didn't block the response (since it was "faked" within the
+  // Verify that CORB didn't block the response (since it was "faked" within the
   // service worker and didn't cross any security boundaries).
   EXPECT_EQ("Response created by service worker", response);
   InspectHistograms(histograms, kShouldBeAllowedWithoutSniffing, "blah.html",
@@ -938,13 +921,13 @@
   std::string response;
   EXPECT_TRUE(ExecuteScriptAndExtractString(shell(), script, &response));
 
-  // Verify that XSDB blocked the response from the network (from
+  // Verify that CORB blocked the response from the network (from
   // |cross_origin_https_server_|) to the service worker.
   InspectHistograms(histograms, kShouldBeBlockedWithoutSniffing, "network.txt",
                     RESOURCE_TYPE_XHR);
 
   // Verify that the service worker replied with an expected error.
-  // Replying with an error means that XSDB is only active once (for the
+  // Replying with an error means that CORB is only active once (for the
   // initial, real network request) and therefore the test doesn't get
   // confused (second successful response would have added noise to the
   // histograms captured by the test).
diff --git a/content/browser/loader/cross_site_document_resource_handler.cc b/content/browser/loader/cross_site_document_resource_handler.cc
index 9079227..fb25e603 100644
--- a/content/browser/loader/cross_site_document_resource_handler.cc
+++ b/content/browser/loader/cross_site_document_resource_handler.cc
@@ -532,7 +532,7 @@
     next_handler_->OnResponseCompleted(net::URLRequestStatus(),
                                        std::move(controller));
   } else {
-    // Only report XSDB status for successful (i.e. non-aborted,
+    // Only report CORB status for successful (i.e. non-aborted,
     // non-errored-out) requests.
     if (status.is_success())
       analyzer_->LogAllowedResponse();
@@ -547,7 +547,7 @@
   const char* initiator_scheme_exception =
       GetContentClient()
           ->browser()
-          ->GetInitatorSchemeBypassingDocumentBlocking();
+          ->GetInitiatorSchemeBypassingDocumentBlocking();
 
   // Delegate most decisions to CrossOriginReadBlocking::ResponseAnalyzer.
   analyzer_ =
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index 248a64f3..5f651b6a 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -11,7 +11,7 @@
 #include "base/feature_list.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "components/download/public/common/download_stats.h"
 #include "content/browser/appcache/appcache_navigation_handle.h"
diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc
index fffaae90..4665a64 100644
--- a/content/browser/loader/resource_dispatcher_host_impl.cc
+++ b/content/browser/loader/resource_dispatcher_host_impl.cc
@@ -28,8 +28,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/third_party/dynamic_annotations/dynamic_annotations.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/timer/timer.h"
diff --git a/content/browser/loader/resource_dispatcher_host_unittest.cc b/content/browser/loader/resource_dispatcher_host_unittest.cc
index 8d6ef3fe..891d4fa5 100644
--- a/content/browser/loader/resource_dispatcher_host_unittest.cc
+++ b/content/browser/loader/resource_dispatcher_host_unittest.cc
@@ -17,8 +17,8 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/unguessable_token.h"
diff --git a/content/browser/media/android/media_player_renderer_web_contents_observer.cc b/content/browser/media/android/media_player_renderer_web_contents_observer.cc
index e519957..82bd10e 100644
--- a/content/browser/media/android/media_player_renderer_web_contents_observer.cc
+++ b/content/browser/media/android/media_player_renderer_web_contents_observer.cc
@@ -6,9 +6,6 @@
 
 #include "content/browser/media/android/media_player_renderer.h"
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(
-    content::MediaPlayerRendererWebContentsObserver);
-
 namespace content {
 
 MediaPlayerRendererWebContentsObserver::MediaPlayerRendererWebContentsObserver(
diff --git a/content/browser/media/android/media_resource_getter_impl.cc b/content/browser/media/android/media_resource_getter_impl.cc
index b0d71d4..74a94dfa 100644
--- a/content/browser/media/android/media_resource_getter_impl.cc
+++ b/content/browser/media/android/media_resource_getter_impl.cc
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/fileapi/browser_file_system_helper.h"
 #include "content/browser/resource_context_impl.h"
diff --git a/content/browser/media/capture/cursor_renderer.cc b/content/browser/media/capture/cursor_renderer.cc
deleted file mode 100644
index 6434a15..0000000
--- a/content/browser/media/capture/cursor_renderer.cc
+++ /dev/null
@@ -1,353 +0,0 @@
-// Copyright (c) 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/media/capture/cursor_renderer.h"
-
-#include <algorithm>
-#include <cmath>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/logging.h"
-#include "base/numerics/safe_conversions.h"
-#include "skia/ext/image_operations.h"
-#include "ui/gfx/geometry/rect.h"
-
-namespace content {
-
-namespace {
-
-inline int clip_byte(int x) {
-  return std::max(0, std::min(x, 255));
-}
-
-inline int alpha_blend(int alpha, int src, int dst) {
-  return (src * alpha + dst * (255 - alpha)) / 255;
-}
-
-}  // namespace
-
-CursorRenderer::CursorRenderer(CursorDisplaySetting cursor_display_setting)
-    : cursor_display_setting_(cursor_display_setting),
-      cursor_(gfx::NativeCursor()),
-      update_scaled_cursor_bitmap_(false),
-      mouse_move_behavior_atomic_(NOT_MOVING),
-      weak_factory_(this) {
-  // CursorRenderer can be constructed on any thread, but thereafter must be
-  // used according to class-level comments.
-  DETACH_FROM_SEQUENCE(ui_sequence_checker_);
-  DETACH_FROM_SEQUENCE(render_sequence_checker_);
-}
-
-CursorRenderer::~CursorRenderer() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
-}
-
-base::WeakPtr<CursorRenderer> CursorRenderer::GetWeakPtr() {
-  return weak_factory_.GetWeakPtr();
-}
-
-void CursorRenderer::SnapshotCursorState() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
-
-  base::AutoLock auto_lock(lock_);
-
-  // In CURSOR_DISPLAYED_ON_MOUSE_MOVEMENT mode, if the user hasn't recently
-  // moved nor clicked the mouse, do not render the mouse cursor.
-  if (cursor_display_setting_ == CURSOR_DISPLAYED_ON_MOUSE_MOVEMENT &&
-      mouse_move_behavior() != RECENTLY_MOVED_OR_CLICKED) {
-    view_size_ = gfx::Size();
-    return;
-  }
-
-  // Do not render the mouse cursor if the view is not in the foreground window
-  // on the user's desktop.
-  if (!IsCapturedViewActive()) {
-    view_size_ = gfx::Size();
-    return;
-  }
-
-  // Collect current view size and mouse cursor state.
-  view_size_ = GetCapturedViewSize();
-  if (view_size_.IsEmpty()) {
-    return;
-  }
-  cursor_position_ = GetCursorPositionInView();
-  if (!gfx::Rect(view_size_).Contains(cursor_position_)) {
-    view_size_ = gfx::Size();
-    return;
-  }
-  const gfx::NativeCursor cursor = GetLastKnownCursor();
-  if (cursor != cursor_ || !cursor_image_.readyToDraw()) {
-    cursor_ = cursor;
-    cursor_image_ = GetLastKnownCursorImage(&cursor_hot_point_);
-    // Force RenderOnVideoFrame() to re-generate its scaled cursor bitmap.
-    update_scaled_cursor_bitmap_ = true;
-  }
-}
-
-bool CursorRenderer::RenderOnVideoFrame(media::VideoFrame* frame,
-                                        const gfx::Rect& region_in_frame,
-                                        CursorRendererUndoer* undoer) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(render_sequence_checker_);
-  DCHECK(frame);
-
-  // Grab the |lock_| to read from shared mouse cursor state, and maybe
-  // re-render the scaled cursor bitmap.
-  gfx::Size view_size;
-  gfx::Point cursor_position;
-  {
-    base::AutoLock auto_lock(lock_);
-
-    if (view_size_.IsEmpty() || !cursor_image_.readyToDraw()) {
-      return false;
-    }
-
-    view_size = view_size_;
-
-    cursor_position = cursor_position_;
-    cursor_position.Offset(-cursor_hot_point_.x(), -cursor_hot_point_.y());
-    // |cursor_position| is further modified, below; but the |lock_| need not be
-    // held for that.
-
-    const int scaled_width =
-        base::saturated_cast<int>((static_cast<int64_t>(cursor_image_.width()) *
-                                   region_in_frame.width()) /
-                                  view_size.width());
-    const int scaled_height = base::saturated_cast<int>(
-        (static_cast<int64_t>(cursor_image_.height()) *
-         region_in_frame.height()) /
-        view_size.height());
-    if (scaled_width <= 0 || scaled_height <= 0) {
-      return false;
-    }
-    if (update_scaled_cursor_bitmap_) {
-      scaled_cursor_bitmap_ = SkBitmap();
-      update_scaled_cursor_bitmap_ = false;
-    }
-    if (!scaled_cursor_bitmap_.readyToDraw() ||
-        scaled_width != scaled_cursor_bitmap_.width() ||
-        scaled_height != scaled_cursor_bitmap_.height()) {
-      scaled_cursor_bitmap_ = skia::ImageOperations::Resize(
-          cursor_image_, skia::ImageOperations::RESIZE_BEST, scaled_width,
-          scaled_height);
-    }
-  }
-
-  // Translate cursor position from view coordinates to video frame content
-  // coordinates.
-  cursor_position.set_x(base::saturated_cast<int>(
-      region_in_frame.x() +
-      (static_cast<int64_t>(cursor_position.x()) * region_in_frame.width()) /
-          view_size.width()));
-  cursor_position.set_y(base::saturated_cast<int>(
-      region_in_frame.y() +
-      (static_cast<int64_t>(cursor_position.y()) * region_in_frame.height()) /
-          view_size.height()));
-
-  // Determine the region of the video frame to be modified.
-  gfx::Rect rect = gfx::IntersectRects(
-      gfx::Rect(cursor_position, gfx::Size(scaled_cursor_bitmap_.width(),
-                                           scaled_cursor_bitmap_.height())),
-      frame->visible_rect());
-  if (rect.IsEmpty())
-    return false;
-
-  if (undoer)
-    undoer->TakeSnapshot(*frame, rect);
-
-  // Render the cursor in the video frame. This loop also performs a simple
-  // RGB→YUV color space conversion, with alpha-blended compositing.
-  for (int y = rect.y(); y < rect.bottom(); ++y) {
-    int cursor_y = y - cursor_position.y();
-    uint8_t* yplane = frame->visible_data(media::VideoFrame::kYPlane) +
-                      y * frame->stride(media::VideoFrame::kYPlane);
-    uint8_t* uplane = frame->visible_data(media::VideoFrame::kUPlane) +
-                      (y / 2) * frame->stride(media::VideoFrame::kUPlane);
-    uint8_t* vplane = frame->visible_data(media::VideoFrame::kVPlane) +
-                      (y / 2) * frame->stride(media::VideoFrame::kVPlane);
-    for (int x = rect.x(); x < rect.right(); ++x) {
-      int cursor_x = x - cursor_position.x();
-      SkColor color = scaled_cursor_bitmap_.getColor(cursor_x, cursor_y);
-      int alpha = SkColorGetA(color);
-      int color_r = SkColorGetR(color);
-      int color_g = SkColorGetG(color);
-      int color_b = SkColorGetB(color);
-      int color_y = clip_byte(
-          ((color_r * 66 + color_g * 129 + color_b * 25 + 128) >> 8) + 16);
-      yplane[x] = alpha_blend(alpha, color_y, yplane[x]);
-
-      // Only sample U and V at even coordinates.
-      // TODO(miu): This isn't right. We should be blending four cursor pixels
-      // into each U or V output pixel.
-      if ((x % 2 == 0) && (y % 2 == 0)) {
-        int color_u = clip_byte(
-            ((color_r * -38 + color_g * -74 + color_b * 112 + 128) >> 8) + 128);
-        int color_v = clip_byte(
-            ((color_r * 112 + color_g * -94 + color_b * -18 + 128) >> 8) + 128);
-        uplane[x / 2] = alpha_blend(alpha, color_u, uplane[x / 2]);
-        vplane[x / 2] = alpha_blend(alpha, color_v, vplane[x / 2]);
-      }
-    }
-  }
-
-  return true;
-}
-
-void CursorRenderer::SetNeedsRedrawCallback(base::RepeatingClosure callback) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
-
-  needs_redraw_callback_ = std::move(callback);
-}
-
-bool CursorRenderer::IsUserInteractingWithView() const {
-  return mouse_move_behavior() == RECENTLY_MOVED_OR_CLICKED;
-}
-
-void CursorRenderer::OnMouseMoved(const gfx::Point& location) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
-
-  switch (mouse_move_behavior()) {
-    case NOT_MOVING:
-      set_mouse_move_behavior(STARTING_TO_MOVE);
-      mouse_move_start_location_ = location;
-      mouse_activity_ended_timer_.Start(
-          FROM_HERE, base::TimeDelta::FromSeconds(IDLE_TIMEOUT_SECONDS),
-          base::BindRepeating(&CursorRenderer::OnMouseHasGoneIdle,
-                              base::Unretained(this)));
-      break;
-    case STARTING_TO_MOVE:
-      if (std::abs(location.x() - mouse_move_start_location_.x()) >
-              MIN_MOVEMENT_PIXELS ||
-          std::abs(location.y() - mouse_move_start_location_.y()) >
-              MIN_MOVEMENT_PIXELS) {
-        set_mouse_move_behavior(RECENTLY_MOVED_OR_CLICKED);
-        mouse_activity_ended_timer_.Reset();
-      }
-      break;
-    case RECENTLY_MOVED_OR_CLICKED:
-      mouse_activity_ended_timer_.Reset();
-      break;
-  }
-
-  // If there is sufficient mouse activity, or the cursor should always be
-  // displayed, snapshot the cursor state and run the redraw callback to show it
-  // at its new location in the video.
-  if (mouse_move_behavior() == RECENTLY_MOVED_OR_CLICKED ||
-      cursor_display_setting_ == CURSOR_DISPLAYED_ALWAYS) {
-    SnapshotCursorState();
-    if (!needs_redraw_callback_.is_null()) {
-      needs_redraw_callback_.Run();
-    }
-  }
-}
-
-void CursorRenderer::OnMouseClicked(const gfx::Point& location) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
-
-  if (mouse_activity_ended_timer_.IsRunning()) {
-    mouse_activity_ended_timer_.Reset();
-  } else {
-    mouse_activity_ended_timer_.Start(
-        FROM_HERE, base::TimeDelta::FromSeconds(IDLE_TIMEOUT_SECONDS),
-        base::BindRepeating(&CursorRenderer::OnMouseHasGoneIdle,
-                            base::Unretained(this)));
-  }
-  set_mouse_move_behavior(RECENTLY_MOVED_OR_CLICKED);
-
-  // Regardless of the |cursor_display_setting_|, snapshot the cursor and run
-  // the redraw callback to show it at its current location in the video.
-  SnapshotCursorState();
-  if (!needs_redraw_callback_.is_null()) {
-    needs_redraw_callback_.Run();
-  }
-}
-
-void CursorRenderer::OnMouseHasGoneIdle() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(ui_sequence_checker_);
-
-  set_mouse_move_behavior(NOT_MOVING);
-
-  // The timer has fired to indicate no further mouse activity. It's a good idea
-  // to snapshot the cursor and run the redraw callback to ensure it is being
-  // presented in the video correctly, whether showing its final location or to
-  // remove it from the video.
-  SnapshotCursorState();
-  if (!needs_redraw_callback_.is_null()) {
-    needs_redraw_callback_.Run();
-  }
-}
-
-CursorRendererUndoer::CursorRendererUndoer() = default;
-
-CursorRendererUndoer::~CursorRendererUndoer() = default;
-
-CursorRendererUndoer::CursorRendererUndoer(
-    CursorRendererUndoer&& other) noexcept = default;
-
-CursorRendererUndoer& CursorRendererUndoer::operator=(
-    CursorRendererUndoer&& other) noexcept = default;
-
-namespace {
-
-// Returns the rect of pixels in a Chroma plane affected by the given |rect| in
-// the Luma plane.
-gfx::Rect ToEncompassingChromaRect(const gfx::Rect& rect) {
-  const int left = rect.x() / 2;
-  const int top = rect.y() / 2;
-  const int right = (rect.right() + 1) / 2;
-  const int bottom = (rect.bottom() + 1) / 2;
-  return gfx::Rect(left, top, right - left, bottom - top);
-}
-
-constexpr size_t kYuvPlanes[] = {media::VideoFrame::kYPlane,
-                                 media::VideoFrame::kUPlane,
-                                 media::VideoFrame::kVPlane};
-
-}  // namespace
-
-void CursorRendererUndoer::TakeSnapshot(const media::VideoFrame& frame,
-                                        const gfx::Rect& rect) {
-  DCHECK(frame.visible_rect().Contains(rect));
-
-  rect_ = rect;
-  const gfx::Rect chroma_rect = ToEncompassingChromaRect(rect_);
-  snapshot_.resize(rect_.size().GetArea() + 2 * chroma_rect.size().GetArea());
-
-  uint8_t* dst = snapshot_.data();
-  for (auto plane : kYuvPlanes) {
-    const gfx::Rect& plane_rect =
-        (plane == media::VideoFrame::kYPlane) ? rect_ : chroma_rect;
-    const int stride = frame.stride(plane);
-    const uint8_t* src =
-        frame.visible_data(plane) + plane_rect.y() * stride + plane_rect.x();
-    for (int row = 0; row < plane_rect.height(); ++row) {
-      memcpy(dst, src, plane_rect.width());
-      src += stride;
-      dst += plane_rect.width();
-    }
-  }
-}
-
-void CursorRendererUndoer::Undo(media::VideoFrame* frame) const {
-  DCHECK(frame->visible_rect().Contains(rect_));
-
-  const gfx::Rect chroma_rect = ToEncompassingChromaRect(rect_);
-
-  const uint8_t* src = snapshot_.data();
-  for (auto plane : kYuvPlanes) {
-    const gfx::Rect& plane_rect =
-        (plane == media::VideoFrame::kYPlane) ? rect_ : chroma_rect;
-    const int stride = frame->stride(plane);
-    uint8_t* dst =
-        frame->visible_data(plane) + plane_rect.y() * stride + plane_rect.x();
-    for (int row = 0; row < plane_rect.height(); ++row) {
-      memcpy(dst, src, plane_rect.width());
-      src += plane_rect.width();
-      dst += stride;
-    }
-  }
-}
-
-}  // namespace content
diff --git a/content/browser/media/capture/cursor_renderer.h b/content/browser/media/capture/cursor_renderer.h
deleted file mode 100644
index 64409bd..0000000
--- a/content/browser/media/capture/cursor_renderer.h
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (c) 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_H_
-#define CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_H_
-
-#include <atomic>
-
-#include "base/callback.h"
-#include "base/macros.h"
-#include "base/memory/weak_ptr.h"
-#include "base/sequence_checker.h"
-#include "base/synchronization/lock.h"
-#include "base/timer/timer.h"
-#include "content/common/content_export.h"
-#include "media/base/video_frame.h"
-#include "third_party/skia/include/core/SkBitmap.h"
-#include "ui/base/cursor/cursor.h"
-#include "ui/gfx/geometry/point.h"
-#include "ui/gfx/geometry/size.h"
-#include "ui/gfx/native_widget_types.h"
-
-namespace content {
-
-class CursorRendererUndoer;
-
-// CursorRenderer is an abstract base class that handles all the
-// non-platform-specific common cursor rendering functionality. In order to
-// track the cursor, the platform-specific implementation will listen to
-// mouse events and this base class will process them.
-//
-// All parts of this class are meant to run on the UI BrowserThread, except for
-// RenderOnVideoFrame() and IsUserInteractingWithView(), which may be called
-// from any thread. It is up to the client code to ensure the CursorRenderer's
-// lifetime while in use across multiple threads.
-class CONTENT_EXPORT CursorRenderer {
- public:
-  // Setting to control cursor display based on either mouse movement or always
-  // forced to be enabled.
-  enum CursorDisplaySetting {
-    CURSOR_DISPLAYED_ALWAYS,
-    CURSOR_DISPLAYED_ON_MOUSE_MOVEMENT,
-  };
-
-  static std::unique_ptr<CursorRenderer> Create(CursorDisplaySetting display);
-
-  virtual ~CursorRenderer();
-
-  // Sets a new target view to monitor for mouse cursor updates.
-  virtual void SetTargetView(gfx::NativeView view) = 0;
-
-  // Renders cursor on the given video frame within the content region,
-  // returning true if |frame| was modified. |undoer| is optional: If provided,
-  // it will be updated with state necessary for later undoing the cursor
-  // rendering.
-  bool RenderOnVideoFrame(media::VideoFrame* frame,
-                          const gfx::Rect& region_in_frame,
-                          CursorRendererUndoer* undoer);
-
-  // Sets a callback that will be run whenever RenderOnVideoFrame() should be
-  // called soon, to update the mouse cursor location or image in the video.
-  void SetNeedsRedrawCallback(base::RepeatingClosure callback);
-
-  // Returns true if the user has recently interacted with the view.
-  bool IsUserInteractingWithView() const;
-
-  // Returns a weak pointer.
-  base::WeakPtr<CursorRenderer> GetWeakPtr();
-
- protected:
-  enum {
-    // Minium movement before cursor has been considered intentionally moved by
-    // the user.
-    MIN_MOVEMENT_PIXELS = 15,
-    // Amount of time to elapse with no mouse activity before the cursor should
-    // stop showing in the video. Does not apply to CURSOR_DISPLAYED_ALWAYS
-    // mode, of course.
-    IDLE_TIMEOUT_SECONDS = 2
-  };
-
-  explicit CursorRenderer(CursorDisplaySetting display);
-
-  // Returns true if the captured view is a part of an active application
-  // window.
-  virtual bool IsCapturedViewActive() = 0;
-
-  // Returns the size of the captured view (view coordinates).
-  virtual gfx::Size GetCapturedViewSize() = 0;
-
-  // Returns the cursor's position within the captured view (view coordinates).
-  virtual gfx::Point GetCursorPositionInView() = 0;
-
-  // Returns the last-known mouse cursor.
-  virtual gfx::NativeCursor GetLastKnownCursor() = 0;
-
-  // Returns the image of the last-known mouse cursor and its hotspot.
-  virtual SkBitmap GetLastKnownCursorImage(gfx::Point* hot_point) = 0;
-
-  // Called by subclasses to report mouse events within the captured view.
-  void OnMouseMoved(const gfx::Point& location);
-  void OnMouseClicked(const gfx::Point& location);
-
-  // Called by the |mouse_activity_ended_timer_| once no mouse events have
-  // occurred for IDLE_TIMEOUT_SECONDS. Also, called by subclasses when changing
-  // the target view.
-  void OnMouseHasGoneIdle();
-
- private:
-  friend class CursorRendererAuraTest;
-  friend class CursorRendererMacTest;
-
-  enum MouseMoveBehavior {
-    NOT_MOVING,                 // Mouse has not moved recently.
-    STARTING_TO_MOVE,           // Mouse has moved, but not significantly.
-    RECENTLY_MOVED_OR_CLICKED,  // Sufficient mouse activity present.
-  };
-
-  // Accessors for |mouse_move_behavior_atomic_|. See comments below.
-  MouseMoveBehavior mouse_move_behavior() const {
-    return mouse_move_behavior_atomic_.load(std::memory_order_relaxed);
-  }
-  void set_mouse_move_behavior(MouseMoveBehavior behavior) {
-    mouse_move_behavior_atomic_.store(behavior, std::memory_order_relaxed);
-  }
-
-  // Takes a snapshot of the current mouse cursor state, for use by
-  // RenderOnVideoFrame().
-  void SnapshotCursorState();
-
-  // Controls whether cursor is displayed based on active mouse movement.
-  const CursorDisplaySetting cursor_display_setting_;
-
-  // Protects members shared by RenderOnVideoFrame() and the rest of the class.
-  base::Lock lock_;
-
-  // These are updated by SnapshotCursorState(), then later read within
-  // RenderOnVideoFrame(). Access is protected by |lock_|.
-  gfx::Size view_size_;  // Empty means "do not show mouse cursor."
-  gfx::Point cursor_position_;
-  gfx::NativeCursor cursor_;
-  gfx::Point cursor_hot_point_;
-  SkBitmap cursor_image_;
-  // Flag set to invalidate |scaled_cursor_bitmap_|.
-  bool update_scaled_cursor_bitmap_;
-
-  // A cache of the current scaled cursor bitmap. This is only accessed by the
-  // thread calling RenderOnVideoFrame().
-  SkBitmap scaled_cursor_bitmap_;
-
-  // Updated in the mouse event handlers and used to decide whether the user is
-  // interacting with the view and whether to run the |needs_redraw_callback_|.
-  // These do not need to be protected by |lock_| since they are only accessed
-  // on the UI BrowserThread.
-  gfx::Point mouse_move_start_location_;
-  base::OneShotTimer mouse_activity_ended_timer_;
-
-  // Updated in the mouse event handlers (on the UI BrowserThread) and read from
-  // by IsUserInteractingWithView() (on any thread). This is not protected by
-  // |lock_| since strict memory ordering semantics are not necessary, just
-  // atomicity between threads. All code should use the accessors to read or set
-  // this value.
-  std::atomic<MouseMoveBehavior> mouse_move_behavior_atomic_;
-
-  // Run whenever the mouse cursor would be rendered differently than when it
-  // was rendered in the last video frame.
-  base::RepeatingClosure needs_redraw_callback_;
-
-  // Everything except the constructor and RenderOnVideoFrame() must be called
-  // on the UI BrowserThread.
-  SEQUENCE_CHECKER(ui_sequence_checker_);
-
-  // RenderOnVideoFrame() must be called on the same thread each time.
-  SEQUENCE_CHECKER(render_sequence_checker_);
-
-  base::WeakPtrFactory<CursorRenderer> weak_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(CursorRenderer);
-};
-
-// Restores the original content of a VideoFrame, to the point before cursor
-// rendering modified it. See CursorRenderer::RenderOnVideoFrame().
-class CONTENT_EXPORT CursorRendererUndoer {
- public:
-  CursorRendererUndoer();
-  ~CursorRendererUndoer();
-
-  CursorRendererUndoer(CursorRendererUndoer&& other) noexcept;
-  CursorRendererUndoer& operator=(CursorRendererUndoer&& other) noexcept;
-
-  void TakeSnapshot(const media::VideoFrame& frame, const gfx::Rect& rect);
-
-  // Restores the frame content to the point where TakeSnapshot() was last
-  // called.
-  void Undo(media::VideoFrame* frame) const;
-
- private:
-  gfx::Rect rect_;
-  std::vector<uint8_t> snapshot_;
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_H_
diff --git a/content/browser/media/capture/cursor_renderer_aura.cc b/content/browser/media/capture/cursor_renderer_aura.cc
deleted file mode 100644
index ec13d0da..0000000
--- a/content/browser/media/capture/cursor_renderer_aura.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-// Copyright (c) 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/media/capture/cursor_renderer_aura.h"
-
-#include "ui/aura/client/screen_position_client.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window.h"
-#include "ui/aura/window_tree_host.h"
-#include "ui/base/cursor/cursors_aura.h"
-#include "ui/events/event_utils.h"
-#include "ui/wm/public/activation_client.h"
-
-namespace content {
-
-// static
-std::unique_ptr<CursorRenderer> CursorRenderer::Create(
-    CursorRenderer::CursorDisplaySetting display) {
-  return std::make_unique<CursorRendererAura>(display);
-}
-
-CursorRendererAura::CursorRendererAura(CursorDisplaySetting display)
-    : CursorRenderer(display) {}
-
-CursorRendererAura::~CursorRendererAura() {
-  SetTargetView(nullptr);
-}
-
-void CursorRendererAura::SetTargetView(aura::Window* window) {
-  if (window_) {
-    window_->RemoveObserver(this);
-    window_->RemovePreTargetHandler(this);
-  }
-  window_ = window;
-  OnMouseHasGoneIdle();
-  if (window_) {
-    window_->AddObserver(this);
-    window_->AddPreTargetHandler(this);
-  }
-}
-
-bool CursorRendererAura::IsCapturedViewActive() {
-  if (!window_) {
-    DVLOG(2) << "Skipping update with no window being tracked";
-    return false;
-  }
-
-  // If we are sharing the root window, or namely the whole screen, we will
-  // render the mouse cursor. For ordinary window, we only render the mouse
-  // cursor when the window is active.
-  if (!window_->IsRootWindow()) {
-    wm::ActivationClient* activation_client =
-        wm::GetActivationClient(window_->GetRootWindow());
-    if (!activation_client) {
-      DVLOG(2) << "Assume window inactive with invalid activation_client";
-      return false;
-    }
-    aura::Window* active_window = activation_client->GetActiveWindow();
-    if (!active_window) {
-      DVLOG(2) << "Skipping update as there is no active window";
-      return false;
-    }
-    if (!active_window->Contains(window_)) {
-      // Return early if the target window is not active.
-      DVLOG(2) << "Skipping update on an inactive window";
-      return false;
-    }
-  }
-  return true;
-}
-
-gfx::Size CursorRendererAura::GetCapturedViewSize() {
-  if (!window_) {
-    return gfx::Size();
-  }
-
-  const gfx::Rect window_bounds = window_->GetBoundsInScreen();
-  const gfx::Size view_size(window_bounds.width(), window_bounds.height());
-  return view_size;
-}
-
-gfx::Point CursorRendererAura::GetCursorPositionInView() {
-  if (!window_) {
-    return gfx::Point(-1, -1);
-  }
-
-  // Convert from screen coordinates to view coordinates.
-  aura::Window* const root_window = window_->GetRootWindow();
-  if (!root_window)
-    return gfx::Point(-1, -1);
-  aura::client::ScreenPositionClient* const client =
-      aura::client::GetScreenPositionClient(root_window);
-  if (!client)
-    return gfx::Point(-1, -1);
-  gfx::Point cursor_position = aura::Env::GetInstance()->last_mouse_location();
-  client->ConvertPointFromScreen(window_, &cursor_position);
-  return cursor_position;
-}
-
-gfx::NativeCursor CursorRendererAura::GetLastKnownCursor() {
-  if (!window_) {
-    return gfx::NativeCursor();
-  }
-
-  return window_->GetHost()->last_cursor();
-}
-
-SkBitmap CursorRendererAura::GetLastKnownCursorImage(gfx::Point* hot_point) {
-  if (!window_) {
-    return SkBitmap();
-  }
-
-  gfx::NativeCursor cursor = window_->GetHost()->last_cursor();
-  *hot_point = cursor.GetHotspot();
-  return cursor.GetBitmap();
-}
-
-void CursorRendererAura::OnMouseEvent(ui::MouseEvent* event) {
-  gfx::Point mouse_location(event->x(), event->y());
-  switch (event->type()) {
-    case ui::ET_MOUSE_MOVED:
-      OnMouseMoved(mouse_location);
-      break;
-    case ui::ET_MOUSE_PRESSED:
-    case ui::ET_MOUSE_RELEASED:
-    case ui::ET_MOUSEWHEEL:
-      OnMouseClicked(mouse_location);
-      break;
-    default:
-      return;
-  }
-}
-
-void CursorRendererAura::OnWindowDestroying(aura::Window* window) {
-  DCHECK_EQ(window_, window);
-  window_->RemovePreTargetHandler(this);
-  window_->RemoveObserver(this);
-  window_ = nullptr;
-}
-
-}  // namespace content
diff --git a/content/browser/media/capture/cursor_renderer_aura.h b/content/browser/media/capture/cursor_renderer_aura.h
deleted file mode 100644
index 8d825fa8..0000000
--- a/content/browser/media/capture/cursor_renderer_aura.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright (c) 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_AURA_H_
-#define CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_AURA_H_
-
-#include "content/browser/media/capture/cursor_renderer.h"
-#include "ui/aura/window.h"
-#include "ui/events/event_handler.h"
-
-namespace content {
-
-class CONTENT_EXPORT CursorRendererAura : public CursorRenderer,
-                                          public ui::EventHandler,
-                                          public aura::WindowObserver {
- public:
-  explicit CursorRendererAura(CursorDisplaySetting cursor_display);
-  ~CursorRendererAura() final;
-
-  // CursorRenderer implementation.
-  void SetTargetView(gfx::NativeView window) final;
-  bool IsCapturedViewActive() final;
-  gfx::Size GetCapturedViewSize() final;
-  gfx::Point GetCursorPositionInView() final;
-  gfx::NativeCursor GetLastKnownCursor() final;
-  SkBitmap GetLastKnownCursorImage(gfx::Point* hot_point) final;
-
-  // ui::EventHandler overrides.
-  void OnMouseEvent(ui::MouseEvent* event) final;
-
-  // aura::WindowObserver overrides.
-  void OnWindowDestroying(aura::Window* window) final;
-
- private:
-  aura::Window* window_ = nullptr;
-
-  DISALLOW_COPY_AND_ASSIGN(CursorRendererAura);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_AURA_H_
diff --git a/content/browser/media/capture/cursor_renderer_aura_unittest.cc b/content/browser/media/capture/cursor_renderer_aura_unittest.cc
deleted file mode 100644
index 4a5209e..0000000
--- a/content/browser/media/capture/cursor_renderer_aura_unittest.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright (c) 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/media/capture/cursor_renderer_aura.h"
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "base/files/file_path.h"
-#include "base/path_service.h"
-#include "base/time/time.h"
-#include "media/base/video_frame.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/aura/env.h"
-#include "ui/aura/test/aura_test_base.h"
-#include "ui/aura/test/test_windows.h"
-#include "ui/aura/window.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/events/event.h"
-#include "ui/events/event_utils.h"
-#include "ui/wm/core/default_activation_client.h"
-#include "ui/wm/core/default_screen_position_client.h"
-#include "ui/wm/core/window_util.h"
-
-namespace content {
-
-using aura::test::AuraTestBase;
-
-class CursorRendererAuraTest : public AuraTestBase {
- public:
-  CursorRendererAuraTest() {}
-  ~CursorRendererAuraTest() override {}
-
-  void SetUp() override {
-    AuraTestBase::SetUp();
-    // This is needed to avoid duplicate initialization across tests that leads
-    // to a failure.
-    if (!ui::ResourceBundle::HasSharedInstance()) {
-      // Initialize the shared global resource bundle that has bitmap
-      // resources needed by CursorRenderer
-      base::FilePath pak_file;
-      bool r = base::PathService::Get(base::DIR_MODULE, &pak_file);
-      DCHECK(r);
-      pak_file = pak_file.Append(FILE_PATH_LITERAL("content_shell.pak"));
-      ui::ResourceBundle::InitSharedInstanceWithPakPath(pak_file);
-    }
-
-    window_.reset(aura::test::CreateTestWindowWithBounds(
-        gfx::Rect(0, 0, 800, 600), root_window()));
-    cursor_renderer_.reset(new CursorRendererAura(
-        CursorRenderer::CURSOR_DISPLAYED_ON_MOUSE_MOVEMENT));
-    cursor_renderer_->SetTargetView(window_.get());
-    new wm::DefaultActivationClient(root_window());
-    aura::client::SetScreenPositionClient(root_window(),
-                                          &screen_position_client_);
-    wm::ActivateWindow(window_.get());
-  }
-
-  void TearDown() override {
-    aura::client::SetScreenPositionClient(root_window(), nullptr);
-    cursor_renderer_.reset();
-    window_.reset();
-    AuraTestBase::TearDown();
-  }
-
-  base::TimeTicks Now() { return base::TimeTicks::Now(); }
-
-  bool CursorDisplayed() {
-    // Request rendering into a dummy video frame. If RenderCursorOnVideoFrame()
-    // returns true, then the cursor is being displayed.
-    if (!dummy_frame_) {
-      constexpr gfx::Size dummy_frame_size = gfx::Size(320, 200);
-      dummy_frame_ = media::VideoFrame::CreateZeroInitializedFrame(
-          media::PIXEL_FORMAT_I420, dummy_frame_size,
-          gfx::Rect(dummy_frame_size), dummy_frame_size, base::TimeDelta());
-    }
-    return RenderCursorOnVideoFrame(dummy_frame_.get(), nullptr);
-  }
-
-  bool RenderCursorOnVideoFrame(media::VideoFrame* frame,
-                                CursorRendererUndoer* undoer) {
-    return cursor_renderer_->RenderOnVideoFrame(frame, frame->visible_rect(),
-                                                undoer);
-  }
-
-  bool IsUserInteractingWithView() {
-    return cursor_renderer_->IsUserInteractingWithView();
-  }
-
-  void MoveMouseCursorWithinWindow() {
-    gfx::Point point1(20, 20);
-    ui::MouseEvent event1(ui::ET_MOUSE_MOVED, point1, point1, Now(), 0, 0);
-    aura::Env::GetInstance()->SetLastMouseLocation(point1);
-    cursor_renderer_->OnMouseEvent(&event1);
-    gfx::Point point2(60, 60);
-    ui::MouseEvent event2(ui::ET_MOUSE_MOVED, point2, point2, Now(), 0, 0);
-    aura::Env::GetInstance()->SetLastMouseLocation(point2);
-    cursor_renderer_->OnMouseEvent(&event2);
-  }
-
-  void MoveMouseCursorOutsideWindow() {
-    gfx::Point point(1000, 1000);
-    ui::MouseEvent event1(ui::ET_MOUSE_MOVED, point, point, Now(), 0, 0);
-    aura::Env::GetInstance()->SetLastMouseLocation(point);
-    cursor_renderer_->OnMouseEvent(&event1);
-  }
-
-  void SimulateMouseWentIdle() {
-    EXPECT_TRUE(cursor_renderer_->mouse_activity_ended_timer_.IsRunning());
-    cursor_renderer_->mouse_activity_ended_timer_.Stop();
-    cursor_renderer_->OnMouseHasGoneIdle();
-  }
-
-  // A very simple test of whether there are any non-zero pixels
-  // in the region |rect| within |frame|.
-  bool NonZeroPixelsInRegion(scoped_refptr<media::VideoFrame> frame,
-                             gfx::Rect rect) {
-    bool y_found = false, u_found = false, v_found = false;
-    for (int y = rect.y(); y < rect.bottom(); ++y) {
-      uint8_t* yplane = frame->visible_data(media::VideoFrame::kYPlane) +
-                        y * frame->stride(media::VideoFrame::kYPlane);
-      uint8_t* uplane = frame->visible_data(media::VideoFrame::kUPlane) +
-                        (y / 2) * frame->stride(media::VideoFrame::kUPlane);
-      uint8_t* vplane = frame->visible_data(media::VideoFrame::kVPlane) +
-                        (y / 2) * frame->stride(media::VideoFrame::kVPlane);
-      for (int x = rect.x(); x < rect.right(); ++x) {
-        if (yplane[x] != 0)
-          y_found = true;
-        if (uplane[x / 2])
-          u_found = true;
-        if (vplane[x / 2])
-          v_found = true;
-      }
-    }
-    return (y_found && u_found && v_found);
-  }
-
- protected:
-  wm::DefaultScreenPositionClient screen_position_client_;
-  std::unique_ptr<aura::Window> window_;
-  std::unique_ptr<CursorRendererAura> cursor_renderer_;
-
-  scoped_refptr<media::VideoFrame> dummy_frame_;
-};
-
-TEST_F(CursorRendererAuraTest, CursorAlwaysDisplayed) {
-  // Set up cursor renderer to always display cursor.
-  cursor_renderer_.reset(
-      new CursorRendererAura(CursorRenderer::CURSOR_DISPLAYED_ALWAYS));
-  cursor_renderer_->SetTargetView(window_.get());
-
-  // Cursor displayed at start.
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed after mouse movement.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor displayed after idle period.
-  SimulateMouseWentIdle();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor not displayed with mouse outside the window.
-  MoveMouseCursorOutsideWindow();
-  EXPECT_FALSE(CursorDisplayed());
-}
-
-TEST_F(CursorRendererAuraTest, CursorDuringMouseMovement) {
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed after mouse movement.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor not displayed after idle period.
-  SimulateMouseWentIdle();
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed with mouse movement following idle period.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor not displayed if mouse outside the window
-  MoveMouseCursorOutsideWindow();
-  EXPECT_FALSE(CursorDisplayed());
-}
-
-TEST_F(CursorRendererAuraTest, CursorOnActiveWindow) {
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed after mouse movement.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor not be displayed if a second window is activated.
-  std::unique_ptr<aura::Window> window2(aura::test::CreateTestWindowWithBounds(
-      gfx::Rect(0, 0, 800, 600), root_window()));
-  wm::ActivateWindow(window2.get());
-  MoveMouseCursorWithinWindow();
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor displayed if window activated again.
-  wm::ActivateWindow(window_.get());
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-}
-
-TEST_F(CursorRendererAuraTest, CursorRenderedOnFrame) {
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-
-  gfx::Size size(800, 600);
-  scoped_refptr<media::VideoFrame> frame =
-      media::VideoFrame::CreateZeroInitializedFrame(media::PIXEL_FORMAT_I420,
-                                                    size, gfx::Rect(size), size,
-                                                    base::TimeDelta());
-
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-
-  EXPECT_FALSE(NonZeroPixelsInRegion(frame, frame->visible_rect()));
-  CursorRendererUndoer undoer;
-  EXPECT_TRUE(RenderCursorOnVideoFrame(frame.get(), &undoer));
-  EXPECT_TRUE(NonZeroPixelsInRegion(frame, gfx::Rect(50, 50, 70, 70)));
-  undoer.Undo(frame.get());
-  EXPECT_FALSE(NonZeroPixelsInRegion(frame, frame->visible_rect()));
-}
-
-TEST_F(CursorRendererAuraTest, CursorRenderedOnRootWindow) {
-  cursor_renderer_->SetTargetView(root_window());
-
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-
-  // Cursor displayed after mouse movement.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-
-  // Cursor being displayed even if another window is activated.
-  std::unique_ptr<aura::Window> window2(aura::test::CreateTestWindowWithBounds(
-      gfx::Rect(0, 0, 800, 600), root_window()));
-  wm::ActivateWindow(window2.get());
-  EXPECT_TRUE(CursorDisplayed());
-}
-
-}  // namespace content
diff --git a/content/browser/media/capture/cursor_renderer_mac.h b/content/browser/media/capture/cursor_renderer_mac.h
deleted file mode 100644
index cdf77a0..0000000
--- a/content/browser/media/capture/cursor_renderer_mac.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_MAC_H_
-#define CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_MAC_H_
-
-#import <AppKit/AppKit.h>
-
-#include "base/mac/scoped_nsobject.h"
-#include "content/browser/media/capture/cursor_renderer.h"
-#import "ui/base/cocoa/tracking_area.h"
-
-@interface CursorRendererMouseTracker : NSObject {
- @private
-  ui::ScopedCrTrackingArea trackingArea_;
-
-  // The view on which mouse movement is detected.
-  base::scoped_nsobject<NSView> capturedView_;
-
-  // Runs on any mouse interaction from user.
-  base::RepeatingClosure mouseInteractionObserver_;
-}
-
-- (instancetype)initWithView:(NSView*)nsView;
-
-// Register an observer for mouse interaction.
-- (void)registerMouseInteractionObserver:
-    (const base::RepeatingClosure&)observer;
-
-@end
-
-namespace content {
-
-class CONTENT_EXPORT CursorRendererMac : public CursorRenderer {
- public:
-  explicit CursorRendererMac(CursorDisplaySetting cursor_display);
-  ~CursorRendererMac() final;
-
-  // CursorRenderer implementation.
-  void SetTargetView(gfx::NativeView window) final;
-  bool IsCapturedViewActive() final;
-  gfx::Size GetCapturedViewSize() final;
-  gfx::Point GetCursorPositionInView() final;
-  gfx::NativeCursor GetLastKnownCursor() final;
-  SkBitmap GetLastKnownCursorImage(gfx::Point* hot_point) final;
-
- private:
-  friend class CursorRendererMacTest;
-
-  // Called for mouse activity events.
-  void OnMouseEvent();
-
-  NSView* view_ = nil;
-
-  base::scoped_nsobject<CursorRendererMouseTracker> mouse_tracker_;
-
-  DISALLOW_COPY_AND_ASSIGN(CursorRendererMac);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_MEDIA_CAPTURE_CURSOR_RENDERER_MAC_H_
diff --git a/content/browser/media/capture/cursor_renderer_mac.mm b/content/browser/media/capture/cursor_renderer_mac.mm
deleted file mode 100644
index 800bef26..0000000
--- a/content/browser/media/capture/cursor_renderer_mac.mm
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/media/capture/cursor_renderer_mac.h"
-
-#include <Cocoa/Cocoa.h>
-#include <CoreFoundation/CoreFoundation.h>
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/mac/mac_util.h"
-#include "skia/ext/skia_utils_mac.h"
-#include "ui/gfx/image/image.h"
-
-@implementation CursorRendererMouseTracker
-
-- (instancetype)initWithView:(NSView*)nsView {
-  if ((self = [super init])) {
-    NSTrackingAreaOptions trackingOptions =
-        NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited |
-        NSTrackingActiveInKeyWindow | NSTrackingInVisibleRect;
-    trackingArea_.reset([[CrTrackingArea alloc] initWithRect:NSZeroRect
-                                                     options:trackingOptions
-                                                       owner:self
-                                                    userInfo:nil]);
-    [nsView addTrackingArea:trackingArea_.get()];
-    capturedView_.reset([nsView retain]);
-  }
-  return self;
-}
-
-- (void)stopTracking {
-  if (trackingArea_.get()) {
-    [capturedView_ removeTrackingArea:trackingArea_.get()];
-    trackingArea_.reset();
-    capturedView_.reset();
-  }
-}
-
-- (void)registerMouseInteractionObserver:
-    (const base::RepeatingClosure&)observer {
-  mouseInteractionObserver_ = observer;
-}
-
-- (void)mouseMoved:(NSEvent*)theEvent {
-  mouseInteractionObserver_.Run();
-}
-
-- (void)mouseEntered:(NSEvent*)theEvent {
-  mouseInteractionObserver_.Run();
-}
-
-- (void)mouseExited:(NSEvent*)theEvent {
-}
-
-@end
-
-namespace content {
-
-// static
-std::unique_ptr<CursorRenderer> CursorRenderer::Create(
-    CursorRenderer::CursorDisplaySetting display) {
-  return std::make_unique<CursorRendererMac>(display);
-}
-
-CursorRendererMac::CursorRendererMac(CursorDisplaySetting display)
-    : CursorRenderer(display) {}
-
-CursorRendererMac::~CursorRendererMac() {
-  SetTargetView(nil);
-}
-
-void CursorRendererMac::SetTargetView(NSView* view) {
-  if (view_) {
-    [mouse_tracker_ stopTracking];
-    mouse_tracker_.reset();
-  }
-  view_ = view;
-  OnMouseHasGoneIdle();
-  if (view_) {
-    mouse_tracker_.reset(
-        [[CursorRendererMouseTracker alloc] initWithView:view_]);
-    [mouse_tracker_
-        registerMouseInteractionObserver:base::BindRepeating(
-                                             &CursorRendererMac::OnMouseEvent,
-                                             base::Unretained(this))];
-  }
-}
-
-bool CursorRendererMac::IsCapturedViewActive() {
-  if (![[view_ window] isKeyWindow]) {
-    return false;
-  }
-  return true;
-}
-
-gfx::Size CursorRendererMac::GetCapturedViewSize() {
-  NSRect frame_rect = [view_ bounds];
-  return gfx::Size(frame_rect.size.width, frame_rect.size.height);
-}
-
-gfx::Point CursorRendererMac::GetCursorPositionInView() {
-  // Mouse location in window co-ordinates.
-  NSPoint mouse_window_location =
-      [view_ window].mouseLocationOutsideOfEventStream;
-  // Mouse location with respect to the view within the window.
-  NSPoint mouse_view_location =
-      [view_ convertPoint:mouse_window_location fromView:nil];
-
-  // Invert y coordinate to unify with Aura.
-  gfx::Point cursor_position_in_view(
-      mouse_view_location.x,
-      GetCapturedViewSize().height() - mouse_view_location.y);
-
-  return cursor_position_in_view;
-}
-
-gfx::NativeCursor CursorRendererMac::GetLastKnownCursor() {
-  // Grab system cursor.
-  return [NSCursor currentSystemCursor];
-}
-
-SkBitmap CursorRendererMac::GetLastKnownCursorImage(gfx::Point* hot_point) {
-  // Grab system cursor.
-  NSCursor* nscursor = [NSCursor currentSystemCursor];
-  NSImage* nsimage = [nscursor image];
-  NSPoint nshotspot = [nscursor hotSpot];
-
-  *hot_point = gfx::Point(nshotspot.x, nshotspot.y);
-  return skia::NSImageToSkBitmapWithColorSpace(
-      nsimage, /*is_opaque=*/false, base::mac::GetSystemColorSpace());
-}
-
-void CursorRendererMac::OnMouseEvent() {
-  // Update cursor movement info to CursorRenderer.
-  OnMouseMoved(GetCursorPositionInView());
-}
-
-}  // namespace content
diff --git a/content/browser/media/capture/cursor_renderer_mac_unittest.mm b/content/browser/media/capture/cursor_renderer_mac_unittest.mm
deleted file mode 100644
index 68f70d3..0000000
--- a/content/browser/media/capture/cursor_renderer_mac_unittest.mm
+++ /dev/null
@@ -1,227 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/media/capture/cursor_renderer_mac.h"
-
-#include <Cocoa/Cocoa.h>
-
-#include "base/mac/scoped_nsobject.h"
-#include "base/test/scoped_task_environment.h"
-#include "base/time/time.h"
-#include "media/base/video_frame.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/test/cocoa_helper.h"
-#include "ui/gfx/mac/coordinate_conversion.h"
-
-namespace content {
-
-const int kTestViewWidth = 320;
-const int kTestViewHeight = 240;
-
-CGEventRef myCGEventCallback(CGEventTapProxy proxy,
-                             CGEventType type,
-                             CGEventRef event,
-                             void* refcon) {
-  // Paranoid sanity check.
-  if (type != kCGEventMouseMoved)
-    return event;
-  // Discard mouse-moved event.
-  return NULL;
-}
-
-class CursorRendererMacTest : public ui::CocoaTest {
- public:
-  CursorRendererMacTest() {}
-  ~CursorRendererMacTest() override {}
-
-  void SetUp() override {
-    ui::CocoaTest::SetUp();
-    base::scoped_nsobject<NSView> view([[NSView alloc]
-        initWithFrame:NSMakeRect(0, 0, kTestViewWidth, kTestViewHeight)]);
-    view_ = view.get();
-    [[test_window() contentView] addSubview:view_];
-    cursor_renderer_.reset(new CursorRendererMac(
-        CursorRenderer::CURSOR_DISPLAYED_ON_MOUSE_MOVEMENT));
-    cursor_renderer_->SetTargetView(view_);
-    // Dis-associate mouse and cursor.
-    StartEventTap();
-    [test_window() setPretendIsKeyWindow:YES];
-  }
-
-  void TearDown() override {
-    StopEventTap();
-    cursor_renderer_.reset();
-    ui::CocoaTest::TearDown();
-  }
-
-  bool CursorDisplayed() {
-    // Request rendering into a dummy video frame. If RenderCursorOnVideoFrame()
-    // returns true, then the cursor is being displayed.
-    if (!dummy_frame_) {
-      constexpr gfx::Size dummy_frame_size = gfx::Size(320, 200);
-      dummy_frame_ = media::VideoFrame::CreateZeroInitializedFrame(
-          media::PIXEL_FORMAT_I420, dummy_frame_size,
-          gfx::Rect(dummy_frame_size), dummy_frame_size, base::TimeDelta());
-    }
-    return RenderCursorOnVideoFrame(dummy_frame_.get(), nullptr);
-  }
-
-  bool RenderCursorOnVideoFrame(media::VideoFrame* frame,
-                                CursorRendererUndoer* undoer) {
-    return cursor_renderer_->RenderOnVideoFrame(frame, frame->visible_rect(),
-                                                undoer);
-  }
-
-  bool IsUserInteractingWithView() {
-    return cursor_renderer_->IsUserInteractingWithView();
-  }
-
-  // Here the |point| is in Aura coordinates (the origin (0, 0) is at top-left
-  // of the view). To move the cursor to that point by Quartz Display service,
-  // it needs to be converted into Cocoa coordinates (the origin is at
-  // bottom-left of the main screen) first, and then info Quartz coordinates
-  // (the origin is at top-left of the main display).
-  void MoveMouseCursorWithinWindow() {
-    CGWarpMouseCursorPosition(
-        gfx::ScreenPointToNSPoint(gfx::Point(50, kTestViewHeight - 50)));
-    cursor_renderer_->OnMouseEvent();
-
-    CGWarpMouseCursorPosition(
-        gfx::ScreenPointToNSPoint(gfx::Point(100, kTestViewHeight - 100)));
-    cursor_renderer_->OnMouseEvent();
-  }
-
-  void MoveMouseCursorOutsideWindow() {
-    CGWarpMouseCursorPosition(CGPointMake(1000, 200));
-    cursor_renderer_->OnMouseEvent();
-  }
-
-  void SimulateMouseWentIdle() {
-    EXPECT_TRUE(cursor_renderer_->mouse_activity_ended_timer_.IsRunning());
-    cursor_renderer_->mouse_activity_ended_timer_.Stop();
-    cursor_renderer_->OnMouseHasGoneIdle();
-  }
-
-  // A very simple test of whether there are any non-zero pixels
-  // in the region |rect| within |frame|.
-  bool NonZeroPixelsInRegion(scoped_refptr<media::VideoFrame> frame,
-                             gfx::Rect rect) {
-    bool y_found = false, u_found = false, v_found = false;
-    for (int y = rect.y(); y < rect.bottom(); ++y) {
-      uint8_t* yplane = frame->visible_data(media::VideoFrame::kYPlane) +
-                        y * frame->stride(media::VideoFrame::kYPlane);
-      uint8_t* uplane = frame->visible_data(media::VideoFrame::kUPlane) +
-                        (y / 2) * frame->stride(media::VideoFrame::kUPlane);
-      uint8_t* vplane = frame->visible_data(media::VideoFrame::kVPlane) +
-                        (y / 2) * frame->stride(media::VideoFrame::kVPlane);
-      for (int x = rect.x(); x < rect.right(); ++x) {
-        if (yplane[x] != 0)
-          y_found = true;
-        if (uplane[x / 2])
-          u_found = true;
-        if (vplane[x / 2])
-          v_found = true;
-      }
-    }
-    return (y_found && u_found && v_found);
-  }
-
-  // The test cases here need to move the actual cursor. If the mouse moves the
-  // cursor at same time, the cursor position might be unexpected and test cases
-  // will fail. So dis-associate mouse and cursor by enabling event tap for
-  // mouse-moved event during tests runnning.
-  void StartEventTap() {
-    // Create an event tap. We are interested in mouse moved.
-    CGEventMask eventMask = 1 << kCGEventMouseMoved;
-    event_tap_ = CGEventTapCreate(kCGSessionEventTap, kCGHeadInsertEventTap,
-                                  kCGEventTapOptionDefault, eventMask,
-                                  myCGEventCallback, NULL);
-    if (event_tap_) {
-      // Enable the event tap.
-      CGEventTapEnable(event_tap_, true);
-    }
-  }
-
-  void StopEventTap() { CGEventTapEnable(event_tap_, false); }
-
- protected:
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-  NSView* view_;
-  std::unique_ptr<CursorRendererMac> cursor_renderer_;
-
-  CFMachPortRef event_tap_;
-
-  scoped_refptr<media::VideoFrame> dummy_frame_;
-};
-
-TEST_F(CursorRendererMacTest, CursorDuringMouseMovement) {
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed after mouse movement.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor not displayed after idle period.
-  SimulateMouseWentIdle();
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed with mouse movement following idle period.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor not displayed if mouse outside the window
-  MoveMouseCursorOutsideWindow();
-  EXPECT_FALSE(CursorDisplayed());
-}
-
-TEST_F(CursorRendererMacTest, CursorOnActiveWindow) {
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_FALSE(IsUserInteractingWithView());
-
-  // Cursor displayed after mouse movement.
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor not displayed if window is not activated.
-  [test_window() setPretendIsKeyWindow:NO];
-  MoveMouseCursorWithinWindow();
-  EXPECT_FALSE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-
-  // Cursor is displayed again if window is activated again.
-  [test_window() setPretendIsKeyWindow:YES];
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-  EXPECT_TRUE(IsUserInteractingWithView());
-}
-
-TEST_F(CursorRendererMacTest, CursorRenderedOnFrame) {
-  // Cursor not displayed at start.
-  EXPECT_FALSE(CursorDisplayed());
-
-  gfx::Size size(kTestViewWidth, kTestViewHeight);
-  scoped_refptr<media::VideoFrame> frame =
-      media::VideoFrame::CreateZeroInitializedFrame(media::PIXEL_FORMAT_I420,
-                                                    size, gfx::Rect(size), size,
-                                                    base::TimeDelta());
-
-  MoveMouseCursorWithinWindow();
-  EXPECT_TRUE(CursorDisplayed());
-
-  EXPECT_FALSE(NonZeroPixelsInRegion(frame, frame->visible_rect()));
-  CursorRendererUndoer undoer;
-  EXPECT_TRUE(RenderCursorOnVideoFrame(frame.get(), &undoer));
-  EXPECT_TRUE(NonZeroPixelsInRegion(frame, gfx::Rect(50, 50, 70, 70)));
-  undoer.Undo(frame.get());
-  EXPECT_FALSE(NonZeroPixelsInRegion(frame, frame->visible_rect()));
-}
-
-}  // namespace content
diff --git a/content/browser/media/capture/desktop_streams_registry_impl.cc b/content/browser/media/capture/desktop_streams_registry_impl.cc
index d3b72fc..347e00a 100644
--- a/content/browser/media/capture/desktop_streams_registry_impl.cc
+++ b/content/browser/media/capture/desktop_streams_registry_impl.cc
@@ -50,7 +50,8 @@
     int render_frame_id,
     const GURL& origin,
     const DesktopMediaID& source,
-    const std::string& extension_name) {
+    const std::string& extension_name,
+    const DesktopStreamRegistryType type) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   std::string id = GenerateRandomStreamId();
@@ -61,6 +62,7 @@
   stream.origin = origin;
   stream.source = source;
   stream.extension_name = extension_name;
+  stream.type = type;
 
   BrowserThread::PostDelayedTask(
       BrowserThread::UI, FROM_HERE,
@@ -76,7 +78,8 @@
     int render_process_id,
     int render_frame_id,
     const GURL& origin,
-    std::string* extension_name) {
+    std::string* extension_name,
+    const DesktopStreamRegistryType type) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   StreamsMap::iterator it = approved_streams_.find(id);
@@ -86,7 +89,7 @@
   if (it == approved_streams_.end() ||
       render_process_id != it->second.render_process_id ||
       render_frame_id != it->second.render_frame_id ||
-      origin != it->second.origin) {
+      origin != it->second.origin || type != it->second.type) {
     return DesktopMediaID();
   }
 
diff --git a/content/browser/media/capture/desktop_streams_registry_impl.h b/content/browser/media/capture/desktop_streams_registry_impl.h
index 993555a..baa45e15 100644
--- a/content/browser/media/capture/desktop_streams_registry_impl.h
+++ b/content/browser/media/capture/desktop_streams_registry_impl.h
@@ -28,13 +28,16 @@
                              int render_frame_id,
                              const GURL& origin,
                              const DesktopMediaID& source,
-                             const std::string& extension_name) override;
+                             const std::string& extension_name,
+                             const DesktopStreamRegistryType type) override;
 
-  DesktopMediaID RequestMediaForStreamId(const std::string& id,
-                                         int render_process_id,
-                                         int render_frame_id,
-                                         const GURL& origin,
-                                         std::string* extension_name) override;
+  DesktopMediaID RequestMediaForStreamId(
+      const std::string& id,
+      int render_process_id,
+      int render_frame_id,
+      const GURL& origin,
+      std::string* extension_name,
+      const DesktopStreamRegistryType type) override;
 
  private:
   // Type used to store list of accepted desktop media streams.
@@ -46,6 +49,7 @@
     GURL origin;
     DesktopMediaID source;
     std::string extension_name;
+    DesktopStreamRegistryType type;
   };
   typedef std::map<std::string, ApprovedDesktopMediaStream> StreamsMap;
 
diff --git a/content/browser/media/cdm_file_impl.cc b/content/browser/media/cdm_file_impl.cc
index 1abd871f..7a0b8ba 100644
--- a/content/browser/media/cdm_file_impl.cc
+++ b/content/browser/media/cdm_file_impl.cc
@@ -10,7 +10,7 @@
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "storage/browser/fileapi/file_system_context.h"
 #include "storage/browser/fileapi/file_system_operation_context.h"
 #include "storage/browser/fileapi/file_system_url.h"
diff --git a/content/browser/media/forwarding_audio_stream_factory.cc b/content/browser/media/forwarding_audio_stream_factory.cc
index 694f8bfe..9ff4814 100644
--- a/content/browser/media/forwarding_audio_stream_factory.cc
+++ b/content/browser/media/forwarding_audio_stream_factory.cc
@@ -13,11 +13,49 @@
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/web_contents.h"
+#include "media/audio/audio_device_description.h"
+#include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/audio/public/mojom/constants.mojom.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace content {
 
+namespace {
+
+// A mojom::RendererAudioInputStreamFactoryClient that holds a
+// AudioLoopbackStreamCreator::StreamCreatedCallback. The callback runs when the
+// requested audio stream is created.
+class StreamCreatedCallbackAdapter final
+    : public mojom::RendererAudioInputStreamFactoryClient {
+ public:
+  explicit StreamCreatedCallbackAdapter(
+      const AudioLoopbackStreamCreator::StreamCreatedCallback& callback)
+      : callback_(callback) {
+    DCHECK(callback_);
+  }
+
+  ~StreamCreatedCallbackAdapter() override {}
+
+  // mojom::RendererAudioInputStreamFactoryClient implementation.
+  void StreamCreated(
+      media::mojom::AudioInputStreamPtr stream,
+      media::mojom::AudioInputStreamClientRequest client_request,
+      media::mojom::ReadOnlyAudioDataPipePtr data_pipe,
+      bool initially_muted,
+      const base::Optional<base::UnguessableToken>& stream_id) override {
+    DCHECK(!initially_muted);  // Loopback streams shouldn't be started muted.
+    callback_.Run(std::move(stream), std::move(client_request),
+                  std::move(data_pipe));
+  }
+
+ private:
+  const AudioLoopbackStreamCreator::StreamCreatedCallback callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(StreamCreatedCallbackAdapter);
+};
+
+}  // namespace
+
 ForwardingAudioStreamFactory::ForwardingAudioStreamFactory(
     WebContents* web_contents,
     std::unique_ptr<service_manager::Connector> connector,
@@ -27,7 +65,6 @@
       broker_factory_(std::move(broker_factory)),
       group_id_(base::UnguessableToken::Create()) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(web_contents);
   DCHECK(broker_factory_);
 }
 
@@ -57,8 +94,8 @@
     mojom::RendererAudioInputStreamFactoryClientPtr renderer_factory_client) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  const int process_id = frame->GetProcess()->GetID();
-  const int frame_id = frame->GetRoutingID();
+  const int process_id = frame ? frame->GetProcess()->GetID() : -1;
+  const int frame_id = frame ? frame->GetRoutingID() : -1;
   inputs_
       .insert(broker_factory_->CreateAudioInputStreamBroker(
           process_id, frame_id, device_id, params, shared_memory_count,
@@ -111,7 +148,6 @@
     bool mute_source,
     mojom::RendererAudioInputStreamFactoryClientPtr renderer_factory_client) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  DCHECK(frame);
   DCHECK(frame_of_source_web_contents);
 
   TRACE_EVENT_BEGIN1("audio", "CreateLoopbackStream", "group",
@@ -125,8 +161,8 @@
     return;
   }
 
-  const int process_id = frame->GetProcess()->GetID();
-  const int frame_id = frame->GetRoutingID();
+  const int process_id = frame ? frame->GetProcess()->GetID() : -1;
+  const int frame_id = frame ? frame->GetRoutingID() : -1;
   inputs_
       .insert(broker_factory_->CreateAudioLoopbackStreamBroker(
           process_id, frame_id,
@@ -145,6 +181,28 @@
                        .GetLowForSerialization());
 }
 
+void ForwardingAudioStreamFactory::CreateInProcessLoopbackStream(
+    RenderFrameHost* frame_of_source_web_contents,
+    const media::AudioParameters& params,
+    uint32_t shared_memory_count,
+    const AudioLoopbackStreamCreator::StreamCreatedCallback& callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  mojom::RendererAudioInputStreamFactoryClientPtr client;
+  mojo::MakeStrongBinding(
+      std::make_unique<StreamCreatedCallbackAdapter>(callback),
+      mojo::MakeRequest(&client));
+  if (frame_of_source_web_contents) {
+    CreateLoopbackStream(nullptr, frame_of_source_web_contents, params,
+                         shared_memory_count, true /* mute_source */,
+                         std::move(client));
+  } else {
+    // A null |frame_of_source_web_contents| requests system-wide loopback.
+    CreateInputStream(
+        nullptr, media::AudioDeviceDescription::kLoopbackWithMuteDeviceId,
+        params, shared_memory_count, false /* enable_agc*/, std::move(client));
+  }
+}
+
 void ForwardingAudioStreamFactory::SetMuted(bool muted) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK_NE(muted, IsMuted());
@@ -176,8 +234,10 @@
     RenderFrameHost* render_frame_host) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  const int process_id = render_frame_host->GetProcess()->GetID();
-  const int frame_id = render_frame_host->GetRoutingID();
+  const int process_id =
+      render_frame_host ? render_frame_host->GetProcess()->GetID() : -1;
+  const int frame_id =
+      render_frame_host ? render_frame_host->GetRoutingID() : -1;
 
   TRACE_EVENT_BEGIN2("audio", "CleanupStreamsBelongingTo", "group",
                      group_id_.GetLowForSerialization(), "process id",
diff --git a/content/browser/media/forwarding_audio_stream_factory.h b/content/browser/media/forwarding_audio_stream_factory.h
index 26ffbb8..3c69b88e 100644
--- a/content/browser/media/forwarding_audio_stream_factory.h
+++ b/content/browser/media/forwarding_audio_stream_factory.h
@@ -17,6 +17,7 @@
 #include "content/browser/media/audio_stream_broker.h"
 #include "content/common/content_export.h"
 #include "content/common/media/renderer_audio_input_stream_factory.mojom.h"
+#include "content/public/browser/audio_loopback_stream_creator.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "services/audio/public/mojom/stream_factory.mojom.h"
 
@@ -39,6 +40,8 @@
 class CONTENT_EXPORT ForwardingAudioStreamFactory final
     : public WebContentsObserver {
  public:
+  // |web_contents| is null in the browser-privileged access case, i.e., when
+  // the streams created with this factory will not be consumed by a renderer.
   ForwardingAudioStreamFactory(
       WebContents* web_contents,
       std::unique_ptr<service_manager::Connector> connector,
@@ -81,6 +84,15 @@
       bool mute_source,
       mojom::RendererAudioInputStreamFactoryClientPtr renderer_factory_client);
 
+  // Creates a loopback stream that captures the audio from
+  // |frame_of_source_web_contents|, or the default system playback if the
+  // source is not provided. The source/system audio is muted during capturing.
+  void CreateInProcessLoopbackStream(
+      RenderFrameHost* frame_of_source_web_contents,
+      const media::AudioParameters& params,
+      uint32_t shared_memory_count,
+      const AudioLoopbackStreamCreator::StreamCreatedCallback& callback);
+
   // Sets the muting state for all output streams created through this factory.
   void SetMuted(bool muted);
 
diff --git a/content/browser/media/in_process_audio_loopback_stream_creator.cc b/content/browser/media/in_process_audio_loopback_stream_creator.cc
new file mode 100644
index 0000000..618c9b8
--- /dev/null
+++ b/content/browser/media/in_process_audio_loopback_stream_creator.cc
@@ -0,0 +1,44 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/media/in_process_audio_loopback_stream_creator.h"
+
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/common/service_manager_connection.h"
+#include "services/service_manager/public/cpp/connector.h"
+
+namespace content {
+
+InProcessAudioLoopbackStreamCreator::InProcessAudioLoopbackStreamCreator()
+    : factory_(nullptr,
+               content::ServiceManagerConnection::GetForProcess()
+                   ->GetConnector()
+                   ->Clone(),
+               AudioStreamBrokerFactory::CreateImpl()) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+}
+
+InProcessAudioLoopbackStreamCreator::~InProcessAudioLoopbackStreamCreator() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  factory_.FrameDeleted(nullptr);
+}
+
+void InProcessAudioLoopbackStreamCreator::CreateLoopbackStream(
+    WebContents* loopback_source,
+    const media::AudioParameters& params,
+    uint32_t total_segments,
+    const StreamCreatedCallback& callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  RenderFrameHost* loopback_source_frame = nullptr;
+  if (loopback_source) {
+    loopback_source_frame = loopback_source->GetMainFrame();
+    DCHECK(loopback_source_frame);
+  }
+  factory_.CreateInProcessLoopbackStream(loopback_source_frame, params,
+                                         total_segments, callback);
+}
+
+}  // namespace content
diff --git a/content/browser/media/in_process_audio_loopback_stream_creator.h b/content/browser/media/in_process_audio_loopback_stream_creator.h
new file mode 100644
index 0000000..09b9c05
--- /dev/null
+++ b/content/browser/media/in_process_audio_loopback_stream_creator.h
@@ -0,0 +1,41 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_MEDIA_IN_PROCESS_AUDIO_LOOPBACK_STREAM_CREATOR_H_
+#define CONTENT_BROWSER_MEDIA_IN_PROCESS_AUDIO_LOOPBACK_STREAM_CREATOR_H_
+
+#include "base/macros.h"
+#include "content/browser/media/forwarding_audio_stream_factory.h"
+#include "content/public/browser/audio_loopback_stream_creator.h"
+
+namespace media {
+class AudioParameters;
+}
+
+namespace content {
+
+// This class handles creating a loopback stream that either captures audio from
+// a WebContents or the system-wide loopback through the Audio Service.
+// This class is operated on the UI thread.
+class CONTENT_EXPORT InProcessAudioLoopbackStreamCreator final
+    : public AudioLoopbackStreamCreator {
+ public:
+  InProcessAudioLoopbackStreamCreator();
+  ~InProcessAudioLoopbackStreamCreator() override;
+
+ private:
+  // AudioLoopbackStreamCreator implementation.
+  void CreateLoopbackStream(WebContents* loopback_source,
+                            const media::AudioParameters& params,
+                            uint32_t total_segments,
+                            const StreamCreatedCallback& callback) override;
+
+  ForwardingAudioStreamFactory factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(InProcessAudioLoopbackStreamCreator);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_BROWSER_MEDIA_IN_PROCESS_AUDIO_LOOPBACK_STREAM_CREATOR_H_
diff --git a/content/browser/media/media_source_browsertest.cc b/content/browser/media/media_source_browsertest.cc
index a7d782ba..c03bf22 100644
--- a/content/browser/media/media_source_browsertest.cc
+++ b/content/browser/media/media_source_browsertest.cc
@@ -28,10 +28,7 @@
 
 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
 const char kMp4AudioOnly[] = "audio/mp4; codecs=\"mp4a.40.2\"'";
-
-#if !defined(OS_ANDROID)
 const char kMp4VideoOnly[] = "video/mp4; codecs=\"avc1.4D4041\"'";
-#endif  // !defined(OS_ANDROID)
 
 #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER)
 const char kMp2tAudioVideo[] = "video/mp2t; codecs=\"mp4a.40.2, avc1.42E01E\"";
@@ -105,9 +102,6 @@
 }
 
 #if BUILDFLAG(USE_PROPRIETARY_CODECS)
-
-// TODO(chcunningham): Figure out why this is flaky on android. crbug/607841
-#if !defined(OS_ANDROID)
 IN_PROC_BROWSER_TEST_F(MediaSourceTest, Playback_Video_MP4_Audio_WEBM) {
   base::StringPairs query_params;
   query_params.push_back(
@@ -119,7 +113,6 @@
   RunMediaTestPage("mse_different_containers.html", query_params, media::kEnded,
                    true);
 }
-#endif  // !defined(OS_ANDROID)
 
 IN_PROC_BROWSER_TEST_F(MediaSourceTest, Playback_Video_WEBM_Audio_MP4) {
   base::StringPairs query_params;
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc
index a66c5d02..88807f3 100644
--- a/content/browser/media/session/media_session_impl.cc
+++ b/content/browser/media/session/media_session_impl.cc
@@ -77,8 +77,6 @@
 using MediaSessionSuspendedSource =
     MediaSessionUmaHelper::MediaSessionSuspendedSource;
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(MediaSessionImpl);
-
 MediaSessionImpl::PlayerIdentifier::PlayerIdentifier(
     MediaSessionPlayerObserver* observer,
     int player_id)
diff --git a/content/browser/net/quota_policy_cookie_store.cc b/content/browser/net/quota_policy_cookie_store.cc
index e97a124..d308c05 100644
--- a/content/browser/net/quota_policy_cookie_store.cc
+++ b/content/browser/net/quota_policy_cookie_store.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/cookie_store_factory.h"
 #include "net/cookies/canonical_cookie.h"
diff --git a/content/browser/net/quota_policy_cookie_store_unittest.cc b/content/browser/net/quota_policy_cookie_store_unittest.cc
index 35c4549..b4ba8759 100644
--- a/content/browser/net/quota_policy_cookie_store_unittest.cc
+++ b/content/browser/net/quota_policy_cookie_store_unittest.cc
@@ -10,8 +10,8 @@
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/time/time.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "net/cookies/cookie_util.h"
diff --git a/content/browser/network_service_client.cc b/content/browser/network_service_client.cc
index 06fad00..2716025 100644
--- a/content/browser/network_service_client.cc
+++ b/content/browser/network_service_client.cc
@@ -5,7 +5,7 @@
 #include "content/browser/network_service_client.h"
 
 #include "base/optional.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/devtools/devtools_url_loader_interceptor.h"
 #include "content/browser/loader/resource_dispatcher_host_impl.h"
 #include "content/browser/ssl/ssl_client_auth_handler.h"
diff --git a/content/browser/network_service_instance.cc b/content/browser/network_service_instance.cc
index 374ac6da..45ec9ffc 100644
--- a/content/browser/network_service_instance.cc
+++ b/content/browser/network_service_instance.cc
@@ -10,8 +10,10 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/common/service_manager_connection.h"
 #include "content/public/common/service_names.mojom.h"
+#include "net/log/net_log_util.h"
 #include "services/network/network_service.h"
 #include "services/network/public/cpp/features.h"
+#include "services/network/public/cpp/network_switches.h"
 #include "services/service_manager/public/cpp/connector.h"
 
 namespace content {
@@ -59,6 +61,25 @@
     g_client = new NetworkServiceClient(mojo::MakeRequest(&client_ptr));
     (*g_network_service_ptr)->SetClient(std::move(client_ptr));
 
+    if (base::FeatureList::IsEnabled(network::features::kNetworkService)) {
+      const base::CommandLine* command_line =
+          base::CommandLine::ForCurrentProcess();
+      if (command_line->HasSwitch(network::switches::kLogNetLog)) {
+        base::FilePath log_path =
+            command_line->GetSwitchValuePath(network::switches::kLogNetLog);
+
+        base::DictionaryValue client_constants =
+            GetContentClient()->GetNetLogConstants();
+
+        base::File file(
+            log_path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+        LOG_IF(ERROR, !file.IsValid())
+            << "Failed opening: " << log_path.value();
+        (*g_network_service_ptr)
+            ->StartNetLog(std::move(file), std::move(client_constants));
+      }
+    }
+
     GetContentClient()->browser()->OnNetworkServiceCreated(
         g_network_service_ptr->get());
   }
diff --git a/content/browser/notifications/OWNERS b/content/browser/notifications/OWNERS
index c172d4b..0d5ed95 100644
--- a/content/browser/notifications/OWNERS
+++ b/content/browser/notifications/OWNERS
@@ -4,7 +4,6 @@
 # //content/renderer/notifications/
 # //content/test/mock_platform_notification_service.*
 
-awdf@chromium.org
 mkwst@chromium.org
 peter@chromium.org
 
diff --git a/content/browser/notifications/platform_notification_context_impl.cc b/content/browser/notifications/platform_notification_context_impl.cc
index 9439e3e..13ece81 100644
--- a/content/browser/notifications/platform_notification_context_impl.cc
+++ b/content/browser/notifications/platform_notification_context_impl.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/notifications/blink_notification_service_impl.h"
 #include "content/browser/notifications/notification_database.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
diff --git a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
index 4332ca93d..b97d2ad 100644
--- a/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
+++ b/content/browser/picture_in_picture/picture_in_picture_window_controller_impl.cc
@@ -16,8 +16,6 @@
 
 namespace content {
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(PictureInPictureWindowControllerImpl);
-
 // static
 PictureInPictureWindowController*
 PictureInPictureWindowController::GetOrCreateForWebContents(
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index f0fdd90..b822ba7 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
diff --git a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
index 6c7089d7..1302730 100644
--- a/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
+++ b/content/browser/renderer_host/dwrite_font_proxy_message_filter_win.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "mojo/public/cpp/bindings/callback_helpers.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "ui/gfx/win/direct_write.h"
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
index 2deae14..5b7eb72 100644
--- a/content/browser/renderer_host/media/media_stream_manager.cc
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
@@ -1175,7 +1175,7 @@
   // Resolve DesktopMediaID for the specified device id.
   return DesktopStreamsRegistry::GetInstance()->RequestMediaForStreamId(
       capture_device_id, requesting_process_id, requesting_frame_id, origin,
-      nullptr);
+      nullptr, kRegistryStreamTypeTab);
 }
 
 void MediaStreamManager::FinishTabCaptureRequestSetupWithDeviceId(
diff --git a/content/browser/renderer_host/p2p/DEPS b/content/browser/renderer_host/p2p/DEPS
deleted file mode 100644
index 93e27aa..0000000
--- a/content/browser/renderer_host/p2p/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+jingle/glue",
-]
diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
index 741c5fe..ce859120 100644
--- a/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
+++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.cc
@@ -9,23 +9,10 @@
 #include <algorithm>
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
 #include "content/browser/bad_message.h"
-#include "content/browser/renderer_host/p2p/socket_host.h"
-#include "net/base/address_list.h"
-#include "net/base/completion_callback.h"
+#include "content/browser/renderer_host/render_process_host_impl.h"
+#include "content/browser/storage_partition_impl.h"
 #include "net/base/net_errors.h"
-#include "net/base/network_interfaces.h"
-#include "net/base/sys_addrinfo.h"
-#include "net/dns/host_resolver.h"
-#include "net/log/net_log_source.h"
-#include "net/log/net_log_with_source.h"
-#include "net/socket/client_socket_factory.h"
-#include "net/socket/datagram_client_socket.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "services/network/proxy_resolving_client_socket_factory.h"
 #include "services/network/public/cpp/p2p_param_traits.h"
 
 using content::BrowserMessageFilter;
@@ -33,115 +20,18 @@
 
 namespace content {
 
-namespace {
-
-// Used by GetDefaultLocalAddress as the target to connect to for getting the
-// default local address. They are public DNS servers on the internet.
-const uint8_t kPublicIPv4Host[] = {8, 8, 8, 8};
-const uint8_t kPublicIPv6Host[] = {
-    0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88};
-const int kPublicPort = 53;  // DNS port.
-
-// Experimentation shows that creating too many sockets creates odd problems
-// because of resource exhaustion in the Unix sockets domain.
-// Trouble has been seen on Linux at 3479 sockets in test, so leave a margin.
-const int kMaxSimultaneousSockets = 3000;
-
-}  // namespace
-
-class P2PSocketDispatcherHost::DnsRequest {
- public:
-  typedef base::Callback<void(const net::IPAddressList&)> DoneCallback;
-
-  explicit DnsRequest(net::HostResolver* host_resolver)
-      : resolver_(host_resolver) {}
-
-  void Resolve(const std::string& host_name,
-               const DoneCallback& done_callback) {
-    DCHECK(!done_callback.is_null());
-
-    host_name_ = host_name;
-    done_callback_ = done_callback;
-
-    // Return an error if it's an empty string.
-    if (host_name_.empty()) {
-      net::IPAddressList address_list;
-      done_callback_.Run(address_list);
-      return;
-    }
-
-    // Add period at the end to make sure that we only resolve
-    // fully-qualified names.
-    if (host_name_.back() != '.')
-      host_name_ += '.';
-
-    net::HostResolver::RequestInfo info(net::HostPortPair(host_name_, 0));
-    int result = resolver_->Resolve(
-        info, net::DEFAULT_PRIORITY, &addresses_,
-        base::BindOnce(&P2PSocketDispatcherHost::DnsRequest::OnDone,
-                       base::Unretained(this)),
-        &request_, net::NetLogWithSource());
-    if (result != net::ERR_IO_PENDING)
-      OnDone(result);
-  }
-
- private:
-  void OnDone(int result) {
-    net::IPAddressList list;
-    if (result != net::OK) {
-      LOG(ERROR) << "Failed to resolve address for " << host_name_
-                 << ", errorcode: " << result;
-      done_callback_.Run(list);
-      return;
-    }
-
-    DCHECK(!addresses_.empty());
-    for (net::AddressList::iterator iter = addresses_.begin();
-         iter != addresses_.end(); ++iter) {
-      list.push_back(iter->address());
-    }
-    done_callback_.Run(list);
-  }
-
-  net::AddressList addresses_;
-
-  std::string host_name_;
-  net::HostResolver* resolver_;
-  std::unique_ptr<net::HostResolver::Request> request_;
-
-  DoneCallback done_callback_;
-};
-
-P2PSocketDispatcherHost::P2PSocketDispatcherHost(
-    int render_process_id,
-    net::URLRequestContextGetter* url_context)
+P2PSocketDispatcherHost::P2PSocketDispatcherHost(int render_process_id)
     : render_process_id_(render_process_id),
-      url_context_(url_context),
-      dump_incoming_rtp_packet_(false),
-      dump_outgoing_rtp_packet_(false),
-      network_list_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          {base::MayBlock(), base::TaskPriority::USER_VISIBLE})),
-      binding_(this) {}
+      binding_(this),
+      weak_factory_(this) {}
 
-void P2PSocketDispatcherHost::OnNetworkChanged(
-    net::NetworkChangeNotifier::ConnectionType type) {
-  // NetworkChangeNotifier always emits CONNECTION_NONE notification whenever
-  // network configuration changes. All other notifications can be ignored.
-  if (type != net::NetworkChangeNotifier::CONNECTION_NONE)
-    return;
-
-  // Notify the renderer about changes to list of network interfaces.
-  network_list_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&P2PSocketDispatcherHost::DoGetNetworkList, this));
-}
+P2PSocketDispatcherHost::~P2PSocketDispatcherHost() {}
 
 void P2PSocketDispatcherHost::StartRtpDump(
     bool incoming,
     bool outgoing,
     const RenderProcessHost::WebRtcRtpPacketCallback& packet_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if ((!dump_incoming_rtp_packet_ && incoming) ||
       (!dump_outgoing_rtp_packet_ && outgoing)) {
     if (incoming)
@@ -151,189 +41,13 @@
       dump_outgoing_rtp_packet_ = true;
 
     packet_callback_ = packet_callback;
-    for (auto& it : sockets_)
-      it.first->StartRtpDump(incoming, outgoing, packet_callback);
+    if (trusted_socket_manager_)
+      trusted_socket_manager_->StartRtpDump(incoming, outgoing);
   }
 }
 
-void P2PSocketDispatcherHost::StopRtpDumpOnUIThread(bool incoming,
-                                                    bool outgoing) {
+void P2PSocketDispatcherHost::StopRtpDump(bool incoming, bool outgoing) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::BindOnce(&P2PSocketDispatcherHost::StopRtpDumpOnIOThread, this,
-                     incoming, outgoing));
-}
-
-void P2PSocketDispatcherHost::BindRequest(
-    network::mojom::P2PSocketManagerRequest request) {
-  DCHECK(!binding_.is_bound());
-  binding_.Bind(std::move(request));
-}
-
-void P2PSocketDispatcherHost::AddAcceptedConnection(
-    std::unique_ptr<P2PSocketHost> accepted_connection) {
-  sockets_[accepted_connection.get()] = std::move(accepted_connection);
-}
-
-void P2PSocketDispatcherHost::SocketDestroyed(P2PSocketHost* socket) {
-  auto iter = sockets_.find(socket);
-  if (iter == sockets_.end())
-    return;  // This condition is reached in this class's destructor.
-
-  iter->second.release();
-  sockets_.erase(iter);
-}
-
-P2PSocketDispatcherHost::~P2PSocketDispatcherHost() {
-  // Make local copy so that SocketDestroyed doesn't try to delete again.
-  auto sockets = std::move(sockets_);
-  sockets.clear();
-  dns_requests_.clear();
-
-  if (network_notification_client_)
-    net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
-
-  proxy_resolving_socket_factory_.reset();
-}
-
-void P2PSocketDispatcherHost::DoGetNetworkList() {
-  net::NetworkInterfaceList list;
-  if (!net::GetNetworkList(&list, net::EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) {
-    LOG(ERROR) << "GetNetworkList failed.";
-    return;
-  }
-  default_ipv4_local_address_ = GetDefaultLocalAddress(AF_INET);
-  default_ipv6_local_address_ = GetDefaultLocalAddress(AF_INET6);
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::BindOnce(&P2PSocketDispatcherHost::SendNetworkList, this, list,
-                     default_ipv4_local_address_, default_ipv6_local_address_));
-}
-
-void P2PSocketDispatcherHost::SendNetworkList(
-    const net::NetworkInterfaceList& list,
-    const net::IPAddress& default_ipv4_local_address,
-    const net::IPAddress& default_ipv6_local_address) {
-  network_notification_client_->NetworkListChanged(
-      list, default_ipv4_local_address, default_ipv6_local_address);
-}
-
-void P2PSocketDispatcherHost::StartNetworkNotifications(
-    network::mojom::P2PNetworkNotificationClientPtr client) {
-  DCHECK(!network_notification_client_);
-  network_notification_client_ = std::move(client);
-  network_notification_client_.set_connection_error_handler(base::BindOnce(
-      &P2PSocketDispatcherHost::NetworkNotificationClientConnectionError,
-      base::Unretained(this)));
-
-  net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
-
-  network_list_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&P2PSocketDispatcherHost::DoGetNetworkList, this));
-}
-
-void P2PSocketDispatcherHost::GetHostAddress(
-    const std::string& host_name,
-    network::mojom::P2PSocketManager::GetHostAddressCallback callback) {
-  std::unique_ptr<DnsRequest> request = std::make_unique<DnsRequest>(
-      url_context_->GetURLRequestContext()->host_resolver());
-  DnsRequest* request_ptr = request.get();
-  dns_requests_.insert(std::move(request));
-  request_ptr->Resolve(
-      host_name,
-      base::Bind(&P2PSocketDispatcherHost::OnAddressResolved,
-                 base::Unretained(this), request_ptr, base::Passed(&callback)));
-}
-
-void P2PSocketDispatcherHost::CreateSocket(
-    network::P2PSocketType type,
-    const net::IPEndPoint& local_address,
-    const network::P2PPortRange& port_range,
-    const network::P2PHostAndIPEndPoint& remote_address,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest request) {
-  if (port_range.min_port > port_range.max_port ||
-      (port_range.min_port == 0 && port_range.max_port != 0)) {
-    bad_message::ReceivedBadMessage(render_process_id_,
-                                    bad_message::SDH_INVALID_PORT_RANGE);
-    return;
-  }
-
-  if (!proxy_resolving_socket_factory_) {
-    proxy_resolving_socket_factory_ =
-        std::make_unique<network::ProxyResolvingClientSocketFactory>(
-            url_context_->GetURLRequestContext());
-  }
-  if (sockets_.size() > kMaxSimultaneousSockets) {
-    LOG(ERROR) << "Too many sockets created";
-    return;
-  }
-  std::unique_ptr<P2PSocketHost> socket(P2PSocketHost::Create(
-      this, std::move(client), std::move(request), type, url_context_.get(),
-      proxy_resolving_socket_factory_.get(), &throttler_));
-
-  if (!socket)
-    return;
-
-  if (socket->Init(local_address, port_range.min_port, port_range.max_port,
-                   remote_address)) {
-    if (dump_incoming_rtp_packet_ || dump_outgoing_rtp_packet_) {
-      socket->StartRtpDump(dump_incoming_rtp_packet_, dump_outgoing_rtp_packet_,
-                           packet_callback_);
-    }
-    sockets_[socket.get()] = std::move(socket);
-  }
-}
-
-void P2PSocketDispatcherHost::NetworkNotificationClientConnectionError() {
-  net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
-}
-
-net::IPAddress P2PSocketDispatcherHost::GetDefaultLocalAddress(int family) {
-  DCHECK(family == AF_INET || family == AF_INET6);
-
-  // Creation and connection of a UDP socket might be janky.
-  DCHECK(network_list_task_runner_->RunsTasksInCurrentSequence());
-
-  auto socket =
-      net::ClientSocketFactory::GetDefaultFactory()->CreateDatagramClientSocket(
-          net::DatagramSocket::DEFAULT_BIND, nullptr, net::NetLogSource());
-
-  net::IPAddress ip_address;
-  if (family == AF_INET) {
-    ip_address = net::IPAddress(kPublicIPv4Host);
-  } else {
-    ip_address = net::IPAddress(kPublicIPv6Host);
-  }
-
-  if (socket->Connect(net::IPEndPoint(ip_address, kPublicPort)) != net::OK) {
-    return net::IPAddress();
-  }
-
-  net::IPEndPoint local_address;
-  if (socket->GetLocalAddress(&local_address) != net::OK)
-    return net::IPAddress();
-
-  return local_address.address();
-}
-
-void P2PSocketDispatcherHost::OnAddressResolved(
-    DnsRequest* request,
-    network::mojom::P2PSocketManager::GetHostAddressCallback callback,
-    const net::IPAddressList& addresses) {
-  std::move(callback).Run(addresses);
-
-  dns_requests_.erase(
-      std::find_if(dns_requests_.begin(), dns_requests_.end(),
-                   [request](const std::unique_ptr<DnsRequest>& ptr) {
-                     return ptr.get() == request;
-                   }));
-}
-
-void P2PSocketDispatcherHost::StopRtpDumpOnIOThread(bool incoming,
-                                                    bool outgoing) {
   if ((dump_incoming_rtp_packet_ && incoming) ||
       (dump_outgoing_rtp_packet_ && outgoing)) {
     if (incoming)
@@ -345,9 +59,52 @@
     if (!dump_incoming_rtp_packet_ && !dump_outgoing_rtp_packet_)
       packet_callback_.Reset();
 
-    for (auto& it : sockets_)
-      it.first->StopRtpDump(incoming, outgoing);
+    if (trusted_socket_manager_)
+      trusted_socket_manager_->StopRtpDump(incoming, outgoing);
   }
 }
 
+void P2PSocketDispatcherHost::BindRequest(
+    network::mojom::P2PSocketManagerRequest request) {
+  auto* rph = RenderProcessHostImpl::FromID(render_process_id_);
+  if (!rph)
+    return;
+
+  network::mojom::P2PTrustedSocketManagerClientPtr
+      trusted_socket_manager_client;
+  binding_.Bind(mojo::MakeRequest(&trusted_socket_manager_client));
+
+  rph->GetStoragePartition()->GetNetworkContext()->CreateP2PSocketManager(
+      std::move(trusted_socket_manager_client),
+      mojo::MakeRequest(&trusted_socket_manager_), std::move(request));
+  if (dump_incoming_rtp_packet_ || dump_outgoing_rtp_packet_) {
+    trusted_socket_manager_->StartRtpDump(dump_incoming_rtp_packet_,
+                                          dump_outgoing_rtp_packet_);
+  }
+}
+
+base::WeakPtr<P2PSocketDispatcherHost> P2PSocketDispatcherHost::GetWeakPtr() {
+  return weak_factory_.GetWeakPtr();
+}
+
+void P2PSocketDispatcherHost::InvalidSocketPortRangeRequested() {
+  bad_message::ReceivedBadMessage(render_process_id_,
+                                  bad_message::SDH_INVALID_PORT_RANGE);
+}
+
+void P2PSocketDispatcherHost::DumpPacket(
+    const std::vector<uint8_t>& packet_header,
+    uint64_t packet_length,
+    bool incoming) {
+  if (!packet_callback_)
+    return;
+
+  std::unique_ptr<uint8_t[]> header_buffer(new uint8_t[packet_header.size()]);
+  memcpy(header_buffer.get(), &packet_header[0], packet_header.size());
+
+  packet_callback_.Run(std::move(header_buffer),
+                       static_cast<size_t>(packet_header.size()),
+                       static_cast<size_t>(packet_length), incoming);
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/p2p/socket_dispatcher_host.h b/content/browser/renderer_host/p2p/socket_dispatcher_host.h
index b58a55e..3802f73e 100644
--- a/content/browser/renderer_host/p2p/socket_dispatcher_host.h
+++ b/content/browser/renderer_host/p2p/socket_dispatcher_host.h
@@ -12,127 +12,56 @@
 #include <string>
 #include <vector>
 
-#include "base/containers/flat_map.h"
 #include "base/macros.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
-#include "content/browser/renderer_host/p2p/socket_host_throttler.h"
-#include "content/public/browser/browser_message_filter.h"
-#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/render_process_host.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "net/base/ip_address.h"
-#include "net/base/ip_endpoint.h"
-#include "net/base/network_change_notifier.h"
-#include "services/network/public/cpp/p2p_socket_type.h"
 #include "services/network/public/mojom/p2p.mojom.h"
-
-namespace net {
-class URLRequestContextGetter;
-}
-
-namespace network {
-class ProxyResolvingClientSocketFactory;
-}
+#include "services/network/public/mojom/p2p_trusted.mojom.h"
 
 namespace content {
 
-class P2PSocketHost;
-
+// Responsible for P2P sockets. Lives on the UI thread.
 class P2PSocketDispatcherHost
-    : public base::RefCountedThreadSafe<P2PSocketDispatcherHost,
-                                        BrowserThread::DeleteOnIOThread>,
-      public net::NetworkChangeNotifier::NetworkChangeObserver,
-      public network::mojom::P2PSocketManager {
+    : public network::mojom::P2PTrustedSocketManagerClient {
  public:
-  P2PSocketDispatcherHost(int render_process_id,
-                          net::URLRequestContextGetter* url_context);
+  explicit P2PSocketDispatcherHost(int render_process_id);
+  ~P2PSocketDispatcherHost() override;
 
-  // net::NetworkChangeNotifier::NetworkChangeObserver overrides.
-  void OnNetworkChanged(
-      net::NetworkChangeNotifier::ConnectionType type) override;
-  // Starts the RTP packet header dumping. Must be called on the IO thread.
+  // Starts the RTP packet header dumping.
   void StartRtpDump(
       bool incoming,
       bool outgoing,
       const RenderProcessHost::WebRtcRtpPacketCallback& packet_callback);
 
-  // Stops the RTP packet header dumping. Must be Called on the UI thread.
-  void StopRtpDumpOnUIThread(bool incoming, bool outgoing);
+  // Stops the RTP packet header dumping.
+  void StopRtpDump(bool incoming, bool outgoing);
 
   void BindRequest(network::mojom::P2PSocketManagerRequest request);
 
-  void AddAcceptedConnection(
-      std::unique_ptr<P2PSocketHost> accepted_connection);
-  void SocketDestroyed(P2PSocketHost* socket);
+  base::WeakPtr<P2PSocketDispatcherHost> GetWeakPtr();
 
  private:
-  friend class base::RefCountedThreadSafe<P2PSocketDispatcherHost>;
-  friend class base::DeleteHelper<P2PSocketDispatcherHost>;
-  friend struct BrowserThread::DeleteOnThread<BrowserThread::IO>;
-
-  ~P2PSocketDispatcherHost() override;
-
-  class DnsRequest;
-
-  void DoGetNetworkList();
-  void SendNetworkList(const net::NetworkInterfaceList& list,
-                       const net::IPAddress& default_ipv4_local_address,
-                       const net::IPAddress& default_ipv6_local_address);
-
-  // network::mojom::P2PSocketManager overrides:
-  void StartNetworkNotifications(
-      network::mojom::P2PNetworkNotificationClientPtr client) override;
-  void GetHostAddress(const std::string& host_name,
-                      network::mojom::P2PSocketManager::GetHostAddressCallback
-                          callback) override;
-  void CreateSocket(network::P2PSocketType type,
-                    const net::IPEndPoint& local_address,
-                    const network::P2PPortRange& port_range,
-                    const network::P2PHostAndIPEndPoint& remote_address,
-                    network::mojom::P2PSocketClientPtr client,
-                    network::mojom::P2PSocketRequest request) override;
-
-  void NetworkNotificationClientConnectionError();
-
-  // This connects a UDP socket to a public IP address and gets local
-  // address. Since it binds to the "any" address (0.0.0.0 or ::) internally, it
-  // retrieves the default local address.
-  net::IPAddress GetDefaultLocalAddress(int family);
-
-  void OnAddressResolved(
-      DnsRequest* request,
-      network::mojom::P2PSocketManager::GetHostAddressCallback callback,
-      const net::IPAddressList& addresses);
-
-  void StopRtpDumpOnIOThread(bool incoming, bool outgoing);
+  // network::mojom::P2PTrustedSocketManagerClient overrides:
+  void InvalidSocketPortRangeRequested() override;
+  void DumpPacket(const std::vector<uint8_t>& packet_header,
+                  uint64_t packet_length,
+                  bool incoming) override;
 
   int render_process_id_;
-  scoped_refptr<net::URLRequestContextGetter> url_context_;
-  // Initialized on browser IO thread.
-  std::unique_ptr<network::ProxyResolvingClientSocketFactory>
-      proxy_resolving_socket_factory_;
 
-  base::flat_map<P2PSocketHost*, std::unique_ptr<P2PSocketHost>> sockets_;
-
-  std::set<std::unique_ptr<DnsRequest>> dns_requests_;
-  P2PMessageThrottler throttler_;
-
-  net::IPAddress default_ipv4_local_address_;
-  net::IPAddress default_ipv6_local_address_;
-
-  bool dump_incoming_rtp_packet_;
-  bool dump_outgoing_rtp_packet_;
+  bool dump_incoming_rtp_packet_ = false;
+  bool dump_outgoing_rtp_packet_ = false;
   RenderProcessHost::WebRtcRtpPacketCallback packet_callback_;
 
-  // Used to call DoGetNetworkList, which may briefly block since getting the
-  // default local address involves creating a dummy socket.
-  const scoped_refptr<base::SequencedTaskRunner> network_list_task_runner_;
-
-  mojo::Binding<network::mojom::P2PSocketManager> binding_;
+  mojo::Binding<network::mojom::P2PTrustedSocketManagerClient> binding_;
+  network::mojom::P2PTrustedSocketManagerPtr trusted_socket_manager_;
 
   network::mojom::P2PNetworkNotificationClientPtr network_notification_client_;
 
+  base::WeakPtrFactory<P2PSocketDispatcherHost> weak_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(P2PSocketDispatcherHost);
 };
 
diff --git a/content/browser/renderer_host/p2p/socket_host.cc b/content/browser/renderer_host/p2p/socket_host.cc
deleted file mode 100644
index 457a113..0000000
--- a/content/browser/renderer_host/p2p/socket_host.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/renderer_host/p2p/socket_host.h"
-
-#include "base/metrics/histogram_macros.h"
-#include "base/sys_byteorder.h"
-#include "content/browser/renderer_host/p2p/socket_dispatcher_host.h"
-#include "content/browser/renderer_host/p2p/socket_host_tcp.h"
-#include "content/browser/renderer_host/p2p/socket_host_tcp_server.h"
-#include "content/browser/renderer_host/p2p/socket_host_udp.h"
-#include "content/browser/renderer_host/render_process_host_impl.h"
-#include "content/public/browser/browser_thread.h"
-#include "net/base/net_errors.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
-#include "services/network/proxy_resolving_client_socket_factory.h"
-#include "third_party/webrtc/media/base/rtputils.h"
-#include "third_party/webrtc/media/base/turnutils.h"
-
-namespace {
-
-// Used to back histogram value of "WebRTC.ICE.TcpSocketErrorCode" and
-// "WebRTC.ICE.UdpSocketErrorCode".
-enum class SocketErrorCode {
-  ERR_MSG_TOO_BIG,
-  ERR_ADDRESS_UNREACHABLE,
-  ERR_ADDRESS_INVALID,
-  ERR_INTERNET_DISCONNECTED,
-  ERR_TIMED_OUT,
-  ERR_INSUFFICIENT_RESOURCES,
-  ERR_OUT_OF_MEMORY,
-  ERR_OTHER  // For all the others
-};
-
-const uint32_t kStunMagicCookie = 0x2112A442;
-const size_t kMinRtcpHeaderLength = 8;
-const size_t kDtlsRecordHeaderLength = 13;
-
-bool IsDtlsPacket(const int8_t* data, size_t length) {
-  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
-  return (length >= kDtlsRecordHeaderLength && (u[0] > 19 && u[0] < 64));
-}
-
-bool IsRtcpPacket(const int8_t* data, size_t length) {
-  if (length < kMinRtcpHeaderLength) {
-    return false;
-  }
-
-  int type = (static_cast<uint8_t>(data[1]) & 0x7F);
-  return (type >= 64 && type < 96);
-}
-
-// Map the network error to SocketErrorCode for the UMA histogram.
-// static
-static SocketErrorCode MapNetErrorToSocketErrorCode(int net_err) {
-  switch (net_err) {
-    case net::OK:
-      NOTREACHED();
-      return SocketErrorCode::ERR_OTHER;
-    case net::ERR_MSG_TOO_BIG:
-      return SocketErrorCode::ERR_MSG_TOO_BIG;
-    case net::ERR_ADDRESS_UNREACHABLE:
-      return SocketErrorCode::ERR_ADDRESS_UNREACHABLE;
-    case net::ERR_ADDRESS_INVALID:
-      return SocketErrorCode::ERR_ADDRESS_INVALID;
-    case net::ERR_INTERNET_DISCONNECTED:
-      return SocketErrorCode::ERR_INTERNET_DISCONNECTED;
-    case net::ERR_TIMED_OUT:
-      return SocketErrorCode::ERR_TIMED_OUT;
-    case net::ERR_INSUFFICIENT_RESOURCES:
-      return SocketErrorCode::ERR_INSUFFICIENT_RESOURCES;
-    case net::ERR_OUT_OF_MEMORY:
-      return SocketErrorCode::ERR_OUT_OF_MEMORY;
-    default:
-      return SocketErrorCode::ERR_OTHER;
-  }
-}
-}  // namespace
-
-namespace content {
-
-P2PSocketHost::P2PSocketHost(P2PSocketDispatcherHost* socket_dispatcher_host,
-                             network::mojom::P2PSocketClientPtr client,
-                             network::mojom::P2PSocketRequest socket,
-                             ProtocolType protocol_type)
-    : socket_dispatcher_host_(socket_dispatcher_host),
-      client_(std::move(client)),
-      binding_(this, std::move(socket)),
-      state_(STATE_UNINITIALIZED),
-      dump_incoming_rtp_packet_(false),
-      dump_outgoing_rtp_packet_(false),
-      protocol_type_(protocol_type),
-      send_packets_delayed_total_(0),
-      send_packets_total_(0),
-      send_bytes_delayed_max_(0),
-      send_bytes_delayed_cur_(0),
-      weak_ptr_factory_(this) {
-  binding_.set_connection_error_handler(base::BindOnce(
-      &P2PSocketHost::OnConnectionError, base::Unretained(this)));
-}
-
-P2PSocketHost::~P2PSocketHost() {
-  if (protocol_type_ == P2PSocketHost::UDP) {
-    UMA_HISTOGRAM_COUNTS_10000("WebRTC.SystemMaxConsecutiveBytesDelayed_UDP",
-                               send_bytes_delayed_max_);
-  } else {
-    UMA_HISTOGRAM_COUNTS_10000("WebRTC.SystemMaxConsecutiveBytesDelayed_TCP",
-                               send_bytes_delayed_max_);
-  }
-
-  if (send_packets_total_ > 0) {
-    int delay_rate = (send_packets_delayed_total_ * 100) / send_packets_total_;
-    if (protocol_type_ == P2PSocketHost::UDP) {
-      UMA_HISTOGRAM_PERCENTAGE("WebRTC.SystemPercentPacketsDelayed_UDP",
-                               delay_rate);
-    } else {
-      UMA_HISTOGRAM_PERCENTAGE("WebRTC.SystemPercentPacketsDelayed_TCP",
-                               delay_rate);
-    }
-  }
-
-  if (socket_dispatcher_host_)
-    socket_dispatcher_host_->SocketDestroyed(this);
-}
-
-// Verifies that the packet |data| has a valid STUN header.
-// static
-bool P2PSocketHost::GetStunPacketType(const int8_t* data,
-                                      int data_size,
-                                      StunMessageType* type) {
-  if (data_size < kStunHeaderSize) {
-    return false;
-  }
-
-  uint32_t cookie =
-      base::NetToHost32(*reinterpret_cast<const uint32_t*>(data + 4));
-  if (cookie != kStunMagicCookie) {
-    return false;
-  }
-
-  uint16_t length =
-      base::NetToHost16(*reinterpret_cast<const uint16_t*>(data + 2));
-  if (length != data_size - kStunHeaderSize) {
-    return false;
-  }
-
-  int message_type =
-      base::NetToHost16(*reinterpret_cast<const uint16_t*>(data));
-
-  // Verify that the type is known:
-  switch (message_type) {
-    case STUN_BINDING_REQUEST:
-    case STUN_BINDING_RESPONSE:
-    case STUN_BINDING_ERROR_RESPONSE:
-    case STUN_SHARED_SECRET_REQUEST:
-    case STUN_SHARED_SECRET_RESPONSE:
-    case STUN_SHARED_SECRET_ERROR_RESPONSE:
-    case STUN_ALLOCATE_REQUEST:
-    case STUN_ALLOCATE_RESPONSE:
-    case STUN_ALLOCATE_ERROR_RESPONSE:
-    case STUN_SEND_REQUEST:
-    case STUN_SEND_RESPONSE:
-    case STUN_SEND_ERROR_RESPONSE:
-    case STUN_DATA_INDICATION:
-      *type = static_cast<StunMessageType>(message_type);
-      return true;
-
-    default:
-      return false;
-  }
-}
-
-// static
-bool P2PSocketHost::IsRequestOrResponse(StunMessageType type) {
-  return type == STUN_BINDING_REQUEST || type == STUN_BINDING_RESPONSE ||
-      type == STUN_ALLOCATE_REQUEST || type == STUN_ALLOCATE_RESPONSE;
-}
-
-// static
-void P2PSocketHost::ReportSocketError(int result, const char* histogram_name) {
-  SocketErrorCode error_code = MapNetErrorToSocketErrorCode(result);
-  UMA_HISTOGRAM_ENUMERATION(histogram_name, static_cast<int>(error_code),
-                            static_cast<int>(SocketErrorCode::ERR_OTHER) + 1);
-}
-
-// static
-P2PSocketHost* P2PSocketHost::Create(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    network::P2PSocketType type,
-    net::URLRequestContextGetter* url_context,
-    network::ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory,
-    P2PMessageThrottler* throttler) {
-  switch (type) {
-    case network::P2P_SOCKET_UDP:
-      return new P2PSocketHostUdp(
-          socket_dispatcher_host, std::move(client), std::move(socket),
-          throttler, url_context->GetURLRequestContext()->net_log());
-    case network::P2P_SOCKET_TCP_SERVER:
-      return new P2PSocketHostTcpServer(socket_dispatcher_host,
-                                        std::move(client), std::move(socket),
-                                        network::P2P_SOCKET_TCP_CLIENT);
-
-    case network::P2P_SOCKET_STUN_TCP_SERVER:
-      return new P2PSocketHostTcpServer(socket_dispatcher_host,
-                                        std::move(client), std::move(socket),
-                                        network::P2P_SOCKET_STUN_TCP_CLIENT);
-
-    case network::P2P_SOCKET_TCP_CLIENT:
-    case network::P2P_SOCKET_SSLTCP_CLIENT:
-    case network::P2P_SOCKET_TLS_CLIENT:
-      return new P2PSocketHostTcp(socket_dispatcher_host, std::move(client),
-                                  std::move(socket), type, url_context,
-                                  proxy_resolving_socket_factory);
-
-    case network::P2P_SOCKET_STUN_TCP_CLIENT:
-    case network::P2P_SOCKET_STUN_SSLTCP_CLIENT:
-    case network::P2P_SOCKET_STUN_TLS_CLIENT:
-      return new P2PSocketHostStunTcp(socket_dispatcher_host, std::move(client),
-                                      std::move(socket), type, url_context,
-                                      proxy_resolving_socket_factory);
-  }
-
-  NOTREACHED();
-  return nullptr;
-}
-
-void P2PSocketHost::StartRtpDump(
-    bool incoming,
-    bool outgoing,
-    const RenderProcessHost::WebRtcRtpPacketCallback& packet_callback) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(!packet_callback.is_null());
-  DCHECK(incoming || outgoing);
-
-  if (incoming) {
-    dump_incoming_rtp_packet_ = true;
-  }
-
-  if (outgoing) {
-    dump_outgoing_rtp_packet_ = true;
-  }
-
-  packet_dump_callback_ = packet_callback;
-}
-
-void P2PSocketHost::StopRtpDump(bool incoming, bool outgoing) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  DCHECK(incoming || outgoing);
-
-  if (incoming) {
-    dump_incoming_rtp_packet_ = false;
-  }
-
-  if (outgoing) {
-    dump_outgoing_rtp_packet_ = false;
-  }
-
-  if (!dump_incoming_rtp_packet_ && !dump_outgoing_rtp_packet_) {
-    packet_dump_callback_.Reset();
-  }
-}
-
-network::mojom::P2PSocketClientPtr P2PSocketHost::ReleaseClientForTesting() {
-  return std::move(client_);
-}
-
-network::mojom::P2PSocketRequest P2PSocketHost::ReleaseBindingForTesting() {
-  return binding_.Unbind();
-}
-
-void P2PSocketHost::DumpRtpPacket(const int8_t* packet,
-                                  size_t length,
-                                  bool incoming) {
-  if (IsDtlsPacket(packet, length) || IsRtcpPacket(packet, length)) {
-    return;
-  }
-
-  size_t rtp_packet_pos = 0;
-  size_t rtp_packet_length = length;
-  if (!cricket::UnwrapTurnPacket(reinterpret_cast<const uint8_t*>(packet),
-                                 length, &rtp_packet_pos, &rtp_packet_length)) {
-    return;
-  }
-
-  packet += rtp_packet_pos;
-
-  size_t header_length = 0;
-  bool valid =
-      cricket::ValidateRtpHeader(reinterpret_cast<const uint8_t*>(packet),
-                                 rtp_packet_length, &header_length);
-  if (!valid) {
-    NOTREACHED();
-    return;
-  }
-
-  std::unique_ptr<uint8_t[]> header_buffer(new uint8_t[header_length]);
-  memcpy(header_buffer.get(), packet, header_length);
-
-  // Posts to the IO thread as the data members should be accessed on the IO
-  // thread only.
-  BrowserThread::PostTask(
-      BrowserThread::IO, FROM_HERE,
-      base::BindOnce(&P2PSocketHost::DumpRtpPacketOnIOThread,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(header_buffer),
-                     header_length, rtp_packet_length, incoming));
-}
-
-void P2PSocketHost::DumpRtpPacketOnIOThread(
-    std::unique_ptr<uint8_t[]> packet_header,
-    size_t header_length,
-    size_t packet_length,
-    bool incoming) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-
-  if ((incoming && !dump_incoming_rtp_packet_) ||
-      (!incoming && !dump_outgoing_rtp_packet_) ||
-      packet_dump_callback_.is_null()) {
-    return;
-  }
-
-  // |packet_dump_callback_| must be called on the UI thread.
-  BrowserThread::PostTask(
-      BrowserThread::UI, FROM_HERE,
-      base::BindOnce(packet_dump_callback_, std::move(packet_header),
-                     header_length, packet_length, incoming));
-}
-
-void P2PSocketHost::IncrementDelayedPackets() {
-  send_packets_delayed_total_++;
-}
-
-void P2PSocketHost::IncrementTotalSentPackets() {
-  send_packets_total_++;
-}
-
-void P2PSocketHost::IncrementDelayedBytes(uint32_t size) {
-  send_bytes_delayed_cur_ += size;
-  if (send_bytes_delayed_cur_ > send_bytes_delayed_max_) {
-    send_bytes_delayed_max_ = send_bytes_delayed_cur_;
-  }
-}
-
-void P2PSocketHost::DecrementDelayedBytes(uint32_t size) {
-  send_bytes_delayed_cur_ -= size;
-  DCHECK_GE(send_bytes_delayed_cur_, 0);
-}
-
-void P2PSocketHost::OnConnectionError() {
-  delete this;
-}
-
-}  // namespace content
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp.h b/content/browser/renderer_host/p2p/socket_host_tcp.h
deleted file mode 100644
index d8190d01..0000000
--- a/content/browser/renderer_host/p2p/socket_host_tcp.h
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_H_
-#define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_H_
-
-#include <stdint.h>
-
-#include <memory>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/containers/queue.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "content/browser/renderer_host/p2p/socket_host.h"
-#include "net/base/completion_callback.h"
-#include "net/base/ip_endpoint.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "services/network/public/cpp/p2p_socket_type.h"
-
-namespace network {
-class ProxyResolvingClientSocketFactory;
-}  // namespace network
-
-namespace net {
-class DrainableIOBuffer;
-class GrowableIOBuffer;
-class StreamSocket;
-class URLRequestContextGetter;
-}  // namespace net
-
-namespace content {
-
-class CONTENT_EXPORT P2PSocketHostTcpBase : public P2PSocketHost {
- public:
-  P2PSocketHostTcpBase(P2PSocketDispatcherHost* socket_dispatcher_host,
-                       network::mojom::P2PSocketClientPtr client,
-                       network::mojom::P2PSocketRequest socket,
-                       network::P2PSocketType type,
-                       net::URLRequestContextGetter* url_context,
-                       network::ProxyResolvingClientSocketFactory*
-                           proxy_resolving_socket_factory);
-  ~P2PSocketHostTcpBase() override;
-
-  bool InitAccepted(const net::IPEndPoint& remote_address,
-                    std::unique_ptr<net::StreamSocket> socket);
-
-  // P2PSocketHost overrides.
-  bool Init(const net::IPEndPoint& local_address,
-            uint16_t min_port,
-            uint16_t max_port,
-            const network::P2PHostAndIPEndPoint& remote_address) override;
-
-  // network::mojom::P2PSocket implementation:
-  void AcceptIncomingTcpConnection(
-      const net::IPEndPoint& remote_address,
-      network::mojom::P2PSocketClientPtr client,
-      network::mojom::P2PSocketRequest socket) override;
-  void Send(const std::vector<int8_t>& data,
-            const network::P2PPacketInfo& packet_info,
-            const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
-      override;
-  void SetOption(network::P2PSocketOption option, int32_t value) override;
-
- protected:
-  struct SendBuffer {
-    SendBuffer();
-    SendBuffer(int32_t packet_id,
-               scoped_refptr<net::DrainableIOBuffer> buffer,
-               const net::NetworkTrafficAnnotationTag traffic_annotation);
-    SendBuffer(const SendBuffer& rhs);
-    ~SendBuffer();
-
-    int32_t rtc_packet_id;
-    scoped_refptr<net::DrainableIOBuffer> buffer;
-    net::MutableNetworkTrafficAnnotationTag traffic_annotation;
-  };
-
-  // Derived classes will provide the implementation.
-  virtual int ProcessInput(char* input, int input_len) = 0;
-  virtual void DoSend(
-      const net::IPEndPoint& to,
-      const std::vector<int8_t>& data,
-      const rtc::PacketOptions& options,
-      const net::NetworkTrafficAnnotationTag traffic_annotation) = 0;
-
-  void WriteOrQueue(SendBuffer& send_buffer);
-  void OnPacket(const std::vector<int8_t>& data);
-  void OnError();
-
- private:
-  friend class P2PSocketHostTcpTestBase;
-  friend class P2PSocketHostTcpServerTest;
-
-  void DidCompleteRead(int result);
-  void DoRead();
-
-  void DoWrite();
-  void HandleWriteResult(int result);
-
-  // Callbacks for Connect(), Read() and Write().
-  void OnConnected(int result);
-  void OnRead(int result);
-  void OnWritten(int result);
-
-  // Helper method to send socket create message and start read.
-  void OnOpen();
-  bool DoSendSocketCreateMsg();
-
-  network::P2PHostAndIPEndPoint remote_address_;
-
-  std::unique_ptr<net::StreamSocket> socket_;
-  scoped_refptr<net::GrowableIOBuffer> read_buffer_;
-  base::queue<SendBuffer> write_queue_;
-  SendBuffer write_buffer_;
-
-  bool write_pending_;
-
-  bool connected_;
-  network::P2PSocketType type_;
-  scoped_refptr<net::URLRequestContextGetter> url_context_;
-  network::ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory_;
-
-  DISALLOW_COPY_AND_ASSIGN(P2PSocketHostTcpBase);
-};
-
-class CONTENT_EXPORT P2PSocketHostTcp : public P2PSocketHostTcpBase {
- public:
-  P2PSocketHostTcp(P2PSocketDispatcherHost* socket_dispatcher_host,
-                   network::mojom::P2PSocketClientPtr client,
-                   network::mojom::P2PSocketRequest socket,
-                   network::P2PSocketType type,
-                   net::URLRequestContextGetter* url_context,
-                   network::ProxyResolvingClientSocketFactory*
-                       proxy_resolving_socket_factory);
-
-  ~P2PSocketHostTcp() override;
-
- protected:
-  int ProcessInput(char* input, int input_len) override;
-  void DoSend(
-      const net::IPEndPoint& to,
-      const std::vector<int8_t>& data,
-      const rtc::PacketOptions& options,
-      const net::NetworkTrafficAnnotationTag traffic_annotation) override;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(P2PSocketHostTcp);
-};
-
-// P2PSocketHostStunTcp class provides the framing of STUN messages when used
-// with TURN. These messages will not have length at front of the packet and
-// are padded to multiple of 4 bytes.
-// Formatting of messages is defined in RFC5766.
-class CONTENT_EXPORT P2PSocketHostStunTcp : public P2PSocketHostTcpBase {
- public:
-  P2PSocketHostStunTcp(P2PSocketDispatcherHost* socket_dispatcher_host,
-                       network::mojom::P2PSocketClientPtr client,
-                       network::mojom::P2PSocketRequest socket,
-                       network::P2PSocketType type,
-                       net::URLRequestContextGetter* url_context,
-                       network::ProxyResolvingClientSocketFactory*
-                           proxy_resolving_socket_factory);
-
-  ~P2PSocketHostStunTcp() override;
-
- protected:
-  int ProcessInput(char* input, int input_len) override;
-  void DoSend(
-      const net::IPEndPoint& to,
-      const std::vector<int8_t>& data,
-      const rtc::PacketOptions& options,
-      const net::NetworkTrafficAnnotationTag traffic_annotation) override;
-
- private:
-  int GetExpectedPacketSize(const int8_t* data, int len, int* pad_bytes);
-
-  DISALLOW_COPY_AND_ASSIGN(P2PSocketHostStunTcp);
-};
-
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_H_
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp_server.cc b/content/browser/renderer_host/p2p/socket_host_tcp_server.cc
deleted file mode 100644
index f7bc6da..0000000
--- a/content/browser/renderer_host/p2p/socket_host_tcp_server.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "content/browser/renderer_host/p2p/socket_host_tcp_server.h"
-
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "content/browser/renderer_host/p2p/socket_dispatcher_host.h"
-#include "content/browser/renderer_host/p2p/socket_host_tcp.h"
-#include "net/base/address_list.h"
-#include "net/base/net_errors.h"
-#include "net/log/net_log_source.h"
-#include "net/socket/stream_socket.h"
-#include "services/network/public/cpp/p2p_param_traits.h"
-
-namespace {
-const int kListenBacklog = 5;
-}  // namespace
-
-namespace content {
-
-P2PSocketHostTcpServer::P2PSocketHostTcpServer(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    network::P2PSocketType client_type)
-    : P2PSocketHost(socket_dispatcher_host,
-                    std::move(client),
-                    std::move(socket),
-                    P2PSocketHost::TCP),
-      client_type_(client_type),
-      socket_(new net::TCPServerSocket(nullptr, net::NetLogSource())),
-      accept_callback_(base::BindRepeating(&P2PSocketHostTcpServer::OnAccepted,
-                                           base::Unretained(this))) {}
-
-P2PSocketHostTcpServer::~P2PSocketHostTcpServer() {
-  if (state_ == STATE_OPEN) {
-    DCHECK(socket_.get());
-    socket_.reset();
-  }
-}
-
-// TODO(guidou): Add support for port range.
-bool P2PSocketHostTcpServer::Init(
-    const net::IPEndPoint& local_address,
-    uint16_t min_port,
-    uint16_t max_port,
-    const network::P2PHostAndIPEndPoint& remote_address) {
-  DCHECK_EQ(state_, STATE_UNINITIALIZED);
-
-  int result = socket_->Listen(local_address, kListenBacklog);
-  if (result < 0) {
-    LOG(ERROR) << "Listen() failed: " << result;
-    OnError();
-    return false;
-  }
-
-  result = socket_->GetLocalAddress(&local_address_);
-  if (result < 0) {
-    LOG(ERROR) << "P2PSocketHostTcpServer::Init(): can't to get local address: "
-               << result;
-    OnError();
-    return false;
-  }
-  VLOG(1) << "Local address: " << local_address_.ToString();
-
-  state_ = STATE_OPEN;
-  // NOTE: Remote address can be empty as socket is just listening
-  // in this state.
-  client_->SocketCreated(local_address_, remote_address.ip_address);
-  DoAccept();
-  return true;
-}
-
-std::unique_ptr<P2PSocketHostTcpBase>
-P2PSocketHostTcpServer::AcceptIncomingTcpConnectionInternal(
-    const net::IPEndPoint& remote_address,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest request) {
-  auto it = accepted_sockets_.find(remote_address);
-  if (it == accepted_sockets_.end())
-    return nullptr;
-
-  std::unique_ptr<net::StreamSocket> socket = std::move(it->second);
-  accepted_sockets_.erase(it);
-
-  std::unique_ptr<P2PSocketHostTcpBase> result;
-  if (client_type_ == network::P2P_SOCKET_TCP_CLIENT) {
-    result.reset(new P2PSocketHostTcp(socket_dispatcher_host_,
-                                      std::move(client), std::move(request),
-                                      client_type_, nullptr, nullptr));
-  } else {
-    result.reset(new P2PSocketHostStunTcp(socket_dispatcher_host_,
-                                          std::move(client), std::move(request),
-                                          client_type_, nullptr, nullptr));
-  }
-  if (!result->InitAccepted(remote_address, std::move(socket)))
-    return nullptr;
-
-  return result;
-}
-
-void P2PSocketHostTcpServer::OnError() {
-  socket_.reset();
-
-  if (state_ == STATE_UNINITIALIZED || state_ == STATE_OPEN) {
-    binding_.Close();
-    client_.reset();
-  }
-
-  state_ = STATE_ERROR;
-}
-
-void P2PSocketHostTcpServer::DoAccept() {
-  while (true) {
-    int result = socket_->Accept(&accept_socket_, accept_callback_);
-    if (result == net::ERR_IO_PENDING) {
-      break;
-    } else {
-      HandleAcceptResult(result);
-    }
-  }
-}
-
-void P2PSocketHostTcpServer::HandleAcceptResult(int result) {
-  if (result < 0) {
-    if (result != net::ERR_IO_PENDING)
-      OnError();
-    return;
-  }
-
-  net::IPEndPoint address;
-  if (accept_socket_->GetPeerAddress(&address) != net::OK) {
-    LOG(ERROR) << "Failed to get address of an accepted socket.";
-    accept_socket_.reset();
-    return;
-  }
-  accepted_sockets_[address] = std::move(accept_socket_);
-  client_->IncomingTcpConnection(address);
-}
-
-void P2PSocketHostTcpServer::OnAccepted(int result) {
-  HandleAcceptResult(result);
-  if (result == net::OK)
-    DoAccept();
-}
-
-void P2PSocketHostTcpServer::AcceptIncomingTcpConnection(
-    const net::IPEndPoint& remote_address,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest request) {
-  std::unique_ptr<P2PSocketHostTcpBase> socket =
-      AcceptIncomingTcpConnectionInternal(remote_address, std::move(client),
-                                          std::move(request));
-  if (socket)
-    socket_dispatcher_host_->AddAcceptedConnection(std::move(socket));
-}
-
-void P2PSocketHostTcpServer::Send(
-    const std::vector<int8_t>& data,
-    const network::P2PPacketInfo& packet_info,
-    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
-  NOTREACHED();
-  delete this;
-}
-
-void P2PSocketHostTcpServer::SetOption(network::P2PSocketOption option,
-                                       int32_t value) {
-  // Currently we don't have use case tcp server sockets are used for p2p.
-}
-
-}  // namespace content
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp_server.h b/content/browser/renderer_host/p2p/socket_host_tcp_server.h
deleted file mode 100644
index 53a52aa..0000000
--- a/content/browser/renderer_host/p2p/socket_host_tcp_server.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_SERVER_H_
-#define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_SERVER_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "content/browser/renderer_host/p2p/socket_host.h"
-#include "content/common/content_export.h"
-#include "ipc/ipc_sender.h"
-#include "net/base/completion_repeating_callback.h"
-#include "net/socket/tcp_server_socket.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-#include "services/network/public/cpp/p2p_socket_type.h"
-
-namespace net {
-class StreamSocket;
-}  // namespace net
-
-namespace content {
-class P2PSocketHostTcpBase;
-
-class CONTENT_EXPORT P2PSocketHostTcpServer : public P2PSocketHost {
- public:
-  P2PSocketHostTcpServer(P2PSocketDispatcherHost* socket_dispatcher_host,
-                         network::mojom::P2PSocketClientPtr client,
-                         network::mojom::P2PSocketRequest socket,
-                         network::P2PSocketType client_type);
-  ~P2PSocketHostTcpServer() override;
-
-  // P2PSocketHost overrides.
-  bool Init(const net::IPEndPoint& local_address,
-            uint16_t min_port,
-            uint16_t max_port,
-            const network::P2PHostAndIPEndPoint& remote_address) override;
-
-  // network::mojom::P2PSocket implementation:
-  void AcceptIncomingTcpConnection(
-      const net::IPEndPoint& remote_address,
-      network::mojom::P2PSocketClientPtr client,
-      network::mojom::P2PSocketRequest request) override;
-  void Send(const std::vector<int8_t>& data,
-            const network::P2PPacketInfo& packet_info,
-            const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
-      override;
-  void SetOption(network::P2PSocketOption option, int32_t value) override;
-
- private:
-  friend class P2PSocketHostTcpServerTest;
-
-  std::unique_ptr<P2PSocketHostTcpBase> AcceptIncomingTcpConnectionInternal(
-      const net::IPEndPoint& remote_address,
-      network::mojom::P2PSocketClientPtr client,
-      network::mojom::P2PSocketRequest request);
-
-  void OnError();
-
-  void DoAccept();
-  void HandleAcceptResult(int result);
-
-  // Callback for Accept().
-  void OnAccepted(int result);
-
-  const network::P2PSocketType client_type_;
-  std::unique_ptr<net::ServerSocket> socket_;
-  net::IPEndPoint local_address_;
-
-  std::unique_ptr<net::StreamSocket> accept_socket_;
-  std::map<net::IPEndPoint, std::unique_ptr<net::StreamSocket>>
-      accepted_sockets_;
-
-  const net::CompletionRepeatingCallback accept_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(P2PSocketHostTcpServer);
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TCP_SERVER_H_
diff --git a/content/browser/renderer_host/pepper/pepper_external_file_ref_backend.cc b/content/browser/renderer_host/pepper/pepper_external_file_ref_backend.cc
index 896a28c..c4654b4 100644
--- a/content/browser/renderer_host/pepper/pepper_external_file_ref_backend.cc
+++ b/content/browser/renderer_host/pepper/pepper_external_file_ref_backend.cc
@@ -8,7 +8,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/public/browser/browser_thread.h"
 #include "ppapi/c/pp_errors.h"
diff --git a/content/browser/renderer_host/pepper/pepper_file_io_host.cc b/content/browser/renderer_host/pepper/pepper_file_io_host.cc
index 9d9e3ea2..a614f4f 100644
--- a/content/browser/renderer_host/pepper/pepper_file_io_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_file_io_host.cc
@@ -10,7 +10,7 @@
 #include "base/callback.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/renderer_host/pepper/pepper_file_ref_host.h"
 #include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h"
 #include "content/browser/renderer_host/pepper/pepper_security_helper.h"
diff --git a/content/browser/renderer_host/pepper/pepper_flash_file_message_filter.cc b/content/browser/renderer_host/pepper/pepper_flash_file_message_filter.cc
index fcea1f9..3619dfa 100644
--- a/content/browser/renderer_host/pepper/pepper_flash_file_message_filter.cc
+++ b/content/browser/renderer_host/pepper/pepper_flash_file_message_filter.cc
@@ -10,7 +10,7 @@
 #include "base/files/file.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/child_process_security_policy_impl.h"
 #include "content/browser/renderer_host/pepper/pepper_security_helper.h"
 #include "content/public/browser/browser_ppapi_host.h"
diff --git a/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc b/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc
index c43c631b..9f0fc64 100644
--- a/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_network_monitor_host.cc
@@ -6,7 +6,7 @@
 
 #include <stddef.h>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "content/browser/renderer_host/pepper/browser_ppapi_host_impl.h"
 #include "content/browser/renderer_host/pepper/pepper_socket_utils.h"
diff --git a/content/browser/renderer_host/pepper/pepper_truetype_font_host.cc b/content/browser/renderer_host/pepper/pepper_truetype_font_host.cc
index a6ddba1..6f4b48e 100644
--- a/content/browser/renderer_host/pepper/pepper_truetype_font_host.cc
+++ b/content/browser/renderer_host/pepper/pepper_truetype_font_host.cc
@@ -5,7 +5,7 @@
 #include "content/browser/renderer_host/pepper/pepper_truetype_font_host.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "content/browser/renderer_host/pepper/pepper_truetype_font.h"
 #include "content/public/browser/browser_ppapi_host.h"
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc
index 43840681..fc443f0 100644
--- a/content/browser/renderer_host/render_message_filter.cc
+++ b/content/browser/renderer_host/render_message_filter.cc
@@ -18,7 +18,7 @@
 #include "base/numerics/safe_math.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "components/download/public/common/download_stats.h"
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 2f7c2f2cb..3dcc6e5c 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -51,7 +51,7 @@
 #include "base/supports_user_data.h"
 #include "base/synchronization/lock.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -1855,7 +1855,7 @@
 #endif
 
   p2p_socket_dispatcher_host_ =
-      new P2PSocketDispatcherHost(GetID(), request_context.get());
+      std::make_unique<P2PSocketDispatcherHost>(GetID());
 
   AddFilter(new TraceMessageFilter(GetID()));
   AddFilter(new ResolveProxyMsgHelper(GetID()));
@@ -2034,8 +2034,10 @@
       base::Unretained(storage_partition_impl_->GetAppCacheService()),
       GetID()));
 
-  registry->AddInterface(base::BindRepeating(
-      &P2PSocketDispatcherHost::BindRequest, p2p_socket_dispatcher_host_));
+  AddUIThreadInterface(
+      registry.get(),
+      base::BindRepeating(&P2PSocketDispatcherHost::BindRequest,
+                          base::Unretained(p2p_socket_dispatcher_host_.get())));
 
   AddUIThreadInterface(registry.get(), base::Bind(&FieldTrialRecorder::Create));
 
@@ -2817,7 +2819,6 @@
     switches::kEnableWebVR,
     switches::kExplicitlyAllowedPorts,
     switches::kFileUrlPathAlias,
-    switches::kFMPNetworkQuietTimeout,
     switches::kForceColorProfile,
     switches::kForceDeviceScaleFactor,
     switches::kForceGpuMemAvailableMb,
@@ -2832,6 +2833,7 @@
     switches::kMaxUntiledLayerHeight,
     switches::kMSEAudioBufferSizeLimitMb,
     switches::kMSEVideoBufferSizeLimitMb,
+    switches::kNetworkQuietTimeout,
     switches::kNoZygote,
     switches::kOverridePluginPowerSaverForTesting,
     switches::kPassiveListenersDefault,
@@ -3393,18 +3395,13 @@
     bool incoming,
     bool outgoing,
     const WebRtcRtpPacketCallback& packet_callback) {
-  if (!p2p_socket_dispatcher_host_.get())
-    return WebRtcStopRtpDumpCallback();
-
-  BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
-                          base::BindOnce(&P2PSocketDispatcherHost::StartRtpDump,
-                                         p2p_socket_dispatcher_host_, incoming,
-                                         outgoing, packet_callback));
+  p2p_socket_dispatcher_host_->StartRtpDump(incoming, outgoing,
+                                            packet_callback);
 
   if (stop_rtp_dump_callback_.is_null()) {
     stop_rtp_dump_callback_ =
-        base::Bind(&P2PSocketDispatcherHost::StopRtpDumpOnUIThread,
-                   p2p_socket_dispatcher_host_);
+        base::Bind(&P2PSocketDispatcherHost::StopRtpDump,
+                   p2p_socket_dispatcher_host_->GetWeakPtr());
   }
   return stop_rtp_dump_callback_;
 }
diff --git a/content/browser/renderer_host/render_process_host_impl.h b/content/browser/renderer_host/render_process_host_impl.h
index 562e020..607eefb 100644
--- a/content/browser/renderer_host/render_process_host_impl.h
+++ b/content/browser/renderer_host/render_process_host_impl.h
@@ -763,7 +763,7 @@
                   BrowserThread::DeleteOnIOThread>
       audio_output_stream_factory_context_;
 
-  scoped_refptr<P2PSocketDispatcherHost> p2p_socket_dispatcher_host_;
+  std::unique_ptr<P2PSocketDispatcherHost> p2p_socket_dispatcher_host_;
 
   // Must be accessed on UI thread.
   std::vector<int> aec_dump_consumers_;
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h
index b054514..17b76df4 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -272,6 +272,7 @@
 
   // Get the UKM source ID for current content. This is used for providing
   // data about the content to the URL-keyed metrics service.
+  // Note: This is also exposed by the RenderFrameHostDelegate.
   virtual ukm::SourceId GetUkmSourceIdForLastCommittedSource() const;
 
   // Notifies the delegate that a focused editable element has been touched
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index e2975ec..71a2e09 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -27,7 +27,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/trace_event.h"
@@ -408,8 +408,8 @@
   const auto* command_line = base::CommandLine::ForCurrentProcess();
   if (!command_line->HasSwitch(switches::kDisableHangMonitor)) {
     input_event_ack_timeout_.reset(new TimeoutMonitor(
-        base::Bind(&RenderWidgetHostImpl::RendererIsUnresponsive,
-                   weak_factory_.GetWeakPtr())));
+        base::BindRepeating(&RenderWidgetHostImpl::OnInputEventAckTimeout,
+                            weak_factory_.GetWeakPtr())));
   }
 
   if (!command_line->HasSwitch(switches::kDisableNewContentRenderingTimeout)) {
@@ -2086,18 +2086,24 @@
   }
 }
 
-void RenderWidgetHostImpl::RendererIsUnresponsive() {
+void RenderWidgetHostImpl::OnInputEventAckTimeout() {
+  RendererIsUnresponsive(base::BindRepeating(
+      &RenderWidgetHostImpl::RestartInputEventAckTimeoutIfNecessary,
+      weak_factory_.GetWeakPtr()));
+}
+
+void RenderWidgetHostImpl::RendererIsUnresponsive(
+    base::RepeatingClosure restart_hang_monitor_timeout) {
   NotificationService::current()->Notify(
       NOTIFICATION_RENDER_WIDGET_HOST_HANG,
       Source<RenderWidgetHost>(this),
       NotificationService::NoDetails());
   is_unresponsive_ = true;
 
-  if (delegate_)
-    delegate_->RendererUnresponsive(
-        this, base::BindRepeating(
-                  &RenderWidgetHostImpl::RestartInputEventAckTimeoutIfNecessary,
-                  weak_factory_.GetWeakPtr()));
+  if (delegate_) {
+    delegate_->RendererUnresponsive(this,
+                                    std::move(restart_hang_monitor_timeout));
+  }
 
   // Do not add code after this since the Delegate may delete this
   // RenderWidgetHostImpl in RendererUnresponsive.
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 0d347cb..f475ee2b 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -717,6 +717,17 @@
 
   void GetContentRenderingTimeoutFrom(RenderWidgetHostImpl* other);
 
+  // Called on delayed response from the renderer by either
+  // 1) |hang_monitor_timeout_| (slow to ack input events) or
+  // 2) NavigationHandle::OnCommitTimeout (slow to commit).
+  void RendererIsUnresponsive(
+      base::RepeatingClosure restart_hang_monitor_timeout);
+
+  // Called if we know the renderer is responsive. When we currently think the
+  // renderer is unresponsive, this will clear that state and call
+  // NotifyRendererResponsive.
+  void RendererIsResponsive();
+
  protected:
   // ---------------------------------------------------------------------------
   // The following method is overridden by RenderViewHost to send upwards to
@@ -794,18 +805,10 @@
   // destructor is called as well.
   void Destroy(bool also_delete);
 
-  // Called by |input_event_ack_timeout_| on delayed response from the renderer.
-  void RendererIsUnresponsive();
-
   // Called by |new_content_rendering_timeout_| if a renderer has loaded new
   // content but failed to produce a compositor frame in a defined time.
   void ClearDisplayedGraphics();
 
-  // Called if we know the renderer is responsive. When we currently think the
-  // renderer is unresponsive, this will clear that state and call
-  // NotifyRendererResponsive.
-  void RendererIsResponsive();
-
   // IPC message handlers
   void OnRenderProcessGone(int status, int error_code);
   void OnClose();
@@ -888,6 +891,10 @@
   // was noticed because of input event ack timeout.
   void RestartInputEventAckTimeoutIfNecessary();
 
+  // Called by |input_event_ack_timeout_| when an input event timed out without
+  // getting an ack from the renderer.
+  void OnInputEventAckTimeout();
+
   void SetupInputRouter();
 
   // Start intercepting system keyboard events.
diff --git a/content/browser/resolve_proxy_msg_helper.cc b/content/browser/resolve_proxy_msg_helper.cc
index 1912f4c..22a2b63 100644
--- a/content/browser/resolve_proxy_msg_helper.cc
+++ b/content/browser/resolve_proxy_msg_helper.cc
@@ -21,11 +21,6 @@
       render_process_host_id_(render_process_host_id),
       binding_(this) {}
 
-void ResolveProxyMsgHelper::OnDestruct() const {
-  // Have to delete on the UI thread, since Mojo objects aren't threadsafe.
-  BrowserThread::DeleteSoon(BrowserThread::UI, FROM_HERE, this);
-}
-
 void ResolveProxyMsgHelper::OverrideThreadForMessage(
     const IPC::Message& message,
     BrowserThread::ID* thread) {
@@ -56,7 +51,10 @@
   }
 }
 
-ResolveProxyMsgHelper::~ResolveProxyMsgHelper() = default;
+ResolveProxyMsgHelper::~ResolveProxyMsgHelper() {
+  DCHECK(!owned_self_);
+  DCHECK(!binding_.is_bound());
+}
 
 void ResolveProxyMsgHelper::StartPendingRequest() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
@@ -69,6 +67,7 @@
   binding_.set_connection_error_handler(
       base::BindOnce(&ResolveProxyMsgHelper::OnProxyLookupComplete,
                      base::Unretained(this), base::nullopt));
+  owned_self_ = this;
   if (!SendRequestToNetworkService(pending_requests_.front().url,
                                    std::move(proxy_lookup_client))) {
     OnProxyLookupComplete(base::nullopt);
@@ -98,6 +97,15 @@
 
   binding_.Close();
 
+  // If all references except |owned_self_| have been released, just release
+  // the last reference, without doing anything.
+  if (HasOneRef()) {
+    scoped_refptr<ResolveProxyMsgHelper> self = std::move(owned_self_);
+    return;
+  }
+
+  owned_self_ = nullptr;
+
   // Clear the current (completed) request.
   PendingRequest completed_req = std::move(pending_requests_.front());
   pending_requests_.pop_front();
diff --git a/content/browser/resolve_proxy_msg_helper.h b/content/browser/resolve_proxy_msg_helper.h
index 13b2f22..8034af8 100644
--- a/content/browser/resolve_proxy_msg_helper.h
+++ b/content/browser/resolve_proxy_msg_helper.h
@@ -33,14 +33,16 @@
 // outstanding proxy resolve requests with the proxy service. It also deletes
 // the stored IPC::Message pointers for pending requests.
 //
-// This object does most of its work, and destroys itself, on the UI thread.
+// This object does most of its work on the UI thread. It holds onto a
+// self-reference as long as there's a pending Mojo call, as losing its last
+// reference on the IO thread with an open mojo pipe that lives on the UI
+// thread leads to problems.
 class CONTENT_EXPORT ResolveProxyMsgHelper : public BrowserMessageFilter,
                                              network::mojom::ProxyLookupClient {
  public:
   explicit ResolveProxyMsgHelper(int render_process_host_id);
 
   // BrowserMessageFilter implementation
-  void OnDestruct() const override;
   void OverrideThreadForMessage(const IPC::Message& message,
                                 BrowserThread::ID* thread) override;
   bool OnMessageReceived(const IPC::Message& message) override;
@@ -94,6 +96,12 @@
   using PendingRequestList = base::circular_deque<PendingRequest>;
   PendingRequestList pending_requests_;
 
+  // Self-reference. Owned as long as there's an outstanding proxy lookup.
+  // Needed to shut down safely, since this class is refcounted, with some
+  // references owned on multiple threads, while |binding_| lives on the UI
+  // thread, and may receive callbacks there whenever there's a pending request.
+  scoped_refptr<ResolveProxyMsgHelper> owned_self_;
+
   // Binding for the currently in-progress request, if any.
   mojo::Binding<network::mojom::ProxyLookupClient> binding_;
 
diff --git a/content/browser/resolve_proxy_msg_helper_unittest.cc b/content/browser/resolve_proxy_msg_helper_unittest.cc
index 32e8b09c2..92975535 100644
--- a/content/browser/resolve_proxy_msg_helper_unittest.cc
+++ b/content/browser/resolve_proxy_msg_helper_unittest.cc
@@ -21,11 +21,18 @@
 
 class TestResolveProxyMsgHelper : public ResolveProxyMsgHelper {
  public:
-  explicit TestResolveProxyMsgHelper(IPC::Listener* listener)
+  // Incoming ProxyLookupClientPtrs are written to |proxy_lookup_client|.
+  explicit TestResolveProxyMsgHelper(
+      IPC::Listener* listener,
+      network::mojom::ProxyLookupClientPtr* proxy_lookup_client)
       : ResolveProxyMsgHelper(0 /* renderer_process_host_id */),
-        listener_(listener) {}
+        listener_(listener),
+        proxy_lookup_client_(proxy_lookup_client) {}
 
   bool Send(IPC::Message* message) override {
+    // Shouldn't be calling Send() if there are no live references to |this|.
+    EXPECT_TRUE(HasAtLeastOneRef());
+
     listener_->OnMessageReceived(*message);
     delete message;
     return true;
@@ -35,21 +42,16 @@
       const GURL& url,
       network::mojom::ProxyLookupClientPtr proxy_lookup_client) override {
     // Only one request should be send at a time.
-    EXPECT_FALSE(proxy_lookup_client_);
+    EXPECT_FALSE(*proxy_lookup_client_);
 
     if (fail_to_send_request_)
       return false;
 
     pending_url_ = url;
-    proxy_lookup_client_ = std::move(proxy_lookup_client);
+    *proxy_lookup_client_ = std::move(proxy_lookup_client);
     return true;
   }
 
-  network::mojom::ProxyLookupClientPtr ClaimProxyLookupClient() {
-    EXPECT_TRUE(proxy_lookup_client_);
-    return std::move(proxy_lookup_client_);
-  }
-
   const GURL& pending_url() const { return pending_url_; }
 
   void set_fail_to_send_request(bool fail_to_send_request) {
@@ -63,7 +65,7 @@
 
   bool fail_to_send_request_ = false;
 
-  network::mojom::ProxyLookupClientPtr proxy_lookup_client_;
+  network::mojom::ProxyLookupClientPtr* proxy_lookup_client_;
   GURL pending_url_;
 
   DISALLOW_COPY_AND_ASSIGN(TestResolveProxyMsgHelper);
@@ -82,7 +84,9 @@
   };
 
   ResolveProxyMsgHelperTest()
-      : helper_(base::MakeRefCounted<TestResolveProxyMsgHelper>(this)) {
+      : helper_(base::MakeRefCounted<TestResolveProxyMsgHelper>(
+            this,
+            &proxy_lookup_client_)) {
     test_sink_.AddFilter(this);
   }
 
@@ -115,6 +119,8 @@
   scoped_refptr<TestResolveProxyMsgHelper> helper_;
   std::unique_ptr<PendingResult> pending_result_;
 
+  network::mojom::ProxyLookupClientPtr proxy_lookup_client_;
+
   IPC::TestSink test_sink_;
 };
 
@@ -136,12 +142,11 @@
 
   // There should be a pending proxy lookup request. Respond to it.
   EXPECT_EQ(url1, helper_->pending_url());
-  network::mojom::ProxyLookupClientPtr proxy_lookup_client =
-      helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
+  ASSERT_TRUE(proxy_lookup_client_);
   net::ProxyInfo proxy_info;
   proxy_info.UseNamedProxy("result1:80");
-  proxy_lookup_client->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_.reset();
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -152,10 +157,10 @@
   helper_->OnResolveProxy(url2, msg2);
 
   EXPECT_EQ(url2, helper_->pending_url());
-  proxy_lookup_client = helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
+  ASSERT_TRUE(proxy_lookup_client_);
   proxy_info.UseNamedProxy("result2:80");
-  proxy_lookup_client->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_.reset();
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -166,10 +171,9 @@
   helper_->OnResolveProxy(url3, msg3);
 
   EXPECT_EQ(url3, helper_->pending_url());
-  proxy_lookup_client = helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
+  ASSERT_TRUE(proxy_lookup_client_);
   proxy_info.UseNamedProxy("result3:80");
-  proxy_lookup_client->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -196,12 +200,11 @@
 
   // Complete first request.
   EXPECT_EQ(url1, helper_->pending_url());
-  network::mojom::ProxyLookupClientPtr proxy_lookup_client =
-      helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
+  ASSERT_TRUE(proxy_lookup_client_);
   net::ProxyInfo proxy_info;
   proxy_info.UseNamedProxy("result1:80");
-  proxy_lookup_client->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_.reset();
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -211,10 +214,10 @@
 
   // Complete second request.
   EXPECT_EQ(url2, helper_->pending_url());
-  proxy_lookup_client = helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
+  ASSERT_TRUE(proxy_lookup_client_);
   proxy_info.UseNamedProxy("result2:80");
-  proxy_lookup_client->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_.reset();
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -224,10 +227,9 @@
 
   // Complete third request.
   EXPECT_EQ(url3, helper_->pending_url());
-  proxy_lookup_client = helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
+  ASSERT_TRUE(proxy_lookup_client_);
   proxy_info.UseNamedProxy("result3:80");
-  proxy_lookup_client->OnProxyLookupComplete(proxy_info);
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -236,7 +238,7 @@
   clear_pending_result();
 }
 
-// Delete the helper while a request is in progress, and others are pending.
+// Delete the helper while a request is in progress and others are pending.
 TEST_F(ResolveProxyMsgHelperTest, CancelPendingRequests) {
   GURL url1("http://www.google1.com/");
   GURL url2("http://www.google2.com/");
@@ -256,19 +258,27 @@
 
   // Check the first request is pending.
   EXPECT_EQ(url1, helper_->pending_url());
-  network::mojom::ProxyLookupClientPtr proxy_lookup_client =
-      helper_->ClaimProxyLookupClient();
-  base::RunLoop run_loop;
-  proxy_lookup_client.set_connection_error_handler(run_loop.QuitClosure());
+  ASSERT_TRUE(proxy_lookup_client_);
 
-  // Delete the underlying ResolveProxyMsgHelper -- this should cancel all
-  // the requests which are outstanding.
+  // Release a reference. The |helper_| will not be deleted, since there's a
+  // pending resolution.
   helper_ = nullptr;
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(proxy_lookup_client_.is_bound());
+  EXPECT_FALSE(proxy_lookup_client_.encountered_error());
 
-  // The pending request sent to the proxy resolver should have been cancelled.
-  run_loop.Run();
+  // Send Mojo message on the pipe.
+  net::ProxyInfo proxy_info;
+  proxy_info.UseNamedProxy("result1:80");
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
 
-  EXPECT_TRUE(pending_result() == nullptr);
+  // Spinning the message loop results in the helper being destroyed and closing
+  // the pipe.
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(!proxy_lookup_client_.is_bound() ||
+              proxy_lookup_client_.encountered_error());
+  // The result should not have been sent.
+  EXPECT_FALSE(pending_result());
 
   // It should also be the case that msg1, msg2, msg3 were deleted by the
   // cancellation. (Else will show up as a leak).
@@ -285,10 +295,8 @@
 
   // There should be a pending proxy lookup request. Respond to it.
   EXPECT_EQ(url, helper_->pending_url());
-  network::mojom::ProxyLookupClientPtr proxy_lookup_client =
-      helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
-  proxy_lookup_client->OnProxyLookupComplete(base::nullopt);
+  ASSERT_TRUE(proxy_lookup_client_);
+  proxy_lookup_client_->OnProxyLookupComplete(base::nullopt);
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -309,10 +317,8 @@
   // There should be a pending proxy lookup request. Respond to it by closing
   // the pipe.
   EXPECT_EQ(url, helper_->pending_url());
-  network::mojom::ProxyLookupClientPtr proxy_lookup_client =
-      helper_->ClaimProxyLookupClient();
-  ASSERT_TRUE(proxy_lookup_client);
-  proxy_lookup_client.reset();
+  ASSERT_TRUE(proxy_lookup_client_);
+  proxy_lookup_client_.reset();
   base::RunLoop().RunUntilIdle();
 
   // Check result.
@@ -340,4 +346,40 @@
   clear_pending_result();
 }
 
+// Make sure if mojo callback is invoked after last externally owned reference
+// is released, there is no crash.
+// Regression test for https://crbug.com/870675
+TEST_F(ResolveProxyMsgHelperTest, Lifetime) {
+  GURL url("http://www.google1.com/");
+
+  // Messages are deleted by the sink.
+  IPC::Message* msg = GenerateReply();
+
+  helper_->OnResolveProxy(url, msg);
+
+  // There should be a pending proxy lookup request. Respond to it.
+  EXPECT_EQ(url, helper_->pending_url());
+  ASSERT_TRUE(proxy_lookup_client_);
+
+  // Release the |helper_| pointer. The object should keep a reference to
+  // itself, so should not be deleted.
+  helper_ = nullptr;
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(proxy_lookup_client_.is_bound());
+  EXPECT_FALSE(proxy_lookup_client_.encountered_error());
+
+  // Send Mojo message on the pipe.
+  net::ProxyInfo proxy_info;
+  proxy_info.UseNamedProxy("result1:80");
+  proxy_lookup_client_->OnProxyLookupComplete(proxy_info);
+
+  // Spinning the message loop results in the helper being destroyed and closing
+  // the pipe.
+  base::RunLoop().RunUntilIdle();
+  EXPECT_TRUE(!proxy_lookup_client_.is_bound() ||
+              proxy_lookup_client_.encountered_error());
+  // The result should not have been sent.
+  EXPECT_FALSE(pending_result());
+}
+
 }  // namespace content
diff --git a/content/browser/service_manager/common_browser_interfaces.cc b/content/browser/service_manager/common_browser_interfaces.cc
index 2626d61..68e21694 100644
--- a/content/browser/service_manager/common_browser_interfaces.cc
+++ b/content/browser/service_manager/common_browser_interfaces.cc
@@ -11,7 +11,7 @@
 #include "base/callback.h"
 #include "base/command_line.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "build/build_config.h"
 #include "components/discardable_memory/service/discardable_shared_memory_manager.h"
diff --git a/content/browser/service_manager/service_manager_context.cc b/content/browser/service_manager/service_manager_context.cc
index 8cf854c..9a1a106 100644
--- a/content/browser/service_manager/service_manager_context.cc
+++ b/content/browser/service_manager/service_manager_context.cc
@@ -23,7 +23,7 @@
 #include "base/process/process_handle.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "content/app/strings/grit/content_strings.h"
 #include "content/browser/browser_main_loop.h"
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index 8d58f4b6..038247a 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -35,6 +35,7 @@
 #include "storage/common/blob_storage/blob_handle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/service_worker/service_worker_utils.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 
 namespace content {
@@ -42,20 +43,13 @@
 namespace {
 
 void OnFetchEventCommon(
-    mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     mojom::ServiceWorker::DispatchFetchEventCallback finish_callback) {
-  response_callback->OnResponse(
-      ServiceWorkerResponse(
-          std::make_unique<std::vector<GURL>>(), 200, "OK",
-          network::mojom::FetchResponseType::kDefault,
-          std::make_unique<ServiceWorkerHeaderMap>(), std::string(), 0,
-          nullptr /* blob */,
-          blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-          false /* is_in_cache_storage */,
-          std::string() /* cache_storage_cache_name */,
-          std::make_unique<
-              ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-      base::Time::Now());
+  auto response = blink::mojom::FetchAPIResponse::New();
+  response->status_code = 200;
+  response->status_text = "OK";
+  response->response_type = network::mojom::FetchResponseType::kDefault;
+  response_callback->OnResponse(std::move(response), base::Time::Now());
   std::move(finish_callback)
       .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
            base::Time::Now());
@@ -272,7 +266,7 @@
 
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback) override {
     if (!helper_)
       return;
@@ -651,7 +645,7 @@
     int /* embedded_worker_id */,
     const network::ResourceRequest& /* request */,
     blink::mojom::FetchEventPreloadHandlePtr /* preload_handle */,
-    mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     mojom::ServiceWorker::DispatchFetchEventCallback finish_callback) {
   // TODO(falken): In-line common into here.
   OnFetchEventCommon(std::move(response_callback), std::move(finish_callback));
@@ -943,7 +937,7 @@
     int embedded_worker_id,
     const network::ResourceRequest& request,
     blink::mojom::FetchEventPreloadHandlePtr preload_handle,
-    mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     mojom::ServiceWorker::DispatchFetchEventCallback finish_callback) {
   base::ThreadTaskRunnerHandle::Get()->PostTask(
       FROM_HERE,
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h
index 79235c59..f8d5017 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -198,7 +198,7 @@
       int embedded_worker_id,
       const network::ResourceRequest& request,
       blink::mojom::FetchEventPreloadHandlePtr preload_handle,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback);
   virtual void OnNotificationClickEvent(
       const std::string& notification_id,
@@ -298,7 +298,7 @@
       int embedded_worker_id,
       const network::ResourceRequest& request,
       blink::mojom::FetchEventPreloadHandlePtr preload_handle,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback);
   void OnNotificationClickEventStub(
       const std::string& notification_id,
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index 802d751..87abaf7 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -22,8 +22,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -105,7 +105,7 @@
 struct FetchResult {
   blink::ServiceWorkerStatusCode status;
   ServiceWorkerFetchDispatcher::FetchEventResult result;
-  ServiceWorkerResponse response;
+  blink::mojom::FetchAPIResponsePtr response;
   std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
 };
 
@@ -200,6 +200,7 @@
   }
   // ServiceWorkerContextCoreObserver overrides.
   void OnVersionStateChanged(int64_t version_id,
+                             const GURL& scope,
                              ServiceWorkerVersion::Status) override {
     ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
     const ServiceWorkerVersion* version = context_->GetLiveVersion(version_id);
@@ -611,7 +612,7 @@
 
   void FetchOnRegisteredWorker(
       ServiceWorkerFetchDispatcher::FetchEventResult* result,
-      ServiceWorkerResponse* response,
+      blink::mojom::FetchAPIResponsePtr* response,
       std::unique_ptr<storage::BlobDataHandle>* blob_data_handle) {
     blob_context_ = ChromeBlobStorageContext::GetFor(
         shell()->web_contents()->GetBrowserContext());
@@ -627,7 +628,7 @@
     fetch_run_loop.Run();
     ASSERT_TRUE(prepare_result);
     *result = fetch_result.result;
-    *response = fetch_result.response;
+    *response = std::move(fetch_result.response);
     *blob_data_handle = std::move(fetch_result.blob_data_handle);
     ASSERT_EQ(blink::ServiceWorkerStatusCode::kOk, fetch_result.status);
   }
@@ -962,20 +963,20 @@
       FetchResult* out_result,
       blink::ServiceWorkerStatusCode actual_status,
       ServiceWorkerFetchDispatcher::FetchEventResult actual_result,
-      const ServiceWorkerResponse& actual_response,
+      blink::mojom::FetchAPIResponsePtr actual_response,
       blink::mojom::ServiceWorkerStreamHandlePtr /* stream */,
-      blink::mojom::BlobPtr /* blob */,
       scoped_refptr<ServiceWorkerVersion> worker) {
     ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::IO));
     ASSERT_TRUE(fetch_dispatcher_);
     fetch_dispatcher_.reset();
     out_result->status = actual_status;
     out_result->result = actual_result;
-    out_result->response = actual_response;
-    if (!actual_response.blob_uuid.empty()) {
+    out_result->response = std::move(actual_response);
+    if (out_result->response->blob) {
+      DCHECK(!out_result->response->blob->uuid.empty());
       out_result->blob_data_handle =
           blob_context->context()->GetBlobDataFromUUID(
-              actual_response.blob_uuid);
+              out_result->response->blob->uuid);
     }
     if (!quit.is_null())
       BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, quit);
@@ -1346,7 +1347,7 @@
 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest, FetchEvent_Response) {
   StartServerAndNavigateToSetup();
   ServiceWorkerFetchDispatcher::FetchEventResult result;
-  ServiceWorkerResponse response;
+  blink::mojom::FetchAPIResponsePtr response;
   std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
   InstallTestHelper("/service_worker/fetch_event.js",
                     blink::ServiceWorkerStatusCode::kOk);
@@ -1356,12 +1357,12 @@
   FetchOnRegisteredWorker(&result, &response, &blob_data_handle);
   ASSERT_EQ(ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse,
             result);
-  EXPECT_EQ(301, response.status_code);
-  EXPECT_EQ("Moved Permanently", response.status_text);
-  ServiceWorkerHeaderMap expected_headers;
+  EXPECT_EQ(301, response->status_code);
+  EXPECT_EQ("Moved Permanently", response->status_text);
+  base::flat_map<std::string, std::string> expected_headers;
   expected_headers["content-language"] = "fi";
   expected_headers["content-type"] = "text/html; charset=UTF-8";
-  EXPECT_EQ(expected_headers, response.headers);
+  EXPECT_EQ(expected_headers, response->headers);
 
   std::string body;
   RunOnIOThread(base::BindOnce(&ReadResponseBody, &body,
@@ -1373,8 +1374,8 @@
                        FetchEvent_ResponseViaCache) {
   StartServerAndNavigateToSetup();
   ServiceWorkerFetchDispatcher::FetchEventResult result;
-  ServiceWorkerResponse response1;
-  ServiceWorkerResponse response2;
+  blink::mojom::FetchAPIResponsePtr response1;
+  blink::mojom::FetchAPIResponsePtr response2;
   std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
   const base::Time start_time(base::Time::Now());
   InstallTestHelper("/service_worker/fetch_event_response_via_cache.js",
@@ -1385,27 +1386,29 @@
   FetchOnRegisteredWorker(&result, &response1, &blob_data_handle);
   ASSERT_EQ(ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse,
             result);
-  EXPECT_EQ(200, response1.status_code);
-  EXPECT_EQ("OK", response1.status_text);
-  EXPECT_TRUE(response1.response_time >= start_time);
-  EXPECT_FALSE(response1.is_in_cache_storage);
-  EXPECT_EQ(std::string(), response2.cache_storage_cache_name);
+  EXPECT_EQ(200, response1->status_code);
+  EXPECT_EQ("OK", response1->status_text);
+  EXPECT_TRUE(response1->response_time >= start_time);
+  EXPECT_FALSE(response1->is_in_cache_storage);
+  ASSERT_TRUE(response1->cache_storage_cache_name);
+  EXPECT_EQ(std::string(), *response1->cache_storage_cache_name);
 
   FetchOnRegisteredWorker(&result, &response2, &blob_data_handle);
   ASSERT_EQ(ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse,
             result);
-  EXPECT_EQ(200, response2.status_code);
-  EXPECT_EQ("OK", response2.status_text);
-  EXPECT_EQ(response1.response_time, response2.response_time);
-  EXPECT_TRUE(response2.is_in_cache_storage);
-  EXPECT_EQ("cache_name", response2.cache_storage_cache_name);
+  EXPECT_EQ(200, response2->status_code);
+  EXPECT_EQ("OK", response2->status_text);
+  EXPECT_EQ(response1->response_time, response2->response_time);
+  EXPECT_TRUE(response2->is_in_cache_storage);
+  ASSERT_TRUE(response2->cache_storage_cache_name);
+  EXPECT_EQ("cache_name", *response2->cache_storage_cache_name);
 }
 
 IN_PROC_BROWSER_TEST_F(ServiceWorkerVersionBrowserTest,
                        FetchEvent_respondWithRejection) {
   StartServerAndNavigateToSetup();
   ServiceWorkerFetchDispatcher::FetchEventResult result;
-  ServiceWorkerResponse response;
+  blink::mojom::FetchAPIResponsePtr response;
   std::unique_ptr<storage::BlobDataHandle> blob_data_handle;
   InstallTestHelper("/service_worker/fetch_event_rejected.js",
                     blink::ServiceWorkerStatusCode::kOk);
@@ -1432,7 +1435,7 @@
 
   ASSERT_EQ(ServiceWorkerFetchDispatcher::FetchEventResult::kGotResponse,
             result);
-  EXPECT_EQ(0, response.status_code);
+  EXPECT_EQ(0, response->status_code);
 
   ASSERT_FALSE(blob_data_handle);
 }
diff --git a/content/browser/service_worker/service_worker_context_core.cc b/content/browser/service_worker/service_worker_context_core.cc
index 8e6f44af..bbbd1c80 100644
--- a/content/browser/service_worker/service_worker_context_core.cc
+++ b/content/browser/service_worker/service_worker_context_core.cc
@@ -749,7 +749,7 @@
     ServiceWorkerVersion* version) {
   observer_list_->Notify(
       FROM_HERE, &ServiceWorkerContextCoreObserver::OnVersionStateChanged,
-      version->version_id(), version->status());
+      version->version_id(), version->scope(), version->status());
 }
 
 void ServiceWorkerContextCore::OnDevToolsRoutingIdChanged(
@@ -807,9 +807,9 @@
     ServiceWorkerVersion* version,
     const std::string& client_uuid,
     const ServiceWorkerClientInfo& client_info) {
-  observer_list_->Notify(FROM_HERE,
-                         &ServiceWorkerContextCoreObserver::OnControlleeAdded,
-                         version->version_id(), client_uuid, client_info);
+  observer_list_->Notify(
+      FROM_HERE, &ServiceWorkerContextCoreObserver::OnControlleeAdded,
+      version->version_id(), version->scope(), client_uuid, client_info);
 }
 
 void ServiceWorkerContextCore::OnControlleeRemoved(
@@ -817,7 +817,13 @@
     const std::string& client_uuid) {
   observer_list_->Notify(FROM_HERE,
                          &ServiceWorkerContextCoreObserver::OnControlleeRemoved,
-                         version->version_id(), client_uuid);
+                         version->version_id(), version->scope(), client_uuid);
+}
+
+void ServiceWorkerContextCore::OnNoControllees(ServiceWorkerVersion* version) {
+  observer_list_->Notify(FROM_HERE,
+                         &ServiceWorkerContextCoreObserver::OnNoControllees,
+                         version->version_id(), version->scope());
 }
 
 ServiceWorkerProcessManager* ServiceWorkerContextCore::process_manager() {
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 9a299aa..49ada02 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -152,6 +152,7 @@
                          const ServiceWorkerClientInfo& client_info) override;
   void OnControlleeRemoved(ServiceWorkerVersion* version,
                            const std::string& client_uuid) override;
+  void OnNoControllees(ServiceWorkerVersion* version) override;
 
   ServiceWorkerContextWrapper* wrapper() const { return wrapper_; }
   ServiceWorkerStorage* storage() { return storage_.get(); }
diff --git a/content/browser/service_worker/service_worker_context_core_observer.h b/content/browser/service_worker/service_worker_context_core_observer.h
index 0787d0e..cc4a5d6 100644
--- a/content/browser/service_worker/service_worker_context_core_observer.h
+++ b/content/browser/service_worker/service_worker_context_core_observer.h
@@ -64,6 +64,7 @@
   virtual void OnRunningStateChanged(int64_t version_id,
                                      EmbeddedWorkerStatus running_status) {}
   virtual void OnVersionStateChanged(int64_t version_id,
+                                     const GURL& scope,
                                      ServiceWorkerVersion::Status status) {}
   virtual void OnVersionDevToolsRoutingIdChanged(int64_t version_id,
                                                  int process_id,
@@ -76,10 +77,13 @@
   virtual void OnReportConsoleMessage(int64_t version_id,
                                       const ConsoleMessage& message) {}
   virtual void OnControlleeAdded(int64_t version_id,
+                                 const GURL& scope,
                                  const std::string& uuid,
                                  const ServiceWorkerClientInfo& info) {}
   virtual void OnControlleeRemoved(int64_t version_id,
+                                   const GURL& scope,
                                    const std::string& uuid) {}
+  virtual void OnNoControllees(int64_t version_id, const GURL& scope) {}
   // Called when the ServiceWorkerContainer.register() promise is resolved.
   //
   // This is called before the service worker registration is persisted to
diff --git a/content/browser/service_worker/service_worker_context_unittest.cc b/content/browser/service_worker/service_worker_context_unittest.cc
index f7c9293..17018481 100644
--- a/content/browser/service_worker/service_worker_context_unittest.cc
+++ b/content/browser/service_worker/service_worker_context_unittest.cc
@@ -21,6 +21,7 @@
 #include "content/browser/service_worker/service_worker_test_utils.h"
 #include "content/browser/service_worker/service_worker_version.h"
 #include "content/common/service_worker/service_worker_messages.h"
+#include "content/public/browser/service_worker_context_observer.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/public/test/test_utils.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -169,6 +170,9 @@
   }
 
   ServiceWorkerContextCore* context() { return helper_->context(); }
+  ServiceWorkerContextWrapper* context_wrapper() {
+    return helper_->context_wrapper();
+  }
 
  protected:
   TestBrowserThreadBundle browser_thread_bundle_;
@@ -205,6 +209,182 @@
   DISALLOW_COPY_AND_ASSIGN(RecordableEmbeddedWorkerInstanceClient);
 };
 
+class TestServiceWorkerContextObserver : public ServiceWorkerContextObserver {
+ public:
+  enum class EventType {
+    RegistrationCompleted,
+    VersionActivated,
+    VersionRedundant,
+    NoControllees
+  };
+  struct EventLog {
+    EventType type;
+    base::Optional<GURL> url;
+    base::Optional<int64_t> version_id;
+  };
+
+  explicit TestServiceWorkerContextObserver(ServiceWorkerContext* context)
+      : context_(context) {
+    context_->AddObserver(this);
+  };
+
+  ~TestServiceWorkerContextObserver() override {
+    context_->RemoveObserver(this);
+  }
+
+  void OnRegistrationCompleted(const GURL& scope) override {
+    EventLog log;
+    log.type = EventType::RegistrationCompleted;
+    log.url = scope;
+    events_.push_back(log);
+  }
+
+  void OnVersionActivated(int64_t version_id, const GURL& scope) override {
+    EventLog log;
+    log.type = EventType::VersionActivated;
+    log.version_id = version_id;
+    log.url = scope;
+    events_.push_back(log);
+  }
+
+  void OnVersionRedundant(int64_t version_id, const GURL& scope) override {
+    EventLog log;
+    log.type = EventType::VersionRedundant;
+    log.version_id = version_id;
+    log.url = scope;
+    events_.push_back(log);
+  }
+
+  void OnNoControllees(int64_t version_id, const GURL& scope) override {
+    EventLog log;
+    log.type = EventType::NoControllees;
+    log.version_id = version_id;
+    log.url = scope;
+    events_.push_back(log);
+  }
+
+  const std::vector<EventLog>& events() { return events_; }
+
+ private:
+  ServiceWorkerContext* context_;
+  std::vector<EventLog> events_;
+  DISALLOW_COPY_AND_ASSIGN(TestServiceWorkerContextObserver);
+};
+
+// Make sure OnRegistrationCompleted is called on observer.
+TEST_F(ServiceWorkerContextTest, RegistrationCompletedObserver) {
+  GURL pattern("https://www.example.com/");
+  GURL script_url("https://www.example.com/service_worker.js");
+  blink::mojom::ServiceWorkerRegistrationOptions options;
+  options.scope = pattern;
+
+  TestServiceWorkerContextObserver observer(context_wrapper());
+
+  int64_t registration_id = blink::mojom::kInvalidServiceWorkerRegistrationId;
+  bool called = false;
+  context()->RegisterServiceWorker(
+      script_url, options, MakeRegisteredCallback(&called, &registration_id));
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_TRUE(called);
+  EXPECT_NE(blink::mojom::kInvalidServiceWorkerRegistrationId, registration_id);
+  ASSERT_EQ(2u, observer.events().size());
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::RegistrationCompleted,
+            observer.events()[0].type);
+  EXPECT_EQ(pattern, observer.events()[0].url);
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionActivated,
+            observer.events()[1].type);
+  EXPECT_EQ(pattern, observer.events()[1].url);
+}
+
+// Make sure OnNoControllees is called on observer.
+TEST_F(ServiceWorkerContextTest, NoControlleesObserver) {
+  GURL pattern("https://www.example.com/");
+  GURL script_url("https://www.example.com/service_worker.js");
+  blink::mojom::ServiceWorkerRegistrationOptions options;
+  options.scope = pattern;
+
+  auto registration = base::MakeRefCounted<ServiceWorkerRegistration>(
+      options, 1l /* dummy registration id */, context()->AsWeakPtr());
+
+  auto version = base::MakeRefCounted<ServiceWorkerVersion>(
+      registration.get(), script_url, 2l /* dummy version id */,
+      context()->AsWeakPtr());
+
+  ServiceWorkerRemoteProviderEndpoint endpoint;
+  std::unique_ptr<ServiceWorkerProviderHost> host =
+      CreateProviderHostForWindow(helper_->mock_render_process_id(), 1, true,
+                                  context()->AsWeakPtr(), &endpoint);
+
+  version->AddControllee(host.get());
+  base::RunLoop().RunUntilIdle();
+
+  TestServiceWorkerContextObserver observer(context_wrapper());
+
+  version->RemoveControllee(host->client_uuid());
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_EQ(1u, observer.events().size());
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::NoControllees,
+            observer.events()[0].type);
+  EXPECT_EQ(pattern, observer.events()[0].url);
+  EXPECT_EQ(2l, observer.events()[0].version_id);
+}
+
+// Make sure OnVersionActivated is called on observer.
+TEST_F(ServiceWorkerContextTest, VersionActivatedObserver) {
+  GURL pattern("https://www.example.com/");
+  GURL script_url("https://www.example.com/service_worker.js");
+  blink::mojom::ServiceWorkerRegistrationOptions options;
+  options.scope = pattern;
+
+  auto registration = base::MakeRefCounted<ServiceWorkerRegistration>(
+      options, 1l /* dummy registration id */, context()->AsWeakPtr());
+
+  auto version = base::MakeRefCounted<ServiceWorkerVersion>(
+      registration.get(), script_url, 2l /* dummy version id */,
+      context()->AsWeakPtr());
+
+  TestServiceWorkerContextObserver observer(context_wrapper());
+
+  version->set_fetch_handler_existence(
+      ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+  version->SetStatus(ServiceWorkerVersion::Status::ACTIVATED);
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_EQ(1u, observer.events().size());
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionActivated,
+            observer.events()[0].type);
+  EXPECT_EQ(2l, observer.events()[0].version_id);
+}
+
+// Make sure OnVersionRedundant is called on observer.
+TEST_F(ServiceWorkerContextTest, VersionRedundantObserver) {
+  GURL pattern("https://www.example.com/");
+  GURL script_url("https://www.example.com/service_worker.js");
+  blink::mojom::ServiceWorkerRegistrationOptions options;
+  options.scope = pattern;
+
+  auto registration = base::MakeRefCounted<ServiceWorkerRegistration>(
+      options, 1l /* dummy registration id */, context()->AsWeakPtr());
+
+  auto version = base::MakeRefCounted<ServiceWorkerVersion>(
+      registration.get(), script_url, 2l /* dummy version id */,
+      context()->AsWeakPtr());
+
+  TestServiceWorkerContextObserver observer(context_wrapper());
+
+  version->set_fetch_handler_existence(
+      ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST);
+  version->SetStatus(ServiceWorkerVersion::Status::REDUNDANT);
+  base::RunLoop().RunUntilIdle();
+
+  ASSERT_EQ(1u, observer.events().size());
+  EXPECT_EQ(TestServiceWorkerContextObserver::EventType::VersionRedundant,
+            observer.events()[0].type);
+  EXPECT_EQ(2l, observer.events()[0].version_id);
+}
+
 // Make sure basic registration is working.
 TEST_F(ServiceWorkerContextTest, Register) {
   GURL pattern("https://www.example.com/");
diff --git a/content/browser/service_worker/service_worker_context_watcher.cc b/content/browser/service_worker/service_worker_context_watcher.cc
index 5bb4c8f5..9325503 100644
--- a/content/browser/service_worker/service_worker_context_watcher.cc
+++ b/content/browser/service_worker/service_worker_context_watcher.cc
@@ -248,6 +248,7 @@
 
 void ServiceWorkerContextWatcher::OnVersionStateChanged(
     int64_t version_id,
+    const GURL& scope,
     content::ServiceWorkerVersion::Status status) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   auto it = version_info_map_.find(version_id);
@@ -332,6 +333,7 @@
 
 void ServiceWorkerContextWatcher::OnControlleeAdded(
     int64_t version_id,
+    const GURL& scope,
     const std::string& uuid,
     const ServiceWorkerClientInfo& info) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -344,6 +346,7 @@
 }
 
 void ServiceWorkerContextWatcher::OnControlleeRemoved(int64_t version_id,
+                                                      const GURL& scope,
                                                       const std::string& uuid) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   auto it = version_info_map_.find(version_id);
diff --git a/content/browser/service_worker/service_worker_context_watcher.h b/content/browser/service_worker/service_worker_context_watcher.h
index 1eb56b7..3d3e20c 100644
--- a/content/browser/service_worker/service_worker_context_watcher.h
+++ b/content/browser/service_worker/service_worker_context_watcher.h
@@ -89,6 +89,7 @@
       content::EmbeddedWorkerStatus running_status) override;
   void OnVersionStateChanged(
       int64_t version_id,
+      const GURL& scope,
       content::ServiceWorkerVersion::Status status) override;
   void OnVersionDevToolsRoutingIdChanged(int64_t version_id,
                                          int process_id,
@@ -102,9 +103,11 @@
   void OnReportConsoleMessage(int64_t version_id,
                               const ConsoleMessage& message) override;
   void OnControlleeAdded(int64_t version_id,
+                         const GURL& scope,
                          const std::string& uuid,
                          const ServiceWorkerClientInfo& info) override;
   void OnControlleeRemoved(int64_t version_id,
+                           const GURL& scope,
                            const std::string& uuid) override;
   void OnRegistrationCompleted(int64_t registration_id,
                                const GURL& pattern) override;
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc
index a33ab07..0e08a0f 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.cc
+++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -17,7 +17,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/service_worker_process_manager.h"
@@ -262,6 +262,25 @@
     observer.OnRegistrationCompleted(pattern);
 }
 
+void ServiceWorkerContextWrapper::OnNoControllees(int64_t version_id,
+                                                  const GURL& scope) {
+  for (auto& observer : observer_list_)
+    observer.OnNoControllees(version_id, scope);
+}
+
+void ServiceWorkerContextWrapper::OnVersionStateChanged(
+    int64_t version_id,
+    const GURL& scope,
+    ServiceWorkerVersion::Status status) {
+  if (status == ServiceWorkerVersion::Status::ACTIVATED) {
+    for (auto& observer : observer_list_)
+      observer.OnVersionActivated(version_id, scope);
+  } else if (status == ServiceWorkerVersion::Status::REDUNDANT) {
+    for (auto& observer : observer_list_)
+      observer.OnVersionRedundant(version_id, scope);
+  }
+}
+
 void ServiceWorkerContextWrapper::AddObserver(
     ServiceWorkerContextObserver* observer) {
   observer_list_.AddObserver(observer);
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index f1b9b94c..f99033af 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -101,6 +101,10 @@
   // ServiceWorkerContextCoreObserver implementation:
   void OnRegistrationCompleted(int64_t registration_id,
                                const GURL& pattern) override;
+  void OnNoControllees(int64_t version_id, const GURL& scope) override;
+  void OnVersionStateChanged(int64_t version_id,
+                             const GURL& scope,
+                             ServiceWorkerVersion::Status status) override;
 
   // ServiceWorkerContext implementation:
   void AddObserver(ServiceWorkerContextObserver* observer) override;
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc
index 53142dc..e11e8052 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.cc
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc
@@ -106,6 +106,36 @@
   DISALLOW_COPY_AND_ASSIGN(ScopedDisallowSetControllerRegistration);
 };
 
+class ServiceWorkerControlleeRequestHandler::MainResourceRequestTracker {
+ public:
+  MainResourceRequestTracker() = default;
+
+  ~MainResourceRequestTracker() {
+    if (recorded_destination_)
+      return;
+    RecordDestination(
+        will_dispatch_fetch_
+            ? ServiceWorkerMetrics::MainResourceRequestDestination::
+                  kAbortedWhileDispatchingFetchEvent
+            : ServiceWorkerMetrics::MainResourceRequestDestination::
+                  kAbortedWithoutDispatchingFetchEvent);
+  }
+
+  void RecordDestination(
+      ServiceWorkerMetrics::MainResourceRequestDestination destination) {
+    CHECK(!recorded_destination_);
+    recorded_destination_ = true;
+    ServiceWorkerMetrics::RecordMainResourceRequestDestination(destination);
+  }
+
+  void WillDispatchFetchEvent() { will_dispatch_fetch_ = true; }
+
+ private:
+  bool recorded_destination_ = false;
+  bool will_dispatch_fetch_ = false;
+  DISALLOW_COPY_AND_ASSIGN(MainResourceRequestTracker);
+};
+
 ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler(
     base::WeakPtr<ServiceWorkerContextCore> context,
     base::WeakPtr<ServiceWorkerProviderHost> provider_host,
@@ -333,6 +363,8 @@
   DCHECK(!JobWasCanceled());
   DCHECK(context_);
   DCHECK(provider_host_);
+  tracker_ = std::make_unique<MainResourceRequestTracker>();
+
   TRACE_EVENT_ASYNC_BEGIN1(
       "ServiceWorker",
       "ServiceWorkerControlleeRequestHandler::PrepareForMainResource",
@@ -368,6 +400,9 @@
     return;
 
   if (status != blink::ServiceWorkerStatusCode::kOk) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoRegistration);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -378,6 +413,9 @@
   DCHECK(registration);
 
   if (!provider_host_) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoProvider);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -388,6 +426,9 @@
   provider_host_->AddMatchingRegistration(registration.get());
 
   if (!context_) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoContext);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -399,6 +440,9 @@
   if (!GetContentClient()->browser()->AllowServiceWorker(
           registration->pattern(), provider_host_->topmost_frame_url(),
           resource_context_, provider_host_->web_contents_getter())) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNotAllowed);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -410,6 +454,9 @@
   if (!provider_host_->IsContextSecureForServiceWorker()) {
     // TODO(falken): Figure out a way to surface in the page's DevTools
     // console that the service worker was blocked for security.
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNotSecure);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -441,6 +488,9 @@
   scoped_refptr<ServiceWorkerVersion> active_version =
       registration->active_version();
   if (!active_version) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoActiveVersion);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -481,6 +531,8 @@
   // The job may have been canceled before this was invoked. In that
   // case, |url_job_| can't be used, so return.
   if (JobWasCanceled()) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::kJobWasCancelled);
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
         "ServiceWorkerControlleeRequestHandler::PrepareForMainResource",
@@ -489,6 +541,9 @@
   }
 
   if (!provider_host_) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoProviderAfterContinuing);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END1(
         "ServiceWorker",
@@ -517,6 +572,9 @@
     //      retries.
     //   3) If the provider host does not have an active version, just fail the
     //      load.
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoActiveVersionAfterContinuing);
     url_job_->FallbackToNetwork();
     TRACE_EVENT_ASYNC_END2(
         "ServiceWorker",
@@ -547,6 +605,11 @@
   }
   bool is_forwarded =
       MaybeForwardToServiceWorker(url_job_.get(), active_version.get());
+  if (!is_forwarded) {
+    tracker_->RecordDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kNetworkBecauseNoFetchEventHandler);
+  }
   TRACE_EVENT_ASYNC_END1(
       "ServiceWorker",
       "ServiceWorkerControlleeRequestHandler::PrepareForMainResource",
@@ -681,6 +744,18 @@
   provider_host_->NotifyControllerLost();
 }
 
+void ServiceWorkerControlleeRequestHandler::ReportDestination(
+    ServiceWorkerMetrics::MainResourceRequestDestination destination) {
+  DCHECK(is_main_resource_load_);
+  tracker_->RecordDestination(destination);
+}
+
+void ServiceWorkerControlleeRequestHandler::
+    WillDispatchFetchEventForMainResource() {
+  DCHECK(is_main_resource_load_);
+  tracker_->WillDispatchFetchEvent();
+}
+
 void ServiceWorkerControlleeRequestHandler::ClearJob() {
   url_job_.reset();
 }
diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h
index 86ad401..25251ed 100644
--- a/content/browser/service_worker/service_worker_controllee_request_handler.h
+++ b/content/browser/service_worker/service_worker_controllee_request_handler.h
@@ -96,6 +96,7 @@
   FRIEND_TEST_ALL_PREFIXES(ServiceWorkerControlleeRequestHandlerTest,
                            ActivateWaitingVersion);
   class ScopedDisallowSetControllerRegistration;
+  class MainResourceRequestTracker;
 
   // For main resource case.
   void PrepareForMainResource(const GURL& url, const GURL& site_for_cookies);
@@ -134,6 +135,9 @@
   bool RequestStillValid(
       ServiceWorkerMetrics::URLRequestJobResult* result) override;
   void MainResourceLoadFailed() override;
+  void ReportDestination(ServiceWorkerMetrics::MainResourceRequestDestination
+                             destination) override;
+  void WillDispatchFetchEventForMainResource() override;
 
   // Sets |job_| to nullptr, and clears all extra response info associated with
   // that job, except for timing information.
@@ -165,6 +169,8 @@
   // next intercept opportunity, for main frame requests.
   bool use_network_;
 
+  std::unique_ptr<MainResourceRequestTracker> tracker_;
+
   base::WeakPtrFactory<ServiceWorkerControlleeRequestHandler> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerControlleeRequestHandler);
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index dcc36e82..b0ab486 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -361,11 +361,12 @@
 // ServiceWorkerVersion::StartRequest*(), and held in pending_requests_
 // until FinishRequest() is called.
 class ServiceWorkerFetchDispatcher::ResponseCallback
-    : public mojom::ServiceWorkerFetchResponseCallback {
+    : public blink::mojom::ServiceWorkerFetchResponseCallback {
  public:
-  ResponseCallback(mojom::ServiceWorkerFetchResponseCallbackRequest request,
-                   base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
-                   ServiceWorkerVersion* version)
+  ResponseCallback(
+      blink::mojom::ServiceWorkerFetchResponseCallbackRequest request,
+      base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
+      ServiceWorkerVersion* version)
       : binding_(this, std::move(request)),
         fetch_dispatcher_(fetch_dispatcher),
         version_(version) {}
@@ -377,32 +378,25 @@
     fetch_event_id_ = id;
   }
 
-  // Implements mojom::ServiceWorkerFetchResponseCallback.
-  void OnResponse(const ServiceWorkerResponse& response,
+  // Implements blink::mojom::ServiceWorkerFetchResponseCallback.
+  void OnResponse(blink::mojom::FetchAPIResponsePtr response,
                   base::Time dispatch_event_time) override {
-    HandleResponse(fetch_dispatcher_, version_, fetch_event_id_, response,
-                   nullptr /* body_as_stream */, nullptr /* body_as_blob */,
-                   FetchEventResult::kGotResponse, dispatch_event_time);
-  }
-  void OnResponseBlob(const ServiceWorkerResponse& response,
-                      blink::mojom::BlobPtr body_as_blob,
-                      base::Time dispatch_event_time) override {
-    HandleResponse(fetch_dispatcher_, version_, fetch_event_id_, response,
-                   nullptr /* body_as_stream */, std::move(body_as_blob),
+    HandleResponse(fetch_dispatcher_, version_, fetch_event_id_,
+                   std::move(response), nullptr /* body_as_stream */,
                    FetchEventResult::kGotResponse, dispatch_event_time);
   }
   void OnResponseStream(
-      const ServiceWorkerResponse& response,
+      blink::mojom::FetchAPIResponsePtr response,
       blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
       base::Time dispatch_event_time) override {
-    HandleResponse(fetch_dispatcher_, version_, fetch_event_id_, response,
-                   std::move(body_as_stream), nullptr /* body_as_blob */,
+    HandleResponse(fetch_dispatcher_, version_, fetch_event_id_,
+                   std::move(response), std::move(body_as_stream),
                    FetchEventResult::kGotResponse, dispatch_event_time);
   }
   void OnFallback(base::Time dispatch_event_time) override {
     HandleResponse(fetch_dispatcher_, version_, fetch_event_id_,
-                   ServiceWorkerResponse(), nullptr /* body_as_stream */,
-                   nullptr /* body_as_blob */,
+                   blink::mojom::FetchAPIResponse::New(),
+                   nullptr /* body_as_stream */,
                    FetchEventResult::kShouldFallback, dispatch_event_time);
   }
 
@@ -413,9 +407,8 @@
       base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher,
       ServiceWorkerVersion* version,
       base::Optional<int> fetch_event_id,
-      const ServiceWorkerResponse& response,
+      blink::mojom::FetchAPIResponsePtr response,
       blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-      blink::mojom::BlobPtr body_as_blob,
       FetchEventResult fetch_result,
       base::Time dispatch_event_time) {
     if (!version->FinishRequest(fetch_event_id.value(),
@@ -425,12 +418,11 @@
     // |fetch_dispatcher| is null if the URLRequest was killed.
     if (!fetch_dispatcher)
       return;
-    fetch_dispatcher->DidFinish(fetch_event_id.value(), fetch_result, response,
-                                std::move(body_as_stream),
-                                std::move(body_as_blob));
+    fetch_dispatcher->DidFinish(fetch_event_id.value(), fetch_result,
+                                std::move(response), std::move(body_as_stream));
   }
 
-  mojo::Binding<mojom::ServiceWorkerFetchResponseCallback> binding_;
+  mojo::Binding<blink::mojom::ServiceWorkerFetchResponseCallback> binding_;
   base::WeakPtr<ServiceWorkerFetchDispatcher> fetch_dispatcher_;
   // Owns |this| via pending_requests_.
   ServiceWorkerVersion* version_;
@@ -575,7 +567,7 @@
   net_log_.BeginEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT);
 
   // Set up for receiving the response.
-  mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr;
+  blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr;
   auto response_callback = std::make_unique<ResponseCallback>(
       mojo::MakeRequest(&response_callback_ptr), weak_factory_.GetWeakPtr(),
       version_.get());
@@ -629,27 +621,25 @@
 void ServiceWorkerFetchDispatcher::DidFail(
     blink::ServiceWorkerStatusCode status) {
   DCHECK_NE(blink::ServiceWorkerStatusCode::kOk, status);
-  Complete(status, FetchEventResult::kShouldFallback, ServiceWorkerResponse(),
-           nullptr /* body_as_stream */, nullptr /* body_as_blob */);
+  Complete(status, FetchEventResult::kShouldFallback,
+           blink::mojom::FetchAPIResponse::New(), nullptr /* body_as_stream */);
 }
 
 void ServiceWorkerFetchDispatcher::DidFinish(
     int request_id,
     FetchEventResult fetch_result,
-    const ServiceWorkerResponse& response,
-    blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-    blink::mojom::BlobPtr body_as_blob) {
+    blink::mojom::FetchAPIResponsePtr response,
+    blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream) {
   net_log_.EndEvent(net::NetLogEventType::SERVICE_WORKER_FETCH_EVENT);
-  Complete(blink::ServiceWorkerStatusCode::kOk, fetch_result, response,
-           std::move(body_as_stream), std::move(body_as_blob));
+  Complete(blink::ServiceWorkerStatusCode::kOk, fetch_result,
+           std::move(response), std::move(body_as_stream));
 }
 
 void ServiceWorkerFetchDispatcher::Complete(
     blink::ServiceWorkerStatusCode status,
     FetchEventResult fetch_result,
-    const ServiceWorkerResponse& response,
-    blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-    blink::mojom::BlobPtr body_as_blob) {
+    blink::mojom::FetchAPIResponsePtr response,
+    blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream) {
   DCHECK(fetch_callback_);
 
   did_complete_ = true;
@@ -658,8 +648,8 @@
       base::Bind(&NetLogFetchEventCallback, status, fetch_result));
 
   std::move(fetch_callback_)
-      .Run(status, fetch_result, response, std::move(body_as_stream),
-           std::move(body_as_blob), version_);
+      .Run(status, fetch_result, std::move(response), std::move(body_as_stream),
+           version_);
 }
 
 // Non-S13nServiceWorker
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.h b/content/browser/service_worker/service_worker_fetch_dispatcher.h
index 29c19dc..c8024ab6 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.h
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.h
@@ -16,7 +16,6 @@
 #include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/common/content_export.h"
 #include "content/common/service_worker/service_worker.mojom.h"
-#include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/resource_type.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "net/log/net_log_with_source.h"
@@ -24,6 +23,7 @@
 #include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 
 namespace net {
@@ -49,9 +49,8 @@
   using FetchCallback =
       base::OnceCallback<void(blink::ServiceWorkerStatusCode,
                               FetchEventResult,
-                              const ServiceWorkerResponse&,
+                              blink::mojom::FetchAPIResponsePtr,
                               blink::mojom::ServiceWorkerStreamHandlePtr,
-                              blink::mojom::BlobPtr,
                               scoped_refptr<ServiceWorkerVersion>)>;
 
   // |request_body_*| and |client_id| are used in non-S13nServiceWorker only.
@@ -98,14 +97,12 @@
   void DidFail(blink::ServiceWorkerStatusCode status);
   void DidFinish(int request_id,
                  FetchEventResult fetch_result,
-                 const ServiceWorkerResponse& response,
-                 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-                 blink::mojom::BlobPtr body_as_blob);
+                 blink::mojom::FetchAPIResponsePtr response,
+                 blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream);
   void Complete(blink::ServiceWorkerStatusCode status,
                 FetchEventResult fetch_result,
-                const ServiceWorkerResponse& response,
-                blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-                blink::mojom::BlobPtr body_as_blob);
+                blink::mojom::FetchAPIResponsePtr response,
+                blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream);
 
   // The fetch event stays open until all respondWith() and waitUntil() promises
   // are settled. This function is called once the renderer signals that
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc
index 3b93dc1..3af388b8 100644
--- a/content/browser/service_worker/service_worker_internals_ui.cc
+++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -261,6 +261,7 @@
         Value(base::Int64ToString(version_id)));
   }
   void OnVersionStateChanged(int64_t version_id,
+                             const GURL& scope,
                              ServiceWorkerVersion::Status) override {
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
     web_ui_->CallJavascriptFunctionUnsafe(
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc
index 40bd68c..e071aab 100644
--- a/content/browser/service_worker/service_worker_metrics.cc
+++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -951,4 +951,10 @@
   UMA_HISTOGRAM_COUNTS_1M("ServiceWorker.RegisteredOriginCount", origin_count);
 }
 
+void ServiceWorkerMetrics::RecordMainResourceRequestDestination(
+    MainResourceRequestDestination destination) {
+  UMA_HISTOGRAM_ENUMERATION("ServiceWorker.MainResourceRequestDestination",
+                            destination);
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h
index d4a4a6b..274d281 100644
--- a/content/browser/service_worker/service_worker_metrics.h
+++ b/content/browser/service_worker/service_worker_metrics.h
@@ -29,6 +29,46 @@
 class ServiceWorkerMetrics {
  public:
   // Used for UMA. Append-only.
+  enum class MainResourceRequestDestination {
+    // The request was routed to the service worker. Fetch event dispatching
+    // possibly succeeded or failed.
+    // ServiceWorker.FetchEvent.MainResource.Status was logged with the result
+    // of the dispatch.
+    kServiceWorker = 0,
+
+    // The request was routed to network for the specified reason.
+    kNetworkBecauseNoActiveVersion = 1,
+    kNetworkBecauseNoActiveVersionAfterContinuing = 2,
+    kNetworkBecauseNoContext = 3,
+    kNetworkBecauseNoFetchEventHandler = 4,
+    kNetworkBecauseNoProvider = 5,
+    kNetworkBecauseNoProviderAfterContinuing = 6,
+    kNetworkBecauseNoRegistration = 7,
+    kNetworkBecauseNotAllowed = 8,
+    kNetworkBecauseNotSecure = 9,
+
+    // The loader couldn't dispatch the fetch event because there was no active
+    // worker.
+    kErrorNoActiveWorkerFromDelegate = 10,
+    // The loader couldn't dispatch the fetch event because the request body
+    // failed.
+    kErrorRequestBodyFailed = 11,
+
+    // The request was being routed to the service worker, but the handler was
+    // destroyed before the result of the fetch event dispatch was received.
+    kAbortedWhileDispatchingFetchEvent = 12,
+    // The handler was destroyed without dispatching a fetch event to the
+    // service
+    // worker.
+    kAbortedWithoutDispatchingFetchEvent = 13,
+
+    // The request was not routed because it was cancelled.
+    kJobWasCancelled = 14,
+
+    kMaxValue = 14,
+  };
+
+  // Used for UMA. Append-only.
   enum ReadResponseResult {
     READ_OK,
     READ_HEADERS_ERROR,
@@ -443,6 +483,9 @@
   // Records the number of origins with a registered service worker.
   static void RecordRegisteredOriginCount(size_t origin_count);
 
+  static void RecordMainResourceRequestDestination(
+      MainResourceRequestDestination destination);
+
  private:
   DISALLOW_IMPLICIT_CONSTRUCTORS(ServiceWorkerMetrics);
 };
diff --git a/content/browser/service_worker/service_worker_navigation_loader.cc b/content/browser/service_worker/service_worker_navigation_loader.cc
index dbe84cc..30520c4 100644
--- a/content/browser/service_worker/service_worker_navigation_loader.cc
+++ b/content/browser/service_worker/service_worker_navigation_loader.cc
@@ -25,7 +25,7 @@
 
 std::string ComposeFetchEventResultString(
     ServiceWorkerFetchDispatcher::FetchEventResult result,
-    const ServiceWorkerResponse& response) {
+    const blink::mojom::FetchAPIResponse& response) {
   if (result == ServiceWorkerFetchDispatcher::FetchEventResult::kShouldFallback)
     return "Fallback to network";
   std::stringstream stream;
@@ -173,6 +173,9 @@
   ServiceWorkerVersion* active_worker =
       delegate_->GetServiceWorkerVersion(&result);
   if (!active_worker) {
+    delegate_->ReportDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::
+            kErrorNoActiveWorkerFromDelegate);
     ReturnNetworkError();
     return;
   }
@@ -193,6 +196,7 @@
          "there are. Add code here to clone the body before proceeding.";
 
   // Dispatch the fetch event.
+  delegate_->WillDispatchFetchEventForMainResource();
   fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>(
       std::move(request), std::string() /* request_body_blob_uuid */,
       0 /* request_body_blob_size */, nullptr /* request_body_blob */,
@@ -281,9 +285,8 @@
 void ServiceWorkerNavigationLoader::DidDispatchFetchEvent(
     blink::ServiceWorkerStatusCode status,
     ServiceWorkerFetchDispatcher::FetchEventResult fetch_result,
-    const ServiceWorkerResponse& response,
+    blink::mojom::FetchAPIResponsePtr response,
     blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-    blink::mojom::BlobPtr body_as_blob,
     scoped_refptr<ServiceWorkerVersion> version) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 
@@ -291,7 +294,9 @@
       "ServiceWorker", "ServiceWorkerNavigationLoader::DidDispatchFetchEvent",
       this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "status",
       blink::ServiceWorkerStatusToString(status), "result",
-      ComposeFetchEventResultString(fetch_result, response));
+      ComposeFetchEventResultString(fetch_result, *response));
+  delegate_->ReportDestination(
+      ServiceWorkerMetrics::MainResourceRequestDestination::kServiceWorker);
   ServiceWorkerMetrics::RecordFetchEventStatus(true /* is_main_resource */,
                                                status);
 
@@ -319,22 +324,21 @@
 
   // A response with status code 0 is Blink telling us to respond with
   // network error.
-  if (response.status_code == 0) {
+  if (response->status_code == 0) {
     ReturnNetworkError();
     return;
   }
 
   std::move(loader_callback_)
       .Run(base::BindOnce(&ServiceWorkerNavigationLoader::StartResponse,
-                          weak_factory_.GetWeakPtr(), response, version,
-                          std::move(body_as_stream), std::move(body_as_blob)));
+                          weak_factory_.GetWeakPtr(), std::move(response),
+                          version, std::move(body_as_stream)));
 }
 
 void ServiceWorkerNavigationLoader::StartResponse(
-    const ServiceWorkerResponse& response,
+    blink::mojom::FetchAPIResponsePtr response,
     scoped_refptr<ServiceWorkerVersion> version,
     blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-    blink::mojom::BlobPtr body_as_blob,
     network::mojom::URLLoaderRequest request,
     network::mojom::URLLoaderClientPtr client) {
   DCHECK(!binding_.is_bound());
@@ -345,9 +349,9 @@
                      base::Unretained(this)));
   url_loader_client_ = std::move(client);
 
-  ServiceWorkerLoaderHelpers::SaveResponseInfo(response, &response_head_);
+  ServiceWorkerLoaderHelpers::SaveResponseInfo(*response, &response_head_);
   ServiceWorkerLoaderHelpers::SaveResponseHeaders(
-      response.status_code, response.status_text, response.headers,
+      response->status_code, response->status_text, response->headers,
       &response_head_);
 
   response_head_.did_service_worker_navigation_preload =
@@ -399,8 +403,9 @@
   }
 
   // Handle a blob response body.
-  if (body_as_blob) {
-    body_as_blob_ = std::move(body_as_blob);
+  if (response->blob) {
+    DCHECK(response->blob->blob.is_valid());
+    body_as_blob_.Bind(std::move(response->blob->blob));
     mojo::ScopedDataPipeConsumerHandle data_pipe;
     int error = ServiceWorkerLoaderHelpers::ReadBlobResponseBody(
         &body_as_blob_, resource_request_.headers,
diff --git a/content/browser/service_worker/service_worker_navigation_loader.h b/content/browser/service_worker/service_worker_navigation_loader.h
index 5b227c7..c391aee 100644
--- a/content/browser/service_worker/service_worker_navigation_loader.h
+++ b/content/browser/service_worker/service_worker_navigation_loader.h
@@ -17,17 +17,16 @@
 #include "content/browser/service_worker/service_worker_response_type.h"
 #include "content/browser/service_worker/service_worker_url_job_wrapper.h"
 #include "content/browser/url_loader_factory_getter.h"
-#include "content/common/service_worker/service_worker_types.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 #include "services/network/public/mojom/url_loader.mojom.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom.h"
 
 namespace content {
 
-struct ServiceWorkerResponse;
 class ServiceWorkerVersion;
 
 // S13nServiceWorker:
@@ -109,19 +108,16 @@
   void DidDispatchFetchEvent(
       blink::ServiceWorkerStatusCode status,
       ServiceWorkerFetchDispatcher::FetchEventResult fetch_result,
-      const ServiceWorkerResponse& response,
+      blink::mojom::FetchAPIResponsePtr response,
       blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-      blink::mojom::BlobPtr body_as_blob,
       scoped_refptr<ServiceWorkerVersion> version);
 
   // Used as the RequestHandler passed to |loader_callback_| when the service
   // worker chooses to handle a resource request. Returns the response to
-  // |client|. |body_as_blob| is kept around until BlobDataHandle is created
-  // from blob_uuid just to make sure the blob is kept alive.
-  void StartResponse(const ServiceWorkerResponse& response,
+  // |client|.
+  void StartResponse(blink::mojom::FetchAPIResponsePtr response,
                      scoped_refptr<ServiceWorkerVersion> version,
                      blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-                     blink::mojom::BlobPtr body_as_blob,
                      network::mojom::URLLoaderRequest request,
                      network::mojom::URLLoaderClientPtr client);
 
@@ -156,6 +152,9 @@
   void OnConnectionClosed();
   void DeleteIfNeeded();
 
+  void ReportDestination(
+      ServiceWorkerMetrics::MainResourceRequestDestination destination);
+
   ResponseType response_type_ = ResponseType::NOT_DETERMINED;
   NavigationLoaderInterceptor::LoaderCallback loader_callback_;
 
diff --git a/content/browser/service_worker/service_worker_navigation_loader_unittest.cc b/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
index 3b22bc4..45c2664 100644
--- a/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
+++ b/content/browser/service_worker/service_worker_navigation_loader_unittest.cc
@@ -44,6 +44,34 @@
   *out_handler = std::move(handler);
 }
 
+blink::mojom::FetchAPIResponsePtr OkResponse(
+    blink::mojom::SerializedBlobPtr blob_body) {
+  auto response = blink::mojom::FetchAPIResponse::New();
+  response->status_code = 200;
+  response->status_text = "OK";
+  response->response_type = network::mojom::FetchResponseType::kDefault;
+  response->blob = std::move(blob_body);
+  return response;
+}
+
+blink::mojom::FetchAPIResponsePtr ErrorResponse() {
+  auto response = blink::mojom::FetchAPIResponse::New();
+  response->status_code = 0;
+  response->response_type = network::mojom::FetchResponseType::kDefault;
+  response->error = blink::mojom::ServiceWorkerResponseError::kPromiseRejected;
+  return response;
+}
+
+blink::mojom::FetchAPIResponsePtr RedirectResponse(
+    const std::string& redirect_location_header) {
+  auto response = blink::mojom::FetchAPIResponse::New();
+  response->status_code = 301;
+  response->status_text = "Moved Permanently";
+  response->response_type = network::mojom::FetchResponseType::kDefault;
+  response->headers["Location"] = redirect_location_header;
+  return response;
+}
+
 // NavigationPreloadLoaderClient mocks the renderer-side URLLoaderClient for the
 // navigation preload network request performed by the browser. In production
 // code, this is ServiceWorkerContextClient::NavigationPreloadRequest,
@@ -71,7 +99,7 @@
  public:
   NavigationPreloadLoaderClient(
       blink::mojom::FetchEventPreloadHandlePtr preload_handle,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       : url_loader_(std::move(preload_handle->url_loader)),
         binding_(this, std::move(preload_handle->url_loader_client_request)),
@@ -102,21 +130,14 @@
 
     // Simulate passing the navigation preload response to
     // FetchEvent#respondWith.
+    auto response = blink::mojom::FetchAPIResponse::New();
+    response->url_list =
+        std::vector<GURL>(response_head_.url_list_via_service_worker);
+    response->status_code = response_head_.headers->response_code();
+    response->status_text = response_head_.headers->GetStatusText();
+    response->response_type = response_head_.response_type_via_service_worker;
     response_callback_->OnResponseStream(
-        ServiceWorkerResponse(
-            std::make_unique<std::vector<GURL>>(
-                response_head_.url_list_via_service_worker),
-            response_head_.headers->response_code(),
-            response_head_.headers->GetStatusText(),
-            response_head_.response_type_via_service_worker,
-            std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-            0 /* blob_size */, nullptr /* blob */,
-            blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-            false /* response_is_in_cache_storage */,
-            std::string() /* response_cache_storage_cache_name */,
-            std::make_unique<
-                ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-        std::move(stream_handle), base::Time::Now());
+        std::move(response), std::move(stream_handle), base::Time::Now());
     std::move(finish_callback_)
         .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
              base::Time::Now());
@@ -142,7 +163,7 @@
   mojo::ScopedDataPipeConsumerHandle body_;
 
   // Callbacks that complete Helper::OnFetchEvent().
-  mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_;
+  blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_;
   mojom::ServiceWorker::DispatchFetchEventCallback finish_callback_;
 
   DISALLOW_COPY_AND_ASSIGN(NavigationPreloadLoaderClient);
@@ -156,7 +177,7 @@
   ~Helper() override = default;
 
   // Tells this helper to respond to fetch events with the specified blob.
-  void RespondWithBlob(blink::mojom::BlobPtr blob) {
+  void RespondWithBlob(blink::mojom::SerializedBlobPtr blob) {
     response_mode_ = ResponseMode::kBlob;
     blob_body_ = std::move(blob);
   }
@@ -230,7 +251,7 @@
       int embedded_worker_id,
       const network::ResourceRequest& request,
       blink::mojom::FetchEventPreloadHandlePtr preload_handle,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
     // Basic checks on DispatchFetchEvent parameters.
@@ -246,35 +267,16 @@
             std::move(response_callback), std::move(finish_callback));
         return;
       case ResponseMode::kBlob:
-        response_callback->OnResponseBlob(
-            ServiceWorkerResponse(
-                std::make_unique<std::vector<GURL>>(), 200, "OK",
-                network::mojom::FetchResponseType::kDefault,
-                std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-                0 /* blob_size */, nullptr /* blob */,
-                blink::mojom::ServiceWorkerResponseError::kUnknown,
-                base::Time(), false /* response_is_in_cache_storage */,
-                std::string() /* response_cache_storage_cache_name */,
-                std::make_unique<
-                    ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-            std::move(blob_body_), base::Time::Now());
+        response_callback->OnResponse(OkResponse(std::move(blob_body_)),
+                                      base::Time::Now());
         std::move(finish_callback)
             .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
                  base::Time::Now());
         return;
       case ResponseMode::kStream:
-        response_callback->OnResponseStream(
-            ServiceWorkerResponse(
-                std::make_unique<std::vector<GURL>>(), 200, "OK",
-                network::mojom::FetchResponseType::kDefault,
-                std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-                0 /* blob_size */, nullptr /* blob */,
-                blink::mojom::ServiceWorkerResponseError::kUnknown,
-                base::Time(), false /* response_is_in_cache_storage */,
-                std::string() /* response_cache_storage_cache_name */,
-                std::make_unique<
-                    ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-            std::move(stream_handle_), base::Time::Now());
+        response_callback->OnResponseStream(OkResponse(nullptr /* blob_body */),
+                                            std::move(stream_handle_),
+                                            base::Time::Now());
         std::move(finish_callback)
             .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
                  base::Time::Now());
@@ -286,19 +288,7 @@
                  base::Time::Now());
         return;
       case ResponseMode::kErrorResponse:
-        response_callback->OnResponse(
-            ServiceWorkerResponse(
-                std::make_unique<std::vector<GURL>>(), 0 /* status_code */,
-                "" /* status_text */,
-                network::mojom::FetchResponseType::kDefault,
-                std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-                0 /* blob_size */, nullptr /* blob */,
-                blink::mojom::ServiceWorkerResponseError::kPromiseRejected,
-                base::Time(), false /* response_is_in_cache_storage */,
-                std::string() /* response_cache_storage_cache_name */,
-                std::make_unique<
-                    ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-            base::Time::Now());
+        response_callback->OnResponse(ErrorResponse(), base::Time::Now());
         std::move(finish_callback)
             .Run(blink::mojom::ServiceWorkerEventStatus::REJECTED,
                  base::Time::Now());
@@ -327,34 +317,13 @@
         return;
       case ResponseMode::kEarlyResponse:
         finish_callback_ = std::move(finish_callback);
-        response_callback->OnResponse(
-            ServiceWorkerResponse(
-                std::make_unique<std::vector<GURL>>(), 200, "OK",
-                network::mojom::FetchResponseType::kDefault,
-                std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-                0 /* blob_size */, nullptr /* blob */,
-                blink::mojom::ServiceWorkerResponseError::kUnknown,
-                base::Time(), false /* response_is_in_cache_storage */,
-                std::string() /* response_cache_storage_cache_name */,
-                std::make_unique<
-                    ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-            base::Time::Now());
+        response_callback->OnResponse(OkResponse(nullptr /* blob_body */),
+                                      base::Time::Now());
         // Now the caller must call FinishWaitUntil() to finish the event.
         return;
       case ResponseMode::kRedirect:
-        auto headers = std::make_unique<ServiceWorkerHeaderMap>();
-        (*headers)["location"] = redirected_url_.spec();
-        response_callback->OnResponse(
-            ServiceWorkerResponse(
-                std::make_unique<std::vector<GURL>>(), 301, "Moved Permanently",
-                network::mojom::FetchResponseType::kDefault, std::move(headers),
-                "" /* blob_uuid */, 0 /* blob_size */, nullptr /* blob */,
-                blink::mojom::ServiceWorkerResponseError::kUnknown,
-                base::Time(), false /* response_is_in_cache_storage */,
-                std::string() /* response_cache_storage_cache_name */,
-                std::make_unique<
-                    ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-            base::Time::Now());
+        response_callback->OnResponse(RedirectResponse(redirected_url_.spec()),
+                                      base::Time::Now());
         std::move(finish_callback)
             .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
                  base::Time::Now());
@@ -380,7 +349,7 @@
   scoped_refptr<network::ResourceRequestBody> request_body_;
 
   // For ResponseMode::kBlob.
-  blink::mojom::BlobPtr blob_body_;
+  blink::mojom::SerializedBlobPtr blob_body_;
 
   // For ResponseMode::kStream.
   blink::mojom::ServiceWorkerStreamHandlePtr stream_handle_;
@@ -626,10 +595,13 @@
   blob_data->AppendData(kResponseBody);
   std::unique_ptr<storage::BlobDataHandle> blob_handle =
       blob_context_.AddFinishedBlob(std::move(blob_data));
-  blink::mojom::BlobPtr blob_ptr;
-  blink::mojom::BlobRequest request = mojo::MakeRequest(&blob_ptr);
+
+  auto blob = blink::mojom::SerializedBlob::New();
+  blob->uuid = blob_handle->uuid();
+  blob->size = blob_handle->size();
+  blink::mojom::BlobRequest request = mojo::MakeRequest(&blob->blob);
   storage::BlobImpl::Create(std::move(blob_handle), std::move(request));
-  helper_->RespondWithBlob(std::move(blob_ptr));
+  helper_->RespondWithBlob(std::move(blob));
 
   // Perform the request.
   LoaderResult result = StartRequest(CreateRequest());
@@ -657,10 +629,11 @@
   std::unique_ptr<storage::BlobDataHandle> blob_handle =
       blob_context_.AddBrokenBlob(kBrokenUUID, "", "",
                                   storage::BlobStatus::ERR_OUT_OF_MEMORY);
-  blink::mojom::BlobPtr blob_ptr;
-  blink::mojom::BlobRequest request = mojo::MakeRequest(&blob_ptr);
+  auto blob = blink::mojom::SerializedBlob::New();
+  blob->uuid = kBrokenUUID;
+  blink::mojom::BlobRequest request = mojo::MakeRequest(&blob->blob);
   storage::BlobImpl::Create(std::move(blob_handle), std::move(request));
-  helper_->RespondWithBlob(std::move(blob_ptr));
+  helper_->RespondWithBlob(std::move(blob));
 
   // Perform the request.
   LoaderResult result = StartRequest(CreateRequest());
diff --git a/content/browser/service_worker/service_worker_storage.cc b/content/browser/service_worker/service_worker_storage.cc
index 4342f184..92b13a6 100644
--- a/content/browser/service_worker/service_worker_storage.cc
+++ b/content/browser/service_worker/service_worker_storage.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
diff --git a/content/browser/service_worker/service_worker_url_job_wrapper.h b/content/browser/service_worker/service_worker_url_job_wrapper.h
index 1bceeff..c2cc3987 100644
--- a/content/browser/service_worker/service_worker_url_job_wrapper.h
+++ b/content/browser/service_worker/service_worker_url_job_wrapper.h
@@ -51,6 +51,11 @@
     // Called to signal that loading failed, and that the resource being loaded
     // was a main resource.
     virtual void MainResourceLoadFailed() {}
+
+    virtual void ReportDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination destination) {}
+
+    virtual void WillDispatchFetchEventForMainResource() {}
   };
 
   // Non-S13nServiceWorker.
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index 00532d3..543c290 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -20,7 +20,7 @@
 #include "base/location.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "content/browser/resource_context_impl.h"
@@ -353,6 +353,7 @@
 
   if (!ShouldRecordResult())
     return;
+
   ServiceWorkerMetrics::URLRequestJobResult result =
       ServiceWorkerMetrics::REQUEST_JOB_ERROR_KILLED;
   if (response_body_type_ == STREAM)
@@ -658,9 +659,8 @@
 void ServiceWorkerURLRequestJob::DidDispatchFetchEvent(
     blink::ServiceWorkerStatusCode status,
     ServiceWorkerFetchDispatcher::FetchEventResult fetch_result,
-    const ServiceWorkerResponse& response,
+    blink::mojom::FetchAPIResponsePtr response,
     blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-    blink::mojom::BlobPtr body_as_blob,
     scoped_refptr<ServiceWorkerVersion> version) {
   // Do not clear |fetch_dispatcher_| if it has dispatched a navigation preload
   // request to keep the network::mojom::URLLoader related objects in it,
@@ -669,6 +669,10 @@
   if (!did_navigation_preload_) {
     fetch_dispatcher_.reset();
   }
+  if (IsMainResourceLoad()) {
+    ReportDestination(
+        ServiceWorkerMetrics::MainResourceRequestDestination::kServiceWorker);
+  }
   ServiceWorkerMetrics::RecordFetchEventStatus(IsMainResourceLoad(), status);
 
   ServiceWorkerMetrics::URLRequestJobResult result =
@@ -708,9 +712,9 @@
 
   // A response with status code 0 is Blink telling us to respond with network
   // error.
-  if (response.status_code == 0) {
-    RecordStatusZeroResponseError(response.error);
-    NotifyStartError(ServiceWorkerResponseErrorToNetStatus(response.error));
+  if (response->status_code == 0) {
+    RecordStatusZeroResponseError(response->error);
+    NotifyStartError(ServiceWorkerResponseErrorToNetStatus(response->error));
     return;
   }
 
@@ -730,7 +734,7 @@
   // Process stream using Mojo's data pipe.
   if (!body_as_stream.is_null()) {
     SetResponseBodyType(STREAM);
-    SetResponse(response);
+    SetResponse(std::move(response));
     data_pipe_reader_.reset(new ServiceWorkerDataPipeReader(
         this, version, std::move(body_as_stream)));
     data_pipe_reader_->Start();
@@ -738,14 +742,14 @@
   }
 
   // Set up a request for reading the blob.
-  // |body_as_blob| must be kept around until we call this to ensure that
-  // it's alive.
-  // TODO(falken): Can we just read |body_as_blob| directly like in
+  // TODO(falken): Can we just read |response->blob->blob| directly like in
   // ServiceWorkerNavigationLoader?
-  if (!response.blob_uuid.empty() && blob_storage_context_) {
+  if (response->blob && blob_storage_context_) {
+    DCHECK(!response->blob->uuid.empty());
+    DCHECK(response->blob->blob.is_valid());
     SetResponseBodyType(BLOB);
     std::unique_ptr<storage::BlobDataHandle> blob_data_handle =
-        blob_storage_context_->GetBlobDataFromUUID(response.blob_uuid);
+        blob_storage_context_->GetBlobDataFromUUID(response->blob->uuid);
     if (!blob_data_handle) {
       // The renderer gave us a bad blob UUID.
       RecordResult(ServiceWorkerMetrics::REQUEST_JOB_ERROR_BAD_BLOB);
@@ -756,7 +760,7 @@
     blob_reader_->Start(std::move(blob_data_handle), request()->context());
   }
 
-  SetResponse(response);
+  SetResponse(std::move(response));
   if (!blob_reader_) {
     RecordResult(ServiceWorkerMetrics::REQUEST_JOB_HEADERS_ONLY_RESPONSE);
     CommitResponseHeader();
@@ -764,31 +768,36 @@
 }
 
 void ServiceWorkerURLRequestJob::SetResponse(
-    const ServiceWorkerResponse& response) {
-  response_url_list_ = response.url_list;
-  fetch_response_type_ = response.response_type;
-  cors_exposed_header_names_ = response.cors_exposed_header_names;
-  response_time_ = response.response_time;
-  CreateResponseHeader(response.status_code, response.status_text,
-                       response.headers);
+    blink::mojom::FetchAPIResponsePtr response) {
+  response_url_list_ = std::move(response->url_list);
+  fetch_response_type_ = response->response_type;
+  cors_exposed_header_names_ = std::move(response->cors_exposed_header_names);
+  response_time_ = response->response_time;
+  CreateResponseHeader(response->status_code, response->status_text,
+                       std::move(response->headers));
   load_timing_info_.receive_headers_end = base::TimeTicks::Now();
 
-  response_is_in_cache_storage_ = response.is_in_cache_storage;
-  response_cache_storage_cache_name_ = response.cache_storage_cache_name;
+  response_is_in_cache_storage_ = response->is_in_cache_storage;
+  if (response->cache_storage_cache_name) {
+    response_cache_storage_cache_name_ =
+        std::move(*(response->cache_storage_cache_name));
+  } else {
+    response_cache_storage_cache_name_.clear();
+  }
 }
 
 void ServiceWorkerURLRequestJob::CreateResponseHeader(
     int status_code,
     const std::string& status_text,
-    const ServiceWorkerHeaderMap& headers) {
+    ResponseHeaderMap headers) {
   // Build a string instead of using HttpResponseHeaders::AddHeader on
   // each header, since AddHeader has O(n^2) performance.
   std::string buf(base::StringPrintf("HTTP/1.1 %d %s\r\n", status_code,
                                      status_text.c_str()));
-  for (const auto& item : headers) {
-    buf.append(item.first);
+  for (auto& item : headers) {
+    buf.append(std::move(item.first));
     buf.append(": ");
-    buf.append(item.second);
+    buf.append(std::move(item.second));
     buf.append("\r\n");
   }
   buf.append("\r\n");
@@ -809,8 +818,8 @@
 void ServiceWorkerURLRequestJob::DeliverErrorResponse() {
   // TODO(falken): Print an error to the console of the ServiceWorker and of
   // the requesting page.
-  CreateResponseHeader(
-      500, "Service Worker Response Error", ServiceWorkerHeaderMap());
+  CreateResponseHeader(500, "Service Worker Response Error",
+                       ResponseHeaderMap());
   CommitResponseHeader();
 }
 
@@ -831,7 +840,7 @@
   if (ShouldRecordResult())
     RecordResult(ServiceWorkerMetrics::REQUEST_JOB_FALLBACK_FOR_CORS);
   CreateResponseHeader(400, "Service Worker Fallback Required",
-                       ServiceWorkerHeaderMap());
+                       ResponseHeaderMap());
   response_type_ = ResponseType::FALLBACK_TO_RENDERER;
   CommitResponseHeader();
 }
@@ -946,6 +955,11 @@
   if (!success) {
     RecordResult(
         ServiceWorkerMetrics::REQUEST_JOB_ERROR_REQUEST_BODY_BLOB_FAILED);
+    if (IsMainResourceLoad()) {
+      ReportDestination(ServiceWorkerMetrics::MainResourceRequestDestination::
+                            kErrorRequestBodyFailed);
+    }
+
     // TODO(falken): This and below should probably be NotifyStartError, not
     // DeliverErrorResponse. But changing it causes
     // ServiceWorkerURLRequestJobTest.DeletedProviderHostBeforeFetchEvent to
@@ -960,6 +974,10 @@
       delegate_->GetServiceWorkerVersion(&result);
   if (!active_worker) {
     RecordResult(result);
+    if (IsMainResourceLoad()) {
+      ReportDestination(ServiceWorkerMetrics::MainResourceRequestDestination::
+                            kErrorNoActiveWorkerFromDelegate);
+    }
     DeliverErrorResponse();
     return;
   }
@@ -981,6 +999,8 @@
   }
 
   DCHECK(!fetch_dispatcher_);
+  if (IsMainResourceLoad())
+    delegate_->WillDispatchFetchEventForMainResource();
   fetch_dispatcher_ = std::make_unique<ServiceWorkerFetchDispatcher>(
       std::move(resource_request), blob_uuid, blob_size, std::move(blob),
       client_id_, base::WrapRefCounted(active_worker), request()->net_log(),
@@ -1006,4 +1026,10 @@
   nav_preload_metrics_->ReportNavigationPreloadFinished();
 }
 
+void ServiceWorkerURLRequestJob::ReportDestination(
+    ServiceWorkerMetrics::MainResourceRequestDestination destination) {
+  DCHECK(IsMainResourceLoad());
+  delegate_->ReportDestination(destination);
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h
index 5c8f00e..ea2182b 100644
--- a/content/browser/service_worker/service_worker_url_request_job.h
+++ b/content/browser/service_worker/service_worker_url_request_job.h
@@ -24,7 +24,6 @@
 #include "content/browser/service_worker/service_worker_url_job_wrapper.h"
 #include "content/common/content_export.h"
 #include "content/common/service_worker/service_worker.mojom.h"
-#include "content/common/service_worker/service_worker_types.h"
 #include "content/public/common/request_context_type.h"
 #include "content/public/common/resource_type.h"
 #include "mojo/public/cpp/system/data_pipe.h"
@@ -37,6 +36,7 @@
 #include "services/network/public/mojom/request_context_frame_type.mojom.h"
 #include "storage/common/blob_storage/blob_storage_constants.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
 #include "url/gurl.h"
 
 namespace net {
@@ -148,6 +148,8 @@
   base::WeakPtr<ServiceWorkerURLRequestJob> GetWeakPtr();
 
  private:
+  using ResponseHeaderMap = base::flat_map<std::string, std::string>;
+
   class FileSizeResolver;
   class NavigationPreloadMetrics;
   friend class service_worker_url_request_job_unittest::DelayHelper;
@@ -190,16 +192,15 @@
   void DidDispatchFetchEvent(
       blink::ServiceWorkerStatusCode status,
       ServiceWorkerFetchDispatcher::FetchEventResult fetch_result,
-      const ServiceWorkerResponse& response,
+      blink::mojom::FetchAPIResponsePtr response,
       blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
-      blink::mojom::BlobPtr body_as_blob,
       scoped_refptr<ServiceWorkerVersion> version);
-  void SetResponse(const ServiceWorkerResponse& response);
+  void SetResponse(blink::mojom::FetchAPIResponsePtr response);
 
   // Populates |http_response_headers_|.
   void CreateResponseHeader(int status_code,
                             const std::string& status_text,
-                            const ServiceWorkerHeaderMap& headers);
+                            ResponseHeaderMap headers);
 
   // Creates |http_response_info_| using |http_response_headers_| and calls
   // NotifyHeadersComplete.
@@ -251,6 +252,9 @@
 
   void MaybeReportNavigationPreloadMetrics();
 
+  void ReportDestination(
+      ServiceWorkerMetrics::MainResourceRequestDestination destination);
+
   // Not owned.
   Delegate* delegate_;
 
@@ -336,6 +340,9 @@
 
   std::unique_ptr<FileSizeResolver> file_size_resolver_;
 
+  bool started_fetch_dispatch_ = false;
+  bool reported_destination_ = false;
+
   base::WeakPtrFactory<ServiceWorkerURLRequestJob> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerURLRequestJob);
diff --git a/content/browser/service_worker/service_worker_url_request_job_unittest.cc b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
index a0a30b12..4a76ea93 100644
--- a/content/browser/service_worker/service_worker_url_request_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_url_request_job_unittest.cc
@@ -150,14 +150,22 @@
   return std::make_unique<storage::BlobProtocolHandler>(blob_storage_context);
 }
 
-std::unique_ptr<ServiceWorkerHeaderMap> MakeHeaders() {
-  auto headers = std::make_unique<ServiceWorkerHeaderMap>();
-  (*headers)["Pineapple"] = "Pen";
-  (*headers)["Foo"] = "Bar";
-  (*headers)["Set-Cookie"] = "CookieCookieCookie";
+base::flat_map<std::string, std::string> MakeHeaders() {
+  base::flat_map<std::string, std::string> headers;
+  headers["Pineapple"] = "Pen";
+  headers["Foo"] = "Bar";
+  headers["Set-Cookie"] = "CookieCookieCookie";
   return headers;
 }
 
+blink::mojom::FetchAPIResponsePtr MakeOkResponse() {
+  auto response = blink::mojom::FetchAPIResponse::New();
+  response->status_code = 200;
+  response->status_text = "OK";
+  response->response_type = network::mojom::FetchResponseType::kDefault;
+  return response;
+}
+
 void SaveStatusCallback(blink::ServiceWorkerStatusCode* out_status,
                         blink::ServiceWorkerStatusCode status) {
   *out_status = status;
@@ -483,18 +491,7 @@
   }
 
   void Respond() {
-    response_callback_->OnResponse(
-        ServiceWorkerResponse(
-            std::make_unique<std::vector<GURL>>(), 200, "OK",
-            network::mojom::FetchResponseType::kDefault,
-            std::make_unique<ServiceWorkerHeaderMap>(), std::string(), 0,
-            nullptr /* blob */,
-            blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-            false /* response_is_in_cache_storage */,
-            std::string() /* response_cache_storage_cache_name */,
-            std::make_unique<
-                ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-        base::Time::Now());
+    response_callback_->OnResponse(MakeOkResponse(), base::Time::Now());
     std::move(finish_callback_)
         .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
              base::Time::Now());
@@ -529,7 +526,7 @@
       int embedded_worker_id,
       const network::ResourceRequest& /* request */,
       blink::mojom::FetchEventPreloadHandlePtr preload_handle,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
     embedded_worker_id_ = embedded_worker_id;
@@ -550,7 +547,7 @@
   mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info_;
   blink::mojom::ServiceWorkerInstalledScriptsInfoPtr installed_scripts_info_;
   int embedded_worker_id_ = 0;
-  mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_;
+  blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_;
   blink::mojom::FetchEventPreloadHandlePtr preload_handle_;
   mojom::ServiceWorker::DispatchFetchEventCallback finish_callback_;
   ServiceWorkerURLRequestJobTest* test_;
@@ -707,22 +704,11 @@
       int /* embedded_worker_id */,
       const network::ResourceRequest& /* request */,
       blink::mojom::FetchEventPreloadHandlePtr /* preload_handle */,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
     context()->RemoveProviderHost(mock_render_process_id(), kProviderID);
-    response_callback->OnResponse(
-        ServiceWorkerResponse(
-            std::make_unique<std::vector<GURL>>(), 200, "OK",
-            network::mojom::FetchResponseType::kDefault,
-            std::make_unique<ServiceWorkerHeaderMap>(), std::string(), 0,
-            nullptr /* blob */,
-            blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-            false /* response_is_in_cache_storage */,
-            std::string() /* response_cache_storage_cache_name */,
-            std::make_unique<
-                ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-        base::Time::Now());
+    response_callback->OnResponse(MakeOkResponse(), base::Time::Now());
     std::move(finish_callback)
         .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
              base::Time::Now());
@@ -797,20 +783,19 @@
       int /* embedded_worker_id */,
       const network::ResourceRequest& /* request */,
       blink::mojom::FetchEventPreloadHandlePtr /* preload_handle */,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
-    response_callback->OnResponse(
-        ServiceWorkerResponse(
-            std::make_unique<std::vector<GURL>>(), 200, "OK",
-            network::mojom::FetchResponseType::kDefault, MakeHeaders(),
-            blob_uuid_, blob_size_, nullptr /* blob */,
-            blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-            false /* response_is_in_cache_storage */,
-            std::string() /* response_cache_storage_cache_name */,
-            std::make_unique<
-                ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-        base::Time::Now());
+    blink::mojom::FetchAPIResponsePtr response = MakeOkResponse();
+    response->headers = MakeHeaders();
+    response->blob = blink::mojom::SerializedBlob::New();
+    response->blob->uuid = blob_uuid_;
+    response->blob->size = blob_size_;
+    // As |response->blob->blob| must have a non-null value to be passed via
+    // Mojo, we give it a dummy value.
+    auto dummy_request = mojo::MakeRequest(&response->blob->blob);
+
+    response_callback->OnResponse(std::move(response), base::Time::Now());
     std::move(finish_callback)
         .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
              base::Time::Now());
@@ -898,21 +883,14 @@
       int /* embedded_worker_id */,
       const network::ResourceRequest& /* request */,
       blink::mojom::FetchEventPreloadHandlePtr /* preload_handle */,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
     ASSERT_FALSE(stream_handle_.is_null());
+    blink::mojom::FetchAPIResponsePtr response = MakeOkResponse();
+    response->headers = MakeHeaders();
     response_callback->OnResponseStream(
-        ServiceWorkerResponse(
-            std::make_unique<std::vector<GURL>>(), 200, "OK",
-            network::mojom::FetchResponseType::kDefault, MakeHeaders(), "", 0,
-            nullptr /* blob */,
-            blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-            false /* response_is_in_cache_storage */,
-            std::string() /* response_cache_storage_cache_name */,
-            std::make_unique<
-                ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-        std::move(stream_handle_), base::Time::Now());
+        std::move(response), std::move(stream_handle_), base::Time::Now());
     std::move(finish_callback)
         .Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED,
              base::Time::Now());
@@ -1288,7 +1266,8 @@
       int embedded_worker_id,
       const network::ResourceRequest& /* request */,
       blink::mojom::FetchEventPreloadHandlePtr /* preload_handle */,
-      mojom::ServiceWorkerFetchResponseCallbackPtr /* response_callback */,
+      blink::mojom::
+          ServiceWorkerFetchResponseCallbackPtr /* response_callback */,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
     SimulateWorkerStopped(embedded_worker_id);
@@ -1381,22 +1360,11 @@
       int /* embedded_worker_id */,
       const network::ResourceRequest& /* request */,
       blink::mojom::FetchEventPreloadHandlePtr /* preload_handle */,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       mojom::ServiceWorker::DispatchFetchEventCallback finish_callback)
       override {
     finish_callback_ = std::move(finish_callback);
-    response_callback->OnResponse(
-        ServiceWorkerResponse(
-            std::make_unique<std::vector<GURL>>(), 200, "OK",
-            network::mojom::FetchResponseType::kDefault,
-            std::make_unique<ServiceWorkerHeaderMap>(), std::string(), 0,
-            nullptr /* blob */,
-            blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-            false /* response_is_in_cache_storage */,
-            std::string() /* response_cache_storage_cache_name */,
-            std::make_unique<
-                ServiceWorkerHeaderList>() /* cors_exposed_header_names */),
-        base::Time::Now());
+    response_callback->OnResponse(MakeOkResponse(), base::Time::Now());
   }
 
  private:
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc
index 849fb03..1defce70 100644
--- a/content/browser/shared_worker/shared_worker_service_impl.cc
+++ b/content/browser/shared_worker/shared_worker_service_impl.cc
@@ -13,7 +13,7 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/appcache/appcache_navigation_handle.h"
 #include "content/browser/appcache/appcache_navigation_handle_core.h"
 #include "content/browser/file_url_loader_factory.h"
diff --git a/content/browser/site_instance_impl.cc b/content/browser/site_instance_impl.cc
index 805b407..4385285 100644
--- a/content/browser/site_instance_impl.cc
+++ b/content/browser/site_instance_impl.cc
@@ -457,16 +457,27 @@
     return GURL(origin.scheme() + ":");
   } else if (url.has_scheme()) {
     // In some cases, it is not safe to use just the scheme as a site URL, as
-    // that might allow two URLs created by different sites to to share a
-    // process.  See https://crbug.com/863623.
+    // that might allow two URLs created by different sites to share a process.
+    // See https://crbug.com/863623 and https://crbug.com/863069.
     //
     // TODO(alexmos,creis): This should eventually be expanded to certain other
-    // schemes, such as data: and file:.
-    if (url.SchemeIsBlob()) {
+    // schemes, such as file:.
+    // TODO(creis): This currently causes problems with tests on Android and
+    // Android WebView.  For now, skip it when Site Isolation is not enabled,
+    // since there's no need to isolate data and blob URLs from each other in
+    // that case.
+    bool is_site_isolation_enabled =
+        SiteIsolationPolicy::UseDedicatedProcessesForAllSites() ||
+        SiteIsolationPolicy::AreIsolatedOriginsEnabled();
+    if (is_site_isolation_enabled &&
+        (url.SchemeIsBlob() || url.scheme() == url::kDataScheme)) {
       // We get here for blob URLs of form blob:null/guid.  Use the full URL
       // with the guid in that case, which isolates all blob URLs with unique
-      // origins from each other.  Remove hash from the URL, since
-      // same-document navigations shouldn't use a different site URL.
+      // origins from each other.  We also get here for browser-initiated
+      // navigations to data URLs, which have a unique origin and should only
+      // share a process when they are identical.  Remove hash from the URL in
+      // either case, since same-document navigations shouldn't use a different
+      // site URL.
       if (url.has_ref()) {
         GURL::Replacements replacements;
         replacements.ClearRef();
diff --git a/content/browser/site_instance_impl_unittest.cc b/content/browser/site_instance_impl_unittest.cc
index 8e92db4..6615913 100644
--- a/content/browser/site_instance_impl_unittest.cc
+++ b/content/browser/site_instance_impl_unittest.cc
@@ -316,12 +316,25 @@
   EXPECT_EQ("file", site_url.scheme());
   EXPECT_FALSE(site_url.has_host());
 
-  // Data URLs should include the scheme.
+  // Data URLs should include the whole URL, except for the hash, when Site
+  // Isolation is enabled.  Otherwise they just include the scheme.
   test_url = GURL("data:text/html,foo");
   site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
-  EXPECT_EQ(GURL("data:"), site_url);
+  if (AreAllSitesIsolatedForTesting())
+    EXPECT_EQ(test_url, site_url);
+  else
+    EXPECT_EQ(GURL("data:"), site_url);
   EXPECT_EQ("data", site_url.scheme());
   EXPECT_FALSE(site_url.has_host());
+  test_url = GURL("data:text/html,foo#bar");
+  site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
+  EXPECT_FALSE(site_url.has_ref());
+  if (AreAllSitesIsolatedForTesting()) {
+    EXPECT_NE(test_url, site_url);
+    EXPECT_TRUE(site_url.EqualsIgnoringRef(test_url));
+  } else {
+    EXPECT_EQ(GURL("data:"), site_url);
+  }
 
   // Javascript URLs should include the scheme.
   test_url = GURL("javascript:foo();");
@@ -344,16 +357,24 @@
   EXPECT_EQ("file", site_url.scheme());
   EXPECT_FALSE(site_url.has_host());
 
-  // Blob URLs created from a unique origin use the full URL as the site URL,
-  // except for the hash.
+  // Blob URLs created from a unique origin use the full URL as the site URL
+  // when Site Isolation is enabled, except for the hash.  Otherwise they just
+  // include the scheme.
   test_url = GURL("blob:null/1029e5a4-2983-4b90-a585-ed217563acfeb");
   site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
-  EXPECT_EQ(site_url, test_url);
+  if (AreAllSitesIsolatedForTesting())
+    EXPECT_EQ(test_url, site_url);
+  else
+    EXPECT_EQ(GURL("blob:"), site_url);
   test_url = GURL("blob:null/1029e5a4-2983-4b90-a585-ed217563acfeb#foo");
   site_url = SiteInstanceImpl::GetSiteForURL(nullptr, test_url);
-  EXPECT_NE(site_url, test_url);
   EXPECT_FALSE(site_url.has_ref());
-  EXPECT_TRUE(site_url.EqualsIgnoringRef(test_url));
+  if (AreAllSitesIsolatedForTesting()) {
+    EXPECT_NE(test_url, site_url);
+    EXPECT_TRUE(site_url.EqualsIgnoringRef(test_url));
+  } else {
+    EXPECT_EQ(GURL("blob:"), site_url);
+  }
 
   // Private domains are preserved, appspot being such a site.
   test_url = GURL(
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc
index d7d030b..26dbd2c 100644
--- a/content/browser/site_per_process_browsertest.cc
+++ b/content/browser/site_per_process_browsertest.cc
@@ -247,7 +247,7 @@
 
   NotificationSource source_;
   NotificationDetails details_;
-  scoped_refptr<MessageLoopRunner> message_loop_runner_;
+  base::RunLoop run_loop_;
 
   DISALLOW_COPY_AND_ASSIGN(RedirectNotificationObserver);
 };
@@ -268,8 +268,7 @@
     return;
 
   running_ = true;
-  message_loop_runner_ = new MessageLoopRunner;
-  message_loop_runner_->Run();
+  run_loop_.Run();
   EXPECT_TRUE(seen_);
 }
 
@@ -284,7 +283,7 @@
   if (!running_)
     return;
 
-  message_loop_runner_->Quit();
+  run_loop_.Quit();
   running_ = false;
 }
 
@@ -297,8 +296,7 @@
                                  int expected_frame_count)
       : WebContentsObserver(web_contents),
         expected_frame_count_(expected_frame_count),
-        frames_created_(0),
-        message_loop_runner_(new MessageLoopRunner) {}
+        frames_created_(0) {}
 
   ~RenderFrameHostCreatedObserver() override;
 
@@ -316,8 +314,8 @@
   // The number of RenderFrameHosts that have been created.
   int frames_created_;
 
-  // The MessageLoopRunner used to spin the message loop.
-  scoped_refptr<MessageLoopRunner> message_loop_runner_;
+  // The RunLoop used to spin the message loop.
+  base::RunLoop run_loop_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderFrameHostCreatedObserver);
 };
@@ -326,14 +324,14 @@
 }
 
 void RenderFrameHostCreatedObserver::Wait() {
-  message_loop_runner_->Run();
+  run_loop_.Run();
 }
 
 void RenderFrameHostCreatedObserver::RenderFrameCreated(
     RenderFrameHost* render_frame_host) {
   frames_created_++;
   if (frames_created_ == expected_frame_count_) {
-    message_loop_runner_->Quit();
+    run_loop_.Quit();
   }
 }
 
@@ -7185,22 +7183,23 @@
 // Helper class to wait for a ShutdownRequest message to arrive.
 class ShutdownObserver : public RenderProcessHostObserver {
  public:
-  ShutdownObserver() : message_loop_runner_(new MessageLoopRunner) {}
+  ShutdownObserver() = default;
 
   void RenderProcessShutdownRequested(RenderProcessHost* host) override {
     has_received_shutdown_request_ = true;
-    message_loop_runner_->Quit();
+    run_loop_.Quit();
   }
 
-  void Wait() { message_loop_runner_->Run(); }
+  void Wait() { run_loop_.Run(); }
 
   bool has_received_shutdown_request() {
     return has_received_shutdown_request_;
   }
 
  private:
-  scoped_refptr<MessageLoopRunner> message_loop_runner_;
+  base::RunLoop run_loop_;
   bool has_received_shutdown_request_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(ShutdownObserver);
 };
 
@@ -7290,8 +7289,8 @@
 }
 
 // Ensures that navigating to data: URLs present in session history will
-// correctly commit the navigation in the same process as the parent frame.
-// See https://crbug.com/606996.
+// correctly commit the navigation in the same process as the one used for the
+// original navigation. See https://crbug.com/606996.
 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
                        NavigateSubframeToDataUrlInSessionHistory) {
   GURL main_url(embedded_test_server()->GetURL(
@@ -7317,7 +7316,7 @@
   EXPECT_TRUE(observer.last_navigation_succeeded());
   EXPECT_EQ(data_url, observer.last_navigation_url());
   scoped_refptr<SiteInstanceImpl> orig_site_instance =
-    child->current_frame_host()->GetSiteInstance();
+      child->current_frame_host()->GetSiteInstance();
   EXPECT_NE(root->current_frame_host()->GetSiteInstance(), orig_site_instance);
 
   // Navigate it to another cross-site url.
@@ -7337,6 +7336,286 @@
   EXPECT_EQ(orig_site_instance, child->current_frame_host()->GetSiteInstance());
 }
 
+// Ensures that subframes navigated to data: URLs start in a process based on
+// their creator, but end up in unique processes after a restore (since
+// SiteInstance relationships are not preserved on restore, until
+// https://crbug.com/14987 is fixed).  This is better than restoring into the
+// parent process, per https://crbug.com/863069.
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       SubframeDataUrlsAfterRestore) {
+  // We must use a page that has iframes in the HTML here, unlike
+  // cross_site_iframe_factory.html which loads them dynamically.  In the latter
+  // case, Chrome will not restore subframe URLs from history, which is needed
+  // for this test.
+  GURL main_url(embedded_test_server()->GetURL(
+      "a.com", "/frame_tree/page_with_two_iframes.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  FrameTreeNode* root = web_contents()->GetFrameTree()->root();
+  EXPECT_EQ(2U, root->child_count());
+  EXPECT_EQ(
+      " Site A ------------ proxies for B C\n"
+      "   |--Site B ------- proxies for A C\n"
+      "   +--Site C ------- proxies for A B\n"
+      "Where A = http://a.com/\n"
+      "      B = http://bar.com/\n"
+      "      C = http://baz.com/",
+      DepictFrameTree(root));
+
+  FrameTreeNode* child_0 = root->child_at(0);
+  FrameTreeNode* child_1 = root->child_at(1);
+  scoped_refptr<SiteInstanceImpl> child_site_instance_0 =
+      child_0->current_frame_host()->GetSiteInstance();
+  scoped_refptr<SiteInstanceImpl> child_site_instance_1 =
+      child_1->current_frame_host()->GetSiteInstance();
+
+  // Navigate the iframes to data URLs via renderer initiated navigations, which
+  // will commit in the existing SiteInstances.
+  TestNavigationObserver observer(shell()->web_contents());
+  GURL data_url_0("data:text/html,dataurl_0");
+  {
+    TestFrameNavigationObserver commit_observer(child_0);
+    EXPECT_TRUE(
+        ExecuteScript(child_0, "location.href = '" + data_url_0.spec() + "';"));
+    commit_observer.WaitForCommit();
+  }
+  EXPECT_TRUE(observer.last_navigation_succeeded());
+  EXPECT_EQ(data_url_0, observer.last_navigation_url());
+  EXPECT_EQ(child_site_instance_0,
+            child_0->current_frame_host()->GetSiteInstance());
+
+  GURL data_url_1("data:text/html,dataurl_1");
+  {
+    TestFrameNavigationObserver commit_observer(child_1);
+    EXPECT_TRUE(
+        ExecuteScript(child_1, "location.href = '" + data_url_1.spec() + "';"));
+    commit_observer.WaitForCommit();
+  }
+  EXPECT_TRUE(observer.last_navigation_succeeded());
+  EXPECT_EQ(data_url_1, observer.last_navigation_url());
+  EXPECT_EQ(child_site_instance_1,
+            child_1->current_frame_host()->GetSiteInstance());
+
+  // Grab the NavigationEntry and clone its PageState into a new entry for
+  // restoring into a new tab.
+  const NavigationControllerImpl& controller =
+      static_cast<const NavigationControllerImpl&>(
+          shell()->web_contents()->GetController());
+  NavigationEntryImpl* entry = controller.GetLastCommittedEntry();
+  std::unique_ptr<NavigationEntryImpl> restored_entry =
+      NavigationEntryImpl::FromNavigationEntry(
+          NavigationController::CreateNavigationEntry(
+              main_url, Referrer(), ui::PAGE_TRANSITION_RELOAD, false,
+              std::string(), controller.GetBrowserContext(),
+              nullptr /* blob_url_loader_factory */));
+  EXPECT_EQ(0U, restored_entry->root_node()->children.size());
+  restored_entry->SetPageState(entry->GetPageState());
+  ASSERT_EQ(2U, restored_entry->root_node()->children.size());
+
+  // Restore the NavigationEntry into a new tab and check that the data URLs are
+  // not loaded into the parent's SiteInstance.
+  std::vector<std::unique_ptr<NavigationEntry>> entries;
+  entries.push_back(std::move(restored_entry));
+  Shell* new_shell = Shell::CreateNewWindow(
+      controller.GetBrowserContext(), GURL::EmptyGURL(), nullptr, gfx::Size());
+  FrameTreeNode* new_root =
+      static_cast<WebContentsImpl*>(new_shell->web_contents())
+          ->GetFrameTree()
+          ->root();
+  NavigationControllerImpl& new_controller =
+      static_cast<NavigationControllerImpl&>(
+          new_shell->web_contents()->GetController());
+  new_controller.Restore(entries.size() - 1,
+                         RestoreType::LAST_SESSION_EXITED_CLEANLY, &entries);
+  ASSERT_EQ(0u, entries.size());
+  {
+    TestNavigationObserver restore_observer(new_shell->web_contents());
+    new_controller.LoadIfNecessary();
+    restore_observer.Wait();
+  }
+  ASSERT_EQ(2U, new_root->child_count());
+  EXPECT_EQ(main_url, new_root->current_url());
+  EXPECT_EQ("data", new_root->child_at(0)->current_url().scheme());
+  EXPECT_EQ("data", new_root->child_at(1)->current_url().scheme());
+
+  EXPECT_NE(new_root->current_frame_host()->GetSiteInstance(),
+            new_root->child_at(0)->current_frame_host()->GetSiteInstance());
+  EXPECT_NE(new_root->current_frame_host()->GetSiteInstance(),
+            new_root->child_at(1)->current_frame_host()->GetSiteInstance());
+  EXPECT_NE(new_root->child_at(0)->current_frame_host()->GetSiteInstance(),
+            new_root->child_at(1)->current_frame_host()->GetSiteInstance());
+}
+
+// Similar to SubframeDataUrlsAfterRestore, but ensures that about:blank frames
+// do get put into their parent process after restore, even if they weren't
+// originally.  This is safe because they do not contain active content (even
+// when there's a fragment in the URL), and it avoids unnecessary OOPIFs.
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       SubframeBlankUrlsAfterRestore) {
+  // We must use a page that has iframes in the HTML here, unlike
+  // cross_site_iframe_factory.html which loads them dynamically.  In the latter
+  // case, Chrome will not restore subframe URLs from history, which is needed
+  // for this test.
+  GURL main_url(embedded_test_server()->GetURL(
+      "a.com", "/frame_tree/page_with_two_iframes.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  FrameTreeNode* root = web_contents()->GetFrameTree()->root();
+  EXPECT_EQ(2U, root->child_count());
+  EXPECT_EQ(
+      " Site A ------------ proxies for B C\n"
+      "   |--Site B ------- proxies for A C\n"
+      "   +--Site C ------- proxies for A B\n"
+      "Where A = http://a.com/\n"
+      "      B = http://bar.com/\n"
+      "      C = http://baz.com/",
+      DepictFrameTree(root));
+
+  FrameTreeNode* child_0 = root->child_at(0);
+  FrameTreeNode* child_1 = root->child_at(1);
+  scoped_refptr<SiteInstanceImpl> child_site_instance_0 =
+      child_0->current_frame_host()->GetSiteInstance();
+  scoped_refptr<SiteInstanceImpl> child_site_instance_1 =
+      child_1->current_frame_host()->GetSiteInstance();
+
+  // Navigate the iframes to about:blank URLs via renderer initiated
+  // navigations, which will commit in the existing SiteInstances.
+  TestNavigationObserver observer(shell()->web_contents());
+  GURL blank_url("about:blank");
+  {
+    TestFrameNavigationObserver commit_observer(child_0);
+    EXPECT_TRUE(
+        ExecuteScript(child_0, "location.href = '" + blank_url.spec() + "';"));
+    commit_observer.WaitForCommit();
+  }
+  EXPECT_TRUE(observer.last_navigation_succeeded());
+  EXPECT_EQ(blank_url, observer.last_navigation_url());
+  EXPECT_EQ(child_site_instance_0,
+            child_0->current_frame_host()->GetSiteInstance());
+
+  GURL blank_url_ref("about:blank#1");
+  {
+    TestFrameNavigationObserver commit_observer(child_1);
+    EXPECT_TRUE(ExecuteScript(
+        child_1, "location.href = '" + blank_url_ref.spec() + "';"));
+    commit_observer.WaitForCommit();
+  }
+  EXPECT_TRUE(observer.last_navigation_succeeded());
+  EXPECT_EQ(blank_url_ref, observer.last_navigation_url());
+  EXPECT_EQ(child_site_instance_1,
+            child_1->current_frame_host()->GetSiteInstance());
+
+  // Grab the NavigationEntry and clone its PageState into a new entry for
+  // restoring into a new tab.
+  const NavigationControllerImpl& controller =
+      static_cast<const NavigationControllerImpl&>(
+          shell()->web_contents()->GetController());
+  NavigationEntryImpl* entry = controller.GetLastCommittedEntry();
+  std::unique_ptr<NavigationEntryImpl> restored_entry =
+      NavigationEntryImpl::FromNavigationEntry(
+          NavigationController::CreateNavigationEntry(
+              main_url, Referrer(), ui::PAGE_TRANSITION_RELOAD, false,
+              std::string(), controller.GetBrowserContext(),
+              nullptr /* blob_url_loader_factory */));
+  EXPECT_EQ(0U, restored_entry->root_node()->children.size());
+  restored_entry->SetPageState(entry->GetPageState());
+  ASSERT_EQ(2U, restored_entry->root_node()->children.size());
+
+  // Restore the NavigationEntry into a new tab and check that the data URLs are
+  // not loaded into the parent's SiteInstance.
+  std::vector<std::unique_ptr<NavigationEntry>> entries;
+  entries.push_back(std::move(restored_entry));
+  Shell* new_shell = Shell::CreateNewWindow(
+      controller.GetBrowserContext(), GURL::EmptyGURL(), nullptr, gfx::Size());
+  FrameTreeNode* new_root =
+      static_cast<WebContentsImpl*>(new_shell->web_contents())
+          ->GetFrameTree()
+          ->root();
+  NavigationControllerImpl& new_controller =
+      static_cast<NavigationControllerImpl&>(
+          new_shell->web_contents()->GetController());
+  new_controller.Restore(entries.size() - 1,
+                         RestoreType::LAST_SESSION_EXITED_CLEANLY, &entries);
+  ASSERT_EQ(0u, entries.size());
+  {
+    TestNavigationObserver restore_observer(new_shell->web_contents());
+    new_controller.LoadIfNecessary();
+    restore_observer.Wait();
+  }
+  ASSERT_EQ(2U, new_root->child_count());
+  EXPECT_EQ(main_url, new_root->current_url());
+  EXPECT_TRUE(new_root->child_at(0)->current_url().IsAboutBlank());
+  EXPECT_TRUE(new_root->child_at(1)->current_url().IsAboutBlank());
+
+  EXPECT_EQ(new_root->current_frame_host()->GetSiteInstance(),
+            new_root->child_at(0)->current_frame_host()->GetSiteInstance());
+  EXPECT_EQ(new_root->current_frame_host()->GetSiteInstance(),
+            new_root->child_at(1)->current_frame_host()->GetSiteInstance());
+}
+
+// Similar to SubframeBlankUrlsAfterRestore, but ensures that about:srcdoc ends
+// up in its parent's process after restore, since that's where its content
+// comes from.
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       SubframeSrcdocUrlAfterRestore) {
+  // Load a page that uses iframe srcdoc.
+  GURL main_url(embedded_test_server()->GetURL(
+      "a.com", "/frame_tree/page_with_srcdoc_frame.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  FrameTreeNode* root = web_contents()->GetFrameTree()->root();
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* child = root->child_at(0);
+  scoped_refptr<SiteInstanceImpl> child_site_instance =
+      child->current_frame_host()->GetSiteInstance();
+  EXPECT_EQ(child_site_instance, root->current_frame_host()->GetSiteInstance());
+
+  // Grab the NavigationEntry and clone its PageState into a new entry for
+  // restoring into a new tab.
+  const NavigationControllerImpl& controller =
+      static_cast<const NavigationControllerImpl&>(
+          shell()->web_contents()->GetController());
+  NavigationEntryImpl* entry = controller.GetLastCommittedEntry();
+  std::unique_ptr<NavigationEntryImpl> restored_entry =
+      NavigationEntryImpl::FromNavigationEntry(
+          NavigationController::CreateNavigationEntry(
+              main_url, Referrer(), ui::PAGE_TRANSITION_RELOAD, false,
+              std::string(), controller.GetBrowserContext(),
+              nullptr /* blob_url_loader_factory */));
+  EXPECT_EQ(0U, restored_entry->root_node()->children.size());
+  restored_entry->SetPageState(entry->GetPageState());
+  ASSERT_EQ(1U, restored_entry->root_node()->children.size());
+
+  // Restore the NavigationEntry into a new tab and check that the srcdoc URLs
+  // are still loaded into the parent's SiteInstance.
+  std::vector<std::unique_ptr<NavigationEntry>> entries;
+  entries.push_back(std::move(restored_entry));
+  Shell* new_shell = Shell::CreateNewWindow(
+      controller.GetBrowserContext(), GURL::EmptyGURL(), nullptr, gfx::Size());
+  FrameTreeNode* new_root =
+      static_cast<WebContentsImpl*>(new_shell->web_contents())
+          ->GetFrameTree()
+          ->root();
+  NavigationControllerImpl& new_controller =
+      static_cast<NavigationControllerImpl&>(
+          new_shell->web_contents()->GetController());
+  new_controller.Restore(entries.size() - 1,
+                         RestoreType::LAST_SESSION_EXITED_CLEANLY, &entries);
+  ASSERT_EQ(0u, entries.size());
+  {
+    TestNavigationObserver restore_observer(new_shell->web_contents());
+    new_controller.LoadIfNecessary();
+    restore_observer.Wait();
+  }
+  ASSERT_EQ(1U, new_root->child_count());
+  EXPECT_EQ(main_url, new_root->current_url());
+  EXPECT_EQ(GURL(content::kAboutSrcDocURL),
+            new_root->child_at(0)->current_url());
+
+  EXPECT_EQ(new_root->current_frame_host()->GetSiteInstance(),
+            new_root->child_at(0)->current_frame_host()->GetSiteInstance());
+}
+
 // Ensures that navigating to about:blank URLs present in session history will
 // correctly commit the navigation in the same process as the one used for
 // the original navigation.
@@ -7443,8 +7722,7 @@
  public:
   PendingWidgetMessageFilter()
       : BrowserMessageFilter(kMessageClasses, arraysize(kMessageClasses)),
-        routing_id_(MSG_ROUTING_NONE),
-        message_loop_runner_(new MessageLoopRunner) {}
+        routing_id_(MSG_ROUTING_NONE) {}
 
   bool OnMessageReceived(const IPC::Message& message) override {
     bool handled = true;
@@ -7456,9 +7734,7 @@
     return handled;
   }
 
-  void Wait() {
-    message_loop_runner_->Run();
-  }
+  void Wait() { run_loop_.Run(); }
 
   int routing_id() { return routing_id_; }
 
@@ -7484,11 +7760,11 @@
 
   void OnReceivedRoutingIDOnUI(int widget_routing_id) {
     routing_id_ = widget_routing_id;
-    message_loop_runner_->Quit();
+    run_loop_.Quit();
   }
 
   int routing_id_;
-  scoped_refptr<MessageLoopRunner> message_loop_runner_;
+  base::RunLoop run_loop_;
 
   DISALLOW_COPY_AND_ASSIGN(PendingWidgetMessageFilter);
 };
@@ -9357,7 +9633,6 @@
  public:
   SetIsInertMessageFilter()
       : content::BrowserMessageFilter(FrameMsgStart),
-        message_loop_runner_(new content::MessageLoopRunner),
         msg_received_(false) {}
 
   bool OnMessageReceived(const IPC::Message& message) override {
@@ -9369,7 +9644,7 @@
 
   bool is_inert() const { return is_inert_; }
 
-  void Wait() { message_loop_runner_->Run(); }
+  void Wait() { run_loop_.Run(); }
 
  private:
   ~SetIsInertMessageFilter() override {}
@@ -9384,10 +9659,10 @@
     is_inert_ = is_inert;
     if (!msg_received_) {
       msg_received_ = true;
-      message_loop_runner_->Quit();
+      run_loop_.Quit();
     }
   }
-  scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+  base::RunLoop run_loop_;
   bool msg_received_;
   bool is_inert_;
   DISALLOW_COPY_AND_ASSIGN(SetIsInertMessageFilter);
@@ -12489,13 +12764,12 @@
 // |web_contents|.
 class SameDocumentCommitObserver : public WebContentsObserver {
  public:
-  SameDocumentCommitObserver(WebContents* web_contents)
-      : WebContentsObserver(web_contents),
-        message_loop_runner_(new MessageLoopRunner) {
+  explicit SameDocumentCommitObserver(WebContents* web_contents)
+      : WebContentsObserver(web_contents) {
     EXPECT_TRUE(web_contents);
   }
 
-  void Wait() { message_loop_runner_->Run(); }
+  void Wait() { run_loop_.Run(); }
 
   const GURL& last_committed_url() { return last_committed_url_; }
 
@@ -12503,12 +12777,12 @@
   void DidFinishNavigation(NavigationHandle* navigation_handle) override {
     if (navigation_handle->IsSameDocument()) {
       last_committed_url_ = navigation_handle->GetURL();
-      message_loop_runner_->Quit();
+      run_loop_.Quit();
     }
   }
 
   GURL last_committed_url_;
-  scoped_refptr<MessageLoopRunner> message_loop_runner_;
+  base::RunLoop run_loop_;
 
   DISALLOW_COPY_AND_ASSIGN(SameDocumentCommitObserver);
 };
@@ -12746,6 +13020,83 @@
   EXPECT_TRUE(b_process_observer.did_exit_normally());
 }
 
+// This observer waits until WebContentsObserver::OnRendererUnresponsive
+// notification.
+class UnresponsiveRendererObserver : public WebContentsObserver {
+ public:
+  explicit UnresponsiveRendererObserver(WebContents* web_contents)
+      : WebContentsObserver(web_contents) {}
+
+  ~UnresponsiveRendererObserver() override {}
+
+  RenderProcessHost* Wait() {
+    if (!captured_render_process_host_)
+      run_loop_.Run();
+    return captured_render_process_host_;
+  }
+
+ private:
+  void OnRendererUnresponsive(RenderProcessHost* render_process_host) override {
+    captured_render_process_host_ = render_process_host;
+    run_loop_.Quit();
+  }
+
+  RenderProcessHost* captured_render_process_host_ = nullptr;
+  base::RunLoop run_loop_;
+
+  DISALLOW_COPY_AND_ASSIGN(UnresponsiveRendererObserver);
+};
+
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
+                       CommitTimeoutForHungRenderer) {
+  // Navigate first tab to a.com.
+  GURL url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+  RenderProcessHost* a_process =
+      shell()->web_contents()->GetMainFrame()->GetProcess();
+
+  // Use window.open to open b.com in a second tab.  Using a renderer-initiated
+  // navigation is important to leave a.com and b.com SiteInstances in the same
+  // BrowsingInstance (so the b.com -> a.com navigation in the next test step
+  // will reuse the process associated with the first a.com tab).
+  const char* kWindowOpenScript = R"(
+      var anchor = document.createElement("a");
+      anchor.href = "/cross-site/b.com/title2.html";
+      anchor.target = "_blank";
+      document.body.appendChild(anchor);
+      anchor.click(); )";
+  WebContentsAddedObserver new_window_observer;
+  EXPECT_TRUE(ExecuteScript(shell()->web_contents(), kWindowOpenScript));
+  WebContents* new_window = new_window_observer.GetWebContents();
+  EXPECT_TRUE(WaitForLoadStop(new_window));
+  RenderProcessHost* b_process = new_window->GetMainFrame()->GetProcess();
+  EXPECT_NE(a_process, b_process);
+
+  // Hang the first tab's renderer.
+  const char* kHungScript = "setTimeout(function() { for (;;) {}; }, 0);";
+  EXPECT_TRUE(ExecuteScript(shell()->web_contents(), kHungScript));
+
+  // Attempt to navigate the second tab to a.com.  This will attempt to reuse
+  // the hung process.
+  NavigationHandleImpl::SetCommitTimeoutForTesting(
+      base::TimeDelta::FromMilliseconds(100));
+  const char* kNavigationScript = R"(
+      var anchor = document.createElement("a");
+      anchor.href = "/cross-site/a.com/title3.html";
+      document.body.appendChild(anchor);
+      anchor.click(); )";
+  UnresponsiveRendererObserver unresponsive_renderer_observer(new_window);
+  EXPECT_TRUE(ExecuteScript(new_window, kNavigationScript));
+
+  // Verify that we will be notified about the unresponsive renderer.  Before
+  // changes in https://crrev.com/c/1089797, the test would hang here forever.
+  RenderProcessHost* hung_process = unresponsive_renderer_observer.Wait();
+  EXPECT_EQ(hung_process, a_process);
+
+  // Reset the timeout.
+  NavigationHandleImpl::SetCommitTimeoutForTesting(base::TimeDelta());
+}
+
 // Tests that an inner WebContents will reattach to its outer WebContents after
 // a navigation that causes a process swap.
 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, ProcessSwapOnInnerContents) {
diff --git a/content/browser/site_per_process_hit_test_browsertest.cc b/content/browser/site_per_process_hit_test_browsertest.cc
index d91308a..16091662 100644
--- a/content/browser/site_per_process_hit_test_browsertest.cc
+++ b/content/browser/site_per_process_hit_test_browsertest.cc
@@ -4681,7 +4681,7 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestDataGenerationBrowserTest,
-                       ClippedOOPIFFastPath) {
+                       DISABLED_ClippedOOPIFFastPath) {
   if (!features::IsVizHitTestingEnabled())
     return;
   auto hit_test_data =
diff --git a/content/browser/storage_partition_impl_map.cc b/content/browser/storage_partition_impl_map.cc
index 24841be..c93fd1e6 100644
--- a/content/browser/storage_partition_impl_map.cc
+++ b/content/browser/storage_partition_impl_map.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "content/browser/appcache/appcache_interceptor.h"
diff --git a/content/browser/tracing/cast_tracing_agent.cc b/content/browser/tracing/cast_tracing_agent.cc
index 6e5bf55a..1ebf9cb 100644
--- a/content/browser/tracing/cast_tracing_agent.cc
+++ b/content/browser/tracing/cast_tracing_agent.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/logging.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/trace_event/trace_config.h"
 #include "chromecast/tracing/system_tracing_common.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/tracing/cros_tracing_agent.cc b/content/browser/tracing/cros_tracing_agent.cc
index 530d7f2b..476789e 100644
--- a/content/browser/tracing/cros_tracing_agent.cc
+++ b/content/browser/tracing/cros_tracing_agent.cc
@@ -10,7 +10,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted_memory.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_config.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/debug_daemon_client.h"
diff --git a/content/browser/tracing/tracing_controller_impl_data_endpoint.cc b/content/browser/tracing/tracing_controller_impl_data_endpoint.cc
index f857bf02..6f3d4fa 100644
--- a/content/browser/tracing/tracing_controller_impl_data_endpoint.cc
+++ b/content/browser/tracing/tracing_controller_impl_data_endpoint.cc
@@ -10,7 +10,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/pattern.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/tracing/tracing_controller_impl.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/tracing_controller.h"
diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc
index d210ea7..f82e6b7 100644
--- a/content/browser/web_contents/web_contents_android.cc
+++ b/content/browser/web_contents/web_contents_android.cc
@@ -19,7 +19,7 @@
 #include "base/lazy_instance.h"
 #include "base/logging.h"
 #include "base/metrics/user_metrics.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/accessibility/browser_accessibility_android.h"
 #include "content/browser/accessibility/browser_accessibility_manager_android.h"
 #include "content/browser/android/java/gin_java_bridge_dispatcher_host.h"
diff --git a/content/browser/web_contents/web_contents_user_data_unittest.cc b/content/browser/web_contents/web_contents_user_data_unittest.cc
index 81b6502..f967c37e 100644
--- a/content/browser/web_contents/web_contents_user_data_unittest.cc
+++ b/content/browser/web_contents/web_contents_user_data_unittest.cc
@@ -33,9 +33,6 @@
   friend class WebContentsUserData<WebContentsAttachedClass2>;
 };
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(WebContentsAttachedClass1);
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(WebContentsAttachedClass2);
-
 typedef RenderViewHostTestHarness WebContentsUserDataTest;
 
 TEST_F(WebContentsUserDataTest, OneInstanceTwoAttachments) {
diff --git a/content/browser/web_contents/web_drag_source_mac.mm b/content/browser/web_contents/web_drag_source_mac.mm
index 39624c8b..eea91c10 100644
--- a/content/browser/web_contents/web_drag_source_mac.mm
+++ b/content/browser/web_contents/web_drag_source_mac.mm
@@ -16,7 +16,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/browser/download/drag_download_file.h"
diff --git a/content/browser/web_package/signed_exchange_certificate_chain.cc b/content/browser/web_package/signed_exchange_certificate_chain.cc
index 1fd297d9..cb57be3f 100644
--- a/content/browser/web_package/signed_exchange_certificate_chain.cc
+++ b/content/browser/web_package/signed_exchange_certificate_chain.cc
@@ -17,7 +17,7 @@
 
 namespace {
 
-// https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html#cert-chain-format
+// https://wicg.github.io/webpackage/draft-yasskin-httpbis-origin-signed-exchanges-impl.html#cert-chain-format
 std::unique_ptr<SignedExchangeCertificateChain> ParseB1(
     base::span<const uint8_t> message,
     SignedExchangeDevToolsProxy* devtools_proxy) {
@@ -94,9 +94,9 @@
 
     auto ocsp_iter = cert_map.find(cbor::CBORValue(kOcspKey));
     if (i == 1) {
-      // Step 2. The first certificate’s ocsp value if any MUST be a complete,
+      // Step 2. The first certificate’s ocsp value MUST be a complete,
       // DER-encoded OCSP response for that certificate (using the ASN.1 type
-      // OCSPResponse defined in [RFC2560]). ... [spec text]
+      // OCSPResponse defined in [RFC6960]). ... [spec text]
       if (ocsp_iter == cert_map.end() || !ocsp_iter->second.is_bytestring()) {
         signed_exchange_utils::ReportErrorAndTraceEvent(
             devtools_proxy,
@@ -119,13 +119,11 @@
       return nullptr;
     }
 
-    // Step 3. Each certificate’s sct value MUST be a
+    // Step 3. Each certificate’s sct value if any MUST be a
     // SignedCertificateTimestampList for that certificate as defined by Section
     // 3.3 of [RFC6962]. [spec text]
     //
     // We use SCTs only of the main certificate.
-    // TODO(crbug.com/815025): Update the spec text once
-    // https://github.com/WICG/webpackage/issues/175 is resolved.
     if (i == 1) {
       auto sct_iter = cert_map.find(cbor::CBORValue(kSctKey));
       if (sct_iter != cert_map.end()) {
diff --git a/content/browser/webauth/authenticator_impl.h b/content/browser/webauth/authenticator_impl.h
index 6c9b9d3..8aa29ed 100644
--- a/content/browser/webauth/authenticator_impl.h
+++ b/content/browser/webauth/authenticator_impl.h
@@ -21,7 +21,7 @@
 #include "device/fido/fido_constants.h"
 #include "device/fido/fido_transport_protocol.h"
 #include "mojo/public/cpp/bindings/binding.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h"
 #include "url/origin.h"
 
 namespace base {
diff --git a/content/browser/webauth/authenticator_type_converters.h b/content/browser/webauth/authenticator_type_converters.h
index 4d4847b..2df51b53 100644
--- a/content/browser/webauth/authenticator_type_converters.h
+++ b/content/browser/webauth/authenticator_type_converters.h
@@ -15,7 +15,7 @@
 #include "device/fido/public_key_credential_rp_entity.h"
 #include "device/fido/public_key_credential_user_entity.h"
 #include "mojo/public/cpp/bindings/type_converter.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h"
 
 // TODO(hongjunchoi): Remove type converters and instead expose mojo interface
 // directly from device/fido service.
diff --git a/content/browser/webauth/scoped_virtual_authenticator_environment.h b/content/browser/webauth/scoped_virtual_authenticator_environment.h
index 378de2ff..0c0bf6f 100644
--- a/content/browser/webauth/scoped_virtual_authenticator_environment.h
+++ b/content/browser/webauth/scoped_virtual_authenticator_environment.h
@@ -15,7 +15,7 @@
 #include "content/common/content_export.h"
 #include "device/fido/fido_discovery.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
-#include "third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/webauth/virtual_authenticator.h b/content/browser/webauth/virtual_authenticator.h
index d048250..fe8ecc17 100644
--- a/content/browser/webauth/virtual_authenticator.h
+++ b/content/browser/webauth/virtual_authenticator.h
@@ -14,7 +14,7 @@
 #include "device/fido/fido_transport_protocol.h"
 #include "device/fido/virtual_fido_device.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
-#include "third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/webauth/webauth_browsertest.cc b/content/browser/webauth/webauth_browsertest.cc
index 622be33..57bc30c 100644
--- a/content/browser/webauth/webauth_browsertest.cc
+++ b/content/browser/webauth/webauth_browsertest.cc
@@ -42,7 +42,7 @@
 #include "services/service_manager/public/cpp/connector.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom.h"
 
 namespace content {
 
diff --git a/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc b/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc
index 965c78d9..b9b7ea1 100644
--- a/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc
+++ b/content/browser/webrtc/webrtc_audio_debug_recordings_browsertest.cc
@@ -104,10 +104,11 @@
   ~WebRtcAudioDebugRecordingsBrowserTest() override {}
 };
 
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(OS_LINUX)
 // Renderer crashes under Android ASAN: https://crbug.com/408496.
 // Renderer crashes under Android: https://crbug.com/820934.
 // Failures on Android M. https://crbug.com/535728.
+// Flaky on Linux: https://crbug.com/871182
 #define MAYBE_CallWithAudioDebugRecordings DISABLED_CallWithAudioDebugRecordings
 #else
 #define MAYBE_CallWithAudioDebugRecordings CallWithAudioDebugRecordings
@@ -252,10 +253,11 @@
   base::ThreadRestrictions::SetIOAllowed(prev_io_allowed);
 }
 
-#if defined(OS_ANDROID)
+#if defined(OS_ANDROID) || defined(OS_LINUX)
 // Renderer crashes under Android ASAN: https://crbug.com/408496.
 // Renderer crashes under Android: https://crbug.com/820934.
 // Failures on Android M. https://crbug.com/535728.
+// Flaky on Linux: https://crbug.com/871182
 #define MAYBE_TwoCallsWithAudioDebugRecordings \
   DISABLED_TwoCallsWithAudioDebugRecordings
 #else
diff --git a/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc b/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc
index f632cd6..032f9094 100644
--- a/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc
+++ b/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc
@@ -6,7 +6,6 @@
 #include "base/run_loop.h"
 #include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
-#include "components/viz/common/gl_helper.h"
 #include "components/viz/common/gpu/context_provider.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_features.h"
@@ -46,7 +45,7 @@
 class InvokeClosureOnDelete
     : public video_capture::mojom::ScopedAccessPermission {
  public:
-  InvokeClosureOnDelete(base::OnceClosure closure)
+  explicit InvokeClosureOnDelete(base::OnceClosure closure)
       : closure_(std::move(closure)) {}
 
   ~InvokeClosureOnDelete() override { std::move(closure_).Run(); }
@@ -98,14 +97,12 @@
     CHECK(context_provider_);
     gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
     CHECK(gl);
-    auto gl_helper = std::make_unique<viz::GLHelper>(
-        context_provider_->ContextGL(), context_provider_->ContextSupport());
 
     const uint8_t kDarkFrameByteValue = 0;
     const uint8_t kLightFrameByteValue = 200;
-    CreateDummyRgbFrame(gl, gl_helper.get(), kDarkFrameByteValue,
+    CreateDummyRgbFrame(gl, kDarkFrameByteValue,
                         &dummy_frame_0_mailbox_holder_);
-    CreateDummyRgbFrame(gl, gl_helper.get(), kLightFrameByteValue,
+    CreateDummyRgbFrame(gl, kLightFrameByteValue,
                         &dummy_frame_1_mailbox_holder_);
   }
 
@@ -169,7 +166,6 @@
 
  private:
   void CreateDummyRgbFrame(gpu::gles2::GLES2Interface* gl,
-                           viz::GLHelper* gl_helper,
                            uint8_t value_for_all_rgb_bytes,
                            std::vector<gpu::MailboxHolder>* target) {
     const int32_t kBytesPerRGBPixel = 3;
@@ -187,16 +183,25 @@
         target->push_back(gpu::MailboxHolder());
         continue;
       }
-      auto texture_id = gl_helper->CreateTexture();
-      auto mailbox_holder =
-          gl_helper->ProduceMailboxHolderFromTexture(texture_id);
 
+      GLuint texture_id = 0;
+      gl->GenTextures(1, &texture_id);
       gl->BindTexture(GL_TEXTURE_2D, texture_id);
+      gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+      gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+      gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+      gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
       gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kDummyFrameDimensions.width(),
                      kDummyFrameDimensions.height(), 0, GL_RGB,
                      GL_UNSIGNED_BYTE, dummy_frame_data.get());
       gl->BindTexture(GL_TEXTURE_2D, 0);
-      target->push_back(std::move(mailbox_holder));
+
+      gpu::Mailbox mailbox;
+      gl->ProduceTextureDirectCHROMIUM(texture_id, mailbox.name);
+      gpu::SyncToken sync_token;
+      gl->GenSyncTokenCHROMIUM(sync_token.GetData());
+
+      target->push_back(gpu::MailboxHolder(mailbox, sync_token, GL_TEXTURE_2D));
     }
     gl->ShallowFlushCHROMIUM();
     CHECK_EQ(gl->GetError(), static_cast<GLenum>(GL_NO_ERROR));
diff --git a/content/browser/webui/url_data_manager_backend.cc b/content/browser/webui/url_data_manager_backend.cc
index c413328..f1866d6 100644
--- a/content/browser/webui/url_data_manager_backend.cc
+++ b/content/browser/webui/url_data_manager_backend.cc
@@ -21,7 +21,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
diff --git a/content/browser/webui/web_ui_url_loader_factory.cc b/content/browser/webui/web_ui_url_loader_factory.cc
index 0012f1eb..a0e3980 100644
--- a/content/browser/webui/web_ui_url_loader_factory.cc
+++ b/content/browser/webui/web_ui_url_loader_factory.cc
@@ -13,7 +13,7 @@
 #include "base/memory/ref_counted_memory.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/browser/bad_message.h"
 #include "content/browser/blob_storage/blob_internals_url_loader.h"
 #include "content/browser/blob_storage/chrome_blob_storage_context.h"
diff --git a/content/child/child_process.cc b/content/child/child_process.cc
index f70ec7d..7b55e6f2 100644
--- a/content/child/child_process.cc
+++ b/content/child/child_process.cc
@@ -11,7 +11,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/process/process_handle.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_local.h"
 #include "build/build_config.h"
diff --git a/content/child/child_process.h b/content/child/child_process.h
index a765ec5..0721f11 100644
--- a/content/child/child_process.h
+++ b/content/child/child_process.h
@@ -10,7 +10,7 @@
 
 #include "base/macros.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/thread.h"
 #include "content/common/content_export.h"
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
index 67b5aaa..6387f299 100644
--- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
+++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -14,7 +14,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/child/dwrite_font_proxy/dwrite_localized_strings_win.h"
 #include "content/public/child/child_thread.h"
 #include "content/public/common/service_names.mojom.h"
diff --git a/content/common/BUILD.gn b/content/common/BUILD.gn
index 5d8b137..b4bcc6a 100644
--- a/content/common/BUILD.gn
+++ b/content/common/BUILD.gn
@@ -548,7 +548,6 @@
     "service_worker/embedded_worker.mojom",
     "service_worker/service_worker.mojom",
     "service_worker/service_worker_container.mojom",
-    "service_worker/service_worker_fetch_response_callback.mojom",
     "service_worker/service_worker_provider.mojom",
     "shared_worker/shared_worker.mojom",
     "shared_worker/shared_worker_client.mojom",
diff --git a/content/common/font_list.cc b/content/common/font_list.cc
index 9cac81c..2f40c93 100644
--- a/content/common/font_list.cc
+++ b/content/common/font_list.cc
@@ -4,7 +4,7 @@
 
 #include "content/common/font_list.h"
 
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 
 namespace content {
 
diff --git a/content/common/mac/font_loader.mm b/content/common/mac/font_loader.mm
index 2288eb3..2bfdbfb 100644
--- a/content/common/mac/font_loader.mm
+++ b/content/common/mac/font_loader.mm
@@ -18,7 +18,7 @@
 #include "base/mac/scoped_cftyperef.h"
 #import "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 
 namespace content {
diff --git a/content/common/notifications/OWNERS b/content/common/notifications/OWNERS
index c96491e9..cb33c42 100644
--- a/content/common/notifications/OWNERS
+++ b/content/common/notifications/OWNERS
@@ -1,7 +1,5 @@
 file://content/browser/notifications/OWNERS
 
-awdf@chromium.org
-
 per-file *_struct_traits*.*=set noparent
 per-file *_struct_traits*.*=file://ipc/SECURITY_OWNERS
 
diff --git a/content/common/service_worker/controller_service_worker.mojom b/content/common/service_worker/controller_service_worker.mojom
index 8c5b520..901ffcb 100644
--- a/content/common/service_worker/controller_service_worker.mojom
+++ b/content/common/service_worker/controller_service_worker.mojom
@@ -5,11 +5,11 @@
 module content.mojom;
 
 import "content/common/service_worker/service_worker.mojom";
-import "content/common/service_worker/service_worker_fetch_response_callback.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "services/network/public/mojom/url_loader.mojom";
 import "third_party/blink/public/mojom/service_worker/dispatch_fetch_event_params.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom";
+import "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
 import "third_party/blink/public/platform/modules/fetch/fetch_api_request.mojom";
 
@@ -37,8 +37,9 @@
   // handler ran and all outstanding respondWith() and waitUntil() promises have
   // settled. |response_callback| is called once the promise to respondWith()
   // settles, or when the event handler ran without calling respondWith().
-  DispatchFetchEvent(blink.mojom.DispatchFetchEventParams params,
-                     ServiceWorkerFetchResponseCallback response_callback)
+  DispatchFetchEvent(
+      blink.mojom.DispatchFetchEventParams params,
+      blink.mojom.ServiceWorkerFetchResponseCallback response_callback)
       => (blink.mojom.ServiceWorkerEventStatus status,
           mojo_base.mojom.Time dispatch_event_time);
 
diff --git a/content/common/service_worker/service_worker.mojom b/content/common/service_worker/service_worker.mojom
index e468a14..e696947c 100644
--- a/content/common/service_worker/service_worker.mojom
+++ b/content/common/service_worker/service_worker.mojom
@@ -4,7 +4,6 @@
 
 module content.mojom;
 
-import "content/common/service_worker/service_worker_fetch_response_callback.mojom";
 import "mojo/public/mojom/base/string16.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "services/network/public/mojom/cookie_manager.mojom";
@@ -16,6 +15,7 @@
 import "third_party/blink/public/mojom/service_worker/service_worker.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_client.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom";
+import "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
 import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom";
 import "url/mojom/origin.mojom";
@@ -135,8 +135,9 @@
   // waitUntil() promises have settled. |response_callback| is called once the
   // promise to respondWith() settles, or when the event handler ran without
   // calling respondWith().
-  DispatchFetchEvent(blink.mojom.DispatchFetchEventParams params,
-                     ServiceWorkerFetchResponseCallback response_callback)
+  DispatchFetchEvent(
+      blink.mojom.DispatchFetchEventParams params,
+      blink.mojom.ServiceWorkerFetchResponseCallback response_callback)
       => (blink.mojom.ServiceWorkerEventStatus status,
           mojo_base.mojom.Time dispatch_event_time);
 
diff --git a/content/common/service_worker/service_worker.typemap b/content/common/service_worker/service_worker.typemap
index e829c003..7accc19 100644
--- a/content/common/service_worker/service_worker.typemap
+++ b/content/common/service_worker/service_worker.typemap
@@ -3,14 +3,9 @@
 # found in the LICENSE file.
 
 mojom = "//content/common/service_worker/service_worker.mojom"
-public_headers = [
-  "//content/common/background_fetch/background_fetch_types.h",
-  "//third_party/blink/public/common/service_worker/service_worker_status_code.h",
-  "//content/common/service_worker/service_worker_types.h",
-]
+public_headers = [ "//content/common/service_worker/service_worker_types.h" ]
 traits_headers = [ "//content/common/service_worker/service_worker_messages.h" ]
 type_mappings = [
-  "content.mojom.ExtendableMessageEventSource=::content::ExtendableMessageEventSource",
   "content.mojom.ServiceWorkerFetchRequest=::content::ServiceWorkerFetchRequest",
   "content.mojom.ServiceWorkerResponse=::content::ServiceWorkerResponse",
 ]
diff --git a/content/common/service_worker/service_worker_fetch_response_callback.mojom b/content/common/service_worker/service_worker_fetch_response_callback.mojom
deleted file mode 100644
index 43f64fba1..0000000
--- a/content/common/service_worker/service_worker_fetch_response_callback.mojom
+++ /dev/null
@@ -1,35 +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.
-
-module content.mojom;
-
-import "mojo/public/mojom/base/time.mojom";
-import "third_party/blink/public/mojom/blob/blob.mojom";
-import "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom";
-
-[Native]
-struct ServiceWorkerResponse;
-
-// Callback interface which is passed to a controller service worker through
-// DispatchFetchEvent (either via ServiceWorker or via ControllerServiceWorker
-// interface).
-// The receiver service worker uses this interface to respond to a fetch event.
-interface ServiceWorkerFetchResponseCallback {
-  // Responds to the request with |response|. The body is empty.
-  OnResponse(ServiceWorkerResponse response,
-             mojo_base.mojom.Time dispatch_event_time);
-  // Responds to the request with |response|. The body is returned as a blob.
-  // TODO(kinuko): This should not be necessary once we properly support
-  // transferring blob within |response|. See crbug.com/75523 for more details.
-  OnResponseBlob(ServiceWorkerResponse response,
-                 blink.mojom.Blob body_as_blob,
-                 mojo_base.mojom.Time dispatch_event_time);
-  // Responds to the request with |response|. The body is returned as a stream.
-  OnResponseStream(ServiceWorkerResponse response,
-                   blink.mojom.ServiceWorkerStreamHandle body_as_stream,
-                   mojo_base.mojom.Time dispatch_event_time);
-  // Provides no response to the request. The callee should fall back to the
-  // network.
-  OnFallback(mojo_base.mojom.Time dispatch_event_time);
-};
diff --git a/content/common/service_worker/service_worker_loader_helpers.cc b/content/common/service_worker/service_worker_loader_helpers.cc
index 431207de..27b6a61 100644
--- a/content/common/service_worker/service_worker_loader_helpers.cc
+++ b/content/common/service_worker/service_worker_loader_helpers.cc
@@ -46,7 +46,7 @@
 void ServiceWorkerLoaderHelpers::SaveResponseHeaders(
     const int status_code,
     const std::string& status_text,
-    const ServiceWorkerHeaderMap& headers,
+    const base::flat_map<std::string, std::string>& headers,
     network::ResourceResponseHead* out_head) {
   // Build a string instead of using HttpResponseHeaders::AddHeader on
   // each header, since AddHeader has O(n^2) performance.
@@ -82,7 +82,7 @@
 
 // static
 void ServiceWorkerLoaderHelpers::SaveResponseInfo(
-    const ServiceWorkerResponse& response,
+    const blink::mojom::FetchAPIResponse& response,
     network::ResourceResponseHead* out_head) {
   out_head->was_fetched_via_service_worker = true;
   out_head->was_fallback_required_by_service_worker = false;
@@ -90,7 +90,10 @@
   out_head->response_type_via_service_worker = response.response_type;
   out_head->response_time = response.response_time;
   out_head->is_in_cache_storage = response.is_in_cache_storage;
-  out_head->cache_storage_cache_name = response.cache_storage_cache_name;
+  if (response.cache_storage_cache_name)
+    out_head->cache_storage_cache_name = *(response.cache_storage_cache_name);
+  else
+    out_head->cache_storage_cache_name.clear();
   out_head->cors_exposed_header_names = response.cors_exposed_header_names;
   out_head->did_service_worker_navigation_preload = false;
 }
diff --git a/content/common/service_worker/service_worker_loader_helpers.h b/content/common/service_worker/service_worker_loader_helpers.h
index a709385..89d36f1f 100644
--- a/content/common/service_worker/service_worker_loader_helpers.h
+++ b/content/common/service_worker/service_worker_loader_helpers.h
@@ -5,11 +5,12 @@
 #ifndef CONTENT_COMMON_SERVICE_WORKER_SERVICE_WORKER_LOADER_HELPERS_H_
 #define CONTENT_COMMON_SERVICE_WORKER_SERVICE_WORKER_LOADER_HELPERS_H_
 
+#include "base/containers/flat_map.h"
 #include "base/optional.h"
-#include "content/common/service_worker/service_worker_types.h"
 #include "net/http/http_request_headers.h"
 #include "net/url_request/redirect_info.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
 
 namespace network {
 struct ResourceRequest;
@@ -24,12 +25,13 @@
  public:
   // Populates |out_head->headers| with the given |status_code|, |status_text|,
   // and |headers|.
-  static void SaveResponseHeaders(const int status_code,
-                                  const std::string& status_text,
-                                  const ServiceWorkerHeaderMap& headers,
-                                  network::ResourceResponseHead* out_head);
+  static void SaveResponseHeaders(
+      const int status_code,
+      const std::string& status_text,
+      const base::flat_map<std::string, std::string>& headers,
+      network::ResourceResponseHead* out_head);
   // Populates |out_head| (except for headers) with given |response|.
-  static void SaveResponseInfo(const ServiceWorkerResponse& response,
+  static void SaveResponseInfo(const blink::mojom::FetchAPIResponse& response,
                                network::ResourceResponseHead* out_head);
 
   // Returns a redirect info if |response_head| is an redirect response.
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h
index b7a38be..a49c3e8 100644
--- a/content/common/service_worker/service_worker_types.h
+++ b/content/common/service_worker/service_worker_types.h
@@ -121,10 +121,8 @@
   bool is_history_navigation = false;
 };
 
-// Roughly corresponds to the Fetch API's Response type. This struct has several
-// users:
-// - Service Worker API: The renderer sends the browser this type to
-// represent the response a service worker provided to FetchEvent#respondWith.
+// Roughly corresponds to the Fetch API's Response type. This struct has only
+// one user:
 // - Background Fetch API: Uses this type to represent responses to background
 // fetches.
 // Note that the Fetch API does not use this type; it uses ResourceResponse
@@ -158,9 +156,7 @@
   std::string status_text;
   network::mojom::FetchResponseType response_type;
   ServiceWorkerHeaderMap headers;
-  // |blob_uuid| and |blob_size| are set when the body is a blob. For other
-  // types of responses, the body is provided separately in Mojo IPC via
-  // ServiceWorkerFetchResponseCallback.
+  // |blob_uuid| and |blob_size| are set when the body is a blob.
   std::string blob_uuid;
   uint64_t blob_size;
   scoped_refptr<storage::BlobHandle> blob;
diff --git a/content/gpu/gpu_service_factory.cc b/content/gpu/gpu_service_factory.cc
index 086aaec..1f90da0 100644
--- a/content/gpu/gpu_service_factory.cc
+++ b/content/gpu/gpu_service_factory.cc
@@ -6,7 +6,7 @@
 
 #include <memory>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "services/shape_detection/public/mojom/constants.mojom.h"
diff --git a/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java b/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java
index aa44ccd..e58907e 100644
--- a/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java
+++ b/content/public/android/java/src/org/chromium/content/app/ContentChildProcessServiceDelegate.java
@@ -6,7 +6,6 @@
 
 import android.content.Context;
 import android.content.Intent;
-import android.graphics.SurfaceTexture;
 import android.os.Bundle;
 import android.os.IBinder;
 import android.os.RemoteException;
@@ -211,15 +210,12 @@
 
     @SuppressWarnings("unused")
     @CalledByNative
-    private void forwardSurfaceTextureForSurfaceRequest(
-            UnguessableToken requestToken, SurfaceTexture surfaceTexture) {
+    private void forwardSurfaceForSurfaceRequest(UnguessableToken requestToken, Surface surface) {
         if (mGpuCallback == null) {
             Log.e(TAG, "No callback interface has been provided.");
             return;
         }
 
-        Surface surface = new Surface(surfaceTexture);
-
         try {
             mGpuCallback.forwardSurfaceForSurfaceRequest(requestToken, surface);
         } catch (RemoteException e) {
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn
index 09ff5ec..0be1068 100644
--- a/content/public/browser/BUILD.gn
+++ b/content/public/browser/BUILD.gn
@@ -36,6 +36,8 @@
     "android/synchronous_compositor.h",
     "android/synchronous_compositor_client.h",
     "appcache_service.h",
+    "audio_loopback_stream_creator.cc",
+    "audio_loopback_stream_creator.h",
     "audio_service_info.cc",
     "audio_service_info.h",
     "authenticator_request_client_delegate.cc",
@@ -184,8 +186,6 @@
     "navigation_throttle.h",
     "navigation_type.h",
     "navigation_ui_data.h",
-    "network_connection_tracker.cc",
-    "network_connection_tracker.h",
     "network_quality_observer_factory.h",
     "network_service_instance.h",
     "notification_database_data.cc",
diff --git a/content/public/browser/audio_loopback_stream_creator.cc b/content/public/browser/audio_loopback_stream_creator.cc
new file mode 100644
index 0000000..cf1f4c5
--- /dev/null
+++ b/content/public/browser/audio_loopback_stream_creator.cc
@@ -0,0 +1,19 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/browser/audio_loopback_stream_creator.h"
+
+#include "content/browser/media/in_process_audio_loopback_stream_creator.h"
+
+namespace content {
+
+// static
+std::unique_ptr<AudioLoopbackStreamCreator>
+AudioLoopbackStreamCreator::CreateInProcessAudioLoopbackStreamCreator() {
+  return std::make_unique<InProcessAudioLoopbackStreamCreator>();
+}
+
+AudioLoopbackStreamCreator::~AudioLoopbackStreamCreator() = default;
+
+}  // namespace content
diff --git a/content/public/browser/audio_loopback_stream_creator.h b/content/public/browser/audio_loopback_stream_creator.h
new file mode 100644
index 0000000..f6fbb2e
--- /dev/null
+++ b/content/public/browser/audio_loopback_stream_creator.h
@@ -0,0 +1,53 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_AUDIO_LOOPBACK_STREAM_CREATOR_H_
+#define CONTENT_PUBLIC_BROWSER_AUDIO_LOOPBACK_STREAM_CREATOR_H_
+
+#include "base/callback.h"
+#include "content/common/content_export.h"
+#include "media/mojo/interfaces/audio_data_pipe.mojom.h"
+#include "media/mojo/interfaces/audio_input_stream.mojom.h"
+
+namespace media {
+class AudioParameters;
+}
+
+namespace content {
+
+class WebContents;
+
+// This interface is used by the embedder to ask the Audio Service to create a
+// loopback stream that either captures audio from a tab or the system-wide
+// loopback.
+// Note: Use this to request loopback audio for a privileged embedder feature,
+// and not for consumption by a renderer. For renderers, use the
+// mojom::RendererAudioInputStreamFactory interface instead.
+class CONTENT_EXPORT AudioLoopbackStreamCreator {
+ public:
+  virtual ~AudioLoopbackStreamCreator();
+
+  // The callback that is called when the requested stream is created.
+  using StreamCreatedCallback = base::RepeatingCallback<void(
+      media::mojom::AudioInputStreamPtr stream,
+      media::mojom::AudioInputStreamClientRequest client_request,
+      media::mojom::ReadOnlyAudioDataPipePtr data_pipe)>;
+
+  // Creates an InProcessAudioLoopbackStreamCreator that handles creating audio
+  // loopback stream through the Audio Service.
+  static std::unique_ptr<AudioLoopbackStreamCreator>
+  CreateInProcessAudioLoopbackStreamCreator();
+
+  // Creates a loopback stream that captures the audio from |loopback_source|,
+  // or the default system playback if |loopback_source| is null. Local output
+  // of the source/system audio is muted during capturing.
+  virtual void CreateLoopbackStream(WebContents* loopback_source,
+                                    const media::AudioParameters& params,
+                                    uint32_t total_segments,
+                                    const StreamCreatedCallback& callback) = 0;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_BROWSER_AUDIO_LOOPBACK_STREAM_CREATOR_H_
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 3d55d3ae..900e1c3d 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -107,7 +107,8 @@
   return true;
 }
 
-const char* ContentBrowserClient::GetInitatorSchemeBypassingDocumentBlocking() {
+const char*
+ContentBrowserClient::GetInitiatorSchemeBypassingDocumentBlocking() {
   return nullptr;
 }
 
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 1e01f5cd..5e35f1d 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -9,6 +9,7 @@
 
 #include <map>
 #include <memory>
+#include <set>
 #include <string>
 #include <utility>
 #include <vector>
@@ -16,7 +17,7 @@
 #include "base/callback.h"
 #include "base/containers/flat_set.h"
 #include "base/optional.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "content/public/browser/certificate_request_result_type.h"
@@ -293,7 +294,7 @@
   // Returns the scheme of request initiator that should be ignored by
   // cross-origin read blocking.  nullptr can be returned to indicate that no
   // exceptions should be granted based on initiator's scheme.
-  virtual const char* GetInitatorSchemeBypassingDocumentBlocking();
+  virtual const char* GetInitiatorSchemeBypassingDocumentBlocking();
 
   // Returns a list additional WebUI schemes, if any.  These additional schemes
   // act as aliases to the chrome: scheme.  The additional schemes may or may
diff --git a/content/public/browser/desktop_streams_registry.h b/content/public/browser/desktop_streams_registry.h
index fdd29124..ed9eb6a 100644
--- a/content/public/browser/desktop_streams_registry.h
+++ b/content/public/browser/desktop_streams_registry.h
@@ -11,10 +11,15 @@
 
 namespace content {
 
+enum DesktopStreamRegistryType {
+  kRegistryStreamTypeDesktop,
+  kRegistryStreamTypeTab
+};
+
 struct DesktopMediaID;
 
 // Interface to DesktopStreamsRegistry which is used to store accepted desktop
-// media streams for Desktop Capture API. Single instance of this class is
+// media streams for Desktop/Tab Capture API. Single instance of this class is
 // created at first time use. This should be called on UI thread.
 class CONTENT_EXPORT DesktopStreamsRegistry {
  public:
@@ -22,27 +27,30 @@
 
   static DesktopStreamsRegistry* GetInstance();
 
-  // Adds new stream to the registry. Called by the implementation of
-  // desktopCapture.chooseDesktopMedia() API after user has approved access to
-  // |source| for the |origin|. Returns identifier of the new stream.
+  // Adds new stream to the registry. Called by the implementation of either
+  // desktopCapture API or tabCapture API, differentiated by |type|, after user
+  // has approved access to |source| for the |origin|. Returns identifier of
+  // the new stream.
   // |render_frame_id| refers to the RenderFrame requesting the stream.
   virtual std::string RegisterStream(int render_process_id,
                                      int render_frame_id,
                                      const GURL& origin,
                                      const DesktopMediaID& source,
-                                     const std::string& extension_name) = 0;
+                                     const std::string& extension_name,
+                                     const DesktopStreamRegistryType type) = 0;
 
   // Validates stream identifier specified in getUserMedia(). Returns null
   // DesktopMediaID if the specified |id| is invalid, i.e. wasn't generated
   // using RegisterStream() or if it was generated for a different
-  // RenderFrame/origin. Otherwise returns ID of the source and removes it from
-  // the registry.
+  // RenderFrame/origin/type. Otherwise returns ID of the source and removes it
+  // from the registry.
   virtual DesktopMediaID RequestMediaForStreamId(
       const std::string& id,
       int render_process_id,
       int render_frame_id,
       const GURL& origin,
-      std::string* extension_name) = 0;
+      std::string* extension_name,
+      const DesktopStreamRegistryType type) = 0;
 };
 
 }  // namespace content
diff --git a/content/public/browser/gpu_utils.cc b/content/public/browser/gpu_utils.cc
index 78d1c989..fc977559 100644
--- a/content/public/browser/gpu_utils.cc
+++ b/content/public/browser/gpu_utils.cc
@@ -10,6 +10,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "build/build_config.h"
+#include "cc/base/switches.h"
 #include "content/browser/gpu/gpu_process_host.h"
 #include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
@@ -98,6 +99,9 @@
   gpu_preferences.enable_vulkan =
       command_line->HasSwitch(switches::kEnableVulkan);
 
+  gpu_preferences.enable_gpu_benchmarking_extension =
+      command_line->HasSwitch(cc::switches::kEnableGpuBenchmarking);
+
   // Some of these preferences are set or adjusted in
   // GpuDataManagerImplPrivate::AppendGpuCommandLine.
   return gpu_preferences;
diff --git a/content/public/browser/service_worker_context_observer.h b/content/public/browser/service_worker_context_observer.h
index 1f1b3b8..c8e4c8d 100644
--- a/content/public/browser/service_worker_context_observer.h
+++ b/content/public/browser/service_worker_context_observer.h
@@ -11,12 +11,24 @@
 
 class ServiceWorkerContextObserver {
  public:
-  // Called when a service worker has been registered with scope |pattern|.
+  // Called when a service worker has been registered with scope |scope|.
   //
   // This is called when the ServiceWorkerContainer.register() promise is
   // resolved, which happens before the service worker registration is persisted
   // to disk.
-  virtual void OnRegistrationCompleted(const GURL& pattern) {}
+  virtual void OnRegistrationCompleted(const GURL& scope) {}
+
+  // Called when the service worker with id |version_id| changes status to
+  // activated.
+  virtual void OnVersionActivated(int64_t version_id, const GURL& scope) {}
+
+  // Called when the service worker with id |version_id| changes status to
+  // redundant.
+  virtual void OnVersionRedundant(int64_t version_id, const GURL& scope) {}
+
+  // Called when there are no more controllees for the service worker with id
+  // |version_id|.
+  virtual void OnNoControllees(int64_t version_id, const GURL& scope) {}
 
  protected:
   virtual ~ServiceWorkerContextObserver() {}
diff --git a/content/public/browser/site_isolation_policy.cc b/content/public/browser/site_isolation_policy.cc
index a3df9c39..721cc826 100644
--- a/content/public/browser/site_isolation_policy.cc
+++ b/content/public/browser/site_isolation_policy.cc
@@ -94,7 +94,7 @@
   const char* initiator_scheme_exception =
       GetContentClient()
           ->browser()
-          ->GetInitatorSchemeBypassingDocumentBlocking();
+          ->GetInitiatorSchemeBypassingDocumentBlocking();
   if (initiator_scheme_exception)
     params->corb_excluded_initiator_scheme = initiator_scheme_exception;
 }
diff --git a/content/public/browser/webrtc_event_logger.h b/content/public/browser/webrtc_event_logger.h
index e7f29eae..9cecefad 100644
--- a/content/public/browser/webrtc_event_logger.h
+++ b/content/public/browser/webrtc_event_logger.h
@@ -45,7 +45,7 @@
   // This function must not be called for an off-the-records BrowserContext.
   // Local-logging is not associated with BrowserContexts, and is allowed even
   // if EnableForBrowserContext is not called. That is, even for incognito mode.
-  virtual void EnableForBrowserContext(const BrowserContext* browser_context,
+  virtual void EnableForBrowserContext(BrowserContext* browser_context,
                                        base::OnceClosure reply) = 0;
 
   // Disables WebRTC event logging for a given BrowserContext. New remote-bound
@@ -54,7 +54,7 @@
   // therefore be careful note to call any of BrowserContext's virtual methods.
   // TODO(eladalon): After changing to a Profile-centered interface, change this
   // to not even receive a pointer. https://crbug.com/775415
-  virtual void DisableForBrowserContext(const BrowserContext* browser_context,
+  virtual void DisableForBrowserContext(BrowserContext* browser_context,
                                         base::OnceClosure reply) = 0;
 
   // Call this to let the logger know when a PeerConnection was created.
diff --git a/content/public/common/DEPS b/content/public/common/DEPS
index 817d7a2..b84338e 100644
--- a/content/public/common/DEPS
+++ b/content/public/common/DEPS
@@ -19,7 +19,4 @@
   "simple_url_loader_unittest\.cc": [
     "+content/public/network",
   ],
-  "network_connection_tracker_unittest\.cc": [
-    "+content/public/network",
-  ],
 }
diff --git a/content/public/common/content_client.cc b/content/public/common/content_client.cc
index 2493243..998defab 100644
--- a/content/public/common/content_client.cc
+++ b/content/public/common/content_client.cc
@@ -6,6 +6,7 @@
 
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "content/public/common/origin_util.h"
 #include "content/public/common/user_agent.h"
@@ -102,6 +103,10 @@
   return std::string();
 }
 
+base::DictionaryValue ContentClient::GetNetLogConstants() const {
+  return base::DictionaryValue();
+}
+
 blink::OriginTrialPolicy* ContentClient::GetOriginTrialPolicy() {
   return nullptr;
 }
diff --git a/content/public/common/content_client.h b/content/public/common/content_client.h
index 528fd6ab..b939bc2a 100644
--- a/content/public/common/content_client.h
+++ b/content/public/common/content_client.h
@@ -20,6 +20,7 @@
 
 namespace base {
 class RefCountedMemory;
+class DictionaryValue;
 }
 
 namespace blink {
@@ -173,6 +174,14 @@
   // doesn't know about because they're from the embedder.
   virtual std::string GetProcessTypeNameInEnglish(int type);
 
+  // Called once during initialization of NetworkService to provide constants
+  // to NetLog.  (Though it may be called multiples times if NetworkService
+  // crashes and needs to be reinitialized).  The return value is merged with
+  // |GetNetConstants()| and passed to FileNetLogObserver - see documentation
+  // of |FileNetLogObserver::CreateBounded()| for more information.  The
+  // convention is to put new constants under a subdict at the key "clientInfo".
+  virtual base::DictionaryValue GetNetLogConstants() const;
+
   // Returns whether or not V8 script extensions should be allowed for a
   // service worker.
   virtual bool AllowScriptExtensionForServiceWorker(const GURL& script_url);
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 8fd9c696..70e4e9cd 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -516,13 +516,6 @@
 // overrides this if present.
 const char kForceRendererAccessibility[]    = "force-renderer-accessibility";
 
-// Sets the timeout seconds of NetworkQuietTimers in
-// FirstMeaningfulPainterDectector. Used by embedders who want to change the
-// timeout time in order to run web contents on various embedded devices and
-// changeable network bandwidths in different regions. For example, it's useful
-// when using FMP signal to dismiss a splash screen.
-const char kFMPNetworkQuietTimeout[] = "fmp-network-quiet-timeout";
-
 // For development / testing only. When running content_browsertests,
 // saves output of failing accessibility tests to their expectations files in
 // content/test/data/accessibility/, overwriting existing file content.
@@ -618,6 +611,13 @@
 // Use a Mojo-based LocalStorage implementation.
 const char kMojoLocalStorage[]              = "mojo-local-storage";
 
+// Sets the timeout seconds of the network-quiet timers in IdlenessDetector.
+// Used by embedders who want to change the timeout time in order to run web
+// contents on various embedded devices and changeable network bandwidths in
+// different regions. For example, it's useful when using FirstMeaningfulPaint
+// signal to dismiss a splash screen.
+const char kNetworkQuietTimeout[] = "network-quiet-timeout";
+
 // Disables the use of a zygote process for forking child processes. Instead,
 // child processes will be forked and exec'd directly. Note that --no-sandbox
 // should also be used together with this flag because the sandbox needs the
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index df013d7..b9f3633 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -157,7 +157,6 @@
 CONTENT_EXPORT extern const char kForceOverlayFullscreenVideo[];
 CONTENT_EXPORT extern const char kForcePresentationReceiverForTesting[];
 CONTENT_EXPORT extern const char kForceRendererAccessibility[];
-CONTENT_EXPORT extern const char kFMPNetworkQuietTimeout[];
 CONTENT_EXPORT extern const char kGenerateAccessibilityTestExpectations[];
 extern const char kGpuLauncher[];
 CONTENT_EXPORT extern const char kGpuProcess[];
@@ -185,6 +184,7 @@
 CONTENT_EXPORT extern const char kMHTMLSkipNostoreMain[];
 CONTENT_EXPORT extern const char kMHTMLSkipNostoreAll[];
 CONTENT_EXPORT extern const char kMojoLocalStorage[];
+CONTENT_EXPORT extern const char kNetworkQuietTimeout[];
 CONTENT_EXPORT extern const char kNoZygote[];
 extern const char kNoV8UntrustedCodeMitigations[];
 CONTENT_EXPORT extern const char kEnableAppContainer[];
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index cfa31fa9..d3762e8e 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -16,7 +16,7 @@
 #include "base/files/file_path.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "content/public/common/content_client.h"
 #include "content/public/renderer/url_loader_throttle_provider.h"
diff --git a/content/public/test/blink_test_environment.cc b/content/public/test/blink_test_environment.cc
index 8c9a453a..36e4325 100644
--- a/content/public/test/blink_test_environment.cc
+++ b/content/public/test/blink_test_environment.cc
@@ -9,7 +9,7 @@
 #include "base/command_line.h"
 #include "base/run_loop.h"
 #include "base/strings/string_tokenizer.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_discardable_memory_allocator.h"
 #include "build/build_config.h"
diff --git a/content/public/test/browsing_data_remover_test_util.cc b/content/public/test/browsing_data_remover_test_util.cc
index a3e34d6..3d6492c 100644
--- a/content/public/test/browsing_data_remover_test_util.cc
+++ b/content/public/test/browsing_data_remover_test_util.cc
@@ -5,7 +5,7 @@
 #include "content/public/test/browsing_data_remover_test_util.h"
 
 #include "base/bind.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 
 namespace content {
 
diff --git a/content/public/test/test_browser_thread_bundle_unittest.cc b/content/public/test/test_browser_thread_bundle_unittest.cc
index b9ba777..274068b 100644
--- a/content/public/test/test_browser_thread_bundle_unittest.cc
+++ b/content/public/test/test_browser_thread_bundle_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/atomicops.h"
 #include "base/bind_helpers.h"
 #include "base/message_loop/message_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "content/public/browser/browser_thread.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/content/public/test/test_utils.cc b/content/public/test/test_utils.cc
index 9170c0b4a..4e60b90 100644
--- a/content/public/test/test_utils.cc
+++ b/content/public/test/test_utils.cc
@@ -16,7 +16,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/content/public/test/web_contents_tester.h b/content/public/test/web_contents_tester.h
index 2cd890e1..916078d 100644
--- a/content/public/test/web_contents_tester.h
+++ b/content/public/test/web_contents_tester.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_PUBLIC_TEST_WEB_CONTENTS_TESTER_H_
 #define CONTENT_PUBLIC_TEST_WEB_CONTENTS_TESTER_H_
 
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -149,6 +150,9 @@
   // Simulates an input event from the user.
   virtual void TestDidReceiveInputEvent(blink::WebInputEvent::Type type) = 0;
 
+  // Simulates successfully finishing a load.
+  virtual void TestDidFinishLoad(const GURL& url) = 0;
+
   // Simulates terminating an load with a network error.
   virtual void TestDidFailLoadWithError(
       const GURL& url,
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.cc b/content/renderer/gpu/gpu_benchmarking_extension.cc
index f9fc34d6..b325e6a 100644
--- a/content/renderer/gpu/gpu_benchmarking_extension.cc
+++ b/content/renderer/gpu/gpu_benchmarking_extension.cc
@@ -547,6 +547,7 @@
                  &GpuBenchmarking::SendMessageToMicroBenchmark)
       .SetMethod("hasGpuChannel", &GpuBenchmarking::HasGpuChannel)
       .SetMethod("hasGpuProcess", &GpuBenchmarking::HasGpuProcess)
+      .SetMethod("crashGpuProcess", &GpuBenchmarking::CrashGpuProcess)
       .SetMethod("getGpuDriverBugWorkarounds",
                  &GpuBenchmarking::GetGpuDriverBugWorkarounds)
       .SetMethod("startProfiling", &GpuBenchmarking::StartProfiling)
@@ -1079,6 +1080,14 @@
   return has_gpu_process;
 }
 
+void GpuBenchmarking::CrashGpuProcess() {
+  gpu::GpuChannelHost* gpu_channel =
+      RenderThreadImpl::current()->GetGpuChannel();
+  if (!gpu_channel)
+    return;
+  gpu_channel->CrashGpuProcessForTesting();
+}
+
 void GpuBenchmarking::GetGpuDriverBugWorkarounds(gin::Arguments* args) {
   std::vector<std::string> gpu_driver_bug_workarounds;
   gpu::GpuChannelHost* gpu_channel =
diff --git a/content/renderer/gpu/gpu_benchmarking_extension.h b/content/renderer/gpu/gpu_benchmarking_extension.h
index f423142c..b3a66a5 100644
--- a/content/renderer/gpu/gpu_benchmarking_extension.h
+++ b/content/renderer/gpu/gpu_benchmarking_extension.h
@@ -80,6 +80,7 @@
   bool SendMessageToMicroBenchmark(int id, v8::Local<v8::Object> message);
   bool HasGpuChannel();
   bool HasGpuProcess();
+  void CrashGpuProcess();
   void GetGpuDriverBugWorkarounds(gin::Arguments* args);
 
   // Starts/stops the sampling profiler. StartProfiling takes one optional
diff --git a/content/renderer/gpu/layer_tree_view.cc b/content/renderer/gpu/layer_tree_view.cc
index f72d403e..53039be 100644
--- a/content/renderer/gpu/layer_tree_view.cc
+++ b/content/renderer/gpu/layer_tree_view.cc
@@ -12,9 +12,9 @@
 #include "base/callback.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_traits.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "cc/animation/animation_host.h"
diff --git a/content/renderer/loader/resource_dispatcher.cc b/content/renderer/loader/resource_dispatcher.cc
index e59ad26..79b906c 100644
--- a/content/renderer/loader/resource_dispatcher.cc
+++ b/content/renderer/loader/resource_dispatcher.cc
@@ -18,7 +18,7 @@
 #include "base/rand_util.h"
 #include "base/strings/string_util.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/common/inter_process_time_ticks_converter.h"
diff --git a/content/renderer/loader/web_url_request_util.cc b/content/renderer/loader/web_url_request_util.cc
index b8648c8..a7c47640 100644
--- a/content/renderer/loader/web_url_request_util.cc
+++ b/content/renderer/loader/web_url_request_util.cc
@@ -11,7 +11,7 @@
 
 #include "base/logging.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/child/child_thread_impl.h"
 #include "content/public/common/service_names.mojom.h"
 #include "content/renderer/loader/request_extra_data.h"
diff --git a/content/renderer/loader/web_worker_fetch_context_impl.cc b/content/renderer/loader/web_worker_fetch_context_impl.cc
index 367c3c9..c0eabd1 100644
--- a/content/renderer/loader/web_worker_fetch_context_impl.cc
+++ b/content/renderer/loader/web_worker_fetch_context_impl.cc
@@ -8,7 +8,7 @@
 
 #include "base/feature_list.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/child/child_thread_impl.h"
 #include "content/child/thread_safe_sender.h"
 #include "content/common/content_constants_internal.h"
diff --git a/content/renderer/media/webrtc/mock_web_rtc_peer_connection_handler_client.h b/content/renderer/media/webrtc/mock_web_rtc_peer_connection_handler_client.h
index 32ec4d0..67999d0c4 100644
--- a/content/renderer/media/webrtc/mock_web_rtc_peer_connection_handler_client.h
+++ b/content/renderer/media/webrtc/mock_web_rtc_peer_connection_handler_client.h
@@ -47,6 +47,7 @@
     DidModifyTransceiversForMock(&web_transceivers, is_remote_description);
   }
   MOCK_METHOD1(DidAddRemoteDataChannel, void(blink::WebRTCDataChannelHandler*));
+  MOCK_METHOD1(DidNoteInterestingUsage, void(int));
   MOCK_METHOD0(ReleasePeerConnectionHandler, void());
 
   // Move-only arguments do not play nicely with MOCK, the workaround is to
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
index d0ca776..f6a87784 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
@@ -183,55 +183,10 @@
     webrtc::PeerConnectionInterface::RTCConfiguration* webrtc_config) {
   DCHECK(webrtc_config);
 
-  webrtc_config->servers.clear();
-  for (const blink::WebRTCIceServer& blink_server : blink_config.ice_servers) {
-    webrtc::PeerConnectionInterface::IceServer server;
-    server.username = blink_server.username.Utf8();
-    server.password = blink_server.credential.Utf8();
-    server.uri = blink_server.url.GetString().Utf8();
-    webrtc_config->servers.push_back(server);
-  }
-
-  switch (blink_config.ice_transport_policy) {
-    case blink::WebRTCIceTransportPolicy::kRelay:
-      webrtc_config->type = webrtc::PeerConnectionInterface::kRelay;
-      break;
-    case blink::WebRTCIceTransportPolicy::kAll:
-      webrtc_config->type = webrtc::PeerConnectionInterface::kAll;
-      break;
-    default:
-      NOTREACHED();
-  }
-
-  switch (blink_config.bundle_policy) {
-    case blink::WebRTCBundlePolicy::kBalanced:
-      webrtc_config->bundle_policy =
-          webrtc::PeerConnectionInterface::kBundlePolicyBalanced;
-      break;
-    case blink::WebRTCBundlePolicy::kMaxBundle:
-      webrtc_config->bundle_policy =
-          webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle;
-      break;
-    case blink::WebRTCBundlePolicy::kMaxCompat:
-      webrtc_config->bundle_policy =
-          webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat;
-      break;
-    default:
-      NOTREACHED();
-  }
-
-  switch (blink_config.rtcp_mux_policy) {
-    case blink::WebRTCRtcpMuxPolicy::kNegotiate:
-      webrtc_config->rtcp_mux_policy =
-          webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
-      break;
-    case blink::WebRTCRtcpMuxPolicy::kRequire:
-      webrtc_config->rtcp_mux_policy =
-          webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire;
-      break;
-    default:
-      NOTREACHED();
-  }
+  webrtc_config->servers = blink_config.ice_servers;
+  webrtc_config->type = blink_config.ice_transport_policy;
+  webrtc_config->bundle_policy = blink_config.bundle_policy;
+  webrtc_config->rtcp_mux_policy = blink_config.rtcp_mux_policy;
 
   switch (blink_config.sdp_semantics) {
     case blink::WebRTCSdpSemantics::kPlanB:
@@ -1021,6 +976,21 @@
     }
   }
 
+  void OnInterestingUsage(int usage_pattern) override {
+    main_thread_->PostTask(
+        FROM_HERE,
+        base::BindOnce(
+            &RTCPeerConnectionHandler::Observer::OnInterestingUsageImpl, this,
+            usage_pattern));
+  }
+
+  void OnInterestingUsageImpl(int usage_pattern) {
+    DCHECK(main_thread_->BelongsToCurrentThread());
+    if (handler_) {
+      handler_->OnInterestingUsage(usage_pattern);
+    }
+  }
+
  private:
   const base::WeakPtr<RTCPeerConnectionHandler> handler_;
   const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
@@ -2175,6 +2145,10 @@
     client_->DidGenerateICECandidate(std::move(web_candidate));
 }
 
+void RTCPeerConnectionHandler::OnInterestingUsage(int usage_pattern) {
+  client_->DidNoteInterestingUsage(usage_pattern);
+}
+
 webrtc::SessionDescriptionInterface*
 RTCPeerConnectionHandler::CreateNativeSessionDescription(
     const std::string& sdp, const std::string& type,
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.h b/content/renderer/media/webrtc/rtc_peer_connection_handler.h
index dfe3049..efd1fe0 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.h
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.h
@@ -217,6 +217,7 @@
                       int sdp_mline_index,
                       int component,
                       int address_family);
+  void OnInterestingUsage(int usage_pattern);
 
  private:
   // Record info about the first SessionDescription from the local and
diff --git a/content/renderer/pepper/host_globals.cc b/content/renderer/pepper/host_globals.cc
index 27d60820..5ef70b5 100644
--- a/content/renderer/pepper/host_globals.cc
+++ b/content/renderer/pepper/host_globals.cc
@@ -10,7 +10,7 @@
 #include "base/logging.h"
 #include "base/rand_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "content/public/common/content_switches.h"
 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index 1951fb9e..9824bf6 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -38,7 +38,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
@@ -4887,21 +4887,6 @@
   extra_data->set_initiated_in_secure_context(frame_document.IsSecureContext());
   extra_data->set_attach_same_site_cookies(attach_same_site_cookies);
 
-  // Renderer process transfers apply only to navigational requests.
-  bool is_navigational_request =
-      request.GetFrameType() != network::mojom::RequestContextFrameType::kNone;
-  if (is_navigational_request) {
-    // For navigation requests, we should copy the flag which indicates if this
-    // was a navigation initiated by the renderer to the new RequestExtraData
-    // instance.
-    RequestExtraData* current_request_data =
-        static_cast<RequestExtraData*>(request.GetExtraData());
-    if (current_request_data) {
-      extra_data->set_navigation_initiated_by_renderer(
-          current_request_data->navigation_initiated_by_renderer());
-    }
-  }
-
   // The RenderThreadImpl or its URLLoaderThrottleProvider member may not be
   // valid in some tests.
   RenderThreadImpl* render_thread = RenderThreadImpl::current();
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc
index 4e7534a0..61626d60 100644
--- a/content/renderer/render_frame_proxy.cc
+++ b/content/renderer/render_frame_proxy.cc
@@ -92,17 +92,21 @@
   blink::WebRemoteFrame* web_frame =
       blink::WebRemoteFrame::Create(scope, proxy.get());
 
+  bool parent_is_local =
+      !frame_to_replace->GetWebFrame()->Parent() ||
+      frame_to_replace->GetWebFrame()->Parent()->IsWebLocalFrame();
+
   // If frame_to_replace has a RenderFrameProxy parent, then its
   // RenderWidget will be destroyed along with it, so the new
   // RenderFrameProxy uses its parent's RenderWidget.
   RenderWidget* widget =
-      (!frame_to_replace->GetWebFrame()->Parent() ||
-       frame_to_replace->GetWebFrame()->Parent()->IsWebLocalFrame())
+      parent_is_local
           ? frame_to_replace->GetRenderWidget()
           : RenderFrameProxy::FromWebFrame(
                 frame_to_replace->GetWebFrame()->Parent()->ToWebRemoteFrame())
                 ->render_widget();
-  proxy->Init(web_frame, frame_to_replace->render_view(), widget);
+  proxy->Init(web_frame, frame_to_replace->render_view(), widget,
+              parent_is_local);
   return proxy.release();
 }
 
@@ -158,7 +162,7 @@
     render_widget = parent->render_widget();
   }
 
-  proxy->Init(web_frame, render_view, render_widget);
+  proxy->Init(web_frame, render_view, render_widget, false);
 
   // Initialize proxy's WebRemoteFrame with the security origin and other
   // replicated information.
@@ -220,7 +224,8 @@
 
 void RenderFrameProxy::Init(blink::WebRemoteFrame* web_frame,
                             RenderViewImpl* render_view,
-                            RenderWidget* render_widget) {
+                            RenderWidget* render_widget,
+                            bool parent_is_local) {
   CHECK(web_frame);
   CHECK(render_view);
   CHECK(render_widget);
@@ -237,7 +242,8 @@
 
   enable_surface_synchronization_ = features::IsSurfaceSynchronizationEnabled();
 
-  compositing_helper_ = std::make_unique<ChildFrameCompositingHelper>(this);
+  if (parent_is_local)
+    compositing_helper_ = std::make_unique<ChildFrameCompositingHelper>(this);
 
   pending_visual_properties_.screen_info =
       render_widget_->GetOriginalScreenInfo();
@@ -264,7 +270,8 @@
 }
 
 void RenderFrameProxy::WillBeginCompositorFrame() {
-  if (compositing_helper_->primary_surface_id().is_valid()) {
+  if (compositing_helper_ &&
+      compositing_helper_->primary_surface_id().is_valid()) {
     FrameHostMsg_HittestData_Params params;
     params.surface_id = compositing_helper_->primary_surface_id();
     params.ignored_for_hittest = web_frame_->IsIgnoredForHitTest();
diff --git a/content/renderer/render_frame_proxy.h b/content/renderer/render_frame_proxy.h
index abe2aaa1..15a8054b 100644
--- a/content/renderer/render_frame_proxy.h
+++ b/content/renderer/render_frame_proxy.h
@@ -217,7 +217,8 @@
 
   void Init(blink::WebRemoteFrame* frame,
             RenderViewImpl* render_view,
-            RenderWidget* render_widget);
+            RenderWidget* render_widget,
+            bool parent_is_local);
 
   void ResendVisualProperties();
 
@@ -287,6 +288,8 @@
   // Stores the WebRemoteFrame we are associated with.
   blink::WebRemoteFrame* web_frame_;
   std::string unique_name_;
+
+  // Can be nullptr when this RenderFrameProxy's parent is not a RenderFrame.
   std::unique_ptr<ChildFrameCompositingHelper> compositing_helper_;
 
   RenderViewImpl* render_view_;
diff --git a/content/renderer/render_process.h b/content/renderer/render_process.h
index 667d71e..74081953 100644
--- a/content/renderer/render_process.h
+++ b/content/renderer/render_process.h
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "content/child/child_process.h"
 
 namespace content {
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc
index 677d660..49973c5 100644
--- a/content/renderer/render_process_impl.cc
+++ b/content/renderer/render_process_impl.cc
@@ -26,7 +26,7 @@
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/sys_info.h"
-#include "base/task/task_scheduler/initialization_util_forward.h"
+#include "base/task/task_scheduler/initialization_util.h"
 #include "base/time/time.h"
 #include "content/common/task_scheduler.h"
 #include "content/public/common/bindings_policy.h"
diff --git a/content/renderer/render_process_impl.h b/content/renderer/render_process_impl.h
index f24140f..0776bb2 100644
--- a/content/renderer/render_process_impl.h
+++ b/content/renderer/render_process_impl.h
@@ -9,7 +9,7 @@
 #include <vector>
 
 #include "base/macros.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "content/renderer/render_process.h"
 
 namespace content {
diff --git a/content/renderer/render_thread_impl_browsertest.cc b/content/renderer/render_thread_impl_browsertest.cc
index 2f789a5..a815b25 100644
--- a/content/renderer/render_thread_impl_browsertest.cc
+++ b/content/renderer/render_thread_impl_browsertest.cc
@@ -21,7 +21,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 79487c0..74af840 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -508,14 +508,14 @@
     webview()->GetSettings()->SetPassiveEventListenerDefault(passiveDefault);
   }
 
-  std::string fmp_network_quiet_timeout =
-      command_line.GetSwitchValueASCII(switches::kFMPNetworkQuietTimeout);
-  if (!fmp_network_quiet_timeout.empty()) {
-    double fmp_network_quiet_timeout_seconds = 0.0;
-    if (base::StringToDouble(fmp_network_quiet_timeout,
-                             &fmp_network_quiet_timeout_seconds)) {
-      webview()->GetSettings()->SetFMPNetworkQuietTimeout(
-          fmp_network_quiet_timeout_seconds);
+  std::string network_quiet_timeout =
+      command_line.GetSwitchValueASCII(switches::kNetworkQuietTimeout);
+  if (!network_quiet_timeout.empty()) {
+    double network_quiet_timeout_seconds = 0.0;
+    if (base::StringToDouble(network_quiet_timeout,
+                             &network_quiet_timeout_seconds)) {
+      webview()->GetSettings()->SetNetworkQuietTimeout(
+          network_quiet_timeout_seconds);
     }
   }
 
diff --git a/content/renderer/renderer_blink_platform_impl.cc b/content/renderer/renderer_blink_platform_impl.cc
index bfa93784..33626b1 100644
--- a/content/renderer/renderer_blink_platform_impl.cc
+++ b/content/renderer/renderer_blink_platform_impl.cc
@@ -24,7 +24,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/content/renderer/service_worker/controller_service_worker_impl.cc b/content/renderer/service_worker/controller_service_worker_impl.cc
index a90ae551..66db6a3 100644
--- a/content/renderer/service_worker/controller_service_worker_impl.cc
+++ b/content/renderer/service_worker/controller_service_worker_impl.cc
@@ -26,7 +26,7 @@
 
 void ControllerServiceWorkerImpl::DispatchFetchEvent(
     blink::mojom::DispatchFetchEventParamsPtr params,
-    mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     DispatchFetchEventCallback callback) {
   DCHECK(context_client_);
   context_client_->DispatchOrQueueFetchEvent(
diff --git a/content/renderer/service_worker/controller_service_worker_impl.h b/content/renderer/service_worker/controller_service_worker_impl.h
index 308fa39d..ebda20b 100644
--- a/content/renderer/service_worker/controller_service_worker_impl.h
+++ b/content/renderer/service_worker/controller_service_worker_impl.h
@@ -40,7 +40,7 @@
   // mojom::ControllerServiceWorker:
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback) override;
   void Clone(mojom::ControllerServiceWorkerRequest request) override;
 
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 74fa0762..110a0a9 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -521,7 +521,7 @@
       can_make_payment_result_callbacks;
   std::map<int, payments::mojom::PaymentHandlerResponseCallbackPtr>
       payment_response_callbacks;
-  std::map<int, mojom::ServiceWorkerFetchResponseCallbackPtr>
+  std::map<int, blink::mojom::ServiceWorkerFetchResponseCallbackPtr>
       fetch_response_callbacks;
 
   // Inflight navigation preload requests.
@@ -1105,7 +1105,7 @@
                           TRACE_ID_LOCAL(fetch_event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   DCHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
-  const mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
+  const blink::mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
       context_->fetch_response_callbacks[fetch_event_id];
   DCHECK(response_callback.is_bound());
   response_callback->OnFallback(base::Time::FromDoubleT(event_dispatch_time));
@@ -1122,25 +1122,13 @@
                           TRACE_ID_LOCAL(fetch_event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   DCHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
-  ServiceWorkerResponse response(
-      GetServiceWorkerResponseFromWebResponse(web_response));
-  const mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
+  blink::mojom::FetchAPIResponsePtr response(
+      GetFetchAPIResponseFromWebResponse(web_response));
+  const blink::mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
       context_->fetch_response_callbacks[fetch_event_id];
 
-  if (!response.blob_uuid.empty()) {
-    // TODO(falken): Can we just keep |response.blob| and call OnResponse
-    // directly?
-    blink::mojom::BlobPtr blob_ptr;
-    DCHECK(response.blob);
-    blob_ptr = response.blob->TakeBlobPtr();
-    response.blob = nullptr;
-    response_callback->OnResponseBlob(
-        response, std::move(blob_ptr),
-        base::Time::FromDoubleT(event_dispatch_time));
-  } else {
-    response_callback->OnResponse(response,
-                                  base::Time::FromDoubleT(event_dispatch_time));
-  }
+  response_callback->OnResponse(std::move(response),
+                                base::Time::FromDoubleT(event_dispatch_time));
   context_->fetch_response_callbacks.erase(fetch_event_id);
 }
 
@@ -1156,9 +1144,9 @@
                           TRACE_ID_LOCAL(fetch_event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   DCHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
-  ServiceWorkerResponse response(
-      GetServiceWorkerResponseFromWebResponse(web_response));
-  const mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
+  blink::mojom::FetchAPIResponsePtr response(
+      GetFetchAPIResponseFromWebResponse(web_response));
+  const blink::mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
       context_->fetch_response_callbacks[fetch_event_id];
   blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream =
       blink::mojom::ServiceWorkerStreamHandle::New();
@@ -1171,7 +1159,7 @@
       std::make_unique<StreamHandleListener>(std::move(callback_ptr)));
 
   response_callback->OnResponseStream(
-      response, std::move(body_as_stream),
+      std::move(response), std::move(body_as_stream),
       base::Time::FromDoubleT(event_dispatch_time));
   context_->fetch_response_callbacks.erase(fetch_event_id);
 }
@@ -1459,7 +1447,7 @@
 
 void ServiceWorkerContextClient::DispatchOrQueueFetchEvent(
     blink::mojom::DispatchFetchEventParamsPtr params,
-    mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     DispatchFetchEventCallback callback) {
   TRACE_EVENT2("ServiceWorker",
                "ServiceWorkerContextClient::DispatchOrQueueFetchEvent", "url",
@@ -1759,7 +1747,7 @@
 // S13nServiceWorker
 void ServiceWorkerContextClient::DispatchFetchEvent(
     blink::mojom::DispatchFetchEventParamsPtr params,
-    mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     DispatchFetchEventCallback callback) {
   int event_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->fetch_event_callbacks));
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 89d162fe..6888a37 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -249,7 +249,7 @@
   // client, which means it is coming through the ControllerServiceWorkerImpl.
   void DispatchOrQueueFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback);
 
  private:
@@ -305,7 +305,7 @@
       DispatchExtendableMessageEventCallback callback) override;
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback) override;
   void DispatchNotificationClickEvent(
       const std::string& notification_id,
diff --git a/content/renderer/service_worker/service_worker_context_client_unittest.cc b/content/renderer/service_worker/service_worker_context_client_unittest.cc
index fbd3fce..d7b35051 100644
--- a/content/renderer/service_worker/service_worker_context_client_unittest.cc
+++ b/content/renderer/service_worker/service_worker_context_client_unittest.cc
@@ -340,11 +340,11 @@
   EXPECT_TRUE(mock_proxy.fetch_events().empty());
 
   const GURL expected_url("https://example.com/expected");
-  mojom::ServiceWorkerFetchResponseCallbackRequest fetch_callback_request;
   auto request = std::make_unique<network::ResourceRequest>();
   request->url = expected_url;
-  mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
-  fetch_callback_request = mojo::MakeRequest(&fetch_callback_ptr);
+  blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
+  blink::mojom::ServiceWorkerFetchResponseCallbackRequest
+      fetch_callback_request = mojo::MakeRequest(&fetch_callback_ptr);
   auto params = blink::mojom::DispatchFetchEventParams::New();
   params->request = *request;
   pipes.service_worker->DispatchFetchEvent(
@@ -377,9 +377,9 @@
 
   // The dispatched fetch event should be recorded by |mock_proxy|.
   const GURL expected_url("https://example.com/expected");
-  mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
-  mojom::ServiceWorkerFetchResponseCallbackRequest fetch_callback_request =
-      mojo::MakeRequest(&fetch_callback_ptr);
+  blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
+  blink::mojom::ServiceWorkerFetchResponseCallbackRequest
+      fetch_callback_request = mojo::MakeRequest(&fetch_callback_ptr);
   auto request = std::make_unique<network::ResourceRequest>();
   request->url = expected_url;
   auto params = blink::mojom::DispatchFetchEventParams::New();
@@ -421,13 +421,13 @@
   EXPECT_TRUE(context_client->RequestedTermination());
 
   const GURL expected_url("https://example.com/expected");
-  mojom::ServiceWorkerFetchResponseCallbackRequest fetch_callback_request;
 
   // FetchEvent dispatched directly from the controlled clients through
   // mojom::ControllerServiceWorker should be queued in the idle state.
   {
-    mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
-    fetch_callback_request = mojo::MakeRequest(&fetch_callback_ptr);
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
+    blink::mojom::ServiceWorkerFetchResponseCallbackRequest
+        fetch_callback_request = mojo::MakeRequest(&fetch_callback_ptr);
     auto request = std::make_unique<network::ResourceRequest>();
     request->url = expected_url;
     auto params = blink::mojom::DispatchFetchEventParams::New();
@@ -469,13 +469,15 @@
 
   const GURL expected_url_1("https://example.com/expected_1");
   const GURL expected_url_2("https://example.com/expected_2");
-  mojom::ServiceWorkerFetchResponseCallbackRequest fetch_callback_request_1;
-  mojom::ServiceWorkerFetchResponseCallbackRequest fetch_callback_request_2;
+  blink::mojom::ServiceWorkerFetchResponseCallbackRequest
+      fetch_callback_request_1;
+  blink::mojom::ServiceWorkerFetchResponseCallbackRequest
+      fetch_callback_request_2;
 
   // FetchEvent dispatched directly from the controlled clients through
   // mojom::ControllerServiceWorker should be queued in the idle state.
   {
-    mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
     fetch_callback_request_1 = mojo::MakeRequest(&fetch_callback_ptr);
     auto request = std::make_unique<network::ResourceRequest>();
     request->url = expected_url_1;
@@ -492,7 +494,7 @@
   // Another event dispatched to mojom::ServiceWorker wakes up
   // the context client.
   {
-    mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
+    blink::mojom::ServiceWorkerFetchResponseCallbackPtr fetch_callback_ptr;
     fetch_callback_request_2 = mojo::MakeRequest(&fetch_callback_ptr);
     auto request = std::make_unique<network::ResourceRequest>();
     request->url = expected_url_2;
diff --git a/content/renderer/service_worker/service_worker_provider_context.cc b/content/renderer/service_worker/service_worker_provider_context.cc
index 9f94750d..55cb92f7 100644
--- a/content/renderer/service_worker/service_worker_provider_context.cc
+++ b/content/renderer/service_worker/service_worker_provider_context.cc
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/child/child_thread_impl.h"
 #include "content/child/thread_safe_sender.h"
diff --git a/content/renderer/service_worker/service_worker_provider_context_unittest.cc b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
index d5d256d..f87c958 100644
--- a/content/renderer/service_worker/service_worker_provider_context_unittest.cc
+++ b/content/renderer/service_worker/service_worker_provider_context_unittest.cc
@@ -239,7 +239,7 @@
   // mojom::ControllerServiceWorker:
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback) override {
     fetch_event_count_++;
     fetch_event_request_ = params->request;
@@ -476,10 +476,14 @@
 // S13nServiceWorker: Test that SetController correctly sets (or resets)
 // the controller service worker for clients.
 TEST_F(ServiceWorkerProviderContextTest, SetControllerServiceWorker) {
+  // This test has temporary LOG(ERROR) logging to debug
+  // https://crbug.com/862294.
+
   EnableS13nServiceWorker();
   const int kProviderId = 10;
 
   // (1) Test if setting the controller via the CTOR works.
+  LOG(ERROR) << "1 test ctor";
   auto object_host1 =
       std::make_unique<MockServiceWorkerObjectHost>(200 /* version_id */);
   ASSERT_EQ(0, object_host1->GetBindingCount());
@@ -506,7 +510,9 @@
       kProviderId, blink::mojom::ServiceWorkerProviderType::kForWindow,
       std::move(container_request), host_ptr.PassInterface(),
       std::move(controller_info1), loader_factory_);
+  LOG(ERROR) << "1 RunUntilIdle after ctor";
   base::RunLoop().RunUntilIdle();
+  LOG(ERROR) << "1 RunUntilIdle after ctor finished";
 
   // Subresource loader factory must be available.
   auto* subresource_loader_factory1 =
@@ -518,12 +524,15 @@
   base::RunLoop loop1;
   fake_controller1.set_fetch_callback(loop1.QuitClosure());
   StartRequest(subresource_loader_factory1, kURL1);
+  LOG(ERROR) << "1 loop1.Run()";
   loop1.Run();
+  LOG(ERROR) << "1 loop1.Run() finished";
   EXPECT_EQ(kURL1, fake_controller1.fetch_event_request().url);
   EXPECT_EQ(1, fake_controller1.fetch_event_count());
 
   // (2) Test if resetting the controller to a new one via SetController
   // works.
+  LOG(ERROR) << "2 reset controller to new one";
   auto object_host2 =
       std::make_unique<MockServiceWorkerObjectHost>(201 /* version_id */);
   ASSERT_EQ(0, object_host2->GetBindingCount());
@@ -543,7 +552,9 @@
 
   // The controller is reset. References to the old controller must be
   // released.
+  LOG(ERROR) << "2 RunUntilIdle after SetController";
   base::RunLoop().RunUntilIdle();
+  LOG(ERROR) << "2 RunUntilIdle after SetController finished";
   EXPECT_EQ(0, object_host1->GetBindingCount());
 
   // Subresource loader factory must be available, and should be the same
@@ -558,19 +569,24 @@
   base::RunLoop loop2;
   fake_controller2.set_fetch_callback(loop2.QuitClosure());
   StartRequest(subresource_loader_factory2, kURL2);
+  LOG(ERROR) << "2 loop2.Run()";
   loop2.Run();
+  LOG(ERROR) << "2 loop2.Run() finished";
   EXPECT_EQ(kURL2, fake_controller2.fetch_event_request().url);
   EXPECT_EQ(1, fake_controller2.fetch_event_count());
   // The request should not go to the previous controller.
   EXPECT_EQ(1, fake_controller1.fetch_event_count());
 
   // (3) Test if resetting the controller to nullptr works.
+  LOG(ERROR) << "3 reset controller to null";
   container_ptr->SetController(mojom::ControllerServiceWorkerInfo::New(),
                                std::vector<blink::mojom::WebFeature>(), true);
 
   // The controller is reset. References to the old controller must be
   // released.
+  LOG(ERROR) << "3 RunUntilIdle()";
   base::RunLoop().RunUntilIdle();
+  LOG(ERROR) << "3 RunUntilIdle() finished";
   EXPECT_EQ(0, object_host2->GetBindingCount());
 
   // Subresource loader factory must not be available.
@@ -583,7 +599,9 @@
   fake_loader_factory_.set_start_loader_callback(loop3.QuitClosure());
   EXPECT_EQ(0UL, fake_loader_factory_.clients_count());
   StartRequest(subresource_loader_factory2, kURL3);
+  LOG(ERROR) << "3 loop3.Run()";
   loop3.Run();
+  LOG(ERROR) << "3 loop3.Run() finished";
   EXPECT_EQ(kURL3, fake_loader_factory_.last_request_url());
   EXPECT_EQ(1UL, fake_loader_factory_.clients_count());
 
@@ -593,6 +611,7 @@
 
   // (4) Test if resetting the controller to yet another one via SetController
   // works.
+  LOG(ERROR) << "4 reset controller yet another one";
   auto object_host4 =
       std::make_unique<MockServiceWorkerObjectHost>(202 /* version_id */);
   ASSERT_EQ(0, object_host4->GetBindingCount());
@@ -609,7 +628,9 @@
   controller_info4->endpoint = controller_ptr4.PassInterface();
   container_ptr->SetController(std::move(controller_info4),
                                std::vector<blink::mojom::WebFeature>(), true);
+  LOG(ERROR) << "4 RunUntilIdle()";
   base::RunLoop().RunUntilIdle();
+  LOG(ERROR) << "4 RunUntilIdle() finished";
 
   // Subresource loader factory must be available.
   auto* subresource_loader_factory4 =
@@ -621,7 +642,9 @@
   base::RunLoop loop4;
   fake_controller4.set_fetch_callback(loop4.QuitClosure());
   StartRequest(subresource_loader_factory4, kURL4);
+  LOG(ERROR) << "4 loop4.Run()";
   loop4.Run();
+  LOG(ERROR) << "4 loop4.Run() finished";
   EXPECT_EQ(kURL4, fake_controller4.fetch_event_request().url);
   EXPECT_EQ(1, fake_controller4.fetch_event_count());
 
@@ -635,7 +658,9 @@
   // The outcome is not deterministic but should not crash.
   StartRequest(subresource_loader_factory4, kURL4);
   fake_controller4.Disconnect();
+  LOG(ERROR) << "4 RunUntilIdle() again";
   base::RunLoop().RunUntilIdle();
+  LOG(ERROR) << "4 RunUntilIdle() finished";
 }
 
 TEST_F(ServiceWorkerProviderContextTest, ControllerWithoutFetchHandler) {
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc
index 3e5b7db..0934911 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader.cc
@@ -209,7 +209,7 @@
 }
 
 void ServiceWorkerSubresourceLoader::DispatchFetchEvent() {
-  mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr;
+  blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback_ptr;
   response_callback_binding_.Bind(mojo::MakeRequest(&response_callback_ptr));
   mojom::ControllerServiceWorker* controller =
       controller_connector_->GetControllerServiceWorker(
@@ -339,38 +339,24 @@
 }
 
 void ServiceWorkerSubresourceLoader::OnResponse(
-    const ServiceWorkerResponse& response,
+    blink::mojom::FetchAPIResponsePtr response,
     base::Time dispatch_event_time) {
   TRACE_EVENT_WITH_FLOW0("ServiceWorker",
                          "ServiceWorkerSubresourceLoader::OnResponse", this,
                          TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   SettleFetchEventDispatch(blink::ServiceWorkerStatusCode::kOk);
-  StartResponse(response, nullptr /* body_as_blob */,
-                nullptr /* body_as_stream */);
-}
-
-void ServiceWorkerSubresourceLoader::OnResponseBlob(
-    const ServiceWorkerResponse& response,
-    blink::mojom::BlobPtr body_as_blob,
-    base::Time dispatch_event_time) {
-  TRACE_EVENT_WITH_FLOW0("ServiceWorker",
-                         "ServiceWorkerSubresourceLoader::OnResponseBlob", this,
-                         TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  SettleFetchEventDispatch(blink::ServiceWorkerStatusCode::kOk);
-  StartResponse(response, std::move(body_as_blob),
-                nullptr /* body_as_stream */);
+  StartResponse(std::move(response), nullptr /* body_as_stream */);
 }
 
 void ServiceWorkerSubresourceLoader::OnResponseStream(
-    const ServiceWorkerResponse& response,
+    blink::mojom::FetchAPIResponsePtr response,
     blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
     base::Time dispatch_event_time) {
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker", "ServiceWorkerSubresourceLoader::OnResponseStream", this,
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
   SettleFetchEventDispatch(blink::ServiceWorkerStatusCode::kOk);
-  StartResponse(response, nullptr /* body_as_blob */,
-                std::move(body_as_stream));
+  StartResponse(std::move(response), std::move(body_as_stream));
 }
 
 void ServiceWorkerSubresourceLoader::OnFallback(
@@ -425,19 +411,18 @@
 }
 
 void ServiceWorkerSubresourceLoader::StartResponse(
-    const ServiceWorkerResponse& response,
-    blink::mojom::BlobPtr body_as_blob,
+    blink::mojom::FetchAPIResponsePtr response,
     blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream) {
   // A response with status code 0 is Blink telling us to respond with network
   // error.
-  if (response.status_code == 0) {
+  if (response->status_code == 0) {
     CommitCompleted(net::ERR_FAILED);
     return;
   }
 
-  ServiceWorkerLoaderHelpers::SaveResponseInfo(response, &response_head_);
+  ServiceWorkerLoaderHelpers::SaveResponseInfo(*response, &response_head_);
   ServiceWorkerLoaderHelpers::SaveResponseHeaders(
-      response.status_code, response.status_text, response.headers,
+      response->status_code, response->status_text, response->headers,
       &response_head_);
   response_head_.response_start = base::TimeTicks::Now();
   response_head_.load_timing.receive_headers_end = base::TimeTicks::Now();
@@ -463,7 +448,7 @@
 
   // Handle a stream response body.
   if (!body_as_stream.is_null() && body_as_stream->stream.is_valid()) {
-    DCHECK(!body_as_blob);
+    DCHECK(!response->blob);
     DCHECK(url_loader_client_.is_bound());
     stream_waiter_ = std::make_unique<StreamWaiter>(
         this, std::move(body_as_stream->callback_request));
@@ -473,9 +458,10 @@
   }
 
   // Handle a blob response body.
-  if (body_as_blob) {
+  if (response->blob) {
     DCHECK(!body_as_stream);
-    body_as_blob_ = std::move(body_as_blob);
+    DCHECK(response->blob->blob.is_valid());
+    body_as_blob_.Bind(std::move(response->blob->blob));
     body_as_blob_->ReadSideData(base::BindOnce(
         &ServiceWorkerSubresourceLoader::OnBlobSideDataReadingComplete,
         base::Unretained(this)));
diff --git a/content/renderer/service_worker/service_worker_subresource_loader.h b/content/renderer/service_worker/service_worker_subresource_loader.h
index 91b180b2..b17ef54 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader.h
+++ b/content/renderer/service_worker/service_worker_subresource_loader.h
@@ -37,7 +37,7 @@
 // the main thread (while the implementation itself is thread agnostic).
 class CONTENT_EXPORT ServiceWorkerSubresourceLoader
     : public network::mojom::URLLoader,
-      public mojom::ServiceWorkerFetchResponseCallback,
+      public blink::mojom::ServiceWorkerFetchResponseCallback,
       public ControllerServiceWorkerConnector::Observer {
  public:
   // See the comments for ServiceWorkerSubresourceLoaderFactory's ctor (below)
@@ -74,20 +74,16 @@
   void SettleFetchEventDispatch(
       base::Optional<blink::ServiceWorkerStatusCode> status);
 
-  // mojom::ServiceWorkerFetchResponseCallback overrides:
-  void OnResponse(const ServiceWorkerResponse& response,
+  // blink::mojom::ServiceWorkerFetchResponseCallback overrides:
+  void OnResponse(blink::mojom::FetchAPIResponsePtr response,
                   base::Time dispatch_event_time) override;
-  void OnResponseBlob(const ServiceWorkerResponse& response,
-                      blink::mojom::BlobPtr blob,
-                      base::Time dispatch_event_time) override;
   void OnResponseStream(
-      const ServiceWorkerResponse& response,
+      blink::mojom::FetchAPIResponsePtr response,
       blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream,
       base::Time dispatch_event_time) override;
   void OnFallback(base::Time dispatch_event_time) override;
 
-  void StartResponse(const ServiceWorkerResponse& response,
-                     blink::mojom::BlobPtr body_as_blob,
+  void StartResponse(blink::mojom::FetchAPIResponsePtr response,
                      blink::mojom::ServiceWorkerStreamHandlePtr body_as_stream);
 
   // network::mojom::URLLoader overrides:
@@ -119,7 +115,8 @@
   mojo::Binding<network::mojom::URLLoader> url_loader_binding_;
 
   // For handling FetchEvent response.
-  mojo::Binding<ServiceWorkerFetchResponseCallback> response_callback_binding_;
+  mojo::Binding<blink::mojom::ServiceWorkerFetchResponseCallback>
+      response_callback_binding_;
   // The blob needs to be held while it's read to keep it alive.
   blink::mojom::BlobPtr body_as_blob_;
 
diff --git a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
index 73f5661..04e92e2 100644
--- a/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
+++ b/content/renderer/service_worker/service_worker_subresource_loader_unittest.cc
@@ -121,46 +121,33 @@
   FakeControllerServiceWorker() = default;
   ~FakeControllerServiceWorker() override = default;
 
-  static ServiceWorkerResponse OkResponse() {
-    return ServiceWorkerResponse(
-        std::make_unique<std::vector<GURL>>(), 200, "OK",
-        network::mojom::FetchResponseType::kDefault,
-        std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-        0 /* blob_size */, nullptr /* blob */,
-        blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-        false /* response_is_in_cache_storage */,
-        std::string() /* response_cache_storage_cache_name */,
-        std::make_unique<
-            ServiceWorkerHeaderList>() /* cors_exposed_header_names */);
+  static blink::mojom::FetchAPIResponsePtr OkResponse(
+      blink::mojom::SerializedBlobPtr blob_body) {
+    auto response = blink::mojom::FetchAPIResponse::New();
+    response->status_code = 200;
+    response->status_text = "OK";
+    response->response_type = network::mojom::FetchResponseType::kDefault;
+    response->blob = std::move(blob_body);
+    return response;
   }
 
-  static ServiceWorkerResponse ErrorResponse() {
-    return ServiceWorkerResponse(
-        std::make_unique<std::vector<GURL>>(), 0 /* status_code */,
-        "" /* status_text */, network::mojom::FetchResponseType::kDefault,
-        std::make_unique<ServiceWorkerHeaderMap>(), "" /* blob_uuid */,
-        0 /* blob_size */, nullptr /* blob */,
-        blink::mojom::ServiceWorkerResponseError::kPromiseRejected,
-        base::Time(), false /* response_is_in_cache_storage */,
-        std::string() /* response_cache_storage_cache_name */,
-        std::make_unique<
-            ServiceWorkerHeaderList>() /* cors_exposed_header_names */);
+  static blink::mojom::FetchAPIResponsePtr ErrorResponse() {
+    auto response = blink::mojom::FetchAPIResponse::New();
+    response->status_code = 0;
+    response->response_type = network::mojom::FetchResponseType::kDefault;
+    response->error =
+        blink::mojom::ServiceWorkerResponseError::kPromiseRejected;
+    return response;
   }
 
-  static ServiceWorkerResponse RedirectResponse(
+  static blink::mojom::FetchAPIResponsePtr RedirectResponse(
       const std::string& redirect_location_header) {
-    auto headers = std::make_unique<ServiceWorkerHeaderMap>();
-    (*headers)["Location"] = redirect_location_header;
-
-    return ServiceWorkerResponse(
-        std::make_unique<std::vector<GURL>>(), 302, "Found",
-        network::mojom::FetchResponseType::kDefault, std::move(headers),
-        "" /* blob_uuid */, 0 /* blob_size */, nullptr /* blob */,
-        blink::mojom::ServiceWorkerResponseError::kUnknown, base::Time(),
-        false /* response_is_in_cache_storage */,
-        std::string() /* response_cache_storage_cache_name */,
-        std::make_unique<
-            ServiceWorkerHeaderList>() /* cors_exposed_header_names */);
+    auto response = blink::mojom::FetchAPIResponse::New();
+    response->status_code = 302;
+    response->status_text = "Found";
+    response->response_type = network::mojom::FetchResponseType::kDefault;
+    response->headers["Location"] = redirect_location_header;
+    return response;
   }
 
   void CloseAllBindings() { bindings_.CloseAllBindings(); }
@@ -197,9 +184,11 @@
   void RespondWithBlob(base::Optional<std::vector<uint8_t>> metadata,
                        std::string body) {
     response_mode_ = ResponseMode::kBlob;
+    blob_body_ = blink::mojom::SerializedBlob::New();
+    blob_body_->uuid = "dummy-blob-uuid";
     mojo::MakeStrongBinding(
         std::make_unique<FakeBlob>(std::move(metadata), std::move(body)),
-        mojo::MakeRequest(&blob_));
+        mojo::MakeRequest(&blob_body_->blob));
   }
 
   void ReadRequestBody(std::string* out_string) {
@@ -233,7 +222,7 @@
   // mojom::ControllerServiceWorker:
   void DispatchFetchEvent(
       blink::mojom::DispatchFetchEventParamsPtr params,
-      mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
+      blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback) override {
     EXPECT_FALSE(ServiceWorkerUtils::IsMainResourceType(
         static_cast<ResourceType>(params->request.resource_type)));
@@ -244,7 +233,8 @@
 
     switch (response_mode_) {
       case ResponseMode::kDefault:
-        response_callback->OnResponse(OkResponse(), base::Time::Now());
+        response_callback->OnResponse(OkResponse(nullptr /* blob_body */),
+                                      base::Time::Now());
         std::move(callback).Run(
             blink::mojom::ServiceWorkerEventStatus::COMPLETED, base::Time());
         break;
@@ -253,14 +243,15 @@
                                 base::Time());
         break;
       case ResponseMode::kStream:
-        response_callback->OnResponseStream(
-            OkResponse(), std::move(stream_handle_), base::Time::Now());
+        response_callback->OnResponseStream(OkResponse(nullptr /* blob_body */),
+                                            std::move(stream_handle_),
+                                            base::Time::Now());
         std::move(callback).Run(
             blink::mojom::ServiceWorkerEventStatus::COMPLETED, base::Time());
         break;
       case ResponseMode::kBlob:
-        response_callback->OnResponseBlob(OkResponse(), std::move(blob_),
-                                          base::Time::Now());
+        response_callback->OnResponse(OkResponse(std::move(blob_body_)),
+                                      base::Time::Now());
         std::move(callback).Run(
             blink::mojom::ServiceWorkerEventStatus::COMPLETED, base::Time());
         break;
@@ -326,7 +317,7 @@
   blink::mojom::ServiceWorkerStreamHandlePtr stream_handle_;
 
   // For ResponseMode::kBlob.
-  blink::mojom::BlobPtr blob_;
+  blink::mojom::SerializedBlobPtr blob_body_;
 
   // For ResponseMode::kRedirectResponse
   std::string redirect_location_header_;
diff --git a/content/renderer/service_worker/service_worker_type_util.cc b/content/renderer/service_worker/service_worker_type_util.cc
index 020f30164d..5eac4daa 100644
--- a/content/renderer/service_worker/service_worker_type_util.cc
+++ b/content/renderer/service_worker/service_worker_type_util.cc
@@ -19,9 +19,10 @@
 
 namespace {
 
+template <typename T>
 class HeaderVisitor : public blink::WebHTTPHeaderVisitor {
  public:
-  explicit HeaderVisitor(ServiceWorkerHeaderMap* headers) : headers_(headers) {}
+  explicit HeaderVisitor(T* headers) : headers_(headers) {}
   ~HeaderVisitor() override {}
 
   void VisitHeader(const blink::WebString& name,
@@ -31,41 +32,30 @@
     const std::string& header_value = value.Latin1();
     CHECK(header_name.find('\0') == std::string::npos);
     CHECK(header_value.find('\0') == std::string::npos);
-    headers_->insert(ServiceWorkerHeaderMap::value_type(
-        header_name, header_value));
+    headers_->insert(typename T::value_type(header_name, header_value));
   }
 
  private:
-  ServiceWorkerHeaderMap* const headers_;
+  T* const headers_;
 };
 
-std::unique_ptr<HeaderVisitor> MakeHeaderVisitor(
-    ServiceWorkerHeaderMap* headers) {
-  return std::unique_ptr<HeaderVisitor>(new HeaderVisitor(headers));
+template <typename T>
+std::unique_ptr<HeaderVisitor<T>> MakeHeaderVisitor(T* headers) {
+  return std::make_unique<HeaderVisitor<T>>(headers);
 }
 
-std::unique_ptr<ServiceWorkerHeaderMap> GetHeaderMap(
-    const blink::WebServiceWorkerResponse& web_response) {
-  std::unique_ptr<ServiceWorkerHeaderMap> result =
-      std::make_unique<ServiceWorkerHeaderMap>();
-  web_response.VisitHTTPHeaderFields(MakeHeaderVisitor(result.get()).get());
-  return result;
-}
-
-std::unique_ptr<ServiceWorkerHeaderList> GetHeaderList(
+std::vector<std::string> GetHeaderList(
     const blink::WebVector<blink::WebString>& web_headers) {
-  std::unique_ptr<ServiceWorkerHeaderList> result =
-      std::make_unique<ServiceWorkerHeaderList>(web_headers.size());
-  std::transform(web_headers.begin(), web_headers.end(), result->begin(),
+  auto result = std::vector<std::string>(web_headers.size());
+  std::transform(web_headers.begin(), web_headers.end(), result.begin(),
                  [](const blink::WebString& s) { return s.Latin1(); });
   return result;
 }
 
-std::unique_ptr<std::vector<GURL>> GetURLList(
+std::vector<GURL> GetURLList(
     const blink::WebVector<blink::WebURL>& web_url_list) {
-  std::unique_ptr<std::vector<GURL>> result =
-      std::make_unique<std::vector<GURL>>(web_url_list.size());
-  std::transform(web_url_list.begin(), web_url_list.end(), result->begin(),
+  std::vector<GURL> result = std::vector<GURL>(web_url_list.size());
+  std::transform(web_url_list.begin(), web_url_list.end(), result.begin(),
                  [](const blink::WebURL& url) { return url; });
   return result;
 }
@@ -80,39 +70,41 @@
   web_request.VisitHTTPHeaderFields(MakeHeaderVisitor(headers).get());
 }
 
-ServiceWorkerResponse GetServiceWorkerResponseFromWebResponse(
+blink::mojom::FetchAPIResponsePtr GetFetchAPIResponseFromWebResponse(
     const blink::WebServiceWorkerResponse& web_response) {
-  scoped_refptr<storage::BlobHandle> blob;
-  auto blob_pipe = web_response.CloneBlobPtr();
-  if (blob_pipe.is_valid()) {
-    blink::mojom::BlobPtr blob_ptr;
-    blob_ptr.Bind(blink::mojom::BlobPtrInfo(std::move(blob_pipe),
-                                            blink::mojom::Blob::Version_));
-    blob = base::MakeRefCounted<storage::BlobHandle>(std::move(blob_ptr));
+  blink::mojom::SerializedBlobPtr blob;
+  if (!web_response.BlobUUID().IsEmpty()) {
+    blob = blink::mojom::SerializedBlob::New();
+    blob->uuid = web_response.BlobUUID().Utf8();
+    blob->size = web_response.BlobSize();
+    auto blob_pipe = web_response.CloneBlobPtr();
+    DCHECK(blob_pipe.is_valid());
+    blob->blob = blink::mojom::BlobPtrInfo(std::move(blob_pipe),
+                                           blink::mojom::Blob::Version_);
   }
 
-  ServiceWorkerResponse response = ServiceWorkerResponse(
-      GetURLList(web_response.UrlList()), web_response.Status(),
-      web_response.StatusText().Utf8(), web_response.ResponseType(),
-      GetHeaderMap(web_response), web_response.BlobUUID().Utf8(),
-      web_response.BlobSize(), std::move(blob), web_response.GetError(),
-      web_response.ResponseTime(),
-      !web_response.CacheStorageCacheName().IsNull(),
-      web_response.CacheStorageCacheName().Utf8(),
-      GetHeaderList(web_response.CorsExposedHeaderNames()));
-  if (!web_response.SideDataBlobSize())
-    return response;
-  response.side_data_blob_uuid = web_response.SideDataBlobUUID().Utf8();
-  response.side_data_blob_size = web_response.SideDataBlobSize();
-  auto side_data_blob_pipe = web_response.CloneSideDataBlobPtr();
-  if (side_data_blob_pipe.is_valid()) {
-    blink::mojom::BlobPtr side_data_blob_ptr;
-    side_data_blob_ptr.Bind(blink::mojom::BlobPtrInfo(
-        std::move(side_data_blob_pipe), blink::mojom::Blob::Version_));
-    response.side_data_blob = base::MakeRefCounted<storage::BlobHandle>(
-        std::move(side_data_blob_ptr));
+  blink::mojom::SerializedBlobPtr side_data_blob;
+  if (web_response.SideDataBlobSize() != 0) {
+    side_data_blob = blink::mojom::SerializedBlob::New();
+    side_data_blob->uuid = web_response.SideDataBlobUUID().Utf8();
+    side_data_blob->size = web_response.SideDataBlobSize();
+    auto side_data_blob_pipe = web_response.CloneSideDataBlobPtr();
+    DCHECK(side_data_blob_pipe.is_valid());
+    side_data_blob->blob = blink::mojom::BlobPtrInfo(
+        std::move(side_data_blob_pipe), blink::mojom::Blob::Version_);
   }
-  return response;
+
+  base::flat_map<std::string, std::string> headers;
+  web_response.VisitHTTPHeaderFields(MakeHeaderVisitor(&headers).get());
+
+  return blink::mojom::FetchAPIResponse::New(
+      GetURLList(web_response.UrlList()), web_response.Status(),
+      web_response.StatusText().Utf8(), web_response.ResponseType(), headers,
+      std::move(blob), web_response.GetError(), web_response.ResponseTime(),
+      web_response.CacheStorageCacheName().Utf8(),
+      GetHeaderList(web_response.CorsExposedHeaderNames()),
+      !web_response.CacheStorageCacheName().IsNull(),
+      std::move(side_data_blob));
 }
 
 }  // namespace content
diff --git a/content/renderer/service_worker/service_worker_type_util.h b/content/renderer/service_worker/service_worker_type_util.h
index f78839d..374a898 100644
--- a/content/renderer/service_worker/service_worker_type_util.h
+++ b/content/renderer/service_worker/service_worker_type_util.h
@@ -6,6 +6,7 @@
 #define CONTENT_RENDERER_SERVICE_WORKER_SERVICE_WORKER_TYPE_UTIL_H_
 
 #include "content/common/service_worker/service_worker_types.h"
+#include "third_party/blink/public/mojom/fetch/fetch_api_response.mojom.h"
 
 namespace blink {
 class WebServiceWorkerRequest;
@@ -18,7 +19,7 @@
     const blink::WebServiceWorkerRequest& web_request,
     ServiceWorkerHeaderMap* headers);
 
-ServiceWorkerResponse GetServiceWorkerResponseFromWebResponse(
+blink::mojom::FetchAPIResponsePtr GetFetchAPIResponseFromWebResponse(
     const blink::WebServiceWorkerResponse& web_response);
 
 }  // namespace content
diff --git a/content/shell/browser/layout_test/layout_test_browser_context.cc b/content/shell/browser/layout_test/layout_test_browser_context.cc
index 48c6b5f..7f09848 100644
--- a/content/shell/browser/layout_test/layout_test_browser_context.cc
+++ b/content/shell/browser/layout_test/layout_test_browser_context.cc
@@ -10,7 +10,7 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/push_messaging_service.h"
diff --git a/content/shell/browser/layout_test/secondary_test_window_observer.cc b/content/shell/browser/layout_test/secondary_test_window_observer.cc
index ee2ce8c..de996b18 100644
--- a/content/shell/browser/layout_test/secondary_test_window_observer.cc
+++ b/content/shell/browser/layout_test/secondary_test_window_observer.cc
@@ -10,8 +10,6 @@
 
 namespace content {
 
-DEFINE_WEB_CONTENTS_USER_DATA_KEY(SecondaryTestWindowObserver);
-
 SecondaryTestWindowObserver::SecondaryTestWindowObserver(
     WebContents* web_contents)
     : WebContentsObserver(web_contents) {
diff --git a/content/shell/browser/shell_download_manager_delegate.cc b/content/shell/browser/shell_download_manager_delegate.cc
index c8620ed..45d196c9 100644
--- a/content/shell/browser/shell_download_manager_delegate.cc
+++ b/content/shell/browser/shell_download_manager_delegate.cc
@@ -18,7 +18,7 @@
 #include "base/macros.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/shell/browser/shell_url_request_context_getter.cc b/content/shell/browser/shell_url_request_context_getter.cc
index 0e88dc1..a64b3ec 100644
--- a/content/shell/browser/shell_url_request_context_getter.cc
+++ b/content/shell/browser/shell_url_request_context_getter.cc
@@ -13,7 +13,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/network_session_configurator/browser/network_session_configurator.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/content/shell/common/shell_content_client.cc b/content/shell/common/shell_content_client.cc
index 5042ed84..806cd512 100644
--- a/content/shell/common/shell_content_client.cc
+++ b/content/shell/common/shell_content_client.cc
@@ -7,6 +7,7 @@
 #include "base/command_line.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
 #include "build/build_config.h"
 #include "content/app/resources/grit/content_resources.h"
 #include "content/app/strings/grit/content_strings.h"
@@ -87,6 +88,17 @@
       resource_id);
 }
 
+base::DictionaryValue ShellContentClient::GetNetLogConstants() const {
+  base::DictionaryValue client_constants;
+  client_constants.SetString("name", "content_shell");
+  client_constants.SetString(
+      "command_line",
+      base::CommandLine::ForCurrentProcess()->GetCommandLineString());
+  base::DictionaryValue constants;
+  constants.SetKey("clientInfo", std::move(client_constants));
+  return constants;
+}
+
 blink::OriginTrialPolicy* ShellContentClient::GetOriginTrialPolicy() {
   return &origin_trial_policy_;
 }
diff --git a/content/shell/common/shell_content_client.h b/content/shell/common/shell_content_client.h
index 635f493..bbf0011 100644
--- a/content/shell/common/shell_content_client.h
+++ b/content/shell/common/shell_content_client.h
@@ -29,6 +29,7 @@
   base::RefCountedMemory* GetDataResourceBytes(
       int resource_id) const override;
   gfx::Image& GetNativeImageNamed(int resource_id) const override;
+  base::DictionaryValue GetNetLogConstants() const override;
   blink::OriginTrialPolicy* GetOriginTrialPolicy() override;
 
  private:
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 1fb7781..9266e3b 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -95,8 +95,6 @@
     "../public/test/mock_browsing_data_remover_delegate.h",
     "../public/test/mock_download_manager.cc",
     "../public/test/mock_download_manager.h",
-    "../public/test/mock_network_connection_tracker.cc",
-    "../public/test/mock_network_connection_tracker.h",
     "../public/test/mock_notification_observer.cc",
     "../public/test/mock_notification_observer.h",
     "../public/test/mock_permission_manager.cc",
@@ -1498,11 +1496,6 @@
     "../browser/renderer_host/media/video_capture_manager_unittest.cc",
     "../browser/renderer_host/media/video_capture_unittest.cc",
     "../browser/renderer_host/overscroll_controller_unittest.cc",
-    "../browser/renderer_host/p2p/socket_host_tcp_server_unittest.cc",
-    "../browser/renderer_host/p2p/socket_host_tcp_unittest.cc",
-    "../browser/renderer_host/p2p/socket_host_test_utils.cc",
-    "../browser/renderer_host/p2p/socket_host_test_utils.h",
-    "../browser/renderer_host/p2p/socket_host_udp_unittest.cc",
     "../browser/renderer_host/render_process_host_unittest.cc",
     "../browser/renderer_host/render_view_host_unittest.cc",
     "../browser/renderer_host/render_widget_host_input_event_router_unittest.cc",
@@ -1624,7 +1617,6 @@
     "../common/throttling_url_loader_unittest.cc",
     "../common/unique_name_helper_unittest.cc",
     "../common/webplugininfo_unittest.cc",
-    "../public/browser/network_connection_tracker_unittest.cc",
     "../public/browser/site_isolation_policy_unittest.cc",
 
     # TODO(jam): move these network/ tests to services/network.
@@ -1967,12 +1959,6 @@
       "../browser/media/capture/desktop_capture_device_unittest.cc",
       "../browser/media/capture/frame_sink_video_capture_device_unittest.cc",
     ]
-    if (use_aura) {
-      sources += [ "../browser/media/capture/cursor_renderer_aura_unittest.cc" ]
-    }
-    if (is_mac) {
-      sources += [ "../browser/media/capture/cursor_renderer_mac_unittest.mm" ]
-    }
     if (is_chromeos) {
       sources += [
         "../browser/media/capture/lame_capture_overlay_chromeos_unittest.cc",
@@ -2079,10 +2065,6 @@
     ]
   }
 
-  # Avoid windows due to non-availability of cursor resources in test.
-  if (is_win) {
-    sources -= [ "../browser/media/capture/cursor_renderer_aura_unittest.cc" ]
-  }
   if (use_aura || toolkit_views) {
     deps += [ "//ui/events:test_support" ]
   }
diff --git a/content/test/data/cross_site_document_blocking/headers-test.json.mock-http-headers b/content/test/data/cross_site_document_blocking/headers-test.json.mock-http-headers
index 263098a4..e28183c 100644
--- a/content/test/data/cross_site_document_blocking/headers-test.json.mock-http-headers
+++ b/content/test/data/cross_site_document_blocking/headers-test.json.mock-http-headers
@@ -1,4 +1,5 @@
 HTTP/1.1 200 OK
+Access-Control-Allow-Origin: https://other.unrelated.origin.com
 Cache-Control: no-cache, no-store, must-revalidate
 Content-Length: 19
 Content-Language: TestLanguage
diff --git a/content/test/gpu/gpu_tests/context_lost_integration_test.py b/content/test/gpu/gpu_tests/context_lost_integration_test.py
index 0c7fdace..e0a0a06 100644
--- a/content/test/gpu/gpu_tests/context_lost_integration_test.py
+++ b/content/test/gpu/gpu_tests/context_lost_integration_test.py
@@ -69,7 +69,7 @@
     # These are options specified for every test.
     return [
       '--disable-gpu-process-crash-limit',
-      # Required for about:gpucrash handling from Telemetry.
+      # Required to call crashGpuProcess.
       '--enable-gpu-benchmarking'] + browser_args
 
   @classmethod
@@ -145,26 +145,20 @@
           'window.domAutomationController._finished', timeout=wait_timeout)
 
       # Crash the GPU process.
-      gpucrash_tab = tab.browser.tabs.New()
-      # To access these debug URLs from Telemetry, they have to be
-      # written using the chrome:// scheme.
-      # The try/except is a workaround for crbug.com/368107.
-      try:
-        gpucrash_tab.Navigate('chrome://gpucrash')
-      except Exception:
-        print 'Tab crashed while navigating to chrome://gpucrash'
-      # Activate the original tab and wait for completion.
-      tab.Activate()
+      #
+      # This used to create a new tab and navigate it to
+      # chrome://gpucrash, but there was enough unreliability
+      # navigating between these tabs (one of which was created solely
+      # in order to navigate to chrome://gpucrash) that the simpler
+      # solution of provoking the GPU process crash from this renderer
+      # process was chosen.
+      tab.EvaluateJavaScript('chrome.gpuBenchmarking.crashGpuProcess()')
+
       completed = self._WaitForPageToFinish(tab)
 
       if check_crash_count:
         self._CheckCrashCount(tab, expected_kills)
 
-      # The try/except is a workaround for crbug.com/368107.
-      try:
-        gpucrash_tab.Close()
-      except Exception:
-        print 'Tab crashed while closing chrome://gpucrash'
       if not completed:
         self.fail('Test didn\'t complete (no context lost event?)')
       if not tab.EvaluateJavaScript(
@@ -290,27 +284,17 @@
       else:
         self.fail('Initial page failed to get a WebGL context')
     # Kill the GPU process in order to get WebGL blocked.
-    gpucrash_tab = tab.browser.tabs.New()
-    try:
-      # To access these debug URLs from Telemetry, they have to be
-      # written using the chrome:// scheme.
-      gpucrash_tab.Navigate('chrome://gpucrash')
-      # Activate the original tab.
-      tab.Activate()
-      # The original tab has navigated to a new page. Wait for it to
-      # finish running its onload handler.
-      tab.WaitForJavaScriptCondition('window.initFinished',
+    tab.EvaluateJavaScript('chrome.gpuBenchmarking.crashGpuProcess()')
+    # The original tab will navigate to a new page. Wait for it to
+    # finish running its onload handler.
+    # TODO(kbr): figure out when it's OK to evaluate this JavaScript.
+    # Seems racy to do it immediately after crashing the GPU process.
+    tab.WaitForJavaScriptCondition('window.initFinished',
                                      timeout=wait_timeout)
-      # Make sure the page failed to get a GL context.
-      if tab.EvaluateJavaScript('window.gotGL'):
-        self.fail(
-          'Page should have been blocked from getting a new WebGL context')
-    finally:
-      # This try/except is still needed. crbug.com/832886
-      try:
-        gpucrash_tab.Close()
-      except Exception:
-        print 'Tab crashed while closing chrome://gpucrash'
+    # Make sure the page failed to get a GL context.
+    if tab.EvaluateJavaScript('window.gotGL'):
+      self.fail(
+        'Page should have been blocked from getting a new WebGL context')
     self._RestartBrowser('must restart after tests that kill the GPU process')
 
   def _ContextLost_WebGLUnblockedAfterUserInitiatedReload(self, test_path):
@@ -321,34 +305,23 @@
     if not tab.EvaluateJavaScript('window.domAutomationController._succeeded'):
       self.fail('Tab failed to get an initial WebGL context')
     # Kill the GPU process in order to get WebGL blocked.
-    gpucrash_tab = tab.browser.tabs.New()
-    try:
-      # To access these debug URLs from Telemetry, they have to be
-      # written using the chrome:// scheme.
-      gpucrash_tab.Navigate('chrome://gpucrash')
-      # Activate the original tab.
-      tab.Activate()
-      # Wait for the page to receive a context loss event.
-      tab.WaitForJavaScriptCondition('window.contextLostReceived',
-                                     timeout=wait_timeout)
-      # Make sure WebGL is still blocked.
-      if not tab.EvaluateJavaScript(
-          'window.domAutomationController._succeeded'):
-        self.fail('WebGL should have been blocked after a context loss')
-      # Reload the page via Telemetry / DevTools. This is treated as a
-      # user-initiated navigation, so WebGL is unblocked.
-      self._NavigateAndWaitForLoad(test_path)
-      # Ensure WebGL is unblocked.
-      if not tab.EvaluateJavaScript(
-          'window.domAutomationController._succeeded'):
-        self.fail(
-          'WebGL should have been unblocked after a user-initiated navigation')
-    finally:
-      # This try/except is still needed. crbug.com/832886
-      try:
-        gpucrash_tab.Close()
-      except Exception:
-        print 'Tab crashed while closing chrome://gpucrash'
+    tab.EvaluateJavaScript('chrome.gpuBenchmarking.crashGpuProcess()')
+
+    # Wait for the page to receive a context loss event.
+    tab.WaitForJavaScriptCondition('window.contextLostReceived',
+                                   timeout=wait_timeout)
+    # Make sure WebGL is still blocked.
+    if not tab.EvaluateJavaScript(
+        'window.domAutomationController._succeeded'):
+      self.fail('WebGL should have been blocked after a context loss')
+    # Reload the page via Telemetry / DevTools. This is treated as a
+    # user-initiated navigation, so WebGL is unblocked.
+    self._NavigateAndWaitForLoad(test_path)
+    # Ensure WebGL is unblocked.
+    if not tab.EvaluateJavaScript(
+        'window.domAutomationController._succeeded'):
+      self.fail(
+        'WebGL should have been unblocked after a user-initiated navigation')
     self._RestartBrowser('must restart after tests that kill the GPU process')
 
 def load_tests(loader, tests, pattern):
diff --git a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
index af2d4afd..3929bf12 100644
--- a/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
+++ b/content/test/gpu/gpu_tests/webgl_conformance_expectations.py
@@ -441,6 +441,8 @@
         ['mac', ('nvidia', 0xfe9)], bug=635081)
     self.Fail('conformance/glsl/bugs/init-array-with-loop.html',
         ['mac', ('nvidia', 0xfe9)], bug=784817)
+    self.Fail('conformance/uniforms/uniform-samplers-test.html',
+        ['mac', 'debug', ('nvidia', 0xfe9)], bug=871352)
 
     # Linux failures
     self.Fail('conformance/extensions/webgl-compressed-texture-astc.html',
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index 925a76c..92260a4 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -245,6 +245,11 @@
   DidReceiveInputEvent(render_widget_host, type);
 }
 
+void TestWebContents::TestDidFinishLoad(const GURL& url) {
+  FrameHostMsg_DidFinishLoad msg(0, url);
+  frame_tree_.root()->current_frame_host()->OnMessageReceived(msg);
+}
+
 void TestWebContents::TestDidFailLoadWithError(
     const GURL& url,
     int error_code,
@@ -388,11 +393,6 @@
             history_length);
 }
 
-void TestWebContents::TestDidFinishLoad(const GURL& url) {
-  FrameHostMsg_DidFinishLoad msg(0, url);
-  frame_tree_.root()->current_frame_host()->OnMessageReceived(msg);
-}
-
 void TestWebContents::SetNavigationData(
     NavigationHandle* navigation_handle,
     std::unique_ptr<NavigationData> navigation_data) {
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h
index 8af9da8..b1cc02739 100644
--- a/content/test/test_web_contents.h
+++ b/content/test/test_web_contents.h
@@ -9,8 +9,10 @@
 
 #include <list>
 #include <map>
+#include <memory>
 #include <string>
 #include <utility>
+#include <vector>
 
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/test/web_contents_tester.h"
@@ -101,6 +103,7 @@
   void SetMainFrameMimeType(const std::string& mime_type) override;
   void SetIsCurrentlyAudible(bool audible) override;
   void TestDidReceiveInputEvent(blink::WebInputEvent::Type type) override;
+  void TestDidFinishLoad(const GURL& url) override;
   void TestDidFailLoadWithError(
       const GURL& url,
       int error_code,
@@ -150,8 +153,6 @@
 
   void ResetPauseSubresourceLoadingCalled() override;
 
-  void TestDidFinishLoad(const GURL& url);
-
   void SetPageImportanceSignals(PageImportanceSignals signals) override;
 
   void SetLastActiveTime(base::TimeTicks last_active_time) override;
diff --git a/content/utility/utility_service_factory.cc b/content/utility/utility_service_factory.cc
index 3bfe339..4d2eb95 100644
--- a/content/utility/utility_service_factory.cc
+++ b/content/utility/utility_service_factory.cc
@@ -34,10 +34,6 @@
 #include "services/viz/public/interfaces/constants.mojom.h"
 #include "services/viz/service.h"
 
-#if BUILDFLAG(ENABLE_ASSISTANT_AUDIO_DECODER)
-#include "media/mojo/services/media_service_factory.h"  // nogncheck
-#endif
-
 #if BUILDFLAG(ENABLE_LIBRARY_CDMS)
 #include "media/cdm/cdm_adapter_factory.h"           // nogncheck
 #include "media/mojo/interfaces/constants.mojom.h"   // nogncheck
@@ -100,12 +96,6 @@
 }
 #endif  // BUILDFLAG(ENABLE_LIBRARY_CDMS)
 
-#if BUILDFLAG(ENABLE_ASSISTANT_AUDIO_DECODER)
-std::unique_ptr<service_manager::Service> CreateMediaService() {
-  return ::media::CreateMediaService();
-}
-#endif  // BUILDFLAG(ENABLE_ASSISTANT_AUDIO_DECODER)
-
 std::unique_ptr<service_manager::Service> CreateDataDecoderService() {
   content::UtilityThread::Get()->EnsureBlinkInitialized();
   return data_decoder::DataDecoderService::Create();
@@ -155,14 +145,6 @@
   services->emplace(media::mojom::kCdmServiceName, info);
 #endif
 
-#if BUILDFLAG(ENABLE_ASSISTANT_AUDIO_DECODER)
-  service_manager::EmbeddedServiceInfo assistant_media_service_info;
-  assistant_media_service_info.factory =
-      base::BindRepeating(&CreateMediaService);
-  services->emplace(media::mojom::kMediaServiceName,
-                    assistant_media_service_info);
-#endif
-
   service_manager::EmbeddedServiceInfo shape_detection_info;
   shape_detection_info.factory =
       base::Bind(&shape_detection::ShapeDetectionService::Create);
diff --git a/crypto/nss_util.cc b/crypto/nss_util.cc
index 870b1b47..afeb5ca 100644
--- a/crypto/nss_util.cc
+++ b/crypto/nss_util.cc
@@ -29,7 +29,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_checker.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/device/BUILD.gn b/device/BUILD.gn
index 3e296c4..f6bd3d45 100644
--- a/device/BUILD.gn
+++ b/device/BUILD.gn
@@ -314,6 +314,8 @@
       "bluetooth/test/fake_gatt_device_services_result_winrt.h",
       "bluetooth/test/fake_gatt_read_result_winrt.cc",
       "bluetooth/test/fake_gatt_read_result_winrt.h",
+      "bluetooth/test/fake_gatt_value_changed_event_args_winrt.cc",
+      "bluetooth/test/fake_gatt_value_changed_event_args_winrt.h",
       "bluetooth/test/fake_gatt_write_result_winrt.cc",
       "bluetooth/test/fake_gatt_write_result_winrt.h",
       "bluetooth/test/fake_radio_winrt.cc",
diff --git a/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc b/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc
index 6f1db42..d964e11 100644
--- a/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc
+++ b/device/bluetooth/bluetooth_gatt_discoverer_winrt.cc
@@ -25,23 +25,28 @@
     GattCommunicationStatus;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattCommunicationStatus_Success;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::GattDescriptor;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattDescriptorsResult;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattDeviceService;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattDeviceServicesResult;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattCharacteristic3;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     IGattCharacteristicsResult;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
-    IGattDeviceService;
+    IGattDescriptorsResult;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     IGattDeviceService3;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     IGattDeviceServicesResult;
-using ABI::Windows::Devices::Bluetooth::IBluetoothLEDevice;
 using ABI::Windows::Devices::Bluetooth::IBluetoothLEDevice3;
+using ABI::Windows::Devices::Bluetooth::IBluetoothLEDevice;
+using ABI::Windows::Foundation::Collections::IVectorView;
 using ABI::Windows::Foundation::IAsyncOperation;
 using ABI::Windows::Foundation::IReference;
-using ABI::Windows::Foundation::Collections::IVectorView;
 using Microsoft::WRL::ComPtr;
 
 template <typename IGattResult>
@@ -149,6 +154,15 @@
                                                        : nullptr;
 }
 
+const BluetoothGattDiscovererWinrt::GattDescriptorList*
+BluetoothGattDiscovererWinrt::GetDescriptors(
+    uint16_t characteristic_attribute_handle) const {
+  auto iter =
+      characteristic_to_descriptors_map_.find(characteristic_attribute_handle);
+  return iter != characteristic_to_descriptors_map_.end() ? &iter->second
+                                                          : nullptr;
+}
+
 void BluetoothGattDiscovererWinrt::OnGetGattServices(
     ComPtr<IGattDeviceServicesResult> services_result) {
   if (!CheckCommunicationStatus(services_result.Get())) {
@@ -170,6 +184,7 @@
     return;
   }
 
+  num_services_ = gatt_services_.size();
   for (const auto& gatt_service : gatt_services_) {
     uint16_t service_attribute_handle;
     hr = gatt_service->get_AttributeHandle(&service_attribute_handle);
@@ -233,9 +248,80 @@
 
   DCHECK(!base::ContainsKey(service_to_characteristics_map_,
                             service_attribute_handle));
-  if (!GetAsVector(
-          characteristics.Get(),
-          &service_to_characteristics_map_[service_attribute_handle])) {
+  auto& characteristics_list =
+      service_to_characteristics_map_[service_attribute_handle];
+  if (!GetAsVector(characteristics.Get(), &characteristics_list)) {
+    std::move(callback_).Run(false);
+    return;
+  }
+
+  num_characteristics_ += characteristics_list.size();
+  for (const auto& gatt_characteristic : characteristics_list) {
+    uint16_t characteristic_attribute_handle;
+    hr = gatt_characteristic->get_AttributeHandle(
+        &characteristic_attribute_handle);
+    if (FAILED(hr)) {
+      VLOG(2) << "Getting AttributeHandle failed: "
+              << logging::SystemErrorCodeToString(hr);
+      std::move(callback_).Run(false);
+      return;
+    }
+
+    ComPtr<IGattCharacteristic3> gatt_characteristic_3;
+    hr = gatt_characteristic.As(&gatt_characteristic_3);
+    if (FAILED(hr)) {
+      VLOG(2) << "Obtaining IGattCharacteristic3 failed: "
+              << logging::SystemErrorCodeToString(hr);
+      std::move(callback_).Run(false);
+      return;
+    }
+
+    ComPtr<IAsyncOperation<GattDescriptorsResult*>> get_descriptors_op;
+    hr = gatt_characteristic_3->GetDescriptorsAsync(&get_descriptors_op);
+    if (FAILED(hr)) {
+      VLOG(2) << "GattCharacteristic::GetDescriptorsAsync() failed: "
+              << logging::SystemErrorCodeToString(hr);
+      std::move(callback_).Run(false);
+      return;
+    }
+
+    hr = PostAsyncResults(
+        std::move(get_descriptors_op),
+        base::BindOnce(&BluetoothGattDiscovererWinrt::OnGetDescriptors,
+                       weak_ptr_factory_.GetWeakPtr(),
+                       characteristic_attribute_handle));
+
+    if (FAILED(hr)) {
+      VLOG(2) << "PostAsyncResults failed: "
+              << logging::SystemErrorCodeToString(hr);
+      std::move(callback_).Run(false);
+    }
+  }
+
+  RunCallbackIfDone();
+}
+
+void BluetoothGattDiscovererWinrt::OnGetDescriptors(
+    uint16_t characteristic_attribute_handle,
+    ComPtr<IGattDescriptorsResult> descriptors_result) {
+  if (!CheckCommunicationStatus(descriptors_result.Get())) {
+    std::move(callback_).Run(false);
+    return;
+  }
+
+  ComPtr<IVectorView<GattDescriptor*>> descriptors;
+  HRESULT hr = descriptors_result->get_Descriptors(&descriptors);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting Descriptors failed: "
+            << logging::SystemErrorCodeToString(hr);
+    std::move(callback_).Run(false);
+    return;
+  }
+
+  DCHECK(!base::ContainsKey(characteristic_to_descriptors_map_,
+                            characteristic_attribute_handle));
+  if (!GetAsVector(descriptors.Get(), &characteristic_to_descriptors_map_
+                                          [characteristic_attribute_handle])) {
     std::move(callback_).Run(false);
     return;
   }
@@ -245,8 +331,10 @@
 
 void BluetoothGattDiscovererWinrt::RunCallbackIfDone() {
   DCHECK(callback_);
-  if (service_to_characteristics_map_.size() == gatt_services_.size())
+  if (service_to_characteristics_map_.size() == num_services_ &&
+      characteristic_to_descriptors_map_.size() == num_characteristics_) {
     std::move(callback_).Run(true);
+  }
 }
 
 }  // namespace device
diff --git a/device/bluetooth/bluetooth_gatt_discoverer_winrt.h b/device/bluetooth/bluetooth_gatt_discoverer_winrt.h
index f05c1535..39392ba 100644
--- a/device/bluetooth/bluetooth_gatt_discoverer_winrt.h
+++ b/device/bluetooth/bluetooth_gatt_discoverer_winrt.h
@@ -38,16 +38,24 @@
   using GattCharacteristicList = std::vector<
       Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
                                  GenericAttributeProfile::IGattCharacteristic>>;
+  using GattDescriptorList = std::vector<
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattDescriptor>>;
 
   BluetoothGattDiscovererWinrt(
       Microsoft::WRL::ComPtr<
           ABI::Windows::Devices::Bluetooth::IBluetoothLEDevice> ble_device);
   ~BluetoothGattDiscovererWinrt();
 
+  // Note: In order to avoid running |callback| multiple times on errors,
+  // clients are expected to synchronously destroy the GattDiscoverer after
+  // |callback| has been invoked for the first time.
   void StartGattDiscovery(GattDiscoveryCallback callback);
   const GattServiceList& GetGattServices() const;
   const GattCharacteristicList* GetCharacteristics(
       uint16_t service_attribute_handle) const;
+  const GattDescriptorList* GetDescriptors(
+      uint16_t characteristic_attribute_handle) const;
 
  private:
   void OnGetGattServices(
@@ -61,6 +69,12 @@
           ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
               IGattCharacteristicsResult> characteristics_result);
 
+  void OnGetDescriptors(
+      uint16_t characteristic_attribute_handle,
+      Microsoft::WRL::ComPtr<
+          ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+              IGattDescriptorsResult> descriptors_result);
+
   void RunCallbackIfDone();
 
   Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::IBluetoothLEDevice>
@@ -70,6 +84,10 @@
   GattServiceList gatt_services_;
   base::flat_map<uint16_t, GattCharacteristicList>
       service_to_characteristics_map_;
+  base::flat_map<uint16_t, GattDescriptorList>
+      characteristic_to_descriptors_map_;
+  size_t num_services_ = 0;
+  size_t num_characteristics_ = 0;
 
   THREAD_CHECKER(thread_checker_);
 
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic.h b/device/bluetooth/bluetooth_remote_gatt_characteristic.h
index c475063f..c3c8df5 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic.h
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic.h
@@ -169,6 +169,10 @@
   virtual bool WriteWithoutResponse(base::span<const uint8_t> value);
 
  protected:
+  using DescriptorMap =
+      base::flat_map<std::string,
+                     std::unique_ptr<BluetoothRemoteGattDescriptor>>;
+
   BluetoothRemoteGattCharacteristic();
 
   // Writes to the Client Characteristic Configuration descriptor to enable
@@ -206,8 +210,7 @@
 
   // Descriptors owned by the chracteristic. The descriptors' identifiers serve
   // as keys.
-  base::flat_map<std::string, std::unique_ptr<BluetoothRemoteGattDescriptor>>
-      descriptors_;
+  DescriptorMap descriptors_;
 
  private:
   friend class BluetoothGattNotifySession;
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
index da8a2b5..cb4fd29b 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_unittest.cc
@@ -97,6 +97,7 @@
               .canonical_value());
       expected_descriptors_count++;
     }
+    base::RunLoop().RunUntilIdle();
     ASSERT_EQ(expected_descriptors_count,
               characteristic1_->GetDescriptors().size());
 
@@ -1564,8 +1565,13 @@
 // how other platforms set global variables.
 // Tests that a notification arriving during a pending read doesn't
 // cause a crash.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       Notification_During_ReadRemoteCharacteristic) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_Notification_During_ReadRemoteCharacteristic) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -1625,7 +1631,7 @@
 // Tests that a notification arriving during a pending write doesn't
 // cause a crash.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        Notification_During_WriteRemoteCharacteristic) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1671,7 +1677,7 @@
 // StartNotifySession fails if characteristic doesn't have Notify or Indicate
 // property.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_NoNotifyOrIndicate) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1705,7 +1711,7 @@
 // StartNotifySession fails if the characteristic is missing the Client
 // Characteristic Configuration descriptor.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_NoConfigDescriptor) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1739,7 +1745,7 @@
 // StartNotifySession fails if the characteristic has multiple Client
 // Characteristic Configuration descriptors.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_MultipleConfigDescriptor) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1827,7 +1833,7 @@
 #endif
 // Tests StartNotifySession success on a characteristic that enabled Notify.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, StartNotifySession) {
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, StartNotifySession) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StartNotifySession) {
 #endif
@@ -1847,7 +1853,7 @@
 #endif
 // Tests StartNotifySession success on a characteristic that enabled Indicate.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_OnIndicate) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1871,7 +1877,7 @@
 // Tests StartNotifySession success on a characteristic that enabled Notify &
 // Indicate.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_OnNotifyAndIndicate) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1893,7 +1899,7 @@
 #endif
 // Tests multiple StartNotifySession success.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_Multiple) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -1909,6 +1915,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   characteristic1_->StartNotifySession(
@@ -1942,8 +1949,13 @@
   DISABLED_StartNotifySessionError_Multiple
 #endif
 // Tests multiple StartNotifySessions pending and then an error.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StartNotifySessionError_Multiple) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StartNotifySessionError_Multiple) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -1954,6 +1966,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   characteristic1_->StartNotifySession(GetNotifyCallback(Call::NOT_EXPECTED),
@@ -2018,8 +2031,13 @@
   DISABLED_StartNotifySession_BeforeDeleted
 #endif
 // Tests StartNotifySession completing before chrome objects are deleted.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StartNotifySession_BeforeDeleted) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StartNotifySession_BeforeDeleted) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2030,6 +2048,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   characteristic1_->StartNotifySession(
@@ -2070,7 +2089,7 @@
 // Tests StartNotifySession reentrant in start notify session success callback
 // and the reentrant start notify session success.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        StartNotifySession_Reentrant_Success_Success) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -2084,7 +2103,9 @@
       FakeCharacteristicBoilerplate(/* properties: NOTIFY */ 0x10));
   SimulateGattDescriptor(
       characteristic1_,
-      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid().value());
+      BluetoothGattDescriptor::ClientCharacteristicConfigurationUuid()
+          .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   characteristic1_->StartNotifySession(
@@ -2156,7 +2177,11 @@
 #define MAYBE_StopNotifySession DISABLED_StopNotifySession
 #endif
 // Tests StopNotifySession success on a characteristic that enabled Notify.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly, StopNotifySession) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StopNotifySession) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2185,8 +2210,13 @@
   DISABLED_StopNotifySession_SessionDeleted
 #endif
 // Tests that deleted sessions are stopped.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_SessionDeleted) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_SessionDeleted) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2216,8 +2246,13 @@
 #endif
 // Tests that deleting the sessions before the stop callbacks have been
 // invoked does not cause problems.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_SessionDeleted2) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_SessionDeleted2) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2229,6 +2264,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   // Start notify sessions.
@@ -2277,10 +2313,13 @@
 #define MAYBE_StopNotifySession_Cancelled DISABLED_StopNotifySession_Cancelled
 #endif
 // Tests that cancelling StopNotifySession works.
-// TODO(crbug.com/636270): Enable on Windows when SubscribeToNotifications is
-// implemented.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
+       StopNotifySession_Cancelled) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_Cancelled) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2309,8 +2348,13 @@
   DISABLED_StopNotifySession_AfterDeleted
 #endif
 // Tests that deleted sessions are stopped.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
+       StopNotifySession_AfterDeleted) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_AfterDeleted) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2350,8 +2394,13 @@
 #define MAYBE_StopNotifySession_OnIndicate DISABLED_StopNotifySession_OnIndicate
 #endif
 // Tests StopNotifySession success on a characteristic that enabled Indicate.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_OnIndicate) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_OnIndicate) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2382,8 +2431,13 @@
 #endif
 // Tests StopNotifySession success on a characteristic that enabled Notify &
 // Indicate.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_OnNotifyAndIndicate) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_OnNotifyAndIndicate) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2412,7 +2466,12 @@
 #define MAYBE_StopNotifySession_Error DISABLED_StopNotifySession_Error
 #endif
 // Tests StopNotifySession error
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_Error) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_StopNotifySession_Error) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2443,8 +2502,13 @@
 #define MAYBE_StopNotifySession_Multiple1 DISABLED_StopNotifySession_Multiple1
 #endif
 // Tests multiple StopNotifySession calls for a single session.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_Multiple1) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_Multiple1) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2456,6 +2520,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   // Start notify session
@@ -2493,8 +2558,13 @@
 #define MAYBE_StopNotifySession_Multiple2 DISABLED_StopNotifySession_Multiple2
 #endif
 // Tests multiple StartNotifySession calls and multiple StopNotifySession calls.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_Multiple2) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_Multiple2) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2506,6 +2576,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   // Start notify sessions
@@ -2555,8 +2626,13 @@
 #endif
 // Tests starting a new notify session before the previous stop request
 // resolves.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_StopStart) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_StopStart) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2567,6 +2643,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   // Start notify session
@@ -2608,8 +2685,13 @@
 #define MAYBE_StopNotifySession_StartStopStart \
   DISABLED_StopNotifySession_StartStopStart
 #endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_StartStopStart) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_StartStopStart) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2669,8 +2751,13 @@
 #endif
 // Tests starting a new notify session before the previous stop requests
 // resolve.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_StopStopStart) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_StopStopStart) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2681,6 +2768,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   // Start notify session
@@ -2737,8 +2825,13 @@
 #define MAYBE_StopNotifySession_Reentrant_Success_Stop \
   DISABLED_StopNotifySession_Reentrant_Success_Stop
 #endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_Reentrant_Success_Stop) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_Reentrant_Success_Stop) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2749,6 +2842,7 @@
       characteristic1_,
       BluetoothRemoteGattDescriptor::ClientCharacteristicConfigurationUuid()
           .canonical_value());
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, characteristic1_->GetDescriptors().size());
 
   // Start notify session
@@ -2786,8 +2880,13 @@
 #define MAYBE_StopNotifySession_Reentrant_Stop_StartSuccess \
   DISABLED_StopNotifySession_Reentrant_Stop_StartSuccess
 #endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_Reentrant_Stop_StartSuccess) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_Reentrant_Stop_StartSuccess) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2836,8 +2935,13 @@
 #define MAYBE_StopNotifySession_Reentrant_Stop_StartError \
   DISABLED_StopNotifySession_Reentrant_Stop_StartError
 #endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrtOnly,
+       StopNotifySession_Reentrant_Stop_StartError) {
+#else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_StopNotifySession_Reentrant_Stop_StartError) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -2909,7 +3013,7 @@
 #endif
 // Tests Characteristic Value changes during a Notify Session.
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        GattCharacteristicValueChanged) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
@@ -3013,11 +3117,15 @@
 #define MAYBE_GetDescriptors_FindNone DISABLED_GetDescriptors_FindNone
 #endif
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
-       GetDescriptors_FindNone) {
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GetDescriptors_FindNone) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetDescriptors_FindNone) {
 #endif
+  if (!PlatformSupportsLowEnergy()) {
+    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
+    return;
+  }
+
   ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate());
 
   EXPECT_EQ(0u, characteristic1_->GetDescriptors().size());
@@ -3030,12 +3138,17 @@
   DISABLED_GetDescriptors_and_GetDescriptor
 #endif
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only,
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt,
        GetDescriptors_and_GetDescriptor) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest,
        MAYBE_GetDescriptors_and_GetDescriptor) {
 #endif
+  if (!PlatformSupportsLowEnergy()) {
+    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
+    return;
+  }
+
   ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate());
 
   // Add several Descriptors:
@@ -3047,6 +3160,7 @@
   SimulateGattDescriptor(characteristic1_, uuid2.canonical_value());
   SimulateGattDescriptor(characteristic2_, uuid3.canonical_value());
   SimulateGattDescriptor(characteristic2_, uuid4.canonical_value());
+  base::RunLoop().RunUntilIdle();
 
   // Verify that GetDescriptor can retrieve descriptors again by ID,
   // and that the same Descriptor is returned when searched by ID.
@@ -3084,10 +3198,15 @@
 #define MAYBE_GetDescriptorsByUUID DISABLED_GetDescriptorsByUUID
 #endif
 #if defined(OS_WIN)
-TEST_P(BluetoothRemoteGattCharacteristicTestWin32Only, GetDescriptorsByUUID) {
+TEST_P(BluetoothRemoteGattCharacteristicTestWinrt, GetDescriptorsByUUID) {
 #else
 TEST_F(BluetoothRemoteGattCharacteristicTest, MAYBE_GetDescriptorsByUUID) {
 #endif
+  if (!PlatformSupportsLowEnergy()) {
+    LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
+    return;
+  }
+
   ASSERT_NO_FATAL_FAILURE(FakeCharacteristicBoilerplate());
 
   // Add several Descriptors:
@@ -3098,6 +3217,7 @@
   SimulateGattDescriptor(characteristic1_, id2.canonical_value());
   SimulateGattDescriptor(characteristic2_, id3.canonical_value());
   SimulateGattDescriptor(characteristic2_, id3.canonical_value());
+  base::RunLoop().RunUntilIdle();
 
   EXPECT_NE(characteristic2_->GetDescriptorsByUUID(id3).at(0)->GetIdentifier(),
             characteristic2_->GetDescriptorsByUUID(id3).at(1)->GetIdentifier());
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc
index 6bc0e25..b18b7d5c 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.cc
@@ -12,6 +12,11 @@
 #include "base/strings/stringprintf.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/win/winrt_storage_util.h"
+#include "device/bluetooth/bluetooth_adapter.h"
+#include "device/bluetooth/bluetooth_device.h"
+#include "device/bluetooth/bluetooth_gatt_discoverer_winrt.h"
+#include "device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h"
+#include "device/bluetooth/bluetooth_remote_gatt_service.h"
 #include "device/bluetooth/bluetooth_remote_gatt_service_winrt.h"
 #include "device/bluetooth/bluetooth_uuid.h"
 #include "device/bluetooth/event_utils_winrt.h"
@@ -23,6 +28,14 @@
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattCharacteristicProperties;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattClientCharacteristicConfigurationDescriptorValue;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattClientCharacteristicConfigurationDescriptorValue_Indicate;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattClientCharacteristicConfigurationDescriptorValue_None;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattClientCharacteristicConfigurationDescriptorValue_Notify;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattCommunicationStatus;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattCommunicationStatus_Success;
@@ -42,6 +55,8 @@
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     IGattReadResult2;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattValueChangedEventArgs;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     IGattWriteResult;
 using ABI::Windows::Foundation::IAsyncOperation;
 using ABI::Windows::Storage::Streams::IBuffer;
@@ -94,6 +109,9 @@
     pending_write_callbacks_->error_callback.Run(
         BluetoothGattService::GATT_ERROR_FAILED);
   }
+
+  if (value_changed_token_)
+    RemoveValueChangedHandler();
 }
 
 std::string BluetoothRemoteGattCharacteristicWinrt::GetIdentifier() const {
@@ -256,6 +274,33 @@
       std::make_unique<PendingWriteCallbacks>(callback, error_callback);
 }
 
+void BluetoothRemoteGattCharacteristicWinrt::UpdateDescriptors(
+    BluetoothGattDiscovererWinrt* gatt_discoverer) {
+  const auto* gatt_descriptors =
+      gatt_discoverer->GetDescriptors(attribute_handle_);
+  DCHECK(gatt_descriptors);
+
+  // Instead of clearing out |descriptors_| and creating each descriptor
+  // from scratch, we create a new map and move already existing descriptors
+  // into it in order to preserve pointer stability.
+  DescriptorMap descriptors;
+  for (const auto& gatt_descriptor : *gatt_descriptors) {
+    auto descriptor =
+        BluetoothRemoteGattDescriptorWinrt::Create(this, gatt_descriptor.Get());
+    if (!descriptor)
+      continue;
+
+    std::string identifier = descriptor->GetIdentifier();
+    auto iter = descriptors_.find(identifier);
+    if (iter != descriptors_.end())
+      descriptors.emplace(std::move(*iter));
+    else
+      descriptors.emplace(std::move(identifier), std::move(descriptor));
+  }
+
+  std::swap(descriptors, descriptors_);
+}
+
 bool BluetoothRemoteGattCharacteristicWinrt::WriteWithoutResponse(
     base::span<const uint8_t> value) {
   if (!(GetProperties() & PROPERTY_WRITE_WITHOUT_RESPONSE))
@@ -281,6 +326,9 @@
   }
 
   ComPtr<IAsyncOperation<GattWriteResult*>> write_value_op;
+  // Note: As we are ignoring the result WriteValueWithOptionAsync() would work
+  // as well, but re-using WriteValueWithResultAndOptionAsync() does simplify
+  // the testing code and there is no difference in production.
   hr = characteristic_3->WriteValueWithResultAndOptionAsync(
       buffer.Get(), GattWriteOption_WriteWithoutResponse, &write_value_op);
   if (FAILED(hr)) {
@@ -310,14 +358,51 @@
     BluetoothRemoteGattDescriptor* ccc_descriptor,
     const base::Closure& callback,
     const ErrorCallback& error_callback) {
-  NOTIMPLEMENTED();
+  value_changed_token_ = AddTypedEventHandler(
+      characteristic_.Get(), &IGattCharacteristic::add_ValueChanged,
+      base::BindRepeating(
+          &BluetoothRemoteGattCharacteristicWinrt::OnValueChanged,
+          weak_ptr_factory_.GetWeakPtr()));
+
+  if (!value_changed_token_) {
+    VLOG(2) << "Adding Value Changed Handler failed.";
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  WriteCccDescriptor(
+      (GetProperties() & PROPERTY_NOTIFY)
+          ? GattClientCharacteristicConfigurationDescriptorValue_Notify
+          : GattClientCharacteristicConfigurationDescriptorValue_Indicate,
+      callback, error_callback);
 }
 
 void BluetoothRemoteGattCharacteristicWinrt::UnsubscribeFromNotifications(
     BluetoothRemoteGattDescriptor* ccc_descriptor,
     const base::Closure& callback,
     const ErrorCallback& error_callback) {
-  NOTIMPLEMENTED();
+  WriteCccDescriptor(
+      GattClientCharacteristicConfigurationDescriptorValue_None,
+      // Wrap the success and error callbacks in a lambda, so that we can notify
+      // callers whether removing the event handler succeeded after the
+      // descriptor has been written to.
+      base::BindOnce(
+          [](base::WeakPtr<BluetoothRemoteGattCharacteristicWinrt>
+                 characteristic,
+             base::OnceClosure callback, ErrorCallback error_callback) {
+            if (characteristic &&
+                !characteristic->RemoveValueChangedHandler()) {
+              error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
+              return;
+            }
+
+            std::move(callback).Run();
+          },
+          weak_ptr_factory_.GetWeakPtr(), callback, error_callback),
+      error_callback);
 }
 
 BluetoothRemoteGattCharacteristicWinrt::PendingReadCallbacks::
@@ -345,12 +430,67 @@
       characteristic_(std::move(characteristic)),
       uuid_(std::move(uuid)),
       properties_(properties),
+      attribute_handle_(attribute_handle),
       identifier_(base::StringPrintf("%s/%s_%04x",
                                      service_->GetIdentifier().c_str(),
                                      uuid_.value().c_str(),
-                                     attribute_handle)),
+                                     attribute_handle_)),
       weak_ptr_factory_(this) {}
 
+void BluetoothRemoteGattCharacteristicWinrt::WriteCccDescriptor(
+    GattClientCharacteristicConfigurationDescriptorValue value,
+    base::OnceClosure callback,
+    const ErrorCallback& error_callback) {
+  DCHECK(!pending_notification_callbacks_);
+  ComPtr<IGattCharacteristic3> characteristic_3;
+  HRESULT hr = characteristic_.As(&characteristic_3);
+  if (FAILED(hr)) {
+    VLOG(2) << "As IGattCharacteristic3 failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  ComPtr<IAsyncOperation<GattWriteResult*>> write_ccc_descriptor_op;
+  hr = characteristic_3
+           ->WriteClientCharacteristicConfigurationDescriptorWithResultAsync(
+               value, &write_ccc_descriptor_op);
+  if (FAILED(hr)) {
+    VLOG(2) << "GattCharacteristic::"
+               "WriteClientCharacteristicConfigurationDescriptorWithResultAsync"
+               " failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  hr = PostAsyncResults(
+      std::move(write_ccc_descriptor_op),
+      base::BindOnce(
+          &BluetoothRemoteGattCharacteristicWinrt::OnWriteCccDescriptor,
+          weak_ptr_factory_.GetWeakPtr()));
+
+  if (FAILED(hr)) {
+    VLOG(2) << "PostAsyncResults failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  pending_notification_callbacks_ =
+      std::make_unique<PendingNotificationCallbacks>(std::move(callback),
+                                                     error_callback);
+}
+
 void BluetoothRemoteGattCharacteristicWinrt::OnReadValue(
     ComPtr<IGattReadResult> read_result) {
   DCHECK(pending_read_callbacks_);
@@ -416,14 +556,21 @@
 
 void BluetoothRemoteGattCharacteristicWinrt::OnWriteValueWithResultAndOption(
     ComPtr<IGattWriteResult> write_result) {
-  if (!pending_write_callbacks_)
-    return;
+  DCHECK(pending_write_callbacks_);
+  OnWriteImpl(std::move(write_result), std::move(pending_write_callbacks_));
+}
 
-  auto pending_write_callbacks = std::move(pending_write_callbacks_);
+void BluetoothRemoteGattCharacteristicWinrt::OnWriteCccDescriptor(
+    ComPtr<IGattWriteResult> write_result) {
+  OnWriteImpl(std::move(write_result),
+              std::move(pending_notification_callbacks_));
+}
 
+void BluetoothRemoteGattCharacteristicWinrt::OnWriteImpl(
+    ComPtr<IGattWriteResult> write_result,
+    std::unique_ptr<PendingWriteCallbacks> callbacks) {
   if (!write_result) {
-    pending_write_callbacks->error_callback.Run(
-        BluetoothGattService::GATT_ERROR_FAILED);
+    callbacks->error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
     return;
   }
 
@@ -432,19 +579,55 @@
   if (FAILED(hr)) {
     VLOG(2) << "Getting GATT Communication Status failed: "
             << logging::SystemErrorCodeToString(hr);
-    pending_write_callbacks->error_callback.Run(
-        BluetoothGattService::GATT_ERROR_FAILED);
+    callbacks->error_callback.Run(BluetoothGattService::GATT_ERROR_FAILED);
     return;
   }
 
   if (status != GattCommunicationStatus_Success) {
     VLOG(2) << "Unexpected GattCommunicationStatus: " << status;
-    pending_write_callbacks->error_callback.Run(
+    callbacks->error_callback.Run(
         BluetoothRemoteGattServiceWinrt::GetGattErrorCode(write_result.Get()));
     return;
   }
 
-  std::move(pending_write_callbacks->callback).Run();
+  std::move(callbacks->callback).Run();
+}
+
+void BluetoothRemoteGattCharacteristicWinrt::OnValueChanged(
+    IGattCharacteristic* characteristic,
+    IGattValueChangedEventArgs* event_args) {
+  ComPtr<IBuffer> value;
+  HRESULT hr = event_args->get_CharacteristicValue(&value);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting Characteristic Value failed: "
+            << logging::SystemErrorCodeToString(hr);
+    return;
+  }
+
+  uint8_t* data = nullptr;
+  uint32_t length = 0;
+  hr = base::win::GetPointerToBufferData(value.Get(), &data, &length);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting Pointer To Buffer Data failed: "
+            << logging::SystemErrorCodeToString(hr);
+    return;
+  }
+
+  value_.assign(data, data + length);
+  service_->GetDevice()->GetAdapter()->NotifyGattCharacteristicValueChanged(
+      this, value_);
+}
+
+bool BluetoothRemoteGattCharacteristicWinrt::RemoveValueChangedHandler() {
+  DCHECK(value_changed_token_);
+  HRESULT hr = characteristic_->remove_ValueChanged(*value_changed_token_);
+  if (FAILED(hr)) {
+    VLOG(2) << "Removing the Value Changed Handler failed: "
+            << logging::SystemErrorCodeToString(hr);
+  }
+
+  value_changed_token_.reset();
+  return SUCCEEDED(hr);
 }
 
 }  // namespace device
diff --git a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h
index a9e02e3..30e242a 100644
--- a/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h
+++ b/device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h
@@ -23,6 +23,7 @@
 namespace device {
 
 class BluetoothRemoteGattDescriptor;
+class BluetoothGattDiscovererWinrt;
 class BluetoothRemoteGattService;
 
 class DEVICE_BLUETOOTH_EXPORT BluetoothRemoteGattCharacteristicWinrt
@@ -51,6 +52,8 @@
                                  const ErrorCallback& error_callback) override;
   bool WriteWithoutResponse(base::span<const uint8_t> value) override;
 
+  void UpdateDescriptors(BluetoothGattDiscovererWinrt* gatt_discoverer);
+
   ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
       IGattCharacteristic*
       GetCharacteristicForTesting();
@@ -83,6 +86,8 @@
     ErrorCallback error_callback;
   };
 
+  using PendingNotificationCallbacks = PendingWriteCallbacks;
+
   BluetoothRemoteGattCharacteristicWinrt(
       BluetoothRemoteGattService* service,
       Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
@@ -92,6 +97,12 @@
       Properties proporties,
       uint16_t attribute_handle);
 
+  void WriteCccDescriptor(
+      ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+          GattClientCharacteristicConfigurationDescriptorValue value,
+      base::OnceClosure callback,
+      const ErrorCallback& error_callback);
+
   void OnReadValue(Microsoft::WRL::ComPtr<
                    ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
                        IGattReadResult> read_result);
@@ -101,16 +112,38 @@
                                  GenericAttributeProfile::IGattWriteResult>
           write_result);
 
+  void OnWriteCccDescriptor(
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattWriteResult>
+          write_result);
+
+  void OnWriteImpl(
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattWriteResult>
+          write_result,
+      std::unique_ptr<PendingWriteCallbacks> callbacks);
+
+  void OnValueChanged(
+      ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+          IGattCharacteristic* characteristic,
+      ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+          IGattValueChangedEventArgs* event_args);
+
+  bool RemoveValueChangedHandler();
+
   BluetoothRemoteGattService* service_;
   Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
                              GenericAttributeProfile::IGattCharacteristic>
       characteristic_;
   BluetoothUUID uuid_;
   Properties properties_;
+  uint16_t attribute_handle_;
   std::string identifier_;
   std::vector<uint8_t> value_;
   std::unique_ptr<PendingReadCallbacks> pending_read_callbacks_;
   std::unique_ptr<PendingWriteCallbacks> pending_write_callbacks_;
+  std::unique_ptr<PendingNotificationCallbacks> pending_notification_callbacks_;
+  base::Optional<EventRegistrationToken> value_changed_token_;
 
   base::WeakPtrFactory<BluetoothRemoteGattCharacteristicWinrt>
       weak_ptr_factory_;
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_unittest.cc b/device/bluetooth/bluetooth_remote_gatt_descriptor_unittest.cc
index 9ef4cfcf..3c3e5d0 100644
--- a/device/bluetooth/bluetooth_remote_gatt_descriptor_unittest.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_unittest.cc
@@ -22,7 +22,12 @@
 
 namespace device {
 
-class BluetoothRemoteGattDescriptorTest : public BluetoothTest {
+class BluetoothRemoteGattDescriptorTest :
+#if defined(OS_WIN)
+    public BluetoothTestWinrt {
+#else
+    public BluetoothTest {
+#endif
  public:
   // Creates adapter_, device_, service_, characteristic_,
   // descriptor1_, & descriptor2_.
@@ -40,12 +45,14 @@
     ASSERT_EQ(1u, device_->GetGattServices().size());
     service_ = device_->GetGattServices()[0];
     SimulateGattCharacteristic(service_, kTestUUIDDeviceName, 0);
+    base::RunLoop().RunUntilIdle();
     ASSERT_EQ(1u, service_->GetCharacteristics().size());
     characteristic_ = service_->GetCharacteristics()[0];
     SimulateGattDescriptor(characteristic_,
                            kTestUUIDCharacteristicUserDescription);
     SimulateGattDescriptor(characteristic_,
                            kTestUUIDClientCharacteristicConfiguration);
+    base::RunLoop().RunUntilIdle();
     ASSERT_EQ(2u, characteristic_->GetDescriptors().size());
     descriptor1_ = characteristic_->GetDescriptors()[0];
     descriptor2_ = characteristic_->GetDescriptors()[1];
@@ -59,12 +66,21 @@
   BluetoothRemoteGattDescriptor* descriptor2_ = nullptr;
 };
 
+#if defined(OS_WIN)
+using BluetoothRemoteGattDescriptorTestWinrtOnly =
+    BluetoothRemoteGattDescriptorTest;
+#endif
+
 #if defined(OS_ANDROID) || defined(OS_MACOSX)
 #define MAYBE_GetIdentifier GetIdentifier
 #else
 #define MAYBE_GetIdentifier DISABLED_GetIdentifier
 #endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, GetIdentifier) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_GetIdentifier) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -102,6 +118,7 @@
   SimulateGattCharacteristic(service2, kTestUUIDDeviceName, /* properties */ 0);
   SimulateGattCharacteristic(service3, kTestUUIDDeviceName, /* properties */ 0);
   SimulateGattCharacteristic(service3, kTestUUIDDeviceName, /* properties */ 0);
+  base::RunLoop().RunUntilIdle();
   BluetoothRemoteGattCharacteristic* char1 = service1->GetCharacteristics()[0];
   BluetoothRemoteGattCharacteristic* char2 = service1->GetCharacteristics()[1];
   BluetoothRemoteGattCharacteristic* char3 = service2->GetCharacteristics()[0];
@@ -117,6 +134,7 @@
   SimulateGattDescriptor(char4, kTestUUIDCharacteristicUserDescription);
   SimulateGattDescriptor(char5, kTestUUIDCharacteristicUserDescription);
   SimulateGattDescriptor(char6, kTestUUIDCharacteristicUserDescription);
+  base::RunLoop().RunUntilIdle();
   BluetoothRemoteGattDescriptor* desc1 = char1->GetDescriptors()[0];
   BluetoothRemoteGattDescriptor* desc2 = char2->GetDescriptors()[0];
   BluetoothRemoteGattDescriptor* desc3 = char3->GetDescriptors()[0];
@@ -151,7 +169,11 @@
 #else
 #define MAYBE_GetUUID DISABLED_GetUUID
 #endif
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, GetUUID) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_GetUUID) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -170,6 +192,7 @@
 
   SimulateGattCharacteristic(service, kTestUUIDDeviceName,
                              /* properties */ 0);
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(1u, service->GetCharacteristics().size());
   BluetoothRemoteGattCharacteristic* characteristic =
       service->GetCharacteristics()[0];
@@ -181,6 +204,7 @@
                          kTestUUIDCharacteristicUserDescription);
   SimulateGattDescriptor(characteristic,
                          kTestUUIDClientCharacteristicConfiguration);
+  base::RunLoop().RunUntilIdle();
   ASSERT_EQ(2u, characteristic->GetDescriptors().size());
   BluetoothRemoteGattDescriptor* descriptor1 =
       characteristic->GetDescriptors()[0];
@@ -201,7 +225,11 @@
 #define MAYBE_ReadRemoteDescriptor_Empty DISABLED_ReadRemoteDescriptor_Empty
 #endif
 // Tests ReadRemoteDescriptor and GetValue with empty value buffer.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, ReadRemoteDescriptor_Empty) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_ReadRemoteDescriptor_Empty) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -229,7 +257,12 @@
 #define MAYBE_WriteRemoteDescriptor_Empty DISABLED_WriteRemoteDescriptor_Empty
 #endif
 // Tests WriteRemoteDescriptor with empty value buffer.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       WriteRemoteDescriptor_Empty) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_WriteRemoteDescriptor_Empty) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -318,7 +351,11 @@
 #define MAYBE_ReadRemoteDescriptor DISABLED_ReadRemoteDescriptor
 #endif
 // Tests ReadRemoteDescriptor and GetValue with non-empty value buffer.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, ReadRemoteDescriptor) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_ReadRemoteDescriptor) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -349,7 +386,11 @@
 #define MAYBE_WriteRemoteDescriptor DISABLED_WriteRemoteDescriptor
 #endif
 // Tests WriteRemoteDescriptor with non-empty value buffer.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, WriteRemoteDescriptor) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_WriteRemoteDescriptor) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -374,7 +415,11 @@
 #define MAYBE_ReadRemoteDescriptor_Twice DISABLED_ReadRemoteDescriptor_Twice
 #endif
 // Tests ReadRemoteDescriptor and GetValue multiple times.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, ReadRemoteDescriptor_Twice) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_ReadRemoteDescriptor_Twice) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -414,7 +459,12 @@
 #define MAYBE_WriteRemoteDescriptor_Twice DISABLED_WriteRemoteDescriptor_Twice
 #endif
 // Tests WriteRemoteDescriptor multiple times.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       WriteRemoteDescriptor_Twice) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_WriteRemoteDescriptor_Twice) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -454,8 +504,13 @@
   DISABLED_ReadRemoteDescriptor_MultipleDescriptors
 #endif
 // Tests ReadRemoteDescriptor on two descriptors.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       ReadRemoteDescriptor_MultipleDescriptors) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest,
        MAYBE_ReadRemoteDescriptor_MultipleDescriptors) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -496,8 +551,13 @@
   DISABLED_WriteRemoteDescriptor_MultipleDescriptors
 #endif
 // Tests WriteRemoteDescriptor on two descriptors.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       WriteRemoteDescriptor_MultipleDescriptors) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest,
        MAYBE_WriteRemoteDescriptor_MultipleDescriptors) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -534,7 +594,11 @@
 #define MAYBE_ReadError DISABLED_ReadError
 #endif
 // Tests ReadRemoteDescriptor asynchronous error.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, ReadError) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_ReadError) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -558,7 +622,11 @@
 #define MAYBE_WriteError DISABLED_WriteError
 #endif
 // Tests WriteRemoteDescriptor asynchronous error.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly, WriteError) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest, MAYBE_WriteError) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -661,8 +729,13 @@
   DISABLED_ReadRemoteDescriptor_ReadPending
 #endif
 // Tests ReadRemoteDescriptor error with a pending read operation.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       ReadRemoteDescriptor_ReadPending) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest,
        MAYBE_ReadRemoteDescriptor_ReadPending) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -698,8 +771,13 @@
   DISABLED_WriteRemoteDescriptor_WritePending
 #endif
 // Tests WriteRemoteDescriptor error with a pending write operation.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       WriteRemoteDescriptor_WritePending) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest,
        MAYBE_WriteRemoteDescriptor_WritePending) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -736,8 +814,13 @@
   DISABLED_ReadRemoteDescriptor_WritePending
 #endif
 // Tests ReadRemoteDescriptor error with a pending write operation.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       ReadRemoteDescriptor_WritePending) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest,
        MAYBE_ReadRemoteDescriptor_WritePending) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -773,8 +856,13 @@
   DISABLED_WriteRemoteDescriptor_ReadPending
 #endif
 // Tests WriteRemoteDescriptor error with a pending Read operation.
+#if defined(OS_WIN)
+TEST_P(BluetoothRemoteGattDescriptorTestWinrtOnly,
+       WriteRemoteDescriptor_ReadPending) {
+#else
 TEST_F(BluetoothRemoteGattDescriptorTest,
        MAYBE_WriteRemoteDescriptor_ReadPending) {
+#endif
   if (!PlatformSupportsLowEnergy()) {
     LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test.";
     return;
@@ -904,4 +992,11 @@
 }
 #endif  // defined(OS_MACOSX)
 
+#if defined(OS_WIN)
+INSTANTIATE_TEST_CASE_P(
+    /* no prefix */,
+    BluetoothRemoteGattDescriptorTestWinrtOnly,
+    ::testing::Values(true));
+#endif  // defined(OS_WIN)
+
 }  // namespace device
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc
index 049a71aa..3c7b806f 100644
--- a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.cc
@@ -4,25 +4,78 @@
 
 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h"
 
+#include <utility>
+
 #include "base/logging.h"
-#include "device/bluetooth/bluetooth_uuid.h"
+#include "base/memory/ptr_util.h"
+#include "base/strings/stringprintf.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "base/win/winrt_storage_util.h"
+#include "device/bluetooth/bluetooth_remote_gatt_service_winrt.h"
+#include "device/bluetooth/event_utils_winrt.h"
 
 namespace device {
 
-BluetoothRemoteGattDescriptorWinrt::BluetoothRemoteGattDescriptorWinrt() =
-    default;
+namespace {
+
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattCommunicationStatus;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattCommunicationStatus_Success;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::GattReadResult;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattWriteResult;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattDescriptor2;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattDescriptor;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattReadResult2;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattReadResult;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattWriteResult;
+using ABI::Windows::Foundation::IAsyncOperation;
+using ABI::Windows::Storage::Streams::IBuffer;
+using Microsoft::WRL::ComPtr;
+
+}  // namespace
+
+// static
+std::unique_ptr<BluetoothRemoteGattDescriptorWinrt>
+BluetoothRemoteGattDescriptorWinrt::Create(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    ComPtr<IGattDescriptor> descriptor) {
+  DCHECK(descriptor);
+  GUID guid;
+  HRESULT hr = descriptor->get_Uuid(&guid);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting UUID failed: " << logging::SystemErrorCodeToString(hr);
+    return nullptr;
+  }
+
+  uint16_t attribute_handle;
+  hr = descriptor->get_AttributeHandle(&attribute_handle);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting AttributeHandle failed: "
+            << logging::SystemErrorCodeToString(hr);
+    return nullptr;
+  }
+
+  return base::WrapUnique(new BluetoothRemoteGattDescriptorWinrt(
+      characteristic, std::move(descriptor), BluetoothUUID(guid),
+      attribute_handle));
+}
 
 BluetoothRemoteGattDescriptorWinrt::~BluetoothRemoteGattDescriptorWinrt() =
     default;
 
 std::string BluetoothRemoteGattDescriptorWinrt::GetIdentifier() const {
-  NOTIMPLEMENTED();
-  return std::string();
+  return identifier_;
 }
 
 BluetoothUUID BluetoothRemoteGattDescriptorWinrt::GetUUID() const {
-  NOTIMPLEMENTED();
-  return BluetoothUUID();
+  return uuid_;
 }
 
 BluetoothGattCharacteristic::Permissions
@@ -38,21 +91,249 @@
 
 BluetoothRemoteGattCharacteristic*
 BluetoothRemoteGattDescriptorWinrt::GetCharacteristic() const {
-  NOTIMPLEMENTED();
-  return nullptr;
+  return characteristic_;
 }
 
 void BluetoothRemoteGattDescriptorWinrt::ReadRemoteDescriptor(
     const ValueCallback& callback,
     const ErrorCallback& error_callback) {
-  NOTIMPLEMENTED();
+  if (pending_read_callbacks_ || pending_write_callbacks_) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_IN_PROGRESS));
+    return;
+  }
+
+  ComPtr<IAsyncOperation<GattReadResult*>> read_value_op;
+  HRESULT hr = descriptor_->ReadValueAsync(&read_value_op);
+  if (FAILED(hr)) {
+    VLOG(2) << "GattDescriptor::ReadValueAsync failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  hr = PostAsyncResults(
+      std::move(read_value_op),
+      base::BindOnce(&BluetoothRemoteGattDescriptorWinrt::OnReadValue,
+                     weak_ptr_factory_.GetWeakPtr()));
+
+  if (FAILED(hr)) {
+    VLOG(2) << "PostAsyncResults failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  pending_read_callbacks_ =
+      std::make_unique<PendingReadCallbacks>(callback, error_callback);
 }
 
 void BluetoothRemoteGattDescriptorWinrt::WriteRemoteDescriptor(
     const std::vector<uint8_t>& value,
     const base::Closure& callback,
     const ErrorCallback& error_callback) {
-  NOTIMPLEMENTED();
+  if (pending_read_callbacks_ || pending_write_callbacks_) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_IN_PROGRESS));
+    return;
+  }
+
+  ComPtr<IGattDescriptor2> descriptor_2;
+  HRESULT hr = descriptor_.As(&descriptor_2);
+  if (FAILED(hr)) {
+    VLOG(2) << "As IGattDescriptor2 failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  ComPtr<IBuffer> buffer;
+  hr = base::win::CreateIBufferFromData(value.data(), value.size(), &buffer);
+  if (FAILED(hr)) {
+    VLOG(2) << "base::win::CreateIBufferFromData failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  ComPtr<IAsyncOperation<GattWriteResult*>> write_value_op;
+  hr = descriptor_2->WriteValueWithResultAsync(buffer.Get(), &write_value_op);
+  if (FAILED(hr)) {
+    VLOG(2) << "GattDescriptor::WriteValueWithResultAsync failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  hr = PostAsyncResults(
+      std::move(write_value_op),
+      base::BindOnce(
+          &BluetoothRemoteGattDescriptorWinrt::OnWriteValueWithResult,
+          weak_ptr_factory_.GetWeakPtr()));
+
+  if (FAILED(hr)) {
+    VLOG(2) << "PostAsyncResults failed: "
+            << logging::SystemErrorCodeToString(hr);
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE,
+        base::BindOnce(error_callback,
+                       BluetoothRemoteGattService::GATT_ERROR_FAILED));
+    return;
+  }
+
+  pending_write_callbacks_ =
+      std::make_unique<PendingWriteCallbacks>(callback, error_callback);
+}
+
+IGattDescriptor* BluetoothRemoteGattDescriptorWinrt::GetDescriptorForTesting() {
+  return descriptor_.Get();
+}
+
+BluetoothRemoteGattDescriptorWinrt::PendingReadCallbacks::PendingReadCallbacks(
+    ValueCallback callback,
+    ErrorCallback error_callback)
+    : callback(std::move(callback)),
+      error_callback(std::move(error_callback)) {}
+
+BluetoothRemoteGattDescriptorWinrt::PendingReadCallbacks::
+    ~PendingReadCallbacks() = default;
+
+BluetoothRemoteGattDescriptorWinrt::PendingWriteCallbacks::
+    PendingWriteCallbacks(base::OnceClosure callback,
+                          ErrorCallback error_callback)
+    : callback(std::move(callback)),
+      error_callback(std::move(error_callback)) {}
+
+BluetoothRemoteGattDescriptorWinrt::PendingWriteCallbacks::
+    ~PendingWriteCallbacks() = default;
+
+BluetoothRemoteGattDescriptorWinrt::BluetoothRemoteGattDescriptorWinrt(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                               GenericAttributeProfile::IGattDescriptor>
+        descriptor,
+    BluetoothUUID uuid,
+    uint16_t attribute_handle)
+    : characteristic_(characteristic),
+      descriptor_(std::move(descriptor)),
+      uuid_(std::move(uuid)),
+      identifier_(base::StringPrintf("%s/%s_%04x",
+                                     characteristic_->GetIdentifier().c_str(),
+                                     uuid_.value().c_str(),
+                                     attribute_handle)),
+      weak_ptr_factory_(this) {}
+
+void BluetoothRemoteGattDescriptorWinrt::OnReadValue(
+    ComPtr<IGattReadResult> read_result) {
+  DCHECK(pending_read_callbacks_);
+  auto pending_read_callbacks = std::move(pending_read_callbacks_);
+
+  if (!read_result) {
+    pending_read_callbacks->error_callback.Run(
+        BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  GattCommunicationStatus status;
+  HRESULT hr = read_result->get_Status(&status);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting GATT Communication Status failed: "
+            << logging::SystemErrorCodeToString(hr);
+    pending_read_callbacks->error_callback.Run(
+        BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  if (status != GattCommunicationStatus_Success) {
+    VLOG(2) << "Unexpected GattCommunicationStatus: " << status;
+    ComPtr<IGattReadResult2> read_result_2;
+    hr = read_result.As(&read_result_2);
+    if (FAILED(hr)) {
+      VLOG(2) << "As IGattReadResult2 failed: "
+              << logging::SystemErrorCodeToString(hr);
+      pending_read_callbacks->error_callback.Run(
+          BluetoothGattService::GATT_ERROR_FAILED);
+      return;
+    }
+
+    pending_read_callbacks->error_callback.Run(
+        BluetoothRemoteGattServiceWinrt::GetGattErrorCode(read_result_2.Get()));
+    return;
+  }
+
+  ComPtr<IBuffer> value;
+  hr = read_result->get_Value(&value);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting Descriptor Value failed: "
+            << logging::SystemErrorCodeToString(hr);
+    pending_read_callbacks->error_callback.Run(
+        BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  uint8_t* data = nullptr;
+  uint32_t length = 0;
+  hr = base::win::GetPointerToBufferData(value.Get(), &data, &length);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting Pointer To Buffer Data failed: "
+            << logging::SystemErrorCodeToString(hr);
+    pending_read_callbacks->error_callback.Run(
+        BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  value_.assign(data, data + length);
+  pending_read_callbacks->callback.Run(value_);
+}
+
+void BluetoothRemoteGattDescriptorWinrt::OnWriteValueWithResult(
+    ComPtr<IGattWriteResult> write_result) {
+  DCHECK(pending_write_callbacks_);
+  auto pending_write_callbacks = std::move(pending_write_callbacks_);
+
+  if (!write_result) {
+    pending_write_callbacks->error_callback.Run(
+        BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  GattCommunicationStatus status;
+  HRESULT hr = write_result->get_Status(&status);
+  if (FAILED(hr)) {
+    VLOG(2) << "Getting GATT Communication Status failed: "
+            << logging::SystemErrorCodeToString(hr);
+    pending_write_callbacks->error_callback.Run(
+        BluetoothGattService::GATT_ERROR_FAILED);
+    return;
+  }
+
+  if (status != GattCommunicationStatus_Success) {
+    VLOG(2) << "Unexpected GattCommunicationStatus: " << status;
+    pending_write_callbacks->error_callback.Run(
+        BluetoothRemoteGattServiceWinrt::GetGattErrorCode(write_result.Get()));
+    return;
+  }
+
+  std::move(pending_write_callbacks->callback).Run();
 }
 
 }  // namespace device
diff --git a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h
index 9e0fecb..1f3324b0 100644
--- a/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h
+++ b/device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h
@@ -5,25 +5,33 @@
 #ifndef DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_WINRT_H_
 #define DEVICE_BLUETOOTH_BLUETOOTH_REMOTE_GATT_DESCRIPTOR_WINRT_H_
 
+#include <windows.devices.bluetooth.genericattributeprofile.h>
+#include <wrl/client.h>
+
 #include <stdint.h>
 
+#include <memory>
 #include <string>
 #include <vector>
 
 #include "base/callback_forward.h"
 #include "base/macros.h"
+#include "base/memory/weak_ptr.h"
 #include "device/bluetooth/bluetooth_export.h"
 #include "device/bluetooth/bluetooth_remote_gatt_characteristic.h"
 #include "device/bluetooth/bluetooth_remote_gatt_descriptor.h"
+#include "device/bluetooth/bluetooth_uuid.h"
 
 namespace device {
 
-class BluetoothUUID;
-
 class DEVICE_BLUETOOTH_EXPORT BluetoothRemoteGattDescriptorWinrt
     : public BluetoothRemoteGattDescriptor {
  public:
-  BluetoothRemoteGattDescriptorWinrt();
+  static std::unique_ptr<BluetoothRemoteGattDescriptorWinrt> Create(
+      BluetoothRemoteGattCharacteristic* characteristic,
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattDescriptor>
+          descriptor);
   ~BluetoothRemoteGattDescriptorWinrt() override;
 
   // BluetoothGattDescriptor:
@@ -40,8 +48,56 @@
                              const base::Closure& callback,
                              const ErrorCallback& error_callback) override;
 
+  ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::IGattDescriptor*
+  GetDescriptorForTesting();
+
  private:
+  struct PendingReadCallbacks {
+    PendingReadCallbacks(ValueCallback callback, ErrorCallback error_callback);
+    ~PendingReadCallbacks();
+
+    ValueCallback callback;
+    ErrorCallback error_callback;
+  };
+
+  struct PendingWriteCallbacks {
+    PendingWriteCallbacks(base::OnceClosure callback,
+                          ErrorCallback error_callback);
+    ~PendingWriteCallbacks();
+
+    base::OnceClosure callback;
+    ErrorCallback error_callback;
+  };
+
+  BluetoothRemoteGattDescriptorWinrt(
+      BluetoothRemoteGattCharacteristic* characteristic,
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattDescriptor>
+          descriptor,
+      BluetoothUUID uuid,
+      uint16_t attribute_handle);
+
+  void OnReadValue(Microsoft::WRL::ComPtr<
+                   ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+                       IGattReadResult> read_result);
+
+  void OnWriteValueWithResult(
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattWriteResult>
+          write_result);
+
+  // Weak. This object is owned by |characteristic_|.
+  BluetoothRemoteGattCharacteristic* characteristic_;
+  Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                             GenericAttributeProfile::IGattDescriptor>
+      descriptor_;
+  BluetoothUUID uuid_;
+  std::string identifier_;
   std::vector<uint8_t> value_;
+  std::unique_ptr<PendingReadCallbacks> pending_read_callbacks_;
+  std::unique_ptr<PendingWriteCallbacks> pending_write_callbacks_;
+
+  base::WeakPtrFactory<BluetoothRemoteGattDescriptorWinrt> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(BluetoothRemoteGattDescriptorWinrt);
 };
diff --git a/device/bluetooth/bluetooth_remote_gatt_service_winrt.cc b/device/bluetooth/bluetooth_remote_gatt_service_winrt.cc
index 4b152288..0ee0e47e 100644
--- a/device/bluetooth/bluetooth_remote_gatt_service_winrt.cc
+++ b/device/bluetooth/bluetooth_remote_gatt_service_winrt.cc
@@ -91,10 +91,16 @@
 
     std::string identifier = characteristic->GetIdentifier();
     auto iter = characteristics_.find(identifier);
-    if (iter != characteristics_.end())
-      characteristics.emplace(std::move(*iter));
-    else
-      characteristics.emplace(std::move(identifier), std::move(characteristic));
+    if (iter != characteristics_.end()) {
+      iter = characteristics.emplace(std::move(*iter)).first;
+    } else {
+      iter = characteristics
+                 .emplace(std::move(identifier), std::move(characteristic))
+                 .first;
+    }
+
+    static_cast<BluetoothRemoteGattCharacteristicWinrt*>(iter->second.get())
+        ->UpdateDescriptors(gatt_discoverer);
   }
 
   std::swap(characteristics, characteristics_);
diff --git a/device/bluetooth/bluetooth_task_manager_win.cc b/device/bluetooth/bluetooth_task_manager_win.cc
index efa37aec..665c0637 100644
--- a/device/bluetooth/bluetooth_task_manager_win.cc
+++ b/device/bluetooth/bluetooth_task_manager_win.cc
@@ -17,7 +17,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "device/bluetooth/bluetooth_classic_win.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_init_win.h"
diff --git a/device/bluetooth/cast/bluetooth_adapter_cast.cc b/device/bluetooth/cast/bluetooth_adapter_cast.cc
index 31e549c..d0cb1d5 100644
--- a/device/bluetooth/cast/bluetooth_adapter_cast.cc
+++ b/device/bluetooth/cast/bluetooth_adapter_cast.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/location.h"
 #include "base/no_destructor.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "chromecast/device/bluetooth/bluetooth_util.h"
 #include "chromecast/device/bluetooth/le/gatt_client_manager.h"
diff --git a/device/bluetooth/dbus/fake_bluetooth_device_client.cc b/device/bluetooth/dbus/fake_bluetooth_device_client.cc
index 9ad8f8f..b8fd119 100644
--- a/device/bluetooth/dbus/fake_bluetooth_device_client.cc
+++ b/device/bluetooth/dbus/fake_bluetooth_device_client.cc
@@ -25,7 +25,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "device/bluetooth/bluez/bluetooth_service_attribute_value_bluez.h"
diff --git a/device/bluetooth/test/bluetooth_test_cast.cc b/device/bluetooth/test/bluetooth_test_cast.cc
index 03b2c62d..bbe9bc20 100644
--- a/device/bluetooth/test/bluetooth_test_cast.cc
+++ b/device/bluetooth/test/bluetooth_test_cast.cc
@@ -5,7 +5,7 @@
 #include "device/bluetooth/test/bluetooth_test_cast.h"
 
 #include "base/bind_helpers.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "chromecast/device/bluetooth/bluetooth_util.h"
 #include "chromecast/device/bluetooth/le/mock_gatt_client_manager.h"
 #include "chromecast/device/bluetooth/le/remote_device.h"
diff --git a/device/bluetooth/test/bluetooth_test_win.cc b/device/bluetooth/test/bluetooth_test_win.cc
index 37712d2..e34819d 100644
--- a/device/bluetooth/test/bluetooth_test_win.cc
+++ b/device/bluetooth/test/bluetooth_test_win.cc
@@ -33,6 +33,7 @@
 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_win.h"
 #include "device/bluetooth/bluetooth_remote_gatt_characteristic_winrt.h"
 #include "device/bluetooth/bluetooth_remote_gatt_descriptor_win.h"
+#include "device/bluetooth/bluetooth_remote_gatt_descriptor_winrt.h"
 #include "device/bluetooth/bluetooth_remote_gatt_service_win.h"
 #include "device/bluetooth/bluetooth_uuid.h"
 #include "device/bluetooth/test/fake_bluetooth_adapter_winrt.h"
@@ -40,6 +41,7 @@
 #include "device/bluetooth/test/fake_bluetooth_le_device_winrt.h"
 #include "device/bluetooth/test/fake_device_information_winrt.h"
 #include "device/bluetooth/test/fake_gatt_characteristic_winrt.h"
+#include "device/bluetooth/test/fake_gatt_descriptor_winrt.h"
 
 // Note: As UWP does not provide int specializations for IObservableVector and
 // VectorChangedEventHandler we need to supply our own. UUIDs were generated
@@ -760,6 +762,62 @@
   ble_device->SimulateGattCharacteristic(service, uuid, properties);
 }
 
+void BluetoothTestWinrt::SimulateGattNotifySessionStarted(
+    BluetoothRemoteGattCharacteristic* characteristic) {
+  if (!GetParam() || !PlatformSupportsLowEnergy())
+    return BluetoothTestWin::SimulateGattNotifySessionStarted(characteristic);
+
+  static_cast<FakeGattCharacteristicWinrt*>(
+      static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
+          ->GetCharacteristicForTesting())
+      ->SimulateGattNotifySessionStarted();
+}
+
+void BluetoothTestWinrt::SimulateGattNotifySessionStartError(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    BluetoothRemoteGattService::GattErrorCode error_code) {
+  if (!GetParam() || !PlatformSupportsLowEnergy()) {
+    return BluetoothTestWin::SimulateGattNotifySessionStartError(characteristic,
+                                                                 error_code);
+  }
+
+  static_cast<FakeGattCharacteristicWinrt*>(
+      static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
+          ->GetCharacteristicForTesting())
+      ->SimulateGattNotifySessionStartError(error_code);
+}
+
+void BluetoothTestWinrt::SimulateGattNotifySessionStopped(
+    BluetoothRemoteGattCharacteristic* characteristic) {
+  static_cast<FakeGattCharacteristicWinrt*>(
+      static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
+          ->GetCharacteristicForTesting())
+      ->SimulateGattNotifySessionStopped();
+}
+
+void BluetoothTestWinrt::SimulateGattNotifySessionStopError(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    BluetoothRemoteGattService::GattErrorCode error_code) {
+  static_cast<FakeGattCharacteristicWinrt*>(
+      static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
+          ->GetCharacteristicForTesting())
+      ->SimulateGattNotifySessionStopError(error_code);
+}
+
+void BluetoothTestWinrt::SimulateGattCharacteristicChanged(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    const std::vector<uint8_t>& value) {
+  if (!GetParam() || !PlatformSupportsLowEnergy()) {
+    return BluetoothTestWin::SimulateGattCharacteristicChanged(characteristic,
+                                                               value);
+  }
+
+  static_cast<FakeGattCharacteristicWinrt*>(
+      static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
+          ->GetCharacteristicForTesting())
+      ->SimulateGattCharacteristicChanged(value);
+}
+
 void BluetoothTestWinrt::SimulateGattCharacteristicRead(
     BluetoothRemoteGattCharacteristic* characteristic,
     const std::vector<uint8_t>& value) {
@@ -813,6 +871,54 @@
       ->SimulateGattCharacteristicWriteError(error_code);
 }
 
+void BluetoothTestWinrt::SimulateGattDescriptor(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    const std::string& uuid) {
+  if (!GetParam() || !PlatformSupportsLowEnergy())
+    return BluetoothTestWin::SimulateGattDescriptor(characteristic, uuid);
+
+  auto* const ble_device = static_cast<TestBluetoothDeviceWinrt*>(
+                               characteristic->GetService()->GetDevice())
+                               ->ble_device();
+  DCHECK(ble_device);
+  ble_device->SimulateGattDescriptor(characteristic, uuid);
+}
+
+void BluetoothTestWinrt::SimulateGattDescriptorRead(
+    BluetoothRemoteGattDescriptor* descriptor,
+    const std::vector<uint8_t>& value) {
+  static_cast<FakeGattDescriptorWinrt*>(
+      static_cast<BluetoothRemoteGattDescriptorWinrt*>(descriptor)
+          ->GetDescriptorForTesting())
+      ->SimulateGattDescriptorRead(value);
+}
+
+void BluetoothTestWinrt::SimulateGattDescriptorReadError(
+    BluetoothRemoteGattDescriptor* descriptor,
+    BluetoothRemoteGattService::GattErrorCode error_code) {
+  static_cast<FakeGattDescriptorWinrt*>(
+      static_cast<BluetoothRemoteGattDescriptorWinrt*>(descriptor)
+          ->GetDescriptorForTesting())
+      ->SimulateGattDescriptorReadError(error_code);
+}
+
+void BluetoothTestWinrt::SimulateGattDescriptorWrite(
+    BluetoothRemoteGattDescriptor* descriptor) {
+  static_cast<FakeGattDescriptorWinrt*>(
+      static_cast<BluetoothRemoteGattDescriptorWinrt*>(descriptor)
+          ->GetDescriptorForTesting())
+      ->SimulateGattDescriptorWrite();
+}
+
+void BluetoothTestWinrt::SimulateGattDescriptorWriteError(
+    BluetoothRemoteGattDescriptor* descriptor,
+    BluetoothRemoteGattService::GattErrorCode error_code) {
+  static_cast<FakeGattDescriptorWinrt*>(
+      static_cast<BluetoothRemoteGattDescriptorWinrt*>(descriptor)
+          ->GetDescriptorForTesting())
+      ->SimulateGattDescriptorWriteError(error_code);
+}
+
 void BluetoothTestWinrt::DeleteDevice(BluetoothDevice* device) {
   (!GetParam() || !PlatformSupportsLowEnergy())
       ? BluetoothTestWin::DeleteDevice(device)
@@ -838,4 +944,21 @@
   ++gatt_write_characteristic_attempts_;
 }
 
+void BluetoothTestWinrt::OnFakeBluetoothGattSetCharacteristicNotification(
+    NotifyValueState state) {
+  last_write_value_ = {static_cast<uint8_t>(state), 0};
+  ++gatt_notify_characteristic_attempts_;
+  ++gatt_write_descriptor_attempts_;
+}
+
+void BluetoothTestWinrt::OnFakeBluetoothDescriptorReadValue() {
+  ++gatt_read_descriptor_attempts_;
+}
+
+void BluetoothTestWinrt::OnFakeBluetoothDescriptorWriteValue(
+    std::vector<uint8_t> value) {
+  last_write_value_ = std::move(value);
+  ++gatt_write_descriptor_attempts_;
+}
+
 }  // namespace device
diff --git a/device/bluetooth/test/bluetooth_test_win.h b/device/bluetooth/test/bluetooth_test_win.h
index 82e325c..d536010 100644
--- a/device/bluetooth/test/bluetooth_test_win.h
+++ b/device/bluetooth/test/bluetooth_test_win.h
@@ -136,6 +136,19 @@
   void SimulateGattCharacteristic(BluetoothRemoteGattService* service,
                                   const std::string& uuid,
                                   int properties) override;
+  void SimulateGattNotifySessionStarted(
+      BluetoothRemoteGattCharacteristic* characteristic) override;
+  void SimulateGattNotifySessionStartError(
+      BluetoothRemoteGattCharacteristic* characteristic,
+      BluetoothRemoteGattService::GattErrorCode error_code) override;
+  void SimulateGattNotifySessionStopped(
+      BluetoothRemoteGattCharacteristic* characteristic) override;
+  void SimulateGattNotifySessionStopError(
+      BluetoothRemoteGattCharacteristic* characteristic,
+      BluetoothRemoteGattService::GattErrorCode error_code) override;
+  void SimulateGattCharacteristicChanged(
+      BluetoothRemoteGattCharacteristic* characteristic,
+      const std::vector<uint8_t>& value) override;
   void SimulateGattCharacteristicRead(
       BluetoothRemoteGattCharacteristic* characteristic,
       const std::vector<uint8_t>& value) override;
@@ -147,12 +160,27 @@
   void SimulateGattCharacteristicWriteError(
       BluetoothRemoteGattCharacteristic* characteristic,
       BluetoothRemoteGattService::GattErrorCode error_code) override;
+  void SimulateGattDescriptor(BluetoothRemoteGattCharacteristic* characteristic,
+                              const std::string& uuid) override;
+  void SimulateGattDescriptorRead(BluetoothRemoteGattDescriptor* descriptor,
+                                  const std::vector<uint8_t>& value) override;
+  void SimulateGattDescriptorReadError(
+      BluetoothRemoteGattDescriptor* descriptor,
+      BluetoothRemoteGattService::GattErrorCode error_code) override;
+  void SimulateGattDescriptorWrite(
+      BluetoothRemoteGattDescriptor* descriptor) override;
+  void SimulateGattDescriptorWriteError(
+      BluetoothRemoteGattDescriptor* descriptor,
+      BluetoothRemoteGattService::GattErrorCode error_code) override;
   void DeleteDevice(BluetoothDevice* device) override;
 
   void OnFakeBluetoothDeviceConnectGattCalled();
   void OnFakeBluetoothGattDisconnect();
   void OnFakeBluetoothCharacteristicReadValue();
   void OnFakeBluetoothCharacteristicWriteValue(std::vector<uint8_t> value);
+  void OnFakeBluetoothGattSetCharacteristicNotification(NotifyValueState state);
+  void OnFakeBluetoothDescriptorReadValue();
+  void OnFakeBluetoothDescriptorWriteValue(std::vector<uint8_t> value);
 
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
diff --git a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
index 0c983f7..89b1367d 100644
--- a/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
+++ b/device/bluetooth/test/fake_bluetooth_le_device_winrt.cc
@@ -15,6 +15,7 @@
 #include "base/win/async_operation.h"
 #include "device/bluetooth/bluetooth_remote_gatt_service_winrt.h"
 #include "device/bluetooth/test/bluetooth_test_win.h"
+#include "device/bluetooth/test/fake_gatt_characteristic_winrt.h"
 #include "device/bluetooth/test/fake_gatt_device_service_winrt.h"
 #include "device/bluetooth/test/fake_gatt_device_services_result_winrt.h"
 
@@ -198,8 +199,11 @@
 void FakeBluetoothLEDeviceWinrt::SimulateGattServicesDiscovered(
     const std::vector<std::string>& uuids) {
   for (const auto& uuid : uuids) {
+    // Attribute handles need to be unique for a given BLE device. Increasing by
+    // a large number ensures enough address space for the contained
+    // characteristics and descriptors.
     fake_services_.push_back(Make<FakeGattDeviceServiceWinrt>(
-        bluetooth_test_winrt_, uuid, service_attribute_handle_++));
+        bluetooth_test_winrt_, uuid, service_attribute_handle_ += 0x0400));
   }
 
   DCHECK(gatt_services_callback_);
@@ -241,6 +245,23 @@
       .Run(Make<FakeGattDeviceServicesResultWinrt>(fake_services_));
 }
 
+void FakeBluetoothLEDeviceWinrt::SimulateGattDescriptor(
+    BluetoothRemoteGattCharacteristic* characteristic,
+    const std::string& uuid) {
+  // Simulate the fake descriptor on the GATT service and trigger a GATT
+  // re-scan via GattServicesChanged().
+  auto* const fake_characteristic = static_cast<FakeGattCharacteristicWinrt*>(
+      static_cast<BluetoothRemoteGattCharacteristicWinrt*>(characteristic)
+          ->GetCharacteristicForTesting());
+  DCHECK(fake_characteristic);
+  fake_characteristic->SimulateGattDescriptor(uuid);
+
+  SimulateGattServicesChanged();
+  DCHECK(gatt_services_callback_);
+  std::move(gatt_services_callback_)
+      .Run(Make<FakeGattDeviceServicesResultWinrt>(fake_services_));
+}
+
 void FakeBluetoothLEDeviceWinrt::SimulateGattServicesChanged() {
   DCHECK(gatt_services_changed_handler_);
   gatt_services_changed_handler_->Invoke(this, nullptr);
diff --git a/device/bluetooth/test/fake_bluetooth_le_device_winrt.h b/device/bluetooth/test/fake_bluetooth_le_device_winrt.h
index 1f914e7..0b729fd 100644
--- a/device/bluetooth/test/fake_bluetooth_le_device_winrt.h
+++ b/device/bluetooth/test/fake_bluetooth_le_device_winrt.h
@@ -112,6 +112,8 @@
   void SimulateGattCharacteristic(BluetoothRemoteGattService* service,
                                   const std::string& uuid,
                                   int properties);
+  void SimulateGattDescriptor(BluetoothRemoteGattCharacteristic* characteristic,
+                              const std::string& uuid);
   void SimulateGattServicesDiscoveryError();
 
  private:
diff --git a/device/bluetooth/test/fake_central.cc b/device/bluetooth/test/fake_central.cc
index d8f09b7..6ce27c5 100644
--- a/device/bluetooth/test/fake_central.cc
+++ b/device/bluetooth/test/fake_central.cc
@@ -11,7 +11,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "device/bluetooth/bluetooth_discovery_filter.h"
 #include "device/bluetooth/bluetooth_discovery_session_outcome.h"
diff --git a/device/bluetooth/test/fake_gatt_characteristic_winrt.cc b/device/bluetooth/test/fake_gatt_characteristic_winrt.cc
index d65af4c0..75a7faf 100644
--- a/device/bluetooth/test/fake_gatt_characteristic_winrt.cc
+++ b/device/bluetooth/test/fake_gatt_characteristic_winrt.cc
@@ -13,7 +13,10 @@
 #include "base/win/winrt_storage_util.h"
 #include "device/bluetooth/bluetooth_uuid.h"
 #include "device/bluetooth/test/bluetooth_test_win.h"
+#include "device/bluetooth/test/fake_gatt_descriptor_winrt.h"
+#include "device/bluetooth/test/fake_gatt_descriptors_result_winrt.h"
 #include "device/bluetooth/test/fake_gatt_read_result_winrt.h"
+#include "device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.h"
 #include "device/bluetooth/test/fake_gatt_write_result_winrt.h"
 
 namespace device {
@@ -69,7 +72,8 @@
     : bluetooth_test_winrt_(bluetooth_test_winrt),
       properties_(static_cast<GattCharacteristicProperties>(properties)),
       uuid_(BluetoothUUID::GetCanonicalValueAsGUID(uuid)),
-      attribute_handle_(attribute_handle) {}
+      attribute_handle_(attribute_handle),
+      last_descriptor_attribute_handle_(attribute_handle) {}
 
 FakeGattCharacteristicWinrt::~FakeGattCharacteristicWinrt() = default;
 
@@ -163,17 +167,25 @@
     ITypedEventHandler<GattCharacteristic*, GattValueChangedEventArgs*>*
         value_changed_handler,
     EventRegistrationToken* value_changed_event_cookie) {
-  return E_NOTIMPL;
+  value_changed_handler_ = value_changed_handler;
+  return S_OK;
 }
 
 HRESULT FakeGattCharacteristicWinrt::remove_ValueChanged(
     EventRegistrationToken value_changed_event_cookie) {
-  return E_NOTIMPL;
+  value_changed_handler_.Reset();
+  return S_OK;
 }
 
 HRESULT FakeGattCharacteristicWinrt::GetDescriptorsAsync(
     IAsyncOperation<GattDescriptorsResult*>** operation) {
-  return E_NOTIMPL;
+  auto async_op = Make<base::win::AsyncOperation<GattDescriptorsResult*>>();
+  base::ThreadTaskRunnerHandle::Get()->PostTask(
+      FROM_HERE,
+      base::BindOnce(async_op->callback(),
+                     Make<FakeGattDescriptorsResultWinrt>(fake_descriptors_)));
+  *operation = async_op.Detach();
+  return S_OK;
 }
 
 HRESULT FakeGattCharacteristicWinrt::GetDescriptorsWithCacheModeAsync(
@@ -228,7 +240,13 @@
         GattClientCharacteristicConfigurationDescriptorValue
             client_characteristic_configuration_descriptor_value,
         IAsyncOperation<GattWriteResult*>** operation) {
-  return E_NOTIMPL;
+  bluetooth_test_winrt_->OnFakeBluetoothGattSetCharacteristicNotification(
+      static_cast<BluetoothTestBase::NotifyValueState>(
+          client_characteristic_configuration_descriptor_value));
+  auto async_op = Make<base::win::AsyncOperation<GattWriteResult*>>();
+  notify_session_callback_ = async_op->callback();
+  *operation = async_op.Detach();
+  return S_OK;
 }
 
 void FakeGattCharacteristicWinrt::SimulateGattCharacteristicRead(
@@ -258,4 +276,37 @@
   }
 }
 
+void FakeGattCharacteristicWinrt::SimulateGattDescriptor(
+    base::StringPiece uuid) {
+  fake_descriptors_.push_back(Make<FakeGattDescriptorWinrt>(
+      bluetooth_test_winrt_, uuid, ++last_descriptor_attribute_handle_));
+}
+
+void FakeGattCharacteristicWinrt::SimulateGattNotifySessionStarted() {
+  std::move(notify_session_callback_).Run(Make<FakeGattWriteResultWinrt>());
+}
+
+void FakeGattCharacteristicWinrt::SimulateGattNotifySessionStartError(
+    BluetoothGattService::GattErrorCode error_code) {
+  std::move(notify_session_callback_)
+      .Run(Make<FakeGattWriteResultWinrt>(error_code));
+}
+
+void FakeGattCharacteristicWinrt::SimulateGattNotifySessionStopped() {
+  std::move(notify_session_callback_).Run(Make<FakeGattWriteResultWinrt>());
+}
+
+void FakeGattCharacteristicWinrt::SimulateGattNotifySessionStopError(
+    BluetoothGattService::GattErrorCode error_code) {
+  std::move(notify_session_callback_)
+      .Run(Make<FakeGattWriteResultWinrt>(error_code));
+}
+
+void FakeGattCharacteristicWinrt::SimulateGattCharacteristicChanged(
+    const std::vector<uint8_t>& value) {
+  DCHECK(value_changed_handler_);
+  value_changed_handler_->Invoke(
+      this, Make<FakeGattValueChangedEventArgsWinrt>(value).Get());
+}
+
 }  // namespace device
diff --git a/device/bluetooth/test/fake_gatt_characteristic_winrt.h b/device/bluetooth/test/fake_gatt_characteristic_winrt.h
index 9d927e7..2c08f74 100644
--- a/device/bluetooth/test/fake_gatt_characteristic_winrt.h
+++ b/device/bluetooth/test/fake_gatt_characteristic_winrt.h
@@ -22,6 +22,7 @@
 namespace device {
 
 class BluetoothTestWinrt;
+class FakeGattDescriptorWinrt;
 
 class FakeGattCharacteristicWinrt
     : public Microsoft::WRL::RuntimeClass<
@@ -152,6 +153,14 @@
   void SimulateGattCharacteristicWrite();
   void SimulateGattCharacteristicWriteError(
       BluetoothGattService::GattErrorCode error_code);
+  void SimulateGattDescriptor(base::StringPiece uuid);
+  void SimulateGattNotifySessionStarted();
+  void SimulateGattNotifySessionStartError(
+      BluetoothGattService::GattErrorCode error_code);
+  void SimulateGattNotifySessionStopped();
+  void SimulateGattNotifySessionStopError(
+      BluetoothGattService::GattErrorCode error_code);
+  void SimulateGattCharacteristicChanged(const std::vector<uint8_t>& value);
 
  private:
   BluetoothTestWinrt* bluetooth_test_winrt_;
@@ -160,6 +169,13 @@
   GUID uuid_;
   uint16_t attribute_handle_;
 
+  Microsoft::WRL::ComPtr<ABI::Windows::Foundation::ITypedEventHandler<
+      ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+          GattCharacteristic*,
+      ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+          GattValueChangedEventArgs*>>
+      value_changed_handler_;
+
   base::OnceCallback<void(
       Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
                                  GenericAttributeProfile::IGattReadResult>)>
@@ -168,6 +184,14 @@
       Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
                                  GenericAttributeProfile::IGattWriteResult>)>
       write_value_callback_;
+  base::OnceCallback<void(
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattWriteResult>)>
+      notify_session_callback_;
+
+  std::vector<Microsoft::WRL::ComPtr<FakeGattDescriptorWinrt>>
+      fake_descriptors_;
+  uint16_t last_descriptor_attribute_handle_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeGattCharacteristicWinrt);
 };
diff --git a/device/bluetooth/test/fake_gatt_descriptor_winrt.cc b/device/bluetooth/test/fake_gatt_descriptor_winrt.cc
index 25e1223..b4a06a9 100644
--- a/device/bluetooth/test/fake_gatt_descriptor_winrt.cc
+++ b/device/bluetooth/test/fake_gatt_descriptor_winrt.cc
@@ -4,6 +4,16 @@
 
 #include "device/bluetooth/test/fake_gatt_descriptor_winrt.h"
 
+#include <utility>
+
+#include "base/strings/string_piece.h"
+#include "base/win/async_operation.h"
+#include "base/win/winrt_storage_util.h"
+#include "device/bluetooth/bluetooth_uuid.h"
+#include "device/bluetooth/test/bluetooth_test_win.h"
+#include "device/bluetooth/test/fake_gatt_read_result_winrt.h"
+#include "device/bluetooth/test/fake_gatt_write_result_winrt.h"
+
 namespace device {
 
 namespace {
@@ -18,10 +28,17 @@
     GattWriteResult;
 using ABI::Windows::Foundation::IAsyncOperation;
 using ABI::Windows::Storage::Streams::IBuffer;
+using Microsoft::WRL::Make;
 
 }  // namespace
 
-FakeGattDescriptorWinrt::FakeGattDescriptorWinrt() = default;
+FakeGattDescriptorWinrt::FakeGattDescriptorWinrt(
+    BluetoothTestWinrt* bluetooth_test_winrt,
+    base::StringPiece uuid,
+    uint16_t attribute_handle)
+    : bluetooth_test_winrt_(bluetooth_test_winrt),
+      uuid_(BluetoothUUID::GetCanonicalValueAsGUID(uuid)),
+      attribute_handle_(attribute_handle) {}
 
 FakeGattDescriptorWinrt::~FakeGattDescriptorWinrt() = default;
 
@@ -36,16 +53,23 @@
 }
 
 HRESULT FakeGattDescriptorWinrt::get_Uuid(GUID* value) {
-  return E_NOTIMPL;
+  *value = uuid_;
+  return S_OK;
 }
 
 HRESULT FakeGattDescriptorWinrt::get_AttributeHandle(uint16_t* value) {
-  return E_NOTIMPL;
+  *value = attribute_handle_;
+  return S_OK;
 }
 
 HRESULT FakeGattDescriptorWinrt::ReadValueAsync(
     IAsyncOperation<GattReadResult*>** value) {
-  return E_NOTIMPL;
+  auto async_op = Make<base::win::AsyncOperation<GattReadResult*>>();
+  DCHECK(!read_value_callback_);
+  read_value_callback_ = async_op->callback();
+  *value = async_op.Detach();
+  bluetooth_test_winrt_->OnFakeBluetoothDescriptorReadValue();
+  return S_OK;
 }
 
 HRESULT FakeGattDescriptorWinrt::ReadValueWithCacheModeAsync(
@@ -63,7 +87,43 @@
 HRESULT FakeGattDescriptorWinrt::WriteValueWithResultAsync(
     IBuffer* value,
     IAsyncOperation<GattWriteResult*>** operation) {
-  return E_NOTIMPL;
+  uint8_t* data;
+  uint32_t size;
+  base::win::GetPointerToBufferData(value, &data, &size);
+  bluetooth_test_winrt_->OnFakeBluetoothDescriptorWriteValue(
+      std::vector<uint8_t>(data, data + size));
+  auto async_op = Make<base::win::AsyncOperation<GattWriteResult*>>();
+  DCHECK(!write_value_callback_);
+  write_value_callback_ = async_op->callback();
+  *operation = async_op.Detach();
+  return S_OK;
+}
+
+void FakeGattDescriptorWinrt::SimulateGattDescriptorRead(
+    const std::vector<uint8_t>& data) {
+  if (read_value_callback_)
+    std::move(read_value_callback_).Run(Make<FakeGattReadResultWinrt>(data));
+}
+
+void FakeGattDescriptorWinrt::SimulateGattDescriptorReadError(
+    BluetoothGattService::GattErrorCode error_code) {
+  if (read_value_callback_) {
+    std::move(read_value_callback_)
+        .Run(Make<FakeGattReadResultWinrt>(error_code));
+  }
+}
+
+void FakeGattDescriptorWinrt::SimulateGattDescriptorWrite() {
+  if (write_value_callback_)
+    std::move(write_value_callback_).Run(Make<FakeGattWriteResultWinrt>());
+}
+
+void FakeGattDescriptorWinrt::SimulateGattDescriptorWriteError(
+    BluetoothGattService::GattErrorCode error_code) {
+  if (write_value_callback_) {
+    std::move(write_value_callback_)
+        .Run(Make<FakeGattWriteResultWinrt>(error_code));
+  }
 }
 
 }  // namespace device
diff --git a/device/bluetooth/test/fake_gatt_descriptor_winrt.h b/device/bluetooth/test/fake_gatt_descriptor_winrt.h
index 8cd7185b..6148a44 100644
--- a/device/bluetooth/test/fake_gatt_descriptor_winrt.h
+++ b/device/bluetooth/test/fake_gatt_descriptor_winrt.h
@@ -6,14 +6,22 @@
 #define DEVICE_BLUETOOTH_TEST_FAKE_GATT_DESCRIPTOR_WINRT_H_
 
 #include <windows.devices.bluetooth.genericattributeprofile.h>
+#include <wrl/client.h>
 #include <wrl/implements.h>
 
 #include <stdint.h>
 
+#include <vector>
+
+#include "base/callback.h"
 #include "base/macros.h"
+#include "base/strings/string_piece_forward.h"
+#include "device/bluetooth/bluetooth_gatt_service.h"
 
 namespace device {
 
+class BluetoothTestWinrt;
+
 class FakeGattDescriptorWinrt
     : public Microsoft::WRL::RuntimeClass<
           Microsoft::WRL::RuntimeClassFlags<
@@ -23,7 +31,9 @@
           ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
               IGattDescriptor2> {
  public:
-  FakeGattDescriptorWinrt();
+  FakeGattDescriptorWinrt(BluetoothTestWinrt* bluetooth_test_winrt,
+                          base::StringPiece uuid,
+                          uint16_t attribute_handle);
   ~FakeGattDescriptorWinrt() override;
 
   // IGattDescriptor:
@@ -57,7 +67,28 @@
           ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
               GattWriteResult*>** operation) override;
 
+  void SimulateGattDescriptorRead(const std::vector<uint8_t>& data);
+  void SimulateGattDescriptorReadError(
+      BluetoothGattService::GattErrorCode error_code);
+  void SimulateGattDescriptorWrite();
+  void SimulateGattDescriptorWriteError(
+      BluetoothGattService::GattErrorCode error_code);
+
  private:
+  BluetoothTestWinrt* bluetooth_test_winrt_;
+  GUID uuid_;
+  uint16_t attribute_handle_;
+
+  base::OnceCallback<void(
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattReadResult>)>
+      read_value_callback_;
+
+  base::OnceCallback<void(
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattWriteResult>)>
+      write_value_callback_;
+
   DISALLOW_COPY_AND_ASSIGN(FakeGattDescriptorWinrt);
 };
 
diff --git a/device/bluetooth/test/fake_gatt_descriptors_result_winrt.cc b/device/bluetooth/test/fake_gatt_descriptors_result_winrt.cc
index e8cbb0d5..65944968 100644
--- a/device/bluetooth/test/fake_gatt_descriptors_result_winrt.cc
+++ b/device/bluetooth/test/fake_gatt_descriptors_result_winrt.cc
@@ -4,25 +4,68 @@
 
 #include "device/bluetooth/test/fake_gatt_descriptors_result_winrt.h"
 
-namespace device {
+#include "base/win/vector.h"
+#include "device/bluetooth/test/fake_gatt_descriptor_winrt.h"
 
 namespace {
 
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
     GattCommunicationStatus;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    GattCommunicationStatus_Success;
 using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::GattDescriptor;
+using ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+    IGattDescriptor;
 using ABI::Windows::Foundation::Collections::IVectorView;
 using ABI::Windows::Foundation::IReference;
+using Microsoft::WRL::ComPtr;
+using Microsoft::WRL::Make;
 
 }  // namespace
 
-FakeGattDescriptorsResultWinrt::FakeGattDescriptorsResultWinrt() = default;
+// Note: As UWP does not provide GattDescriptor specializations for
+// IObservableVector, VectorChangedEventHandler and IVector we need to supply
+// our own. UUIDs were generated using `uuidgen`.
+namespace ABI {
+namespace Windows {
+namespace Foundation {
+namespace Collections {
+
+template <>
+struct __declspec(uuid("b259bb8d-2a87-44f6-9f9c-321cb98b7750"))
+    IObservableVector<GattDescriptor*>
+    : IObservableVector_impl<
+          Internal::AggregateType<GattDescriptor*, IGattDescriptor*>> {};
+
+template <>
+struct __declspec(uuid("39bc2e35-9a9a-4f93-ba00-7caaf965457e"))
+    VectorChangedEventHandler<GattDescriptor*>
+    : VectorChangedEventHandler_impl<
+          Internal::AggregateType<GattDescriptor*, IGattDescriptor*>> {};
+
+template <>
+struct __declspec(
+    uuid("1865abfa-a793-4b20-910c-f43e3fd12c3c")) IVector<GattDescriptor*>
+    : IVector_impl<Internal::AggregateType<GattDescriptor*, IGattDescriptor*>> {
+};
+
+}  // namespace Collections
+}  // namespace Foundation
+}  // namespace Windows
+}  // namespace ABI
+
+namespace device {
+
+FakeGattDescriptorsResultWinrt::FakeGattDescriptorsResultWinrt(
+    const std::vector<ComPtr<FakeGattDescriptorWinrt>>& fake_descriptors)
+    : descriptors_(fake_descriptors.begin(), fake_descriptors.end()) {}
 
 FakeGattDescriptorsResultWinrt::~FakeGattDescriptorsResultWinrt() = default;
 
 HRESULT FakeGattDescriptorsResultWinrt::get_Status(
     GattCommunicationStatus* value) {
-  return E_NOTIMPL;
+  *value = GattCommunicationStatus_Success;
+  return S_OK;
 }
 
 HRESULT FakeGattDescriptorsResultWinrt::get_ProtocolError(
@@ -32,7 +75,7 @@
 
 HRESULT FakeGattDescriptorsResultWinrt::get_Descriptors(
     IVectorView<GattDescriptor*>** value) {
-  return E_NOTIMPL;
+  return Make<base::win::Vector<GattDescriptor*>>(descriptors_)->GetView(value);
 }
 
 }  // namespace device
diff --git a/device/bluetooth/test/fake_gatt_descriptors_result_winrt.h b/device/bluetooth/test/fake_gatt_descriptors_result_winrt.h
index 0ec624ff..8c50b7d 100644
--- a/device/bluetooth/test/fake_gatt_descriptors_result_winrt.h
+++ b/device/bluetooth/test/fake_gatt_descriptors_result_winrt.h
@@ -8,14 +8,19 @@
 #include <windows.devices.bluetooth.genericattributeprofile.h>
 #include <windows.foundation.collections.h>
 #include <windows.foundation.h>
+#include <wrl/client.h>
 #include <wrl/implements.h>
 
 #include <stdint.h>
 
+#include <vector>
+
 #include "base/macros.h"
 
 namespace device {
 
+class FakeGattDescriptorWinrt;
+
 class FakeGattDescriptorsResultWinrt
     : public Microsoft::WRL::RuntimeClass<
           Microsoft::WRL::RuntimeClassFlags<
@@ -23,7 +28,9 @@
           ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
               IGattDescriptorsResult> {
  public:
-  FakeGattDescriptorsResultWinrt();
+  explicit FakeGattDescriptorsResultWinrt(
+      const std::vector<Microsoft::WRL::ComPtr<FakeGattDescriptorWinrt>>&
+          fake_descriptors);
   ~FakeGattDescriptorsResultWinrt() override;
 
   // IGattDescriptorsResult:
@@ -38,6 +45,11 @@
               GattDescriptor*>** value) override;
 
  private:
+  std::vector<
+      Microsoft::WRL::ComPtr<ABI::Windows::Devices::Bluetooth::
+                                 GenericAttributeProfile::IGattDescriptor>>
+      descriptors_;
+
   DISALLOW_COPY_AND_ASSIGN(FakeGattDescriptorsResultWinrt);
 };
 
diff --git a/device/bluetooth/test/fake_gatt_device_service_winrt.cc b/device/bluetooth/test/fake_gatt_device_service_winrt.cc
index f8c21fd..7a1d7ac 100644
--- a/device/bluetooth/test/fake_gatt_device_service_winrt.cc
+++ b/device/bluetooth/test/fake_gatt_device_service_winrt.cc
@@ -48,7 +48,8 @@
     uint16_t attribute_handle)
     : bluetooth_test_winrt_(bluetooth_test_winrt),
       uuid_(BluetoothUUID::GetCanonicalValueAsGUID(uuid)),
-      attribute_handle_(attribute_handle) {}
+      attribute_handle_(attribute_handle),
+      characteristic_attribute_handle_(attribute_handle_) {}
 
 FakeGattDeviceServiceWinrt::~FakeGattDeviceServiceWinrt() = default;
 
@@ -160,9 +161,13 @@
 void FakeGattDeviceServiceWinrt::SimulateGattCharacteristic(
     base::StringPiece uuid,
     int properties) {
-  fake_characteristics_.push_back(
-      Make<FakeGattCharacteristicWinrt>(bluetooth_test_winrt_, properties, uuid,
-                                        characteristic_attribute_handle_++));
+  // In order to ensure attribute handles are unique across the Gatt Server
+  // we reserve sufficient address space for descriptors for each
+  // characteristic. We allocate space for 32 descriptors, which should be
+  // enough for tests.
+  fake_characteristics_.push_back(Make<FakeGattCharacteristicWinrt>(
+      bluetooth_test_winrt_, properties, uuid,
+      characteristic_attribute_handle_ += 0x20));
 }
 
 }  // namespace device
diff --git a/device/bluetooth/test/fake_gatt_device_service_winrt.h b/device/bluetooth/test/fake_gatt_device_service_winrt.h
index f6b82dd..66dcb359 100644
--- a/device/bluetooth/test/fake_gatt_device_service_winrt.h
+++ b/device/bluetooth/test/fake_gatt_device_service_winrt.h
@@ -120,7 +120,7 @@
 
   std::vector<Microsoft::WRL::ComPtr<FakeGattCharacteristicWinrt>>
       fake_characteristics_;
-  uint16_t characteristic_attribute_handle_ = 0;
+  uint16_t characteristic_attribute_handle_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeGattDeviceServiceWinrt);
 };
diff --git a/device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.cc b/device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.cc
new file mode 100644
index 0000000..00ca8949
--- /dev/null
+++ b/device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.cc
@@ -0,0 +1,42 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.h"
+
+#include <wrl/client.h>
+
+#include <utility>
+
+#include "base/win/winrt_storage_util.h"
+
+namespace device {
+
+namespace {
+
+using ABI::Windows::Foundation::DateTime;
+using ABI::Windows::Storage::Streams::IBuffer;
+using Microsoft::WRL::ComPtr;
+
+}  // namespace
+
+FakeGattValueChangedEventArgsWinrt::FakeGattValueChangedEventArgsWinrt(
+    std::vector<uint8_t> value)
+    : value_(std::move(value)) {}
+
+FakeGattValueChangedEventArgsWinrt::~FakeGattValueChangedEventArgsWinrt() =
+    default;
+
+HRESULT
+FakeGattValueChangedEventArgsWinrt::get_CharacteristicValue(IBuffer** value) {
+  ComPtr<IBuffer> buffer;
+  HRESULT hr =
+      base::win::CreateIBufferFromData(value_.data(), value_.size(), &buffer);
+  return SUCCEEDED(hr) ? buffer.CopyTo(value) : hr;
+}
+
+HRESULT FakeGattValueChangedEventArgsWinrt::get_Timestamp(DateTime* timestamp) {
+  return E_NOTIMPL;
+}
+
+}  // namespace device
diff --git a/device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.h b/device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.h
new file mode 100644
index 0000000..b329133
--- /dev/null
+++ b/device/bluetooth/test/fake_gatt_value_changed_event_args_winrt.h
@@ -0,0 +1,43 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef DEVICE_BLUETOOTH_TEST_FAKE_GATT_VALUE_CHANGED_EVENT_ARGS_WINRT_H_
+#define DEVICE_BLUETOOTH_TEST_FAKE_GATT_VALUE_CHANGED_EVENT_ARGS_WINRT_H_
+
+#include <windows.devices.bluetooth.genericattributeprofile.h>
+#include <wrl/implements.h>
+
+#include <stdint.h>
+
+#include <vector>
+
+#include "base/macros.h"
+
+namespace device {
+
+class FakeGattValueChangedEventArgsWinrt
+    : public Microsoft::WRL::RuntimeClass<
+          Microsoft::WRL::RuntimeClassFlags<
+              Microsoft::WRL::WinRt | Microsoft::WRL::InhibitRoOriginateError>,
+          ABI::Windows::Devices::Bluetooth::GenericAttributeProfile::
+              IGattValueChangedEventArgs> {
+ public:
+  explicit FakeGattValueChangedEventArgsWinrt(std::vector<uint8_t> value);
+  ~FakeGattValueChangedEventArgsWinrt() override;
+
+  // IGattValueChangedEventArgs:
+  IFACEMETHODIMP get_CharacteristicValue(
+      ABI::Windows::Storage::Streams::IBuffer** value) override;
+  IFACEMETHODIMP get_Timestamp(
+      ABI::Windows::Foundation::DateTime* timestamp) override;
+
+ private:
+  std::vector<uint8_t> value_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeGattValueChangedEventArgsWinrt);
+};
+
+}  // namespace device
+
+#endif  // DEVICE_BLUETOOTH_TEST_FAKE_GATT_VALUE_CHANGED_EVENT_ARGS_WINRT_H_
diff --git a/device/fido/fido_test_data.h b/device/fido/fido_test_data.h
index b6fe2ac4..e36d0da2 100644
--- a/device/fido/fido_test_data.h
+++ b/device/fido/fido_test_data.h
@@ -1045,6 +1045,22 @@
     0x19, 0x04, 0xB0, 0x06, 0x81, 0x01,
 };
 
+// AuthenticatorGetInfo request with all configurations equal to that of
+// kTestAuthenticatorGetInfoResponse except clientPin option is set to true.
+constexpr uint8_t kTestGetInfoResponseWithClientPinSet[] = {
+    0x00, 0xA6, 0x01, 0x82, 0x68, 0x46, 0x49, 0x44, 0x4F, 0x5F, 0x32, 0x5F,
+    0x30, 0x66, 0x55, 0x32, 0x46, 0x5F, 0x56, 0x32, 0x02, 0x82, 0x63, 0x75,
+    0x76, 0x6D, 0x6B, 0x68, 0x6D, 0x61, 0x63, 0x2D, 0x73, 0x65, 0x63, 0x72,
+    0x65, 0x74, 0x03, 0x50, 0xF8, 0xA0, 0x11, 0xF3, 0x8C, 0x0A, 0x4D, 0x15,
+    0x80, 0x06, 0x17, 0x11, 0x1F, 0x9E, 0xDC, 0x7D, 0x04, 0xA5, 0x62, 0x72,
+    0x6B, 0xF5, 0x62, 0x75, 0x70, 0xF5, 0x62, 0x75, 0x76, 0xF5, 0x64, 0x70,
+    0x6C, 0x61, 0x74, 0xF5,
+    // clientPin : true
+    0x69, 0x63, 0x6C, 0x69, 0x65, 0x6E, 0x75,
+    // End of clientPin setting.
+    0x50, 0x69, 0x6E, 0xF4, 0x05, 0x19, 0x04, 0xB0, 0x06, 0x81, 0x01,
+};
+
 // A Sample well formed response to CTAP MakeCredential request.
 constexpr uint8_t kTestMakeCredentialResponse[] = {
     // Success status byte
diff --git a/device/fido/make_credential_task.cc b/device/fido/make_credential_task.cc
index dcd3f48..8850c0cd 100644
--- a/device/fido/make_credential_task.cc
+++ b/device/fido/make_credential_task.cc
@@ -14,6 +14,33 @@
 
 namespace device {
 
+namespace {
+
+// Checks whether the incoming MakeCredential request has ClientPin option that
+// is compatible with the Chrome's CTAP2 implementation. According to the CTAP
+// spec, CTAP2 authenticators that have client pin set will always error out on
+// MakeCredential request when "pinAuth" parameter in the request is not set. As
+// ClientPin is not supported on Chrome yet, this check allows Chrome to avoid
+// such failures if possible by defaulting to U2F request when user verification
+// is not required and the device supports U2F protocol.
+// TODO(hongjunchoi): Remove this once ClientPin command is implemented.
+// See: https://crbug.com/870892
+bool IsClientPinOptionCompatible(const FidoDevice* device,
+                                 const CtapMakeCredentialRequest& request) {
+  if (request.user_verification_required())
+    return true;
+
+  DCHECK(device && device->device_info());
+  bool client_pin_set =
+      device->device_info()->options().client_pin_availability() ==
+      AuthenticatorSupportedOptions::ClientPinAvailability::kSupportedAndPinSet;
+  bool supports_u2f = base::ContainsKey(device->device_info()->versions(),
+                                        ProtocolVersion::kU2f);
+  return !client_pin_set || !supports_u2f;
+}
+
+}  // namespace
+
 MakeCredentialTask::MakeCredentialTask(
     FidoDevice* device,
     CtapMakeCredentialRequest request_parameter,
@@ -27,7 +54,8 @@
 
 void MakeCredentialTask::StartTask() {
   if (base::FeatureList::IsEnabled(kNewCtap2Device) &&
-      device()->supported_protocol() == ProtocolVersion::kCtap) {
+      device()->supported_protocol() == ProtocolVersion::kCtap &&
+      IsClientPinOptionCompatible(device(), request_parameter_)) {
     MakeCredential();
   } else {
     U2fRegister();
diff --git a/device/fido/make_credential_task_unittest.cc b/device/fido/make_credential_task_unittest.cc
index e35314b1..8b77ce9 100644
--- a/device/fido/make_credential_task_unittest.cc
+++ b/device/fido/make_credential_task_unittest.cc
@@ -31,6 +31,10 @@
 
 namespace {
 
+constexpr std::array<uint8_t, kAaguidLength> kTestDeviceAaguid = {
+    {0xF8, 0xA0, 0x11, 0xF3, 0x8C, 0x0A, 0x4D, 0x15, 0x80, 0x06, 0x17, 0x11,
+     0x1F, 0x9E, 0xDC, 0x7D}};
+
 using TestMakeCredentialTaskCallback =
     ::device::test::StatusAndValueCallbackReceiver<
         CtapDeviceResponseCode,
@@ -131,5 +135,58 @@
             make_credential_callback_receiver().status());
 }
 
+TEST_F(FidoMakeCredentialTaskTest, DefaultToU2fWhenClientPinSet) {
+  AuthenticatorGetInfoResponse device_info(
+      {ProtocolVersion::kCtap, ProtocolVersion::kU2f},
+      fido_parsing_utils::Materialize(kTestDeviceAaguid));
+  AuthenticatorSupportedOptions options;
+  options.SetClientPinAvailability(
+      AuthenticatorSupportedOptions::ClientPinAvailability::
+          kSupportedAndPinSet);
+  device_info.SetOptions(std::move(options));
+
+  auto device = MockFidoDevice::MakeCtap(std::move(device_info));
+  device->ExpectRequestAndRespondWith(
+      test_data::kU2fRegisterCommandApdu,
+      test_data::kApduEncodedNoErrorRegisterResponse);
+
+  const auto task = CreateMakeCredentialTask(device.get());
+  make_credential_callback_receiver().WaitForCallback();
+  EXPECT_EQ(CtapDeviceResponseCode::kSuccess,
+            make_credential_callback_receiver().status());
+  EXPECT_TRUE(make_credential_callback_receiver().value());
+}
+
+TEST_F(FidoMakeCredentialTaskTest, EnforceClientPinWhenUserVerificationSet) {
+  AuthenticatorGetInfoResponse device_info(
+      {ProtocolVersion::kCtap, ProtocolVersion::kU2f},
+      fido_parsing_utils::Materialize(kTestDeviceAaguid));
+  AuthenticatorSupportedOptions options;
+  options.SetClientPinAvailability(
+      AuthenticatorSupportedOptions::ClientPinAvailability::
+          kSupportedAndPinSet);
+  device_info.SetOptions(std::move(options));
+
+  auto device = MockFidoDevice::MakeCtap(std::move(device_info));
+  device->ExpectCtap2CommandAndRespondWith(
+      CtapRequestCommand::kAuthenticatorMakeCredential, base::nullopt);
+
+  PublicKeyCredentialRpEntity rp(test_data::kRelyingPartyId);
+  PublicKeyCredentialUserEntity user(
+      fido_parsing_utils::Materialize(test_data::kUserId));
+  auto request = CtapMakeCredentialRequest(
+      test_data::kClientDataHash, std::move(rp), std::move(user),
+      PublicKeyCredentialParams(
+          std::vector<PublicKeyCredentialParams::CredentialInfo>(1)));
+  request.SetUserVerificationRequired(true);
+  const auto task = std::make_unique<MakeCredentialTask>(
+      device.get(), std::move(request), callback_receiver_.callback());
+
+  make_credential_callback_receiver().WaitForCallback();
+  EXPECT_EQ(CtapDeviceResponseCode::kCtap2ErrOther,
+            make_credential_callback_receiver().status());
+  EXPECT_FALSE(make_credential_callback_receiver().value());
+}
+
 }  // namespace
 }  // namespace device
diff --git a/device/serial/serial_io_handler.cc b/device/serial/serial_io_handler.cc
index 4050924b..e8219537 100644
--- a/device/serial/serial_io_handler.cc
+++ b/device/serial/serial_io_handler.cc
@@ -11,8 +11,8 @@
 #include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 
 #if defined(OS_CHROMEOS)
diff --git a/device/usb/usb_service.cc b/device/usb/usb_service.cc
index d92edce..bfea0c0b 100644
--- a/device/usb/usb_service.cc
+++ b/device/usb/usb_service.cc
@@ -8,7 +8,7 @@
 #include "base/feature_list.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "components/device_event_log/device_event_log.h"
diff --git a/device/usb/usb_service.h b/device/usb/usb_service.h
index 8ef8ee6..f8cb48d 100644
--- a/device/usb/usb_service.h
+++ b/device/usb/usb_service.h
@@ -19,7 +19,7 @@
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 
 namespace device {
 
diff --git a/device/usb/usb_service_impl.cc b/device/usb/usb_service_impl.cc
index 1a0fd8b..bb26daa 100644
--- a/device/usb/usb_service_impl.cc
+++ b/device/usb/usb_service_impl.cc
@@ -21,7 +21,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/device_event_log/device_event_log.h"
 #include "device/usb/usb_device_handle.h"
diff --git a/docs/task_scheduler_migration.md b/docs/task_scheduler_migration.md
index 9d095a1..7776e2ab 100644
--- a/docs/task_scheduler_migration.md
+++ b/docs/task_scheduler_migration.md
@@ -4,7 +4,7 @@
 
 ## Overview
 
-[`base/task_scheduler/post_task.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h)
+[`base/task/post_task.h`](https://cs.chromium.org/chromium/src/base/task/post_task.h)
 was introduced to Chrome in Q1. The API is fully documented under [Threading and
 Tasks in Chrome](threading_and_tasks.md). This page will go into more details
 about how to migrate callers of existing APIs to TaskScheduler.
@@ -136,6 +136,6 @@
 * Everything in a file/component needs to run on the same sequence but there
   isn't a clear place to own/access the common SequencedTaskRunner =>
   base::Lazy(Sequenced|SingleThread|COMSTA)TaskRunner.
-* For anything else, ping [base/task_scheduler/OWNERS](https://cs.chromium.org/chromium/src/base/task_scheduler/OWNERS)
+* For anything else, ping [base/task/task_scheduler/OWNERS](https://cs.chromium.org/chromium/src/base/task/task_scheduler/OWNERS)
   or [scheduler-dev@chromium.org](https://groups.google.com/a/chromium.org/forum/#!forum/scheduler-dev),
   thanks!
diff --git a/docs/threading_and_tasks.md b/docs/threading_and_tasks.md
index accb7a8..9ccf60f 100644
--- a/docs/threading_and_tasks.md
+++ b/docs/threading_and_tasks.md
@@ -88,7 +88,7 @@
 A task that can run on any thread and doesn’t have ordering or mutual exclusion
 requirements with other tasks should be posted using one of the
 `base::PostTask*()` functions defined in
-[`base/task_scheduler/post_task.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h).
+[`base/task/post_task.h`](https://cs.chromium.org/chromium/src/base/task/post_task.h).
 
 ```cpp
 base::PostTask(FROM_HERE, base::BindOnce(&Task));
@@ -359,12 +359,12 @@
 
 ## Annotating Tasks with TaskTraits
 
-[`TaskTraits`](https://cs.chromium.org/chromium/src/base/task_scheduler/task_traits.h)
+[`TaskTraits`](https://cs.chromium.org/chromium/src/base/task/task_traits.h)
 encapsulate information about a task that helps the task scheduler make better
 scheduling decisions.
 
 All `PostTask*()` functions in
-[`base/task_scheduler/post_task.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h)
+[`base/task/post_task.h`](https://cs.chromium.org/chromium/src/base/task/post_task.h)
 have an overload that takes `TaskTraits` as argument and one that doesn’t. The
 overload that doesn’t take `TaskTraits` as argument is appropriate for tasks
 that:
@@ -373,7 +373,7 @@
 - Can either block shutdown or be skipped on shutdown (task scheduler is free to choose a fitting default).
 Tasks that don’t match this description must be posted with explicit TaskTraits.
 
-[`base/task_scheduler/task_traits.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/task_traits.h)
+[`base/task/task_traits.h`](https://cs.chromium.org/chromium/src/base/task/task_traits.h)
 provides exhaustive documentation of available traits. Below are some examples
 of how to specify `TaskTraits`.
 
@@ -540,7 +540,7 @@
 
 To test code that uses `base::ThreadTaskRunnerHandle`,
 `base::SequencedTaskRunnerHandle` or a function in
-[`base/task_scheduler/post_task.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h), instantiate a
+[`base/task/post_task.h`](https://cs.chromium.org/chromium/src/base/task/post_task.h), instantiate a
 [`base::test::ScopedTaskEnvironment`](https://cs.chromium.org/chromium/src/base/test/scoped_task_environment.h)
 for the scope of the test.
 
@@ -599,7 +599,7 @@
 ## Using TaskScheduler in a New Process
 
 TaskScheduler needs to be initialized in a process before the functions in
-[`base/task_scheduler/post_task.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h)
+[`base/task/post_task.h`](https://cs.chromium.org/chromium/src/base/task/post_task.h)
 can be used. Initialization of TaskScheduler in the Chrome browser process and
 child processes (renderer, GPU, utility) has already been taken care of. To use
 TaskScheduler in another process, initialize TaskScheduler early in the main
@@ -608,13 +608,13 @@
 ```cpp
 // This initializes and starts TaskScheduler with default params.
 base::TaskScheduler::CreateAndStartWithDefaultParams(“process_name”);
-// The base/task_scheduler/post_task.h API can now be used. Tasks will be
-// scheduled as they are posted.
+// The base/task/post_task.h API can now be used. Tasks will be // scheduled as
+// they are posted.
 
 // This initializes TaskScheduler.
 base::TaskScheduler::Create(“process_name”);
-// The base/task_scheduler/post_task.h API can now be used. No threads
-// will be created and no tasks will be scheduled until after Start() is called.
+// The base/task/post_task.h API can now be used. No threads // will be created
+// and no tasks will be scheduled until after Start() is called.
 base::TaskScheduler::GetInstance()->Start(params);
 // TaskScheduler can now create threads and schedule tasks.
 ```
@@ -639,7 +639,7 @@
 refactoring where a TaskRunner was passed through a lot of components only to be
 used in an eventual leaf. The leaf can and should now obtain its TaskRunner
 directly from
-[`base/task_scheduler/post_task.h`](https://cs.chromium.org/chromium/src/base/task_scheduler/post_task.h).
+[`base/task/post_task.h`](https://cs.chromium.org/chromium/src/base/task/post_task.h).
 
 Dependency injection of TaskRunners can still seldomly be useful to unit test a
 component when triggering a specific race in a specific way is essential to the
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
index 14a3d40..6d2148ef 100644
--- a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
+++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
@@ -12,7 +12,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/common/service_manager_connection.h"
diff --git a/extensions/browser/api/document_scan/document_scan_api.cc b/extensions/browser/api/document_scan/document_scan_api.cc
index 65445c0..2087df5 100644
--- a/extensions/browser/api/document_scan/document_scan_api.cc
+++ b/extensions/browser/api/document_scan/document_scan_api.cc
@@ -5,7 +5,7 @@
 #include "extensions/browser/api/document_scan/document_scan_api.h"
 
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/extension_system.h"
 
diff --git a/extensions/browser/api/execute_code_function.cc b/extensions/browser/api/execute_code_function.cc
index 3280323..0f791d8 100644
--- a/extensions/browser/api/execute_code_function.cc
+++ b/extensions/browser/api/execute_code_function.cc
@@ -7,7 +7,7 @@
 
 #include "extensions/browser/api/execute_code_function.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "extensions/browser/component_extension_resource_manager.h"
 #include "extensions/browser/extension_api_frame_id_map.h"
diff --git a/extensions/browser/api/feedback_private/log_source_access_manager.cc b/extensions/browser/api/feedback_private/log_source_access_manager.cc
index 036113941..f667c9c 100644
--- a/extensions/browser/api/feedback_private/log_source_access_manager.cc
+++ b/extensions/browser/api/feedback_private/log_source_access_manager.cc
@@ -9,7 +9,7 @@
 
 #include "base/bind.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/time/default_tick_clock.h"
 #include "extensions/browser/api/api_resource_manager.h"
diff --git a/extensions/browser/api/file_handlers/app_file_handler_util.cc b/extensions/browser/api/file_handlers/app_file_handler_util.cc
index 1ed601b5..3b166e7d 100644
--- a/extensions/browser/api/file_handlers/app_file_handler_util.cc
+++ b/extensions/browser/api/file_handlers/app_file_handler_util.cc
@@ -7,8 +7,8 @@
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/extensions/browser/api/file_handlers/directory_util.cc b/extensions/browser/api/file_handlers/directory_util.cc
index 6ebb2cc..99dc2e5b 100644
--- a/extensions/browser/api/file_handlers/directory_util.cc
+++ b/extensions/browser/api/file_handlers/directory_util.cc
@@ -6,7 +6,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/public/browser/browser_context.h"
 #include "net/base/filename_util.h"
diff --git a/extensions/browser/api/file_handlers/mime_util.cc b/extensions/browser/api/file_handlers/mime_util.cc
index 6210b5b..fbb9a45 100644
--- a/extensions/browser/api/file_handlers/mime_util.cc
+++ b/extensions/browser/api/file_handlers/mime_util.cc
@@ -6,7 +6,7 @@
 
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_context.h"
diff --git a/extensions/browser/api/file_system/file_system_api.cc b/extensions/browser/api/file_system/file_system_api.cc
index 2e6a2ac3..1620ea8 100644
--- a/extensions/browser/api/file_system/file_system_api.cc
+++ b/extensions/browser/api/file_system/file_system_api.cc
@@ -23,7 +23,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/value_conversions.h"
 #include "base/values.h"
 #include "build/build_config.h"
diff --git a/extensions/browser/api/lock_screen_data/data_item.cc b/extensions/browser/api/lock_screen_data/data_item.cc
index 2aa36cc1..b74b012 100644
--- a/extensions/browser/api/lock_screen_data/data_item.cc
+++ b/extensions/browser/api/lock_screen_data/data_item.cc
@@ -14,7 +14,7 @@
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "crypto/encryptor.h"
 #include "crypto/symmetric_key.h"
diff --git a/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc b/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
index dfeb403c..b98471e1 100644
--- a/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
+++ b/extensions/browser/api/lock_screen_data/lock_screen_item_storage_unittest.cc
@@ -18,7 +18,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "chromeos/login/login_state.h"
diff --git a/extensions/browser/api/networking_private/networking_private_service_client.cc b/extensions/browser/api/networking_private/networking_private_service_client.cc
index 331a22d..8c7545b2 100644
--- a/extensions/browser/api/networking_private/networking_private_service_client.cc
+++ b/extensions/browser/api/networking_private/networking_private_service_client.cc
@@ -11,8 +11,8 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/onc/onc_constants.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/extensions/browser/api/serial/serial_api.cc b/extensions/browser/api/serial/serial_api.cc
index 15258d8..ff09857 100644
--- a/extensions/browser/api/serial/serial_api.cc
+++ b/extensions/browser/api/serial/serial_api.cc
@@ -7,7 +7,7 @@
 #include <algorithm>
 #include <vector>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/extensions/browser/api/socket/socket_api.cc b/extensions/browser/api/socket/socket_api.cc
index a65f1478..7737b29a 100644
--- a/extensions/browser/api/socket/socket_api.cc
+++ b/extensions/browser/api/socket/socket_api.cc
@@ -9,7 +9,7 @@
 
 #include "base/bind.h"
 #include "base/containers/hash_tables.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "content/public/browser/browser_context.h"
diff --git a/extensions/browser/api/system_info/system_info_provider.cc b/extensions/browser/api/system_info/system_info_provider.cc
index 9227bd8..4d00a49 100644
--- a/extensions/browser/api/system_info/system_info_provider.cc
+++ b/extensions/browser/api/system_info/system_info_provider.cc
@@ -5,8 +5,8 @@
 #include "extensions/browser/api/system_info/system_info_provider.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/extensions/browser/api/system_network/system_network_api.cc b/extensions/browser/api/system_network/system_network_api.cc
index febec50..867bcff 100644
--- a/extensions/browser/api/system_network/system_network_api.cc
+++ b/extensions/browser/api/system_network/system_network_api.cc
@@ -4,7 +4,7 @@
 
 #include "extensions/browser/api/system_network/system_network_api.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace {
diff --git a/extensions/browser/api/system_storage/system_storage_api.cc b/extensions/browser/api/system_storage/system_storage_api.cc
index 50957b59a..368ab9f 100644
--- a/extensions/browser/api/system_storage/system_storage_api.cc
+++ b/extensions/browser/api/system_storage/system_storage_api.cc
@@ -4,7 +4,7 @@
 
 #include "extensions/browser/api/system_storage/system_storage_api.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "content/public/browser/browser_thread.h"
 
diff --git a/extensions/browser/content_hash_fetcher.cc b/extensions/browser/content_hash_fetcher.cc
index ab4c4044..d7757a08 100644
--- a/extensions/browser/content_hash_fetcher.cc
+++ b/extensions/browser/content_hash_fetcher.cc
@@ -14,7 +14,7 @@
 #include "base/json/json_reader.h"
 #include "base/macros.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/content_verifier/content_hash.h"
diff --git a/extensions/browser/content_hash_fetcher_unittest.cc b/extensions/browser/content_hash_fetcher_unittest.cc
index a8e87a85..c5fb75f 100644
--- a/extensions/browser/content_hash_fetcher_unittest.cc
+++ b/extensions/browser/content_hash_fetcher_unittest.cc
@@ -12,7 +12,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/version.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
diff --git a/extensions/browser/content_verifier.cc b/extensions/browser/content_verifier.cc
index c43064c..4ef6c57 100644
--- a/extensions/browser/content_verifier.cc
+++ b/extensions/browser/content_verifier.cc
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/elapsed_timer.h"
 #include "content/public/browser/browser_context.h"
diff --git a/extensions/browser/content_verifier/content_hash.cc b/extensions/browser/content_verifier/content_hash.cc
index 90304c7..a4ecaa60 100644
--- a/extensions/browser/content_verifier/content_hash.cc
+++ b/extensions/browser/content_verifier/content_hash.cc
@@ -9,7 +9,7 @@
 #include "base/json/json_reader.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequence_checker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/elapsed_timer.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/extensions/browser/content_verify_job.cc b/extensions/browser/content_verify_job.cc
index 2ae09a52..b4c7c5c 100644
--- a/extensions/browser/content_verify_job.cc
+++ b/extensions/browser/content_verify_job.cc
@@ -8,7 +8,7 @@
 
 #include "base/metrics/histogram_macros.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/timer/elapsed_timer.h"
 #include "content/public/browser/browser_thread.h"
 #include "crypto/secure_hash.h"
diff --git a/extensions/browser/extension_file_task_runner.cc b/extensions/browser/extension_file_task_runner.cc
index f4755722..8db38f3 100644
--- a/extensions/browser/extension_file_task_runner.cc
+++ b/extensions/browser/extension_file_task_runner.cc
@@ -5,8 +5,8 @@
 #include "extensions/browser/extension_file_task_runner.h"
 
 #include "base/sequenced_task_runner.h"
-#include "base/task/lazy_task_runner_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/lazy_task_runner.h"
+#include "base/task/task_traits.h"
 
 namespace extensions {
 
diff --git a/extensions/browser/extension_protocols.cc b/extensions/browser/extension_protocols.cc
index 991685a6..a753b75a 100644
--- a/extensions/browser/extension_protocols.cc
+++ b/extensions/browser/extension_protocols.cc
@@ -31,7 +31,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/elapsed_timer.h"
 #include "build/build_config.h"
diff --git a/extensions/browser/image_loader.cc b/extensions/browser/image_loader.cc
index bf91cb3..a5959d5 100644
--- a/extensions/browser/image_loader.cc
+++ b/extensions/browser/image_loader.cc
@@ -13,7 +13,7 @@
 #include "base/compiler_specific.h"
 #include "base/files/file_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "content/public/browser/browser_thread.h"
 #include "extensions/browser/component_extension_resource_manager.h"
 #include "extensions/browser/extensions_browser_client.h"
diff --git a/extensions/browser/image_sanitizer_unittest.cc b/extensions/browser/image_sanitizer_unittest.cc
index eace2ff6..1210977 100644
--- a/extensions/browser/image_sanitizer_unittest.cc
+++ b/extensions/browser/image_sanitizer_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "services/data_decoder/public/cpp/test_data_decoder_service.h"
diff --git a/extensions/browser/updater/extension_installer.cc b/extensions/browser/updater/extension_installer.cc
index 3eda9c1..3063f62 100644
--- a/extensions/browser/updater/extension_installer.cc
+++ b/extensions/browser/updater/extension_installer.cc
@@ -12,7 +12,7 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/logging.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/update_client/update_client_errors.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/extensions/browser/updater/update_data_provider.cc b/extensions/browser/updater/update_data_provider.cc
index 85621e33..98041471 100644
--- a/extensions/browser/updater/update_data_provider.cc
+++ b/extensions/browser/updater/update_data_provider.cc
@@ -12,7 +12,7 @@
 #include "base/files/file_util.h"
 #include "base/optional.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/update_client/utils.h"
 #include "content/public/browser/browser_thread.h"
 #include "crypto/sha2.h"
diff --git a/extensions/browser/web_ui_user_script_loader.cc b/extensions/browser/web_ui_user_script_loader.cc
index c0db12a..9199c40 100644
--- a/extensions/browser/web_ui_user_script_loader.cc
+++ b/extensions/browser/web_ui_user_script_loader.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "content/public/browser/browser_context.h"
 #include "extensions/browser/guest_view/web_view/web_ui/web_ui_url_fetcher.h"
diff --git a/extensions/browser/zipfile_installer.cc b/extensions/browser/zipfile_installer.cc
index 866f6a96..e276785 100644
--- a/extensions/browser/zipfile_installer.cc
+++ b/extensions/browser/zipfile_installer.cc
@@ -6,7 +6,7 @@
 
 #include "base/files/file_util.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "components/services/unzip/public/cpp/unzip.h"
 #include "components/services/unzip/public/interfaces/unzipper.mojom.h"
diff --git a/extensions/common/api/BUILD.gn b/extensions/common/api/BUILD.gn
index 05a01298..efdedc8 100644
--- a/extensions/common/api/BUILD.gn
+++ b/extensions/common/api/BUILD.gn
@@ -11,9 +11,10 @@
 
 assert(enable_extensions)
 
-json_schema_api("generated_api") {
+# TODO(devlin): Enforce visibility restrictions on more of these targets?
+
+json_schema_api("generated_api_bundles") {
   sources = extensions_api_schema_files
-  schemas = true
   bundle = true
   bundle_name = ""
   root_namespace = extensions_api_root_namespace
@@ -24,6 +25,17 @@
     "//base",
     "//extensions/buildflags",
   ]
+  visibility = [ ":api" ]
+}
+
+generated_types("generated_api_types") {
+  sources = extensions_api_schema_files
+  root_namespace = extensions_api_root_namespace
+  deps = [
+    "//base",
+    "//extensions/buildflags",
+  ]
+  visibility = [ ":api" ]
 }
 
 mojom("mojom") {
@@ -32,14 +44,6 @@
   ]
 }
 
-group("api") {
-  public_deps = [
-    ":generated_api",
-    ":mojom",
-    "//extensions/buildflags",
-  ]
-}
-
 json_features("api_features") {
   feature_type = "APIFeature"
   method_name = "AddCoreAPIFeatures"
@@ -72,6 +76,17 @@
   ]
 }
 
+# Public Targets
+
+group("api") {
+  public_deps = [
+    ":generated_api_bundles",
+    ":generated_api_types",
+    ":mojom",
+    "//extensions/buildflags",
+  ]
+}
+
 group("extensions_features") {
   public_deps = [
     ":api_features",
diff --git a/extensions/docs/permissions.md b/extensions/docs/permissions.md
index 249b38d..ecc85c3 100644
--- a/extensions/docs/permissions.md
+++ b/extensions/docs/permissions.md
@@ -60,9 +60,10 @@
 
 ## Storing Permissions
 Permissions are stored in the Preferences file, under the extension’s entry.  We
-store two different sets of permissions: granted permissions and active
-permissions.  Note that neither of these include any
-[non-persistent permissions](#non_persistent-permissions).
+always store two different sets of permissions: granted permissions and active
+permissions (with the runtime host permissions feature, we will store a third,
+runtime granted permissions - this is described below).  Note that neither of
+these include any [non-persistent permissions](#non_persistent-permissions).
 
 ### Granted Permissions
 Granted permissions are the permissions that the extension has ever been granted
@@ -207,3 +208,96 @@
   if no new permissions are added*. This is because Chrome cannot know whether
   version 2 added new permissions or not, and behaves conservatively. Syncing
   granted permissions would solve this issue. See https://crbug.com/809797.
+
+## Runtime Host Permissions
+Runtime host permissions is a new feature that allows users to have more control
+over when and where their extensions run. This allows the user to install an
+extension that requests permission to multiple hosts, but have a choice over if
+it runs.
+
+The runtime host permissions feature introduces a number of permissions-related
+concepts.
+
+### Withheld Permissions
+Withheld permissions are stored on the Extension object (as part of the
+PermissionsData class). Withheld permissions are the set of permissions that
+were listed as required permissions by the extension, but were withheld as part
+of the runtime host permissions feature. The extension does not have acccess
+to these permissions.
+
+### Runtime-Granted Permissions
+Runtime-granted permissions are stored within extension preferences, and
+represent the permissions that the user has granted the extension at runtime.
+This is deliberately kept as a separate set from granted permissions in order
+to ensure that experimentation with the feature is independent, and will not
+affect extensions when the feature is disabled.
+
+Runtime-granted permissions include permissions granted through dedicated UI
+for the runtime host permissions feature (such as context menu controls and
+controls in the chrome://extensions page) as well as optional permissions
+granted through the `permissions` API.
+
+The controls for granting runtime permissions allow granting permissions beyond
+what the extension specifically requests. This is so that the user can grant
+`https://google.com/*`, even if the extension only requested
+`https://google.com/maps`. This is useful for two reasons. First, it presents
+a simpler UI to the user (who doesn't need to worry about granting exactly the
+correct URL pattern); secondly, it means if the extension later requests
+an additional pattern within the same host, it will be automatically granted.
+
+However, though the runtime-granted permissions may extend beyond what is
+explicitly requested, the current permissions on the extension object itself
+(or granted to the extension process) should not. This provides us increased
+security, since we don't want to have extensions privileged beyond what they
+should need.
+
+### Calculating Current Permissions
+With the runtime host permissions feature, calculating current permissions is
+a little more complex. Typically, an extension's current permissions are
+calculated as
+
+```
+current_permissions =
+    intersection(active_permissions,
+                 union(required_permissions, optional_permissions))
+```
+
+Said differently, an extension's permissions are equal to any permissions in
+the active permission set that also appear in either the required or optional
+sets. This ensures that the extension never has access to permissions that it
+didn't request, which is important for security reasons (we don't want an
+over-privileged process if we can avoid it).
+
+With runtime host permissions, this calculation is a little more difficult:
+
+```
+current_permissions_without_feature =
+    intersection(active_permissions,
+                 union(required_permissions, optional_permissions))
+current_permissions =
+    intersection(current_permissions_without_feature,
+                 runtime_granted_permissions)
+```
+
+The system will withhold permissions that were not within the set of
+runtime-granted permissions. As noted above, the runtime-granted permissions
+may include more than what was explicitly requested by the extension; however,
+we will not extend these permissions to the extension object because these
+additional permissions will not be present on in the required or optional
+permissions.
+
+### Permissions Intersections
+With runtime host permissions, it's possible that the user will grant a host
+permission that overlaps with a requested host, but is neither a direct match
+nor a strict subset. For instance, an extension may request the pattern
+`*://google.com/maps`, and a user may grant `https://*.google.com/*`. In this
+case, we should neither grant `*://google.com/maps` (which includes origins the
+user did not approve, nor grant `https://*.google.com/*` (which includes more
+than the extension requires). Instead, we should grant the extension
+`https://google.com/maps` - the intersection of the granted permission and the
+requested permission.
+
+We perform this calculation with runtime host permissions. This has the
+implication that permissions granted to the extension object may not be
+explicitly present within the extension's required or optional permissions, but
+rather contained by one of those sets.
diff --git a/extensions/renderer/bindings/api_event_handler.cc b/extensions/renderer/bindings/api_event_handler.cc
index 62dff1bc..2fc7adb 100644
--- a/extensions/renderer/bindings/api_event_handler.cc
+++ b/extensions/renderer/bindings/api_event_handler.cc
@@ -88,7 +88,12 @@
   gin::Converter<EventEmitter*>::FromV8(isolate, v8_emitter.Get(isolate),
                                         &emitter);
   CHECK(emitter);
-  emitter->Fire(context, &args, nullptr, JSRunner::ResultCallback());
+  // Note: It's safe to use EventEmitter::FireSync() here because this should
+  // only be triggered from a JS call, so we know JS is running.
+  // TODO(devlin): It looks like the return result that requires this to be sync
+  // is only used by the InputIME custom bindings; it would be kind of nice to
+  // remove the dependency.
+  info.GetReturnValue().Set(emitter->FireSync(context, &args, nullptr));
 }
 
 }  // namespace
diff --git a/extensions/renderer/bindings/api_event_handler_unittest.cc b/extensions/renderer/bindings/api_event_handler_unittest.cc
index 7d572fd..c485b72 100644
--- a/extensions/renderer/bindings/api_event_handler_unittest.cc
+++ b/extensions/renderer/bindings/api_event_handler_unittest.cc
@@ -848,6 +848,55 @@
   // that we don't crash.)
 }
 
+// Test that event results of dispatch are passed to the calling argument
+// massager. Regression test for https://crbug.com/867310.
+TEST_F(APIEventHandlerTest, TestArgumentMassagersDispatchResult) {
+  v8::HandleScope handle_scope(isolate());
+  v8::Local<v8::Context> context = MainContext();
+
+  const char kEventName[] = "alpha";
+  v8::Local<v8::Object> event = handler()->CreateEventInstance(
+      kEventName, false, true, binding::kNoListenerMax, true, context);
+  ASSERT_FALSE(event.IsEmpty());
+
+  const char kArgumentMassager[] =
+      R"((function(originalArgs, dispatch) {
+           this.dispatchResult = dispatch(['primary']);
+         });)";
+  v8::Local<v8::Function> massager =
+      FunctionFromString(context, kArgumentMassager);
+  handler()->RegisterArgumentMassager(context, kEventName, massager);
+
+  const char kListenerFunction[] =
+      R"((function(arg) {
+           let res = arg == 'primary' ? 'listenerSuccess' : 'listenerFailure';
+           this.listenerResult = res;
+           return res;
+         });)";
+  v8::Local<v8::Function> listener_function =
+      FunctionFromString(context, kListenerFunction);
+  ASSERT_FALSE(listener_function.IsEmpty());
+
+  {
+    v8::Local<v8::Function> add_listener_function =
+        FunctionFromString(context, kAddListenerFunction);
+    v8::Local<v8::Value> argv[] = {event, listener_function};
+    RunFunction(add_listener_function, context, base::size(argv), argv);
+  }
+
+  handler()->FireEventInContext(kEventName, context, base::ListValue(),
+                                nullptr);
+
+  EXPECT_EQ(
+      R"({"results":["listenerSuccess"]})",
+      GetStringPropertyFromObject(context->Global(), context,
+                                  "dispatchResult"));
+  EXPECT_EQ(
+      R"("listenerSuccess")",
+      GetStringPropertyFromObject(context->Global(), context,
+                                  "listenerResult"));
+}
+
 // Test creating a custom event, as is done by a few of our custom bindings.
 TEST_F(APIEventHandlerTest, TestCreateCustomEvent) {
   v8::HandleScope handle_scope(isolate());
diff --git a/extensions/renderer/bindings/event_emitter.cc b/extensions/renderer/bindings/event_emitter.cc
index b0683c3..ed77841e 100644
--- a/extensions/renderer/bindings/event_emitter.cc
+++ b/extensions/renderer/bindings/event_emitter.cc
@@ -60,6 +60,14 @@
   DispatchAsync(context, args, filter, std::move(callback));
 }
 
+v8::Local<v8::Value> EventEmitter::FireSync(
+    v8::Local<v8::Context> context,
+    std::vector<v8::Local<v8::Value>>* args,
+    const EventFilteringInfo* filter) {
+  DCHECK(context == context->GetIsolate()->GetCurrentContext());
+  return DispatchSync(context, args, filter);
+}
+
 void EventEmitter::Invalidate(v8::Local<v8::Context> context) {
   valid_ = false;
   listeners_->Invalidate(context);
diff --git a/extensions/renderer/bindings/event_emitter.h b/extensions/renderer/bindings/event_emitter.h
index ee90f51..d2b19cc8 100644
--- a/extensions/renderer/bindings/event_emitter.h
+++ b/extensions/renderer/bindings/event_emitter.h
@@ -46,6 +46,15 @@
             const EventFilteringInfo* filter,
             JSRunner::ResultCallback callback);
 
+  // Fires the event to any listeners synchronously, and returns the result.
+  // This should only be used if the caller is certain that JS is already
+  // running (i.e., is not blocked).
+  // Warning: This can run arbitrary JS code, so the |context| may be
+  // invalidated after this!
+  v8::Local<v8::Value> FireSync(v8::Local<v8::Context> context,
+                                std::vector<v8::Local<v8::Value>>* args,
+                                const EventFilteringInfo* filter);
+
   // Removes all listeners and marks this object as invalid so that no more
   // are added.
   void Invalidate(v8::Local<v8::Context> context);
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index 20bc4420..2b5eddd 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -65,7 +65,6 @@
     "//extensions/renderer",
     "//extensions/shell/browser/system_logs",
     "//extensions/shell/common/api",
-    "//extensions/shell/common/api:api_registration",
     "//extensions/shell/common/api:extensions_features",
     "//google_apis",
     "//third_party/blink/public:blink",
diff --git a/extensions/shell/browser/shell_desktop_controller_aura_browsertest.cc b/extensions/shell/browser/shell_desktop_controller_aura_browsertest.cc
index 57b6110..5ceedf2 100644
--- a/extensions/shell/browser/shell_desktop_controller_aura_browsertest.cc
+++ b/extensions/shell/browser/shell_desktop_controller_aura_browsertest.cc
@@ -5,7 +5,7 @@
 #include "extensions/shell/browser/shell_desktop_controller_aura.h"
 
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/time/time.h"
 #include "components/keep_alive_registry/keep_alive_registry.h"
diff --git a/extensions/shell/common/api/BUILD.gn b/extensions/shell/common/api/BUILD.gn
index b368d68..beb3d0e 100644
--- a/extensions/shell/common/api/BUILD.gn
+++ b/extensions/shell/common/api/BUILD.gn
@@ -9,26 +9,36 @@
 assert(enable_extensions,
        "Cannot depend on extensions because enable_extensions=false.")
 
+# TODO(devlin): Enforce visibility restrictions on more of these targets?
+
 schema_sources = [ "identity.idl" ]
 root_namespace = "extensions::shell::api::%(namespace)s"
 
-json_schema_api("api") {
-  sources = schema_sources
-  schemas = true
-  bundle = true
-  bundle_name = "Shell"
-}
-
-json_schema_api("api_registration") {
+json_schema_api("generated_api_registration_bundle") {
   sources = schema_sources
   impl_dir = "//extensions/shell/browser/api"
   bundle_registration = true
   bundle_name = "Shell"
 
   deps = [
-    ":api",
     "//extensions/common",
   ]
+
+  visibility = [ ":api" ]
+}
+
+json_schema_api("generated_api_strings_bundle") {
+  sources = schema_sources
+  bundle = true
+  bundle_name = "Shell"
+
+  visibility = [ ":api" ]
+}
+
+generated_types("generated_api_types") {
+  sources = schema_sources
+
+  visibility = [ ":api" ]
 }
 
 json_features("shell_api_features") {
@@ -39,6 +49,16 @@
   ]
 }
 
+# Public Targets
+
+group("api") {
+  public_deps = [
+    ":generated_api_registration_bundle",
+    ":generated_api_strings_bundle",
+    ":generated_api_types",
+  ]
+}
+
 group("extensions_features") {
   public_deps = [
     ":shell_api_features",
diff --git a/gin/shell/gin_main.cc b/gin/shell/gin_main.cc
index 36c2c5a..304c9da 100644
--- a/gin/shell/gin_main.cc
+++ b/gin/shell/gin_main.cc
@@ -14,7 +14,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "gin/array_buffer.h"
 #include "gin/modules/console.h"
diff --git a/gin/v8_platform.cc b/gin/v8_platform.cc
index 0b062f1..8455560 100644
--- a/gin/v8_platform.cc
+++ b/gin/v8_platform.cc
@@ -16,9 +16,9 @@
 #include "base/logging.h"
 #include "base/rand_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
+#include "base/task/task_traits.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "gin/per_isolate_data.h"
diff --git a/google_apis/gaia/gaia_auth_consumer.cc b/google_apis/gaia/gaia_auth_consumer.cc
index c5f84d4..c1034fe 100644
--- a/google_apis/gaia/gaia_auth_consumer.cc
+++ b/google_apis/gaia/gaia_auth_consumer.cc
@@ -40,11 +40,13 @@
     const std::string& new_refresh_token,
     const std::string& new_access_token,
     int new_expires_in_secs,
-    bool new_is_child_account)
+    bool new_is_child_account,
+    bool new_is_under_advanced_protection)
     : refresh_token(new_refresh_token),
       access_token(new_access_token),
       expires_in_secs(new_expires_in_secs),
-      is_child_account(new_is_child_account) {}
+      is_child_account(new_is_child_account),
+      is_under_advanced_protection(new_is_under_advanced_protection) {}
 
 GaiaAuthConsumer::ClientOAuthResult::ClientOAuthResult(
     const ClientOAuthResult& other) = default;
diff --git a/google_apis/gaia/gaia_auth_consumer.h b/google_apis/gaia/gaia_auth_consumer.h
index e448901..56bf5c5 100644
--- a/google_apis/gaia/gaia_auth_consumer.h
+++ b/google_apis/gaia/gaia_auth_consumer.h
@@ -45,7 +45,8 @@
     ClientOAuthResult(const std::string& new_refresh_token,
                       const std::string& new_access_token,
                       int new_expires_in_secs,
-                      bool is_child_account);
+                      bool is_child_account,
+                      bool is_under_advanced_protection);
     ClientOAuthResult(const ClientOAuthResult& other);
     ~ClientOAuthResult();
 
@@ -63,6 +64,9 @@
 
     // Whether the authenticated user is a child account.
     bool is_child_account;
+
+    // Whether the authenticated user is in advanced protection program.
+    bool is_under_advanced_protection;
   };
 
   // Possible server responses to a token revocation request.
diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc
index e1f9910..e3d913e 100644
--- a/google_apis/gaia/gaia_auth_fetcher.cc
+++ b/google_apis/gaia/gaia_auth_fetcher.cc
@@ -75,10 +75,12 @@
   if (!dict->GetStringWithoutPathExpansion("id_token", &id_token)) {
     LOG(ERROR) << "Missing ID token on refresh token fetch response.";
   }
-  bool is_child_account = gaia::IsChildAccountFromIdToken(id_token);
+  gaia::TokenServiceFlags service_flags = gaia::ParseServiceFlags(id_token);
 
   return std::make_unique<const GaiaAuthConsumer::ClientOAuthResult>(
-      refresh_token, access_token, expires_in_secs, is_child_account);
+      refresh_token, access_token, expires_in_secs,
+      service_flags.is_child_account,
+      service_flags.is_under_advanced_protection);
 }
 
 void GetCookiesFromResponse(
diff --git a/google_apis/gaia/gaia_auth_fetcher_unittest.cc b/google_apis/gaia/gaia_auth_fetcher_unittest.cc
index bb0fe97..378092e6 100644
--- a/google_apis/gaia/gaia_auth_fetcher_unittest.cc
+++ b/google_apis/gaia/gaia_auth_fetcher_unittest.cc
@@ -331,7 +331,8 @@
   EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(0);
   EXPECT_CALL(consumer,
               OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
-                  "rt1", "at1", 3600, false /* is_child_account */)))
+                  "rt1", "at1", 3600, false /* is_child_account */,
+                  false /* is_advanced_protection */)))
       .Times(1);
 
   TestGaiaAuthFetcher auth(&consumer, std::string(), GetURLLoaderFactory());
@@ -357,7 +358,8 @@
   EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(1);
   EXPECT_CALL(consumer,
               OnClientOAuthSuccess(GaiaAuthConsumer::ClientOAuthResult(
-                  "", "", 0, false /* is_child_account */)))
+                  "", "", 0, false /* is_child_account */,
+                  false /* is_advanced_protection */)))
       .Times(0);
 
   net::TestURLFetcherFactory factory;
diff --git a/google_apis/gaia/oauth2_id_token_decoder.cc b/google_apis/gaia/oauth2_id_token_decoder.cc
index 4c3e57eb..bcc85d3 100644
--- a/google_apis/gaia/oauth2_id_token_decoder.cc
+++ b/google_apis/gaia/oauth2_id_token_decoder.cc
@@ -15,6 +15,10 @@
 // The name of the service flag that defines the account is Unicorn.
 const char kChildAccountServiceFlag[] = "uca";
 
+// The name of the service flag that defines the account is in advanced
+// protection program.
+const char kAdvancedProtectionAccountServiceFlag[] = "tia";
+
 // The key indexing service flags in the ID token JSON.
 const char kServicesKey[] = "services";
 
@@ -79,15 +83,24 @@
 
 namespace gaia {
 
-bool IsChildAccountFromIdToken(const std::string& id_token) {
+TokenServiceFlags ParseServiceFlags(const std::string& id_token) {
+  TokenServiceFlags token_service_flags;
   std::vector<std::string> service_flags;
   if (!GetServiceFlags(id_token, &service_flags)) {
-    // If service flags can’t be obtained, then assume it’s not a child account.
-    VLOG(1) << "Assuming non-child account due to decoding failure";
-    return false;
+    // If service flags can’t be obtained, then assume these service flags
+    // are not set.
+    VLOG(1) << "Assuming the account doesn't have any service flag set "
+            << "due to decoding failure";
+    return token_service_flags;
   }
-  return std::find(service_flags.begin(), service_flags.end(),
-                   kChildAccountServiceFlag) != service_flags.end();
+
+  token_service_flags.is_child_account =
+      std::find(service_flags.begin(), service_flags.end(),
+                kChildAccountServiceFlag) != service_flags.end();
+  token_service_flags.is_under_advanced_protection =
+      std::find(service_flags.begin(), service_flags.end(),
+                kAdvancedProtectionAccountServiceFlag) != service_flags.end();
+  return token_service_flags;
 }
 
 }  // namespace gaia
diff --git a/google_apis/gaia/oauth2_id_token_decoder.h b/google_apis/gaia/oauth2_id_token_decoder.h
index 444b2de..50b6a09 100644
--- a/google_apis/gaia/oauth2_id_token_decoder.h
+++ b/google_apis/gaia/oauth2_id_token_decoder.h
@@ -10,13 +10,18 @@
 
 // This file holds methods decodes the id token received for OAuth2 token
 // endpoint, and derive useful information from it, such as whether the account
-// is a child account.
+// is a child account, and whether this account is under advanced protection.
 
 namespace gaia {
 
-// Detects if the signed-in account is a child account from service flags
-// retrieved in the ID token.
-bool IsChildAccountFromIdToken(const std::string& id_token);
+// Service flags extracted from ID token.
+struct TokenServiceFlags {
+  bool is_child_account = false;
+  bool is_under_advanced_protection = false;
+};
+
+// Parses service flag from ID token.
+TokenServiceFlags ParseServiceFlags(const std::string& id_token);
 
 }  // namespace gaia
 
diff --git a/google_apis/gaia/oauth2_id_token_decoder_unittest.cc b/google_apis/gaia/oauth2_id_token_decoder_unittest.cc
index c1045dd..07dc945 100644
--- a/google_apis/gaia/oauth2_id_token_decoder_unittest.cc
+++ b/google_apis/gaia/oauth2_id_token_decoder_unittest.cc
@@ -39,41 +39,59 @@
     "dummy-header."
     "eyAic2VydmljZXMiOiBbInVjYSJdIH0="  // payload: { "services": ["uca"] }
     ".dummy-signature";
+const char kIdTokenAdvancedProtectionAccount[] =
+    "dummy-header."
+    "eyAic2VydmljZXMiOiBbInRpYSJdIH0="  // payload: { "services": ["tia"] }
+    ".dummy-signature";
+const char kIdTokenChildAndAdvancedProtectionAccount[] =
+    "dummy-header."
+    "eyAic2VydmljZXMiOiBbInRpYSIsICJ1Y2EiXSB9"
+    ".dummy-signature";  // payload: { "services": ["tia", "uca"] }
 
 class OAuth2IdTokenDecoderTest : public testing::Test {};
 
 TEST_F(OAuth2IdTokenDecoderTest, Invalid) {
-  std::string id_token_ = kIdTokenInvalidJwt;
-  bool is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, false);
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenInvalidJwt).is_child_account);
 
-  id_token_ = kIdTokenInvalidJson;
-  is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, false);
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenInvalidJson).is_child_account);
 
-  id_token_ = kIdTokenMissingServices;
-  is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, false);
+  EXPECT_FALSE(
+      gaia::ParseServiceFlags(kIdTokenMissingServices).is_child_account);
 }
 
 TEST_F(OAuth2IdTokenDecoderTest, NotChild) {
-  std::string id_token_ = kIdTokenEmptyServices;
-  bool is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, false);
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenEmptyServices).is_child_account);
 
-  id_token_ = kIdTokenEmptyServicesHeaderSignature;
-  is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, false);
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenEmptyServicesHeaderSignature)
+                   .is_child_account);
 
-  id_token_ = kIdTokenNotChildAccount;
-  is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, false);
+  EXPECT_FALSE(
+      gaia::ParseServiceFlags(kIdTokenNotChildAccount).is_child_account);
 }
 
 TEST_F(OAuth2IdTokenDecoderTest, Child) {
-  std::string id_token_ = kIdTokenChildAccount;
-  bool is_child_account = gaia::IsChildAccountFromIdToken(id_token_);
-  EXPECT_EQ(is_child_account, true);
+  EXPECT_TRUE(gaia::ParseServiceFlags(kIdTokenChildAccount).is_child_account);
+}
+
+TEST_F(OAuth2IdTokenDecoderTest, NotAdvancedProtection) {
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenEmptyServices)
+                   .is_under_advanced_protection);
+
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenEmptyServicesHeaderSignature)
+                   .is_under_advanced_protection);
+
+  EXPECT_FALSE(gaia::ParseServiceFlags(kIdTokenChildAccount)
+                   .is_under_advanced_protection);
+}
+
+TEST_F(OAuth2IdTokenDecoderTest, AdvancedProtection) {
+  EXPECT_TRUE(gaia::ParseServiceFlags(kIdTokenAdvancedProtectionAccount)
+                  .is_under_advanced_protection);
+
+  gaia::TokenServiceFlags service_flags =
+      gaia::ParseServiceFlags(kIdTokenChildAndAdvancedProtectionAccount);
+  EXPECT_TRUE(service_flags.is_child_account);
+  EXPECT_TRUE(service_flags.is_under_advanced_protection);
 }
 
 }  // namespace
diff --git a/google_apis/gcm/tools/mcs_probe.cc b/google_apis/gcm/tools/mcs_probe.cc
index d4e6173..00f56eea 100644
--- a/google_apis/gcm/tools/mcs_probe.cc
+++ b/google_apis/gcm/tools/mcs_probe.cc
@@ -24,7 +24,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_clock.h"
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index e3d5d48..97ff699 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -4102,6 +4102,7 @@
     'decoder_func': 'DoFramebufferTextureMultiviewLayeredANGLE',
     'unit_test': False,
     'extension': 'ANGLE_multiview',
+    'extension_flag': 'angle_multiview',
     'trace_level': 1,
     'es3': True
   },
diff --git a/gpu/command_buffer/service/gl_context_virtual.cc b/gpu/command_buffer/service/gl_context_virtual.cc
index 05980b0..046489d6 100644
--- a/gpu/command_buffer/service/gl_context_virtual.cc
+++ b/gpu/command_buffer/service/gl_context_virtual.cc
@@ -110,6 +110,10 @@
 void GLContextVirtual::BackpressureFenceWait(uint64_t fence) {
   shared_context_->BackpressureFenceWait(fence);
 }
+
+void GLContextVirtual::FlushForDriverCrashWorkaround() {
+  shared_context_->FlushForDriverCrashWorkaround();
+}
 #endif
 
 GLContextVirtual::~GLContextVirtual() {
diff --git a/gpu/command_buffer/service/gl_context_virtual.h b/gpu/command_buffer/service/gl_context_virtual.h
index f0156ead..5ed61a9 100644
--- a/gpu/command_buffer/service/gl_context_virtual.h
+++ b/gpu/command_buffer/service/gl_context_virtual.h
@@ -50,6 +50,7 @@
 #if defined(OS_MACOSX)
   uint64_t BackpressureFenceCreate() override;
   void BackpressureFenceWait(uint64_t fence) override;
+  void FlushForDriverCrashWorkaround() override;
 #endif
 
  protected:
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 3d451369..b26f444 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -3390,11 +3390,6 @@
   }
   CHECK_GL_ERROR();
 
-  if (features().chromium_gpu_fence &&
-      group_->gpu_preferences().use_gpu_fences_for_overlay_planes) {
-    surface_->SetUsePlaneGpuFences();
-  }
-
   should_use_native_gmb_for_backbuffer_ =
       attrib_helper.should_use_native_gmb_for_backbuffer;
   if (should_use_native_gmb_for_backbuffer_) {
@@ -4039,6 +4034,7 @@
   // This is unconditionally true on mac, no need to test for it at runtime.
   caps.iosurface = true;
 #endif
+  caps.use_gpu_fences_for_overlay_planes = surface_->SupportsPlaneGpuFences();
 
   caps.post_sub_buffer = supports_post_sub_buffer_;
   caps.swap_buffers_with_bounds = supports_swap_buffers_with_bounds_;
@@ -4099,8 +4095,6 @@
       feature_info_->feature_flags().chromium_texture_storage_image;
   caps.supports_oop_raster = false;
   caps.chromium_gpu_fence = feature_info_->feature_flags().chromium_gpu_fence;
-  caps.use_gpu_fences_for_overlay_planes =
-      group_->gpu_preferences().use_gpu_fences_for_overlay_planes;
   caps.unpremultiply_and_dither_copy =
       feature_info_->feature_flags().unpremultiply_and_dither_copy;
   caps.texture_target_exception_list =
@@ -5690,6 +5684,13 @@
     }
   }
 
+#if defined(OS_MACOSX)
+  // Aggressively call glFlush on macOS. This is the only fix that has been
+  // found so far to avoid crashes on Intel drivers.
+  // https://crbug.com/863817
+  context_->FlushForDriverCrashWorkaround();
+#endif
+
   *entries_processed = process_pos;
 
   if (error::IsError(result)) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index bbeae24..1ae0a8da 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5349,6 +5349,10 @@
       *static_cast<
           const volatile gles2::cmds::FramebufferTextureMultiviewLayeredANGLE*>(
           cmd_data);
+  if (!features().angle_multiview) {
+    return error::kUnknownCommand;
+  }
+
   GLenum target = static_cast<GLenum>(c.target);
   GLenum attachment = static_cast<GLenum>(c.attachment);
   GLuint texture = static_cast<GLuint>(c.texture);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
index c4c7429e..8b98c63 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4728,6 +4728,10 @@
       *static_cast<
           const volatile gles2::cmds::FramebufferTextureMultiviewLayeredANGLE*>(
           cmd_data);
+  if (!features().angle_multiview) {
+    return error::kUnknownCommand;
+  }
+
   GLenum target = static_cast<GLenum>(c.target);
   GLenum attachment = static_cast<GLenum>(c.attachment);
   GLuint texture = static_cast<GLuint>(c.texture);
diff --git a/gpu/command_buffer/service/service_utils.cc b/gpu/command_buffer/service/service_utils.cc
index 2e2eb87..468e145 100644
--- a/gpu/command_buffer/service/service_utils.cc
+++ b/gpu/command_buffer/service/service_utils.cc
@@ -165,8 +165,6 @@
       command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds);
   gpu_preferences.ignore_gpu_blacklist =
       command_line->HasSwitch(switches::kIgnoreGpuBlacklist);
-  gpu_preferences.use_gpu_fences_for_overlay_planes =
-      command_line->HasSwitch(switches::kUseGpuFencesForOverlayPlanes);
   return gpu_preferences;
 }
 
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc
index 6b9f27d8..b2b52ec 100644
--- a/gpu/config/gpu_finch_features.cc
+++ b/gpu/config/gpu_finch_features.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 #include "gpu/config/gpu_finch_features.h"
 
-#include "build/build_config.h"
-
 namespace features {
 
 // Enable GPU Rasterization by default. This can still be overridden by
@@ -41,4 +39,10 @@
 const base::Feature kDirectCompositionOverlays{
     "DirectCompositionOverlays", base::FEATURE_ENABLED_BY_DEFAULT};
 
+#if defined(OS_ANDROID)
+// Use android AImageReader when playing videos with MediaPlayer.
+const base::Feature kAImageReaderMediaPlayer{"AImageReaderMediaPlayer",
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
 }  // namespace features
diff --git a/gpu/config/gpu_finch_features.h b/gpu/config/gpu_finch_features.h
index 8573fcef..3f7aa38 100644
--- a/gpu/config/gpu_finch_features.h
+++ b/gpu/config/gpu_finch_features.h
@@ -9,6 +9,7 @@
 #define GPU_CONFIG_GPU_FEATURES_H_
 
 #include "base/feature_list.h"
+#include "build/build_config.h"
 #include "gpu/gpu_export.h"
 
 namespace features {
@@ -23,6 +24,10 @@
 
 GPU_EXPORT extern const base::Feature kDirectCompositionOverlays;
 
+#if defined(OS_ANDROID)
+GPU_EXPORT extern const base::Feature kAImageReaderMediaPlayer;
+#endif  // defined(OS_ANDROID)
+
 }  // namespace features
 
 #endif  // GPU_CONFIG_GPU_FEATURES_H_
diff --git a/gpu/config/gpu_preferences.h b/gpu/config/gpu_preferences.h
index 9261ac2..bf5e295f 100644
--- a/gpu/config/gpu_preferences.h
+++ b/gpu/config/gpu_preferences.h
@@ -197,9 +197,6 @@
   bool enable_oop_rasterization = false;
   bool disable_oop_rasterization = false;
 
-  // Use GpuFence objects to synchronize display of overlay planes.
-  bool use_gpu_fences_for_overlay_planes = false;
-
   // Start the watchdog suspended, as the app is already backgrounded and won't
   // send a background/suspend signal.
   bool watchdog_starts_backgrounded = false;
@@ -207,6 +204,11 @@
   // Use Vulkan for rasterization and display compositing.
   bool enable_vulkan = false;
 
+  // ===================================
+  // Settings from //cc/base/switches.h
+  // Enable the GPU benchmarking extension; used by tests only.
+  bool enable_gpu_benchmarking_extension = false;
+
   // Please update gpu_preferences_unittest.cc when making additions or
   // changes to this struct.
 };
diff --git a/gpu/config/gpu_preferences_unittest.cc b/gpu/config/gpu_preferences_unittest.cc
index d5493e2..6ec40437 100644
--- a/gpu/config/gpu_preferences_unittest.cc
+++ b/gpu/config/gpu_preferences_unittest.cc
@@ -57,6 +57,7 @@
             right.enable_threaded_texture_mailboxes);
   EXPECT_EQ(left.gl_shader_interm_output, right.gl_shader_interm_output);
   EXPECT_EQ(left.emulate_shader_precision, right.emulate_shader_precision);
+  EXPECT_EQ(left.max_active_webgl_contexts, right.max_active_webgl_contexts);
   EXPECT_EQ(left.enable_gpu_service_logging, right.enable_gpu_service_logging);
   EXPECT_EQ(left.enable_gpu_service_tracing, right.enable_gpu_service_tracing);
   EXPECT_EQ(left.use_passthrough_cmd_decoder,
@@ -70,11 +71,11 @@
   EXPECT_EQ(left.ignore_gpu_blacklist, right.ignore_gpu_blacklist);
   EXPECT_EQ(left.enable_oop_rasterization, right.enable_oop_rasterization);
   EXPECT_EQ(left.disable_oop_rasterization, right.disable_oop_rasterization);
-  EXPECT_EQ(left.use_gpu_fences_for_overlay_planes,
-            right.use_gpu_fences_for_overlay_planes);
   EXPECT_EQ(left.watchdog_starts_backgrounded,
             right.watchdog_starts_backgrounded);
   EXPECT_EQ(left.enable_vulkan, right.enable_vulkan);
+  EXPECT_EQ(left.enable_gpu_benchmarking_extension,
+            right.enable_gpu_benchmarking_extension);
 }
 
 }  // namespace
@@ -140,6 +141,7 @@
     GPU_PREFERENCES_FIELD(enable_threaded_texture_mailboxes, true)
     GPU_PREFERENCES_FIELD(gl_shader_interm_output, true)
     GPU_PREFERENCES_FIELD(emulate_shader_precision, true)
+    GPU_PREFERENCES_FIELD(max_active_webgl_contexts, 1)
     GPU_PREFERENCES_FIELD(enable_gpu_service_logging, true)
     GPU_PREFERENCES_FIELD(enable_gpu_service_tracing, true)
     GPU_PREFERENCES_FIELD(use_passthrough_cmd_decoder, true)
@@ -149,9 +151,9 @@
     GPU_PREFERENCES_FIELD(ignore_gpu_blacklist, true)
     GPU_PREFERENCES_FIELD(enable_oop_rasterization, true)
     GPU_PREFERENCES_FIELD(disable_oop_rasterization, true)
-    GPU_PREFERENCES_FIELD(use_gpu_fences_for_overlay_planes, true)
     GPU_PREFERENCES_FIELD(watchdog_starts_backgrounded, true)
     GPU_PREFERENCES_FIELD(enable_vulkan, true)
+    GPU_PREFERENCES_FIELD(enable_gpu_benchmarking_extension, true)
 
     input_prefs.texture_target_exception_list.emplace_back(
         gfx::BufferUsage::SCANOUT, gfx::BufferFormat::RGBA_8888);
diff --git a/gpu/config/gpu_switches.cc b/gpu/config/gpu_switches.cc
index 189b26b3..fbab0aa 100644
--- a/gpu/config/gpu_switches.cc
+++ b/gpu/config/gpu_switches.cc
@@ -42,10 +42,6 @@
 // devices.
 const char kShaderDiskCacheSizeKB[] = "shader-disk-cache-size-kb";
 
-// Use GpuFence objects to synchronize display of overlay planes.
-const char kUseGpuFencesForOverlayPlanes[] =
-    "use-gpu-fences-for-overlay-planes";
-
 // Set the antialiasing method used for webgl. (none, explicit, implicit, or
 // screenspace)
 const char kWebglAntialiasingMode[] = "webgl-antialiasing-mode";
diff --git a/gpu/config/gpu_switches.h b/gpu/config/gpu_switches.h
index 01765df..c43bdcb 100644
--- a/gpu/config/gpu_switches.h
+++ b/gpu/config/gpu_switches.h
@@ -18,7 +18,6 @@
 GPU_EXPORT extern const char kIgnoreGpuBlacklist[];
 GPU_EXPORT extern const char kMaxActiveWebGLContexts[];
 GPU_EXPORT extern const char kShaderDiskCacheSizeKB[];
-GPU_EXPORT extern const char kUseGpuFencesForOverlayPlanes[];
 GPU_EXPORT extern const char kWebglAntialiasingMode[];
 GPU_EXPORT extern const char kWebglMSAASampleCount[];
 GPU_EXPORT extern const char kDisableGpuProcessForDX12VulkanInfoCollection[];
diff --git a/gpu/ipc/client/gpu_channel_host.cc b/gpu/ipc/client/gpu_channel_host.cc
index e0d60cc1..a962e602 100644
--- a/gpu/ipc/client/gpu_channel_host.cc
+++ b/gpu/ipc/client/gpu_channel_host.cc
@@ -209,6 +209,10 @@
   return next_route_id_.GetNext();
 }
 
+void GpuChannelHost::CrashGpuProcessForTesting() {
+  Send(new GpuChannelMsg_CrashForTesting());
+}
+
 GpuChannelHost::~GpuChannelHost() = default;
 
 GpuChannelHost::Listener::RouteInfo::RouteInfo() = default;
diff --git a/gpu/ipc/client/gpu_channel_host.h b/gpu/ipc/client/gpu_channel_host.h
index 3522541..37fc4d8 100644
--- a/gpu/ipc/client/gpu_channel_host.h
+++ b/gpu/ipc/client/gpu_channel_host.h
@@ -136,6 +136,12 @@
   // Generate a route ID guaranteed to be unique for this channel.
   int32_t GenerateRouteID();
 
+  // Crashes the GPU process. This functionality is added here because
+  // of instability when creating a new tab just to navigate to
+  // chrome://gpucrash . This only works when running tests and is
+  // otherwise ignored.
+  void CrashGpuProcessForTesting();
+
  protected:
   friend class base::RefCountedThreadSafe<GpuChannelHost>;
   ~GpuChannelHost() override;
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index 1f50805..fdd4aaa 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -108,6 +108,7 @@
       "gpu_memory_buffer_impl_android_hardware_buffer.cc",
       "gpu_memory_buffer_impl_android_hardware_buffer.h",
     ]
+    visibility += [ "//media/gpu:gpu" ]
   }
 
   configs += [
@@ -135,8 +136,12 @@
 
   if (is_android) {
     sources += [
+      "android/android_image_reader_utils.cc",
+      "android/android_image_reader_utils.h",
       "android/scoped_surface_request_conduit.cc",
       "android/scoped_surface_request_conduit.h",
+      "android/surface_owner_android.cc",
+      "android/surface_owner_android.h",
       "gpu_surface_lookup.cc",
       "gpu_surface_lookup.h",
       "gpu_surface_tracker.cc",
diff --git a/gpu/ipc/common/android/android_image_reader_utils.cc b/gpu/ipc/common/android/android_image_reader_utils.cc
new file mode 100644
index 0000000..7bd2381
--- /dev/null
+++ b/gpu/ipc/common/android/android_image_reader_utils.cc
@@ -0,0 +1,117 @@
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/ipc/common/android/android_image_reader_utils.h"
+
+#include <android/native_window_jni.h>
+
+#include "ui/gl/gl_fence_android_native_fence_sync.h"
+#include "ui/gl/gl_fence_egl.h"
+#include "ui/gl/gl_image_ahardwarebuffer.h"
+
+namespace gpu {
+
+bool DeleteAImageAsync(AImage* image,
+                       base::android::AndroidImageReader* loader) {
+  // If there is no image to delete, there is no need to insert fence.
+  if (image == nullptr)
+    return true;
+
+  std::unique_ptr<gl::GLFenceAndroidNativeFenceSync> android_native_fence =
+      gl::GLFenceAndroidNativeFenceSync::CreateForGpuFence();
+  if (!android_native_fence) {
+    LOG(ERROR) << "Failed to create android native fence sync object.";
+    return false;
+  }
+  std::unique_ptr<gfx::GpuFence> gpu_fence =
+      android_native_fence->GetGpuFence();
+  if (!gpu_fence) {
+    LOG(ERROR) << "Unable to get a gpu fence object.";
+    return false;
+  }
+  gfx::GpuFenceHandle fence_handle =
+      gfx::CloneHandleForIPC(gpu_fence->GetGpuFenceHandle());
+  if (fence_handle.is_null()) {
+    LOG(ERROR) << "Gpu fence handle is null";
+    return false;
+  }
+  base::ScopedFD fence_fd(fence_handle.native_fd.fd);
+
+  // Delete the image synchronously. Release the fence_fd as below api will own
+  // it and ensure that the file descriptor is closed properly.
+  loader->AImage_deleteAsync(image, fence_fd.release());
+  return true;
+}
+
+bool InsertEglFenceAndWait(base::ScopedFD acquire_fence_fd) {
+  int fence_fd = acquire_fence_fd.release();
+
+  // If fence_fd is -1, we do not need synchronization fence and image is ready
+  // to be used immediately. Also we dont need to close any fd. Else we need to
+  // create a sync fence which is used to signal when the buffer is ready to be
+  // consumed.
+  if (fence_fd == -1)
+    return true;
+
+  // Create attribute-value list with the fence_fd.
+  EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_FD_ANDROID, fence_fd, EGL_NONE};
+
+  // Create and insert the fence sync gl command using the helper class in
+  // gl_fence_egl.h. This method takes the ownership of the file descriptor if
+  // it succeeds.
+  std::unique_ptr<gl::GLFenceEGL> egl_fence(
+      gl::GLFenceEGL::Create(EGL_SYNC_NATIVE_FENCE_ANDROID, attribs));
+
+  // If above method fails to create an egl_fence, we need to close the file
+  // descriptor.
+  if (egl_fence == nullptr) {
+    // Create a scoped FD to close fence_fd.
+    base::ScopedFD temp_fd(fence_fd);
+    LOG(ERROR) << " Failed to created egl fence object ";
+    return false;
+  }
+
+  // Make the server wait and not the client.
+  egl_fence->ServerWait();
+  return true;
+}
+
+bool CreateAndBindEglImage(const AImage* image,
+                           GLuint texture_id,
+                           base::android::AndroidImageReader* loader) {
+  // Get the hardware buffer from the image.
+  AHardwareBuffer* buffer = nullptr;
+  DCHECK(image);
+  if (loader->AImage_getHardwareBuffer(image, &buffer) != AMEDIA_OK) {
+    LOG(ERROR) << "hardware buffer is null";
+    return false;
+  }
+
+  // Create a egl image from the hardware buffer. Get the image size to create
+  // egl image.
+  int32_t image_height = 0, image_width = 0;
+  if (loader->AImage_getWidth(image, &image_width) != AMEDIA_OK) {
+    LOG(ERROR) << "image width is null OR image has been deleted";
+    return false;
+  }
+  if (loader->AImage_getHeight(image, &image_height) != AMEDIA_OK) {
+    LOG(ERROR) << "image height is null OR image has been deleted";
+    return false;
+  }
+  gfx::Size image_size(image_width, image_height);
+  auto egl_image = base::MakeRefCounted<gl::GLImageAHardwareBuffer>(image_size);
+  if (!egl_image->Initialize(buffer, false)) {
+    LOG(ERROR) << "Failed to create EGL image ";
+    return false;
+  }
+
+  // Now bind this egl image to the texture target GL_TEXTURE_EXTERNAL_OES. Note
+  // that once the egl image is bound, it can be destroyed safely without
+  // affecting the rendering using this texture image.
+  glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id);
+  egl_image->BindTexImage(GL_TEXTURE_EXTERNAL_OES);
+  return true;
+}
+
+}  // namespace gpu
diff --git a/gpu/ipc/common/android/android_image_reader_utils.h b/gpu/ipc/common/android/android_image_reader_utils.h
new file mode 100644
index 0000000..8365a1d
--- /dev/null
+++ b/gpu/ipc/common/android/android_image_reader_utils.h
@@ -0,0 +1,32 @@
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_IPC_COMMON_ANDROID_ANDROID_IMAGE_READER_UTILS_H_
+#define GPU_IPC_COMMON_ANDROID_ANDROID_IMAGE_READER_UTILS_H_
+
+#include <android/hardware_buffer.h>
+
+#include "base/android/android_image_reader_compat.h"
+#include "base/files/scoped_file.h"
+#include "ui/gl/gl_bindings.h"
+
+namespace gpu {
+
+// Delete the AImage asynchronously by inserting an android native fence sync.
+bool DeleteAImageAsync(AImage* image,
+                       base::android::AndroidImageReader* loader);
+
+// Create and insert an EGL fence using the provided fence fd.
+bool InsertEglFenceAndWait(base::ScopedFD acquire_fence_fd);
+
+// Create an EGL image from the AImage via AHardwarebuffer. Bind this EGL image
+// to the texture target target_id. This changes the texture binding on the
+// current context.
+bool CreateAndBindEglImage(const AImage* image,
+                           GLuint texture_id,
+                           base::android::AndroidImageReader* loader);
+
+}  // namespace gpu
+
+#endif  // GPU_IPC_COMMON_ANDROID_ANDROID_IMAGE_READER_UTILS_H_
diff --git a/gpu/ipc/common/android/scoped_surface_request_conduit.h b/gpu/ipc/common/android/scoped_surface_request_conduit.h
index d5b33933..2ccbaf0 100644
--- a/gpu/ipc/common/android/scoped_surface_request_conduit.h
+++ b/gpu/ipc/common/android/scoped_surface_request_conduit.h
@@ -6,29 +6,26 @@
 #define GPU_IPC_COMMON_ANDROID_SCOPED_SURFACE_REQUEST_CONDUIT_H_
 
 #include "gpu/gpu_export.h"
+#include "gpu/ipc/common/android/surface_owner_android.h"
 
 namespace base {
 class UnguessableToken;
 }
 
-namespace gl {
-class SurfaceTexture;
-}
-
 namespace gpu {
 
-// Allows the forwarding of SurfaceTextures from the GPU or the browser process
+// Allows the forwarding of SurfaceOwners from the GPU or the browser process
 // to fulfill requests registered by the ScopedSurfaceRequestManager.
 class GPU_EXPORT ScopedSurfaceRequestConduit {
  public:
   static ScopedSurfaceRequestConduit* GetInstance();
   static void SetInstance(ScopedSurfaceRequestConduit* instance);
 
-  // Sends the surface texture to the ScopedSurfaceRequestManager in the browser
+  // Sends the surface owner to the ScopedSurfaceRequestManager in the browser
   // process, to fulfill the request registered under the |request_token| key.
-  virtual void ForwardSurfaceTextureForSurfaceRequest(
+  virtual void ForwardSurfaceOwnerForSurfaceRequest(
       const base::UnguessableToken& request_token,
-      const gl::SurfaceTexture* surface_texture) = 0;
+      const SurfaceOwner* surface_owner) = 0;
 
  protected:
   virtual ~ScopedSurfaceRequestConduit() {}
diff --git a/gpu/ipc/common/android/surface_owner_android.cc b/gpu/ipc/common/android/surface_owner_android.cc
new file mode 100644
index 0000000..211eb88
--- /dev/null
+++ b/gpu/ipc/common/android/surface_owner_android.cc
@@ -0,0 +1,278 @@
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/ipc/common/android/surface_owner_android.h"
+
+#include "base/android/jni_android.h"
+#include "base/feature_list.h"
+#include "base/logging.h"
+#include "base/metrics/histogram_functions.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "gpu/config/gpu_finch_features.h"
+#include "gpu/ipc/common/android/android_image_reader_utils.h"
+#include "ui/gl/android/surface_texture.h"
+#include "ui/gl/gl_fence_android_native_fence_sync.h"
+#include "ui/gl/gl_image_ahardwarebuffer.h"
+
+namespace gpu {
+namespace {
+
+// Surface Texture based implementation.
+class SurfaceTexture : public SurfaceOwner {
+ public:
+  explicit SurfaceTexture(uint32_t texture_id);
+  ~SurfaceTexture() override;
+
+  void SetFrameAvailableCallback(
+      const base::RepeatingClosure& callback) override;
+  gl::ScopedJavaSurface CreateJavaSurface() const override;
+  void GetTransformMatrix(float mtx[16]) override;
+  void UpdateTexImage() override;
+
+ private:
+  scoped_refptr<gl::SurfaceTexture> surface_texture_;
+
+  DISALLOW_COPY_AND_ASSIGN(SurfaceTexture);
+};
+
+SurfaceTexture::SurfaceTexture(uint32_t texture_id)
+    : surface_texture_(gl::SurfaceTexture::Create(texture_id)) {}
+
+void SurfaceTexture::SetFrameAvailableCallback(
+    const base::RepeatingClosure& callback) {
+  surface_texture_->SetFrameAvailableCallback(callback);
+}
+
+gl::ScopedJavaSurface SurfaceTexture::CreateJavaSurface() const {
+  return gl::ScopedJavaSurface(surface_texture_.get());
+}
+
+void SurfaceTexture::GetTransformMatrix(float mtx[]) {
+  surface_texture_->GetTransformMatrix(mtx);
+}
+
+void SurfaceTexture::UpdateTexImage() {
+  surface_texture_->UpdateTexImage();
+}
+
+SurfaceTexture::~SurfaceTexture() = default;
+
+// ImageReader based implementation.
+class ImageReader : public SurfaceOwner {
+ public:
+  explicit ImageReader(uint32_t texture_id);
+  ~ImageReader() override;
+
+  void SetFrameAvailableCallback(
+      const base::RepeatingClosure& callback) override;
+  gl::ScopedJavaSurface CreateJavaSurface() const override;
+  void GetTransformMatrix(float mtx[16]) override;
+  void UpdateTexImage() override;
+
+ private:
+  static void CallbackSignal(void* context, AImageReader* reader);
+
+  // AImageReader instance
+  AImageReader* image_reader_ = nullptr;
+
+  // Image which was last acquired by the image reader. This needs to be saved
+  // so that it can be deleted later.
+  AImage* current_image_ = nullptr;
+
+  GLuint texture_id_;
+
+  // reference to the class instance which is used to dynamically
+  // load the functions in android libraries at runtime.
+  base::android::AndroidImageReader& loader_;
+
+  // Frame available callback handling. ImageListner registered with
+  // AImageReader is notified when there is a new frame available which
+  // in turns runs the callback function on correct thread using task_runner.
+  base::RepeatingClosure callback_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageReader);
+};
+
+ImageReader::ImageReader(GLuint texture_id)
+    : texture_id_(texture_id),
+      loader_(base::android::AndroidImageReader::GetInstance()) {
+  // Set the width, height and format to some default value. This parameters
+  // are/maybe overriden by the producer sending buffers to this imageReader's
+  // Surface.
+  int32_t width = 1, height = 1, max_images = 3;
+  AIMAGE_FORMATS format = AIMAGE_FORMAT_YUV_420_888;
+  AImageReader* reader = nullptr;
+
+  // Create a new reader for images of the desired size and format.
+  media_status_t return_code =
+      loader_.AImageReader_new(width, height, format, max_images, &reader);
+  if (return_code != AMEDIA_OK) {
+    LOG(ERROR) << " Image reader creation failed.";
+    if (return_code == AMEDIA_ERROR_INVALID_PARAMETER) {
+      LOG(ERROR) << "Either reader is NULL, or one or more of width, height, "
+                    "format, maxImages arguments is not supported";
+    } else
+      LOG(ERROR) << "unknown error";
+    return;
+  }
+  DCHECK(reader);
+  image_reader_ = reader;
+}
+
+// This callback function will be called when there is a new image available
+// for in the image reader's queue.
+void ImageReader::CallbackSignal(void* context, AImageReader* reader) {
+  ImageReader* image_reader_ptr = reinterpret_cast<ImageReader*>(context);
+  if (image_reader_ptr->task_runner_->BelongsToCurrentThread()) {
+    image_reader_ptr->callback_.Run();
+  } else {
+    image_reader_ptr->task_runner_->PostTask(FROM_HERE,
+                                             image_reader_ptr->callback_);
+  }
+}
+
+void ImageReader::SetFrameAvailableCallback(
+    const base::RepeatingClosure& callback) {
+  callback_ = callback;
+  task_runner_ = base::ThreadTaskRunnerHandle::Get();
+
+  // Create a new Image Listner.
+  AImageReader_ImageListener listener;
+  listener.context = reinterpret_cast<void*>(this);
+  listener.onImageAvailable = &ImageReader::CallbackSignal;
+
+  // Set the onImageAvailable listener of this image reader.
+  if (loader_.AImageReader_setImageListener(image_reader_, &listener) !=
+      AMEDIA_OK) {
+    LOG(ERROR) << " Failed to register AImageReader listener";
+    return;
+  }
+}
+
+ImageReader::~ImageReader() {
+  loader_.AImageReader_setImageListener(image_reader_, NULL);
+
+  // Delete the image before closing the associated image reader.
+  if (current_image_)
+    loader_.AImage_delete(current_image_);
+
+  // Delete the image reader.
+  loader_.AImageReader_delete(image_reader_);
+}
+
+gl::ScopedJavaSurface ImageReader::CreateJavaSurface() const {
+  // Get the android native window from the image reader.
+  ANativeWindow* window = nullptr;
+  if (loader_.AImageReader_getWindow(image_reader_, &window) != AMEDIA_OK) {
+    LOG(ERROR) << "unable to get a window from image reader.";
+    return gl::ScopedJavaSurface::AcquireExternalSurface(nullptr);
+  }
+
+  // Get the java surface object from the Android native window.
+  JNIEnv* env = base::android::AttachCurrentThread();
+  jobject j_surface = loader_.ANativeWindow_toSurface(env, window);
+  DCHECK(j_surface);
+
+  // Get the scoped java surface that is owned externally.
+  return gl::ScopedJavaSurface::AcquireExternalSurface(j_surface);
+}
+
+void ImageReader::UpdateTexImage() {
+  DCHECK(image_reader_);
+
+  // Acquire the latest image asynchronously
+  AImage* image = nullptr;
+  int acquire_fence_fd = -1;
+  media_status_t return_code = AMEDIA_OK;
+
+  // This method duplicates the fence file descriptor and the caller is
+  // responsible for closing the returend file descriptor.
+  return_code = loader_.AImageReader_acquireLatestImageAsync(
+      image_reader_, &image, &acquire_fence_fd);
+
+  // Log the error return code.
+  if (return_code != AMEDIA_OK) {
+    base::UmaHistogramSparse("GPU.SurfaceOwner.AImageReader.AcquireImageResult",
+                             return_code);
+  }
+
+  // TODO(http://crbug.com/846050).
+  // Need to add some better error handling if below error occurs. Currently we
+  // just return if error occurs.
+  switch (return_code) {
+    case AMEDIA_ERROR_INVALID_PARAMETER:
+      LOG(ERROR) << " Image is NULL";
+      return;
+    case AMEDIA_IMGREADER_MAX_IMAGES_ACQUIRED:
+      LOG(ERROR)
+          << "number of concurrently acquired images has reached the limit";
+      return;
+    case AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE:
+      LOG(ERROR) << "no buffers currently available in the reader queue";
+      return;
+    case AMEDIA_ERROR_UNKNOWN:
+      LOG(ERROR) << "method fails for some other reasons";
+      return;
+    case AMEDIA_OK:
+      // Method call succeeded.
+      break;
+    default:
+      // No other error code should be returned.
+      NOTREACHED();
+      return;
+  }
+  base::ScopedFD scoped_acquire_fence_fd(acquire_fence_fd);
+
+  // If there is no new image simply return. At this point previous image will
+  // still be bound to the texture.
+  if (!image) {
+    return;
+  }
+
+  // If we have a new Image, delete the previously acquired image.
+  if (!gpu::DeleteAImageAsync(current_image_, &loader_))
+    return;
+
+  // Make the newly acuired image as current image.
+  current_image_ = image;
+
+  if (!gpu::InsertEglFenceAndWait(std::move(scoped_acquire_fence_fd)))
+    return;
+
+  // Create EGL image from the AImage and bind it to the texture.
+  if (!gpu::CreateAndBindEglImage(current_image_, texture_id_, &loader_))
+    return;
+}
+
+void ImageReader::GetTransformMatrix(float mtx[]) {
+  // Assign a Y inverted Identity matrix. MediaPlayer path performs a Y
+  // inversion of this matrix later. Hence if we assign a Y inverted matrix
+  // here, it simply becomes an identity matrix later and will have no effect
+  // on the image data.
+  static constexpr float kYInvertedIdentity[16]{1, 0, 0, 0, 0, -1, 0, 0,
+                                                0, 0, 1, 0, 0, 1,  0, 1};
+  memcpy(mtx, kYInvertedIdentity, sizeof(kYInvertedIdentity));
+}
+
+}  // anonymous namespace
+
+// Interface definitions.
+SurfaceOwner::SurfaceOwner() = default;
+SurfaceOwner::~SurfaceOwner() = default;
+
+// Static.
+std::unique_ptr<SurfaceOwner> SurfaceOwner::Create(uint32_t texture_id) {
+  // Use AImageReader if its supported and is enabled by the feature flag.
+  if (base::FeatureList::IsEnabled(features::kAImageReaderMediaPlayer) &&
+      base::android::AndroidImageReader::GetInstance().IsSupported()) {
+    return std::make_unique<ImageReader>(texture_id);
+  }
+
+  // If not, fall back to legacy path of using SurfaceTexture.
+  return std::make_unique<SurfaceTexture>(texture_id);
+}
+
+}  // namespace gpu
diff --git a/gpu/ipc/common/android/surface_owner_android.h b/gpu/ipc/common/android/surface_owner_android.h
new file mode 100644
index 0000000..00943ffb
--- /dev/null
+++ b/gpu/ipc/common/android/surface_owner_android.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef GPU_IPC_COMMON_ANDROID_SURFACE_OWNER_ANDROID_H_
+#define GPU_IPC_COMMON_ANDROID_SURFACE_OWNER_ANDROID_H_
+
+#include <memory>
+
+#include "base/android/android_image_reader_compat.h"
+#include "base/memory/ref_counted.h"
+#include "gpu/gpu_export.h"
+#include "ui/gl/android/scoped_java_surface.h"
+
+namespace gpu {
+
+// This interface wraps the usage of surface and the associated OpenGL
+// texture_id. Surface owned by this class is used by OpenGL, MediaPlayer or
+// CameraDevice to draw into. Once a frame is drawn into the surface, the
+// associated callback function is run. The drawn frame can be used to update
+// the GL texture at target texture_id.
+class GPU_EXPORT SurfaceOwner {
+ public:
+  virtual ~SurfaceOwner();
+
+  // Creates a new SurfaceOwner with the provided texture id. This texture_id
+  // target will be updated when UpdateTexImage() is called.
+  static std::unique_ptr<SurfaceOwner> Create(uint32_t texture_id);
+
+  // Set the callback function to run when a new frame is available.
+  virtual void SetFrameAvailableCallback(
+      const base::RepeatingClosure& callback) = 0;
+
+  // Create a java surface for the SurfaceOwner.
+  virtual gl::ScopedJavaSurface CreateJavaSurface() const = 0;
+
+  // Transformation matrix if any associated with the texture image.
+  virtual void GetTransformMatrix(float mtx[16]) = 0;
+
+  // Update the texture image using the latest available image data.
+  virtual void UpdateTexImage() = 0;
+
+ protected:
+  SurfaceOwner();
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SurfaceOwner);
+};
+
+}  // namespace gpu
+
+#endif  // GPU_IPC_COMMON_ANDROID_SURFACE_OWNER_ANDROID_H_
diff --git a/gpu/ipc/common/gpu_messages.h b/gpu/ipc/common/gpu_messages.h
index dc3a96d7..f9ca1df2 100644
--- a/gpu/ipc/common/gpu_messages.h
+++ b/gpu/ipc/common/gpu_messages.h
@@ -97,6 +97,10 @@
 IPC_MESSAGE_CONTROL1(GpuChannelMsg_FlushCommandBuffers,
                      std::vector<gpu::FlushParams> /* flush_list */)
 
+// Crash the GPU process in similar way to how chrome://gpucrash does.
+// This is only supported in testing environments, and is otherwise ignored.
+IPC_MESSAGE_CONTROL0(GpuChannelMsg_CrashForTesting)
+
 // Simple NOP message which can be used as fence to ensure all previous sent
 // messages have been received.
 IPC_SYNC_MESSAGE_CONTROL0_0(GpuChannelMsg_Nop)
diff --git a/gpu/ipc/common/gpu_preferences.mojom b/gpu/ipc/common/gpu_preferences.mojom
index b467a10..dabdd96 100644
--- a/gpu/ipc/common/gpu_preferences.mojom
+++ b/gpu/ipc/common/gpu_preferences.mojom
@@ -62,7 +62,7 @@
   bool ignore_gpu_blacklist;
   bool enable_oop_rasterization;
   bool disable_oop_rasterization;
-  bool use_gpu_fences_for_overlay_planes;
   bool watchdog_starts_backgrounded;
   bool enable_vulkan;
+  bool enable_gpu_benchmarking_extension;
 };
diff --git a/gpu/ipc/common/gpu_preferences_struct_traits.h b/gpu/ipc/common/gpu_preferences_struct_traits.h
index 265911c4..5db91ae 100644
--- a/gpu/ipc/common/gpu_preferences_struct_traits.h
+++ b/gpu/ipc/common/gpu_preferences_struct_traits.h
@@ -118,10 +118,10 @@
     out->ignore_gpu_blacklist = prefs.ignore_gpu_blacklist();
     out->enable_oop_rasterization = prefs.enable_oop_rasterization();
     out->disable_oop_rasterization = prefs.disable_oop_rasterization();
-    out->use_gpu_fences_for_overlay_planes =
-        prefs.use_gpu_fences_for_overlay_planes();
     out->watchdog_starts_backgrounded = prefs.watchdog_starts_backgrounded();
     out->enable_vulkan = prefs.enable_vulkan();
+    out->enable_gpu_benchmarking_extension =
+        prefs.enable_gpu_benchmarking_extension();
     return true;
   }
 
@@ -255,16 +255,16 @@
   static bool disable_oop_rasterization(const gpu::GpuPreferences& prefs) {
     return prefs.disable_oop_rasterization;
   }
-  static bool use_gpu_fences_for_overlay_planes(
-      const gpu::GpuPreferences& prefs) {
-    return prefs.use_gpu_fences_for_overlay_planes;
-  }
   static bool watchdog_starts_backgrounded(const gpu::GpuPreferences& prefs) {
     return prefs.watchdog_starts_backgrounded;
   }
   static bool enable_vulkan(const gpu::GpuPreferences& prefs) {
     return prefs.enable_vulkan;
   }
+  static bool enable_gpu_benchmarking_extension(
+      const gpu::GpuPreferences& prefs) {
+    return prefs.enable_gpu_benchmarking_extension;
+  }
 };
 
 }  // namespace mojo
diff --git a/gpu/ipc/service/gpu_channel.cc b/gpu/ipc/service/gpu_channel.cc
index cf267e86..dfa9045 100644
--- a/gpu/ipc/service/gpu_channel.cc
+++ b/gpu/ipc/service/gpu_channel.cc
@@ -48,6 +48,7 @@
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_image_shared_memory.h"
 #include "ui/gl/gl_surface.h"
+#include "ui/gl/gl_utils.h"
 
 namespace gpu {
 namespace {
@@ -497,6 +498,7 @@
                         OnCreateCommandBuffer)
     IPC_MESSAGE_HANDLER(GpuChannelMsg_DestroyCommandBuffer,
                         OnDestroyCommandBuffer)
+    IPC_MESSAGE_HANDLER(GpuChannelMsg_CrashForTesting, OnCrashForTesting)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -680,6 +682,16 @@
   RemoveRoute(route_id);
 }
 
+void GpuChannel::OnCrashForTesting() {
+  // Only pay attention to this message if Telemetry's GPU
+  // benchmarking extension was enabled via the command line, which
+  // exposes privileged APIs to JavaScript.
+  if (!gpu_channel_manager_->gpu_preferences()
+           .enable_gpu_benchmarking_extension)
+    return;
+  gl::Crash();
+}
+
 void GpuChannel::CacheShader(const std::string& key,
                              const std::string& shader) {
   gpu_channel_manager_->delegate()->StoreShaderToDisk(client_id_, key, shader);
diff --git a/gpu/ipc/service/gpu_channel.h b/gpu/ipc/service/gpu_channel.h
index 4bed25c..35d61d09 100644
--- a/gpu/ipc/service/gpu_channel.h
+++ b/gpu/ipc/service/gpu_channel.h
@@ -191,6 +191,7 @@
                              gpu::ContextResult* result,
                              gpu::Capabilities* capabilities);
   void OnDestroyCommandBuffer(int32_t route_id);
+  void OnCrashForTesting();
 
   std::unique_ptr<FilteredSender> channel_;
 
diff --git a/gpu/ipc/service/stream_texture_android.cc b/gpu/ipc/service/stream_texture_android.cc
index 5edb157b5..7bff3841 100644
--- a/gpu/ipc/service/stream_texture_android.cc
+++ b/gpu/ipc/service/stream_texture_android.cc
@@ -56,7 +56,7 @@
 StreamTexture::StreamTexture(CommandBufferStub* owner_stub,
                              int32_t route_id,
                              uint32_t texture_id)
-    : surface_texture_(gl::SurfaceTexture::Create(texture_id)),
+    : surface_owner_(SurfaceOwner::Create(texture_id)),
       size_(0, 0),
       has_pending_frame_(false),
       owner_stub_(owner_stub),
@@ -67,7 +67,7 @@
   owner_stub->AddDestructionObserver(this);
   memset(current_matrix_, 0, sizeof(current_matrix_));
   owner_stub->channel()->AddRoute(route_id, owner_stub->sequence_id(), this);
-  surface_texture_->SetFrameAvailableCallback(base::Bind(
+  surface_owner_->SetFrameAvailableCallback(base::BindRepeating(
       &StreamTexture::OnFrameAvailable, weak_factory_.GetWeakPtr()));
 }
 
@@ -80,9 +80,9 @@
 
 // gpu::gles2::GLStreamTextureMatrix implementation
 void StreamTexture::GetTextureMatrix(float xform[16]) {
-  if (surface_texture_) {
+  if (surface_owner_) {
     UpdateTexImage();
-    surface_texture_->GetTransformMatrix(current_matrix_);
+    surface_owner_->GetTransformMatrix(current_matrix_);
   }
   memcpy(xform, current_matrix_, sizeof(current_matrix_));
   YInvertMatrix(xform);
@@ -96,7 +96,7 @@
 
   // If the owner goes away, there is no need to keep the SurfaceTexture around.
   // The GL texture will keep working regardless with the currently bound frame.
-  surface_texture_ = NULL;
+  surface_owner_ = NULL;
 }
 
 std::unique_ptr<ui::ScopedMakeCurrent> StreamTexture::MakeStubCurrent() {
@@ -112,14 +112,14 @@
 }
 
 void StreamTexture::UpdateTexImage() {
-  DCHECK(surface_texture_.get());
+  DCHECK(surface_owner_.get());
   DCHECK(owner_stub_);
 
   if (!has_pending_frame_) return;
 
   std::unique_ptr<ui::ScopedMakeCurrent> scoped_make_current(MakeStubCurrent());
 
-  surface_texture_->UpdateTexImage();
+  surface_owner_->UpdateTexImage();
 
   has_pending_frame_ = false;
 
@@ -143,7 +143,7 @@
   if (target != GL_TEXTURE_EXTERNAL_OES)
     return false;
 
-  if (!owner_stub_ || !surface_texture_.get())
+  if (!owner_stub_ || !surface_owner_.get())
     return false;
 
   GLint texture_id;
@@ -215,8 +215,8 @@
     return;
 
   ScopedSurfaceRequestConduit::GetInstance()
-      ->ForwardSurfaceTextureForSurfaceRequest(request_token,
-                                               surface_texture_.get());
+      ->ForwardSurfaceOwnerForSurfaceRequest(request_token,
+                                             surface_owner_.get());
 }
 
 bool StreamTexture::BindTexImage(unsigned target) {
diff --git a/gpu/ipc/service/stream_texture_android.h b/gpu/ipc/service/stream_texture_android.h
index 55ab496a..a284ae66 100644
--- a/gpu/ipc/service/stream_texture_android.h
+++ b/gpu/ipc/service/stream_texture_android.h
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/unguessable_token.h"
 #include "gpu/command_buffer/service/gl_stream_texture_image.h"
+#include "gpu/ipc/common/android/surface_owner_android.h"
 #include "gpu/ipc/service/command_buffer_stub.h"
 #include "ipc/ipc_listener.h"
 #include "ui/gl/android/surface_texture.h"
@@ -79,7 +80,7 @@
 
   void UpdateTexImage();
 
-  // Called when a new frame is available for the SurfaceTexture.
+  // Called when a new frame is available for the SurfaceOwner.
   void OnFrameAvailable();
 
   // IPC::Listener implementation:
@@ -90,12 +91,12 @@
   void OnForwardForSurfaceRequest(const base::UnguessableToken& request_token);
   void OnSetSize(const gfx::Size& size) { size_ = size; }
 
-  scoped_refptr<gl::SurfaceTexture> surface_texture_;
+  std::unique_ptr<SurfaceOwner> surface_owner_;
 
-  // Current transform matrix of the surface texture.
+  // Current transform matrix of the surface owner.
   float current_matrix_[16];
 
-  // Current size of the surface texture.
+  // Current size of the surface owner.
   gfx::Size size_;
 
   // Whether a new frame is available that we should update to.
diff --git a/headless/app/headless_shell.cc b/headless/app/headless_shell.cc
index eb8efd1a..d45c9b1f 100644
--- a/headless/app/headless_shell.cc
+++ b/headless/app/headless_shell.cc
@@ -22,7 +22,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "build/build_config.h"
 #include "cc/base/switches.h"
diff --git a/headless/lib/browser/headless_url_request_context_getter.cc b/headless/lib/browser/headless_url_request_context_getter.cc
index 9b029cc..65ebe49 100644
--- a/headless/lib/browser/headless_url_request_context_getter.cc
+++ b/headless/lib/browser/headless_url_request_context_getter.cc
@@ -8,7 +8,7 @@
 #include <utility>
 #include <vector>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "components/cookie_config/cookie_store_util.h"
 #include "content/public/browser/browser_thread.h"
diff --git a/headless/public/headless_browser.cc b/headless/public/headless_browser.cc
index b9343cc..22d2dc95 100644
--- a/headless/public/headless_browser.cc
+++ b/headless/public/headless_browser.cc
@@ -34,17 +34,7 @@
 Options::Options(int argc, const char** argv)
     : argc(argc),
       argv(argv),
-#if defined(USE_OZONE)
-      // TODO(skyostil): Implement SwiftShader backend for headless ozone.
-      gl_implementation("osmesa"),
-#elif defined(OS_WIN)
-      // TODO(skyostil): Enable SwiftShader on Windows (crbug.com/729961).
-      gl_implementation("osmesa"),
-#elif !defined(OS_MACOSX)
       gl_implementation("swiftshader-webgl"),
-#else
-      gl_implementation("any"),
-#endif
       product_name_and_version(GetProductNameAndVersion()),
       user_agent(content::BuildUserAgentFromProduct(product_name_and_version)),
       window_size(kDefaultWindowSize),
diff --git a/headless/test/data/protocol/emulation/compositor-basic-raf-expected.txt b/headless/test/data/protocol/emulation/compositor-basic-raf-expected.txt
index ba9193c..c6e71e81 100644
--- a/headless/test/data/protocol/emulation/compositor-basic-raf-expected.txt
+++ b/headless/test/data/protocol/emulation/compositor-basic-raf-expected.txt
@@ -1,6 +1,5 @@
 Tests compositor basic rAF operation.
 Advanced to 10ms
-Advanced to 510ms
 Advanced to 1000ms
 Elasped time: 1000
 Requesting first animation frame
diff --git a/infra/config/global/OWNERS b/infra/config/global/OWNERS
index a2b6590..51ba2f2 100644
--- a/infra/config/global/OWNERS
+++ b/infra/config/global/OWNERS
@@ -3,6 +3,7 @@
 hinoka@chromium.org
 iannucci@chromium.org
 jchinlee@chromium.org
+maruel@chromium.org
 nodir@chromium.org
 smut@google.com
 tandrii@chromium.org
diff --git a/infra/config/global/cr-buildbucket-dev.cfg b/infra/config/global/cr-buildbucket-dev.cfg
index 44843552..6eaa6108 100644
--- a/infra/config/global/cr-buildbucket-dev.cfg
+++ b/infra/config/global/cr-buildbucket-dev.cfg
@@ -19,6 +19,29 @@
 }
 
 acl_sets {
+  # This is pure-LUCI CI w/o buildbot.
+  name: "ci"
+  acls {
+    role: READER
+    group: "all"
+  }
+  acls {
+    role: SCHEDULER
+    identity: "luci-scheduler-dev@appspot.gserviceaccount.com"
+  }
+  acls {
+    role: SCHEDULER
+    # Support builder triggering other builders in the same bucket.
+    identity: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+  }
+  acls {
+    # Allow task force to bump next build number.
+    role: WRITER
+    group: "google/luci-task-force@google.com"
+  }
+}
+
+acl_sets {
   name: "tryserver"
   acls {
     role: READER
@@ -66,6 +89,68 @@
   }
 }
 
+builder_mixins {
+  name: "swarm-ci"
+  recipe {
+    name: "swarming/staging"
+    properties: "mastername:chromium.swarm"
+  }
+}
+
+buckets {
+  name: "luci.chromium.ci"
+
+  acl_sets: "ci"
+
+  swarming {
+    hostname: "chromium-swarm-dev.appspot.com"
+
+    builder_defaults {
+      category: "Chromium"
+      dimensions: "cpu:x86-64"
+      dimensions: "pool:Chrome"
+      execution_timeout_secs: 10800  # 3h
+      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      build_numbers: YES
+      recipe {
+        cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
+        cipd_version: "refs/heads/master"
+        name: "chromium"
+      }
+    }
+    builders {
+      name: "Windows Swarm"
+      dimensions: "os:Windows-10"
+      mixins: "swarm-ci"
+    }
+    builders {
+      name: "Android N5X Swarm"
+      dimensions: "os:Ubuntu-14.04"
+      mixins: "swarm-ci"
+    }
+    builders {
+      name: "ChromeOS Swarm"
+      dimensions: "os:Ubuntu-14.04"
+      mixins: "swarm-ci"
+    }
+    builders {
+      name: "Mac Swarm"
+      dimensions: "os:Mac-10.13"
+      mixins: "swarm-ci"
+    }
+    builders {
+      name: "Linux Swarm"
+      dimensions: "os:Ubuntu-14.04"
+      mixins: "swarm-ci"
+    }
+    builders {
+      name: "Android N5 Swarm"
+      dimensions: "os:Ubuntu-14.04"
+      mixins: "swarm-ci"
+    }
+  }
+}
+
 buckets {
   name: "luci.chromium.try"
 
diff --git a/infra/config/global/cr-buildbucket.cfg b/infra/config/global/cr-buildbucket.cfg
index 7e7cf81..fe1b407 100644
--- a/infra/config/global/cr-buildbucket.cfg
+++ b/infra/config/global/cr-buildbucket.cfg
@@ -434,14 +434,6 @@
 }
 
 builder_mixins {
-  name: "swarm-ci"
-  recipe {
-    name: "swarming/staging"
-    properties: "mastername:chromium.swarm"
-  }
-}
-
-builder_mixins {
   name: "webkit-ci"
   recipe {
     properties: "mastername:chromium.webkit"
@@ -1307,6 +1299,12 @@
 
     # Win bots.
     builders {
+      name: "win-asan"
+      dimensions: "os:Windows-10"
+      dimensions: "cores:32"
+      mixins: "memory-ci"
+    }
+    builders {
       name: "win-jumbo-rel"
       mixins: "win-ci"
     }
@@ -1661,11 +1659,6 @@
       mixins: "memory-ci"
     }
     builders {
-      name: "Windows Swarm"
-      dimensions: "os:Windows-10"
-      mixins: "swarm-ci"
-    }
-    builders {
       name: "Android Cronet Lollipop Builder"
       dimensions: "os:Ubuntu-14.04"
       dimensions: "device_os:LMY48I"
@@ -1698,11 +1691,6 @@
       mixins: "lkgr-ci"
     }
     builders {
-      name: "Android N5X Swarm"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "swarm-ci"
-    }
-    builders {
       name: "Android Cronet x86 Builder"
       dimensions: "os:Ubuntu-14.04"
       mixins: "android-ci"
@@ -1768,11 +1756,6 @@
       mixins: "memory-ci"
     }
     builders {
-      name: "ChromeOS Swarm"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "swarm-ci"
-    }
-    builders {
       name: "Win ASan Release"
       dimensions: "os:Windows-10"
       mixins: "lkgr-ci"
@@ -1795,11 +1778,6 @@
       mixins: "fyi-ci"
     }
     builders {
-      name: "Mac Swarm"
-      dimensions: "os:Mac-10.13"
-      mixins: "swarm-ci"
-    }
-    builders {
       name: "MSAN Release (no origins)"
       dimensions: "os:Ubuntu-14.04"
       mixins: "lkgr-ci"
@@ -1821,11 +1799,6 @@
       mixins: "fyi-ci"
     }
     builders {
-      name: "Linux Swarm"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "swarm-ci"
-    }
-    builders {
       name: "Jumbo Mac"
       dimensions: "os:Mac-10.13"
       dimensions: "cores:4"
@@ -2135,11 +2108,6 @@
       mixins: "webkit-ci"
     }
     builders {
-      name: "Android N5 Swarm"
-      dimensions: "os:Ubuntu-14.04"
-      mixins: "swarm-ci"
-    }
-    builders {
       name: "win32-rel"
       dimensions: "os:Windows-10"
       dimensions: "cores:32"
diff --git a/infra/config/global/luci-milo-dev.cfg b/infra/config/global/luci-milo-dev.cfg
index c1c9892..76e0df3 100644
--- a/infra/config/global/luci-milo-dev.cfg
+++ b/infra/config/global/luci-milo-dev.cfg
@@ -1114,11 +1114,6 @@
     short_name: "go"
   }
   builders: {
-    name: "buildbot/chromium.perf/Android One Perf"
-    category: "perf|android"
-    short_name: "one"
-  }
-  builders: {
     name: "buildbot/chromium.perf/Android Nexus5X WebView Perf"
     category: "perf|android|webview"
     short_name: "N5X"
@@ -1731,26 +1726,6 @@
     short_name: "lto"
   }
   builders: {
-    name: "buildbot/chromium.clang/CrWinClangLLD"
-    category: "ToT Windows|LLD"
-    short_name: "rel"
-  }
-  builders: {
-    name: "buildbot/chromium.clang/CrWinClngLLDdbg"
-    category: "ToT Windows|LLD"
-    short_name: "dbg"
-  }
-  builders: {
-    name: "buildbot/chromium.clang/CrWinClangLLD64"
-    category: "ToT Windows|LLD|x64"
-    short_name: "rel"
-  }
-  builders: {
-    name: "buildbot/chromium.clang/CrWinClngLLD64dbg"
-    category: "ToT Windows|LLD|x64"
-    short_name: "dbg"
-  }
-  builders: {
     name: "buildbot/chromium.clang/CrWinAsan"
     category: "ToT Windows|Asan"
     short_name: "asn"
@@ -2765,34 +2740,30 @@
   }
 }
 
-consoles: {
+consoles {
+  header_id: "chromium"
   id: "chromium.swarm"
   name: "chromium.swarm"
   repo_url: "https://chromium.googlesource.com/chromium/src"
   refs: "refs/heads/master"
   manifest_name: "REVISION"
-  header_id: "chromium"
-
-  builders: {
-    name: "buildbot/chromium.swarm/Android N5 Swarm"
+  builders {
+    name: "buildbucket/luci.chromium.ci/Android N5 Swarm"
   }
-  builders: {
-    name: "buildbot/chromium.swarm/Android N5X Swarm"
+  builders {
+    name: "buildbucket/luci.chromium.ci/Android N5X Swarm"
   }
-  builders: {
-    name: "buildbot/chromium.swarm/Heartbeat"
+  builders {
+    name: "buildbucket/luci.chromium.ci/ChromeOS Swarm"
   }
-  builders: {
-    name: "buildbot/chromium.swarm/Heartbeat Canary"
+  builders {
+    name: "buildbucket/luci.chromium.ci/Linux Swarm"
   }
-  builders: {
-    name: "buildbot/chromium.swarm/Linux Swarm"
+  builders {
+    name: "buildbucket/luci.chromium.ci/Mac Swarm"
   }
-  builders: {
-    name: "buildbot/chromium.swarm/Mac Swarm"
-  }
-  builders: {
-    name: "buildbot/chromium.swarm/Windows Swarm"
+  builders {
+    name: "buildbucket/luci.chromium.ci/Windows Swarm"
   }
 }
 
diff --git a/infra/config/global/luci-milo.cfg b/infra/config/global/luci-milo.cfg
index 17d5dbe..5a4b63d 100644
--- a/infra/config/global/luci-milo.cfg
+++ b/infra/config/global/luci-milo.cfg
@@ -593,6 +593,24 @@
     short_name: "cro"
   }
   builders {
+    name: "buildbot/chromium.memory/win-asan"
+    name: "buildbucket/luci.chromium.ci/win-asan"
+    category: "chromium.memory|win"
+    short_name: "asn"
+  }
+  builders {
+    name: "buildbot/chromium.memory/Mac ASan 64 Builder"
+    name: "buildbucket/luci.chromium.ci/Mac ASan 64 Builder"
+    category: "chromium.memory|mac"
+    short_name: "bld"
+  }
+  builders {
+    name: "buildbot/chromium.memory/Mac ASan 64 Tests (1)"
+    name: "buildbucket/luci.chromium.ci/Mac ASan 64 Tests (1)"
+    category: "chromium.memory|mac"
+    short_name: "tst"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/Linux TSan Builder"
     category: "chromium.memory|linux|TSan v2"
     short_name: "bld"
@@ -618,18 +636,6 @@
     short_name: "sbx"
   }
   builders {
-    name: "buildbot/chromium.memory/Linux ChromiumOS MSan Builder"
-    name: "buildbucket/luci.chromium.ci/Linux ChromiumOS MSan Builder"
-    category: "chromium.memory|linux|cros"
-    short_name: "bld"
-  }
-  builders {
-    name: "buildbot/chromium.memory/Linux ChromiumOS MSan Tests"
-    name: "buildbucket/luci.chromium.ci/Linux ChromiumOS MSan Tests"
-    category: "chromium.memory|linux|cros"
-    short_name: "tst"
-  }
-  builders {
     name: "buildbot/chromium.memory/Linux MSan Builder"
     name: "buildbucket/luci.chromium.ci/Linux MSan Builder"
     category: "chromium.memory|linux|msan"
@@ -648,27 +654,27 @@
     short_name: "cfi"
   }
   builders {
-    name: "buildbot/chromium.memory/Mac ASan 64 Builder"
-    name: "buildbucket/luci.chromium.ci/Mac ASan 64 Builder"
-    category: "chromium.memory|asan|mac"
-    short_name: "bld"
-  }
-  builders {
-    name: "buildbot/chromium.memory/Mac ASan 64 Tests (1)"
-    name: "buildbucket/luci.chromium.ci/Mac ASan 64 Tests (1)"
-    category: "chromium.memory|asan|mac"
-    short_name: "tst"
-  }
-  builders {
     name: "buildbot/chromium.memory/Linux Chromium OS ASan LSan Builder"
     name: "buildbucket/luci.chromium.ci/Linux Chromium OS ASan LSan Builder"
-    category: "chromium.memory|asan|cros"
+    category: "chromium.memory|cros|asan"
     short_name: "bld"
   }
   builders {
     name: "buildbot/chromium.memory/Linux Chromium OS ASan LSan Tests (1)"
     name: "buildbucket/luci.chromium.ci/Linux Chromium OS ASan LSan Tests (1)"
-    category: "chromium.memory|asan|cros"
+    category: "chromium.memory|cros|asan"
+    short_name: "tst"
+  }
+  builders {
+    name: "buildbot/chromium.memory/Linux ChromiumOS MSan Builder"
+    name: "buildbucket/luci.chromium.ci/Linux ChromiumOS MSan Builder"
+    category: "chromium.memory|cros|msan"
+    short_name: "bld"
+  }
+  builders {
+    name: "buildbot/chromium.memory/Linux ChromiumOS MSan Tests"
+    name: "buildbucket/luci.chromium.ci/Linux ChromiumOS MSan Tests"
+    category: "chromium.memory|cros|msan"
     short_name: "tst"
   }
   builders {
@@ -1256,12 +1262,6 @@
     short_name: "go"
   }
   builders {
-    name: "buildbot/chromium.perf/Android One Perf"
-    name: "buildbucket/luci.chromium.ci/Android One Perf"
-    category: "perf|android"
-    short_name: "one"
-  }
-  builders {
     name: "buildbot/chromium.perf/Android Nexus5X WebView Perf"
     name: "buildbucket/luci.chromium.ci/Android Nexus5X WebView Perf"
     category: "perf|android|webview"
@@ -1888,26 +1888,6 @@
     short_name: "cxx"
   }
   builders {
-    name: "buildbot/chromium.clang/CrWinClangLLD"
-    category: "ToT Windows|LLD"
-    short_name: "rel"
-  }
-  builders {
-    name: "buildbot/chromium.clang/CrWinClngLLDdbg"
-    category: "ToT Windows|LLD"
-    short_name: "dbg"
-  }
-  builders {
-    name: "buildbot/chromium.clang/CrWinClangLLD64"
-    category: "ToT Windows|LLD|x64"
-    short_name: "rel"
-  }
-  builders {
-    name: "buildbot/chromium.clang/CrWinClngLLD64dbg"
-    category: "ToT Windows|LLD|x64"
-    short_name: "dbg"
-  }
-  builders {
     name: "buildbot/chromium.clang/CrWinAsan"
     category: "ToT Windows|Asan"
     short_name: "asn"
diff --git a/infra/config/global/luci-scheduler-dev.cfg b/infra/config/global/luci-scheduler-dev.cfg
new file mode 100644
index 0000000..5f839e3
--- /dev/null
+++ b/infra/config/global/luci-scheduler-dev.cfg
@@ -0,0 +1,96 @@
+# Defines jobs on luci-scheduler-dev.appspot.com.
+#
+# For schema of this file and documentation see ProjectConfig message in
+#
+# https://chromium.googlesource.com/infra/luci/luci-go/+/master/scheduler/appengine/messages/cron.proto
+
+
+acl_sets {
+  name: "default"
+  acls {
+    role: READER
+    granted_to: "group:all"
+  }
+  acls {
+    role: OWNER
+    granted_to: "group:project-chromium-admins"
+  }
+}
+
+################################################################################
+# Master branch
+
+trigger {
+  id: "master-gitiles-trigger"
+  acl_sets: "default"
+
+  gitiles: {
+    repo: "https://chromium.googlesource.com/chromium/src.git"
+    refs: "refs/heads/master"
+  }
+
+  triggers: "Android N5 Swarm"
+  triggers: "Android N5X Swarm"
+  triggers: "ChromeOS Swarm"
+  triggers: "Linux Swarm"
+  triggers: "Mac Swarm"
+  triggers: "Windows Swarm"
+}
+
+job {
+  id: "Android N5 Swarm"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket-dev.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android N5 Swarm"
+  }
+}
+
+job {
+  id: "Android N5X Swarm"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket-dev.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Android N5X Swarm"
+  }
+}
+
+job {
+  id: "ChromeOS Swarm"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket-dev.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "ChromeOS Swarm"
+  }
+}
+
+job {
+  id: "Linux Swarm"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket-dev.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Linux Swarm"
+  }
+}
+job {
+  id: "Mac Swarm"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket-dev.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Mac Swarm"
+  }
+}
+job {
+  id: "Windows Swarm"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket-dev.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "Windows Swarm"
+  }
+}
diff --git a/infra/config/global/luci-scheduler.cfg b/infra/config/global/luci-scheduler.cfg
index f21baaa..6db45a2 100644
--- a/infra/config/global/luci-scheduler.cfg
+++ b/infra/config/global/luci-scheduler.cfg
@@ -78,8 +78,6 @@
   triggers: "Android FYI Release (Nexus 6P)"
   triggers: "Android FYI Release (Nexus 9)"
   triggers: "Android FYI dEQP Release (Nexus 5X)"
-  triggers: "Android N5 Swarm"
-  triggers: "Android N5X Swarm"
   triggers: "Android Release (Nexus 5X)"
   triggers: "Android arm Builder (dbg)"
   triggers: "Android arm64 Builder (dbg)"
@@ -89,7 +87,6 @@
   triggers: "Cast Android (dbg)"
   triggers: "Cast Audio Linux"
   triggers: "Cast Linux"
-  triggers: "ChromeOS Swarm"
   triggers: "Chromium Linux Goma GCE Staging"
   triggers: "Chromium Linux Goma RBE Staging (clobber)"
   triggers: "Chromium Linux Goma RBE Staging (dbg) (clobber)"
@@ -155,7 +152,6 @@
   triggers: "Linux Clang Analyzer"
   triggers: "Linux FYI GPU TSAN Release"
   triggers: "Linux MSan Builder"
-  triggers: "Linux Swarm"
   triggers: "Linux TSan Builder"
   triggers: "Linux Viz"
   triggers: "Linux remote_run Builder"
@@ -176,7 +172,6 @@
   triggers: "Mac FYI GPU ASAN Release"
   triggers: "Mac Goma Canary (clobber)"
   triggers: "Mac Goma Canary LocalOutputCache"
-  triggers: "Mac Swarm"
   triggers: "Mac deterministic (dbg)"
   triggers: "Mac deterministic"
   triggers: "mac-rel"
@@ -209,7 +204,6 @@
   triggers: "Win7 Builder Goma Canary"
   triggers: "WinMSVC64 Goma Canary"
   triggers: "Windows Clang deterministic"
-  triggers: "Windows Swarm"
   triggers: "Windows deterministic"
   triggers: "android-kitkat-arm-rel"
   triggers: "android-marshmallow-arm64-rel"
@@ -248,6 +242,7 @@
   triggers: "mac-jumbo-rel"
   triggers: "mac-views-rel"
   triggers: "win-annotator-rel"
+  triggers: "win-asan"
   triggers: "win-jumbo-rel"
 }
 
@@ -2086,6 +2081,16 @@
 }
 
 job {
+  id: "win-asan"
+  acl_sets: "default"
+  buildbucket: {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "luci.chromium.ci"
+    builder: "win-asan"
+  }
+}
+
+job {
   id: "win-jumbo-rel"
   acl_sets: "default"
   buildbucket: {
@@ -2473,36 +2478,6 @@
 }
 
 job {
-  id: "Android N5 Swarm"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android N5 Swarm"
-  }
-}
-
-job {
-  id: "Android N5X Swarm"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Android N5X Swarm"
-  }
-}
-
-job {
-  id: "ChromeOS Swarm"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "ChromeOS Swarm"
-  }
-}
-
-job {
   id: "Chromium Mac 10.13"
   acl_sets: "default"
   buildbucket: {
@@ -2784,16 +2759,6 @@
 }
 
 job {
-  id: "Linux Swarm"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Linux Swarm"
-  }
-}
-
-job {
   id: "Linux Viz"
   acl_sets: "default"
   buildbucket: {
@@ -3014,16 +2979,6 @@
 }
 
 job {
-  id: "Mac Swarm"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Mac Swarm"
-  }
-}
-
-job {
   id: "Mac deterministic"
   acl_sets: "default"
   buildbucket: {
@@ -3444,16 +3399,6 @@
 }
 
 job {
-  id: "Windows Swarm"
-  acl_sets: "default"
-  buildbucket: {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "luci.chromium.ci"
-    builder: "Windows Swarm"
-  }
-}
-
-job {
   id: "Windows deterministic"
   acl_sets: "default"
   buildbucket: {
diff --git a/ios/chrome/app/application_delegate/metrics_mediator.mm b/ios/chrome/app/application_delegate/metrics_mediator.mm
index 7524fbc0..34e069e 100644
--- a/ios/chrome/app/application_delegate/metrics_mediator.mm
+++ b/ios/chrome/app/application_delegate/metrics_mediator.mm
@@ -8,7 +8,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/crash/core/common/crash_keys.h"
 #include "components/metrics/metrics_pref_names.h"
 #include "components/metrics/metrics_service.h"
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 0e452ef..ff04033 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -22,7 +22,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/path_service.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "components/component_updater/component_updater_service.h"
 #include "components/component_updater/crl_set_remover.h"
diff --git a/ios/chrome/app/memory_monitor.mm b/ios/chrome/app/memory_monitor.mm
index 9ec620cc3..8ff88fc 100644
--- a/ios/chrome/app/memory_monitor.mm
+++ b/ios/chrome/app/memory_monitor.mm
@@ -14,7 +14,7 @@
 #import "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #import "ios/chrome/browser/crash_report/breakpad_helper.h"
 
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 240c17b..4b0bc36 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_am.xtb
@@ -22,6 +22,7 @@
 <translation id="3605252743693911722">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት እና በሁሉም የእርስዎ መሣሪያዎች ላይ ተጨማሪ ለማግኘት ወደ Chromium በመለያ ይግቡ።</translation>
 <translation id="3805899903892079518">Chromium የእርስዎ ፎቶዎች ወይም ቪዲዮዎች መዳረሻ የለውም። በiOS ቅንብሮች &gt; ግላዊነት &gt; ፎቶዎች ውስጥ መዳረሻን ያንቁ።</translation>
 <translation id="4024541897090868497">የእርስዎን ትሮች በሁሉም መሣሪያዎችዎ ላይ ለማግኘት ወደ Chromium ይግቡ።</translation>
+<translation id="4157467675761413638">የChromium ጠቃሚ ምክር። ተጨማሪ የትር አማራጮችን ለማግኘት በመሣሪያ አሞሌው ውስጥ የትሮችን አሳይ አዝራሩን ተጭነው ይያዙ፣ ይህ በማያ ገጽዎ አናት ወይም ግርጌ ላይ ነው ያለው።</translation>
 <translation id="4241912885070669028">በ<ph name="SIGNOUT_MANAGED_DOMAIN" /> ከሚተዳደር መለያ ዘግተው እየወጡ ነው። ይሄ Chromium ውሂብዎን ከዚህ መሣሪያ ይሰርዘዋል፣ ነገር ግን ውሂብዎ አሁንም በእርስዎ የGoogle መለያ ውስጥ እንዳለ ይቆያል።</translation>
 <translation id="4272892696084633551">የChromium ባህሪያት እና አፈጻጸም እንዲሻሻል ያግዙ</translation>
 <translation id="4555020257205549924">ይህ ባህሪ ሲበራ Chromium በሌሎች ቋንቋዎች የተጻፉ ገጾች Google ትርጉምን በመጠቀም እንዲተረጎምልዎ ይጠይቀዎታል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
@@ -44,6 +45,7 @@
 <translation id="7357211569052832586">የተመረጠው ውሂብ ከChromium እና የሰመሩ መሣሪያዎች ተወግዷል። የGoogle መለያዎ history.google.com ላይ እንደ የሌሎች Google አገልግሎቶች ፍለጋዎች እና እንቅስቃሴ ያለ ሌሎች የአሰሳ ታሪክ ዓይነት ሊኖረው ይችላል።</translation>
 <translation id="7400689562045506105">Chromiumን በሁሉም ቦታ ይጠቀሙ</translation>
 <translation id="7674213385180944843">ቅንብሮች &gt; ግላዊነት &gt; ካሜራ &gt; Chromium ይክፈቱ እና ማይክሮፎን ያብሩ።</translation>
+<translation id="7746854981345936341">የChromium ጠቃሚ ምክር። አሁን እንደ ተመለስ፣ ወደፊት እና ፍለጋ ያሉ አንዳንድ አዝራሮች አሁን በማያ ገጽዎ አናት ላይ ነው ያሉት።</translation>
 <translation id="786327964234957808">የስምረት መለያዎችን ከ<ph name="USER_EMAIL1" /> ወደ <ph name="USER_EMAIL2" /> እየቀየሩ ነው። ነባሩ የChromium ውሂብዎ በ<ph name="DOMAIN" /> ነው የሚተዳደረው። ይሄ ውሂብዎን ከዚህ መሣሪያዎ ይሰርዘዋል፣ ነገር ግን ውሂብዎ በ<ph name="USER_EMAIL1" /> ውስጥ እንዳለ ይቀራል።</translation>
 <translation id="8175055321229419309">ጠቃሚ ምክር፦ <ph name="BEGIN_LINK" />Chromiumን ወደ የእርስዎ መትከያ ይውሰዱት<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">በአካባቢዎ ላይ በመመስረት በChromium ውስጥ የተሻለ የGoogle ተሞክሮ ያግኙ።</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 04914987..4be4106 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ar.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">‏سجّل الدخول إلى Chromium للحصول غلى الإشارات المرجعية وكلمات المرور والمزيد على جميع أجهزتك.</translation>
 <translation id="3805899903892079518">‏لا تتوفر لدى Chromium إمكانية الدخول إلى الصور أو الفيديوهات. تستطيع تفعيل الدخول في إعدادات نظام التشغيل iOS &gt; الخصوصية &gt; الصور.</translation>
 <translation id="4024541897090868497">‏للحصول على علامات التبويب على جميع أجهزتك، سجِّل الدخول إلى Chromium.</translation>
+<translation id="4157467675761413638">‏نصيحة لاستخدام Chromium: لمزيد من خيارات علامات التبويب، يمكنك الضغط مع الاستمرار على الزر "عرض علامات التبويب" في شريط الأدوات الموجود أسفل الشاشة أو أعلاها.</translation>
 <translation id="4241912885070669028">‏أنت بصدد الخروج من حساب تتم إدارته من خلال <ph name="SIGNOUT_MANAGED_DOMAIN" />. سيؤدي ذلك إلى حذف بيانات Chromium من هذا الجهاز، ولكن ستظل البيانات في حسابك في Google.</translation>
 <translation id="4272892696084633551">‏المساعدة في تحسين ميزات Chromium وأدائه</translation>
 <translation id="4555020257205549924">‏عند تشغيل هذه الميزة، سيعرض Chromium ترجمة الصفحات المكتوبة بلغات أخرى باستخدام ترجمة Google. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">‏تمت إزالة البيانات المُحددة من Chromium والأجهزة التي تمت مزامنتها. قد يحتوي حسابك في Google على نماذج أخرى من سجل التصفح، مثل عمليات البحث والأنشطة من خدمات Google الأخرى في history.google.com.</translation>
 <translation id="7400689562045506105">‏استخدام Chromium في كل مكان</translation>
 <translation id="7674213385180944843">‏افتح الإعدادات &gt; الخصوصية &gt; الكاميرا &gt; Chromium وشغِّل الكاميرا.</translation>
+<translation id="7746854981345936341">‏نصيحة لاستخدام Chromium: تظهر حاليًّا بعض الأزرار في أسفل الشاشة، مثل زر "الرجوع" و"التالي" و"البحث".</translation>
 <translation id="786327964234957808">‏أنت تجري تبديلاً لحسابات المزامنة من <ph name="USER_EMAIL1" /> إلى <ph name="USER_EMAIL2" />. تتم إدارة بيانات Chromium الحالية من خلال <ph name="DOMAIN" />. سيؤدي ذلك إلى حذف بياناتك من هذا الجهاز، ولكن ستظل بياناتك في <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">‏نصيحة: <ph name="BEGIN_LINK" />انقل Chromium إلى شريط الإرساء<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">‏احصل على تجربة أفضل لاستخدام Google في 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 d16852d..4afffe9e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_bg.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Влезте в Chromium, за да получите отметките, паролите и другите си неща на всичките си устройства.</translation>
 <translation id="3805899903892079518">Chromium няма достъп до снимките или видеоклиповете ви. Активирайте го от „Settings“ &gt; „Privacy“ &gt; „Photos“ в iOS.</translation>
 <translation id="4024541897090868497">Влезте в Chromium, за да получите разделите си на всичките си устройства.</translation>
+<translation id="4157467675761413638">Съвет за Chromium. За да видите още опции за разделите, натиснете и задръжте бутона „Показване на разделите“ в лентата с инструменти в долната или горната част на екрана.</translation>
 <translation id="4241912885070669028">Излизате от профил, управляван от <ph name="SIGNOUT_MANAGED_DOMAIN" />. Данните ви в Chromium ще се изтрият от това устройство, но ще останат в профила ви в Google.</translation>
 <translation id="4272892696084633551">Помощ за подобряването на функциите и ефективността на Chromium</translation>
 <translation id="4555020257205549924">Когато тази функция е включена, Chromium ще предлага да преведе страниците, написани на други езици, посредством Google Преводач. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Избраните данни са премахнати от Chromium и синхронизираните устройства. Възможно е в профила ви в Google да има други видове история на сърфиране, съхранявани на адрес history.google.com – например търсения и активност от други наши услуги.</translation>
 <translation id="7400689562045506105">Използвайте Chromium навсякъде</translation>
 <translation id="7674213385180944843">Отворете „Settings“ &gt; „Privacy“ &gt; „Camera“ &gt; „Chromium“ и включете камерата.</translation>
+<translation id="7746854981345936341">Съвет за Chromium. Някои бутони, например тези за връщане назад, преминаване напред и търсене, вече са в долната част на екрана.</translation>
 <translation id="786327964234957808">Заменяте настоящия профил за синхронизиране (<ph name="USER_EMAIL1" />) с друг (<ph name="USER_EMAIL2" />). Съществуващите ви данни в Chromium се управляват от <ph name="DOMAIN" />. Те ще се изтрият от това устройство, но ще останат в профила <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Съвет: <ph name="BEGIN_LINK" />Преместете Chromium в лентата „Dock“<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Подобрете работата си с Google в 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 7491d768..fddb5226 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ca.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Per veure les teves pestanyes en tots els dispositius, inicia la sessió a Chromium.</translation>
+<translation id="4157467675761413638">Consell de Chromium. Per accedir a més opcions de pestanyes, mantén premut el botó Mostra pestanyes a la barra d'eines, que és a la part inferior o superior de la pantalla.</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="4272892696084633551">Ajuda a millorar les funcions i el rendiment de Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Les dades seleccionades s'han suprimit de Chromium i dels dispositius sincronitzats. És possible que el teu compte de Google tingui altres formes de l'historial de navegació a history.google.com, com ara les cerques i l'activitat d'altres serveis de Google.</translation>
 <translation id="7400689562045506105">Utilitza Chromium a tot arreu</translation>
 <translation id="7674213385180944843">Obre Configuració &gt; Privacitat &gt; Càmera &gt; Chromium i activa la càmera.</translation>
+<translation id="7746854981345936341">Consell de Chromium. Ara alguns botons són a la part inferior de la pantalla, per exemple, Enrere, Endavant i Cerca.</translation>
 <translation id="786327964234957808">Estàs canviant el compte de sincronització de <ph name="USER_EMAIL1" /> a <ph name="USER_EMAIL2" />. <ph name="DOMAIN" /> gestiona les teves dades de Chromium. Se suprimiran les teves dades d'aquest dispositiu, però continuaran estant disponibles a <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Consell: <ph name="BEGIN_LINK" />mou Chromium al Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Compartiu la vostra ubicació per tal de gaudir dels avantatges de 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 0f9f70e..441ed51 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_da.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Log ind på Chromium for at se dine faner på alle dine enheder.</translation>
+<translation id="4157467675761413638">Chromium-tip. Hvis du vil se flere indstillinger for faner, skal du trykke på knappen Vis faner på værktøjslinjen nederst eller øverst på skærmen.</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="4272892696084633551">Vær med til at forbedre Chromiums funktioner og ydeevne</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">De valgte data er fjernet fra Chromium og synkroniserede enheder. Din Google-konto kan have andre former for browserhistorik, f.eks. søgninger og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="7400689562045506105">Brug Chromium, uanset hvor du er</translation>
 <translation id="7674213385180944843">Åbn Indstillinger &gt; Privatliv &gt; Kamera &gt; Chromium, og slå kameraet til.</translation>
+<translation id="7746854981345936341">Chromium-tip. Nogle knapper som f.eks. Tilbage, Frem og Søg findes nu nederst på skærmen.</translation>
 <translation id="786327964234957808">Du er ved at skifte synkroniseringskonto fra <ph name="USER_EMAIL1" /> til <ph name="USER_EMAIL2" />. Dine eksisterende Chromium-data administreres af <ph name="DOMAIN" />. Denne handling sletter dine data fra denne enhed, men dine data forbliver gemt på <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tip! <ph name="BEGIN_LINK" />Flyt Chromium til din dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Angiv din placering, og få en bedre oplevelse, når du bruger Chromium.</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 997c3da..f43d10c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_de.xtb
@@ -22,6 +22,7 @@
 <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="4024541897090868497">Melden Sie sich in Chromium an, um Ihre Tabs auf sämtlichen Geräten zu haben.</translation>
+<translation id="4157467675761413638">Chromium-Tipp: Wenn Sie weitere Tab-Optionen sehen möchten, halten Sie die Schaltfläche "Tabs anzeigen" in der Symbolleiste gedrückt. Sie finden die Leiste unten oder oben auf dem Bildschirm.</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="4272892696084633551">Ich möchte dabei helfen, die Funktionen und die Leistung von Chromium zu verbessern</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>
@@ -44,6 +45,7 @@
 <translation id="7357211569052832586">Die ausgewählten Daten wurden aus Chromium und von allen synchronisierten Geräten entfernt. Eventuell finden Sie unter history.google.com weitere Arten von Browserverlaufsdaten wie Suchanfragen oder Aktivitäten anderer Google-Dienste für Ihr Google-Konto.</translation>
 <translation id="7400689562045506105">Chromium überall nutzen</translation>
 <translation id="7674213385180944843">Öffnen Sie "Einstellungen" &gt; "Datenschutz" &gt; "Kamera" &gt; "Chromium" und aktivieren Sie die Kamera.</translation>
+<translation id="7746854981345936341">Chromium-Tipp: Manche Schaltflächen wie "Zurück", "Weiter" und "Suche" befinden sich jetzt unten auf dem Bildschirm.</translation>
 <translation id="786327964234957808">Sie stellen die Kontosynchronisierung von <ph name="USER_EMAIL1" /> auf <ph name="USER_EMAIL2" /> um. Ihre bestehenden Chromium-Daten werden von <ph name="DOMAIN" /> verwaltet. Dadurch werden Ihre Daten von diesem Gerät gelöscht, bleiben jedoch in <ph name="USER_EMAIL1" /> erhalten.</translation>
 <translation id="8175055321229419309">Tipp: <ph name="BEGIN_LINK" />Ziehen Sie Chromium in Ihr Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Geben Sie Ihren Standort an, um Google über Chromium noch besser nutzen zu können.</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 cf2677c..394e34a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_el.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Συνδεθείτε στο Chromium, για να έχετε τους σελιδοδείκτες, τους κωδικούς πρόσβασης κ.ά. σε όλες τις συσκευές σας.</translation>
 <translation id="3805899903892079518">Το Chromium δεν έχει πρόσβαση σε φωτογραφίες ή βίντεό σας. Ενεργ. πρόσβασης στις Ρυθμίσεις iOS &gt; Απόρρητο &gt; Φωτογραφίες.</translation>
 <translation id="4024541897090868497">Για να εμφανίζονται οι ρυθμίσεις σας σε όλες τις συσκευές σας, συνδεθείτε στο Chromium</translation>
+<translation id="4157467675761413638">Συμβουλή για το Chromium. Για περισσότερες επιλογές για τις καρτέλες, πατήστε παρατεταμένα το κουμπί "Εμφάνιση καρτελών" στη γραμμή εργαλείων, η οποία βρίσκεται στο κάτω τμήμα ή στην κορυφή της οθόνης σας.</translation>
 <translation id="4241912885070669028">Πρόκειται να αποσυνδεθείτε από έναν λογαριασμό του οποίου η διαχείριση γίνεται από <ph name="SIGNOUT_MANAGED_DOMAIN" />. Αυτό θα διαγράψει τα δεδομένα σας Chromium από αυτήν τη συσκευή, αλλά θα διατηρηθούν στον Λογαριασμό σας Google.</translation>
 <translation id="4272892696084633551">Συμβάλετε στη βελτίωση των λειτουργιών και της απόδοσης του Chromium</translation>
 <translation id="4555020257205549924">Όταν αυτή η λειτουργία είναι ενεργοποιημένη, το Chromium θα προσφέρει τη μετάφραση σελίδων που είναι γραμμένες σε άλλες γλώσσες χρησιμοποιώντας τη Μετάφραση Google. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Τα επιλεγμένα δεδομένα καταργήθηκαν από το Chromium και από τις συγχρονισμένες συσκευές. Ο Λογαριασμός σας Google ενδέχεται να διαθέτει άλλες μορφές ιστορικού περιήγησης, όπως αναζητήσεις και δραστηριότητα από άλλες υπηρεσίες Google στη διεύθυνση history.google.com.</translation>
 <translation id="7400689562045506105">Χρησιμοποιήστε το Chromium παντού</translation>
 <translation id="7674213385180944843">Ανοίξτε το μενού Ρυθμίσεις &gt; Απόρρητο &gt; Κάμερα &gt; Chromium και ενεργοποιήστε την κάμερα.</translation>
+<translation id="7746854981345936341">Συμβουλή για το Chromium. Ορισμένα κουμπιά είναι πλέον διαθέσιμα στο κάτω τμήμα της οθόνης σας, όπως τα κουμπιά "Προηγούμενο", "Επόμενο" και "Αναζήτηση".</translation>
 <translation id="786327964234957808">Πραγματοποιείτε εναλλαγή στους λογαριασμούς συγχρονισμού από <ph name="USER_EMAIL1" /> σε <ph name="USER_EMAIL2" />. Η διαχείριση των υπαρχόντων δεδομένων του Chromium γίνεται από <ph name="DOMAIN" />. Αυτό θα διαγράψει τα δεδομένα σας από αυτήν τη συσκευή, αλλά τα δεδομένα θα διατηρηθούν στη διεύθυνση <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Συμβουλή: <ph name="BEGIN_LINK" />Μετακινήστε το Chromium στο dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Απολαύστε μια καλύτερη εμπειρία Google στο 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 43d90ec..9b534bd7 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_es.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Inicia sesión en Chromium para ver tus pestañas en todos tus dispositivos.</translation>
+<translation id="4157467675761413638">Consejo sobre Chromium. Para ver más opciones de pestañas, mantén pulsado el botón Mostrar pestañas en la barra de herramientas, que se encuentra en la parte inferior o superior de la pantalla.</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="4272892696084633551">Ayudar a mejorar las funciones y el rendimiento de Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Los datos seleccionados se han eliminado de Chromium y de los dispositivos sincronizados. Es posible que tu cuenta de Google haya registrado otros datos del historial de navegación, como las búsquedas o la actividad en otros servicios de Google, en la página history.google.com.</translation>
 <translation id="7400689562045506105">Usar Chromium en todas partes</translation>
 <translation id="7674213385180944843">Abre Ajustes &gt; Privacidad &gt; Cámara &gt; Chromium y activa la cámara.</translation>
+<translation id="7746854981345936341">Consejo sobre Chromium. Algunos botones ahora se encuentran en la parte inferior de la pantalla, como Atrás, Adelante y Buscar.</translation>
 <translation id="786327964234957808">Estás cambiando las cuentas de sincronización de <ph name="USER_EMAIL1" /> a <ph name="USER_EMAIL2" />. Tus datos actuales de Chromium están administrados por <ph name="DOMAIN" />. Tus datos se eliminarán de este dispositivo, pero permanecerán en <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Consejo: <ph name="BEGIN_LINK" />Mueve Chromium a tu Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Disfruta de una mejor experiencia en Chromium según tu ubicación.</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 459e89d..3326ea4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_et.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Kõikidesse seadmetesse vahelehtede hankimiseks logige Chromiumi sisse.</translation>
+<translation id="4157467675761413638">Chromiumi nõuanne. Vahelehtede muude valikute vaatamiseks hoidke all ekraani üla- või alaosas tööriistaribal olevat nuppu Kuva vahelehed.</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="4272892696084633551">Aidake täiustada Chromiumi funktsioone ja toimivust</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Valitud andmed eemaldati Chromiumist ja sünkroonitud seadmetest. Aadressil history.google.com võib teie Google'i kontol olla muus vormis sirvimisajalugu, nagu otsingud ja tegevused muudes Google'i teenustes.</translation>
 <translation id="7400689562045506105">Kasutage Chromiumit kõikjal</translation>
 <translation id="7674213385180944843">Avage menüü Seaded &gt; Privaatsus &gt; Kaamera &gt; Chromium ja lülitage kaamera sisse.</translation>
+<translation id="7746854981345936341">Chromiumi nõuanne. Mõned nupud, näiteks Tagasi, Edasi ja Otsing, asuvad nüüd ekraani alaosas.</translation>
 <translation id="786327964234957808">Vahetate sünkroonitavad kontod aadressilt <ph name="USER_EMAIL1" /> aadressile <ph name="USER_EMAIL2" />. Teie olemasolevaid Chromiumi andmeid haldab domeen <ph name="DOMAIN" />. Teie andmed kustutatakse sellest seadmest, kuid need jäävad alles kontole <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Nõuanne: <ph name="BEGIN_LINK" />lisage Chromium dokki<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Täiustage Chromiumis oma Google'i teenuste kasutuskogemust asukohateabe abil.</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 1a5edd1..c5e2e95e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fa.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">‏برای دریافت نشانک‌ها، گذرواژه‌ها و موارد دیگر در همه دستگاه‌هایتان، به سیستم Chromium وارد شوید.</translation>
 <translation id="3805899903892079518">‏Chromium به عکس‌ها یا ویدیوهای شما دسترسی ندارد. با رفتن به تنظیمات iOS &gt; حریم خصوصی &gt; عکس‌ها دسترسی را فعال کنید.</translation>
 <translation id="4024541897090868497">‏برای دریافت برگه‌هایتان در همه دستگاه‌هایتان، به سیستم Chromium وارد شوید.</translation>
+<translation id="4157467675761413638">‏نکته Chromium. برای دیدن گزینه‌های بیشتر برگه، دکمه «نمایش برگه‌ها» را در نوارابزار (در پایین یا بالای صفحه است) فشار دهید و نگه دارید.</translation>
 <translation id="4241912885070669028">‏هم‌اکنون درحال خارج شدن از حسابی هستید که توسط <ph name="SIGNOUT_MANAGED_DOMAIN" /> مدیریت می‌شود. با این کار، داده‌های Chromium شما از این دستگاه حذف می‌شوند اما همچنان در حساب Google شما باقی می‌مانند.</translation>
 <translation id="4272892696084633551">‏کمک به بهبود ویژگی‌ها و عملکرد Chromium</translation>
 <translation id="4555020257205549924">‏وقتی این قابلیت روشن است، Chromium ترجمه صفحات نوشته‌شده به سایر زبان‌ها را با استفاده از مترجم Google پیشنهاد می‌دهد. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">‏داده‌های انتخاب‌‌شده از Chromium و دستگاه‌های همگام‌سازی‌شده حذف شده‌اند. ممکن است اشکال دیگری از سابقه مرورتان (مانند جستجو‌ها و فعالیت دیگر سرویس‌های Google در history.google.com) در حساب Google شما وجود داشته باشد.</translation>
 <translation id="7400689562045506105">‏استفاده از Chromium در همه‌جا</translation>
 <translation id="7674213385180944843">‏Settings (تنظیمات) &gt; Privacy (حریم خصوصی) &gt; Camera (دوربین) &gt; Chromium را باز کنید و دوربین را روشن کنید.</translation>
+<translation id="7746854981345936341">‏نکته Chromium. بعضی از دکمه‌ها مثل Back (برگشت)، Forward (به جلو) و Search (جستجو) اکنون در پایین صفحه هستند.</translation>
 <translation id="786327964234957808">‏هم‌اکنون درحال تغییر حساب‌های همگام‌سازی از <ph name="USER_EMAIL1" /> به <ph name="USER_EMAIL2" /> هستید. داده‌های موجود Chromium شما توسط <ph name="DOMAIN" /> مدیریت می‌شوند. با این کار، داده‌هایتان از این دستگاه حذف می‌شود اما همچنان در <ph name="USER_EMAIL1" /> باقی می‌ماند.</translation>
 <translation id="8175055321229419309">‏نکته: <ph name="BEGIN_LINK" />Chromium را به لنگرگاهتان انتقال دهید<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">‏با استفاده از مکانتان در Chromium، تجربه بهتری از Google داشته باشید.</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 a803b76..b1cc6e1 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fi.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Kirjaudu sisään Chromiumiin, niin voit käyttää välilehtiäsi kaikilla laitteilla.</translation>
+<translation id="4157467675761413638">Chromium-vinkki: Voit avata välilehtien lisäasetukset painamalla ylä- tai alapalkissa olevaa Näytä välilehdet ‑painiketta pitkään.</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="4272892696084633551">Chromiumin ominaisuuksien ja suorituskyvyn parantaminen</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Valitut tiedot on poistettu Chromiumista ja synkronoiduilta laitteilta. Google-tililläsi voi olla muita selaushistoriatietoja, kuten hakuja ja toimintaa muista Google-palveluista. Voit katsella tietoja osoitteessa history.google.com.</translation>
 <translation id="7400689562045506105">Käytä Chromiumia missä tahansa</translation>
 <translation id="7674213385180944843">Avaa Asetukset &gt; Tietosuoja &gt; Kamera &gt; Chromium ja ota kamera käyttöön.</translation>
+<translation id="7746854981345936341">Chromium-vinkki: Takaisin, Seuraava, Haku ja jotkin muut painikkeet löytyvät nyt näytön alareunasta.</translation>
 <translation id="786327964234957808">Muutoksen jälkeen synkronointi käyttää tilin <ph name="USER_EMAIL1" /> sijaan tiliä <ph name="USER_EMAIL2" />. <ph name="DOMAIN" /> hallitsee olemassa olevia Chromium-tietojasi. Tiedot poistetaan tältä laitteelta, mutta ne säilyvät tilillä <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Vinkki: <ph name="BEGIN_LINK" />Siirrä Chromium Dockiin<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Saat sijaintitietojen avulla paremman Googlen käyttökokemuksen Chromiumissa.</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 39d9e48f..81f4d5b3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fil.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Upang makuha ang iyong mga tab sa lahat ng device mo, mag-sign in sa Chromium</translation>
+<translation id="4157467675761413638">Tip sa Chromium. Para sa higit pang opsyon sa tab, pindutin nang matagal ang button na Ipakita ang Mga Tab sa toolbar, na nasa ibaba o itaas ng iyong screen.</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="4272892696084633551">Tumulong sa pagpapahusay sa mga feature at performance ng Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Inalis ang piniling data mula sa Chromium at mga naka-sync na device. Maaaring mayroong ibang mga uri ng history ng pagba-browse ang iyong Google Account gaya ng mga paghahanap at aktibidad mula sa iba pang mga serbisyo ng Google sa history.google.com.</translation>
 <translation id="7400689562045506105">Gamitin ang Chromium Kahit Saan</translation>
 <translation id="7674213385180944843">Buksan ang Settings &gt; Privacy &gt; Camera &gt; Chromium at i-on ang camera.</translation>
+<translation id="7746854981345936341">Tip sa Chromium. Nasa ibaba na ng iyong screen ang ilang button, tulad ng Bumalik, Susunod, at Maghanap.</translation>
 <translation id="786327964234957808">Pinapalitan mo ang mga sync account mula sa <ph name="USER_EMAIL1" /> patungo sa <ph name="USER_EMAIL2" />. Ang iyong data ng Chromium ay pinamamahalaan ng <ph name="DOMAIN" />. Ide-delete nito ang iyong data mula sa device na ito, ngunit mananatili ang iyong data sa <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tip: <ph name="BEGIN_LINK" />Ilipat ang Chromium sa iyong dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Magkaroon ng mas mahusay na karanasan sa Google sa Chromium batay sa iyong lokasyon.</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 7e17ae6..366c48b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_fr.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Connectez-vous à Chromium pour synchroniser vos onglets sur tous vos appareils.</translation>
+<translation id="4157467675761413638">Astuce Chromium. Pour afficher plus d'options de l'onglet, appuyez de manière prolongée sur le bouton "Afficher les onglets" situé dans la barre d'outils affichée dans la partie inférieure ou supérieure de l'écran.</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="4272892696084633551">Contribuer à l'amélioration des fonctionnalités et des performances de Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Les données sélectionnées ont été supprimées de Chromium et des appareils synchronisés. Votre compte Google conserve peut-être d'autres formes d'historique de navigation sur la page history.google.com concernant, par exemple, vos recherches ou vos activités via d'autres services Google.</translation>
 <translation id="7400689562045506105">Utilisez Chromium où que vous soyez</translation>
 <translation id="7674213385180944843">Ouvrez Paramètres &gt; Confidentialité &gt; Appareil photo &gt; Chromium, puis activez l'appareil photo.</translation>
+<translation id="7746854981345936341">Astuce Chromium. Certains boutons sont désormais affichés au bas de l'écran tels que "Arrière", "Avant" et "Rechercher".</translation>
 <translation id="786327964234957808">Vous changez de compte synchronisé pour passer de <ph name="USER_EMAIL1" /> à <ph name="USER_EMAIL2" />. Vos données Chromium actuelles sont gérées par <ph name="DOMAIN" />. Cette opération entraînera la suppression de vos données de cet appareil, mais celles-ci seront conservées dans le compte <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Conseil : <ph name="BEGIN_LINK" />Placez Chromium dans le dock.<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Améliorez votre expérience Google dans Chromium grâce à votre position.</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 63bd841..5a88074b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_gu.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">તમારા બધા ઉપકરણો પર તમારા બુકમાર્ક, પાસવર્ડ અને બીજુ ઘણું મેળવવા માટે Chromiumમાં સાઇન ઇન કરો.</translation>
 <translation id="3805899903892079518">Chromium ને તમારા ફોટો અથવા વિડિઓઝની ઍક્સેસ નથી. iOS સેટિંગ્સ &gt; ગોપનીયતા &gt; ફોટોમાં ઍક્સેસને સક્ષમ કરો.</translation>
 <translation id="4024541897090868497">તમારા બધા ઉપકરણો પર તમારા ટૅબ મેળવવા માટે, Chromiumમાં સાઇન ઇન કરો.</translation>
+<translation id="4157467675761413638">Chromium ટિપ. વધુ ટૅબ વિકલ્પો માટે, તમારી સ્ક્રીનના તળિયે અથવા ટોચે આવેલા ટૂલબારમાંના 'ટૅબ બતાવો' બટનને દબાવી રાખો.</translation>
 <translation id="4241912885070669028">તમે <ph name="SIGNOUT_MANAGED_DOMAIN" /> દ્વારા સંચાલિત એકાઉન્ટમાંથી સાઇન આઉટ કરી રહ્યાં છો. આ તમારા Chromium ડેટાને આ ઉપકરણમાંથી કાઢી નાખશે, પરંતુ તમારો ડેટા તમારા Google એકાઉન્ટમાં રહેશે.</translation>
 <translation id="4272892696084633551">Chromeની સુવિધાઓ અને કાર્યપ્રદર્શનને સુધારવામાં સહાય કરો</translation>
 <translation id="4555020257205549924">જ્યારે આ સુવિધા ચાલુ કરી હોય, ત્યારે Chromium, Google અનુવાદનો ઉપયોગ કરીને અન્ય ભાષાઓમાં લખેલા પૃષ્ઠોના અનુવાદની ઓફર કરશે. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">પસંદ કરેલ ડેટા Chromium અને સમન્વયિત કરેલ ઉપકરણોમાંથી દૂર કરવામાં આવ્યો છે. તમારા Google એકાઉન્ટમાં બ્રાઉઝિંગ ઇતિહાસના અન્ય સ્વરૂપો જેમ કે શોધ અને history.google.com પરની અન્ય Google સેવાઓમાંની પ્રવૃત્તિ હોઈ શકે છે.</translation>
 <translation id="7400689562045506105">Chromium નો ઉપયોગ સર્વત્ર કરો</translation>
 <translation id="7674213385180944843">સેટિંગ્સ &gt; ગોપનીયતા &gt; કૅમેરો &gt; Chromium ખોલો અને કૅમેરો ચાલુ કરો.</translation>
+<translation id="7746854981345936341">Chromium ટિપ. પાછળ, ફૉર્વર્ડ અને શોધ જેવાં કેટલાક બટનો હવે તમારી સ્ક્રીનના તળિયે છે.</translation>
 <translation id="786327964234957808">તમે <ph name="USER_EMAIL1" /> થી <ph name="USER_EMAIL2" /> પર સમન્વયન એકાઉન્ટ્સને સ્વિચ કરી રહ્યાં છો. તમારો અસ્તિત્વમાંનો Chromium ડેટા <ph name="DOMAIN" /> દ્વારા સંચાલિત કરવામાં આવે છે. આ ઉપકરણ પરથી આ તમારા ડેટાને કાઢી નાખશે, પરંતુ તમારો ડેટા <ph name="USER_EMAIL1" /> માં રહેશે.</translation>
 <translation id="8175055321229419309">ટિપ: <ph name="BEGIN_LINK" />Chromium ને તમારા ડૉક પર ખસેડો<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Chromium માં તમારા સ્થાન પર આધારિત બહેતર Google અનુભવ મેળવો.</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 edf0884f..2b59661 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -22,6 +22,7 @@
 <translation id="3605252743693911722">अपने सभी डिवाइस पर अपने बुकमार्क, पासवर्ड आदि पाने के लिए क्रोमियम में प्रवेश करें.</translation>
 <translation id="3805899903892079518">Chromium के पास आपकी फ़ोटो या वीडियो का एक्सेस नहीं है. iOS सेटिंग &gt; निजता &gt; फ़ोटो में एक्सेस सक्षम करें.</translation>
 <translation id="4024541897090868497">अपने सभी डिवाइस पर अपने टैब पाने के लिए, क्रोमियम में प्रवेश करें.</translation>
+<translation id="4157467675761413638">क्रोमियम सलाह. ज़्यादा टैब विकल्पोंं के लिए, टूलबार में 'टैब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन में सबसे नीचे या सबसे ऊपर होगा.</translation>
 <translation id="4241912885070669028">आप <ph name="SIGNOUT_MANAGED_DOMAIN" /> द्वारा प्रबंधित खाते से प्रस्थान कर रहे हैं. इससे आपका क्रोमियम डेटा इस डिवाइस से हट जाएगा, लेकिन आपका डेटा आपके Google खाते में बना रहेगा.</translation>
 <translation id="4272892696084633551">क्रोमियम की सुविधाओं और प्रदर्शन को बेहतर बनाने में सहायता करें</translation>
 <translation id="4555020257205549924">जब यह सुविधा चालू होती है, तो क्रोमियम अन्य भाषा में लिखे पृष्ठों को Google अनुवाद का उपयोग करके अनुवाद करने के लिए ऑफ़र करेगा. <ph name="BEGIN_LINK" />अधिक जानें<ph name="END_LINK" /></translation>
@@ -44,6 +45,7 @@
 <translation id="7357211569052832586">चयनित डेटा को क्रोमियम और सिंक किए हुए डिवाइस से निकाल दिया गया है. आपके Google खाते में history.google.com पर की जाने वाली खोजों अन्य Google सेवाओं की गतिविधि जैसेे ब्राउज़िंग इतिहास के अन्य प्रारूप हो सकते हैं.</translation>
 <translation id="7400689562045506105">क्रोमियम का उपयोग हर जगह करें</translation>
 <translation id="7674213385180944843">सेटिंग &gt; निजता &gt; कैमरा &gt; क्रोमियम खोलें और कैमरा चालू करें.</translation>
+<translation id="7746854981345936341">क्रोमियम सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation>
 <translation id="786327964234957808">आप सिंक खातों को <ph name="USER_EMAIL1" /> से <ph name="USER_EMAIL2" /> में बदल रहे हैं. आपका मौजूदा क्रोमियम डेटा <ph name="DOMAIN" /> द्वारा प्रबंधित होता है. इससे इस डिवाइस से आपका डेटा हट जाएगा, लेकिन आपका डेटा <ph name="USER_EMAIL1" /> में बना रहेगा.</translation>
 <translation id="8175055321229419309">टिप्स: <ph name="BEGIN_LINK" />क्रोमियम को अपने डॉक में ले जाएं<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">अपने स्थान के आधार पर क्रोमियम में एक बेहतर Google अनुभव प्राप्त करें.</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 5cd49437..01a83a3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hr.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Da biste imali svoje kartice na svim svojim uređajima, prijavite se na Chromium.</translation>
+<translation id="4157467675761413638">Savjet za Chromium. Za više opcija kartice pritisnite i zadržite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</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="4272892696084633551">Pomozite poboljšati Chromiumove značajke i izvedbu</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Odabrani podaci uklonjeni su iz Chromiuma i sa sinkroniziranih uređaja. Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjerice pretraživanja i aktivnosti s drugih Googleovih usluga, na stranici history.google.com.</translation>
 <translation id="7400689562045506105">Upotrebljavajte Chromium svugdje</translation>
 <translation id="7674213385180944843">Otvorite Postavke &gt; Privatnost &gt; Fotoaparat &gt; Chromium i uključite fotoaparat.</translation>
+<translation id="7746854981345936341">Savjet za Chromium. Neki se gumbi sada nalaze pri dnu zaslona, primjerice za natrag, naprijed i pretraživanje.</translation>
 <translation id="786327964234957808">Prebacujete sinkronizirane račune s korisnika <ph name="USER_EMAIL1" /> na korisnika <ph name="USER_EMAIL2" />. Vašim postojećim podacima na Chromiumu upravlja <ph name="DOMAIN" />. Ovime će se izbrisati vaši podaci s vašeg uređaja, no oni će ostati na računu <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Savjet: <ph name="BEGIN_LINK" />premjestite Chromium na priključnu stanicu<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Doživite Google na bolji način u Chromiumu na temelju svoje lokacije.</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 ae3ca7b2..14c3d09 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hu.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Ha az összes eszközén szeretne hozzáférni lapjaihoz, jelentkezzen be a Chromiumba.</translation>
+<translation id="4157467675761413638">Tipp a Chromium használatához. A további lapbeállításokhoz tartsa lenyomva az eszköztárban lévő Lapok megjelenítése gombot, amely a képernyő alsó vagy felső részén található.</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="4272892696084633551">Segítség a Chromium funkcióinak és teljesítményének javítása érdekében</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">A kiválasztott adatokat eltávolítottuk a Chromiumból és a szinkronizált eszközökről. Előfordulhat, hogy Google-fiókjában (a history.google.com címen) még szerepelnek a böngészési előzmények egyéb formái, így például a keresések és egyéb tevékenységek más Google-szolgáltatásokból.</translation>
 <translation id="7400689562045506105">A Chromium mindenhol használható</translation>
 <translation id="7674213385180944843">Nyissa meg a Beállítások &gt; Adatvédelem &gt; Kamera &gt; Chromium elemet, és kapcsolja be a kamerát.</translation>
+<translation id="7746854981345936341">Tipp a Chromium használatához. Egyes gombok (például a Vissza, az Előre vagy a Keresés) mostantól a képernyő alján jelennek meg.</translation>
 <translation id="786327964234957808">A(z) <ph name="USER_EMAIL1" /> szinkronizált fiókról a következőre vált át: <ph name="USER_EMAIL2" />. A meglévő Chromium-adatokat a(z) <ph name="DOMAIN" /> kezeli. Ezzel törli az adatait erről az eszközről, viszont azok továbbra is megmaradnak a(z) <ph name="USER_EMAIL1" /> fiókban.</translation>
 <translation id="8175055321229419309">Tipp: <ph name="BEGIN_LINK" />Helyezze át a Chromiumot a Dockra<ph name="END_LINK" />.</translation>
 <translation id="8252885722420466166">Jobb Google-felhasználói élmény a Chromiumban a tartózkodási hely alapján.</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 012c131..2cb92e5 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_id.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Agar tab tersedia di semua perangkat Anda, login ke Chromium.</translation>
+<translation id="4157467675761413638">Tips Chromium. Untuk opsi tab lainnya, tekan dan tahan tombol Tampilkan Tab di toolbar, yang terdapat di bagian bawah atau atas layar.</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="4272892696084633551">Bantu sempurnakan fitur dan performa Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Data yang dipilih telah dihapus dari Chromium dan perangkat yang disinkronkan. Akun Google Anda mungkin memiliki bentuk histori pencarian lain seperti penelusuran dan aktivitas dari layanan Google lainnya di history.google.com.</translation>
 <translation id="7400689562045506105">Gunakan Chromium di Mana Saja</translation>
 <translation id="7674213385180944843">Buka Setelan &gt; Privasi &gt; Kamera &gt; Chromium, lalu aktifkan kamera.</translation>
+<translation id="7746854981345936341">Tips Chromium. Beberapa tombol sekarang terdapat di bagian bawah layar, seperti Kembali, Teruskan, dan Telusuri.</translation>
 <translation id="786327964234957808">Anda beralih akun sinkronisasi dari <ph name="USER_EMAIL1" /> ke <ph name="USER_EMAIL2" />. Data Chromium Anda yang sudah ada dikelola oleh <ph name="DOMAIN" />. Tindakan ini akan menghapus data dari perangkat, namun data Anda akan tetap tersedia di <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tips: <ph name="BEGIN_LINK" />Pindahkan Chromium ke dok<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Dapatkan pengalaman menggunakan Google yang lebih baik di Chromium berdasarkan lokasi Anda.</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 0a5fe18..54db85b2 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_it.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Accedi a Chromium per trovare le tue schede su tutti i dispositivi.</translation>
+<translation id="4157467675761413638">Suggerimento per Chromium. Per vedere più opzioni sulla scheda, tieni premuto il pulsante Mostra schede della barra degli strumenti, che si trova nella parte inferiore o superiore della schermata.</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="4272892696084633551">Contribuisci a migliorare le funzioni e le prestazioni di Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">I dati selezionati sono stati rimossi da Chromium e dai dispositivi sincronizzati. Il tuo account Google potrebbe avere altre forme di cronologia di navigazione, ad esempio ricerche e attività, di altri servizi Google alla pagina history.google.com.</translation>
 <translation id="7400689562045506105">Utilizza Chromium ovunque</translation>
 <translation id="7674213385180944843">Apri impostazioni &gt; Privacy &gt; Fotocamera &gt; Chromium e attiva la fotocamera.</translation>
+<translation id="7746854981345936341">Suggerimento per Chromium. Alcuni pulsanti si trovano ora nella parte inferiore della schermata, ad esempio Indietro, Avanti e Cerca.</translation>
 <translation id="786327964234957808">Stai cambiando account di sincronizzazione, passando dall'account <ph name="USER_EMAIL1" /> all'account <ph name="USER_EMAIL2" />. I dati di Chromium esistenti sono gestiti da <ph name="DOMAIN" />. I dati verranno cancellati dal dispositivo, ma rimarranno memorizzati nell'account <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Suggerimento. <ph name="BEGIN_LINK" />Sposta Chromium nel dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Fornisci i dati sulla tua posizione per migliorare ancora di più la tua esperienza d'uso 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 0ee087c3..b3eb7a7f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_iw.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">‏היכנס אל Chromium כדי לקבל גישה אל הסימניות, הסיסמאות ונתונים נוספים בכל המכשירים שלך.</translation>
 <translation id="3805899903892079518">‏ל-Chromium אין גישה לתמונות או לסרטונים שלך. אפשר גישה ב'הגדרות iOS' &gt; 'פרטיות' &gt; 'תמונות'.</translation>
 <translation id="4024541897090868497">‏כדי לקבל גישה לכרטיסיות שלך בכל המכשירים, היכנס ל-Chromium.</translation>
+<translation id="4157467675761413638">‏טיפ למשתמשי Chromium. כדי לקבל יותר אפשרויות של כרטיסיות, יש ללחוץ לחיצה ארוכה על הלחצן 'הצגת כרטיסיות' בסרגל הכלים, שנמצא בחלק התחתון או העליון של המסך.</translation>
 <translation id="4241912885070669028">‏אתה יוצא מחשבון המנוהל על-ידי <ph name="SIGNOUT_MANAGED_DOMAIN" />. פעולה זו תמחק את הנתונים שלך ב-Chromium מהמכשיר הזה, אבל הם יישארו בחשבון Google שלך.</translation>
 <translation id="4272892696084633551">‏עזרה בשיפור התכונות והביצועים של Chromium</translation>
 <translation id="4555020257205549924">‏כשהתכונה הזו פועלת, Chromium יציע לתרגם באמצעות Google Translate דפים שנכתבו בשפות אחרות‏. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">‏הנתונים שבחרת הוסרו מ-Chromium ומהמכשירים המסונכרנים. ייתכן שבכתובת history.google.com תוכל לגשת לסוגים אחרים של היסטוריית גלישה בחשבון Google, כמו חיפושים ופעילות משירותי Google אחרים.</translation>
 <translation id="7400689562045506105">‏אפשר להשתמש ב-Chromium בכל מקום</translation>
 <translation id="7674213385180944843">‏עבור אל 'הגדרות' &gt; 'פרטיות' &gt; 'מצלמה' &gt; Chromium והפעל את המצלמה.</translation>
+<translation id="7746854981345936341">‏טיפ למשתמשי Chromium. חלק מהלחצנים נמצאים עכשיו בחלק התחתון של המסך, כמו 'הקודם', 'קדימה' ו'חיפוש'.</translation>
 <translation id="786327964234957808">‏אתה עובר מחשבון סינכרון <ph name="USER_EMAIL1" /> אל <ph name="USER_EMAIL2" />. נתוני Chromium הקיימים שלך מנוהלים על-ידי <ph name="DOMAIN" />. פעולה זו תמחק את הנתונים שלך מהמכשיר הזה, אבל הם יישארו ב-<ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">‏טיפ: <ph name="BEGIN_LINK" />העבר את Chromium לשורת המשימות<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">‏לחוויית Google משופרת ב-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 9dfc4fef..df65dda 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ja.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Chromium にログインすれば、ブックマーク、パスワード、その他の設定をどの端末からでもご利用いただけます。</translation>
 <translation id="3805899903892079518">Chromium で写真または動画にアクセスできません。iOS の [設定] &gt; [プライバシー] &gt; [写真] でアクセスを有効にしてください。</translation>
 <translation id="4024541897090868497">お使いのどの端末でも同じタブを使用するには、Chromium にログインします。</translation>
+<translation id="4157467675761413638">Chromium の使い方のヒント: タブのオプションをさらに表示するには、画面の下部または上部のツールバーにある [タブを表示] を押し続けます。</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> で管理されているアカウントからログアウトしようとしています。ログアウトすると、Chromium データはこの端末から削除されますが、Google アカウントには残ります。</translation>
 <translation id="4272892696084633551">Chromium の機能と動作の改善に協力する</translation>
 <translation id="4555020257205549924">この機能を有効にすると、外国語のページを開いたときに翻訳ツールが表示されます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">選択したデータが Chromium から削除され、同期された端末からも削除されました。他の Google サービスでの検索や操作など、Google アカウントの他の形式の閲覧履歴が history.google.com に残ることがあります。</translation>
 <translation id="7400689562045506105">Chromium をどこでも使用</translation>
 <translation id="7674213385180944843">[設定] &gt; [プライバシー] &gt; [カメラ] &gt; [Chromium] の順に選択し、カメラをオンにします。</translation>
+<translation id="7746854981345936341">Chromium の使い方のヒント: 戻る、進む、検索など一部のボタンは画面の下部に表示されるようになりました。</translation>
 <translation id="786327964234957808">同期アカウントを <ph name="USER_EMAIL1" /> から <ph name="USER_EMAIL2" /> に切り替えようとしています。既存の Chromium データは <ph name="DOMAIN" /> で管理されています。この操作を行うと、データはこの端末から削除されますが、<ph name="USER_EMAIL1" /> には残ります。</translation>
 <translation id="8175055321229419309">ヒント: <ph name="BEGIN_LINK" />Chromium を Dock に移動<ph name="END_LINK" />するとアクセスしやすくなります</translation>
 <translation id="8252885722420466166">ユーザーの現在時に基づいて Chromium で Google を使いやすくします。</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 8f15087..a5a2031 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_kn.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಪಡೆದುಕೊಳ್ಳಲು Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
 <translation id="3805899903892079518">Chromium ನಿಮ್ಮ ಫೋಟೋಗಳು ಮತ್ತು ವೀಡಿಯೋಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿಲ್ಲ. iOS ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಗೌಪ್ಯತೆ &gt; ಫೋಟೋಗಳಲ್ಲಿ ಪ್ರವೇಶವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="4024541897090868497">ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳಲು, Chromium ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
+<translation id="4157467675761413638">Chromium ಸಲಹೆ. ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗದಲ್ಲಿ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಪರಿಕರಪಟ್ಟಿಯಲ್ಲಿ, ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೋರಿಸಿ ಬಟನ್ ಅನ್ನು ಒತ್ತಿಹಿಡಿಯಿರಿ.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> ಮೂಲಕ ನಿರ್ವಹಿಸಲಾದ ಖಾತೆಯಿಂದ ನೀವು ಸೈನ್ ಔಟ್ ಮಾಡುತ್ತಿರುವಿರಿ. ಇದು ಈ ಸಾಧನದಿಂದ ನಿಮ್ಮ Chromium ಡೇಟಾವನ್ನು ಅಳಿಸುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="4272892696084633551">Chromium ನ ವೈಶಿಷ್ಟ್ಯಗಳು ಹಾಗೂ ಕೆಲಸ ನಿರ್ವಹಣೆಯನ್ನು ಸುಧಾರಿಸಲು ಸಹಾಯ ಮಾಡಿ</translation>
 <translation id="4555020257205549924">ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಆನ್ ಮಾಡಿದಾಗ, Google ಅನುವಾದ ಬಳಸಿಕೊಂಡು ಬೇರೆ ಭಾಷೆಗಳಲ್ಲಿ ಬರೆದ ಪುಟಗಳನ್ನು ಅನುವಾದಿಸಲು Chromium ಅವಕಾಶ ನೀಡುತ್ತದೆ. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">ಆಯ್ಕೆ ಮಾಡಲಾದ ಡೇಟಾವನ್ನು Chromium ಮತ್ತು ಸಿಂಕ್ ಮಾಡಲ್ಪಟ್ಟ ಸಾಧನಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು history.google.com ನಲ್ಲಿ ಇತರ Google ಸೇವೆಗಳಿಂದ ಹುಡುಕಾಟಗಳು ಮತ್ತು ಚಟುವಟಿಕೆಯಂತಹ ಬ್ರೌಸಿಂಗ್ ಹುಡುಕಾಟದ ಇತರ ಪ್ರಕಾರಗಳನ್ನು ಹೊಂದಿರಬಹುದು.</translation>
 <translation id="7400689562045506105">ಎಲ್ಲೆಡೆ Chromium ಬಳಸಿ</translation>
 <translation id="7674213385180944843">ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಗೌಪ್ಯತೆ &gt; ಕ್ಯಾಮರಾ &gt; Chromium ತೆರೆಯಿರಿ ಮತ್ತು ಕ್ಯಾಮರಾ ಆನ್ ಮಾಡಿ.</translation>
+<translation id="7746854981345936341">Chromium ಸಲಹೆ. ಹಿಂದೆ, ಮುಂದೆ ಮತ್ತು ಹುಡುಕಾಟದಂತಹ ಕೆಲವು ಬಟನ್‌ಗಳು ಈಗ ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗದಲ್ಲಿವೆ.</translation>
 <translation id="786327964234957808"><ph name="USER_EMAIL1" /> ರಿಂದ <ph name="USER_EMAIL2" /> ಗೆ ನೀವು ಸಿಂಕ್ ಖಾತೆಗಳನ್ನು ಬದಲಾಯಿಸುತ್ತಿರುವಿರಿ. ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ Chromium ಡೇಟಾವನ್ನು <ph name="DOMAIN" /> ರಿಂದ ನಿರ್ವಹಿಸಲಾಗುತ್ತಿದೆ. ಈ ಸಾಧನದಲ್ಲಿರುವ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಇದು ಅಳಿಸಿಹಾಕುತ್ತದೆ, ಆದರೆ ನಿಮ್ಮ ಡೇಟಾ <ph name="USER_EMAIL1" /> ರಲ್ಲಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="8175055321229419309">ಸುಳಿವು: <ph name="BEGIN_LINK" />Chromium ಅನ್ನು ನಿಮ್ಮ ಡಾಕ್‌ಗೆ ಸರಿಸಿ<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಆಧರಿಸಿ Chromium ನಲ್ಲಿ ಉತ್ತಮ Google ಅನುಭವವನ್ನು ಪಡೆಯಿರಿ.</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 c69a73f..713247c 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ko.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Chromium에 로그인하여 모든 기기에서 내 북마크, 비밀번호 등을 사용하세요.</translation>
 <translation id="3805899903892079518">Chromium에서 사진 또는 동영상에 액세스할 수 없습니다. 'iOS 설정 &gt; 개인정보 보호 &gt; 사진'에서 액세스를 허용하세요.</translation>
 <translation id="4024541897090868497">어느 기기에서나 내 탭을 사용하려면 Chromium에 로그인하세요.</translation>
+<translation id="4157467675761413638">Chromium 도움말. 더 많은 탭 옵션을 보려면 화면 하단이나 상단에 있는 툴바에서 탭 표시 버튼을 길게 누릅니다.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" />에서 관리하는 계정에서 로그아웃합니다. 이렇게 하면 내 Chromium 데이터가 이 기기에서 삭제되지만 Google 계정에는 그대로 유지됩니다.</translation>
 <translation id="4272892696084633551">Chromium의 기능 및 성능 개선에 참여</translation>
 <translation id="4555020257205549924">이 기능을 사용하면 Chromium에서 Google 번역을 사용하여 외국어로 작성된 페이지를 번역합니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">선택한 데이터가 Chromium 및 동기화된 기기에서 삭제되었습니다. history.google.com에서 검색이나 기타 Google 서비스에서의 활동 등 내 Google 계정에 있는 다른 형식의 탐색 기록을 확인할 수 있습니다.</translation>
 <translation id="7400689562045506105">어디서나 Chromium 사용</translation>
 <translation id="7674213385180944843">설정 &gt; 개인정보 보호 &gt; 카메라 &gt; Chromium을 열고 카메라를 사용 설정하세요.</translation>
+<translation id="7746854981345936341">Chromium 도움말. 뒤로, 앞으로, 검색과 같은 일부 버튼이 화면 하단으로 이동했습니다.</translation>
 <translation id="786327964234957808">동기화 계정을 <ph name="USER_EMAIL1" />에서 <ph name="USER_EMAIL2" />(으)로 전환합니다. 기존 Chromium 데이터는 <ph name="DOMAIN" />에서 관리됩니다. 이 기기에서는 데이터가 삭제되지만 <ph name="USER_EMAIL1" />에 계속해서 데이터가 보관됩니다.</translation>
 <translation id="8175055321229419309">도움말: <ph name="BEGIN_LINK" />Chromium을 내 Dock에 추가하세요.<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">위치 정보를 기반으로 Chromium에서 더 좋은 Google 서비스를 제공할 수 있습니다.</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 7a8e215..0528823b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_lv.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Pierakstieties pārlūkā Chromium, lai jūsu cilnes būtu pieejamas visās jūsu ierīcēs.</translation>
+<translation id="4157467675761413638">Chromium padoms. Lai iegūtu vairāk ciļņu iespējas, rīkjoslā, kas atrodas ekrāna apakšdaļā vai augšdaļā, nospiediet un turiet pogu Rādīt cilnes.</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="4272892696084633551">Palīdzēt uzlabot Chromium funkcijas un veiktspēju</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Atlasītie dati ir noņemti no pārlūka Chromium un sinhronizētajām ierīcēm. Jūsu Google kontam vietnē history.google.com var būt citu veidu pārlūkošanas vēstures dati, piemēram, meklēšanas vaicājumi un darbības citos Google pakalpojumos.</translation>
 <translation id="7400689562045506105">Chromium lietošana visur</translation>
 <translation id="7674213385180944843">Atveriet sadaļu Iestatījumi &gt; Konfidencialitāte &gt; Kamera &gt; Chromium un ieslēdziet kameru.</translation>
+<translation id="7746854981345936341">Chromium padoms. Tagad dažas pogas ir ekrāna apakšdaļā, piemēram, Atpakaļ, Pārsūtīt un Meklēt.</translation>
 <translation id="786327964234957808">Jūs pārslēdzat sinhronizējamos kontus no konta <ph name="USER_EMAIL1" /> uz kontu <ph name="USER_EMAIL2" />. Jūsu pašreizējos Chromium datus pārvalda <ph name="DOMAIN" />. Šādi jūsu dati tiks dzēsti no šīs ierīces, bet dati joprojām būs pieejami kontā <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Padoms. <ph name="BEGIN_LINK" />Pārvietojiet pārlūku Chromium uz savu doku<ph name="END_LINK" />.</translation>
 <translation id="8252885722420466166">Izmantojiet visas Google sniegtās iespējas pārlūkā Chromium, sūtot informāciju par savu atrašanās vietu.</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 6d02e497..e7a530a3 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ml.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകളും  ‌പാസ്‌വേഡുകളും മറ്റും എല്ലാ ഉപകരണങ്ങളിലും ലഭ്യമാക്കുന്നതിന് Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="3805899903892079518">Chromium-ത്തിന് നിങ്ങളുടെ ഫോട്ടോകളിലേക്കോ വീഡിയോകളിലേക്കോ ആക്‌സസ്സ് ഇല്ല. iOS ക്രമീകരണം &gt; സ്വകാര്യത &gt; ഫോട്ടോകൾ എന്നതിൽ ആക്‌സസ്സ് പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="4024541897090868497">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും ടാബുകൾ ലഭിക്കാൻ, Chromium-ത്തിൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
+<translation id="4157467675761413638">Chromium നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ ബട്ടൺ ഷോ ടാബുകൾ, അമർത്തിപ്പിടിക്കുക.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> മാനേജുചെയ്യുന്ന ഒരു അക്കൗണ്ടിൽ നിന്നും നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യുകയാണ്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് നിങ്ങളുടെ Chromium വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും, Google അക്കൗണ്ടിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="4272892696084633551">Chromium-ത്തിന്റെ ഫീച്ചറുകളും പ്രകടനവും മെച്ചപ്പെടുത്താൻ സഹായിക്കുക</translation>
 <translation id="4555020257205549924">ഈ ഫീച്ചർ ഓണായിരിക്കുമ്പോൾ, മറ്റ് ഭാഷകളിൽ എഴുതിയിരിക്കുന്ന പേജുകൾ Google വിവർത്തനം ഉപയോഗിച്ച് വിവർത്തനം ചെയ്യുന്നത് Chromium ഓഫർ ചെയ്യും. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">തിരഞ്ഞെടുത്ത വിവരങ്ങൾ Chromium-ത്തിൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കംചെയ്‌തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് history.google.com എന്നതിൽ മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകൾ, പ്രവൃത്തി എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="7400689562045506105">എല്ലായിടത്തും Chromium ഉപയോഗിക്കുക</translation>
 <translation id="7674213385180944843">ക്രമീകരണം &gt; സ്വകാര്യത &gt; ക്യാമറ &gt; Chromium തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation>
+<translation id="7746854981345936341">Chromium നുറുങ്ങ്. ബാക്ക്, മുമ്പോട്ട് പോകാനുള്ളത് തുടങ്ങിയ ചില ബട്ടണുകൾ, ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
 <translation id="786327964234957808">നിങ്ങൾ <ph name="USER_EMAIL1" /> എന്നതിൽ നിന്ന് <ph name="USER_EMAIL2" /> എന്നതിലേക്ക് സമന്വയ അക്കൗണ്ടുകൾ മാറ്റുകയാണ്. <ph name="DOMAIN" /> ഡൊമെയ്‌നാണ് നിങ്ങളുടെ നിലവിലുള്ള Chromium വിവരങ്ങൾ മാനേജുചെയ്യുന്നത്. ഇത് ഈ ഉപകരണത്തിൽ നിന്ന് വിവരങ്ങൾ ഇല്ലാതാക്കുമെങ്കിലും <ph name="USER_EMAIL1" /> എന്നതിൽ തുടർന്നും അവ ഉണ്ടായിരിക്കുന്നതാണ്.</translation>
 <translation id="8175055321229419309">നുറുങ്ങ്: <ph name="BEGIN_LINK" />Chromium-ത്തെ നിങ്ങളുടെ ഡോക്കിലേക്ക് നീക്കുക<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Chromium-ത്തിൽ നിങ്ങളുടെ ലൊക്കേഷൻ അടിസ്ഥാനമാക്കിയുള്ള ഒരു മികച്ച Google അനുഭവം സ്വന്തമാക്കുക.</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 14fe9ca..6777f1bbd 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ms.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Log masuk ke Chromium untuk mendapatkan tab anda pada semua peranti anda.</translation>
+<translation id="4157467675761413638">Petua Chromium. Untuk melihat lebih banyak pilihan tab, tekan dan tahan butang Tunjukkan Tab dalam bar alat, yang terletak di bahagian bawah atau atas skrin anda.</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="4272892696084633551">Bantu untuk meningkatkan ciri dan prestasi Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Data yang dipilih telah dialih keluar daripada Chromium dan peranti yang disegerakkan. Akaun Google anda mungkin mempunyai sejarah penyemakan imbas dalam bentuk lain seperti carian dan aktiviti daripada perkhidmatan Google yang lain di history.google.com.</translation>
 <translation id="7400689562045506105">Gunakan Chromium Di Mana-mana Sahaja</translation>
 <translation id="7674213385180944843">Buka Tetapan &gt; Privasi &gt; Kamera &gt; Chromium dan hidupkan kamera.</translation>
+<translation id="7746854981345936341">Petua Chromium. Sesetengah butang kini terletak di bahagian bawah skrin anda, seperti Kembali, Ke Hadapan dan Carian.</translation>
 <translation id="786327964234957808">Anda sedang menukar akaun penyegerakan daripada <ph name="USER_EMAIL1" /> kepada <ph name="USER_EMAIL2" />. Data Chromium sedia ada diurus oleh <ph name="DOMAIN" />. Tindakan ini akan memadamkan data anda daripada peranti ini, tetapi data itu akan kekal disimpan dalam <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Petua: <ph name="BEGIN_LINK" />Alihkan Chromium ke dok anda<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Dapatkan pengalaman yang lebih baik di Chromium berdasarkan lokasi anda.</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 ccf7dce..17517ae2 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_nl.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Log in bij Chromium om je bladwijzers, wachtwoorden en meer op al je apparaten op te halen.</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="4024541897090868497">Log in bij Chromium om al je tabbladen op al je apparaten te bekijken</translation>
+<translation id="4157467675761413638">Chromium-tip. Voor meer tabbladopties tik je op de werkbalk onder- of bovenaan het scherm op de knop 'Tabbladen weergeven' en houd je deze knop vast.</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="4272892696084633551">Help de functies en prestaties van Chromium te verbeteren</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">De geselecteerde gegevens zijn verwijderd uit Chromium en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via history.google.com.</translation>
 <translation id="7400689562045506105">Chromium overal gebruiken</translation>
 <translation id="7674213385180944843">Open Instellingen &gt; Privacy &gt; Camera &gt; Chromium en zet de camera aan.</translation>
+<translation id="7746854981345936341">Chromium-tip. Sommige knoppen zoals Terug, Vooruit en Zoeken worden nu onderaan het scherm weergegeven.</translation>
 <translation id="786327964234957808">Je wijzigt het synchronisatieaccount van <ph name="USER_EMAIL1" /> in <ph name="USER_EMAIL2" />. Je bestaande Chromium-gegevens worden beheerd door <ph name="DOMAIN" />. Hierdoor worden je gegevens van dit apparaat verwijderd. Je gegevens blijven echter opgeslagen in <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tip: <ph name="BEGIN_LINK" />Verplaats Chromium naar je dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Gebruik Google in Chromium beter en efficiënter op basis van je locatie.</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 0b99509b..647df6b 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_no.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">For å få fanene dine på alle enhetene du bruker, logg på Chromium.</translation>
+<translation id="4157467675761413638">Chromium tips. For flere fanealternativer, trykk og hold ned Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</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="4272892696084633551">Bidra til å gjøre Chromium bedre og raskere</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">De valgte dataene er fjernet fra Chromium og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettlesingslogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="7400689562045506105">Bruk Chromium overalt</translation>
 <translation id="7674213385180944843">Åpne Innstillinger &gt; Personvern &gt; Kamera &gt; Chromium, og slå på kameraet.</translation>
+<translation id="7746854981345936341">Chromium tips. Noen knapper, slik som Nedover, Forover og Søke, er nå nederst på skjermen.</translation>
 <translation id="786327964234957808">Du bytter synkroniseringskonto fra <ph name="USER_EMAIL1" /> til <ph name="USER_EMAIL2" />. De eksisterende Chromium-dataene dine administreres av <ph name="DOMAIN" />. Dette fører til at dataene dine slettes fra denne enheten, men de blir værende i <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tips: <ph name="BEGIN_LINK" />Flytt Chromium til dokken<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Få en bedre Google-opplevelse i Chromium basert på hvor du er.</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 c9b57a07..16a30fe 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_pl.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Aby korzystać ze swoich kart na wszystkich urządzeniach, zaloguj się w Chromium.</translation>
+<translation id="4157467675761413638">Wskazówka dla użytkowników Chromium. Aby zobaczyć więcej opcji kart, naciśnij i przytrzymaj przycisk Pokaż karty na pasku narzędzi, który znajduje się na dole lub górze ekranu.</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="4272892696084633551">Pomóż w ulepszaniu funkcji i działania Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Wybrane dane zostały usunięte z Chromium i synchronizowanych urządzeń. Inne rodzaje historii przeglądania, takie jak wyszukiwania i aktywność w innych usługach Google, mogą być nadal dostępne na Twoim koncie Google na history.google.com</translation>
 <translation id="7400689562045506105">Korzystaj z Chromium w dowolnym miejscu</translation>
 <translation id="7674213385180944843">Wybierz Ustawienia &gt; Prywatność &gt; Aparat &gt; Chromium i włącz aparat.</translation>
+<translation id="7746854981345936341">Wskazówka dla użytkowników Chromium. Niektóre przyciski (na przykład Wstecz, Dalej i Szukaj) znajdują się teraz na dole ekranu.</translation>
 <translation id="786327964234957808">Przełączasz synchronizację kont z <ph name="USER_EMAIL1" /> na <ph name="USER_EMAIL2" />. Twoimi istniejącymi danymi Chromium zarządza <ph name="DOMAIN" />. Dane zostaną usunięte z tego urządzenia, ale pozostaną na koncie <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Wskazówka: <ph name="BEGIN_LINK" />przenieś Chromium do Docka<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Włączenie udostępniania lokalizacji w Chromium pozwala w pełni korzystać z usług Google.</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 720bd25a..5a3af75 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
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Para ter suas guias em todos os seus dispositivos, faça login no Chromium.</translation>
+<translation id="4157467675761413638">Dica do Chromium. Para ver mais opções de guias, toque no botão "Exibir guias" na barra de ferramentas, na parte superior ou inferior da tela, e mantenha-o pressionado.</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="4272892696084633551">Ajude a melhorar os recursos e o desempenho do Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Os dados selecionados foram removidos do Chromium e dos dispositivos sincronizados. É possível que sua Conta do Google tenha outras formas de histórico de navegação, como pesquisas e atividades de outros serviços do Google em history.google.com.</translation>
 <translation id="7400689562045506105">Use o Chromium em qualquer lugar</translation>
 <translation id="7674213385180944843">Abra Ajustes &gt; Privacidade &gt; Câmera &gt; Chromium e ative a câmera.</translation>
+<translation id="7746854981345936341">Dica do Chromium. Alguns botões agora estão na parte inferior da tela, como "Voltar", "Avançar" e "Pesquisar".</translation>
 <translation id="786327964234957808">Você está trocando a conta de sincronização de <ph name="USER_EMAIL1" /> para <ph name="USER_EMAIL2" />. Os dados do Chromium são gerenciados por <ph name="DOMAIN" />. Eles serão excluídos deste dispositivo, mas permanecerão no <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Dica: <ph name="BEGIN_LINK" />mova o Chromium para a dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Melhore sua experiência do Google no Chromium de acordo com seu local.</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 a236059f..4dcf4eb 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
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Para obter os seus separadores em todos os dispositivos, inicie sessão no Chromium.</translation>
+<translation id="4157467675761413638">Sugestão para o Chromium: para obter mais opções de separadores, prima sem soltar o botão Mostrar separadores na barra de ferramentas, que se encontra na parte superior ou inferior do ecrã.</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="4272892696084633551">Ajudar a melhorar as funcionalidades e o desempenho do Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Os dados selecionados foram removidos do Chromium e dos dispositivos sincronizados. A sua Conta Google pode ter outras formas do histórico de navegação, como pesquisas e atividade de outros serviços Google, em history.google.com.</translation>
 <translation id="7400689562045506105">Utilizar o Chromium em todas as plataformas</translation>
 <translation id="7674213385180944843">Abra Definições &gt; Privacidade &gt; Câmara &gt; Chromium e ative a câmara.</translation>
+<translation id="7746854981345936341">Sugestão para o Chromium: alguns botões encontram-se agora na parte inferior do ecrã, como Retroceder, Avançar e Pesquisar.</translation>
 <translation id="786327964234957808">Está a mudar a sincronização de contas de <ph name="USER_EMAIL1" /> para <ph name="USER_EMAIL2" />. Os seus dados do Chromium existentes são geridos por <ph name="DOMAIN" />. Esta ação eliminará os dados deste dispositivo, mas os dados permanecerão em <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Sugestão: <ph name="BEGIN_LINK" />mova o Chromium para a Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Obter uma melhor experiência no Chromium com base na sua localização.</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 8834a73..c81a9ea 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ro.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Pentru a accesa filele pe toate dispozitivele, conectează-te la Chromium.</translation>
+<translation id="4157467675761413638">Sfat pentru Chromium: pentru mai multe opțiuni de file, apasă lung butonul Afișează filele din bara de instrumente, care se află în partea de sus sau de jos a ecranului.</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="4272892696084633551">Contribuie la îmbunătățirea funcțiilor și performanței Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Datele selectate au fost eliminate din Chromium și de pe dispozitivele sincronizate. Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi căutările și activitatea din alte servicii Google, la history.google.com.</translation>
 <translation id="7400689562045506105">Folosește Chromium pretutindeni</translation>
 <translation id="7674213385180944843">Deschide Setări &gt; Confidențialitate &gt; Cameră foto &gt; Chromium și activează camera foto.</translation>
+<translation id="7746854981345936341">Sfat pentru Chromium: unele butoane se află acum în partea de jos a ecranului, cum ar fi Înapoi, Înainte și Caută.</translation>
 <translation id="786327964234957808">Comuți contul pentru sincronizare de la <ph name="USER_EMAIL1" /> la <ph name="USER_EMAIL2" />. Datele Chromium existente sunt gestionate de <ph name="DOMAIN" />. Astfel, datele vor fi șterse de pe acest dispozitiv, dar vor rămâne în <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Sfat: <ph name="BEGIN_LINK" />mută Chromium în bara de andocare<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Beneficiază de o experiență Google mai bună în Chromium pe baza locației.</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 5bde3b3..9f25d58 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ru.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Войдите в Chromium, чтобы синхронизировать закладки, пароли и другую информацию на всех ваших устройствах.</translation>
 <translation id="3805899903892079518">У Chromium нет доступа к вашим фото и видео. Чтобы предоставить его, нажмите "Настройки &gt; Конфиденциальность &gt; Фотографии".</translation>
 <translation id="4024541897090868497">Чтобы получить доступ к вкладкам на всех ваших устройствах, войдите в Chromium.</translation>
+<translation id="4157467675761413638">Совет для Chromium. Чтобы открыть дополнительные настройки вкладок, нажмите и удерживайте кнопку "Показать вкладки" на панели инструментов в нижней или верхней части экрана.</translation>
 <translation id="4241912885070669028">Вы выходите из аккаунта, которым управляет администратор домена <ph name="SIGNOUT_MANAGED_DOMAIN" />. Обратите внимание, что данные Chromium будут удалены с устройства, но сохранятся в аккаунте Google.</translation>
 <translation id="4272892696084633551">Помогите нам улучшить производительность Chromium и его функции</translation>
 <translation id="4555020257205549924">Когда эта функция включена, Chrome предлагает перевести страницы с помощью Google Переводчика. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Выбранные данные удалены из Chromium и с синхронизированных устройств. Остальная история ваших действий в Интернете может храниться в аккаунте Google, например в виде поисковых запросов и сведений из наших сервисов. Она доступна на странице history.google.com.</translation>
 <translation id="7400689562045506105">Возьмите Chromium с собой</translation>
 <translation id="7674213385180944843">Откройте "Настройки &gt; Конфиденциальность &gt; Камера &gt; Chromium" и включите камеру.</translation>
+<translation id="7746854981345936341">Совет для Chromium. Некоторые кнопки, например "Назад", "Вперед" и "Поиск", теперь расположены в нижней части экрана.</translation>
 <translation id="786327964234957808">Вы переходите из аккаунта <ph name="USER_EMAIL1" /> в <ph name="USER_EMAIL2" />. Данными Chromium управляет администратор домена <ph name="DOMAIN" />. Обратите внимание, что данные будут удалены с устройства, но сохранятся в аккаунте <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Совет. <ph name="BEGIN_LINK" />Добавьте Chromium в Dock<ph name="END_LINK" />.</translation>
 <translation id="8252885722420466166">Используйте дополнительные возможности Google в Chrome, сообщив свое местоположение.</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 322a826..5e664ba 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sl.xtb
@@ -24,6 +24,7 @@
 <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="4024541897090868497">Če želite dostopati do zavihkov v vseh napravah, se prijavite v Chromium.</translation>
+<translation id="4157467675761413638">Nasvet za Chromium. Če želite več možnosti za zavihke, pridržite gumb za prikaz zavihkov v orodni vrstici na dnu ali vrhu zaslona.</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="4272892696084633551">Pomagajte izboljšati funkcije in delovanje Chromiuma</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>
@@ -46,6 +47,7 @@
 <translation id="7357211569052832586">Izbrani podatki so bili odstranjeni iz Chromiuma in sinhroniziranih naprav. V Google Računu so morda druge vrste zgodovine brskanja, kot so iskanja in dejavnosti iz drugih Googlovih storitev, na history.google.com.</translation>
 <translation id="7400689562045506105">Uporaba Chromiuma povsod</translation>
 <translation id="7674213385180944843">Odprite Settings &gt; Privacy &gt; Camera &gt; Chromium in vklopite fotoaparat.</translation>
+<translation id="7746854981345936341">Nasvet za Chromium. Nekateri gumbi, na primer gumbi za nazaj, naprej in iskanje, so zdaj na dnu zaslona.</translation>
 <translation id="786327964234957808">Z računa za sinhronizacijo <ph name="USER_EMAIL1" /> boste preklopili na račun <ph name="USER_EMAIL2" />. Obstoječe podatke v Chromiumu upravlja <ph name="DOMAIN" />. S tem boste izbrisali podatke iz te naprave, vendar bodo vaši podatki še vedno na voljo v računu <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Nasvet: <ph name="BEGIN_LINK" />premaknite Chromium v vrstico z aplikacijami<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Izboljšajte izkušnjo z Googlom v Chromiumu na podlagi lokacije.</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 27299c3..c4d3fa4 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sr.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Пријавите се у Chromium да би вам обележивачи, лозинке и други садржај били доступни на свим уређајима.</translation>
 <translation id="3805899903892079518">Chromium не може да приступа сликама или видео снимцима. Омогућите приступ у iOS Settings (Подешавања iOS-а) &gt; Privacy (Приватност) &gt; Photos (Слике).</translation>
 <translation id="4024541897090868497">Да би вам картице биле доступне на свим уређајима, пријавите се у Chromium.</translation>
+<translation id="4157467675761413638">Савет за Chromium. Ако желите више опција за картице, притисните и задржите дугме Прикажи картице на траци с алаткама, која се налази у дну или у врху екрана.</translation>
 <translation id="4241912885070669028">Одјављујете се са налога којим управља <ph name="SIGNOUT_MANAGED_DOMAIN" />. То ће избрисати Chromium податке са овог уређаја, али ће подаци остати на Google налогу.</translation>
 <translation id="4272892696084633551">Помозите нам да побољшамо Chromium-ове функције и учинак</translation>
 <translation id="4555020257205549924">Када је ова функција укључена, Chromium ће нудити да преводи странице написане на другим језицима помоћу Google преводиоца. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Изабрани подаци су уклоњени из Chromium-а и са синхронизованих уређаја. Google налог можда има друге облике историје прегледања, попут претрага и активности у другим Google услугама на history.google.com.</translation>
 <translation id="7400689562045506105">Користите Chromium свуда</translation>
 <translation id="7674213385180944843">Отворите Подешавања &gt; Приватност &gt; Камера &gt; Chromium и укључите камеру.</translation>
+<translation id="7746854981345936341">Савет за Chromium. Нека дугмад се сада налазе у дну екрана, попут дугмади Назад, Напред и Претражи.</translation>
 <translation id="786327964234957808">Мењате налог за синхронизацију из <ph name="USER_EMAIL1" /> у <ph name="USER_EMAIL2" />. Постојећим Chromium подацима управља <ph name="DOMAIN" />. На овај начин бришете податке са овог уређаја, али подаци остају на <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Савет: <ph name="BEGIN_LINK" />Преместите Chromium на док<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Побољшајте Google доживљај у 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 fbdc0bb..e0281173 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sv.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Logga in i Chromium om du vill få tillgång till flikarna på alla enheter.</translation>
+<translation id="4157467675761413638">Tips för Chromium. Tryck länge på Visa flikar i verktygsfältet så visas fler flikalternativ. Du hittar verktygsfältet längst ned eller högst upp på skärmen.</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="4272892696084633551">Bidra till att förbättra Chromiums funktioner och prestanda</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Den data som markerades har tagits bort från Chromium och från synkroniserade enheter. Det kan finnas andra former av webbhistorik i Google-kontot på history.google.com, t.ex. sökningar och aktivitet på andra tjänster från Google.</translation>
 <translation id="7400689562045506105">Använd Chromium överallt</translation>
 <translation id="7674213385180944843">Öppna Inställningar &gt; Sekretess &gt; Kamera &gt; Chromium och aktivera kameran.</translation>
+<translation id="7746854981345936341">Tips för Chromium. Vissa knappar finns nu längst ned på skärmen, till exempel bakåtknappen, framåtknappen och Sök.</translation>
 <translation id="786327964234957808">Du håller på att byta synkroniseringskonto från <ph name="USER_EMAIL1" /> till <ph name="USER_EMAIL2" />. Befintlig data i Chromium hanteras av <ph name="DOMAIN" />. Åtgärden raderar din data från den här enheten men den finns kvar på <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Tips! <ph name="BEGIN_LINK" />Flytta Chromium till Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Ange din plats och få en bättre upplevelse av Google när du använder 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 d75f56c3..be0edae0 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_sw.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Ingia katika Chromium ili upate vichupo kwenye vifaa vyako vyote.</translation>
+<translation id="4157467675761413638">Kidokezo cha Chromium. Ili upate chaguo zaidi za kichupo, bonyeza na ushikilie kitufe cha Onyesha Vichupo katika upau wa vidhibiti, ambao unapatikana katika sehemu ya chini au juu ya skrini yako.</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="4272892696084633551">Tusaidie kuboresha utendaji na vipengele vya Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Data uliyochagua imeondolewa kwenye Chromium na kwenye vifaa vilivyosawazishwa. Huenda Akaunti yako ya Google ina aina nyingine za historia ya mambo uliyovinjari kama vile mambo uliyotafuta na shughuli kutoka huduma nyingine za Google katika history.google.com.</translation>
 <translation id="7400689562045506105">Tumia Chromium Kila mahali</translation>
 <translation id="7674213385180944843">Fungua Mipangilio &gt; Faragha &gt; Kamera &gt; Chromium na uwashe kamera.</translation>
+<translation id="7746854981345936341">Kidokezo cha Chromium. Baadhi ya vitufe sasa vinapatikana katika sehemu ya chini ya skrini yako, kama vile kitufe cha Nyuma, Mbele na Tafuta.</translation>
 <translation id="786327964234957808">Unabadilisha akaunti za kusawazisha kutoka <ph name="USER_EMAIL1" /> kuwa <ph name="USER_EMAIL2" />. Data yako iliyopo ya Chromium inadhibitiwa na <ph name="DOMAIN" />. Hatua hii itafuta data yako kwenye kifaa hiki, lakini data yako itasalia katika <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Kidokezo: <ph name="BEGIN_LINK" />Hamishia Chromium kwenye orodha ya vipengee vinavyoibuka upande wa chini wa skrini yako<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Pata hali bora ya utumiaji wa Google katika Chrome kulingana na eneo lako.</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 85ffeb0..c6a5f3f 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">உங்கள் எல்லாச் சாதனங்களிலும் உங்கள் புத்தகக்குறிகள், கடவுச்சொற்கள் மற்றும் பலவற்றைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
 <translation id="3805899903892079518">Chromiumக்கு படங்கள் அல்லது வீடியோக்களுக்கான அணுகலில்லை. அணுகலை iOS அமைப்புகள் &gt; தனியுரிமை &gt; படங்கள் இல் இயக்கவும்.</translation>
 <translation id="4024541897090868497">உங்கள் எல்லாச் சாதனங்களிலும் தாவல்களைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
+<translation id="4157467675761413638">Chromium உதவிக்குறிப்பு. மேலும் அதிக தாவல் விருப்பங்களைப் பார்க்க, கருவிப்பட்டியிலுள்ள ‘தாவல்களைக் காட்டு’ பட்டனை அழுத்திப் பிடிக்கவும். அந்த பட்டன், திரையின் அடிப்பகுதியில் அல்லது மேல்பகுதியில் இருக்கும்.</translation>
 <translation id="4241912885070669028"><ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chromium தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="4272892696084633551">Chromiumமின் அம்சங்களையும் செயல்திறனையும் மேம்படுத்த உதவுதல்</translation>
 <translation id="4555020257205549924">இந்த அம்சம் இயக்கப்பட்டிருக்கும் போது, பிற மொழிகளில் எழுதப்பட்டுள்ள பக்கங்களை Google மொழியாக்கத்தைப் பயன்படுத்தி, உங்கள் மொழியில் மொழிபெயர்த்துக்கொள்ளும் வசதியை Chromium வழங்கும். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">தேர்ந்தெடுத்த தரவு Chromium மற்றும் ஒத்திசைத்த சாதனங்களிலிருந்து அகற்றப்பட்டது. history.google.com எனும் தளத்தில் உங்கள் Google கணக்கில் பிற வகை உலாவல் வரலாறு இருக்கக்கூடும். எடுத்துக்காட்டாக, பிற Google சேவைகளில் நீங்கள் மேற்கொள்ளும் தேடல்கள், செயல்பாடுகள் போன்றவை.</translation>
 <translation id="7400689562045506105">எங்கிருந்தும் Chromiumஐப் பயன்படுத்தலாம்</translation>
 <translation id="7674213385180944843">அமைப்புகள் &gt; தனியுரிமை &gt; கேமரா &gt; Chromium என்பதைத் திறந்து, கேமராவை இயக்கவும்.</translation>
+<translation id="7746854981345936341">Chromium உதவிக்குறிப்பு: 'பின்செல்’, ‘முன்செல்’, ‘தேடு’ போன்ற சில பட்டன்கள் இப்போது உங்கள் திரையின் அடிப்பகுதியில் உள்ளன.</translation>
 <translation id="786327964234957808">ஒத்திசைவுக் கணக்குகளை <ph name="USER_EMAIL1" /> இலிருந்து <ph name="USER_EMAIL2" />க்கு மாற்றுகிறீர்கள். தற்போதுள்ள Chromium தரவை <ph name="DOMAIN" /> நிர்வகிக்கிறது. இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து தரவு நீக்கப்படும், எனினும் <ph name="USER_EMAIL1" /> இல் தரவு தொடர்ந்து இருக்கும்.</translation>
 <translation id="8175055321229419309">உதவிக் குறிப்பு: <ph name="BEGIN_LINK" />Chromiumஐ உங்கள் டாக்கிற்கு நகர்த்துங்கள்<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">உங்கள் இருப்பிடத்தின் அடிப்படையில், சிறந்த Google அனுபவத்தை 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 c7ab24f..3bc1195 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_th.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">ลงชื่อเข้าใช้ Chromium เพื่อรับบุ๊กมาร์ก รหัสผ่าน และข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องของคุณ</translation>
 <translation id="3805899903892079518">Chromium ไม่มีสิทธิ์เข้าถึงรูปภาพหรือวิดีโอของคุณ เปิดใช้การเข้าถึงได้ในการตั้งค่า iOS &gt; ความเป็นส่วนตัว &gt; รูปภาพ</translation>
 <translation id="4024541897090868497">ลงชื่อเข้าใช้ Chromium เพื่อรับแท็บในอุปกรณ์ทุกเครื่องของคุณ</translation>
+<translation id="4157467675761413638">เคล็ดลับสำหรับ Chromium ถ้าต้องการดูตัวเลือกแท็บเพิ่มเติม ให้กดปุ่ม "แสดงแท็บ" ค้างไว้ในแถบเครื่องมือ ซึ่งอยู่ที่ด้านล่างหรือด้านบนของหน้าจอ</translation>
 <translation id="4241912885070669028">คุณกำลังออกจากระบบบัญชีที่จัดการโดย <ph name="SIGNOUT_MANAGED_DOMAIN" /> การออกจากระบบจะลบข้อมูล Chromium ของคุณออกจากอุปกรณ์เครื่องนี้ แต่ข้อมูลจะยังคงอยู่ในบัญชี Google</translation>
 <translation id="4272892696084633551">ช่วยปรับปรุงฟีเจอร์และประสิทธิภาพของ Chromium</translation>
 <translation id="4555020257205549924">เมื่อเปิดฟีเจอร์นี้ Chromium จะเสนอให้แปลหน้าต่างๆ ที่เขียนด้วยภาษาอื่นโดยใช้ Google แปลภาษา <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">ระบบได้นำข้อมูลที่เลือกไว้ออกจาก Chromium และอุปกรณ์ที่ซิงค์แล้ว บัญชี Google ของคุณอาจมีประวัติการท่องเว็บในรูปแบบอื่นๆ เช่น การค้นหาและกิจกรรมจากบริการอื่นๆ ของ Google ที่ history.google.com</translation>
 <translation id="7400689562045506105">ใช้ Chromium ได้ทุกที่</translation>
 <translation id="7674213385180944843">เปิดการตั้งค่า &gt; ความเป็นส่วนตัว &gt; กล้อง &gt; Chromium แล้วเปิดกล้องถ่ายรูป</translation>
+<translation id="7746854981345936341">เคล็ดลับสำหรับ Chromium ตอนนี้บางปุ่มแสดงอยู่ที่ด้านล่างของหน้าจอแล้ว เช่น ปุ่มกลับ ไปข้างหน้า และค้นหา</translation>
 <translation id="786327964234957808">คุณกำลังเปลี่ยนบัญชีในการซิงค์จาก <ph name="USER_EMAIL1" /> เป็น <ph name="USER_EMAIL2" /> ข้อมูล Chromium ที่มีอยู่ของคุณจัดการโดย <ph name="DOMAIN" /> การเปลี่ยนบัญชีจะลบข้อมูลจากอุปกรณ์นี้ แต่ข้อมูลจะยังคงอยู่ใน <ph name="USER_EMAIL1" /></translation>
 <translation id="8175055321229419309">เคล็ดลับ: <ph name="BEGIN_LINK" />ย้าย Chromium ไปไว้ที่ Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">รับประสบการณ์การใช้งาน Google ที่ดีขึ้นใน 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 1c3dfa7..34990b8 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_tr.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Sekmelerinize tüm cihazlarınızda ulaşmak için Chromium'da oturum açın.</translation>
+<translation id="4157467675761413638">Chromium için ipucu: Sekmelerle ilgili daha fazla seçenek görmek için ekranınızın altında veya üstünde görünen araç çubuğunda Sekmeleri Göster düğmesini basılı tutun.</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="4272892696084633551">Chromium'un özelliklerini ve performansını iyileştirmeye yardımcı olun</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Seçilen veriler Chromium'dan ve senkronize edilen cihazlardan kaldırıldı. Google Hesabınızda diğer tarama geçmişi biçimleri (örneğin, history.google.com adresindeki diğer Google hizmetlerine bağlı aramalar ve etkinlikler) bulunabilir.</translation>
 <translation id="7400689562045506105">Chromium'u Her Yerde Kullanın</translation>
 <translation id="7674213385180944843">Ayarlar &gt; Gizlilik &gt; Kamera &gt; Chromium'a gidin ve kamerayı açın.</translation>
+<translation id="7746854981345936341">Chromium için ipucu: Geri, İleri ve Ara gibi bazı düğmeler artık ekranınızın alt bölümünde bulunuyor.</translation>
 <translation id="786327964234957808">Senkronizasyon hesapları arasında (<ph name="USER_EMAIL1" /> hesabından <ph name="USER_EMAIL2" /> hesabına) geçiş yapıyorsunuz. Mevcut Chromium verileriniz <ph name="DOMAIN" /> tarafından yönetiliyor. Bu işlemle verileriniz bu cihazdan silinir, ancak <ph name="USER_EMAIL1" /> hesabınızda kalmaya devam eder.</translation>
 <translation id="8175055321229419309">İpucu: <ph name="BEGIN_LINK" />Chromium'u yuva bölümüne taşıyın<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Chromium'da, konumunuza dayalı olarak daha iyi bir Google deneyimi yaşayın.</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 dc62c431..1a1498e 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_uk.xtb
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">Увійдіть в обліковий запис у Chromium, щоб мати доступ до своїх закладок, паролів та інших даних на всіх пристроях.</translation>
 <translation id="3805899903892079518">Chromium не має доступу до ваших фото чи відео. Надайте доступ у меню iOS "Параметри &gt; Конфіденційність &gt; Фото".</translation>
 <translation id="4024541897090868497">Щоб мати доступ до вкладок на всіх своїх пристроях, увійдіть в обліковий запис Chromium.</translation>
+<translation id="4157467675761413638">Порада щодо Chromium. Щоб відкрити більше параметрів, утримуйте кнопку "Показати вкладки" на панелі інструментів, розташованій унизу або вгорі екрана.</translation>
 <translation id="4241912885070669028">Ви виходите з облікового запису, зареєстрованого в домені <ph name="SIGNOUT_MANAGED_DOMAIN" />. Дані Chrome буде видалено з цього пристрою, але вони залишаться у вашому обліковому записі Google.</translation>
 <translation id="4272892696084633551">Допоможіть покращити функції й підвищити продуктивність Chromium</translation>
 <translation id="4555020257205549924">Якщо ввімкнути цю функцію, Chromium пропонуватиме перекласти сторінки, написані іншими мовами, за допомогою Перекладача Google. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Вибрані дані видалено з Chromium і синхронізованих пристроїв. У вашому обліковому записі Google на сторінці history.google.com може зберігатись історія веб-перегляду (як-от пошукові запити й активність) з інших служб Google.</translation>
 <translation id="7400689562045506105">Користуйтеся Chromium будь-де</translation>
 <translation id="7674213385180944843">Відкрийте меню "Параметри" &gt; "Приватність" &gt; "Камера" &gt; "Chromium" і ввімкніть камеру.</translation>
+<translation id="7746854981345936341">Порада щодо Chromium. Деякі кнопки зараз розташовані внизу екрана, як-от "Назад", "Уперед" і "Пошук".</translation>
 <translation id="786327964234957808">Ви переходите з облікового запису <ph name="USER_EMAIL1" /> в обліковий запис <ph name="USER_EMAIL2" />. Наявними даними Chromium керує домен <ph name="DOMAIN" />. Ваші дані буде видалено з пристрою, але вони залишаться в обліковому записі <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Порада. <ph name="BEGIN_LINK" />Перемістіть значок Chromium на панель Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Знаючи ваше місцезнаходження, Google зможе створити для вас зручніші умови роботи в 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 027f7ee..9954cd1a 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_vi.xtb
@@ -23,6 +23,7 @@
 <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="4024541897090868497">Để truy cập các tab trên tất cả các thiết bị của bạn, hãy đăng nhập vào Chromium.</translation>
+<translation id="4157467675761413638">Mẹo dành cho Chromium. Để xem thêm các tùy chọn về tab, hãy nhấn và giữ nút Hiển thị tab trên thanh công cụ ở đầu hoặc cuối màn hì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="4272892696084633551">Giúp cải thiện hiệu suất cũng như các tính năng của Chromium</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>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">Dữ liệu được chọn đã bị xóa khỏi Chromium và các thiết bị được đồng bộ hóa. Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác, chẳng hạn như tìm kiếm và hoạt động từ các dịch vụ khác của Google tại history.google.com.</translation>
 <translation id="7400689562045506105">Sử dụng Chromium mọi nơi</translation>
 <translation id="7674213385180944843">Mở Cài đặt &gt; Bảo mật &gt; Máy ảnh &gt; Chromium và bật máy ảnh.</translation>
+<translation id="7746854981345936341">Mẹo dành cho Chromium. Một số nút hiện nằm ở cuối màn hình, chẳng hạn như nút Quay lại, Tiến lên và Tìm kiếm.</translation>
 <translation id="786327964234957808">Bạn đang chuyển các tài khoản đồng bộ hóa từ <ph name="USER_EMAIL1" /> về <ph name="USER_EMAIL2" />. Dữ liệu Chromium hiện có của bạn do <ph name="DOMAIN" /> quản lý. Thao tác này 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òn trong <ph name="USER_EMAIL1" />.</translation>
 <translation id="8175055321229419309">Mẹo: <ph name="BEGIN_LINK" />Di chuyển Chromium sang thanh dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Có được trải nghiệm Google tốt hơn trong Chromium dựa trên vị trí của bạn.</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 22a53aa..77099cd 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
@@ -23,6 +23,7 @@
 <translation id="3605252743693911722">無論使用任何裝置,只要登入 Chromium,即可取得你的書籤、密碼,並沿用其他設定。</translation>
 <translation id="3805899903892079518">Chromium 無法存取您的相片或影片,請前往「iOS 設定」中的 [隱私權] &gt; [相片] 啟用存取權。</translation>
 <translation id="4024541897090868497">如要在所有裝置上存取你的分頁,請登入 Chromium。</translation>
+<translation id="4157467675761413638">Chromium 提示。如需更多分頁選項,請按住工具列 (位於畫面底部或頂端) 中的 [顯示分頁] 按鈕。</translation>
 <translation id="4241912885070669028">你即將登出由 <ph name="SIGNOUT_MANAGED_DOMAIN" /> 所管理的帳戶。系統會將你的 Chromium 資料從這個裝置上刪除,但繼續保留在你的 Google 帳戶中。</translation>
 <translation id="4272892696084633551">協助改善 Chromium 的功能與效能</translation>
 <translation id="4555020257205549924">開啟這項功能後,Chromium 會使用 Google 翻譯來翻譯其他語言的網頁。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
@@ -45,6 +46,7 @@
 <translation id="7357211569052832586">系統已將你所選取的資料從 Chromium 和其他同步的裝置中移除。你的 Google 帳戶仍可能保留了其他類型的瀏覽記錄,例如其他 Google 服務中的搜尋和活動記錄 (可前往 history.google.com 查詢)。</translation>
 <translation id="7400689562045506105">Chromium 隨時隨地都能派上用場</translation>
 <translation id="7674213385180944843">請前往 [設定] &gt; [隱私權] &gt; [相機] &gt; [Chromium],並開啟相機。</translation>
+<translation id="7746854981345936341">Chromium 提示。部分按鈕 (例如 [返回]、[往前] 和 [搜尋]) 現在位於畫面底部。</translation>
 <translation id="786327964234957808">你設定同步處理的帳戶即將從 <ph name="USER_EMAIL1" /> 改為 <ph name="USER_EMAIL2" />。你現有的 Chrome 資料是由 <ph name="DOMAIN" /> 所管理。系統會將你的資料從這個裝置上刪除,但繼續保留在 <ph name="USER_EMAIL1" /> 中。</translation>
 <translation id="8175055321229419309">提示:<ph name="BEGIN_LINK" />將 Chromium 移至 Dock<ph name="END_LINK" /></translation>
 <translation id="8252885722420466166">Chromium 可根據您的位置資訊提供更優質的 Google 服務。</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 11ff73f..fe0d8ce 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">የGoogle Chrome ግላዊነት ማስታወቂያ</translation>
 <translation id="1863312987075920112">ይህን መተግበሪያ በመጠቀምዎ በChrome <ph name="BEGIN_LINK_TOS" />የአገልግሎት ውል<ph name="END_LINK_TOS" /> እና <ph name="BEGIN_LINK_PRIVACY" />የግላዊነት ማስታወቂያ<ph name="END_LINK_PRIVACY" /> ተስማምተዋል።</translation>
+<translation id="1878302395768190018">ይህን በማንኛውም ጊዜ በChrome ቅንብሮች ውስጥ ማበጀት ይችላሉ</translation>
 <translation id="2147651015520127414">Chrome የዚህ ድር ጣቢያ እውቅና ማረጋገጫ ያወጣው <ph name="ISSUER" /> መሆኑን አረጋግጧል።</translation>
 <translation id="2334084861041072223">የቅጂ መብት <ph name="YEAR" /> Google Inc.። ሁሉም መብቶች የተጠበቁ ናቸው።</translation>
 <translation id="2342981853652716282">የእርስዎን ዕልባቶች፣ የይለፍ ቃላት እና በሁሉም የእርስዎ መሣሪያዎች ላይ ተጨማሪ ለማግኘት ወደ Chrome በመለያ ይግቡ።</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">ቅንብሮች &gt; ግላዊነት &gt; ካሜራ &gt; Google Chromeን ይክፈቱና ካሜራውን ያብሩ።</translation>
 <translation id="5642200033778930880">Google Chrome ካሜራዎን በተከፈለ እይታ ሁነታ መጠቀም አይችልም</translation>
 <translation id="5703130498371792817">በChrome እየተደሰቱ ነው? <ph name="BEGIN_LINK" />ለዚህ መተግበሪያ ደረጃ ይስጡ።<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">የChrome ጠቃሚ ምክር። አሁን እንደ ተመለስ፣ ወደፊት እና ፍለጋ ያሉ አንዳንድ አዝራሮች በማያ ገጽዎ ግርጌ ላይ ናቸው።</translation>
 <translation id="6036420186814142909">Google Chrome እርስዎ የበይነመረብ ውሂብዎን እና ድረ-ገጾችን በምን ያህል ፍጥነት መጫን እንደሚችሉ እንዲያቀናብሩ የሚያስችሉዎት ባህሪያት አሉት።
 <ph name="BEGIN_LINK" />ተጨማሪ ለመረዳት<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">በሌሎች መሣሪያዎችዎ ላይ ባለ Chrome ላይ የከፈቷቸው ትሮች እዚህ ይመጣሉ።</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">የተመረጠው ውሂብ ከChrome እና የሰመሩ መሣሪያዎች ተወግዷል። የGoogle መለያዎ history.google.com ላይ እንደ የሌሎች Google አገልግሎቶች ፍለጋዎች እና እንቅስቃሴ ያለ ሌሎች የአሰሳ ታሪክ ዓይነት ሊኖረው ይችላል።</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome የአሰሳ ተሞክሮዎን ለማሻሻል የድር አገልግሎቶችን ሊጠቀም ይችላል። እነዚህን አገልግሎቶች በአማራጭነት ሊያሰናክሏቸው ይችላሉ። <ph name="BEGIN_LINK" />ተጨማሪ ለመረዳት<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">የChrome ጠቃሚ ምክር። ተጨማሪ የትር አማራጮችን ለማግኘት በመሣሪያ አሞሌው ውስጥ የትሮችን አሳይ አዝራሩን ተጭነው ይያዙ፣ ይህ በማያ ገጽዎ አናት ወይም ግርጌ ላይ ነው ያለው።</translation>
 </translationbundle>
\ No newline at end of file
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 719e463..51e4034 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">‏إشعار خصوصية Google Chrome</translation>
 <translation id="1863312987075920112">‏باستخدام هذا التطبيق، يعني أنك توافق على <ph name="BEGIN_LINK_TOS" />بنود الخدمة<ph name="END_LINK_TOS" /> و<ph name="BEGIN_LINK_PRIVACY" />إشعار الخصوصية<ph name="END_LINK_PRIVACY" /> من Chrome.</translation>
+<translation id="1878302395768190018">‏يمكنك تخصيص هذا في أي وقت في إعدادات Chrome.</translation>
 <translation id="2147651015520127414">‏لقد تحقق Chrome من أن <ph name="ISSUER" /> أصدر شهادة الموقع الإلكتروني.</translation>
 <translation id="2334084861041072223">‏حقوق الطبع والنشر لعام <ph name="YEAR" /> لصالح شركة .Google Inc. جميع الحقوق محفوظة.</translation>
 <translation id="2342981853652716282">‏سجّل الدخول إلى Chrome للحصول غلى الإشارات المرجعية وكلمات المرور والمزيد على جميع أجهزتك.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">‏افتح الإعدادات &gt; الخصوصية &gt; الكاميرا &gt; Google Chrome وشغِّل الكاميرا.</translation>
 <translation id="5642200033778930880">‏يتعذر على Google Chrome استخدام الكاميرا في وضع تقسيم العرض</translation>
 <translation id="5703130498371792817">‏هل تستمتع باستخدام Chrome؟ <ph name="BEGIN_LINK" />قيّم هذا التطبيق<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">‏نصيحة لاستخدام Chrome: تظهر حاليًّا بعض الأزرار في أسفل الشاشة، مثل زر "الرجوع" و"التالي" و"البحث".</translation>
 <translation id="6036420186814142909">‏يشتمل Google Chrome على ميزات من شأنها مساعدتك على إدارة بيانات الإنترنت والوقوف على مدى السرعة التي يمكنك تحميل صفحات الويب من خلالها.
 <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">‏ستظهر هنا علامات التبويب التي فتحتها في Chrome من أجهزتك الأخرى.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">‏تمت إزالة البيانات المُحددة من متصفح Chrome والأجهزة التي تمت مزامنتها. قد يحتوي حسابك في Google على نماذج أخرى من سجل التصفح، مثل عمليات البحث والأنشطة من خدمات Google الأخرى في history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">‏قد يستخدم Google Chrome خدمات الويب لتحسين تجربة التصفح. ويمكنك بشكل اختياري إيقاف هذه الخدمات. <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">‏نصيحة لاستخدام Chrome: لمزيد من خيارات علامات التبويب، يمكنك الضغط مع الاستمرار على الزر "عرض علامات التبويب" في شريط الأدوات الموجود أسفل الشاشة أو أعلاها.</translation>
 </translationbundle>
\ No newline at end of file
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 ed5880b..3d9f1cc 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Съобщение за поверителност на Google Chrome</translation>
 <translation id="1863312987075920112">С използването на това приложение приемате <ph name="BEGIN_LINK_TOS" />Общите условия<ph name="END_LINK_TOS" /> и <ph name="BEGIN_LINK_PRIVACY" />Съобщението за поверителност<ph name="END_LINK_PRIVACY" /> на Chrome.</translation>
+<translation id="1878302395768190018">Можете да персонализирате това по всяко време от настройките на Chrome</translation>
 <translation id="2147651015520127414">Chrome потвърди, че сертификатът на този уебсайт е издаден от <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Авторски права <ph name="YEAR" /> Google Inc. Всички права запазени.</translation>
 <translation id="2342981853652716282">Влезте в Chrome, за да получите отметките, паролите и другите си неща на всичките си устройства.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Отворете „Settings“ &gt; „Privacy“ &gt; „Camera“ &gt; „Google Chrome“ и включете камерата.</translation>
 <translation id="5642200033778930880">Google Chrome не може да използва камерата ви в режим на разделен изглед</translation>
 <translation id="5703130498371792817">Харесвате приложението Chrome? <ph name="BEGIN_LINK" />Оценете го<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Съвет за Chrome. Някои бутони, например тези за връщане назад, преминаване напред и търсене, вече са в долната част на екрана.</translation>
 <translation id="6036420186814142909">Google Chrome разполага с функции, които ви помагат да управлявате данните си в интернет и времето, за което можете да зареждате уеб страници.
 <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Тук ще се показват разделите, които сте отворили в Chrome на другите си устройства.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Избраните данни са премахнати от Chrome и синхронизираните устройства. Възможно е в профила ви в Google да има други видове история на сърфиране, съхранявани на адрес history.google.com – например търсения и активност от други наши услуги.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome може да използва уеб услуги, за да подобри сърфирането ви. Ако искате, можете да ги деактивирате. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Съвет за Chrome. За да видите още опции за разделите, натиснете и задръжте бутона „Показване на разделите“ в лентата с инструменти в долната или горната част на екрана.</translation>
 </translationbundle>
\ No newline at end of file
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 6654b37..4ffd12f 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome গোপনীয়তা বিজ্ঞপ্তি</translation>
 <translation id="1863312987075920112">এই অ্যাপ্লিকেশনটি ব্যবহার করার মাধ্যমে আপনি Chrome এর <ph name="BEGIN_LINK_TOS" />পরিষেবার শর্তাবলী<ph name="END_LINK_TOS" /> এবং <ph name="BEGIN_LINK_PRIVACY" />গোপনীয়তা বিজ্ঞপ্তির<ph name="END_LINK_PRIVACY" /> সাথে সম্মত হচ্ছেন।</translation>
+<translation id="1878302395768190018">আপনি যেকোনও সময়ে Chrome সেটিংসে এটি কাস্টমাইজ করতে পারেন</translation>
 <translation id="2147651015520127414"><ph name="ISSUER" /> যে এই ওয়েবসাইটের শংসাপত্র প্রকাশ করেছে Chrome তা যাচাই করেছে।</translation>
 <translation id="2334084861041072223">কপিরাইট <ph name="YEAR" /> Google Inc৷ সর্বস্বত্ব সংরক্ষিত৷</translation>
 <translation id="2342981853652716282">আপনার বুকমার্ক, পাসওয়ার্ড, এবং অন্যান্য জিনিস আপনার সমস্ত ডিভাইসে পেতে 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 5c4c37a..39dcd724 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Avís de privadesa de Google Chrome</translation>
 <translation id="1863312987075920112">En fer servir aquesta aplicació, acceptes les <ph name="BEGIN_LINK_TOS" />condicions del servei<ph name="END_LINK_TOS" /> i l'<ph name="BEGIN_LINK_PRIVACY" />avís de privadesa<ph name="END_LINK_PRIVACY" /> de Chrome.</translation>
+<translation id="1878302395768190018">Pots personalitzar aquesta opció en qualsevol moment des de la configuració de Chrome</translation>
 <translation id="2147651015520127414">Chrome ha verificat que <ph name="ISSUER" /> ha emès el certificat d'aquest lloc web.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Tots els drets reservats.</translation>
 <translation id="2342981853652716282">Inicia la sessió a Chrome per accedir a les teves adreces d'interès, les contrasenyes i altres continguts des de tots els teus dispositius.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Obre Configuració &gt; Privacitat &gt; Càmera &gt; Google Chrome i activa la càmera.</translation>
 <translation id="5642200033778930880">Google Chrome no pot utilitzar la càmera en mode de visualització dividida</translation>
 <translation id="5703130498371792817">Us agrada Chrome? <ph name="BEGIN_LINK" />Puntueu aquesta aplicació<ph name="END_LINK" />.</translation>
+<translation id="5854621639439811139">Consell de Chrome. Ara alguns botons són a la part inferior de la pantalla, per exemple, Enrere, Endavant i Cerca.</translation>
 <translation id="6036420186814142909">Google Chrome té funcions que us ajuden a gestionar les vostres dades d'Internet i la rapidesa amb què podeu carregar pàgines web.
 <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Les pestanyes que tingueu obertes a Chrome als altres dispositius es mostraran aquí.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Les dades seleccionades s'han suprimit de Chrome i dels dispositius sincronitzats. És possible que el vostre compte de Google tingui altres formes de l'historial de navegació a history.google.com, com ara les cerques i l'activitat d'altres serveis de Google.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome pot utilitzar serveis web per millorar la vostra experiència de  navegació, però podeu desactivar-los si voleu. <ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Consell de Chrome. Per accedir a més opcions de pestanyes, mantén premut el botó Mostra pestanyes a la barra d'eines, que és a la part inferior o superior de la pantalla.</translation>
 </translationbundle>
\ No newline at end of file
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 3553b6e..2e16968c 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Upozornění ve věci ochrany soukromí v prohlížeči Google Chrome</translation>
 <translation id="1863312987075920112">Používáním této aplikace vyjadřujete souhlas se <ph name="BEGIN_LINK_TOS" />smluvními podmínkami<ph name="END_LINK_TOS" /> a <ph name="BEGIN_LINK_PRIVACY" />zásadami ochrany soukromí<ph name="END_LINK_PRIVACY" /> prohlížeče Chrome.</translation>
+<translation id="1878302395768190018">Toto nastavení můžete kdykoliv upravit v nastavení Chromu</translation>
 <translation id="2147651015520127414">Chrome ověřil, že certifikát tohoto webu byl vydán vydavatelem <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Všechna práva vyhrazena.</translation>
 <translation id="2342981853652716282">Chcete-li mít své záložky, hesla a další obsah na všech zařízeních, přihlaste se do Chromu.</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 8466352..210b646 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Erklæring om privatliv for Google Chrome</translation>
 <translation id="1863312987075920112">Når du bruger denne app, accepterer du Chromes <ph name="BEGIN_LINK_TOS" />servicevilkår<ph name="END_LINK_TOS" /> og <ph name="BEGIN_LINK_PRIVACY" />erklæring om privatliv<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Du kan til enhver tid tilpasse dette i Chrome-indstillingerne</translation>
 <translation id="2147651015520127414">Chrome bekræftede, at <ph name="ISSUER" /> har udstedt certifikatet for dette website.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Alle rettigheder forbeholdes.</translation>
 <translation id="2342981853652716282">Log ind på Chrome for at få dine bogmærker, adgangskoder og meget mere på alle dine enheder.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Åbn Indstillinger &gt; Privatliv &gt; Kamera &gt; Google Chrome, og slå kameraet til.</translation>
 <translation id="5642200033778930880">Google Chrome kan ikke bruge dit kamera i tilstanden Opdelt visning</translation>
 <translation id="5703130498371792817">Kan du lide Chrome? <ph name="BEGIN_LINK" />Bedøm denne app<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome-tip. Nogle knapper som f.eks. Tilbage, Frem og Søg findes nu nederst på skærmen.</translation>
 <translation id="6036420186814142909">Google Chrome har funktioner, der hjælper dig med at administrere internetdata og hastigheden, som websider indlæses med.
 <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Faner, du har åbnet i Chrome på dine andre enheder, vises her.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">De valgte data er fjernet fra Chrome og synkroniserede enheder. Din Google-konto kan have andre former for browserhistorik, f.eks. søgninger og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome bruger muligvis webtjenester for at forbedre din browseroplevelse. Du kan vælge at deaktivere disse tjenester. <ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome-tip. Hvis du vil se flere indstillinger for faner, skal du trykke på knappen Vis faner på værktøjslinjen nederst eller øverst på skærmen.</translation>
 </translationbundle>
\ No newline at end of file
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 6a238f3c4..c8c42e8 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Chrome-Datenschutzhinweise</translation>
 <translation id="1863312987075920112">Durch die Verwendung dieser App stimmen Sie den <ph name="BEGIN_LINK_TOS" />Nutzungsbedingungen<ph name="END_LINK_TOS" /> und <ph name="BEGIN_LINK_PRIVACY" />Datenschutzhinweisen<ph name="END_LINK_PRIVACY" /> von Chrome zu.</translation>
+<translation id="1878302395768190018">Diese Option lässt sich jederzeit in den Chrome-Einstellungen anpassen</translation>
 <translation id="2147651015520127414">Chrome hat verifiziert, dass <ph name="ISSUER" /> das Zertifikat dieser Website ausgestellt hat.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Alle Rechte vorbehalten.</translation>
 <translation id="2342981853652716282">Melden Sie sich in Chrome an, um Daten wie Lesezeichen und Passwörter auf allen Ihren Geräten zu nutzen.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Öffnen Sie "Einstellungen" &gt; "Datenschutz" &gt; "Kamera" &gt; "Google Chrome" und aktivieren Sie die Kamera.</translation>
 <translation id="5642200033778930880">Google Chrome kann die Kamera nicht im Modus "Geteilte Ansicht" nutzen</translation>
 <translation id="5703130498371792817">Gefällt Ihnen Chrome? <ph name="BEGIN_LINK" />Bewerten Sie diese App!<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome-Tipp: Manche Schaltflächen wie "Zurück", "Weiter" und "Suche" befinden sich jetzt unten auf dem Bildschirm.</translation>
 <translation id="6036420186814142909">Google Chrome bietet Funktionen, mit denen Sie Ihre Internetdaten und die Ladezeit von Webseiten verwalten können.
 <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Hier werden Tabs angezeigt, die Sie auf Ihren anderen Geräten in Chrome geöffnet haben.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Die ausgewählten Daten wurden aus Chrome und von allen synchronisierten Geräten entfernt. Eventuell finden Sie unter history.google.com weitere Arten von Browserverlaufsdaten wie Suchanfragen oder Aktivitäten anderer Google-Dienste für Ihr Google-Konto.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome verwendet möglicherweise Webdienste zur Unterstützung Ihrer Onlinesuche. Sie haben die Möglichkeit, diese Dienste zu deaktivieren. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome-Tipp: Wenn Sie weitere Tab-Optionen sehen möchten, halten Sie die Schaltfläche "Tabs anzeigen" in der Symbolleiste gedrückt. Sie finden die Leiste unten oder oben auf dem Bildschirm.</translation>
 </translationbundle>
\ No newline at end of file
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 a696e16ed..053c712 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Σημείωση απορρήτου του Google Chrome</translation>
 <translation id="1863312987075920112">Χρησιμοποιώντας αυτήν την εφαρμογή, συμφωνείτε με τους <ph name="BEGIN_LINK_TOS" />Όρους Παροχής Υπηρεσιών<ph name="END_LINK_TOS" /> και τη <ph name="BEGIN_LINK_PRIVACY" />Σημείωση απορρήτου<ph name="END_LINK_PRIVACY" /> του Chrome.</translation>
+<translation id="1878302395768190018">Μπορείτε να προσαρμόσετε την επιλογή ανά πάσα στιγμή από τις ρυθμίσεις του Chrome</translation>
 <translation id="2147651015520127414">Το Chrome επαλήθευσε ότι το πιστοποιητικό αυτού του ιστότοπου εκδόθηκε από τον/την <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Πνευματικά δικαιώματα <ph name="YEAR" /> Google Inc. Με επιφύλαξη παντός δικαιώματος.</translation>
 <translation id="2342981853652716282">Συνδεθείτε στο Chrome, για να έχετε τους σελιδοδείκτες, τους κωδικούς πρόσβασης κ.ά. σε όλες τις συσκευές σας.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Ανοίξτε το μενού Ρυθμίσεις &gt; Απόρρητο &gt; Κάμερα &gt; Google Chrome και ενεργοποιήστε την κάμερα.</translation>
 <translation id="5642200033778930880">Το Google Chrome δεν μπορεί να χρησιμοποιήσει την κάμερά σας στη λειτουργία προβολής διαχωρισμού οθόνης</translation>
 <translation id="5703130498371792817">Απολαμβάνετε το Chrome; <ph name="BEGIN_LINK" />Αξιολογήστε αυτήν την εφαρμογή<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Συμβουλή για το Chrome. Ορισμένα κουμπιά είναι πλέον διαθέσιμα στο κάτω τμήμα της οθόνης σας, όπως τα κουμπιά "Προηγούμενο", "Επόμενο" και "Αναζήτηση".</translation>
 <translation id="6036420186814142909">Το Google Chrome διαθέτει λειτουργίες που σας διευκολύνουν να διαχειριστείτε τα δεδομένα σας στο διαδίκτυο και την ταχύτητα φόρτωσης των ιστοσελίδων.
 <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Οι καρτέλες που έχετε ανοίξει στο Chrome στις άλλες συσκευές σας θα εμφανίζονται εδώ.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Τα επιλεγμένα δεδομένα καταργήθηκαν από το Chrome και από τις συγχρονισμένες συσκευές. Ο Λογαριασμός σας Google ενδέχεται να διαθέτει άλλες μορφές ιστορικού περιήγησης, όπως αναζητήσεις και δραστηριότητα από άλλες υπηρεσίες Google στη διεύθυνση history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Το Google Chrome ενδέχεται να χρησιμοποιεί υπηρεσίες ιστού για να βελτιώσει την εμπειρία περιήγησής σας. Μπορείτε, εάν θέλετε, να απενεργοποιήσετε αυτές τις υπηρεσίες. <ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Συμβουλή για το Chrome. Για περισσότερες επιλογές για τις καρτέλες, πατήστε παρατεταμένα το κουμπί "Εμφάνιση καρτελών" στη γραμμή εργαλείων, η οποία βρίσκεται στο κάτω τμήμα ή στην κορυφή της οθόνης σας.</translation>
 </translationbundle>
\ No newline at end of file
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 f51f6a9..51e87f3 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome Privacy Notice</translation>
 <translation id="1863312987075920112">By using this application, you agree to Chrome’s <ph name="BEGIN_LINK_TOS" />Terms of Service<ph name="END_LINK_TOS" /> and <ph name="BEGIN_LINK_PRIVACY" />Privacy Notice<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">You can customise this at any time in Chrome Settings</translation>
 <translation id="2147651015520127414">Chrome verified that <ph name="ISSUER" /> issued this website's certificate.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation>
 <translation id="2342981853652716282">Sign in to Chrome to get your bookmarks, passwords and more on all your devices.</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 c53648d9..9a521904 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de privacidad de Google Chrome</translation>
 <translation id="1863312987075920112">Al usar esta app, aceptas las <ph name="BEGIN_LINK_TOS" />Condiciones del servicio<ph name="END_LINK_TOS" /> y la <ph name="BEGIN_LINK_PRIVACY" />Política de privacidad<ph name="END_LINK_PRIVACY" /> de Chrome.</translation>
+<translation id="1878302395768190018">Puedes personalizar esta opción en la configuración de Chrome en cualquier momento</translation>
 <translation id="2147651015520127414">Chrome verificó que <ph name="ISSUER" /> emitió el certificado de este sitio web.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Todos los derechos reservados.</translation>
 <translation id="2342981853652716282">Accede a tu cuenta en Chrome para obtener tus favoritos, contraseñas y mucho más desde todos tus dispositivos.</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 810ac29..9de7f9f 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de privacidad de Google Chrome</translation>
 <translation id="1863312987075920112">Al usar esta aplicación, aceptas las <ph name="BEGIN_LINK_TOS" />condiciones de servicio<ph name="END_LINK_TOS" /> y el <ph name="BEGIN_LINK_PRIVACY" />aviso de privacidad<ph name="END_LINK_PRIVACY" /> de Chrome.</translation>
+<translation id="1878302395768190018">Puedes personalizarla en cualquier momento en la configuración de Chrome</translation>
 <translation id="2147651015520127414">Chrome ha verificado que <ph name="ISSUER" /> emitió el certificado de este sitio web.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Todos los derechos reservados.</translation>
 <translation id="2342981853652716282">Inicia sesión en Chrome para sincronizar los marcadores, las contraseñas y mucho más en todos tus dispositivos.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Abre Ajustes &gt; Privacidad &gt; Cámara &gt; Google Chrome y activa la cámara.</translation>
 <translation id="5642200033778930880">Google Chrome no puede usar la cámara en el modo Vista dividida</translation>
 <translation id="5703130498371792817">¿Te gusta Chrome? <ph name="BEGIN_LINK" />Valora esta aplicación<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Consejo sobre Chrome. Algunos botones ahora se encuentran en la parte inferior de la pantalla, como Atrás, Adelante y Buscar.</translation>
 <translation id="6036420186814142909">Google Chrome  incluye funciones que te permiten administrar tus datos de Internet y la rapidez con la que puedes cargar páginas web.
 <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Aquí aparecen las pestañas que hayas abierto en Chrome en otros dispositivos.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Los datos seleccionados se han eliminado de Chrome y de los dispositivos sincronizados. Es posible que tu cuenta de Google tenga otras formas del historial de navegación, como las búsquedas o la actividad de otros servicios de Google en la página history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome puede utilizar los servicios web para mejorar tu experiencia de navegación. Puedes habilitar o inhabilitar estos servicios. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Consejo sobre Chrome. Para ver más opciones de pestañas, mantén pulsado el botón Mostrar pestañas en la barra de herramientas, que se encuentra en la parte inferior o superior de la pantalla.</translation>
 </translationbundle>
\ No newline at end of file
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 14bbeb4..4aeea3e 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome'i privaatsust.</translation>
 <translation id="1863312987075920112">Seda rakendust kasutades nõustute Chrome'i <ph name="BEGIN_LINK_TOS" />teenusetingimuste<ph name="END_LINK_TOS" /> ja <ph name="BEGIN_LINK_PRIVACY" />privaatsusteatisega<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Seda saate Chrome'i seadetes igal ajal kohandada</translation>
 <translation id="2147651015520127414">Chrome kinnitas, et veebisaidi sertifikaadi väljastas <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Autoriõigus <ph name="YEAR" /> Google Inc. Kõik õigused on kaitstud.</translation>
 <translation id="2342981853652716282">Logige Chrome'i sisse, et kõikides oma seadmetes kasutada järjehoidjaid, paroole ja muud.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Tehke valikud Seaded &gt; Privaatsus &gt; Kaamera &gt; Google Chrome ja lülitage kaamera sisse.</translation>
 <translation id="5642200033778930880">Google Chrome ei saa kaamerat poolitatud vaate režiimis kasutada</translation>
 <translation id="5703130498371792817">Kas teile meeldib Chrome? <ph name="BEGIN_LINK" />Hinnake seda rakendust<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome'i nõuanne. Mõned nupud, näiteks Tagasi, Edasi ja Otsing, asuvad nüüd ekraani alaosas.</translation>
 <translation id="6036420186814142909">Google Chrome'il on funktsioone, mis aitavad teil hallata oma Interneti-andmeid ja seda, kui kiiresti saate laadida veebilehti.
 <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Siin kuvatakse teie teistes seadmetes Chrome'is avatud vahelehed.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Valitud andmed eemaldati Chrome'ist ja sünkroonitud seadmetest. Aadressil history.google.com võib teie Google'i kontol olla muus vormis sirvimisajalugu, nagu otsingud ja tegevused muudes Google'i teenustes.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome võib kasutada veebiteenuseid sirvimiskogemuse parandamiseks. Võite need teenused valikuliselt keelata. <ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome'i nõuanne. Vahelehtede muude valikute vaatamiseks hoidke all ekraani üla- või alaosas tööriistaribal olevat nuppu Kuva vahelehed.</translation>
 </translationbundle>
\ No newline at end of file
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 4c3aed3..f69e7a7 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">‏اعلان حریم خصوصی Google Chrome</translation>
 <translation id="1863312987075920112">‏استفاده از این برنامه به‌معنای اعلام موافقت شما با <ph name="BEGIN_LINK_TOS" />شرایط و ضوابط<ph name="END_LINK_TOS" /> و <ph name="BEGIN_LINK_PRIVACY" />اعلان حریم خصوصی<ph name="END_LINK_PRIVACY" /> Chrome است.</translation>
+<translation id="1878302395768190018">‏هرزمان بخواهید می‌توانید این گزینه را در «تنظیمات Chrome» سفارشی کنید</translation>
 <translation id="2147651015520127414">‏Chrome تأیید می‌کند که <ph name="ISSUER" /> گواهی‌نامه این وب‌سایت را صادر کرده است.</translation>
 <translation id="2334084861041072223">‏حق نسخه‌برداری ‪<ph name="YEAR" />‏ Google Inc.‬ کلیه حقوق محفوظ است.</translation>
 <translation id="2342981853652716282">‏برای دریافت نشانک‌ها، گذرواژه‌ها و موارد دیگر در همه دستگاه‌هایتان، به سیستم Chrome وارد شوید.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">‏Settings (تنظیمات) &gt; Privacy (حریم خصوصی) &gt; Camera (دوربین) &gt; Google Chrome را باز کنید و دوربین را روشن کنید.</translation>
 <translation id="5642200033778930880">‏Google Chrome نمی‌تواند از دوربین درحالت Split View (نمای تقسیم) استفاده کند</translation>
 <translation id="5703130498371792817">‏از Chrome لذت می‌برید؟ <ph name="BEGIN_LINK" />به این برنامه رتبه بدهید<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">‏نکته Chrome. بعضی از دکمه‌ها مثل Back (برگشت)، Forward (به جلو) و Search (جستجو) اکنون در پایین صفحه هستند.</translation>
 <translation id="6036420186814142909">‏Google Chrome دارای قابلیت‌هایی است که به شما کمک می‌کند داده‌های اینترنت و سرعت بارگیری صفحه‌های وبتان را مدیریت کنید.
 <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">‏برگه‌هایی که در دستگاه‌های دیگر در Chrome باز کرده‌اید، در اینجا نمایان می‌شوند.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">‏داده‌های انتخاب‌‌شده از Chrome و دستگاه‌های همگام‌سازی‌شده حذف شدند. ممکن است اشکال دیگری از سابقه مرورتان در حساب Google شما وجود داشته باشد، مانند جستجو‌ها و فعالیت دیگر سرویس‌های Google در history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">‏ممکن است Google Chrome برای بهبود تجربه مرور شما از سرویس‌های وب استفاده کند. می‌توانید به صورت اختیاری این سرویس‌ها را غیرفعال کنید. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">‏نکته Chrome. برای دیدن گزینه‌های بیشتر برگه، دکمه «نمایش برگه‌ها» را در نوارابزار (در پایین یا بالای صفحه است) فشار دهید و نگه دارید.</translation>
 </translationbundle>
\ No newline at end of file
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 01db1bb..0120c1de 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chromen tietosuojailmoitus</translation>
 <translation id="1863312987075920112">Käyttämällä tätä sovellusta hyväksyt Chromen <ph name="BEGIN_LINK_TOS" />käyttöehdot<ph name="END_LINK_TOS" /> ja <ph name="BEGIN_LINK_PRIVACY" />tietosuojailmoituksen<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Voit muokata tätä koska tahansa Chromen asetuksissa</translation>
 <translation id="2147651015520127414">Chrome vahvisti, että <ph name="ISSUER" /> on myöntänyt tämän sivuston varmenteen.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Kaikki oikeudet pidätetään.</translation>
 <translation id="2342981853652716282">Kirjaudu sisään Chromeen, jotta voit käyttää kirjanmerkkejäsi, salasanojasi ja muita asetuksiasi kaikilla laitteillasi.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Avaa Asetukset &gt; Tietosuoja &gt; Kamera &gt; Google Chrome ja ota kamera käyttöön.</translation>
 <translation id="5642200033778930880">Google Chrome ei voi käyttää kameraa jaetussa näkymässä.</translation>
 <translation id="5703130498371792817">Pidätkö Chromesta? <ph name="BEGIN_LINK" />Arvostele tämä sovellus<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome-vinkki: Takaisin, Seuraava, Haku ja jotkin muut painikkeet löytyvät nyt näytön alareunasta.</translation>
 <translation id="6036420186814142909">Google Chrome sisältää ominaisuuksia, joiden avulla voit hallita tiedonsiirtoasi ja verkkosivujen latausnopeutta.
 <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Muilla laitteilla Chromessa avaamasi välilehdet näytetään täällä.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Valitut tiedot on poistettu Chromesta ja synkronoiduilta laitteilta. Google-tililläsi voi olla muita selaushistoriatietoja, kuten hakuja ja toimintaa muista Google-palveluista, osoitteessa history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome voi käyttää verkkopalveluita selauskokemuksesi parantamiseen. Voit halutessasi poistaa nämä palvelut käytöstä. <ph name="BEGIN_LINK" />Lisätietoja<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome-vinkki: Voit avata välilehtien lisäasetukset painamalla ylä- tai alapalkissa olevaa Näytä välilehdet ‑painiketta pitkään.</translation>
 </translationbundle>
\ No newline at end of file
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 ccc78db..3114d00 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Notification ng Privacy ng Google Chrome</translation>
 <translation id="1863312987075920112">Sa pamamagitan ng paggamit sa application na ito, sumasang-ayon ka sa <ph name="BEGIN_LINK_TOS" />Mga Tuntunin ng Serbisyo<ph name="END_LINK_TOS" /> at <ph name="BEGIN_LINK_PRIVACY" />Notification ng Privacy<ph name="END_LINK_PRIVACY" /> ng Chrome.</translation>
+<translation id="1878302395768190018">Mako-customize mo ito anumang oras sa Mga Setting ng Chrome</translation>
 <translation id="2147651015520127414">Na-verify ng Chrome na ang <ph name="ISSUER" /> ang nagbigay sa certificate ng website na ito.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Nakalaan ang lahat ng karapatan.</translation>
 <translation id="2342981853652716282">Mag-sign in sa Chrome upang makuha ang iyong mga bookmark, password, at higit pa sa lahat ng device mo.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Buksan ang Settings &gt; Privacy &gt; Camera &gt; Google Chrome at i-on ang camera.</translation>
 <translation id="5642200033778930880">Hindi magamit ng Google Chrome ang iyong camera sa Split View mode</translation>
 <translation id="5703130498371792817">Nag-e-enjoy ka ba sa Chrome? <ph name="BEGIN_LINK" />I-rate ang app na ito<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Tip sa Chrome. Nasa ibaba na ng iyong screen ang ilang button, tulad ng Bumalik, Susunod, at Maghanap.</translation>
 <translation id="6036420186814142909">Ang Google Chrome ay may mga feature na nakakatulong sa iyong pamahalaan ang iyong data sa internet at kung gaano ka kabilis nakakapag-load ng mga webpage.
 <ph name="BEGIN_LINK" />Matuto nang higit pa<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Dito lalabas ang mga nabuksan mong tab sa Chrome sa iba mo pang mga device.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Inalis ang piniling data mula sa Chrome at mga naka-sync na device. Maaaring mayroong ibang mga uri ng history ng pagba-browse ang iyong Google Account gaya ng mga paghahanap at aktibidad mula sa iba pang mga serbisyo ng Google sa history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Maaaring gumamit ang Google Chrome ng mga serbisyo sa web upang mapabuti ang iyong karanasan sa pagba-browse. Opsyonal mong madi-disable ang mga serbisyong ito. <ph name="BEGIN_LINK" />Matuto nang higit pa<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Tip sa Chrome. Para sa higit pang opsyon sa tab, pindutin nang matagal ang button na Ipakita ang Mga Tab sa toolbar, na nasa ibaba o itaas ng iyong screen.</translation>
 </translationbundle>
\ No newline at end of file
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 5555c8f7..c0fab38a 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Avis de confidentialité Google Chrome</translation>
 <translation id="1863312987075920112">En utilisant cette application, vous acceptez les <ph name="BEGIN_LINK_TOS" />Conditions d'utilisation<ph name="END_LINK_TOS" /> et l'<ph name="BEGIN_LINK_PRIVACY" />Avis de confidentialité<ph name="END_LINK_PRIVACY" /> de Chrome.</translation>
+<translation id="1878302395768190018">Vous pouvez personnaliser cette option à tout moment dans les paramètres Chrome</translation>
 <translation id="2147651015520127414">Chrome a confirmé que le certificat de ce site Web a bien été émis par <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Copyright Google Inc. <ph name="YEAR" />. Tous droits réservés.</translation>
 <translation id="2342981853652716282">Connectez-vous à Chrome pour accéder à vos favoris, mots de passe et bien plus sur tous vos appareils.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Ouvrez Paramètres &gt; Confidentialité &gt; Appareil photo &gt; Google Chrome, puis activez l'appareil photo.</translation>
 <translation id="5642200033778930880">Google Chrome ne peut pas utiliser votre appareil photo en mode Vue fractionnée</translation>
 <translation id="5703130498371792817">Vous aimez Chrome ? <ph name="BEGIN_LINK" />Évaluez l'application<ph name="END_LINK" />.</translation>
+<translation id="5854621639439811139">Astuce Chrome : Certains boutons figurent désormais au bas de l'écran. C'est le cas, par exemple, des boutons Arrière, Avant et Rechercher.</translation>
 <translation id="6036420186814142909">Google Chrome dispose de fonctionnalités qui vous permettent de gérer vos données Internet et la vitesse de chargement des pages Web.
 <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Les onglets que vous avez ouverts dans Chrome sur vos autres appareils s'affichent ici.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Les données sélectionnées ont été supprimées de Chrome et des appareils synchronisés. Votre compte Google conserve peut-être d'autres formes d'historique de navigation sur la page history.google.com concernant, par exemple, vos recherches ou vos activités via d'autres services Google.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome peut utiliser des services Web pour améliorer votre confort de navigation. Vous pouvez choisir de désactiver ces services. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Astuce Chrome. Pour afficher plus d'options de l'onglet, appuyez de manière prolongée sur le bouton "Afficher les onglets" situé dans la barre d'outils affichée dans la partie inférieure ou supérieure de l'écran.</translation>
 </translationbundle>
\ No newline at end of file
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 7792c9b5..646b4bee 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome ગોપનીયતા સૂચના</translation>
 <translation id="1863312987075920112">આ ઍપ્લિકેશનનો ઉપયોગ કરીને, તમે Chromeની <ph name="BEGIN_LINK_TOS" />સેવાની શરતો<ph name="END_LINK_TOS" /> અને <ph name="BEGIN_LINK_PRIVACY" />ગોપનીયતા સૂચના<ph name="END_LINK_PRIVACY" /> સાથે સંમત થાઓ છો.</translation>
+<translation id="1878302395768190018">Chrome સેટિંગમાં તમે આને કોઈપણ સમયે કસ્ટમાઇઝ કરી શકો છો</translation>
 <translation id="2147651015520127414">Chrome એ ચકાસણી કરી છે કે <ph name="ISSUER" /> એ આ વેબસાઇટનું પ્રમાણપત્ર ઇસ્યુ કર્યું છે.</translation>
 <translation id="2334084861041072223">કોપિરાઇટ <ph name="YEAR" /> Google Inc. સર્વાધિકાર સુરક્ષિત.</translation>
 <translation id="2342981853652716282">તમારા બધા ઉપકરણો પર તમારા બુકમાર્ક, પાસવર્ડ અને બીજુ ઘણું મેળવવા માટે Chromeમાં સાઇન ઇન કરો.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">સેટિંગ્સ &gt; ગોપનીયતા &gt; કૅમેરો &gt; Google Chrome ખોલો અને કૅમેરો ચાલુ કરો.</translation>
 <translation id="5642200033778930880">Google Chrome, વિભાજિત દૃશ્ય મોડમાં તમારા કૅમેરાનો ઉપયોગ કરી શકતું નથી</translation>
 <translation id="5703130498371792817">Chrome ને માણી રહ્યાં છો? <ph name="BEGIN_LINK" />આ ઍપ્લિકેશનને રેટ કરો<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome ટિપ. પાછળ, ફૉર્વર્ડ અને શોધ જેવાં કેટલાક બટનો હવે તમારી સ્ક્રીનના તળિયે છે.</translation>
 <translation id="6036420186814142909">Google Chrome માં એવી સુવિધાઓ છે જે તમારી તમારા ઇન્ટરનેટ ડેટા અને તમે કેવી રીતે ઝડપથી વેબપૃષ્ઠોને લોડ કરવામાં સમર્થ છો તેનું સંચાલન કરવામાં સહાય કરે છે.
 <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">તમારા અન્ય ઉપકરણો પર તમે Chrome માં ખોલેલા ટૅબ્સ અહીં દેખાશે.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">પસંદ કરેલ ડેટા Chrome અને સમન્વયિત ઉપકરણોમાંથી દૂર કરવામાં આવ્યો છે. તમારા Google એકાઉન્ટમાં બ્રાઉઝિંગ ઇતિહાસના અન્ય સ્વરૂપો જેમ કે શોધ અને history.google.com પરની અન્ય Google સેવાઓમાંથી પ્રવૃત્તિ હોઈ શકે છે.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome તમારા બ્રાઉઝિંગ અનુભવને બહેતર બનાવવા માટે વેબ સેવાઓનો ઉપયોગ કરી શકે છે. તમે વૈકલ્પિક રૂપે આ સેવાઓને અક્ષમ કરી શકો છો. <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome ટિપ. વધુ ટૅબ વિકલ્પો માટે, તમારી સ્ક્રીનના તળિયે અથવા ટોચે આવેલા ટૂલબારમાંના 'ટૅબ બતાવો' બટનને દબાવી રાખો.</translation>
 </translationbundle>
\ No newline at end of file
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 bf119b89..8e328f3 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome निजता सूचना</translation>
 <translation id="1863312987075920112">इस ऐप्‍लिकेशन का इस्तेमाल करके, आप Chrome की <ph name="BEGIN_LINK_TOS" />सेवा की शर्तों<ph name="END_LINK_TOS" /> और <ph name="BEGIN_LINK_PRIVACY" />निजता सूचना<ph name="END_LINK_PRIVACY" /> से सहमत होते हैं.</translation>
+<translation id="1878302395768190018">आप किसी भी समय Chrome सेटिंग में जाकर इसे अपनी पसंद के मुताबिक बना सकते हैं</translation>
 <translation id="2147651015520127414">Chrome ने सत्‍यापित किया है कि वेबसाइट का यह प्रमाणपत्र <ph name="ISSUER" /> ने जारी किया है.</translation>
 <translation id="2334084861041072223">कॉपीराइट <ph name="YEAR" /> Google Inc. सर्वाधिकार सुरक्षित.</translation>
 <translation id="2342981853652716282">अपने सभी डिवाइस पर अपने बुकमार्क, पासवर्ड आदि पाने के लिए Chrome में प्रवेश करें.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">सेटिंग &gt; निजता &gt; कैमरा &gt; Google Chrome खोलें और कैमरा चालू करें.</translation>
 <translation id="5642200033778930880">Google Chrome विभाजित दृश्य मोड में आपके कैमरे का उपयोग नहीं कर सकता</translation>
 <translation id="5703130498371792817">Chrome का आनंद ले रहे हैं? <ph name="BEGIN_LINK" />इस ऐप्लिकेशन को रेट करें<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome सलाह. 'वापस जाएं', 'आगे जाएं' और 'खोजें' जैसे कुछ बटन अब आपकी स्क्रीन के सबसे नीचे मिलेंगे.</translation>
 <translation id="6036420186814142909">Google Chrome में ऐसी सुविधाएं हैं जो आपको अपने इंटरनेट डेटा को प्रबंधित करने और वेबपृष्ठों को तेज़ी से लोड करने में आपकी सहायता करती हैं. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">आपके द्वारा अपने अन्य डिवाइस पर खोले गए टैब यहां दिखाई देंगे.</translation>
 <translation id="6600954340915313787">Chrome पर कॉपी किया गया</translation>
@@ -55,4 +57,5 @@
 <translation id="8459495907675268833">चयनित डेटा Chrome और समन्वयित डिवाइस से निकाल दिया गया है. हो सकता है कि आपके Google खाते में अन्य प्रकार के ब्राउज़िंग इतिहास जैसे खोज और history.google.com पर अन्य Google सेवाओं की गतिविधि हो.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">आपके ब्राउज़िंग अनुभव को बेहतर बनाने के लिए Google Chrome, वेब सेवाओं का उपयोग कर सकता है. आप इन सेवाओं को वैकल्‍पिक रूप से बंद कर सकते हैं. <ph name="BEGIN_LINK" />और जानें<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome सलाह. ज़्यादा टैब विकल्पों के लिए, टूलबार में 'टेब दिखाएं' बटन को दबाकर रखें, जो आपकी स्क्रीन के सबसे नीचे या सबसे ऊपर मिलेगा.</translation>
 </translationbundle>
\ No newline at end of file
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 0a721fb..cfb23240 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Obavijest o privatnosti za Google Chrome</translation>
 <translation id="1863312987075920112">Upotrebom ove aplikacije prihvaćate Chromeove <ph name="BEGIN_LINK_TOS" />uvjete pružanja usluge<ph name="END_LINK_TOS" /> i <ph name="BEGIN_LINK_PRIVACY" />obavijest o privatnosti<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">To možete prilagoditi u bilo kojem trenutku u postavkama Chromea</translation>
 <translation id="2147651015520127414">Chrome je potvrdio da je <ph name="ISSUER" /> izdao certifikat web-lokacije.</translation>
 <translation id="2334084861041072223">Autorska prava <ph name="YEAR" />. Google Inc. Sva prava pridržana.</translation>
 <translation id="2342981853652716282">Prijavite se na Chrome kako biste mogli pristupati svojim oznakama, zaporkama i ostalom na svim svojim uređajima.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Otvorite Postavke &gt; Privatnost &gt; Fotoaparat &gt; Google Chrome i uključite fotoaparat.</translation>
 <translation id="5642200033778930880">Google Chrome ne može upotrebljavati vaš fotoaparat u načinu podijeljenog prikaza</translation>
 <translation id="5703130498371792817">Sviđa vam se Chrome? <ph name="BEGIN_LINK" />Ocijenite aplikaciju<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Savjet za Chrome. Neki se gumbi sada nalaze pri dnu zaslona, primjerice za natrag, naprijed i pretraživanje.</translation>
 <translation id="6036420186814142909">Google Chrome ima značajke koje vam mogu pomoći u upravljanju internetskim podacima i brzinom kojom se učitavaju web-stranice.
 <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Ovdje će se prikazati kartice koje ste otvorili u Chromeu na svojim ostalim uređajima.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Odabrani podaci uklonjeni su iz Chromea i sa sinkroniziranih uređaja. Na Google računu možda postoje drugi oblici povijesti pregledavanja, primjerice pretraživanja i aktivnosti s drugih Googleovih usluga, na stranici history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome može upotrebljavati web-usluge za poboljšanje pregledavanja. Ako želite, možete onemogućiti te usluge. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Savjet za Chrome. Za više opcija kartice pritisnite i zadržite gumb Prikaži kartice na alatnoj traci pri dnu ili vrhu zaslona.</translation>
 </translationbundle>
\ No newline at end of file
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 3870d48..1483d99 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome – Adatvédelmi közlemény</translation>
 <translation id="1863312987075920112">Az alkalmazás használatával elfogadja a Chrome <ph name="BEGIN_LINK_TOS" />Általános Szerződési Feltételeit<ph name="END_LINK_TOS" /> és <ph name="BEGIN_LINK_PRIVACY" />Adatvédelmi közleményét<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Ezt bármikor személyre szabhatja a Chrome beállításaiban</translation>
 <translation id="2147651015520127414">A Chrome ellenőrizte, hogy a(z) <ph name="ISSUER" /> adta ki ezt a webhelytanúsítványt.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Minden jog fenntartva.</translation>
 <translation id="2342981853652716282">Jelentkezzen be a Chrome-ba, hogy az összes eszközén hozzáférhessen könyvjelzőihez, jelszavaihoz és más beállításaihoz.</translation>
@@ -38,6 +39,7 @@
 <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>
 <translation id="5642200033778930880">A Google Chrome Osztott nézet módban nem tudja használni a kamerát</translation>
 <translation id="5703130498371792817">Kedveli a Chrome-ot? <ph name="BEGIN_LINK" />Értékelje az alkalmazást<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Tipp a Chrome használatához. Egyes gombok (például a Vissza, az Előre vagy a Keresés) mostantól a képernyő alján jelennek meg.</translation>
 <translation id="6036420186814142909">A Google Chrome számos olyan funkciót biztosít, amelyek segítik internetes adatainak kezelésében, illetve a weboldalak betöltési gyorsaságának beállításában.
 <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">A más eszközökön futó Chrome böngészőben megnyitott lapok itt jelennek meg.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">A kiválasztott adatokat eltávolítottuk a Chrome-ból és a szinkronizált eszközökről. Előfordulhat, hogy Google-fiókjában (a history.google.com címen) még szerepelnek a böngészési előzmények egyéb formái, így például a keresések és egyéb tevékenységek más Google-szolgáltatásokból.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Előfordulhat, hogy a Google Chrome internetes szolgáltatásokat használ böngészési élménye javítására. Lehetősége van e szolgáltatások letiltására. <ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Tipp a Chrome használatához. A további lapbeállításokhoz tartsa lenyomva az eszköztárban lévő Lapok megjelenítése gombot, amely a képernyő alsó vagy felső részén található.</translation>
 </translationbundle>
\ No newline at end of file
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 551fe391..4920a7a 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Pemberitahuan Privasi Google Chrome</translation>
 <translation id="1863312987075920112">Dengan menggunakan aplikasi ini, Anda menyetujui <ph name="BEGIN_LINK_TOS" />Persyaratan Layanan<ph name="END_LINK_TOS" /> dan <ph name="BEGIN_LINK_PRIVACY" />Pemberitahuan Privasi<ph name="END_LINK_PRIVACY" /> Chrome.</translation>
+<translation id="1878302395768190018">Anda dapat menyesuaikan ini kapan saja di Setelan Chrome</translation>
 <translation id="2147651015520127414">Chrome memverifikasi bahwa <ph name="ISSUER" /> menerbitkan sertifikat situs web ini.</translation>
 <translation id="2334084861041072223">Hak cipta <ph name="YEAR" /> Google Inc. Semua hak dilindungi undang-undang.</translation>
 <translation id="2342981853652716282">Login ke Chrome untuk mendapatkan bookmark, sandi, dan lainnya di semua perangkat Anda.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Buka Setelan &gt; Privasi &gt; Kamera &gt; Google Chrome, lalu aktifkan kamera.</translation>
 <translation id="5642200033778930880">Google Chrome tidak dapat menggunakan kamera dalam mode Layar Terpisah</translation>
 <translation id="5703130498371792817">Suka menggunakan Chrome? <ph name="BEGIN_LINK" />Beri nilai aplikasi ini<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Tips Chrome. Beberapa tombol sekarang terdapat di bagian bawah layar, seperti Kembali, Teruskan, dan Telusuri.</translation>
 <translation id="6036420186814142909">Google Chrome memiliki fitur yang dapat membantu Anda mengelola data internet dan seberapa cepat Anda dapat memuat halaman web.
 <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Tab yang telah dibuka di Chrome pada perangkat lainnya akan muncul di sini.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Data yang dipilih telah dihapus dari Chrome dan perangkat yang disinkronkan. Akun Google Anda mungkin memiliki bentuk histori penjelajahan lain seperti penelusuran dan aktivitas dari layanan Google lainnya di history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome dapat menggunakan layanan web untuk meningkatkan pengalaman penjelajahan Anda. Anda dapat memilih untuk menonaktifkan layanan ini. <ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Tips Chrome. Untuk opsi tab lainnya, tekan dan tahan tombol Tampilkan Tab di toolbar, yang terdapat di bagian bawah atau atas layar.</translation>
 </translationbundle>
\ No newline at end of file
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 3ba51fa..ab4104d 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Informativa sulla privacy di Google Chrome</translation>
 <translation id="1863312987075920112">Se usi questa applicazione, accetti i <ph name="BEGIN_LINK_TOS" />Termini di servizio<ph name="END_LINK_TOS" /> e l'<ph name="BEGIN_LINK_PRIVACY" />Informativa sulla privacy<ph name="END_LINK_PRIVACY" /> di Chrome.</translation>
+<translation id="1878302395768190018">Puoi personalizzare questa opzione in qualsiasi momento nelle Impostazioni di Chrome</translation>
 <translation id="2147651015520127414">Chrome ha verificato che <ph name="ISSUER" /> ha emesso il certificato del sito web.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Tutti i diritti riservati.</translation>
 <translation id="2342981853652716282">Accedi a Chrome per trovare i tuoi preferiti, le password e altre impostazioni su tutti i tuoi dispositivi.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Apri impostazioni &gt; Privacy &gt; Fotocamera &gt; Google Chrome e attiva la videocamera.</translation>
 <translation id="5642200033778930880">Google Chrome non può utilizzare la videocamera in modalità Visualizzazione divisa</translation>
 <translation id="5703130498371792817">Ti piace Chrome? <ph name="BEGIN_LINK" />Valuta questa app<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Suggerimento per Chrome. Alcuni pulsanti ora si trovano nella parte inferiore della schermata, ad esempio Indietro, Avanti e Cerca.</translation>
 <translation id="6036420186814142909">Google Chrome offre funzioni che ti consentono di gestire i tuoi dati Internet e la velocità di caricamento delle pagine web.
 <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Le schede aperte in Chrome sugli altri dispositivi verranno visualizzate qui.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">I dati selezionati sono stati rimossi da Chrome e dai dispositivi sincronizzati. Il tuo account Google potrebbe avere altre forme di cronologia di navigazione, ad esempio ricerche e attività, di altri servizi Google alla pagina history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome potrebbe utilizzare servizi web per migliorare la tua esperienza di navigazione. Se preferisci, puoi disattivare questi servizi. <ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Suggerimento per Chrome. Per vedere più opzioni sulla scheda, tieni premuto il pulsante Mostra schede della barra degli strumenti, che si trova nella parte inferiore o superiore della schermata.</translation>
 </translationbundle>
\ No newline at end of file
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 e83802e..96c2c28 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">‏הודעת פרטיות של Google Chrome</translation>
 <translation id="1863312987075920112">‏שימוש באפליקציה הזו מהווה הסכמה ל<ph name="BEGIN_LINK_TOS" />תנאים ולהגבלות<ph name="END_LINK_TOS" /> ול<ph name="BEGIN_LINK_PRIVACY" />הודעת הפרטיות<ph name="END_LINK_PRIVACY" /> של Chrome.</translation>
+<translation id="1878302395768190018">‏אפשר תמיד להתאים אישית דרך הגדרות Chrome</translation>
 <translation id="2147651015520127414">‏Chrome אימת ש-<ph name="ISSUER" /> הנפיק את האישור של אתר זה.</translation>
 <translation id="2334084861041072223">‏Copyright <ph name="YEAR" /> Google Inc.‎. כל הזכויות שמורות.</translation>
 <translation id="2342981853652716282">‏היכנס אל Chrome כדי לקבל גישה אל הסימניות, הסיסמאות ונתונים נוספים בכל המכשירים שלך.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">‏עבור אל 'הגדרות' &gt; 'פרטיות' &gt; 'מצלמה' &gt; Google Chrome והפעל את המצלמה.</translation>
 <translation id="5642200033778930880">‏Google Chrome אינו יכול להשתמש במצלמה במצב תצוגה מפוצלת</translation>
 <translation id="5703130498371792817">‏נהנה מ-Chrome? ‏<ph name="BEGIN_LINK" />דרג את האפליקציה<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">‏טיפ למשתמשי Chrome. חלק מהלחצנים נמצאים עכשיו בחלק התחתון של המסך, כמו 'הקודם', 'קדימה' ו'חיפוש'.</translation>
 <translation id="6036420186814142909">‏Google Chrome כולל תכונות שעוזרות לך לנהל את נתוני האינטרנט שלך ואת המהירות שבה תוכל לטעון דפים.
 <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">‏כרטיסיות שפתחת ב-Chrome במכשירים האחרים שלך יופיעו כאן.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">‏הנתונים שבחרת הוסרו מ-Chrome ומהמכשירים המסונכרנים. ייתכן שבכתובת history.google.com תוכל לגשת לסוגים אחרים של היסטוריית גלישה בחשבון Google, כמו חיפושים ופעילות משירותי Google אחרים.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">‏Google Chrome עשוי להשתמש בשירותי אינטרנט לשיפור חוויית הגלישה שלך. ניתן להשבית את השירותים האלה. <ph name="BEGIN_LINK" />למידע נוסף<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">‏טיפ למשתמשי Chrome. כדי לקבל יותר אפשרויות של כרטיסיות, יש ללחוץ לחיצה ארוכה על הלחצן 'הצגת כרטיסיות' בסרגל הכלים, שנמצא בחלק התחתון או העליון של המסך.</translation>
 </translationbundle>
\ No newline at end of file
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 36e9930..7fa27df 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome のプライバシーに関するお知らせ</translation>
 <translation id="1863312987075920112">このアプリケーションを使用すると、Chrome の<ph name="BEGIN_LINK_TOS" />利用規約<ph name="END_LINK_TOS" />と<ph name="BEGIN_LINK_PRIVACY" />プライバシーに関するお知らせ<ph name="END_LINK_PRIVACY" />に同意したことになります。</translation>
+<translation id="1878302395768190018">この設定は Chrome の [設定] ページでいつでもカスタマイズできます</translation>
 <translation id="2147651015520127414">このウェブサイトの証明書が <ph name="ISSUER" /> 発行のものであると確認されました。</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation>
 <translation id="2342981853652716282">Chrome にログインすれば、ブックマーク、パスワード、その他の設定をどの端末からでもご利用いただけます。</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">[設定] &gt; [プライバシー] &gt; [カメラ] &gt; [Google Chrome] の順に選択し、カメラをオンにします。</translation>
 <translation id="5642200033778930880">Google Chrome では、分割表示モードでカメラを使用することはできません</translation>
 <translation id="5703130498371792817">Chrome の使用感はいかがですか?<ph name="BEGIN_LINK" />このアプリを評価してください。<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome の使い方のヒント: 戻る、進む、検索など一部のボタンは画面の下部に表示されるようになりました。</translation>
 <translation id="6036420186814142909">Google Chromeには、インターネットのデータやウェブページの読み込み速度を管理できる機能があります。
 <ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">他の端末の Chrome で開いているタブがここに表示されます。</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">選択したデータが Chrome から削除され、同期された端末からも削除されました。他の Google サービスでの検索や操作など、Google アカウントの他の形式の閲覧履歴が history.google.com に残ることがあります。</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chromeは、より快適なブラウジングを提供する目的でウェブサービスを使用することがあります。これらのサービスは無効にすることもできます。<ph name="BEGIN_LINK" />詳細<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome の使い方のヒント: タブのオプションをさらに表示するには、画面の下部または上部のツールバーにある [タブを表示] を押し続けます。</translation>
 </translationbundle>
\ No newline at end of file
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 177ae04..8853020 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome ಗೌಪ್ಯತಾ ಸೂಚನೆ</translation>
 <translation id="1863312987075920112">ಈ ಅಪ್ಲಿಕೇಶನ್‌ ಬಳಸುವ ಮೂಲಕ, ನೀವು Chrome ನ <ph name="BEGIN_LINK_TOS" />ಸೇವಾ ನಿಯಮಗಳು<ph name="END_LINK_TOS" /> ಮತ್ತು <ph name="BEGIN_LINK_PRIVACY" />ಗೌಪ್ಯತೆ ಸೂಚನೆ<ph name="END_LINK_PRIVACY" /> ಗೆ ಸಮ್ಮತಿಸುತ್ತೀರಿ.</translation>
+<translation id="1878302395768190018">Chrome ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಇದನ್ನು ನೀವು ಯಾವುದೇ ಸಮಯದಲ್ಲಿ ಬೇಕಾದರೂ ಕಸ್ಟಮೈಸ್ ಮಾಡಬಹುದು</translation>
 <translation id="2147651015520127414">ಈ ವೆಬ್‌ಸೈಟ್‌ನ ಪ್ರಮಾಣಪತ್ರವನ್ನು <ph name="ISSUER" /> ನೀಡಿದೆ ಎಂಬುದಾಗಿ Chrome ಪರಿಶೀಲಿಸಿದೆ.</translation>
 <translation id="2334084861041072223">ಹಕ್ಕುಸ್ವಾಮ್ಯ <ph name="YEAR" /> Google Inc. ಎಲ್ಲಾ ಹಕ್ಕುಗಳನ್ನು ಕಾಯ್ದಿರಿಸಲಾಗಿದೆ.</translation>
 <translation id="2342981853652716282">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇನ್ನಷ್ಟನ್ನು ನಿಮ್ಮ ಎಲ್ಲಾ ಸಾಧನಗಳಲ್ಲಿ ಪಡೆದುಕೊಳ್ಳಲು Chrome ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">ಸೆಟ್ಟಿಂಗ್‌ಗಳು &gt; ಗೌಪ್ಯತೆ &gt; ಕ್ಯಾಮರಾ &gt; Google Chrome ತೆರೆಯಿರಿ ಮತ್ತು ಕ್ಯಾಮರಾ ಆನ್ ಮಾಡಿ.</translation>
 <translation id="5642200033778930880">ವಿಭಜಿತ ವೀಕ್ಷಣೆ ಮೋಡ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಕ್ಯಾಮರಾವನ್ನು Google Chrome ಗೆ ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ</translation>
 <translation id="5703130498371792817">Chrome ಆನಂದಿಸುತ್ತಿರುವಿರಾ? <ph name="BEGIN_LINK" />ಈ ಅಪ್ಲಿಕೇಶನ್ ರೇಟ್ ಮಾಡಿ<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome ಸಲಹೆ. ಹಿಂದೆ, ಮುಂದೆ ಮತ್ತು ಹುಡುಕಾಟದಂತಹ ಕೆಲವು ಬಟನ್‌ಗಳು ಈಗ ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗದಲ್ಲಿವೆ.</translation>
 <translation id="6036420186814142909">Google Chrome ನಿಮ್ಮ ಇಂಟರ್ನೆಟ್ ಡೇಟಾವನ್ನು ನಿರ್ವಹಿಸಲು ಮತ್ತು ನೀವು ವೆಬ್‌ ಪುಟಗಳನ್ನು ಬೇಗನೆ ಲೋಡ್ ಮಾಡಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುವ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಹೊಂದಿದೆ.
 <ph name="BEGIN_LINK" />ಹೆಚ್ಚು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">ನಿಮ್ಮ ಇತರ ಸಾಧನಗಳಲ್ಲಿನ Chrome ನಲ್ಲಿ ನೀವು ತೆರೆದಿರುವಂತಹ ಟ್ಯಾಬ್‌ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">ಆಯ್ಕೆಮಾಡಲಾದ ಡೇಟಾವನ್ನು Chrome ಮತ್ತು ಸಿಂಕ್ ಮಾಡಲ್ಪಟ್ಟ ಸಾಧನಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ. ನಿಮ್ಮ Google ಖಾತೆಯು history.google.com ನಲ್ಲಿ ಇತರ Google ಸೇವೆಗಳಿಂದ ಹುಡುಕಾಟಗಳು ಮತ್ತು ಚಟುವಟಿಕೆಯಂತಹ ಬ್ರೌಸಿಂಗ್ ಹುಡುಕಾಟಗಳ ಇತರ ಪ್ರಕಾರಗಳನ್ನು ಹೊಂದಿರಬಹುದು.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ಅನುಭವವನ್ನು ಉತ್ತಮಗೊಳಿಸಲು ವೆಬ್‍ ಸೇವೆಗಳನ್ನು ಬಳಸಬಹುದು. ನಿಮಗೆ ಬೇಡವೆಂದಾಗ ಈ ಸೇವೆಗಳನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬಹುದು. <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome ಸಲಹೆ. ಇನ್ನಷ್ಟು ಟ್ಯಾಬ್ ಆಯ್ಕೆಗಳಿಗಾಗಿ, ನಿಮ್ಮ ಪರದೆಯ ಕೆಳಭಾಗ ಅಥವಾ ಮೇಲ್ಭಾಗದಲ್ಲಿರುವ ಟ್ಯಾಬ್‌ಗಳನ್ನು ತೋರಿಸಿ ಬಟನ್ ಅನ್ನು ಒತ್ತಿಹಿಡಿಯಿರಿ.</translation>
 </translationbundle>
\ No newline at end of file
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 076823b..7b7fbbc 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Chrome 개인정보처리방침</translation>
 <translation id="1863312987075920112">이 애플리케이션을 사용하면 Chrome의 <ph name="BEGIN_LINK_TOS" />서비스 약관<ph name="END_LINK_TOS" /> 및 <ph name="BEGIN_LINK_PRIVACY" />개인정보처리방침<ph name="END_LINK_PRIVACY" />에 동의하는 것으로 간주됩니다.</translation>
+<translation id="1878302395768190018">Chrome 설정에서 언제든지 맞춤설정할 수 있습니다.</translation>
 <translation id="2147651015520127414">Chrome이 <ph name="ISSUER" />에서 이 웹사이트의 인증서를 발행했음을 확인했습니다.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. All rights reserved.</translation>
 <translation id="2342981853652716282">Chrome에 로그인하여 모든 기기에서 내 북마크, 비밀번호 등을 사용하세요.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">설정 &gt; 개인정보 보호 &gt; 카메라 &gt; Chrome을 열고 카메라를 사용 설정하세요.</translation>
 <translation id="5642200033778930880">Chrome에서는 분할 모드에서 카메라를 사용할 수 없습니다.</translation>
 <translation id="5703130498371792817">Chrome 사용 소감을 알려주세요! <ph name="BEGIN_LINK" />앱 평가하기<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome 도움말. 뒤로, 앞으로, 검색과 같은 일부 버튼이 화면 하단으로 이동했습니다.</translation>
 <translation id="6036420186814142909">Chrome에는 사용자가 간편하게 인터넷 데이터 및 웹페이지 로드 시간을 관리할 수 있는 기능이 있습니다.
 <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">다른 기기의 Chrome에서 연 탭이 여기에 표시됩니다.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">선택한 데이터가 Chrome 및 동기화된 기기에서 삭제되었습니다. history.google.com에서 검색이나 기타 Google 서비스에서의 활동 등 내 Google 계정에 있는 다른 형식의 탐색 기록을 확인할 수 있습니다.</translation>
 <translation id="8540666473246803645">Chrome</translation>
 <translation id="8606668294522778825">Chrome에서 사용자에게 더 나은 인터넷 사용 환경을 제공하기 위해 웹 서비스를 사용할 수 있습니다. 원하는 경우 서비스를 사용 중지하실 수 있습니다. <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome 도움말. 더 많은 탭 옵션을 보려면 화면 하단이나 상단에 있는 툴바에서 탭 표시 버튼을 길게 누릅니다.</translation>
 </translationbundle>
\ No newline at end of file
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 8512cc4..b370fe6 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">„Google Chrome“ privatumo pranešimas</translation>
 <translation id="1863312987075920112">Naudodami šią programą sutinkate su „Chrome“ <ph name="BEGIN_LINK_TOS" />paslaugų teikimo sąlygomis<ph name="END_LINK_TOS" /> ir <ph name="BEGIN_LINK_PRIVACY" />privatumo pranešimo<ph name="END_LINK_PRIVACY" /> sąlygomis.</translation>
+<translation id="1878302395768190018">Tai galite bet kada tinkinti „Chrome“ nustatymuose</translation>
 <translation id="2147651015520127414">„Chrome“ patvirtino, kad „<ph name="ISSUER" />“ išdavė šį svetainės sertifikatą.</translation>
 <translation id="2334084861041072223">Autorių teisės priklauso „Google Inc.“, <ph name="YEAR" /> m. Visos teisės saugomos.</translation>
 <translation id="2342981853652716282">Prisijunkite prie „Chrome“, kad galėtumėte naudoti žymes, slaptažodžius ir kitus nustatymus visuose įrenginiuose.</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 a576fc1af..16b4cb9c 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome konfidencialitātes paziņojums</translation>
 <translation id="1863312987075920112">Izmantojot šo lietojumprogrammu, jūs piekrītat Chrome <ph name="BEGIN_LINK_TOS" />pakalpojumu sniegšanas noteikumiem<ph name="END_LINK_TOS" /> un <ph name="BEGIN_LINK_PRIVACY" />konfidencialitātes paziņojumam<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Varat to jebkurā laikā pielāgot Chrome iestatījumos</translation>
 <translation id="2147651015520127414">Chrome apstiprināja, ka <ph name="ISSUER" /> izsniedza šīs vietnes sertifikātu.</translation>
 <translation id="2334084861041072223">Autortiesības <ph name="YEAR" /> Google Inc. Visas tiesības paturētas.</translation>
 <translation id="2342981853652716282">Pierakstieties pārlūkā Chrome, lai iegūtu savas grāmatzīmes, paroles un citu saturu visās savās ierīcēs.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Atveriet sadaļu Iestatījumi &gt; Konfidencialitāte &gt; Kamera &gt; Google Chrome un ieslēdziet kameru.</translation>
 <translation id="5642200033778930880">Google Chrome nevar izmantot kameru dalītā skata režīmā.</translation>
 <translation id="5703130498371792817">Vai jums patīk izmantot Chrome? <ph name="BEGIN_LINK" />Novērtējiet šo lietotni<ph name="END_LINK" />.</translation>
+<translation id="5854621639439811139">Chrome padoms. Tagad ekrāna apakšdaļā ir dažas pogas, piemēram, Atpakaļ, Pārsūtīt un Meklēt.</translation>
 <translation id="6036420186814142909">Pārlūkā Google Chrome ir funkcijas, ko varat izmantot, lai pārvaldītu interneta datus un tīmekļa lapu ielādes ātrumu.
 <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
 <translation id="6573431926118603307">Šeit būs redzamas cilnes, kuras esat atvēris pārlūkā Chrome citās ierīcēs.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Atlasītie dati ir noņemti no pārlūka Chrome un sinhronizētajām ierīcēm. Jūsu Google kontam vietnē history.google.com var būt citu veidu pārlūkošanas vēstures dati, piemēram, meklēšanas vaicājumi un darbības citos Google pakalpojumos.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome var izmantot tīmekļa pakalpojumus, lai uzlabotu jūsu pārlūkošanas pieredzi. Jūs varat arī atspējot šos pakalpojumus. <ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" />.</translation>
+<translation id="96145293669295453">Chrome padoms. Lai iegūtu vairāk ciļņu iespējas, rīkjoslā, kas atrodas ekrāna apakšdaļā vai augšdaļā, nospiediet un turiet pogu Rādīt cilnes.</translation>
 </translationbundle>
\ No newline at end of file
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 273612a..646df21 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome സ്വകാര്യതാ അറിയിപ്പ്</translation>
 <translation id="1863312987075920112">ഈ ആപ്ലിക്കേഷൻ ഉപയോഗിക്കുക വഴി, Chrome-ന്‍റെ <ph name="BEGIN_LINK_TOS" />സേവന നിബന്ധനകളും<ph name="END_LINK_TOS" /> <ph name="BEGIN_LINK_PRIVACY" />സ്വകാര്യതാ അറിയിപ്പും<ph name="END_LINK_PRIVACY" /> നിങ്ങൾ അംഗീകരിക്കുകയാണ്.</translation>
+<translation id="1878302395768190018">Chrome ക്രമീകരണത്തിൽ, ഏത് സമയത്തും നിങ്ങൾക്കിത് ഇഷ്‌ടാനുസൃതമാക്കാം</translation>
 <translation id="2147651015520127414">ഈ വെബ്‌സൈറ്റിന്റെ സർട്ടിഫിക്കറ്റ് <ph name="ISSUER" /> നൽകിയതാണെന്ന് Chrome പരിശോധിച്ചുറപ്പിച്ചു.</translation>
 <translation id="2334084861041072223">പകർപ്പവകാശം <ph name="YEAR" /> Google Inc. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്‌തം.</translation>
 <translation id="2342981853652716282">നിങ്ങളുടെ ബുക്ക്‌മാർക്കുകളും  ‌പാസ്‌വേഡുകളും മറ്റും എല്ലാ ഉപകരണങ്ങളിലും ലഭ്യമാക്കുന്നതിന് Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">ക്രമീകരണം &gt; സ്വകാര്യത &gt; ക്യാമറ &gt; Google Chrome തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation>
 <translation id="5642200033778930880">വിഭജിത കാഴ്‌ച മോഡിൽ Google Chrome-ന് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="5703130498371792817">Chrome ആസ്വദിക്കുന്നുണ്ടോ? <ph name="BEGIN_LINK" />ഈ ആപ്പ് റേറ്റുചെയ്യുക<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome നുറുങ്ങ്. ബാക്ക്, മുമ്പോട്ട് പോകാനുള്ളത് തുടങ്ങിയ ചില ബട്ടണുകൾ, ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
 <translation id="6036420186814142909">നിങ്ങളുടെ ഇന്റർനെറ്റ് ഡാറ്റ നിയന്ത്രിക്കുന്നതിനെയും വെബ്‌പേജുകൾ നിങ്ങൾക്ക് എങ്ങനെ വേഗത്തിൽ ലോഡുചെയ്യാനാകുമെന്നതിനെയും സഹായിക്കുന്ന സവിശേഷതകൾ Google Chrome-നുണ്ട്.
 <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിലെ Chrome-ൽ തുറന്ന ടാബുകൾ ഇവിടെ ദൃശ്യമാകും.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">തിരഞ്ഞെടുത്ത ഡാറ്റയെ Chrome-ൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കംചെയ്‌തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് history.google.com എന്നതിൽ മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകൾ, പ്രവൃത്തി എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">നിങ്ങളുടെ ബ്രൗസിംഗ് അനുഭവം മെച്ചപ്പെടുത്താൻ Google Chrome വെബ് സേവനങ്ങൾ ഉപയോഗിക്കാനിടയുണ്ട്. നിങ്ങൾക്ക് ഈ സേവനങ്ങൾ ഓപ്‌ഷണലായി പ്രവർത്തനരഹിതമാക്കാം. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome നുറുങ്ങ്. കൂടുതൽ ടാബ് ഓപ്ഷനുകൾക്കായി, നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയോ മുകളിലോ ഉള്ള, ടൂൾബാറിലെ ബട്ടൺ ഷോ ടാബുകൾ, അമർത്തിപ്പിടിക്കുക.</translation>
 </translationbundle>
\ No newline at end of file
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 27382be3..754311df 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome गोपनीयता सूचना</translation>
 <translation id="1863312987075920112">हे अॅप्लिकेशन वापरून, तुम्ही Chrome च्या <ph name="BEGIN_LINK_TOS" />सेवा अटी<ph name="END_LINK_TOS" /> आणि <ph name="BEGIN_LINK_PRIVACY" />गोपनीयता सूचने<ph name="END_LINK_PRIVACY" /> ला सहमती देता.</translation>
+<translation id="1878302395768190018">तुम्ही Chrome सेटिंग्जमध्ये हे कधीही कस्टमाइझ करू शकता</translation>
 <translation id="2147651015520127414"><ph name="ISSUER" /> ने या वेबसाइटचे प्रमाणपत्र जारी केले हे Chrome ने सत्यापित केले.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. सर्व हक्क राखीव.</translation>
 <translation id="2342981853652716282">तुमच्या सर्व डिव्हाइसवर तुमचे बुकमार्क, पासवर्ड आणि अधिक मिळवण्यासाठी 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 0b97f23f..f8939ca 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Notis Privasi Google Chrome</translation>
 <translation id="1863312987075920112">Apabila menggunakan aplikasi ini, anda bersetuju menerima <ph name="BEGIN_LINK_TOS" />Syarat Perkhidmatan<ph name="END_LINK_TOS" /> dan <ph name="BEGIN_LINK_PRIVACY" />Notis Privasi<ph name="END_LINK_PRIVACY" /> Chrome.</translation>
+<translation id="1878302395768190018">Anda boleh menyesuaikan pilihan ini pada bila-bila masa dalam Tetapan Chrome</translation>
 <translation id="2147651015520127414">Chrome mengesahkan bahawa <ph name="ISSUER" /> telah mengeluarkan sijil tapak web ini.</translation>
 <translation id="2334084861041072223">Hak Cipta <ph name="YEAR" /> Google Inc. Hak cipta terpelihara.</translation>
 <translation id="2342981853652716282">Log masuk ke Chrome untuk mendapatkan penanda halaman, kata laluan anda dan pelbagai lagi pada semua peranti anda.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Buka Tetapan &gt; Privasi &gt; Kamera &gt; Google Chrome dan hidupkan kamera.</translation>
 <translation id="5642200033778930880">Google Chrome tidak dapat menggunakan kamera anda dalam mod Paparan Pisah</translation>
 <translation id="5703130498371792817">Seronok menggunakan Chrome? <ph name="BEGIN_LINK" />Nilaikan apl ini<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Petua Chrome. Sesetengah butang kini terletak di bahagian bawah skrin anda, seperti Kembali, Ke Hadapan dan Carian.</translation>
 <translation id="6036420186814142909">Google Chrome mempunyai ciri-ciri yang membantu anda mengurus data internet anda dan berapa cepat anda mampu memuatkan halaman web.
 <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Tab yang telah anda buka dalam Chrome pada peranti anda yang lain akan dipaparkan di sini.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Data yang dipilih telah dialih keluar daripada Chrome dan peranti yang disegerakkan. Akaun Google anda mungkin mempunyai sejarah penyemakan imbas dalam bentuk lain seperti carian dan aktiviti daripada perkhidmatan Google yang lain di history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome mungkin menggunakan perkhidmatan web untuk meningkatkan pengalaman semakan imbas anda. Anda boleh memilih untuk melumpuhkan perkhidmatan ini. <ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Petua Chrome. Untuk melihat lebih banyak pilihan tab, tekan dan tahan butang Tunjukkan Tab dalam bar alat, yang terletak di bahagian bawah atau atas skrin anda.</translation>
 </translationbundle>
\ No newline at end of file
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 cae3599..87c0477 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Privacybeleid voor Google Chrome</translation>
 <translation id="1863312987075920112">Als je deze app gebruikt, ga je akkoord met de <ph name="BEGIN_LINK_TOS" />Servicevoorwaarden<ph name="END_LINK_TOS" /> en het <ph name="BEGIN_LINK_PRIVACY" />Privacybeleid<ph name="END_LINK_PRIVACY" /> van Chrome.</translation>
+<translation id="1878302395768190018">Je kunt dit op elk gewenst moment aanpassen in de Chrome-instellingen</translation>
 <translation id="2147651015520127414">Chrome heeft geverifieerd dat <ph name="ISSUER" /> het certificaat voor deze website heeft verstrekt.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Alle rechten voorbehouden.</translation>
 <translation id="2342981853652716282">Log in bij Chrome om je bladwijzers, wachtwoorden en meer op al je apparaten op te halen.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Open Instellingen &gt; Privacy &gt; Camera &gt; Google Chrome en zet de camera aan.</translation>
 <translation id="5642200033778930880">Google Chrome kan je camera niet gebruiken in de modus 'Gesplitste weergave'</translation>
 <translation id="5703130498371792817">Ben je fan van Chrome? <ph name="BEGIN_LINK" />Beoordeel deze app<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome-tip. Sommige knoppen zoals Terug, Vooruit en Zoeken worden nu onderaan het scherm weergegeven.</translation>
 <translation id="6036420186814142909">Google Chrome bevat functies die je helpen je internetgegevens te beheren en te bepalen hoe snel je webpagina's kunt laden.
 <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Tabbladen die je op andere apparaten in Chrome hebt geopend, worden hier weergegeven.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">De geselecteerde gegevens zijn verwijderd uit Chrome en van gesynchroniseerde apparaten. Voor je Google-account kunnen andere vormen van browsegeschiedenis (zoals zoekopdrachten en activiteit uit andere Google-services) beschikbaar zijn via history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome kan webservices gebruiken om je browse-ervaring te verbeteren. Je kunt deze services eventueel uitschakelen. <ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome-tip. Voor meer tabbladopties tik je op de werkbalk onder- of bovenaan het scherm op de knop 'Tabbladen weergeven' en houd je deze knop vast.</translation>
 </translationbundle>
\ No newline at end of file
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 99c13ff..bc5eb308 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Merknad om personvern for Google Chrome</translation>
 <translation id="1863312987075920112">Ved å bruke denne appen samtykker du i Chromes <ph name="BEGIN_LINK_TOS" />vilkår for bruk<ph name="END_LINK_TOS" /> og <ph name="BEGIN_LINK_PRIVACY" />merknad om personvern<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Du kan når som helst tilpasse dette i Chrome-innstillingene</translation>
 <translation id="2147651015520127414">Chrome bekreftet at sertifikatet for dette nettstedet er utstedt av <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Med enerett.</translation>
 <translation id="2342981853652716282">Logg på Chrome for å hente blant annet bokmerkene og passordene dine på alle enhetene du bruker.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Åpne Innstillinger &gt; Personvern &gt; Kamera &gt; Google Chrome, og slå på kameraet.</translation>
 <translation id="5642200033778930880">Google Chrome kan ikke bruke kameraet i modus for delt visning</translation>
 <translation id="5703130498371792817">Liker du Chrome? <ph name="BEGIN_LINK" />Vurder denne appen<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome tips. Noen knapper, som Tilbake, Fremover og Søk, er nå nederst på skjermen.</translation>
 <translation id="6036420186814142909">Google Chrome har funksjoner som hjelper deg med å administrere dataforbruket ditt og hastigheten for innlasting av nettsider.
 <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Faner du har åpnet i Chrome på de andre enhetene dine, vises her.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">De valgte dataene er fjernet fra Chrome og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettlesingslogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome bruker nettjenester for å forbedre nettopplevelsen din. Du kan deaktivere disse tjenestene. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome tips. For flere fanealternativer, trykk og hold ned Vis fane-knappen i verktøylinjen, som du finner nederst eller øverst på skjermen.</translation>
 </translationbundle>
\ No newline at end of file
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 cef02aa..070668f2 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Informacje na temat ochrony prywatności w Chrome</translation>
 <translation id="1863312987075920112">Korzystając z tej aplikacji, akceptujesz <ph name="BEGIN_LINK_TOS" />Warunki korzystania z Chrome<ph name="END_LINK_TOS" /> i <ph name="BEGIN_LINK_PRIVACY" />Informacje na temat ochrony prywatności w Chrome<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Możesz w dowolnym momencie zmienić tę opcję w Ustawieniach Chrome</translation>
 <translation id="2147651015520127414">Chrome sprawdził, że wydawcą certyfikatu tej witryny jest <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Wszelkie prawa zastrzeżone.</translation>
 <translation id="2342981853652716282">Zaloguj się w Chrome, by mieć dostęp do swoich zakładek, haseł i innych ustawień na wszystkich swoich urządzeniach.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Wybierz Ustawienia &gt; Prywatność &gt; Aparat &gt; Google Chrome i włącz aparat.</translation>
 <translation id="5642200033778930880">Google Chrome nie może używać aparatu w trybie widoku dzielonego</translation>
 <translation id="5703130498371792817">Lubisz Chrome? <ph name="BEGIN_LINK" />Oceń tę aplikację<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Wskazówka dla użytkowników Chrome. Niektóre przyciski (na przykład Wstecz, Dalej i Szukaj) znajdują się teraz na dole ekranu.</translation>
 <translation id="6036420186814142909">W Google Chrome są funkcje, które pomogą Ci zarządzać szybkością wczytywania stron internetowych oraz danymi przesyłanymi przez sieć.
 <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Tutaj wyświetlą się karty otwarte w Chrome na innych urządzeniach.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Wybrane dane zostały usunięte z Chrome i synchronizowanych urządzeń. Inne rodzaje historii przeglądania, takie jak wyszukiwania i aktywność w innych usługach Google, mogą być nadal dostępne na Twoim koncie Google na history.google.com</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Aby poprawić wygodę przeglądania, Google Chrome może korzystać z usług internetowych. Możesz je opcjonalnie wyłączyć. <ph name="BEGIN_LINK" />Dowiedz się więcej<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Wskazówka dla użytkowników Chrome. Aby zobaczyć więcej opcji kart, naciśnij i przytrzymaj przycisk Pokaż karty na pasku narzędzi, który znajduje się na dole lub górze ekranu.</translation>
 </translationbundle>
\ No newline at end of file
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 bc3abe2..c1044c3 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de Privacidade do Google Chrome</translation>
 <translation id="1863312987075920112">Ao usar este aplicativo, você concorda com os <ph name="BEGIN_LINK_TOS" />Termos de Serviço<ph name="END_LINK_TOS" /> e o <ph name="BEGIN_LINK_PRIVACY" />Aviso de Privacidade<ph name="END_LINK_PRIVACY" /> do Chrome.</translation>
+<translation id="1878302395768190018">Você pode alterar isso a qualquer momento nas configurações do Chrome</translation>
 <translation id="2147651015520127414">O Chrome verificou que <ph name="ISSUER" /> emitiu o certificado desse website.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Todos os direitos reservados.</translation>
 <translation id="2342981853652716282">Faça login no Chrome para ver seus favoritos, senhas e muito mais em todos os seus dispositivos.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Abra Ajustes &gt; Privacidade &gt; Câmera &gt; Google Chrome e ative a câmera.</translation>
 <translation id="5642200033778930880">O Google Chrome não pode usar a câmera no modo Visualização dividida</translation>
 <translation id="5703130498371792817">Está gostando do Chrome? <ph name="BEGIN_LINK" />Avalie este app<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Dica do Chrome. Alguns botões agora estão na parte inferior da tela, como "Voltar", "Avançar" e "Pesquisar".</translation>
 <translation id="6036420186814142909">O Google Chrome tem recursos que ajudam a gerenciar seus dados de Internet e a velocidade de carregamento de páginas da Web.
 <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">As guias que você abriu no Chrome nos seus outros dispositivos serão exibidas aqui.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Os dados selecionados foram removidos do Chrome e dos dispositivos sincronizados. É possível que sua Conta do Google tenha outras formas de histórico de navegação, como pesquisas e atividades de outros serviços do Google em history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">O Google Chrome pode usar os serviços da Web para melhorar sua experiência de navegação. Se preferir, é possível desativar esses serviços. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Dica do Chrome. Para ver mais opções de guias, toque no botão "Exibir guias" na barra de ferramentas, na parte superior ou inferior da tela, e mantenha-o pressionado.</translation>
 </translationbundle>
\ No newline at end of file
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 ce3259e..1a21146 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Aviso de Privacidade do Google Chrome</translation>
 <translation id="1863312987075920112">Ao utilizar esta aplicação, aceita os <ph name="BEGIN_LINK_TOS" />Termos de Utilização<ph name="END_LINK_TOS" /> e o <ph name="BEGIN_LINK_PRIVACY" />Aviso de Privacidade<ph name="END_LINK_PRIVACY" /> do Chrome.</translation>
+<translation id="1878302395768190018">Pode personalizar em qualquer altura nas Definições do Chrome</translation>
 <translation id="2147651015520127414">O Chrome confirmou que <ph name="ISSUER" /> emitiu o certificado deste Website.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Todos os direitos reservados.</translation>
 <translation id="2342981853652716282">Inicie sessão no Chrome para obter os seus marcadores, palavras-passe e muito mais em todos os dispositivos.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Abra Definições &gt; Privacidade &gt; Câmara &gt; Google Chrome e ative a câmara.</translation>
 <translation id="5642200033778930880">O Google Chrome não pode utilizar a câmara no modo Vista dividida</translation>
 <translation id="5703130498371792817">Está a gostar do Chrome? <ph name="BEGIN_LINK" />Classifique esta aplicação<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Sugestão para o Chrome: alguns botões encontram-se agora na parte inferior do ecrã, como Retroceder, Avançar e Pesquisar.</translation>
 <translation id="6036420186814142909">O Google Chrome inclui funcionalidades que o/a ajudam a gerir os seus dados de Internet e a velocidade com que as páginas Web são carregadas. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Os separadores que abriu no Chrome nos seus outros dispositivos são apresentados aqui.</translation>
 <translation id="6600954340915313787">Copiado para o Chrome</translation>
@@ -55,4 +57,5 @@
 <translation id="8459495907675268833">Os dados selecionados foram removidos do Chrome e dos dispositivos sincronizados. A sua Conta Google pode ter outras formas do histórico de navegação, como pesquisas e atividade de outros serviços Google, em history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">O Google Chrome poderá utilizar serviços Web para melhorar a sua experiência de navegação. Poderá optar por desativar estes serviços. <ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Sugestão para o Chrome: para obter mais opções de separadores, prima sem soltar o botão Mostrar separadores na barra de ferramentas, que se encontra na parte superior ou inferior do ecrã.</translation>
 </translationbundle>
\ No newline at end of file
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 21262617..92d18c8 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Notificare privind confidențialitatea Google Chrome</translation>
 <translation id="1863312987075920112">Folosind această aplicație, accepți <ph name="BEGIN_LINK_TOS" />Termenii și condițiile<ph name="END_LINK_TOS" /> și <ph name="BEGIN_LINK_PRIVACY" />Notificarea privind confidențialitatea<ph name="END_LINK_PRIVACY" /> Chrome.</translation>
+<translation id="1878302395768190018">Poți personaliza oricând această setare din setările Chrome</translation>
 <translation id="2147651015520127414">Chrome s-a asigurat că certificatul acestui site a fost emis de <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Toate drepturile rezervate.</translation>
 <translation id="2342981853652716282">Conectează-te la Chrome pentru a accesa marcajele, parolele și altele pe toate dispozitivele tale.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Deschide Setări &gt; Confidențialitate &gt; Cameră foto &gt; Google Chrome și activează camera foto.</translation>
 <translation id="5642200033778930880">Google Chrome nu poate folosi camera foto în modul Vizualizare împărțită</translation>
 <translation id="5703130498371792817">Îți place Chrome? <ph name="BEGIN_LINK" />Evaluează aplicația<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Sfat pentru Chrome: unele butoane se află acum în partea de jos a ecranului, cum ar fi Înapoi, Înainte și Caută.</translation>
 <translation id="6036420186814142909">Google Chrome are funcții care te ajută să gestionezi datele de internet și viteza cu care poți să încarci paginile web.
 <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Filele deschise în Chrome pe alte dispozitive vor apărea aici.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Datele selectate au fost eliminate din Chrome și de pe dispozitivele sincronizate. Contul Google poate să ofere alte forme ale istoricului de navigare, cum ar fi căutările și activitatea din alte servicii Google, la history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Este posibil ca Google Chrome să folosească servicii web pentru a-ți îmbunătăți experiența de navigare. Poți să dezactivezi aceste servicii. <ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Sfat pentru Chrome: pentru mai multe opțiuni de file, apasă lung butonul Afișează filele din bara de instrumente, care se află în partea de sus sau de jos a ecranului.</translation>
 </translationbundle>
\ No newline at end of file
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 0800f00..49597856 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Примечание о конфиденциальности Google Chrome</translation>
 <translation id="1863312987075920112">Работая с Chrome, вы принимаете <ph name="BEGIN_LINK_TOS" />Условия использования<ph name="END_LINK_TOS" /> и <ph name="BEGIN_LINK_PRIVACY" />Примечание о конфиденциальности<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Выбрать нужные вам параметры можно будет в настройках Chrome в любое время</translation>
 <translation id="2147651015520127414">Chrome определил, что сертификат сайта выпущен компанией <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">© Google Inc, <ph name="YEAR" />. Все права защищены.</translation>
 <translation id="2342981853652716282">Войдите в Chrome, чтобы синхронизировать закладки, пароли и другую информацию на всех ваших устройствах.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Откройте "Настройки &gt; Конфиденциальность &gt; Камера &gt; Chrome" и включите камеру.</translation>
 <translation id="5642200033778930880">Google Chrome не может использовать камеру в режиме Split View.</translation>
 <translation id="5703130498371792817">Нравится приложение Chrome? <ph name="BEGIN_LINK" />Оцените его<ph name="END_LINK" />.</translation>
+<translation id="5854621639439811139">Совет для Chrome. Некоторые кнопки, например "Назад", "Вперед" и "Поиск", теперь расположены в нижней части экрана.</translation>
 <translation id="6036420186814142909">В Google Chrome можно устанавливать параметры обработки данных в Интернете и скорости загрузки веб-страниц.
 <ph name="BEGIN_LINK" />Подробнее...<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Здесь появятся вкладки, открытые в Chrome на других устройствах.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Выбранные данные удалены из Chrome и с синхронизированных устройств. Остальная история ваших действий в Интернете может храниться в аккаунте Google, например в виде поисковых запросов и сведений из наших сервисов. Она доступна на странице history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Для более качественной работы Google Chrome может использовать веб-сервисы. При необходимости вы можете отключить их. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Совет для Chrome. Чтобы открыть дополнительные настройки вкладок, нажмите и удерживайте кнопку "Показать вкладки" на панели инструментов в нижней или верхней части экрана.</translation>
 </translationbundle>
\ No newline at end of file
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 4905bd4..1a7e4771 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Upozornenie o ochrane súkromia v prehliadači Google Chrome</translation>
 <translation id="1863312987075920112">Používaním tejto aplikácie vyjadrujete súhlas so <ph name="BEGIN_LINK_TOS" />zmluvnými podmienkami<ph name="END_LINK_TOS" /> a <ph name="BEGIN_LINK_PRIVACY" />upozornením o ochrane súkromia<ph name="END_LINK_PRIVACY" /> prehliadača Chrome.</translation>
+<translation id="1878302395768190018">Môžete to kedykoľvek prispôsobiť v Nastaveniach Chromu</translation>
 <translation id="2147651015520127414">Chrome overil, že certifikát tohto webu vydal vydavateľ <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Všetky práva vyhradené.</translation>
 <translation id="2342981853652716282">Prihláste sa do Chromu a získajte svoje záložky, heslá a ďalšie nastavenia na všetkých zariadeniach.</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 c93c073..510b96e 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Obvestilo o zasebnosti za Google Chrome</translation>
 <translation id="1863312987075920112">Če uporabljate to aplikacijo, se strinjate s <ph name="BEGIN_LINK_TOS" />pogoji storitve<ph name="END_LINK_TOS" /> in <ph name="BEGIN_LINK_PRIVACY" />pravilnikom o zasebnosti<ph name="END_LINK_PRIVACY" /> za Chrome.</translation>
+<translation id="1878302395768190018">To je mogoče kadar koli prilagoditi v Chromovih nastavitvah</translation>
 <translation id="2147651015520127414">Chrome je preveril, da je izdajatelj <ph name="ISSUER" /> izdal potrdilo tega spletnega mesta.</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. Vse pravice pridržane.</translation>
 <translation id="2342981853652716282">Prijavite se v Chrome, če želite dostopati do svojih zaznamkov, gesel in drugega v vseh napravah.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Odprite Settings &gt; Privacy &gt; Camera &gt; Google Chrome in vklopite fotoaparat.</translation>
 <translation id="5642200033778930880">Google Chrome ne more uporabljati fotoaparata v načinu razdeljenega pogleda</translation>
 <translation id="5703130498371792817">Enjoying Chrome? <ph name="BEGIN_LINK" />Rate this app<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Nasvet za Chrome. Nekateri gumbi, na primer gumbi za nazaj, naprej in iskanje, so zdaj na dnu zaslona.</translation>
 <translation id="6036420186814142909">Google Chrome ima funkcije, s katerimi lažje upravljate internetne podatke in hitrost nalaganja spletnih strani.
 <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Zavihki, ki ste jih odprli v Chromu v drugih napravah, bodo prikazani tukaj.</translation>
@@ -57,4 +59,5 @@
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome lahko za izboljšanje izkušnje pri brskanju uporabi spletne storitve.
 Te storitve lahko morda onemogočite. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Nasvet za Chrome. Če želite več možnosti za zavihke, pridržite gumb za prikaz zavihkov v orodni vrstici na dnu ali vrhu zaslona.</translation>
 </translationbundle>
\ No newline at end of file
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 55f27350..7810a98 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Обавештење о приватности за Google Chrome</translation>
 <translation id="1863312987075920112">Ако користите ову апликацију, прихватате Chrome <ph name="BEGIN_LINK_TOS" />услове коришћења услуге<ph name="END_LINK_TOS" /> и <ph name="BEGIN_LINK_PRIVACY" />Обавештење о приватности<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Ово увек можете да прилагодите у подешавањима Chrome-а</translation>
 <translation id="2147651015520127414">Chrome је потврдио да је <ph name="ISSUER" /> издао сертификат овог веб-сајта.</translation>
 <translation id="2334084861041072223">Ауторска права <ph name="YEAR" />. Google Inc. Сва права задржана.</translation>
 <translation id="2342981853652716282">Пријавите се у Chrome да би вам обележивачи, лозинке и други садржај били доступни на свим уређајима.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Отворите Подешавања &gt; Приватност &gt; Камера &gt; Google Chrome и укључите камеру.</translation>
 <translation id="5642200033778930880">Google Chrome не може да користи камеру у режиму подељеног приказа</translation>
 <translation id="5703130498371792817">Уживате у Chrome-у? <ph name="BEGIN_LINK" />Оцените ову апликацију<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Савет за Chrome. Нека дугмад се сада налазе у дну екрана, попут дугмади Назад, Напред и Претражи.</translation>
 <translation id="6036420186814142909">Google Chrome има функције које вам помажу да управљате интернет подацима и брзином учитавања веб-страница.
 <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Овде ће се приказати картице које отворите у Chrome-у на другим уређајима.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Изабрани подаци су уклоњени из Chrome-а и са синхронизованих уређаја. Google налог можда има друге облике историје прегледања, попут претрага и активности у другим Google услугама на history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome може да користи веб-услуге да би побољшао доживљај прегледања. Можете опционално да онемогућите те услуге. <ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Савет за Chrome. Ако желите више опција за картице, притисните и задржите дугме Прикажи картице на траци с алаткама, која се налази у дну или у врху екрана.</translation>
 </translationbundle>
\ No newline at end of file
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 ecfee56f..fbc31742 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Sekretessmeddelande för Google Chrome</translation>
 <translation id="1863312987075920112">Genom att använda det här programmet godkänner du Chromes <ph name="BEGIN_LINK_TOS" />användarvillkor<ph name="END_LINK_TOS" /> och <ph name="BEGIN_LINK_PRIVACY" />sekretessmeddelande<ph name="END_LINK_PRIVACY" />.</translation>
+<translation id="1878302395768190018">Du kan när som helst ändra detta i Chrome-inställningarna</translation>
 <translation id="2147651015520127414">Chrome har verifierat att <ph name="ISSUER" /> har utfärdat webbplatsens certifikat.</translation>
 <translation id="2334084861041072223">Upphovsrätt <ph name="YEAR" /> Google Inc. Med ensamrätt.</translation>
 <translation id="2342981853652716282">Logga in i Chrome om du vill få dina bokmärken, lösenord med mera på alla dina enheter.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Öppna Inställningar &gt; Sekretess &gt; Kamera &gt; Google Chrome och aktivera kameran.</translation>
 <translation id="5642200033778930880">Google Chrome kan inte använda kameran i delad vy</translation>
 <translation id="5703130498371792817">Gillar du Chrome? <ph name="BEGIN_LINK" />Sätt betyg på appen<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Tips för Chrome. Vissa knappar finns nu längst ned på skärmen, till exempel bakåtknappen, framåtknappen och Sök.</translation>
 <translation id="6036420186814142909">I Google Chrome finns det funktioner som du kan använda för att hantera dina internetuppgifter och inläsningshastigheten för webbsidor.
 <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Här visas flikar som du har öppnat i Chrome på andra enheter.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Den data som markerades har tagits bort från Chrome och från synkroniserade enheter. Det kan finnas andra former av webbhistorik i Google-kontot på history.google.com, t.ex. sökningar och aktivitet på andra tjänster från Google.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome kan använda webbtjänster för att förbättra din upplevelse på webben. Du kan inaktivera dessa tjänster om du vill. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Tips för Chrome. Tryck länge på Visa flikar i verktygsfältet så visas fler flikalternativ. Du hittar verktygsfältet längst ned eller högst upp på skärmen.</translation>
 </translationbundle>
\ No newline at end of file
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 0636b2e..cf6c0e7 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Ilani ya Faragha ya Google Chrome</translation>
 <translation id="1863312987075920112">Kwa kutumia programu hii, unakubali <ph name="BEGIN_LINK_TOS" />Sheria na Masharti<ph name="END_LINK_TOS" /> na <ph name="BEGIN_LINK_PRIVACY" />Ilani ya Faragha<ph name="END_LINK_PRIVACY" /> ya Chrome.</translation>
+<translation id="1878302395768190018">Unaweza kuweka mapendeleo kwenye chaguo hili wakati wowote katika Mipangilio ya Chrome</translation>
 <translation id="2147651015520127414">Chrome imethibitisha kuwa <ph name="ISSUER" /> ndiye mtoa cheti cha tovuti hii.</translation>
 <translation id="2334084861041072223">Hakimiliki <ph name="YEAR" /> Google Inc. Haki zote zimehifadhiwa.</translation>
 <translation id="2342981853652716282">Ingia katika Chrome ili upate alamisho, manenosiri yako na mengine mengi kwenye vifaa vyako vyote.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Fungua Mipangilio &gt; Faragha &gt; Kamera &gt; Google Chrome na uwashe kamera.</translation>
 <translation id="5642200033778930880">Google Chrome imeshindwa kutumia kamera yako katika hali ya Mwonekano wa Madirisha Mawili</translation>
 <translation id="5703130498371792817">Je, unafurahia Chrome? <ph name="BEGIN_LINK" />Kadiria programu hii<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Kidokezo cha Chrome. Sasa vitufe vinapatikana katika sehemu ya chini ya skrini yako, kama vile kitufe cha Nyuma, Mbele na Tafuta.</translation>
 <translation id="6036420186814142909">Google Chrome ina vipengele vinavyokusaidia kusimamia data yako ya intaneti na kasi unayoweza kupakia nayo kurasa za wavuti.
 <ph name="BEGIN_LINK" />Pata maelezo zaidi <ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Vichupo ulivyofungua katika Chrome kwenye vifaa vyako vingine vitaonekana hapa.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Data uliyochagua imeondolewa kwenye Chrome na kwenye vifaa vilivyosawazishwa. Huenda Akaunti yako ya Google ina aina nyingine za historia ya mambo uliyovinjari kama vile mambo uliyotafuta na shughuli kutoka huduma nyingine za Google katika history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Huenda Google Chrome ikatumia huduma za wavuti kuboresha hali yako ya kuvinjari. Unaweza chagua kuzima huduma hizi. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Kidokezo cha Chrome. Ili upate chaguo zaidi za vichupo, bonyeza na ushikilie kitufe cha Onyesha Vichupo katika upau wa vidhibiti unaopatikana sehemu ya chini au ya juu ya skrini yako.</translation>
 </translationbundle>
\ No newline at end of file
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 e1d9f77f..54e713b 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome தனியுரிமை அறிக்கை</translation>
 <translation id="1863312987075920112">இந்தப் பயன்பாட்டைப் பயன்படுத்துவதன் மூலம், Chrome இன் <ph name="BEGIN_LINK_TOS" />சேவை விதிமுறைகள்<ph name="END_LINK_TOS" /> மற்றும் <ph name="BEGIN_LINK_PRIVACY" />தனியுரிமை அறிக்கையை<ph name="END_LINK_PRIVACY" /> ஏற்கிறீர்கள்.</translation>
+<translation id="1878302395768190018">Chrome அமைப்புகளில் இதை எப்போது வேண்டுமானாலும் நீங்கள் தனிப்பயனாக்கலாம்</translation>
 <translation id="2147651015520127414">இந்த இணையதளச் சான்றிதழ் <ph name="ISSUER" /> ஆல் வழங்கப்பட்டதா என Chrome சரிபார்த்தது.</translation>
 <translation id="2334084861041072223">பதிப்புரிமை <ph name="YEAR" /> Google Inc. அனைத்து உரிமைகளும் பாதுகாக்கப்பட்டவை.</translation>
 <translation id="2342981853652716282">உங்கள் எல்லாச் சாதனங்களிலும் உங்கள் புத்தகக்குறிகள், கடவுச்சொற்கள் மற்றும் பலவற்றைப் பெற, Chrome இல் உள்நுழையவும்.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">அமைப்புகள் &gt; தனியுரிமை &gt; கேமரா &gt; Google Chrome என்பதைத் திறந்து, கேமராவை இயக்கவும்.</translation>
 <translation id="5642200033778930880">Google Chrome ஆல் காட்சிப் பிரிப்புப் பயன்முறையில் கேமராவைப் பயன்படுத்த முடியாது</translation>
 <translation id="5703130498371792817">Chrome பிடித்திருக்கிறதா? <ph name="BEGIN_LINK" />இந்தப் பயன்பாட்டை மதிப்பிடவும்<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome உதவிக்குறிப்பு: 'பின்செல்’, ‘முன்செல்’, ‘தேடு’ போன்ற சில பட்டன்கள் இப்போது உங்கள் திரையின் அடிப்பகுதியில் உள்ளன.</translation>
 <translation id="6036420186814142909">உங்கள் இணையத் தரவை நிர்வகிக்கவும் மேலும் எவ்வளவு விரைவாக உங்களால் வலைப்பக்கங்களை ஏற்ற முடிகிறது என்பதற்கு உதவும் அம்சங்களை Google Chrome கொண்டிருக்கிறது
 <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">உங்கள் பிற சாதனங்களில் பயன்படுத்திய Chrome இல் திறந்த தாவல்கள் இங்கே தோன்றும்.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">தேர்ந்தெடுத்த தரவு Chrome மற்றும் ஒத்திசைக்கப்பட்ட சாதனங்களிலிருந்து அகற்றப்பட்டது. உங்கள் Google கணக்கு history.google.com எனும் தளத்தில் பிற Google சேவைகளிலிருந்து தேடல்கள், செயல்பாடு போன்ற உலாவல் வரலாறு தொடர்பான பிற தகவல்களைக் கொண்டிருக்கலாம்.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">உங்கள் உலாவல் அனுபவத்தை மேம்படுத்த இணைய சேவைகளை Google Chrome பயன்படுத்தலாம். விருப்பத்திற்கேற்ப இந்தச் சேவைகளை நீங்கள் முடக்கலாம். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome உதவிக்குறிப்பு. மேலும் அதிக தாவல் விருப்பங்களைப் பார்க்க, கருவிப்பட்டியிலுள்ள ‘தாவல்களைக் காட்டு’ பட்டனை அழுத்திப் பிடித்திருக்கவும். அந்த பட்டன், திரையின் அடிப்பகுதியில் அல்லது மேல்பகுதியில் இருக்கும்.</translation>
 </translationbundle>
\ No newline at end of file
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 e29210e..04d44cd 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome గోప్యతా ప్రకటన</translation>
 <translation id="1863312987075920112">ఈ యాప్‌ని ఉపయోగించడం ద్వారా, మీరు Chrome <ph name="BEGIN_LINK_TOS" />సేవా నిబంధనలు<ph name="END_LINK_TOS" /> మరియు <ph name="BEGIN_LINK_PRIVACY" />గోప్యతా ప్రకటన<ph name="END_LINK_PRIVACY" />ను అంగీకరిస్తున్నారు.</translation>
+<translation id="1878302395768190018">మీరు ఏ సమయంలో అయినా దీనిని Chrome సెట్టింగ్‌లలో అనుకూలీకరించవచ్చు</translation>
 <translation id="2147651015520127414">Chrome ఈ వెబ్‌సైట్ ప్రమాణపత్రాన్ని <ph name="ISSUER" /> జారీ చేసినట్లు ధృవీకరించింది.</translation>
 <translation id="2334084861041072223">కాపీరైట్ <ph name="YEAR" /> Google Inc. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation>
 <translation id="2342981853652716282">మీ పరికరాలన్నింటిలో మీ బుక్‌మార్క్‌లు, పాస్‌వర్డ్‌లు మరియు మరిన్నింటిని పొందడం కోసం 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 0797f211..33423f02 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">ประกาศเกี่ยวกับนโยบายความเป็นส่วนตัวของ Google Chrome</translation>
 <translation id="1863312987075920112">การใช้แอปพลิเคชันนี้หมายความว่าคุณยอมรับ<ph name="BEGIN_LINK_TOS" />ข้อกำหนดในการให้บริการ<ph name="END_LINK_TOS" />และ<ph name="BEGIN_LINK_PRIVACY" />ประกาศเกี่ยวกับนโยบายความเป็นส่วนตัว<ph name="END_LINK_PRIVACY" />ของ Chrome</translation>
+<translation id="1878302395768190018">ปรับแต่งการตั้งค่านี้ได้ทุกเมื่อในการตั้งค่า Chrome</translation>
 <translation id="2147651015520127414">Chrome ยืนยันว่า <ph name="ISSUER" /> ได้ออกใบรับรองของเว็บไซต์นี้</translation>
 <translation id="2334084861041072223">ลิขสิทธิ์ <ph name="YEAR" /> Google Inc. สงวนลิขสิทธิ์</translation>
 <translation id="2342981853652716282">ลงชื่อเข้าใช้ Chrome เพื่อรับบุ๊กมาร์ก รหัสผ่าน และข้อมูลอื่นๆ ในอุปกรณ์ทุกเครื่องของคุณ</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">เปิดการตั้งค่า &gt; ความเป็นส่วนตัว &gt; กล้อง &gt; Google Chrome เพื่อเปิดกล้องถ่ายรูป</translation>
 <translation id="5642200033778930880">Google Chrome ไม่สามารถใช้กล้องถ่ายรูปในโหมด Split View</translation>
 <translation id="5703130498371792817">หากคุณชอบ Chrome โปรด<ph name="BEGIN_LINK" />ให้คะแนนแอปนี้<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">เคล็ดลับสำหรับ Chrome ตอนนี้บางปุ่มแสดงอยู่ที่ด้านล่างของหน้าจอแล้ว เช่น ปุ่มกลับ ไปข้างหน้า และค้นหา</translation>
 <translation id="6036420186814142909">Google Chrome มีฟีเจอร์ที่ช่วยให้คุณสามารถจัดการข้อมูลอินเทอร์เน็ตและระดับความเร็วที่คุณสามารถใช้ในการโหลดหน้าเว็บ
 <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">แท็บที่คุณเปิดไว้ใน Chrome ในอุปกรณ์เครื่องอื่นๆ จะปรากฏที่นี่</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">ระบบได้นำข้อมูลที่เลือกไว้ออกจาก Chrome และอุปกรณ์ที่ซิงค์แล้ว บัญชี Google ของคุณอาจมีประวัติการท่องเว็บในรูปแบบอื่นๆ เช่น การค้นหาและกิจกรรมจากบริการอื่นๆ ของ Google ที่ history.google.com</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome อาจใช้บริการเว็บเพื่อปรับปรุงประสบการณ์การท่องเว็บของคุณ คุณสามารถเลือกปิดบริการเหล่านี้ได้ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">เคล็ดลับสำหรับ Chrome ถ้าต้องการดูตัวเลือกแท็บเพิ่มเติม ให้กดปุ่ม "แสดงแท็บ" ค้างไว้ในแถบเครื่องมือ ซึ่งอยู่ที่ด้านล่างหรือด้านบนของหน้าจอ</translation>
 </translationbundle>
\ No newline at end of file
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 535b66bc..f430206 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome Gizlilik Uyarısı</translation>
 <translation id="1863312987075920112">Bu uygulamayı kullanarak Chrome’un <ph name="BEGIN_LINK_TOS" />Hizmet Şartları<ph name="END_LINK_TOS" />'nı ve <ph name="BEGIN_LINK_PRIVACY" />Gizlilik Uyarısı<ph name="END_LINK_PRIVACY" />'nı kabul etmiş olursunuz.</translation>
+<translation id="1878302395768190018">Bunu istediğiniz zaman Chrome Ayarlarından özelleştirebilirsiniz</translation>
 <translation id="2147651015520127414">Chrome, bu web sitesi sertifikasının <ph name="ISSUER" /> tarafından yayınlandığını doğruladı.</translation>
 <translation id="2334084861041072223">Telif Hakkı <ph name="YEAR" /> Google Inc. Tüm hakları saklıdır.</translation>
 <translation id="2342981853652716282">Tüm cihazlarınızda yer işaretlerinizi, şifrelerinizi almak ve daha pek çok şey yapmak için Chrome'da oturum açın.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Ayarlar &gt; Gizlilik &gt; Kamera &gt; Google Chrome'a gidin ve kamerayı açın.</translation>
 <translation id="5642200033778930880">Google Chrome, kameranızı Bölünmüş Görünüm modunda kullanamıyor</translation>
 <translation id="5703130498371792817">Chrome'u kullanmayı seviyor musunuz?<ph name="BEGIN_LINK" />Bu uygulamaya oy verin<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome için ipucu: Geri, İleri ve Ara gibi bazı düğmeler artık ekranınızın alt bölümünde bulunuyor.</translation>
 <translation id="6036420186814142909">Google Chrome İnternet verilerinizi yönetmenize ve web sayfalarını hızlı yükleyebilmenize yardımcı olacak özelliklere sahiptir.
 <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Diğer cihazlarınızda Chrome ile açtığınız sekmeler burada görünür.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Seçilen veriler Chrome'dan ve senkronize edilen cihazlardan kaldırıldı. Diğer Google hizmetlerinden yapılan aramalar ve etkinlikler gibi Google Hesabınızla ilişkili başka biçimlerde tarama geçmişi history.google.com adresinde bulunabilir.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome, göz atma deneyiminizi iyileştirmek için web hizmetleri kullanabilir. İsterseniz, bu hizmetleri devre dışı bırakabilirsiniz. <ph name="BEGIN_LINK" />Daha fazla bilgi edinin<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome için ipucu: Sekmelerle ilgili daha fazla seçenek görmek için ekranınızın altında veya üstünde görünen araç çubuğunda Sekmeleri Göster düğmesini basılı tutun.</translation>
 </translationbundle>
\ No newline at end of file
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 a104f55d..4e5033ac 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Примітка про конфіденційність Chrome</translation>
 <translation id="1863312987075920112">Користуючись цим додатком, ви приймаєте <ph name="BEGIN_LINK_TOS" />Умови використання<ph name="END_LINK_TOS" /> та <ph name="BEGIN_LINK_PRIVACY" />Примітку про конфіденційність<ph name="END_LINK_PRIVACY" /> Chrome.</translation>
+<translation id="1878302395768190018">Це можна будь-коли змінити в налаштуваннях Chrome</translation>
 <translation id="2147651015520127414">Chrome підтвердив, що сертифікат цьому веб-сайту надала компанія <ph name="ISSUER" />.</translation>
 <translation id="2334084861041072223">Авторське право <ph name="YEAR" /> Google Inc. Усі права захищено.</translation>
 <translation id="2342981853652716282">Увійдіть в обліковий запис у Chrome, щоб мати доступ до своїх закладок, паролів та інших даних на всіх пристроях.</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">Відкрийте меню "Параметри" &gt; "Приватність" &gt; "Камера" &gt; "Google Chrome" і ввімкніть камеру.</translation>
 <translation id="5642200033778930880">Google Chrome не може використовувати камеру в режимі розділеного екрана</translation>
 <translation id="5703130498371792817">Користуєтеся Chrome? <ph name="BEGIN_LINK" />Оцініть цей додаток<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Порада щодо Chrome. Деякі кнопки зараз розташовані внизу екрана, як-от "Назад", "Уперед" і "Пошук".</translation>
 <translation id="6036420186814142909">У Google Chrome є функції, які допомагають керувати інтернет-даними та швидкістю завантаження веб-сторінок.
 <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Тут відображатимуться вкладки, відкриті в Chrome на інших ваших пристроях.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Вибрані дані видалено з Chrome і синхронізованих пристроїв. У вашому обліковому записі Google на сторінці history.google.com можуть бути додаткові форми історії веб-перегляду, як-от пошукові запити чи активність в інших службах Google.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome може покращувати веб-перегляд за допомогою веб-служб. Ви можете вимкнути ці служби. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Порада щодо Chrome. Щоб відкрити більше параметрів, утримуйте кнопку "Показати вкладки" на панелі інструментів, розташованій унизу або вгорі екрана.</translation>
 </translationbundle>
\ No newline at end of file
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 eab015c..1f2a0e6 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">T.báo b.mật của Google Chrome</translation>
 <translation id="1863312987075920112">Bằng việc sử dụng ứng dụng này, bạn đồng ý với <ph name="BEGIN_LINK_TOS" />Điều khoản dịch vụ<ph name="END_LINK_TOS" /> và <ph name="BEGIN_LINK_PRIVACY" />Thông báo bảo mật<ph name="END_LINK_PRIVACY" /> của Chrome.</translation>
+<translation id="1878302395768190018">Bạn có thể tùy chỉnh tùy chọn này bất cứ lúc nào trong mục Cài đặt Chrome</translation>
 <translation id="2147651015520127414">Chrome xác minh <ph name="ISSUER" /> đã cấp chứng chỉ của trang web này.</translation>
 <translation id="2334084861041072223">Bản quyền <ph name="YEAR" /> Google Inc. Mọi quyền được bảo lưu.</translation>
 <translation id="2342981853652716282">Đăng nhập vào Chrome để 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>
@@ -38,6 +39,7 @@
 <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>
 <translation id="5642200033778930880">Google Chrome không thể sử dụng máy ảnh của bạn ở Chế độ xem phân tách</translation>
 <translation id="5703130498371792817">Bạn thích Chrome? <ph name="BEGIN_LINK" />Xếp hạng ứng dụng này<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Mẹo dành cho Chrome. Một số nút hiện nằm ở cuối màn hình, chẳng hạn như Quay lại, Tiến lên và Tìm kiếm.</translation>
 <translation id="6036420186814142909">Google Chrome có tính năng giúp bạn quản lý dữ liệu Internet của mình và tốc độ mà bạn có thể tải trang web.
 <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">Các tab bạn đã mở trong Chrome trên thiết bị khác sẽ xuất hiện tại đây.</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">Dữ liệu được chọn đã bị xóa khỏi Chrome và các thiết bị được đồng bộ hóa. Tài khoản Google của bạn có thể có các dạng lịch sử duyệt web khác, chẳng hạn như tìm kiếm và hoạt động từ các dịch vụ khác của Google tại history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome có thể sử dụng dịch vụ web để cải thiện trải nghiệm duyệt web của bạn. Bạn có thể tùy ý vô hiệu hóa các dịch vụ này. <ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Mẹo dành cho Chrome. Để xem thêm các tùy chọn về tab, hãy nhấn và giữ nút Hiển thị tab trên thanh công cụ ở đầu hoặc cuối màn hình.</translation>
 </translationbundle>
\ No newline at end of file
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 fea0a2e8..cfa8773 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome 隐私权声明</translation>
 <translation id="1863312987075920112">使用此应用即表示您同意遵守 Chrome 的<ph name="BEGIN_LINK_TOS" />服务条款<ph name="END_LINK_TOS" />和<ph name="BEGIN_LINK_PRIVACY" />隐私权声明<ph name="END_LINK_PRIVACY" />。</translation>
+<translation id="1878302395768190018">您可以随时在 Chrome 设置中自定义此设置</translation>
 <translation id="2147651015520127414">Chrome 已证实此网站的证书是由 <ph name="ISSUER" /> 签发的。</translation>
 <translation id="2334084861041072223">版权所有<ph name="YEAR" /> Google Inc. 保留所有权利。</translation>
 <translation id="2342981853652716282">登录 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 85099467..ce3e168 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
@@ -6,6 +6,7 @@
 <translation id="1759842336958782510">Chrome</translation>
 <translation id="1816764564654397850">Google Chrome 隱私權聲明</translation>
 <translation id="1863312987075920112">使用這個應用程式即表示您同意接受 Chrome 的《<ph name="BEGIN_LINK_TOS" />服務條款<ph name="END_LINK_TOS" />》和《<ph name="BEGIN_LINK_PRIVACY" />隱私權聲明<ph name="END_LINK_PRIVACY" />》。</translation>
+<translation id="1878302395768190018">你隨時可在 Chrome 設定中自訂這項設定</translation>
 <translation id="2147651015520127414">Chrome 已驗證這個網站的憑證是由「<ph name="ISSUER" />」所核發。</translation>
 <translation id="2334084861041072223">Copyright <ph name="YEAR" /> Google Inc. 版權所有。</translation>
 <translation id="2342981853652716282">無論使用任何裝置,只要登入 Chrome,即可取得你的書籤、密碼,並沿用其他設定。</translation>
@@ -38,6 +39,7 @@
 <translation id="5639704535586432836">請前往 [設定] &gt; [隱私權] &gt; [相機] &gt; [Google Chrome],並開啟相機。</translation>
 <translation id="5642200033778930880">Google Chrome 無法在分割模式中使用你的相機</translation>
 <translation id="5703130498371792817">您覺得 Chrome 好用嗎?歡迎<ph name="BEGIN_LINK" />為這個應用程式評分<ph name="END_LINK" /></translation>
+<translation id="5854621639439811139">Chrome 提示。部分按鈕 (例如 [返回]、[往前] 和 [搜尋]) 現在位於畫面底部。</translation>
 <translation id="6036420186814142909">Google Chrome 的功能可讓您輕鬆管理網際網路數據傳輸以及網頁載入速度。
 <ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
 <translation id="6573431926118603307">您在其他裝置上透過 Chrome 開啟的分頁會顯示在這裡。</translation>
@@ -56,4 +58,5 @@
 <translation id="8459495907675268833">系統已將您所選取的資料從 Chrome 和其他同步的裝置中移除。您的 Google 帳戶仍可能保留了其他類型的瀏覽記錄,例如其他 Google 服務中的搜尋和活動記錄 (可前往 history.google.com 查詢)。</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
 <translation id="8606668294522778825">Google Chrome 可能會使用網路服務改善您的瀏覽體驗。不過,您可以選擇停用這些服務。<ph name="BEGIN_LINK" />瞭解詳情<ph name="END_LINK" /></translation>
+<translation id="96145293669295453">Chrome 提示。如需更多分頁選項,請按住工具列 (位於畫面底部或頂端) 中的 [顯示分頁] 按鈕。</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index ccef7da1..8d3e64f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">ይህ መተግበሪያ ለአሁኑ ውርድዎ ሁሉንም ሂደት ያቆማል።</translation>
 <translation id="1605658421715042784">ምስሉን ገልብጥ</translation>
 <translation id="1612730193129642006">የትር ፍርግርግ አሳይ</translation>
+<translation id="162035744160882748">ስምረትን፣ ግላዊነት ማላበስን እና ሌሎች የGoogle አገልግሎቶችን ያብሩ</translation>
 <translation id="1644574205037202324">ታሪክ</translation>
 <translation id="1646446875146297738">«አትከታተል»ን ማንቃት ማለት አንድ ጥያቄ ከአሰሳ ትራፊክዎ ጋር አብሮ ይካተታል ማለት ነው። ማንኛውም ውጤት አንድ ድር ጣቢያ ለጥያቄው መልስ መስጠቱ ላይ እና ጥያቄው በተተረጎመበት መንገድ ላይ የሚወሰን ይሆናል። 
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">የጊዜ ወሰን</translation>
 <translation id="4172051516777682613">ሁልጊዜ አሳይ</translation>
 <translation id="418156467088430727">የመስመር ውጭ ስሪቱን በአዲስ ትር ውስጥ ይመልከቱ</translation>
+<translation id="4192273449750167573">ቅንብሮችዎን በቀጣዩ ማያ ገጽ ላይ ይገምግሙ</translation>
 <translation id="4237682350741091554">Chrome ስምረትን እና ግላዊነት ማለበስን በ<ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" /> ውስጥ ያቀናብሩ</translation>
 <translation id="424315890655130736">የይለፍ ሐረግ ያስገቡ</translation>
 <translation id="4272631900155121838">የQR ኮድን ለመቃኘት፣ ካሜራውን በቅንብሮች ውስጥ ያንቁ</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">ይህ መሣሪያ ሊሞላ ትንሽ ነው የቀረው። ቦታ ያስለቅቁና እንደገና ይሞክሩ።</translation>
 <translation id="5948291296578561264">ይህ ፎቶዎችን ወደ የፎቶ ቤተ-መጽሔፍትዎ እንዲያስቀምጡ ያስችልዎታል።</translation>
 <translation id="5955891643922670672">የመስመር ውጭ ስሪቱን በመመልከት ላይ</translation>
+<translation id="5957613098218939406">ተጨማሪ አማራጮች</translation>
 <translation id="5964480694698977962">አዲስ ማንነት የማያሳውቅ ትር ፍጠር።</translation>
 <translation id="5965679971710331625">ወደ መለያ ገብተዋል</translation>
 <translation id="5982717868370722439">ነባሩን ውሂብ ወደ <ph name="USER_EMAIL" /> ያክሉ።</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">የድምፅ ፍለጋ</translation>
 <translation id="6807889908376551050">ሁሉንም አሳይ...</translation>
 <translation id="681368974849482173">ንጥል ተፈጥሯል</translation>
+<translation id="685040365210406336">ምንም ለውጦችን አያደርጉ</translation>
 <translation id="6896758677409633944">ቅዳ</translation>
 <translation id="6903907808598579934">ስምረትን አብራ</translation>
 <translation id="6914783257214138813">የእርስዎ የይለፍ ቃላት ወደ ውጭ የተላከውን ፋይልን መመልከት ለሚችል ማንኛውም ሰው የሚታዩ ይሆናሉ።</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> በመቶ ወርዷል</translation>
 <translation id="7346909386216857016">እሺ፣ ገባኝ</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">አዎ፣ ገብቼያለሁ</translation>
 <translation id="7425346204213733349">በእርስዎ ዕልባቶች፣ ታሪክ፣ የይለፍ ቃላት እና ሌሎች ቅንብሮች ላይ የተደረጉ ለውጦች ከአሁን በኋላ ከእርስዎ የGoogle መለያ ጋር አይሠምሩም። ሆኖም ግን ነባር ውሂብዎ በእርስዎ የGoogle መለያ ላይ እንደተከማቸ ይቆያል።</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> አይደለም</translation>
 <translation id="7454057999980797137">ግዛት / አውራጃ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 8d3ea47..618f96e6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">سيؤدي ذلك إلى إيقاف تقدّم جميع عمليات التنزيل الحالية.</translation>
 <translation id="1605658421715042784">نسخ الصورة</translation>
 <translation id="1612730193129642006">عرض شبكة علامة التبويب</translation>
+<translation id="162035744160882748">‏تفعيل المزامنة والتخصيص وخدمات Google الأخرى</translation>
 <translation id="1644574205037202324">السجل</translation>
 <translation id="1646446875146297738">إن تفعيل "عدم التتبع" يعني تضمين طلب في حركة بيانات التصفح. ويعتمد أي تأثير يحدث على ما إذا كان موقع الويب سيستجيب للطلب، وكيفية تفسيره للطلب.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">النطاق الزمني</translation>
 <translation id="4172051516777682613">الإظهار دائمًا</translation>
 <translation id="418156467088430727">عرض إصدار بلا إنترنت في علامة تبويب جديدة</translation>
+<translation id="4192273449750167573">مراجعة الإعدادات في الشاشة التالية</translation>
 <translation id="4237682350741091554">‏إدارة مزامنة Chrome والتخصيص في <ph name="BEGIN_LINK" />الإعدادات<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">إدخال عبارة المرور</translation>
 <translation id="4272631900155121838">لمسح رمز الاستجابة السريعة ضوئيًا، يمكنك تفعيل الكاميرا من الإعدادات</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">جهازك ممتلئ تقريبًا. يمكنك إخلاء بعض المساحة وإعادة المحاولة.</translation>
 <translation id="5948291296578561264">يسمح لك ذلك بحفظ الصور في مكتبة صورك.</translation>
 <translation id="5955891643922670672">عرض النسخة بلا إنترنت</translation>
+<translation id="5957613098218939406">خيارات إضافية</translation>
 <translation id="5964480694698977962">إنشاء علامة تبويب جديدة للتصفح المتخفي.</translation>
 <translation id="5965679971710331625">تم تسجيل الدخول</translation>
 <translation id="5982717868370722439">يمكنك إضافة البيانات الحالية إلى <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">البحث الصوتي</translation>
 <translation id="6807889908376551050">إظهار الكل...</translation>
 <translation id="681368974849482173">تم إنشاء العنصر</translation>
+<translation id="685040365210406336">عدم إجراء أي تغييرات</translation>
 <translation id="6896758677409633944">نسخ</translation>
 <translation id="6903907808598579934">تشغيل المزامنة</translation>
 <translation id="6914783257214138813">ستكون كلمات مرورك مرئية لأي شخص يمكنه الاطلاع على الملف الذي تم تصديره.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">تم تنزيل <ph name="PERCENT" /> بالمائة</translation>
 <translation id="7346909386216857016">موافق، حسنًا</translation>
 <translation id="7400418766976504921">‏عنوان URL</translation>
+<translation id="741204030948306876">نعم، موافق</translation>
 <translation id="7425346204213733349">‏لن تتم بعد ذلك مزامنة التغييرات الطارئة على الإشارات المرجعية والسجل وكلمات المرور وغيرها من الإعدادات إلى حسابك في Google. ومع ذلك، ستظل بياناتك الحالية مخزنة في حسابك في Google.</translation>
 <translation id="744343212394640790">ليس <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">الولاية/المقاطعة</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index c218e7f0..aae3cb3 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Текущото изтегляне ще бъде прекратено.</translation>
 <translation id="1605658421715042784">Копиране на изображението</translation>
 <translation id="1612730193129642006">Показване на мрежа с раздели</translation>
+<translation id="162035744160882748">Включване на синхронизирането, персонализирането и други услуги на Google</translation>
 <translation id="1644574205037202324">История</translation>
 <translation id="1646446875146297738">Активирането на „Do Not Track“ означава, че с трафика ви на сърфиране ще се включва заявка. Ефектите зависят от това, дали уебсайтът ще отговори на нея и как ще я изтълкува.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Период от време</translation>
 <translation id="4172051516777682613">Показване винаги</translation>
 <translation id="418156467088430727">Преглед на офлайн версията в нов раздел</translation>
+<translation id="4192273449750167573">Прегледайте настройките си на следващия екран</translation>
 <translation id="4237682350741091554">Управлявайте синхронизирането в Chrome и персонализирането от <ph name="BEGIN_LINK" />настройките<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Въвеждане на пропуск</translation>
 <translation id="4272631900155121838">За да сканирате код за бърза реакция, активирайте камерата от настройките</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Хранилището на устройството ви е почти пълно. Освободете място и опитайте отново.</translation>
 <translation id="5948291296578561264">Това ви позволява да запазвате снимки във фотобиблиотеката си.</translation>
 <translation id="5955891643922670672">Гледате офлайн версията</translation>
+<translation id="5957613098218939406">Още опции</translation>
 <translation id="5964480694698977962">Създаване на нов раздел в режим „инкогнито“.</translation>
 <translation id="5965679971710331625">Влезли сте в профил</translation>
 <translation id="5982717868370722439">Добавяне на съществуващите данни към <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Гласово търсене</translation>
 <translation id="6807889908376551050">Показване на всички...</translation>
 <translation id="681368974849482173">Елементът е създаден</translation>
+<translation id="685040365210406336">Без промени</translation>
 <translation id="6896758677409633944">Копиране</translation>
 <translation id="6903907808598579934">Включване на синхронизирането</translation>
 <translation id="6914783257214138813">Паролите ви ще бъдат видими за всички, които могат да видят експортирания файл.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Изтеглено: <ph name="PERCENT" />%</translation>
 <translation id="7346909386216857016">Добре, разбрах</translation>
 <translation id="7400418766976504921">URL адрес</translation>
+<translation id="741204030948306876">Да, ще участвам</translation>
 <translation id="7425346204213733349">Промените в отметките, историята, паролите и другите ви настройки вече няма да се синхронизират с профила ви в Google. Съществуващите ви данни обаче ще продължат да се съхраняват в него.</translation>
 <translation id="744343212394640790">Не съм <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Щат/държава</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index f10c9f84..b23767b1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">এর ফলে আপনি এখন যা ডাউনলোড করছেন সেগুলি সব বন্ধ হয়ে যাবে।</translation>
 <translation id="1605658421715042784">ছবি কপি করুন</translation>
 <translation id="1612730193129642006">ট্যাব গ্রিড দেখান</translation>
+<translation id="162035744160882748">সিঙ্ক, ব্যক্তিগতকরণ এবং অন্যান্য Google পরিষেবাগুলি চালু করুন</translation>
 <translation id="1644574205037202324">ইতিহাস</translation>
 <translation id="1646446875146297738">‘ট্র্যাক করবেন না’ সক্ষম করার মানে হল যে আপনার ব্রাউজিং ট্রাফিকের সাথে একটি অনুরোধ অন্তর্ভুক্ত করা হবে৷ একটি ওয়েবসাইট অনুরোধটিতে সাড়া দেবে কিনা এবং কিভাবে অনুরোধটিকে ব্যাখ্যা করে তার উপর যেকোনো ফল নির্ভর করে৷
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">সময় সীমা</translation>
 <translation id="4172051516777682613">সর্বদা দেখান</translation>
 <translation id="418156467088430727">নতুন ট্যাবে অফলাইন সংস্করণ দেখুন</translation>
+<translation id="4192273449750167573">পরবর্তী স্ক্রিনে আপনার সেটিংস পর্যালোচনা করুন</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />সেটিংস<ph name="END_LINK" /> থেকে Chrome সিঙ্ক এবং ব্যক্তিগতকরণ পরিচালনা করুন</translation>
 <translation id="424315890655130736">পাসফ্রেজ লিখুন</translation>
 <translation id="4272631900155121838">একটি QR কোড স্ক্যান করতে, সেটিংস থেকে ক্যামেরা সক্ষম করুন</translation>
@@ -286,6 +288,7 @@
 <translation id="5938160824633642847">আপনার ডিভাইসে পর্যাপ্ত জায়গা নেই। জায়গা খালি করে আবার চেষ্টা করুন।</translation>
 <translation id="5948291296578561264">এর ফলে আপনি ফটো লাইব্রেরিতে ফটো সেভ করতে পারবেন।</translation>
 <translation id="5955891643922670672">অফলাইন সংস্করণ দেখছেন</translation>
+<translation id="5957613098218939406">আরও বিকল্পগুলি</translation>
 <translation id="5964480694698977962">নতুন ছদ্মবেশী ট্যাব তৈরি করুন।</translation>
 <translation id="5965679971710331625">আপনি প্রবেশ করেছেন</translation>
 <translation id="5982717868370722439">বিদ্যমান ডেটা <ph name="USER_EMAIL" /> এ যোগ করুন।</translation>
@@ -345,6 +348,7 @@
 <translation id="6797885426782475225">ভয়েস সার্চ</translation>
 <translation id="6807889908376551050">সমস্ত দেখান...</translation>
 <translation id="681368974849482173">আইটেম তৈরি করা হয়েছে</translation>
+<translation id="685040365210406336">কোনও পরিবর্তন করবেন না</translation>
 <translation id="6896758677409633944">অনুলিপি</translation>
 <translation id="6903907808598579934">সিঙ্ক চালু করুন</translation>
 <translation id="6914783257214138813">এক্সপোর্ট করা ফাইল যারা দেখতে পান তারা আপনার পাসওয়ার্ডগুলিও দেখতে পাবেন।</translation>
@@ -374,6 +378,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> শতাংশ ডাউনলোড হয়েছে</translation>
 <translation id="7346909386216857016">ঠিক আছে, বুঝেছি</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">হ্যাঁ, আমি রাজি</translation>
 <translation id="7425346204213733349">আপনার বুকমার্ক, ইতিহাস, পাসওয়ার্ড এবং অন্যান্য সেটিংসে করা পরিবর্তন আর আপনার Google অ্যাকাউন্টের সাথে সিঙ্ক করা হবে না। অবশ্য, আপনার বিদ্যমান ডেটা আপনার Google অ্যাকাউন্টে সঞ্চিত থাকবে।</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> না</translation>
 <translation id="7454057999980797137">রাজ্য / দেশ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index dcd30bc..97225e6d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">S'aturarà completament la baixada actual.</translation>
 <translation id="1605658421715042784">Copia la imatge</translation>
 <translation id="1612730193129642006">Mostra la quadrícula de pestanyes</translation>
+<translation id="162035744160882748">Activa la sincronització, la personalització i altres serveis de Google</translation>
 <translation id="1644574205037202324">Historial</translation>
 <translation id="1646446875146297738">En activar l'opció de no seguiment, s'inclourà una sol·licitud amb el trànsit de navegació. Que tingui efecte o no dependrà de si algun lloc web respon a la sol·licitud i de com s'interpreta la sol·licitud. 
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Interval de temps</translation>
 <translation id="4172051516777682613">Mostra sempre</translation>
 <translation id="418156467088430727">Mostra versió sense connexió en una pestanya nova</translation>
+<translation id="4192273449750167573">Revisa la configuració a la pantalla següent</translation>
 <translation id="4237682350741091554">Gestiona Sincronització de Chrome i la personalització a <ph name="BEGIN_LINK" />Configuració<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Introduïu la frase de contrasenya</translation>
 <translation id="4272631900155121838">Per poder escanejar un codi QR, activa la càmera a la configuració</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">El dispositiu està gairebé ple. Allibera espai i torna-ho a provar.</translation>
 <translation id="5948291296578561264">Et permet desar fotos a la biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Se n'està mostrant la versió sense connexió</translation>
+<translation id="5957613098218939406">Més opcions</translation>
 <translation id="5964480694698977962">Crea una pestanya d'incògnit nova.</translation>
 <translation id="5965679971710331625">Tens la sessió iniciada</translation>
 <translation id="5982717868370722439">Afegeix les dades existents a <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Cerca per veu</translation>
 <translation id="6807889908376551050">Mostra-ho tot...</translation>
 <translation id="681368974849482173">S'ha creat un element.</translation>
+<translation id="685040365210406336">No facis canvis</translation>
 <translation id="6896758677409633944">Copia</translation>
 <translation id="6903907808598579934">Activa la sincronització</translation>
 <translation id="6914783257214138813">Tothom que pugui veure el fitxer exportat podrà veure també les teves contrasenyes.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> per cent baixat</translation>
 <translation id="7346909386216857016">D'acord</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Sí, ho accepto</translation>
 <translation id="7425346204213733349">Els canvis fets a les adreces d'interès, l'historial, les contrasenyes i altres opcions de configuració es deixaran de sincronitzar amb el vostre compte de Google. No obstant això, les dades actuals hi continuaran emmagatzemades.</translation>
 <translation id="744343212394640790">No soc <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Província</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index 95e0024c..bb765fd6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Tímto zastavíte veškerý postup aktuálního stahování.</translation>
 <translation id="1605658421715042784">Kopírovat obrázek</translation>
 <translation id="1612730193129642006">Zobrazit mřížku karet</translation>
+<translation id="162035744160882748">Zapnout synchronizaci, personalizaci a další služby Google</translation>
 <translation id="1644574205037202324">Historie</translation>
 <translation id="1646446875146297738">Nastavení „Do Not Track“ (Nesledovat) znamená, že k vašemu provozu při prohlížení bude přidán speciální požadavek. Efekt tohoto požadavku však závisí na tom, zda na něj webové stránky reagují a jak jej interpretují.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Časové období</translation>
 <translation id="4172051516777682613">Vždy zobrazovat</translation>
 <translation id="418156467088430727">Zobrazit offline verzi na nové kartě</translation>
+<translation id="4192273449750167573">Na další obrazovce zkontrolujte svá nastavení</translation>
 <translation id="4237682350741091554">Synchronizaci a přizpůsobení Chromu můžete spravovat v <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Zadání heslové fráze</translation>
 <translation id="4272631900155121838">Chcete-li naskenovat QR kód, povolte v nastavení fotoaparát</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Zařízení je téměř plné. Uvolněte místo a zkuste to znovu.</translation>
 <translation id="5948291296578561264">Toto umožňuje ukládat fotky do vaší knihovny fotek.</translation>
 <translation id="5955891643922670672">Zobrazuje se offline verze</translation>
+<translation id="5957613098218939406">Další možnosti</translation>
 <translation id="5964480694698977962">Vytvořit novou anonymní kartu</translation>
 <translation id="5965679971710331625">Jste přihlášeni</translation>
 <translation id="5982717868370722439">Přidat existující data do účtu <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Hlasové vyhledávání</translation>
 <translation id="6807889908376551050">Zobrazit vše…</translation>
 <translation id="681368974849482173">Položka byla vytvořena</translation>
+<translation id="685040365210406336">Neprovádět žádné změny</translation>
 <translation id="6896758677409633944">Kopírovat</translation>
 <translation id="6903907808598579934">Zapnout synchronizaci</translation>
 <translation id="6914783257214138813">Vaše hesla uvidí každý, kdo může zobrazit exportovaný soubor.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Staženo <ph name="PERCENT" /> %</translation>
 <translation id="7346909386216857016">Dobře, rozumím</translation>
 <translation id="7400418766976504921">Adresa URL</translation>
+<translation id="741204030948306876">Ano</translation>
 <translation id="7425346204213733349">Změny záložek, historie, hesel a dalších nastavení se již nebudou synchronizovat do vašeho účtu Google. Vaše existující data však v účtu Google uložena zůstanou.</translation>
 <translation id="744343212394640790">Nejsem <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Stát / země</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index 06221b3..71fee54 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Denne handling stopper den aktuelle download.</translation>
 <translation id="1605658421715042784">Kopiér billede</translation>
 <translation id="1612730193129642006">Vis fanegitter</translation>
+<translation id="162035744160882748">Aktivér synkronisering, tilpasning og andre Google-tjenester</translation>
 <translation id="1644574205037202324">Historik</translation>
 <translation id="1646446875146297738">Hvis du aktiverer "Spor ikke", medtages der en anmodning i din browsertrafik. Anmodningens virkning afhænger af, om et website reagerer på den, og hvordan anmodningen fortolkes.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Tidsinterval</translation>
 <translation id="4172051516777682613">Vis altid</translation>
 <translation id="418156467088430727">Se offlineversion på en ny fane</translation>
+<translation id="4192273449750167573">Gennemgå dine indstillinger på næste skærm</translation>
 <translation id="4237682350741091554">Administrer Chrome-synkronisering og -tilpasning i <ph name="BEGIN_LINK" />Indstillinger<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Angiv adgangssætning</translation>
 <translation id="4272631900155121838">Aktivér kameraet i Indstillinger for at scanne en QR-kode</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Din enhed er ved at løbe tør for plads. Frigør plads, og prøv igen.</translation>
 <translation id="5948291296578561264">Dermed kan du gemme fotos i din fotosamling.</translation>
 <translation id="5955891643922670672">Viser offlineversion</translation>
+<translation id="5957613098218939406">Flere valgmuligheder</translation>
 <translation id="5964480694698977962">Opret ny inkognitofane.</translation>
 <translation id="5965679971710331625">Du er logget ind</translation>
 <translation id="5982717868370722439">Føj eksisterende data til <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Talesøgning</translation>
 <translation id="6807889908376551050">Vis alle...</translation>
 <translation id="681368974849482173">Elementet blev oprettet</translation>
+<translation id="685040365210406336">Undlad at foretage nogen ændringer</translation>
 <translation id="6896758677409633944">Kopiér</translation>
 <translation id="6903907808598579934">Aktivér synkronisering</translation>
 <translation id="6914783257214138813">Dine adgangskoder vil være synlige for alle, der kan se den eksporterede fil.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> procent er downloadet</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7400418766976504921">Webadresse</translation>
+<translation id="741204030948306876">Ja tak</translation>
 <translation id="7425346204213733349">Ændringer af dine bogmærker, din historik, dine adgangskoder og andre indstillinger synkroniseres ikke længere til din Google-konto. Dine eksisterende data er dog stadig gemt på din Google-konto.</translation>
 <translation id="744343212394640790">Ikke <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Delstat/amt</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index edb1f7b4..42f661c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Hierdurch wird Ihrer aktueller Download abgebrochen.</translation>
 <translation id="1605658421715042784">Bild kopieren</translation>
 <translation id="1612730193129642006">Tab-Raster anzeigen</translation>
+<translation id="162035744160882748">Synchronisierung, Personalisierung und andere Google-Dienste aktivieren</translation>
 <translation id="1644574205037202324">Verlauf</translation>
 <translation id="1646446875146297738">Wenn Sie "Do Not Track" aktivieren, wird eine Anfrage in Ihre Browseraufrufe aufgenommen. Welche Auswirkungen dies hat, hängt davon ab, ob eine Website auf die Anfrage reagiert und wie diese interpretiert wird.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Zeitraum</translation>
 <translation id="4172051516777682613">Immer anzeigen</translation>
 <translation id="418156467088430727">Offlineversion in einem neuen Tab ansehen</translation>
+<translation id="4192273449750167573">Einstellungen auf dem nächsten Bildschirm überprüfen</translation>
 <translation id="4237682350741091554">Chrome-Synchronisierung und -Personalisierung in den <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> verwalten</translation>
 <translation id="424315890655130736">Passphrase eingeben</translation>
 <translation id="4272631900155121838">Um einen QR-Code zu scannen, aktivieren Sie in den Einstellungen die Kamera</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Der Speicher Ihres Geräts ist fast voll. Geben Sie Speicherplatz frei und versuchen Sie es dann noch einmal.</translation>
 <translation id="5948291296578561264">Dadurch können Sie Fotos in der Fotogalerie speichern.</translation>
 <translation id="5955891643922670672">Offlineversion wird angezeigt</translation>
+<translation id="5957613098218939406">Weitere Optionen</translation>
 <translation id="5964480694698977962">Neuen Inkognito-Tab erstellen.</translation>
 <translation id="5965679971710331625">Sie sind angemeldet</translation>
 <translation id="5982717868370722439">Vorhandene Daten zu <ph name="USER_EMAIL" /> hinzufügen.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Sprachsuche</translation>
 <translation id="6807889908376551050">Alle anzeigen...</translation>
 <translation id="681368974849482173">Element erstellt</translation>
+<translation id="685040365210406336">Keine Änderungen vornehmen</translation>
 <translation id="6896758677409633944">Kopieren</translation>
 <translation id="6903907808598579934">Synchronisierung aktivieren</translation>
 <translation id="6914783257214138813">Ihre Passwörter sind für jeden zugänglich, der die exportierte Passwortdatei aufrufen kann.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> % heruntergeladen</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Ja, bitte</translation>
 <translation id="7425346204213733349">Änderungen an Ihren Lesezeichen, Ihrem Verlauf, Ihren Passwörtern und anderen Einstellungen werden nicht mehr mit Ihrem Google-Konto synchronisiert. Ihre vorhandenen Daten bleiben aber in Ihrem Google-Konto gespeichert.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> ist nicht mein Konto</translation>
 <translation id="7454057999980797137">Bundesl./Landkr.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 7395ec7..a29acf1 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Αυτό θα σταματήσει όλη την πρόοδο για την τρέχουσα λήψη.</translation>
 <translation id="1605658421715042784">Αντιγραφή εικόνας</translation>
 <translation id="1612730193129642006">Εμφάνιση πλέγματος καρτελών</translation>
+<translation id="162035744160882748">Ενεργοποιήστε τον συγχρονισμό, την εξατομίκευση και άλλες υπηρεσίες Google</translation>
 <translation id="1644574205037202324">Ιστορικό</translation>
 <translation id="1646446875146297738">Η ενεργοποίηση της επιλογής "Χωρίς εντοπισμό" συνεπάγεται ότι θα περιλαμβάνεται ένα αίτημα με την επισκεψιμότητα περιηγήσής σας. Τυχόν αποτελέσματα σχετίζονται με το εάν ένας ιστότοπος ανταποκρίνεται στο αίτημα και με τον τόπο ερμηνείας του αιτήματος.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Χρονικό εύρος</translation>
 <translation id="4172051516777682613">Εμφάνιση πάντα</translation>
 <translation id="418156467088430727">Προβολή έκδοσης εκτός σύνδεσης σε νέα καρτέλα</translation>
+<translation id="4192273449750167573">Ελέγξτε τις ρυθμίσεις σας στην επόμενη οθόνη</translation>
 <translation id="4237682350741091554">Διαχειριστείτε το Chrome Sync και την εξατομίκευση στις <ph name="BEGIN_LINK" />Ρυθμίσεις<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Εισαγωγή φράσης πρόσβασης</translation>
 <translation id="4272631900155121838">Για να σαρώσετε έναν κώδικα QR, ενεργοποιήστε την κάμερα από τις ρυθμίσεις</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Ο αποθηκευτικός χώρος της συσκευής σας έχει σχεδόν γεμίσει. Ελευθερώστε χώρο και προσπαθήστε ξανά.</translation>
 <translation id="5948291296578561264">Σας επιτρέπει να αποθηκεύετε φωτογραφίες στη βιβλιοθήκη φωτογραφιών σας.</translation>
 <translation id="5955891643922670672">Προβολή έκδοσης εκτός σύνδεσης</translation>
+<translation id="5957613098218939406">Περισσότερες επιλογές</translation>
 <translation id="5964480694698977962">Δημιουργία νέας καρτέλας ανώνυμης περιήγησης.</translation>
 <translation id="5965679971710331625">Είστε συνδεδεμένοι</translation>
 <translation id="5982717868370722439">Προσθήκη υπαρχόντων δεδομένων στη διεύθυνση <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Φωνητική αναζήτηση</translation>
 <translation id="6807889908376551050">Εμφάνιση όλων…</translation>
 <translation id="681368974849482173">Δημιουργήθηκε ένα στοιχείο</translation>
+<translation id="685040365210406336">Να μην γίνουν αλλαγές</translation>
 <translation id="6896758677409633944">Αντιγραφή</translation>
 <translation id="6903907808598579934">Ενεργοποίηση συγχρονισμού</translation>
 <translation id="6914783257214138813">Οι κωδικοί πρόσβασής σας θα είναι ορατοί σε οποιονδήποτε μπορεί να δει το αρχείο εξαγωγής.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Έγινε λήψη του <ph name="PERCENT" /> τοις εκατό</translation>
 <translation id="7346909386216857016">OK, το κατάλαβα</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Ναι, συμφωνώ</translation>
 <translation id="7425346204213733349">Οι αλλαγές στους σελιδοδείκτες, το ιστορικό, τους κωδικούς πρόσβασης και σε άλλες ρυθμίσεις δεν θα συγχρονίζονται πλέον με το Λογαριασμό σας Google. Ωστόσο, τα υπάρχοντα δεδομένα σας θα παραμείνουν αποθηκευμένα στο Λογαριασμό σας Google.</translation>
 <translation id="744343212394640790">Δεν είμαι ο χρήστης <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Νομός/Επαρχία</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 2fdc75b..a90b31c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">This will stop all progress for your current download.</translation>
 <translation id="1605658421715042784">Copy image</translation>
 <translation id="1612730193129642006">Show Tab Grid</translation>
+<translation id="162035744160882748">Turn on sync, personalisation and other Google services</translation>
 <translation id="1644574205037202324">History</translation>
 <translation id="1646446875146297738">Enabling ‘Do Not Track’ means that a request will be included with your browsing traffic. Any effect depends on whether a website responds to the request, and how the request is interpreted.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Time Range</translation>
 <translation id="4172051516777682613">Always show</translation>
 <translation id="418156467088430727">View Offline Version in New Tab</translation>
+<translation id="4192273449750167573">Review your settings on the next screen</translation>
 <translation id="4237682350741091554">Manage Chrome Sync and personalisation in <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Enter Passphrase</translation>
 <translation id="4272631900155121838">To scan a QR code, enable the camera from settings</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Your device is almost full. Free up space and try again.</translation>
 <translation id="5948291296578561264">This lets you save photos to your photo library.</translation>
 <translation id="5955891643922670672">Viewing Offline Version</translation>
+<translation id="5957613098218939406">More Options</translation>
 <translation id="5964480694698977962">Create new incognito tab.</translation>
 <translation id="5965679971710331625">You're signed in</translation>
 <translation id="5982717868370722439">Add existing data to <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Voice Search</translation>
 <translation id="6807889908376551050">Show All...</translation>
 <translation id="681368974849482173">Item created</translation>
+<translation id="685040365210406336">Make no changes</translation>
 <translation id="6896758677409633944">Copy</translation>
 <translation id="6903907808598579934">Turn on sync</translation>
 <translation id="6914783257214138813">Your passwords will be visible to anyone who can see the exported file.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> percent downloaded</translation>
 <translation id="7346909386216857016">OK, got it</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Yes, I'm in</translation>
 <translation id="7425346204213733349">Changes to your bookmarks, history, passwords and other settings will no longer be synced to your Google Account. However, your existing data will remain stored in your Google Account.</translation>
 <translation id="744343212394640790">Not <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">State / County</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 60fae6e..cbb3070f31 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Esta acción detendrá el progreso de la descarga actual.</translation>
 <translation id="1605658421715042784">Copiar imagen</translation>
 <translation id="1612730193129642006">Mostrar la cuadrícula de pestañas</translation>
+<translation id="162035744160882748">Activar la sincronización, la personalización y otros servicios de Google</translation>
 <translation id="1644574205037202324">Historial</translation>
 <translation id="1646446875146297738">Si habilitas la opción "No realizar seguimiento", se incluirá una solicitud con el tráfico de navegación. Los efectos dependerán de si algún sitio web responde a dicha solicitud y de cómo se interpreta.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Intervalo de tiempo</translation>
 <translation id="4172051516777682613">Mostrar siempre</translation>
 <translation id="418156467088430727">Ver la versión sin conexión en una nueva pestaña</translation>
+<translation id="4192273449750167573">Revisar tu configuración en la pantalla siguiente</translation>
 <translation id="4237682350741091554">Administra Sincronización de Chrome y la personalización en <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Ingresar frase de contraseña</translation>
 <translation id="4272631900155121838">Habilita la cámara en la configuración para escanear un código QR</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">El dispositivo está casi lleno. Libera espacio y vuelve a intentarlo.</translation>
 <translation id="5948291296578561264">Esta acción te permite guardar fotos en tu biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Vista de la versión sin conexión</translation>
+<translation id="5957613098218939406">Más opciones</translation>
 <translation id="5964480694698977962">Crea una nueva pestaña de incógnito.</translation>
 <translation id="5965679971710331625">Accediste</translation>
 <translation id="5982717868370722439">Agrega datos existentes a <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Búsqueda por voz</translation>
 <translation id="6807889908376551050">Mostrar todos...</translation>
 <translation id="681368974849482173">Elemento creado</translation>
+<translation id="685040365210406336">No hacer cambios</translation>
 <translation id="6896758677409633944">Copiar</translation>
 <translation id="6903907808598579934">Activar la sincronización</translation>
 <translation id="6914783257214138813">Las personas que tengan acceso al archivo exportado podrán ver tus contraseñas.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> % descargado</translation>
 <translation id="7346909386216857016">Entendido</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Sí, acepto</translation>
 <translation id="7425346204213733349">Los cambios de tus favoritos, historial, contraseñas y otras opciones de configuración ya no se sincronizarán con tu cuenta de Google. Sin embargo, los datos existentes permanecerán almacenados en tu cuenta de Google.</translation>
 <translation id="744343212394640790">No soy <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Estado/condado</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index d170442..a2fd011 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Esta acción detendrá el progreso de la descarga actual.</translation>
 <translation id="1605658421715042784">Copiar imagen</translation>
 <translation id="1612730193129642006">Mostrar cuadrícula de pestañas</translation>
+<translation id="162035744160882748">Activar la sincronización, la personalización y otros servicios de Google</translation>
 <translation id="1644574205037202324">Historial</translation>
 <translation id="1646446875146297738">Al habilitar la opción No realizar seguimiento, se incluirá una solicitud con tu tráfico de navegación. El efecto dependerá de si un sitio web responde a la solicitud y de cómo se interpreta esa solicitud.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Intervalo de tiempo</translation>
 <translation id="4172051516777682613">Mostrar siempre</translation>
 <translation id="418156467088430727">Ver versión sin conexión en una nueva pestaña</translation>
+<translation id="4192273449750167573">Revisa tu configuración en la siguiente pantalla</translation>
 <translation id="4237682350741091554">Administra la personalización y la sincronización de Chrome en <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Introduce tu frase de contraseña</translation>
 <translation id="4272631900155121838">Para escanear un código QR, habilita la cámara en Configuración</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Tu dispositivo está casi lleno. Libera espacio y vuelve a intentarlo.</translation>
 <translation id="5948291296578561264">Esta acción te permite guardar fotos en tu biblioteca.</translation>
 <translation id="5955891643922670672">Viendo versión sin conexión</translation>
+<translation id="5957613098218939406">Más opciones</translation>
 <translation id="5964480694698977962">Crear nueva pestaña de incógnito.</translation>
 <translation id="5965679971710331625">Has iniciado sesión</translation>
 <translation id="5982717868370722439">Añade los datos actuales a <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Búsqueda por voz</translation>
 <translation id="6807889908376551050">Mostrar todo...</translation>
 <translation id="681368974849482173">Elemento creado</translation>
+<translation id="685040365210406336">No hacer cambios</translation>
 <translation id="6896758677409633944">Copiar</translation>
 <translation id="6903907808598579934">Activar sincronización</translation>
 <translation id="6914783257214138813">Cualquier usuario que pueda ver el archivo exportado podrá ver tus contraseñas.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" />% descargado</translation>
 <translation id="7346909386216857016">Entendido</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Sí, acepto</translation>
 <translation id="7425346204213733349">Los cambios que hagas en los marcadores, el historial, las contraseñas y otras opciones no se sincronizarán con tu cuenta de Google. Sin embargo, tus datos actuales seguirán almacenados en tu cuenta.</translation>
 <translation id="744343212394640790">No soy <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Región</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index bac44aa..9c09c62d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">See peatab praeguse allalaadimise edenemise.</translation>
 <translation id="1605658421715042784">Kopeeri pilt</translation>
 <translation id="1612730193129642006">Kuva vahekaartide ruudustik</translation>
+<translation id="162035744160882748">Sünkroonimise, isikupärastamise ja muude Google'i teenuste sisselülitamine</translation>
 <translation id="1644574205037202324">Ajalugu</translation>
 <translation id="1646446875146297738">Valiku „Ära jälgi” lubamine tähendab, et päring lisatakse teie sirvimisliiklusse. Selle toimimine oleneb sellest, kas veebisait reageerib päringule ja kuidas päringut tõlgendatakse.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Ajavahemik</translation>
 <translation id="4172051516777682613">Kuva alati</translation>
 <translation id="418156467088430727">Kuva uuel vahelehel võrguühenduseta versioon</translation>
+<translation id="4192273449750167573">Vaadake järgmisel kuval oma seaded üle</translation>
 <translation id="4237682350741091554">Chrome'i sünkroonimist ja isikupärastamist saate hallata jaotises <ph name="BEGIN_LINK" />Seaded<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Sisestage parool</translation>
 <translation id="4272631900155121838">QR-koodi skannimiseks lubage seadetes kaamera</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Seade on peaaegu täis. Vabastage ruumi ja proovige uuesti.</translation>
 <translation id="5948291296578561264">See võimaldab teil salvestada fotod fotokogusse.</translation>
 <translation id="5955891643922670672">Kuvatakse võrguühenduseta versioon</translation>
+<translation id="5957613098218939406">Rohkem valikuid</translation>
 <translation id="5964480694698977962">Loo uus inkognito vaheleht.</translation>
 <translation id="5965679971710331625">Olete sisse logitud</translation>
 <translation id="5982717868370722439">Lisage olemasolevad andmed e-posti aadressile <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Häälotsing</translation>
 <translation id="6807889908376551050">Kuva kõik ...</translation>
 <translation id="681368974849482173">Üksus on loodud</translation>
+<translation id="685040365210406336">Ära tee muudatusi</translation>
 <translation id="6896758677409633944">Kopeeri</translation>
 <translation id="6903907808598579934">Lülita sünkroonimine sisse</translation>
 <translation id="6914783257214138813">Teie paroolid on nähtavad kõigile, kes saavad vaadata eksporditud faili.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> protsenti on alla laaditud</translation>
 <translation id="7346909386216857016">Selge, sain aru</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Jah, sobib</translation>
 <translation id="7425346204213733349">Järjehoidjates, ajaloos, paroolides ja muudes seadetes tehtud muudatusi ei sünkroonita enam teie Google'i kontoga. Teie olemasolevad andmed jäävad siiski teie Google'i kontole.</translation>
 <translation id="744343212394640790">Pole <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Osariik/maakond</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index b070c408e..931a2d8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">با این کار کل پیشرفت بارگیری کنونی‌تان متوقف خواهد شد.</translation>
 <translation id="1605658421715042784">کپی تصویر</translation>
 <translation id="1612730193129642006">نمایش شبکه برگه</translation>
+<translation id="162035744160882748">‏روشن کردن همگام‌سازی، شخصی‌سازی و سرویس‌های دیگر Google</translation>
 <translation id="1644574205037202324">سابقه</translation>
 <translation id="1646446875146297738">فعال کردن «ردیابی نشود» بدین معناست که درخواستی در ترافیک مرور شما لحاظ خواهد شد. هر گونه تأثیر به این بستگی دارد که وب‌سایت به درخواست پاسخ می‌دهد یا نه و درخواست چگونه تفسیر می‌شود.
 
@@ -195,6 +196,7 @@
 <translation id="4124987746317609294">محدوده زمانی</translation>
 <translation id="4172051516777682613">همیشه نشان داده شود</translation>
 <translation id="418156467088430727">مشاهده نسخه آفلاین در برگه جدید</translation>
+<translation id="4192273449750167573">تنظیماتتان را در صفحه بعد مرور کنید</translation>
 <translation id="4237682350741091554">‏«همگام‌سازی Chrome» و شخصی‌سازی را در <ph name="BEGIN_LINK" />تنظیمات<ph name="END_LINK" /> مدیریت کنید</translation>
 <translation id="424315890655130736">عبارت ورود را وارد کنید</translation>
 <translation id="4272631900155121838">‏برای اسکن کردن کد QR، دوربین را در تنظیمات فعال کنید</translation>
@@ -286,6 +288,7 @@
 <translation id="5938160824633642847">دستگاهتان تقریباً پر است. فضا آزاد کنید و دوباره امتحان کنید.</translation>
 <translation id="5948291296578561264">با این کار می‌توانید عکس‌ها را در کتابخانه عکستان ذخیره کنید.</translation>
 <translation id="5955891643922670672">درحال مشاهده نسخه آفلاین</translation>
+<translation id="5957613098218939406">گزینه‌های بیشتر</translation>
 <translation id="5964480694698977962">ایجاد برگه ناشناس جدید</translation>
 <translation id="5965679971710331625">در سیستم هستید</translation>
 <translation id="5982717868370722439">افزودن داده‌های موجود به <ph name="USER_EMAIL" />.</translation>
@@ -345,6 +348,7 @@
 <translation id="6797885426782475225">جستجوی گفتاری</translation>
 <translation id="6807889908376551050">نمایش همه...</translation>
 <translation id="681368974849482173">مورد ایجاد شد</translation>
+<translation id="685040365210406336">تغییری ایجاد نشود</translation>
 <translation id="6896758677409633944">کپی</translation>
 <translation id="6903907808598579934">روشن کردن همگام‌سازی</translation>
 <translation id="6914783257214138813">گذرواژه‌های شما برای همه افرادی که می‌توانند فایل صادرشده را ببینید، نمایان خواهند بود.</translation>
@@ -374,6 +378,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> درصد بارگیری شد</translation>
 <translation id="7346909386216857016">بله متوجه شدم.</translation>
 <translation id="7400418766976504921">نشانی وب</translation>
+<translation id="741204030948306876">بله، موافقم</translation>
 <translation id="7425346204213733349">‏تغییرات در نشانک‌ها، سابقه، گذرواژه و سایر تنظیمات دیگر با حساب Google شما همگام‌سازی نخواهند شد. با این حال، داده‌های موجودتان در حساب Google شما باقی خواهند ماند.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" />، نشانی ایمیل من نیست</translation>
 <translation id="7454057999980797137">ایالت / استان</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 9f9f303b..750bf96 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Tämä keskeyttää nykyisen latauksen edistymisen.</translation>
 <translation id="1605658421715042784">Kopioi kuva</translation>
 <translation id="1612730193129642006">Näytä välilehtiruudukko</translation>
+<translation id="162035744160882748">Ota synkronointi, personointi ja muut Google-palvelut käyttöön</translation>
 <translation id="1644574205037202324">Historia</translation>
 <translation id="1646446875146297738">Do Not Track -valinta lisää pyynnön selaustietoliikenteeseesi. Sen vaikutus riippuu siitä, miten verkkosivustot vastaavat pyyntöön ja tulkitsevat sitä.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Aikaväli</translation>
 <translation id="4172051516777682613">Näytä aina</translation>
 <translation id="418156467088430727">Näytä offline-versio uudella välilehdellä</translation>
+<translation id="4192273449750167573">Tarkista asetukset seuraavalla ruudulla</translation>
 <translation id="4237682350741091554">Hallinnoi Chromen synkronointia ja räätälöintiä <ph name="BEGIN_LINK" />asetuksissa<ph name="END_LINK" />.</translation>
 <translation id="424315890655130736">Anna tunnuslause</translation>
 <translation id="4272631900155121838">Jos haluat skannata QR-koodin, ota kamera käyttöön asetuksissa.</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Laite on lähes täynnä. Vapauta tilaa ja yritä uudelleen.</translation>
 <translation id="5948291296578561264">Tämän avulla voit tallentaa kuvia kuvakirjastoon.</translation>
 <translation id="5955891643922670672">Näytetään offline-versio</translation>
+<translation id="5957613098218939406">Lisäasetukset</translation>
 <translation id="5964480694698977962">Luo uusi incognito-välilehti.</translation>
 <translation id="5965679971710331625">Olet kirjautunut sisään</translation>
 <translation id="5982717868370722439">Lisää olemassa olevat tiedot tilille <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Puhehaku</translation>
 <translation id="6807889908376551050">Näytä kaikki...</translation>
 <translation id="681368974849482173">Kohde luotiin</translation>
+<translation id="685040365210406336">Älä tee muutoksia</translation>
 <translation id="6896758677409633944">Kopioi</translation>
 <translation id="6903907808598579934">Ota synkronointi käyttöön</translation>
 <translation id="6914783257214138813">Salasanasi näkyvät kaikille, jotka näkevät viedyn tiedoston.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> prosenttia ladattu</translation>
 <translation id="7346909386216857016">Selvä</translation>
 <translation id="7400418766976504921">URL-osoite</translation>
+<translation id="741204030948306876">Kyllä</translation>
 <translation id="7425346204213733349">Kirjanmerkkeihin, historiaan, salasanoihin ja muihin asetuksiin tehtäviä muutoksia ei enää synkronoida Google-tilillesi. Olemassa olevia tietojasi säilytetään kuitenkin Google-tililläsi.</translation>
 <translation id="744343212394640790">Ei <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Alue/maa</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index ed40636..9d6c782 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Ihihinto nito ang lahat ng progreso para sa iyong kasalukuyang pag-download.</translation>
 <translation id="1605658421715042784">Kopyahin ang Larawan</translation>
 <translation id="1612730193129642006">Ipakita ang Grid ng Tab</translation>
+<translation id="162035744160882748">I-on ang pag-sync, pag-personalize, at iba pang serbisyo ng Google</translation>
 <translation id="1644574205037202324">History</translation>
 <translation id="1646446875146297738">Ang pag-enable sa ‘Huwag Subaybayan’ ay nangangahulugan na may isasamang kahilingan sa iyong trapiko sa pagba-browse. Ang anumang epekto ay nakadepende kung tumutugon man ang website sa kahilingan, at kung paano nabibigyan ng kahulugan ang kahilingan.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Sakop na Oras</translation>
 <translation id="4172051516777682613">Palaging ipakita</translation>
 <translation id="418156467088430727">Tingnan ang Offline na Bersyon sa Bagong Tab</translation>
+<translation id="4192273449750167573">Suriin ang iyong mga setting sa susunod na screen</translation>
 <translation id="4237682350741091554">Pamahalaan ang Chrome Sync at pag-personalize sa <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Ilagay ang Passphrase</translation>
 <translation id="4272631900155121838">Upang mag-scan ng QR code, i-enable ang camera mula sa mga setting</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Malapit nang mapuno ang iyong device. Magbakante ng espasyo at subukang muli.</translation>
 <translation id="5948291296578561264">Binibigyang-daan ka nito na mag-save ng mga larawan sa iyong library ng larawan.</translation>
 <translation id="5955891643922670672">Tinitingnan ang Offline na Bersyon</translation>
+<translation id="5957613098218939406">Higit Pang Mga Opsyon</translation>
 <translation id="5964480694698977962">Gumawa ng bagong tab na incognito.</translation>
 <translation id="5965679971710331625">Naka-sign in ka</translation>
 <translation id="5982717868370722439">Idagdag ang kasalukuyang data sa <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Paghahanap Gamit ang Boses</translation>
 <translation id="6807889908376551050">Ipakita Lahat...</translation>
 <translation id="681368974849482173">Nagawa ang item</translation>
+<translation id="685040365210406336">Huwag gumawa ng mga pagbabago</translation>
 <translation id="6896758677409633944">Copy</translation>
 <translation id="6903907808598579934">I-on ang pag-sync</translation>
 <translation id="6914783257214138813">Makikita ng sinumang makakatingin sa na-export na file ang iyong mga password.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> (na) porsyento ang na-download na</translation>
 <translation id="7346909386216857016">Ok, nakuha ko</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Oo, sali ako</translation>
 <translation id="7425346204213733349">Hindi na masi-sync sa iyong Google Account ang mga pagbabago sa iyong mga bookmark, history, password at iba pang setting. Gayunpaman, mananatiling nakaimbak sa iyong Google account ang iyong kasalukuyang data.</translation>
 <translation id="744343212394640790">Hindi <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Estado / County</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 06ce9e6..b700d72 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -39,11 +39,12 @@
 <translation id="152234381334907219">Jamais enregistrés</translation>
 <translation id="1540800554400757039">Adresse 1</translation>
 <translation id="1545749641540134597">Scanner le code QR</translation>
-<translation id="1558704936695638228">Appuyer de manière prolongée pour afficher plus d'options de l'onglet</translation>
+<translation id="1558704936695638228">Appuyez de manière prolongée pour afficher plus d'options de l'onglet</translation>
 <translation id="1580783302095112590">E-mail envoyé.</translation>
 <translation id="1582732959743469162">Cette action arrêtera le téléchargement en cours.</translation>
 <translation id="1605658421715042784">Copier l'image</translation>
 <translation id="1612730193129642006">Afficher la grille d'onglets</translation>
+<translation id="162035744160882748">Activer la synchronisation, la personnalisation et d'autres services Google</translation>
 <translation id="1644574205037202324">Historique</translation>
 <translation id="1646446875146297738">Si vous activez la fonctionnalité "Interdire le suivi", une demande sera incluse dans le trafic de navigation. Le résultat dépend de l'obtention d'une réponse de la part du site Web, ainsi que de la façon dont celle-ci est interprétée.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Période</translation>
 <translation id="4172051516777682613">Toujours afficher</translation>
 <translation id="418156467088430727">Afficher version hors connexion dans nouvel onglet</translation>
+<translation id="4192273449750167573">Consulter vos paramètres sur l'écran suivant</translation>
 <translation id="4237682350741091554">Gérer la synchronisation et la personnalisation de Chrome dans les <ph name="BEGIN_LINK" />paramètres<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Saisir la phrase secrète</translation>
 <translation id="4272631900155121838">Pour scanner un code QR, activez l'appareil photo depuis les paramètres</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Votre appareil est presque saturé. Libérez de l'espace et réessayez.</translation>
 <translation id="5948291296578561264">Cela vous permet d'enregistrer des photos dans votre photothèque.</translation>
 <translation id="5955891643922670672">Affichage de la version hors connexion</translation>
+<translation id="5957613098218939406">Plus d'options</translation>
 <translation id="5964480694698977962">Créer un onglet de navigation privée</translation>
 <translation id="5965679971710331625">Vous êtes connecté</translation>
 <translation id="5982717868370722439">Ajoutez les données existantes au compte <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Recherche vocale</translation>
 <translation id="6807889908376551050">Tout afficher…</translation>
 <translation id="681368974849482173">Élément créé</translation>
+<translation id="685040365210406336">Ne rien modifier</translation>
 <translation id="6896758677409633944">Copier</translation>
 <translation id="6903907808598579934">Activer la synchronisation</translation>
 <translation id="6914783257214138813">Toute personne ayant accès au fichier exporté pourra voir ces mots de passe.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> % téléchargés</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">J'accepte</translation>
 <translation id="7425346204213733349">Les modifications apportées à vos favoris, votre historique, vos mots de passe et d'autres paramètres ne seront plus synchronisées avec votre compte Google. Vos données seront cependant maintenues sur votre compte Google.</translation>
 <translation id="744343212394640790">Autre que <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">État/Comté</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index 3d8633f..163e0af 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">આનાથી તમારું હાલનું ડાઉનલોડ આગળ વધતું અટકી જશે.</translation>
 <translation id="1605658421715042784">છબી કૉપિ કરો</translation>
 <translation id="1612730193129642006">ટૅબ ગ્રિડ બતાવો</translation>
+<translation id="162035744160882748">સિંક, વૈયક્તિકરણ અને અન્ય Google સેવાઓ ચાલુ કરો</translation>
 <translation id="1644574205037202324">ઇતિહાસ</translation>
 <translation id="1646446875146297738">‘ટ્રેક કરશો નહીં' સક્ષમ કરવાનો અર્થ એ છે કે વિનંતીને તમારા બ્રાઉઝિંગ ટ્રાફિક સાથે શામેલ કરવામાં આવશે. કોઈપણ પ્રભાવ વેબસાઇટ વિનંતીનો પ્રતિસાદ આપે છે કે કેમ અને કેવી રીતે વિનંતીનું અર્થઘટન થાય છે તેના પર નિર્ભર છે. 
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">સમય શ્રેણી</translation>
 <translation id="4172051516777682613">હંમેશા બતાવો</translation>
 <translation id="418156467088430727">ઑફલાઇન સંસ્કરણ નવા ટૅબમાં જુઓ</translation>
+<translation id="4192273449750167573">આગલી સ્ક્રીન પર તમારી સેટિંગનો રિવ્યૂ કરો</translation>
 <translation id="4237682350741091554">Chrome સમન્વયન અને વૈયક્તિકરણને <ph name="BEGIN_LINK" />સેટિંગ્સ<ph name="END_LINK" />માં સંચાલિત કરો</translation>
 <translation id="424315890655130736">પાસફ્રેઝ દાખલ કરો</translation>
 <translation id="4272631900155121838">QR કોડને સ્કેન કરવા માટે, સેટિંગ્સમાંથી કૅમેરો સક્ષમ કરો</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">તમારું ઉપકરણ લગભગ ભરાઈ ગયું છે. સ્પેસ બનાવો અને ફરી પ્રયાસ કરો.</translation>
 <translation id="5948291296578561264">આ તમને તમારી ફોટો લાઇબ્રેરીમાં ફોટો સાચવવા દે છે.</translation>
 <translation id="5955891643922670672">ઑફલાઇન સંસ્કરણ જોઈ રહ્યાં છે</translation>
+<translation id="5957613098218939406">વધુ વિકલ્પો</translation>
 <translation id="5964480694698977962">નવું છૂપું ટૅબ બનાવો</translation>
 <translation id="5965679971710331625">તમે સાઇન ઇન છો</translation>
 <translation id="5982717868370722439">અસ્તિત્વમાંના ડેટાને <ph name="USER_EMAIL" /> માં ઉમેરો.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">વૉઇસ શોધ</translation>
 <translation id="6807889908376551050">બધું બતાવો...</translation>
 <translation id="681368974849482173">આઇટમ બનાવી</translation>
+<translation id="685040365210406336">કોઈ ફેરફાર ન કરો</translation>
 <translation id="6896758677409633944">કૉપિ કરો</translation>
 <translation id="6903907808598579934">સમન્વયન ચાલુ કરો</translation>
 <translation id="6914783257214138813">જે કોઈપણ તમારી નિકાસ કરેલ પાસવર્ડની ફાઇલને જોઈ શકશે, તેમને તમારા પાસવર્ડ પણ દૃશ્યક્ષમ થશે.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> ટકા ડાઉનલોડ થઈ</translation>
 <translation id="7346909386216857016">બરાબર, સમજાઇ ગયું</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">હા, હું સંમત છું</translation>
 <translation id="7425346204213733349">તમારા બુકમાર્ક્સ, ઇતિહાસ, પાસવર્ડ્સ અને અન્ય સેટિંગ્સમાં ફેરફારને હવે તમારા Google એકાઉન્ટ પર સમન્વયિત કરવામાં આવશે નહીં. જો કે, તમારો અસ્તિત્વમાંનો ડેટા તમારા Google એકાઉન્ટમાં સંગ્રહિત રહેશે.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> નથી</translation>
 <translation id="7454057999980797137">રાજ્ય / કાઉન્ટી</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 81a4438..514b55b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">यह आपके इस समय हो रहे सभी डाउनलोड को बंद कर देगा.</translation>
 <translation id="1605658421715042784">इमेज की कॉपी करें</translation>
 <translation id="1612730193129642006">टैब ग्रिड दिखाएं</translation>
+<translation id="162035744160882748">'सिंक करें', 'मनमुताबिक बनाएं' और दूसरी 'Google सेवाएं' चालू करें</translation>
 <translation id="1644574205037202324">इतिहास</translation>
 <translation id="1646446875146297738">‘नज़र न रखें’ सुविधा को चालू करने का मतलब है कि आपके ब्राउज़िंग ट्रैफ़िक के साथ कोई अनुरोध शामिल किया जाएगा. कोई भी प्रभाव इस बात पर निर्भर करता है कि वेबसाइट, अनुरोध का जवाब देती है या नहीं और अनुरोध को किस तरह समझा जाता है.
 
@@ -91,7 +92,7 @@
 <translation id="2386793615875593361">1 चयनित</translation>
 <translation id="2435457462613246316">पासवर्ड दिखाएं</translation>
 <translation id="2481538920734869610">खाता जोड़ें</translation>
-<translation id="2523184218357549926">आपके जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
+<translation id="2523184218357549926">आप जिन पेजों पर जाते हैं उनके यूआरएल Google को भेजती है</translation>
 <translation id="2523363575747517183">यह वेबसाइट बार-बार किसी दूसरे ऐप्लिकेशन को खोलने की कोशिश कर रही है.</translation>
 <translation id="2529021024822217800">सभी खोलें</translation>
 <translation id="2572712655377361602">एक डिवाइस नीति ने आपकी फ़ोटो का एक्सेस रोक दिया है</translation>
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">समय सीमा</translation>
 <translation id="4172051516777682613">हमेशा दिखाएं</translation>
 <translation id="418156467088430727">ऑफ़लाइन वर्शन को नए टैब में देखें</translation>
+<translation id="4192273449750167573">अगली स्क्रीन पर अपनी सेटिंग देखें</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> में जाकर Chrome सिंक और वैयक्तिकरण प्रबंधित करें</translation>
 <translation id="424315890655130736">पासफ़्रेज़ डालें</translation>
 <translation id="4272631900155121838">कोई QR कोड स्कैन करने के लिए, सेटिंग से कैमरा सक्षम करें</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">आपके डिवाइस की लगभग पूरी जगह भर गई है. जगह खाली करके दोबारा आज़माएं.</translation>
 <translation id="5948291296578561264">इससे फ़ोटो आपकी फ़ोटो लाइब्रेरी में सेव कर लिए जाते हैं.</translation>
 <translation id="5955891643922670672">ऑफ़लाइन वर्शन देख रहे हैं</translation>
+<translation id="5957613098218939406">अधिक विकल्प</translation>
 <translation id="5964480694698977962">नया गुप्त टैब बनाएं.</translation>
 <translation id="5965679971710331625">आप प्रवेश किए हुए हैं</translation>
 <translation id="5982717868370722439">मौजूदा डेटा <ph name="USER_EMAIL" /> में जोड़ें.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">बोलकर खोजें</translation>
 <translation id="6807889908376551050">सभी दिखाएं...</translation>
 <translation id="681368974849482173">आइटम बनाया गया</translation>
+<translation id="685040365210406336">कोई बदलाव न करें</translation>
 <translation id="6896758677409633944">कॉपी बनाएं</translation>
 <translation id="6903907808598579934">समन्वयन चालू करें</translation>
 <translation id="6914783257214138813">आपके पासवर्ड, निर्यात की गई फ़ाइल देख पाने वाले सभी व्यक्तियों को दिखाई देंगे.</translation>
@@ -352,7 +356,7 @@
 <translation id="6979158407327259162">Google डिस्क</translation>
 <translation id="7004499039102548441">हाल के टैब</translation>
 <translation id="7006788746334555276">सामग्री सेटिंग</translation>
-<translation id="7017968314960951695">आप जिन साइटों पर जाते हैं उनकी गतिविधि और ब्राउज़र गतिविधि के साथ ही इंटरैक्शन का इस्तेमाल मनमुताबिक बनाने के लिए करती है</translation>
+<translation id="7017968314960951695">आप जिन साइटों पर जाते हैं उनकी गतिविधि और ब्राउज़र गतिविधि के साथ ही इंटरैक्शन का इस्तेमाल, चीज़ों को मनमुताबिक बनाने के लिए करती है</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
 <translation id="7031882061095297553">इसमें समन्वयित करें</translation>
 <translation id="7053983685419859001">अवरोधित करें</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> प्रतिशत डाउनलोड हो गई</translation>
 <translation id="7346909386216857016">ठीक है, समझ लिया</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">हां मैं सहमत हूं</translation>
 <translation id="7425346204213733349">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग में किए गए बदलाव अब आपके Google खाते में समन्वयित नहीं किए जाएंगे. हालांकि, आपका मौजूदा डेटा आपके Google खाते में संग्रहित रहेगा.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> नहीं है</translation>
 <translation id="7454057999980797137">राज्य / देश</translation>
@@ -416,7 +421,7 @@
 <translation id="8080028325999236607">सभी टैब बंद करें</translation>
 <translation id="8114753159095730575">फ़ाइल डाउनलोड करने की सुविधा उपलब्ध है. विकल्प स्क्रीन के नीचे उपलब्ध हैं.</translation>
 <translation id="8160722851663543621">पता बार और खोज बॉक्स की खोजों और कुछ कुकी को आपके डिफ़ॉल्ट खोज इंजन पर भेजती है</translation>
-<translation id="8178325540017397816">आपके चुने गए आइटम हटा दिए जाएंगे</translation>
+<translation id="8178325540017397816">आपके चुने हुए आइटम हटा दिए जाएंगे</translation>
 <translation id="8205564605687841303">रद्द करें</translation>
 <translation id="8225985093977202398">संचित चित्र और फ़ाइलें</translation>
 <translation id="8261506727792406068">हटाएं</translation>
@@ -427,7 +432,7 @@
 <translation id="842017693807136194">इससे प्रवेश किया गया है</translation>
 <translation id="8428045167754449968">शहर / कस्बा</translation>
 <translation id="8428213095426709021">सेटिंग</translation>
-<translation id="8438566539970814960">खोजों और ब्राउज़िेंग को बेहतर बनाएं</translation>
+<translation id="8438566539970814960">खोजों और ब्राउज़िंग को बेहतर बनाएं</translation>
 <translation id="8458397775385147834">1 आइटम हटाया गया</translation>
 <translation id="8487700953926739672">ऑफ़लाइन उपलब्ध है</translation>
 <translation id="8503813439785031346">उपयोगकर्ता नाम</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index 3ed60bc..3b971f8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Time će se zaustaviti trenutačno preuzimanje i izbrisati sve što je dosad preuzeto.</translation>
 <translation id="1605658421715042784">Kopiraj sliku</translation>
 <translation id="1612730193129642006">Prikaz rešetke kartice</translation>
+<translation id="162035744160882748">Uključite sinkronizaciju, prilagodbu i druge Googleove usluge</translation>
 <translation id="1644574205037202324">Povijest</translation>
 <translation id="1646446875146297738">Ako omogućite "Nemoj pratiti", taj će se zahtjev slati uz vaš promet pregledavanja. Učinak ovisi o tome hoće li web-lokacija reagirati na taj zahtjev i kako će se on tumačiti.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Vremenski raspon</translation>
 <translation id="4172051516777682613">Uvijek prikaži</translation>
 <translation id="418156467088430727">Prikaži offline verziju na novoj kartici</translation>
+<translation id="4192273449750167573">Pregledajte svoje postavke na sljedećem zaslonu</translation>
 <translation id="4237682350741091554">Sinkronizacijom Chromea i prilagodbom možete upravljati na stranici <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Unesite šifru</translation>
 <translation id="4272631900155121838">Da biste skenirali QR kod, omogućite fotoaparat u postavkama</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Uređaj je gotovo pun. Oslobodite prostor i pokušajte ponovo.</translation>
 <translation id="5948291296578561264">To vam omogućuje da spremite fotografije u zbirku fotografija.</translation>
 <translation id="5955891643922670672">Prikaz offline verzije</translation>
+<translation id="5957613098218939406">Više opcija</translation>
 <translation id="5964480694698977962">Otvori novu anonimnu karticu.</translation>
 <translation id="5965679971710331625">Prijavili ste se</translation>
 <translation id="5982717868370722439">Dodavanje postojećih podataka na račun <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Glasovno pretraživanje</translation>
 <translation id="6807889908376551050">Prikaži sve...</translation>
 <translation id="681368974849482173">Stavka je stvorena</translation>
+<translation id="685040365210406336">Ne mijenjaj</translation>
 <translation id="6896758677409633944">Kopiraj</translation>
 <translation id="6903907808598579934">Uključi sinkronizaciju</translation>
 <translation id="6914783257214138813">Vaše zaporke bit će vidljive svima koji vide izvezenu datoteku.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> posto preuzeto</translation>
 <translation id="7346909386216857016">Dobro, shvaćam</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Da, u redu</translation>
 <translation id="7425346204213733349">Promjene oznaka, povijesti, zaporki i drugih postavki više se neće sinkronizirati s vašim Google računom. No vaši postojeći podaci ostat će pohranjeni na vašem Google računu.</translation>
 <translation id="744343212394640790">Nisam <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Županija</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index a863273..e76382e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Ezzel leállítja az aktuális letöltést.</translation>
 <translation id="1605658421715042784">Kép másolása</translation>
 <translation id="1612730193129642006">Laprács megjelenítése</translation>
+<translation id="162035744160882748">A szinkronizálás, személyre szabás és más Google-szolgáltatások bekapcsolása</translation>
 <translation id="1644574205037202324">Előzmények</translation>
 <translation id="1646446875146297738">A „Nincs nyomon követés” funkció engedélyezése azzal jár, hogy egy adott kérés beleszámít majd a böngészési forgalomba. A hatása attól is függ, hogy az adott webhely válaszol-e a kérésre, és hogyan értelmezi azt.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Időintervallum</translation>
 <translation id="4172051516777682613">Mindig mutassa</translation>
 <translation id="418156467088430727">Offline verzió megtekintése új lapon</translation>
+<translation id="4192273449750167573">Tekintse át a beállításokat a következő képernyőn</translation>
 <translation id="4237682350741091554">A Chrome-szinkronizálást és a személyre szabást a <ph name="BEGIN_LINK" />Beállításokban<ph name="END_LINK" /> kezelheti</translation>
 <translation id="424315890655130736">Összetett jelszó megadása</translation>
 <translation id="4272631900155121838">QR-kód beolvasásához engedélyezze a kamerát a beállítások között</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Az eszköz tárhelye majdnem megtelt. Szabadítson fel helyet, és próbálja újra.</translation>
 <translation id="5948291296578561264">Segítségével fotókat menthet a fotótárba.</translation>
 <translation id="5955891643922670672">Offline verzió</translation>
+<translation id="5957613098218939406">További lehetőségek</translation>
 <translation id="5964480694698977962">Új inkognitólap létrehozása.</translation>
 <translation id="5965679971710331625">Sikeresen bejelentkezett</translation>
 <translation id="5982717868370722439">Meglévő adatok hozzáadása a(z) <ph name="USER_EMAIL" /> fiókhoz.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Hangalapú keresés</translation>
 <translation id="6807889908376551050">Összes megjelenítése...</translation>
 <translation id="681368974849482173">Elem létrehozva</translation>
+<translation id="685040365210406336">Ne legyen módosítás</translation>
 <translation id="6896758677409633944">Másolás</translation>
 <translation id="6903907808598579934">Szinkronizálás bekapcsolása</translation>
 <translation id="6914783257214138813">Jelszavai mindenki számára láthatók lesznek, aki hozzáfér az exportált fájlhoz.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> százalék letöltve</translation>
 <translation id="7346909386216857016">Rendben, értem</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Igen, folytatom</translation>
 <translation id="7425346204213733349">Könyvjelzői, előzményei, jelszavai és más beállításai a továbbiakban már nem lesznek szinkronizálva Google-fiókjával. Meglévő adatait azonban továbbra is tárolni fogja a fiók.</translation>
 <translation id="744343212394640790">Nem <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Állam/megye</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index a68bfe4..00447c2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Ini akan menghentikan semua progres download Anda saat ini.</translation>
 <translation id="1605658421715042784">Salin Gambar</translation>
 <translation id="1612730193129642006">Tampilkan Grid Tab</translation>
+<translation id="162035744160882748">Aktifkan sinkronisasi, personalisasi, dan layanan Google lainnya</translation>
 <translation id="1644574205037202324">Histori</translation>
 <translation id="1646446875146297738">Dengan mengaktifkan 'Jangan Lacak', permintaan akan disertakan dalam lalu lintas penjelajahan Anda. Pengaruh apa pun bergantung pada apakah situs web menanggapi permintaan atau tidak, dan cara permintaan diinterpretasikan.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Rentang Waktu</translation>
 <translation id="4172051516777682613">Selalu tampilkan</translation>
 <translation id="418156467088430727">Tampilkan Versi Offline di Tab Baru</translation>
+<translation id="4192273449750167573">Lihat setelan Anda di layar berikutnya</translation>
 <translation id="4237682350741091554">Kelola personalisasi dan Sinkronisasi Chrome di <ph name="BEGIN_LINK" />Setelan<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Masukkan Frasa Sandi</translation>
 <translation id="4272631900155121838">Untuk memindai kode QR, aktifkan kamera dari setelan</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Perangkat Anda hampir penuh. Kosongkan ruang penyimpanan dan coba lagi.</translation>
 <translation id="5948291296578561264">Tindakan ini memungkinkan Anda menyimpan foto ke koleksi foto.</translation>
 <translation id="5955891643922670672">Melihat Versi Offline</translation>
+<translation id="5957613098218939406">Opsi Lainnya</translation>
 <translation id="5964480694698977962">Buat tab penyamaran baru</translation>
 <translation id="5965679971710331625">Anda sudah masuk</translation>
 <translation id="5982717868370722439">Menambahkan data yang sudah ada ke <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Penelusuran Suara</translation>
 <translation id="6807889908376551050">Tampilkan Semua...</translation>
 <translation id="681368974849482173">Item dibuat</translation>
+<translation id="685040365210406336">Jangan lakukan perubahan</translation>
 <translation id="6896758677409633944">Salin</translation>
 <translation id="6903907808598579934">Aktifkan sinkronisasi</translation>
 <translation id="6914783257214138813">Sandi akan terlihat oleh orang yang dapat melihat file yang diekspor.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> persen berhasil didownload</translation>
 <translation id="7346909386216857016">Oke, mengerti</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Ya, saya ikut</translation>
 <translation id="7425346204213733349">Perubahan pada bookmark, histori, sandi, dan setelan lainnya tidak akan disinkronkan lagi dengan Akun Google. Namun, data yang sudah ada akan tetap disimpan di Akun Google Anda.</translation>
 <translation id="744343212394640790">Bukan <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Prov./Wilayah</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 95f2df08..40de82f9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Verrà interrotto l'avanzamento del tuo download attuale.</translation>
 <translation id="1605658421715042784">Copia immagine</translation>
 <translation id="1612730193129642006">Mostra griglia schede</translation>
+<translation id="162035744160882748">Attiva la sincronizzazione, la personalizzazione e altri servizi Google</translation>
 <translation id="1644574205037202324">Cronologia</translation>
 <translation id="1646446875146297738">Se attivi "Non tenere traccia", viene inclusa una richiesta con il tuo traffico di navigazione. Gli eventuali effetti dipendono dalla risposta o meno di un sito web alla richiesta e dalla modalità di interpretazione della richiesta.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Intervallo di tempo</translation>
 <translation id="4172051516777682613">Mostra sempre</translation>
 <translation id="418156467088430727">Visualizza versione offline in una nuova scheda</translation>
+<translation id="4192273449750167573">Controlla le impostazioni nella prossima schermata</translation>
 <translation id="4237682350741091554">Gestisci la funzione Sincronizzazione Chrome e la personalizzazione nelle <ph name="BEGIN_LINK" />Impostazioni<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Inserisci passphrase</translation>
 <translation id="4272631900155121838">Per eseguire la scansione di un codice QR, attiva la videocamera dalle impostazioni</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Il dispositivo è quasi pieno. Libera spazio e riprova.</translation>
 <translation id="5948291296578561264">In questo modo puoi salvare le foto nella raccolta di foto.</translation>
 <translation id="5955891643922670672">È visualizzata la versione offline</translation>
+<translation id="5957613098218939406">Altre opzioni</translation>
 <translation id="5964480694698977962">Crea nuova scheda in incognito.</translation>
 <translation id="5965679971710331625">Hai eseguito l'accesso</translation>
 <translation id="5982717868370722439">Aggiungi dati esistenti a <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Ricerca vocale</translation>
 <translation id="6807889908376551050">Mostra tutte...</translation>
 <translation id="681368974849482173">Elemento creato</translation>
+<translation id="685040365210406336">Non apportare modifiche</translation>
 <translation id="6896758677409633944">Copia</translation>
 <translation id="6903907808598579934">Attiva la sincronizzazione</translation>
 <translation id="6914783257214138813">Le tue password saranno visibili a chiunque abbia accesso al file esportato.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" />% scaricato</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Sì, accetto</translation>
 <translation id="7425346204213733349">Le modifiche ai preferiti, alla cronologia, alle password e ad altre impostazioni non verranno più sincronizzate con il tuo account Google. Tuttavia, i dati esistenti rimarranno memorizzati.</translation>
 <translation id="744343212394640790">Non sono <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Stato/contea</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 8a45742..5621ef2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">הפעולה תפסיק את ההורדה הנוכחית.</translation>
 <translation id="1605658421715042784">העתקת התמונה</translation>
 <translation id="1612730193129642006">הצג רשת כרטיסיות</translation>
+<translation id="162035744160882748">‏הפעלת סינכרון, התאמה אישית ושירותים אחרים של Google</translation>
 <translation id="1644574205037202324">היסטוריה</translation>
 <translation id="1646446875146297738">המשמעות של הפעלת 'ללא מעקב' היא שהבקשה תיכלל בתנועת הגלישה שלך. התוצאה בפועל תלויה בתגובה של האתר לבקשה ובפרשנות שהוא מייחס לה, אם בכלל. 
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">טווח זמן</translation>
 <translation id="4172051516777682613">הצג תמיד</translation>
 <translation id="418156467088430727">הצג גרסה לא מקוונת בכרטיסייה חדשה</translation>
+<translation id="4192273449750167573">אפשר לבדוק את ההגדרות במסך הבא</translation>
 <translation id="4237682350741091554">‏נהל את סנכרון Chrome וההתאמה האישית ב<ph name="BEGIN_LINK" />הגדרות<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">הזנת ביטוי סיסמה</translation>
 <translation id="4272631900155121838">‏כדי לסרוק את קוד ה-QR, הפעל את המצלמה דרך ההגדרות</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">המכשיר שלך כמעט מלא. צריך לפנות מקום ולנסות שוב.</translation>
 <translation id="5948291296578561264">מאפשר לך לשמור תמונות בספריית התמונות.</translation>
 <translation id="5955891643922670672">מציג גרסה לא מקוונת</translation>
+<translation id="5957613098218939406">אפשרויות נוספות</translation>
 <translation id="5964480694698977962">יצירת כרטיסייה חדשה של גלישה בסתר.</translation>
 <translation id="5965679971710331625">אתה מחובר</translation>
 <translation id="5982717868370722439">הוסף נתונים קיימים אל <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">חיפוש קולי</translation>
 <translation id="6807889908376551050">הצג הכל...</translation>
 <translation id="681368974849482173">הפריט נוצר</translation>
+<translation id="685040365210406336">לא לבצע שינויים</translation>
 <translation id="6896758677409633944">העתק</translation>
 <translation id="6903907808598579934">הפעל סנכרון</translation>
 <translation id="6914783257214138813">כל מי שיוכל לגשת אל הקובץ המיוצא יוכל לראות את הסיסמאות שלך.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">הושלמה הורדה של <ph name="PERCENT" /> אחוז</translation>
 <translation id="7346909386216857016">בסדר, הבנתי</translation>
 <translation id="7400418766976504921">כתובת אתר</translation>
+<translation id="741204030948306876">כן, אני רוצה</translation>
 <translation id="7425346204213733349">‏שינויים בסימניות, בהיסטוריה, בסיסמאות ובהגדרות נוספות לא יסונכרנו עוד עם חשבון Google שלך. עם זאת, הנתונים הקיימים עדיין יאוחסנו בחשבון Google שלך.</translation>
 <translation id="744343212394640790">אני לא <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">מדינה / ארץ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index f653f523..902ac50 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">この操作を行うと、現在進行中のダウンロードは停止します。</translation>
 <translation id="1605658421715042784">画像をコピー</translation>
 <translation id="1612730193129642006">タブをグリッド表示</translation>
+<translation id="162035744160882748">同期、カスタマイズ、その他の Google サービスを有効にする</translation>
 <translation id="1644574205037202324">履歴</translation>
 <translation id="1646446875146297738">「トラッキング拒否」を有効にすると、リクエストが閲覧トラフィックに組み込まれます。その効果は、ウェブサイトがそのリクエストに応じるかどうか、およびそのリクエストがどのように解釈されるかによって異なります。
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">期間</translation>
 <translation id="4172051516777682613">常に表示</translation>
 <translation id="418156467088430727">オフライン版を新しいタブで表示</translation>
+<translation id="4192273449750167573">次の画面で設定を確認する</translation>
 <translation id="4237682350741091554">[<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />] で Chrome 同期とパーソナライズを管理できます</translation>
 <translation id="424315890655130736">パスフレーズの入力</translation>
 <translation id="4272631900155121838">QR コードをスキャンするには、設定でカメラを有効にしてください</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">端末の空き容量が少なくなっています。空き容量を増やしてからもう一度お試しください。</translation>
 <translation id="5948291296578561264">フォト ライブラリに写真を保存します。</translation>
 <translation id="5955891643922670672">オフライン版を表示しています</translation>
+<translation id="5957613098218939406">その他のオプション</translation>
 <translation id="5964480694698977962">新しいシークレット タブを作成。</translation>
 <translation id="5965679971710331625">ログイン中のアカウント</translation>
 <translation id="5982717868370722439">既存のデータを <ph name="USER_EMAIL" /> に追加します。</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">音声検索</translation>
 <translation id="6807889908376551050">すべて表示...</translation>
 <translation id="681368974849482173">作成済みのアイテム</translation>
+<translation id="685040365210406336">変更を行わない</translation>
 <translation id="6896758677409633944">コピー</translation>
 <translation id="6903907808598579934">同期を有効にする</translation>
 <translation id="6914783257214138813">エクスポートしたファイルを閲覧できるユーザーにパスワードを知られてしまう可能性があります。</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" />%ダウンロード</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">有効にする</translation>
 <translation id="7425346204213733349">今後、ブックマーク、履歴、パスワード、その他の設定に行った変更は Google アカウントに同期されません。ただし、既存のデータは Google アカウントに保存されたままとなります。</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> ではありません</translation>
 <translation id="7454057999980797137">州/都道府県</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 6d226193..8b3443a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">ಇದು ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಡೌನ್‌ಲೋಡ್‌ಗಾಗಿ ಎಲ್ಲಾ ಪ್ರಕ್ರಿಯೆಗಳನ್ನು ನಿಲ್ಲಿಸುತ್ತದೆ.</translation>
 <translation id="1605658421715042784">ಚಿತ್ರವನ್ನು ನಕಲಿಸಿ</translation>
 <translation id="1612730193129642006">ಟ್ಯಾಬ್‌ ಗ್ರಿಡ್‌ ತೋರಿಸಿ</translation>
+<translation id="162035744160882748">ಸಿಂಕ್, ವೈಯಕ್ತೀಕರಣ ಮತ್ತು ಇತರ Google ಸೇವೆಗಳನ್ನು ಆನ್ ಮಾಡಿ</translation>
 <translation id="1644574205037202324">ಇತಿಹಾಸ</translation>
 <translation id="1646446875146297738">‘ಟ್ರ್ಯಾಕ್ ಮಾಡಬೇಡಿ’ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುವುದೆಂದರೆ ವಿನಂತಿಯನ್ನು ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್ ದಟ್ಟಣೆಯೊಂದಿಗೆ ಸೇರಿಸುವುದು ಎಂದರ್ಥ. ಯಾವುದೇ ಪರಿಣಾಮವು ವೆಬ್‌ಸೈಟ್ ವಿನಂತಿಗೆ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತದೆಯೆ ಮತ್ತು ವಿನಂತಿಯನ್ನು ಹೇಗೆ ಅರ್ಥೈಸಲಾಗುತ್ತದೆ ಎಂಬುದರ ಮೇಲೆ ಅವಲಂಬಿತವಾಗಿರುತ್ತದೆ.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">ಸಮಯ ವ್ಯಾಪ್ತಿ</translation>
 <translation id="4172051516777682613">ಯಾವಾಗಲೂ ತೋರಿಸು</translation>
 <translation id="418156467088430727">ಆಫ್‌ಲೈನ್ ಆವೃತ್ತಿಯನ್ನು ಹೊಸ ಟ್ಯಾಬ್‌ನಲ್ಲಿ ವೀಕ್ಷಿಸಿ</translation>
+<translation id="4192273449750167573">ಮುಂದಿನ ಪರದೆಯಲ್ಲಿ ನಿಮ್ಮ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿನ<ph name="END_LINK" /> Chrome ಸಿಂಕ್‌ ಮತ್ತು ವೈಯಕ್ತೀಕರಣವನ್ನು ನಿರ್ವಹಿಸಿ.</translation>
 <translation id="424315890655130736">ಪಾಸ್‌ಫ್ರೇಸ್ ನಮೂದಿಸಿ</translation>
 <translation id="4272631900155121838">QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಲು, ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ಕ್ಯಾಮರಾವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">ನಿಮ್ಮ ಸಾಧನ ಬಹುತೇಕ ಭರ್ತಿಯಾಗಿದೆ. ಸ್ಥಳಾವಕಾಶ ಮುಕ್ತಗೊಳಿಸಿ, ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="5948291296578561264">ನಿಮ್ಮ ಫೋಟೋ ಲೈಬ್ರರಿಗೆ ಫೋಟೋಗಳನ್ನು ಉಳಿಸಲು ಇದು ನಿಮ್ಮನ್ನು ಅನುಮತಿಸುತ್ತದೆ.</translation>
 <translation id="5955891643922670672">ಆಫ್‌ಲೈನ್ ಆವೃತ್ತಿ ಅನ್ನು ವೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ</translation>
+<translation id="5957613098218939406">ಇನ್ನಷ್ಟು ಆಯ್ಕೆಗಳು</translation>
 <translation id="5964480694698977962">ಹೊಸ ಅದೃಶ್ಯ ಟ್ಯಾಬ್ ರಚಿಸಿ.</translation>
 <translation id="5965679971710331625">ನೀವು ಸೈನ್ ಇನ್ ಆಗಿರುವಿರಿ</translation>
 <translation id="5982717868370722439">ಪ್ರಸ್ತುತ ಡೇಟಾವನ್ನು <ph name="USER_EMAIL" /> ಗೆ ಸೇರಿಸಿ.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">ಧ್ವನಿ ಹುಡುಕಾಟ</translation>
 <translation id="6807889908376551050">ಎಲ್ಲಾ ತೋರಿಸಿ...</translation>
 <translation id="681368974849482173">ಐಟಂ ರಚಿಸಲಾಗಿದೆ</translation>
+<translation id="685040365210406336">ಯಾವುದೇ ಬದಲಾವಣೆಗಳನ್ನು ಮಾಡಬೇಡಿ</translation>
 <translation id="6896758677409633944">ನಕಲಿಸು</translation>
 <translation id="6903907808598579934">ಸಿಂಕ್‌ ಆನ್‌ ಮಾಡಿ</translation>
 <translation id="6914783257214138813">ರಫ್ತು ಮಾಡಲಾದ ಫೈಲ್ ಅನ್ನು ನೋಡುವ ಯಾರಿಗಾದರೂ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಗೋಚರಿಸುತ್ತವೆ.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> ಪ್ರತಿಶತ ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲಾಗಿದೆ</translation>
 <translation id="7346909386216857016">ಸರಿ, ಅರ್ಥವಾಯಿತು</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">ಹೌದು, ನಾನಿದ್ದೇನೆ</translation>
 <translation id="7425346204213733349">ನಿಮ್ಮ ಬುಕ್‌ಮಾರ್ಕ್‌ಗಳು, ಇತಿಹಾಸ, ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಮತ್ತು ಇತರ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಮಾಡಲಾಗುವ ಬದಲಾವಣೆಗಳನ್ನು ಇನ್ನು ಮುಂದೆ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಿಂಕ್‌ ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಆದಾಗ್ಯೂ, ನಿಮ್ಮ ಪ್ರಸ್ತುತ ಡೇಟಾ ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿಯೇ ಇರುತ್ತದೆ.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> ಅಲ್ಲ</translation>
 <translation id="7454057999980797137">ರಾಜ್ಯ / ಕೌಂಟಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 68f7384..7ce5c33f8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">현재 진행 중인 다운로드가 모두 중지됩니다.</translation>
 <translation id="1605658421715042784">이미지 복사</translation>
 <translation id="1612730193129642006">탭을 격자로 보기</translation>
+<translation id="162035744160882748">동기화, 맞춤설정 및 기타 Google 서비스 사용 설정</translation>
 <translation id="1644574205037202324">방문 기록</translation>
 <translation id="1646446875146297738">'추적 안함'을 사용 설정하면 요청이 탐색 트래픽에 포함됩니다. 웹사이트가 요청에 응답하는지 여부와 요청이 어떻게 해석되는가에 따라 결과가 달라집니다.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">기간</translation>
 <translation id="4172051516777682613">항상 표시</translation>
 <translation id="418156467088430727">새 탭에서 오프라인 버전 보기</translation>
+<translation id="4192273449750167573">다음 화면에서 설정 검토</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />설정<ph name="END_LINK" />에서 Chrome 동기화 및 맞춤설정을 관리하세요.</translation>
 <translation id="424315890655130736">암호 입력</translation>
 <translation id="4272631900155121838">QR 코드를 스캔하려면 설정에서 카메라를 사용하도록 설정하세요.</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">기기의 저장용량이 거의 가득 찼습니다. 여유 공간을 확보한 후 다시 시도해 보세요.</translation>
 <translation id="5948291296578561264">이렇게 하면 사진 라이브러리에 사진을 저장할 수 있습니다.</translation>
 <translation id="5955891643922670672">오프라인 버전 보는 중</translation>
+<translation id="5957613098218939406">옵션 더보기</translation>
 <translation id="5964480694698977962">새 시크릿 탭 만들기</translation>
 <translation id="5965679971710331625">로그인됨</translation>
 <translation id="5982717868370722439"><ph name="USER_EMAIL" />에 기존 데이터 추가</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">음성검색</translation>
 <translation id="6807889908376551050">모두 표시...</translation>
 <translation id="681368974849482173">북마크가 생성되었습니다.</translation>
+<translation id="685040365210406336">변경하지 않음</translation>
 <translation id="6896758677409633944">복사</translation>
 <translation id="6903907808598579934">동기화 사용 설정</translation>
 <translation id="6914783257214138813">내보낸 파일을 볼 수 있는 모든 사용자에게 비밀번호가 표시됩니다.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" />% 다운로드됨</translation>
 <translation id="7346909386216857016">확인</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">사용</translation>
 <translation id="7425346204213733349">북마크, 방문 기록, 비밀번호, 기타 설정이 더 이상 Google 계정에 동기화되지 않습니다. 하지만 기존 데이터는 Google 계정에 계속 저장됩니다.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> 아님</translation>
 <translation id="7454057999980797137">도/군</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index def58c3..655d13a2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Bus sustabdytas dabartinis atsisiuntimas.</translation>
 <translation id="1605658421715042784">Kopijuoti vaizdą</translation>
 <translation id="1612730193129642006">Rodyti skirtuko tinklelį</translation>
+<translation id="162035744160882748">Įjunkite sinchronizavimą, suasmeninimą ir kitas „Google“ paslaugas</translation>
 <translation id="1644574205037202324">Istorija</translation>
 <translation id="1646446875146297738">Įgalinus „Nestebėti“, į naršymo srautą bus įtraukta užklausa. Bet koks poveikis priklauso nuo to, ar svetainė atsako į užklausą ir kaip ji interpretuojama.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Laikotarpis</translation>
 <translation id="4172051516777682613">Visada rodyti</translation>
 <translation id="418156467088430727">Žiūrėti neprisij. naudoj. versiją naujame skirtuke</translation>
+<translation id="4192273449750167573">Peržiūrėkite nustatymus kitame ekrane</translation>
 <translation id="4237682350741091554">Tvarkykite „Chrome“ sinchronizavimo ir suasmeninimo funkcijas skiltyje <ph name="BEGIN_LINK" />„Nustatymai“<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Slaptafrazės įvedimas</translation>
 <translation id="4272631900155121838">Jei norite nuskaityti QR kodą, nustatymuose įgalinkite fotoaparatą</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Jūsų įrenginys beveik pilnas. Atlaisvinkite vietos ir bandykite dar kartą.</translation>
 <translation id="5948291296578561264">Taip galėsite išsaugoti nuotraukas nuotraukų bibliotekoje.</translation>
 <translation id="5955891643922670672">Peržiūros neprisijungus versija</translation>
+<translation id="5957613098218939406">Daugiau parinkčių</translation>
 <translation id="5964480694698977962">Kurti naują inkognito skirtuką.</translation>
 <translation id="5965679971710331625">Esate prisijungę</translation>
 <translation id="5982717868370722439">Pridėti esamus duomenis prie <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Paieška balsu</translation>
 <translation id="6807889908376551050">Rodyti viską...</translation>
 <translation id="681368974849482173">Elementas sukurtas</translation>
+<translation id="685040365210406336">Neatlikti jokių pakeitimų</translation>
 <translation id="6896758677409633944">Kopijuoti</translation>
 <translation id="6903907808598579934">Įjungti sinchronizavimą</translation>
 <translation id="6914783257214138813">Jūsų slaptažodžiai bus matomi visiems, kurie gali peržiūrėti eksportuotą failą.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Atsisiųsta <ph name="PERCENT" /> proc.</translation>
 <translation id="7346909386216857016">Gerai, supratau</translation>
 <translation id="7400418766976504921">URL adresas</translation>
+<translation id="741204030948306876">Taip, sutinku</translation>
 <translation id="7425346204213733349">Žymių, istorijos, slaptažodžių ir kitų nustatymų pakeitimai nebebus sinchronizuojami su „Google“ paskyra. Tačiau esami duomenys ir toliau bus saugomi „Google“ paskyroje.</translation>
 <translation id="744343212394640790">Ne <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Valst. / apyg.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index cfb0c8d4..8e8f93c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Šādi tiks pārtraukta pašreizējās lejupielādes norise.</translation>
 <translation id="1605658421715042784">Kopēt attēlu</translation>
 <translation id="1612730193129642006">Rādīt ciļņu režģi</translation>
+<translation id="162035744160882748">Sinhronizācijas, personalizācijas un citu Google pakalpojumu ieslēgšana</translation>
 <translation id="1644574205037202324">Vēsture</translation>
 <translation id="1646446875146297738">Iespējojot opciju “Nesekot”, jūsu pārlūkošanas datplūsmā tiks iekļauts pieprasījums. Jebkāda veida ietekme ir atkarīga no tā, vai vietne atbild uz pieprasījumu un kā pieprasījums tiek interpretēts.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Laika periods</translation>
 <translation id="4172051516777682613">Vienmēr rādīt</translation>
 <translation id="418156467088430727">Skatīt bezsaistes versiju jaunā cilnē</translation>
+<translation id="4192273449750167573">Pārskatiet savus iestatījumus nākamajā ekrānā</translation>
 <translation id="4237682350741091554">Pārvaldiet Chrome sinhronizāciju un personalizēšanu <ph name="BEGIN_LINK" />iestatījumos<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Ieejas frāzes ievade</translation>
 <translation id="4272631900155121838">Lai skenētu QR kodu, iestatījumos iespējojiet kameru.</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Ierīcē nepietiek vietas. Atbrīvojiet vietu un mēģiniet vēlreiz.</translation>
 <translation id="5948291296578561264">Šādi varat saglabāt fotoattēlus savā fotoattēlu bibliotēkā.</translation>
 <translation id="5955891643922670672">Tiek skatīta bezsaistes versija</translation>
+<translation id="5957613098218939406">Citas opcijas</translation>
 <translation id="5964480694698977962">Izveidot jaunu inkognito cilni.</translation>
 <translation id="5965679971710331625">Jūs esat pierakstījies</translation>
 <translation id="5982717868370722439">Pievienot esošos datus kontam <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Meklēšana ar balsi</translation>
 <translation id="6807889908376551050">Rādīt visus...</translation>
 <translation id="681368974849482173">Vienums izveidots</translation>
+<translation id="685040365210406336">Neveikt izmaiņas</translation>
 <translation id="6896758677409633944">Kopēt</translation>
 <translation id="6903907808598579934">Ieslēgt sinhronizāciju</translation>
 <translation id="6914783257214138813">Jūsu paroles būs redzamas ikvienam, kas var skatīt eksportēto failu.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Lejupielādēti <ph name="PERCENT" /> %</translation>
 <translation id="7346909386216857016">Labi, sapratu</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Jā, piekrītu</translation>
 <translation id="7425346204213733349">Grāmatzīmju, vēstures, paroļu un citu iestatījumu izmaiņas vairs netiks sinhronizētas ar jūsu Google kontu. Tomēr esošie dati joprojām tiks glabāti jūsu Google kontā.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> nav mana e-pasta adrese</translation>
 <translation id="7454057999980797137">Štats/valsts</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index cb70cef9..0cd82361 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">ഇത്, നിലവിലെ ഡൗൺലോഡിന്റെ എല്ലാ പുരോഗതിയും നിർത്തും.</translation>
 <translation id="1605658421715042784">ചിത്രം പകർത്തുക</translation>
 <translation id="1612730193129642006">ടാബ് ഗ്രിഡ് കാണിക്കുക</translation>
+<translation id="162035744160882748">സമന്വയം, വ്യക്തിപരമാക്കൽ എന്നിവയും, മറ്റ് Google സേവനങ്ങളും ഓണാക്കുക</translation>
 <translation id="1644574205037202324">ചരിത്രം</translation>
 <translation id="1646446875146297738">നിങ്ങളുടെ ബ്രൗസിംഗ് ട്രാഫിക്കിൽ ഒരു അഭ്യർത്ഥന ഉൾപ്പെടുത്തുമെന്നാണ് "ട്രാക്ക് ചെയ്യരുത്" പ്രവർത്തനക്ഷമമാക്കുന്നതിലൂടെ അർത്ഥമാക്കുന്നത്. ഒരു വെബ്‌സൈറ്റ്, അഭ്യർത്ഥനയിന്മേൽ പ്രതികരിക്കുന്നോ എന്നതിനേയും അഭ്യർത്ഥന വ്യാഖ്യാനിക്കുന്നതെങ്ങനെ എന്നതിനേയും ആശ്രയിച്ചുള്ളതായിരിക്കും ഏതൊരു ഇഫക്റ്റും.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">സമയ ശ്രേണി</translation>
 <translation id="4172051516777682613">എല്ലായ്പ്പോഴും ദൃശ്യമാക്കുക</translation>
 <translation id="418156467088430727">പുതിയ ടാബിൽ ഓഫ്‌ലൈൻ പതിപ്പ് കാണുക</translation>
+<translation id="4192273449750167573">അടുത്ത സ്ക്രീനിൽ നിങ്ങളുടെ ക്രമീകരണം അവലോകനം ചെയ്യുക</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />ക്രമീകരണത്തിൽ<ph name="END_LINK" /> Chrome സമന്വയിപ്പിക്കലും വ്യക്‌തിപരമാക്കലും മാനേജുചെയ്യുക</translation>
 <translation id="424315890655130736">പാസ്‌ഫ്രെയ്‌സ് നൽകുക</translation>
 <translation id="4272631900155121838">QR കോഡ് സ്‌കാൻ ചെയ്യാൻ, ക്രമീകരണത്തിൽ നിന്ന് ക്യാമറ പ്രവർത്തനക്ഷമമാക്കുക</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">ഉപകരണത്തിന്റെ സ്‌റ്റോറേജ് ഏകദേശം നിറഞ്ഞു. കുറച്ച് ഇടം ശൂന്യമാക്കിയ ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5948291296578561264">നിങ്ങളുടെ ഫോട്ടോ ലൈബ്രറിയിലേക്ക് ഫോട്ടോകൾ സംരക്ഷിക്കാൻ അനുവദിക്കുന്നു.</translation>
 <translation id="5955891643922670672">ഓഫ്‌ലൈൻ പതിപ്പ് കാണുന്നു</translation>
+<translation id="5957613098218939406">കൂടുതൽ ഓപ്‌ഷനുകൾ</translation>
 <translation id="5964480694698977962">പുതിയ ആൾമാറാട്ട ടാബ് സൃഷ്‌ടിക്കുക.</translation>
 <translation id="5965679971710331625">നിങ്ങൾ സൈൻ ഇൻ ചെയ്‌തു</translation>
 <translation id="5982717868370722439">നിലവിലുള്ള വിവരങ്ങളെ <ph name="USER_EMAIL" /> എന്നതിലേക്ക് അയയ്‌ക്കുക.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">ശബ്ദ തിരയൽ</translation>
 <translation id="6807889908376551050">എല്ലാം കാണിക്കുക...</translation>
 <translation id="681368974849482173">ഇനം സൃഷ്‌ടിച്ചു</translation>
+<translation id="685040365210406336">മാറ്റങ്ങളൊന്നും വരുത്തണ്ട</translation>
 <translation id="6896758677409633944">പകര്‍ത്തുക</translation>
 <translation id="6903907808598579934">സമന്വയിപ്പിക്കൽ ഓണാക്കുക</translation>
 <translation id="6914783257214138813">എക്‌സ്പോർട്ട് ചെയ്ത ഫയൽ കാണാനാകുന്ന ഏതൊരാൾക്കും നിങ്ങളുടെ പാസ്‌വേഡും കാണാനാകും.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> ശതമാനം ഡൗൺലോഡുചെയ്‌തു</translation>
 <translation id="7346909386216857016">മനസ്സിലായി!</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">ഞാൻ തയ്യാറാണ്</translation>
 <translation id="7425346204213733349">ബുക്ക്‌മാർക്കുകൾ, ചരിത്രം, പാസ്‌വേഡുകൾ, മറ്റ് ക്രമീകരണം എന്നിവയിലുള്ള മാറ്റങ്ങളെ ഇനി നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കില്ല. എന്നിരുന്നാലും, നിങ്ങളുടെ നിലവിലെ വിവരം Google അക്കൗണ്ടിൽ തുടർന്നും സൂക്ഷിക്കും.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> അല്ല</translation>
 <translation id="7454057999980797137">സംസ്ഥാനം / രാജ്യം</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 46d8afc..c8027fb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">यामुळे तुमच्या सुरू असलेल्या डाउनलोडची पुढची सर्व प्रगती थांबेल.</translation>
 <translation id="1605658421715042784">इमेज कॉपी करा</translation>
 <translation id="1612730193129642006">टॅब ग्रिड दाखवा</translation>
+<translation id="162035744160882748">सिंक, पर्सनलायझेशन आणि इतर Google सेवा सुरू करा</translation>
 <translation id="1644574205037202324">इतिहास</translation>
 <translation id="1646446875146297738">'Do Not Track' सक्षम करणे अर्थात आपल्या ब्राउझिंग रहदारीसह एक विनंती समाविष्ट‍ केली जाईल. कोणताही प्रभाव यावर अवलंबून असतो कि वेबसाइट विनंतीस प्रतिसाद देते किंवा नाही आणि विनंतीचा निष्कर्ष कसा काढला जातो.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">वेळ वर्गवारी</translation>
 <translation id="4172051516777682613">नेहमी दर्शवा</translation>
 <translation id="418156467088430727">नवीन टॅबमध्‍ये ऑफलाइन आवृत्ती पहा</translation>
+<translation id="4192273449750167573">पुढील स्क्रीनवरील तुमच्या सेटिंग्जचे पुनरावलोकन करा</translation>
 <translation id="4237682350741091554">Chrome सिंक आणि पर्सनलायझेशन <ph name="BEGIN_LINK" />सेटिंग्ज<ph name="END_LINK" /> मधून व्यवस्थापित करा.</translation>
 <translation id="424315890655130736">सांकेतिक वाक्यांश एंटर करा</translation>
 <translation id="4272631900155121838">QR कोड स्कॅन करण्‍यासाठी, सेटिंग्ज मधून कॅमेरा सक्षम करा</translation>
@@ -286,6 +288,7 @@
 <translation id="5938160824633642847">तुमचे डिव्हाइस जवळजवळ भरले आहे. जागा मोकळी करा आणि पुन्हा प्रयत्न करा.</translation>
 <translation id="5948291296578561264">हे तुम्हाला तुमच्या फोटो लायब्ररीवर फोटो सेव्ह करू देते.</translation>
 <translation id="5955891643922670672">ऑफलाइन आवृत्ती पाहत आहे</translation>
+<translation id="5957613098218939406">अधिक पर्याय</translation>
 <translation id="5964480694698977962">नवीन गुप्त टॅब तयार करा.</translation>
 <translation id="5965679971710331625">आपण साइन इन केले आहे</translation>
 <translation id="5982717868370722439">विद्यमान डेटा <ph name="USER_EMAIL" /> मध्ये जोडा.</translation>
@@ -345,6 +348,7 @@
 <translation id="6797885426782475225">व्हॉइस शोध</translation>
 <translation id="6807889908376551050">सर्व दर्शवा...</translation>
 <translation id="681368974849482173">तयार केलेला आयटम</translation>
+<translation id="685040365210406336">कोणतेही बदल करू नका</translation>
 <translation id="6896758677409633944">कॉपी करा</translation>
 <translation id="6903907808598579934">संकालन चालू करा</translation>
 <translation id="6914783257214138813">निर्यात करण्यात आलेली फाइल दिसणार्‍या प्रत्येकाला, तुमचा पासवर्ड दिसेल.</translation>
@@ -374,6 +378,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> टक्के डाउनलोड केले</translation>
 <translation id="7346909386216857016">ठीक आहे, समजले</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">होय, मला मान्य आहे</translation>
 <translation id="7425346204213733349">आपले बुकमार्क, इतिहास, पासवर्ड आणि अन्य सेटिंग्ज मधील बदल यापुढे आपल्या Google खात्यावर संकालित केले जाणार नाहीत. तथापि, आपला विद्यमान डेटा आपल्या Google खात्यामध्ये संचयित केलेला असेल.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> नाही</translation>
 <translation id="7454057999980797137">राज्य / विभाग</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index c157836..367cb44 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Ini akan menghentikan semua kemajuan bagi muat turun semasa anda.</translation>
 <translation id="1605658421715042784">Salin Imej</translation>
 <translation id="1612730193129642006">Tunjukkan Grid Tab</translation>
+<translation id="162035744160882748">Hidupkan penyegerakan, pemperibadian dan perkhidmatan Google yang lain</translation>
 <translation id="1644574205037202324">Sejarah</translation>
 <translation id="1646446875146297738">Mendayakan ‘Jangan Kesan’ bermakna permintaan akan dimasukkan dengan trafik penyemakan imbas anda. Sebarang kesan bergantung pada sama ada tapak web menyambut permintaan tersebut dan cara permintaan tersebut ditafsirkan.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Julat Masa</translation>
 <translation id="4172051516777682613">Sentiasa paparkan</translation>
 <translation id="418156467088430727">Lihat Versi Luar Talian di Tab Baharu</translation>
+<translation id="4192273449750167573">Semak tetapan anda pada skrin seterusnya</translation>
 <translation id="4237682350741091554">Urus Penyegerakan Chrome dan pemperibadian dalam <ph name="BEGIN_LINK" />Tetapan<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Masukkan Ungkapan Laluan</translation>
 <translation id="4272631900155121838">Untuk mengimbas kod QR, dayakan kamera daripada tetapan</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Peranti anda hampir penuh. Kosongkan ruang dan cuba lagi.</translation>
 <translation id="5948291296578561264">Tindakan ini membolehkan anda menyimpan foto pada pustaka foto anda.</translation>
 <translation id="5955891643922670672">Melihat Versi Luar Talian</translation>
+<translation id="5957613098218939406">Lebih Banyak Pilihan</translation>
 <translation id="5964480694698977962">Buat tab inkognito baharu.</translation>
 <translation id="5965679971710331625">Anda sudah log masuk</translation>
 <translation id="5982717868370722439">Tambahkan data sedia ada pada <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Carian Suara</translation>
 <translation id="6807889908376551050">Paparkan Semua...</translation>
 <translation id="681368974849482173">Item dibuat</translation>
+<translation id="685040365210406336">Jangan buat perubahan</translation>
 <translation id="6896758677409633944">Salin</translation>
 <translation id="6903907808598579934">Hidupkan penyegerakan</translation>
 <translation id="6914783257214138813">Kata laluan anda akan kelihatan kepada sesiapa yang dapat melihat fail yang dieksport.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> peratus dimuat turun</translation>
 <translation id="7346909386216857016">Ok, faham</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Ya, saya setuju</translation>
 <translation id="7425346204213733349">Perubahan kepada penanda halaman, sejarah, kata laluan dan tetapan anda yang lain tidak akan disegerakkan ke Akaun Google anda lagi. Walau bagaimanapun, data sedia ada akan kekal disimpan dalam Akaun Google anda.</translation>
 <translation id="744343212394640790">Bukan <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Negeri / Daerah</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 56ae3a5..f3dabc9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Hiermee wordt de voortgang van de huidige download gestopt.</translation>
 <translation id="1605658421715042784">Afbeelding kopiëren</translation>
 <translation id="1612730193129642006">Tabbladraster weergeven</translation>
+<translation id="162035744160882748">Synchronisatie, personalisatie en andere Google-services inschakelen</translation>
 <translation id="1644574205037202324">Geschiedenis</translation>
 <translation id="1646446875146297738">Als je 'Niet bijhouden' inschakelt, wordt hiervoor een verzoek opgenomen in je browseverkeer. Het resultaat daarvan hangt af van of een website reageert op het verzoek en hoe het verzoek wordt geïnterpreteerd.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Tijdsbereik</translation>
 <translation id="4172051516777682613">Altijd weergeven</translation>
 <translation id="418156467088430727">Offline versie bekijken op nieuw tabblad</translation>
+<translation id="4192273449750167573">Je instellingen op het volgende scherm controleren</translation>
 <translation id="4237682350741091554">Chrome-synchronisatie en -personalisatie beheren in <ph name="BEGIN_LINK" />Instellingen<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Wachtwoordzin opgeven</translation>
 <translation id="4272631900155121838">Als je een QR-code wilt scannen, schakel je de camera in via Instellingen</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Je apparaat is bijna vol. Maak ruimte vrij en probeer het opnieuw.</translation>
 <translation id="5948291296578561264">Hiermee kun je foto's opslaan in je fotobibliotheek.</translation>
 <translation id="5955891643922670672">Offline versie bekijken</translation>
+<translation id="5957613098218939406">Meer opties</translation>
 <translation id="5964480694698977962">Nieuw incognitotabblad maken.</translation>
 <translation id="5965679971710331625">Je bent ingelogd</translation>
 <translation id="5982717868370722439">Bestaande gegevens toevoegen aan <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Gesproken zoekopdracht</translation>
 <translation id="6807889908376551050">Alles weergeven...</translation>
 <translation id="681368974849482173">Item gemaakt</translation>
+<translation id="685040365210406336">Geen wijzigingen aanbrengen</translation>
 <translation id="6896758677409633944">Kopieer</translation>
 <translation id="6903907808598579934">Synchronisatie inschakelen</translation>
 <translation id="6914783257214138813">Je wachtwoorden zijn zichtbaar voor iedereen die het geëxporteerde bestand kan bekijken.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> procent gedownload</translation>
 <translation id="7346909386216857016">OK, begrepen</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Ja, inschakelen</translation>
 <translation id="7425346204213733349">Wijzigingen in je bladwijzers, geschiedenis, wachtwoorden en andere instellingen worden niet meer gesynchroniseerd met je Google-account. Je bestaande gegevens blijven echter opgeslagen in je Google-account.</translation>
 <translation id="744343212394640790">Niet <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Provincie</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index b5b0a1f7..d957d2b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Dette stopper all fremdriften for den aktive nedlastingen.</translation>
 <translation id="1605658421715042784">Kopiér bildet</translation>
 <translation id="1612730193129642006">Vis fanerutenett</translation>
+<translation id="162035744160882748">Slå på synkronisering, personlig tilpasning og andre Google-tjenester</translation>
 <translation id="1644574205037202324">Logg</translation>
 <translation id="1646446875146297738">Hvis du aktiverer «Ikke spor», blir en forespørsel sendt med nettlesertrafikken din. Eventuelle virkninger avhenger av om nettstedet svarer på forespørselen, og hvordan forespørselen tolkes.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Tidsperiode</translation>
 <translation id="4172051516777682613">Vis alltid</translation>
 <translation id="418156467088430727">Se versjonen uten nett i en ny fane</translation>
+<translation id="4192273449750167573">Gjennomgå innstillingene dine på den neste skjermen</translation>
 <translation id="4237682350741091554">Administrer Chrome-synkronsering og personlig tilpasning i <ph name="BEGIN_LINK" />Innstillinger<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Skriv inn passordfrasen</translation>
 <translation id="4272631900155121838">For å skanne QR-koder, slå på kameraet i innstillingene</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Enheten er nesten full. Frigjør plass og prøv på nytt.</translation>
 <translation id="5948291296578561264">Da kan du lagre bilder i bildebiblioteket ditt.</translation>
 <translation id="5955891643922670672">Du ser en versjon uten nett</translation>
+<translation id="5957613098218939406">Flere alternativer</translation>
 <translation id="5964480694698977962">Åpne en ny inkognitofane.</translation>
 <translation id="5965679971710331625">Du er pålogget</translation>
 <translation id="5982717868370722439">Legg til eksisterende data i <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Talesøk</translation>
 <translation id="6807889908376551050">Vis alle</translation>
 <translation id="681368974849482173">Elementet er opprettet</translation>
+<translation id="685040365210406336">Ikke gjør noen endringer</translation>
 <translation id="6896758677409633944">Kopiér</translation>
 <translation id="6903907808598579934">Slå på synkronisering</translation>
 <translation id="6914783257214138813">Passordene dine blir synlige for alle som kan se den eksporterte filen.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> prosent fullført</translation>
 <translation id="7346909386216857016">Greit</translation>
 <translation id="7400418766976504921">Nettadresse</translation>
+<translation id="741204030948306876">Ja, jeg er med</translation>
 <translation id="7425346204213733349">Endringer i bokmerkene, loggoppføringene, passordene og de andre innstillingene dine blir ikke synkronisert med Google-kontoen din lenger. Data som allerede er lagret i Google-kontoen din, blir imidlertid ikke fjernet.</translation>
 <translation id="744343212394640790">Ikke <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Fylke/kommune</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index ac44300..cfea143 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Spowoduje to zatrzymanie bieżącego pobierania.</translation>
 <translation id="1605658421715042784">Kopiuj obraz</translation>
 <translation id="1612730193129642006">Pokaż układ kart</translation>
+<translation id="162035744160882748">Włącz synchronizację, personalizację i inne usługi Google</translation>
 <translation id="1644574205037202324">Historia</translation>
 <translation id="1646446875146297738">Włączenie opcji „Bez śledzenia” oznacza, że podczas przeglądania będzie wysyłane żądanie. Jego wynik zależy od tego, czy strona na nie odpowie oraz jak zostanie ono zinterpretowane.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Zakres czasowy</translation>
 <translation id="4172051516777682613">Zawsze pokazuj</translation>
 <translation id="418156467088430727">Wyświetl wersję offline w nowej karcie</translation>
+<translation id="4192273449750167573">Przejrzyj ustawienia na następnym ekranie</translation>
 <translation id="4237682350741091554">Zarządzaj synchronizacją Chrome i personalizacją w <ph name="BEGIN_LINK" />Ustawieniach<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Wpisz hasło</translation>
 <translation id="4272631900155121838">Aby zeskanować kod QR, włącz aparat w ustawieniach</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Na urządzeniu brakuje wolnego miejsca. Zwolnij miejsce i spróbuj ponownie.</translation>
 <translation id="5948291296578561264">Umożliwia zapisywanie zdjęć w ich bibliotece.</translation>
 <translation id="5955891643922670672">Wyświetlam wersję offline</translation>
+<translation id="5957613098218939406">Więcej opcji</translation>
 <translation id="5964480694698977962">Utwórz nową kartę incognito.</translation>
 <translation id="5965679971710331625">Jesteś zalogowany</translation>
 <translation id="5982717868370722439">Dodaj istniejące dane do konta <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Wyszukiwanie głosowe</translation>
 <translation id="6807889908376551050">Pokaż wszystkie...</translation>
 <translation id="681368974849482173">Utworzono element</translation>
+<translation id="685040365210406336">Nie wprowadzaj żadnych zmian</translation>
 <translation id="6896758677409633944">Kopiuj</translation>
 <translation id="6903907808598579934">Włącz synchronizację</translation>
 <translation id="6914783257214138813">Twoje hasła będą widoczne dla każdego, kto może zobaczyć wyeksportowany plik.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Pobrano <ph name="PERCENT" /> procent</translation>
 <translation id="7346909386216857016">Rozumiem</translation>
 <translation id="7400418766976504921">Adres URL</translation>
+<translation id="741204030948306876">Tak</translation>
 <translation id="7425346204213733349">Zmiany w zakładkach, historii, hasłach i innych ustawieniach nie będą już synchronizowane z kontem Google. Twoje istniejące dane będą jednak nadal na nim przechowywane.</translation>
 <translation id="744343212394640790">Konto <ph name="EMAIL" /> nie jest moje</translation>
 <translation id="7454057999980797137">Stan/region</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 3e73512..1a296067 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Isso interromperá todo o progresso do download atual.</translation>
 <translation id="1605658421715042784">Copiar imagem</translation>
 <translation id="1612730193129642006">Mostrar grade das guias</translation>
+<translation id="162035744160882748">Ativar sincronização, personalização e outros serviços do Google</translation>
 <translation id="1644574205037202324">Histórico</translation>
 <translation id="1646446875146297738">A ativação da opção "Não rastrear" significa que uma solicitação será incluída com seu tráfego de navegação. Qualquer efeito depende de o website responder ou não à solicitação e da forma que a solicitação é interpretada.
 
@@ -195,6 +196,7 @@
 <translation id="4124987746317609294">Intervalo de tempo</translation>
 <translation id="4172051516777682613">Sempre mostrar</translation>
 <translation id="418156467088430727">Ver versão off-line em uma nova guia</translation>
+<translation id="4192273449750167573">Revisar as configurações na próxima tela</translation>
 <translation id="4237682350741091554">Gerenciar a sincronização e a personalização do Chrome em <ph name="BEGIN_LINK" />Configurações<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Informar senha longa</translation>
 <translation id="4272631900155121838">Para ler um código QR, ative a câmera nas configurações</translation>
@@ -286,6 +288,7 @@
 <translation id="5938160824633642847">Seu dispositivo está quase cheio. Libere espaço e tente novamente.</translation>
 <translation id="5948291296578561264">Isso permite que você salve fotos na sua biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Exibindo a versão off-line</translation>
+<translation id="5957613098218939406">Mais opções</translation>
 <translation id="5964480694698977962">Criar nova guia anônima.</translation>
 <translation id="5965679971710331625">Você está conectado</translation>
 <translation id="5982717868370722439">Adicionar dados já existentes à conta <ph name="USER_EMAIL" />.</translation>
@@ -345,6 +348,7 @@
 <translation id="6797885426782475225">Pesquisa por voz</translation>
 <translation id="6807889908376551050">Mostrar todos...</translation>
 <translation id="681368974849482173">Item criado</translation>
+<translation id="685040365210406336">Não fazer alterações</translation>
 <translation id="6896758677409633944">Copiar</translation>
 <translation id="6903907808598579934">Ativar a sincronização</translation>
 <translation id="6914783257214138813">Suas senhas ficarão visíveis para qualquer pessoa que tiver acesso ao arquivo exportado.</translation>
@@ -374,6 +378,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> por cento baixados</translation>
 <translation id="7346909386216857016">Ok, entendi.</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Sim</translation>
 <translation id="7425346204213733349">Alterações feitas nos seus favoritos, histórico, senhas e outras configurações não serão mais sincronizadas com sua Conta do Google. No entanto, os dados já existentes permanecerão armazenados na Conta do Google.</translation>
 <translation id="744343212394640790">Não sou <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Estado/Prov.</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 3907d96b..2b582863 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Esta ação vai interromper totalmente o progresso da transferência atual.</translation>
 <translation id="1605658421715042784">Copiar imagem</translation>
 <translation id="1612730193129642006">Mostrar grelha de separadores</translation>
+<translation id="162035744160882748">Ativar a sincronização, a personalização e outros serviços Google</translation>
 <translation id="1644574205037202324">Histórico</translation>
 <translation id="1646446875146297738">Se ativar a funcionalidade "Não monitorizar", será incluído um pedido no seu tráfego de navegação. Os possíveis efeitos dependerão da resposta ao pedido por parte de um Website e da forma como o pedido é interpretado.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Intervalo de tempo</translation>
 <translation id="4172051516777682613">Mostrar sempre</translation>
 <translation id="418156467088430727">Ver versão offline num novo separador</translation>
+<translation id="4192273449750167573">Rever as suas definições no ecrã seguinte</translation>
 <translation id="4237682350741091554">Gerir a Sincronização do Chrome e a personalização nas <ph name="BEGIN_LINK" />Definições<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Introduzir frase de acesso</translation>
 <translation id="4272631900155121838">Para ler um código QR, ative a câmara nas definições</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">O dispositivo está quase cheio. Liberte espaço e tente novamente.</translation>
 <translation id="5948291296578561264">Isto permite-lhe guardar fotos na sua biblioteca de fotos.</translation>
 <translation id="5955891643922670672">Ver a versão offline</translation>
+<translation id="5957613098218939406">Mais opções</translation>
 <translation id="5964480694698977962">Criar novo separador de navegação anónima</translation>
 <translation id="5965679971710331625">Tem sessão iniciada</translation>
 <translation id="5982717868370722439">Adicionar dados existentes a <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Pesquisa por voz</translation>
 <translation id="6807889908376551050">Mostrar todos...</translation>
 <translation id="681368974849482173">Item criado</translation>
+<translation id="685040365210406336">Não efetuar alterações</translation>
 <translation id="6896758677409633944">Copiar</translation>
 <translation id="6903907808598579934">Ativar sincronização</translation>
 <translation id="6914783257214138813">As suas palavras-passe serão visíveis para todas as pessoas que consigam ver o ficheiro exportado.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> por cento transferido</translation>
 <translation id="7346909386216857016">OK, compreendi</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Sim, aceito</translation>
 <translation id="7425346204213733349">As alterações aos marcadores, ao histórico, às palavras-passe e a outras definições deixam de ser sincronizadas com a Conta Google. Contudo, os dados existentes permanecem armazenados na Conta Google.</translation>
 <translation id="744343212394640790">Não é <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Distrito/concelho</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index e7c066e..1bb5e416 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Aceasta va opri progresul descărcării actuale.</translation>
 <translation id="1605658421715042784">Copiază imaginea</translation>
 <translation id="1612730193129642006">Afișează Grila de file</translation>
+<translation id="162035744160882748">Activează sincronizarea, personalizarea și alte servicii Google</translation>
 <translation id="1644574205037202324">Istoric</translation>
 <translation id="1646446875146297738">Dacă activezi funcția „Nu urmări” înseamnă că în traficul de navigare va fi inclusă o solicitare. Efectele depind de răspunsul site-ului la solicitare și de modul în care solicitarea este interpretată.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Interval de timp</translation>
 <translation id="4172051516777682613">Afișați întotdeauna</translation>
 <translation id="418156467088430727">Vezi versiunea offline într-o filă nouă</translation>
+<translation id="4192273449750167573">Examinează setările pe ecranul următor</translation>
 <translation id="4237682350741091554">Gestionează Sincronizarea Chrome și personalizarea în <ph name="BEGIN_LINK" />Setări<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Introdu expresia de acces</translation>
 <translation id="4272631900155121838">Pentru a scana un cod QR, activează camera foto din setări</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Dispozitivul este aproape plin. Eliberează spațiu și încearcă din nou.</translation>
 <translation id="5948291296578561264">Astfel, poți să salvezi fotografiile în fototecă.</translation>
 <translation id="5955891643922670672">Se afișează versiunea offline</translation>
+<translation id="5957613098218939406">Mai multe opțiuni</translation>
 <translation id="5964480694698977962">Creează o filă incognito nouă.</translation>
 <translation id="5965679971710331625">Te-ai conectat</translation>
 <translation id="5982717868370722439">Adaugă datele existente în <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Căutare vocală</translation>
 <translation id="6807889908376551050">Afișați toate...</translation>
 <translation id="681368974849482173">Element creat</translation>
+<translation id="685040365210406336">Nu face modificări</translation>
 <translation id="6896758677409633944">Copiază</translation>
 <translation id="6903907808598579934">Activează sincronizarea</translation>
 <translation id="6914783257214138813">Parolele vor fi vizibile pentru toți cei care pot vedea fișierul exportat.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" />% descărcat</translation>
 <translation id="7346909386216857016">OK, am înțeles</translation>
 <translation id="7400418766976504921">Adresă URL</translation>
+<translation id="741204030948306876">Da, accept</translation>
 <translation id="7425346204213733349">Modificările marcajelor, istoricului, parolelor sau ale altor setări nu vor mai fi sincronizate cu Contul Google. Totuși, datele existente vor rămâne stocate în Contul Google.</translation>
 <translation id="744343212394640790">Nu ca <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Stat/Județ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index f5f36a10..ffa5052 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Скачивание файлов будет приостановлено.</translation>
 <translation id="1605658421715042784">Копировать изображение</translation>
 <translation id="1612730193129642006">Показать сетку таблицы</translation>
+<translation id="162035744160882748">Включить синхронизацию, персонализацию и другие сервисы Google</translation>
 <translation id="1644574205037202324">История</translation>
 <translation id="1646446875146297738">Если запретить отслеживание, в запросы браузера будет включена специальная команда. Результат этого действия будет зависеть от того, ответит ли сайт на запрос и каким образом он будет интерпретирован.
  
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Временной диапазон</translation>
 <translation id="4172051516777682613">Показывать всегда</translation>
 <translation id="418156467088430727">Открыть офлайн-версию в новой вкладке</translation>
+<translation id="4192273449750167573">Проверить настройки на следующем экране</translation>
 <translation id="4237682350741091554">Управление персонализацией и синхронизацией Chrome доступно в <ph name="BEGIN_LINK" />настройках<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Введите кодовую фразу</translation>
 <translation id="4272631900155121838">Чтобы отсканировать QR-код, разрешите доступ к камере в настройках.</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Освободите место на устройстве и повторите попытку.</translation>
 <translation id="5948291296578561264">Это позволяет вам сохранять фотографии в галерее.</translation>
 <translation id="5955891643922670672">Просматривается в офлайн-режиме</translation>
+<translation id="5957613098218939406">Другое</translation>
 <translation id="5964480694698977962">Создать вкладку инкогнито.</translation>
 <translation id="5965679971710331625">Вы вошли в аккаунт</translation>
 <translation id="5982717868370722439">Объединить сохраненные данные с данными пользователя <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Голосовой поиск</translation>
 <translation id="6807889908376551050">Показать все…</translation>
 <translation id="681368974849482173">Сохранено</translation>
+<translation id="685040365210406336">Ничего не менять</translation>
 <translation id="6896758677409633944">Копировать</translation>
 <translation id="6903907808598579934">Включить</translation>
 <translation id="6914783257214138813">Ваши пароли будут видны всем, у кого есть доступ к файлу экспорта.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Скачивается: <ph name="PERCENT" />%</translation>
 <translation id="7346909386216857016">ОК</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">ОК</translation>
 <translation id="7425346204213733349">Изменения в ваших закладках, паролях, истории и других настройках больше не будут синхронизироваться с аккаунтом Google. Это не повлияет на данные, сохраненные в аккаунте ранее.</translation>
 <translation id="744343212394640790">Не <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Регион</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 8cdf203..70e360c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Tým zastavíte ďalší postup aktuálneho sťahovania.</translation>
 <translation id="1605658421715042784">Kopírovať obrázok</translation>
 <translation id="1612730193129642006">Zobraziť karty v mriežke</translation>
+<translation id="162035744160882748">Zapnutie synchronizácie, prispôsobenia a ďalších služieb Googlu</translation>
 <translation id="1644574205037202324">História</translation>
 <translation id="1646446875146297738">Ak povolíte možnosť Nesledovať, žiadosť sa zahrnie do vašej aktivity prehliadania. Záleží na tom, či webové stránky na túto žiadosť zareagujú a akým spôsobom ju interpretujú.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Časové obdobie</translation>
 <translation id="4172051516777682613">Vždy zobraziť</translation>
 <translation id="418156467088430727">Zobraziť offline verziu na novej karte</translation>
+<translation id="4192273449750167573">Skontrolujte nastavenia na ďalšej obrazovke</translation>
 <translation id="4237682350741091554">Synchronizáciu a prispôsobenie Chromu môžete spravovať v <ph name="BEGIN_LINK" />Nastaveniach<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Zadajte prístupovú frázu</translation>
 <translation id="4272631900155121838">Ak chcete naskenovať QR kód, povoľte v nastaveniach fotoaparát</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Vaše zariadenie je takmer plné. Uvoľnite miesto a skúste to znova.</translation>
 <translation id="5948291296578561264">Umožňuje ukladať fotky do knižnice fotiek.</translation>
 <translation id="5955891643922670672">Zobrazuje sa offline verzia</translation>
+<translation id="5957613098218939406">Ďalšie možnosti</translation>
 <translation id="5964480694698977962">Vytvoriť novú kartu inkognito.</translation>
 <translation id="5965679971710331625">Ste prihlásený/-á</translation>
 <translation id="5982717868370722439">Pridať existujúce dáta do účtu <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Hlasové vyhľadávanie</translation>
 <translation id="6807889908376551050">Zobraziť všetky...</translation>
 <translation id="681368974849482173">Položka bola vytvorená</translation>
+<translation id="685040365210406336">Nič nemeniť</translation>
 <translation id="6896758677409633944">Kopírovať</translation>
 <translation id="6903907808598579934">Zapnúť synchronizáciu</translation>
 <translation id="6914783257214138813">Vaše heslá uvidí každý, kto si môže zobraziť exportovaný súbor.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Stiahnuté: <ph name="PERCENT" /> percent</translation>
 <translation id="7346909386216857016">Ok, rozumiem</translation>
 <translation id="7400418766976504921">Webová adresa</translation>
+<translation id="741204030948306876">Áno, súhlasím</translation>
 <translation id="7425346204213733349">Záložky, história, heslá a ďalšie nastavenia sa už nebudú ďalej synchronizovať do vášho účtu Google. Vaše súčasné údaje však zostanú uložené v účte Google.</translation>
 <translation id="744343212394640790">Nie som <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Štát/okres</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index 097cec68..ee6cdeb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">S tem boste prekinili trenutni prenos.</translation>
 <translation id="1605658421715042784">Kopiraj sliko</translation>
 <translation id="1612730193129642006">Prikaz mreže zavihkov</translation>
+<translation id="162035744160882748">Vklop sinhronizacije, prilagajanja in drugih Googlovih storitev</translation>
 <translation id="1644574205037202324">Zgodovina</translation>
 <translation id="1646446875146297738">Omogočena možnost »Ne sledi« pomeni, da bo v vaš promet brskanja vključena zahteva. Morebiten učinek je odvisen od tega, ali se spletno mesto odzove na zahtevo in kako si jo razlaga.
 
@@ -193,6 +194,7 @@
 <translation id="4124987746317609294">Časovno obdobje</translation>
 <translation id="4172051516777682613">Vedno pokaži</translation>
 <translation id="418156467088430727">Ogled različice brez povezave na novem zavihku</translation>
+<translation id="4192273449750167573">Pregled nastavitev na naslednjem zaslonu</translation>
 <translation id="4237682350741091554">Upravljanje sinhronizacije za Chrome in prilagajanja v <ph name="BEGIN_LINK" />Nastavitvah<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Vnos gesla</translation>
 <translation id="4272631900155121838">Če želite optično prebrati kodo QR, v nastavitvah omogočite fotoaparat</translation>
@@ -283,6 +285,7 @@
 <translation id="5938160824633642847">Shramba naprave je skoraj polna. Sprostite prostor in poskusite znova.</translation>
 <translation id="5948291296578561264">S tem je mogoče shranjevati fotografije v knjižnico fotografij.</translation>
 <translation id="5955891643922670672">Ogled različice brez povezave</translation>
+<translation id="5957613098218939406">Več možnosti</translation>
 <translation id="5964480694698977962">Create new incognito tab.</translation>
 <translation id="5965679971710331625">Prijavljeni ste</translation>
 <translation id="5982717868370722439">Dodajanje obstoječih podatkov v račun <ph name="USER_EMAIL" />.</translation>
@@ -342,6 +345,7 @@
 <translation id="6797885426782475225">Glasovno iskanje</translation>
 <translation id="6807889908376551050">Pokaži vse ...</translation>
 <translation id="681368974849482173">Item created</translation>
+<translation id="685040365210406336">Brez sprememb</translation>
 <translation id="6896758677409633944">Kopiraj</translation>
 <translation id="6903907808598579934">Vklopi sinhronizacijo</translation>
 <translation id="6914783257214138813">Gesla bodo vidna vsakomur, ki si lahko ogleda izvoženo datoteko z gesli.</translation>
@@ -371,6 +375,7 @@
 <translation id="7336264872878993241">Preneseno: <ph name="PERCENT" /> %</translation>
 <translation id="7346909386216857016">V redu, razumem</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Da, sem za</translation>
 <translation id="7425346204213733349">Spremembe zaznamkov, zgodovine, gesel in drugih nastavitev ne bodo več sinhronizirane z Google Računom. Obstoječi podatki bodo še naprej shranjeni v Google Računu.</translation>
 <translation id="744343212394640790">Nisem <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Regija</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index eca43943..fa6dd4a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -23,7 +23,7 @@
 <translation id="127138278192656016">Користите синхронизацију и све услуге</translation>
 <translation id="1272079795634619415">Заустави</translation>
 <translation id="1323735185997015385">Избриши</translation>
-<translation id="132390688737681464">Save and Fill Addresses (Чувај и уноси адресе)</translation>
+<translation id="132390688737681464">Чувај и уноси адресе</translation>
 <translation id="132683371494960526">Додирните двапут да бисте променили надређени директоријум.</translation>
 <translation id="1340643665687018190">Затвори мени</translation>
 <translation id="1375321115329958930">Сачуване лозинке</translation>
@@ -39,11 +39,12 @@
 <translation id="152234381334907219">Никада се не чува</translation>
 <translation id="1540800554400757039">1. ред за адресу</translation>
 <translation id="1545749641540134597">Скенирајте QR кôд</translation>
-<translation id="1558704936695638228">Press and hold for more tab options (Притисните и задржите ако желите више опција за картице)</translation>
+<translation id="1558704936695638228">Притисните и задржите ако желите више опција за картице</translation>
 <translation id="1580783302095112590">Имејл је послата.</translation>
 <translation id="1582732959743469162">На тај начин ћете потпуно зауставити тренутно преузимање.</translation>
 <translation id="1605658421715042784">Копирај слику</translation>
 <translation id="1612730193129642006">Show Tab Grid (Прикажи координатну мрежу картице)</translation>
+<translation id="162035744160882748">Укључите синхронизацију, персонализацију и друге Google услуге</translation>
 <translation id="1644574205037202324">Историја</translation>
 <translation id="1646446875146297738">Омогућавање опције „Не прати“ значи да ће захтев бити укључен уз саобраћај прегледања. Све последице зависе од тога да ли веб-сајт одговара на захтев и како се захтев тумачи.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Временски опсег</translation>
 <translation id="4172051516777682613">Увек прикажи</translation>
 <translation id="418156467088430727">Прикажи офлајн верзију на новој картици</translation>
+<translation id="4192273449750167573">Прегледајте подешавања на следећем екрану</translation>
 <translation id="4237682350741091554">Управљајте синхронизацијом и персонализацијом за Chrome у <ph name="BEGIN_LINK" />подешавањима<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Унесите приступну фразу</translation>
 <translation id="4272631900155121838">Да бисте скенирали QR кôд, омогућите камеру у подешавањима</translation>
@@ -240,7 +242,7 @@
 <translation id="5062321486222145940">Инсталирај Google диск</translation>
 <translation id="5083464117946352670">Није могуће утврдити величину датотеке.</translation>
 <translation id="5094827893301452931">Твит је довршен.</translation>
-<translation id="5123982333065001601">Save and Fill Credit Cards (Чувај и уноси кредитне картице)</translation>
+<translation id="5123982333065001601">Чувај и уноси кредитне картице</translation>
 <translation id="5173593619615111996">Затвори све картице без архивирања</translation>
 <translation id="5181140330217080051">Преузимање</translation>
 <translation id="5186185447130319458">Приватно</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Уређај је скоро пун. Ослободите простор и пробајте поново.</translation>
 <translation id="5948291296578561264">Ово вам омогућава да чувате слике у фототеци.</translation>
 <translation id="5955891643922670672">Прегледате офлајн верзију</translation>
+<translation id="5957613098218939406">Још опција</translation>
 <translation id="5964480694698977962">Направи нову картицу без архивирања.</translation>
 <translation id="5965679971710331625">Пријављени сте</translation>
 <translation id="5982717868370722439">Додајте постојеће податке на <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Гласовна претрага</translation>
 <translation id="6807889908376551050">Прикажи све...</translation>
 <translation id="681368974849482173">Ставка је направљена</translation>
+<translation id="685040365210406336">Не уноси никакве промене</translation>
 <translation id="6896758677409633944">Копирај</translation>
 <translation id="6903907808598579934">Укључи синхронизацију</translation>
 <translation id="6914783257214138813">Лозинке ће бити видљиве свима који могу да виде извезену датотеку.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Проценат преузимања: <ph name="PERCENT" /></translation>
 <translation id="7346909386216857016">Важи</translation>
 <translation id="7400418766976504921">URL адреса</translation>
+<translation id="741204030948306876">Да, омогући</translation>
 <translation id="7425346204213733349">Промене обележивача, историје, лозинки и других подешавања се више неће синхронизовати са Google налогом. Међутим, постојећи подаци ће остати сачувани на Google налогу.</translation>
 <translation id="744343212394640790">Нисам <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Држава/земља</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index f4b8324d..72dee693 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Den pågående nedladdningen avbryts.</translation>
 <translation id="1605658421715042784">Kopiera bild</translation>
 <translation id="1612730193129642006">Visa flikar i rutnät</translation>
+<translation id="162035744160882748">Aktivera synkronisering, anpassning och andra tjänster från Google</translation>
 <translation id="1644574205037202324">Historik</translation>
 <translation id="1646446875146297738">Om du aktiverar Do Not Track innebär det att en begäran skickas med webbtrafiken. Vad som händer sedan beror på om webbplatserna svarar på din begäran och hur begäran tolkas.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Tidsintervall</translation>
 <translation id="4172051516777682613">Visa alltid</translation>
 <translation id="418156467088430727">Visa offlineversionen i en ny flik</translation>
+<translation id="4192273449750167573">Granska inställningarna på nästa skärm</translation>
 <translation id="4237682350741091554">Hantera Chrome Sync och anpassning i <ph name="BEGIN_LINK" />inställningarna<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Ange lösenfras</translation>
 <translation id="4272631900155121838">Om du vill skanna en QR-kod aktiverar du kameran i inställningarna</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Det finns nästan ingen plats kvar på enheten. Frigör utrymme och försök igen.</translation>
 <translation id="5948291296578561264">Gör så att du kan spara foton i fotobiblioteket.</translation>
 <translation id="5955891643922670672">Offlineversionen visas</translation>
+<translation id="5957613098218939406">Fler alternativ</translation>
 <translation id="5964480694698977962">Skapa en ny inkognitoflik.</translation>
 <translation id="5965679971710331625">Du är inloggad</translation>
 <translation id="5982717868370722439">Lägg till befintlig data i <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Röstsökning</translation>
 <translation id="6807889908376551050">Visa alla ...</translation>
 <translation id="681368974849482173">Bokmärket har skapats</translation>
+<translation id="685040365210406336">Ändra ingenting</translation>
 <translation id="6896758677409633944">Kopiera</translation>
 <translation id="6903907808598579934">Aktivera synkronisering</translation>
 <translation id="6914783257214138813">Alla med tillgång till den exporterade filen kan läsa dina lösenord.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> procent har laddats ned</translation>
 <translation id="7346909386216857016">Ok, jag förstår</translation>
 <translation id="7400418766976504921">Webbadress</translation>
+<translation id="741204030948306876">Ja</translation>
 <translation id="7425346204213733349">Ändringar i bokmärken, historik, lösenord och andra inställningar synkroniseras inte längre med ditt Google-konto. Befintlig data fortsätter dock att lagras i Google-kontot.</translation>
 <translation id="744343212394640790">Inte <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Delstat/county</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index 7558e6d6..5d44539 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Hatua hii itasimamisha upakuaji wako wote wa sasa.</translation>
 <translation id="1605658421715042784">Nakili Picha</translation>
 <translation id="1612730193129642006">Onyesha Gridi ya Kichupo</translation>
+<translation id="162035744160882748">Washa usawazishaji, mapendeleo na huduma nyingine za Google</translation>
 <translation id="1644574205037202324">Historia</translation>
 <translation id="1646446875146297738">Kuwasha ‘Usifuatilie’ kunamaanisha kuwa ombi litajumuishwa kwenye rekodi yako ya shughuli za kuvinjari. Athari zozote zinategemea iwapo tovuti itajibu ombi, na namna ombi likatavyofasiriwa. 
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Masafa ya Muda</translation>
 <translation id="4172051516777682613">Onyesha kila mara</translation>
 <translation id="418156467088430727">Tazama Toleo la Nje ya Mtandao ktk Kichupo Kipya</translation>
+<translation id="4192273449750167573">Kagua mipangilio yako kwenye skrini inayofuata</translation>
 <translation id="4237682350741091554">Dhibiti Usawazishaji wa Chrome na uboreshaji katika <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Weka Kauli ya Siri</translation>
 <translation id="4272631900155121838">Ili kuchanganua msimbo wa QR, washa kamera kwenye mipangilio</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Nafasi ya kifaa chako inakaribia kujaa. Tafadhali futa baadhi vipengee ili upate nafasi kisha ujaribu tena.</translation>
 <translation id="5948291296578561264">Hatua hii inakuruhusu uhifadhi picha kwenye maktaba ya picha.</translation>
 <translation id="5955891643922670672">Unasoma Toleo la Nje ya Mtandao</translation>
+<translation id="5957613098218939406">Chaguo Zaidi</translation>
 <translation id="5964480694698977962">Unda kichupo fiche kipya.</translation>
 <translation id="5965679971710331625">Umeingia katika akaunti</translation>
 <translation id="5982717868370722439">Ongeza data iliyopo kwenye <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Kutafuta kwa Kutamka</translation>
 <translation id="6807889908376551050">Onyesha Zote...</translation>
 <translation id="681368974849482173">Umeunda kipengee</translation>
+<translation id="685040365210406336">Usifanye mabadiliko</translation>
 <translation id="6896758677409633944">Nakili</translation>
 <translation id="6903907808598579934">Washa kipengele cha kusawazisha</translation>
 <translation id="6914783257214138813">Mtu yeyote anayeweza kuona faili uliyohamisha ataona manenosiri yako.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Faili imepakuliwa asilimia <ph name="PERCENT" /></translation>
 <translation id="7346909386216857016">Sawa, nimeelewa</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Ndiyo, ninakubali</translation>
 <translation id="7425346204213733349">Mabadiliko kwenye alamisho, historia, manenosiri na mipangilio yako mingine haitasawazishwa tena kwenye Akaunti yako ya Google. Hata hivyo, data yako iliyopo itaendelea kuhifadhiwa katika Akaunti yako ya Google.</translation>
 <translation id="744343212394640790">Wewe si <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Jimbo / Mkoa</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index ad12662..eee70d1c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">இவ்வாறு செய்தால் உங்களின் தற்போதைய பதிவிறக்கத்திற்கான அனைத்துச் செயல்பாடும் நிறுத்தப்படும்.</translation>
 <translation id="1605658421715042784">படத்தை நகலெடு</translation>
 <translation id="1612730193129642006">தாவல் கட்டத்தைக் காட்டும் பொத்தான்</translation>
+<translation id="162035744160882748">ஒத்திசைவு, தனிப்பயனாக்கம் மற்றும் பிற Google சேவைகளை இயக்குக</translation>
 <translation id="1644574205037202324">வரலாறு</translation>
 <translation id="1646446875146297738">‘கண்காணிக்க வேண்டாம்’ என்பதை இயக்குவது, உங்கள் உலாவல் ட்ராஃபிக்குடன் ஒரு கோரிக்கை இணைக்கப்படும் என்று பொருளாகும். கோரிக்கைக்கு இணையதளம் பதிலளிக்கிறதா என்பதையும், கோரிக்கை எப்படிப் புரிந்துகொள்ளப்பட்டது என்பதையும் பொறுத்து விளைவுகள் இருக்கும்.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">நேர வரம்பு</translation>
 <translation id="4172051516777682613">எப்போதும் காட்டு</translation>
 <translation id="418156467088430727">புதிய தாவலில் ஆஃப்லைன் பதிப்பைக் காட்டு</translation>
+<translation id="4192273449750167573">அடுத்த திரையில் உங்கள் அமைப்புகளைச் சரிபார்க்கவும்</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />அமைப்புகளில்<ph name="END_LINK" /> Chrome ஒத்திசைவையும் தனிப்பயனாக்கத்தையும் நிர்வகிக்கலாம்</translation>
 <translation id="424315890655130736">கடவுச்சொற்றொடரை உள்ளிடுக</translation>
 <translation id="4272631900155121838">QR குறியீட்டை ஸ்கேன் செய்ய, அமைப்புகளிலிருந்து கேமராவை இயக்கவும்</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">உங்கள் சாதனச் சேமிப்பகம் கிட்டத்தட்ட நிரம்பிவிட்டது. இடத்தைக் காலியாக்கி, மீண்டும் முயலவும்.</translation>
 <translation id="5948291296578561264">உங்கள் பட நூலகத்தில் படங்களைச் சேமிக்க இது அனுமதிக்கும்.</translation>
 <translation id="5955891643922670672">ஆஃப்லைன் பதிப்பைப் பார்க்கிறீர்கள்</translation>
+<translation id="5957613098218939406">கூடுதல் விருப்பங்கள்</translation>
 <translation id="5964480694698977962">புதிய மறைநிலைத் தாவலை உருவாக்கு</translation>
 <translation id="5965679971710331625">உள்நுழைந்துள்ளீர்கள்</translation>
 <translation id="5982717868370722439">ஏற்கனவே உள்ள தரவை <ph name="USER_EMAIL" /> இல் சேர்.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">குரல் தேடல்</translation>
 <translation id="6807889908376551050">எல்லாவற்றையும் காட்டு...</translation>
 <translation id="681368974849482173">புத்தகக்குறி உருவாக்கப்பட்டது</translation>
+<translation id="685040365210406336">மாற்றங்கள் எதுவும் செய்ய வேண்டாம்</translation>
 <translation id="6896758677409633944">நகலெடு</translation>
 <translation id="6903907808598579934">ஒத்திசைவை இயக்கு</translation>
 <translation id="6914783257214138813">ஏற்றிய கோப்பைப் பார்க்கக்கூடிய அனைவரும் உங்கள் கடவுச்சொற்களைப் பார்க்க முடியும்.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> சதவீதம் பதிவிறக்கப்பட்டது</translation>
 <translation id="7346909386216857016">சரி, புரிந்தது</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">ஏற்கிறேன்</translation>
 <translation id="7425346204213733349">புத்தகக்குறிகள், வரலாறு, கடவுச்சொற்கள் ஆகியவற்றிலும் பிற அமைப்புகளிலும் செய்யும் மாற்றங்கள், இனி உங்கள் Google கணக்குடன் ஒத்திசைக்கப்படாது. எனினும், ஏற்கனவே சேமிக்கப்பட்ட உங்கள் தரவு Google கணக்கில் அப்படியே இருக்கும்.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> இல்லை</translation>
 <translation id="7454057999980797137">மாநிலம் / மாகாணம்</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 5e37648..efae268 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -23,6 +23,7 @@
 <translation id="127138278192656016">సమకాలీకరణ మరియు అన్ని సేవలను ఉపయోగించండి</translation>
 <translation id="1272079795634619415">ఆపు</translation>
 <translation id="1323735185997015385">తొలగించు</translation>
+<translation id="132390688737681464">చిరునామాలను సేవ్ చేసి, పూరించండి</translation>
 <translation id="132683371494960526">మూలాధారిత ఫోల్డర్‌ను మార్చడానికి రెండుసార్లు నొక్కండి.</translation>
 <translation id="1340643665687018190">మెనుని మూసివేయి</translation>
 <translation id="1375321115329958930">సేవ్ చెయ్యబడిన పాస్‌వర్డ్‌లు</translation>
@@ -38,10 +39,12 @@
 <translation id="152234381334907219">ఎప్పటికి సేవ్ చెయ్యబడవు</translation>
 <translation id="1540800554400757039">చిరునామా 1</translation>
 <translation id="1545749641540134597">QR కోడ్‌ని స్కాన్ చేయండి</translation>
+<translation id="1558704936695638228">మరిన్ని ట్యాబ్ ఎంపికల కోసం నొక్కి, పట్టుకోండి</translation>
 <translation id="1580783302095112590">మెయిల్ పంపబడింది.</translation>
 <translation id="1582732959743469162">ఇది మీ ప్రస్తుత డౌన్‌లోడ్ యొక్క మొత్తం ప్రోగ్రెస్‌ని ఆపివేస్తుంది.</translation>
 <translation id="1605658421715042784">చిత్రాన్ని కాపీ చేయి</translation>
 <translation id="1612730193129642006">ట్యాబ్ గ్రిడ్‌ను చూపించండి</translation>
+<translation id="162035744160882748">సమకాలీకరణ, వ్యక్తిగతీకరణ మరియు ఇతర Google సేవలను ఆన్ చేయండి</translation>
 <translation id="1644574205037202324">చరిత్ర</translation>
 <translation id="1646446875146297738">‘ట్రాక్ చేయవద్దు’ ప్రారంభించడం వలన మీ బ్రౌజింగ్ ట్రాఫిక్‌తో ఒక అభ్యర్థన చేర్చబడుతుంది. ప్రభావం ఏదైనా అభ్యర్థనకు వెబ్‌సైట్ ప్రతిస్పందించిందా లేదా మరియు అభ్యర్థన ఎలా వ్యాఖ్యానించబడింది అనేవాటిపై ఆధారపడి ఉంటుంది.
 
@@ -192,6 +195,7 @@
 <translation id="4124987746317609294">సమయ పరిధి</translation>
 <translation id="4172051516777682613">ఎల్లప్పుడూ చూపు</translation>
 <translation id="418156467088430727">కొత్త ట్యాబ్‌లో ఆఫ్‌లైన్ సంస్కరణను వీక్షించండి</translation>
+<translation id="4192273449750167573">తర్వాతి స్క్రీన్‌లో మీ సెట్టింగ్‌లను సమీక్షించండి</translation>
 <translation id="4237682350741091554"><ph name="BEGIN_LINK" />సెట్టింగ్‌లు<ph name="END_LINK" />లో Chrome సమకాలీకరణ మరియు వ్యక్తిగతీకరణను నిర్వహించండి</translation>
 <translation id="424315890655130736">రహస్య పదబంధాన్ని నమోదు చేయండి</translation>
 <translation id="4272631900155121838">QR కోడ్‌ను స్కాన్ చేయడానికి, సెట్టింగ్‌ల్లో కెమెరాను ప్రారంభించండి</translation>
@@ -238,6 +242,7 @@
 <translation id="5062321486222145940">Google డిస్క్ ఇన్‌. చేయి</translation>
 <translation id="5083464117946352670">ఫైల్ పరిమాణం గుర్తించలేకపో..</translation>
 <translation id="5094827893301452931">ట్వీట్ చేయడం పూర్తయింది.</translation>
+<translation id="5123982333065001601">క్రెడిట్ కార్డ్‌లను సేవ్ చేసి, పూరించండి</translation>
 <translation id="5173593619615111996">అజ్ఞాత ట్యాబ్‌లన్నీ మూసివేయి</translation>
 <translation id="5181140330217080051">డౌన్‌లోడ్ చేస్తోంది</translation>
 <translation id="5186185447130319458">ప్రైవేట్</translation>
@@ -282,6 +287,7 @@
 <translation id="5938160824633642847">మీ పరికరం దాదాపు నిండింది. స్థలాన్ని ఖాళీ చేసిన తర్వాత మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5948291296578561264">ఇది మీ ఫోటో లైబ్రరీకి ఫోటోలను సేవ్ చేయడానికి మీకు వీలు కల్పిస్తుంది.</translation>
 <translation id="5955891643922670672">ఆఫ్‌లైన్ సంస్కరణను వీక్షిస్తున్నారు</translation>
+<translation id="5957613098218939406">మరిన్ని ఎంపికలు</translation>
 <translation id="5964480694698977962">కొత్త అజ్ఞాత ట్యాబ్‌ను సృష్టించండి.</translation>
 <translation id="5965679971710331625">మీరు సైన్ ఇన్ చేసారు</translation>
 <translation id="5982717868370722439">ఇప్పటికే ఉన్న డేటాను <ph name="USER_EMAIL" />కి జోడించండి.</translation>
@@ -341,6 +347,7 @@
 <translation id="6797885426782475225">వాయిస్ శోధన</translation>
 <translation id="6807889908376551050">అన్నీ చూపు...</translation>
 <translation id="681368974849482173">అంశం సృష్టించబడింది</translation>
+<translation id="685040365210406336">మార్పులు చేయవద్దు</translation>
 <translation id="6896758677409633944">కాపీ చెయ్యి</translation>
 <translation id="6903907808598579934">సమకాలీకరణను ఆన్ చేయి</translation>
 <translation id="6914783257214138813">ఎగుమతి చేయబడిన ఫైల్‌ను చూడగల ఎవరికైనా మీ పాస్‌వర్డ్‌లు కనిపిస్తాయి.</translation>
@@ -370,6 +377,7 @@
 <translation id="7336264872878993241"><ph name="PERCENT" /> శాతం డౌన్‌లోడ్ అయ్యింది</translation>
 <translation id="7346909386216857016">సరే, అర్థమైంది</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">సరే, సమ్మతమే</translation>
 <translation id="7425346204213733349">మీ బుక్‌మార్క్‌లు, చరిత్ర, పాస్‌వర్డ్‌లు మరియు ఇతర సెట్టింగ్‌లకు చేసే మార్పులు ఇకపై మీ Google ఖాతాకు సమకాలీకరించబడవు. అయితే, ఇప్పటికే ఉన్న మీ డేటా మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> కాదు</translation>
 <translation id="7454057999980797137">రాష్ట్రం / దేశం</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index 3519325..23b2cdc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">การดำเนินการนี้จะหยุดการดาวน์โหลดที่ดำเนินอยู่ทั้งหมด</translation>
 <translation id="1605658421715042784">คัดลอกรูปภาพ</translation>
 <translation id="1612730193129642006">แสดงตารางแท็บ</translation>
+<translation id="162035744160882748">เปิดการซิงค์ การปรับเปลี่ยนในแบบของคุณ และบริการอื่นๆ ของ Google</translation>
 <translation id="1644574205037202324">ประวัติการเข้าชม</translation>
 <translation id="1646446875146297738">การเปิดใช้ "ไม่ติดตาม" จะทำให้คำขอหนึ่งๆ ไปรวมอยู่กับการรับส่งข้อมูลในการเรียกดูของคุณ ผลที่จะเกิดขึ้นขึ้นอยู่กับว่าเว็บไซต์ตอบสนองต่อคำขอหรือไม่และคำขอนั้นถูกตีความอย่างไร ตัวอย่างเช่น บางเว็บไซต์อาจตอบสนองต่อคำขอนี้ด้วยการแสดงโฆษณาที่ไม่ได้อยู่บนเว็บไซต์อื่นๆ ที่คุณเคยเยี่ยมชมให้คุณเห็น เว็บไซต์จำนวนมากจะยังคงเก็บรวบรวมและใช้ข้อมูลการท่องเว็บของคุณไว้ เพื่อปรับปรุงการรักษาความปลอดภัย จัดเตรียมเนื้อหา บริการ โฆษณา และคำแนะนำบนเว็บไซต์ รวมทั้งเพื่อสร้างสถิติการรายงาน เป็นต้น <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
 <translation id="1657011748321897393">การแชร์ล้มเหลวเนื่องจากคุณไม่ได้เชื่อมต่อเครือข่าย</translation>
@@ -192,6 +193,7 @@
 <translation id="4124987746317609294">ช่วงเวลา</translation>
 <translation id="4172051516777682613">แสดงทุกครั้ง</translation>
 <translation id="418156467088430727">ดูเวอร์ชันออฟไลน์ในแท็บใหม่</translation>
+<translation id="4192273449750167573">ตรวจสอบการตั้งค่าในหน้าจอถัดไป</translation>
 <translation id="4237682350741091554">จัดการการซิงค์ของ Chrome และการปรับเปลี่ยนในแบบของคุณใน<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">ป้อนรหัสผ่าน</translation>
 <translation id="4272631900155121838">หากต้องการสแกนโค้ด QR ให้เปิดใช้กล้องถ่ายรูปจากการตั้งค่า</translation>
@@ -283,6 +285,7 @@
 <translation id="5938160824633642847">พื้นที่ในอุปกรณ์เกือบเต็มแล้ว เพิ่มพื้นที่ว่างแล้วลองอีกครั้ง</translation>
 <translation id="5948291296578561264">ช่วยให้คุณบันทึกรูปภาพในคลังภาพได้</translation>
 <translation id="5955891643922670672">การดูเวอร์ชันออฟไลน์</translation>
+<translation id="5957613098218939406">ตัวเลือกเพิ่มเติม</translation>
 <translation id="5964480694698977962">สร้างแท็บที่ไม่ระบุตัวตนใหม่</translation>
 <translation id="5965679971710331625">คุณลงชื่อเข้าใช้แล้ว</translation>
 <translation id="5982717868370722439">เพิ่มข้อมูลที่มีอยู่ลงใน <ph name="USER_EMAIL" /></translation>
@@ -342,6 +345,7 @@
 <translation id="6797885426782475225">ค้นหาด้วยเสียง</translation>
 <translation id="6807889908376551050">แสดงทั้งหมด...</translation>
 <translation id="681368974849482173">สร้างรายการแล้ว</translation>
+<translation id="685040365210406336">ไม่เปลี่ยนแปลง</translation>
 <translation id="6896758677409633944">คัดลอก</translation>
 <translation id="6903907808598579934">เปิดการซิงค์</translation>
 <translation id="6914783257214138813">คนที่ดูไฟล์ที่ส่งออกได้จะเห็นรหัสผ่านของคุณ</translation>
@@ -371,6 +375,7 @@
 <translation id="7336264872878993241">ดาวน์โหลดแล้ว <ph name="PERCENT" /> เปอร์เซ็นต์</translation>
 <translation id="7346909386216857016">รับทราบ</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">ได้สิ ตกลง</translation>
 <translation id="7425346204213733349">การเปลี่ยนแปลงบุ๊กมาร์ก ประวัติการเข้าชม รหัสผ่าน และการตั้งค่าอื่นๆ จะไม่ซิงค์กับบัญชี Google ของคุณอีกต่อไป อย่างไรก็ตาม ข้อมูลที่คุณมีจะยังคงจัดเก็บอยู่ในบัญชี Google</translation>
 <translation id="744343212394640790">ไม่ใช่ <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">เขต/แขวง</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index fc24cdb..4fe7c66 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Bu, geçerli indirme işleminizin tüm ilerlemesini durduracaktır.</translation>
 <translation id="1605658421715042784">Resmi Kopyala</translation>
 <translation id="1612730193129642006">Sekme Kılavuzunu Göster</translation>
+<translation id="162035744160882748">Senkronizasyon, kişiselleştirme ve diğer Google hizmetlerini aç</translation>
 <translation id="1644574205037202324">Geçmiş</translation>
 <translation id="1646446875146297738">"Do Not Track" seçeneğinin etkinleştirilmesi, göz atma trafiğinize bir isteğin ekleneceği anlamına gelir. Bunun etkileri, bir web sitesinin bu isteğe yanıt verip vermemesine ve isteği ne şekilde yorumladığına bağlıdır.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Zaman Aralığı</translation>
 <translation id="4172051516777682613">Her zaman göster</translation>
 <translation id="418156467088430727">Çevrimdışı Sürümü Yeni Sekmede Göster</translation>
+<translation id="4192273449750167573">Bir sonraki ekranda ayarları gözden geçir</translation>
 <translation id="4237682350741091554">Chrome Senkronizasyonu'nu ve kişiselleştirmeyi <ph name="BEGIN_LINK" />Ayarlar<ph name="END_LINK" /> bölümünden yönetebilirsiniz</translation>
 <translation id="424315890655130736">Parolayı Girin</translation>
 <translation id="4272631900155121838">QR kodu taramak için ayarlardan kamerayı etkinleştirin.</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Cihazınızın depolama alanı dolmak üzere. Yer boşaltın ve tekrar deneyin.</translation>
 <translation id="5948291296578561264">Böylece, fotoğrafları fotoğraf kitaplığınıza kaydedebilirsiniz.</translation>
 <translation id="5955891643922670672">Çevrimdışı Sürüm Gösteriliyor</translation>
+<translation id="5957613098218939406">Diğer Seçenekler</translation>
 <translation id="5964480694698977962">Yeni gizli sekme oluştur.</translation>
 <translation id="5965679971710331625">Oturum açtınız</translation>
 <translation id="5982717868370722439">Mevcut verileri <ph name="USER_EMAIL" /> hesabına ekleyin.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Sesli Arama</translation>
 <translation id="6807889908376551050">Tümünü Göster...</translation>
 <translation id="681368974849482173">Öğe oluşturuldu</translation>
+<translation id="685040365210406336">Herhangi bir değişiklik yapma</translation>
 <translation id="6896758677409633944">Kopyala</translation>
 <translation id="6903907808598579934">Senkronizasyonu aç</translation>
 <translation id="6914783257214138813">Şifreleriniz, dışa aktarılan dosyayı görebilen herkes tarafından görülebilir.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Yüzde <ph name="PERCENT" /> indirildi</translation>
 <translation id="7346909386216857016">Tamam, anladım</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Evet, istiyorum</translation>
 <translation id="7425346204213733349">Yer işaretleri, geçmiş, şifreler ve diğer ayarlarınızda yaptığınız değişiklikler artık Google Hesabınız ile senkronize edilmeyecek. Ancak, mevcut verileriniz Google Hesabınızda saklanmaya devam edecek.</translation>
 <translation id="744343212394640790"><ph name="EMAIL" /> değilim</translation>
 <translation id="7454057999980797137">Eyalet / İlçe</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index 076a820..9e235cfe 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Поточне завантаження зупиниться.</translation>
 <translation id="1605658421715042784">Копіювати зображення</translation>
 <translation id="1612730193129642006">Показати сітку вкладок</translation>
+<translation id="162035744160882748">Увімкнути синхронізацію, персоналізацію й інші служби Google</translation>
 <translation id="1644574205037202324">Історія</translation>
 <translation id="1646446875146297738">Якщо ввімкнути параметр "Не відстежувати", запит додається в трафік веб-перегляду. Результат залежить від того, чи реагує веб-сайт на цей запит і як тлумачиться запит.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Період часу</translation>
 <translation id="4172051516777682613">Завжди показувати</translation>
 <translation id="418156467088430727">Переглянути офлайн-версію в новій вкладці</translation>
+<translation id="4192273449750167573">Перегляньте налаштування на наступному екрані</translation>
 <translation id="4237682350741091554">Керуйте синхронізацією та персоналізацією Chrome у <ph name="BEGIN_LINK" />налаштуваннях<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Ввести парольну фразу</translation>
 <translation id="4272631900155121838">Щоб відсканувати QR-код, увімкніть камеру в налаштуваннях</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Пам’ять на пристрої майже заповнено. Звільніть місце та повторіть спробу.</translation>
 <translation id="5948291296578561264">Ви зможете зберігати знімки в бібліотеці фотографій.</translation>
 <translation id="5955891643922670672">Перегляд офлайн-версії</translation>
+<translation id="5957613098218939406">Інші параметри</translation>
 <translation id="5964480694698977962">Створити анонімну вкладку.</translation>
 <translation id="5965679971710331625">Ви ввійшли в обліковий запис</translation>
 <translation id="5982717868370722439">Додати наявні дані в обліковий запис <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Голосовий пошук</translation>
 <translation id="6807889908376551050">Показати всі...</translation>
 <translation id="681368974849482173">Закладку творено</translation>
+<translation id="685040365210406336">Не вносити зміни</translation>
 <translation id="6896758677409633944">Копіювати</translation>
 <translation id="6903907808598579934">Увімкнути синхронізацію</translation>
 <translation id="6914783257214138813">Ваші паролі бачитимуть усі, хто може переглядати експортований файл.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Завантажено <ph name="PERCENT" />%</translation>
 <translation id="7346909386216857016">OK</translation>
 <translation id="7400418766976504921">URL-адреса</translation>
+<translation id="741204030948306876">Увімкнути</translation>
 <translation id="7425346204213733349">Зміни в закладках, історії, паролях та інших налаштуваннях більше не синхронізуватимуться з вашим обліковим записом Google. Однак наявні дані залишаться у вашому обліковому записі.</translation>
 <translation id="744343212394640790">Не <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Область</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 046c817f..7d5e12d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">Thao tác này sẽ ngừng tất cả hoạt động tải xuống đang diễn ra.</translation>
 <translation id="1605658421715042784">Sao chép hình ảnh</translation>
 <translation id="1612730193129642006">Hiển thị lưới tab</translation>
+<translation id="162035744160882748">Bật tính năng đồng bộ hóa, cá nhân hóa và các dịch vụ khác của Google</translation>
 <translation id="1644574205037202324">Lịch sử</translation>
 <translation id="1646446875146297738">Bật tính năng 'Không theo dõi' nghĩa là một yêu cầu sẽ đi kèm với lưu lượng duyệt web của bạn. Mọi ảnh hưởng đều phụ thuộc vào việc liệu trang web có phản hồi yêu cầu không và cách thức yêu cầu được diễn giải.
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">Phạm vi thời gian</translation>
 <translation id="4172051516777682613">Luôn hiển thị</translation>
 <translation id="418156467088430727">Xem phiên bản ngoại tuyến trong tab mới</translation>
+<translation id="4192273449750167573">Xem lại thông tin cài đặt của bạn trên màn hình tiếp theo</translation>
 <translation id="4237682350741091554">Quản lý Chrome Sync và cá nhân hóa trong <ph name="BEGIN_LINK" />Cài đặt<ph name="END_LINK" /></translation>
 <translation id="424315890655130736">Nhập cụm mật khẩu</translation>
 <translation id="4272631900155121838">Để quét mã QR, hãy bật máy ảnh từ cài đặt</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">Thiết bị của bạn gần hết không gian lưu trữ. Hãy giải phóng dung lượng và thử lại.</translation>
 <translation id="5948291296578561264">Điều này cho phép bạn lưu ảnh vào thư viện ảnh của mình.</translation>
 <translation id="5955891643922670672">Đang xem phiên bản ngoại tuyến</translation>
+<translation id="5957613098218939406">Tùy chọn khác</translation>
 <translation id="5964480694698977962">Tạo tab ẩn danh mới.</translation>
 <translation id="5965679971710331625">Bạn đã đăng nhập</translation>
 <translation id="5982717868370722439">Thêm dữ liệu hiện có vào <ph name="USER_EMAIL" />.</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">Tìm kiếm bằng giọng nói</translation>
 <translation id="6807889908376551050">Hiển thị tất cả...</translation>
 <translation id="681368974849482173">Đã tạo mục</translation>
+<translation id="685040365210406336">Không thực hiện thay đổi</translation>
 <translation id="6896758677409633944">Sao chép</translation>
 <translation id="6903907808598579934">Bật đồng bộ hóa</translation>
 <translation id="6914783257214138813">Bất cứ ai có thể xem tệp đã xuất đều có thể biết mật khẩu của bạn.</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">Đã tải xuống <ph name="PERCENT" /> phần trăm</translation>
 <translation id="7346909386216857016">Ok</translation>
 <translation id="7400418766976504921">URL</translation>
+<translation id="741204030948306876">Có, tôi đồng ý</translation>
 <translation id="7425346204213733349">Các thay đổi đối với dấu trang, lịch sử, mật khẩu và cài đặt khác sẽ không còn được đồng bộ hóa với Tài khoản Google của bạn. Tuy nhiên, dữ liệu hiện có của bạn sẽ vẫn được lưu trữ trong Tài khoản Google.</translation>
 <translation id="744343212394640790">Không phải là <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">Tiểu bang/quận</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
index 9daff0c..cfeac0e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">这会全面停止您正在执行的下载任务。</translation>
 <translation id="1605658421715042784">复制图片</translation>
 <translation id="1612730193129642006">显示标签页网格</translation>
+<translation id="162035744160882748">开启同步、个性化和其他 Google 服务</translation>
 <translation id="1644574205037202324">历史记录</translation>
 <translation id="1646446875146297738">如果您启用了"不跟踪",您的浏览流量中将会包含一个请求。具体影响取决于网站是否回应该请求以及如何解读该请求。
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">时间范围</translation>
 <translation id="4172051516777682613">一律显示</translation>
 <translation id="418156467088430727">在新标签页中查看离线版本</translation>
+<translation id="4192273449750167573">在下一个屏幕上查看您的设置</translation>
 <translation id="4237682350741091554">在<ph name="BEGIN_LINK" />设置<ph name="END_LINK" />中管理 Chrome 同步和个性化</translation>
 <translation id="424315890655130736">请输入密码</translation>
 <translation id="4272631900155121838">要扫描 QR 码,请从设置中启用相机功能</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">您设备上的存储空间即将用尽,请释放空间并重试。</translation>
 <translation id="5948291296578561264">这样,您便可将照片保存到您的照片库中。</translation>
 <translation id="5955891643922670672">正在查看离线版本</translation>
+<translation id="5957613098218939406">更多选项</translation>
 <translation id="5964480694698977962">创建新的无痕式标签页。</translation>
 <translation id="5965679971710331625">您已登录</translation>
 <translation id="5982717868370722439">将现有数据添加到 <ph name="USER_EMAIL" />。</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">语音搜索</translation>
 <translation id="6807889908376551050">全部显示...</translation>
 <translation id="681368974849482173">书签已创建</translation>
+<translation id="685040365210406336">不做任何更改</translation>
 <translation id="6896758677409633944">复制</translation>
 <translation id="6903907808598579934">开启同步功能</translation>
 <translation id="6914783257214138813">所有能查看此导出文件的人员都能看到您的密码。</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">已下载<ph name="PERCENT" />%</translation>
 <translation id="7346909386216857016">知道了</translation>
 <translation id="7400418766976504921">网址</translation>
+<translation id="741204030948306876">立即启用</translation>
 <translation id="7425346204213733349">对您的书签、历史记录、密码及其他设置所做的更改将不再同步到您的 Google 帐号。但现有数据将继续存储在您的 Google 帐号中。</translation>
 <translation id="744343212394640790">不是 <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">省/区/县</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 be29ec81..88fbeb21 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -44,6 +44,7 @@
 <translation id="1582732959743469162">目前所有下載進度都會因此停止。</translation>
 <translation id="1605658421715042784">複製圖片</translation>
 <translation id="1612730193129642006">顯示分頁方格</translation>
+<translation id="162035744160882748">啟用同步處理、個人化功能和其他 Google 服務</translation>
 <translation id="1644574205037202324">歷史記錄</translation>
 <translation id="1646446875146297738">啟用「不追蹤」選項後,您的瀏覽流量會置入一項特定的要求,其作用則視網站是否回應要求,以及網站解讀要求的方式而定。
 
@@ -194,6 +195,7 @@
 <translation id="4124987746317609294">時間範圍</translation>
 <translation id="4172051516777682613">一律顯示</translation>
 <translation id="418156467088430727">在新分頁中檢視離線版本</translation>
+<translation id="4192273449750167573">在下一個畫面中查看你的設定</translation>
 <translation id="4237682350741091554">前往<ph name="BEGIN_LINK" />設定<ph name="END_LINK" />頁面管理 Chrome 同步功能和個人化設定</translation>
 <translation id="424315890655130736">輸入通關密語</translation>
 <translation id="4272631900155121838">如要掃描 QR 圖碼,請在設定中啟用相機</translation>
@@ -285,6 +287,7 @@
 <translation id="5938160824633642847">你的裝置空間即將用盡,請在釋出空間後再試一次。</translation>
 <translation id="5948291296578561264">可讓你將相片儲存至相片庫。</translation>
 <translation id="5955891643922670672">正在查看離線版</translation>
+<translation id="5957613098218939406">更多選項</translation>
 <translation id="5964480694698977962">新增無痕式分頁。</translation>
 <translation id="5965679971710331625">你已登入帳戶</translation>
 <translation id="5982717868370722439">將現有資料新增至 <ph name="USER_EMAIL" />。</translation>
@@ -344,6 +347,7 @@
 <translation id="6797885426782475225">語音搜尋</translation>
 <translation id="6807889908376551050">全部顯示...</translation>
 <translation id="681368974849482173">項目已建立</translation>
+<translation id="685040365210406336">不進行任何變更</translation>
 <translation id="6896758677409633944">複製</translation>
 <translation id="6903907808598579934">開啟同步處理功能</translation>
 <translation id="6914783257214138813">凡是可查看匯出的檔案的使用者都能看到你的密碼。</translation>
@@ -373,6 +377,7 @@
 <translation id="7336264872878993241">已下載 <ph name="PERCENT" /> %</translation>
 <translation id="7346909386216857016">好,我知道了</translation>
 <translation id="7400418766976504921">網址</translation>
+<translation id="741204030948306876">是,我要啟用</translation>
 <translation id="7425346204213733349">您更改過的書籤、歷史記錄、密碼和其他設定不會繼續與您 Google 帳戶中的資料保持同步,但是您 Google 帳戶現有的資料仍會保留。</translation>
 <translation id="744343212394640790">不是 <ph name="EMAIL" /></translation>
 <translation id="7454057999980797137">州/縣</translation>
diff --git a/ios/chrome/browser/application_context_impl.cc b/ios/chrome/browser/application_context_impl.cc
index 132028c..049c7c67 100644
--- a/ios/chrome/browser/application_context_impl.cc
+++ b/ios/chrome/browser/application_context_impl.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/default_clock.h"
 #include "base/time/default_tick_clock.h"
 #include "components/component_updater/component_updater_service.h"
diff --git a/ios/chrome/browser/autofill/autofill_controller_unittest.mm b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
index b0485f06..263a6c2 100644
--- a/ios/chrome/browser/autofill/autofill_controller_unittest.mm
+++ b/ios/chrome/browser/autofill/autofill_controller_unittest.mm
@@ -11,7 +11,7 @@
 #include "base/ios/ios_util.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "components/autofill/core/browser/autofill_manager.h"
 #include "components/autofill/core/browser/autofill_metrics.h"
diff --git a/ios/chrome/browser/autofill/form_structure_browsertest.mm b/ios/chrome/browser/autofill/form_structure_browsertest.mm
index 4cddb619..cedddfb 100644
--- a/ios/chrome/browser/autofill/form_structure_browsertest.mm
+++ b/ios/chrome/browser/autofill/form_structure_browsertest.mm
@@ -11,7 +11,7 @@
 #include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #import "base/test/ios/wait_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "components/autofill/core/browser/autofill_manager.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm b/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm
index f4f1817f..4b32c26 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm
+++ b/ios/chrome/browser/browser_state/chrome_browser_state_impl_io_data.mm
@@ -12,7 +12,7 @@
 #include "base/callback.h"
 #include "base/logging.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/cookie_config/cookie_store_util.h"
 #include "components/net_log/chrome_net_log.h"
 #include "components/prefs/json_pref_store.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
index a603d5b1..441e849 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
+++ b/ios/chrome/browser/browser_state/chrome_browser_state_io_data.mm
@@ -23,7 +23,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/about_handler/about_protocol_handler.h"
 #include "components/content_settings/core/browser/content_settings_provider.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc b/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc
index 0d77f27..a02510f 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc
+++ b/ios/chrome/browser/browser_state/chrome_browser_state_manager_impl.cc
@@ -13,7 +13,7 @@
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/invalidation/impl/profile_invalidation_provider.h"
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state_removal_controller.mm b/ios/chrome/browser/browser_state/chrome_browser_state_removal_controller.mm
index 5859d15..7b6d0e2 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state_removal_controller.mm
+++ b/ios/chrome/browser/browser_state/chrome_browser_state_removal_controller.mm
@@ -12,7 +12,7 @@
 #include "base/location.h"
 #include "base/mac/foundation_util.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/prefs/pref_service.h"
 #include "google_apis/gaia/gaia_auth_util.h"
 #include "ios/chrome/browser/application_context.h"
diff --git a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm
index 48f6b1e..47d5f1ef0 100644
--- a/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm
+++ b/ios/chrome/browser/browser_state/off_the_record_chrome_browser_state_io_data.mm
@@ -12,7 +12,7 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/net_log/chrome_net_log.h"
 #include "components/prefs/pref_service.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
index 14f719b..4edd71f 100644
--- a/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
+++ b/ios/chrome/browser/browser_state/test_chrome_browser_state.mm
@@ -13,7 +13,7 @@
 #include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/common/bookmark_constants.h"
diff --git a/ios/chrome/browser/crash_report/breakpad_helper.mm b/ios/chrome/browser/crash_report/breakpad_helper.mm
index 0d4c8201..9068e766 100644
--- a/ios/chrome/browser/crash_report/breakpad_helper.mm
+++ b/ios/chrome/browser/crash_report/breakpad_helper.mm
@@ -17,7 +17,7 @@
 #include "base/logging.h"
 #include "base/path_service.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ios/chrome/browser/chrome_paths.h"
 #import "ios/chrome/browser/crash_report/crash_report_user_application_state.h"
 
diff --git a/ios/chrome/browser/download/download_directory_util.cc b/ios/chrome/browser/download/download_directory_util.cc
index 9fbf393..c1b1c53 100644
--- a/ios/chrome/browser/download/download_directory_util.cc
+++ b/ios/chrome/browser/download/download_directory_util.cc
@@ -7,8 +7,8 @@
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 
 namespace {
 // Synchronously deletes downloads directory.
diff --git a/ios/chrome/browser/feature_engagement/tracker_factory_util.mm b/ios/chrome/browser/feature_engagement/tracker_factory_util.mm
index 1637946..869a9c9 100644
--- a/ios/chrome/browser/feature_engagement/tracker_factory_util.mm
+++ b/ios/chrome/browser/feature_engagement/tracker_factory_util.mm
@@ -7,7 +7,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/feature_engagement/public/tracker.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_constants.h"
diff --git a/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc b/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc
index 2f12f273..cf463c1 100644
--- a/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc
+++ b/ios/chrome/browser/gcm/ios_chrome_gcm_profile_service_factory.cc
@@ -8,7 +8,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/gcm_driver/gcm_client_factory.h"
 #include "components/gcm_driver/gcm_profile_service.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
diff --git a/ios/chrome/browser/ios_chrome_main_parts.mm b/ios/chrome/browser/ios_chrome_main_parts.mm
index 36c6fa8..ea521870 100644
--- a/ios/chrome/browser/ios_chrome_main_parts.mm
+++ b/ios/chrome/browser/ios_chrome_main_parts.mm
@@ -12,7 +12,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/path_service.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/default_tick_clock.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
 #include "components/content_settings/core/common/content_settings_pattern.h"
diff --git a/ios/chrome/browser/net/cookie_util.mm b/ios/chrome/browser/net/cookie_util.mm
index 23118d59..9d6ef60 100644
--- a/ios/chrome/browser/net/cookie_util.mm
+++ b/ios/chrome/browser/net/cookie_util.mm
@@ -12,7 +12,7 @@
 #include "base/bind.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/net/cookies/cookie_store_ios_persistent.h"
 #import "ios/net/cookies/system_cookie_store.h"
diff --git a/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc b/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc
index 585f4e9..9f08d07 100644
--- a/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc
+++ b/ios/chrome/browser/ntp_snippets/ios_chrome_content_suggestions_service_factory_util.cc
@@ -8,7 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/json/json_reader.h"
 #include "base/memory/singleton.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_clock.h"
 #include "base/values.h"
diff --git a/ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.cc b/ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.cc
index 4215923..d91ebe1 100644
--- a/ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.cc
+++ b/ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.cc
@@ -4,7 +4,7 @@
 
 #include "ios/chrome/browser/ntp_tiles/ios_most_visited_sites_factory.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/history/core/browser/top_sites.h"
 #include "components/image_fetcher/core/image_fetcher_impl.h"
 #include "components/image_fetcher/ios/ios_image_decoder_impl.h"
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index 27c6ecab..130363b 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -7,8 +7,6 @@
 source_set("passwords") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
-    "account_select_fill_data.cc",
-    "account_select_fill_data.h",
     "credential_manager.h",
     "credential_manager.mm",
     "credential_manager_features.cc",
@@ -115,14 +113,11 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
-    "account_select_fill_data_unittest.cc",
     "credential_manager_unittest.mm",
     "credential_manager_util_unittest.cc",
     "js_credential_manager_unittest.mm",
     "password_controller_js_unittest.mm",
     "password_controller_unittest.mm",
-    "test_helpers.cc",
-    "test_helpers.h",
   ]
   deps = [
     ":passwords",
@@ -134,6 +129,7 @@
     "//components/password_manager/core/browser:test_support",
     "//components/password_manager/core/common",
     "//components/password_manager/ios",
+    "//components/password_manager/ios:test_support",
     "//components/prefs",
     "//components/prefs:test_support",
     "//components/security_state/ios",
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
index f8e14e1..f28bc75a 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
+++ b/ios/chrome/browser/passwords/ios_chrome_password_store_factory.cc
@@ -10,7 +10,7 @@
 #include "base/command_line.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/keyed_service/core/service_access_type.h"
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index d68aa7d7..8ea24ab 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -13,8 +13,6 @@
 #include <vector>
 
 #include "base/bind.h"
-#include "base/json/json_reader.h"
-#include "base/json/json_writer.h"
 #include "base/mac/foundation_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string16.h"
@@ -35,11 +33,11 @@
 #include "components/password_manager/core/browser/password_manager.h"
 #include "components/password_manager/core/browser/password_manager_client.h"
 #include "components/password_manager/core/browser/password_manager_driver.h"
+#include "components/password_manager/ios/account_select_fill_data.h"
 #import "components/password_manager/ios/js_password_manager.h"
 #include "components/sync/driver/sync_service.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
-#include "ios/chrome/browser/passwords/account_select_fill_data.h"
 #include "ios/chrome/browser/passwords/credential_manager.h"
 #include "ios/chrome/browser/passwords/credential_manager_features.h"
 #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
@@ -71,6 +69,8 @@
 using password_manager::PasswordManager;
 using password_manager::PasswordManagerClient;
 using password_manager::PasswordManagerDriver;
+using password_manager::SerializeFillData;
+using password_manager::SerializePasswordFormFillData;
 
 typedef void (^PasswordSuggestionsAvailableCompletion)(
     const AccountSelectFillData*);
@@ -230,60 +230,14 @@
   return [suggestions copy];
 }
 
-// Serializes arguments into a JSON string that can be used by the JS side
-// of PasswordController.
-NSString* SerializeFillData(const GURL& origin,
-                            const GURL& action,
-                            const base::string16& username_element,
-                            const base::string16& username_value,
-                            const base::string16& password_element,
-                            const base::string16& password_value) {
-  base::DictionaryValue rootDict;
-  rootDict.SetString("origin", origin.spec());
-  rootDict.SetString("action", action.spec());
-
-  auto fieldList = std::make_unique<base::ListValue>();
-
-  auto usernameField = std::make_unique<base::DictionaryValue>();
-  usernameField->SetString("name", username_element);
-  usernameField->SetString("value", username_value);
-  fieldList->Append(std::move(usernameField));
-
-  auto passwordField = std::make_unique<base::DictionaryValue>();
-  passwordField->SetString("name", password_element);
-  passwordField->SetString("value", password_value);
-  fieldList->Append(std::move(passwordField));
-
-  rootDict.Set("fields", std::move(fieldList));
-
-  std::string jsonString;
-  base::JSONWriter::Write(rootDict, &jsonString);
-  return base::SysUTF8ToNSString(jsonString);
-}
-
-// Serializes |formData| into a JSON string that can be used by the JS side
-// of PasswordController.
-NSString* SerializePasswordFormFillData(
-    const autofill::PasswordFormFillData& formData) {
-  return SerializeFillData(
-      formData.origin, formData.action, formData.username_field.name,
-      formData.username_field.value, formData.password_field.name,
-      formData.password_field.value);
-}
-
-NSString* SerializeFillData(const FillData& fillData) {
-  return SerializeFillData(fillData.origin, fillData.action,
-                           fillData.username_element, fillData.username_value,
-                           fillData.password_element, fillData.password_value);
-}
-
 // Returns true if the trust level for the current page URL of |web_state| is
 // kAbsolute. If |page_url| is not null, fills it with the current page URL.
 bool GetPageURLAndCheckTrustLevel(web::WebState* web_state, GURL* page_url) {
   auto trustLevel = web::URLVerificationTrustLevel::kNone;
   GURL dummy;
-  if (!page_url)
+  if (!page_url) {
     page_url = &dummy;
+  }
   *page_url = web_state->GetCurrentURL(&trustLevel);
   return trustLevel == web::URLVerificationTrustLevel::kAbsolute;
 }
diff --git a/ios/chrome/browser/passwords/password_controller_unittest.mm b/ios/chrome/browser/passwords/password_controller_unittest.mm
index 51710fb0..c1082895 100644
--- a/ios/chrome/browser/passwords/password_controller_unittest.mm
+++ b/ios/chrome/browser/passwords/password_controller_unittest.mm
@@ -23,6 +23,7 @@
 #include "components/password_manager/core/browser/stub_password_manager_client.h"
 #include "components/password_manager/core/common/password_manager_pref_names.h"
 #import "components/password_manager/ios/js_password_manager.h"
+#include "components/password_manager/ios/test_helpers.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
 #include "components/security_state/ios/ssl_status_input_event_data.h"
@@ -30,7 +31,6 @@
 #import "ios/chrome/browser/autofill/form_suggestion_controller.h"
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/passwords/password_form_filler.h"
-#include "ios/chrome/browser/passwords/test_helpers.h"
 #include "ios/chrome/browser/web/chrome_web_client.h"
 #import "ios/chrome/browser/web/chrome_web_test.h"
 #import "ios/web/public/navigation_item.h"
diff --git a/ios/chrome/browser/reading_list/favicon_web_state_dispatcher_impl.mm b/ios/chrome/browser/reading_list/favicon_web_state_dispatcher_impl.mm
index de143db..975db76 100644
--- a/ios/chrome/browser/reading_list/favicon_web_state_dispatcher_impl.mm
+++ b/ios/chrome/browser/reading_list/favicon_web_state_dispatcher_impl.mm
@@ -8,7 +8,6 @@
 #include "components/keyed_service/core/service_access_type.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/favicon/favicon_service_factory.h"
-#include "ios/chrome/browser/history/history_service_factory.h"
 #import "ios/web/public/web_state/web_state.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -47,8 +46,6 @@
   favicon::WebFaviconDriver::CreateForWebState(
       web_state.get(),
       ios::FaviconServiceFactory::GetForBrowserState(
-          original_browser_state, ServiceAccessType::EXPLICIT_ACCESS),
-      ios::HistoryServiceFactory::GetForBrowserState(
           original_browser_state, ServiceAccessType::EXPLICIT_ACCESS));
 
   return web_state;
diff --git a/ios/chrome/browser/reading_list/reading_list_download_service.cc b/ios/chrome/browser/reading_list/reading_list_download_service.cc
index 866e7dff..7eb1e8e2 100644
--- a/ios/chrome/browser/reading_list/reading_list_download_service.cc
+++ b/ios/chrome/browser/reading_list/reading_list_download_service.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/reading_list/core/offline_url_utils.h"
 #include "components/reading_list/core/reading_list_entry.h"
diff --git a/ios/chrome/browser/reading_list/url_downloader.cc b/ios/chrome/browser/reading_list/url_downloader.cc
index 7a77886..300b1dd 100644
--- a/ios/chrome/browser/reading_list/url_downloader.cc
+++ b/ios/chrome/browser/reading_list/url_downloader.cc
@@ -12,7 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/path_service.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/reading_list/core/offline_url_utils.h"
 #include "ios/chrome/browser/chrome_paths.h"
diff --git a/ios/chrome/browser/sessions/session_service_ios.mm b/ios/chrome/browser/sessions/session_service_ios.mm
index f20fc5c35..924d02e 100644
--- a/ios/chrome/browser/sessions/session_service_ios.mm
+++ b/ios/chrome/browser/sessions/session_service_ios.mm
@@ -15,7 +15,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #import "ios/chrome/browser/sessions/session_ios.h"
 #import "ios/chrome/browser/sessions/session_window_ios.h"
diff --git a/ios/chrome/browser/share_extension/share_extension_item_receiver.mm b/ios/chrome/browser/share_extension/share_extension_item_receiver.mm
index 9129e84..605e84a 100644
--- a/ios/chrome/browser/share_extension/share_extension_item_receiver.mm
+++ b/ios/chrome/browser/share_extension/share_extension_item_receiver.mm
@@ -14,7 +14,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/reading_list/core/reading_list_model.h"
diff --git a/ios/chrome/browser/snapshots/snapshot_cache.mm b/ios/chrome/browser/snapshots/snapshot_cache.mm
index 501a4a3..fabe0c4 100644
--- a/ios/chrome/browser/snapshots/snapshot_cache.mm
+++ b/ios/chrome/browser/snapshots/snapshot_cache.mm
@@ -20,7 +20,7 @@
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "ios/chrome/browser/experimental_flags.h"
diff --git a/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm b/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm
index 5d3e5b79..f675ac5 100644
--- a/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm
+++ b/ios/chrome/browser/snapshots/snapshot_cache_unittest.mm
@@ -13,7 +13,7 @@
 #include "base/mac/scoped_cftyperef.h"
 #include "base/run_loop.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/time/time.h"
 #import "ios/chrome/browser/snapshots/snapshot_cache_internal.h"
 #include "ios/web/public/test/test_web_thread_bundle.h"
diff --git a/ios/chrome/browser/snapshots/snapshots_util.mm b/ios/chrome/browser/snapshots/snapshots_util.mm
index cf1c995..35ad10a 100644
--- a/ios/chrome/browser/snapshots/snapshots_util.mm
+++ b/ios/chrome/browser/snapshots/snapshots_util.mm
@@ -12,7 +12,7 @@
 #include "base/macros.h"
 #include "base/path_service.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/suggestions/suggestions_service_factory.mm b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
index b629177..9a70833 100644
--- a/ios/chrome/browser/suggestions/suggestions_service_factory.mm
+++ b/ios/chrome/browser/suggestions/suggestions_service_factory.mm
@@ -10,7 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/default_tick_clock.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/image_fetcher/core/image_fetcher.h"
diff --git a/ios/chrome/browser/sync/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
index b06ef5a..61d5db1e 100644
--- a/ios/chrome/browser/sync/ios_chrome_sync_client.mm
+++ b/ios/chrome/browser/sync/ios_chrome_sync_client.mm
@@ -334,35 +334,35 @@
   switch (type) {
     case syncer::DEVICE_INFO:
       return ProfileSyncServiceFactory::GetForBrowserState(browser_state_)
-          ->GetDeviceInfoSyncControllerDelegateOnUIThread();
+          ->GetDeviceInfoSyncControllerDelegate();
     case syncer::READING_LIST: {
       ReadingListModel* reading_list_model =
           ReadingListModelFactory::GetForBrowserState(browser_state_);
       return reading_list_model->GetModelTypeSyncBridge()
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     }
     case syncer::AUTOFILL:
       return autofill::AutocompleteSyncBridge::FromWebDataService(
                  web_data_service_.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::AUTOFILL_PROFILE:
       return autofill::AutofillProfileSyncBridge::FromWebDataService(
                  web_data_service_.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::AUTOFILL_WALLET_DATA: {
       return autofill::AutofillWalletSyncBridge::FromWebDataService(
                  web_data_service_.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     }
     case syncer::AUTOFILL_WALLET_METADATA: {
       return autofill::AutofillWalletMetadataSyncBridge::FromWebDataService(
                  web_data_service_.get())
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     }
     case syncer::TYPED_URLS:
       // TypedURLModelTypeController doesn't exercise this function.
@@ -370,15 +370,15 @@
       return base::WeakPtr<syncer::ModelTypeControllerDelegate>();
     case syncer::USER_CONSENTS:
       return ConsentAuditorFactory::GetForBrowserState(browser_state_)
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::USER_EVENTS:
       return IOSUserEventServiceFactory::GetForBrowserState(browser_state_)
           ->GetSyncBridge()
           ->change_processor()
-          ->GetControllerDelegateOnUIThread();
+          ->GetControllerDelegate();
     case syncer::SESSIONS:
       return ProfileSyncServiceFactory::GetForBrowserState(browser_state_)
-          ->GetSessionSyncControllerDelegateOnUIThread();
+          ->GetSessionSyncControllerDelegate();
     default:
       NOTREACHED();
       return base::WeakPtr<syncer::ModelTypeControllerDelegate>();
diff --git a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
index 6e7ba24..54b5365 100644
--- a/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
+++ b/ios/chrome/browser/sync/profile_sync_service_factory_unittest.cc
@@ -10,7 +10,7 @@
 
 #include "base/command_line.h"
 #include "base/feature_list.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "components/browser_sync/browser_sync_switches.h"
 #include "components/browser_sync/profile_sync_service.h"
 #include "components/sync/base/model_type.h"
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn
index 600fe80..918aee9 100644
--- a/ios/chrome/browser/tabs/BUILD.gn
+++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -115,6 +115,7 @@
     "//ios/chrome/browser/translate",
     "//ios/chrome/browser/u2f",
     "//ios/chrome/browser/ui",
+    "//ios/chrome/browser/ui:feature_flags",
     "//ios/chrome/browser/ui:ui_internal",
     "//ios/chrome/browser/ui/alert_coordinator",
     "//ios/chrome/browser/ui/commands",
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm
index afce484..dd2529e 100644
--- a/ios/chrome/browser/tabs/tab_helper_util.mm
+++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -40,10 +40,12 @@
 #import "ios/chrome/browser/tabs/legacy_tab_helper.h"
 #import "ios/chrome/browser/tabs/tab.h"
 #import "ios/chrome/browser/translate/chrome_ios_translate_client.h"
+#import "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h"
 #import "ios/chrome/browser/web/blocked_popup_tab_helper.h"
 #import "ios/chrome/browser/web/features.h"
 #import "ios/chrome/browser/web/font_size_tab_helper.h"
+#import "ios/chrome/browser/web/image_fetch_tab_helper.h"
 #import "ios/chrome/browser/web/load_timing_tab_helper.h"
 #import "ios/chrome/browser/web/network_activity_indicator_tab_helper.h"
 #import "ios/chrome/browser/web/page_placeholder_tab_helper.h"
@@ -95,6 +97,10 @@
     FontSizeTabHelper::CreateForWebState(web_state);
   }
 
+  if (base::FeatureList::IsEnabled(kCopyImage)) {
+    ImageFetchTabHelper::CreateForWebState(web_state);
+  }
+
   ReadingListModel* model =
       ReadingListModelFactory::GetForBrowserState(browser_state);
   ReadingListWebStateObserver::CreateForWebState(web_state, model);
@@ -104,8 +110,6 @@
   favicon::WebFaviconDriver::CreateForWebState(
       web_state,
       ios::FaviconServiceFactory::GetForBrowserState(
-          original_browser_state, ServiceAccessType::IMPLICIT_ACCESS),
-      ios::HistoryServiceFactory::GetForBrowserState(
           original_browser_state, ServiceAccessType::IMPLICIT_ACCESS));
   history::WebStateTopSitesObserver::CreateForWebState(
       web_state,
diff --git a/ios/chrome/browser/tabs/tab_model_favicon_driver_observer_unittest.mm b/ios/chrome/browser/tabs/tab_model_favicon_driver_observer_unittest.mm
index 7e9fdcb..e1726d4 100644
--- a/ios/chrome/browser/tabs/tab_model_favicon_driver_observer_unittest.mm
+++ b/ios/chrome/browser/tabs/tab_model_favicon_driver_observer_unittest.mm
@@ -111,8 +111,7 @@
   TabIdTabHelper::CreateForWebState(web_state.get());
   LegacyTabHelper::CreateForWebState(web_state.get());
   favicon::WebFaviconDriver::CreateForWebState(web_state.get(),
-                                               /*favicon_service=*/nullptr,
-                                               /*history_service=*/nullptr);
+                                               /*favicon_service=*/nullptr);
 
   favicon::FaviconDriver* favicon_driver =
       favicon::WebFaviconDriver::FromWebState(web_state.get());
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
index 35fcf61..383788d7 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
+#include "ios/web/public/features.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/http_server/error_page_response_provider.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -85,8 +86,9 @@
   EARL_GREY_TEST_DISABLED(@"Test disabled on device.");
 #endif
 
-  // TODO(crbug.com/864597): Reenable this test.
-  EARL_GREY_TEST_DISABLED(@"Test disabled due to changes in error pages.");
+  if (base::FeatureList::IsEnabled(web::features::kWebErrorPages)) {
+    EARL_GREY_TEST_SKIPPED(@"Web-based error pages are printable");
+  }
 
   // TODO(crbug.com/747622): re-enable this test on iOS 11 once earl grey can
   // interact with the share menu.
@@ -131,7 +133,7 @@
   }
 
   // TODO(crbug.com/864597): Reenable this test.
-  EARL_GREY_TEST_DISABLED(@"Test disabled due to changes in error pages.");
+  EARL_GREY_TEST_DISABLED(@"Test should be rewritten to use Offline Version.");
 
   std::unique_ptr<web::DataResponseProvider> provider(
       new ErrorPageResponseProvider());
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/BUILD.gn b/ios/chrome/browser/ui/authentication/consent_bump/BUILD.gn
index 770ce1c2..f79bd67 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/BUILD.gn
+++ b/ios/chrome/browser/ui/authentication/consent_bump/BUILD.gn
@@ -9,6 +9,7 @@
   sources = [
     "consent_bump_coordinator.h",
     "consent_bump_coordinator.mm",
+    "consent_bump_coordinator_delegate.h",
     "consent_bump_mediator.h",
     "consent_bump_mediator.mm",
     "consent_bump_personalization_coordinator.h",
@@ -31,6 +32,7 @@
     "consent_bump_consumer.h",
     "consent_bump_option_button.h",
     "consent_bump_option_button.mm",
+    "consent_bump_option_type.h",
     "consent_bump_personalization_view_controller.h",
     "consent_bump_personalization_view_controller.mm",
     "consent_bump_view_controller.h",
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_consumer.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_consumer.h
index a25f588..b6af1d6 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_consumer.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_consumer.h
@@ -10,10 +10,14 @@
 // Consumer protocol for the ConsentBump
 @protocol ConsentBumpConsumer
 
-// Sets the title of the primary button of the ConsentBump.
+// Sets the title of the primary button of the ConsentBump. By default the
+// primary button isn't visible.
 - (void)setPrimaryButtonTitle:(NSString*)primaryButtonTitle;
 // Sets the title of the secondary button of the ConsentBump.
 - (void)setSecondaryButtonTitle:(NSString*)secondaryButtonTitle;
+// Shows the primary button on the ConsentBump. There are no way to hide it once
+// it is shown.
+- (void)showPrimaryButton;
 
 @end
 
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.h
index 181289c0..29d1aa2 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.h
@@ -7,12 +7,17 @@
 
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 
+@protocol ConsentBumpCoordinatorDelegate;
+
 // Coordinator handling the consent bump.
 @interface ConsentBumpCoordinator : ChromeCoordinator
 
 // ViewController associated with this coordinator.
 @property(nonatomic, strong, readonly) UIViewController* viewController;
 
+// Delegate for this coordinator.
+@property(nonatomic, weak) id<ConsentBumpCoordinatorDelegate> delegate;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.mm b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.mm
index 1136859..b4f36a0f 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.mm
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.mm
@@ -4,6 +4,8 @@
 
 #import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator.h"
 
+#include "base/logging.h"
+#import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator_delegate.h"
 #import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.h"
 #import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_coordinator.h"
 #import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller.h"
@@ -14,7 +16,8 @@
 #error "This file requires ARC support."
 #endif
 
-@interface ConsentBumpCoordinator ()<ConsentBumpViewControllerDelegate>
+@interface ConsentBumpCoordinator ()<ConsentBumpViewControllerDelegate,
+                                     UnifiedConsentCoordinatorDelegate>
 
 // Which child coordinator is currently presented.
 @property(nonatomic, assign) ConsentBumpScreen presentedCoordinatorType;
@@ -36,6 +39,7 @@
 
 @implementation ConsentBumpCoordinator
 
+@synthesize delegate = _delegate;
 @synthesize presentedCoordinatorType = _presentedCoordinatorType;
 @synthesize consentBumpViewController = _consentBumpViewController;
 @synthesize unifiedConsentCoordinator = _unifiedConsentCoordinator;
@@ -64,6 +68,7 @@
   self.mediator.consumer = self.consentBumpViewController;
 
   self.unifiedConsentCoordinator = [[UnifiedConsentCoordinator alloc] init];
+  self.unifiedConsentCoordinator.delegate = self;
   [self.unifiedConsentCoordinator start];
   self.presentedCoordinatorType = ConsentBumpScreenUnifiedConsent;
 
@@ -82,15 +87,31 @@
 
 - (void)consentBumpViewControllerDidTapPrimaryButton:
     (ConsentBumpViewController*)consentBumpViewController {
+  ConsentBumpOptionType type = ConsentBumpOptionTypeNotSet;
   switch (self.presentedCoordinatorType) {
     case ConsentBumpScreenUnifiedConsent:
-      // TODO(crbug.com/866506): Consent bump accepted.
+      type = ConsentBumpOptionTypeTurnOn;
       break;
     case ConsentBumpScreenPersonalization:
-      // TODO(crbug.com/866506): Clarify what should be the behavior at this
-      // point.
+      type = self.personalizationCoordinator.selectedOption;
       break;
   }
+  switch (type) {
+    case ConsentBumpOptionTypeNoChange:
+      // TODO(crbug.com/866506): Implement metrics.
+      break;
+    case ConsentBumpOptionTypeReview:
+      // TODO(crbug.com/866506): Implement metrics.
+      break;
+    case ConsentBumpOptionTypeTurnOn:
+      // TODO(crbug.com/866506): Implement metrics + sync updates.
+      break;
+    case ConsentBumpOptionTypeNotSet:
+      NOTREACHED();
+      break;
+  }
+  [self.delegate consentBumpCoordinator:self
+         didFinishNeedingToShowSettings:(type == ConsentBumpOptionTypeReview)];
 }
 
 - (void)consentBumpViewControllerDidTapSecondaryButton:
@@ -118,4 +139,26 @@
   }
 }
 
+- (void)consentBumpViewControllerDidTapMoreButton:
+    (ConsentBumpViewController*)consentBumpViewController {
+  [self.unifiedConsentCoordinator scrollToBottom];
+}
+
+#pragma mark - UnifiedConsentCoordinatorDelegate
+
+- (void)unifiedConsentCoordinatorDidReachBottom:
+    (UnifiedConsentCoordinator*)coordinator {
+  [self.mediator consumerCanProceed];
+}
+
+- (void)unifiedConsentCoordinatorDidTapSettingsLink:
+    (UnifiedConsentCoordinator*)coordinator {
+  NOTREACHED();
+}
+
+- (void)unifiedConsentCoordinatorDidTapOnAddAccount:
+    (UnifiedConsentCoordinator*)coordinator {
+  NOTREACHED();
+}
+
 @end
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator_delegate.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator_delegate.h
new file mode 100644
index 0000000..e8ad597a
--- /dev/null
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_coordinator_delegate.h
@@ -0,0 +1,22 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_COORDINATOR_DELEGATE_H_
+#define IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_COORDINATOR_DELEGATE_H_
+
+#import <Foundation/Foundation.h>
+
+@class ConsentBumpCoordinator;
+
+// Protocol defining a delegate for the ConsentBump coordinator.
+@protocol ConsentBumpCoordinatorDelegate
+
+// Notifies the delegate that the |coordinator| has finished with the type
+// |optionType|.
+- (void)consentBumpCoordinator:(ConsentBumpCoordinator*)coordinator
+    didFinishNeedingToShowSettings:(BOOL)shouldShowSettings;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_COORDINATOR_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.h
index 12b4715..07c7c18 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.h
@@ -24,6 +24,9 @@
 // Updates the consumer such as it is displaying information relative to the
 // |consentBumpScreen|.
 - (void)updateConsumerForConsentBumpScreen:(ConsentBumpScreen)consentBumpScreen;
+// Updates the consumer shuch as it is possible to continue on the next screen
+// by showing the primary button.
+- (void)consumerCanProceed;
 
 @end
 
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.mm b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.mm
index deb841d..10b4b69 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.mm
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_mediator.mm
@@ -32,8 +32,13 @@
           setPrimaryButtonTitle:l10n_util::GetNSString(IDS_ACCNAME_OK)];
       [self.consumer
           setSecondaryButtonTitle:l10n_util::GetNSString(IDS_ACCNAME_BACK)];
+      [self consumerCanProceed];
       break;
   }
 }
 
+- (void)consumerCanProceed {
+  [self.consumer showPrimaryButton];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_button.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_button.h
index 0ad69de..e22ce1df 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_button.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_button.h
@@ -7,13 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-// Different option types.
-typedef NS_ENUM(NSInteger, ConsentBumpOptionType) {
-  ConsentBumpOptionTypeDefault = 0,
-  ConsentBumpOptionTypeNoChange,
-  ConsentBumpOptionTypeReview,
-  ConsentBumpOptionTypeTurnOn
-};
+#import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_type.h"
 
 // Button defining a consent bump option.
 @interface ConsentBumpOptionButton : UIButton
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_type.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_type.h
new file mode 100644
index 0000000..d2f310f
--- /dev/null
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_type.h
@@ -0,0 +1,18 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_OPTION_TYPE_H_
+#define IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_OPTION_TYPE_H_
+
+#import <Foundation/Foundation.h>
+
+// Different option types.
+typedef NS_ENUM(NSInteger, ConsentBumpOptionType) {
+  ConsentBumpOptionTypeNotSet = 0,
+  ConsentBumpOptionTypeNoChange,
+  ConsentBumpOptionTypeReview,
+  ConsentBumpOptionTypeTurnOn
+};
+
+#endif  // IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_OPTION_TYPE_H_
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_coordinator.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_coordinator.h
index 4834e91c..452bfa32 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_coordinator.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_coordinator.h
@@ -5,7 +5,7 @@
 #ifndef IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_PERSONALIZATION_COORDINATOR_H_
 #define IOS_CHROME_BROWSER_UI_AUTHENTICATION_CONSENT_BUMP_CONSENT_BUMP_PERSONALIZATION_COORDINATOR_H_
 
-#import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_button.h"
+#import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_type.h"
 #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
 
 // Coordinator for handling the ConsentBump Personalization screen.
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_view_controller.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_view_controller.h
index 4d13f61..aea4fea6 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_view_controller.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_personalization_view_controller.h
@@ -7,7 +7,7 @@
 
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_button.h"
+#import "ios/chrome/browser/ui/authentication/consent_bump/consent_bump_option_type.h"
 
 // View controller displaying the Personalization screen.
 @interface ConsentBumpPersonalizationViewController : UIViewController
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller.mm b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller.mm
index 700958e..f5ac3541 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller.mm
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller.mm
@@ -21,6 +21,7 @@
 const CGFloat kButtonTitleGreyShade = 0.98;
 const CGFloat kButtonCornerRadius = 8;
 const CGFloat kButtonPadding = 16;
+const CGFloat kButtonVerticalPadding = 8;
 const CGFloat kButtonMinimalWidth = 80;
 const CGFloat kButtonTitleChangeAnimationDuration = 0.15;
 }  // namespace
@@ -28,8 +29,17 @@
 @interface ConsentBumpViewController ()
 
 @property(nonatomic, strong) UIView* buttonContainer;
+// Primary button. Hidden by default.
 @property(nonatomic, strong) UIButton* primaryButton;
+// Secondary button.
 @property(nonatomic, strong) UIButton* secondaryButton;
+// More button. Used to scroll the content to the bottom. Only displayed while
+// the primary button is hidden.
+@property(nonatomic, strong) UIButton* moreButton;
+// Constraint between the more button and the secondary button.
+@property(nonatomic, strong)
+    NSLayoutConstraint* secondaryMoreButtonMarginConstraint;
+// Gradient used to show that there is content that can be scrolled.
 @property(nonatomic, strong) UIView* gradientView;
 @property(nonatomic, strong) CAGradientLayer* gradientLayer;
 
@@ -42,6 +52,9 @@
 @synthesize buttonContainer = _buttonContainer;
 @synthesize primaryButton = _primaryButton;
 @synthesize secondaryButton = _secondaryButton;
+@synthesize moreButton = _moreButton;
+@synthesize secondaryMoreButtonMarginConstraint =
+    _secondaryMoreButtonMarginConstraint;
 @synthesize gradientView = _gradientView;
 @synthesize gradientLayer = _gradientLayer;
 
@@ -88,12 +101,14 @@
              forState:UIControlStateNormal];
     _primaryButton.layer.cornerRadius = kButtonCornerRadius;
     _primaryButton.contentEdgeInsets =
-        UIEdgeInsetsMake(0, kButtonPadding, 0, kButtonPadding);
+        UIEdgeInsetsMake(kButtonVerticalPadding, kButtonPadding,
+                         kButtonVerticalPadding, kButtonPadding);
     [_primaryButton setContentHuggingPriority:UILayoutPriorityDefaultHigh
                                       forAxis:UILayoutConstraintAxisVertical];
     [_primaryButton addTarget:self
                        action:@selector(primaryButtonCallback)
              forControlEvents:UIControlEventTouchUpInside];
+    _primaryButton.hidden = YES;
   }
   return _primaryButton;
 }
@@ -102,6 +117,9 @@
   if (!_secondaryButton) {
     _secondaryButton = [UIButton buttonWithType:UIButtonTypeSystem];
     _secondaryButton.translatesAutoresizingMaskIntoConstraints = NO;
+    _secondaryButton.contentEdgeInsets =
+        UIEdgeInsetsMake(kButtonVerticalPadding, kButtonPadding,
+                         kButtonVerticalPadding, kButtonPadding);
     [_secondaryButton setContentHuggingPriority:UILayoutPriorityDefaultHigh
                                         forAxis:UILayoutConstraintAxisVertical];
     [_secondaryButton addTarget:self
@@ -111,6 +129,28 @@
   return _secondaryButton;
 }
 
+- (UIButton*)moreButton {
+  if (!_moreButton) {
+    _moreButton = [UIButton buttonWithType:UIButtonTypeSystem];
+    _moreButton.translatesAutoresizingMaskIntoConstraints = NO;
+    _moreButton.contentEdgeInsets =
+        UIEdgeInsetsMake(kButtonVerticalPadding, kButtonPadding,
+                         kButtonVerticalPadding, kButtonPadding);
+    [_moreButton setContentHuggingPriority:UILayoutPriorityDefaultHigh
+                                   forAxis:UILayoutConstraintAxisVertical];
+    [_moreButton addTarget:self
+                    action:@selector(moreButtonCallback)
+          forControlEvents:UIControlEventTouchUpInside];
+    [_moreButton
+        setTitle:l10n_util::GetNSString(
+                     IDS_IOS_ACCOUNT_CONSISTENCY_CONFIRMATION_SCROLL_BUTTON)
+        forState:UIControlStateNormal];
+    [_moreButton setImage:[UIImage imageNamed:@"signin_confirmation_more"]
+                 forState:UIControlStateNormal];
+  }
+  return _moreButton;
+}
+
 - (UIView*)buttonContainer {
   if (!_buttonContainer) {
     _buttonContainer = [[UIView alloc] init];
@@ -152,11 +192,15 @@
 
   // Add subviews.
   [self.buttonContainer addSubview:self.primaryButton];
+  [self.buttonContainer addSubview:self.moreButton];
   [self.buttonContainer addSubview:self.secondaryButton];
   [self.view addSubview:self.buttonContainer];
   [self.view addSubview:self.gradientView];
 
   // Constraints.
+  self.secondaryMoreButtonMarginConstraint = [self.moreButton.leadingAnchor
+      constraintGreaterThanOrEqualToAnchor:self.secondaryButton.trailingAnchor
+                                  constant:kMargin];
   id<LayoutGuideProvider> safeArea = SafeAreaLayoutGuideForView(self.view);
   AddSameConstraintsToSides(self.view, self.gradientView,
                             LayoutSides::kLeading | LayoutSides::kTrailing);
@@ -171,13 +215,18 @@
       self.primaryButton, self.buttonContainer,
       LayoutSides::kTrailing | LayoutSides::kTop | LayoutSides::kBottom,
       ChromeDirectionalEdgeInsetsMake(kMargin, 0, kMargin, kMargin));
+  AddSameConstraintsToSidesWithInsets(
+      self.moreButton, self.buttonContainer,
+      LayoutSides::kTrailing | LayoutSides::kTop | LayoutSides::kBottom,
+      ChromeDirectionalEdgeInsetsMake(kMargin, 0, kMargin, kMargin));
   [NSLayoutConstraint activateConstraints:@[
+    self.secondaryMoreButtonMarginConstraint,
     [self.gradientView.heightAnchor constraintEqualToConstant:kGradientHeight],
     [self.gradientView.bottomAnchor
         constraintEqualToAnchor:self.buttonContainer.topAnchor],
     [self.primaryButton.leadingAnchor
-        constraintGreaterThanOrEqualToAnchor:self.secondaryButton
-                                                 .trailingAnchor],
+        constraintGreaterThanOrEqualToAnchor:self.secondaryButton.trailingAnchor
+                                    constant:kMargin],
 
     // Add minimum width to the buttons to have a better looking animation when
     // changing the label.
@@ -216,6 +265,12 @@
                   completion:nil];
 }
 
+- (void)showPrimaryButton {
+  self.moreButton.hidden = YES;
+  self.primaryButton.hidden = NO;
+  self.secondaryMoreButtonMarginConstraint.active = NO;
+}
+
 #pragma mark - Private
 
 - (void)primaryButtonCallback {
@@ -226,4 +281,8 @@
   [self.delegate consentBumpViewControllerDidTapSecondaryButton:self];
 }
 
+- (void)moreButtonCallback {
+  [self.delegate consentBumpViewControllerDidTapMoreButton:self];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller_delegate.h b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller_delegate.h
index 8a35f48..c9ed8d2 100644
--- a/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller_delegate.h
+++ b/ios/chrome/browser/ui/authentication/consent_bump/consent_bump_view_controller_delegate.h
@@ -20,6 +20,10 @@
 // been pressed.
 - (void)consentBumpViewControllerDidTapSecondaryButton:
     (ConsentBumpViewController*)consentBumpViewController;
+// Notifies the delegate that the more button of the view controller has been
+// pressed.
+- (void)consentBumpViewControllerDidTapMoreButton:
+    (ConsentBumpViewController*)consentBumpViewController;
 
 @end
 
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
index b947b720..aacc106 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
@@ -51,7 +51,7 @@
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  void ShowAutofillSettings() override;
+  void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         UnmaskCardReason reason,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
index 1efc717..f7240db 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -129,7 +129,8 @@
   return result.security_level;
 }
 
-void ChromeAutofillClientIOS::ShowAutofillSettings() {
+void ChromeAutofillClientIOS::ShowAutofillSettings(
+    bool show_credit_card_settings) {
   NOTREACHED();
 }
 
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index fb0f208f..b5a3927 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -29,7 +29,7 @@
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/bookmarks/browser/base_bookmark_model_observer.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/favicon/ios/web_favicon_driver.h"
@@ -4771,10 +4771,11 @@
 
 - (void)printTab {
   Tab* currentTab = [_model currentTab];
-  // The UI should prevent users from printing non-printable pages. However, a
-  // redirection to an un-printable page can happen before it is reflected in
-  // the UI.
+  // The UI should prevent users from printing non-printable pages. However,
+  // a page load error can happen after share dialog is invoked.
   if (![currentTab viewForPrinting]) {
+    // Web-based error pages are printable.
+    DCHECK(!base::FeatureList::IsEnabled(web::features::kWebErrorPages));
     TriggerHapticFeedbackForNotification(UINotificationFeedbackTypeError);
     [self showSnackbar:l10n_util::GetNSString(IDS_IOS_CANNOT_PRINT_PAGE_ERROR)];
     return;
diff --git a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
index 8a7a1f7..39a4e22 100644
--- a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
+++ b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
@@ -21,6 +21,7 @@
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#include "ios/testing/earl_grey/disabled_test_macros.h"
 #import "ios/testing/earl_grey/matchers.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
 #include "ios/web/public/test/element_selector.h"
@@ -338,7 +339,15 @@
 #pragma mark - Tests
 
 // Tests that an alert is shown, and that the completion block is called.
+// TODO(crbug.com/871685): Re-enable this test.
 - (void)testShowJavaScriptAlert {
+#if TARGET_IPHONE_SIMULATOR
+  if (IsIPadIdiom() && !base::ios::IsRunningOnIOS11OrLater()) {
+    EARL_GREY_TEST_DISABLED(
+        @"Failing on iOS 10 iPad simulator, for "
+        @"ios_chrome_multitasking_egtests");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
   // Load the blank test page and show an alert.
   [self loadBlankTestPage];
   ShowJavaScriptDialog(JavaScriptAlertType::ALERT);
diff --git a/ios/chrome/browser/ui/download/download_manager_mediator.mm b/ios/chrome/browser/ui/download/download_manager_mediator.mm
index abb5703..6674b2c4 100644
--- a/ios/chrome/browser/ui/download/download_manager_mediator.mm
+++ b/ios/chrome/browser/ui/download/download_manager_mediator.mm
@@ -10,7 +10,7 @@
 #include "base/files/file_util.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ios/chrome/browser/download/download_directory_util.h"
 #import "ios/chrome/browser/download/google_drive_app_util.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/download/legacy_download_manager_controller.mm b/ios/chrome/browser/ui/download/legacy_download_manager_controller.mm
index 58864a71..12c5f49 100644
--- a/ios/chrome/browser/ui/download/legacy_download_manager_controller.mm
+++ b/ios/chrome/browser/ui/download/legacy_download_manager_controller.mm
@@ -17,7 +17,7 @@
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/strings/grit/components_strings.h"
 #include "ios/chrome/browser/download/download_directory_util.h"
 #import "ios/chrome/browser/installation_notifier.h"
diff --git a/ios/chrome/browser/ui/external_file_remover_impl.mm b/ios/chrome/browser/ui/external_file_remover_impl.mm
index dbb31482..19cb054 100644
--- a/ios/chrome/browser/ui/external_file_remover_impl.mm
+++ b/ios/chrome/browser/ui/external_file_remover_impl.mm
@@ -8,7 +8,7 @@
 #include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/bookmarks/browser/bookmark_model.h"
 #include "components/bookmarks/browser/url_and_title.h"
 #include "components/sessions/core/tab_restore_service.h"
diff --git a/ios/chrome/browser/ui/first_run/first_run_util.mm b/ios/chrome/browser/ui/first_run/first_run_util.mm
index 12fa41c1..da04f11 100644
--- a/ios/chrome/browser/ui/first_run/first_run_util.mm
+++ b/ios/chrome/browser/ui/first_run/first_run_util.mm
@@ -9,7 +9,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "components/signin/core/browser/signin_manager.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
diff --git a/ios/chrome/browser/ui/image_util/image_copier.mm b/ios/chrome/browser/ui/image_util/image_copier.mm
index 972959d4..bd86f39 100644
--- a/ios/chrome/browser/ui/image_util/image_copier.mm
+++ b/ios/chrome/browser/ui/image_util/image_copier.mm
@@ -4,7 +4,7 @@
 
 #import "image_copier.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
 #include "ios/chrome/grit/ios_strings.h"
diff --git a/ios/chrome/browser/ui/image_util/image_saver.mm b/ios/chrome/browser/ui/image_util/image_saver.mm
index 8ae3ca5..8dd19f5 100644
--- a/ios/chrome/browser/ui/image_util/image_saver.mm
+++ b/ios/chrome/browser/ui/image_util/image_saver.mm
@@ -10,7 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/format_macros.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/image_fetcher/ios/ios_image_data_fetcher_wrapper.h"
 #include "components/strings/grit/components_strings.h"
diff --git a/ios/chrome/browser/ui/ntp/ntp_tile_saver.mm b/ios/chrome/browser/ui/ntp/ntp_tile_saver.mm
index 28be21a..1b357a7 100644
--- a/ios/chrome/browser/ui/ntp/ntp_tile_saver.mm
+++ b/ios/chrome/browser/ui/ntp/ntp_tile_saver.mm
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/md5.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/favicon/core/fallback_url_util.h"
 #include "components/ntp_tiles/ntp_tile.h"
diff --git a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator_unittest.mm b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator_unittest.mm
index bbb286e..70ca525 100644
--- a/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_table_coordinator_unittest.mm
@@ -117,8 +117,8 @@
     ON_CALL(*sync_service, GetRegisteredDataTypes())
         .WillByDefault(Return(syncer::ModelTypeSet()));
     sync_service->Initialize();
-    EXPECT_CALL(*sync_service, GetState())
-        .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+    EXPECT_CALL(*sync_service, GetTransportState())
+        .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
     EXPECT_CALL(*sync_service, GetOpenTabsUIDelegate())
         .WillRepeatedly(Return(nullptr));
 
diff --git a/ios/chrome/browser/ui/open_in_controller.mm b/ios/chrome/browser/ui/open_in_controller.mm
index 8f2a499..37c9bda 100644
--- a/ios/chrome/browser/ui/open_in_controller.mm
+++ b/ios/chrome/browser/ui/open_in_controller.mm
@@ -8,7 +8,7 @@
 #include "base/files/file_path.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 #include "base/sequenced_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
diff --git a/ios/chrome/browser/ui/print/print_controller.mm b/ios/chrome/browser/ui/print/print_controller.mm
index ceb5c4a..186c3ff 100644
--- a/ios/chrome/browser/ui/print/print_controller.mm
+++ b/ios/chrome/browser/ui/print/print_controller.mm
@@ -17,7 +17,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/strings/grit/components_strings.h"
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
 #import "ios/chrome/browser/ui/alert_coordinator/loading_alert_coordinator.h"
diff --git a/ios/chrome/browser/ui/print/print_controller_egtest.mm b/ios/chrome/browser/ui/print/print_controller_egtest.mm
index 23707d4..3f2ab2f 100644
--- a/ios/chrome/browser/ui/print/print_controller_egtest.mm
+++ b/ios/chrome/browser/ui/print/print_controller_egtest.mm
@@ -77,6 +77,15 @@
   }
 #endif
 
+#if TARGET_IPHONE_SIMULATOR
+  if (IsIPadIdiom() && !base::ios::IsRunningOnIOS11OrLater()) {
+    // TODO(crbug.com/871685): Re-enable this test.
+    EARL_GREY_TEST_DISABLED(
+        @"Failing on iOS 10 iPad simulator, for "
+        @"ios_chrome_multitasking_egtests");
+  }
+#endif  // TARGET_IPHONE_SIMULATOR
+
   GURL url = web::test::HttpServer::MakeUrl(kHTMLURL);
   std::map<GURL, std::string> responses;
   std::string response = "Test";
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm
index cb8fe89..71b9267 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data_collection_view_controller_unittest.mm
@@ -176,8 +176,8 @@
        TestItemsSignedInSyncActiveHistoryOff) {
   EXPECT_CALL(*mock_sync_service_, GetDisableReasons())
       .WillRepeatedly(Return(syncer::SyncService::DISABLE_REASON_NONE));
-  EXPECT_CALL(*mock_sync_service_, GetState())
-      .WillRepeatedly(Return(syncer::SyncService::State::ACTIVE));
+  EXPECT_CALL(*mock_sync_service_, GetTransportState())
+      .WillRepeatedly(Return(syncer::SyncService::TransportState::ACTIVE));
   EXPECT_CALL(*mock_sync_service_, IsFirstSetupComplete())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_sync_service_, GetActiveDataTypes())
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_command_handler.h b/ios/chrome/browser/ui/settings/google_services_settings_command_handler.h
index b0f3f1f..82cd17d7e 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_command_handler.h
+++ b/ios/chrome/browser/ui/settings/google_services_settings_command_handler.h
@@ -12,21 +12,7 @@
   // Enabble/disable all the Google services.
   GoogleServicesSettingsCommandIDToggleSyncEverything,
   // Enable/disabble bookmark sync.
-  GoogleServicesSettingsCommandIDToggleBookmarkSync,
-  // Enable/disabble history sync.
-  GoogleServicesSettingsCommandIDToggleHistorySync,
-  // Enable/disabble passwords sync.
-  GoogleServicesSettingsCommandIDTogglePasswordsSync,
-  // Enable/disabble open tabs sync.
-  GoogleServicesSettingsCommandIDToggleOpenTabsSync,
-  // Enable/disabble autofill sync.
-  GoogleServicesSettingsCommandIDToggleAutofillSync,
-  // Enable/disabble settings sync.
-  GoogleServicesSettingsCommandIDToggleSettingsSync,
-  // Enable/disabble reading list sync.
-  GoogleServicesSettingsCommandIDToggleReadingListSync,
-  // Enable/disable activity and interactions service.
-  GoogleServicesSettingsCommandIDToggleActivityAndInteractionsService,
+  GoogleServicesSettingsCommandIDToggleDataTypeSync,
   // Enable/disabble autocomplete searches service.
   GoogleServicesSettingsCommandIDToggleAutocompleteSearchesService,
   // Enable/disabble preload pages service.
@@ -48,27 +34,8 @@
 
 // Called when GoogleServicesSettingsCommandIDToggleSyncEverything is triggered.
 - (void)toggleSyncEverythingWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleBookmarkSync is triggered.
-- (void)toggleBookmarksSyncWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleHistorySync is triggered.
-- (void)toggleHistorySyncWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDTogglePasswordsSync is triggered.
-- (void)togglePasswordsSyncWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleOpenTabsSync is triggered.
-- (void)toggleOpenTabSyncWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleAutofillSync is triggered.
-- (void)toggleAutofillWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleSettingsSync is triggered.
-- (void)toggleSettingsWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleReadingListSync is
-// triggered.
-- (void)toggleReadingListWithValue:(BOOL)on;
-// Called when
-// GoogleServicesSettingsCommandIDToggleActivityAndInteractionsService is
-// triggered.
-- (void)toggleActivityAndInteractionsServiceWithValue:(BOOL)on;
-// Called when GoogleServicesSettingsCommandIDToggleAutocompleteSearchesService
-// is triggered.
+// Called when GoogleServicesSettingsCommandIDToggleDataTypeSync is triggered.
+- (void)toggleSyncDataSync:(NSInteger)dataType WithValue:(BOOL)on;
 - (void)toggleAutocompleteSearchesServiceWithValue:(BOOL)on;
 // Called when GoogleServicesSettingsCommandIDTogglePreloadPagesService is
 // triggered.
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_consumer.h b/ios/chrome/browser/ui/settings/google_services_settings_consumer.h
index 5630b83..9fb8ccc 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_consumer.h
+++ b/ios/chrome/browser/ui/settings/google_services_settings_consumer.h
@@ -16,6 +16,9 @@
 @property(nonatomic, strong, readonly)
     CollectionViewModel<CollectionViewItem*>* collectionViewModel;
 
+// Reloads |sections|.
+- (void)reloadSections:(NSIndexSet*)sections;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_SETTINGS_CONSUMER_H_
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm
index c309ecdb..6854e15 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_coordinator.mm
@@ -6,6 +6,8 @@
 
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
+#include "ios/chrome/browser/sync/profile_sync_service_factory.h"
+#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
 #import "ios/chrome/browser/ui/settings/google_services_settings_mediator.h"
 #import "ios/chrome/browser/ui/settings/google_services_settings_view_controller.h"
 
@@ -35,8 +37,14 @@
                    style:CollectionViewControllerStyleAppBar];
   controller.presentationDelegate = self;
   self.viewController = controller;
+  SyncSetupService* syncSetupService =
+      SyncSetupServiceFactory::GetForBrowserState(self.browserState);
+  browser_sync::ProfileSyncService* syncService =
+      ProfileSyncServiceFactory::GetForBrowserState(self.browserState);
   self.mediator = [[GoogleServicesSettingsMediator alloc]
-      initWithPrefService:self.browserState->GetPrefs()];
+      initWithPrefService:self.browserState->GetPrefs()
+              syncService:syncService
+         syncSetupService:syncSetupService];
   self.mediator.consumer = controller;
   self.mediator.authService =
       AuthenticationServiceFactory::GetForBrowserState(self.browserState);
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm b/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm
index f88e194..9ce10ea 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_egtest.mm
@@ -79,9 +79,9 @@
 - (void)testOpeningServicesWhileSignedIn {
   if (!IsUIRefreshPhase1Enabled())
     EARL_GREY_TEST_SKIPPED(@"This test is UIRefresh only.");
+  [SigninEarlGreyUI signinWithIdentity:[SigninEarlGreyUtils fakeIdentity1]];
   PrefService* prefService = GetOriginalBrowserState()->GetPrefs();
   prefService->SetBoolean(kUnifiedConsentGiven, false);
-  [SigninEarlGreyUI signinWithIdentity:[SigninEarlGreyUtils fakeIdentity1]];
   [self openGoogleServicesSettings];
   [self assertSyncEverythingSection];
   [self assertPersonalizedServicesCollapsed:NO];
@@ -96,9 +96,9 @@
 - (void)testOpeningServicesWhileSignedInAndConsentGiven {
   if (!IsUIRefreshPhase1Enabled())
     EARL_GREY_TEST_SKIPPED(@"This test is UIRefresh only.");
+  [SigninEarlGreyUI signinWithIdentity:[SigninEarlGreyUtils fakeIdentity1]];
   PrefService* prefService = GetOriginalBrowserState()->GetPrefs();
   prefService->SetBoolean(kUnifiedConsentGiven, true);
-  [SigninEarlGreyUI signinWithIdentity:[SigninEarlGreyUtils fakeIdentity1]];
   [self openGoogleServicesSettings];
   [self assertSyncEverythingSection];
   [self assertPersonalizedServicesCollapsed:YES];
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_mediator.h b/ios/chrome/browser/ui/settings/google_services_settings_mediator.h
index b58219a..9419f3bc 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_mediator.h
+++ b/ios/chrome/browser/ui/settings/google_services_settings_mediator.h
@@ -15,21 +15,30 @@
 class AuthenticationService;
 @class GoogleServicesSettingsViewController;
 class PrefService;
+class SyncSetupService;
+
+namespace browser_sync {
+class ProfileSyncService;
+};
 
 // Mediator for the Google services settings.
 @interface GoogleServicesSettingsMediator
     : NSObject<GoogleServicesSettingsCommandHandler,
                GoogleServicesSettingsViewControllerModelDelegate>
 
-// Designated initializer. |prefService| should not be null.
+// Designated initializer. |prefService|, |syncService| and |syncSetupService|
+// should not be null.
 - (instancetype)initWithPrefService:(PrefService*)prefService
+                        syncService:
+                            (browser_sync::ProfileSyncService*)syncService
+                   syncSetupService:(SyncSetupService*)syncSetupService
     NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)init NS_UNAVAILABLE;
 
 // View controller.
 @property(nonatomic, weak) id<GoogleServicesSettingsConsumer> consumer;
-// Browser state.
+// Authentication service.
 @property(nonatomic, assign) AuthenticationService* authService;
 
 @end
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm b/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm
index e622d1b6..f290ba5 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_mediator.mm
@@ -4,10 +4,17 @@
 
 #import "ios/chrome/browser/ui/settings/google_services_settings_mediator.h"
 
+#include "base/auto_reset.h"
+#include "base/mac/foundation_util.h"
+#include "components/browser_sync/profile_sync_service.h"
+#import "components/prefs/ios/pref_observer_bridge.h"
+#include "components/prefs/pref_change_registrar.h"
 #include "components/prefs/pref_service.h"
 #include "components/unified_consent/pref_names.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
+#include "ios/chrome/browser/sync/sync_observer_bridge.h"
+#include "ios/chrome/browser/sync/sync_setup_service.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_item.h"
 #import "ios/chrome/browser/ui/collection_view/cells/collection_view_text_item.h"
 #import "ios/chrome/browser/ui/settings/cells/settings_collapsible_item.h"
@@ -24,6 +31,8 @@
 using l10n_util::GetNSString;
 using unified_consent::prefs::kUnifiedConsentGiven;
 
+typedef NSArray<CollectionViewItem*>* ItemArray;
+
 namespace {
 
 // List of sections.
@@ -66,12 +75,42 @@
 
 }  // namespace
 
-@interface GoogleServicesSettingsMediator ()
+@interface GoogleServicesSettingsMediator ()<PrefObserverDelegate,
+                                             SyncObserverModelBridge> {
+  // Bridge to listen to pref changes.
+  std::unique_ptr<PrefObserverBridge> prefObserverBridge_;
+  // Registrar for pref changes notifications.
+  PrefChangeRegistrar prefChangeRegistrar_;
+  std::unique_ptr<SyncObserverBridge> _syncObserver;
+}
 
 // Returns YES if the user is authenticated.
-@property(nonatomic, readonly) BOOL isAuthenticated;
+@property(nonatomic, assign, readonly) BOOL isAuthenticated;
+// Returns YES if the user has given his consent to use Google services.
+@property(nonatomic, assign, readonly) BOOL isConsentGiven;
 // Preference service.
-@property(nonatomic, readonly) PrefService* prefService;
+@property(nonatomic, assign, readonly) PrefService* prefService;
+// Sync setup service.
+@property(nonatomic, assign, readonly) SyncSetupService* syncSetupService;
+
+// YES if the switch for |syncEverythingItem| is currently animating from one
+// state to another.
+@property(nonatomic, assign, readwrite) BOOL syncEverythingSwitchBeingAnimated;
+// YES if at least one switch in the personalized section is currently animating
+// from one state to another.
+@property(nonatomic, assign, readwrite) BOOL personalizedSectionBeingAnimated;
+// Item for "Sync Everything" section.
+@property(nonatomic, strong, readonly) SyncSwitchItem* syncEverythingItem;
+// Collapsible item for the personalized section.
+@property(nonatomic, strong, readonly)
+    SettingsCollapsibleItem* syncPersonalizationItem;
+// All the items for the personalized section.
+@property(nonatomic, strong, readonly) ItemArray personalizedItems;
+// Collapsible item for the non-personalized section.
+@property(nonatomic, strong, readonly)
+    SettingsCollapsibleItem* nonPersonalizedServicesItem;
+// All the items for the non-personalized section.
+@property(nonatomic, strong, readonly) ItemArray nonPersonalizedItems;
 
 @end
 
@@ -80,14 +119,35 @@
 @synthesize consumer = _consumer;
 @synthesize authService = _authService;
 @synthesize prefService = _prefService;
+@synthesize syncSetupService = _syncSetupService;
+@synthesize syncEverythingSwitchBeingAnimated =
+    _syncEverythingSwitchBeingAnimated;
+@synthesize personalizedSectionBeingAnimated =
+    _personalizedSectionBeingAnimated;
+@synthesize syncEverythingItem = _syncEverythingItem;
+@synthesize syncPersonalizationItem = _syncPersonalizationItem;
+@synthesize personalizedItems = _personalizedItems;
+@synthesize nonPersonalizedServicesItem = _nonPersonalizedServicesItem;
+@synthesize nonPersonalizedItems = _nonPersonalizedItems;
 
 #pragma mark - Load model
 
-- (instancetype)initWithPrefService:(PrefService*)prefService {
+- (instancetype)initWithPrefService:(PrefService*)prefService
+                        syncService:
+                            (browser_sync::ProfileSyncService*)syncService
+                   syncSetupService:(SyncSetupService*)syncSetupService {
   self = [super init];
   if (self) {
     DCHECK(prefService);
+    DCHECK(syncService);
+    DCHECK(syncSetupService);
     _prefService = prefService;
+    _syncSetupService = syncSetupService;
+    _syncObserver.reset(new SyncObserverBridge(self, syncService));
+    prefObserverBridge_ = std::make_unique<PrefObserverBridge>(self);
+    prefChangeRegistrar_.Init(prefService);
+    prefObserverBridge_->ObserveChangesForPreference(kUnifiedConsentGiven,
+                                                     &prefChangeRegistrar_);
   }
   return self;
 }
@@ -96,19 +156,9 @@
 - (void)loadSyncEverythingSection {
   CollectionViewModel* model = self.consumer.collectionViewModel;
   [model addSectionWithIdentifier:SyncEverythingSectionIdentifier];
-  [model addItem:[self syncEverythingItem]
+  [model addItem:self.syncEverythingItem
       toSectionWithIdentifier:SyncEverythingSectionIdentifier];
-}
-
-// Creates SyncEverythingItemType item.
-- (CollectionViewItem*)syncEverythingItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncEverythingItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_EVERYTHING);
-  item.enabled = YES;
-  item.on = [self isConsentGiven];
-  item.commandID = GoogleServicesSettingsCommandIDToggleSyncEverything;
-  return item;
+  self.syncEverythingItem.on = self.isConsentGiven;
 }
 
 // Loads PersonalizedSectionIdentifier section.
@@ -118,165 +168,16 @@
   [model setSectionIdentifier:PersonalizedSectionIdentifier
                  collapsedKey:kGoogleServicesSettingsPersonalizedSectionKey];
   SettingsCollapsibleItem* syncPersonalizationItem =
-      [self syncPersonalizationItem];
+      self.syncPersonalizationItem;
   [model addItem:syncPersonalizationItem
       toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  BOOL collapsed = self.isAuthenticated ? [self isConsentGiven] : YES;
+  BOOL collapsed = self.isAuthenticated ? self.isConsentGiven : YES;
   syncPersonalizationItem.collapsed = collapsed;
   [model setSection:PersonalizedSectionIdentifier collapsed:collapsed];
-  [model addItem:[self syncBookmarksItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncHistoryItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncPasswordsItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncOpenTabsItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncAutofillItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncReadingListItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncActivityAndInteractionsItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self syncGoogleActivityControlsItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self encryptionItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-  [model addItem:[self manageSyncedDataItem]
-      toSectionWithIdentifier:PersonalizedSectionIdentifier];
-}
-
-// Creates SyncPersonalizationItemType item.
-- (SettingsCollapsibleItem*)syncPersonalizationItem {
-  SettingsCollapsibleItem* item = [[SettingsCollapsibleItem alloc]
-      initWithType:SyncPersonalizationItemType];
-  item.text =
-      GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_PERSONALIZATION_TEXT);
-  item.numberOfTextLines = 0;
-  if (!self.isAuthenticated)
-    item.textColor = [[MDCPalette greyPalette] tint500];
-  item.detailText =
-      GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_PERSONALIZATION_DETAIL);
-  item.numberOfDetailTextLines = 0;
-  return item;
-}
-
-// Creates SyncBookmarksItemType item.
-- (CollectionViewItem*)syncBookmarksItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncBookmarksItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_BOOKMARKS_TEXT);
-  item.enabled = self.isAuthenticated;
-  item.commandID = GoogleServicesSettingsCommandIDToggleBookmarkSync;
-  return item;
-}
-
-// Creates SyncHistoryItemType item.
-- (CollectionViewItem*)syncHistoryItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncHistoryItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_HISTORY_TEXT);
-  item.enabled = self.isAuthenticated;
-  item.commandID = GoogleServicesSettingsCommandIDToggleHistorySync;
-  return item;
-}
-
-// Creates SyncPasswordsItemType item.
-- (CollectionViewItem*)syncPasswordsItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncPasswordsItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_PASSWORD_TEXT);
-  item.enabled = self.isAuthenticated;
-  item.commandID = GoogleServicesSettingsCommandIDTogglePasswordsSync;
-  return item;
-}
-
-// Creates SyncOpenTabsItemType item.
-- (CollectionViewItem*)syncOpenTabsItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncOpenTabsItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_OPENTABS_TEXT);
-  item.enabled = self.isAuthenticated;
-  item.commandID = GoogleServicesSettingsCommandIDToggleOpenTabsSync;
-  return item;
-}
-
-// Creates SyncAutofillItemType item.
-- (CollectionViewItem*)syncAutofillItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncAutofillItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTOFILL_TEXT);
-  item.enabled = self.isAuthenticated;
-  item.commandID = GoogleServicesSettingsCommandIDToggleAutofillSync;
-  return item;
-}
-
-// Creates SyncReadingListItemType item.
-- (CollectionViewItem*)syncReadingListItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncReadingListItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_READING_LIST_TEXT);
-  item.enabled = self.isAuthenticated;
-  item.commandID = GoogleServicesSettingsCommandIDToggleReadingListSync;
-  return item;
-}
-
-// Creates SyncActivityAndInteractionsItemType item.
-- (CollectionViewItem*)syncActivityAndInteractionsItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:SyncActivityAndInteractionsItemType];
-  item.text = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_ACTIVITY_AND_INTERACTIONS_TEXT);
-  item.detailText = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_ACTIVITY_AND_INTERACTIONS_DETAIL);
-  item.enabled = self.isAuthenticated;
-  item.commandID =
-      GoogleServicesSettingsCommandIDToggleActivityAndInteractionsService;
-  return item;
-}
-
-// Creates SyncGoogleActivityControlsItemType item.
-- (CollectionViewItem*)syncGoogleActivityControlsItem {
-  CollectionViewTextItem* item = [[CollectionViewTextItem alloc]
-      initWithType:SyncGoogleActivityControlsItemType];
-  item.text = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_GOOGLE_ACTIVITY_CONTROL_TEXT);
-  item.numberOfTextLines = 0;
-  if (!self.isAuthenticated)
-    item.textColor = [[MDCPalette greyPalette] tint500];
-  item.detailText = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_GOOGLE_ACTIVITY_CONTROL_DETAIL);
-  item.numberOfDetailTextLines = 0;
-  item.accessoryType = MDCCollectionViewCellAccessoryDisclosureIndicator;
-  item.commandID = GoogleServicesSettingsCommandIDOpenGoogleActivityPage;
-  return item;
-}
-
-// Creates EncryptionItemType item.
-- (CollectionViewItem*)encryptionItem {
-  CollectionViewTextItem* item =
-      [[CollectionViewTextItem alloc] initWithType:EncryptionItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_ENCRYPTION_TEXT);
-  item.numberOfTextLines = 0;
-  if (!self.isAuthenticated)
-    item.textColor = [[MDCPalette greyPalette] tint500];
-  item.numberOfDetailTextLines = 0;
-  item.accessoryType = MDCCollectionViewCellAccessoryDisclosureIndicator;
-  item.commandID = GoogleServicesSettingsCommandIDOpenEncryptionDialog;
-  return item;
-}
-
-// Creates ManageSyncedDataItemType item.
-- (CollectionViewItem*)manageSyncedDataItem {
-  CollectionViewTextItem* item =
-      [[CollectionViewTextItem alloc] initWithType:ManageSyncedDataItemType];
-  item.text =
-      GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_MANAGED_SYNC_DATA_TEXT);
-  item.numberOfTextLines = 0;
-  if (!self.isAuthenticated)
-    item.textColor = [[MDCPalette greyPalette] tint500];
-  item.commandID = GoogleServicesSettingsCommandIDOpenManageSyncedDataPage;
-  return item;
+  for (CollectionViewItem* item in self.personalizedItems) {
+    [model addItem:item toSectionWithIdentifier:PersonalizedSectionIdentifier];
+  }
+  [self updatePersonalizedSection];
 }
 
 // Loads NonPersonalizedSectionIdentifier section.
@@ -286,88 +187,20 @@
   [model setSectionIdentifier:NonPersonalizedSectionIdentifier
                  collapsedKey:kGoogleServicesSettingsNonPersonalizedSectionKey];
   SettingsCollapsibleItem* nonPersonalizedServicesItem =
-      [self nonPersonalizedServicesItem];
+      self.nonPersonalizedServicesItem;
   [model addItem:nonPersonalizedServicesItem
       toSectionWithIdentifier:NonPersonalizedSectionIdentifier];
-  BOOL collapsed = self.isAuthenticated ? [self isConsentGiven] : NO;
+  BOOL collapsed = self.isAuthenticated ? self.isConsentGiven : NO;
   nonPersonalizedServicesItem.collapsed = collapsed;
   [model setSection:NonPersonalizedSectionIdentifier collapsed:collapsed];
-  [model addItem:[self autocompleteSearchesAndURLsItem]
-      toSectionWithIdentifier:NonPersonalizedSectionIdentifier];
-  [model addItem:[self preloadPagesItem]
-      toSectionWithIdentifier:NonPersonalizedSectionIdentifier];
-  [model addItem:[self improveChromeItem]
-      toSectionWithIdentifier:NonPersonalizedSectionIdentifier];
-  [model addItem:[self betterSearchAndBrowsingItemType]
-      toSectionWithIdentifier:NonPersonalizedSectionIdentifier];
+  for (CollectionViewItem* item in self.nonPersonalizedItems) {
+    [model addItem:item
+        toSectionWithIdentifier:NonPersonalizedSectionIdentifier];
+  }
+  [self updateNonPersonalizedSection];
 }
 
-// Creates NonPersonalizedServicesItemType item.
-- (SettingsCollapsibleItem*)nonPersonalizedServicesItem {
-  SettingsCollapsibleItem* item = [[SettingsCollapsibleItem alloc]
-      initWithType:NonPersonalizedServicesItemType];
-  item.text = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_NON_PERSONALIZED_SERVICES_TEXT);
-  item.numberOfTextLines = 0;
-  item.detailText = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_NON_PERSONALIZED_SERVICES_DETAIL);
-  item.numberOfDetailTextLines = 0;
-  return item;
-}
-
-// Creates AutocompleteSearchesAndURLsItemType item.
-- (CollectionViewItem*)autocompleteSearchesAndURLsItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:AutocompleteSearchesAndURLsItemType];
-  item.text = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTOCOMPLETE_SEARCHES_AND_URLS_TEXT);
-  item.detailText = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTOCOMPLETE_SEARCHES_AND_URLS_DETAIL);
-  item.commandID =
-      GoogleServicesSettingsCommandIDToggleAutocompleteSearchesService;
-  item.enabled = YES;
-  return item;
-}
-
-// Creates PreloadPagesItemType item.
-- (CollectionViewItem*)preloadPagesItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:PreloadPagesItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_PRELOAD_PAGES_TEXT);
-  item.detailText =
-      GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_PRELOAD_PAGES_DETAIL);
-  item.enabled = YES;
-  item.commandID = GoogleServicesSettingsCommandIDTogglePreloadPagesService;
-  return item;
-}
-
-// Creates ImproveChromeItemType item.
-- (CollectionViewItem*)improveChromeItem {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:ImproveChromeItemType];
-  item.text = GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_TEXT);
-  item.detailText =
-      GetNSString(IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_DETAIL);
-  item.enabled = YES;
-  item.commandID = GoogleServicesSettingsCommandIDToggleImproveChromeService;
-  return item;
-}
-
-// Creates BetterSearchAndBrowsingItemType item.
-- (CollectionViewItem*)betterSearchAndBrowsingItemType {
-  SyncSwitchItem* item =
-      [[SyncSwitchItem alloc] initWithType:BetterSearchAndBrowsingItemType];
-  item.text = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_TEXT);
-  item.detailText = GetNSString(
-      IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_DETAIL);
-  item.enabled = YES;
-  item.commandID =
-      GoogleServicesSettingsCommandIDToggleBetterSearchAndBrowsingService;
-  return item;
-}
-
-#pragma mark - Private
+#pragma mark - Properties
 
 - (BOOL)isAuthenticated {
   return self.authService->IsAuthenticated();
@@ -377,6 +210,272 @@
   return self.prefService->GetBoolean(kUnifiedConsentGiven);
 }
 
+- (CollectionViewItem*)syncEverythingItem {
+  if (!_syncEverythingItem) {
+    _syncEverythingItem = [self
+        switchItemWithItemType:SyncEverythingItemType
+                  textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_EVERYTHING
+                detailStringID:0
+                     commandID:
+                         GoogleServicesSettingsCommandIDToggleSyncEverything
+                      dataType:0];
+  }
+  return _syncEverythingItem;
+}
+
+- (SettingsCollapsibleItem*)syncPersonalizationItem {
+  if (!_syncPersonalizationItem) {
+    _syncPersonalizationItem = [self
+        collapsibleItemWithItemType:SyncPersonalizationItemType
+                       textStringID:
+                           IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_PERSONALIZATION_TEXT
+                     detailStringID:
+                         IDS_IOS_GOOGLE_SERVICES_SETTINGS_SYNC_PERSONALIZATION_DETAIL];
+  }
+  return _syncPersonalizationItem;
+}
+
+- (ItemArray)personalizedItems {
+  if (!_personalizedItems) {
+    SyncSwitchItem* syncBookmarksItem = [self
+        switchItemWithItemType:SyncBookmarksItemType
+                  textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_BOOKMARKS_TEXT
+                detailStringID:0
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncBookmarks];
+    SyncSwitchItem* syncHistoryItem = [self
+        switchItemWithItemType:SyncHistoryItemType
+                  textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_HISTORY_TEXT
+                detailStringID:0
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncOmniboxHistory];
+    SyncSwitchItem* syncPasswordsItem = [self
+        switchItemWithItemType:SyncPasswordsItemType
+                  textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_PASSWORD_TEXT
+                detailStringID:0
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncPasswords];
+    SyncSwitchItem* syncOpenTabsItem = [self
+        switchItemWithItemType:SyncOpenTabsItemType
+                  textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_OPENTABS_TEXT
+                detailStringID:0
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncOpenTabs];
+    SyncSwitchItem* syncAutofillItem = [self
+        switchItemWithItemType:SyncAutofillItemType
+                  textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTOFILL_TEXT
+                detailStringID:0
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncAutofill];
+    SyncSwitchItem* syncReadingListItem = [self
+        switchItemWithItemType:SyncReadingListItemType
+                  textStringID:
+                      IDS_IOS_GOOGLE_SERVICES_SETTINGS_READING_LIST_TEXT
+                detailStringID:0
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncReadingList];
+    SyncSwitchItem* syncActivityAndInteractionsItem = [self
+        switchItemWithItemType:SyncActivityAndInteractionsItemType
+                  textStringID:
+                      IDS_IOS_GOOGLE_SERVICES_SETTINGS_ACTIVITY_AND_INTERACTIONS_TEXT
+                detailStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_ACTIVITY_AND_INTERACTIONS_DETAIL
+                     commandID:GoogleServicesSettingsCommandIDToggleDataTypeSync
+                      dataType:SyncSetupService::kSyncUserEvent];
+    CollectionViewTextItem* syncGoogleActivityControlsItem = [self
+        textItemWithItemType:SyncGoogleActivityControlsItemType
+                textStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_GOOGLE_ACTIVITY_CONTROL_TEXT
+              detailStringID:
+                  IDS_IOS_GOOGLE_SERVICES_SETTINGS_GOOGLE_ACTIVITY_CONTROL_DETAIL
+               accessoryType:MDCCollectionViewCellAccessoryDisclosureIndicator
+                   commandID:
+                       GoogleServicesSettingsCommandIDOpenGoogleActivityPage];
+    CollectionViewTextItem* encryptionItem = [self
+        textItemWithItemType:EncryptionItemType
+                textStringID:IDS_IOS_GOOGLE_SERVICES_SETTINGS_ENCRYPTION_TEXT
+              detailStringID:0
+               accessoryType:MDCCollectionViewCellAccessoryDisclosureIndicator
+                   commandID:
+                       GoogleServicesSettingsCommandIDOpenEncryptionDialog];
+    CollectionViewTextItem* manageSyncedDataItem = [self
+        textItemWithItemType:ManageSyncedDataItemType
+                textStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_MANAGED_SYNC_DATA_TEXT
+              detailStringID:0
+               accessoryType:MDCCollectionViewCellAccessoryNone
+                   commandID:
+                       GoogleServicesSettingsCommandIDOpenManageSyncedDataPage];
+    _personalizedItems = @[
+      syncBookmarksItem, syncHistoryItem, syncPasswordsItem, syncOpenTabsItem,
+      syncAutofillItem, syncReadingListItem, syncActivityAndInteractionsItem,
+      syncGoogleActivityControlsItem, encryptionItem, manageSyncedDataItem
+    ];
+  }
+  return _personalizedItems;
+}
+
+- (SettingsCollapsibleItem*)nonPersonalizedServicesItem {
+  if (!_nonPersonalizedServicesItem) {
+    _nonPersonalizedServicesItem = [self
+        collapsibleItemWithItemType:NonPersonalizedServicesItemType
+                       textStringID:
+                           IDS_IOS_GOOGLE_SERVICES_SETTINGS_NON_PERSONALIZED_SERVICES_TEXT
+                     detailStringID:
+                         IDS_IOS_GOOGLE_SERVICES_SETTINGS_NON_PERSONALIZED_SERVICES_DETAIL];
+  }
+  return _nonPersonalizedServicesItem;
+}
+
+- (ItemArray)nonPersonalizedItems {
+  if (!_nonPersonalizedItems) {
+    SyncSwitchItem* autocompleteSearchesAndURLsItem = [self
+        switchItemWithItemType:AutocompleteSearchesAndURLsItemType
+                  textStringID:
+                      IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTOCOMPLETE_SEARCHES_AND_URLS_TEXT
+                detailStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_AUTOCOMPLETE_SEARCHES_AND_URLS_DETAIL
+                     commandID:
+                         GoogleServicesSettingsCommandIDToggleAutocompleteSearchesService
+                      dataType:0];
+    SyncSwitchItem* preloadPagesItem = [self
+        switchItemWithItemType:PreloadPagesItemType
+                  textStringID:
+                      IDS_IOS_GOOGLE_SERVICES_SETTINGS_PRELOAD_PAGES_TEXT
+                detailStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_PRELOAD_PAGES_DETAIL
+                     commandID:
+                         GoogleServicesSettingsCommandIDTogglePreloadPagesService
+                      dataType:0];
+    SyncSwitchItem* improveChromeItem = [self
+        switchItemWithItemType:ImproveChromeItemType
+                  textStringID:
+                      IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_TEXT
+                detailStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_IMPROVE_CHROME_DETAIL
+                     commandID:
+                         GoogleServicesSettingsCommandIDToggleImproveChromeService
+                      dataType:0];
+    SyncSwitchItem* betterSearchAndBrowsingItemType = [self
+        switchItemWithItemType:BetterSearchAndBrowsingItemType
+                  textStringID:
+                      IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_TEXT
+                detailStringID:
+                    IDS_IOS_GOOGLE_SERVICES_SETTINGS_BETTER_SEARCH_AND_BROWSING_DETAIL
+                     commandID:
+                         GoogleServicesSettingsCommandIDToggleBetterSearchAndBrowsingService
+                      dataType:0];
+    _nonPersonalizedItems = @[
+      autocompleteSearchesAndURLsItem, preloadPagesItem, improveChromeItem,
+      betterSearchAndBrowsingItemType
+    ];
+  }
+  return _nonPersonalizedItems;
+}
+
+#pragma mark - Private
+
+// Creates a SettingsCollapsibleItem instance.
+- (SettingsCollapsibleItem*)collapsibleItemWithItemType:(NSInteger)itemType
+                                           textStringID:(int)textStringID
+                                         detailStringID:(int)detailStringID {
+  SettingsCollapsibleItem* collapsibleItem =
+      [[SettingsCollapsibleItem alloc] initWithType:itemType];
+  collapsibleItem.text = GetNSString(textStringID);
+  collapsibleItem.numberOfTextLines = 0;
+  collapsibleItem.detailText = GetNSString(detailStringID);
+  collapsibleItem.numberOfDetailTextLines = 0;
+  return collapsibleItem;
+}
+
+// Creates a SyncSwitchItem instance.
+- (SyncSwitchItem*)switchItemWithItemType:(NSInteger)itemType
+                             textStringID:(int)textStringID
+                           detailStringID:(int)detailStringID
+                                commandID:(NSInteger)commandID
+                                 dataType:(NSInteger)dataType {
+  SyncSwitchItem* switchItem = [[SyncSwitchItem alloc] initWithType:itemType];
+  switchItem.text = GetNSString(textStringID);
+  if (detailStringID)
+    switchItem.detailText = GetNSString(detailStringID);
+  switchItem.commandID = commandID;
+  switchItem.dataType = dataType;
+  return switchItem;
+}
+
+// Creates a CollectionViewTextItem instance.
+- (CollectionViewTextItem*)
+textItemWithItemType:(NSInteger)itemType
+        textStringID:(int)textStringID
+      detailStringID:(int)detailStringID
+       accessoryType:(MDCCollectionViewCellAccessoryType)accessoryType
+           commandID:(NSInteger)commandID {
+  CollectionViewTextItem* textItem =
+      [[CollectionViewTextItem alloc] initWithType:itemType];
+  textItem.text = GetNSString(textStringID);
+  textItem.accessoryType = accessoryType;
+  if (detailStringID)
+    textItem.detailText = GetNSString(detailStringID);
+  textItem.commandID = commandID;
+  return textItem;
+}
+
+// Updates the personalized section according to the user consent.
+- (void)updatePersonalizedSection {
+  BOOL enabled = self.isAuthenticated && !self.isConsentGiven;
+  [self updateSectionWithCollapsibleItem:self.syncPersonalizationItem
+                                   items:self.personalizedItems
+                                 enabled:enabled];
+}
+
+// Updates |item.on| and |item.enabled| according to its data type.
+- (void)updateSwitchValueWithItem:(SyncSwitchItem*)item enabled:(BOOL)enabled {
+  SyncSetupService::SyncableDatatype dataType =
+      static_cast<SyncSetupService::SyncableDatatype>(item.dataType);
+  syncer::ModelType modelType = self.syncSetupService->GetModelType(dataType);
+  item.on = self.syncSetupService->IsDataTypePreferred(modelType);
+  item.enabled = enabled;
+}
+
+// Updates the non-personalized section according to the user consent.
+- (void)updateNonPersonalizedSection {
+  BOOL enabled = !self.isAuthenticated || !self.isConsentGiven;
+  [self updateSectionWithCollapsibleItem:self.nonPersonalizedServicesItem
+                                   items:self.nonPersonalizedItems
+                                 enabled:enabled];
+}
+
+// Set a section (collapsible item, with all the items inside) to be enabled
+// or disabled.
+- (void)updateSectionWithCollapsibleItem:
+            (SettingsCollapsibleItem*)collapsibleItem
+                                   items:(ItemArray)items
+                                 enabled:(BOOL)enabled {
+  UIColor* textColor = enabled ? nil : [[MDCPalette greyPalette] tint500];
+  collapsibleItem.textColor = textColor;
+  for (CollectionViewItem* item in items) {
+    if ([item isKindOfClass:[SyncSwitchItem class]]) {
+      SyncSwitchItem* switchItem = base::mac::ObjCCast<SyncSwitchItem>(item);
+      if (switchItem.commandID ==
+          GoogleServicesSettingsCommandIDToggleDataTypeSync) {
+        SyncSetupService::SyncableDatatype dataType =
+            static_cast<SyncSetupService::SyncableDatatype>(
+                switchItem.dataType);
+        syncer::ModelType modelType =
+            self.syncSetupService->GetModelType(dataType);
+        switchItem.on = self.syncSetupService->IsDataTypePreferred(modelType);
+      }
+      switchItem.enabled = enabled;
+    } else if ([item isKindOfClass:[CollectionViewTextItem class]]) {
+      CollectionViewTextItem* textItem =
+          base::mac::ObjCCast<CollectionViewTextItem>(item);
+      textItem.textColor = textColor;
+    } else {
+      NOTREACHED();
+    }
+  }
+}
+
 #pragma mark - GoogleServicesSettingsViewControllerModelDelegate
 
 - (void)googleServicesSettingsViewControllerLoadModel:
@@ -392,40 +491,20 @@
 
 #pragma mark - GoogleServicesSettingsCommandHandler
 
-- (void)toggleSyncEverythingWithValue:(BOOL)on {
-  // Needs to be implemented.
+- (void)toggleSyncEverythingWithValue:(BOOL)value {
+  if (value == self.isConsentGiven)
+    return;
+  // Mark the switch has being animated to avoid being reloaded.
+  base::AutoReset<BOOL> autoReset(&_syncEverythingSwitchBeingAnimated, YES);
+  self.prefService->SetBoolean(kUnifiedConsentGiven, value);
 }
 
-- (void)toggleBookmarksSyncWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)toggleHistorySyncWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)togglePasswordsSyncWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)toggleOpenTabSyncWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)toggleAutofillWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)toggleSettingsWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)toggleReadingListWithValue:(BOOL)on {
-  // Needs to be implemented.
-}
-
-- (void)toggleActivityAndInteractionsServiceWithValue:(BOOL)on {
-  // Needs to be implemented.
+- (void)toggleSyncDataSync:(NSInteger)dataTypeInt WithValue:(BOOL)on {
+  base::AutoReset<BOOL> autoReset(&_personalizedSectionBeingAnimated, YES);
+  SyncSetupService::SyncableDatatype dataType =
+      static_cast<SyncSetupService::SyncableDatatype>(dataTypeInt);
+  syncer::ModelType modelType = self.syncSetupService->GetModelType(dataType);
+  self.syncSetupService->SetDataTypeEnabled(modelType, on);
 }
 
 - (void)toggleAutocompleteSearchesServiceWithValue:(BOOL)on {
@@ -456,4 +535,52 @@
   // Needs to be implemented.
 }
 
+#pragma mark - PrefObserverDelegate
+
+- (void)onPreferenceChanged:(const std::string&)preferenceName {
+  DCHECK_EQ(kUnifiedConsentGiven, preferenceName);
+  self.syncEverythingItem.on = self.isConsentGiven;
+  [self updatePersonalizedSection];
+  [self updateNonPersonalizedSection];
+  CollectionViewModel* model = self.consumer.collectionViewModel;
+  if (!self.isConsentGiven) {
+    // If the consent is removed, both collapsible sections should be expanded.
+    [model setSection:PersonalizedSectionIdentifier collapsed:NO];
+    [self syncPersonalizationItem].collapsed = NO;
+    [model setSection:NonPersonalizedSectionIdentifier collapsed:NO];
+    [self nonPersonalizedServicesItem].collapsed = NO;
+  }
+  // Reload sections.
+  NSMutableIndexSet* sectionIndexToReload = [NSMutableIndexSet indexSet];
+  if (!self.syncEverythingSwitchBeingAnimated) {
+    // The sync everything section can be reloaded only if the switch for
+    // syncEverythingItem is not currently animated. Otherwise the animation
+    // would be stopped before the end.
+    [sectionIndexToReload addIndex:[model sectionForSectionIdentifier:
+                                              SyncEverythingSectionIdentifier]];
+  }
+  if (!self.personalizedSectionBeingAnimated) {
+    // The sync everything section can be reloaded only if none of the switches
+    // in the personalized section are not currently animated. Otherwise the
+    // animation would be stopped before the end.
+    [sectionIndexToReload addIndex:[model sectionForSectionIdentifier:
+                                              PersonalizedSectionIdentifier]];
+  }
+  [sectionIndexToReload addIndex:[model sectionForSectionIdentifier:
+                                            NonPersonalizedSectionIdentifier]];
+  [self.consumer reloadSections:sectionIndexToReload];
+}
+
+#pragma mark - SyncObserverModelBridge
+
+- (void)onSyncStateChanged {
+  [self updatePersonalizedSection];
+  if (!self.personalizedSectionBeingAnimated) {
+    NSMutableIndexSet* sectionIndexToReload = [NSMutableIndexSet indexSet];
+    [sectionIndexToReload
+        addIndex:PersonalizedSectionIdentifier - kSectionIdentifierEnumZero];
+    [self.consumer reloadSections:sectionIndexToReload];
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/google_services_settings_view_controller.mm b/ios/chrome/browser/ui/settings/google_services_settings_view_controller.mm
index c9ec989..6ead0dd 100644
--- a/ios/chrome/browser/ui/settings/google_services_settings_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services_settings_view_controller.mm
@@ -110,29 +110,9 @@
     case GoogleServicesSettingsCommandIDToggleSyncEverything:
       [self.commandHandler toggleSyncEverythingWithValue:isOn];
       break;
-    case GoogleServicesSettingsCommandIDToggleBookmarkSync:
-      [self.commandHandler toggleBookmarksSyncWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDToggleHistorySync:
-      [self.commandHandler toggleHistorySyncWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDTogglePasswordsSync:
-      [self.commandHandler togglePasswordsSyncWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDToggleOpenTabsSync:
-      [self.commandHandler toggleOpenTabSyncWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDToggleAutofillSync:
-      [self.commandHandler toggleAutofillWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDToggleSettingsSync:
-      [self.commandHandler toggleSettingsWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDToggleReadingListSync:
-      [self.commandHandler toggleReadingListWithValue:isOn];
-      break;
-    case GoogleServicesSettingsCommandIDToggleActivityAndInteractionsService:
-      [self.commandHandler toggleActivityAndInteractionsServiceWithValue:isOn];
+    case GoogleServicesSettingsCommandIDToggleDataTypeSync:
+      [self.commandHandler toggleSyncDataSync:syncSwitchItem.dataType
+                                    WithValue:isOn];
       break;
     case GoogleServicesSettingsCommandIDToggleAutocompleteSearchesService:
       [self.commandHandler toggleAutocompleteSearchesServiceWithValue:isOn];
@@ -166,6 +146,10 @@
   return cell;
 }
 
+- (void)reloadSections:(NSIndexSet*)sections {
+  [self.collectionView reloadSections:sections];
+}
+
 #pragma mark - CollectionViewController
 
 - (void)loadModel {
@@ -248,14 +232,7 @@
       break;
     case GoogleServicesSettingsCommandIDNoOp:
     case GoogleServicesSettingsCommandIDToggleSyncEverything:
-    case GoogleServicesSettingsCommandIDToggleBookmarkSync:
-    case GoogleServicesSettingsCommandIDToggleHistorySync:
-    case GoogleServicesSettingsCommandIDTogglePasswordsSync:
-    case GoogleServicesSettingsCommandIDToggleOpenTabsSync:
-    case GoogleServicesSettingsCommandIDToggleAutofillSync:
-    case GoogleServicesSettingsCommandIDToggleSettingsSync:
-    case GoogleServicesSettingsCommandIDToggleReadingListSync:
-    case GoogleServicesSettingsCommandIDToggleActivityAndInteractionsService:
+    case GoogleServicesSettingsCommandIDToggleDataTypeSync:
     case GoogleServicesSettingsCommandIDToggleAutocompleteSearchesService:
     case GoogleServicesSettingsCommandIDTogglePreloadPagesService:
     case GoogleServicesSettingsCommandIDToggleImproveChromeService:
diff --git a/ios/chrome/browser/ui/settings/passphrase_collection_view_controller_test.mm b/ios/chrome/browser/ui/settings/passphrase_collection_view_controller_test.mm
index 5ef31dd9..b730161 100644
--- a/ios/chrome/browser/ui/settings/passphrase_collection_view_controller_test.mm
+++ b/ios/chrome/browser/ui/settings/passphrase_collection_view_controller_test.mm
@@ -87,8 +87,8 @@
   // Set up non-default return values for our sync service mock.
   ON_CALL(*fake_sync_service_, IsPassphraseRequired())
       .WillByDefault(Return(true));
-  ON_CALL(*fake_sync_service_, GetState())
-      .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+  ON_CALL(*fake_sync_service_, GetTransportState())
+      .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
 
   ios::FakeChromeIdentityService* identityService =
       ios::FakeChromeIdentityService::GetInstanceFromChromeProvider();
diff --git a/ios/chrome/browser/ui/settings/password_exporter.mm b/ios/chrome/browser/ui/settings/password_exporter.mm
index 97a32cc..dcd8315a 100644
--- a/ios/chrome/browser/ui/settings/password_exporter.mm
+++ b/ios/chrome/browser/ui/settings/password_exporter.mm
@@ -9,7 +9,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "components/autofill/core/common/password_form.h"
diff --git a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
index 6ee06da4..261d593e9 100644
--- a/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/passwords_settings_egtest.mm
@@ -789,7 +789,9 @@
 // Checks that deleting a duplicated blacklisted form from password details view
 // goes back to the list-of-passwords view which doesn't display that form
 // anymore.
-- (void)testDuplicatedBlacklistedFormDeletionInDetailView {
+// TODO(crbug.com/871223): Disabled because the PasswordStore no longer allows
+// adding duplicate blacklisted forms.
+- (void)DISABLED_testDuplicatedBlacklistedFormDeletionInDetailView {
   // Save blacklisted form to be deleted later.
   PasswordForm blacklisted;
   blacklisted.origin = GURL("https://blacklisted.com");
diff --git a/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller_unittest.mm
index ba1fc49..c5a8e9f 100644
--- a/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/sync_encryption_collection_view_controller_unittest.mm
@@ -53,8 +53,8 @@
         static_cast<browser_sync::ProfileSyncServiceMock*>(
             ProfileSyncServiceFactory::GetForBrowserState(
                 chrome_browser_state_.get()));
-    ON_CALL(*mock_profile_sync_service_, GetState())
-        .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+    ON_CALL(*mock_profile_sync_service_, GetTransportState())
+        .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
     ON_CALL(*mock_profile_sync_service_, IsUsingSecondaryPassphrase())
         .WillByDefault(Return(true));
 
diff --git a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm
index 3f4ddbf..d445e975 100644
--- a/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm
+++ b/ios/chrome/browser/ui/settings/sync_settings_collection_view_controller_unittest.mm
@@ -189,8 +189,8 @@
         static_cast<browser_sync::ProfileSyncServiceMock*>(
             ProfileSyncServiceFactory::GetForBrowserState(
                 chrome_browser_state_.get()));
-    ON_CALL(*mock_profile_sync_service_, GetState())
-        .WillByDefault(Return(syncer::SyncService::State::ACTIVE));
+    ON_CALL(*mock_profile_sync_service_, GetTransportState())
+        .WillByDefault(Return(syncer::SyncService::TransportState::ACTIVE));
     ON_CALL(*mock_profile_sync_service_, GetRegisteredDataTypes())
         .WillByDefault(Return(syncer::ModelTypeSet()));
     mock_profile_sync_service_->Initialize();
diff --git a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
index 44f3f00..493cb9b 100644
--- a/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
+++ b/ios/chrome/browser/ui/side_swipe/card_side_swipe_view.mm
@@ -54,8 +54,9 @@
 @property(nonatomic, strong) UIImageView* topToolbarSnapshot;
 @property(nonatomic, strong) UIImageView* bottomToolbarSnapshot;
 
-@property CGFloat topMargin;
-@property NSLayoutConstraint* toolbarTopConstraint;
+@property(nonatomic, assign) CGFloat topMargin;
+@property(nonatomic, strong) NSLayoutConstraint* toolbarTopConstraint;
+@property(nonatomic, strong) NSLayoutConstraint* imageTopConstraint;
 
 @end
 
@@ -69,6 +70,7 @@
 @synthesize bottomToolbarSnapshot = _bottomToolbarSnapshot;
 @synthesize topMargin = _topMargin;
 @synthesize toolbarTopConstraint = _toolbarTopConstraint;
+@synthesize imageTopConstraint = _imageTopConstraint;
 
 - (instancetype)initWithFrame:(CGRect)frame topMargin:(CGFloat)topMargin {
   self = [super initWithFrame:frame];
@@ -110,9 +112,11 @@
       _toolbarTopConstraint.constant = -StatusBarHeight();
     }
 
+    _imageTopConstraint =
+        [_image.topAnchor constraintEqualToAnchor:self.topAnchor
+                                         constant:topMargin];
     [constraints addObjectsFromArray:@[
-      [[_image topAnchor] constraintEqualToAnchor:self.topAnchor
-                                         constant:topMargin],
+      _imageTopConstraint,
       [[_image bottomAnchor] constraintEqualToAnchor:self.bottomAnchor],
       _toolbarTopConstraint,
       [_bottomToolbarSnapshot.bottomAnchor
@@ -151,6 +155,11 @@
   }
 }
 
+- (void)setTopMargin:(CGFloat)topMargin {
+  _topMargin = topMargin;
+  self.imageTopConstraint.constant = topMargin;
+}
+
 - (void)setImage:(UIImage*)image {
   [_image setImage:image];
   [self updateImageBoundsAndZoom];
@@ -252,34 +261,33 @@
   return self;
 }
 
+- (void)setTopMargin:(CGFloat)topMargin {
+  _topMargin = topMargin;
+  _leftCard.topMargin = topMargin;
+  _rightCard.topMargin = topMargin;
+}
+
 - (void)updateConstraints {
   [super updateConstraints];
   self.backgroundTopConstraint.constant = -StatusBarHeight();
 }
 
-- (CGRect)cardFrame {
-  return self.bounds;
+- (CGFloat)cardWidth {
+  return CGRectGetWidth(self.bounds);
 }
 
 // Set up left and right card views depending on current tab and swipe
 // direction.
 - (void)updateViewsForDirection:(UISwipeGestureRecognizerDirection)direction {
   _direction = direction;
-  CGRect cardFrame = [self cardFrame];
   NSUInteger currentIndex = [model_ indexOfTab:model_.currentTab];
   CGFloat offset = UseRTLLayout() ? -1 : 1;
   if (_direction == UISwipeGestureRecognizerDirectionRight) {
     [self setupCard:_rightCard withIndex:currentIndex];
-    [_rightCard setFrame:cardFrame];
     [self setupCard:_leftCard withIndex:currentIndex - offset];
-    cardFrame.origin.x -= cardFrame.size.width + kCardHorizontalSpacing;
-    [_leftCard setFrame:cardFrame];
   } else {
     [self setupCard:_leftCard withIndex:currentIndex];
-    [_leftCard setFrame:cardFrame];
     [self setupCard:_rightCard withIndex:currentIndex + offset];
-    cardFrame.origin.x += cardFrame.size.width + kCardHorizontalSpacing;
-    [_rightCard setFrame:cardFrame];
   }
 }
 
@@ -336,40 +344,26 @@
       });
 }
 
-// Place cards around |currentPoint_.x|, and lean towards each card near the
-// X edges of |bounds|.  Shrink cards as they are dragged towards the middle of
-// the |bounds|, and edge cards only drag |kEdgeCardDragPercentage| of |bounds|.
+// Move cards according to |currentPoint_.x|. Edge cards only drag
+// |kEdgeCardDragPercentage| of |bounds|.
 - (void)updateCardPositions {
-  CGRect bounds = [self cardFrame];
-  [_rightCard setFrame:bounds];
-  [_leftCard setFrame:bounds];
+  CGFloat width = [self cardWidth];
 
-  CGFloat width = CGRectGetWidth([self cardFrame]);
-  CGPoint center = CGPointMake(bounds.origin.x + bounds.size.width / 2,
-                               bounds.origin.y + bounds.size.height / 2);
   if ([self isEdgeSwipe]) {
     // If an edge card, don't allow the card to be dragged across the screen.
     // Instead, drag across |kEdgeCardDragPercentage| of the screen.
-    center.x = currentPoint_.x - width / 2 -
-               (currentPoint_.x - width) / width *
-                   (width * (1 - kEdgeCardDragPercentage));
-    [_leftCard setCenter:center];
-    center.x = currentPoint_.x / width * (width * kEdgeCardDragPercentage) +
-               bounds.size.width / 2;
-    [_rightCard setCenter:center];
+    _rightCard.transform = CGAffineTransformMakeTranslation(
+        (currentPoint_.x) * kEdgeCardDragPercentage, 0);
+    _leftCard.transform = CGAffineTransformMakeTranslation(
+        (currentPoint_.x - width) * kEdgeCardDragPercentage, 0);
   } else {
-    // Place cards around the finger as it is dragged across the screen.
-    // Place the finger between the cards in the middle of the screen, on the
-    // right card border when on the left side of the screen, and on the left
-    // card border when on the right side of the screen.
     CGFloat rightXBuffer = kCardHorizontalSpacing * currentPoint_.x / width;
     CGFloat leftXBuffer = kCardHorizontalSpacing - rightXBuffer;
 
-    center.x = currentPoint_.x - leftXBuffer - width / 2;
-    [_leftCard setCenter:center];
-
-    center.x = currentPoint_.x + rightXBuffer + width / 2;
-    [_rightCard setCenter:center];
+    _rightCard.transform =
+        CGAffineTransformMakeTranslation(currentPoint_.x + rightXBuffer, 0);
+    _leftCard.transform = CGAffineTransformMakeTranslation(
+        -width + currentPoint_.x - leftXBuffer, 0);
   }
 }
 
@@ -380,7 +374,7 @@
 
   // Since it's difficult to touch the very edge of the screen (touches tend to
   // sit near x ~ 4), push the touch towards the edge.
-  CGFloat width = CGRectGetWidth([self cardFrame]);
+  CGFloat width = [self cardWidth];
   CGFloat half = floor(width / 2);
   CGFloat padding = floor(std::abs(currentPoint_.x - half) / half);
 
@@ -420,38 +414,41 @@
   if (currentIndex == NSNotFound)
     return [_delegate sideSwipeViewDismissAnimationDidEnd:self];
 
-  CGRect finalSize = [self cardFrame];
-  CGFloat width = CGRectGetWidth([self cardFrame]);
-  CGRect leftFrame, rightFrame;
+  CGFloat width = [self cardWidth];
+  CGAffineTransform rightTransform, leftTransform;
   SwipeView* dominantCard;
   Tab* destinationTab = model_.currentTab;
   CGFloat offset = UseRTLLayout() ? -1 : 1;
   if (_direction == UISwipeGestureRecognizerDirectionRight) {
     // If swipe is right and |currentPoint_.x| is over the first 1/3, move left.
     if (currentPoint_.x > width / 3.0 && ![self isEdgeSwipe]) {
+      rightTransform =
+          CGAffineTransformMakeTranslation(width + kCardHorizontalSpacing, 0);
+      leftTransform = CGAffineTransformIdentity;
       destinationTab = [model_ tabAtIndex:currentIndex - offset];
       dominantCard = _leftCard;
-      rightFrame = leftFrame = finalSize;
-      rightFrame.origin.x += rightFrame.size.width + kCardHorizontalSpacing;
       base::RecordAction(UserMetricsAction("MobileStackSwipeCompleted"));
     } else {
+      leftTransform =
+          CGAffineTransformMakeTranslation(-width - kCardHorizontalSpacing, 0);
+      rightTransform = CGAffineTransformIdentity;
       dominantCard = _rightCard;
-      leftFrame = rightFrame = finalSize;
-      leftFrame.origin.x -= rightFrame.size.width + kCardHorizontalSpacing;
       base::RecordAction(UserMetricsAction("MobileStackSwipeCancelled"));
     }
   } else {
     // If swipe is left and |currentPoint_.x| is over the first 1/3, move right.
     if (currentPoint_.x < (width / 3.0) * 2.0 && ![self isEdgeSwipe]) {
+      leftTransform =
+          CGAffineTransformMakeTranslation(-width - kCardHorizontalSpacing, 0);
+      rightTransform = CGAffineTransformIdentity;
       destinationTab = [model_ tabAtIndex:currentIndex + offset];
       dominantCard = _rightCard;
-      leftFrame = rightFrame = finalSize;
-      leftFrame.origin.x -= rightFrame.size.width + kCardHorizontalSpacing;
       base::RecordAction(UserMetricsAction("MobileStackSwipeCompleted"));
     } else {
+      rightTransform =
+          CGAffineTransformMakeTranslation(width + kCardHorizontalSpacing, 0);
+      leftTransform = CGAffineTransformIdentity;
       dominantCard = _leftCard;
-      rightFrame = leftFrame = finalSize;
-      rightFrame.origin.x += rightFrame.size.width + kCardHorizontalSpacing;
       base::RecordAction(UserMetricsAction("MobileStackSwipeCancelled"));
     }
   }
@@ -467,10 +464,8 @@
 
   [UIView animateWithDuration:kAnimationDuration
       animations:^{
-        [_leftCard setTransform:CGAffineTransformIdentity];
-        [_rightCard setTransform:CGAffineTransformIdentity];
-        [_leftCard setFrame:leftFrame];
-        [_rightCard setFrame:rightFrame];
+        _leftCard.transform = leftTransform;
+        _rightCard.transform = rightTransform;
       }
       completion:^(BOOL finished) {
         [_leftCard setImage:nil];
diff --git a/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.cc b/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.cc
index 14f48f3..3646feb 100644
--- a/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.cc
+++ b/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.cc
@@ -7,19 +7,23 @@
 #include "components/metrics/metrics_pref_names.h"
 #include "components/prefs/pref_member.h"
 #include "components/prefs/pref_service.h"
+#include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/pref_names.h"
 
 UnifiedConsentServiceClientImpl::UnifiedConsentServiceClientImpl(
-    PrefService* pref_service)
-    : pref_service_(pref_service) {
-  DCHECK(pref_service_);
+    PrefService* user_pref_service,
+    PrefService* local_pref_service)
+    : user_pref_service_(user_pref_service),
+      local_pref_service_(local_pref_service) {
+  DCHECK(user_pref_service_);
   ObserveServicePrefChange(Service::kMetricsReporting,
                            metrics::prefs::kMetricsReportingEnabled,
-                           pref_service_);
+                           local_pref_service);
   ObserveServicePrefChange(Service::kNetworkPrediction,
-                           prefs::kNetworkPredictionEnabled, pref_service_);
+                           prefs::kNetworkPredictionEnabled,
+                           user_pref_service_);
   ObserveServicePrefChange(Service::kSearchSuggest,
-                           prefs::kSearchSuggestEnabled, pref_service_);
+                           prefs::kSearchSuggestEnabled, user_pref_service_);
 }
 
 UnifiedConsentServiceClientImpl::ServiceState
@@ -29,18 +33,18 @@
     case Service::kMetricsReporting: {
       BooleanPrefMember metrics_pref;
       metrics_pref.Init(metrics::prefs::kMetricsReportingEnabled,
-                        pref_service_);
+                        local_pref_service_);
       enabled = metrics_pref.GetValue();
       break;
     }
     case Service::kNetworkPrediction: {
       BooleanPrefMember network_pref;
-      network_pref.Init(prefs::kNetworkPredictionEnabled, pref_service_);
+      network_pref.Init(prefs::kNetworkPredictionEnabled, user_pref_service_);
       enabled = network_pref.GetValue();
       break;
     }
     case Service::kSearchSuggest:
-      enabled = pref_service_->GetBoolean(prefs::kSearchSuggestEnabled);
+      enabled = user_pref_service_->GetBoolean(prefs::kSearchSuggestEnabled);
       break;
     case Service::kAlternateErrorPages:
     case Service::kSafeBrowsing:
@@ -57,24 +61,26 @@
     case Service::kMetricsReporting: {
       BooleanPrefMember metrics_pref;
       metrics_pref.Init(metrics::prefs::kMetricsReportingEnabled,
-                        pref_service_);
+                        local_pref_service_);
       metrics_pref.SetValue(enabled);
       BooleanPrefMember metrics_wifi_pref;
-      metrics_wifi_pref.Init(prefs::kMetricsReportingWifiOnly, pref_service_);
+      metrics_wifi_pref.Init(prefs::kMetricsReportingWifiOnly,
+                             local_pref_service_);
       metrics_wifi_pref.SetValue(enabled);
       break;
     }
     case Service::kNetworkPrediction: {
       BooleanPrefMember network_pref;
-      network_pref.Init(prefs::kNetworkPredictionEnabled, pref_service_);
+      network_pref.Init(prefs::kNetworkPredictionEnabled, user_pref_service_);
       network_pref.SetValue(enabled);
       BooleanPrefMember network_wifi_pref;
-      network_wifi_pref.Init(prefs::kNetworkPredictionWifiOnly, pref_service_);
+      network_wifi_pref.Init(prefs::kNetworkPredictionWifiOnly,
+                             user_pref_service_);
       network_wifi_pref.SetValue(enabled);
       break;
     }
     case Service::kSearchSuggest:
-      pref_service_->SetBoolean(prefs::kSearchSuggestEnabled, enabled);
+      user_pref_service_->SetBoolean(prefs::kSearchSuggestEnabled, enabled);
       break;
     case Service::kAlternateErrorPages:
     case Service::kSafeBrowsing:
diff --git a/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.h b/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.h
index 3ba4145..8bc1286 100644
--- a/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.h
+++ b/ios/chrome/browser/unified_consent/unified_consent_service_client_impl.h
@@ -14,7 +14,8 @@
 class UnifiedConsentServiceClientImpl
     : public unified_consent::UnifiedConsentServiceClient {
  public:
-  explicit UnifiedConsentServiceClientImpl(PrefService* pref_service);
+  explicit UnifiedConsentServiceClientImpl(PrefService* user_pref_service,
+                                           PrefService* local_pref_service);
   ~UnifiedConsentServiceClientImpl() override = default;
 
   // unified_consent::UnifiedConsentServiceClient overrides:
@@ -22,7 +23,8 @@
   void SetServiceEnabled(Service service, bool enabled) override;
 
  private:
-  PrefService* pref_service_;
+  PrefService* user_pref_service_;
+  PrefService* local_pref_service_;
 
   DISALLOW_COPY_AND_ASSIGN(UnifiedConsentServiceClientImpl);
 };
diff --git a/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc b/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc
index 83070c8..ba954b4 100644
--- a/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc
+++ b/ios/chrome/browser/unified_consent/unified_consent_service_factory.cc
@@ -8,6 +8,7 @@
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/unified_consent/unified_consent_service.h"
+#include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/signin/identity_manager_factory.h"
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
@@ -53,13 +54,16 @@
 
   ios::ChromeBrowserState* browser_state =
       ios::ChromeBrowserState::FromBrowserState(context);
-  PrefService* pref_service = browser_state->GetPrefs();
+  PrefService* user_pref_service = browser_state->GetPrefs();
+  PrefService* local_pref_service = GetApplicationContext()->GetLocalState();
   std::unique_ptr<unified_consent::UnifiedConsentServiceClient> service_client =
-      std::make_unique<UnifiedConsentServiceClientImpl>(pref_service);
+      std::make_unique<UnifiedConsentServiceClientImpl>(user_pref_service,
+                                                        local_pref_service);
   identity::IdentityManager* identity_manager =
       IdentityManagerFactory::GetForBrowserState(browser_state);
   syncer::SyncService* sync_service =
       ProfileSyncServiceFactory::GetForBrowserState(browser_state);
   return std::make_unique<unified_consent::UnifiedConsentService>(
-      std::move(service_client), pref_service, identity_manager, sync_service);
+      std::move(service_client), user_pref_service, identity_manager,
+      sync_service);
 }
diff --git a/ios/chrome/browser/web/BUILD.gn b/ios/chrome/browser/web/BUILD.gn
index 2004129..162b1db 100644
--- a/ios/chrome/browser/web/BUILD.gn
+++ b/ios/chrome/browser/web/BUILD.gn
@@ -13,6 +13,8 @@
     "error_page_util.mm",
     "font_size_tab_helper.h",
     "font_size_tab_helper.mm",
+    "image_fetch_tab_helper.h",
+    "image_fetch_tab_helper.mm",
     "load_timing_tab_helper.h",
     "load_timing_tab_helper.mm",
     "mailto_handler.h",
@@ -86,6 +88,8 @@
     "error_page_util_unittest.mm",
     "font_size_js_unittest.mm",
     "font_size_tab_helper_unittest.mm",
+    "image_fetch_js_unittest.mm",
+    "image_fetch_tab_helper_unittest.mm",
     "load_timing_tab_helper_unittest.mm",
     "mailto_handler_gmail_unittest.mm",
     "mailto_handler_inbox_unittest.mm",
@@ -100,6 +104,7 @@
   ]
   deps = [
     ":accessibility",
+    ":image_fetch",
     ":tab_helper_delegates",
     ":test_support",
     ":web",
@@ -112,6 +117,8 @@
     "//ios/web",
     "//ios/web/public/test",
     "//ios/web/public/test/fakes",
+    "//ios/web/public/test/http_server",
+    "//net:test_support",
     "//testing/gmock",
     "//testing/gtest",
     "//third_party/ocmock",
@@ -136,6 +143,7 @@
     "//components/autofill/ios/form_util/resources/fill.js",
     "//ios/chrome/browser/passwords/resources/password_controller.js",
     "resources/chrome_bundle_main_frame.js",
+    "resources/image_fetch.js",
     "resources/print.js",
   ]
 
@@ -163,6 +171,12 @@
   ]
 }
 
+js_compile_checked("image_fetch") {
+  sources = [
+    "resources/image_fetch.js",
+  ]
+}
+
 source_set("web_internal") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
diff --git a/ios/chrome/browser/web/image_fetch_js_unittest.mm b/ios/chrome/browser/web/image_fetch_js_unittest.mm
new file mode 100644
index 0000000..c536d3a
--- /dev/null
+++ b/ios/chrome/browser/web/image_fetch_js_unittest.mm
@@ -0,0 +1,203 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import <UIKit/UIKit.h>
+
+#include "base/base64.h"
+#include "base/macros.h"
+#import "base/test/ios/wait_util.h"
+#import "ios/web/public/test/web_js_test.h"
+#import "ios/web/public/test/web_test_with_web_state.h"
+#import "ios/web/public/web_state/web_state.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#import "testing/gtest_mac.h"
+#include "url/gurl.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using base::test::ios::WaitUntilConditionOrTimeout;
+using base::test::ios::kWaitForJSCompletionTimeout;
+
+namespace {
+// Base64 data of a PNG image.
+const char kImageBase64[] =
+    "iVBORw0KGgoAAAANSUhEUgAAAIQAAAB+AQMAAADfgyubAAAABlBMVEX+/"
+    "v4ODg5o52ONAAABfElEQVRIx+3UO27DMAwAUBoeNBQIe4DAvkLHFDDim/"
+    "QMHp2lVpAhY49Ubb2GgFxARZcMqVjKn1SUgl6g4WBAz6QByRQB7vGf48Hy4yWWgUV5IQagvsRC"
+    "LG0sRZAhljIInRMphCjSrLEgi5IysLy7SCrOQSFrlnqIpWHZhp1c45mloVh2LH0mOyFfLJ9hJ7"
+    "EUJyGnVHily48boiPhlTpm8hZLqEAUchwFpFR1LOqmNFIU6ab1iWwy6YWskHQnhXNcluNEI4Qc"
+    "K2SNtE9E0d6kOaWhWBpFByNaY8M5OhWVi2zDDgkzWQG5RAohFqmCVNYip7DoGykG/"
+    "SaTXkip0XeZOCFK42WUx/"
+    "lwQAF+"
+    "2yBPk2wBoSYLLN0kHipAMmGn05eKIPUohV2kYdFAl3Jq1tJDD6FTyKOZryicJ6G5ERUVDmoPMB"
+    "At1/"
+    "hgx3EwLD+"
+    "sJDIQpF0Ougzl7TmIW0aGB2h5UV9vXChv7TQF5tHjpvHzO5CQX72Gcncf3vf4M34AIPQSr4HM1"
+    "a4AAAAASUVORK5CYII=";
+
+// Delay of the http response for image.
+const int kImageDelayInMs = 1000;
+
+// Request handler of the http server.
+std::unique_ptr<net::test_server::HttpResponse> HandleRequest(
+    const net::test_server::HttpRequest& request) {
+  std::string image_binary;
+  EXPECT_TRUE(base::Base64Decode(kImageBase64, &image_binary));
+
+  if (request.GetURL().path() == "/image") {
+    auto result = std::make_unique<net::test_server::BasicHttpResponse>();
+    result->set_content_type("image/png");
+    result->set_content(image_binary);
+    result->AddCustomHeader("Access-Control-Allow-Origin", "*");
+    return std::move(result);
+  }
+  if (request.GetURL().path() == "/image_delayed") {
+    auto result = std::make_unique<net::test_server::DelayedHttpResponse>(
+        base::TimeDelta::FromMilliseconds(kImageDelayInMs));
+    result->set_content_type("image/png");
+    result->set_content(image_binary);
+    result->AddCustomHeader("Access-Control-Allow-Origin", "*");
+    return std::move(result);
+  }
+  return nullptr;
+}
+
+// The ID param for calling JS, and will be regained in the message sent back.
+const int kCallJavaScriptId = 66666;
+// The command prefix for receiving messages from JS.
+const std::string kCommandPrefix = "imageFetch";
+}
+
+// Test fixture for image_fetch.js testing.
+class ImageFetchJsTest : public web::WebJsTest<web::WebTestWithWebState> {
+ protected:
+  ImageFetchJsTest()
+      : web::WebJsTest<web::WebTestWithWebState>(@[ @"image_fetch" ]) {}
+
+  void SetUp() override {
+    WebTestWithWebState::SetUp();
+    server_.RegisterDefaultHandler(base::BindRepeating(HandleRequest));
+    ASSERT_TRUE(server_.Start());
+    web_state()->AddScriptCommandCallback(
+        base::BindRepeating(&ImageFetchJsTest::OnMessageFromJavaScript,
+                            base::Unretained(this)),
+        kCommandPrefix);
+  }
+
+  void TearDown() override {
+    web_state()->RemoveScriptCommandCallback(kCommandPrefix);
+    WebTestWithWebState::TearDown();
+  }
+
+  bool OnMessageFromJavaScript(const base::DictionaryValue& message,
+                               const GURL& page_url,
+                               bool has_user_gesture,
+                               bool form_in_main_frame) {
+    message_received_ = true;
+    message_ = message.Clone();
+    return true;
+  }
+
+  net::EmbeddedTestServer server_;
+  base::Value message_;
+  bool message_received_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageFetchJsTest);
+};
+
+// Tests that __gCrWeb.imageFetch.getImageData works when the image is
+// same-domain.
+TEST_F(ImageFetchJsTest, TestGetSameDomainImageData) {
+  const GURL image_url = server_.GetURL("/image");
+  const GURL page_url = server_.GetURL("/");
+  LoadHtmlAndInject([NSString stringWithFormat:@"<html><img src='%s'></html>",
+                                               image_url.spec().c_str()],
+                    page_url);
+
+  ExecuteJavaScriptWithFormat(@"__gCrWeb.imageFetch.getImageData(%d, '%s');",
+                              kCallJavaScriptId, image_url.spec().c_str());
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return message_received_;
+  }));
+
+  ASSERT_TRUE(message_.is_dict());
+  const base::Value* id_key = message_.FindKey("id");
+  ASSERT_TRUE(id_key);
+  ASSERT_TRUE(id_key->is_double());
+  EXPECT_EQ(kCallJavaScriptId, static_cast<int>(id_key->GetDouble()));
+  // The fetched image data may not equal to original base64 data because of
+  // recompression in JavaScript. Therefore decode the returned image data and
+  // check if it can be rendered to an image.
+  const base::Value* data = message_.FindKey("data");
+  ASSERT_TRUE(data);
+  ASSERT_TRUE(data->is_string());
+  ASSERT_FALSE(data->GetString().empty());
+  std::string decoded_data;
+  ASSERT_TRUE(base::Base64Decode(data->GetString(), &decoded_data));
+  UIImage* image =
+      [UIImage imageWithData:[NSData dataWithBytes:decoded_data.c_str()
+                                            length:decoded_data.size()]];
+  EXPECT_TRUE(image);
+}
+
+// Tests that __gCrWeb.imageFetch.getImageData works when the image is
+// cross-domain.
+TEST_F(ImageFetchJsTest, TestGetCrossDomainImageData) {
+  const GURL image_url = server_.GetURL("/image");
+  // WebTestWithWebState::LoadHtml uses an HTTPS url for webpage as default. Use
+  // an HTTP url instead, because XMLHttpRequest with HTTP url sent from HTTPS
+  // website is forbidden due to the CORS policy.
+  const GURL page_url("http://chrooooome.com");
+  LoadHtmlAndInject([NSString stringWithFormat:@"<html><img src='%s'></html>",
+                                               image_url.spec().c_str()],
+                    page_url);
+
+  ExecuteJavaScriptWithFormat(@"__gCrWeb.imageFetch.getImageData(%d, '%s');",
+                              kCallJavaScriptId, image_url.spec().c_str());
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return message_received_;
+  }));
+
+  ASSERT_TRUE(message_.is_dict());
+  const base::Value* id_key = message_.FindKey("id");
+  ASSERT_TRUE(id_key);
+  ASSERT_TRUE(id_key->is_double());
+  EXPECT_EQ(kCallJavaScriptId, static_cast<int>(id_key->GetDouble()));
+  const base::Value* data = message_.FindKey("data");
+  ASSERT_TRUE(data);
+  ASSERT_TRUE(data->is_string());
+  EXPECT_EQ(kImageBase64, data->GetString());
+}
+
+// Tests that __gCrWeb.imageFetch.getImageData fails for timeout when the image
+// response is delayed. In this test the image must be cross-domain, otherwise
+// image data will be fetched from <img> by <canvas> directly.
+TEST_F(ImageFetchJsTest, TestGetDelayedImageData) {
+  const GURL image_url = server_.GetURL("/image_delayed");
+  const GURL page_url("http://chrooooome.com");
+  LoadHtmlAndInject([NSString stringWithFormat:@"<html><img src='%s'></html>",
+                                               image_url.spec().c_str()],
+                    page_url);
+
+  ExecuteJavaScriptWithFormat(@"__gCrWeb.imageFetch.getImageData(%d, '%s');",
+                              kCallJavaScriptId, image_url.spec().c_str());
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return message_received_;
+  }));
+
+  ASSERT_TRUE(message_.is_dict());
+  const base::Value* id_key = message_.FindKey("id");
+  ASSERT_TRUE(id_key);
+  ASSERT_TRUE(id_key->is_double());
+  EXPECT_EQ(kCallJavaScriptId, static_cast<int>(id_key->GetDouble()));
+  EXPECT_FALSE(message_.FindKey("data"));
+}
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper.h b/ios/chrome/browser/web/image_fetch_tab_helper.h
new file mode 100644
index 0000000..cb183b68e
--- /dev/null
+++ b/ios/chrome/browser/web/image_fetch_tab_helper.h
@@ -0,0 +1,66 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_WEB_IMAGE_FETCH_TAB_HELPER_H_
+#define IOS_CHROME_BROWSER_WEB_IMAGE_FETCH_TAB_HELPER_H_
+
+#include <unordered_map>
+
+#include "base/macros.h"
+#include "ios/web/public/web_state/web_state_observer.h"
+#import "ios/web/public/web_state/web_state_user_data.h"
+
+// Gets the image data in binary string by calling injected JavaScript.
+// Never keep a reference to this class, instead get it by
+// ImageFetchTabHelper::FromWebState everytime.
+class ImageFetchTabHelper : public web::WebStateObserver,
+                            public web::WebStateUserData<ImageFetchTabHelper> {
+ public:
+  ~ImageFetchTabHelper() override;
+
+  // Callback for GetImageData. |data| will be in binary format, or nullptr if
+  // GetImageData failed.
+  typedef base::OnceCallback<void(const std::string* data)> ImageDataCallback;
+
+  // Gets image data as binary string by trying 2 methods in following order:
+  //   1. Draw <img> to <canvas> and export its data;
+  //   2. Download the image by XMLHttpRequest and hopefully get responsed from
+  //   cache.
+  // This method should only be called from UI thread, and |url| should be equal
+  // to the resolved "src" attribute of <img>, otherwise the method 1 would
+  // fail. |callback| will be called on UI thread.
+  void GetImageData(const GURL& url, ImageDataCallback&& callback);
+
+ private:
+  friend class web::WebStateUserData<ImageFetchTabHelper>;
+
+  explicit ImageFetchTabHelper(web::WebState* web_state);
+
+  // web::WebStateObserver overrides:
+  void DidStartNavigation(web::WebState* web_state,
+                          web::NavigationContext* navigation_context) override;
+  void WebStateDestroyed(web::WebState* web_state) override;
+
+  // Handler for messages sent back from injected JavaScript.
+  bool OnImageDataReceived(const base::DictionaryValue& message,
+                           const GURL& page_url,
+                           bool has_user_gesture,
+                           bool form_in_main_frame);
+
+  // WebState this tab helper is attached to.
+  web::WebState* web_state_ = nullptr;
+
+  // Store callbacks for GetImageData, with url as key.
+  std::unordered_map<int, ImageDataCallback> callbacks_;
+
+  // |GetImageData| uses this counter as ID to match calls with callbacks. Each
+  // call on |GetImageData| will increment |call_id_| by 1 and pass it as ID
+  // when calling JavaScript. The ID will be regained in the message received in
+  // |OnImageDataReceived| and used to invoke the corresponding callback.
+  int call_id_ = 0;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageFetchTabHelper);
+};
+
+#endif  // IOS_CHROME_BROWSER_WEB_IMAGE_FETCH_TAB_HELPER_H_
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper.mm b/ios/chrome/browser/web/image_fetch_tab_helper.mm
new file mode 100644
index 0000000..994bc4966
--- /dev/null
+++ b/ios/chrome/browser/web/image_fetch_tab_helper.mm
@@ -0,0 +1,102 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/web/image_fetch_tab_helper.h"
+
+#include "base/base64.h"
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/values.h"
+#import "ios/web/public/web_state/navigation_context.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+DEFINE_WEB_STATE_USER_DATA_KEY(ImageFetchTabHelper);
+
+namespace {
+// Command prefix for injected JavaScript.
+const char kCommandPrefix[] = "imageFetch";
+}
+
+ImageFetchTabHelper::ImageFetchTabHelper(web::WebState* web_state)
+    : web_state_(web_state) {
+  web_state->AddObserver(this);
+  web_state->AddScriptCommandCallback(
+      base::BindRepeating(&ImageFetchTabHelper::OnImageDataReceived,
+                          base::Unretained(this)),
+      kCommandPrefix);
+}
+
+ImageFetchTabHelper::~ImageFetchTabHelper() = default;
+
+void ImageFetchTabHelper::DidStartNavigation(
+    web::WebState* web_state,
+    web::NavigationContext* navigation_context) {
+  if (navigation_context->IsSameDocument()) {
+    return;
+  }
+  for (auto&& pair : callbacks_)
+    std::move(pair.second).Run(nullptr);
+  callbacks_.clear();
+}
+
+void ImageFetchTabHelper::WebStateDestroyed(web::WebState* web_state) {
+  web_state->RemoveScriptCommandCallback(kCommandPrefix);
+  for (auto&& pair : callbacks_)
+    std::move(pair.second).Run(nullptr);
+  web_state->RemoveObserver(this);
+  web_state_ = nullptr;
+}
+
+void ImageFetchTabHelper::GetImageData(const GURL& url,
+                                       ImageDataCallback&& callback) {
+  ++call_id_;
+  DCHECK_EQ(callbacks_.count(call_id_), 0UL);
+  callbacks_.insert({call_id_, std::move(callback)});
+  std::string js =
+      base::StringPrintf("__gCrWeb.imageFetch.getImageData(%d, '%s')", call_id_,
+                         url.spec().c_str());
+  // TODO(crbug.com/163201): Add timeout for callback in case JavaScript does
+  // not return.
+  web_state_->ExecuteJavaScript(base::UTF8ToUTF16(js));
+}
+
+// The expected message from JavaScript has format:
+//
+// For success:
+//   {'command': 'image.getImageData',
+//    'id': id_sent_to_gCrWeb_image_getImageData,
+//    'data': image_data_in_base64}
+//
+// For failure:
+//   {'command': 'image.getImageData',
+//    'id': id_sent_to_gCrWeb_image_getImageData}
+bool ImageFetchTabHelper::OnImageDataReceived(
+    const base::DictionaryValue& message,
+    const GURL& page_url,
+    bool has_user_gesture,
+    bool form_in_main_frame) {
+  const base::Value* id_key = message.FindKey("id");
+  if (!id_key || !id_key->is_double()) {
+    return false;
+  }
+  int id_value = static_cast<int>(id_key->GetDouble());
+  if (!callbacks_.count(id_value)) {
+    return false;
+  }
+  ImageDataCallback callback = std::move(callbacks_[id_value]);
+  callbacks_.erase(id_value);
+
+  const base::Value* data = message.FindKey("data");
+  std::string decoded_data;
+  if (data && data->is_string() && !data->GetString().empty() &&
+      base::Base64Decode(data->GetString(), &decoded_data)) {
+    std::move(callback).Run(&decoded_data);
+  } else {
+    std::move(callback).Run(nullptr);
+  }
+  return true;
+}
diff --git a/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm b/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm
new file mode 100644
index 0000000..ff148f4
--- /dev/null
+++ b/ios/chrome/browser/web/image_fetch_tab_helper_unittest.mm
@@ -0,0 +1,127 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/web/image_fetch_tab_helper.h"
+
+#import "base/test/ios/wait_util.h"
+#import "ios/web/public/test/web_test_with_web_state.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "testing/gtest_mac.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using base::test::ios::WaitUntilConditionOrTimeout;
+using base::test::ios::kWaitForJSCompletionTimeout;
+
+// Test fixture for ImageFetchTabHelper class.
+class ImageFetchTabHelperTest : public web::WebTestWithWebState {
+ public:
+  void OnImageData(const std::string* data) {
+    if (data) {
+      image_data_ = std::make_unique<std::string>(*data);
+    }
+    on_image_data_called_ = true;
+  }
+
+ protected:
+  ImageFetchTabHelperTest() = default;
+
+  void SetUp() override {
+    WebTestWithWebState::SetUp();
+    ASSERT_TRUE(LoadHtml("<html></html>"));
+    ImageFetchTabHelper::CreateForWebState(web_state());
+  }
+
+  ImageFetchTabHelper* image_fetch_tab_helper() {
+    return ImageFetchTabHelper::FromWebState(web_state());
+  }
+
+  bool on_image_data_called_ = false;
+  std::unique_ptr<std::string> image_data_;
+
+  DISALLOW_COPY_AND_ASSIGN(ImageFetchTabHelperTest);
+};
+
+// Tests that ImageFetchTabHelper::GetImageData returns image data in callback
+// when fetching image data succeeded.
+TEST_F(ImageFetchTabHelperTest, GetImageDataJsSucceed) {
+  // Injects fake |__gCrWeb.imageFetch.getImageData| that returns "abc" in
+  // base64 as image data.
+  id script_result = ExecuteJavaScript(
+      @"__gCrWeb.imageFetch = {}; __gCrWeb.imageFetch.getImageData = "
+      @"function(id, url)"
+       "{ __gCrWeb.message.invokeOnHost({'command': 'imageFetch.getImageData', "
+       "'id': id, 'data': btoa('abc')}); }; true;");
+  ASSERT_NSEQ(@YES, script_result);
+
+  image_fetch_tab_helper()->GetImageData(
+      GURL("http://a.com/"),
+      base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
+                     base::Unretained(this)));
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return on_image_data_called_;
+  }));
+
+  ASSERT_TRUE(image_data_);
+  EXPECT_EQ("abc", *image_data_);
+}
+
+// Tests that ImageFetchTabHelper::GetImageData returns nullptr in callback when
+// fetching image data failed.
+TEST_F(ImageFetchTabHelperTest, GetImageDataJsFail) {
+  id script_result = ExecuteJavaScript(
+      @"__gCrWeb.imageFetch = {}; __gCrWeb.imageFetch.getImageData = "
+      @"function(id, url)"
+       "{ __gCrWeb.message.invokeOnHost({'command': 'imageFetch.getImageData', "
+       "'id': id}); }; true;");
+  ASSERT_NSEQ(@YES, script_result);
+
+  image_fetch_tab_helper()->GetImageData(
+      GURL("http://a.com/"),
+      base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
+                     base::Unretained(this)));
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return on_image_data_called_;
+  }));
+
+  EXPECT_FALSE(image_data_);
+}
+
+// Tests that ImageFetchTabHelper::GetImageData returns nullptr in callback when
+// WebState is destroyed.
+TEST_F(ImageFetchTabHelperTest, GetImageDataWebStateDestroy) {
+  image_fetch_tab_helper()->GetImageData(
+      GURL("http://a.com/"),
+      base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
+                     base::Unretained(this)));
+
+  DestroyWebState();
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return on_image_data_called_;
+  }));
+
+  EXPECT_FALSE(image_data_);
+}
+
+// Tests that ImageFetchTabHelper::GetImageData returns nullptr in callback when
+// WebState navigates to a new web page.
+TEST_F(ImageFetchTabHelperTest, GetImageDataWebStateNavigate) {
+  image_fetch_tab_helper()->GetImageData(
+      GURL("http://a.com/"),
+      base::BindOnce(&ImageFetchTabHelperTest::OnImageData,
+                     base::Unretained(this)));
+
+  LoadHtml(@"<html>new</html>"), GURL("http://new.webpage.com/");
+
+  ASSERT_TRUE(WaitUntilConditionOrTimeout(kWaitForJSCompletionTimeout, ^{
+    return on_image_data_called_;
+  }));
+
+  EXPECT_FALSE(image_data_);
+}
diff --git a/ios/chrome/browser/web/progress_indicator_egtest.mm b/ios/chrome/browser/web/progress_indicator_egtest.mm
index 953cb1a..cd352f3 100644
--- a/ios/chrome/browser/web/progress_indicator_egtest.mm
+++ b/ios/chrome/browser/web/progress_indicator_egtest.mm
@@ -10,7 +10,7 @@
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/condition_variable.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #import "base/test/ios/wait_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
diff --git a/ios/chrome/browser/web/resources/chrome_bundle_main_frame.js b/ios/chrome/browser/web/resources/chrome_bundle_main_frame.js
index 23cee10..dea36c0 100644
--- a/ios/chrome/browser/web/resources/chrome_bundle_main_frame.js
+++ b/ios/chrome/browser/web/resources/chrome_bundle_main_frame.js
@@ -9,3 +9,4 @@
 goog.require('__crWeb.fill');
 goog.require('__crWeb.passwords');
 goog.require('__crWeb.print');
+goog.require('__crWeb.imageFetch');
diff --git a/ios/chrome/browser/web/resources/image_fetch.js b/ios/chrome/browser/web/resources/image_fetch.js
new file mode 100644
index 0000000..0f56fcc
--- /dev/null
+++ b/ios/chrome/browser/web/resources/image_fetch.js
@@ -0,0 +1,121 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview Add functionality related to getting image data.
+ */
+goog.provide('__crWeb.imageFetch');
+
+/**
+ * Namespace for this file. It depends on |__gCrWeb| having already been
+ * injected.
+ */
+__gCrWeb.imageFetch = {};
+
+/**
+ * Store common namespace object in a global __gCrWeb object referenced by a
+ * string, so it does not get renamed by closure compiler during the
+ * minification.
+ */
+__gCrWeb['imageFetch'] = __gCrWeb.imageFetch;
+
+/* Beginning of anonymous object. */
+(function() {
+
+/**
+ * Returns image data as base64 string, because WKWebView does not support BLOB
+ * on messages to native code. Try getting data directly from <img> first, and
+ * if failed try downloading by XMLHttpRequest.
+ *
+ * @param {number} id The ID for curent call. It should be attached to the
+ *     message sent back.
+ * @param {string} url The URL of the requested image.
+ */
+__gCrWeb.imageFetch.getImageData = function(id, url) {
+  var onData = function(data) {
+    __gCrWeb.message.invokeOnHost(
+        {'command': 'imageFetch.getImageData', 'id': id, 'data': data});
+  };
+  var onError = function() {
+    __gCrWeb.message.invokeOnHost(
+        {'command': 'imageFetch.getImageData', 'id': id});
+  };
+
+  var data = getImageDataByCanvas(url);
+  if (data) {
+    onData(data);
+  } else {
+    getImageDataByXMLHttpRequest(url, 100, onData, onError);
+  }
+};
+
+/**
+ * Returns image data directly from <img> by drawing it to <canvas> and export
+ * it. If the <img> is cross-origin without "crossorigin=anonymous", this would
+ * be prevented by the browser. The exported image is in a resolution of 96 dpi.
+ *
+ * @param {string} url The URL of the requested image.
+ * @return {string|null} Image data in base64 string, or null if no <img> with
+ *     "src=|url|" is found or exporting data from <img> failed.
+ */
+function getImageDataByCanvas(url) {
+  for (var key in document.images) {
+    var img = document.images[key];
+    if (img.src == url) {
+      var canvas = document.createElement('canvas');
+      canvas.width = img.naturalWidth;
+      canvas.height = img.naturalHeight;
+      var ctx = canvas.getContext('2d');
+      ctx.drawImage(img, 0, 0);
+      var data;
+      try {
+        // If the <img> is cross-domain without "crossorigin=anonymous", an
+        // exception will be thrown.
+        data = canvas.toDataURL('image/png');
+      } catch (error) {
+        return null;
+      }
+      // Remove the "data:type/subtype;base64," header.
+      return data.split(',')[1];
+    }
+  }
+  return null;
+};
+
+/**
+ * Returns image data by downloading it using XMLHttpRequest.
+ *
+ * @param {string} url The URL of the requested image.
+ * @param {number} timeout The timeout in milliseconds for XMLHttpRequest.
+ * @param {Function} onData Callback when fetching image data succeeded.
+ * @param {Function} onError Callback when fetching image data failed.
+ */
+function getImageDataByXMLHttpRequest(url, timeout, onData, onError) {
+  var xhr = new XMLHttpRequest();
+  xhr.open('GET', url);
+  xhr.timeout = timeout;
+  xhr.responseType = 'blob';
+
+  xhr.onload = function() {
+    if (xhr.status != 200) {
+      onError();
+      return;
+    }
+    var fr = new FileReader();
+
+    fr.onload = function() {
+      onData(btoa(/** @type{string} */ (fr.result)));
+    };
+    fr.onabort = onError;
+    fr.onerror = onError;
+
+    fr.readAsBinaryString(/** @type{!Blob} */ (xhr.response));
+  };
+  xhr.onabort = onError;
+  xhr.onerror = onError;
+  xhr.ontimeout = onError;
+
+  xhr.send();
+};
+}());  // End of anonymous object
diff --git a/ios/chrome/browser/web_resource/web_resource_util.cc b/ios/chrome/browser/web_resource/web_resource_util.cc
index 5faf4fa..8a953658 100644
--- a/ios/chrome/browser/web_resource/web_resource_util.cc
+++ b/ios/chrome/browser/web_resource/web_resource_util.cc
@@ -7,7 +7,7 @@
 #include "base/bind.h"
 #include "base/json/json_reader.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
diff --git a/ios/net/cookies/cookie_store_ios_test_util.h b/ios/net/cookies/cookie_store_ios_test_util.h
index 3db24b2..698202f 100644
--- a/ios/net/cookies/cookie_store_ios_test_util.h
+++ b/ios/net/cookies/cookie_store_ios_test_util.h
@@ -10,7 +10,7 @@
 
 #include "base/callback_forward.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ios/net/cookies/cookie_store_ios_client.h"
 #include "net/cookies/cookie_change_dispatcher.h"
 #include "net/cookies/cookie_monster.h"
diff --git a/ios/web/app/web_main_loop.mm b/ios/web/app/web_main_loop.mm
index 360d319..90921eb 100644
--- a/ios/web/app/web_main_loop.mm
+++ b/ios/web/app/web_main_loop.mm
@@ -17,8 +17,8 @@
 #include "base/power_monitor/power_monitor.h"
 #include "base/power_monitor/power_monitor_device_source.h"
 #include "base/process/process_metrics.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
-#include "base/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/scheduler_worker_pool_params.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_restrictions.h"
 #import "ios/web/net/cookie_notification_bridge.h"
 #include "ios/web/public/app/web_main_parts.h"
diff --git a/ios/web/net/crw_cert_verification_controller.mm b/ios/web/net/crw_cert_verification_controller.mm
index c47d670..1b35bd7 100644
--- a/ios/web/net/crw_cert_verification_controller.mm
+++ b/ios/web/net/crw_cert_verification_controller.mm
@@ -11,7 +11,7 @@
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ios/web/public/browser_state.h"
 #include "ios/web/public/certificate_policy_cache.h"
 #include "ios/web/public/features.h"
diff --git a/ios/web/public/app/task_scheduler_init_params_callback.h b/ios/web/public/app/task_scheduler_init_params_callback.h
index a77796d..237a9de 100644
--- a/ios/web/public/app/task_scheduler_init_params_callback.h
+++ b/ios/web/public/app/task_scheduler_init_params_callback.h
@@ -6,7 +6,7 @@
 #define IOS_WEB_PUBLIC_GLOBAL_STATE_TASK_SCHEDULER_INIT_PARAMS_CALLBACK_H_
 
 #include "base/callback_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 
 namespace web {
 
diff --git a/ios/web/public/global_state/ios_global_state.h b/ios/web/public/global_state/ios_global_state.h
index 287f32f..d15a263d 100644
--- a/ios/web/public/global_state/ios_global_state.h
+++ b/ios/web/public/global_state/ios_global_state.h
@@ -5,7 +5,7 @@
 #ifndef IOS_WEB_PUBLIC_GLOBAL_STATE_IOS_GLOBAL_STATE_H_
 #define IOS_WEB_PUBLIC_GLOBAL_STATE_IOS_GLOBAL_STATE_H_
 
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 
 namespace ios_global_state {
 
diff --git a/ios/web/public/global_state/ios_global_state.mm b/ios/web/public/global_state/ios_global_state.mm
index 8225957..a1e44e8 100644
--- a/ios/web/public/global_state/ios_global_state.mm
+++ b/ios/web/public/global_state/ios_global_state.mm
@@ -9,7 +9,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/message_loop/message_loop_current.h"
-#include "base/task/task_scheduler/initialization_util_forward.h"
+#include "base/task/task_scheduler/initialization_util.h"
 #include "net/base/network_change_notifier.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/web/public/test/web_js_test.h b/ios/web/public/test/web_js_test.h
index d878fde..6ac43a46 100644
--- a/ios/web/public/test/web_js_test.h
+++ b/ios/web/public/test/web_js_test.h
@@ -30,6 +30,10 @@
     WebTestT::LoadHtml(html);
     Inject();
   }
+  void LoadHtmlAndInject(NSString* html, const GURL& url) {
+    WebTestT::LoadHtml(html, url);
+    Inject();
+  }
 
   // Returns an id representation of the JavaScript's evaluation results;
   // the JavaScript is passed in as a |format| and its arguments.
diff --git a/ios/web/public/web_client.h b/ios/web/public/web_client.h
index 2c57432..69e8fa1e 100644
--- a/ios/web/public/web_client.h
+++ b/ios/web/public/web_client.h
@@ -13,7 +13,7 @@
 #include "base/callback.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/values.h"
 #include "ios/web/public/user_agent.h"
 #include "mojo/public/cpp/system/message_pipe.h"
diff --git a/ios/web/shell/shell_url_request_context_getter.mm b/ios/web/shell/shell_url_request_context_getter.mm
index edc941a..018c498 100644
--- a/ios/web/shell/shell_url_request_context_getter.mm
+++ b/ios/web/shell/shell_url_request_context_getter.mm
@@ -12,7 +12,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #import "ios/net/cookies/cookie_store_ios_persistent.h"
 #import "ios/web/public/web_client.h"
 #include "ios/web/shell/shell_network_delegate.h"
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
index c659655..1358772c 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
@@ -43,7 +43,7 @@
   ukm::SourceId GetUkmSourceId() override;
   AddressNormalizer* GetAddressNormalizer() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  void ShowAutofillSettings() override;
+  void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         UnmaskCardReason reason,
                         base::WeakPtr<CardUnmaskDelegate> delegate) override;
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
index b51db625..33d8106e 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
@@ -73,7 +73,8 @@
   return security_state::SecurityLevel::SECURITY_LEVEL_COUNT;
 }
 
-void WebViewAutofillClientIOS::ShowAutofillSettings() {
+void WebViewAutofillClientIOS::ShowAutofillSettings(
+    bool show_credit_card_settings) {
   NOTREACHED();
 }
 
diff --git a/ios/web_view/internal/passwords/web_view_password_store_factory.mm b/ios/web_view/internal/passwords/web_view_password_store_factory.mm
index 0985675d..d396258 100644
--- a/ios/web_view/internal/passwords/web_view_password_store_factory.mm
+++ b/ios/web_view/internal/passwords/web_view_password_store_factory.mm
@@ -11,7 +11,7 @@
 #include "base/command_line.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/keyed_service/core/service_access_type.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
diff --git a/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm b/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm
index 14138bf8..baa19f8 100644
--- a/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm
+++ b/ios/web_view/internal/sync/web_view_gcm_profile_service_factory.mm
@@ -8,7 +8,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/memory/singleton.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/gcm_driver/gcm_client_factory.h"
 #include "components/gcm_driver/gcm_profile_service.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
diff --git a/ios/web_view/internal/web_view_url_request_context_getter.mm b/ios/web_view/internal/web_view_url_request_context_getter.mm
index c84d64b..6046457 100644
--- a/ios/web_view/internal/web_view_url_request_context_getter.mm
+++ b/ios/web_view/internal/web_view_url_request_context_getter.mm
@@ -11,7 +11,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/path_service.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #import "ios/net/cookies/cookie_store_ios_persistent.h"
 #import "ios/web/public/web_client.h"
 #include "ios/web_view/internal/web_view_network_delegate.h"
diff --git a/jingle/BUILD.gn b/jingle/BUILD.gn
index b2588ca..3ece7ca1a 100644
--- a/jingle/BUILD.gn
+++ b/jingle/BUILD.gn
@@ -9,8 +9,6 @@
   sources = [
     "glue/chrome_async_socket.cc",
     "glue/chrome_async_socket.h",
-    "glue/fake_ssl_client_socket.cc",
-    "glue/fake_ssl_client_socket.h",
     "glue/resolving_client_socket_factory.h",
     "glue/task_pump.cc",
     "glue/task_pump.h",
@@ -25,6 +23,7 @@
     "//third_party/webrtc_overrides",
   ]
   deps = [
+    ":jingle_fake_socket",
     "//base",
     "//base/third_party/dynamic_annotations",
     "//net",
@@ -42,6 +41,19 @@
   }
 }
 
+# These files are separated into their own target to avoid a circular dependency
+# since services/network depends on this.
+static_library("jingle_fake_socket") {
+  sources = [
+    "glue/fake_ssl_client_socket.cc",
+    "glue/fake_ssl_client_socket.h",
+  ]
+  deps = [
+    "//base",
+    "//net",
+  ]
+}
+
 # A library for sending and receiving peer-issued notifications.
 static_library("notifier") {
   sources = [
diff --git a/media/BUILD.gn b/media/BUILD.gn
index cfc60bbc..e4debbaa0e 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -34,7 +34,6 @@
     "ENABLE_CDM_STORAGE_ID=$enable_cdm_storage_id",
     "ENABLE_MEDIA_REMOTING=$enable_media_remoting",
     "ENABLE_MEDIA_REMOTING_RPC=$enable_media_remoting_rpc",
-    "ENABLE_ASSISTANT_AUDIO_DECODER=$enable_assistant_audio_decoder",
     "USE_PROPRIETARY_CODECS=$proprietary_codecs",
   ]
 }
diff --git a/media/audio/audio_debug_file_writer.h b/media/audio/audio_debug_file_writer.h
index cae43e94..66f0f91d 100644
--- a/media/audio/audio_debug_file_writer.h
+++ b/media/audio/audio_debug_file_writer.h
@@ -14,7 +14,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "media/base/audio_parameters.h"
 #include "media/base/media_export.h"
 
diff --git a/media/audio/audio_debug_recording_session_impl.cc b/media/audio/audio_debug_recording_session_impl.cc
index 3026d17..086c5b4 100644
--- a/media/audio/audio_debug_recording_session_impl.cc
+++ b/media/audio/audio_debug_recording_session_impl.cc
@@ -11,8 +11,8 @@
 #include "base/files/file_path.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "media/audio/audio_debug_recording_manager.h"
 #include "media/audio/audio_manager.h"
diff --git a/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java b/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java
index 4648a0d..e17e49bc 100644
--- a/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java
+++ b/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java
@@ -6,6 +6,7 @@
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import android.media.AudioFormat;
 import android.media.AudioTrack;
@@ -180,7 +181,7 @@
         List<Byte> generatedData = provider.getGeneratedData();
         List<Byte> receivedData = provider.getReceivedData();
 
-        assertEquals(6 * provider.getBufferSize(), generatedData.size());
+        assertTrue(6 * provider.getBufferSize() <= generatedData.size());
         assertArrayEquals(generatedData.toArray(), receivedData.toArray());
 
         stream.stop();
diff --git a/media/blink/watch_time_reporter_unittest.cc b/media/blink/watch_time_reporter_unittest.cc
index 481d26e..d63d4a23 100644
--- a/media/blink/watch_time_reporter_unittest.cc
+++ b/media/blink/watch_time_reporter_unittest.cc
@@ -236,9 +236,7 @@
         mojom::VideoDecodeStatsRecorderRequest request) override {
       FAIL();
     }
-    void Initialize(bool is_mse,
-                    bool is_top_frame,
-                    const url::Origin& untrusted_top_origin) override {}
+    void Initialize(bool is_mse) override {}
     void OnError(PipelineStatus status) override {}
     void SetIsEME() override {}
     void SetTimeToMetadata(base::TimeDelta elapsed) override {}
diff --git a/media/blink/webmediaplayer_impl.cc b/media/blink/webmediaplayer_impl.cc
index db9bea4b..583fe530 100644
--- a/media/blink/webmediaplayer_impl.cc
+++ b/media/blink/webmediaplayer_impl.cc
@@ -23,7 +23,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
@@ -579,12 +579,7 @@
   media_log_->AddEvent(media_log_->CreateLoadEvent(url.GetString().Utf8()));
   load_start_time_ = base::TimeTicks::Now();
 
-  // URL is used for UKM reporting. Privacy requires we only report origin of
-  // the top frame. |is_top_frame| signals how to interpret the origin.
-  // TODO(crbug.com/787209): Stop getting origin from the renderer.
-  media_metrics_provider_->Initialize(load_type == kLoadTypeMediaSource,
-                                      frame_ == frame_->Top(),
-                                      frame_->Top()->GetSecurityOrigin());
+  media_metrics_provider_->Initialize(load_type == kLoadTypeMediaSource);
 
   // Media source pipelines can start immediately.
   if (load_type == kLoadTypeMediaSource) {
diff --git a/media/blink/webmediaplayer_impl_unittest.cc b/media/blink/webmediaplayer_impl_unittest.cc
index 7cb31f86..08ee5b3 100644
--- a/media/blink/webmediaplayer_impl_unittest.cc
+++ b/media/blink/webmediaplayer_impl_unittest.cc
@@ -369,13 +369,14 @@
         RendererFactorySelector::FactoryType::DEFAULT);
 
     mojom::MediaMetricsProviderPtr provider;
-    MediaMetricsProvider::Create(VideoDecodePerfHistory::SaveCallback(),
-                                 mojo::MakeRequest(&provider));
+    MediaMetricsProvider::Create(
+        false, base::BindRepeating([]() { return ukm::kInvalidSourceId; }),
+        VideoDecodePerfHistory::SaveCallback(), mojo::MakeRequest(&provider));
 
     // Initialize provider since none of the tests below actually go through the
     // full loading/pipeline initialize phase. If this ever changes the provider
     // will start DCHECK failing.
-    provider->Initialize(false, false, url::Origin());
+    provider->Initialize(false);
 
     audio_sink_ = base::WrapRefCounted(new NiceMock<MockAudioRendererSink>());
 
diff --git a/media/capabilities/in_memory_video_decode_stats_db_impl.cc b/media/capabilities/in_memory_video_decode_stats_db_impl.cc
index 5cf9871..1612245 100644
--- a/media/capabilities/in_memory_video_decode_stats_db_impl.cc
+++ b/media/capabilities/in_memory_video_decode_stats_db_impl.cc
@@ -13,7 +13,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/sequence_checker.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/capabilities/video_decode_stats_db_provider.h"
 
diff --git a/media/capabilities/video_decode_stats_db_impl.cc b/media/capabilities/video_decode_stats_db_impl.cc
index fc792f5..37a13a4 100644
--- a/media/capabilities/video_decode_stats_db_impl.cc
+++ b/media/capabilities/video_decode_stats_db_impl.cc
@@ -11,7 +11,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequence_checker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/leveldb_proto/proto_database_impl.h"
 #include "media/capabilities/video_decode_stats.pb.h"
 
diff --git a/media/filters/ffmpeg_demuxer.cc b/media/filters/ffmpeg_demuxer.cc
index 3d0c95b..e850101 100644
--- a/media/filters/ffmpeg_demuxer.cc
+++ b/media/filters/ffmpeg_demuxer.cc
@@ -21,7 +21,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_byteorder.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/media/filters/offloading_video_decoder.cc b/media/filters/offloading_video_decoder.cc
index e2f24346..3ca8e3c91 100644
--- a/media/filters/offloading_video_decoder.cc
+++ b/media/filters/offloading_video_decoder.cc
@@ -7,7 +7,7 @@
 #include "base/bind_helpers.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/atomic_flag.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "media/base/bind_to_current_loop.h"
 #include "media/base/decoder_buffer.h"
 #include "media/base/video_frame.h"
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index 1e56dc2..d6ea52d 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -197,6 +197,7 @@
     libs += [ "android" ]
     deps += [
       # TODO(crbug.com/789435): This can be removed once CdmManager is removed.
+      "//gpu/ipc/common:ipc_common_sources",
       "//media/mojo:buildflags",
       "//services/service_manager/public/cpp:cpp",
       "//third_party/libyuv",
diff --git a/media/gpu/android/avda_codec_allocator.cc b/media/gpu/android/avda_codec_allocator.cc
index f51baa07..63fff64 100644
--- a/media/gpu/android/avda_codec_allocator.cc
+++ b/media/gpu/android/avda_codec_allocator.cc
@@ -11,7 +11,7 @@
 #include "base/logging.h"
 #include "base/single_thread_task_runner.h"
 #include "base/sys_info.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_checker.h"
diff --git a/media/gpu/android/avda_codec_allocator.h b/media/gpu/android/avda_codec_allocator.h
index a2f860c6..15c1f52 100644
--- a/media/gpu/android/avda_codec_allocator.h
+++ b/media/gpu/android/avda_codec_allocator.h
@@ -17,7 +17,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread.h"
 #include "base/time/tick_clock.h"
 #include "base/trace_event/trace_event.h"
diff --git a/media/gpu/android/image_reader_gl_owner.cc b/media/gpu/android/image_reader_gl_owner.cc
index 38c607bd..33fd945 100644
--- a/media/gpu/android/image_reader_gl_owner.cc
+++ b/media/gpu/android/image_reader_gl_owner.cc
@@ -15,6 +15,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "gpu/ipc/common/android/android_image_reader_utils.h"
 #include "ui/gl/gl_fence_android_native_fence_sync.h"
 #include "ui/gl/scoped_binders.h"
 #include "ui/gl/scoped_make_current.h"
@@ -57,13 +58,13 @@
   // Set the width, height and format to some default value. This parameters
   // are/maybe overriden by the producer sending buffers to this imageReader's
   // Surface.
-  int32_t width = 1, height = 1, maxImages = 3;
+  int32_t width = 1, height = 1, max_images = 3;
   AIMAGE_FORMATS format = AIMAGE_FORMAT_YUV_420_888;
   AImageReader* reader = nullptr;
 
   // Create a new reader for images of the desired size and format.
   media_status_t return_code =
-      loader_.AImageReader_new(width, height, format, maxImages, &reader);
+      loader_.AImageReader_new(width, height, format, max_images, &reader);
   if (return_code != AMEDIA_OK) {
     LOG(ERROR) << " Image reader creation failed.";
     if (return_code == AMEDIA_ERROR_INVALID_PARAMETER)
@@ -140,10 +141,10 @@
 
   // Acquire the latest image asynchronously
   AImage* image = nullptr;
-  int acquireFenceFd = 0;
+  int acquire_fence_fd = -1;
   media_status_t return_code = AMEDIA_OK;
   return_code = loader_.AImageReader_acquireLatestImageAsync(
-      image_reader_, &image, &acquireFenceFd);
+      image_reader_, &image, &acquire_fence_fd);
 
   // TODO(http://crbug.com/846050).
   // Need to add some better error handling if below error occurs. Currently we
@@ -178,6 +179,7 @@
       NOTREACHED();
       return;
   }
+  base::ScopedFD scoped_acquire_fence_fd(acquire_fence_fd);
 
   // If there is no new image simply return. At this point previous image will
   // still be bound to the texture.
@@ -185,89 +187,20 @@
     return;
   }
 
-  // If we have a new Image, delete the previously acquired image (if any).
-  if (current_image_) {
-    // Delete the image synchronously. Create and insert a fence signal.
-    std::unique_ptr<gl::GLFenceAndroidNativeFenceSync> android_native_fence =
-        gl::GLFenceAndroidNativeFenceSync::CreateForGpuFence();
-    if (!android_native_fence) {
-      LOG(ERROR) << "Failed to create android native fence sync object.";
-      return;
-    }
-    std::unique_ptr<gfx::GpuFence> gpu_fence =
-        android_native_fence->GetGpuFence();
-    if (!gpu_fence) {
-      LOG(ERROR) << "Unable to get a gpu fence object.";
-      return;
-    }
-    gfx::GpuFenceHandle fence_handle =
-        gfx::CloneHandleForIPC(gpu_fence->GetGpuFenceHandle());
-    if (fence_handle.is_null()) {
-      LOG(ERROR) << "Gpu fence handle is null";
-      return;
-    }
-    loader_.AImage_deleteAsync(current_image_, fence_handle.native_fd.fd);
-    current_image_ = nullptr;
-  }
+  // If we have a new Image, delete the previously acquired image.
+  if (!gpu::DeleteAImageAsync(current_image_, &loader_))
+    return;
 
   // Make the newly acuired image as current image.
   current_image_ = image;
 
-  // If acquireFenceFd is -1, we do not need synchronization fence and image is
-  // ready to be used immediately. Else we need to create a sync fence which is
-  // used to signal when the buffer/image is ready to be consumed.
-  if (acquireFenceFd != -1) {
-    // Create a new egl sync object using the acquireFenceFd.
-    EGLint attribs[] = {EGL_SYNC_NATIVE_FENCE_FD_ANDROID, acquireFenceFd,
-                        EGL_NONE};
-    std::unique_ptr<gl::GLFenceEGL> egl_fence(
-        gl::GLFenceEGL::Create(EGL_SYNC_NATIVE_FENCE_ANDROID, attribs));
-
-    // Insert the fence sync gl command using the helper class in
-    // gl_fence_egl.h.
-    if (egl_fence == nullptr) {
-      LOG(ERROR) << " Failed to created egl fence object ";
-      return;
-    }
-    DCHECK(egl_fence);
-
-    // Make the server wait and not the client.
-    egl_fence->ServerWait();
-  }
-
-  // Get the hardware buffer from the image.
-  AHardwareBuffer* buffer = nullptr;
-  DCHECK(current_image_);
-  if (loader_.AImage_getHardwareBuffer(current_image_, &buffer) != AMEDIA_OK) {
-    LOG(ERROR) << "hardware buffer is null";
+  // Insert an EGL fence and make server wait for image to be available.
+  if (!gpu::InsertEglFenceAndWait(std::move(scoped_acquire_fence_fd)))
     return;
-  }
 
-  // Create a egl image from the hardware buffer. Get the image size to create
-  // egl image.
-  int32_t image_height = 0, image_width = 0;
-  if (loader_.AImage_getWidth(current_image_, &image_width) != AMEDIA_OK) {
-    LOG(ERROR) << "image width is null OR image has been deleted";
+  // Create EGL image from the AImage and bind it to the texture.
+  if (!gpu::CreateAndBindEglImage(current_image_, texture_id_, &loader_))
     return;
-  }
-  if (loader_.AImage_getHeight(current_image_, &image_height) != AMEDIA_OK) {
-    LOG(ERROR) << "image height is null OR image has been deleted";
-    return;
-  }
-  gfx::Size image_size(image_width, image_height);
-  scoped_refptr<gl::GLImageAHardwareBuffer> egl_image(
-      new gl::GLImageAHardwareBuffer(image_size));
-  if (!egl_image->Initialize(buffer, false)) {
-    LOG(ERROR) << "Failed to create EGL image ";
-    egl_image = nullptr;
-    return;
-  }
-
-  // Now bind this egl image to the texture target GL_TEXTURE_EXTERNAL_OES. Note
-  // that once the egl image is bound, it can be destroyed safely without
-  // affecting the rendering using this texture image.
-  glBindTexture(GL_TEXTURE_EXTERNAL_OES, texture_id_);
-  egl_image->BindTexImage(GL_TEXTURE_EXTERNAL_OES);
 }
 
 void ImageReaderGLOwner::GetTransformMatrix(float mtx[]) {
diff --git a/media/gpu/test/rendering_helper.cc b/media/gpu/test/rendering_helper.cc
index 7f4e135..cf01a66 100644
--- a/media/gpu/test/rendering_helper.cc
+++ b/media/gpu/test/rendering_helper.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "base/bind.h"
+#include "base/bind_helpers.h"
 #include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/mac/scoped_nsautorelease_pool.h"
@@ -23,6 +24,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "media/gpu/test/video_decode_accelerator_unittest_helpers.h"
 #include "ui/gl/gl_context.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_surface.h"
@@ -33,11 +35,12 @@
 #include "ui/ozone/public/ozone_platform.h"
 #endif  // defined(USE_OZONE)
 
+namespace media {
+
+namespace {
+
 // Helper for Shader creation.
-static void CreateShader(GLuint program,
-                         GLenum type,
-                         const char* source,
-                         int size) {
+void CreateShader(GLuint program, GLenum type, const char* source, int size) {
   GLuint shader = glCreateShader(type);
   glShaderSource(shader, 1, &source, &size);
   glCompileShader(shader);
@@ -53,18 +56,21 @@
   CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
 }
 
-namespace media {
+void DeleteTexture(uint32_t texture_id) {
+  glDeleteTextures(1, &texture_id);
+  CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
+}
+
+// Helper function to set GL viewport.
+void GLSetViewPort(const gfx::Rect& area) {
+  glViewport(area.x(), area.y(), area.width(), area.height());
+  glScissor(area.x(), area.y(), area.width(), area.height());
+}
+
+}  // namespace
 
 bool RenderingHelper::use_gl_ = false;
 
-RenderingHelperParams::RenderingHelperParams()
-    : rendering_fps(0), render_as_thumbnails(false) {}
-
-RenderingHelperParams::RenderingHelperParams(
-    const RenderingHelperParams& other) = default;
-
-RenderingHelperParams::~RenderingHelperParams() {}
-
 VideoFrameTexture::VideoFrameTexture(uint32_t texture_target,
                                      uint32_t texture_id,
                                      const base::Closure& no_longer_needed_cb)
@@ -78,11 +84,9 @@
   base::ResetAndReturn(&no_longer_needed_cb_).Run();
 }
 
-RenderingHelper::RenderedVideo::RenderedVideo()
-    : is_flushing(false), frames_to_drop(0) {}
+RenderingHelper::RenderedVideo::RenderedVideo() {}
 
-RenderingHelper::RenderedVideo::RenderedVideo(const RenderedVideo& other) =
-    default;
+RenderingHelper::RenderedVideo::RenderedVideo(const RenderedVideo&) = default;
 
 RenderingHelper::RenderedVideo::~RenderedVideo() {}
 
@@ -320,26 +324,33 @@
   done->Signal();
 }
 
-void RenderingHelper::CreateTexture(uint32_t texture_target,
-                                    uint32_t* texture_id,
-                                    const gfx::Size& size,
-                                    base::WaitableEvent* done) {
-  if (!task_runner_->BelongsToCurrentThread()) {
-    task_runner_->PostTask(
-        FROM_HERE,
-        base::Bind(&RenderingHelper::CreateTexture, base::Unretained(this),
-                   texture_target, texture_id, size, done));
-    return;
+scoped_refptr<media::test::TextureRef> RenderingHelper::CreateTexture(
+    uint32_t texture_target,
+    bool pre_allocate,
+    VideoPixelFormat pixel_format,
+    const gfx::Size& size) {
+  CHECK(task_runner_->BelongsToCurrentThread());
+  uint32_t texture_id = CreateTextureId(texture_target, size);
+  base::OnceClosure delete_texture_cb =
+      use_gl_ ? base::BindOnce(DeleteTexture, texture_id) : base::DoNothing();
+  if (pre_allocate) {
+    return media::test::TextureRef::CreatePreallocated(
+        texture_id, std::move(delete_texture_cb), pixel_format, size);
   }
+  return media::test::TextureRef::Create(texture_id,
+                                         std::move(delete_texture_cb));
+}
 
+uint32_t RenderingHelper::CreateTextureId(uint32_t texture_target,
+                                          const gfx::Size& size) {
+  CHECK(task_runner_->BelongsToCurrentThread());
   if (!use_gl_) {
-    *texture_id = 0;
-    done->Signal();
-    return;
+    return 0;
   }
 
-  glGenTextures(1, texture_id);
-  glBindTexture(texture_target, *texture_id);
+  uint32_t texture_id;
+  glGenTextures(1, &texture_id);
+  glBindTexture(texture_target, texture_id);
   if (texture_target == GL_TEXTURE_2D) {
     glTexImage2D(GL_TEXTURE_2D,
                  0,
@@ -356,13 +367,7 @@
   glTexParameteri(texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   glTexParameteri(texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
   CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
-  done->Signal();
-}
-
-// Helper function to set GL viewport.
-static inline void GLSetViewPort(const gfx::Rect& area) {
-  glViewport(area.x(), area.y(), area.width(), area.height());
-  glScissor(area.x(), area.y(), area.width(), area.height());
+  return texture_id;
 }
 
 void RenderingHelper::ConsumeVideoFrame(
@@ -444,24 +449,10 @@
   CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
 }
 
-void RenderingHelper::DeleteTexture(uint32_t texture_id) {
-  CHECK(task_runner_->BelongsToCurrentThread());
-
-  if (!use_gl_)
-    return;
-
-  glDeleteTextures(1, &texture_id);
-  CHECK_EQ(static_cast<int>(glGetError()), GL_NO_ERROR);
-}
-
 gl::GLContext* RenderingHelper::GetGLContext() {
   return gl_context_.get();
 }
 
-void* RenderingHelper::GetGLDisplay() {
-  return gl_surface_->GetDisplay();
-}
-
 void RenderingHelper::Clear() {
   videos_.clear();
   task_runner_ = nullptr;
diff --git a/media/gpu/test/rendering_helper.h b/media/gpu/test/rendering_helper.h
index 02ca8589..e89ccff 100644
--- a/media/gpu/test/rendering_helper.h
+++ b/media/gpu/test/rendering_helper.h
@@ -19,6 +19,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "media/base/video_types.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gl/gl_bindings.h"
@@ -30,6 +31,9 @@
 }
 
 namespace media {
+namespace test {
+class TextureRef;
+}  // namespace test
 
 class VideoFrameTexture : public base::RefCounted<VideoFrameTexture> {
  public:
@@ -51,24 +55,20 @@
 };
 
 struct RenderingHelperParams {
-  RenderingHelperParams();
-  RenderingHelperParams(const RenderingHelperParams& other);
-  ~RenderingHelperParams();
-
   // The target rendering FPS. A value of 0 makes the RenderingHelper return
   // frames immediately.
-  int rendering_fps;
+  int rendering_fps = 0;
 
   // The number of windows. We play each stream in its own window
   // on the screen.
-  int num_windows;
+  int num_windows = 0;
 
   // The members below are only used for the thumbnail mode where all frames
   // are rendered in sequence onto one FBO for comparison/verification purposes.
 
   // Whether the frames are rendered as scaled thumbnails within a
   // larger FBO that is in turn rendered to the window.
-  bool render_as_thumbnails;
+  bool render_as_thumbnails = false;
   // The size of the FBO containing all visible thumbnails.
   gfx::Size thumbnails_page_size;
   // The size of each thumbnail within the FBO.
@@ -95,12 +95,14 @@
   // must be called on the rendering thread.
   void UnInitialize(base::WaitableEvent* done);
 
-  // Return a newly-created GLES2 texture id of the specified size, and
-  // signal |*done|.
-  void CreateTexture(uint32_t texture_target,
-                     uint32_t* texture_id,
-                     const gfx::Size& size,
-                     base::WaitableEvent* done);
+  // Return a newly-created media::test::TextureRef of the specified size and
+  // pixel format. If pre_allocate is true, NativePixmap is allocated in this
+  // function.
+  scoped_refptr<media::test::TextureRef> CreateTexture(
+      uint32_t texture_target,
+      bool pre_allocate,
+      VideoPixelFormat pixel_format,
+      const gfx::Size& size);
 
   // If |render_as_thumbnails_| is true, renders |video_frame| as thumbnail.
   // Otherwise, queues |video_frame| to |pending_frames|.
@@ -111,12 +113,6 @@
   // more video frames.
   void Flush(size_t window_id);
 
-  // Delete |texture_id|.
-  void DeleteTexture(uint32_t texture_id);
-
-  // Get the platform specific handle to the OpenGL display.
-  void* GetGLDisplay();
-
   // Get the GL context.
   gl::GLContext* GetGLContext();
 
@@ -128,14 +124,14 @@
   struct RenderedVideo {
 
     // True if there won't be any new video frames comming.
-    bool is_flushing;
+    bool is_flushing = false;
 
     // The number of frames need to be dropped to catch up the rendering. We
     // always keep the last remaining frame in pending_frames even after it
     // has been rendered, so that we have something to display if the client
     // is falling behind on providing us with new frames during timer-driven
     // playback.
-    int frames_to_drop;
+    int frames_to_drop = 0;
 
     // The video frames pending for rendering.
     base::queue<scoped_refptr<VideoFrameTexture>> pending_frames;
@@ -153,6 +149,9 @@
   void QueueVideoFrame(size_t window_id,
                        scoped_refptr<VideoFrameTexture> video_frame);
 
+  // Return a newly-created GLES2 texture id of the specified size.
+  uint32_t CreateTextureId(uint32_t texture_target, const gfx::Size& size);
+
   void Clear();
   void RenderContent();
   void DropOneFrameForAllVideos();
diff --git a/media/gpu/test/video_decode_accelerator_unittest_helpers.cc b/media/gpu/test/video_decode_accelerator_unittest_helpers.cc
index 7ffeb53..ee38b65 100644
--- a/media/gpu/test/video_decode_accelerator_unittest_helpers.cc
+++ b/media/gpu/test/video_decode_accelerator_unittest_helpers.cc
@@ -74,29 +74,32 @@
 }
 
 TextureRef::TextureRef(uint32_t texture_id,
-                       const base::Closure& no_longer_needed_cb)
-    : texture_id_(texture_id), no_longer_needed_cb_(no_longer_needed_cb) {}
+                       base::OnceClosure no_longer_needed_cb)
+    : texture_id_(texture_id),
+      no_longer_needed_cb_(std::move(no_longer_needed_cb)) {}
 
 TextureRef::~TextureRef() {
-  base::ResetAndReturn(&no_longer_needed_cb_).Run();
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+  std::move(no_longer_needed_cb_).Run();
 }
 
 // static
 scoped_refptr<TextureRef> TextureRef::Create(
     uint32_t texture_id,
-    const base::Closure& no_longer_needed_cb) {
-  return base::WrapRefCounted(new TextureRef(texture_id, no_longer_needed_cb));
+    base::OnceClosure no_longer_needed_cb) {
+  return base::WrapRefCounted(
+      new TextureRef(texture_id, std::move(no_longer_needed_cb)));
 }
 
 // static
 scoped_refptr<TextureRef> TextureRef::CreatePreallocated(
     uint32_t texture_id,
-    const base::Closure& no_longer_needed_cb,
+    base::OnceClosure no_longer_needed_cb,
     VideoPixelFormat pixel_format,
     const gfx::Size& size) {
   scoped_refptr<TextureRef> texture_ref;
 #if defined(OS_CHROMEOS)
-  texture_ref = TextureRef::Create(texture_id, no_longer_needed_cb);
+  texture_ref = TextureRef::Create(texture_id, std::move(no_longer_needed_cb));
   LOG_ASSERT(texture_ref);
 
   ui::OzonePlatform* platform = ui::OzonePlatform::GetInstance();
diff --git a/media/gpu/test/video_decode_accelerator_unittest_helpers.h b/media/gpu/test/video_decode_accelerator_unittest_helpers.h
index c22e43d..ca5a177 100644
--- a/media/gpu/test/video_decode_accelerator_unittest_helpers.h
+++ b/media/gpu/test/video_decode_accelerator_unittest_helpers.h
@@ -15,6 +15,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread.h"
+#include "base/threading/thread_checker.h"
 #include "media/base/video_codecs.h"
 #include "media/base/video_types.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -59,11 +60,11 @@
  public:
   static scoped_refptr<TextureRef> Create(
       uint32_t texture_id,
-      const base::Closure& no_longer_needed_cb);
+      base::OnceClosure no_longer_needed_cb);
 
   static scoped_refptr<TextureRef> CreatePreallocated(
       uint32_t texture_id,
-      const base::Closure& no_longer_needed_cb,
+      base::OnceClosure no_longer_needed_cb,
       VideoPixelFormat pixel_format,
       const gfx::Size& size);
 
@@ -74,14 +75,15 @@
  private:
   friend class base::RefCounted<TextureRef>;
 
-  TextureRef(uint32_t texture_id, const base::Closure& no_longer_needed_cb);
+  TextureRef(uint32_t texture_id, base::OnceClosure no_longer_needed_cb);
   ~TextureRef();
 
   uint32_t texture_id_;
-  base::Closure no_longer_needed_cb_;
+  base::OnceClosure no_longer_needed_cb_;
 #if defined(OS_CHROMEOS)
   scoped_refptr<gfx::NativePixmap> pixmap_;
 #endif
+  THREAD_CHECKER(thread_checker_);
 };
 
 class EncodedDataHelper {
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
index 7cac10b..a89015a0 100644
--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.cc
@@ -1268,7 +1268,9 @@
   while (!input_ready_queue_.empty()) {
     const int buffer = input_ready_queue_.front();
     InputRecord& input_record = input_buffer_map_[buffer];
-    if (input_record.input_id == kFlushBufferId && decoder_cmd_supported_) {
+
+    bool flush_handled = false;
+    if (input_record.input_id == kFlushBufferId) {
       // Send the flush command after all input buffers are dequeued. This makes
       // sure all previous resolution changes have been handled because the
       // driver must hold the input buffer that triggers resolution change. The
@@ -1279,27 +1281,37 @@
       // yet. Also, V4L2VDA calls STREAMOFF and STREAMON after resolution
       // change. They implicitly send a V4L2_DEC_CMD_STOP and V4L2_DEC_CMD_START
       // to the decoder.
-      if (input_buffer_queued_count_ == 0) {
-        input_ready_queue_.pop();
-        free_input_buffers_.push_back(buffer);
-        input_record.input_id = -1;
-        if (coded_size_.IsEmpty() || !input_streamon_) {
-          // (1) If coded_size_.IsEmpty(), no output buffer could have been
-          // allocated and there is nothing to flush. We can NotifyFlushDone()
-          // immediately, without requesting flush to the driver via
-          // SendDecoderCmdStop().
-          // (2) If input stream is off, we will never get the output buffer
-          // with V4L2_BUF_FLAG_LAST. We should NotifyFlushDone().
-          NotifyFlushDoneIfNeeded();
-        } else if (!SendDecoderCmdStop()) {
-          return;
-        }
-      } else {
+      if (input_buffer_queued_count_ > 0)
         break;
+
+      if (coded_size_.IsEmpty() || !input_streamon_) {
+        // In these situations, we should call NotifyFlushDone() immediately:
+        // (1) If coded_size_.IsEmpty(), no output buffer could have been
+        // allocated and there is nothing to flush.
+        // (2) If input stream is off, we will never get the output buffer
+        // with V4L2_BUF_FLAG_LAST.
+        VLOGF(2) << "Nothing to flush. Notify flush done directly.";
+        NofityFlushDone();
+        flush_handled = true;
+      } else if (decoder_cmd_supported_) {
+        if (!SendDecoderCmdStop())
+          return;
+        flush_handled = true;
       }
-    } else if (!EnqueueInputRecord())
-      return;
+    }
+    if (flush_handled) {
+      // Recycle the buffer directly if we already handled the flush request.
+      input_ready_queue_.pop();
+      free_input_buffers_.push_back(buffer);
+      input_record.input_id = -1;
+    } else {
+      // Enqueue an input buffer, or an empty flush buffer if decoder cmd
+      // is not supported and there may be buffers to be flushed.
+      if (!EnqueueInputRecord())
+        return;
+    }
   }
+
   if (old_inputs_queued == 0 && input_buffer_queued_count_ != 0) {
     // We just started up a previously empty queue.
     // Queue state changed; signal interrupt.
@@ -1693,14 +1705,17 @@
   if (!StartDevicePoll())
     return;
 
+  NofityFlushDone();
+  // While we were flushing, we early-outed DecodeBufferTask()s.
+  ScheduleDecodeBufferTaskIfNeeded();
+}
+
+void V4L2VideoDecodeAccelerator::NofityFlushDone() {
   decoder_delay_bitstream_buffer_id_ = -1;
   decoder_flushing_ = false;
   VLOGF(2) << "returning flush";
   child_task_runner_->PostTask(FROM_HERE,
                                base::Bind(&Client::NotifyFlushDone, client_));
-
-  // While we were flushing, we early-outed DecodeBufferTask()s.
-  ScheduleDecodeBufferTaskIfNeeded();
 }
 
 bool V4L2VideoDecodeAccelerator::IsDecoderCmdSupported() {
diff --git a/media/gpu/v4l2/v4l2_video_decode_accelerator.h b/media/gpu/v4l2/v4l2_video_decode_accelerator.h
index 9cd9fa3..7dbdeaf 100644
--- a/media/gpu/v4l2/v4l2_video_decode_accelerator.h
+++ b/media/gpu/v4l2/v4l2_video_decode_accelerator.h
@@ -300,6 +300,8 @@
   // called any time a relevant queue could potentially be emptied: see
   // function definition.
   void NotifyFlushDoneIfNeeded();
+  // Notify the client of a flush completion.
+  void NofityFlushDone();
   // Returns true if VIDIOC_DECODER_CMD is supported.
   bool IsDecoderCmdSupported();
   // Send V4L2_DEC_CMD_START to the driver. Return true if success.
diff --git a/media/gpu/vaapi/va.sigs b/media/gpu/vaapi/va.sigs
index 1fe0bb23..d4ce5c4d 100644
--- a/media/gpu/vaapi/va.sigs
+++ b/media/gpu/vaapi/va.sigs
@@ -24,10 +24,12 @@
 VAStatus vaGetImage(VADisplay dpy, VASurfaceID surface, int x, int y, unsigned int width, unsigned int height, VAImageID image);
 VAStatus vaInitialize(VADisplay dpy, int *major_version, int *minor_version);
 VAStatus vaMapBuffer(VADisplay dpy, VABufferID buf_id, void **pbuf);
-int vaMaxNumEntrypoints (VADisplay dpy);
+int vaMaxNumEntrypoints(VADisplay dpy);
+int vaMaxNumImageFormats(VADisplay dpy);
 int vaMaxNumProfiles(VADisplay dpy);
-VAStatus vaQueryConfigEntrypoints (VADisplay dpy, VAProfile profile, VAEntrypoint *entrypoint_list, int *num_entrypoints);
+VAStatus vaQueryConfigEntrypoints(VADisplay dpy, VAProfile profile, VAEntrypoint *entrypoint_list, int *num_entrypoints);
 VAStatus vaQueryConfigProfiles(VADisplay dpy, VAProfile *profile_list, int *num_profiles);
+VAStatus vaQueryImageFormats(VADisplay dpy, VAImageFormat *format_list, int *num_formats);
 VAStatus vaQuerySurfaceAttributes(VADisplay dpy, VAConfigID config, VASurfaceAttrib *attrib_list, unsigned int *num_attribs);
 const char* vaQueryVendorString(VADisplay dpy);
 VAStatus vaRenderPicture(VADisplay dpy, VAContextID context, VABufferID *buffers, int num_buffers);
diff --git a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc
index e12f72da..7c09af1 100644
--- a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.cc
@@ -123,8 +123,11 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner)
     : task_runner_(base::ThreadTaskRunnerHandle::Get()),
       io_task_runner_(io_task_runner),
+      client_(nullptr),
       decoder_thread_("VaapiJpegDecoderThread"),
       va_surface_id_(VA_INVALID_SURFACE),
+      va_rt_format_(0),
+      va_image_format_{},
       weak_this_factory_(this) {}
 
 VaapiJpegDecodeAccelerator::~VaapiJpegDecodeAccelerator() {
@@ -141,6 +144,21 @@
 
   client_ = client;
 
+  // Set the image format that will be requested from the VA API. Currently we
+  // always use I420, as this is the expected output format.
+  // TODO(crbug.com/828119): Try a list of possible supported formats rather
+  // than hardcoding the format to I420 here.
+  VAImageFormat va_image_format = {};
+  va_image_format.fourcc = VA_FOURCC_I420;
+  va_image_format.byte_order = VA_LSB_FIRST;
+  va_image_format.bits_per_pixel = 12;
+
+  if (!VaapiWrapper::IsImageFormatSupported(va_image_format)) {
+    VLOGF(1) << "I420 image format not supported";
+    return false;
+  }
+  va_image_format_ = va_image_format;
+
   vaapi_wrapper_ =
       VaapiWrapper::Create(VaapiWrapper::kDecode, VAProfileJPEGBaseline,
                            base::Bind(&ReportToUMA, VAAPI_ERROR));
@@ -173,15 +191,10 @@
             << input_buffer_id;
 
   VAImage image = {};
-  VAImageFormat format = {};
-  format.fourcc = VA_FOURCC_I420;
-  format.byte_order = VA_LSB_FIRST;
-  format.bits_per_pixel = 12;  // 12 for I420
-
   uint8_t* mem = nullptr;
   gfx::Size coded_size = video_frame->coded_size();
-  if (!vaapi_wrapper_->GetVaImage(va_surface_id, &format, coded_size, &image,
-                                  reinterpret_cast<void**>(&mem))) {
+  if (!vaapi_wrapper_->GetVaImage(va_surface_id, &va_image_format_, coded_size,
+                                  &image, reinterpret_cast<void**>(&mem))) {
     VLOGF(1) << "Cannot get VAImage";
     return false;
   }
diff --git a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.h b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.h
index 30500a1..f3f6e74 100644
--- a/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.h
+++ b/media/gpu/vaapi/vaapi_jpeg_decode_accelerator.h
@@ -90,6 +90,8 @@
   gfx::Size coded_size_;
   // The VA RT format associated with |va_surface_id_|.
   unsigned int va_rt_format_;
+  // The VA image format that will be requested from the VA API.
+  VAImageFormat va_image_format_;
 
   // WeakPtr factory for use in posting tasks from |decoder_task_runner_| back
   // to |task_runner_|.  Since |decoder_thread_| is a fully owned member of
diff --git a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
index ec78f47e..afedbcd4 100644
--- a/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
+++ b/media/gpu/vaapi/vaapi_jpeg_encode_accelerator.cc
@@ -13,7 +13,7 @@
 #include "base/logging.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sequence_checker.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "media/base/bind_to_current_loop.h"
diff --git a/media/gpu/vaapi/vaapi_wrapper.cc b/media/gpu/vaapi/vaapi_wrapper.cc
index 67ab520..e92c8fc 100644
--- a/media/gpu/vaapi/vaapi_wrapper.cc
+++ b/media/gpu/vaapi/vaapi_wrapper.cc
@@ -510,7 +510,7 @@
     base::AutoLock auto_lock(*va_lock_);
     VAStatus va_res = VA_STATUS_SUCCESS;
     display_state->Deinitialize(&va_res);
-    VA_LOG_ON_ERROR(va_res, "vaTerminate failed");
+    VA_LOG_ON_ERROR(va_res, "VADisplayState::Deinitialize failed");
     va_display_ = nullptr;
   }
 }
@@ -699,6 +699,95 @@
     vaDestroyImage(va_display, image.image_id);
 }
 
+// This class encapsulates fetching the list of supported output image formats
+// from the VAAPI driver, in a singleton way.
+class VASupportedImageFormats {
+ public:
+  static const VASupportedImageFormats& Get();
+
+  bool IsImageFormatSupported(const VAImageFormat& va_format) const;
+
+ private:
+  friend class base::NoDestructor<VASupportedImageFormats>;
+
+  VASupportedImageFormats();
+  ~VASupportedImageFormats() = default;
+
+  // Initialize the list of supported image formats. The VA display should be
+  // locked upon calling this function.
+  bool InitSupportedImageFormats();
+
+  std::vector<VAImageFormat> supported_formats_;
+  const base::RepeatingClosure report_error_to_uma_cb_;
+
+  DISALLOW_COPY_AND_ASSIGN(VASupportedImageFormats);
+};
+
+// static
+const VASupportedImageFormats& VASupportedImageFormats::Get() {
+  static const base::NoDestructor<VASupportedImageFormats> image_formats;
+  return *image_formats;
+}
+
+bool VASupportedImageFormats::IsImageFormatSupported(
+    const VAImageFormat& va_image_format) const {
+  auto it = std::find_if(supported_formats_.begin(), supported_formats_.end(),
+                         [&va_image_format](const VAImageFormat& format) {
+                           return format.fourcc == va_image_format.fourcc;
+                         });
+  return it != supported_formats_.end();
+}
+
+VASupportedImageFormats::VASupportedImageFormats()
+    : report_error_to_uma_cb_(base::DoNothing()) {
+  VADisplayState* display_state = VADisplayState::Get();
+  base::Lock* va_lock = display_state->va_lock();
+  base::AutoLock auto_lock(*va_lock);
+
+  if (!display_state->Initialize())
+    return;
+
+  VADisplay va_display = display_state->va_display();
+  DCHECK(va_display) << "VADisplayState hasn't been properly initialized";
+
+  if (!InitSupportedImageFormats())
+    LOG(ERROR) << "Failed to get supported image formats";
+
+  VAStatus va_res = VA_STATUS_SUCCESS;
+  display_state->Deinitialize(&va_res);
+  VA_LOG_ON_ERROR(va_res, "VADisplayState::Deinitialize failed");
+}
+
+bool VASupportedImageFormats::InitSupportedImageFormats() {
+  VADisplayState* display_state = VADisplayState::Get();
+  display_state->va_lock()->AssertAcquired();
+  VADisplay va_display = display_state->va_display();
+  DCHECK(va_display) << "VADisplayState hasn't been properly initialized";
+
+  // Query the driver for the max number of image formats and allocate space.
+  const int max_image_formats = vaMaxNumImageFormats(va_display);
+  if (max_image_formats < 0) {
+    LOG(ERROR) << "vaMaxNumImageFormats returned: " << max_image_formats;
+    return false;
+  }
+  supported_formats_.resize(static_cast<size_t>(max_image_formats));
+
+  // Query the driver for the list of supported image formats.
+  int num_image_formats;
+  VAStatus va_res = vaQueryImageFormats(va_display, supported_formats_.data(),
+                                        &num_image_formats);
+  VA_SUCCESS_OR_RETURN(va_res, "vaQueryImageFormats failed", false);
+  if (num_image_formats < 0 || num_image_formats > max_image_formats) {
+    LOG(ERROR) << "vaQueryImageFormats returned: " << num_image_formats;
+    supported_formats_.clear();
+    return false;
+  }
+
+  // Resize the list to the actual number of formats returned by the driver.
+  supported_formats_.resize(static_cast<size_t>(num_image_formats));
+  return true;
+}
+
 }  // namespace
 
 // static
@@ -792,6 +881,11 @@
                                                        VAProfileJPEGBaseline);
 }
 
+// static
+bool VaapiWrapper::IsImageFormatSupported(const VAImageFormat& format) {
+  return VASupportedImageFormats::Get().IsImageFormatSupported(format);
+}
+
 bool VaapiWrapper::CreateSurfaces(unsigned int va_format,
                                   const gfx::Size& size,
                                   size_t num_surfaces,
diff --git a/media/gpu/vaapi/vaapi_wrapper.h b/media/gpu/vaapi/vaapi_wrapper.h
index b892b46a..db9024b9 100644
--- a/media/gpu/vaapi/vaapi_wrapper.h
+++ b/media/gpu/vaapi/vaapi_wrapper.h
@@ -89,6 +89,9 @@
   // Return true when JPEG encode is supported.
   static bool IsJpegEncodeSupported();
 
+  // Return true when the specified image format is supported.
+  static bool IsImageFormatSupported(const VAImageFormat& format);
+
   // Creates |num_surfaces| backing surfaces in driver for VASurfaces of
   // |va_format|, each of size |size|. Returns true when successful, with the
   // created IDs in |va_surfaces| to be managed and later wrapped in
diff --git a/media/gpu/video_decode_accelerator_unittest.cc b/media/gpu/video_decode_accelerator_unittest.cc
index eeaf915..5705bfa 100644
--- a/media/gpu/video_decode_accelerator_unittest.cc
+++ b/media/gpu/video_decode_accelerator_unittest.cc
@@ -506,35 +506,16 @@
 
   texture_target_ = texture_target;
   for (uint32_t i = 0; i < requested_num_of_buffers; ++i) {
-    uint32_t texture_id;
-    base::WaitableEvent done(base::WaitableEvent::ResetPolicy::AUTOMATIC,
-                             base::WaitableEvent::InitialState::NOT_SIGNALED);
-    rendering_helper_->CreateTexture(texture_target_, &texture_id, dimensions,
-                                     &done);
-    done.Wait();
-
-    scoped_refptr<media::test::TextureRef> texture_ref;
-    base::Closure delete_texture_cb =
-        base::Bind(&RenderingHelper::DeleteTexture,
-                   base::Unretained(rendering_helper_), texture_id);
-
-    if (g_test_import) {
-      texture_ref = media::test::TextureRef::CreatePreallocated(
-          texture_id, delete_texture_cb, pixel_format, dimensions);
-    } else {
-      texture_ref =
-          media::test::TextureRef::Create(texture_id, delete_texture_cb);
-    }
-
+    auto texture_ref = rendering_helper_->CreateTexture(
+        texture_target_, g_test_import, pixel_format, dimensions);
     LOG_ASSERT(texture_ref);
-
     int32_t picture_buffer_id = next_picture_buffer_id_++;
     int irrelevant_id = picture_buffer_id;
     LOG_ASSERT(
         active_textures_.insert(std::make_pair(picture_buffer_id, texture_ref))
             .second);
 
-    PictureBuffer::TextureIds texture_ids(1, texture_id);
+    PictureBuffer::TextureIds texture_ids(1, texture_ref->texture_id());
     buffers.push_back(PictureBuffer(picture_buffer_id, dimensions,
                                     PictureBuffer::TextureIds{irrelevant_id++},
                                     texture_ids, texture_target, pixel_format));
diff --git a/media/media_options.gni b/media/media_options.gni
index de94689..d8e20f6 100644
--- a/media/media_options.gni
+++ b/media/media_options.gni
@@ -5,7 +5,6 @@
 import("//build/config/chrome_build.gni")
 import("//build/config/chromecast_build.gni")
 import("//build/config/features.gni")
-import("//chromeos/assistant/assistant.gni")
 import("//testing/libfuzzer/fuzzer_test.gni")
 
 # Do not expand this list without double-checking with OWNERS, this is a list of
@@ -174,13 +173,6 @@
 _default_mojo_media_services = []
 _default_mojo_media_host = "none"
 
-# Mojo media host for Chrome OS Assistant.
-_default_assistant_mojo_media_host = "none"
-
-# Enables the use of Assistant Audio Decoder Service. If true, it will be hosted
-# in the mojo MediaService running in the utility process.
-enable_assistant_audio_decoder = is_chromeos && enable_cros_libassistant
-
 # Default mojo_media_services and mojo_media_host on various platforms.
 # Can be overridden by gn build arguments from the --args command line flag
 # for local testing.
@@ -204,12 +196,6 @@
     _default_mojo_media_host = "gpu"
   }
 
-  if (enable_assistant_audio_decoder) {
-    # Chrome OS Assistant uses audio decoder running in utility process.
-    _default_mojo_media_services += [ "assistant_audio_decoder" ]
-    _default_assistant_mojo_media_host = "utility"
-  }
-
   if (enable_library_cdms) {
     _default_mojo_media_services += [ "cdm" ]
 
@@ -249,7 +235,6 @@
   # - "gpu": Use mojo media service hosted in the gpu process.
   # - "utility": Use mojo media service hosted in the utility process.
   mojo_media_host = _default_mojo_media_host
-  assistant_mojo_media_host = _default_assistant_mojo_media_host
 }
 
 declare_args() {
diff --git a/media/mojo/BUILD.gn b/media/mojo/BUILD.gn
index cc25c03..21dc54f0 100644
--- a/media/mojo/BUILD.gn
+++ b/media/mojo/BUILD.gn
@@ -12,7 +12,6 @@
   enable_mojo_renderer = false
   enable_mojo_cdm = false
   enable_mojo_audio_decoder = false
-  enable_assistant_mojo_audio_decoder = false
   enable_mojo_video_decoder = false
   enable_mojo_media_in_browser_process = false
   enable_mojo_media_in_gpu_process = false
@@ -31,8 +30,6 @@
         enable_mojo_cdm = true
       } else if (service == "audio_decoder") {
         enable_mojo_audio_decoder = true
-      } else if (service == "assistant_audio_decoder") {
-        enable_assistant_mojo_audio_decoder = true
       } else if (service == "video_decoder") {
         enable_mojo_video_decoder = true
       } else {
@@ -52,10 +49,6 @@
     } else {
       assert(false, "Invalid mojo media host: $mojo_media_host")
     }
-
-    if (assistant_mojo_media_host == "utility") {
-      enable_mojo_media_in_utility_process = true
-    }
   }
 
   flags = [
@@ -64,7 +57,6 @@
     "ENABLE_MOJO_RENDERER=$enable_mojo_renderer",
     "ENABLE_MOJO_CDM=$enable_mojo_cdm",
     "ENABLE_MOJO_AUDIO_DECODER=$enable_mojo_audio_decoder",
-    "ENABLE_ASSISTANT_MOJO_AUDIO_DECODER=$enable_assistant_mojo_audio_decoder",
     "ENABLE_MOJO_VIDEO_DECODER=$enable_mojo_video_decoder",
     "ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS=$enable_mojo_media_in_browser_process",
     "ENABLE_MOJO_MEDIA_IN_GPU_PROCESS=$enable_mojo_media_in_gpu_process",
diff --git a/media/mojo/interfaces/media_metrics_provider.mojom b/media/mojo/interfaces/media_metrics_provider.mojom
index 570a58c..6695f31a 100644
--- a/media/mojo/interfaces/media_metrics_provider.mojom
+++ b/media/mojo/interfaces/media_metrics_provider.mojom
@@ -9,7 +9,6 @@
 import "media/mojo/interfaces/watch_time_recorder.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
-import "url/mojom/origin.mojom";
 
 // Provider interface used to avoid having one time setters on each interface.
 // Each recorder will be stamped with an ID which can be used for linking UKM.
@@ -17,10 +16,7 @@
   // Assigns a playback ID and sets up this provider instance with information
   // needed to make UKM reports. No other methods may be called until after
   // Initialize() has been called.
-  //
-  // TODO(crbug.com/787209): Stop getting origin from the renderer.
-  Initialize(bool is_mse, bool is_top_frame,
-             url.mojom.Origin untrusted_top_origin);
+  Initialize(bool is_mse);
 
   // Called when a playback ends in error. The status is reported to UKM when
   // the provider is destructed.
@@ -37,10 +33,6 @@
   AcquireWatchTimeRecorder(PlaybackProperties properties,
                            WatchTimeRecorder& recorder);
 
-  // Creates a VideoDecodeStatsRecorder instance. Provide the origin of the top
-  // frame of the page hosting the video. Privacy team requires we use only the
-  // top-frame origin. |is_top_frame| signals whether the video is hosted in the
-  // top frame vs some inner frame to help interpret the origin.
-  // TODO(crbug.com/787209): Stop getting origin from the renderer.
+  // Creates a VideoDecodeStatsRecorder instance.
   AcquireVideoDecodeStatsRecorder(VideoDecodeStatsRecorder& recorder);
 };
diff --git a/media/mojo/services/BUILD.gn b/media/mojo/services/BUILD.gn
index 3f4caa5..fad29c2 100644
--- a/media/mojo/services/BUILD.gn
+++ b/media/mojo/services/BUILD.gn
@@ -145,13 +145,6 @@
       deps += [ "//sandbox" ]
     }
   }
-
-  if (enable_assistant_audio_decoder) {
-    sources += [
-      "assistant_mojo_media_client.cc",
-      "assistant_mojo_media_client.h",
-    ]
-  }
 }
 
 service_manifest("cdm_manifest") {
diff --git a/media/mojo/services/android_mojo_media_client.cc b/media/mojo/services/android_mojo_media_client.cc
index 5b54734..7fd230d 100644
--- a/media/mojo/services/android_mojo_media_client.cc
+++ b/media/mojo/services/android_mojo_media_client.cc
@@ -29,8 +29,7 @@
 // MojoMediaClient overrides.
 
 std::unique_ptr<AudioDecoder> AndroidMojoMediaClient::CreateAudioDecoder(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    MediaLog* media_log) {
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   return std::make_unique<MediaCodecAudioDecoder>(task_runner);
 }
 
diff --git a/media/mojo/services/android_mojo_media_client.h b/media/mojo/services/android_mojo_media_client.h
index ade9b46..346a708 100644
--- a/media/mojo/services/android_mojo_media_client.h
+++ b/media/mojo/services/android_mojo_media_client.h
@@ -20,8 +20,7 @@
 
   // MojoMediaClient implementation.
   std::unique_ptr<AudioDecoder> CreateAudioDecoder(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      MediaLog* media_log) final;
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner) final;
 
   std::unique_ptr<CdmFactory> CreateCdmFactory(
       service_manager::mojom::InterfaceProvider* host_interfaces) final;
diff --git a/media/mojo/services/assistant_mojo_media_client.cc b/media/mojo/services/assistant_mojo_media_client.cc
deleted file mode 100644
index dacee91..0000000
--- a/media/mojo/services/assistant_mojo_media_client.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "media/mojo/services/assistant_mojo_media_client.h"
-
-#include "base/single_thread_task_runner.h"
-#include "media/base/audio_decoder.h"
-#include "media/filters/ffmpeg_audio_decoder.h"
-
-namespace media {
-
-AssistantMojoMediaClient::AssistantMojoMediaClient() = default;
-
-AssistantMojoMediaClient::~AssistantMojoMediaClient() = default;
-
-std::unique_ptr<AudioDecoder> AssistantMojoMediaClient::CreateAudioDecoder(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    MediaLog* media_log) {
-  return std::make_unique<FFmpegAudioDecoder>(std::move(task_runner),
-                                              media_log);
-}
-
-}  // namespace media
diff --git a/media/mojo/services/assistant_mojo_media_client.h b/media/mojo/services/assistant_mojo_media_client.h
deleted file mode 100644
index 1c55461..0000000
--- a/media/mojo/services/assistant_mojo_media_client.h
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef MEDIA_MOJO_SERVICES_ASSISTANT_MOJO_MEDIA_CLIENT_H_
-#define MEDIA_MOJO_SERVICES_ASSISTANT_MOJO_MEDIA_CLIENT_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/memory/scoped_refptr.h"
-#include "media/base/media_log.h"
-#include "media/mojo/services/mojo_media_client.h"
-
-namespace base {
-class SingleThreadTaskRunner;
-}  // namespace base
-
-namespace media {
-
-class MediaLog;
-
-class AssistantMojoMediaClient : public MojoMediaClient {
- public:
-  AssistantMojoMediaClient();
-  ~AssistantMojoMediaClient() final;
-
-  // MojoMediaClient implementation.
-  std::unique_ptr<AudioDecoder> CreateAudioDecoder(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      MediaLog* media_log) final;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(AssistantMojoMediaClient);
-};
-
-}  // namespace media
-
-#endif  // MEDIA_MOJO_SERVICES_ASSISTANT_MOJO_MEDIA_CLIENT_H_
diff --git a/media/mojo/services/gpu_mojo_media_client.cc b/media/mojo/services/gpu_mojo_media_client.cc
index 8a3c1367..bbf4a8f 100644
--- a/media/mojo/services/gpu_mojo_media_client.cc
+++ b/media/mojo/services/gpu_mojo_media_client.cc
@@ -86,8 +86,7 @@
 void GpuMojoMediaClient::Initialize(service_manager::Connector* connector) {}
 
 std::unique_ptr<AudioDecoder> GpuMojoMediaClient::CreateAudioDecoder(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    MediaLog* media_log) {
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
 #if defined(OS_ANDROID)
   return std::make_unique<MediaCodecAudioDecoder>(task_runner);
 #else
diff --git a/media/mojo/services/gpu_mojo_media_client.h b/media/mojo/services/gpu_mojo_media_client.h
index 6820f51..9bbf3cc 100644
--- a/media/mojo/services/gpu_mojo_media_client.h
+++ b/media/mojo/services/gpu_mojo_media_client.h
@@ -39,8 +39,7 @@
   // MojoMediaClient implementation.
   void Initialize(service_manager::Connector* connector) final;
   std::unique_ptr<AudioDecoder> CreateAudioDecoder(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      MediaLog* media_log) final;
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner) final;
   std::unique_ptr<VideoDecoder> CreateVideoDecoder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       MediaLog* media_log,
diff --git a/media/mojo/services/interface_factory_impl.cc b/media/mojo/services/interface_factory_impl.cc
index 225b47ba..1465a28 100644
--- a/media/mojo/services/interface_factory_impl.cc
+++ b/media/mojo/services/interface_factory_impl.cc
@@ -16,11 +16,9 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom.h"
 
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
 #include "media/mojo/services/mojo_audio_decoder_service.h"
-#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) ||
-        // BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
 
 #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
 #include "media/mojo/services/mojo_video_decoder_service.h"
@@ -49,8 +47,7 @@
     std::unique_ptr<service_manager::ServiceContextRef> connection_ref,
     MojoMediaClient* mojo_media_client)
     :
-#if BUILDFLAG(ENABLE_MOJO_RENDERER) || BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#if BUILDFLAG(ENABLE_MOJO_RENDERER)
       media_log_(media_log),
 #endif
 #if BUILDFLAG(ENABLE_MOJO_CDM)
@@ -73,13 +70,12 @@
 void InterfaceFactoryImpl::CreateAudioDecoder(
     mojo::InterfaceRequest<mojom::AudioDecoder> request) {
   DVLOG(2) << __func__;
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
   scoped_refptr<base::SingleThreadTaskRunner> task_runner(
       base::ThreadTaskRunnerHandle::Get());
 
   std::unique_ptr<AudioDecoder> audio_decoder =
-      mojo_media_client_->CreateAudioDecoder(task_runner, media_log_);
+      mojo_media_client_->CreateAudioDecoder(task_runner);
   if (!audio_decoder) {
     DLOG(ERROR) << "AudioDecoder creation failed.";
     return;
@@ -89,8 +85,7 @@
       std::make_unique<MojoAudioDecoderService>(&cdm_service_context_,
                                                 std::move(audio_decoder)),
       std::move(request));
-#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) ||
-        // BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
 }
 
 void InterfaceFactoryImpl::CreateVideoDecoder(
@@ -207,12 +202,10 @@
 }
 
 bool InterfaceFactoryImpl::IsEmpty() {
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
   if (!audio_decoder_bindings_.empty())
     return false;
-#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) ||
-        // BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
 
 #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
   if (!video_decoder_bindings_.empty())
@@ -247,11 +240,9 @@
   auto connection_error_cb = base::BindRepeating(
       &InterfaceFactoryImpl::OnBindingConnectionError, base::Unretained(this));
 
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
   audio_decoder_bindings_.set_connection_error_handler(connection_error_cb);
-#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) ||
-        // BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
 
 #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
   video_decoder_bindings_.set_connection_error_handler(connection_error_cb);
diff --git a/media/mojo/services/interface_factory_impl.h b/media/mojo/services/interface_factory_impl.h
index 445b00c7..486fdae 100644
--- a/media/mojo/services/interface_factory_impl.h
+++ b/media/mojo/services/interface_factory_impl.h
@@ -63,24 +63,16 @@
   // available.
   MojoCdmServiceContext cdm_service_context_;
 
-#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
   mojo::StrongBindingSet<mojom::AudioDecoder> audio_decoder_bindings_;
-#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) ||
-        // BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
+#endif  // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
 
 #if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
   mojo::StrongBindingSet<mojom::VideoDecoder> video_decoder_bindings_;
 #endif  // BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
 
-#if BUILDFLAG(ENABLE_MOJO_RENDERER) || BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) || \
-    BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
-  MediaLog* media_log_;
-#endif  // BUILDFLAG(ENABLE_MOJO_RENDERER) ||
-        // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER) ||
-        // BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
-
 #if BUILDFLAG(ENABLE_MOJO_RENDERER)
+  MediaLog* media_log_;
   mojo::StrongBindingSet<mojom::Renderer> renderer_bindings_;
 #endif  // BUILDFLAG(ENABLE_MOJO_RENDERER)
 
diff --git a/media/mojo/services/media_metrics_provider.cc b/media/mojo/services/media_metrics_provider.cc
index cac2c21..21a7a5f 100644
--- a/media/mojo/services/media_metrics_provider.cc
+++ b/media/mojo/services/media_metrics_provider.cc
@@ -18,8 +18,13 @@
 static uint64_t g_player_id = 0;
 
 MediaMetricsProvider::MediaMetricsProvider(
+    bool is_top_frame,
+    ukm::SourceId source_id,
     VideoDecodePerfHistory::SaveCallback save_cb)
-    : player_id_(g_player_id++), save_cb_(save_cb) {}
+    : player_id_(g_player_id++),
+      is_top_frame_(is_top_frame),
+      source_id_(source_id),
+      save_cb_(std::move(save_cb)) {}
 
 MediaMetricsProvider::~MediaMetricsProvider() {
   // UKM may be unavailable in content_shell or other non-chrome/ builds; it
@@ -29,11 +34,7 @@
   if (!ukm_recorder || !initialized_)
     return;
 
-  const ukm::SourceId source_id = ukm_recorder->GetNewSourceID();
-
-  // TODO(crbug.com/787209): Stop getting origin from the renderer.
-  ukm_recorder->UpdateSourceURL(source_id, untrusted_top_origin_.GetURL());
-  ukm::builders::Media_WebMediaPlayerState builder(source_id);
+  ukm::builders::Media_WebMediaPlayerState builder(source_id_);
   builder.SetPlayerID(player_id_);
   builder.SetIsTopFrame(is_top_frame_);
   builder.SetIsEME(is_eme_);
@@ -51,24 +52,23 @@
 }
 
 // static
-void MediaMetricsProvider::Create(VideoDecodePerfHistory::SaveCallback save_cb,
+void MediaMetricsProvider::Create(bool is_top_frame,
+                                  GetSourceIdCallback get_source_id_cb,
+                                  VideoDecodePerfHistory::SaveCallback save_cb,
                                   mojom::MediaMetricsProviderRequest request) {
   mojo::MakeStrongBinding(
-      std::make_unique<MediaMetricsProvider>(std::move(save_cb)),
+      std::make_unique<MediaMetricsProvider>(
+          is_top_frame, get_source_id_cb.Run(), std::move(save_cb)),
       std::move(request));
 }
 
-void MediaMetricsProvider::Initialize(bool is_mse,
-                                      bool is_top_frame,
-                                      const url::Origin& untrusted_top_origin) {
+void MediaMetricsProvider::Initialize(bool is_mse) {
   if (initialized_) {
     mojo::ReportBadMessage(kInvalidInitialize);
     return;
   }
 
   is_mse_ = is_mse;
-  is_top_frame_ = is_top_frame;
-  untrusted_top_origin_ = untrusted_top_origin;
   initialized_ = true;
 }
 
@@ -108,10 +108,10 @@
     return;
   }
 
-  mojo::MakeStrongBinding(std::make_unique<WatchTimeRecorder>(
-                              std::move(properties), untrusted_top_origin_,
-                              is_top_frame_, player_id_),
-                          std::move(request));
+  mojo::MakeStrongBinding(
+      std::make_unique<WatchTimeRecorder>(std::move(properties), source_id_,
+                                          is_top_frame_, player_id_),
+      std::move(request));
 }
 
 void MediaMetricsProvider::AcquireVideoDecodeStatsRecorder(
@@ -121,15 +121,14 @@
     return;
   }
 
-  if (save_cb_.is_null()) {
+  if (!save_cb_) {
     DVLOG(3) << __func__ << " Ignoring request, SaveCallback is null";
     return;
   }
 
-  mojo::MakeStrongBinding(
-      std::make_unique<VideoDecodeStatsRecorder>(
-          untrusted_top_origin_, is_top_frame_, player_id_, save_cb_),
-      std::move(request));
+  mojo::MakeStrongBinding(std::make_unique<VideoDecodeStatsRecorder>(
+                              save_cb_, source_id_, is_top_frame_, player_id_),
+                          std::move(request));
 }
 
 }  // namespace media
diff --git a/media/mojo/services/media_metrics_provider.h b/media/mojo/services/media_metrics_provider.h
index a870c583..6424ea7 100644
--- a/media/mojo/services/media_metrics_provider.h
+++ b/media/mojo/services/media_metrics_provider.h
@@ -12,7 +12,7 @@
 #include "media/mojo/interfaces/media_metrics_provider.mojom.h"
 #include "media/mojo/services/media_mojo_export.h"
 #include "media/mojo/services/video_decode_perf_history.h"
-#include "url/origin.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 
 namespace media {
 class VideoDecodePerfHistory;
@@ -21,19 +21,24 @@
 class MEDIA_MOJO_EXPORT MediaMetricsProvider
     : public mojom::MediaMetricsProvider {
  public:
-  explicit MediaMetricsProvider(VideoDecodePerfHistory::SaveCallback save_cb);
+  MediaMetricsProvider(bool is_top_frame,
+                       ukm::SourceId source_id,
+                       VideoDecodePerfHistory::SaveCallback save_cb);
   ~MediaMetricsProvider() override;
 
+  // Callback for retrieving a ukm::SourceId.
+  using GetSourceIdCallback = base::RepeatingCallback<ukm::SourceId(void)>;
+
   // Creates a MediaMetricsProvider, |perf_history| may be nullptr if perf
   // history database recording is disabled.
-  static void Create(VideoDecodePerfHistory::SaveCallback save_cb,
+  static void Create(bool is_top_frame,
+                     GetSourceIdCallback get_source_id_cb,
+                     VideoDecodePerfHistory::SaveCallback save_cb,
                      mojom::MediaMetricsProviderRequest request);
 
  private:
   // mojom::MediaMetricsProvider implementation:
-  void Initialize(bool is_mse,
-                  bool is_top_frame,
-                  const url::Origin& untrusted_top_origin) override;
+  void Initialize(bool is_mse) override;
   void OnError(PipelineStatus status) override;
   void SetIsEME() override;
   void SetTimeToMetadata(base::TimeDelta elapsed) override;
@@ -49,6 +54,13 @@
   // to coordinate multiply logged events with a singly logged metric.
   const uint64_t player_id_;
 
+  // Are UKM reports for the main frame or for a subframe?
+  const bool is_top_frame_;
+
+  const ukm::SourceId source_id_;
+
+  const VideoDecodePerfHistory::SaveCallback save_cb_;
+
   // These values are not always sent but have known defaults.
   PipelineStatus pipeline_status_ = PIPELINE_OK;
   bool is_eme_ = false;
@@ -56,15 +68,11 @@
   // The values below are only set if |initialized_| is true.
   bool initialized_ = false;
   bool is_mse_;
-  bool is_top_frame_;
-  url::Origin untrusted_top_origin_;
 
   base::TimeDelta time_to_metadata_ = kNoTimestamp;
   base::TimeDelta time_to_first_frame_ = kNoTimestamp;
   base::TimeDelta time_to_play_ready_ = kNoTimestamp;
 
-  const VideoDecodePerfHistory::SaveCallback save_cb_;
-
   DISALLOW_COPY_AND_ASSIGN(MediaMetricsProvider);
 };
 
diff --git a/media/mojo/services/media_metrics_provider_unittest.cc b/media/mojo/services/media_metrics_provider_unittest.cc
index 62e4328..0829200 100644
--- a/media/mojo/services/media_metrics_provider_unittest.cc
+++ b/media/mojo/services/media_metrics_provider_unittest.cc
@@ -30,12 +30,19 @@
   ~MediaMetricsProviderTest() override { base::RunLoop().RunUntilIdle(); }
 
   void Initialize(bool is_mse, bool is_top_frame, const std::string& origin) {
-    MediaMetricsProvider::Create(VideoDecodePerfHistory::SaveCallback(),
-                                 mojo::MakeRequest(&provider_));
-    provider_->Initialize(is_mse, is_top_frame,
-                          url::Origin::Create(GURL(origin)));
+    source_id_ = test_recorder_->GetNewSourceID();
+    test_recorder_->UpdateSourceURL(source_id_, GURL(origin));
+
+    MediaMetricsProvider::Create(
+        is_top_frame,
+        base::BindRepeating(&MediaMetricsProviderTest::GetSourceId,
+                            base::Unretained(this)),
+        VideoDecodePerfHistory::SaveCallback(), mojo::MakeRequest(&provider_));
+    provider_->Initialize(is_mse);
   }
 
+  ukm::SourceId GetSourceId() { return source_id_; }
+
   void ResetMetricRecorders() {
     // Ensure cleared global before attempting to create a new TestUkmReporter.
     test_recorder_.reset();
@@ -45,6 +52,7 @@
  protected:
   base::TestMessageLoop message_loop_;
   std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_recorder_;
+  ukm::SourceId source_id_;
   mojom::MediaMetricsProviderPtr provider_;
 
   DISALLOW_COPY_AND_ASSIGN(MediaMetricsProviderTest);
diff --git a/media/mojo/services/media_service_factory.cc b/media/mojo/services/media_service_factory.cc
index 1f7bffb..b789dfd 100644
--- a/media/mojo/services/media_service_factory.cc
+++ b/media/mojo/services/media_service_factory.cc
@@ -7,15 +7,10 @@
 #include <memory>
 
 #include "base/logging.h"
-#include "media/mojo/buildflags.h"
 #include "media/mojo/services/gpu_mojo_media_client.h"
 #include "media/mojo/services/media_service.h"
 #include "media/mojo/services/test_mojo_media_client.h"
 
-#if BUILDFLAG(ENABLE_MOJO_MEDIA_IN_UTILITY_PROCESS)
-#include "media/mojo/services/assistant_mojo_media_client.h"  // nogncheck
-#endif
-
 #if defined(OS_ANDROID)
 #include "media/mojo/services/android_mojo_media_client.h"  // nogncheck
 #endif
@@ -28,9 +23,6 @@
 #elif defined(OS_ANDROID)
   return std::unique_ptr<service_manager::Service>(
       new MediaService(std::make_unique<AndroidMojoMediaClient>()));
-#elif BUILDFLAG(ENABLE_ASSISTANT_MOJO_AUDIO_DECODER)
-  return std::make_unique<MediaService>(
-      std::make_unique<AssistantMojoMediaClient>());
 #else
   NOTREACHED() << "No MediaService implementation available.";
   return nullptr;
diff --git a/media/mojo/services/media_service_unittest.cc b/media/mojo/services/media_service_unittest.cc
index 0d7cc7e1..fd341a4 100644
--- a/media/mojo/services/media_service_unittest.cc
+++ b/media/mojo/services/media_service_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "media/base/cdm_config.h"
 #include "media/base/mock_filters.h"
diff --git a/media/mojo/services/mojo_cdm_file_io.cc b/media/mojo/services/mojo_cdm_file_io.cc
index c384c88..d5df660 100644
--- a/media/mojo/services/mojo_cdm_file_io.cc
+++ b/media/mojo/services/mojo_cdm_file_io.cc
@@ -10,7 +10,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "mojo/public/cpp/bindings/callback_helpers.h"
diff --git a/media/mojo/services/mojo_media_client.cc b/media/mojo/services/mojo_media_client.cc
index f1f1f0f..04b7a722 100644
--- a/media/mojo/services/mojo_media_client.cc
+++ b/media/mojo/services/mojo_media_client.cc
@@ -24,8 +24,7 @@
 void MojoMediaClient::Initialize(service_manager::Connector* connector) {}
 
 std::unique_ptr<AudioDecoder> MojoMediaClient::CreateAudioDecoder(
-    scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-    MediaLog* media_log) {
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   return nullptr;
 }
 
diff --git a/media/mojo/services/mojo_media_client.h b/media/mojo/services/mojo_media_client.h
index 6a2a124..fbbd819 100644
--- a/media/mojo/services/mojo_media_client.h
+++ b/media/mojo/services/mojo_media_client.h
@@ -52,8 +52,7 @@
   virtual void Initialize(service_manager::Connector* connector);
 
   virtual std::unique_ptr<AudioDecoder> CreateAudioDecoder(
-      scoped_refptr<base::SingleThreadTaskRunner> task_runner,
-      MediaLog* media_log);
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
   virtual std::unique_ptr<VideoDecoder> CreateVideoDecoder(
       scoped_refptr<base::SingleThreadTaskRunner> task_runner,
diff --git a/media/mojo/services/video_decode_perf_history.cc b/media/mojo/services/video_decode_perf_history.cc
index d40fe8e3..37807f02 100644
--- a/media/mojo/services/video_decode_perf_history.cc
+++ b/media/mojo/services/video_decode_perf_history.cc
@@ -175,13 +175,12 @@
                              weak_ptr_factory_.GetWeakPtr());
 }
 
-void VideoDecodePerfHistory::SavePerfRecord(
-    const url::Origin& untrusted_top_frame_origin,
-    bool is_top_frame,
-    mojom::PredictionFeatures features,
-    mojom::PredictionTargets targets,
-    uint64_t player_id,
-    base::OnceClosure save_done_cb) {
+void VideoDecodePerfHistory::SavePerfRecord(ukm::SourceId source_id,
+                                            bool is_top_frame,
+                                            mojom::PredictionFeatures features,
+                                            mojom::PredictionTargets targets,
+                                            uint64_t player_id,
+                                            base::OnceClosure save_done_cb) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DVLOG(3) << __func__
            << base::StringPrintf(
@@ -200,8 +199,8 @@
   if (db_init_status_ != COMPLETE) {
     init_deferred_api_calls_.push_back(base::BindOnce(
         &VideoDecodePerfHistory::SavePerfRecord, weak_ptr_factory_.GetWeakPtr(),
-        untrusted_top_frame_origin, is_top_frame, std::move(features),
-        std::move(targets), player_id, std::move(save_done_cb)));
+        source_id, is_top_frame, std::move(features), std::move(targets),
+        player_id, std::move(save_done_cb)));
     InitDatabase();
     return;
   }
@@ -217,13 +216,12 @@
   db_->GetDecodeStats(
       video_key,
       base::BindOnce(&VideoDecodePerfHistory::OnGotStatsForSave,
-                     weak_ptr_factory_.GetWeakPtr(), untrusted_top_frame_origin,
-                     is_top_frame, player_id, video_key, new_stats,
-                     std::move(save_done_cb)));
+                     weak_ptr_factory_.GetWeakPtr(), source_id, is_top_frame,
+                     player_id, video_key, new_stats, std::move(save_done_cb)));
 }
 
 void VideoDecodePerfHistory::OnGotStatsForSave(
-    const url::Origin& untrusted_top_frame_origin,
+    ukm::SourceId source_id,
     bool is_top_frame,
     uint64_t player_id,
     const VideoDecodeStatsDB::VideoDescKey& video_key,
@@ -240,8 +238,8 @@
     return;
   }
 
-  ReportUkmMetrics(untrusted_top_frame_origin, is_top_frame, player_id,
-                   video_key, new_stats, past_stats.get());
+  ReportUkmMetrics(source_id, is_top_frame, player_id, video_key, new_stats,
+                   past_stats.get());
 
   // TODO(dalecurtis): Abort stats recording if db_ is in read-only mode.
 
@@ -267,7 +265,7 @@
 }
 
 void VideoDecodePerfHistory::ReportUkmMetrics(
-    const url::Origin& untrusted_top_frame_origin,
+    ukm::SourceId source_id,
     bool is_top_frame,
     uint64_t player_id,
     const VideoDecodeStatsDB::VideoDescKey& video_key,
@@ -282,11 +280,7 @@
   if (!ukm_recorder)
     return;
 
-  const ukm::SourceId source_id = ukm_recorder->GetNewSourceID();
   ukm::builders::Media_VideoDecodePerfRecord builder(source_id);
-
-  // TODO(crbug.com/787209): Stop getting origin from the renderer.
-  ukm_recorder->UpdateSourceURL(source_id, untrusted_top_frame_origin.GetURL());
   builder.SetVideo_InTopFrame(is_top_frame);
   builder.SetVideo_PlayerID(player_id);
 
diff --git a/media/mojo/services/video_decode_perf_history.h b/media/mojo/services/video_decode_perf_history.h
index 5ec8691..565989ea 100644
--- a/media/mojo/services/video_decode_perf_history.h
+++ b/media/mojo/services/video_decode_perf_history.h
@@ -19,8 +19,8 @@
 #include "media/mojo/interfaces/video_decode_perf_history.mojom.h"
 #include "media/mojo/services/media_mojo_export.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/gfx/geometry/size.h"
-#include "url/origin.h"
 
 namespace media {
 
@@ -65,13 +65,13 @@
   // This callback will silently fail if called after |this| is destroyed.
   // Saving is generally fire-and-forget, but |save_done_cb| may be provided
   // for tests to know the save is complete.
-  using SaveCallback = base::RepeatingCallback<void(
-      const url::Origin& untrusted_top_frame_origin,
-      bool is_top_frame,
-      mojom::PredictionFeatures features,
-      mojom::PredictionTargets targets,
-      uint64_t player_id,
-      base::OnceClosure save_done_cb)>;
+  using SaveCallback =
+      base::RepeatingCallback<void(ukm::SourceId source_id,
+                                   bool is_top_frame,
+                                   mojom::PredictionFeatures features,
+                                   mojom::PredictionTargets targets,
+                                   uint64_t player_id,
+                                   base::OnceClosure save_done_cb)>;
   SaveCallback GetSaveCallback();
 
   // Clear all history from the underlying database. Run |clear_done_cb| when
@@ -111,7 +111,7 @@
   void OnDatabaseInit(bool success);
 
   // Initiate saving of the provided record. See GetSaveCallback().
-  void SavePerfRecord(const url::Origin& untrusted_top_frame_origin,
+  void SavePerfRecord(ukm::SourceId source_id,
                       bool is_top_frame,
                       mojom::PredictionFeatures features,
                       mojom::PredictionTargets targets,
@@ -132,7 +132,7 @@
   // of the GetPerfInfo() API. Comparison is recorded via UKM. Then saves the
   // |new_*| performance stats to the database.
   void OnGotStatsForSave(
-      const url::Origin& top_frame_origin,
+      ukm::SourceId source_id,
       bool is_top_frame,
       uint64_t player_id,
       const VideoDecodeStatsDB::VideoDescKey& video_key,
@@ -147,7 +147,7 @@
 
   // Report UKM metrics to grade the claims of the API by evaluating how well
   // |past_stats| predicts |new_stats|.
-  void ReportUkmMetrics(const url::Origin& top_frame_origin,
+  void ReportUkmMetrics(ukm::SourceId source_id,
                         bool is_top_frame,
                         uint64_t player_id,
                         const VideoDecodeStatsDB::VideoDescKey& video_key,
diff --git a/media/mojo/services/video_decode_perf_history_unittest.cc b/media/mojo/services/video_decode_perf_history_unittest.cc
index 7fb59c1..b4a6f3ec 100644
--- a/media/mojo/services/video_decode_perf_history_unittest.cc
+++ b/media/mojo/services/video_decode_perf_history_unittest.cc
@@ -8,7 +8,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "components/ukm/test_ukm_recorder.h"
@@ -193,7 +193,7 @@
     return targets;
   }
 
-  void SavePerfRecord(const url::Origin& untrusted_top_frame_origin,
+  void SavePerfRecord(const url::Origin& origin,
                       bool is_top_frame,
                       mojom::PredictionFeatures features,
                       mojom::PredictionTargets targets,
@@ -202,9 +202,12 @@
     // save completes.
     base::OnceClosure save_done_cb;
 
-    perf_history_->GetSaveCallback().Run(untrusted_top_frame_origin,
-                                         is_top_frame, features, targets,
-                                         player_id, std::move(save_done_cb));
+    const ukm::SourceId source_id = test_recorder_->GetNewSourceID();
+    test_recorder_->UpdateSourceURL(source_id, origin.GetURL());
+
+    perf_history_->GetSaveCallback().Run(source_id, is_top_frame, features,
+                                         targets, player_id,
+                                         std::move(save_done_cb));
   }
 
  protected:
diff --git a/media/mojo/services/video_decode_stats_recorder.cc b/media/mojo/services/video_decode_stats_recorder.cc
index 46f12e72..ca1348f 100644
--- a/media/mojo/services/video_decode_stats_recorder.cc
+++ b/media/mojo/services/video_decode_stats_recorder.cc
@@ -12,21 +12,15 @@
 namespace media {
 
 VideoDecodeStatsRecorder::VideoDecodeStatsRecorder(
-    const url::Origin& untrusted_top_frame_origin,
+    VideoDecodePerfHistory::SaveCallback save_cb,
+    ukm::SourceId source_id,
     bool is_top_frame,
-    uint64_t player_id,
-    VideoDecodePerfHistory::SaveCallback save_cb)
-    : untrusted_top_frame_origin_(untrusted_top_frame_origin),
+    uint64_t player_id)
+    : save_cb_(std::move(save_cb)),
+      source_id_(source_id),
       is_top_frame_(is_top_frame),
-      save_cb_(std::move(save_cb)),
       player_id_(player_id) {
-  // Only bother to make the recorder when able to save stats. Checking here
-  // instead of silently failing below.
-  CHECK(!save_cb_.is_null());
-
-  DVLOG(2) << __func__
-           << " untrusted_top_frame_origin:" << untrusted_top_frame_origin
-           << " is_top_frame:" << is_top_frame;
+  DCHECK(save_cb_);
 }
 
 VideoDecodeStatsRecorder::~VideoDecodeStatsRecorder() {
@@ -85,8 +79,8 @@
 
   // Final argument is an empty save-done-callback. No action to take if save
   // fails (DB already records UMAs on failure). Callback mainly used by tests.
-  save_cb_.Run(untrusted_top_frame_origin_, is_top_frame_, features_, targets_,
-               player_id_, base::OnceClosure());
+  save_cb_.Run(source_id_, is_top_frame_, features_, targets_, player_id_,
+               base::OnceClosure());
 }
 
 }  // namespace media
diff --git a/media/mojo/services/video_decode_stats_recorder.h b/media/mojo/services/video_decode_stats_recorder.h
index e432d4cb4..149c19029 100644
--- a/media/mojo/services/video_decode_stats_recorder.h
+++ b/media/mojo/services/video_decode_stats_recorder.h
@@ -25,10 +25,10 @@
   // |perf_history| required to save decode stats to local database and report
   // metrics. Callers must ensure that |perf_history| outlives this object; may
   // be nullptr if database recording is currently disabled.
-  VideoDecodeStatsRecorder(const url::Origin& untrusted_top_frame_origin,
+  VideoDecodeStatsRecorder(VideoDecodePerfHistory::SaveCallback save_cb,
+                           ukm::SourceId source_id,
                            bool is_top_frame,
-                           uint64_t player_id,
-                           VideoDecodePerfHistory::SaveCallback save_cb);
+                           uint64_t player_id);
   ~VideoDecodeStatsRecorder() override;
 
   // mojom::VideoDecodeStatsRecorder implementation:
@@ -40,9 +40,9 @@
   // starting a new record.
   void FinalizeRecord();
 
-  const url::Origin untrusted_top_frame_origin_;
-  const bool is_top_frame_;
   const VideoDecodePerfHistory::SaveCallback save_cb_;
+  const ukm::SourceId source_id_;
+  const bool is_top_frame_;
   const uint64_t player_id_;
 
   mojom::PredictionFeatures features_;
diff --git a/media/mojo/services/watch_time_recorder.cc b/media/mojo/services/watch_time_recorder.cc
index c8e30f0..6f35e9f 100644
--- a/media/mojo/services/watch_time_recorder.cc
+++ b/media/mojo/services/watch_time_recorder.cc
@@ -126,11 +126,11 @@
 WatchTimeRecorder::WatchTimeUkmRecord::~WatchTimeUkmRecord() = default;
 
 WatchTimeRecorder::WatchTimeRecorder(mojom::PlaybackPropertiesPtr properties,
-                                     const url::Origin& untrusted_top_origin,
+                                     ukm::SourceId source_id,
                                      bool is_top_frame,
                                      uint64_t player_id)
     : properties_(std::move(properties)),
-      untrusted_top_origin_(untrusted_top_origin),
+      source_id_(source_id),
       is_top_frame_(is_top_frame),
       player_id_(player_id),
       extended_metrics_keys_(
@@ -344,11 +344,7 @@
   }
 
   for (auto& ukm_record : ukm_records_) {
-    const ukm::SourceId source_id = ukm_recorder->GetNewSourceID();
-
-    // TODO(crbug.com/787209): Stop getting origin from the renderer.
-    ukm_recorder->UpdateSourceURL(source_id, untrusted_top_origin_.GetURL());
-    ukm::builders::Media_BasicPlayback builder(source_id);
+    ukm::builders::Media_BasicPlayback builder(source_id_);
 
     builder.SetIsTopFrame(is_top_frame_);
     builder.SetIsBackground(properties_->is_background);
diff --git a/media/mojo/services/watch_time_recorder.h b/media/mojo/services/watch_time_recorder.h
index 95d7f067..7d72bea 100644
--- a/media/mojo/services/watch_time_recorder.h
+++ b/media/mojo/services/watch_time_recorder.h
@@ -16,7 +16,7 @@
 #include "media/base/video_codecs.h"
 #include "media/mojo/interfaces/watch_time_recorder.mojom.h"
 #include "media/mojo/services/media_mojo_export.h"
-#include "url/origin.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 
 namespace media {
 
@@ -24,7 +24,7 @@
 class MEDIA_MOJO_EXPORT WatchTimeRecorder : public mojom::WatchTimeRecorder {
  public:
   WatchTimeRecorder(mojom::PlaybackPropertiesPtr properties,
-                    const url::Origin& untrusted_top_origin,
+                    ukm::SourceId source_id,
                     bool is_top_frame,
                     uint64_t player_id);
   ~WatchTimeRecorder() override;
@@ -48,10 +48,9 @@
 
   const mojom::PlaybackPropertiesPtr properties_;
 
-  // For privacy, only record the top origin. "Untrusted" signals that this
-  // value comes from the renderer and should not be used for security checks.
-  // TODO(crbug.com/787209): Stop getting origin from the renderer.
-  const url::Origin untrusted_top_origin_;
+  const ukm::SourceId source_id_;
+
+  // Are UKM reports for the main frame or for a subframe?
   const bool is_top_frame_;
 
   // The provider ID which constructed this recorder. Used to record a UKM entry
diff --git a/media/mojo/services/watch_time_recorder_unittest.cc b/media/mojo/services/watch_time_recorder_unittest.cc
index 560e47db..d229187 100644
--- a/media/mojo/services/watch_time_recorder_unittest.cc
+++ b/media/mojo/services/watch_time_recorder_unittest.cc
@@ -51,16 +51,19 @@
                        kDiscardedWatchTimeAudioVideoSrc,
                        kDiscardedWatchTimeAudioVideoMse,
                        kDiscardedWatchTimeAudioVideoEme}) {
+    source_id_ = test_recorder_->GetNewSourceID();
     ResetMetricRecorders();
-    MediaMetricsProvider::Create(VideoDecodePerfHistory::SaveCallback(),
-                                 mojo::MakeRequest(&provider_));
+    MediaMetricsProvider::Create(
+        true /* is_top_frame */,
+        base::BindRepeating(&WatchTimeRecorderTest::GetSourceId,
+                            base::Unretained(this)),
+        VideoDecodePerfHistory::SaveCallback(), mojo::MakeRequest(&provider_));
   }
 
   ~WatchTimeRecorderTest() override { base::RunLoop().RunUntilIdle(); }
 
   void Initialize(mojom::PlaybackPropertiesPtr properties) {
-    provider_->Initialize(properties->is_mse, true /* is_top_frame */,
-                          url::Origin::Create(GURL(kTestOrigin)));
+    provider_->Initialize(properties->is_mse);
     provider_->AcquireWatchTimeRecorder(std::move(properties),
                                         mojo::MakeRequest(&wtr_));
   }
@@ -117,7 +120,8 @@
   }
 
   void ExpectNoUkmWatchTime() {
-    ASSERT_EQ(0u, test_recorder_->sources_count());
+    // We always add a source in testing.
+    ASSERT_EQ(1u, test_recorder_->sources_count());
     ASSERT_EQ(0u, test_recorder_->entries_count());
   }
 
@@ -140,8 +144,11 @@
     // Ensure cleared global before attempting to create a new TestUkmReporter.
     test_recorder_.reset();
     test_recorder_.reset(new ukm::TestAutoSetUkmRecorder());
+    test_recorder_->UpdateSourceURL(source_id_, GURL(kTestOrigin));
   }
 
+  ukm::SourceId GetSourceId() { return source_id_; }
+
   MOCK_METHOD0(GetCurrentMediaTime, base::TimeDelta());
 
  protected:
@@ -149,6 +156,7 @@
   mojom::MediaMetricsProviderPtr provider_;
   std::unique_ptr<base::HistogramTester> histogram_tester_;
   std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_recorder_;
+  ukm::SourceId source_id_;
   mojom::WatchTimeRecorderPtr wtr_;
   const std::vector<WatchTimeKey> computation_keys_;
   const std::vector<base::StringPiece> mtbr_keys_;
diff --git a/mojo/public/cpp/bindings/README.md b/mojo/public/cpp/bindings/README.md
index 5630adb1..9ddcf20 100644
--- a/mojo/public/cpp/bindings/README.md
+++ b/mojo/public/cpp/bindings/README.md
@@ -1138,7 +1138,7 @@
 would like to call `SetBar()` on it. You can do:
 
 ``` cpp
-AssociatedBind<Bar> bar_binding(some_bar_impl);
+AssociatedBinding<Bar> bar_binding(some_bar_impl);
 BarAssociatedPtrInfo bar_ptr_info;
 BarAssociatedRequest bar_request = MakeRequest(&bar_ptr_info);
 foo_ptr->SetBar(std::move(bar_ptr_info));
@@ -1148,7 +1148,7 @@
 The following code achieves the same purpose:
 
 ``` cpp
-AssociatedBind<Bar> bar_binding(some_bar_impl);
+AssociatedBinding<Bar> bar_binding(some_bar_impl);
 BarAssociatedPtrInfo bar_ptr_info;
 bar_binding.Bind(&bar_ptr_info);
 foo_ptr->SetBar(std::move(bar_ptr_info));
diff --git a/mojo/public/cpp/bindings/lib/message_dumper.cc b/mojo/public/cpp/bindings/lib/message_dumper.cc
index 52dca5f..908598d7 100644
--- a/mojo/public/cpp/bindings/lib/message_dumper.cc
+++ b/mojo/public/cpp/bindings/lib/message_dumper.cc
@@ -12,7 +12,7 @@
 #include "base/process/process.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "mojo/public/cpp/bindings/message.h"
 
 namespace {
diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
index 7c71b576..0b7ed5fa 100644
--- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc b/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
index a716dcd..94c82a6a 100644
--- a/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/interface_ptr_unittest.cc
@@ -14,7 +14,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread.h"
diff --git a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
index 916bc1f..deb9e3a 100644
--- a/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/sync_method_unittest.cc
@@ -9,7 +9,7 @@
 #include "base/macros.h"
 #include "base/run_loop.h"
 #include "base/sequence_token.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread.h"
diff --git a/mojo/public/cpp/system/file_data_pipe_producer.cc b/mojo/public/cpp/system/file_data_pipe_producer.cc
index d3bbfee5..0fc1f30 100644
--- a/mojo/public/cpp/system/file_data_pipe_producer.cc
+++ b/mojo/public/cpp/system/file_data_pipe_producer.cc
@@ -16,7 +16,7 @@
 #include "base/numerics/safe_conversions.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "mojo/public/cpp/system/simple_watcher.h"
 
diff --git a/mojo/public/cpp/system/string_data_pipe_producer.cc b/mojo/public/cpp/system/string_data_pipe_producer.cc
index c176954..81f7e7d5 100644
--- a/mojo/public/cpp/system/string_data_pipe_producer.cc
+++ b/mojo/public/cpp/system/string_data_pipe_producer.cc
@@ -9,7 +9,7 @@
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace mojo {
 
diff --git a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
index 54b0fa89..df29eff 100644
--- a/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
+++ b/mojo/public/tools/fuzzers/mojo_fuzzer_message_dump.cc
@@ -9,7 +9,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/public/tools/fuzzers/fuzz.mojom.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
diff --git a/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc b/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc
index bd93877..0357271 100644
--- a/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc
+++ b/mojo/public/tools/fuzzers/mojo_parse_message_fuzzer.cc
@@ -4,7 +4,7 @@
 
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
diff --git a/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc b/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc
index dffb4fc..f16e228d 100644
--- a/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc
+++ b/mojo/public/tools/fuzzers/mojo_parse_message_proto_fuzzer.cc
@@ -7,7 +7,7 @@
 
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "mojo/core/embedder/embedder.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/tools/fuzzers/fuzz_impl.h"
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 650e8d5..52af8ae 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -3146,6 +3146,9 @@
     "third_party/quic/test_tools/simulator/switch.h",
     "third_party/quic/test_tools/simulator/traffic_policer.cc",
     "third_party/quic/test_tools/simulator/traffic_policer.h",
+    "third_party/quic/tools/quic_tcp_like_trace_converter.cc",
+    "third_party/quic/tools/quic_tcp_like_trace_converter.h",
+    "third_party/quic/tools/quic_tcp_like_trace_converter_test.cc",
   ]
   deps = [
     ":net",
@@ -3164,10 +3167,10 @@
     sources += [
       "third_party/quic/test_tools/bad_packet_writer.cc",
       "third_party/quic/test_tools/bad_packet_writer.h",
+      "third_party/quic/test_tools/fake_epoll_server.cc",
+      "third_party/quic/test_tools/fake_epoll_server.h",
       "third_party/quic/test_tools/limited_mtu_test_writer.cc",
       "third_party/quic/test_tools/limited_mtu_test_writer.h",
-      "third_party/quic/test_tools/mock_epoll_server.cc",
-      "third_party/quic/test_tools/mock_epoll_server.h",
       "third_party/quic/test_tools/packet_dropping_test_writer.cc",
       "third_party/quic/test_tools/packet_dropping_test_writer.h",
       "third_party/quic/test_tools/packet_reordering_writer.cc",
diff --git a/net/base/directory_lister.cc b/net/base/directory_lister.cc
index 7ba61d5..aec3125 100644
--- a/net/base/directory_lister.cc
+++ b/net/base/directory_lister.cc
@@ -13,7 +13,7 @@
 #include "base/i18n/file_util_icu.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/net/base/network_change_notifier_fuchsia_unittest.cc b/net/base/network_change_notifier_fuchsia_unittest.cc
index 4058ece0..1e760d3 100644
--- a/net/base/network_change_notifier_fuchsia_unittest.cc
+++ b/net/base/network_change_notifier_fuchsia_unittest.cc
@@ -96,7 +96,11 @@
 // which aren't handled well by GMock.
 class FakeNetstack : public fuchsia::netstack::Netstack {
  public:
-  FakeNetstack() = default;
+  explicit FakeNetstack(
+      fidl::InterfaceRequest<fuchsia::netstack::Netstack> netstack_request)
+      : binding_(this) {
+    CHECK_EQ(ZX_OK, binding_.Bind(std::move(netstack_request)));
+  }
   ~FakeNetstack() override = default;
 
   // Adds |interface| to the interface query response list.
@@ -108,20 +112,20 @@
     route_table_->push_back(std::move(interface));
   }
 
-  // Sends the accumulated list of |interfaces_| to |listener_|.
+  // Sends the accumulated |interfaces_| to the OnInterfacesChanged event.
   void NotifyInterfaces() {
-    if (listener_) {
-      listener_->OnInterfacesChanged(std::move(interfaces_));
-      interfaces_ = fidl::VectorPtr<fuchsia::netstack::NetInterface>::New(0);
-    }
+    binding_.events().OnInterfacesChanged(std::move(interfaces_));
+    interfaces_ = fidl::VectorPtr<fuchsia::netstack::NetInterface>::New(0);
   }
 
+  fidl::Binding<fuchsia::netstack::Netstack>& binding() { return binding_; }
+
  private:
   // fuchsia::netstack::Netstack implementation.
   void RegisterListener(
       ::fidl::InterfaceHandle<fuchsia::netstack::NotificationListener> listener)
       override {
-    listener_ = listener.BindSync();
+    NOTREACHED();
   }
 
   void GetInterfaces(GetInterfacesCallback callback) override {
@@ -164,12 +168,13 @@
                        SetFilterStatusCallback callback) override {}
   void GetFilterStatus(GetFilterStatusCallback callback) override {}
 
-  fuchsia::netstack::NotificationListenerSyncPtr listener_;
   ::fidl::VectorPtr<fuchsia::netstack::NetInterface> interfaces_ =
       fidl::VectorPtr<fuchsia::netstack::NetInterface>::New(0);
   ::fidl::VectorPtr<fuchsia::netstack::RouteTableEntry> route_table_ =
       fidl::VectorPtr<fuchsia::netstack::RouteTableEntry>::New(0);
 
+  fidl::Binding<fuchsia::netstack::Netstack> binding_;
+
   DISALLOW_COPY_AND_ASSIGN(FakeNetstack);
 };
 
@@ -183,9 +188,7 @@
 
 class NetworkChangeNotifierFuchsiaTest : public testing::Test {
  public:
-  NetworkChangeNotifierFuchsiaTest() : netstack_binding_(&netstack_) {
-    CHECK_EQ(ZX_OK, netstack_binding_.Bind(netstack_ptr_.NewRequest()));
-  }
+  NetworkChangeNotifierFuchsiaTest() : netstack_(netstack_ptr_.NewRequest()) {}
 
   ~NetworkChangeNotifierFuchsiaTest() override {}
 
@@ -205,9 +208,8 @@
  protected:
   base::MessageLoopForIO message_loop_;
   testing::StrictMock<MockNetworkChangeObserver> observer_;
-  FakeNetstack netstack_;
   fuchsia::netstack::NetstackPtr netstack_ptr_;
-  fidl::Binding<fuchsia::netstack::Netstack> netstack_binding_;
+  FakeNetstack netstack_;
 
   // Allows us to allocate our own NetworkChangeNotifier for unit testing.
   NetworkChangeNotifier::DisableForTest disable_for_test_;
diff --git a/net/base/prioritized_task_runner_unittest.cc b/net/base/prioritized_task_runner_unittest.cc
index e57614c..babf56b 100644
--- a/net/base/prioritized_task_runner_unittest.cc
+++ b/net/base/prioritized_task_runner_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/strings/string_util.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_restrictions.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/net/cert/multi_threaded_cert_verifier.cc b/net/cert/multi_threaded_cert_verifier.cc
index 2303fe22..7ebdf94 100644
--- a/net/cert/multi_threaded_cert_verifier.cc
+++ b/net/cert/multi_threaded_cert_verifier.cc
@@ -15,7 +15,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/sha1.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
diff --git a/net/cert/nss_cert_database.cc b/net/cert/nss_cert_database.cc
index df7bc59..90c632fb0 100644
--- a/net/cert/nss_cert_database.cc
+++ b/net/cert/nss_cert_database.cc
@@ -18,7 +18,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/observer_list_threadsafe.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "crypto/scoped_nss_types.h"
 #include "net/base/net_errors.h"
diff --git a/net/cert/nss_cert_database_chromeos.cc b/net/cert/nss_cert_database_chromeos.cc
index dc714798..3bf71878 100644
--- a/net/cert/nss_cert_database_chromeos.cc
+++ b/net/cert/nss_cert_database_chromeos.cc
@@ -15,7 +15,7 @@
 #include "base/callback.h"
 #include "base/location.h"
 #include "base/stl_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 
 namespace net {
diff --git a/net/disk_cache/backend_cleanup_tracker.cc b/net/disk_cache/backend_cleanup_tracker.cc
index eeae1fb..c561aecf 100644
--- a/net/disk_cache/backend_cleanup_tracker.cc
+++ b/net/disk_cache/backend_cleanup_tracker.cc
@@ -16,7 +16,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 
 namespace disk_cache {
diff --git a/net/disk_cache/backend_unittest.cc b/net/disk_cache/backend_unittest.cc
index 8c41c18c..e694620 100644
--- a/net/disk_cache/backend_unittest.cc
+++ b/net/disk_cache/backend_unittest.cc
@@ -7,6 +7,7 @@
 #include "base/bind_helpers.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
+#include "base/memory/memory_pressure_listener.h"
 #include "base/metrics/field_trial.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
@@ -14,7 +15,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/mock_entropy_provider.h"
 #include "base/test/scoped_feature_list.h"
@@ -743,6 +744,39 @@
   EXPECT_EQ(1u, pmd.allocator_dumps().size());
 }
 
+TEST_F(DiskCacheBackendTest, MemoryListensToMemoryPressure) {
+  const int kLimit = 16 * 1024;
+  const int kEntrySize = 256;
+  SetMaxSize(kLimit);
+  SetMemoryOnlyMode();
+  InitCache();
+
+  // Fill in to about 80-90% full.
+  scoped_refptr<net::IOBuffer> buffer(new net::IOBuffer(kEntrySize));
+  CacheTestFillBuffer(buffer->data(), kEntrySize, false);
+
+  for (int i = 0; i < 0.9 * (kLimit / kEntrySize); ++i) {
+    disk_cache::Entry* entry = nullptr;
+    ASSERT_EQ(net::OK, CreateEntry(base::IntToString(i), &entry));
+    EXPECT_EQ(kEntrySize,
+              WriteData(entry, 0, 0, buffer.get(), kEntrySize, true));
+    entry->Close();
+  }
+
+  EXPECT_GT(CalculateSizeOfAllEntries(), 0.8 * kLimit);
+
+  // Signal low-memory of various sorts, and see how small it gets.
+  base::MemoryPressureListener::NotifyMemoryPressure(
+      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_LT(CalculateSizeOfAllEntries(), 0.5 * kLimit);
+
+  base::MemoryPressureListener::NotifyMemoryPressure(
+      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_LT(CalculateSizeOfAllEntries(), 0.1 * kLimit);
+}
+
 TEST_F(DiskCacheBackendTest, ExternalFiles) {
   InitCache();
   // First, let's create a file on the folder.
diff --git a/net/disk_cache/blockfile/file_ios.cc b/net/disk_cache/blockfile/file_ios.cc
index c94885f..a9da7f1 100644
--- a/net/disk_cache/blockfile/file_ios.cc
+++ b/net/disk_cache/blockfile/file_ios.cc
@@ -14,7 +14,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "net/base/net_errors.h"
 #include "net/disk_cache/blockfile/in_flight_io.h"
 #include "net/disk_cache/disk_cache.h"
diff --git a/net/disk_cache/blockfile/file_posix.cc b/net/disk_cache/blockfile/file_posix.cc
index 08cb982..3272bca0 100644
--- a/net/disk_cache/blockfile/file_posix.cc
+++ b/net/disk_cache/blockfile/file_posix.cc
@@ -12,8 +12,8 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/net_errors.h"
 #include "net/disk_cache/disk_cache.h"
 
diff --git a/net/disk_cache/cache_util.cc b/net/disk_cache/cache_util.cc
index f26413a2..5dea20d 100644
--- a/net/disk_cache/cache_util.cc
+++ b/net/disk_cache/cache_util.cc
@@ -14,7 +14,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 
diff --git a/net/disk_cache/disk_cache.cc b/net/disk_cache/disk_cache.cc
index 8d908f7..b05094b 100644
--- a/net/disk_cache/disk_cache.cc
+++ b/net/disk_cache/disk_cache.cc
@@ -8,7 +8,7 @@
 #include "base/macros.h"
 #include "base/metrics/field_trial.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/cache_type.h"
 #include "net/base/net_errors.h"
 #include "net/disk_cache/backend_cleanup_tracker.h"
diff --git a/net/disk_cache/memory/mem_backend_impl.cc b/net/disk_cache/memory/mem_backend_impl.cc
index 47e68d1..f1a905c 100644
--- a/net/disk_cache/memory/mem_backend_impl.cc
+++ b/net/disk_cache/memory/mem_backend_impl.cc
@@ -11,7 +11,7 @@
 
 #include "base/logging.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/trace_event/memory_usage_estimator.h"
 #include "base/trace_event/process_memory_dump.h"
@@ -56,8 +56,13 @@
 }  // namespace
 
 MemBackendImpl::MemBackendImpl(net::NetLog* net_log)
-    : max_size_(0), current_size_(0), net_log_(net_log), weak_factory_(this) {
-}
+    : max_size_(0),
+      current_size_(0),
+      net_log_(net_log),
+      memory_pressure_listener_(
+          base::BindRepeating(&MemBackendImpl::OnMemoryPressure,
+                              base::Unretained(this))),
+      weak_factory_(this) {}
 
 MemBackendImpl::~MemBackendImpl() {
   DCHECK(CheckLRUListOrder(lru_list_));
@@ -341,9 +346,11 @@
 void MemBackendImpl::EvictIfNeeded() {
   if (current_size_ <= max_size_)
     return;
-
   int target_size = std::max(0, max_size_ - kDefaultEvictionSize);
+  EvictTill(target_size);
+}
 
+void MemBackendImpl::EvictTill(int target_size) {
   base::LinkNode<MemEntryImpl>* entry = lru_list_.head();
   while (current_size_ > target_size && entry != lru_list_.end()) {
     MemEntryImpl* to_doom = entry->value();
@@ -354,4 +361,20 @@
   }
 }
 
+void MemBackendImpl::OnMemoryPressure(
+    base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
+  switch (memory_pressure_level) {
+    case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
+      // Not supposed to get this here, but if there is no problem, there is
+      // no problem...
+      break;
+    case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
+      EvictTill(max_size_ / 2);
+      break;
+    case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
+      EvictTill(max_size_ / 10);
+      break;
+  }
+}
+
 }  // namespace disk_cache
diff --git a/net/disk_cache/memory/mem_backend_impl.h b/net/disk_cache/memory/mem_backend_impl.h
index febb70a6..b39a301 100644
--- a/net/disk_cache/memory/mem_backend_impl.h
+++ b/net/disk_cache/memory/mem_backend_impl.h
@@ -16,6 +16,7 @@
 #include "base/compiler_specific.h"
 #include "base/containers/linked_list.h"
 #include "base/macros.h"
+#include "base/memory/memory_pressure_listener.h"
 #include "base/memory/weak_ptr.h"
 #include "base/strings/string_split.h"
 #include "base/time/time.h"
@@ -122,6 +123,13 @@
   // Deletes entries from the cache until the current size is below the limit.
   void EvictIfNeeded();
 
+  // Deletes entries until the current size is below |goal|.
+  void EvictTill(int target_size);
+
+  // Called when we get low on memory.
+  void OnMemoryPressure(
+      base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
+
   EntryMap entries_;
 
   // Stored in increasing order of last use time, from least recently used to
@@ -134,6 +142,8 @@
   net::NetLog* net_log_;
   base::OnceClosure post_cleanup_callback_;
 
+  base::MemoryPressureListener memory_pressure_listener_;
+
   base::WeakPtrFactory<MemBackendImpl> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(MemBackendImpl);
diff --git a/net/disk_cache/simple/simple_backend_impl.cc b/net/disk_cache/simple/simple_backend_impl.cc
index 95aa6fb..9d4bd61 100644
--- a/net/disk_cache/simple/simple_backend_impl.cc
+++ b/net/disk_cache/simple/simple_backend_impl.cc
@@ -25,8 +25,8 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/net/dns/address_sorter_win.cc b/net/dns/address_sorter_win.cc
index 72c6ae3..53dcb035 100644
--- a/net/dns/address_sorter_win.cc
+++ b/net/dns/address_sorter_win.cc
@@ -13,7 +13,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/memory/free_deleter.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "net/base/address_list.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
diff --git a/net/dns/dns_transaction.cc b/net/dns/dns_transaction.cc
index d01be9f..a41b389 100644
--- a/net/dns/dns_transaction.cc
+++ b/net/dns/dns_transaction.cc
@@ -19,6 +19,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
@@ -1175,6 +1176,9 @@
       net_log_.AddEvent(NetLogEventType::DNS_TRANSACTION_RESPONSE,
                         base::Bind(&DnsAttempt::NetLogResponseCallback,
                                    base::Unretained(attempt)));
+
+      base::UmaHistogramSparse("AsyncDNS.Rcode",
+                               attempt->GetResponse()->rcode());
     }
   }
 
diff --git a/net/dns/dns_transaction_unittest.cc b/net/dns/dns_transaction_unittest.cc
index 90d4d1ed..be0ca021 100644
--- a/net/dns/dns_transaction_unittest.cc
+++ b/net/dns/dns_transaction_unittest.cc
@@ -20,6 +20,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/sys_byteorder.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/time/time.h"
 #include "base/values.h"
 #include "net/base/ip_address.h"
@@ -832,11 +833,14 @@
 };
 
 TEST_F(DnsTransactionTest, Lookup) {
+  base::HistogramTester histograms;
   AddAsyncQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype,
                            kT0ResponseDatagram, arraysize(kT0ResponseDatagram));
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
+  histograms.ExpectUniqueSample("AsyncDNS.Rcode", dns_protocol::kRcodeNOERROR,
+                                1);
 }
 
 TEST_F(DnsTransactionTest, LookupWithEDNSOption) {
@@ -879,6 +883,7 @@
 // Concurrent lookup tests assume that DnsTransaction::Start immediately
 // consumes a socket from ClientSocketFactory.
 TEST_F(DnsTransactionTest, ConcurrentLookup) {
+  base::HistogramTester histograms;
   AddAsyncQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype,
                            kT0ResponseDatagram, arraysize(kT0ResponseDatagram));
   AddAsyncQueryAndResponse(1 /* id */, kT1HostName, kT1Qtype,
@@ -893,6 +898,8 @@
 
   EXPECT_TRUE(helper0.has_completed());
   EXPECT_TRUE(helper1.has_completed());
+  histograms.ExpectUniqueSample("AsyncDNS.Rcode", dns_protocol::kRcodeNOERROR,
+                                2);
 }
 
 TEST_F(DnsTransactionTest, CancelLookup) {
@@ -1014,19 +1021,25 @@
 }
 
 TEST_F(DnsTransactionTest, ServerFail) {
+  base::HistogramTester histograms;
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL);
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_DNS_SERVER_FAILED);
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
   ASSERT_NE(helper0.response(), nullptr);
   EXPECT_EQ(helper0.response()->rcode(), dns_protocol::kRcodeSERVFAIL);
+  histograms.ExpectUniqueSample("AsyncDNS.Rcode", dns_protocol::kRcodeSERVFAIL,
+                                1);
 }
 
 TEST_F(DnsTransactionTest, NoDomain) {
+  base::HistogramTester histograms;
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeNXDOMAIN);
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, ERR_NAME_NOT_RESOLVED);
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
+  histograms.ExpectUniqueSample("AsyncDNS.Rcode", dns_protocol::kRcodeNXDOMAIN,
+                                1);
 }
 
 TEST_F(DnsTransactionTestWithMockTime, Timeout) {
@@ -1880,6 +1893,7 @@
 }
 
 TEST_F(DnsTransactionTest, TCPLookup) {
+  base::HistogramTester histograms;
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
   AddQueryAndResponse(0 /* id */, kT0HostName, kT0Qtype, kT0ResponseDatagram,
@@ -1887,9 +1901,12 @@
 
   TransactionHelper helper0(kT0HostName, kT0Qtype, kT0RecordCount);
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
+  histograms.ExpectUniqueSample("AsyncDNS.Rcode", dns_protocol::kRcodeNOERROR,
+                                2);
 }
 
 TEST_F(DnsTransactionTest, TCPFailure) {
+  base::HistogramTester histograms;
   AddAsyncQueryAndRcode(kT0HostName, kT0Qtype,
                         dns_protocol::kRcodeNOERROR | dns_protocol::kFlagTC);
   AddQueryAndRcode(kT0HostName, kT0Qtype, dns_protocol::kRcodeSERVFAIL, ASYNC,
@@ -1899,6 +1916,11 @@
   EXPECT_TRUE(helper0.Run(transaction_factory_.get()));
   ASSERT_NE(helper0.response(), nullptr);
   EXPECT_EQ(helper0.response()->rcode(), dns_protocol::kRcodeSERVFAIL);
+  histograms.ExpectBucketCount("AsyncDNS.Rcode", dns_protocol::kRcodeNOERROR,
+                               1);
+  histograms.ExpectBucketCount("AsyncDNS.Rcode", dns_protocol::kRcodeSERVFAIL,
+                               1);
+  histograms.ExpectTotalCount("AsyncDNS.Rcode", 2);
 }
 
 TEST_F(DnsTransactionTest, TCPMalformed) {
diff --git a/net/dns/host_resolver_impl.cc b/net/dns/host_resolver_impl.cc
index 7906201..6b71265 100644
--- a/net/dns/host_resolver_impl.cc
+++ b/net/dns/host_resolver_impl.cc
@@ -41,7 +41,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
diff --git a/net/dns/serial_worker.cc b/net/dns/serial_worker.cc
index c4a311a5..f650605 100644
--- a/net/dns/serial_worker.cc
+++ b/net/dns/serial_worker.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/location.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 
 namespace net {
diff --git a/net/dns/serial_worker.h b/net/dns/serial_worker.h
index 0449b9f..6d2571f 100644
--- a/net/dns/serial_worker.h
+++ b/net/dns/serial_worker.h
@@ -11,7 +11,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequence_checker.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "net/base/net_export.h"
 
 namespace net {
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
index 6bbb03d..6132b23 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_perftest.cc
@@ -13,7 +13,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/perf_time_logger.h"
 #include "base/test/scoped_task_environment.h"
 #include "net/base/test_completion_callback.h"
diff --git a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
index bcbc150..dae2687d 100644
--- a/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_persistent_cookie_store_unittest.cc
@@ -19,7 +19,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/net/http/http_cache.cc b/net/http/http_cache.cc
index fb0a3bd..277593c 100644
--- a/net/http/http_cache.cc
+++ b/net/http/http_cache.cc
@@ -31,7 +31,6 @@
 #include "base/trace_event/memory_usage_estimator.h"
 #include "base/trace_event/process_memory_dump.h"
 #include "net/base/cache_type.h"
-#include "net/base/completion_callback.h"
 #include "net/base/io_buffer.h"
 #include "net/base/load_flags.h"
 #include "net/base/net_errors.h"
@@ -122,7 +121,7 @@
 // This structure keeps track of work items that are attempting to create or
 // open cache entries or the backend itself.
 struct HttpCache::PendingOp {
-  PendingOp() : disk_entry(NULL) {}
+  PendingOp() : disk_entry(NULL), callback_will_delete(false) {}
   ~PendingOp() = default;
 
   // Returns the estimate of dynamically allocated memory in bytes.
@@ -136,7 +135,11 @@
   disk_cache::Entry* disk_entry;
   std::unique_ptr<disk_cache::Backend> backend;
   std::unique_ptr<WorkItem> writer;
-  CompletionCallback callback;  // BackendCallback.
+  // True if there is a posted OnPendingOpComplete() task that might delete
+  // |this| without removing it from |pending_ops_|.  Note that since
+  // OnPendingOpComplete() is static, it will not get cancelled when HttpCache
+  // is destroyed.
+  bool callback_will_delete;
   WorkItemList pending_queue;
 };
 
@@ -368,15 +371,10 @@
     PendingOp* pending_op = pending_it->second;
     pending_op->writer.reset();
     bool delete_pending_op = true;
-    if (building_backend_) {
+    if (building_backend_ && pending_op->callback_will_delete) {
       // If we don't have a backend, when its construction finishes it will
       // deliver the callbacks.
-      if (!pending_op->callback.is_null()) {
-        // If not null, the callback will delete the pending operation later.
-        delete_pending_op = false;
-      }
-    } else {
-      pending_op->callback.Reset();
+      delete_pending_op = false;
     }
 
     pending_op->pending_queue.clear();
@@ -463,14 +461,14 @@
     CreateBackend(NULL, CompletionOnceCallback());
   }
 
-   HttpCache::Transaction* transaction =
+  HttpCache::Transaction* transaction =
       new HttpCache::Transaction(priority, this);
-   if (bypass_lock_for_test_)
+  if (bypass_lock_for_test_)
     transaction->BypassLockForTest();
-   if (bypass_lock_after_headers_for_test_)
-     transaction->BypassLockAfterHeadersForTest();
-   if (fail_conditionalization_for_test_)
-     transaction->FailConditionalizationForTest();
+  if (bypass_lock_after_headers_for_test_)
+    transaction->BypassLockAfterHeadersForTest();
+  if (fail_conditionalization_for_test_)
+    transaction->FailConditionalizationForTest();
 
   trans->reset(transaction);
   return OK;
@@ -535,16 +533,18 @@
   DCHECK(pending_op->pending_queue.empty());
 
   pending_op->writer = std::move(item);
-  pending_op->callback = base::Bind(&HttpCache::OnPendingOpComplete,
-                                    GetWeakPtr(), pending_op);
 
-  int rv = backend_factory_->CreateBackend(net_log_, &pending_op->backend,
-                                           pending_op->callback);
-  if (rv != ERR_IO_PENDING) {
-    pending_op->writer->ClearCallback();
-    pending_op->callback.Run(rv);
+  int rv = backend_factory_->CreateBackend(
+      net_log_, &pending_op->backend,
+      base::BindOnce(&HttpCache::OnPendingOpComplete, GetWeakPtr(),
+                     pending_op));
+  if (rv == ERR_IO_PENDING) {
+    pending_op->callback_will_delete = true;
+    return rv;
   }
 
+  pending_op->writer->ClearCallback();
+  OnPendingOpComplete(GetWeakPtr(), pending_op, rv);
   return rv;
 }
 
@@ -630,16 +630,19 @@
   DCHECK(pending_op->pending_queue.empty());
 
   pending_op->writer = std::move(item);
-  pending_op->callback = base::Bind(&HttpCache::OnPendingOpComplete,
-                                    GetWeakPtr(), pending_op);
 
   net::RequestPriority priority = trans ? trans->priority() : net::LOWEST;
-  int rv = disk_cache_->DoomEntry(key, priority, pending_op->callback);
-  if (rv != ERR_IO_PENDING) {
-    pending_op->writer->ClearTransaction();
-    pending_op->callback.Run(rv);
+  int rv =
+      disk_cache_->DoomEntry(key, priority,
+                             base::BindOnce(&HttpCache::OnPendingOpComplete,
+                                            GetWeakPtr(), pending_op));
+  if (rv == ERR_IO_PENDING) {
+    pending_op->callback_will_delete = true;
+    return rv;
   }
 
+  pending_op->writer->ClearTransaction();
+  OnPendingOpComplete(GetWeakPtr(), pending_op, rv);
   return rv;
 }
 
@@ -757,16 +760,18 @@
   DCHECK(pending_op->pending_queue.empty());
 
   pending_op->writer = std::move(item);
-  pending_op->callback = base::Bind(&HttpCache::OnPendingOpComplete,
-                                    GetWeakPtr(), pending_op);
 
-  int rv = disk_cache_->OpenEntry(
-      key, trans->priority(), &(pending_op->disk_entry), pending_op->callback);
-  if (rv != ERR_IO_PENDING) {
-    pending_op->writer->ClearTransaction();
-    pending_op->callback.Run(rv);
+  int rv =
+      disk_cache_->OpenEntry(key, trans->priority(), &(pending_op->disk_entry),
+                             base::BindOnce(&HttpCache::OnPendingOpComplete,
+                                            GetWeakPtr(), pending_op));
+  if (rv == ERR_IO_PENDING) {
+    pending_op->callback_will_delete = true;
+    return rv;
   }
 
+  pending_op->writer->ClearTransaction();
+  OnPendingOpComplete(GetWeakPtr(), pending_op, rv);
   return rv;
 }
 
@@ -787,16 +792,18 @@
   DCHECK(pending_op->pending_queue.empty());
 
   pending_op->writer = std::move(item);
-  pending_op->callback = base::Bind(&HttpCache::OnPendingOpComplete,
-                                    GetWeakPtr(), pending_op);
 
   int rv = disk_cache_->CreateEntry(
-      key, trans->priority(), &(pending_op->disk_entry), pending_op->callback);
-  if (rv != ERR_IO_PENDING) {
-    pending_op->writer->ClearTransaction();
-    pending_op->callback.Run(rv);
+      key, trans->priority(), &(pending_op->disk_entry),
+      base::BindOnce(&HttpCache::OnPendingOpComplete, GetWeakPtr(),
+                     pending_op));
+  if (rv == ERR_IO_PENDING) {
+    pending_op->callback_will_delete = true;
+    return rv;
   }
 
+  pending_op->writer->ClearTransaction();
+  OnPendingOpComplete(GetWeakPtr(), pending_op, rv);
   return rv;
 }
 
@@ -1391,6 +1398,7 @@
                                     PendingOp* pending_op,
                                     int rv) {
   if (cache.get()) {
+    pending_op->callback_will_delete = false;
     cache->OnIOComplete(rv, pending_op);
   } else {
     // The callback was cancelled so we should delete the pending_op that
@@ -1404,9 +1412,6 @@
   WorkItemOperation op = item->operation();
   DCHECK_EQ(WI_CREATE_BACKEND, op);
 
-  // We don't need the callback anymore.
-  pending_op->callback.Reset();
-
   if (backend_factory_.get()) {
     // We may end up calling OnBackendCreated multiple times if we have pending
     // work items. The first call saves the backend and releases the factory,
diff --git a/net/log/file_net_log_observer.cc b/net/log/file_net_log_observer.cc
index ac707b5..067992b 100644
--- a/net/log/file_net_log_observer.cc
+++ b/net/log/file_net_log_observer.cc
@@ -18,7 +18,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "net/log/net_log_capture_mode.h"
 #include "net/log/net_log_entry.h"
diff --git a/net/log/file_net_log_observer_unittest.cc b/net/log/file_net_log_observer_unittest.cc
index 32f58cc9..5c49758 100644
--- a/net/log/file_net_log_observer_unittest.cc
+++ b/net/log/file_net_log_observer_unittest.cc
@@ -17,7 +17,7 @@
 #include "base/json/json_writer.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/values.h"
 #include "net/base/test_completion_callback.h"
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index bb5560c..569238a 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -20,7 +20,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/lazy_task_runner_forward.h"
+#include "base/task/lazy_task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
 #include "base/trace_event/trace_event.h"
diff --git a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
index eab83d19..353d3976 100644
--- a/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
+++ b/net/proxy_resolution/dhcp_pac_file_adapter_fetcher_win_unittest.cc
@@ -6,7 +6,7 @@
 
 #include "base/run_loop.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc b/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
index d635b5d..81785d82 100644
--- a/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
+++ b/net/proxy_resolution/dhcp_pac_file_fetcher_win.cc
@@ -12,7 +12,7 @@
 #include "base/containers/queue.h"
 #include "base/memory/free_deleter.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "base/values.h"
diff --git a/net/proxy_resolution/polling_proxy_config_service.cc b/net/proxy_resolution/polling_proxy_config_service.cc
index 0a617c5..5489d7f5 100644
--- a/net/proxy_resolution/polling_proxy_config_service.cc
+++ b/net/proxy_resolution/polling_proxy_config_service.cc
@@ -11,7 +11,7 @@
 #include "base/observer_list.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/proxy_resolution/proxy_config_with_annotation.h"
 
diff --git a/net/proxy_resolution/proxy_config_service_linux.cc b/net/proxy_resolution/proxy_config_service_linux.cc
index 5a860d18..93514db1 100644
--- a/net/proxy_resolution/proxy_config_service_linux.cc
+++ b/net/proxy_resolution/proxy_config_service_linux.cc
@@ -26,8 +26,8 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/timer/timer.h"
 #include "net/base/proxy_server.h"
diff --git a/net/quic/quic_flags_list.h b/net/quic/quic_flags_list.h
index f2aa8d7..ce03b593 100644
--- a/net/quic/quic_flags_list.h
+++ b/net/quic/quic_flags_list.h
@@ -110,18 +110,6 @@
 // it.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_ack_decimation, false)
 
-// Enables the 1RTO connection option which only sends one packet on QUIC
-// retransmission timeout, instead of 2.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_one_rto, true)
-
-// When true, the NRTT QUIC connection option causes receivers to ignore
-// incoming initial RTT values.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_no_irtt, true)
-
-// If it's been more than SRTT since receiving a packet, set the ack alarm for
-// 1ms instead of the standard delayed ack timer.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fast_ack_after_quiescence, true)
-
 // If true, QUIC offload pacing when using USPS as egress method.
 QUIC_FLAG(bool, FLAGS_quic_restart_flag_quic_offload_pacing_to_usps2, false)
 
@@ -134,12 +122,6 @@
 // If true, enable QUIC v44.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_44, true)
 
-// If true, close connection if largest observed in ack frame is greater than
-// largest sent packet.
-QUIC_FLAG(bool,
-          FLAGS_quic_reloadable_flag_quic_validate_ack_largest_observed,
-          true)
-
 // If true, QuicConnection::ProcessPacket will add the connection to write
 // blocked list if it is write blocked, and will not attempt to write before the
 // writer unblocks.
@@ -205,3 +187,7 @@
 // Enables the BBQ5 connection option, which forces saved aggregation values to
 // expire when the bandwidth increases more than 25% in QUIC BBR STARTUP.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_slower_startup4, false)
+
+// If true, QuicCryptoServerConfig::EvaluateClientHello will use GetCertChain
+// instead of the more expensive GetProof.
+QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_use_get_cert_chain, false)
diff --git a/net/quic/test_task_runner.cc b/net/quic/test_task_runner.cc
index ca94ca7..e60d280 100644
--- a/net/quic/test_task_runner.cc
+++ b/net/quic/test_task_runner.cc
@@ -13,6 +13,16 @@
 namespace net {
 namespace test {
 
+namespace {
+
+base::TimeTicks NowInTicks(const quic::MockClock& clock) {
+  base::TimeTicks ticks;
+  return ticks + base::TimeDelta::FromMicroseconds(
+                     (clock.Now() - quic::QuicTime::Zero()).ToMicroseconds());
+}
+
+}  // namespace
+
 TestTaskRunner::TestTaskRunner(quic::MockClock* clock) : clock_(clock) {}
 
 TestTaskRunner::~TestTaskRunner() {}
@@ -21,7 +31,7 @@
                                      base::OnceClosure task,
                                      base::TimeDelta delay) {
   EXPECT_GE(delay, base::TimeDelta());
-  tasks_.push_back(PostedTask(from_here, std::move(task), clock_->NowInTicks(),
+  tasks_.push_back(PostedTask(from_here, std::move(task), NowInTicks(*clock_),
                               delay, base::TestPendingTask::NESTABLE));
   return false;
 }
@@ -44,7 +54,7 @@
   std::vector<PostedTask>::iterator next = FindNextTask();
   DCHECK(next != tasks_.end());
   clock_->AdvanceTime(quic::QuicTime::Delta::FromMicroseconds(
-      (next->GetTimeToRun() - clock_->NowInTicks()).InMicroseconds()));
+      (next->GetTimeToRun() - NowInTicks(*clock_)).InMicroseconds()));
   PostedTask task = std::move(*next);
   tasks_.erase(next);
   std::move(task.task).Run();
diff --git a/net/socket/tcp_socket_posix.cc b/net/socket/tcp_socket_posix.cc
index 4fbe53b..5d45f7a9 100644
--- a/net/socket/tcp_socket_posix.cc
+++ b/net/socket/tcp_socket_posix.cc
@@ -18,7 +18,7 @@
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "net/base/address_list.h"
diff --git a/net/socket/udp_socket_posix.cc b/net/socket/udp_socket_posix.cc
index 22feb4b..04b9e07 100644
--- a/net/socket/udp_socket_posix.cc
+++ b/net/socket/udp_socket_posix.cc
@@ -21,7 +21,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/rand_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
diff --git a/net/ssl/channel_id_service.cc b/net/ssl/channel_id_service.cc
index 829710bc..d4636ec4 100644
--- a/net/ssl/channel_id_service.cc
+++ b/net/ssl/channel_id_service.cc
@@ -21,7 +21,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "crypto/ec_private_key.h"
diff --git a/net/ssl/client_cert_store_nss.cc b/net/ssl/client_cert_store_nss.cc
index 3214241..a96669eb 100644
--- a/net/ssl/client_cert_store_nss.cc
+++ b/net/ssl/client_cert_store_nss.cc
@@ -17,7 +17,7 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "crypto/nss_crypto_module_delegate.h"
 #include "crypto/nss_util.h"
diff --git a/net/ssl/ssl_key_logger_impl.cc b/net/ssl/ssl_key_logger_impl.cc
index 9777bc9..a6a4458 100644
--- a/net/ssl/ssl_key_logger_impl.cc
+++ b/net/ssl/ssl_key_logger_impl.cc
@@ -14,8 +14,8 @@
 #include "base/macros.h"
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 
 namespace net {
 
diff --git a/net/test/url_request/url_request_mock_http_job.cc b/net/test/url_request/url_request_mock_http_job.cc
index 8f1f0d7..803480e2 100644
--- a/net/test/url_request/url_request_mock_http_job.cc
+++ b/net/test/url_request/url_request_mock_http_job.cc
@@ -10,7 +10,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "net/base/filename_util.h"
 #include "net/base/net_errors.h"
diff --git a/net/third_party/quic/core/congestion_control/bbr_sender.cc b/net/third_party/quic/core/congestion_control/bbr_sender.cc
index 8cc75c7..90e5db9 100644
--- a/net/third_party/quic/core/congestion_control/bbr_sender.cc
+++ b/net/third_party/quic/core/congestion_control/bbr_sender.cc
@@ -208,7 +208,8 @@
   return recovery_state_ != NOT_IN_RECOVERY;
 }
 
-bool BbrSender::IsProbingForMoreBandwidth() const {
+bool BbrSender::ShouldSendProbingPacket() const {
+  // TODO(ianswett): Determine if we have sent enough before returning true.
   return (mode_ == PROBE_BW && pacing_gain_ > 1) || mode_ == STARTUP;
 }
 
@@ -464,7 +465,7 @@
                   << ", new value: " << sample_min_rtt
                   << ", current time: " << now.ToDebuggingValue();
 
-    if (ShouldExtendMinRttExpiry()) {
+    if (min_rtt_expired && ShouldExtendMinRttExpiry()) {
       min_rtt_expired = false;
     } else {
       min_rtt_ = sample_min_rtt;
@@ -474,6 +475,8 @@
     min_rtt_since_last_probe_rtt_ = QuicTime::Delta::Infinite();
     app_limited_since_last_probe_rtt_ = false;
   }
+  DCHECK(!min_rtt_.IsZero());
+  DCHECK_GE(min_rtt_, rtt_stats_->min_rtt());
 
   return min_rtt_expired;
 }
diff --git a/net/third_party/quic/core/congestion_control/bbr_sender.h b/net/third_party/quic/core/congestion_control/bbr_sender.h
index 6e1f275..f91ad14 100644
--- a/net/third_party/quic/core/congestion_control/bbr_sender.h
+++ b/net/third_party/quic/core/congestion_control/bbr_sender.h
@@ -103,7 +103,7 @@
   // Start implementation of SendAlgorithmInterface.
   bool InSlowStart() const override;
   bool InRecovery() const override;
-  bool IsProbingForMoreBandwidth() const override;
+  bool ShouldSendProbingPacket() const override;
 
   void SetFromConfig(const QuicConfig& config,
                      Perspective perspective) override;
diff --git a/net/third_party/quic/core/congestion_control/send_algorithm_interface.h b/net/third_party/quic/core/congestion_control/send_algorithm_interface.h
index a7d844df5c..0e3ad58a 100644
--- a/net/third_party/quic/core/congestion_control/send_algorithm_interface.h
+++ b/net/third_party/quic/core/congestion_control/send_algorithm_interface.h
@@ -106,7 +106,9 @@
 
   // True when the congestion control is probing for more bandwidth and needs
   // enough data to not be app-limited to do so.
-  virtual bool IsProbingForMoreBandwidth() const = 0;
+  // TODO(ianswett): In the future, this API may want to indicate the size of
+  // the probing packet.
+  virtual bool ShouldSendProbingPacket() const = 0;
 
   // Returns the size of the slow start congestion window in bytes,
   // aka ssthresh.  Only defined for Cubic and Reno, other algorithms return 0.
diff --git a/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.cc b/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
index ace58f9..fa39122a 100644
--- a/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
+++ b/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.cc
@@ -244,7 +244,7 @@
          largest_acked_packet_number_ != 0;
 }
 
-bool TcpCubicSenderBytes::IsProbingForMoreBandwidth() const {
+bool TcpCubicSenderBytes::ShouldSendProbingPacket() const {
   return false;
 }
 
diff --git a/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.h b/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.h
index 4d550ec..860133a6 100644
--- a/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.h
+++ b/net/third_party/quic/core/congestion_control/tcp_cubic_sender_bytes.h
@@ -72,7 +72,7 @@
   CongestionControlType GetCongestionControlType() const override;
   bool InSlowStart() const override;
   bool InRecovery() const override;
-  bool IsProbingForMoreBandwidth() const override;
+  bool ShouldSendProbingPacket() const override;
   QuicString GetDebugState() const override;
   void OnApplicationLimited(QuicByteCount bytes_in_flight) override;
   // End implementation of SendAlgorithmInterface.
diff --git a/net/third_party/quic/core/crypto/curve25519_key_exchange.cc b/net/third_party/quic/core/crypto/curve25519_key_exchange.cc
index 8c4efbc..8d7b277 100644
--- a/net/third_party/quic/core/crypto/curve25519_key_exchange.cc
+++ b/net/third_party/quic/core/crypto/curve25519_key_exchange.cc
@@ -7,32 +7,51 @@
 #include <cstdint>
 
 #include "net/third_party/quic/core/crypto/quic_random.h"
+#include "net/third_party/quic/platform/api/quic_ptr_util.h"
 #include "net/third_party/quic/platform/api/quic_string.h"
 #include "third_party/boringssl/src/include/openssl/curve25519.h"
 
 namespace quic {
+namespace {
+
+class Curve25519KeyExchangeFactory : public KeyExchange::Factory {
+ public:
+  Curve25519KeyExchangeFactory() = default;
+  ~Curve25519KeyExchangeFactory() override = default;
+
+  std::unique_ptr<KeyExchange> Create(QuicRandom* rand) const override {
+    const QuicString private_value = Curve25519KeyExchange::NewPrivateKey(rand);
+    return Curve25519KeyExchange::New(private_value);
+  }
+
+  QuicTag tag() const override { return kC255; }
+};
+
+}  // namespace
 
 Curve25519KeyExchange::Curve25519KeyExchange() {}
 
 Curve25519KeyExchange::~Curve25519KeyExchange() {}
 
 // static
-Curve25519KeyExchange* Curve25519KeyExchange::New(QuicStringPiece private_key) {
-  Curve25519KeyExchange* ka;
+std::unique_ptr<Curve25519KeyExchange> Curve25519KeyExchange::New(
+    QuicStringPiece private_key) {
   // We don't want to #include the BoringSSL headers in the public header file,
   // so we use literals for the sizes of private_key_ and public_key_. Here we
   // assert that those values are equal to the values from the BoringSSL
   // header.
-  static_assert(sizeof(ka->private_key_) == X25519_PRIVATE_KEY_LEN,
-                "header out of sync");
-  static_assert(sizeof(ka->public_key_) == X25519_PUBLIC_VALUE_LEN,
-                "header out of sync");
+  static_assert(
+      sizeof(Curve25519KeyExchange::private_key_) == X25519_PRIVATE_KEY_LEN,
+      "header out of sync");
+  static_assert(
+      sizeof(Curve25519KeyExchange::public_key_) == X25519_PUBLIC_VALUE_LEN,
+      "header out of sync");
 
   if (private_key.size() != X25519_PRIVATE_KEY_LEN) {
     return nullptr;
   }
 
-  ka = new Curve25519KeyExchange();
+  auto ka = QuicWrapUnique(new Curve25519KeyExchange);
   memcpy(ka->private_key_, private_key.data(), X25519_PRIVATE_KEY_LEN);
   X25519_public_from_private(ka->public_key_, ka->private_key_);
   return ka;
@@ -45,9 +64,10 @@
   return QuicString(reinterpret_cast<char*>(private_key), sizeof(private_key));
 }
 
-KeyExchange* Curve25519KeyExchange::NewKeyPair(QuicRandom* rand) const {
-  const QuicString private_value = NewPrivateKey(rand);
-  return Curve25519KeyExchange::New(private_value);
+const Curve25519KeyExchange::Factory& Curve25519KeyExchange::GetFactory()
+    const {
+  static const Factory* factory = new Curve25519KeyExchangeFactory;
+  return *factory;
 }
 
 bool Curve25519KeyExchange::CalculateSharedKey(
@@ -72,8 +92,4 @@
                          sizeof(public_key_));
 }
 
-QuicTag Curve25519KeyExchange::tag() const {
-  return kC255;
-}
-
 }  // namespace quic
diff --git a/net/third_party/quic/core/crypto/curve25519_key_exchange.h b/net/third_party/quic/core/crypto/curve25519_key_exchange.h
index b486429..3ddf7c2 100644
--- a/net/third_party/quic/core/crypto/curve25519_key_exchange.h
+++ b/net/third_party/quic/core/crypto/curve25519_key_exchange.h
@@ -25,18 +25,18 @@
 
   // New creates a new object from a private key. If the private key is
   // invalid, nullptr is returned.
-  static Curve25519KeyExchange* New(QuicStringPiece private_key);
+  static std::unique_ptr<Curve25519KeyExchange> New(
+      QuicStringPiece private_key);
 
   // NewPrivateKey returns a private key, generated from |rand|, suitable for
   // passing to |New|.
   static QuicString NewPrivateKey(QuicRandom* rand);
 
   // KeyExchange interface.
-  KeyExchange* NewKeyPair(QuicRandom* rand) const override;
+  const Factory& GetFactory() const override;
   bool CalculateSharedKey(QuicStringPiece peer_public_value,
                           QuicString* shared_key) const override;
   QuicStringPiece public_value() const override;
-  QuicTag tag() const override;
 
  private:
   Curve25519KeyExchange();
diff --git a/net/third_party/quic/core/crypto/ephemeral_key_source.h b/net/third_party/quic/core/crypto/ephemeral_key_source.h
index 22f7b19..0248891 100644
--- a/net/third_party/quic/core/crypto/ephemeral_key_source.h
+++ b/net/third_party/quic/core/crypto/ephemeral_key_source.h
@@ -5,6 +5,7 @@
 #ifndef NET_THIRD_PARTY_QUIC_CORE_CRYPTO_EPHEMERAL_KEY_SOURCE_H_
 #define NET_THIRD_PARTY_QUIC_CORE_CRYPTO_EPHEMERAL_KEY_SOURCE_H_
 
+#include "net/third_party/quic/core/crypto/key_exchange.h"
 #include "net/third_party/quic/core/quic_time.h"
 #include "net/third_party/quic/platform/api/quic_export.h"
 #include "net/third_party/quic/platform/api/quic_string.h"
@@ -12,7 +13,6 @@
 
 namespace quic {
 
-class KeyExchange;
 class QuicRandom;
 
 // EphemeralKeySource manages and rotates ephemeral keys as they can be reused
@@ -24,12 +24,12 @@
   virtual ~EphemeralKeySource() {}
 
   // CalculateForwardSecureKey generates an ephemeral public/private key pair
-  // using the algorithm |key_exchange|, sets |*public_value| to the public key
-  // and returns the shared key between |peer_public_value| and the private
-  // key. |*public_value| will be sent to the peer to be used with the peer's
-  // private key.
+  // using the algorithm represented by |key_exchange_factory|, sets
+  // |*public_value| to the public key and returns the shared key between
+  // |peer_public_value| and the private key. |*public_value| will be sent to
+  // the peer to be used with the peer's private key.
   virtual QuicString CalculateForwardSecureKey(
-      const KeyExchange* key_exchange,
+      const KeyExchange::Factory& key_exchange_factory,
       QuicRandom* rand,
       QuicTime now,
       QuicStringPiece peer_public_value,
diff --git a/net/third_party/quic/core/crypto/key_exchange.h b/net/third_party/quic/core/crypto/key_exchange.h
index 744e58f..65fe674 100644
--- a/net/third_party/quic/core/crypto/key_exchange.h
+++ b/net/third_party/quic/core/crypto/key_exchange.h
@@ -5,6 +5,8 @@
 #ifndef NET_THIRD_PARTY_QUIC_CORE_CRYPTO_KEY_EXCHANGE_H_
 #define NET_THIRD_PARTY_QUIC_CORE_CRYPTO_KEY_EXCHANGE_H_
 
+#include <memory>
+
 #include "net/third_party/quic/core/crypto/crypto_protocol.h"
 #include "net/third_party/quic/platform/api/quic_export.h"
 #include "net/third_party/quic/platform/api/quic_string.h"
@@ -20,10 +22,25 @@
  public:
   virtual ~KeyExchange() {}
 
-  // NewKeyPair generates a new public, private key pair. The caller takes
-  // ownership of the return value. (This is intended for servers that need to
-  // generate forward-secure keys.)
-  virtual KeyExchange* NewKeyPair(QuicRandom* rand) const = 0;
+  class Factory {
+   public:
+    virtual ~Factory() = default;
+    Factory(const Factory&) = delete;
+    Factory& operator=(const Factory&) = delete;
+
+    // Generates a new public, private key pair. (This is intended for
+    // servers that need to generate forward-secure keys.)
+    virtual std::unique_ptr<KeyExchange> Create(QuicRandom* rand) const = 0;
+
+    // Returns the tag value that identifies this key exchange function.
+    virtual QuicTag tag() const = 0;
+
+   protected:
+    Factory() = default;
+  };
+
+  // Get a reference to the singleton Factory object for this KeyExchange type.
+  virtual const Factory& GetFactory() const = 0;
 
   // CalculateSharedKey computes the shared key between the local private key
   // (which is implicitly known by a KeyExchange object) and a public value
@@ -36,9 +53,6 @@
   // reference to a member of the KeyExchange and is only valid for as long as
   // the KeyExchange exists.
   virtual QuicStringPiece public_value() const = 0;
-
-  // tag returns the tag value that identifies this key exchange function.
-  virtual QuicTag tag() const = 0;
 };
 
 }  // namespace quic
diff --git a/net/third_party/quic/core/crypto/p256_key_exchange.cc b/net/third_party/quic/core/crypto/p256_key_exchange.cc
index bf6f19b..97cc2c4 100644
--- a/net/third_party/quic/core/crypto/p256_key_exchange.cc
+++ b/net/third_party/quic/core/crypto/p256_key_exchange.cc
@@ -9,6 +9,7 @@
 #include <utility>
 
 #include "net/third_party/quic/platform/api/quic_logging.h"
+#include "net/third_party/quic/platform/api/quic_ptr_util.h"
 #include "net/third_party/quic/platform/api/quic_string.h"
 #include "third_party/boringssl/src/include/openssl/ec.h"
 #include "third_party/boringssl/src/include/openssl/ecdh.h"
@@ -16,6 +17,23 @@
 #include "third_party/boringssl/src/include/openssl/evp.h"
 
 namespace quic {
+namespace {
+
+class P256KeyExchangeFactory : public KeyExchange::Factory {
+ public:
+  P256KeyExchangeFactory() = default;
+  ~P256KeyExchangeFactory() override = default;
+
+  std::unique_ptr<KeyExchange> Create(QuicRandom* /* rand */) const override {
+    // TODO(agl): avoid the serialisation/deserialisation in this function.
+    const QuicString private_value = P256KeyExchange::NewPrivateKey();
+    return P256KeyExchange::New(private_value);
+  }
+
+  QuicTag tag() const override { return kP256; }
+};
+
+}  // namespace
 
 P256KeyExchange::P256KeyExchange(bssl::UniquePtr<EC_KEY> private_key,
                                  const uint8_t* public_key)
@@ -26,7 +44,7 @@
 P256KeyExchange::~P256KeyExchange() {}
 
 // static
-P256KeyExchange* P256KeyExchange::New(QuicStringPiece key) {
+std::unique_ptr<P256KeyExchange> P256KeyExchange::New(QuicStringPiece key) {
   if (key.empty()) {
     QUIC_DLOG(INFO) << "Private key is empty";
     return nullptr;
@@ -49,7 +67,8 @@
     return nullptr;
   }
 
-  return new P256KeyExchange(std::move(private_key), public_key);
+  return QuicWrapUnique(
+      new P256KeyExchange(std::move(private_key), public_key));
 }
 
 // static
@@ -74,10 +93,9 @@
   return QuicString(reinterpret_cast<char*>(private_key.get()), key_len);
 }
 
-KeyExchange* P256KeyExchange::NewKeyPair(QuicRandom* /*rand*/) const {
-  // TODO(agl): avoid the serialisation/deserialisation in this function.
-  const QuicString private_value = NewPrivateKey();
-  return P256KeyExchange::New(private_value);
+const KeyExchange::Factory& P256KeyExchange::GetFactory() const {
+  static const Factory* factory = new P256KeyExchangeFactory;
+  return *factory;
 }
 
 bool P256KeyExchange::CalculateSharedKey(QuicStringPiece peer_public_value,
@@ -115,8 +133,4 @@
                          sizeof(public_key_));
 }
 
-QuicTag P256KeyExchange::tag() const {
-  return kP256;
-}
-
 }  // namespace quic
diff --git a/net/third_party/quic/core/crypto/p256_key_exchange.h b/net/third_party/quic/core/crypto/p256_key_exchange.h
index c7496829..f30dddcb 100644
--- a/net/third_party/quic/core/crypto/p256_key_exchange.h
+++ b/net/third_party/quic/core/crypto/p256_key_exchange.h
@@ -24,7 +24,7 @@
 
   // New creates a new key exchange object from a private key. If
   // |private_key| is invalid, nullptr is returned.
-  static P256KeyExchange* New(QuicStringPiece private_key);
+  static std::unique_ptr<P256KeyExchange> New(QuicStringPiece private_key);
 
   // |NewPrivateKey| returns a private key, suitable for passing to |New|.
   // If |NewPrivateKey| can't generate a private key, it returns an empty
@@ -32,11 +32,10 @@
   static QuicString NewPrivateKey();
 
   // KeyExchange interface.
-  KeyExchange* NewKeyPair(QuicRandom* rand) const override;
+  const Factory& GetFactory() const override;
   bool CalculateSharedKey(QuicStringPiece peer_public_value,
                           QuicString* shared_key) const override;
   QuicStringPiece public_value() const override;
-  QuicTag tag() const override;
 
  private:
   enum {
diff --git a/net/third_party/quic/core/crypto/quic_crypto_client_config.cc b/net/third_party/quic/core/crypto/quic_crypto_client_config.cc
index 544150d..4e94381d 100644
--- a/net/third_party/quic/core/crypto/quic_crypto_client_config.cc
+++ b/net/third_party/quic/core/crypto/quic_crypto_client_config.cc
@@ -594,12 +594,12 @@
 
   switch (out_params->key_exchange) {
     case kC255:
-      out_params->client_key_exchange.reset(Curve25519KeyExchange::New(
-          Curve25519KeyExchange::NewPrivateKey(rand)));
+      out_params->client_key_exchange = Curve25519KeyExchange::New(
+          Curve25519KeyExchange::NewPrivateKey(rand));
       break;
     case kP256:
-      out_params->client_key_exchange.reset(
-          P256KeyExchange::New(P256KeyExchange::NewPrivateKey()));
+      out_params->client_key_exchange =
+          P256KeyExchange::New(P256KeyExchange::NewPrivateKey());
       break;
     default:
       DCHECK(false);
diff --git a/net/third_party/quic/core/crypto/quic_crypto_server_config.cc b/net/third_party/quic/core/crypto/quic_crypto_server_config.cc
index b3a0473..07c9f4f4 100644
--- a/net/third_party/quic/core/crypto/quic_crypto_server_config.cc
+++ b/net/third_party/quic/core/crypto/quic_crypto_server_config.cc
@@ -39,6 +39,7 @@
 #include "net/third_party/quic/platform/api/quic_flags.h"
 #include "net/third_party/quic/platform/api/quic_hostname_utils.h"
 #include "net/third_party/quic/platform/api/quic_logging.h"
+#include "net/third_party/quic/platform/api/quic_ptr_util.h"
 #include "net/third_party/quic/platform/api/quic_reference_counted.h"
 #include "net/third_party/quic/platform/api/quic_string.h"
 #include "net/third_party/quic/platform/api/quic_text_utils.h"
@@ -947,11 +948,11 @@
   if (ephemeral_key_source_) {
     params->forward_secure_premaster_secret =
         ephemeral_key_source_->CalculateForwardSecureKey(
-            key_exchange, rand, clock->ApproximateNow(), public_value,
-            &forward_secure_public_value);
+            key_exchange->GetFactory(), rand, clock->ApproximateNow(),
+            public_value, &forward_secure_public_value);
   } else {
-    std::unique_ptr<KeyExchange> forward_secure_key_exchange(
-        key_exchange->NewKeyPair(rand));
+    std::unique_ptr<KeyExchange> forward_secure_key_exchange =
+        key_exchange->GetFactory().Create(rand);
     forward_secure_public_value =
         QuicString(forward_secure_key_exchange->public_value());
     if (!forward_secure_key_exchange->CalculateSharedKey(
@@ -1123,23 +1124,23 @@
  public:
   EvaluateClientHelloCallback(
       const QuicCryptoServerConfig& config,
-      bool found_error,
       const QuicIpAddress& server_ip,
       QuicTransportVersion version,
       QuicReferenceCountedPointer<QuicCryptoServerConfig::Config>
           requested_config,
       QuicReferenceCountedPointer<QuicCryptoServerConfig::Config>
           primary_config,
+      bool use_get_cert_chain,
       QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config,
       QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result>
           client_hello_state,
       std::unique_ptr<ValidateClientHelloResultCallback> done_cb)
       : config_(config),
-        found_error_(found_error),
         server_ip_(server_ip),
         version_(version),
         requested_config_(std::move(requested_config)),
         primary_config_(std::move(primary_config)),
+        use_get_cert_chain_(use_get_cert_chain),
         signed_config_(signed_config),
         client_hello_state_(std::move(client_hello_state)),
         done_cb_(std::move(done_cb)) {}
@@ -1153,20 +1154,20 @@
       signed_config_->proof = proof;
     }
     config_.EvaluateClientHelloAfterGetProof(
-        found_error_, server_ip_, version_, requested_config_, primary_config_,
-        signed_config_, std::move(details), !ok, client_hello_state_,
-        std::move(done_cb_));
+        server_ip_, version_, requested_config_, primary_config_,
+        signed_config_, std::move(details), use_get_cert_chain_, !ok,
+        client_hello_state_, std::move(done_cb_));
   }
 
  private:
   const QuicCryptoServerConfig& config_;
-  const bool found_error_;
   const QuicIpAddress& server_ip_;
   const QuicTransportVersion version_;
   const QuicReferenceCountedPointer<QuicCryptoServerConfig::Config>
       requested_config_;
   const QuicReferenceCountedPointer<QuicCryptoServerConfig::Config>
       primary_config_;
+  const bool use_get_cert_chain_;
   QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config_;
   QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result>
       client_hello_state_;
@@ -1182,6 +1183,8 @@
     QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result>
         client_hello_state,
     std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const {
+  DCHECK(!signed_config->chain);
+
   ValidateClientHelloHelper helper(client_hello_state, &done_cb);
 
   const CryptoHandshakeMessage& client_hello = client_hello_state->client_hello;
@@ -1240,29 +1243,24 @@
     return;
   }
 
-  bool found_error = false;
   if (source_address_token_error != HANDSHAKE_OK) {
     info->reject_reasons.push_back(source_address_token_error);
     // No valid source address token.
-    found_error = true;
   }
 
-  bool get_proof_failed = false;
-  QuicString serialized_config = primary_config->serialized;
-  QuicString chlo_hash;
-  CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash,
-                                    Perspective::IS_SERVER);
-  bool need_proof = true;
-  need_proof = !signed_config->chain;
-
-  if (need_proof) {
+  const bool use_get_cert_chain =
+      GetQuicReloadableFlag(quic_use_get_cert_chain);
+  if (!use_get_cert_chain) {
+    QuicString serialized_config = primary_config->serialized;
+    QuicString chlo_hash;
+    CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash,
+                                      Perspective::IS_SERVER);
     // Make an async call to GetProof and setup the callback to trampoline
     // back into EvaluateClientHelloAfterGetProof
-    std::unique_ptr<EvaluateClientHelloCallback> cb(
-        new EvaluateClientHelloCallback(
-            *this, found_error, server_address.host(), version,
-            requested_config, primary_config, signed_config, client_hello_state,
-            std::move(done_cb)));
+    auto cb = QuicMakeUnique<EvaluateClientHelloCallback>(
+        *this, server_address.host(), version, requested_config, primary_config,
+        use_get_cert_chain, signed_config, client_hello_state,
+        std::move(done_cb));
     proof_source_->GetProof(server_address, QuicString(info->sni),
                             serialized_config, version, chlo_hash,
                             std::move(cb));
@@ -1270,23 +1268,28 @@
     return;
   }
 
-  // Details are null because the synchronous version of GetProof does not
-  // return any stats.  Eventually the synchronous codepath will be eliminated.
+  QuicReferenceCountedPointer<ProofSource::Chain> chain =
+      proof_source_->GetCertChain(server_address, QuicString(info->sni));
+  if (!chain) {
+    info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE);
+  } else if (!ValidateExpectedLeafCertificate(client_hello, chain->certs)) {
+    info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE);
+  }
   EvaluateClientHelloAfterGetProof(
-      found_error, server_address.host(), version, requested_config,
-      primary_config, signed_config, nullptr /* proof_source_details */,
-      get_proof_failed, client_hello_state, std::move(done_cb));
+      server_address.host(), version, requested_config, primary_config,
+      signed_config, /*proof_source_details=*/nullptr, use_get_cert_chain,
+      /*get_proof_failed=*/false, client_hello_state, std::move(done_cb));
   helper.DetachCallback();
 }
 
 void QuicCryptoServerConfig::EvaluateClientHelloAfterGetProof(
-    bool found_error,
     const QuicIpAddress& server_ip,
     QuicTransportVersion version,
     QuicReferenceCountedPointer<Config> requested_config,
     QuicReferenceCountedPointer<Config> primary_config,
     QuicReferenceCountedPointer<QuicSignedServerConfig> signed_config,
     std::unique_ptr<ProofSource::Details> proof_source_details,
+    bool use_get_cert_chain,
     bool get_proof_failed,
     QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result>
         client_hello_state,
@@ -1295,14 +1298,16 @@
   const CryptoHandshakeMessage& client_hello = client_hello_state->client_hello;
   ClientHelloInfo* info = &(client_hello_state->info);
 
-  if (get_proof_failed) {
-    info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE);
-  }
+  if (!use_get_cert_chain) {
+    if (get_proof_failed) {
+      info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE);
+    }
 
-  if (signed_config->chain != nullptr &&
-      !ValidateExpectedLeafCertificate(client_hello,
-                                       signed_config->chain->certs)) {
-    info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE);
+    if (signed_config->chain != nullptr &&
+        !ValidateExpectedLeafCertificate(client_hello,
+                                         signed_config->chain->certs)) {
+      info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE);
+    }
   }
 
   if (info->client_nonce.size() != kNonceSize) {
@@ -1361,12 +1366,6 @@
           this, version, compressed_certs_cache, common_cert_sets, params,
           std::move(message), std::move(cb)));
 
-  // Note: We unconditionally use the async variant of GetProof here, unlike
-  // elsewhere in this file where we check for the kSYNC tag in the CHLO for the
-  // connection before deciding.  This call is not in the critical serving path,
-  // and so should not have much impact on the experiments associated with that
-  // tag (plus it would be a chore to plumb information about the tag down to
-  // here).
   proof_source_->GetProof(server_address, params.sni, serialized, version,
                           chlo_hash, std::move(proof_source_cb));
 }
@@ -1675,7 +1674,7 @@
     std::unique_ptr<KeyExchange> ka;
     switch (tag) {
       case kC255:
-        ka.reset(Curve25519KeyExchange::New(private_key));
+        ka = Curve25519KeyExchange::New(private_key);
         if (!ka.get()) {
           QUIC_LOG(WARNING) << "Server config contained an invalid curve25519"
                                " private key.";
@@ -1683,7 +1682,7 @@
         }
         break;
       case kP256:
-        ka.reset(P256KeyExchange::New(private_key));
+        ka = P256KeyExchange::New(private_key);
         if (!ka.get()) {
           QUIC_LOG(WARNING) << "Server config contained an invalid P-256"
                                " private key.";
@@ -1699,7 +1698,7 @@
     }
 
     for (const auto& key_exchange : config->key_exchanges) {
-      if (key_exchange->tag() == tag) {
+      if (key_exchange->GetFactory().tag() == tag) {
         QUIC_LOG(WARNING) << "Duplicate key exchange in config: " << tag;
         return nullptr;
       }
diff --git a/net/third_party/quic/core/crypto/quic_crypto_server_config.h b/net/third_party/quic/core/crypto/quic_crypto_server_config.h
index 56bee07..eebadec 100644
--- a/net/third_party/quic/core/crypto/quic_crypto_server_config.h
+++ b/net/third_party/quic/core/crypto/quic_crypto_server_config.h
@@ -513,18 +513,17 @@
   friend class EvaluateClientHelloCallback;
 
   // Continuation of EvaluateClientHello after the call to
-  // ProofSource::GetProof.  |found_error| indicates whether an error was
-  // detected in EvaluateClientHello, and |get_proof_failed| indicates whether
-  // GetProof failed.  If GetProof was not run, then |get_proof_failed| will be
+  // ProofSource::GetProof. |get_proof_failed| indicates whether GetProof
+  // failed.  If GetProof was not run, then |get_proof_failed| will be
   // set to false.
   void EvaluateClientHelloAfterGetProof(
-      bool found_error,
       const QuicIpAddress& server_ip,
       QuicTransportVersion version,
       QuicReferenceCountedPointer<Config> requested_config,
       QuicReferenceCountedPointer<Config> primary_config,
       QuicReferenceCountedPointer<QuicSignedServerConfig> crypto_proof,
       std::unique_ptr<ProofSource::Details> proof_source_details,
+      bool use_get_cert_chain,
       bool get_proof_failed,
       QuicReferenceCountedPointer<ValidateClientHelloResultCallback::Result>
           client_hello_state,
diff --git a/net/third_party/quic/core/http/end_to_end_test.cc b/net/third_party/quic/core/http/end_to_end_test.cc
index df26fb2b8..de85732 100644
--- a/net/third_party/quic/core/http/end_to_end_test.cc
+++ b/net/third_party/quic/core/http/end_to_end_test.cc
@@ -1404,7 +1404,6 @@
 }
 
 TEST_P(EndToEndTest, ClientSuggestsIgnoredRTT) {
-  SetQuicReloadableFlag(quic_no_irtt, true);
   // Client suggests initial RTT, but also specifies NRTT, so it's not used.
   const QuicTime::Delta kInitialRTT = QuicTime::Delta::FromMicroseconds(20000);
   client_config_.SetInitialRoundTripTimeUsToSend(kInitialRTT.ToMicroseconds());
@@ -2916,6 +2915,41 @@
   }
 }
 
+// Regression test for b/111515567
+TEST_P(EndToEndTest, AgreeOnStopWaiting) {
+  ASSERT_TRUE(Initialize());
+  EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
+
+  QuicConnection* client_connection =
+      client_->client()->client_session()->connection();
+  server_thread_->Pause();
+  QuicConnection* server_connection = GetServerConnection();
+  // Verify client and server connections agree on the value of
+  // no_stop_waiting_frames.
+  EXPECT_EQ(QuicConnectionPeer::GetNoStopWaitingFrames(client_connection),
+            QuicConnectionPeer::GetNoStopWaitingFrames(server_connection));
+  server_thread_->Resume();
+}
+
+// Regression test for b/111515567
+TEST_P(EndToEndTest, AgreeOnStopWaitingWithNoStopWaitingOption) {
+  QuicTagVector options;
+  options.push_back(kNSTP);
+  client_config_.SetConnectionOptionsToSend(options);
+  ASSERT_TRUE(Initialize());
+  EXPECT_TRUE(client_->client()->WaitForCryptoHandshakeConfirmed());
+
+  QuicConnection* client_connection =
+      client_->client()->client_session()->connection();
+  server_thread_->Pause();
+  QuicConnection* server_connection = GetServerConnection();
+  // Verify client and server connections agree on the value of
+  // no_stop_waiting_frames.
+  EXPECT_EQ(QuicConnectionPeer::GetNoStopWaitingFrames(client_connection),
+            QuicConnectionPeer::GetNoStopWaitingFrames(server_connection));
+  server_thread_->Resume();
+}
+
 TEST_P(EndToEndTest, ReleaseHeadersStreamBufferWhenIdle) {
   // Tests that when client side has no active request and no waiting
   // PUSH_PROMISE, its headers stream's sequencer buffer should be released.
diff --git a/net/third_party/quic/core/http/quic_spdy_session_test.cc b/net/third_party/quic/core/http/quic_spdy_session_test.cc
index fc9c5be..a21991c 100644
--- a/net/third_party/quic/core/http/quic_spdy_session_test.cc
+++ b/net/third_party/quic/core/http/quic_spdy_session_test.cc
@@ -1019,7 +1019,7 @@
   while (!headers_stream->flow_controller()->IsBlocked() && stream_id < 2000) {
     EXPECT_FALSE(session_.IsConnectionFlowControlBlocked());
     EXPECT_FALSE(session_.IsStreamFlowControlBlocked());
-    headers["header"] = QuicStrCat("", random.RandUint64(), random.RandUint64(),
+    headers["header"] = QuicStrCat(random.RandUint64(), random.RandUint64(),
                                    random.RandUint64());
     session_.WriteHeaders(stream_id, headers.Clone(), true, 0, nullptr);
     stream_id += 2;
diff --git a/net/third_party/quic/core/quic_connection.cc b/net/third_party/quic/core/quic_connection.cc
index b94f16f..25a2fe4 100644
--- a/net/third_party/quic/core/quic_connection.cc
+++ b/net/third_party/quic/core/quic_connection.cc
@@ -428,9 +428,7 @@
   if (config.HasClientSentConnectionOption(kAKDU, perspective_)) {
     unlimited_ack_decimation_ = true;
   }
-  if (GetQuicReloadableFlag(quic_fast_ack_after_quiescence) &&
-      config.HasClientSentConnectionOption(kACKQ, perspective_)) {
-    QUIC_FLAG_COUNT(quic_reloadable_flag_quic_fast_ack_after_quiescence);
+  if (config.HasClientSentConnectionOption(kACKQ, perspective_)) {
     fast_ack_after_quiescence_ = true;
   }
   if (config.HasClientSentConnectionOption(k5RTO, perspective_)) {
@@ -586,6 +584,8 @@
                   << ParsedQuicVersionToString(received_version);
 
   MaybeEnableSessionDecidesWhatToWrite();
+  no_stop_waiting_frames_ =
+      received_version.transport_version > QUIC_VERSION_43;
 
   // TODO(satyamshekhar): Store the packet number of this packet and close the
   // connection if we ever received a packet with incorrect version and whose
@@ -645,6 +645,7 @@
 
   QUIC_DLOG(INFO) << ENDPOINT << "Negotiated version: "
                   << QuicVersionToString(transport_version());
+  no_stop_waiting_frames_ = transport_version() > QUIC_VERSION_43;
   version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
   RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
 }
@@ -878,15 +879,10 @@
     return true;
   }
 
-  QuicPacketNumber largest_sent_packet = packet_generator_.packet_number();
-  if (GetQuicReloadableFlag(quic_validate_ack_largest_observed)) {
-    QUIC_FLAG_COUNT(quic_reloadable_flag_quic_validate_ack_largest_observed);
-    largest_sent_packet = sent_packet_manager_.GetLargestSentPacket();
-  }
-  if (largest_acked > largest_sent_packet) {
+  if (largest_acked > sent_packet_manager_.GetLargestSentPacket()) {
     QUIC_DLOG(WARNING) << ENDPOINT
                        << "Peer's observed unsent packet:" << largest_acked
-                       << " vs " << largest_sent_packet;
+                       << " vs " << sent_packet_manager_.GetLargestSentPacket();
     // We got an error for data we have not sent.
     CloseConnection(QUIC_INVALID_ACK_DATA, "Largest observed too high.",
                     ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
@@ -3065,7 +3061,7 @@
     return;
   }
 
-  if (!sent_packet_manager_.GetSendAlgorithm()->IsProbingForMoreBandwidth()) {
+  if (!sent_packet_manager_.GetSendAlgorithm()->ShouldSendProbingPacket()) {
     return;
   }
 
diff --git a/net/third_party/quic/core/quic_connection_test.cc b/net/third_party/quic/core/quic_connection_test.cc
index 08b3417..bc97cf1 100644
--- a/net/third_party/quic/core/quic_connection_test.cc
+++ b/net/third_party/quic/core/quic_connection_test.cc
@@ -6256,8 +6256,53 @@
   EXPECT_FALSE(connection_.connected());
 }
 
+TEST_P(QuicConnectionTest, SetRetransmissionAlarmForCryptoPacket) {
+  EXPECT_TRUE(connection_.connected());
+  EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
+
+  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+  connection_.SendCryptoStreamData();
+
+  // Verify retransmission timer is correctly set after crypto packet has been
+  // sent.
+  EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
+  QuicTime retransmission_time =
+      QuicConnectionPeer::GetSentPacketManager(&connection_)
+          ->GetRetransmissionTime();
+  EXPECT_NE(retransmission_time, clock_.ApproximateNow());
+  EXPECT_EQ(retransmission_time,
+            connection_.GetRetransmissionAlarm()->deadline());
+
+  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+  connection_.GetRetransmissionAlarm()->Fire();
+}
+
+TEST_P(QuicConnectionTest, PathDegradingAlarmForCryptoPacket) {
+  EXPECT_TRUE(connection_.connected());
+  EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet());
+  EXPECT_FALSE(connection_.IsPathDegrading());
+
+  EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1);
+  connection_.SendCryptoStreamData();
+
+  EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet());
+  EXPECT_FALSE(connection_.IsPathDegrading());
+  QuicTime::Delta delay = QuicConnectionPeer::GetSentPacketManager(&connection_)
+                              ->GetPathDegradingDelay();
+  EXPECT_EQ(clock_.ApproximateNow() + delay,
+            connection_.GetPathDegradingAlarm()->deadline());
+
+  // Fire the path degrading alarm, path degrading signal should be sent to
+  // the visitor.
+  EXPECT_CALL(visitor_, OnPathDegrading());
+  clock_.AdvanceTime(delay);
+  connection_.GetPathDegradingAlarm()->Fire();
+  EXPECT_TRUE(connection_.IsPathDegrading());
+  EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet());
+}
+
 // Includes regression test for https://b.corp.google.com/issues/69979024.
-TEST_P(QuicConnectionTest, PathDegradingAlarm) {
+TEST_P(QuicConnectionTest, PathDegradingAlarmForNonCryptoPackets) {
   EXPECT_TRUE(connection_.connected());
   EXPECT_FALSE(connection_.GetPathDegradingAlarm()->IsSet());
   EXPECT_FALSE(connection_.IsPathDegrading());
@@ -6269,7 +6314,8 @@
   for (int i = 0; i < 2; ++i) {
     // Send a packet. Now there's a retransmittable packet on the wire, so the
     // path degrading alarm should be set.
-    connection_.SendStreamDataWithString(1, data, offset, NO_FIN);
+    connection_.SendStreamDataWithString(kClientDataStreamId1, data, offset,
+                                         NO_FIN);
     offset += data_size;
     EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet());
     // Check the deadline of the path degrading alarm.
@@ -6284,7 +6330,8 @@
     // Regression test for https://b.corp.google.com/issues/69979024.
     clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(5));
     QuicTime prev_deadline = connection_.GetPathDegradingAlarm()->deadline();
-    connection_.SendStreamDataWithString(1, data, offset, NO_FIN);
+    connection_.SendStreamDataWithString(kClientDataStreamId1, data, offset,
+                                         NO_FIN);
     offset += data_size;
     EXPECT_TRUE(connection_.GetPathDegradingAlarm()->IsSet());
     EXPECT_EQ(prev_deadline, connection_.GetPathDegradingAlarm()->deadline());
@@ -6648,7 +6695,7 @@
 // the connection becomes application-limited.
 TEST_P(QuicConnectionTest, SendDataWhenApplicationLimited) {
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
-  EXPECT_CALL(*send_algorithm_, IsProbingForMoreBandwidth())
+  EXPECT_CALL(*send_algorithm_, ShouldSendProbingPacket())
       .WillRepeatedly(Return(true));
   {
     InSequence seq;
@@ -6997,7 +7044,6 @@
 }
 
 TEST_P(QuicConnectionTest, WriteBlockedWithInvalidAck) {
-  SetQuicReloadableFlag(quic_validate_ack_largest_observed, true);
   EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
   EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_ACK_DATA, _, _));
 
diff --git a/net/third_party/quic/core/quic_epoll_alarm_factory_test.cc b/net/third_party/quic/core/quic_epoll_alarm_factory_test.cc
index c7553483..dfd1b7c6 100644
--- a/net/third_party/quic/core/quic_epoll_alarm_factory_test.cc
+++ b/net/third_party/quic/core/quic_epoll_alarm_factory_test.cc
@@ -6,7 +6,7 @@
 
 #include "net/third_party/quic/platform/api/quic_test.h"
 #include "net/third_party/quic/platform/impl/quic_epoll_clock.h"
-#include "net/third_party/quic/test_tools/mock_epoll_server.h"
+#include "net/third_party/quic/test_tools/fake_epoll_server.h"
 
 namespace quic {
 namespace test {
@@ -36,7 +36,7 @@
 
   const QuicEpollClock clock_;
   QuicEpollAlarmFactory alarm_factory_;
-  test::MockEpollServer epoll_server_;
+  test::FakeEpollServer epoll_server_;
   QuicConnectionArena arena_;
 };
 
diff --git a/net/third_party/quic/core/quic_epoll_connection_helper_test.cc b/net/third_party/quic/core/quic_epoll_connection_helper_test.cc
index 7d785bc8..3149f87 100644
--- a/net/third_party/quic/core/quic_epoll_connection_helper_test.cc
+++ b/net/third_party/quic/core/quic_epoll_connection_helper_test.cc
@@ -6,7 +6,7 @@
 
 #include "net/third_party/quic/core/crypto/quic_random.h"
 #include "net/third_party/quic/platform/api/quic_test.h"
-#include "net/third_party/quic/test_tools/mock_epoll_server.h"
+#include "net/third_party/quic/test_tools/fake_epoll_server.h"
 
 namespace quic {
 namespace test {
@@ -17,7 +17,7 @@
   QuicEpollConnectionHelperTest()
       : helper_(&epoll_server_, QuicAllocator::BUFFER_POOL) {}
 
-  MockEpollServer epoll_server_;
+  test::FakeEpollServer epoll_server_;
   QuicEpollConnectionHelper helper_;
 };
 
diff --git a/net/third_party/quic/core/quic_framer.cc b/net/third_party/quic/core/quic_framer.cc
index c289c90..9c05cf5 100644
--- a/net/third_party/quic/core/quic_framer.cc
+++ b/net/third_party/quic/core/quic_framer.cc
@@ -423,6 +423,65 @@
 }
 
 // static
+size_t QuicFramer::GetRetransmittableControlFrameSize(
+    QuicTransportVersion version,
+    const QuicFrame& frame) {
+  switch (frame.type) {
+    case PING_FRAME:
+      // Ping has no payload.
+      return kQuicFrameTypeSize;
+    case RST_STREAM_FRAME:
+      return GetRstStreamFrameSize(version, *frame.rst_stream_frame);
+    case CONNECTION_CLOSE_FRAME:
+      return GetMinConnectionCloseFrameSize(version,
+                                            *frame.connection_close_frame) +
+             TruncatedErrorStringSize(
+                 frame.connection_close_frame->error_details);
+    case GOAWAY_FRAME:
+      return GetMinGoAwayFrameSize() +
+             TruncatedErrorStringSize(frame.goaway_frame->reason_phrase);
+    case WINDOW_UPDATE_FRAME:
+      // For version 99, this could be either a MAX DATA or MAX STREAM DATA.
+      // GetWindowUpdateFrameSize figures this out and returns the correct
+      // length.
+      return GetWindowUpdateFrameSize(version, *frame.window_update_frame);
+    case BLOCKED_FRAME:
+      return GetBlockedFrameSize(version, *frame.blocked_frame);
+    case APPLICATION_CLOSE_FRAME:
+      return GetMinApplicationCloseFrameSize(version,
+                                             *frame.application_close_frame) +
+             TruncatedErrorStringSize(
+                 frame.application_close_frame->error_details);
+    case NEW_CONNECTION_ID_FRAME:
+      return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
+    case MAX_STREAM_ID_FRAME:
+      return GetMaxStreamIdFrameSize(version, frame.max_stream_id_frame);
+    case STREAM_ID_BLOCKED_FRAME:
+      return GetStreamIdBlockedFrameSize(version,
+                                         frame.stream_id_blocked_frame);
+    case PATH_RESPONSE_FRAME:
+      return GetPathResponseFrameSize(*frame.path_response_frame);
+    case PATH_CHALLENGE_FRAME:
+      return GetPathChallengeFrameSize(*frame.path_challenge_frame);
+    case STOP_SENDING_FRAME:
+      return GetStopSendingFrameSize(*frame.stop_sending_frame);
+
+    case STREAM_FRAME:
+    case ACK_FRAME:
+    case STOP_WAITING_FRAME:
+    case MTU_DISCOVERY_FRAME:
+    case PADDING_FRAME:
+    case NUM_FRAME_TYPES:
+      DCHECK(false);
+      return 0;
+  }
+
+  // Not reachable, but some Chrome compilers can't figure that out.  *sigh*
+  DCHECK(false);
+  return 0;
+}
+
+// static
 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
   // Sizes are 1 through 4 bytes.
   for (int i = 1; i <= 4; ++i) {
@@ -3145,60 +3204,14 @@
                                      packet_number_length);
     case MTU_DISCOVERY_FRAME:
       // MTU discovery frames are serialized as ping frames.
-      QUIC_FALLTHROUGH_INTENDED;
-    case PING_FRAME:
-      // Ping has no payload.
       return kQuicFrameTypeSize;
-    case RST_STREAM_FRAME:
-      return GetRstStreamFrameSize(version_.transport_version,
-                                   *frame.rst_stream_frame);
-    case CONNECTION_CLOSE_FRAME:
-      return GetMinConnectionCloseFrameSize(version_.transport_version,
-                                            *frame.connection_close_frame) +
-             TruncatedErrorStringSize(
-                 frame.connection_close_frame->error_details);
-    case GOAWAY_FRAME:
-      return GetMinGoAwayFrameSize() +
-             TruncatedErrorStringSize(frame.goaway_frame->reason_phrase);
-    case WINDOW_UPDATE_FRAME:
-      // For version 99, this could be either a MAX DATA or MAX STREAM DATA.
-      // GetWindowUpdateFrameSize figures this out and returns the correct
-      // length.
-      return GetWindowUpdateFrameSize(version_.transport_version,
-                                      *frame.window_update_frame);
-    case BLOCKED_FRAME:
-      return GetBlockedFrameSize(version_.transport_version,
-                                 *frame.blocked_frame);
     case PADDING_FRAME:
       DCHECK(false);
       return 0;
-    case APPLICATION_CLOSE_FRAME:
-      return GetMinApplicationCloseFrameSize(version_.transport_version,
-                                             *frame.application_close_frame) +
-             TruncatedErrorStringSize(
-                 frame.application_close_frame->error_details);
-    case NEW_CONNECTION_ID_FRAME:
-      return GetNewConnectionIdFrameSize(*frame.new_connection_id_frame);
-    case MAX_STREAM_ID_FRAME:
-      return GetMaxStreamIdFrameSize(version_.transport_version,
-                                     frame.max_stream_id_frame);
-    case STREAM_ID_BLOCKED_FRAME:
-      return GetStreamIdBlockedFrameSize(version_.transport_version,
-                                         frame.stream_id_blocked_frame);
-    case PATH_RESPONSE_FRAME:
-      return GetPathResponseFrameSize(*frame.path_response_frame);
-    case PATH_CHALLENGE_FRAME:
-      return GetPathChallengeFrameSize(*frame.path_challenge_frame);
-    case STOP_SENDING_FRAME:
-      return GetStopSendingFrameSize(*frame.stop_sending_frame);
-    case NUM_FRAME_TYPES:
-      DCHECK(false);
-      return 0;
+    default:
+      return GetRetransmittableControlFrameSize(version_.transport_version,
+                                                frame);
   }
-
-  // Not reachable, but some Chrome compilers can't figure that out.  *sigh*
-  DCHECK(false);
-  return 0;
 }
 
 bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
diff --git a/net/third_party/quic/core/quic_framer.h b/net/third_party/quic/core/quic_framer.h
index 74dca318..8242091 100644
--- a/net/third_party/quic/core/quic_framer.h
+++ b/net/third_party/quic/core/quic_framer.h
@@ -301,6 +301,10 @@
   // Size in bytes required for a serialized stop sending frame.
   static size_t GetStopSendingFrameSize(const QuicStopSendingFrame& frame);
 
+  // Size in bytes required for a serialized retransmittable control |frame|.
+  static size_t GetRetransmittableControlFrameSize(QuicTransportVersion version,
+                                                   const QuicFrame& frame);
+
   // Returns the number of bytes added to the packet for the specified frame,
   // and 0 if the frame doesn't fit.  Includes the header size for the first
   // frame.
diff --git a/net/third_party/quic/core/quic_framer_test.cc b/net/third_party/quic/core/quic_framer_test.cc
index 142260d..487bd982 100644
--- a/net/third_party/quic/core/quic_framer_test.cc
+++ b/net/third_party/quic/core/quic_framer_test.cc
@@ -10144,6 +10144,83 @@
                                       QUIC_ARRAYSIZE(packet99));
 }
 
+TEST_P(QuicFramerTest, GetRetransmittableControlFrameSize) {
+  QuicRstStreamFrame rst_stream(1, 3, QUIC_STREAM_CANCELLED, 1024);
+  EXPECT_EQ(QuicFramer::GetRstStreamFrameSize(framer_.transport_version(),
+                                              rst_stream),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&rst_stream)));
+
+  QuicString error_detail(2048, 'e');
+  QuicConnectionCloseFrame connection_close(QUIC_NETWORK_IDLE_TIMEOUT,
+                                            error_detail);
+  EXPECT_EQ(QuicFramer::GetMinConnectionCloseFrameSize(
+                framer_.transport_version(), connection_close) +
+                256,
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&connection_close)));
+
+  QuicGoAwayFrame goaway(2, QUIC_PEER_GOING_AWAY, 3, error_detail);
+  EXPECT_EQ(QuicFramer::GetMinGoAwayFrameSize() + 256,
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&goaway)));
+
+  QuicWindowUpdateFrame window_update(3, 3, 1024);
+  EXPECT_EQ(QuicFramer::GetWindowUpdateFrameSize(framer_.transport_version(),
+                                                 window_update),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&window_update)));
+
+  QuicBlockedFrame blocked(4, 3, 1024);
+  EXPECT_EQ(
+      QuicFramer::GetBlockedFrameSize(framer_.transport_version(), blocked),
+      QuicFramer::GetRetransmittableControlFrameSize(
+          framer_.transport_version(), QuicFrame(&blocked)));
+
+  if (framer_.transport_version() != QUIC_VERSION_99) {
+    return;
+  }
+  QuicApplicationCloseFrame application_close;
+  EXPECT_EQ(QuicFramer::GetMinApplicationCloseFrameSize(
+                framer_.transport_version(), application_close),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&application_close)));
+
+  QuicNewConnectionIdFrame new_connection_id(5, 42, 1, 101111);
+  EXPECT_EQ(QuicFramer::GetNewConnectionIdFrameSize(new_connection_id),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&new_connection_id)));
+
+  QuicMaxStreamIdFrame max_stream_id(6, 3);
+  EXPECT_EQ(QuicFramer::GetMaxStreamIdFrameSize(framer_.transport_version(),
+                                                max_stream_id),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(max_stream_id)));
+
+  QuicStreamIdBlockedFrame stream_id_blocked(7, 3);
+  EXPECT_EQ(QuicFramer::GetStreamIdBlockedFrameSize(framer_.transport_version(),
+                                                    stream_id_blocked),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(stream_id_blocked)));
+
+  QuicPathFrameBuffer buffer = {
+      {0x80, 0x91, 0xa2, 0xb3, 0xc4, 0xd5, 0xe5, 0xf7}};
+  QuicPathResponseFrame path_response_frame(8, buffer);
+  EXPECT_EQ(QuicFramer::GetPathResponseFrameSize(path_response_frame),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&path_response_frame)));
+
+  QuicPathChallengeFrame path_challenge_frame(9, buffer);
+  EXPECT_EQ(QuicFramer::GetPathChallengeFrameSize(path_challenge_frame),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&path_challenge_frame)));
+
+  QuicStopSendingFrame stop_sending_frame(10, 3, 20);
+  EXPECT_EQ(QuicFramer::GetStopSendingFrameSize(stop_sending_frame),
+            QuicFramer::GetRetransmittableControlFrameSize(
+                framer_.transport_version(), QuicFrame(&stop_sending_frame)));
+}
+
 }  // namespace
 }  // namespace test
 }  // namespace quic
diff --git a/net/third_party/quic/core/quic_sent_packet_manager.cc b/net/third_party/quic/core/quic_sent_packet_manager.cc
index 4c82a89..0f55c57 100644
--- a/net/third_party/quic/core/quic_sent_packet_manager.cc
+++ b/net/third_party/quic/core/quic_sent_packet_manager.cc
@@ -100,10 +100,7 @@
 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
   if (config.HasReceivedInitialRoundTripTimeUs() &&
       config.ReceivedInitialRoundTripTimeUs() > 0) {
-    if (GetQuicReloadableFlag(quic_no_irtt) &&
-        config.HasClientSentConnectionOption(kNRTT, perspective_)) {
-      QUIC_FLAG_COUNT(quic_reloadable_flag_quic_no_irtt);
-    } else {
+    if (!config.HasClientSentConnectionOption(kNRTT, perspective_)) {
       SetInitialRtt(QuicTime::Delta::FromMicroseconds(
           config.ReceivedInitialRoundTripTimeUs()));
     }
@@ -180,9 +177,7 @@
   if (config.HasClientSentConnectionOption(k1TLP, perspective_)) {
     max_tail_loss_probes_ = 1;
   }
-  if (GetQuicReloadableFlag(quic_one_rto) &&
-      config.HasClientSentConnectionOption(k1RTO, perspective_)) {
-    QUIC_FLAG_COUNT(quic_reloadable_flag_quic_one_rto);
+  if (config.HasClientSentConnectionOption(k1RTO, perspective_)) {
     max_rto_packets_ = 1;
   }
   if (config.HasClientSentConnectionOption(kTLPR, perspective_)) {
diff --git a/net/third_party/quic/core/quic_sent_packet_manager_test.cc b/net/third_party/quic/core/quic_sent_packet_manager_test.cc
index e4c7af3..9658206f 100644
--- a/net/third_party/quic/core/quic_sent_packet_manager_test.cc
+++ b/net/third_party/quic/core/quic_sent_packet_manager_test.cc
@@ -1304,7 +1304,6 @@
 }
 
 TEST_P(QuicSentPacketManagerTest, RetransmissionTimeoutOnePacket) {
-  SetQuicReloadableFlag(quic_one_rto, true);
   // Set the 1RTO connection option.
   QuicConfig client_config;
   QuicTagVector options;
diff --git a/net/third_party/quic/platform/impl/quic_epoll_clock_test.cc b/net/third_party/quic/platform/impl/quic_epoll_clock_test.cc
index f0758de5..2b34654 100644
--- a/net/third_party/quic/platform/impl/quic_epoll_clock_test.cc
+++ b/net/third_party/quic/platform/impl/quic_epoll_clock_test.cc
@@ -5,7 +5,7 @@
 #include "net/third_party/quic/platform/impl/quic_epoll_clock.h"
 
 #include "net/third_party/quic/platform/api/quic_test.h"
-#include "net/third_party/quic/test_tools/mock_epoll_server.h"
+#include "net/third_party/quic/test_tools/fake_epoll_server.h"
 
 namespace quic {
 namespace test {
@@ -13,7 +13,7 @@
 class QuicEpollClockTest : public QuicTest {};
 
 TEST_F(QuicEpollClockTest, ApproximateNowInUsec) {
-  MockEpollServer epoll_server;
+  FakeEpollServer epoll_server;
   QuicEpollClock clock(&epoll_server);
 
   epoll_server.set_now_in_usec(1000000);
@@ -34,7 +34,7 @@
 }
 
 TEST_F(QuicEpollClockTest, NowInUsec) {
-  MockEpollServer epoll_server;
+  FakeEpollServer epoll_server;
   QuicEpollClock clock(&epoll_server);
 
   epoll_server.set_now_in_usec(1000000);
diff --git a/net/third_party/quic/quartc/quartc_factory.cc b/net/third_party/quic/quartc/quartc_factory.cc
index e5e0287e..edf48da 100644
--- a/net/third_party/quic/quartc/quartc_factory.cc
+++ b/net/third_party/quic/quartc/quartc_factory.cc
@@ -46,52 +46,30 @@
   // Enable time-based loss detection.
   copt.push_back(kTIME);
 
+  // Use BBR for congestion control.
   copt.push_back(kTBBR);
 
-  // Note: These settings have no effect for Exoblaze builds since
+  // Note: flag settings have no effect for Exoblaze builds since
   // SetQuicReloadableFlag() gets stubbed out.
-  SetQuicReloadableFlag(quic_bbr_less_probe_rtt, true);
-  SetQuicReloadableFlag(quic_unified_iw_options, true);
-  for (const auto option : quartc_session_config.bbr_options) {
-    switch (option) {
-      case (QuartcBbrOptions::kSlowerStartup):
-        copt.push_back(kBBRS);
-        break;
-      case (QuartcBbrOptions::kFullyDrainQueue):
-        copt.push_back(kBBR3);
-        break;
-      case (QuartcBbrOptions::kReduceProbeRtt):
-        copt.push_back(kBBR6);
-        break;
-      case (QuartcBbrOptions::kSkipProbeRtt):
-        copt.push_back(kBBR7);
-        break;
-      case (QuartcBbrOptions::kSkipProbeRttAggressively):
-        copt.push_back(kBBR8);
-        break;
-      case (QuartcBbrOptions::kFillUpLinkDuringProbing):
-        quic_connection->set_fill_up_link_during_probing(true);
-        break;
-      case (QuartcBbrOptions::kInitialWindow3):
-        copt.push_back(kIW03);
-        break;
-      case (QuartcBbrOptions::kInitialWindow10):
-        copt.push_back(kIW10);
-        break;
-      case (QuartcBbrOptions::kInitialWindow20):
-        copt.push_back(kIW20);
-        break;
-      case (QuartcBbrOptions::kInitialWindow50):
-        copt.push_back(kIW50);
-        break;
-      case (QuartcBbrOptions::kStartup1RTT):
-        copt.push_back(k1RTT);
-        break;
-      case (QuartcBbrOptions::kStartup2RTT):
-        copt.push_back(k2RTT);
-        break;
-    }
-  }
+  SetQuicReloadableFlag(quic_bbr_less_probe_rtt, true);   // Enable BBR6,7,8.
+  SetQuicReloadableFlag(quic_unified_iw_options, true);   // Enable IWXX opts.
+  SetQuicReloadableFlag(quic_bbr_slower_startup3, true);  // Enable BBQX opts.
+  copt.push_back(kBBR3);  // Stay in low-gain until in-flight < BDP.
+  copt.push_back(kBBR5);  // 40 RTT ack aggregation.
+  copt.push_back(kBBR6);  // Use a 0.75 * BDP cwnd during PROBE_RTT.
+  copt.push_back(kBBR8);  // Skip PROBE_RTT if app-limited.
+  copt.push_back(kBBQ1);  // 2.773 pacing gain in STARTUP.
+  copt.push_back(kBBQ2);  // 2.0 CWND gain in STARTUP.
+  copt.push_back(kBBQ4);  // 0.75 pacing gain in DRAIN.
+  copt.push_back(k1RTT);  // Exit STARTUP after 1 RTT with no gains.
+  copt.push_back(kIW10);  // 10-packet (14600 byte) initial cwnd.
+
+  // TODO(b/112192494):  Enable pipe-filling once it no longer starves Quartc.
+  // quic_connection->set_fill_up_link_during_probing(true);
+
+  // TODO(b/112192153):  Test and possible enable slower startup when pipe
+  // filling is ready to use.  Slower startup is kBBRS.
+
   QuicConfig quic_config;
 
   // Use the limits for the session & stream flow control. The default 16KB
diff --git a/net/third_party/quic/quartc/quartc_factory.h b/net/third_party/quic/quartc/quartc_factory.h
index 8db0340..e19109e 100644
--- a/net/third_party/quic/quartc/quartc_factory.h
+++ b/net/third_party/quic/quartc/quartc_factory.h
@@ -13,28 +13,6 @@
 
 namespace quic {
 
-// Options that control the BBR algorithm.
-enum class QuartcBbrOptions {
-  kSlowerStartup,    // Once a loss is encountered in STARTUP,
-                     // switches startup to a 1.5x pacing gain.
-  kFullyDrainQueue,  // Fully drains the queue once per cycle.
-  kReduceProbeRtt,   // Probe RTT reduces CWND to 0.75 * BDP instead of 4
-                     // packets.
-  kSkipProbeRtt,     // Skip Probe RTT and extend the existing min_rtt if a
-                     // recent min_rtt is within 12.5% of the current min_rtt.
-  kSkipProbeRttAggressively,  //  Skip ProbeRTT and extend the existing min_rtt
-                              //  as long as you've been app limited at least
-                              //  once.
-  kFillUpLinkDuringProbing,   // Sends probing retransmissions whenever we
-                              // become application limited.
-  kInitialWindow3,            // Use a 3-packet initial congestion window.
-  kInitialWindow10,           // Use a 10-packet initial congestion window.
-  kInitialWindow20,           // Use a 20-packet initial congestion window.
-  kInitialWindow50,           // Use a 50-packet initial congestion window.
-  kStartup1RTT,               // Stay in STARTUP for 1 RTT.
-  kStartup2RTT,               // Stay in STARTUP for 2 RTTs.
-};
-
 // The configuration for creating a QuartcFactory.
 struct QuartcFactoryConfig {
   // Factory for |QuicAlarm|s. Implemented by the Quartc user with different
@@ -62,9 +40,6 @@
   // The maximum size of the packet can be written with the packet writer.
   // 1200 bytes by default.
   QuicPacketLength max_packet_size = 1200;
-  // Options to control the BBR algorithm. In case the congestion control is
-  // set to anything but BBR, these options are ignored.
-  std::vector<QuartcBbrOptions> bbr_options;
   // Timeouts for the crypto handshake. Set them to higher values to
   // prevent closing the session before it started on a slow network.
   // Zero entries are ignored and QUIC defaults are used in that case.
diff --git a/net/third_party/quic/quartc/quartc_session.cc b/net/third_party/quic/quartc/quartc_session.cc
index f61da4e..602ea19 100644
--- a/net/third_party/quic/quartc/quartc_session.cc
+++ b/net/third_party/quic/quartc/quartc_session.cc
@@ -28,17 +28,15 @@
   ~DummyProofSource() override {}
 
   // ProofSource override.
-  void GetProof(const QuicSocketAddress& server_addr,
+  void GetProof(const QuicSocketAddress& server_address,
                 const QuicString& hostname,
                 const QuicString& server_config,
                 QuicTransportVersion transport_version,
                 QuicStringPiece chlo_hash,
                 std::unique_ptr<Callback> callback) override {
-    QuicReferenceCountedPointer<ProofSource::Chain> chain;
+    QuicReferenceCountedPointer<ProofSource::Chain> chain =
+        GetCertChain(server_address, hostname);
     QuicCryptoProof proof;
-    std::vector<QuicString> certs;
-    certs.push_back("Dummy cert");
-    chain = new ProofSource::Chain(certs);
     proof.signature = "Dummy signature";
     proof.leaf_cert_scts = "Dummy timestamp";
     callback->Run(true, chain, proof, nullptr /* details */);
@@ -47,7 +45,10 @@
   QuicReferenceCountedPointer<Chain> GetCertChain(
       const QuicSocketAddress& server_address,
       const QuicString& hostname) override {
-    return QuicReferenceCountedPointer<Chain>();
+    std::vector<QuicString> certs;
+    certs.push_back("Dummy cert");
+    return QuicReferenceCountedPointer<ProofSource::Chain>(
+        new ProofSource::Chain(certs));
   }
 
   void ComputeTlsSignature(
diff --git a/net/third_party/quic/quartc/quartc_session_test.cc b/net/third_party/quic/quartc/quartc_session_test.cc
index da48a90..f098b07 100644
--- a/net/third_party/quic/quartc/quartc_session_test.cc
+++ b/net/third_party/quic/quartc/quartc_session_test.cc
@@ -267,14 +267,19 @@
     received_data_[stream->id()] += QuicString(data, size);
   }
 
-  void OnClose(QuartcStream* stream) override {}
+  void OnClose(QuartcStream* stream) override {
+    errors_[stream->id()] = stream->stream_error();
+  }
 
   void OnBufferChanged(QuartcStream* stream) override {}
 
   std::map<QuicStreamId, QuicString> data() { return received_data_; }
 
+  QuicRstStreamErrorCode stream_error(QuicStreamId id) { return errors_[id]; }
+
  private:
   std::map<QuicStreamId, QuicString> received_data_;
+  std::map<QuicStreamId, QuicRstStreamErrorCode> errors_;
 };
 
 class QuartcSessionForTest : public QuartcSession,
@@ -548,6 +553,71 @@
   EXPECT_FALSE(server_peer_->session_delegate()->connected());
 }
 
+TEST_F(QuartcSessionTest, StreamRetransmissionEnabled) {
+  CreateClientAndServerSessions();
+  StartHandshake();
+  ASSERT_TRUE(client_peer_->IsCryptoHandshakeConfirmed());
+  ASSERT_TRUE(server_peer_->IsCryptoHandshakeConfirmed());
+
+  QuartcStream* stream = client_peer_->CreateOutgoingDynamicStream();
+  QuicStreamId stream_id = stream->id();
+  stream->SetDelegate(client_peer_->stream_delegate());
+  stream->set_cancel_on_loss(false);
+
+  client_transport_->set_packets_to_lose(1);
+
+  char kClientMessage[] = "Hello";
+  test::QuicTestMemSliceVector stream_data(
+      {std::make_pair(kClientMessage, strlen(kClientMessage))});
+  stream->WriteMemSlices(stream_data.span(), /*fin=*/false);
+  RunTasks();
+
+  // Stream data should make it despite packet loss.
+  ASSERT_TRUE(server_peer_->has_data());
+  EXPECT_EQ(server_peer_->data()[stream_id], kClientMessage);
+}
+
+TEST_F(QuartcSessionTest, StreamRetransmissionDisabled) {
+  CreateClientAndServerSessions();
+  StartHandshake();
+  ASSERT_TRUE(client_peer_->IsCryptoHandshakeConfirmed());
+  ASSERT_TRUE(server_peer_->IsCryptoHandshakeConfirmed());
+
+  QuartcStream* stream = client_peer_->CreateOutgoingDynamicStream();
+  QuicStreamId stream_id = stream->id();
+  stream->SetDelegate(client_peer_->stream_delegate());
+  stream->set_cancel_on_loss(true);
+
+  client_transport_->set_packets_to_lose(1);
+
+  char kMessage[] = "Hello";
+  test::QuicTestMemSliceVector stream_data(
+      {std::make_pair(kMessage, strlen(kMessage))});
+  stream->WriteMemSlices(stream_data.span(), /*fin=*/false);
+  alarm_factory_.Run(1);
+
+  // Send another packet to trigger loss detection.
+  QuartcStream* stream_1 = client_peer_->CreateOutgoingDynamicStream();
+  stream_1->SetDelegate(client_peer_->stream_delegate());
+
+  char kMessage1[] = "Second message";
+  test::QuicTestMemSliceVector stream_data_1(
+      {std::make_pair(kMessage1, strlen(kMessage1))});
+  stream_1->WriteMemSlices(stream_data_1.span(), /*fin=*/false);
+  RunTasks();
+
+  // QUIC should try to retransmit the first stream by loss detection.  Instead,
+  // it will cancel itself.
+  EXPECT_THAT(server_peer_->data()[stream_id], testing::IsEmpty());
+
+  EXPECT_TRUE(client_peer_->IsClosedStream(stream_id));
+  EXPECT_TRUE(server_peer_->IsClosedStream(stream_id));
+  EXPECT_EQ(client_peer_->stream_delegate()->stream_error(stream_id),
+            QUIC_STREAM_CANCELLED);
+  EXPECT_EQ(server_peer_->stream_delegate()->stream_error(stream_id),
+            QUIC_STREAM_CANCELLED);
+}
+
 }  // namespace
 
 }  // namespace quic
diff --git a/net/third_party/quic/quartc/quartc_stream.cc b/net/third_party/quic/quartc/quartc_stream.cc
index 6cbce4a..083ff24 100644
--- a/net/third_party/quic/quartc/quartc_stream.cc
+++ b/net/third_party/quic/quartc/quartc_stream.cc
@@ -50,6 +50,22 @@
   delegate_->OnBufferChanged(this);
 }
 
+void QuartcStream::OnCanWrite() {
+  if (cancel_on_loss_ && HasPendingRetransmission()) {
+    Reset(QUIC_STREAM_CANCELLED);
+    return;
+  }
+  QuicStream::OnCanWrite();
+}
+
+bool QuartcStream::cancel_on_loss() {
+  return cancel_on_loss_;
+}
+
+void QuartcStream::set_cancel_on_loss(bool cancel_on_loss) {
+  cancel_on_loss_ = cancel_on_loss;
+}
+
 void QuartcStream::FinishWriting() {
   WriteOrBufferData(QuicStringPiece(nullptr, 0), true, nullptr);
 }
diff --git a/net/third_party/quic/quartc/quartc_stream.h b/net/third_party/quic/quartc/quartc_stream.h
index 830d45f..2affa38 100644
--- a/net/third_party/quic/quartc/quartc_stream.h
+++ b/net/third_party/quic/quartc/quartc_stream.h
@@ -35,8 +35,16 @@
       const QuicReferenceCountedPointer<QuicAckListenerInterface>& ack_listener)
       override;
 
+  void OnCanWrite() override;
+
   // QuartcStream interface methods.
 
+  // Whether the stream should be cancelled instead of retransmitted on loss.
+  // If set to true, the stream will reset itself instead of retransmitting lost
+  // stream frames.  Defaults to false.
+  bool cancel_on_loss();
+  void set_cancel_on_loss(bool cancel_on_loss);
+
   // Marks this stream as finished writing.  Asynchronously sends a FIN and
   // closes the write-side.  It is not necessary to call FinishWriting() if the
   // last call to Write() sends a FIN.
@@ -72,6 +80,9 @@
 
  private:
   Delegate* delegate_ = nullptr;
+
+  // Whether the stream should cancel itself instead of retransmitting frames.
+  bool cancel_on_loss_ = false;
 };
 
 }  // namespace quic
diff --git a/net/third_party/quic/quartc/quartc_stream_test.cc b/net/third_party/quic/quartc/quartc_stream_test.cc
index 353990ec..d7a6acb8 100644
--- a/net/third_party/quic/quartc/quartc_stream_test.cc
+++ b/net/third_party/quic/quartc/quartc_stream_test.cc
@@ -51,8 +51,7 @@
     char* buf = new char[write_length];
     QuicDataWriter writer(write_length, buf, NETWORK_BYTE_ORDER);
     if (write_length > 0) {
-      stream->WriteStreamData(stream->stream_bytes_written(), write_length,
-                              &writer);
+      stream->WriteStreamData(offset, write_length, &writer);
     }
     write_buffer_->append(buf, write_length);
     delete[] buf;
@@ -353,6 +352,42 @@
   EXPECT_TRUE(mock_stream_delegate_->closed());
 }
 
+TEST_F(QuartcStreamTest, TestCancelOnLossDisabled) {
+  CreateReliableQuicStream();
+
+  // This should be the default state.
+  EXPECT_FALSE(stream_->cancel_on_loss());
+
+  char message[] = "Foo bar";
+  test::QuicTestMemSliceVector data({std::make_pair(message, 7)});
+  stream_->WriteMemSlices(data.span(), /*fin=*/false);
+
+  EXPECT_EQ("Foo bar", write_buffer_);
+
+  stream_->OnStreamFrameLost(0, 7, false);
+  stream_->OnCanWrite();
+
+  EXPECT_EQ("Foo barFoo bar", write_buffer_);
+  EXPECT_EQ(stream_->stream_error(), QUIC_STREAM_NO_ERROR);
+}
+
+TEST_F(QuartcStreamTest, TestCancelOnLossEnabled) {
+  CreateReliableQuicStream();
+  stream_->set_cancel_on_loss(true);
+
+  char message[] = "Foo bar";
+  test::QuicTestMemSliceVector data({std::make_pair(message, 7)});
+  stream_->WriteMemSlices(data.span(), /*fin=*/false);
+
+  EXPECT_EQ("Foo bar", write_buffer_);
+
+  stream_->OnStreamFrameLost(0, 7, false);
+  stream_->OnCanWrite();
+
+  EXPECT_EQ("Foo bar", write_buffer_);
+  EXPECT_EQ(stream_->stream_error(), QUIC_STREAM_CANCELLED);
+}
+
 }  // namespace
 
 }  // namespace quic
diff --git a/net/third_party/quic/test_tools/mock_epoll_server.cc b/net/third_party/quic/test_tools/fake_epoll_server.cc
similarity index 89%
rename from net/third_party/quic/test_tools/mock_epoll_server.cc
rename to net/third_party/quic/test_tools/fake_epoll_server.cc
index 2670f1a1..48eaef3 100644
--- a/net/third_party/quic/test_tools/mock_epoll_server.cc
+++ b/net/third_party/quic/test_tools/fake_epoll_server.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 "net/third_party/quic/test_tools/mock_epoll_server.h"
+#include "net/third_party/quic/test_tools/fake_epoll_server.h"
 
 namespace quic {
 namespace test {
@@ -15,11 +15,11 @@
   return now_in_usec_;
 }
 
-MockEpollServer::MockEpollServer() : until_in_usec_(-1) {}
+FakeEpollServer::FakeEpollServer() : until_in_usec_(-1) {}
 
-MockEpollServer::~MockEpollServer() = default;
+FakeEpollServer::~FakeEpollServer() = default;
 
-int MockEpollServer::epoll_wait_impl(int epfd,
+int FakeEpollServer::epoll_wait_impl(int epfd,
                                      struct epoll_event* events,
                                      int max_events,
                                      int timeout_in_ms) {
diff --git a/net/third_party/quic/test_tools/mock_epoll_server.h b/net/third_party/quic/test_tools/fake_epoll_server.h
similarity index 89%
rename from net/third_party/quic/test_tools/mock_epoll_server.h
rename to net/third_party/quic/test_tools/fake_epoll_server.h
index 26afef2..d3584ec5 100644
--- a/net/third_party/quic/test_tools/mock_epoll_server.h
+++ b/net/third_party/quic/test_tools/fake_epoll_server.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 NET_THIRD_PARTY_QUIC_TEST_TOOLS_MOCK_EPOLL_SERVER_H_
-#define NET_THIRD_PARTY_QUIC_TEST_TOOLS_MOCK_EPOLL_SERVER_H_
+#ifndef NET_THIRD_PARTY_QUIC_TEST_TOOLS_FAKE_EPOLL_SERVER_H_
+#define NET_THIRD_PARTY_QUIC_TEST_TOOLS_FAKE_EPOLL_SERVER_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -19,7 +19,7 @@
 namespace quic {
 namespace test {
 
-// Unlike the full MockEpollServer, this only lies about the time but lets
+// Unlike the full FakeEpollServer, this only lies about the time but lets
 // fd events operate normally.  Usefully when interacting with real backends
 // but wanting to skip forward in time to trigger timeouts.
 class FakeTimeEpollServer : public net::EpollServer {
@@ -53,12 +53,12 @@
   DISALLOW_COPY_AND_ASSIGN(FakeTimeEpollServer);
 };
 
-class MockEpollServer : public FakeTimeEpollServer {
+class FakeEpollServer : public FakeTimeEpollServer {
  public:  // type definitions
   using EventQueue = std::unordered_multimap<int64_t, struct epoll_event>;
 
-  MockEpollServer();
-  ~MockEpollServer() override;
+  FakeEpollServer();
+  ~FakeEpollServer() override;
 
   // time_in_usec is the time at which the event specified
   // by 'ee' will be delivered. Note that it -is- possible
@@ -106,10 +106,10 @@
   EventQueue event_queue_;
   int64_t until_in_usec_;
 
-  DISALLOW_COPY_AND_ASSIGN(MockEpollServer);
+  DISALLOW_COPY_AND_ASSIGN(FakeEpollServer);
 };
 
 }  // namespace test
 }  // namespace quic
 
-#endif  // NET_THIRD_PARTY_QUIC_TEST_TOOLS_MOCK_EPOLL_SERVER_H_
+#endif  // NET_THIRD_PARTY_QUIC_TEST_TOOLS_FAKE_EPOLL_SERVER_H_
diff --git a/net/third_party/quic/test_tools/mock_clock.cc b/net/third_party/quic/test_tools/mock_clock.cc
index d4ea43e9..04234ce 100644
--- a/net/third_party/quic/test_tools/mock_clock.cc
+++ b/net/third_party/quic/test_tools/mock_clock.cc
@@ -26,10 +26,4 @@
   return QuicWallTime::FromUNIXSeconds((now_ - QuicTime::Zero()).ToSeconds());
 }
 
-base::TimeTicks MockClock::NowInTicks() const {
-  base::TimeTicks ticks;
-  return ticks + base::TimeDelta::FromMicroseconds(
-                     (now_ - QuicTime::Zero()).ToMicroseconds());
-}
-
 }  // namespace quic
diff --git a/net/third_party/quic/test_tools/mock_clock.h b/net/third_party/quic/test_tools/mock_clock.h
index 8c94e9a..fbca9ec 100644
--- a/net/third_party/quic/test_tools/mock_clock.h
+++ b/net/third_party/quic/test_tools/mock_clock.h
@@ -5,10 +5,7 @@
 #ifndef NET_THIRD_PARTY_QUIC_TEST_TOOLS_MOCK_CLOCK_H_
 #define NET_THIRD_PARTY_QUIC_TEST_TOOLS_MOCK_CLOCK_H_
 
-#include "base/compiler_specific.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/time/time.h"
+#include "net/third_party/quic/core/quic_time.h"
 #include "net/third_party/quic/platform/api/quic_clock.h"
 
 namespace quic {
@@ -28,9 +25,6 @@
   // Advances the current time by |delta|, which may be negative.
   void AdvanceTime(QuicTime::Delta delta);
 
-  // Returns the current time in ticks.
-  base::TimeTicks NowInTicks() const;
-
  private:
   QuicTime now_;
 };
diff --git a/net/third_party/quic/test_tools/quic_test_utils.h b/net/third_party/quic/test_tools/quic_test_utils.h
index 231d60ba..9f5c5ae 100644
--- a/net/third_party/quic/test_tools/quic_test_utils.h
+++ b/net/third_party/quic/test_tools/quic_test_utils.h
@@ -844,7 +844,7 @@
   MOCK_CONST_METHOD0(GetDebugState, QuicString());
   MOCK_CONST_METHOD0(InSlowStart, bool());
   MOCK_CONST_METHOD0(InRecovery, bool());
-  MOCK_CONST_METHOD0(IsProbingForMoreBandwidth, bool());
+  MOCK_CONST_METHOD0(ShouldSendProbingPacket, bool());
   MOCK_CONST_METHOD0(GetSlowStartThreshold, QuicByteCount());
   MOCK_CONST_METHOD0(GetCongestionControlType, CongestionControlType());
   MOCK_METHOD2(AdjustNetworkParameters, void(QuicBandwidth, QuicTime::Delta));
diff --git a/net/third_party/quic/tools/quic_client_bin.cc b/net/third_party/quic/tools/quic_client_bin.cc
index bce07ee2..7e17273 100644
--- a/net/third_party/quic/tools/quic_client_bin.cc
+++ b/net/third_party/quic/tools/quic_client_bin.cc
@@ -43,7 +43,7 @@
 #include "base/at_exit.h"
 #include "base/command_line.h"
 #include "base/message_loop/message_loop.h"
-#include "base/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/net_errors.h"
 #include "net/base/privacy_mode.h"
 #include "net/cert/cert_verifier.h"
diff --git a/net/third_party/quic/tools/quic_server_bin.cc b/net/third_party/quic/tools/quic_server_bin.cc
index e322470..05231be 100644
--- a/net/third_party/quic/tools/quic_server_bin.cc
+++ b/net/third_party/quic/tools/quic_server_bin.cc
@@ -13,7 +13,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task_scheduler/task_scheduler.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/quic/crypto/proof_source_chromium.h"
 #include "net/third_party/quic/core/quic_packets.h"
 #include "net/third_party/quic/platform/api/quic_socket_address.h"
diff --git a/net/third_party/quic/tools/quic_tcp_like_trace_converter.cc b/net/third_party/quic/tools/quic_tcp_like_trace_converter.cc
new file mode 100644
index 0000000..5eb18241
--- /dev/null
+++ b/net/third_party/quic/tools/quic_tcp_like_trace_converter.cc
@@ -0,0 +1,107 @@
+#include "net/third_party/quic/tools/quic_tcp_like_trace_converter.h"
+
+#include "net/third_party/quic/core/quic_constants.h"
+
+namespace quic {
+
+QuicTcpLikeTraceConverter::QuicTcpLikeTraceConverter()
+    : largest_observed_control_frame_id_(kInvalidControlFrameId),
+      connection_offset_(0) {}
+
+QuicTcpLikeTraceConverter::StreamOffsetSegment::StreamOffsetSegment()
+    : connection_offset(0) {}
+
+QuicTcpLikeTraceConverter::StreamOffsetSegment::StreamOffsetSegment(
+    QuicStreamOffset stream_offset,
+    uint64_t connection_offset,
+    QuicByteCount data_length)
+    : stream_data(stream_offset, stream_offset + data_length),
+      connection_offset(connection_offset) {}
+
+QuicTcpLikeTraceConverter::StreamInfo::StreamInfo() : fin(false) {}
+
+QuicIntervalSet<uint64_t> QuicTcpLikeTraceConverter::OnStreamFrameSent(
+    QuicStreamId stream_id,
+    QuicStreamOffset offset,
+    QuicByteCount data_length,
+    bool fin) {
+  QuicIntervalSet<uint64_t> connection_offsets;
+  if (fin) {
+    // Stream fin consumes a connection offset.
+    ++data_length;
+  }
+  StreamInfo* stream_info =
+      &streams_info_.emplace(stream_id, StreamInfo()).first->second;
+  // Get connection offsets of retransmission data in this frame.
+  for (const auto& segment : stream_info->segments) {
+    QuicInterval<QuicStreamOffset> retransmission(offset, offset + data_length);
+    retransmission.IntersectWith(segment.stream_data);
+    if (retransmission.Empty()) {
+      continue;
+    }
+    const uint64_t connection_offset = segment.connection_offset +
+                                       retransmission.min() -
+                                       segment.stream_data.min();
+    connection_offsets.Add(connection_offset,
+                           connection_offset + retransmission.Length());
+  }
+
+  if (stream_info->fin) {
+    return connection_offsets;
+  }
+
+  // Get connection offsets of new data in this frame.
+  QuicStreamOffset least_unsent_offset =
+      stream_info->segments.empty()
+          ? 0
+          : stream_info->segments.back().stream_data.max();
+  if (least_unsent_offset >= offset + data_length) {
+    return connection_offsets;
+  }
+  // Ignore out-of-order stream data so that as connection offset increases,
+  // stream offset increases.
+  QuicStreamOffset new_data_offset = std::max(least_unsent_offset, offset);
+  QuicByteCount new_data_length = offset + data_length - new_data_offset;
+  connection_offsets.Add(connection_offset_,
+                         connection_offset_ + new_data_length);
+  if (!stream_info->segments.empty() &&
+      new_data_offset == least_unsent_offset &&
+      connection_offset_ ==
+          stream_info->segments.back().connection_offset +
+              stream_info->segments.back().stream_data.Length()) {
+    // Extend the last segment if both stream and connection offsets are
+    // contiguous.
+    stream_info->segments.back().stream_data.SetMax(new_data_offset +
+                                                    new_data_length);
+  } else {
+    stream_info->segments.emplace_back(new_data_offset, connection_offset_,
+                                       new_data_length);
+  }
+  stream_info->fin = fin;
+  connection_offset_ += new_data_length;
+
+  return connection_offsets;
+}
+
+QuicInterval<uint64_t> QuicTcpLikeTraceConverter::OnControlFrameSent(
+    QuicControlFrameId control_frame_id,
+    QuicByteCount control_frame_length) {
+  if (control_frame_id > largest_observed_control_frame_id_) {
+    // New control frame.
+    QuicInterval<uint64_t> connection_offset = QuicInterval<uint64_t>(
+        connection_offset_, connection_offset_ + control_frame_length);
+    connection_offset_ += control_frame_length;
+    control_frames_info_[control_frame_id] = QuicInterval<uint64_t>(
+        connection_offset_, connection_offset_ + control_frame_length);
+    largest_observed_control_frame_id_ = control_frame_id;
+    return connection_offset;
+  }
+  const auto iter = control_frames_info_.find(control_frame_id);
+  if (iter == control_frames_info_.end()) {
+    // Ignore out of order control frames.
+    return {};
+  }
+  return iter->second;
+}
+
+}  // namespace quic
diff --git a/net/third_party/quic/tools/quic_tcp_like_trace_converter.h b/net/third_party/quic/tools/quic_tcp_like_trace_converter.h
new file mode 100644
index 0000000..4e4d3b0
--- /dev/null
+++ b/net/third_party/quic/tools/quic_tcp_like_trace_converter.h
@@ -0,0 +1,68 @@
+#ifndef NET_THIRD_PARTY_QUIC_TOOLS_QUIC_TCP_LIKE_TRACE_CONVERTER_H_
+#define NET_THIRD_PARTY_QUIC_TOOLS_QUIC_TCP_LIKE_TRACE_CONVERTER_H_
+
+#include <vector>
+
+#include "net/third_party/quic/core/frames/quic_stream_frame.h"
+#include "net/third_party/quic/core/quic_types.h"
+#include "net/third_party/quic/platform/api/quic_containers.h"
+#include "net/third_party/quic/platform/api/quic_interval.h"
+
+namespace quic {
+
+// This converter converts sent QUIC frames to connection byte offset (just like
+// TCP byte sequence number).
+class QuicTcpLikeTraceConverter {
+ public:
+  // StreamOffsetSegment stores a stream offset range which has contiguous
+  // connection offset.
+  struct StreamOffsetSegment {
+    StreamOffsetSegment();
+    StreamOffsetSegment(QuicStreamOffset stream_offset,
+                        uint64_t connection_offset,
+                        QuicByteCount data_length);
+
+    QuicInterval<QuicStreamOffset> stream_data;
+    uint64_t connection_offset;
+  };
+
+  QuicTcpLikeTraceConverter();
+  QuicTcpLikeTraceConverter(const QuicTcpLikeTraceConverter& other) = delete;
+  QuicTcpLikeTraceConverter(QuicTcpLikeTraceConverter&& other) = delete;
+
+  ~QuicTcpLikeTraceConverter() {}
+
+  // Called when a stream frame is sent. Returns the corresponding connection
+  // offsets.
+  QuicIntervalSet<uint64_t> OnStreamFrameSent(QuicStreamId stream_id,
+                                              QuicStreamOffset offset,
+                                              QuicByteCount data_length,
+                                              bool fin);
+
+  // Called when a control frame is sent. Returns the corresponding connection
+  // offsets.
+  QuicInterval<uint64_t> OnControlFrameSent(QuicControlFrameId control_frame_id,
+                                            QuicByteCount control_frame_length);
+
+ private:
+  struct StreamInfo {
+    StreamInfo();
+
+    // Stores contiguous connection offset pieces.
+    std::vector<StreamOffsetSegment> segments;
+    // Indicates whether fin has been sent.
+    bool fin;
+  };
+
+  QuicUnorderedMap<QuicStreamId, StreamInfo> streams_info_;
+  QuicUnorderedMap<QuicControlFrameId, QuicInterval<uint64_t>>
+      control_frames_info_;
+
+  QuicControlFrameId largest_observed_control_frame_id_;
+
+  uint64_t connection_offset_;
+};
+
+}  // namespace quic
+
+#endif  // NET_THIRD_PARTY_QUIC_TOOLS_QUIC_TCP_LIKE_TRACE_CONVERTER_H_
diff --git a/net/third_party/quic/tools/quic_tcp_like_trace_converter_test.cc b/net/third_party/quic/tools/quic_tcp_like_trace_converter_test.cc
new file mode 100644
index 0000000..ad23c6d
--- /dev/null
+++ b/net/third_party/quic/tools/quic_tcp_like_trace_converter_test.cc
@@ -0,0 +1,99 @@
+#include "net/third_party/quic/tools/quic_tcp_like_trace_converter.h"
+
+#include "net/third_party/quic/platform/api/quic_test.h"
+
+namespace quic {
+namespace test {
+namespace {
+
+TEST(QuicTcpLikeTraceConverterTest, BasicTest) {
+  QuicTcpLikeTraceConverter converter;
+
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
+            converter.OnStreamFrameSent(1, 0, 100, false));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 200),
+            converter.OnStreamFrameSent(3, 0, 100, false));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(200, 300),
+            converter.OnStreamFrameSent(3, 100, 100, false));
+  EXPECT_EQ(QuicInterval<uint64_t>(300, 450),
+            converter.OnControlFrameSent(2, 150));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(450, 550),
+            converter.OnStreamFrameSent(1, 100, 100, false));
+  EXPECT_EQ(QuicInterval<uint64_t>(550, 650),
+            converter.OnControlFrameSent(3, 100));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(650, 850),
+            converter.OnStreamFrameSent(3, 200, 200, false));
+  EXPECT_EQ(QuicInterval<uint64_t>(850, 1050),
+            converter.OnControlFrameSent(4, 200));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(1050, 1100),
+            converter.OnStreamFrameSent(1, 200, 50, false));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(1100, 1150),
+            converter.OnStreamFrameSent(1, 250, 50, false));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(1150, 1350),
+            converter.OnStreamFrameSent(3, 400, 200, false));
+
+  // Stream 1 retransmits [50, 300) and sends new data [300, 350) in the same
+  // frame.
+  QuicIntervalSet<uint64_t> expected;
+  expected.Add(50, 100);
+  expected.Add(450, 550);
+  expected.Add(1050, 1150);
+  expected.Add(1350, 1401);
+  EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 50, 300, true));
+
+  expected.Clear();
+  // Stream 3 retransmits [150, 500).
+  expected.Add(250, 300);
+  expected.Add(650, 850);
+  expected.Add(1150, 1250);
+  EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 150, 350, false));
+
+  // Stream 3 retransmits [300, 600) and sends new data [600, 800) in the same
+  // frame.
+  expected.Clear();
+  expected.Add(750, 850);
+  expected.Add(1150, 1350);
+  expected.Add(1401, 1602);
+  EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 300, 500, true));
+
+  // Stream 3 retransmits fin only frame.
+  expected.Clear();
+  expected.Add(1601, 1602);
+  EXPECT_EQ(expected, converter.OnStreamFrameSent(3, 800, 0, true));
+
+  QuicInterval<uint64_t> expected2;
+  // Ignore out of order control frames.
+  EXPECT_EQ(expected2, converter.OnControlFrameSent(1, 100));
+
+  // Ignore passed in length for retransmitted frame.
+  expected2 = {450, 600};
+  EXPECT_EQ(expected2, converter.OnControlFrameSent(2, 200));
+
+  expected2 = {1602, 1702};
+  EXPECT_EQ(expected2, converter.OnControlFrameSent(10, 100));
+}
+
+TEST(QuicTcpLikeTraceConverterTest, FuzzerTest) {
+  QuicTcpLikeTraceConverter converter;
+  // Stream does not start from offset 0.
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(0, 100),
+            converter.OnStreamFrameSent(1, 100, 100, false));
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(100, 300),
+            converter.OnStreamFrameSent(3, 200, 200, false));
+  // Stream does not send data contiguously.
+  EXPECT_EQ(QuicIntervalSet<uint64_t>(300, 400),
+            converter.OnStreamFrameSent(1, 300, 100, false));
+
+  // Stream fills existing holes.
+  QuicIntervalSet<uint64_t> expected;
+  expected.Add(0, 100);
+  expected.Add(300, 501);
+  EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 0, 500, true));
+
+  // Stream sends frame after fin.
+  EXPECT_EQ(expected, converter.OnStreamFrameSent(1, 50, 600, false));
+}
+
+}  // namespace
+}  // namespace test
+}  // namespace quic
diff --git a/net/tools/cachetool/cachetool.cc b/net/tools/cachetool/cachetool.cc
index a034227..964f3609 100644
--- a/net/tools/cachetool/cachetool.cc
+++ b/net/tools/cachetool/cachetool.cc
@@ -18,7 +18,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/io_buffer.h"
 #include "net/base/test_completion_callback.h"
 #include "net/disk_cache/disk_cache.h"
diff --git a/net/tools/cert_verify_tool/cert_verify_tool.cc b/net/tools/cert_verify_tool/cert_verify_tool.cc
index cc8c1a3..14c39b02 100644
--- a/net/tools/cert_verify_tool/cert_verify_tool.cc
+++ b/net/tools/cert_verify_tool/cert_verify_tool.cc
@@ -11,7 +11,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/strings/string_split.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc b/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
index 2451beb..bef45c80 100644
--- a/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
+++ b/net/tools/disk_cache_memory_test/disk_cache_memory_test.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/cache_type.h"
 #include "net/base/completion_callback.h"
diff --git a/net/tools/quic/quic_simple_client_bin.cc b/net/tools/quic/quic_simple_client_bin.cc
index ee09f1d..956b612e 100644
--- a/net/tools/quic/quic_simple_client_bin.cc
+++ b/net/tools/quic/quic_simple_client_bin.cc
@@ -44,7 +44,7 @@
 #include "base/command_line.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/net_errors.h"
 #include "net/base/privacy_mode.h"
 #include "net/cert/cert_verifier.h"
diff --git a/net/tools/quic/quic_simple_server_bin.cc b/net/tools/quic/quic_simple_server_bin.cc
index 45c50a8..55f73865 100644
--- a/net/tools/quic/quic_simple_server_bin.cc
+++ b/net/tools/quic/quic_simple_server_bin.cc
@@ -13,7 +13,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "net/base/ip_address.h"
 #include "net/base/ip_endpoint.h"
 #include "net/quic/crypto/proof_source_chromium.h"
diff --git a/net/url_request/url_fetcher_impl_unittest.cc b/net/url_request/url_fetcher_impl_unittest.cc
index da9b4f6a..e3fb7b85 100644
--- a/net/url_request/url_fetcher_impl_unittest.cc
+++ b/net/url_request/url_fetcher_impl_unittest.cc
@@ -25,7 +25,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/platform_thread.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc
index 90681d7..4476d69e 100644
--- a/net/url_request/url_request_context_builder.cc
+++ b/net/url_request/url_request_context_builder.cc
@@ -13,7 +13,7 @@
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "net/base/cache_type.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_delegate_impl.h"
diff --git a/net/url_request/url_request_context_builder.h b/net/url_request/url_request_context_builder.h
index 93a5975..5ca5e94 100644
--- a/net/url_request/url_request_context_builder.h
+++ b/net/url_request/url_request_context_builder.h
@@ -27,7 +27,7 @@
 #include "base/files/file_path.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "build/buildflag.h"
 #include "net/base/net_export.h"
diff --git a/net/url_request/url_request_file_dir_job.cc b/net/url_request/url_request_file_dir_job.cc
index 0c74dcb..cb630a59 100644
--- a/net/url_request/url_request_file_dir_job.cc
+++ b/net/url_request/url_request_file_dir_job.cc
@@ -11,7 +11,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
diff --git a/net/url_request/url_request_job.cc b/net/url_request/url_request_job.cc
index 9bdff67..5b27df0e 100644
--- a/net/url_request/url_request_job.cc
+++ b/net/url_request/url_request_job.cc
@@ -474,10 +474,15 @@
       return;
     }
     if (source_stream_->type() == SourceStream::TYPE_NONE) {
-      std::string content_length;
-      request_->GetResponseHeaderByName("content-length", &content_length);
-      if (!content_length.empty())
-        base::StringToInt64(content_length, &expected_content_size_);
+      // If the subclass didn't set |expected_content_size|, and there are
+      // headers, and the response body is not compressed, try to get the
+      // expected content size from the headers.
+      if (expected_content_size_ == -1 && request_->response_headers()) {
+        // This sets |expected_content_size_| to its previous value of -1 if
+        // there's no Content-Length header.
+        expected_content_size_ =
+            request_->response_headers()->GetContentLength();
+      }
     } else {
       request_->net_log().AddEvent(
           NetLogEventType::URL_REQUEST_FILTERS_SET,
diff --git a/net/url_request/url_request_job_unittest.cc b/net/url_request/url_request_job_unittest.cc
index 1f0d45a..c5167618 100644
--- a/net/url_request/url_request_job_unittest.cc
+++ b/net/url_request/url_request_job_unittest.cc
@@ -97,7 +97,7 @@
   transaction->start_return_code = OK;
 }
 
-const MockTransaction kNoFilter_Transaction = {
+const MockTransaction kNoFilterTransaction = {
     "http://www.google.com/gzyp",
     "GET",
     base::Time(),
@@ -117,7 +117,27 @@
     OK,
 };
 
-const MockTransaction kGZip_Transaction = {
+const MockTransaction kNoFilterTransactionWithInvalidLength = {
+    "http://www.google.com/gzyp",
+    "GET",
+    base::Time(),
+    "",
+    LOAD_NORMAL,
+    "HTTP/1.1 200 OK",
+    "Cache-Control: max-age=10000\n"
+    "Content-Length: +30\n",  // Invalid
+    base::Time(),
+    "hello",
+    TEST_MODE_NORMAL,
+    nullptr,
+    nullptr,
+    0,
+    0,
+    OK,
+    OK,
+};
+
+const MockTransaction kGZipTransaction = {
     "http://www.google.com/gzyp",
     "GET",
     base::Time(),
@@ -139,7 +159,7 @@
     OK,
 };
 
-const MockTransaction kGzip_Slow_Transaction = {
+const MockTransaction kGzipSlowTransaction = {
     "http://www.google.com/gzyp",
     "GET",
     base::Time(),
@@ -160,7 +180,7 @@
     OK,
 };
 
-const MockTransaction kRedirect_Transaction = {
+const MockTransaction kRedirectTransaction = {
     "http://www.google.com/redirect",
     "GET",
     base::Time(),
@@ -182,7 +202,7 @@
     OK,
 };
 
-const MockTransaction kEmptyBodyGzip_Transaction = {
+const MockTransaction kEmptyBodyGzipTransaction = {
     "http://www.google.com/empty_body",
     "GET",
     base::Time(),
@@ -202,7 +222,7 @@
     OK,
 };
 
-const MockTransaction kInvalidContentGZip_Transaction = {
+const MockTransaction kInvalidContentGZipTransaction = {
     "http://www.google.com/gzyp",
     "GET",
     base::Time(),
@@ -223,7 +243,7 @@
     OK,
 };
 
-const MockTransaction kBrotli_Slow_Transaction = {
+const MockTransaction kBrotliSlowTransaction = {
     "http://www.google.com/brotli",
     "GET",
     base::Time(),
@@ -231,7 +251,8 @@
     LOAD_NORMAL,
     "HTTP/1.1 200 OK",
     "Cache-Control: max-age=10000\n"
-    "Content-Encoding: br\n",
+    "Content-Encoding: br\n"
+    "Content-Length: 230\n",  // Intentionally wrong.
     base::Time(),
     "",
     TEST_MODE_SLOW_READ,
@@ -255,9 +276,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kNoFilter_Transaction.url), DEFAULT_PRIORITY,
+      context.CreateRequest(GURL(kNoFilterTransaction.url), DEFAULT_PRIORITY,
                             &d, TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kNoFilter_Transaction);
+  AddMockTransaction(&kNoFilterTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -268,8 +289,37 @@
   EXPECT_EQ(200, req->GetResponseCode());
   EXPECT_EQ("hello", d.data_received());
   EXPECT_TRUE(network_layer.done_reading_called());
+  // When there's no filter and a Content-Length, expected content size should
+  // be available.
+  EXPECT_EQ(30, req->GetExpectedContentSize());
 
-  RemoveMockTransaction(&kNoFilter_Transaction);
+  RemoveMockTransaction(&kNoFilterTransaction);
+}
+
+TEST_F(URLRequestJobTest, TransactionNoFilterWithInvalidLength) {
+  MockNetworkLayer network_layer;
+  TestURLRequestContext context;
+  context.set_http_transaction_factory(&network_layer);
+
+  TestDelegate d;
+  std::unique_ptr<URLRequest> req(context.CreateRequest(
+      GURL(kNoFilterTransactionWithInvalidLength.url), DEFAULT_PRIORITY, &d,
+      TRAFFIC_ANNOTATION_FOR_TESTS));
+  AddMockTransaction(&kNoFilterTransactionWithInvalidLength);
+
+  req->set_method("GET");
+  req->Start();
+
+  d.RunUntilComplete();
+
+  EXPECT_FALSE(d.request_failed());
+  EXPECT_EQ(200, req->GetResponseCode());
+  EXPECT_EQ("hello", d.data_received());
+  EXPECT_TRUE(network_layer.done_reading_called());
+  // Invalid Content-Lengths that start with a + should not be reported.
+  EXPECT_EQ(-1, req->GetExpectedContentSize());
+
+  RemoveMockTransaction(&kNoFilterTransactionWithInvalidLength);
 }
 
 TEST_F(URLRequestJobTest, TransactionNotifiedWhenDone) {
@@ -279,9 +329,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d,
+      context.CreateRequest(GURL(kGZipTransaction.url), DEFAULT_PRIORITY, &d,
                             TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kGZip_Transaction);
+  AddMockTransaction(&kGZipTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -293,8 +343,11 @@
   EXPECT_EQ(200, req->GetResponseCode());
   EXPECT_EQ("", d.data_received());
   EXPECT_TRUE(network_layer.done_reading_called());
+  // When there's a filter and a Content-Length, expected content size should
+  // not be available.
+  EXPECT_EQ(-1, req->GetExpectedContentSize());
 
-  RemoveMockTransaction(&kGZip_Transaction);
+  RemoveMockTransaction(&kGZipTransaction);
 }
 
 TEST_F(URLRequestJobTest, SyncTransactionNotifiedWhenDone) {
@@ -304,9 +357,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d,
+      context.CreateRequest(GURL(kGZipTransaction.url), DEFAULT_PRIORITY, &d,
                             TRAFFIC_ANNOTATION_FOR_TESTS));
-  MockTransaction transaction(kGZip_Transaction);
+  MockTransaction transaction(kGZipTransaction);
   transaction.test_mode = TEST_MODE_SYNC_ALL;
   AddMockTransaction(&transaction);
 
@@ -320,6 +373,9 @@
   EXPECT_EQ(200, req->GetResponseCode());
   EXPECT_EQ("", d.data_received());
   EXPECT_TRUE(network_layer.done_reading_called());
+  // When there's a filter and a Content-Length, expected content size should
+  // not be available.
+  EXPECT_EQ(-1, req->GetExpectedContentSize());
 
   RemoveMockTransaction(&transaction);
 }
@@ -332,9 +388,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d,
+      context.CreateRequest(GURL(kGZipTransaction.url), DEFAULT_PRIORITY, &d,
                             TRAFFIC_ANNOTATION_FOR_TESTS));
-  MockTransaction transaction(kGZip_Transaction);
+  MockTransaction transaction(kGZipTransaction);
   transaction.test_mode = TEST_MODE_SYNC_ALL | TEST_MODE_SLOW_READ;
   transaction.handler = &BigGZipServer;
   AddMockTransaction(&transaction);
@@ -349,6 +405,7 @@
   EXPECT_EQ(200, req->GetResponseCode());
   EXPECT_EQ("", d.data_received());
   EXPECT_TRUE(network_layer.done_reading_called());
+  EXPECT_EQ(-1, req->GetExpectedContentSize());
 
   RemoveMockTransaction(&transaction);
 }
@@ -360,9 +417,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kRedirect_Transaction.url), DEFAULT_PRIORITY,
+      context.CreateRequest(GURL(kRedirectTransaction.url), DEFAULT_PRIORITY,
                             &d, TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kRedirect_Transaction);
+  AddMockTransaction(&kRedirectTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -371,7 +428,7 @@
 
   EXPECT_TRUE(network_layer.done_reading_called());
 
-  RemoveMockTransaction(&kRedirect_Transaction);
+  RemoveMockTransaction(&kRedirectTransaction);
 }
 
 TEST_F(URLRequestJobTest, RedirectTransactionWithReferrerPolicyHeader) {
@@ -456,9 +513,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kGZip_Transaction.url), DEFAULT_PRIORITY, &d,
+      context.CreateRequest(GURL(kGZipTransaction.url), DEFAULT_PRIORITY, &d,
                             TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kGZip_Transaction);
+  AddMockTransaction(&kGZipTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -467,7 +524,7 @@
 
   EXPECT_TRUE(network_layer.stop_caching_called());
 
-  RemoveMockTransaction(&kGZip_Transaction);
+  RemoveMockTransaction(&kGZipTransaction);
 }
 
 // Makes sure that ReadRawDataComplete correctly updates request status before
@@ -480,9 +537,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(context.CreateRequest(
-      GURL(kEmptyBodyGzip_Transaction.url), DEFAULT_PRIORITY, &d,
+      GURL(kEmptyBodyGzipTransaction.url), DEFAULT_PRIORITY, &d,
       TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kEmptyBodyGzip_Transaction);
+  AddMockTransaction(&kEmptyBodyGzipTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -494,7 +551,7 @@
   EXPECT_TRUE(d.data_received().empty());
   EXPECT_TRUE(network_layer.done_reading_called());
 
-  RemoveMockTransaction(&kEmptyBodyGzip_Transaction);
+  RemoveMockTransaction(&kEmptyBodyGzipTransaction);
 }
 
 // Regression test for crbug.com/575213.
@@ -505,9 +562,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(context.CreateRequest(
-      GURL(kInvalidContentGZip_Transaction.url), DEFAULT_PRIORITY, &d,
+      GURL(kInvalidContentGZipTransaction.url), DEFAULT_PRIORITY, &d,
       TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kInvalidContentGZip_Transaction);
+  AddMockTransaction(&kInvalidContentGZipTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -523,7 +580,7 @@
   EXPECT_TRUE(d.data_received().empty());
   EXPECT_FALSE(network_layer.done_reading_called());
 
-  RemoveMockTransaction(&kInvalidContentGZip_Transaction);
+  RemoveMockTransaction(&kInvalidContentGZipTransaction);
 }
 
 // Regression test for crbug.com/553300.
@@ -534,9 +591,9 @@
 
   TestDelegate d;
   std::unique_ptr<URLRequest> req(
-      context.CreateRequest(GURL(kGzip_Slow_Transaction.url), DEFAULT_PRIORITY,
+      context.CreateRequest(GURL(kGzipSlowTransaction.url), DEFAULT_PRIORITY,
                             &d, TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kGzip_Slow_Transaction);
+  AddMockTransaction(&kGzipSlowTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -548,7 +605,7 @@
   EXPECT_EQ("hello\n", d.data_received());
   EXPECT_TRUE(network_layer.done_reading_called());
 
-  RemoveMockTransaction(&kGzip_Slow_Transaction);
+  RemoveMockTransaction(&kGzipSlowTransaction);
 }
 
 TEST_F(URLRequestJobTest, SlowBrotliRead) {
@@ -557,10 +614,10 @@
   context.set_http_transaction_factory(&network_layer);
 
   TestDelegate d;
-  std::unique_ptr<URLRequest> req(context.CreateRequest(
-      GURL(kBrotli_Slow_Transaction.url), DEFAULT_PRIORITY, &d,
-      TRAFFIC_ANNOTATION_FOR_TESTS));
-  AddMockTransaction(&kBrotli_Slow_Transaction);
+  std::unique_ptr<URLRequest> req(
+      context.CreateRequest(GURL(kBrotliSlowTransaction.url), DEFAULT_PRIORITY,
+                            &d, TRAFFIC_ANNOTATION_FOR_TESTS));
+  AddMockTransaction(&kBrotliSlowTransaction);
 
   req->set_method("GET");
   req->Start();
@@ -571,8 +628,11 @@
   EXPECT_EQ(200, req->GetResponseCode());
   EXPECT_EQ(kHelloData, d.data_received());
   EXPECT_TRUE(network_layer.done_reading_called());
+  // When there's a filter and a Content-Length, expected content size should
+  // not be available.
+  EXPECT_EQ(-1, req->GetExpectedContentSize());
 
-  RemoveMockTransaction(&kBrotli_Slow_Transaction);
+  RemoveMockTransaction(&kBrotliSlowTransaction);
 }
 
 }  // namespace net
diff --git a/net/url_request/url_request_simple_job.cc b/net/url_request/url_request_simple_job.cc
index afad37bc..77acb7d 100644
--- a/net/url_request/url_request_simple_job.cc
+++ b/net/url_request/url_request_simple_job.cc
@@ -12,7 +12,7 @@
 #include "base/location.h"
 #include "base/memory/ref_counted_memory.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
diff --git a/ppapi/api/ppb_websocket.idl b/ppapi/api/ppb_websocket.idl
index d006d28..3324e50 100644
--- a/ppapi/api/ppb_websocket.idl
+++ b/ppapi/api/ppb_websocket.idl
@@ -177,6 +177,8 @@
 /** 
  * The <code>PPB_WebSocket</code> interface provides bi-directional,
  * full-duplex, communications over a single TCP socket.
+ *
+ * This interface is deprecated and scheduled to be removed in mid-2019.
  */
 interface PPB_WebSocket {
   /**
diff --git a/ppapi/c/ppb_websocket.h b/ppapi/c/ppb_websocket.h
index 7f02a265..db9c4d5 100644
--- a/ppapi/c/ppb_websocket.h
+++ b/ppapi/c/ppb_websocket.h
@@ -3,7 +3,7 @@
  * found in the LICENSE file.
  */
 
-/* From ppb_websocket.idl modified Thu May 31 15:47:38 2012. */
+/* From ppb_websocket.idl modified Fri Aug  3 14:53:49 2018. */
 
 #ifndef PPAPI_C_PPB_WEBSOCKET_H_
 #define PPAPI_C_PPB_WEBSOCKET_H_
@@ -178,6 +178,8 @@
 /**
  * The <code>PPB_WebSocket</code> interface provides bi-directional,
  * full-duplex, communications over a single TCP socket.
+ *
+ * This interface is deprecated and scheduled to be removed in mid-2019.
  */
 struct PPB_WebSocket_1_0 {
   /**
diff --git a/ppapi/cpp/websocket.h b/ppapi/cpp/websocket.h
index c1c78b0..b85387e 100644
--- a/ppapi/cpp/websocket.h
+++ b/ppapi/cpp/websocket.h
@@ -27,6 +27,7 @@
 
 /// The <code>WebSocket</code> class providing bi-directional,
 /// full-duplex, communications over a single TCP socket.
+/// This class is deprecated and will be removed in mid 2019.
 class WebSocket : public Resource {
  public:
   /// Constructs a WebSocket object.
diff --git a/ppapi/utility/websocket/websocket_api.h b/ppapi/utility/websocket/websocket_api.h
index 3fd62ea..a3f9d7a 100644
--- a/ppapi/utility/websocket/websocket_api.h
+++ b/ppapi/utility/websocket/websocket_api.h
@@ -17,7 +17,8 @@
 class Instance;
 class Var;
 
-/// The <code>WebSocketAPI</code> class
+/// The <code>WebSocketAPI</code> class.
+/// This class is deprecated and will be removed in mid-2019.
 class WebSocketAPI {
  public:
   /// Constructs a WebSocketAPI object.
diff --git a/printing/printed_document.cc b/printing/printed_document.cc
index ad3c48a..d3f1b8a 100644
--- a/printing/printed_document.cc
+++ b/printing/printed_document.cc
@@ -22,7 +22,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/time/time.h"
 #include "base/values.h"
diff --git a/remoting/client/chromoting_client_runtime.cc b/remoting/client/chromoting_client_runtime.cc
index 8c6a1c8..e0d6a59 100644
--- a/remoting/client/chromoting_client_runtime.cc
+++ b/remoting/client/chromoting_client_runtime.cc
@@ -10,7 +10,7 @@
 #include "base/memory/singleton.h"
 #include "base/message_loop/message_loop.h"
 #include "base/message_loop/message_loop_current.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "remoting/base/chromium_url_request.h"
 #include "remoting/base/telemetry_log_writer.h"
diff --git a/remoting/client/jni/jni_runtime_delegate.cc b/remoting/client/jni/jni_runtime_delegate.cc
index 081d921..20ce7f389d 100644
--- a/remoting/client/jni/jni_runtime_delegate.cc
+++ b/remoting/client/jni/jni_runtime_delegate.cc
@@ -14,7 +14,7 @@
 #include "base/memory/singleton.h"
 #include "base/stl_util.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "jni/JniInterface_jni.h"
 #include "remoting/base/chromium_url_request.h"
 #include "remoting/base/url_request_context_getter.h"
diff --git a/remoting/host/file_proxy_wrapper_linux.cc b/remoting/host/file_proxy_wrapper_linux.cc
index 50c22fc3..8ab58a2a 100644
--- a/remoting/host/file_proxy_wrapper_linux.cc
+++ b/remoting/host/file_proxy_wrapper_linux.cc
@@ -14,7 +14,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_checker.h"
 #include "remoting/base/compound_buffer.h"
diff --git a/remoting/host/it2me/it2me_native_messaging_host_main.cc b/remoting/host/it2me/it2me_native_messaging_host_main.cc
index 776c41f1..b50eb87 100644
--- a/remoting/host/it2me/it2me_native_messaging_host_main.cc
+++ b/remoting/host/it2me/it2me_native_messaging_host_main.cc
@@ -11,7 +11,7 @@
 #include "base/i18n/icu_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "remoting/base/auto_thread_task_runner.h"
 #include "remoting/base/breakpad.h"
diff --git a/remoting/host/remoting_me2me_host.cc b/remoting/host/remoting_me2me_host.cc
index aa0478051..287f3a1 100644
--- a/remoting/host/remoting_me2me_host.cc
+++ b/remoting/host/remoting_me2me_host.cc
@@ -26,7 +26,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/stringize_macros.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "components/policy/policy_constants.h"
 #include "ipc/ipc_channel.h"
diff --git a/remoting/host/setup/me2me_native_messaging_host_main.cc b/remoting/host/setup/me2me_native_messaging_host_main.cc
index 04d23fd..fef7902 100644
--- a/remoting/host/setup/me2me_native_messaging_host_main.cc
+++ b/remoting/host/setup/me2me_native_messaging_host_main.cc
@@ -16,7 +16,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "net/url_request/url_fetcher.h"
diff --git a/remoting/host/setup/start_host_main.cc b/remoting/host/setup/start_host_main.cc
index 24dad1e..5190b4d 100644
--- a/remoting/host/setup/start_host_main.cc
+++ b/remoting/host/setup/start_host_main.cc
@@ -13,7 +13,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "net/url_request/url_fetcher.h"
diff --git a/remoting/ios/facade/host_list_service.h b/remoting/ios/facade/host_list_service.h
index 2f22cad..2df3914 100644
--- a/remoting/ios/facade/host_list_service.h
+++ b/remoting/ios/facade/host_list_service.h
@@ -108,7 +108,7 @@
   std::unique_ptr<HostListFetcher> host_list_fetcher_;
 
   std::vector<remoting::HostInfo> hosts_;
-  State state_;
+  State state_ = State::NOT_FETCHED;
   std::unique_ptr<FetchFailureInfo> last_fetch_failure_;
 
   base::WeakPtrFactory<HostListService> weak_factory_;
diff --git a/remoting/protocol/webrtc_video_renderer_adapter.cc b/remoting/protocol/webrtc_video_renderer_adapter.cc
index 9555af1c..50f1fbd 100644
--- a/remoting/protocol/webrtc_video_renderer_adapter.cc
+++ b/remoting/protocol/webrtc_video_renderer_adapter.cc
@@ -13,7 +13,7 @@
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "remoting/protocol/client_video_stats_dispatcher.h"
 #include "remoting/protocol/frame_consumer.h"
diff --git a/remoting/resources/remoting_strings_am.xtb b/remoting/resources/remoting_strings_am.xtb
index c6848369fc..31ea767 100644
--- a/remoting/resources/remoting_strings_am.xtb
+++ b/remoting/resources/remoting_strings_am.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">የርቀት ኮምፒውተሩ ክፍለጊዜውን ለመጀመር ተስኖታል። ችግሩ ከቀጠለ እባክዎን አስተናጋጁን በድጋሚ ለማዋቀር ይሞክሩ።</translation>
 <translation id="4068946408131579958">ሁሉም ግንኙነቶች</translation>
 <translation id="409800995205263688">ማሳሰቢያ፦ የመምሪያ ቅንብሮች በአውታረ መረብዎ ውስጥ ባሉ ኮምፒውተሮች የሚኖሩ ግንኙነቶችን ብቻ ነው የሚፈቅዱት።</translation>
+<translation id="4126409073460786861">ማዋቀር ከተጠናቀቀ በኋላ ይህን ገጽ ያድሱት፣ ከዚያ መሣሪያዎን በመምረጥ እና ፒኑን በማስገባት ኮምፒውተሩን መድረስ ይችላሉ</translation>
 <translation id="4145029455188493639">እንደ <ph name="EMAIL_ADDRESS" /> ሆነው ገብተዋል።</translation>
 <translation id="4155497795971509630">አንዳንድ የሚያስፈልጉ ክፍሎች ይጎድላሉ። እባክዎ የሶፍትዌሩ የቅርብ ጊዜውን ስሪት መጫንዎን ያረጋግጡና እንደገና ይሞክሩ።</translation>
 <translation id="4156740505453712750">ይህንን ኮምፒውተር በተጠበቀ መዳረሻ ለመድረስ እባክዎ <ph name="BOLD_START" />ቢያንስ ስድስት አኃዞች<ph name="BOLD_END" /> የሆነ ፒን ይምረጡ። ይሄ ፒን ከሌላ ቦታ ሆኖ ሲገናኙ ያስፈልጋል።</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">ለ</translation>
 <translation id="7019153418965365059">ያልታወቀ የአስተናጋጅ ስህተት፦ <ph name="HOST_OFFLINE_REASON" />።</translation>
 <translation id="701976023053394610">የርቀት እርዳታ</translation>
+<translation id="7026930240735156896">ኮምፒውተርዎን ለርቀት መዳረሻ ለማዋቀር መመሪያዎቹን ይከተሉ</translation>
 <translation id="7038683108611689168">የአጠቃቀም ስታትስቲክስ እና የብልሽት ሪፖርቶችን እንድንሰበስብ በመፍቀድ Chromoting እንድናሻሽል ያግዙን።</translation>
 <translation id="7067321367069083429">ማያ ገጽ እንደ ማያንካ ይሆናል</translation>
 <translation id="7116737094673640201">እንኳን ወደ Chrome የርቀት ዴስክቶፕ በደህና መጡ</translation>
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index c9d46cd..0797a1e 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">قد فشل الكمبيوتر البعيد في تهيئة الجلسة. وإذا استمرت المشكلة، يُرجى محاولة تهيئة المضيف مرة أخرى.</translation>
 <translation id="4068946408131579958">جميع الاتصالات</translation>
 <translation id="409800995205263688">ملاحظة: لا تسمح إعدادات السياسة سوى بالاتصال بين أجهزة الكمبيوتر داخل شبكتك.</translation>
+<translation id="4126409073460786861">بعد اكتمال الإعداد، يمكنك إعادة تحميل هذه الصفحة وستتمكّن بعد ذلك من الوصول إلى جهاز الكمبيوتر من خلال اختيار جهازك وإدخال رقم التعريف الشخصي</translation>
 <translation id="4145029455188493639">تم تسجيل الدخول باسم <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">بعض المكونات المطلوبة مفقودة. يُرجى التأكد من تثبيت أحدث إصدار من البرنامج وإعادة المحاولة.</translation>
 <translation id="4156740505453712750">لحماية الدخول إلى جهاز الكمبيوتر هذا، يرجى اختيار رقم تعريف شخصي مكون من <ph name="BOLD_START" />ستة أرقام على الأقل<ph name="BOLD_END" />. وستتم المطالبة برقم التعريف الشخصي هذا عند الاتصال من موقع آخر.</translation>
@@ -271,6 +272,7 @@
 <translation id="6998989275928107238">إلى</translation>
 <translation id="7019153418965365059">خطأ بالمضيف غير معروف: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">المساعدة عن بُعد</translation>
+<translation id="7026930240735156896">اتّباع التعليمات لإعداد جهاز الكمبيوتر لإتاحة الوصول عن بُعد</translation>
 <translation id="7038683108611689168">‏ساعدنا في تحسين تطبيق التوافق مع نظام التشغيل Chrome من خلال السماح لنا بتجميع إحصاءات الاستخدام وتقارير الأعطال.</translation>
 <translation id="7067321367069083429">تعمل الشاشة كشاشة باللمس</translation>
 <translation id="7116737094673640201">‏مرحبًا بك في سطح المكتب البعيد من Chrome</translation>
diff --git a/remoting/resources/remoting_strings_bg.xtb b/remoting/resources/remoting_strings_bg.xtb
index 91af5d0..c6e3cfa8 100644
--- a/remoting/resources/remoting_strings_bg.xtb
+++ b/remoting/resources/remoting_strings_bg.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Отдалеченият компютър не успя да подготви сесията за работа. Ако проблемът продължи, моля, опитайте да конфигурирате хоста отново.</translation>
 <translation id="4068946408131579958">Всички връзки</translation>
 <translation id="409800995205263688">ЗАБЕЛЕЖКА: Настройките за правила разрешават връзки само между компютри в мрежата ви.</translation>
+<translation id="4126409073460786861">След като настройването завърши, опреснете тази страница. Тогава ще имате достъп до компютъра, като изберете устройството си и въведете ПИН кода.</translation>
 <translation id="4145029455188493639">Влязохте като <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Липсват някои задължителни компоненти. Моля, уверете се, че сте инсталирали най-новата версия на софтуера, и опитайте отново.</translation>
 <translation id="4156740505453712750">За да защитите достъпа до този компютър, моля, изберете ПИН код <ph name="BOLD_START" />поне с шест цифри<ph name="BOLD_END" />. Той ще се изисква при свързване от друго местоположение.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">До</translation>
 <translation id="7019153418965365059">Неразпозната грешка в хоста: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Отдалечено съдействие</translation>
+<translation id="7026930240735156896">Изпълнете инструкциите, за да настроите компютъра си за отдалечен достъп.</translation>
 <translation id="7038683108611689168">Помогнете ни да подобрим Chromoting, като ни разрешите да събираме статистически данни за употребата и сигнали за сривове.</translation>
 <translation id="7067321367069083429">Екранът работи като сензорен</translation>
 <translation id="7116737094673640201">Добре дошли в Отдалечен работен плот на Chrome</translation>
diff --git a/remoting/resources/remoting_strings_ca.xtb b/remoting/resources/remoting_strings_ca.xtb
index 2d45f10c..63d95a07 100644
--- a/remoting/resources/remoting_strings_ca.xtb
+++ b/remoting/resources/remoting_strings_ca.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">L'ordinador remot no ha pogut inicialitzar la sessió. Si el problema continua, torneu a configurar l'amfitrió.</translation>
 <translation id="4068946408131579958">Totes les connexions</translation>
 <translation id="409800995205263688">NOTA: La configuració de la política només permet connexions entre ordinadors de la vostra xarxa.</translation>
+<translation id="4126409073460786861">Un cop finalitzada la configuració, actualitza aquesta pàgina i podràs accedir a l'ordinador triant el dispositiu i introduint-hi el PIN</translation>
 <translation id="4145029455188493639">Has iniciat la sessió com a <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Falten alguns components necessaris. Assegureu-vos que hàgiu instal·lat la versió més recent del programari i torneu-ho a provar.</translation>
 <translation id="4156740505453712750">Per protegir l'accés a aquest ordinador, trieu un PIN de <ph name="BOLD_START" />sis dígits com a mínim<ph name="BOLD_END" />. Necessitareu aquest PIN per connectar-vos a aquest ordinador des d'una altra ubicació.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Per a</translation>
 <translation id="7019153418965365059">Error d'amfitrió no reconegut: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Assistència remota</translation>
+<translation id="7026930240735156896">Segueix les instruccions per configurar l'accés remot a l'ordinador</translation>
 <translation id="7038683108611689168">Ajudeu-nos a millorar Chromoting: permeteu-nos recollir estadístiques d'ús i informes d'error.</translation>
 <translation id="7067321367069083429">La pantalla fa de pantalla tàctil</translation>
 <translation id="7116737094673640201">Et donem la benvinguda a Escriptori remot de Chrome</translation>
diff --git a/remoting/resources/remoting_strings_da.xtb b/remoting/resources/remoting_strings_da.xtb
index c4b5cee1..872a380e 100644
--- a/remoting/resources/remoting_strings_da.xtb
+++ b/remoting/resources/remoting_strings_da.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Fjerncomputeren har ikke startet sessionen. Hvis problemet fortsætter, kan du prøve at konfigurere hosten igen.</translation>
 <translation id="4068946408131579958">Alle forbindelser</translation>
 <translation id="409800995205263688">BEMÆRK! Politikindstillingerne tillader kun forbindelser mellem computere inden for dit netværk.</translation>
+<translation id="4126409073460786861">Opdater denne side, når konfigurationen er fuldført. Du kan derefter få adgang til computeren ved at vælge din enhed og angive pinkoden.</translation>
 <translation id="4145029455188493639">Du er logget ind som <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Nogle obligatoriske komponenter mangler. Kontrollér, at du har installeret den nyeste version af softwaren, og prøv igen.</translation>
 <translation id="4156740505453712750">Beskyt adgangen til denne computer ved at vælge en pinkode på <ph name="BOLD_START" />mindst seks cifre<ph name="BOLD_END" />. Denne pinkode skal indtastes, når du opretter forbindelse fra et andet sted.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Til</translation>
 <translation id="7019153418965365059">Fejl – hosten genkendes ikke: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Fjernsupport</translation>
+<translation id="7026930240735156896">Følg vejledningen for at konfigurere din computer til fjernadgang</translation>
 <translation id="7038683108611689168">Hjælp os med at forbedre Chromoting ved at lade os indsamle brugsstatistikker og rapporter om nedbrud.</translation>
 <translation id="7067321367069083429">Skærmen fungerer som touchskærm</translation>
 <translation id="7116737094673640201">Velkommen til Chrome Fjernskrivebord</translation>
diff --git a/remoting/resources/remoting_strings_de.xtb b/remoting/resources/remoting_strings_de.xtb
index 575a66a..400ab038 100644
--- a/remoting/resources/remoting_strings_de.xtb
+++ b/remoting/resources/remoting_strings_de.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Der Remote-Computer konnte die Sitzung nicht initialisieren. Sollte das Problem weiter bestehen, versuchen Sie bitte, den Host nochmals zu konfigurieren.</translation>
 <translation id="4068946408131579958">Alle Verbindungen</translation>
 <translation id="409800995205263688">Hinweis: Die Richtlinieneinstellungen erlauben nur Verbindungen zwischen Computern in Ihrem Netzwerk.</translation>
+<translation id="4126409073460786861">Aktualisieren Sie diese Seite nach der Einrichtung. Anschließend können Sie auf den Computer zugreifen, indem Sie das Gerät auswählen und die PIN eingeben.</translation>
 <translation id="4145029455188493639">Angemeldet als <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Es fehlen einige erforderliche Komponenten. Überprüfen Sie, ob Sie die neueste Version der Software installiert haben, und versuchen Sie es erneut.</translation>
 <translation id="4156740505453712750">Um den Zugriff auf diesen Computer zu schützen, wählen Sie eine PIN mit <ph name="BOLD_START" />mindestens 6 Ziffern<ph name="BOLD_END" /> aus. Die Eingabe dieser PIN ist erforderlich, wenn eine Verbindung von einem anderen Ort aus hergestellt wird.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">An</translation>
 <translation id="7019153418965365059">Nicht erkannter Hostfehler: <ph name="HOST_OFFLINE_REASON" /></translation>
 <translation id="701976023053394610">Remote-Unterstützung</translation>
+<translation id="7026930240735156896">Folgen Sie der Anleitung, um den Computer für den Remotezugriff einzurichten</translation>
 <translation id="7038683108611689168">Helfen Sie uns bei der Verbesserung von Chromoting, indem Sie zulassen, dass wir Nutzungsstatistiken und Absturzberichte erfassen.</translation>
 <translation id="7067321367069083429">Bildschirm funktioniert wie ein Touchscreen</translation>
 <translation id="7116737094673640201">Willkommen bei Chrome Remote Desktop</translation>
diff --git a/remoting/resources/remoting_strings_el.xtb b/remoting/resources/remoting_strings_el.xtb
index 048b408..220bce1 100644
--- a/remoting/resources/remoting_strings_el.xtb
+++ b/remoting/resources/remoting_strings_el.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Ο απομακρυσμένος υπολογιστής απέτυχε να προετοιμάσει την περίοδο σύνδεσης. Αν το πρόβλημα δεν επιλυθεί, προσπαθήστε να διαμορφώσετε τον κεντρικό υπολογιστή ξανά.</translation>
 <translation id="4068946408131579958">Όλες οι συνδέσεις</translation>
 <translation id="409800995205263688">ΣΗΜΕΙΩΣΗ: Οι ρυθμίσεις πολιτικής επιτρέπουν συνδέσεις μόνο μεταξύ υπολογιστών που ανήκουν  στο δίκτυό σας.</translation>
+<translation id="4126409073460786861">Μόλις ολοκληρωθεί η ρύθμιση, ανανεώστε αυτήν τη σελίδα. Στη συνέχεια, θα μπορείτε να έχετε πρόσβαση στον υπολογιστή επιλέγοντας τη συσκευή σας και εισάγοντας το PIN</translation>
 <translation id="4145029455188493639">Έχετε συνδεθεί ως <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Λείπουν ορισμένα απαιτούμενα στοιχεία. Βεβαιωθείτε ότι έχετε εγκαταστήσει την πιο πρόσφατη έκδοση του λογισμικού και δοκιμάστε ξανά.</translation>
 <translation id="4156740505453712750">Για να προστατεύσετε την πρόσβαση σε αυτόν τον υπολογιστή, επιλέξτε ένα PIN το οποίο αποτελείται από <ph name="BOLD_START" />τουλάχιστον έξι ψηφία<ph name="BOLD_END" />. Αυτό το PIN θα ζητείται όταν συνδέεστε από άλλη τοποθεσία.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Προς</translation>
 <translation id="7019153418965365059">Άγνωστο σφάλμα κεντρικού υπολογιστή: <ph name="HOST_OFFLINE_REASON" /> .</translation>
 <translation id="701976023053394610">Απομακρυσμένη βοήθεια</translation>
+<translation id="7026930240735156896">Ακολουθήστε τις οδηγίες για να ρυθμίσετε τον υπολογιστή σας για απομακρυσμένη πρόσβαση</translation>
 <translation id="7038683108611689168">Βοηθήστε μας να βελτιώσουμε το Chromoting επιτρέποντάς μας να συγκεντρώσουμε στατιστικά στοιχεία χρήσης και αναφορές σφαλμάτων.</translation>
 <translation id="7067321367069083429">Η οθόνη λειτουργεί ως οθόνη αφής</translation>
 <translation id="7116737094673640201">Καλώς ήρθατε στην Απομακρυσμένη επιφάνεια εργασίας Chrome</translation>
diff --git a/remoting/resources/remoting_strings_es.xtb b/remoting/resources/remoting_strings_es.xtb
index 6b263d7..d438d75 100644
--- a/remoting/resources/remoting_strings_es.xtb
+++ b/remoting/resources/remoting_strings_es.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">El equipo remoto no ha podido inicializar la sesión. Si el problema persiste, prueba a volver a configurar el host.</translation>
 <translation id="4068946408131579958">Todas las conexiones</translation>
 <translation id="409800995205263688">NOTA: la configuración de la política solo permite establecer conexiones entre ordenadores de tu misma red.</translation>
+<translation id="4126409073460786861">Cuando hayas completado la configuración, podrás acceder al ordenador seleccionando tu dispositivo e introduciendo el PIN</translation>
 <translation id="4145029455188493639">Has iniciado sesión como <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Faltan algunos componentes requeridos. Asegúrate de haber instalado la última versión del software y vuelve a intentarlo.</translation>
 <translation id="4156740505453712750">Debes elegir un PIN de <ph name="BOLD_START" />al menos seis dígitos<ph name="BOLD_END" /> para proteger el acceso a este ordenador. Se solicitará ese PIN cada vez que se establezca conexión con ese ordenador desde otra ubicación.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Para</translation>
 <translation id="7019153418965365059">Error de host no reconocido: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Asistencia remota</translation>
+<translation id="7026930240735156896">Sigue las instrucciones para configurar el acceso remoto a tu ordenador</translation>
 <translation id="7038683108611689168">Ayúdanos a mejorar la aplicación Chromoting autorizando la recopilación de estadísticas de uso e informes sobre fallos.</translation>
 <translation id="7067321367069083429">La pantalla hace de pantalla táctil</translation>
 <translation id="7116737094673640201">Te damos la bienvenida a Escritorio Remoto de Chrome</translation>
diff --git a/remoting/resources/remoting_strings_et.xtb b/remoting/resources/remoting_strings_et.xtb
index 3aaf7f5a..23a7fb5 100644
--- a/remoting/resources/remoting_strings_et.xtb
+++ b/remoting/resources/remoting_strings_et.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Kaugarvutil ei õnnestunud seanssi lähtestada. Kui probleem püsib, proovige hosti uuesti seadistada.</translation>
 <translation id="4068946408131579958">Kõik ühendused</translation>
 <translation id="409800995205263688">MÄRKUS: reegli seaded lubavad luua ühenduse ainult teie võrku kuuluvate arvutite vahel.</translation>
+<translation id="4126409073460786861">Kui seadistus on lõpule viidud, tuleb teil arvutile juurdepääsemiseks valida seade ja sisestada PIN-kood</translation>
 <translation id="4145029455188493639">Sisse logitud kasutajana <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Mõned vajalikud komponendid on puudu. Veenduge, et installitud oleks tarkvara uusim versioon, ja proovige uuesti.</translation>
 <translation id="4156740505453712750">Arvuti kaitsmiseks valige PIN-kood, mis koosneb <ph name="BOLD_START" />vähemalt kuuest numbrist<ph name="BOLD_END" />. PIN-kood tuleb sisestada muust asukohast ühenduse loomisel.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Kellele</translation>
 <translation id="7019153418965365059">Tundmatu hostiviga: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Kaugabi</translation>
+<translation id="7026930240735156896">Järgige juhiseid, et seadistada arvutis kaugjuurdepääs</translation>
 <translation id="7038683108611689168">Aidake meil rakendust Chromoting täiustada, lubades kasutusstatistika ja krahhiaruannete kogumise.</translation>
 <translation id="7067321367069083429">Ekraan toimib puuteekraanina</translation>
 <translation id="7116737094673640201">Tere tulemast kasutama Chrome Remote Desktopi!</translation>
diff --git a/remoting/resources/remoting_strings_fa.xtb b/remoting/resources/remoting_strings_fa.xtb
index 289772e..e9cd51a 100644
--- a/remoting/resources/remoting_strings_fa.xtb
+++ b/remoting/resources/remoting_strings_fa.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">رایانه راه دور نتوانست جلسه را مقداردهی اولیه کند. اگر مشکل ادامه داشت، لطفاً میزبان را دوباره پیکربندی کنید.</translation>
 <translation id="4068946408131579958">تمام اتصالات</translation>
 <translation id="409800995205263688">‏توجه: تنظیمات خط‌ مشی فقط اجازه اتصال بین رایانه‎های داخل شبکه شما را می‎دهد.</translation>
+<translation id="4126409073460786861">بعد از تکمیل راه‌اندازی، می‌توانید با انتخاب دستگاه و وارد کردن پین، به رایانه دسترسی داشته باشید</translation>
 <translation id="4145029455188493639">واردشده به سیستم به‌عنوان <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">برخی از بخش‌ها از بین رفته‌اند. لطفاً مطمئن شوید آخرین نسخه نرم‌افزار را دارید و دوباره امتحان کنید.</translation>
 <translation id="4156740505453712750">برای حفاظت از دسترسی به این رایانه، لطفاً پینی را که <ph name="BOLD_START" />حداقل شش رقم<ph name="BOLD_END" /> دارد انتخاب کنید. این پین هنگام اتصال از مکان دیگر لازم است.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">به</translation>
 <translation id="7019153418965365059">خطای نامشخص میزبان: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">راهنمایی ازراه‌دور</translation>
+<translation id="7026930240735156896">با دنبال کردن دستورالعمل‌ها، رایانه‌تان را برای دسترسی از راه دور تنظیم کنید</translation>
 <translation id="7038683108611689168">‏با در اختیار قرار دادن آمار استفاده و گزارش‌های خرابی، به ما کمک کنید کار با Chrome را بهبود بخشیم.</translation>
 <translation id="7067321367069083429">صفحه نمایش مانند صفحه لمسی عمل می‌کند</translation>
 <translation id="7116737094673640201">‏به «کنترل رایانه ازراه‌دور Chrome» خوش‌آمدید</translation>
diff --git a/remoting/resources/remoting_strings_fi.xtb b/remoting/resources/remoting_strings_fi.xtb
index 2b58f4c8..f13a32f 100644
--- a/remoting/resources/remoting_strings_fi.xtb
+++ b/remoting/resources/remoting_strings_fi.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Etätietokone ei alustanut istuntoa oikein. Jos ongelma ei ratkea, yritä määrittää isäntäkoneen asetukset uudelleen.</translation>
 <translation id="4068946408131579958">Kaikki yhteydet</translation>
 <translation id="409800995205263688">HUOMAA: käytäntöasetusten vuoksi vain verkossasi olevien tietokoneiden väliset yhteydet sallitaan.</translation>
+<translation id="4126409073460786861">Päivitä tämä sivu määrityksen jälkeen, niin voit käyttää tietokonetta valitsemalla laitteesi ja syöttämällä PIN-koodin</translation>
 <translation id="4145029455188493639">Kirjautunut osoitteella <ph name="EMAIL_ADDRESS" /></translation>
 <translation id="4155497795971509630">Joitakin vaadittavia komponentteja puuttuu. Varmista, että olet asentanut ohjelmiston uusimman version, ja yritä uudelleen.</translation>
 <translation id="4156740505453712750">Suojaa tämän tietokoneen käyttöä valitsemalla <ph name="BOLD_START" />vähintään kuusinumeroinen<ph name="BOLD_END" /> PIN-koodi. Tarvitset PIN-koodin muodostaessasi yhteyden toiselta koneelta.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Vastaanottaja</translation>
 <translation id="7019153418965365059">Tuntematon isäntävirhe: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Etätuki</translation>
+<translation id="7026930240735156896">Määritä tietokone etäyhteyttä varten seuraamalla ohjeita</translation>
 <translation id="7038683108611689168">Auta meitä parantamaan Chromotingia antamalla meidän kerätä käyttötilastoja ja virheraportteja.</translation>
 <translation id="7067321367069083429">Näyttö toimii kosketusnäyttönä</translation>
 <translation id="7116737094673640201">Tervetuloa Chrome-etäkäyttöön</translation>
diff --git a/remoting/resources/remoting_strings_fil.xtb b/remoting/resources/remoting_strings_fil.xtb
index 2149aff..1e033e6 100644
--- a/remoting/resources/remoting_strings_fil.xtb
+++ b/remoting/resources/remoting_strings_fil.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Hindi nasimulan ng remote na computer ang session. Kung ayaw mawala ng problema, pakisubukang i-configure muli ang host.</translation>
 <translation id="4068946408131579958">Lahat ng koneksyon</translation>
 <translation id="409800995205263688">TANDAAN: Ang pinapayagan ng mga setting ng patakaran ay mga koneksyon lang sa pagitan ng mga computer sa loob ng iyong network.</translation>
+<translation id="4126409073460786861">Pagkatapos ng pag-set up, i-refresh ang page na ito, pagkatapos ay maa-access mo ang computer sa pamamagitan ng pagpili sa iyong device at paglagay ng PIN</translation>
 <translation id="4145029455188493639">Naka-sign in bilang <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Nawawala ang ilang bahagi na kinakailangan. Pakitiyak na na-install mo ang pinakabagong bersyon ng software at subukang muli.</translation>
 <translation id="4156740505453712750">Upang protektahan ang access sa computer na ito, mangyaring pumili ng PIN na may <ph name="BOLD_START" />hindi bababa sa anim na digit<ph name="BOLD_END" />. Kakailanganin ang PIN na ito kapag kumokonekta mula sa isa pang lokasyon.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Para sa</translation>
 <translation id="7019153418965365059">Hindi alam na error sa host: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Malayuang Tulong</translation>
+<translation id="7026930240735156896">Sundin ang mga tagubilin para i-set up ang iyong computer para sa malayuang pag-access</translation>
 <translation id="7038683108611689168">Tumulong sa amin na pahusayin ang Chromoting sa pamamagitan ng pagbibigay-daan sa amin na mangolekta ng mga statistics sa paggamit at mga ulat ng pag-crash.</translation>
 <translation id="7067321367069083429">Gumagana ang screen tulad ng touch screen</translation>
 <translation id="7116737094673640201">Welcome sa Remote na Desktop ng Chrome</translation>
diff --git a/remoting/resources/remoting_strings_fr.xtb b/remoting/resources/remoting_strings_fr.xtb
index 646457f..dfd04da0 100644
--- a/remoting/resources/remoting_strings_fr.xtb
+++ b/remoting/resources/remoting_strings_fr.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Échec de l'initialisation de la session par l'ordinateur distant. Si le problème persiste, veuillez réessayer de configurer l'hôte.</translation>
 <translation id="4068946408131579958">Toutes les connexions</translation>
 <translation id="409800995205263688">REMARQUE : Les paramètres des règles n'autorisent que les connexions entre les ordinateurs de votre réseau.</translation>
+<translation id="4126409073460786861">Une fois la configuration terminée, actualisez la page. Vous pourrez alors accéder à l'ordinateur en choisissant votre appareil et en saisissant le code d'accès</translation>
 <translation id="4145029455188493639">Connecté en tant que <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Certains composants nécessaires sont introuvables. Veuillez vous assurer que vous utilisez la dernière version du logiciel, puis réessayer.</translation>
 <translation id="4156740505453712750">Pour protéger l'accès à cet ordinateur, veuillez choisir un code d'accès d'<ph name="BOLD_START" />au moins six chiffres<ph name="BOLD_END" />. Ce code d'accès sera demandé lors d'une connexion depuis un autre appareil.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">À</translation>
 <translation id="7019153418965365059">Erreur d'hôte non reconnue : <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Assistance à distance</translation>
+<translation id="7026930240735156896">Suivez les instructions pour configurer votre ordinateur pour l'accès à distance</translation>
 <translation id="7038683108611689168">Aidez-nous à améliorer Google Chromoting en nous autorisant à recueillir des statistiques d'utilisation et des rapports d'erreur.</translation>
 <translation id="7067321367069083429">L'écran se comporte comme un écran tactile</translation>
 <translation id="7116737094673640201">Bienvenue dans le bureau à distance Chrome</translation>
diff --git a/remoting/resources/remoting_strings_gu.xtb b/remoting/resources/remoting_strings_gu.xtb
index f1abef9..ab1b6f6b 100644
--- a/remoting/resources/remoting_strings_gu.xtb
+++ b/remoting/resources/remoting_strings_gu.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">રિમોટ કમ્પ્યુટર સત્રને શરૂ કરવામાં નિષ્ફળ થયું. જો સમસ્યા યથાવત્ રહે છે, તો કૃપા કરીને હોસ્ટને ફરીથી ગોઠવવાનો પ્રયાસ કરો.</translation>
 <translation id="4068946408131579958">બધા કનેક્શન્સ</translation>
 <translation id="409800995205263688">નોંધ: નીતિ સેટિંગ્સ ફક્ત તમારા નેટવર્કની અંતર્ગત રહેલા કમ્પ્યુટર્સ વચ્ચે જ કનેક્શન્સને પરવાનગી આપે છે.</translation>
+<translation id="4126409073460786861">સેટઅપ પૂર્ણ થાય, તે પછી આ પેજને રિફ્રેશ કરો, પછી તમે તમારું ઉપકરણ પસંદ કરીને અને પિન દાખલ કરીને કમ્પ્યુટરને ઍક્સેસ કરી શકશો</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> તરીકે સાઇન ઇન કર્યું.</translation>
 <translation id="4155497795971509630">કેટલાક આવશ્યક ઘટકો ખૂટે છે. કૃપા કરીને ખાતરી કરો કે તમે સોફ્ટવેરનું નવીનતમ સંસ્કરણ ઇન્સ્ટોલ કરેલું છે અને ફરી પ્રયાસ કરો.</translation>
 <translation id="4156740505453712750">આ કમ્પ્યુટરનાં ઍક્સેસને રક્ષણ આપવા માટે, કૃપા કરીને <ph name="BOLD_START" />ઓછામાં ઓછા છ અંકો<ph name="BOLD_END" />નો એક PIN પસંદ કરો. જ્યારે બીજા સ્થાનેથી કનેક્ટ થઇ રહ્યાં હોવ ત્યારે આ PIN ની જરૂર પડશે.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">પ્રતિ</translation>
 <translation id="7019153418965365059">ન ઓળખાયેલ હોસ્ટ ભૂલ: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">રીમોટ સહાય</translation>
+<translation id="7026930240735156896">રિમોટ ઍક્સેસ માટે તમારા કમ્પ્યુટરને સેટ અપ કરવા માટે સૂચનાઓને અનુસરો</translation>
 <translation id="7038683108611689168">અમને ઉપયોગનાં આંકડા અને ક્રેશ રિપોર્ટ્સ એકત્રિત કરવાની મંજૂરી આપીને Chromoting માં સુધારો કરવામાં અમને સહાય કરો.</translation>
 <translation id="7067321367069083429">સ્ક્રીન એ ટચ સ્ક્રીનના જેવું કાર્ય કરે છે</translation>
 <translation id="7116737094673640201">Chrome રિમોટ ડેસ્કટૉપમાં સ્વાગત છે</translation>
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb
index 61f63ba..67870649 100644
--- a/remoting/resources/remoting_strings_hi.xtb
+++ b/remoting/resources/remoting_strings_hi.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">दूर का कंप्यूटर सत्र शुरू नहीं कर पाया. अगर समस्या बनी रहती है तो, कृपया होस्ट को फिर से कॉन्फ़िगर करने की कोशिश करें.</translation>
 <translation id="4068946408131579958">सभी कनेक्‍शन</translation>
 <translation id="409800995205263688">ध्‍यान दें: नीति सेटिंग केवल आपके नेटवर्क के कंप्‍यूटर के बीच कनेक्शन की अनुमति देती है.</translation>
+<translation id="4126409073460786861">सेटअप पूरा होने के बाद, इस पेज को रीफ़्रेश करें, जिसके बाद आप अपना डिवाइस चुनकर और पिन डालकर कंप्यूटर एक्सेस कर सकेंगे</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> के रूप में साइन इन किया है.</translation>
 <translation id="4155497795971509630">कुछ आवश्‍यक घटक अनुपलब्‍ध हैं. कृपया सुनिश्‍चित करें कि आप सॉफ़्टवेयर का नवीनतम वर्शन चला रहे हैं और पुन: प्रयास करें.</translation>
 <translation id="4156740505453712750">इस कंप्यूटर की पहुंच सुरक्षित करने के लिए, कृपया <ph name="BOLD_START" />कम से कम छ: अंक<ph name="BOLD_END" /> का पिन चुनें. यह पिन किसी अन्य स्थान से कनेक्ट करते समय आवश्यक होगा.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">To</translation>
 <translation id="7019153418965365059">अपरिचित होस्‍ट गड़बड़ी: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">दूरस्थ सहायता</translation>
+<translation id="7026930240735156896">अपना कंप्यूटर दूर से एक्सेस करने के लिए उसे सेटअप करने के निर्देशों को पूरा करें</translation>
 <translation id="7038683108611689168">हमें 'इस्तेमाल के आंकड़े' और 'खराबी रिपोर्ट' इकट्ठा करने की अनुमति देकर Chromoting को सुधारने में हमारी सहायता करें.</translation>
 <translation id="7067321367069083429">स्क्रीन किसी टच स्क्रीन की तरह काम करती है</translation>
 <translation id="7116737094673640201">Chrome दूरस्‍थ डेस्‍कटॉप में आपका स्वागत है</translation>
diff --git a/remoting/resources/remoting_strings_hr.xtb b/remoting/resources/remoting_strings_hr.xtb
index f52c4704..490b23c 100644
--- a/remoting/resources/remoting_strings_hr.xtb
+++ b/remoting/resources/remoting_strings_hr.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Udaljeno računalo nije uspjelo inicijalizirati sesiju. Ako se problem ne riješi, pokušajte ponovo konfigurirati host.</translation>
 <translation id="4068946408131579958">Sve veze</translation>
 <translation id="409800995205263688">NAPOMENA: postavke pravila dopuštaju jedino veze između računala u vašoj mreži.</translation>
+<translation id="4126409073460786861">Nakon dovršetka postavljanja osvježite stranicu i moći ćete pristupiti računalu tako da odaberete uređaj i unesete PIN</translation>
 <translation id="4145029455188493639">Prijavljeni ste kao <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Nedostaju neke obavezne komponente. Provjerite jeste li instalirali najnoviju verziju softvera i pokušajte ponovo.</translation>
 <translation id="4156740505453712750">Da biste zaštitili pristup ovom računalu, odaberite PIN s <ph name="BOLD_START" />najmanje šest brojeva<ph name="BOLD_END" />. Taj će PIN biti potreban pri povezivanju s druge lokacije.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Do</translation>
 <translation id="7019153418965365059">Nepoznata pogreška hosta: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Daljinska pomoć</translation>
+<translation id="7026930240735156896">Slijedite upute za postavljanje računala za daljinski pristup</translation>
 <translation id="7038683108611689168">Pomognite nam da poboljšamo Chromoting tako da nam dopustite prikupljanje statistika o upotrebi i izvješća o padovima.</translation>
 <translation id="7067321367069083429">Zaslon se ponaša kao dodirni zaslon</translation>
 <translation id="7116737094673640201">Dobro došli na Udaljenu radnu površinu Chrome</translation>
diff --git a/remoting/resources/remoting_strings_hu.xtb b/remoting/resources/remoting_strings_hu.xtb
index e2786978..a1fcff0 100644
--- a/remoting/resources/remoting_strings_hu.xtb
+++ b/remoting/resources/remoting_strings_hu.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">A távoli számítógépnek nem sikerült inicializálnia a munkamenetet. Ha a probléma továbbra is fennáll, próbálja meg újra beállítani a gazdagépet.</translation>
 <translation id="4068946408131579958">Minden kapcsolat</translation>
 <translation id="409800995205263688">MEGJEGYZÉS: az irányelv-beállítások a csatlakozást csak a saját hálózaton belül található számítógépek között teszik lehetővé.</translation>
+<translation id="4126409073460786861">Ha végzett a beállítással, frissítse ezt az oldalt, majd az eszköz kiválasztásával és a PIN-kód megadásával hozzáférhet a számítógéphez.</translation>
 <translation id="4145029455188493639">Bejelentkezve mint <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Hiányzik néhány szükséges összetevő. Kérjük, ellenőrizze, hogy a szoftver legfrissebb verzióját telepítette-e, majd próbálja újra.</translation>
 <translation id="4156740505453712750">A számítógép hozzáférésének védelméhez válasszon egy <ph name="BOLD_START" />legalább hat számjegyből álló<ph name="BOLD_END" /> PIN kódot. Ezt a PIN kódot kéri a rendszer, ha más helyről kísérlik meg a kapcsolódást.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Címzett</translation>
 <translation id="7019153418965365059">Ismeretlen gazdagéphiba: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Távsegítség</translation>
+<translation id="7026930240735156896">Az utasításokat követve beállíthatja a számítógépet a távoli hozzáféréshez.</translation>
 <translation id="7038683108611689168">Segítsen fejleszteni a Chromoting alkalmazást azáltal, hogy rendelkezésünkre bocsátja a használati statisztikát és a hibajelentéseket.</translation>
 <translation id="7067321367069083429">A képernyő érintőképernyőként működik</translation>
 <translation id="7116737094673640201">Üdvözli a Chrome távoliasztal-szolgáltatás</translation>
diff --git a/remoting/resources/remoting_strings_id.xtb b/remoting/resources/remoting_strings_id.xtb
index 693e52c..4d83787 100644
--- a/remoting/resources/remoting_strings_id.xtb
+++ b/remoting/resources/remoting_strings_id.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Komputer jarak jauh gagal melakukan inisialisasi sesi. Jika masalah tetap ada, coba konfigurasi ulang host.</translation>
 <translation id="4068946408131579958">Semua sambungan</translation>
 <translation id="409800995205263688">CATATAN: Setelan kebijakan hanya mengizinkan sambungan antar-komputer dalam jaringan Anda.</translation>
+<translation id="4126409073460786861">Setelah penyiapan selesai, refresh halaman ini, maka Anda dapat mengakses komputer dengan memilih perangkat dan memasukkan PIN</translation>
 <translation id="4145029455188493639">Login sebagai <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Beberapa komponen yang diperlukan tidak ada. Pastikan Anda memasang software versi terbaru dan coba lagi.</translation>
 <translation id="4156740505453712750">Untuk melindungi akses ke komputer ini, gunakan PIN <ph name="BOLD_START" />setidaknya enam digit<ph name="BOLD_END" />. PIN ini akan diperlukan saat menyambung dari lokasi lainnya.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Kepada</translation>
 <translation id="7019153418965365059">Kesalahan host tidak dikenal: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Bantuan Jarak Jauh</translation>
+<translation id="7026930240735156896">Ikuti petunjuk menyiapkan komputer untuk akses jarak jauh</translation>
 <translation id="7038683108611689168">Bantu kami meningkatkan Chromoting dengan mengizinkan kami mengumpulkan statistik penggunaan dan laporan kerusakan.</translation>
 <translation id="7067321367069083429">Layar berfungsi seperti layar sentuh</translation>
 <translation id="7116737094673640201">Selamat Datang di Chrome Desktop Jarak Jauh</translation>
diff --git a/remoting/resources/remoting_strings_it.xtb b/remoting/resources/remoting_strings_it.xtb
index ebf88b8..e111eb8 100644
--- a/remoting/resources/remoting_strings_it.xtb
+++ b/remoting/resources/remoting_strings_it.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Impossibile inizializzare la sessione sul computer remoto. Se il problema persiste, riprova a configurare l'host.</translation>
 <translation id="4068946408131579958">Tutte le connessioni</translation>
 <translation id="409800995205263688">NOTA. Le impostazioni dei criteri consentono connessioni solo tra computer all'interno della tua rete.</translation>
+<translation id="4126409073460786861">Una volta completata la configurazione, per accedere al computer dovrai scegliere il dispositivo e inserire il codice PIN.</translation>
 <translation id="4145029455188493639">Accesso eseguito come <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Mancano alcuni componenti obbligatori. Verifica che sia installata la versione più recente del software e riprova.</translation>
 <translation id="4156740505453712750">Per proteggere l'accesso a questo computer, scegli un PIN di <ph name="BOLD_START" />almeno sei cifre<ph name="BOLD_END" />. Questo PIN sarà richiesto quando ti connetti da un'altra posizione.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">A</translation>
 <translation id="7019153418965365059">Errore host non riconosciuto: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Assistenza remota</translation>
+<translation id="7026930240735156896">Segui le istruzioni per configurare il computer per l'accesso remoto</translation>
 <translation id="7038683108611689168">Aiutaci a migliorare Chromoting consentendo l'acquisizione di dati per statistiche di utilizzo e rapporti sugli arresti anomali.</translation>
 <translation id="7067321367069083429">Lo schermo funge da touch screen</translation>
 <translation id="7116737094673640201">Benvenuto in Chrome Remote Desktop</translation>
diff --git a/remoting/resources/remoting_strings_iw.xtb b/remoting/resources/remoting_strings_iw.xtb
index 9c09531e..4cd2aab 100644
--- a/remoting/resources/remoting_strings_iw.xtb
+++ b/remoting/resources/remoting_strings_iw.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">המחשב המרוחק לא הצליח לאתחל את ההפעלה. אם הבעיה נמשכת, נסה להגדיר שוב את המארח.</translation>
 <translation id="4068946408131579958">כל החיבורים</translation>
 <translation id="409800995205263688">הערה: הגדרות המדיניות מתירות חיבורים רק בין מחשבים הנמצאים בתוך הרשת שלך.</translation>
+<translation id="4126409073460786861">‏כשתהליך ההגדרה יסתיים, צריך יהיה לרענן את הדף ואז אפשר יהיה לבחור את המכשיר שלך ולהזין את ה-PIN כדי לגשת למחשב</translation>
 <translation id="4145029455188493639">התחברת באמצעות חשבון <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">חלק מהרכיבים הדרושים חסרים. ודא שהתקנת את הגרסה העדכנית ביותר של התוכנה ונסה שוב.</translation>
 <translation id="4156740505453712750">‏כדי להגן על הגישה למחשב זה, בחר PIN באורך <ph name="BOLD_START" />שש ספרות לפחות<ph name="BOLD_END" />. PIN זה יידרש בעת התחברות ממיקום אחר.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">אל</translation>
 <translation id="7019153418965365059">שגיאת מארח לא מזוהה: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">סיוע מרחוק</translation>
+<translation id="7026930240735156896">יש להגדיר את המחשב לגישה מרחוק בהתאם להוראות</translation>
 <translation id="7038683108611689168">‏עזור לנו לשפר את Chromoting בכך שתאפשר לנו לאסוף סטטיסטיקות שימוש ודוחות קריסה.</translation>
 <translation id="7067321367069083429">המסך פועל כמסך מגע</translation>
 <translation id="7116737094673640201">‏ברוכים הבאים אל שולחן העבודה המרוחק של Chrome</translation>
diff --git a/remoting/resources/remoting_strings_ja.xtb b/remoting/resources/remoting_strings_ja.xtb
index c200ceb6..62a1ca2 100644
--- a/remoting/resources/remoting_strings_ja.xtb
+++ b/remoting/resources/remoting_strings_ja.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">リモート パソコンでセッションを初期化できませんでした。引き続き問題が発生する場合は、ホストを設定し直してみてください。</translation>
 <translation id="4068946408131579958">すべての接続</translation>
 <translation id="409800995205263688">注: ポリシー設定に基づき、接続が許可されるのはこのネットワーク内のパソコン間のみとなります。</translation>
+<translation id="4126409073460786861">設定が完了したら、このページを更新します。更新後のページでデバイスを選択して PIN を入力すると、パソコンにアクセスできます</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> としてログインしています。</translation>
 <translation id="4155497795971509630">必要なコンポーネントが見つかりません。インストールしているソフトウェアのバージョンが最新であることを確認し、もう一度お試しください。</translation>
 <translation id="4156740505453712750">このパソコンへのアクセスを保護するには、<ph name="BOLD_START" />6 桁以上<ph name="BOLD_END" />の PIN を選択してください。この PIN は別の場所から接続するときに必要となります。</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">To</translation>
 <translation id="7019153418965365059">不明なホストエラー: <ph name="HOST_OFFLINE_REASON" />。</translation>
 <translation id="701976023053394610">リモート サポート</translation>
+<translation id="7026930240735156896">画面の説明に沿ってパソコンをリモート アクセス用に設定します</translation>
 <translation id="7038683108611689168">Chromoting の改善のため、使用統計情報とクラッシュ レポートの収集に協力する</translation>
 <translation id="7067321367069083429">画面がタッチ スクリーンとして機能します</translation>
 <translation id="7116737094673640201">Chrome リモート デスクトップへようこそ</translation>
diff --git a/remoting/resources/remoting_strings_kn.xtb b/remoting/resources/remoting_strings_kn.xtb
index 19ac2c4c..c8d54bf 100644
--- a/remoting/resources/remoting_strings_kn.xtb
+++ b/remoting/resources/remoting_strings_kn.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">ಸೆಶನ್ ಪ್ರಾರಂಭಿಸಲು ರಿಮೋಟ್ ಕಂಪ್ಯೂಟರ್ ವಿಫಲವಾಗಿದೆ. ಸಮಸ್ಯೆಯು ಮುಂದುವರಿದರೆ ಹೋಸ್ಟ್ ಮತ್ತೊಮ್ಮೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="4068946408131579958">ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು</translation>
 <translation id="409800995205263688">ಸೂಚನೆ: ನಿಮ್ಮ ನೆಟ್‌ವರ್ಕ್‌ನೊಳಗಿರುವ ಕಂಪ್ಯೂಟರ್‌ಗಳ ನಡುವೆ ಮಾತ್ರ ನೀತಿ ಸೆಟ್ಟಿಂಗ್‌ಗಳು ಸಂಪರ್ಕಗಳನ್ನು ಅನುಮತಿಸುತ್ತವೆ.</translation>
+<translation id="4126409073460786861">ಹೊಂದಿಸುವಿಕೆಯು ಪೂರ್ಣಗೊಂಡ ಬಳಿಕ, ಈ ಪುಟವನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ. ಆನಂತರ, ನಿಮ್ಮ ಸಾಧನವನ್ನು ಆಯ್ಕೆ ಮಾಡಿ, ಪಿನ್ ನಮೂದಿಸುವ ಮೂಲಕ ನೀವು ಕಂಪ್ಯೂಟರ್‌ಗೆ ಪ್ರವೇಶಿಸಬಹುದು.</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> ನಂತೆ ಸೈನ್ ಇನ್ ಮಾಡಲಾಗಿದೆ.</translation>
 <translation id="4155497795971509630">ಕೆಲವು ಅಗತ್ಯವಿರುವ ಅಂಶಗಳು ಕಾಣೆಯಾಗಿವೆ. ನೀವು ಸಾಫ್ಟ್‌ವೇರ್‌ನ ಇತ್ತೀಚಿನ ಆವೃತ್ತಿಯನ್ನು ಸ್ಥಾಪಿಸಿರುವಿರಾ ಎಂಬುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ ಹಾಗೂ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.</translation>
 <translation id="4156740505453712750">ಈ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಪ್ರವೇಶವನ್ನು ರಕ್ಷಿಸಲು, ದಯವಿಟ್ಟು <ph name="BOLD_START" />ಕನಿಷ್ಠ ಆರು ಅಂಕೆಗಳ<ph name="BOLD_END" /> PIN ಅನ್ನು ಆರಿಸಿ. ಬೇರೆ ಸ್ಥಾನದಿಂದ ಸಂಪರ್ಕಿಸುವಾಗ ಈ PIN ಅಗತ್ಯವಿರುತ್ತದೆ.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">ಇವರಿಗೆ</translation>
 <translation id="7019153418965365059">ಗುರುತಿಸಲಾಗದ ಹೋಸ್ಟ್ ದೋಷ: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">ರಿಮೋಟ್ ಸಹಾಯಕ</translation>
+<translation id="7026930240735156896">ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ಗೆ ಸೂರದ ಸ್ಥಳದಿಂದ ಪ್ರವೇಶಿಸಲು ಸಾಧ್ಯವಾಗುವಂತೆ ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಸೂಚನೆಗಳನ್ನು ಅನುಸರಿಸಿ</translation>
 <translation id="7038683108611689168">ಬಳಕೆಯ ಅಂಕಿಅಂಶಗಳನ್ನು ಹಾಗೂ ಕ್ರ್ಯಾಶ್ ವರದಿಗಳನ್ನು ನಮಗೆ ಸಂಗ್ರಹಿಸಲು ಅನುಮತಿಸುವುದರ ಮೂಲಕ ಕ್ರೊಮೊಟಿಂಗ್‌ ಅನ್ನು ಸುಧಾರಿಸಲು ನಮಗೆ ಸಹಾಯ ಮಾಡಿ.</translation>
 <translation id="7067321367069083429">ಪರದೆಯು ಸ್ಪರ್ಶ ಪರದೆಯಂತೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ</translation>
 <translation id="7116737094673640201">Chrome ರಿಮೋಟ್ ಡೆಸ್ಕ್‌ಟಾಪ್‌ಗೆ ಸ್ವಾಗತ</translation>
diff --git a/remoting/resources/remoting_strings_ko.xtb b/remoting/resources/remoting_strings_ko.xtb
index cff34a478..7909b01c7 100644
--- a/remoting/resources/remoting_strings_ko.xtb
+++ b/remoting/resources/remoting_strings_ko.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">원격 컴퓨터가 세션을 초기화하는 데 실패했습니다. 문제가 지속되면 호스트를 다시 구성해 보시기 바랍니다.</translation>
 <translation id="4068946408131579958">모든 연결</translation>
 <translation id="409800995205263688">참고: 정책 설정에 따라 네트워크 내에 있는 컴퓨터 간의 연결만 허용됩니다.</translation>
+<translation id="4126409073460786861">설정이 완료된 후 이 페이지를 새로고침하면 기기를 선택하고 PIN을 입력하여 컴퓨터에 액세스할 수 있습니다.</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> 계정으로 로그인했습니다.</translation>
 <translation id="4155497795971509630">일부 필수 구성요소가 누락되었습니다. 소프트웨어의 최신 버전을 설치했는지 확인한 뒤 다시 시도해주세요.</translation>
 <translation id="4156740505453712750">액세스 제한을 통해 이 컴퓨터를 보호하려면 <ph name="BOLD_START" />최소 6자리<ph name="BOLD_END" />의 PIN을 선택하세요. 이 PIN은 다른 위치에서 연결할 때 필요합니다.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">받는사람</translation>
 <translation id="7019153418965365059">알 수 없는 호스트 오류입니다. <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">원격 지원</translation>
+<translation id="7026930240735156896">안내에 따라 컴퓨터에서 원격으로 액세스할 수 있도록 설정하세요.</translation>
 <translation id="7038683108611689168">사용 통계 및 비정상 종료 보고서 수집을 허용하여 Chromoting 개선에 참여하겠습니다.</translation>
 <translation id="7067321367069083429">화면이 터치스크린처럼 작동합니다</translation>
 <translation id="7116737094673640201">Chrome 원격 데스크톱에 오신 것을 환영합니다.</translation>
diff --git a/remoting/resources/remoting_strings_lv.xtb b/remoting/resources/remoting_strings_lv.xtb
index 6a2bf57..78eacff 100644
--- a/remoting/resources/remoting_strings_lv.xtb
+++ b/remoting/resources/remoting_strings_lv.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Attālajam datoram neizdevās inicializēt sesiju. Ja problēma atkārtojas, lūdzu, mēģiniet vēlreiz konfigurēt saimniekdatoru.</translation>
 <translation id="4068946408131579958">Visi savienojumi</translation>
 <translation id="409800995205263688">PIEZĪME. Saskaņā ar politikas iestatījumiem savienojumus ir atļauts veidot tikai starp jūsu tīkla datoriem.</translation>
+<translation id="4126409073460786861">Kad iestatīšana ir pabeigta, atsvaidziniet šo lapu, pēc tam varēsiet piekļūt datoram, izvēloties ierīci un ievadot PIN kodu</translation>
 <translation id="4145029455188493639">Pierakstījies kā <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Trūkst dažu nepieciešamo komponentu. Pārbaudiet, vai ir instalēta programmatūras jaunākā versija, un mēģiniet vēlreiz.</translation>
 <translation id="4156740505453712750">Lai izveidotu drošu savienojumu ar šo datoru, lūdzu, izvēlieties tādu PIN, kura garums ir <ph name="BOLD_START" />vismaz seši cipari<ph name="BOLD_END" />. Šis PIN būs nepieciešams, lai izveidotu savienojumu no citas atrašanās vietas.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Kam</translation>
 <translation id="7019153418965365059">Neatpazīta saimniekdatora kļūda: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Attālā palīdzība</translation>
+<translation id="7026930240735156896">Sekojiet norādījumiem, lai iestatītu datoru attālai piekļuvei</translation>
 <translation id="7038683108611689168">Palīdziet mums uzlabot Chrome saiti, ļaujot mums apkopot lietojuma statistiku un avāriju pārskatus.</translation>
 <translation id="7067321367069083429">Ekrāns darbojas kā skārienekrāns</translation>
 <translation id="7116737094673640201">Laipni lūdzam Chrome attālajā darbvirsmā!</translation>
diff --git a/remoting/resources/remoting_strings_ml.xtb b/remoting/resources/remoting_strings_ml.xtb
index 3bf0641..6a0a863e 100644
--- a/remoting/resources/remoting_strings_ml.xtb
+++ b/remoting/resources/remoting_strings_ml.xtb
@@ -135,6 +135,7 @@
 <translation id="405887016757208221">സെഷൻ സമാരംഭിക്കുന്നതിന് റിമോട്ട് കമ്പ്യൂട്ടർ പരാജയപ്പെട്ടു. പ്രശ്‌നം നിലനിൽക്കുകയാണെങ്കിൽ, ഹോസ്‌റ്റ് വീണ്ടും കോൺഫിഗർ ചെയ്യാൻ ശ്രമിക്കുക.</translation>
 <translation id="4068946408131579958">എല്ലാ കണക്ഷനുകളും</translation>
 <translation id="409800995205263688">ശ്രദ്ധിക്കുക: നിങ്ങളുടെ നെറ്റ്‌വർക്കിനുള്ളിലെ കമ്പ്യൂട്ടറുകൾ തമ്മിലുള്ള കണക്ഷനുകൾ മാത്രമേ നയ ക്രമീകരണങ്ങൾ അനുവദിക്കൂ.</translation>
+<translation id="4126409073460786861">സജ്ജീകരണം പൂർത്തിയാക്കിയതിന് ശേഷം, ഈ പേജ് പുതുക്കുക, തുടർന്ന് നിങ്ങളുടെ ഉപകരണം തിരഞ്ഞെടുത്ത് പിൻ നൽകിയാൽ നിങ്ങൾക്ക് കമ്പ്യൂട്ടർ ആക്‌സസ് ചെയ്യാനാവും</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> എന്നയാളായി സൈൻ ഇൻ ചെയ്‌തു.</translation>
 <translation id="4155497795971509630">ആവശ്യമുള്ള ചില ഘടകങ്ങൾ കാണുന്നില്ല. സോഫ്‌റ്റ്‌വെയറിന്റെ ഏറ്റവും പുതിയ പതിപ്പ് ഇൻസ്റ്റാൾ ചെയ്‌തിട്ടുണ്ടെന്ന് ഉറപ്പാക്കി വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="4156740505453712750">ഈ കമ്പ്യൂട്ടറിലേക്കുള്ള ആക്‌സസ് പരിരക്ഷിക്കുന്നതിന്, <ph name="BOLD_START" />ആറ് അക്കങ്ങളെങ്കിലും<ph name="BOLD_END" /> ഉള്ള ഒരു PIN തിരഞ്ഞെടുക്കുക. മറ്റൊരു ലൊക്കേഷനിൽ നിന്ന് കണക്റ്റുചെയ്യുമ്പോൾ ഈ PIN ആവശ്യമായിവരും.</translation>
@@ -269,6 +270,7 @@
 <translation id="6998989275928107238">സ്വീകര്‍ത്താവ്</translation>
 <translation id="7019153418965365059">തിരിച്ചറിയപ്പെടാത്ത ഹോസ്റ്റ് പിശക്: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">വിദൂര സഹായം</translation>
+<translation id="7026930240735156896">വിദൂര ആക്‌സസിനായി നിങ്ങളുടെ കമ്പ്യൂട്ടർ സജ്ജീകരിക്കാൻ നിർദ്ദേശങ്ങൾ പിന്തുടരുക</translation>
 <translation id="7038683108611689168">ഉപയോഗ സ്ഥിതിവിവരക്കണക്കുകളും ക്രാഷ് റിപ്പോർട്ടുകളും ശേഖരിക്കുന്നതിന് അനുവദിക്കുന്നതിലൂടെ ക്രോമോട്ടിംഗ് മെച്ചപ്പെടുത്തുന്നതിന് ഞങ്ങളെ സഹായിക്കുക.</translation>
 <translation id="7067321367069083429">ടച്ച് സ്‌ക്രീൻ പോലെ ‌സ്‌ക്രീൻ പ്രവർത്തിക്കുന്നു</translation>
 <translation id="7116737094673640201">Chrome വിദൂര ഡെസ്‌ക്‌ടോപ്പിലേക്ക് സ്വാഗതം</translation>
diff --git a/remoting/resources/remoting_strings_ms.xtb b/remoting/resources/remoting_strings_ms.xtb
index 67287338a..f8e3a17 100644
--- a/remoting/resources/remoting_strings_ms.xtb
+++ b/remoting/resources/remoting_strings_ms.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Komputer jauh gagal memulakan sesi. Jika masalah berterusan, sila cuba mengkonfigurasi hos sekali lagi.</translation>
 <translation id="4068946408131579958">Semua sambungan</translation>
 <translation id="409800995205263688">NOTA: Tetapan dasar membenarkan sambungan antara komputer dalam rangkaian anda sahaja.</translation>
+<translation id="4126409073460786861">Selepas penyediaan selesai, muat semula halaman ini dan anda akan dapat mengakses komputer dengan memilih peranti anda dan memasukkan PIN</translation>
 <translation id="4145029455188493639">Log masuk sebagai <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Sesetengah komponen yang diperlukan hilang. Sila pastikan anda telah memasang versi terkini perisian dan cuba lagi.</translation>
 <translation id="4156740505453712750">Untuk melindungi akses kepada komputer ini, sila pilih PIN <ph name="BOLD_START" />sekurang-kurangnya enam digit<ph name="BOLD_END" />. PIN ini akan diperlukan apabila menyambung dari lokasi lain.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Kepada</translation>
 <translation id="7019153418965365059">Ralat hos tak dikenali: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Bantuan Jauh</translation>
+<translation id="7026930240735156896">Ikut arahan untuk menyediakan komputer anda untuk akses jauh</translation>
 <translation id="7038683108611689168">Bantu kami mempertingkatkan Chromoting dengan membenarkan kami mengumpulkan perangkaan penggunaan dan laporan keranapan.</translation>
 <translation id="7067321367069083429">Skrin bertindak seperti skrin sentuh</translation>
 <translation id="7116737094673640201">Selamat Datang ke Desktop Jauh Chrome</translation>
diff --git a/remoting/resources/remoting_strings_nl.xtb b/remoting/resources/remoting_strings_nl.xtb
index 2f28e308..803da6ed 100644
--- a/remoting/resources/remoting_strings_nl.xtb
+++ b/remoting/resources/remoting_strings_nl.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">De externe computer kan de sessie niet initialiseren. Als het probleem blijft optreden, configureer je de host opnieuw.</translation>
 <translation id="4068946408131579958">Alle verbindingen</translation>
 <translation id="409800995205263688">OPMERKING: beleidsinstellingen staan alleen verbindingen tussen computers binnen je netwerk toe.</translation>
+<translation id="4126409073460786861">Nadat het instellen is voltooid, vernieuw je deze pagina. Vervolgens kun je toegang tot de computer krijgen door je apparaat te kiezen en de pincode op te geven.</translation>
 <translation id="4145029455188493639">Ingelogd als <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Er ontbreken enkele vereiste componenten. Controleer of de nieuwste versie van de software is geïnstalleerd en probeer het opnieuw.</translation>
 <translation id="4156740505453712750">Om de toegang tot deze computer te beschermen, kies je een pincode van <ph name="BOLD_START" />ten minste zes cijfers<ph name="BOLD_END" />. Je moet deze pincode opgeven wanneer je verbinding maakt vanaf een andere locatie.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Aan</translation>
 <translation id="7019153418965365059">Onbekende hostfout: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Externe ondersteuning</translation>
+<translation id="7026930240735156896">Volg de instructies om je computer in te stellen voor externe toegang</translation>
 <translation id="7038683108611689168">Help ons Chromoting te verbeteren door ons toestemming te geven gebruiksstatistieken en crashrapporten te verzamelen.</translation>
 <translation id="7067321367069083429">Scherm werkt als een touchscreen</translation>
 <translation id="7116737094673640201">Welkom bij Chrome Remote Desktop</translation>
diff --git a/remoting/resources/remoting_strings_no.xtb b/remoting/resources/remoting_strings_no.xtb
index beaa03b..4c26b91 100644
--- a/remoting/resources/remoting_strings_no.xtb
+++ b/remoting/resources/remoting_strings_no.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Den eksterne datamaskinen kunne ikke initialisere økten. Hvis problemet vedvarer, kan du prøve å konfigurere verten på nytt.</translation>
 <translation id="4068946408131579958">Alle tilkoblinger</translation>
 <translation id="409800995205263688">MERK: I henhold til lokale retningslinjer er tilkobling tillatt bare mellom datamaskiner i nettverket ditt.</translation>
+<translation id="4126409073460786861">Når konfigureringen er fullført, last inn denne siden på nytt, og du vil kunne bruke datamaskinen ved å velge enhet og skrive inn PIN-koden.</translation>
 <translation id="4145029455188493639">Logget på som <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Det mangler noen nødvendige komponenter. Kontrollér at du kjører den nyeste versjonen av programvaren, og prøv på nytt.</translation>
 <translation id="4156740505453712750">For å beskytte tilgangen til denne datamaskinen må du velge en PIN-kode bestående av <ph name="BOLD_START" />minst seks tall<ph name="BOLD_END" />. Denne PIN-koden kreves når man kobler til fra en annen posisjon.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Til</translation>
 <translation id="7019153418965365059">Ukjent vertsfeil: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Fjernhjelp</translation>
+<translation id="7026930240735156896">Følg instrukjonene for å konfigurere datamaskinen din for ekstern tilgang.</translation>
 <translation id="7038683108611689168">Hjelp oss med å gjøre Chromoting bedre ved å samle inn bruksstatistikk og programstopprapporter.</translation>
 <translation id="7067321367069083429">Skjermen fungerer som en berøringsskjerm</translation>
 <translation id="7116737094673640201">Velkommen til Chrome Eksternt skrivebord</translation>
diff --git a/remoting/resources/remoting_strings_pl.xtb b/remoting/resources/remoting_strings_pl.xtb
index e512c77..bb9f818 100644
--- a/remoting/resources/remoting_strings_pl.xtb
+++ b/remoting/resources/remoting_strings_pl.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Komputerowi zdalnemu nie udało się zainicjować sesji. Jeśli problem nie zniknie, spróbuj ponownie skonfigurować hosta.</translation>
 <translation id="4068946408131579958">Wszystkie połączenia</translation>
 <translation id="409800995205263688">UWAGA: ustawienia zasad zezwalają wyłącznie na połączenia między komputerami w Twojej sieci.</translation>
+<translation id="4126409073460786861">Po zakończeniu konfiguracji odśwież tę stronę. Gdy to zrobisz, dostęp do komputera będzie można uzyskiwać, wybierając urządzenie i wpisując kod PIN.</translation>
 <translation id="4145029455188493639">W tej chwili używasz konta <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Brak niektórych wymaganych komponentów. Upewnij się, że masz zainstalowaną najnowszą wersję oprogramowania, i spróbuj ponownie.</translation>
 <translation id="4156740505453712750">Aby zabezpieczyć dostęp do tego komputera, wybierz PIN złożony z <ph name="BOLD_START" />co najmniej sześciu cyfr<ph name="BOLD_END" />. Będzie on wymagany przy łączeniu się z innej lokalizacji.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Do</translation>
 <translation id="7019153418965365059">Nieznany błąd hosta: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Pomoc zdalna</translation>
+<translation id="7026930240735156896">Wykonaj te instrukcje, by skonfigurować komputer do dostępu zdalnego</translation>
 <translation id="7038683108611689168">Pomóż nam udoskonalić Chromoting, zezwalając na gromadzenie przez nas statystyk użytkowania i raportów o awariach.</translation>
 <translation id="7067321367069083429">Ekran działa jak ekran dotykowy</translation>
 <translation id="7116737094673640201">Witamy w Pulpicie zdalnym Chrome</translation>
diff --git a/remoting/resources/remoting_strings_pt-BR.xtb b/remoting/resources/remoting_strings_pt-BR.xtb
index 3f4131b..35aff9a 100644
--- a/remoting/resources/remoting_strings_pt-BR.xtb
+++ b/remoting/resources/remoting_strings_pt-BR.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">O computador remoto apresentou uma falha ao inicializar a sessão. Se o problema persistir, tente configurar o host novamente.</translation>
 <translation id="4068946408131579958">Todas as conexões</translation>
 <translation id="409800995205263688">OBSERVAÇÃO: as configurações da política permitem conexão apenas entre computadores em sua rede.</translation>
+<translation id="4126409073460786861">Depois de concluir a configuração, atualize esta página para poder acessar o computador escolhendo seu dispositivo e digitando o PIN</translation>
 <translation id="4145029455188493639">Conectado como <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Alguns componentes obrigatórios não foram encontrados. Certifique-se de que você esteja executando a última versão do software e tente novamente.</translation>
 <translation id="4156740505453712750">Para proteger o acesso a este computador, selecione um PIN de <ph name="BOLD_START" />pelo menos seis dígitos<ph name="BOLD_END" />. Este PIN será necessário para estabelecer conexão a partir de outro local.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Para</translation>
 <translation id="7019153418965365059">Erro de host não reconhecido: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Assistência remota</translation>
+<translation id="7026930240735156896">Siga as instruções para configurar seu computador para acesso remoto</translation>
 <translation id="7038683108611689168">Ajude-nos a melhorar o Chromoting por meio da coleta de estatísticas de uso e de relatórios de falhas.</translation>
 <translation id="7067321367069083429">A tela atua como uma touchscreen</translation>
 <translation id="7116737094673640201">Bem-vindo à Área de trabalho remota do Google Chrome</translation>
diff --git a/remoting/resources/remoting_strings_pt-PT.xtb b/remoting/resources/remoting_strings_pt-PT.xtb
index 97cd23d..a8a2df81 100644
--- a/remoting/resources/remoting_strings_pt-PT.xtb
+++ b/remoting/resources/remoting_strings_pt-PT.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">O computador remoto não conseguiu inicializar a sessão. Se o problema persistir, experimente configurar o anfitrião novamente.</translation>
 <translation id="4068946408131579958">Todas as ligações</translation>
 <translation id="409800995205263688">NOTA: as definições da política permitem ligações apenas entre computadores da sua rede.</translation>
+<translation id="4126409073460786861">Quando a configuração estiver concluída, atualize esta página para poder aceder ao computador ao escolher o seu dispositivo e introduzir o PIN.</translation>
 <translation id="4145029455188493639">Com sessão iniciada como <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Faltam alguns componentes necessários. Certifique-se de que tem a versão mais recente do software instalada e tente novamente.</translation>
 <translation id="4156740505453712750">Para proteger o acesso a este computador, escolha um PIN de <ph name="BOLD_START" />pelo menos seis dígitos<ph name="BOLD_END" />. Este PIN será necessário quando ligar a partir de outra localização.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Para</translation>
 <translation id="7019153418965365059">Erro de anfitrião não reconhecido: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Assistência Remota</translation>
+<translation id="7026930240735156896">Siga as instruções para configurar o computador para acesso remoto.</translation>
 <translation id="7038683108611689168">Ajude-nos a melhorar o Chromoting, permitindo-nos recolher estatísticas de utilização e relatórios de falhas.</translation>
 <translation id="7067321367069083429">O ecrã funciona como um ecrã tátil</translation>
 <translation id="7116737094673640201">Bem-vindo ao Ambiente de Trabalho Remoto do Chrome</translation>
diff --git a/remoting/resources/remoting_strings_ro.xtb b/remoting/resources/remoting_strings_ro.xtb
index d0655b6..9efc025b 100644
--- a/remoting/resources/remoting_strings_ro.xtb
+++ b/remoting/resources/remoting_strings_ro.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Computerul la distanță nu a putut să inițializeze sesiunea. Dacă problema persistă, încearcă să configurezi gazda din nou.</translation>
 <translation id="4068946408131579958">Toate conexiunile</translation>
 <translation id="409800995205263688">NOTĂ: setările politicii permit conexiuni numai între computerele din rețeaua dvs.</translation>
+<translation id="4126409073460786861">După ce ai terminat configurarea, actualizează pagina și vei putea accesa computerul dacă alegi dispozitivul și introduci codul PIN</translation>
 <translation id="4145029455188493639">Conectat(ă) ca <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Unele componente necesare lipsesc. Asigură-te că ai instalată cea mai recentă versiune a software-ului și încearcă din nou.</translation>
 <translation id="4156740505453712750">Pentru a proteja accesul la acest computer, alegeți un cod PIN format din <ph name="BOLD_START" />cel puțin șase cifre<ph name="BOLD_END" />. Acest cod PIN va fi necesar când vă conectați din altă locație.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">La</translation>
 <translation id="7019153418965365059">Eroare nerecunoscută a gazdei: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Asistență la distanță</translation>
+<translation id="7026930240735156896">Urmează instrucțiunile ca să configurezi computerul pentru accesul la distanță</translation>
 <translation id="7038683108611689168">Ajutați-ne să îmbunătățim Chromoting, permițându-ne să colectăm statistici de utilizare și rapoarte de blocare.</translation>
 <translation id="7067321367069083429">Ecranul funcționează ca un ecran tactil</translation>
 <translation id="7116737094673640201">Bun venit la Desktop la distanță Chrome</translation>
diff --git a/remoting/resources/remoting_strings_ru.xtb b/remoting/resources/remoting_strings_ru.xtb
index b36eb7c..40cfdb2 100644
--- a/remoting/resources/remoting_strings_ru.xtb
+++ b/remoting/resources/remoting_strings_ru.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Удаленному компьютеру не удалось выполнить инициализацию сеанса. Если проблема сохранится, попробуйте перенастроить хост.</translation>
 <translation id="4068946408131579958">Все подключения</translation>
 <translation id="409800995205263688">Примечание. В соответствии с настройками политики допускаются соединения между компьютерами только внутри локальной сети.</translation>
+<translation id="4126409073460786861">После завершения установки обновите страницу. Теперь вы сможете подключаться к компьютеру через другое устройство с помощью PIN-кода.</translation>
 <translation id="4145029455188493639">Выполнен вход через аккаунт <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Отсутствуют некоторые необходимые компоненты. Установите последнюю версию ПО и повторите попытку.</translation>
 <translation id="4156740505453712750">Чтобы защитить компьютер от несанкционированного доступа, выберите PIN-код, содержащий <ph name="BOLD_START" />не менее шести цифр<ph name="BOLD_END" />. Его необходимо будет ввести при удаленном подключении.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Кому</translation>
 <translation id="7019153418965365059">Неизвестная ошибка хоста: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Удаленная поддержка</translation>
+<translation id="7026930240735156896">Следуйте инструкциям, чтобы настроить удаленный доступ к компьютеру.</translation>
 <translation id="7038683108611689168">Разрешить Google собирать данные статистики использования и отчеты о сбоях для улучшения работы Пульта Chrome</translation>
 <translation id="7067321367069083429">Пользоваться экраном как сенсорным</translation>
 <translation id="7116737094673640201">Настройте Удаленный рабочий стол Chrome</translation>
diff --git a/remoting/resources/remoting_strings_sl.xtb b/remoting/resources/remoting_strings_sl.xtb
index 487e887..787d24e 100644
--- a/remoting/resources/remoting_strings_sl.xtb
+++ b/remoting/resources/remoting_strings_sl.xtb
@@ -134,6 +134,7 @@
 <translation id="405887016757208221">Oddaljeni računalnik ni inicializiral seje. Če se težava ponovi, poskusite znova konfigurirati gostitelja.</translation>
 <translation id="4068946408131579958">Vse povezave</translation>
 <translation id="409800995205263688">OPOMBA: Nastavitve na podlagi pravilnika dovoljujejo povezave samo med računalniki v vašem omrežju.</translation>
+<translation id="4126409073460786861">Po končani nastavitvi osvežite to stran in lahko boste dostopali do računalnika tako, da boste izbrali napravo in vnesli kodo PIN</translation>
 <translation id="4145029455188493639">Prijavljen kot <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Ni nekaterih zahtevanih delov. Preverite, ali imate najnovejšo različico programske opreme in poskusite znova.</translation>
 <translation id="4156740505453712750">Če želite zaščititi dostop do tega računalnika, izberite vsaj <ph name="BOLD_START" />šestmestni<ph name="BOLD_END" /> PIN. Ta bo zahtevan pri povezovanju z drugega mesta.</translation>
@@ -258,6 +259,7 @@
 <translation id="6998989275928107238">Za</translation>
 <translation id="7019153418965365059">Neprepoznana napaka gostitelja: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Oddaljena pomoč</translation>
+<translation id="7026930240735156896">Upoštevajte navodila za nastavitev računalnika za oddaljeni dostop</translation>
 <translation id="7038683108611689168">Pomagajte nam izboljšati Oddaljeno povezovanje s Chromom, tako da nam dovolite zbiranje statističnih podatkov o uporabi in poročil o zrušitvah.</translation>
 <translation id="7067321367069083429">Zaslon deluje kot zaslon na dotik</translation>
 <translation id="7116737094673640201">Pozdravljeni v Oddaljenem namizju za Chrome</translation>
diff --git a/remoting/resources/remoting_strings_sr.xtb b/remoting/resources/remoting_strings_sr.xtb
index 67ce16c..dbb24edf 100644
--- a/remoting/resources/remoting_strings_sr.xtb
+++ b/remoting/resources/remoting_strings_sr.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Удаљени рачунар није успео да покрене сесију. Ако се проблем настави, покушајте да поново конфигуришете хост.</translation>
 <translation id="4068946408131579958">Све везе</translation>
 <translation id="409800995205263688">НАПОМЕНА: Подешавања смерница дозвољавају везе само између рачунара у оквиру ваше мреже.</translation>
+<translation id="4126409073460786861">Када завршите подешавање, освежите страницу, па ћете моћи да приступате рачунару када одаберете уређај и унесете PIN</translation>
 <translation id="4145029455188493639">Пријављени сте као <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Недостају неке неопходне компоненте. Проверите да ли сте инсталирали најновију верзију софтвера и покушајте поново.</translation>
 <translation id="4156740505453712750">Да бисте заштитили приступ овом рачунару, изаберите PIN од <ph name="BOLD_START" />најмање шест цифара<ph name="BOLD_END" />. Тај PIN ће бити потребан при повезивању са друге локације.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">До</translation>
 <translation id="7019153418965365059">Непозната грешка у вези са хостом: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Даљинска помоћ</translation>
+<translation id="7026930240735156896">Пратите упутства да бисте подесили рачунар за даљински приступ</translation>
 <translation id="7038683108611689168">Помозите нам да побољшамо Chromoting тако што ћете нам дозволити да прикупљамо статистику коришћења и извештаје о отказивању.</translation>
 <translation id="7067321367069083429">Екран служи као додирни екран</translation>
 <translation id="7116737094673640201">Добро дошли у Chrome удаљени рачунар</translation>
diff --git a/remoting/resources/remoting_strings_sv.xtb b/remoting/resources/remoting_strings_sv.xtb
index 74bb5d4c..81c8b0b42 100644
--- a/remoting/resources/remoting_strings_sv.xtb
+++ b/remoting/resources/remoting_strings_sv.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Fjärrdatorn har misslyckats med att starta sessionen. Konfigurera värden på nytt om problemet kvarstår.</translation>
 <translation id="4068946408131579958">Alla anslutningar</translation>
 <translation id="409800995205263688">OBS! Enligt policyinställningarna tillåts endast anslutning mellan datorer i ditt nätverk.</translation>
+<translation id="4126409073460786861">När konfigureringen är klar uppdaterar du den här sidan. Sedan kan du ansluta till datorn genom att välja enheten och ange pinkoden</translation>
 <translation id="4145029455188493639">Inloggad som <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Vissa obligatoriska komponenter saknas. Kontrollera att du har installerat den senaste versionen av programvaran och försök igen.</translation>
 <translation id="4156740505453712750">Om du vill skydda åtkomsten till den här datorn väljer du en PIN-kod som består av <ph name="BOLD_START" />minst sex siffror<ph name="BOLD_END" />. PIN-koden krävs när du ansluter från en annan plats.</translation>
@@ -272,6 +273,7 @@
 <translation id="6998989275928107238">Till</translation>
 <translation id="7019153418965365059">Okänt värdfel: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Fjärrhjälp</translation>
+<translation id="7026930240735156896">Följ anvisningarna för att konfigurera datorn för fjärråtkomst</translation>
 <translation id="7038683108611689168">Hjälp oss att förbättra Chromoting genom att tillåta att vi samlar in användningsstatistik och felrapporter.</translation>
 <translation id="7067321367069083429">Skärmen används som pekskärm</translation>
 <translation id="7116737094673640201">Välkommen till Chrome Remote Desktop</translation>
diff --git a/remoting/resources/remoting_strings_sw.xtb b/remoting/resources/remoting_strings_sw.xtb
index e1de9101..6f2d3871 100644
--- a/remoting/resources/remoting_strings_sw.xtb
+++ b/remoting/resources/remoting_strings_sw.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Kompyuta ya mbali imeshindwa kuanzisha kipindi. Tatizo likiendelea tafadhali jaribu kuweka mipangilio ya seva pangishi tena.</translation>
 <translation id="4068946408131579958">Miunganisho yote</translation>
 <translation id="409800995205263688">DOKEZO: Mipangilio ya sera inakubali miunganisho kati ya kompyuta zilizo katika mtandao wako.</translation>
+<translation id="4126409073460786861">Baada ya kukamilisha shughuli ya kuweka mipangilio, onyesha upya ukurasa huu na utaweza kufikia kompyuta kwa kuchagua kifaa chako na kuweka PIN</translation>
 <translation id="4145029455188493639">Umeingia katika akaunti ukitumia <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Baadhi ya vipengele vinavyohitajika havipo. Tafadhali hakikisha kuwa umesakinisha toleo jipya la programu na ujaribu tena.</translation>
 <translation id="4156740505453712750">Ili ulinde ufikiaji kwenye kompyuta hii, tafadhali chagua PIN ya <ph name="BOLD_START" />angalau tarakimu sita<ph name="BOLD_END" />. PIN hii itahitajika utakapounganisha kutoka eneo jingine.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Hadi</translation>
 <translation id="7019153418965365059">Hitilafu ya seva pangishi isiyotambulika: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Usaidizi wa Mbali</translation>
+<translation id="7026930240735156896">Fuata maelekezo ya kuweka mipangilio ya kompyuta yako kwa ajili ya ufikiaji wa mbali</translation>
 <translation id="7038683108611689168">Tusaidie kuboresha Chromoting kwa kuturuhusu tukusanye takwimu za matumizi na ripoti za hitilafu.</translation>
 <translation id="7067321367069083429">Skrini inafanya kazi kama skrini ya kugusa</translation>
 <translation id="7116737094673640201">Karibu kwenye Programu ya Chrome ya Ufikiaji wa Kompyuta kutoka Mbali</translation>
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb
index 4626edb..5e564862 100644
--- a/remoting/resources/remoting_strings_ta.xtb
+++ b/remoting/resources/remoting_strings_ta.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">தொலைநிலைக் கணினியால் அமர்வைத் தொடங்க முடியவில்லை. சிக்கல் நீடித்தால் ஹோஸ்ட்டை மீண்டும் உள்ளமைக்க முயலவும்.</translation>
 <translation id="4068946408131579958">எல்லா இணைப்புகளும்</translation>
 <translation id="409800995205263688">குறிப்பு: உங்கள் பிணையத்தில் உள்ள கணினிகளுக்கு இடையில் மட்டுமே இணைப்புகளை கொள்கை அமைப்புகள் அனுமதிக்கின்றன.</translation>
+<translation id="4126409073460786861">அமைவு முடிந்ததும், இந்தப் பக்கத்தைப் புதுப்பிக்கவும். அதன் பின்னர், உங்கள் சாதனத்தைத் தேர்வுசெய்து, பின் எண்ணை உள்ளிட்டு, கம்ப்யூட்டரை அணுகலாம்</translation>
 <translation id="4145029455188493639">உள்நுழைந்துள்ள முகவரி: <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">தேவையான சில உறுப்புகள் காணவில்லை. மென்பொருளின் சமீபத்திய பதிப்பை நிறுவியுள்ளீர்கள் என்பதை உறுதிசெய்து, மீண்டும் முயற்சிக்கவும்.</translation>
 <translation id="4156740505453712750">இந்தக் கணினிக்கான அணுகலைத் தடுக்க, <ph name="BOLD_START" />குறைந்தபட்சம் ஆறு இலக்கங்கள்<ph name="BOLD_END" /> கொண்ட PIN ஐத் தேர்வுசெய்க. வேறு இருப்பிடத்திலிருந்து இணைக்கும்போது இந்த PIN தேவைப்படும்.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">பெறுநர்:</translation>
 <translation id="7019153418965365059">அறியப்படாத ஹோஸ்ட் பிழை: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">தொலைநிலை உதவி</translation>
+<translation id="7026930240735156896">தொலைநிலை அணுகலைப் பெற உங்கள் கம்ப்யூட்டரை அமைப்பதற்கு, வழிமுறைகளைப் பின்பற்றவும்</translation>
 <translation id="7038683108611689168">பயன்பாட்டு  புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் சேகரிக்க எங்களை அனுமதிப்பதன் மூலம் குரோமோட்டிங்கை மேம்படுத்த உதவவும்.</translation>
 <translation id="7067321367069083429">டச் ஸ்கிரீன் போல திரை செயல்படும்</translation>
 <translation id="7116737094673640201">Chrome தொலைநிலை டெஸ்க்டாப்பிற்கு வரவேற்கிறோம்</translation>
diff --git a/remoting/resources/remoting_strings_th.xtb b/remoting/resources/remoting_strings_th.xtb
index 1270e01..63c6cc8 100644
--- a/remoting/resources/remoting_strings_th.xtb
+++ b/remoting/resources/remoting_strings_th.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">คอมพิวเตอร์ระยะไกลไม่สามารถเริ่มต้นเซสชัน หากปัญหายังคงอยู่ โปรดลองกำหนดค่าโฮสต์อีกครั้ง</translation>
 <translation id="4068946408131579958">การเชื่อมต่อทั้งหมด</translation>
 <translation id="409800995205263688">หมายเหตุ: การตั้งค่านโยบายอนุญาตเฉพาะการเชื่อมต่อระหว่างคอมพิวเตอร์ภายในเครือข่ายของคุณเท่านั้น</translation>
+<translation id="4126409073460786861">หลังจากตั้งค่าเสร็จ ให้รีเฟรชหน้านี้ แล้วคุณจะเข้าถึงคอมพิวเตอร์ได้โดยเลือกอุปกรณ์ที่คุณใช้และป้อน PIN</translation>
 <translation id="4145029455188493639">ลงชื่อเข้าใช้ด้วย <ph name="EMAIL_ADDRESS" /></translation>
 <translation id="4155497795971509630">คอมโพเนนต์ที่จำเป็นบางอย่างขาดหายไป โปรดตรวจสอบว่าคุณได้ติดตั้งซอฟต์แวร์เวอร์ชันล่าสุดและลองอีกครั้ง</translation>
 <translation id="4156740505453712750">หากต้องการป้องกันการเข้าถึงคอมพิวเตอร์เครื่องนี้ โปรดเลือก PIN <ph name="BOLD_START" />อย่างน้อยหกหลัก<ph name="BOLD_END" /> โดยจะต้องป้อน PIN นี้เมื่อเชื่อมต่อจากตำแหน่งอื่น</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">ถึง</translation>
 <translation id="7019153418965365059">ข้อผิดพลาดของโฮสต์ที่ไม่รู้จัก: <ph name="HOST_OFFLINE_REASON" /></translation>
 <translation id="701976023053394610">ความช่วยเหลือจากระยะไกล</translation>
+<translation id="7026930240735156896">ทำตามวิธีการเพื่อตั้งค่าคอมพิวเตอร์สำหรับการเข้าถึงระยะไกล</translation>
 <translation id="7038683108611689168">ช่วยเราปรับปรุง Chromoting ให้ดีขึ้นด้วยการอนุญาตให้เรารวบรวมสถิติการใช้งานและรายงานข้อขัดข้อง</translation>
 <translation id="7067321367069083429">หน้าจอทำหน้าที่เหมือนหน้าจอสัมผัส</translation>
 <translation id="7116737094673640201">ยินดีต้อนรับสู่ Chrome Remote Desktop</translation>
diff --git a/remoting/resources/remoting_strings_tr.xtb b/remoting/resources/remoting_strings_tr.xtb
index b8024a1..67f8010 100644
--- a/remoting/resources/remoting_strings_tr.xtb
+++ b/remoting/resources/remoting_strings_tr.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Uzak bilgisayar, oturumu ilk kullanıma hazırlayamadı. Sorun devam ederse lütfen ana makineyi tekrar yapılandırmayı deneyin.</translation>
 <translation id="4068946408131579958">Tüm bağlantılar</translation>
 <translation id="409800995205263688">NOT: Politika ayarları, yalnızca ağınızdaki bilgisayarlar arasındaki bağlantılara izin veriyor.</translation>
+<translation id="4126409073460786861">Kurulum tamamlandıktan sonra bu sayfayı yenileyin. Ardından cihazınızı seçip PIN'i girerek bilgisayara erişebilirsiniz</translation>
 <translation id="4145029455188493639"><ph name="EMAIL_ADDRESS" /> olarak oturum açtınız.</translation>
 <translation id="4155497795971509630">Bazı gerekli bileşenler eksik. Lütfen yazılımın en son sürümünü yüklediğinizden emin olun ve tekrar deneyin.</translation>
 <translation id="4156740505453712750">Bu bilgisayara erişimi korumak için lütfen <ph name="BOLD_START" />en az altı basamaklı<ph name="BOLD_END" /> bir PIN seçin. Başka bir yerden bağlanırken bu PIN gerekecektir.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Nereye</translation>
 <translation id="7019153418965365059">Tanınmayan ana makine hatası: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Uzaktan Yardım</translation>
+<translation id="7026930240735156896">Bilgisayarınıza uzaktan erişimi kurmak için talimatları uygulayın</translation>
 <translation id="7038683108611689168">Kullanım istatistiklerini ve kilitlenme raporlarını toplamamıza izin vererek Chromoting'i daha iyi hale getirmemize yardımcı olun.</translation>
 <translation id="7067321367069083429">Ekran dokunmatik ekran gibi çalışır</translation>
 <translation id="7116737094673640201">Chrome Chrome Uzaktan Masaüstü'ne hoş geldiniz</translation>
diff --git a/remoting/resources/remoting_strings_uk.xtb b/remoting/resources/remoting_strings_uk.xtb
index d70a94e6..6c34a7e 100644
--- a/remoting/resources/remoting_strings_uk.xtb
+++ b/remoting/resources/remoting_strings_uk.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Віддаленому комп’ютеру не вдалося почати сеанс. Якщо проблема не зникне, налаштуйте хост ще раз.</translation>
 <translation id="4068946408131579958">Усі з’єднання</translation>
 <translation id="409800995205263688">ПРИМІТКА. Налаштовані правила дозволяють з’єднуватися лише з комп’ютерами у вашій мережі.</translation>
+<translation id="4126409073460786861">Коли налаштування завершиться, оновіть сторінку. Після цього ви зможете отримувати доступ до комп’ютера, вибравши пристрій і ввівши PIN-код.</translation>
 <translation id="4145029455188493639">Ви ввійшли як <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Немає деяких обов’язкових компонентів. Переконайтеся, що встановлено найновішу версію програмного забезпечення, і повторіть спробу.</translation>
 <translation id="4156740505453712750">Щоб захистити доступ до цього комп’ютера, виберіть PIN-код із <ph name="BOLD_START" />принаймні шести символів<ph name="BOLD_END" />. Цей PIN-код потрібно вводити, щоб під’єднатися з іншого місця.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Кому</translation>
 <translation id="7019153418965365059">Невідома помилка хосту: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Віддалена допомога</translation>
+<translation id="7026930240735156896">Виконайте вказівки, щоб налаштувати комп’ютер для віддаленого доступу</translation>
 <translation id="7038683108611689168">Допоможіть нам покращити програму Віддалений доступ ОС Chrome, дозволивши збирати статистику використання та звіти про аварійне завершення роботи.</translation>
 <translation id="7067321367069083429">Екран працює як сенсорний екран</translation>
 <translation id="7116737094673640201">Вітаємо у Віддаленому керуванні Chrome</translation>
diff --git a/remoting/resources/remoting_strings_vi.xtb b/remoting/resources/remoting_strings_vi.xtb
index b6da91ba..082166b 100644
--- a/remoting/resources/remoting_strings_vi.xtb
+++ b/remoting/resources/remoting_strings_vi.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">Máy tính từ xa đã không khởi tạo được phiên. Nếu sự cố vẫn tiếp diễn, vui lòng thử định cấu hình lại máy chủ.</translation>
 <translation id="4068946408131579958">Tất cả kết nối</translation>
 <translation id="409800995205263688">LƯU Ý: Cài đặt chính sách chỉ cho phép kết nối giữa các máy tính trong mạng của bạn.</translation>
+<translation id="4126409073460786861">Sau khi thiết lập xong máy tính, bạn phải làm mới trang này thì mới có thể truy cập vào máy tính bằng cách chọn thiết bị của bạn và nhập mã PIN</translation>
 <translation id="4145029455188493639">Đã đăng nhập bằng địa chỉ <ph name="EMAIL_ADDRESS" />.</translation>
 <translation id="4155497795971509630">Thiếu một số thành phần bắt buộc. Vui lòng đảm bảo rằng bạn đã cài đặt phiên bản mới nhất của phần mềm và thử lại.</translation>
 <translation id="4156740505453712750">Để bảo vệ quyền truy cập vào máy tính này, vui lòng chọn một mã PIN <ph name="BOLD_START" />ít nhất sáu chữ số<ph name="BOLD_END" />. Mã PIN này sẽ được yêu cầu khi kết nối từ một vị trí khác.</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">Đến</translation>
 <translation id="7019153418965365059">Lỗi máy chủ không xác định: <ph name="HOST_OFFLINE_REASON" />.</translation>
 <translation id="701976023053394610">Hỗ trợ từ xa</translation>
+<translation id="7026930240735156896">Hãy làm theo hướng dẫn thiết lập máy tính của bạn để truy cập từ xa</translation>
 <translation id="7038683108611689168">Giúp chúng tôi cải thiện Kết nối từ xa trên Chrome bằng cách cho phép chúng tôi thu thập số liệu thống kê sử dụng và báo cáo sự cố.</translation>
 <translation id="7067321367069083429">Màn hình đóng vai trò như màn hình cảm ứng</translation>
 <translation id="7116737094673640201">Chào mừng bạn đến với Chrome Remote Desktop</translation>
diff --git a/remoting/resources/remoting_strings_zh-TW.xtb b/remoting/resources/remoting_strings_zh-TW.xtb
index 550fa44..6b4dfce 100644
--- a/remoting/resources/remoting_strings_zh-TW.xtb
+++ b/remoting/resources/remoting_strings_zh-TW.xtb
@@ -136,6 +136,7 @@
 <translation id="405887016757208221">遠端電腦無法初始化工作階段。如果問題持續發生,請嘗試重新設定主機。</translation>
 <translation id="4068946408131579958">所有連線</translation>
 <translation id="409800995205263688">注意:政策設定僅允許你網路中的電腦相互連線。</translation>
+<translation id="4126409073460786861">設定完成後請重新整理本頁面。之後你只要選擇自己的裝置並輸入 PIN 碼,就可以存取這部電腦</translation>
 <translation id="4145029455188493639">目前登入的帳戶是 <ph name="EMAIL_ADDRESS" />。</translation>
 <translation id="4155497795971509630">找不到部分必要元件。請確認您已安裝最新版本的軟體,然後再試一次。</translation>
 <translation id="4156740505453712750">如要保護這台電腦,避免不明人士入侵,請選擇一個<ph name="BOLD_START" />至少 6 位數<ph name="BOLD_END" />的 PIN。當使用者從其他位置連線時,必須先輸入這個 PIN 驗證身分。</translation>
@@ -270,6 +271,7 @@
 <translation id="6998989275928107238">收件者</translation>
 <translation id="7019153418965365059">不明主機錯誤:<ph name="HOST_OFFLINE_REASON" />。</translation>
 <translation id="701976023053394610">遠端協助</translation>
+<translation id="7026930240735156896">請按照操作說明設定電腦,以便執行遠端存取作業</translation>
 <translation id="7038683108611689168">允許我們收集使用統計資料和當機報告,協助我們改善 Chromoting。</translation>
 <translation id="7067321367069083429">把螢幕當作觸控螢幕使用</translation>
 <translation id="7116737094673640201">歡迎使用 Chrome 遠端桌面</translation>
diff --git a/remoting/test/chromoting_test_driver.cc b/remoting/test/chromoting_test_driver.cc
index f5828c13..6aed446 100644
--- a/remoting/test/chromoting_test_driver.cc
+++ b/remoting/test/chromoting_test_driver.cc
@@ -9,7 +9,7 @@
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/launcher/unit_test_launcher.h"
 #include "base/test/test_suite.h"
 #include "base/test/test_switches.h"
diff --git a/remoting/test/protocol_perftest.cc b/remoting/test/protocol_perftest.cc
index 3c834b3..3b986f0 100644
--- a/remoting/test/protocol_perftest.cc
+++ b/remoting/test/protocol_perftest.cc
@@ -14,7 +14,7 @@
 #include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "jingle/glue/thread_wrapper.h"
diff --git a/rlz/lib/financial_ping.cc b/rlz/lib/financial_ping.cc
index 645b3bc..13b6775 100644
--- a/rlz/lib/financial_ping.cc
+++ b/rlz/lib/financial_ping.cc
@@ -19,7 +19,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/sandbox/win/src/process_mitigations.cc b/sandbox/win/src/process_mitigations.cc
index b9be8a4..0f38be11 100644
--- a/sandbox/win/src/process_mitigations.cc
+++ b/sandbox/win/src/process_mitigations.cc
@@ -77,7 +77,16 @@
 
     // Check for SetDefaultDllDirectories since it requires KB2533623.
     if (set_default_dll_directories) {
-      if (!set_default_dll_directories(LOAD_LIBRARY_SEARCH_DEFAULT_DIRS) &&
+#if defined(COMPONENT_BUILD)
+      const DWORD directory_flags = LOAD_LIBRARY_SEARCH_DEFAULT_DIRS;
+#else
+      // In a non-component build, all DLLs will be loaded manually, or via
+      // manifest definition, so these flags can be stronger. This prevents DLL
+      // planting in the application directory.
+      const DWORD directory_flags =
+          LOAD_LIBRARY_SEARCH_SYSTEM32 | LOAD_LIBRARY_SEARCH_USER_DIRS;
+#endif
+      if (!set_default_dll_directories(directory_flags) &&
           ERROR_ACCESS_DENIED != ::GetLastError()) {
         return false;
       }
diff --git a/sandbox/win/src/security_level.h b/sandbox/win/src/security_level.h
index b238ad00..1036b34 100644
--- a/sandbox/win/src/security_level.h
+++ b/sandbox/win/src/security_level.h
@@ -197,10 +197,15 @@
 // PROCESS_CREATION_MITIGATION_POLICY_STRICT_HANDLE_CHECKS_ALWAYS_ON.
 const MitigationFlags MITIGATION_STRICT_HANDLE_CHECKS = 0x00000100;
 
-// Sets the DLL search order to LOAD_LIBRARY_SEARCH_DEFAULT_DIRS. Additional
-// directories can be added via the Windows AddDllDirectory() function.
-// http://msdn.microsoft.com/en-us/library/windows/desktop/hh310515
-// Must be enabled after startup.
+// Strengthens the DLL search order. See
+// http://msdn.microsoft.com/en-us/library/windows/desktop/hh310515. In a
+// component build - sets this to LOAD_LIBRARY_SEARCH_DEFAULT_DIRS allowing
+// additional directories to be added via Windows AddDllDirectory() function,
+// but preserving current load order. In a non-component build, all DLLs should
+// be loaded manually, so strenthen to LOAD_LIBRARY_SEARCH_SYSTEM32 |
+// LOAD_LIBRARY_SEARCH_USER_DIRS, removing LOAD_LIBRARY_SEARCH_APPLICATION_DIR,
+// preventing DLLs being implicitly loaded from the application path. Must be
+// enabled after startup.
 const MitigationFlags MITIGATION_DLL_SEARCH_ORDER = 0x00000200;
 
 // Changes the mandatory integrity level policy on the current process' token
diff --git a/services/catalog/catalog.cc b/services/catalog/catalog.cc
index c59001e..26f458f 100644
--- a/services/catalog/catalog.cc
+++ b/services/catalog/catalog.cc
@@ -19,7 +19,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/services/filesystem/directory_impl.h"
 #include "components/services/filesystem/lock_table.h"
 #include "components/services/filesystem/public/interfaces/types.mojom.h"
diff --git a/services/device/hid/hid_connection_mac.cc b/services/device/hid/hid_connection_mac.cc
index 4ee545f..3fa70d58d 100644
--- a/services/device/hid/hid_connection_mac.cc
+++ b/services/device/hid/hid_connection_mac.cc
@@ -11,7 +11,7 @@
 #include "base/numerics/safe_math.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
 #include "services/device/hid/hid_connection_mac.h"
diff --git a/services/device/hid/hid_service.h b/services/device/hid/hid_service.h
index 257857ea..f586904 100644
--- a/services/device/hid/hid_service.h
+++ b/services/device/hid/hid_service.h
@@ -17,7 +17,7 @@
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_checker.h"
 #include "services/device/hid/hid_device_info.h"
 #include "services/device/public/mojom/hid.mojom.h"
diff --git a/services/device/hid/hid_service_linux.cc b/services/device/hid/hid_service_linux.cc
index 82c36af7..96dba64a 100644
--- a/services/device/hid/hid_service_linux.cc
+++ b/services/device/hid/hid_service_linux.cc
@@ -23,7 +23,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/services/device/hid/hid_service_mac.cc b/services/device/hid/hid_service_mac.cc
index 5771ff2..b7385aa 100644
--- a/services/device/hid/hid_service_mac.cc
+++ b/services/device/hid/hid_service_mac.cc
@@ -19,7 +19,7 @@
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
diff --git a/services/device/hid/hid_service_win.cc b/services/device/hid/hid_service_win.cc
index e914a9c..f80f6a5 100644
--- a/services/device/hid/hid_service_win.cc
+++ b/services/device/hid/hid_service_win.cc
@@ -22,7 +22,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/strings/sys_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "components/device_event_log/device_event_log.h"
 #include "services/device/hid/hid_connection_win.h"
diff --git a/services/device/serial/serial_device_enumerator_impl.cc b/services/device/serial/serial_device_enumerator_impl.cc
index 433c1c5b..5a4b37b 100644
--- a/services/device/serial/serial_device_enumerator_impl.cc
+++ b/services/device/serial/serial_device_enumerator_impl.cc
@@ -5,7 +5,7 @@
 #include "services/device/serial/serial_device_enumerator_impl.h"
 
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
 namespace device {
diff --git a/services/device/serial/serial_io_handler_impl.cc b/services/device/serial/serial_io_handler_impl.cc
index c848c8f..e02a920e 100644
--- a/services/device/serial/serial_io_handler_impl.cc
+++ b/services/device/serial/serial_io_handler_impl.cc
@@ -5,7 +5,7 @@
 #include "services/device/serial/serial_io_handler_impl.h"
 
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "device/serial/buffer.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 
diff --git a/services/file/file_service.cc b/services/file/file_service.cc
index 3caf20cd..2c583b6 100644
--- a/services/file/file_service.cc
+++ b/services/file/file_service.cc
@@ -6,7 +6,7 @@
 
 #include "base/bind.h"
 #include "base/memory/weak_ptr.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "components/services/filesystem/lock_table.h"
 #include "components/services/leveldb/leveldb_service_impl.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h
index cb9d0c35..862931ee 100644
--- a/services/identity/public/cpp/identity_manager.h
+++ b/services/identity/public/cpp/identity_manager.h
@@ -37,7 +37,6 @@
 // Necessary to declare these classes as friends.
 class ArcSupportHostTest;
 class MultiProfileDownloadNotificationTest;
-class ProfileSyncServiceHarness;
 
 namespace identity {
 
@@ -214,7 +213,6 @@
                                        IdentityManager* identity_manager,
                                        const std::string& email);
   friend MultiProfileDownloadNotificationTest;
-  friend ProfileSyncServiceHarness;
   friend file_manager::MultiProfileFilesAppBrowserTest;
 
   // These clients needs to call SetPrimaryAccountSynchronously().
diff --git a/services/metrics/public/cpp/ukm_recorder.h b/services/metrics/public/cpp/ukm_recorder.h
index 7d1662a0..fc850621 100644
--- a/services/metrics/public/cpp/ukm_recorder.h
+++ b/services/metrics/public/cpp/ukm_recorder.h
@@ -56,12 +56,6 @@
 class UkmRecorderInterface;
 }  // namespace metrics
 
-namespace media {
-class MediaMetricsProvider;
-class VideoDecodePerfHistory;
-class WatchTimeRecorder;
-}  // namespace media
-
 namespace translate {
 class TranslateRankerImpl;
 }  // namespace translate
@@ -118,9 +112,6 @@
   friend download::DownloadUkmHelper;
   friend internal::SourceUrlRecorderWebContentsObserver;
   friend internal::SourceUrlRecorderWebStateObserver;
-  friend media::MediaMetricsProvider;
-  friend media::VideoDecodePerfHistory;
-  friend media::WatchTimeRecorder;
   friend metrics::UkmRecorderInterface;
   friend password_manager::PasswordManagerMetricsRecorder;
   friend payments::JourneyLogger;
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index aaf4e64f..8852fd1 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -62,6 +62,18 @@
     "network_service_network_delegate.h",
     "network_usage_accumulator.cc",
     "network_usage_accumulator.h",
+    "p2p/socket.cc",
+    "p2p/socket.h",
+    "p2p/socket_manager.cc",
+    "p2p/socket_manager.h",
+    "p2p/socket_tcp.cc",
+    "p2p/socket_tcp.h",
+    "p2p/socket_tcp_server.cc",
+    "p2p/socket_tcp_server.h",
+    "p2p/socket_throttler.cc",
+    "p2p/socket_throttler.h",
+    "p2p/socket_udp.cc",
+    "p2p/socket_udp.h",
     "proxy_config_service_mojo.cc",
     "proxy_config_service_mojo.h",
     "proxy_lookup_request.cc",
@@ -150,6 +162,7 @@
     "//components/network_session_configurator/common",
     "//components/os_crypt",
     "//components/prefs",
+    "//jingle:jingle_fake_socket",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
     "//net",
@@ -159,6 +172,10 @@
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/mojom",
     "//services/service_manager/sandbox:sandbox",
+    "//third_party/webrtc/media:rtc_media_base",
+    "//third_party/webrtc/rtc_base",
+    "//third_party/webrtc_overrides",
+    "//third_party/webrtc_overrides:init_webrtc",
     "//url",
   ]
 
@@ -220,6 +237,11 @@
     "network_quality_estimator_manager_unittest.cc",
     "network_service_unittest.cc",
     "network_usage_accumulator_unittest.cc",
+    "p2p/socket_tcp_server_unittest.cc",
+    "p2p/socket_tcp_unittest.cc",
+    "p2p/socket_test_utils.cc",
+    "p2p/socket_test_utils.h",
+    "p2p/socket_udp_unittest.cc",
     "proxy_config_service_mojo_unittest.cc",
     "proxy_resolving_client_socket_unittest.cc",
     "proxy_resolving_socket_mojo_unittest.cc",
@@ -263,6 +285,7 @@
     "//base",
     "//components/certificate_transparency",
     "//components/network_session_configurator/browser",
+    "//jingle:jingle_fake_socket",
     "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
@@ -285,6 +308,8 @@
     "mojo_socket_test_util.h",
     "test/test_data_pipe_getter.cc",
     "test/test_data_pipe_getter.h",
+    "test/test_network_connection_tracker.cc",
+    "test/test_network_connection_tracker.h",
     "test/test_network_context.h",
     "test/test_network_service_client.cc",
     "test/test_network_service_client.h",
diff --git a/services/network/cookie_manager_unittest.cc b/services/network/cookie_manager_unittest.cc
index b4957e3..22110507 100644
--- a/services/network/cookie_manager_unittest.cc
+++ b/services/network/cookie_manager_unittest.cc
@@ -11,8 +11,8 @@
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
diff --git a/services/network/cross_origin_read_blocking.cc b/services/network/cross_origin_read_blocking.cc
index 895d0d7..242b3c4 100644
--- a/services/network/cross_origin_read_blocking.cc
+++ b/services/network/cross_origin_read_blocking.cc
@@ -153,19 +153,17 @@
   return CrossOriginReadBlocking::kYes;
 }
 
-// Headers from
-// https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name.
+// Removes headers that should be blocked in cross-origin case.
 //
-// Note that XSDB doesn't block responses allowed through CORS - this means
+// Note that corbSanitizedResponse in https://fetch.spec.whatwg.org/#main-fetch
+// has an empty list of headers, but the code below doesn't remove all the
+// headers for improved user experience - for better error messages for CORS.
+// See also https://github.com/whatwg/fetch/pull/686#issuecomment-383711732 and
+// the http/tests/xmlhttprequest/origin-exact-matching/07.html layout test.
+//
+// Note that CORB doesn't block responses allowed through CORS - this means
 // that the list of allowed headers below doesn't have to consider header
 // names listed in the Access-Control-Expose-Headers header.
-const char* const kCorsSafelistedHeaders[] = {
-    "cache-control", "content-language", "content-type",
-    "expires",       "last-modified",    "pragma",
-};
-
-// Removes headers that should be blocked in cross-origin case.
-// See https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name.
 void BlockResponseHeaders(
     const scoped_refptr<net::HttpResponseHeaders>& headers) {
   DCHECK(headers);
@@ -186,15 +184,10 @@
       continue;
     }
 
-    // Remove all other headers (but note the final exclusion below).
+    // Remove all other headers.
     names_of_headers_to_remove.insert(base::ToLowerASCII(name));
   }
 
-  // Exclude from removals headers from
-  // https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name.
-  for (const char* header : kCorsSafelistedHeaders)
-    names_of_headers_to_remove.erase(header);
-
   headers->RemoveHeaders(names_of_headers_to_remove);
 }
 
@@ -445,14 +438,6 @@
 }
 
 // static
-std::vector<std::string>
-CrossOriginReadBlocking::GetCorsSafelistedHeadersForTesting() {
-  return std::vector<std::string>(
-      kCorsSafelistedHeaders,
-      kCorsSafelistedHeaders + arraysize(kCorsSafelistedHeaders));
-}
-
-// static
 void CrossOriginReadBlocking::LogAction(Action action) {
   UMA_HISTOGRAM_ENUMERATION("SiteIsolation.XSD.Browser.Action", action);
 }
diff --git a/services/network/cross_origin_read_blocking.h b/services/network/cross_origin_read_blocking.h
index ad2e966e..b2fc7ea 100644
--- a/services/network/cross_origin_read_blocking.h
+++ b/services/network/cross_origin_read_blocking.h
@@ -161,14 +161,6 @@
   static void SanitizeBlockedResponse(
       const scoped_refptr<network::ResourceResponse>& response);
 
-  // Returns explicitly named headers from
-  // https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name.
-  //
-  // Note that CORB doesn't block responses allowed through CORS - this means
-  // that the list of allowed headers below doesn't have to consider header
-  // names listed in the Access-Control-Expose-Headers header.
-  static std::vector<std::string> GetCorsSafelistedHeadersForTesting();
-
   // This enum backs a histogram, so do not change the order of entries or
   // remove entries. When adding new entries update |kMaxValue| and enums.xml
   // (see the SiteIsolationResponseAction enum).
diff --git a/services/network/cross_origin_read_blocking_explainer.md b/services/network/cross_origin_read_blocking_explainer.md
index 8b5e896..b40e1ab5 100644
--- a/services/network/cross_origin_read_blocking_explainer.md
+++ b/services/network/cross_origin_read_blocking_explainer.md
@@ -77,10 +77,10 @@
 When CORB decides that a response needs to be CORB-protected, the response is
 modified as follows:
 * The response body is replaced with an empty body.
-* The response headers are filtered down to the following ones
-  (i.e. all other response headers are removed from the response):
-  - [CORS safelisted response headers](https://fetch.spec.whatwg.org/#cors-safelisted-response-header-name)
-  - [CORS response headers](https://fetch.spec.whatwg.org/#http-responses)
+* The response headers are removed.
+
+> [lukasza@chromium.org] Chromium currently retains Access-Control-\* headers
+> (this helps generate better error messages for CORS).
 
 To be effective against speculative side-channel attacks, CORB blocking must
 take place before the response reaches the process hosting the cross-origin
diff --git a/services/network/mojo_net_log.cc b/services/network/mojo_net_log.cc
index d62208d..e3b8c8f4e 100644
--- a/services/network/mojo_net_log.cc
+++ b/services/network/mojo_net_log.cc
@@ -9,8 +9,8 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/values.h"
 #include "net/log/file_net_log_observer.h"
 #include "net/log/net_log_util.h"
@@ -29,19 +29,14 @@
                                           base::OnceClosure());
 }
 
-void MojoNetLog::ProcessCommandLine(const base::CommandLine& command_line) {
-  if (!command_line.HasSwitch(switches::kLogNetLog))
-    return;
-
-  base::FilePath log_path =
-      command_line.GetSwitchValuePath(switches::kLogNetLog);
-
+void MojoNetLog::ObserveFileWithConstants(base::File file,
+                                          base::Value constants) {
   // TODO(eroman): Should get capture mode from the command line.
   net::NetLogCaptureMode capture_mode =
       net::NetLogCaptureMode::IncludeCookiesAndCredentials();
 
-  file_net_log_observer_ = net::FileNetLogObserver::CreateUnbounded(
-      log_path, nullptr /* constants */);
+  file_net_log_observer_ = net::FileNetLogObserver::CreateUnboundedPreExisting(
+      std::move(file), std::make_unique<base::Value>(std::move(constants)));
   file_net_log_observer_->StartObserving(this, capture_mode);
 }
 
diff --git a/services/network/mojo_net_log.h b/services/network/mojo_net_log.h
index 14b37371..14d3ba4d 100644
--- a/services/network/mojo_net_log.h
+++ b/services/network/mojo_net_log.h
@@ -12,10 +12,6 @@
 #include "net/log/net_log.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 
-namespace base {
-class CommandLine;
-}  // namespace base
-
 namespace net {
 class FileNetLogObserver;
 }  // namespace net
@@ -35,7 +31,7 @@
 
   // If specified by the command line, stream network events (NetLog) to a
   // file on disk. This will last for the duration of the process.
-  void ProcessCommandLine(const base::CommandLine& command_line);
+  void ObserveFileWithConstants(base::File file, base::Value constants);
 
  private:
   std::unique_ptr<net::FileNetLogObserver> file_net_log_observer_;
diff --git a/services/network/network_context.cc b/services/network/network_context.cc
index 517152c..5de6671 100644
--- a/services/network/network_context.cc
+++ b/services/network/network_context.cc
@@ -18,8 +18,8 @@
 #include "base/sequenced_task_runner.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "build/build_config.h"
 #include "components/certificate_transparency/chrome_ct_policy_enforcer.h"
 #include "components/certificate_transparency/chrome_require_ct_delegate.h"
@@ -72,6 +72,7 @@
 #include "services/network/mojo_net_log.h"
 #include "services/network/network_service.h"
 #include "services/network/network_service_network_delegate.h"
+#include "services/network/p2p/socket_manager.h"
 #include "services/network/proxy_config_service_mojo.h"
 #include "services/network/proxy_lookup_request.h"
 #include "services/network/proxy_resolving_socket_factory_mojo.h"
@@ -879,6 +880,20 @@
       base::saturated_cast<int32_t>(num_streams), request_info);
 }
 
+void NetworkContext::CreateP2PSocketManager(
+    mojom::P2PTrustedSocketManagerClientPtr client,
+    mojom::P2PTrustedSocketManagerRequest trusted_socket_manager,
+    mojom::P2PSocketManagerRequest socket_manager_request) {
+  std::unique_ptr<P2PSocketManager> socket_manager =
+      std::make_unique<P2PSocketManager>(
+          std::move(client), std::move(trusted_socket_manager),
+          std::move(socket_manager_request),
+          base::Bind(&NetworkContext::DestroySocketManager,
+                     base::Unretained(this)),
+          url_request_context_);
+  socket_managers_[socket_manager.get()] = std::move(socket_manager);
+}
+
 void NetworkContext::ResetURLLoaderFactories() {
   for (const auto& factory : url_loader_factories_)
     factory->ClearBindings();
@@ -1295,4 +1310,10 @@
   return original_url.ReplaceComponents(replacements);
 }
 
+void NetworkContext::DestroySocketManager(P2PSocketManager* socket_manager) {
+  auto iter = socket_managers_.find(socket_manager);
+  DCHECK(iter != socket_managers_.end());
+  socket_managers_.erase(iter);
+}
+
 }  // namespace network
diff --git a/services/network/network_context.h b/services/network/network_context.h
index a134f845..e44cb4fe 100644
--- a/services/network/network_context.h
+++ b/services/network/network_context.h
@@ -14,6 +14,7 @@
 
 #include "base/callback.h"
 #include "base/component_export.h"
+#include "base/containers/flat_map.h"
 #include "base/containers/unique_ptr_adapters.h"
 #include "base/files/file.h"
 #include "base/macros.h"
@@ -56,6 +57,7 @@
 class CookieManager;
 class ExpectCTReporter;
 class NetworkService;
+class P2PSocketManager;
 class ProxyLookupRequest;
 class ResolveHostRequest;
 class ResourceScheduler;
@@ -219,6 +221,10 @@
                          const GURL& url,
                          int32_t load_flags,
                          bool privacy_mode_enabled) override;
+  void CreateP2PSocketManager(
+      mojom::P2PTrustedSocketManagerClientPtr client,
+      mojom::P2PTrustedSocketManagerRequest trusted_socket_manager,
+      mojom::P2PSocketManagerRequest socket_manager_request) override;
   void ResetURLLoaderFactories() override;
 
   // Destroys |request| when a proxy lookup completes.
@@ -265,6 +271,8 @@
 
   GURL GetHSTSRedirect(const GURL& original_url);
 
+  void DestroySocketManager(P2PSocketManager* socket_manager);
+
   NetworkService* const network_service_;
 
   std::unique_ptr<ResourceScheduler> resource_scheduler_;
@@ -310,6 +318,9 @@
            base::UniquePtrComparator>
       url_loader_factories_;
 
+  base::flat_map<P2PSocketManager*, std::unique_ptr<P2PSocketManager>>
+      socket_managers_;
+
   mojo::StrongBindingSet<mojom::NetLogExporter> net_log_exporter_bindings_;
 
   mojo::StrongBindingSet<mojom::RestrictedCookieManager>
diff --git a/services/network/network_service.cc b/services/network/network_service.cc
index ea414ded..f0c1fc4 100644
--- a/services/network/network_service.cc
+++ b/services/network/network_service.cc
@@ -12,7 +12,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/values.h"
 #include "components/certificate_transparency/sth_distributor.h"
 #include "components/certificate_transparency/sth_observer.h"
@@ -24,6 +24,7 @@
 #include "net/dns/host_resolver.h"
 #include "net/dns/mapped_host_resolver.h"
 #include "net/http/http_auth_handler_factory.h"
+#include "net/log/file_net_log_observer.h"
 #include "net/log/net_log.h"
 #include "net/log/net_log_util.h"
 #include "net/url_request/url_request_context_builder.h"
@@ -138,7 +139,6 @@
     // Note: The command line switches are only checked when not using the
     // embedder's NetLog, as it may already be writing to the destination log
     // file.
-    owned_net_log_->ProcessCommandLine(*command_line);
     net_log_ = owned_net_log_.get();
   }
 
@@ -237,6 +237,16 @@
   client_ = std::move(client);
 }
 
+void NetworkService::StartNetLog(base::File file,
+                                 base::Value client_constants) {
+  DCHECK(client_constants.is_dict());
+  std::unique_ptr<base::DictionaryValue> constants = net::GetNetConstants();
+  constants->MergeDictionary(&client_constants);
+
+  owned_net_log_->ObserveFileWithConstants(std::move(file),
+                                           std::move(*constants));
+}
+
 void NetworkService::CreateNetworkContext(
     mojom::NetworkContextRequest request,
     mojom::NetworkContextParamsPtr params) {
diff --git a/services/network/network_service.h b/services/network/network_service.h
index a686fd8..56121f2 100644
--- a/services/network/network_service.h
+++ b/services/network/network_service.h
@@ -119,6 +119,7 @@
 
   // mojom::NetworkService implementation:
   void SetClient(mojom::NetworkServiceClientPtr client) override;
+  void StartNetLog(base::File file, base::Value constants) override;
   void CreateNetworkContext(mojom::NetworkContextRequest request,
                             mojom::NetworkContextParamsPtr params) override;
   void ConfigureStubHostResolver(
diff --git a/services/network/network_service_unittest.cc b/services/network/network_service_unittest.cc
index 22da1a07..bcb512de 100644
--- a/services/network/network_service_unittest.cc
+++ b/services/network/network_service_unittest.cc
@@ -5,7 +5,10 @@
 #include <memory>
 #include <utility>
 
+#include "base/files/scoped_temp_dir.h"
+#include "base/json/json_file_value_serializer.h"
 #include "base/optional.h"
+#include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/strings/string_util.h"
 #include "base/test/scoped_task_environment.h"
@@ -729,6 +732,38 @@
   EXPECT_EQ(net::OK, client()->completion_status().error_code);
 }
 
+// Verifies that a passed net log file is successfully opened and sane data
+// written to it.
+TEST_F(NetworkServiceTestWithService, StartsNetLog) {
+  base::ScopedTempDir temp_dir;
+  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
+  base::FilePath log_dir = temp_dir.GetPath();
+  base::FilePath log_path = log_dir.Append(FILE_PATH_LITERAL("test_log.json"));
+
+  base::DictionaryValue dict;
+  dict.SetString("amiatest", "iamatest");
+
+  base::File log_file(log_path,
+                      base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
+  network_service_->StartNetLog(std::move(log_file), std::move(dict));
+  CreateNetworkContext();
+  LoadURL(test_server()->GetURL("/echo"));
+  EXPECT_EQ(net::OK, client()->completion_status().error_code);
+
+  // |log_file| is closed on destruction of the NetworkService.
+  Shutdown();
+
+  // |log_file| is closed on another thread, so have to wait for that to happen.
+  RunUntilIdle();
+
+  JSONFileValueDeserializer deserializer(log_path);
+  std::unique_ptr<base::Value> log_dict =
+      deserializer.Deserialize(nullptr, nullptr);
+  ASSERT_TRUE(log_dict);
+  ASSERT_EQ(log_dict->FindKey("constants")->FindKey("amiatest")->GetString(),
+            "iamatest");
+}
+
 // Verifies that raw headers are only reported if requested.
 TEST_F(NetworkServiceTestWithService, RawRequestHeadersAbsent) {
   CreateNetworkContext();
diff --git a/services/network/p2p/DEPS b/services/network/p2p/DEPS
new file mode 100644
index 0000000..6780d87
--- /dev/null
+++ b/services/network/p2p/DEPS
@@ -0,0 +1,5 @@
+include_rules = [
+  "+jingle/glue",
+  "+third_party/webrtc/media/base",
+  "+third_party/webrtc/rtc_base",
+]
diff --git a/services/network/p2p/OWNERS b/services/network/p2p/OWNERS
new file mode 100644
index 0000000..70573c4
--- /dev/null
+++ b/services/network/p2p/OWNERS
@@ -0,0 +1,4 @@
+sergeyu@chromium.org
+juberti@chromium.org
+
+# COMPONENT: Blink>WebRTC
diff --git a/services/network/p2p/socket.cc b/services/network/p2p/socket.cc
new file mode 100644
index 0000000..73b1002
--- /dev/null
+++ b/services/network/p2p/socket.cc
@@ -0,0 +1,311 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/p2p/socket.h"
+
+#include "base/metrics/histogram_macros.h"
+#include "base/sys_byteorder.h"
+#include "net/base/net_errors.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "services/network/p2p/socket_manager.h"
+#include "services/network/p2p/socket_tcp.h"
+#include "services/network/p2p/socket_tcp_server.h"
+#include "services/network/p2p/socket_udp.h"
+#include "services/network/proxy_resolving_client_socket_factory.h"
+#include "third_party/webrtc/media/base/rtputils.h"
+#include "third_party/webrtc/media/base/turnutils.h"
+
+namespace {
+
+// Used to back histogram value of "WebRTC.ICE.TcpSocketErrorCode" and
+// "WebRTC.ICE.UdpSocketErrorCode".
+enum class SocketErrorCode {
+  ERR_MSG_TOO_BIG,
+  ERR_ADDRESS_UNREACHABLE,
+  ERR_ADDRESS_INVALID,
+  ERR_INTERNET_DISCONNECTED,
+  ERR_TIMED_OUT,
+  ERR_INSUFFICIENT_RESOURCES,
+  ERR_OUT_OF_MEMORY,
+  ERR_OTHER  // For all the others
+};
+
+const uint32_t kStunMagicCookie = 0x2112A442;
+const size_t kMinRtcpHeaderLength = 8;
+const size_t kDtlsRecordHeaderLength = 13;
+
+bool IsDtlsPacket(const int8_t* data, size_t length) {
+  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
+  return (length >= kDtlsRecordHeaderLength && (u[0] > 19 && u[0] < 64));
+}
+
+bool IsRtcpPacket(const int8_t* data, size_t length) {
+  if (length < kMinRtcpHeaderLength) {
+    return false;
+  }
+
+  int type = (static_cast<uint8_t>(data[1]) & 0x7F);
+  return (type >= 64 && type < 96);
+}
+
+// Map the network error to SocketErrorCode for the UMA histogram.
+// static
+static SocketErrorCode MapNetErrorToSocketErrorCode(int net_err) {
+  switch (net_err) {
+    case net::OK:
+      NOTREACHED();
+      return SocketErrorCode::ERR_OTHER;
+    case net::ERR_MSG_TOO_BIG:
+      return SocketErrorCode::ERR_MSG_TOO_BIG;
+    case net::ERR_ADDRESS_UNREACHABLE:
+      return SocketErrorCode::ERR_ADDRESS_UNREACHABLE;
+    case net::ERR_ADDRESS_INVALID:
+      return SocketErrorCode::ERR_ADDRESS_INVALID;
+    case net::ERR_INTERNET_DISCONNECTED:
+      return SocketErrorCode::ERR_INTERNET_DISCONNECTED;
+    case net::ERR_TIMED_OUT:
+      return SocketErrorCode::ERR_TIMED_OUT;
+    case net::ERR_INSUFFICIENT_RESOURCES:
+      return SocketErrorCode::ERR_INSUFFICIENT_RESOURCES;
+    case net::ERR_OUT_OF_MEMORY:
+      return SocketErrorCode::ERR_OUT_OF_MEMORY;
+    default:
+      return SocketErrorCode::ERR_OTHER;
+  }
+}
+}  // namespace
+
+namespace network {
+
+P2PSocket::P2PSocket(P2PSocketManager* socket_manager,
+                     mojom::P2PSocketClientPtr client,
+                     mojom::P2PSocketRequest socket,
+                     ProtocolType protocol_type)
+    : socket_manager_(socket_manager),
+      client_(std::move(client)),
+      binding_(this, std::move(socket)),
+      state_(STATE_UNINITIALIZED),
+      dump_incoming_rtp_packet_(false),
+      dump_outgoing_rtp_packet_(false),
+      protocol_type_(protocol_type),
+      send_packets_delayed_total_(0),
+      send_packets_total_(0),
+      send_bytes_delayed_max_(0),
+      send_bytes_delayed_cur_(0),
+      weak_ptr_factory_(this) {
+  binding_.set_connection_error_handler(
+      base::BindOnce(&P2PSocket::OnConnectionError, base::Unretained(this)));
+}
+
+P2PSocket::~P2PSocket() {
+  if (protocol_type_ == P2PSocket::UDP) {
+    UMA_HISTOGRAM_COUNTS_10000("WebRTC.SystemMaxConsecutiveBytesDelayed_UDP",
+                               send_bytes_delayed_max_);
+  } else {
+    UMA_HISTOGRAM_COUNTS_10000("WebRTC.SystemMaxConsecutiveBytesDelayed_TCP",
+                               send_bytes_delayed_max_);
+  }
+
+  if (send_packets_total_ > 0) {
+    int delay_rate = (send_packets_delayed_total_ * 100) / send_packets_total_;
+    if (protocol_type_ == P2PSocket::UDP) {
+      UMA_HISTOGRAM_PERCENTAGE("WebRTC.SystemPercentPacketsDelayed_UDP",
+                               delay_rate);
+    } else {
+      UMA_HISTOGRAM_PERCENTAGE("WebRTC.SystemPercentPacketsDelayed_TCP",
+                               delay_rate);
+    }
+  }
+}
+
+// Verifies that the packet |data| has a valid STUN header.
+// static
+bool P2PSocket::GetStunPacketType(const int8_t* data,
+                                  int data_size,
+                                  StunMessageType* type) {
+  if (data_size < kStunHeaderSize) {
+    return false;
+  }
+
+  uint32_t cookie =
+      base::NetToHost32(*reinterpret_cast<const uint32_t*>(data + 4));
+  if (cookie != kStunMagicCookie) {
+    return false;
+  }
+
+  uint16_t length =
+      base::NetToHost16(*reinterpret_cast<const uint16_t*>(data + 2));
+  if (length != data_size - kStunHeaderSize) {
+    return false;
+  }
+
+  int message_type =
+      base::NetToHost16(*reinterpret_cast<const uint16_t*>(data));
+
+  // Verify that the type is known:
+  switch (message_type) {
+    case STUN_BINDING_REQUEST:
+    case STUN_BINDING_RESPONSE:
+    case STUN_BINDING_ERROR_RESPONSE:
+    case STUN_SHARED_SECRET_REQUEST:
+    case STUN_SHARED_SECRET_RESPONSE:
+    case STUN_SHARED_SECRET_ERROR_RESPONSE:
+    case STUN_ALLOCATE_REQUEST:
+    case STUN_ALLOCATE_RESPONSE:
+    case STUN_ALLOCATE_ERROR_RESPONSE:
+    case STUN_SEND_REQUEST:
+    case STUN_SEND_RESPONSE:
+    case STUN_SEND_ERROR_RESPONSE:
+    case STUN_DATA_INDICATION:
+      *type = static_cast<StunMessageType>(message_type);
+      return true;
+
+    default:
+      return false;
+  }
+}
+
+// static
+bool P2PSocket::IsRequestOrResponse(StunMessageType type) {
+  return type == STUN_BINDING_REQUEST || type == STUN_BINDING_RESPONSE ||
+         type == STUN_ALLOCATE_REQUEST || type == STUN_ALLOCATE_RESPONSE;
+}
+
+// static
+void P2PSocket::ReportSocketError(int result, const char* histogram_name) {
+  SocketErrorCode error_code = MapNetErrorToSocketErrorCode(result);
+  UMA_HISTOGRAM_ENUMERATION(histogram_name, static_cast<int>(error_code),
+                            static_cast<int>(SocketErrorCode::ERR_OTHER) + 1);
+}
+
+// static
+P2PSocket* P2PSocket::Create(
+    P2PSocketManager* socket_manager,
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest socket,
+    P2PSocketType type,
+    net::NetLog* net_log,
+    ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory,
+    P2PMessageThrottler* throttler) {
+  switch (type) {
+    case P2P_SOCKET_UDP:
+      return new P2PSocketUdp(socket_manager, std::move(client),
+                              std::move(socket), throttler, net_log);
+    case P2P_SOCKET_TCP_SERVER:
+      return new P2PSocketTcpServer(socket_manager, std::move(client),
+                                    std::move(socket), P2P_SOCKET_TCP_CLIENT);
+
+    case P2P_SOCKET_STUN_TCP_SERVER:
+      return new P2PSocketTcpServer(socket_manager, std::move(client),
+                                    std::move(socket),
+                                    P2P_SOCKET_STUN_TCP_CLIENT);
+
+    case P2P_SOCKET_TCP_CLIENT:
+    case P2P_SOCKET_SSLTCP_CLIENT:
+    case P2P_SOCKET_TLS_CLIENT:
+      return new P2PSocketTcp(socket_manager, std::move(client),
+                              std::move(socket), type,
+                              proxy_resolving_socket_factory);
+
+    case P2P_SOCKET_STUN_TCP_CLIENT:
+    case P2P_SOCKET_STUN_SSLTCP_CLIENT:
+    case P2P_SOCKET_STUN_TLS_CLIENT:
+      return new P2PSocketStunTcp(socket_manager, std::move(client),
+                                  std::move(socket), type,
+                                  proxy_resolving_socket_factory);
+  }
+
+  NOTREACHED();
+  return nullptr;
+}
+
+void P2PSocket::StartRtpDump(bool incoming, bool outgoing) {
+  DCHECK(incoming || outgoing);
+
+  if (incoming) {
+    dump_incoming_rtp_packet_ = true;
+  }
+
+  if (outgoing) {
+    dump_outgoing_rtp_packet_ = true;
+  }
+}
+
+void P2PSocket::StopRtpDump(bool incoming, bool outgoing) {
+  DCHECK(incoming || outgoing);
+
+  if (incoming) {
+    dump_incoming_rtp_packet_ = false;
+  }
+
+  if (outgoing) {
+    dump_outgoing_rtp_packet_ = false;
+  }
+}
+
+mojom::P2PSocketClientPtr P2PSocket::ReleaseClientForTesting() {
+  return std::move(client_);
+}
+
+mojom::P2PSocketRequest P2PSocket::ReleaseBindingForTesting() {
+  return binding_.Unbind();
+}
+
+void P2PSocket::DumpRtpPacket(const int8_t* packet,
+                              size_t length,
+                              bool incoming) {
+  if (!socket_manager_ || IsDtlsPacket(packet, length) ||
+      IsRtcpPacket(packet, length)) {
+    return;
+  }
+
+  size_t rtp_packet_pos = 0;
+  size_t rtp_packet_length = length;
+  if (!cricket::UnwrapTurnPacket(reinterpret_cast<const uint8_t*>(packet),
+                                 length, &rtp_packet_pos, &rtp_packet_length)) {
+    return;
+  }
+
+  packet += rtp_packet_pos;
+
+  size_t header_length = 0;
+  bool valid =
+      cricket::ValidateRtpHeader(reinterpret_cast<const uint8_t*>(packet),
+                                 rtp_packet_length, &header_length);
+  if (!valid) {
+    NOTREACHED();
+    return;
+  }
+
+  socket_manager_->DumpPacket(packet, header_length, rtp_packet_length,
+                              incoming);
+}
+
+void P2PSocket::IncrementDelayedPackets() {
+  send_packets_delayed_total_++;
+}
+
+void P2PSocket::IncrementTotalSentPackets() {
+  send_packets_total_++;
+}
+
+void P2PSocket::IncrementDelayedBytes(uint32_t size) {
+  send_bytes_delayed_cur_ += size;
+  if (send_bytes_delayed_cur_ > send_bytes_delayed_max_) {
+    send_bytes_delayed_max_ = send_bytes_delayed_cur_;
+  }
+}
+
+void P2PSocket::DecrementDelayedBytes(uint32_t size) {
+  send_bytes_delayed_cur_ -= size;
+  DCHECK_GE(send_bytes_delayed_cur_, 0);
+}
+
+void P2PSocket::OnConnectionError() {
+  if (socket_manager_)
+    socket_manager_->DestroySocket(this);
+}
+
+}  // namespace network
diff --git a/content/browser/renderer_host/p2p/socket_host.h b/services/network/p2p/socket.h
similarity index 62%
rename from content/browser/renderer_host/p2p/socket_host.h
rename to services/network/p2p/socket.h
index 4d3b7e30..0a480d6 100644
--- a/content/browser/renderer_host/p2p/socket_host.h
+++ b/services/network/p2p/socket.h
@@ -2,18 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_H_
-#define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_H_
+#ifndef SERVICES_NETWORK_P2P_SOCKET_H_
+#define SERVICES_NETWORK_P2P_SOCKET_H_
 
 #include <stddef.h>
 #include <stdint.h>
 
 #include <memory>
-
+#include "base/component_export.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "content/common/content_export.h"
-#include "content/public/browser/render_process_host.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/base/ip_endpoint.h"
 #include "net/socket/datagram_socket.h"
@@ -22,33 +20,30 @@
 #include "services/network/public/mojom/p2p.mojom.h"
 
 namespace net {
-class URLRequestContextGetter;
+class NetLog;
 }
 
 namespace network {
 class ProxyResolvingClientSocketFactory;
-}
-
-namespace content {
-class P2PSocketDispatcherHost;
+class P2PSocketManager;
 class P2PMessageThrottler;
 
 // Base class for P2P sockets.
-class CONTENT_EXPORT P2PSocketHost : public network::mojom::P2PSocket {
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocket : public mojom::P2PSocket {
  public:
   static const int kStunHeaderSize = 20;
   static const size_t kMaximumPacketSize = 32768;
-  // Creates P2PSocketHost of the specific type.
-  static P2PSocketHost* Create(P2PSocketDispatcherHost* socket_dispatcher_host,
-                               network::mojom::P2PSocketClientPtr client,
-                               network::mojom::P2PSocketRequest socket,
-                               network::P2PSocketType type,
-                               net::URLRequestContextGetter* url_context,
-                               network::ProxyResolvingClientSocketFactory*
-                                   proxy_resolving_socket_factory,
-                               P2PMessageThrottler* throttler);
+  // Creates P2PSocket of the specific type.
+  static P2PSocket* Create(
+      P2PSocketManager* socket_manager,
+      mojom::P2PSocketClientPtr client,
+      mojom::P2PSocketRequest socket,
+      P2PSocketType type,
+      net::NetLog* net_log,
+      ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory,
+      P2PMessageThrottler* throttler);
 
-  ~P2PSocketHost() override;
+  ~P2PSocket() override;
 
   // Initalizes the socket. Returns false when initialization fails.
   // |min_port| and |max_port| specify the valid range of allowed ports.
@@ -62,19 +57,16 @@
   virtual bool Init(const net::IPEndPoint& local_address,
                     uint16_t min_port,
                     uint16_t max_port,
-                    const network::P2PHostAndIPEndPoint& remote_address) = 0;
+                    const P2PHostAndIPEndPoint& remote_address) = 0;
 
-  void StartRtpDump(
-      bool incoming,
-      bool outgoing,
-      const RenderProcessHost::WebRtcRtpPacketCallback& packet_callback);
+  void StartRtpDump(bool incoming, bool outgoing);
   void StopRtpDump(bool incoming, bool outgoing);
 
-  network::mojom::P2PSocketClientPtr ReleaseClientForTesting();
-  network::mojom::P2PSocketRequest ReleaseBindingForTesting();
+  mojom::P2PSocketClientPtr ReleaseClientForTesting();
+  mojom::P2PSocketRequest ReleaseBindingForTesting();
 
  protected:
-  friend class P2PSocketHostTcpTestBase;
+  friend class P2PSocketTcpTestBase;
 
   // This should match suffix IPProtocolType defined in histograms.xml.
   enum ProtocolType { UDP = 0x1, TCP = 0x2 };
@@ -112,10 +104,10 @@
     STATE_ERROR,
   };
 
-  P2PSocketHost(P2PSocketDispatcherHost* socket_dispatcher_host,
-                network::mojom::P2PSocketClientPtr client,
-                network::mojom::P2PSocketRequest socket,
-                ProtocolType protocol_type);
+  P2PSocket(P2PSocketManager* socket_manager,
+            mojom::P2PSocketClientPtr client,
+            mojom::P2PSocketRequest socket,
+            ProtocolType protocol_type);
 
   // Verifies that the packet |data| has a valid STUN header. In case
   // of success stores type of the message in |type|.
@@ -126,28 +118,21 @@
 
   static void ReportSocketError(int result, const char* histogram_name);
 
-  // Calls |packet_dump_callback_| to record the RTP header.
+  // Calls |socket_manager_| to record the RTP header.
   void DumpRtpPacket(const int8_t* packet, size_t length, bool incoming);
 
-  // A helper to dump the packet on the IO thread.
-  void DumpRtpPacketOnIOThread(std::unique_ptr<uint8_t[]> packet_header,
-                               size_t header_length,
-                               size_t packet_length,
-                               bool incoming);
-
   // Used by subclasses to track the metrics of delayed bytes and packets.
   void IncrementDelayedPackets();
   void IncrementTotalSentPackets();
   void IncrementDelayedBytes(uint32_t size);
   void DecrementDelayedBytes(uint32_t size);
 
-  P2PSocketDispatcherHost* socket_dispatcher_host_;
-  network::mojom::P2PSocketClientPtr client_;
-  mojo::Binding<network::mojom::P2PSocket> binding_;
+  P2PSocketManager* socket_manager_;
+  mojom::P2PSocketClientPtr client_;
+  mojo::Binding<mojom::P2PSocket> binding_;
   State state_;
   bool dump_incoming_rtp_packet_;
   bool dump_outgoing_rtp_packet_;
-  RenderProcessHost::WebRtcRtpPacketCallback packet_dump_callback_;
 
   ProtocolType protocol_type_;
 
@@ -163,11 +148,11 @@
   int32_t send_bytes_delayed_max_;
   int32_t send_bytes_delayed_cur_;
 
-  base::WeakPtrFactory<P2PSocketHost> weak_ptr_factory_;
+  base::WeakPtrFactory<P2PSocket> weak_ptr_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(P2PSocketHost);
+  DISALLOW_COPY_AND_ASSIGN(P2PSocket);
 };
 
-}  // namespace content
+}  // namespace network
 
-#endif  // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_H_
+#endif  // SERVICES_NETWORK_P2P_SOCKET_H_
diff --git a/services/network/p2p/socket_manager.cc b/services/network/p2p/socket_manager.cc
new file mode 100644
index 0000000..b7b457d
--- /dev/null
+++ b/services/network/p2p/socket_manager.cc
@@ -0,0 +1,348 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/p2p/socket_manager.h"
+
+#include <stddef.h>
+
+#include <algorithm>
+
+#include "base/bind.h"
+#include "base/task/post_task.h"
+#include "base/threading/thread_task_runner_handle.h"
+#include "net/base/address_list.h"
+#include "net/base/completion_callback.h"
+#include "net/base/net_errors.h"
+#include "net/base/network_interfaces.h"
+#include "net/base/sys_addrinfo.h"
+#include "net/dns/host_resolver.h"
+#include "net/log/net_log_source.h"
+#include "net/log/net_log_with_source.h"
+#include "net/socket/client_socket_factory.h"
+#include "net/socket/datagram_client_socket.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "net/url_request/url_request_context.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "services/network/p2p/socket.h"
+#include "services/network/proxy_resolving_client_socket_factory.h"
+#include "services/network/public/cpp/p2p_param_traits.h"
+
+namespace network {
+
+namespace {
+
+// Used by GetDefaultLocalAddress as the target to connect to for getting the
+// default local address. They are public DNS servers on the internet.
+const uint8_t kPublicIPv4Host[] = {8, 8, 8, 8};
+const uint8_t kPublicIPv6Host[] = {
+    0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88};
+const int kPublicPort = 53;  // DNS port.
+
+// Experimentation shows that creating too many sockets creates odd problems
+// because of resource exhaustion in the Unix sockets domain.
+// Trouble has been seen on Linux at 3479 sockets in test, so leave a margin.
+const int kMaxSimultaneousSockets = 3000;
+
+}  // namespace
+
+class P2PSocketManager::DnsRequest {
+ public:
+  typedef base::Callback<void(const net::IPAddressList&)> DoneCallback;
+
+  explicit DnsRequest(net::HostResolver* host_resolver)
+      : resolver_(host_resolver) {}
+
+  void Resolve(const std::string& host_name,
+               const DoneCallback& done_callback) {
+    DCHECK(!done_callback.is_null());
+
+    host_name_ = host_name;
+    done_callback_ = done_callback;
+
+    // Return an error if it's an empty string.
+    if (host_name_.empty()) {
+      net::IPAddressList address_list;
+      done_callback_.Run(address_list);
+      return;
+    }
+
+    // Add period at the end to make sure that we only resolve
+    // fully-qualified names.
+    if (host_name_.back() != '.')
+      host_name_ += '.';
+
+    net::HostResolver::RequestInfo info(net::HostPortPair(host_name_, 0));
+    int result =
+        resolver_->Resolve(info, net::DEFAULT_PRIORITY, &addresses_,
+                           base::BindOnce(&P2PSocketManager::DnsRequest::OnDone,
+                                          base::Unretained(this)),
+                           &request_, net::NetLogWithSource());
+    if (result != net::ERR_IO_PENDING)
+      OnDone(result);
+  }
+
+ private:
+  void OnDone(int result) {
+    net::IPAddressList list;
+    if (result != net::OK) {
+      LOG(ERROR) << "Failed to resolve address for " << host_name_
+                 << ", errorcode: " << result;
+      done_callback_.Run(list);
+      return;
+    }
+
+    DCHECK(!addresses_.empty());
+    for (net::AddressList::iterator iter = addresses_.begin();
+         iter != addresses_.end(); ++iter) {
+      list.push_back(iter->address());
+    }
+    done_callback_.Run(list);
+  }
+
+  net::AddressList addresses_;
+
+  std::string host_name_;
+  net::HostResolver* resolver_;
+  std::unique_ptr<net::HostResolver::Request> request_;
+
+  DoneCallback done_callback_;
+};
+
+P2PSocketManager::P2PSocketManager(
+    mojom::P2PTrustedSocketManagerClientPtr trusted_socket_manager_client,
+    mojom::P2PTrustedSocketManagerRequest trusted_socket_manager_request,
+    mojom::P2PSocketManagerRequest socket_manager_request,
+    DeleteCallback delete_callback,
+    net::URLRequestContext* url_request_context)
+    : delete_callback_(std::move(delete_callback)),
+      url_request_context_(url_request_context),
+      network_list_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
+          {base::MayBlock(), base::TaskPriority::USER_VISIBLE})),
+      trusted_socket_manager_client_(std::move(trusted_socket_manager_client)),
+      trusted_socket_manager_binding_(
+          this,
+          std::move(trusted_socket_manager_request)),
+      socket_manager_binding_(this, std::move(socket_manager_request)),
+      weak_factory_(this) {
+  trusted_socket_manager_binding_.set_connection_error_handler(
+      base::Bind(&P2PSocketManager::OnConnectionError, base::Unretained(this)));
+  socket_manager_binding_.set_connection_error_handler(
+      base::Bind(&P2PSocketManager::OnConnectionError, base::Unretained(this)));
+}
+
+P2PSocketManager::~P2PSocketManager() {
+  sockets_.clear();
+  dns_requests_.clear();
+
+  if (network_notification_client_)
+    net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
+
+  proxy_resolving_socket_factory_.reset();
+}
+
+void P2PSocketManager::OnNetworkChanged(
+    net::NetworkChangeNotifier::ConnectionType type) {
+  // NetworkChangeNotifier always emits CONNECTION_NONE notification whenever
+  // network configuration changes. All other notifications can be ignored.
+  if (type != net::NetworkChangeNotifier::CONNECTION_NONE)
+    return;
+
+  // Notify the renderer about changes to list of network interfaces.
+  network_list_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&P2PSocketManager::DoGetNetworkList,
+                                weak_factory_.GetWeakPtr(),
+                                base::ThreadTaskRunnerHandle::Get()));
+}
+
+void P2PSocketManager::AddAcceptedConnection(
+    std::unique_ptr<P2PSocket> accepted_connection) {
+  sockets_[accepted_connection.get()] = std::move(accepted_connection);
+}
+
+void P2PSocketManager::DestroySocket(P2PSocket* socket) {
+  auto iter = sockets_.find(socket);
+  DCHECK(iter != sockets_.end());
+  sockets_.erase(iter);
+}
+
+void P2PSocketManager::DumpPacket(const int8_t* packet_header,
+                                  size_t header_length,
+                                  size_t packet_length,
+                                  bool incoming) {
+  std::vector<uint8_t> header_buffer(header_length);
+  memcpy(&header_buffer[0], packet_header, header_length);
+  trusted_socket_manager_client_->DumpPacket(header_buffer, packet_length,
+                                             incoming);
+}
+
+void P2PSocketManager::DoGetNetworkList(
+    const base::WeakPtr<P2PSocketManager>& socket_manager,
+    scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) {
+  net::NetworkInterfaceList list;
+  if (!net::GetNetworkList(&list, net::EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES)) {
+    LOG(ERROR) << "GetNetworkList failed.";
+    return;
+  }
+  net::IPAddress default_ipv4_local_address = GetDefaultLocalAddress(AF_INET);
+  net::IPAddress default_ipv6_local_address = GetDefaultLocalAddress(AF_INET6);
+  main_task_runner->PostTask(
+      FROM_HERE,
+      base::BindOnce(&P2PSocketManager::SendNetworkList, socket_manager, list,
+                     default_ipv4_local_address, default_ipv6_local_address));
+}
+
+void P2PSocketManager::SendNetworkList(
+    const net::NetworkInterfaceList& list,
+    const net::IPAddress& default_ipv4_local_address,
+    const net::IPAddress& default_ipv6_local_address) {
+  network_notification_client_->NetworkListChanged(
+      list, default_ipv4_local_address, default_ipv6_local_address);
+}
+
+void P2PSocketManager::StartNetworkNotifications(
+    mojom::P2PNetworkNotificationClientPtr client) {
+  DCHECK(!network_notification_client_);
+  network_notification_client_ = std::move(client);
+  network_notification_client_.set_connection_error_handler(base::BindOnce(
+      &P2PSocketManager::NetworkNotificationClientConnectionError,
+      base::Unretained(this)));
+
+  net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
+
+  network_list_task_runner_->PostTask(
+      FROM_HERE, base::BindOnce(&P2PSocketManager::DoGetNetworkList,
+                                weak_factory_.GetWeakPtr(),
+                                base::ThreadTaskRunnerHandle::Get()));
+}
+
+void P2PSocketManager::GetHostAddress(
+    const std::string& host_name,
+    mojom::P2PSocketManager::GetHostAddressCallback callback) {
+  std::unique_ptr<DnsRequest> request =
+      std::make_unique<DnsRequest>(url_request_context_->host_resolver());
+  DnsRequest* request_ptr = request.get();
+  dns_requests_.insert(std::move(request));
+  request_ptr->Resolve(
+      host_name,
+      base::Bind(&P2PSocketManager::OnAddressResolved, base::Unretained(this),
+                 request_ptr, base::Passed(&callback)));
+}
+
+void P2PSocketManager::CreateSocket(P2PSocketType type,
+                                    const net::IPEndPoint& local_address,
+                                    const P2PPortRange& port_range,
+                                    const P2PHostAndIPEndPoint& remote_address,
+                                    mojom::P2PSocketClientPtr client,
+                                    mojom::P2PSocketRequest request) {
+  if (port_range.min_port > port_range.max_port ||
+      (port_range.min_port == 0 && port_range.max_port != 0)) {
+    trusted_socket_manager_client_->InvalidSocketPortRangeRequested();
+    return;
+  }
+
+  if (!proxy_resolving_socket_factory_) {
+    proxy_resolving_socket_factory_ =
+        std::make_unique<ProxyResolvingClientSocketFactory>(
+            url_request_context_);
+  }
+  if (sockets_.size() > kMaxSimultaneousSockets) {
+    LOG(ERROR) << "Too many sockets created";
+    return;
+  }
+  std::unique_ptr<P2PSocket> socket(
+      P2PSocket::Create(nullptr /*this*/, std::move(client), std::move(request),
+                        type, url_request_context_->net_log(),
+                        proxy_resolving_socket_factory_.get(), &throttler_));
+
+  if (!socket)
+    return;
+
+  if (socket->Init(local_address, port_range.min_port, port_range.max_port,
+                   remote_address)) {
+    if (dump_incoming_rtp_packet_ || dump_outgoing_rtp_packet_) {
+      socket->StartRtpDump(dump_incoming_rtp_packet_,
+                           dump_outgoing_rtp_packet_);
+    }
+    sockets_[socket.get()] = std::move(socket);
+  }
+}
+
+void P2PSocketManager::StartRtpDump(bool incoming, bool outgoing) {
+  if ((!dump_incoming_rtp_packet_ && incoming) ||
+      (!dump_outgoing_rtp_packet_ && outgoing)) {
+    if (incoming)
+      dump_incoming_rtp_packet_ = true;
+
+    if (outgoing)
+      dump_outgoing_rtp_packet_ = true;
+
+    for (auto& it : sockets_)
+      it.first->StartRtpDump(incoming, outgoing);
+  }
+}
+
+void P2PSocketManager::StopRtpDump(bool incoming, bool outgoing) {
+  if ((dump_incoming_rtp_packet_ && incoming) ||
+      (dump_outgoing_rtp_packet_ && outgoing)) {
+    if (incoming)
+      dump_incoming_rtp_packet_ = false;
+
+    if (outgoing)
+      dump_outgoing_rtp_packet_ = false;
+
+    for (auto& it : sockets_)
+      it.first->StopRtpDump(incoming, outgoing);
+  }
+}
+
+void P2PSocketManager::NetworkNotificationClientConnectionError() {
+  net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
+}
+
+net::IPAddress P2PSocketManager::GetDefaultLocalAddress(int family) {
+  DCHECK(family == AF_INET || family == AF_INET6);
+
+  // Creation and connection of a UDP socket might be janky.
+  // DCHECK(network_list_task_runner_->RunsTasksInCurrentSequence());
+
+  auto socket =
+      net::ClientSocketFactory::GetDefaultFactory()->CreateDatagramClientSocket(
+          net::DatagramSocket::DEFAULT_BIND, nullptr, net::NetLogSource());
+
+  net::IPAddress ip_address;
+  if (family == AF_INET) {
+    ip_address = net::IPAddress(kPublicIPv4Host);
+  } else {
+    ip_address = net::IPAddress(kPublicIPv6Host);
+  }
+
+  if (socket->Connect(net::IPEndPoint(ip_address, kPublicPort)) != net::OK) {
+    return net::IPAddress();
+  }
+
+  net::IPEndPoint local_address;
+  if (socket->GetLocalAddress(&local_address) != net::OK)
+    return net::IPAddress();
+
+  return local_address.address();
+}
+
+void P2PSocketManager::OnAddressResolved(
+    DnsRequest* request,
+    mojom::P2PSocketManager::GetHostAddressCallback callback,
+    const net::IPAddressList& addresses) {
+  std::move(callback).Run(addresses);
+
+  dns_requests_.erase(
+      std::find_if(dns_requests_.begin(), dns_requests_.end(),
+                   [request](const std::unique_ptr<DnsRequest>& ptr) {
+                     return ptr.get() == request;
+                   }));
+}
+
+void P2PSocketManager::OnConnectionError() {
+  std::move(delete_callback_).Run(this);
+}
+
+}  // namespace network
diff --git a/services/network/p2p/socket_manager.h b/services/network/p2p/socket_manager.h
new file mode 100644
index 0000000..e7f30427
--- /dev/null
+++ b/services/network/p2p/socket_manager.h
@@ -0,0 +1,153 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_P2P_SOCKET_MANAGER_H_
+#define SERVICES_NETWORK_P2P_SOCKET_MANAGER_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <set>
+#include <string>
+#include <vector>
+
+#include "base/callback.h"
+#include "base/containers/flat_map.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/sequenced_task_runner.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "net/base/ip_address.h"
+#include "net/base/ip_endpoint.h"
+#include "net/base/network_change_notifier.h"
+#include "services/network/p2p/socket_throttler.h"
+#include "services/network/public/cpp/p2p_socket_type.h"
+#include "services/network/public/mojom/p2p.mojom.h"
+#include "services/network/public/mojom/p2p_trusted.mojom.h"
+
+namespace net {
+class URLRequestContext;
+}
+
+namespace network {
+class ProxyResolvingClientSocketFactory;
+}
+
+namespace network {
+
+class P2PSocket;
+
+// Owns all the P2P socket instances and dispatches Mojo calls from the
+// (untrusted) child and (trusted) browser process.
+class P2PSocketManager
+    : public net::NetworkChangeNotifier::NetworkChangeObserver,
+      public mojom::P2PSocketManager,
+      public mojom::P2PTrustedSocketManager {
+ public:
+  using DeleteCallback =
+      base::OnceCallback<void(P2PSocketManager* socket_manager)>;
+
+  // |delete_callback| tells the P2PSocketManager's owner to destroy the
+  // P2PSocketManager. The P2PSocketManager must be destroyed before the
+  // |url_request_context|.
+  P2PSocketManager(
+      mojom::P2PTrustedSocketManagerClientPtr trusted_socket_manager_client,
+      mojom::P2PTrustedSocketManagerRequest trusted_socket_manager_request,
+      mojom::P2PSocketManagerRequest socket_manager_request,
+      DeleteCallback delete_callback,
+      net::URLRequestContext* url_request_context);
+  ~P2PSocketManager() override;
+
+  // net::NetworkChangeNotifier::NetworkChangeObserver overrides.
+  void OnNetworkChanged(
+      net::NetworkChangeNotifier::ConnectionType type) override;
+
+  // The following methods are called by the socket implementations.
+
+  // Called when a new socket is created due to an incoming connection.
+  void AddAcceptedConnection(std::unique_ptr<P2PSocket> accepted_connection);
+
+  // Tells the SocketManager to destroy the given socket.
+  void DestroySocket(P2PSocket* socket);
+
+  // Called when packet logging is enabled.
+  void DumpPacket(const int8_t* packet_header,
+                  size_t header_length,
+                  size_t packet_length,
+                  bool incoming);
+
+ private:
+  class DnsRequest;
+
+  static void DoGetNetworkList(
+      const base::WeakPtr<P2PSocketManager>& socket_manager,
+      scoped_refptr<base::SingleThreadTaskRunner> main_task_runner);
+  void SendNetworkList(const net::NetworkInterfaceList& list,
+                       const net::IPAddress& default_ipv4_local_address,
+                       const net::IPAddress& default_ipv6_local_address);
+
+  // mojom::P2PSocketManager overrides:
+  void StartNetworkNotifications(
+      mojom::P2PNetworkNotificationClientPtr client) override;
+  void GetHostAddress(
+      const std::string& host_name,
+      mojom::P2PSocketManager::GetHostAddressCallback callback) override;
+  void CreateSocket(P2PSocketType type,
+                    const net::IPEndPoint& local_address,
+                    const P2PPortRange& port_range,
+                    const P2PHostAndIPEndPoint& remote_address,
+                    mojom::P2PSocketClientPtr client,
+                    mojom::P2PSocketRequest request) override;
+
+  // mojom::P2PTrustedSocketManager overrides:
+  void StartRtpDump(bool incoming, bool outgoing) override;
+  void StopRtpDump(bool incoming, bool outgoing) override;
+
+  void NetworkNotificationClientConnectionError();
+
+  // This connects a UDP socket to a public IP address and gets local
+  // address. Since it binds to the "any" address (0.0.0.0 or ::) internally, it
+  // retrieves the default local address.
+  static net::IPAddress GetDefaultLocalAddress(int family);
+
+  void OnAddressResolved(
+      DnsRequest* request,
+      mojom::P2PSocketManager::GetHostAddressCallback callback,
+      const net::IPAddressList& addresses);
+
+  void OnConnectionError();
+
+  DeleteCallback delete_callback_;
+  net::URLRequestContext* url_request_context_;
+
+  std::unique_ptr<ProxyResolvingClientSocketFactory>
+      proxy_resolving_socket_factory_;
+
+  base::flat_map<P2PSocket*, std::unique_ptr<P2PSocket>> sockets_;
+
+  std::set<std::unique_ptr<DnsRequest>> dns_requests_;
+  P2PMessageThrottler throttler_;
+
+  bool dump_incoming_rtp_packet_ = false;
+  bool dump_outgoing_rtp_packet_ = false;
+
+  // Used to call DoGetNetworkList, which may briefly block since getting the
+  // default local address involves creating a dummy socket.
+  const scoped_refptr<base::SequencedTaskRunner> network_list_task_runner_;
+
+  mojom::P2PTrustedSocketManagerClientPtr trusted_socket_manager_client_;
+  mojo::Binding<mojom::P2PTrustedSocketManager> trusted_socket_manager_binding_;
+  mojo::Binding<mojom::P2PSocketManager> socket_manager_binding_;
+
+  mojom::P2PNetworkNotificationClientPtr network_notification_client_;
+
+  base::WeakPtrFactory<P2PSocketManager> weak_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(P2PSocketManager);
+};
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_P2P_SOCKET_MANAGER_H_
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp.cc b/services/network/p2p/socket_tcp.cc
similarity index 72%
rename from content/browser/renderer_host/p2p/socket_host_tcp.cc
rename to services/network/p2p/socket_tcp.cc
index d81e34e4d..482d9bac 100644
--- a/content/browser/renderer_host/p2p/socket_host_tcp.cc
+++ b/services/network/p2p/socket_tcp.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_tcp.h"
+#include "services/network/p2p/socket_tcp.h"
 
 #include <stddef.h>
 #include <utility>
@@ -18,14 +18,14 @@
 #include "net/socket/client_socket_handle.h"
 #include "net/socket/ssl_client_socket.h"
 #include "net/socket/tcp_client_socket.h"
-#include "net/url_request/url_request_context.h"
-#include "net/url_request/url_request_context_getter.h"
+#include "services/network/p2p/socket_manager.h"
 #include "services/network/proxy_resolving_client_socket.h"
 #include "services/network/proxy_resolving_client_socket_factory.h"
 #include "services/network/public/cpp/p2p_param_traits.h"
 #include "third_party/webrtc/media/base/rtputils.h"
 #include "url/gurl.h"
 
+namespace network {
 namespace {
 
 typedef uint16_t PacketLength;
@@ -36,58 +36,52 @@
 const int kTcpRecvSocketBufferSize = 128 * 1024;
 const int kTcpSendSocketBufferSize = 128 * 1024;
 
-bool IsTlsClientSocket(network::P2PSocketType type) {
-  return (type == network::P2P_SOCKET_STUN_TLS_CLIENT ||
-          type == network::P2P_SOCKET_TLS_CLIENT);
+bool IsTlsClientSocket(P2PSocketType type) {
+  return (type == P2P_SOCKET_STUN_TLS_CLIENT || type == P2P_SOCKET_TLS_CLIENT);
 }
 
-bool IsPseudoTlsClientSocket(network::P2PSocketType type) {
-  return (type == network::P2P_SOCKET_SSLTCP_CLIENT ||
-          type == network::P2P_SOCKET_STUN_SSLTCP_CLIENT);
+bool IsPseudoTlsClientSocket(P2PSocketType type) {
+  return (type == P2P_SOCKET_SSLTCP_CLIENT ||
+          type == P2P_SOCKET_STUN_SSLTCP_CLIENT);
 }
 
 }  // namespace
 
-namespace content {
-
-P2PSocketHostTcp::SendBuffer::SendBuffer() : rtc_packet_id(-1) {}
-P2PSocketHostTcp::SendBuffer::SendBuffer(
+P2PSocketTcp::SendBuffer::SendBuffer() : rtc_packet_id(-1) {}
+P2PSocketTcp::SendBuffer::SendBuffer(
     int32_t rtc_packet_id,
     scoped_refptr<net::DrainableIOBuffer> buffer,
     const net::NetworkTrafficAnnotationTag traffic_annotation)
     : rtc_packet_id(rtc_packet_id),
       buffer(buffer),
       traffic_annotation(traffic_annotation) {}
-P2PSocketHostTcp::SendBuffer::SendBuffer(const SendBuffer& rhs) = default;
-P2PSocketHostTcp::SendBuffer::~SendBuffer() {}
+P2PSocketTcp::SendBuffer::SendBuffer(const SendBuffer& rhs) = default;
+P2PSocketTcp::SendBuffer::~SendBuffer() {}
 
-P2PSocketHostTcpBase::P2PSocketHostTcpBase(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    network::P2PSocketType type,
-    net::URLRequestContextGetter* url_context,
-    network::ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory)
-    : P2PSocketHost(socket_dispatcher_host,
-                    std::move(client),
-                    std::move(socket),
-                    P2PSocketHost::TCP),
+P2PSocketTcpBase::P2PSocketTcpBase(
+    P2PSocketManager* socket_manager,
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest socket,
+    P2PSocketType type,
+    ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory)
+    : P2PSocket(socket_manager,
+                std::move(client),
+                std::move(socket),
+                P2PSocket::TCP),
       write_pending_(false),
       connected_(false),
       type_(type),
-      url_context_(url_context),
       proxy_resolving_socket_factory_(proxy_resolving_socket_factory) {}
 
-P2PSocketHostTcpBase::~P2PSocketHostTcpBase() {
+P2PSocketTcpBase::~P2PSocketTcpBase() {
   if (state_ == STATE_OPEN) {
     DCHECK(socket_.get());
     socket_.reset();
   }
 }
 
-bool P2PSocketHostTcpBase::InitAccepted(
-    const net::IPEndPoint& remote_address,
-    std::unique_ptr<net::StreamSocket> socket) {
+bool P2PSocketTcpBase::InitAccepted(const net::IPEndPoint& remote_address,
+                                    std::unique_ptr<net::StreamSocket> socket) {
   DCHECK(socket);
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
 
@@ -99,11 +93,10 @@
   return state_ != STATE_ERROR;
 }
 
-bool P2PSocketHostTcpBase::Init(
-    const net::IPEndPoint& local_address,
-    uint16_t min_port,
-    uint16_t max_port,
-    const network::P2PHostAndIPEndPoint& remote_address) {
+bool P2PSocketTcpBase::Init(const net::IPEndPoint& local_address,
+                            uint16_t min_port,
+                            uint16_t max_port,
+                            const P2PHostAndIPEndPoint& remote_address) {
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
 
   remote_address_ = remote_address;
@@ -119,8 +112,8 @@
                                             remote_address.ip_address.port());
   } else {
     DCHECK(!remote_address.ip_address.address().empty());
-    dest_host_port_pair = net::HostPortPair::FromIPEndPoint(
-        remote_address.ip_address);
+    dest_host_port_pair =
+        net::HostPortPair::FromIPEndPoint(remote_address.ip_address);
   }
 
   // TODO(mallinath) - We are ignoring local_address altogether. We should
@@ -136,22 +129,22 @@
         std::make_unique<jingle_glue::FakeSSLClientSocket>(std::move(socket_));
   }
 
-  int status = socket_->Connect(base::BindOnce(
-      &P2PSocketHostTcpBase::OnConnected, base::Unretained(this)));
+  int status = socket_->Connect(
+      base::BindOnce(&P2PSocketTcpBase::OnConnected, base::Unretained(this)));
   if (status != net::ERR_IO_PENDING) {
     // We defer execution of ProcessConnectDone instead of calling it
     // directly here as the caller may not expect an error/close to
     // happen here.  This is okay, as from the caller's point of view,
     // the connect always happens asynchronously.
     base::ThreadTaskRunnerHandle::Get()->PostTask(
-        FROM_HERE, base::BindOnce(&P2PSocketHostTcpBase::OnConnected,
+        FROM_HERE, base::BindOnce(&P2PSocketTcpBase::OnConnected,
                                   base::Unretained(this), status));
   }
 
   return state_ != STATE_ERROR;
 }
 
-void P2PSocketHostTcpBase::OnError() {
+void P2PSocketTcpBase::OnError() {
   socket_.reset();
 
   if (state_ == STATE_UNINITIALIZED || state_ == STATE_CONNECTING ||
@@ -163,7 +156,7 @@
   state_ = STATE_ERROR;
 }
 
-void P2PSocketHostTcpBase::OnConnected(int result) {
+void P2PSocketTcpBase::OnConnected(int result) {
   DCHECK_EQ(state_, STATE_CONNECTING);
   DCHECK_NE(result, net::ERR_IO_PENDING);
 
@@ -176,7 +169,7 @@
   OnOpen();
 }
 
-void P2PSocketHostTcpBase::OnOpen() {
+void P2PSocketTcpBase::OnOpen() {
   state_ = STATE_OPEN;
   // Setting socket send and receive buffer size.
   if (net::OK != socket_->SetReceiveBufferSize(kTcpRecvSocketBufferSize)) {
@@ -196,13 +189,13 @@
   DoRead();
 }
 
-bool P2PSocketHostTcpBase::DoSendSocketCreateMsg() {
+bool P2PSocketTcpBase::DoSendSocketCreateMsg() {
   DCHECK(socket_.get());
 
   net::IPEndPoint local_address;
   int result = socket_->GetLocalAddress(&local_address);
   if (result < 0) {
-    LOG(ERROR) << "P2PSocketHostTcpBase::OnConnected: unable to get local"
+    LOG(ERROR) << "P2PSocketTcpBase::OnConnected: unable to get local"
                << " address: " << result;
     OnError();
     return false;
@@ -216,7 +209,7 @@
   // through a proxy.
   result = socket_->GetPeerAddress(&remote_address);
   if (result < 0 && result != net::ERR_NAME_NOT_RESOLVED) {
-    LOG(ERROR) << "P2PSocketHostTcpBase::OnConnected: unable to get peer"
+    LOG(ERROR) << "P2PSocketTcpBase::OnConnected: unable to get peer"
                << " address: " << result;
     OnError();
     return false;
@@ -240,7 +233,7 @@
   return true;
 }
 
-void P2PSocketHostTcpBase::DoRead() {
+void P2PSocketTcpBase::DoRead() {
   int result;
   do {
     if (!read_buffer_.get()) {
@@ -256,21 +249,21 @@
     }
     result = socket_->Read(
         read_buffer_.get(), read_buffer_->RemainingCapacity(),
-        base::BindOnce(&P2PSocketHostTcp::OnRead, base::Unretained(this)));
+        base::BindOnce(&P2PSocketTcp::OnRead, base::Unretained(this)));
     DidCompleteRead(result);
   } while (result > 0);
 }
 
-void P2PSocketHostTcpBase::OnRead(int result) {
+void P2PSocketTcpBase::OnRead(int result) {
   DidCompleteRead(result);
   if (state_ == STATE_OPEN) {
     DoRead();
   }
 }
 
-void P2PSocketHostTcpBase::OnPacket(const std::vector<int8_t>& data) {
+void P2PSocketTcpBase::OnPacket(const std::vector<int8_t>& data) {
   if (!connected_) {
-    P2PSocketHost::StunMessageType type;
+    P2PSocket::StunMessageType type;
     bool stun = GetStunPacketType(&*data.begin(), data.size(), &type);
     if (stun && IsRequestOrResponse(type)) {
       connected_ = true;
@@ -291,7 +284,7 @@
     DumpRtpPacket(&data[0], data.size(), true);
 }
 
-void P2PSocketHostTcpBase::WriteOrQueue(SendBuffer& send_buffer) {
+void P2PSocketTcpBase::WriteOrQueue(SendBuffer& send_buffer) {
   IncrementTotalSentPackets();
   if (write_buffer_.buffer.get()) {
     write_queue_.push(send_buffer);
@@ -304,18 +297,18 @@
   DoWrite();
 }
 
-void P2PSocketHostTcpBase::DoWrite() {
+void P2PSocketTcpBase::DoWrite() {
   while (write_buffer_.buffer.get() && state_ == STATE_OPEN &&
          !write_pending_) {
     int result = socket_->Write(
         write_buffer_.buffer.get(), write_buffer_.buffer->BytesRemaining(),
-        base::BindOnce(&P2PSocketHostTcp::OnWritten, base::Unretained(this)),
+        base::BindOnce(&P2PSocketTcp::OnWritten, base::Unretained(this)),
         net::NetworkTrafficAnnotationTag(write_buffer_.traffic_annotation));
     HandleWriteResult(result);
   }
 }
 
-void P2PSocketHostTcpBase::OnWritten(int result) {
+void P2PSocketTcpBase::OnWritten(int result) {
   DCHECK(write_pending_);
   DCHECK_NE(result, net::ERR_IO_PENDING);
 
@@ -324,14 +317,14 @@
   DoWrite();
 }
 
-void P2PSocketHostTcpBase::HandleWriteResult(int result) {
+void P2PSocketTcpBase::HandleWriteResult(int result) {
   DCHECK(write_buffer_.buffer.get());
   if (result >= 0) {
     write_buffer_.buffer->DidConsume(result);
     if (write_buffer_.buffer->BytesRemaining() == 0) {
       base::TimeTicks send_time = base::TimeTicks::Now();
-      client_->SendComplete(network::P2PSendPacketMetrics(
-          0, write_buffer_.rtc_packet_id, send_time));
+      client_->SendComplete(
+          P2PSendPacketMetrics(0, write_buffer_.rtc_packet_id, send_time));
       if (write_queue_.empty()) {
         write_buffer_.buffer = nullptr;
         write_buffer_.rtc_packet_id = -1;
@@ -352,7 +345,7 @@
   }
 }
 
-void P2PSocketHostTcpBase::DidCompleteRead(int result) {
+void P2PSocketTcpBase::DidCompleteRead(int result) {
   DCHECK_EQ(state_, STATE_OPEN);
 
   if (result == net::ERR_IO_PENDING) {
@@ -384,17 +377,17 @@
   }
 }
 
-void P2PSocketHostTcpBase::AcceptIncomingTcpConnection(
+void P2PSocketTcpBase::AcceptIncomingTcpConnection(
     const net::IPEndPoint& remote_address,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket) {
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest socket) {
   NOTREACHED();
   OnError();
 }
 
-void P2PSocketHostTcpBase::Send(
+void P2PSocketTcpBase::Send(
     const std::vector<int8_t>& data,
-    const network::P2PPacketInfo& packet_info,
+    const P2PPacketInfo& packet_info,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
   if (data.size() > kMaximumPacketSize) {
     LOG(ERROR) << "Received P2PHostMsg_Send with a packet that is too big: "
@@ -418,7 +411,7 @@
   }
 
   if (!connected_) {
-    P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType();
+    P2PSocket::StunMessageType type = P2PSocket::StunMessageType();
     bool stun = GetStunPacketType(&*data.begin(), data.size(), &type);
     if (!stun || type == STUN_DATA_INDICATION) {
       LOG(ERROR) << "Page tried to send a data packet to "
@@ -433,21 +426,20 @@
          net::NetworkTrafficAnnotationTag(traffic_annotation));
 }
 
-void P2PSocketHostTcpBase::SetOption(network::P2PSocketOption option,
-                                     int32_t value) {
+void P2PSocketTcpBase::SetOption(P2PSocketOption option, int32_t value) {
   if (state_ != STATE_OPEN) {
     DCHECK_EQ(state_, STATE_ERROR);
     return;
   }
 
   switch (option) {
-    case network::P2P_SOCKET_OPT_RCVBUF:
+    case P2P_SOCKET_OPT_RCVBUF:
       socket_->SetReceiveBufferSize(value);
       break;
-    case network::P2P_SOCKET_OPT_SNDBUF:
+    case P2P_SOCKET_OPT_SNDBUF:
       socket_->SetSendBufferSize(value);
       break;
-    case network::P2P_SOCKET_OPT_DSCP:
+    case P2P_SOCKET_OPT_DSCP:
       return;  // For TCP sockets DSCP setting is not available.
     default:
       NOTREACHED();
@@ -455,28 +447,24 @@
   }
 }
 
-P2PSocketHostTcp::P2PSocketHostTcp(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    network::P2PSocketType type,
-    net::URLRequestContextGetter* url_context,
-    network::ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory)
-    : P2PSocketHostTcpBase(socket_dispatcher_host,
-                           std::move(client),
-                           std::move(socket),
-                           type,
-                           url_context,
-                           proxy_resolving_socket_factory) {
-  DCHECK(type == network::P2P_SOCKET_TCP_CLIENT ||
-         type == network::P2P_SOCKET_SSLTCP_CLIENT ||
-         type == network::P2P_SOCKET_TLS_CLIENT);
+P2PSocketTcp::P2PSocketTcp(
+    P2PSocketManager* socket_manager,
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest socket,
+    P2PSocketType type,
+    ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory)
+    : P2PSocketTcpBase(socket_manager,
+                       std::move(client),
+                       std::move(socket),
+                       type,
+                       proxy_resolving_socket_factory) {
+  DCHECK(type == P2P_SOCKET_TCP_CLIENT || type == P2P_SOCKET_SSLTCP_CLIENT ||
+         type == P2P_SOCKET_TLS_CLIENT);
 }
 
-P2PSocketHostTcp::~P2PSocketHostTcp() {
-}
+P2PSocketTcp::~P2PSocketTcp() {}
 
-int P2PSocketHostTcp::ProcessInput(char* input, int input_len) {
+int P2PSocketTcp::ProcessInput(char* input, int input_len) {
   if (input_len < kPacketHeaderSize)
     return 0;
   int packet_size = base::NetToHost16(*reinterpret_cast<uint16_t*>(input));
@@ -491,7 +479,7 @@
   return consumed;
 }
 
-void P2PSocketHostTcp::DoSend(
+void P2PSocketTcp::DoSend(
     const net::IPEndPoint& to,
     const std::vector<int8_t>& data,
     const rtc::PacketOptions& options,
@@ -515,29 +503,26 @@
   WriteOrQueue(send_buffer);
 }
 
-// P2PSocketHostStunTcp
-P2PSocketHostStunTcp::P2PSocketHostStunTcp(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    network::P2PSocketType type,
-    net::URLRequestContextGetter* url_context,
-    network::ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory)
-    : P2PSocketHostTcpBase(socket_dispatcher_host,
-                           std::move(client),
-                           std::move(socket),
-                           type,
-                           url_context,
-                           proxy_resolving_socket_factory) {
-  DCHECK(type == network::P2P_SOCKET_STUN_TCP_CLIENT ||
-         type == network::P2P_SOCKET_STUN_SSLTCP_CLIENT ||
-         type == network::P2P_SOCKET_STUN_TLS_CLIENT);
+// P2PSocketStunTcp
+P2PSocketStunTcp::P2PSocketStunTcp(
+    P2PSocketManager* socket_manager,
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest socket,
+    P2PSocketType type,
+    ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory)
+    : P2PSocketTcpBase(socket_manager,
+                       std::move(client),
+                       std::move(socket),
+                       type,
+                       proxy_resolving_socket_factory) {
+  DCHECK(type == P2P_SOCKET_STUN_TCP_CLIENT ||
+         type == P2P_SOCKET_STUN_SSLTCP_CLIENT ||
+         type == P2P_SOCKET_STUN_TLS_CLIENT);
 }
 
-P2PSocketHostStunTcp::~P2PSocketHostStunTcp() {
-}
+P2PSocketStunTcp::~P2PSocketStunTcp() {}
 
-int P2PSocketHostStunTcp::ProcessInput(char* input, int input_len) {
+int P2PSocketStunTcp::ProcessInput(char* input, int input_len) {
   if (input_len < kPacketHeaderSize + kPacketLengthOffset)
     return 0;
 
@@ -558,7 +543,7 @@
   return consumed;
 }
 
-void P2PSocketHostStunTcp::DoSend(
+void P2PSocketStunTcp::DoSend(
     const net::IPEndPoint& to,
     const std::vector<int8_t>& data,
     const rtc::PacketOptions& options,
@@ -572,8 +557,8 @@
   }
 
   int pad_bytes;
-  size_t expected_len = GetExpectedPacketSize(
-      &data[0], data.size(), &pad_bytes);
+  size_t expected_len =
+      GetExpectedPacketSize(&data[0], data.size(), &pad_bytes);
 
   // Accepts only complete STUN/TURN packets.
   if (data.size() != expected_len) {
@@ -608,9 +593,9 @@
                   data.size(), false);
 }
 
-int P2PSocketHostStunTcp::GetExpectedPacketSize(const int8_t* data,
-                                                int len,
-                                                int* pad_bytes) {
+int P2PSocketStunTcp::GetExpectedPacketSize(const int8_t* data,
+                                            int len,
+                                            int* pad_bytes) {
   DCHECK_LE(kTurnChannelDataHeaderSize, len);
   // Both stun and turn had length at offset 2.
   int packet_size = base::NetToHost16(
@@ -633,4 +618,4 @@
   return packet_size;
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/services/network/p2p/socket_tcp.h b/services/network/p2p/socket_tcp.h
new file mode 100644
index 0000000..064a5fa
--- /dev/null
+++ b/services/network/p2p/socket_tcp.h
@@ -0,0 +1,178 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_P2P_SOCKET_TCP_H_
+#define SERVICES_NETWORK_P2P_SOCKET_TCP_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/compiler_specific.h"
+#include "base/component_export.h"
+#include "base/containers/queue.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "net/base/completion_callback.h"
+#include "net/base/ip_endpoint.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/network/p2p/socket.h"
+#include "services/network/public/cpp/p2p_socket_type.h"
+
+namespace net {
+class DrainableIOBuffer;
+class GrowableIOBuffer;
+class StreamSocket;
+}  // namespace net
+
+namespace network {
+class ProxyResolvingClientSocketFactory;
+
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcpBase : public P2PSocket {
+ public:
+  P2PSocketTcpBase(
+      P2PSocketManager* socket_manager,
+      mojom::P2PSocketClientPtr client,
+      mojom::P2PSocketRequest socket,
+      P2PSocketType type,
+      ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory);
+  ~P2PSocketTcpBase() override;
+
+  bool InitAccepted(const net::IPEndPoint& remote_address,
+                    std::unique_ptr<net::StreamSocket> socket);
+
+  // P2PSocket overrides.
+  bool Init(const net::IPEndPoint& local_address,
+            uint16_t min_port,
+            uint16_t max_port,
+            const P2PHostAndIPEndPoint& remote_address) override;
+
+  // mojom::P2PSocket implementation:
+  void AcceptIncomingTcpConnection(const net::IPEndPoint& remote_address,
+                                   mojom::P2PSocketClientPtr client,
+                                   mojom::P2PSocketRequest socket) override;
+  void Send(const std::vector<int8_t>& data,
+            const P2PPacketInfo& packet_info,
+            const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
+      override;
+  void SetOption(P2PSocketOption option, int32_t value) override;
+
+ protected:
+  struct SendBuffer {
+    SendBuffer();
+    SendBuffer(int32_t packet_id,
+               scoped_refptr<net::DrainableIOBuffer> buffer,
+               const net::NetworkTrafficAnnotationTag traffic_annotation);
+    SendBuffer(const SendBuffer& rhs);
+    ~SendBuffer();
+
+    int32_t rtc_packet_id;
+    scoped_refptr<net::DrainableIOBuffer> buffer;
+    net::MutableNetworkTrafficAnnotationTag traffic_annotation;
+  };
+
+  // Derived classes will provide the implementation.
+  virtual int ProcessInput(char* input, int input_len) = 0;
+  virtual void DoSend(
+      const net::IPEndPoint& to,
+      const std::vector<int8_t>& data,
+      const rtc::PacketOptions& options,
+      const net::NetworkTrafficAnnotationTag traffic_annotation) = 0;
+
+  void WriteOrQueue(SendBuffer& send_buffer);
+  void OnPacket(const std::vector<int8_t>& data);
+  void OnError();
+
+ private:
+  friend class P2PSocketTcpTestBase;
+  friend class P2PSocketTcpServerTest;
+
+  void DidCompleteRead(int result);
+  void DoRead();
+
+  void DoWrite();
+  void HandleWriteResult(int result);
+
+  // Callbacks for Connect(), Read() and Write().
+  void OnConnected(int result);
+  void OnRead(int result);
+  void OnWritten(int result);
+
+  // Helper method to send socket create message and start read.
+  void OnOpen();
+  bool DoSendSocketCreateMsg();
+
+  P2PHostAndIPEndPoint remote_address_;
+
+  std::unique_ptr<net::StreamSocket> socket_;
+  scoped_refptr<net::GrowableIOBuffer> read_buffer_;
+  base::queue<SendBuffer> write_queue_;
+  SendBuffer write_buffer_;
+
+  bool write_pending_;
+
+  bool connected_;
+  P2PSocketType type_;
+  ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(P2PSocketTcpBase);
+};
+
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcp : public P2PSocketTcpBase {
+ public:
+  P2PSocketTcp(
+      P2PSocketManager* socket_manager,
+      mojom::P2PSocketClientPtr client,
+      mojom::P2PSocketRequest socket,
+      P2PSocketType type,
+      ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory);
+
+  ~P2PSocketTcp() override;
+
+ protected:
+  int ProcessInput(char* input, int input_len) override;
+  void DoSend(
+      const net::IPEndPoint& to,
+      const std::vector<int8_t>& data,
+      const rtc::PacketOptions& options,
+      const net::NetworkTrafficAnnotationTag traffic_annotation) override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(P2PSocketTcp);
+};
+
+// P2PSocketStunTcp class provides the framing of STUN messages when used
+// with TURN. These messages will not have length at front of the packet and
+// are padded to multiple of 4 bytes.
+// Formatting of messages is defined in RFC5766.
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketStunTcp
+    : public P2PSocketTcpBase {
+ public:
+  P2PSocketStunTcp(
+      P2PSocketManager* socket_manager,
+      mojom::P2PSocketClientPtr client,
+      mojom::P2PSocketRequest socket,
+      P2PSocketType type,
+      ProxyResolvingClientSocketFactory* proxy_resolving_socket_factory);
+
+  ~P2PSocketStunTcp() override;
+
+ protected:
+  int ProcessInput(char* input, int input_len) override;
+  void DoSend(
+      const net::IPEndPoint& to,
+      const std::vector<int8_t>& data,
+      const rtc::PacketOptions& options,
+      const net::NetworkTrafficAnnotationTag traffic_annotation) override;
+
+ private:
+  int GetExpectedPacketSize(const int8_t* data, int len, int* pad_bytes);
+
+  DISALLOW_COPY_AND_ASSIGN(P2PSocketStunTcp);
+};
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_P2P_SOCKET_TCP_H_
diff --git a/services/network/p2p/socket_tcp_server.cc b/services/network/p2p/socket_tcp_server.cc
new file mode 100644
index 0000000..a43580c
--- /dev/null
+++ b/services/network/p2p/socket_tcp_server.cc
@@ -0,0 +1,171 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "services/network/p2p/socket_tcp_server.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/bind_helpers.h"
+#include "net/base/address_list.h"
+#include "net/base/net_errors.h"
+#include "net/log/net_log_source.h"
+#include "net/socket/stream_socket.h"
+#include "services/network/p2p/socket_manager.h"
+#include "services/network/p2p/socket_tcp.h"
+#include "services/network/public/cpp/p2p_param_traits.h"
+
+namespace {
+const int kListenBacklog = 5;
+}  // namespace
+
+namespace network {
+
+P2PSocketTcpServer::P2PSocketTcpServer(P2PSocketManager* socket_manager,
+                                       mojom::P2PSocketClientPtr client,
+                                       mojom::P2PSocketRequest socket,
+                                       P2PSocketType client_type)
+    : P2PSocket(socket_manager,
+                std::move(client),
+                std::move(socket),
+                P2PSocket::TCP),
+      client_type_(client_type),
+      socket_(new net::TCPServerSocket(nullptr, net::NetLogSource())),
+      accept_callback_(base::BindRepeating(&P2PSocketTcpServer::OnAccepted,
+                                           base::Unretained(this))) {}
+
+P2PSocketTcpServer::~P2PSocketTcpServer() {
+  if (state_ == STATE_OPEN) {
+    DCHECK(socket_.get());
+    socket_.reset();
+  }
+}
+
+// TODO(guidou): Add support for port range.
+bool P2PSocketTcpServer::Init(const net::IPEndPoint& local_address,
+                              uint16_t min_port,
+                              uint16_t max_port,
+                              const P2PHostAndIPEndPoint& remote_address) {
+  DCHECK_EQ(state_, STATE_UNINITIALIZED);
+
+  int result = socket_->Listen(local_address, kListenBacklog);
+  if (result < 0) {
+    LOG(ERROR) << "Listen() failed: " << result;
+    OnError();
+    return false;
+  }
+
+  result = socket_->GetLocalAddress(&local_address_);
+  if (result < 0) {
+    LOG(ERROR) << "P2PSocketTcpServer::Init(): can't to get local address: "
+               << result;
+    OnError();
+    return false;
+  }
+  VLOG(1) << "Local address: " << local_address_.ToString();
+
+  state_ = STATE_OPEN;
+  // NOTE: Remote address can be empty as socket is just listening
+  // in this state.
+  client_->SocketCreated(local_address_, remote_address.ip_address);
+  DoAccept();
+  return true;
+}
+
+std::unique_ptr<P2PSocketTcpBase>
+P2PSocketTcpServer::AcceptIncomingTcpConnectionInternal(
+    const net::IPEndPoint& remote_address,
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest request) {
+  auto it = accepted_sockets_.find(remote_address);
+  if (it == accepted_sockets_.end())
+    return nullptr;
+
+  std::unique_ptr<net::StreamSocket> socket = std::move(it->second);
+  accepted_sockets_.erase(it);
+
+  std::unique_ptr<P2PSocketTcpBase> result;
+  if (client_type_ == P2P_SOCKET_TCP_CLIENT) {
+    result.reset(new P2PSocketTcp(socket_manager_, std::move(client),
+                                  std::move(request), client_type_, nullptr));
+  } else {
+    result.reset(new P2PSocketStunTcp(socket_manager_, std::move(client),
+                                      std::move(request), client_type_,
+                                      nullptr));
+  }
+  if (!result->InitAccepted(remote_address, std::move(socket)))
+    return nullptr;
+
+  return result;
+}
+
+void P2PSocketTcpServer::OnError() {
+  socket_.reset();
+
+  if (state_ == STATE_UNINITIALIZED || state_ == STATE_OPEN) {
+    binding_.Close();
+    client_.reset();
+  }
+
+  state_ = STATE_ERROR;
+}
+
+void P2PSocketTcpServer::DoAccept() {
+  while (true) {
+    int result = socket_->Accept(&accept_socket_, accept_callback_);
+    if (result == net::ERR_IO_PENDING) {
+      break;
+    } else {
+      HandleAcceptResult(result);
+    }
+  }
+}
+
+void P2PSocketTcpServer::HandleAcceptResult(int result) {
+  if (result < 0) {
+    if (result != net::ERR_IO_PENDING)
+      OnError();
+    return;
+  }
+
+  net::IPEndPoint address;
+  if (accept_socket_->GetPeerAddress(&address) != net::OK) {
+    LOG(ERROR) << "Failed to get address of an accepted socket.";
+    accept_socket_.reset();
+    return;
+  }
+  accepted_sockets_[address] = std::move(accept_socket_);
+  client_->IncomingTcpConnection(address);
+}
+
+void P2PSocketTcpServer::OnAccepted(int result) {
+  HandleAcceptResult(result);
+  if (result == net::OK)
+    DoAccept();
+}
+
+void P2PSocketTcpServer::AcceptIncomingTcpConnection(
+    const net::IPEndPoint& remote_address,
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest request) {
+  std::unique_ptr<P2PSocketTcpBase> socket =
+      AcceptIncomingTcpConnectionInternal(remote_address, std::move(client),
+                                          std::move(request));
+  if (socket)
+    socket_manager_->AddAcceptedConnection(std::move(socket));
+}
+
+void P2PSocketTcpServer::Send(
+    const std::vector<int8_t>& data,
+    const P2PPacketInfo& packet_info,
+    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
+  NOTREACHED();
+  delete this;
+}
+
+void P2PSocketTcpServer::SetOption(P2PSocketOption option, int32_t value) {
+  // Currently we don't have use case tcp server sockets are used for p2p.
+}
+
+}  // namespace network
diff --git a/services/network/p2p/socket_tcp_server.h b/services/network/p2p/socket_tcp_server.h
new file mode 100644
index 0000000..0d1015c
--- /dev/null
+++ b/services/network/p2p/socket_tcp_server.h
@@ -0,0 +1,85 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef SERVICES_NETWORK_P2P_SOCKET_TCP_SERVER_H_
+#define SERVICES_NETWORK_P2P_SOCKET_TCP_SERVER_H_
+
+#include <stdint.h>
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "base/compiler_specific.h"
+#include "base/component_export.h"
+#include "base/macros.h"
+#include "net/base/completion_repeating_callback.h"
+#include "net/socket/tcp_server_socket.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/network/p2p/socket.h"
+#include "services/network/public/cpp/p2p_socket_type.h"
+
+namespace net {
+class StreamSocket;
+}  // namespace net
+
+namespace network {
+class P2PSocketTcpBase;
+
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcpServer : public P2PSocket {
+ public:
+  P2PSocketTcpServer(P2PSocketManager* socket_manager,
+                     mojom::P2PSocketClientPtr client,
+                     mojom::P2PSocketRequest socket,
+                     P2PSocketType client_type);
+  ~P2PSocketTcpServer() override;
+
+  // P2PSocket overrides.
+  bool Init(const net::IPEndPoint& local_address,
+            uint16_t min_port,
+            uint16_t max_port,
+            const P2PHostAndIPEndPoint& remote_address) override;
+
+  // mojom::P2PSocket implementation:
+  void AcceptIncomingTcpConnection(const net::IPEndPoint& remote_address,
+                                   mojom::P2PSocketClientPtr client,
+                                   mojom::P2PSocketRequest request) override;
+  void Send(const std::vector<int8_t>& data,
+            const P2PPacketInfo& packet_info,
+            const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
+      override;
+  void SetOption(P2PSocketOption option, int32_t value) override;
+
+ private:
+  friend class P2PSocketTcpServerTest;
+
+  std::unique_ptr<P2PSocketTcpBase> AcceptIncomingTcpConnectionInternal(
+      const net::IPEndPoint& remote_address,
+      mojom::P2PSocketClientPtr client,
+      mojom::P2PSocketRequest request);
+
+  void OnError();
+
+  void DoAccept();
+  void HandleAcceptResult(int result);
+
+  // Callback for Accept().
+  void OnAccepted(int result);
+
+  const P2PSocketType client_type_;
+  std::unique_ptr<net::ServerSocket> socket_;
+  net::IPEndPoint local_address_;
+
+  std::unique_ptr<net::StreamSocket> accept_socket_;
+  std::map<net::IPEndPoint, std::unique_ptr<net::StreamSocket>>
+      accepted_sockets_;
+
+  const net::CompletionRepeatingCallback accept_callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(P2PSocketTcpServer);
+};
+
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_P2P_SOCKET_TCP_SERVER_H_
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp_server_unittest.cc b/services/network/p2p/socket_tcp_server_unittest.cc
similarity index 72%
rename from content/browser/renderer_host/p2p/socket_host_tcp_server_unittest.cc
rename to services/network/p2p/socket_tcp_server_unittest.cc
index c67e8b5..b4371e8 100644
--- a/content/browser/renderer_host/p2p/socket_host_tcp_server_unittest.cc
+++ b/services/network/p2p/socket_tcp_server_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_tcp_server.h"
+#include "services/network/p2p/socket_tcp_server.h"
 
 #include <stdint.h>
 
@@ -11,9 +11,9 @@
 
 #include "base/run_loop.h"
 #include "base/test/scoped_task_environment.h"
-#include "content/browser/renderer_host/p2p/socket_host_tcp.h"
-#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
 #include "net/base/completion_once_callback.h"
+#include "services/network/p2p/socket_tcp.h"
+#include "services/network/p2p/socket_test_utils.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -82,28 +82,28 @@
 
 }  // namespace
 
-namespace content {
+namespace network {
 
-class P2PSocketHostTcpServerTest : public testing::Test {
+class P2PSocketTcpServerTest : public testing::Test {
  protected:
   void SetUp() override {
-    network::mojom::P2PSocketClientPtr socket_client;
+    mojom::P2PSocketClientPtr socket_client;
     auto socket_client_request = mojo::MakeRequest(&socket_client);
-    network::mojom::P2PSocketPtr socket;
+    mojom::P2PSocketPtr socket;
     auto socket_request = mojo::MakeRequest(&socket);
 
     fake_client_.reset(new FakeSocketClient(std::move(socket),
                                             std::move(socket_client_request)));
 
     socket_ = new FakeServerSocket();
-    socket_host_.reset(new P2PSocketHostTcpServer(
-        nullptr, std::move(socket_client), std::move(socket_request),
-        network::P2P_SOCKET_TCP_CLIENT));
+    socket_host_.reset(new P2PSocketTcpServer(nullptr, std::move(socket_client),
+                                              std::move(socket_request),
+                                              P2P_SOCKET_TCP_CLIENT));
     socket_host_->socket_.reset(socket_);
 
     EXPECT_CALL(*fake_client_.get(), SocketCreated(_, _)).Times(1);
 
-    network::P2PHostAndIPEndPoint dest;
+    P2PHostAndIPEndPoint dest;
     dest.ip_address = ParseAddress(kTestIpAddress1, kTestPort1);
 
     socket_host_->Init(ParseAddress(kTestLocalIpAddress, 0), 0, 0, dest);
@@ -112,16 +112,16 @@
   }
 
   // Needed by the child classes because only this class is a friend
-  // of P2PSocketHostTcp.
-  net::StreamSocket* GetSocketFormTcpSocketHost(P2PSocketHostTcpBase* host) {
+  // of P2PSocketTcp.
+  net::StreamSocket* GetSocketFormTcpSocket(P2PSocketTcpBase* host) {
     return host->socket_.get();
   }
 
-  std::unique_ptr<P2PSocketHostTcpBase> AcceptIncomingTcpConnection(
+  std::unique_ptr<P2PSocketTcpBase> AcceptIncomingTcpConnection(
       const net::IPEndPoint& address) {
-    network::mojom::P2PSocketClientPtr socket_client;
+    mojom::P2PSocketClientPtr socket_client;
     auto socket_client_request = mojo::MakeRequest(&socket_client);
-    network::mojom::P2PSocketPtr socket;
+    mojom::P2PSocketPtr socket;
     auto socket_request = mojo::MakeRequest(&socket);
 
     return socket_host_->AcceptIncomingTcpConnectionInternal(
@@ -131,11 +131,11 @@
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   FakeServerSocket* socket_;  // Owned by |socket_host_|.
   std::unique_ptr<FakeSocketClient> fake_client_;
-  std::unique_ptr<P2PSocketHostTcpServer> socket_host_;
+  std::unique_ptr<P2PSocketTcpServer> socket_host_;
 };
 
 // Accept incoming connection.
-TEST_F(P2PSocketHostTcpServerTest, Accept) {
+TEST_F(P2PSocketTcpServerTest, Accept) {
   FakeSocket* incoming = new FakeSocket(nullptr);
   incoming->SetLocalAddress(ParseAddress(kTestLocalIpAddress, kTestPort1));
   net::IPEndPoint addr = ParseAddress(kTestIpAddress1, kTestPort1);
@@ -144,17 +144,15 @@
   EXPECT_CALL(*fake_client_.get(), IncomingTcpConnection(addr)).Times(1);
   socket_->AddIncoming(incoming);
 
-  std::unique_ptr<P2PSocketHostTcpBase> new_host(
-      AcceptIncomingTcpConnection(addr));
+  std::unique_ptr<P2PSocketTcpBase> new_host(AcceptIncomingTcpConnection(addr));
   ASSERT_TRUE(new_host.get() != nullptr);
-  EXPECT_EQ(incoming, GetSocketFormTcpSocketHost(new_host.get()));
+  EXPECT_EQ(incoming, GetSocketFormTcpSocket(new_host.get()));
 
-  new_host.release();  // Deletes itself on connection error.
   base::RunLoop().RunUntilIdle();
 }
 
 // Accept 2 simultaneous connections.
-TEST_F(P2PSocketHostTcpServerTest, Accept2) {
+TEST_F(P2PSocketTcpServerTest, Accept2) {
   FakeSocket* incoming1 = new FakeSocket(nullptr);
   incoming1->SetLocalAddress(ParseAddress(kTestLocalIpAddress, kTestPort1));
   net::IPEndPoint addr1 = ParseAddress(kTestIpAddress1, kTestPort1);
@@ -169,20 +167,18 @@
   socket_->AddIncoming(incoming1);
   socket_->AddIncoming(incoming2);
 
-  std::unique_ptr<P2PSocketHostTcpBase> new_host1(
+  std::unique_ptr<P2PSocketTcpBase> new_host1(
       AcceptIncomingTcpConnection(addr1));
   ASSERT_TRUE(new_host1.get() != nullptr);
-  EXPECT_EQ(incoming1, GetSocketFormTcpSocketHost(
-      reinterpret_cast<P2PSocketHostTcp*>(new_host1.get())));
-  std::unique_ptr<P2PSocketHostTcpBase> new_host2(
+  EXPECT_EQ(incoming1, GetSocketFormTcpSocket(
+                           reinterpret_cast<P2PSocketTcp*>(new_host1.get())));
+  std::unique_ptr<P2PSocketTcpBase> new_host2(
       AcceptIncomingTcpConnection(addr2));
   ASSERT_TRUE(new_host2.get() != nullptr);
-  EXPECT_EQ(incoming2, GetSocketFormTcpSocketHost(
-      reinterpret_cast<P2PSocketHostTcp*>(new_host2.get())));
+  EXPECT_EQ(incoming2, GetSocketFormTcpSocket(
+                           reinterpret_cast<P2PSocketTcp*>(new_host2.get())));
 
-  new_host1.release();  // Deletes itself on connection error.
-  new_host2.release();  // Deletes itself on connection error.
   base::RunLoop().RunUntilIdle();
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/browser/renderer_host/p2p/socket_host_tcp_unittest.cc b/services/network/p2p/socket_tcp_unittest.cc
similarity index 76%
rename from content/browser/renderer_host/p2p/socket_host_tcp_unittest.cc
rename to services/network/p2p/socket_tcp_unittest.cc
index f7640f2..130a889 100644
--- a/content/browser/renderer_host/p2p/socket_host_tcp_unittest.cc
+++ b/services/network/p2p/socket_tcp_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_tcp.h"
+#include "services/network/p2p/socket_tcp.h"
 
 #include <stddef.h>
 #include <stdint.h>
@@ -12,12 +12,12 @@
 #include "base/sys_byteorder.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
-#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
 #include "jingle/glue/fake_ssl_client_socket.h"
 #include "net/socket/socket_test_util.h"
 #include "net/socket/stream_socket.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "net/url_request/url_request_test_util.h"
+#include "services/network/p2p/socket_test_utils.h"
 #include "services/network/proxy_resolving_client_socket_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -27,18 +27,17 @@
 using ::testing::DoAll;
 using ::testing::Return;
 
-namespace content {
+namespace network {
 
-class P2PSocketHostTcpTestBase : public testing::Test {
+class P2PSocketTcpTestBase : public testing::Test {
  protected:
-  explicit P2PSocketHostTcpTestBase(network::P2PSocketType type)
-      : socket_type_(type) {}
+  explicit P2PSocketTcpTestBase(P2PSocketType type) : socket_type_(type) {}
 
   void SetUp() override {
-    network::mojom::P2PSocketClientPtr socket_client;
+    mojom::P2PSocketClientPtr socket_client;
     auto socket_client_request = mojo::MakeRequest(&socket_client);
 
-    network::mojom::P2PSocketPtr socket;
+    mojom::P2PSocketPtr socket;
     auto socket_request = mojo::MakeRequest(&socket);
 
     fake_client_.reset(new FakeSocketClient(std::move(socket),
@@ -46,14 +45,14 @@
 
     EXPECT_CALL(*fake_client_.get(), SocketCreated(_, _)).Times(1);
 
-    if (socket_type_ == network::P2P_SOCKET_TCP_CLIENT) {
-      socket_host_.reset(new P2PSocketHostTcp(
-          nullptr, std::move(socket_client), std::move(socket_request),
-          network::P2P_SOCKET_TCP_CLIENT, nullptr, nullptr));
+    if (socket_type_ == P2P_SOCKET_TCP_CLIENT) {
+      socket_host_.reset(new P2PSocketTcp(nullptr, std::move(socket_client),
+                                          std::move(socket_request),
+                                          P2P_SOCKET_TCP_CLIENT, nullptr));
     } else {
-      socket_host_.reset(new P2PSocketHostStunTcp(
+      socket_host_.reset(new P2PSocketStunTcp(
           nullptr, std::move(socket_client), std::move(socket_request),
-          network::P2P_SOCKET_STUN_TCP_CLIENT, nullptr, nullptr));
+          P2P_SOCKET_STUN_TCP_CLIENT, nullptr));
     }
 
     socket_ = new FakeSocket(&sent_data_);
@@ -65,7 +64,7 @@
     local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1);
 
     socket_host_->remote_address_ = dest_;
-    socket_host_->state_ = P2PSocketHost::STATE_CONNECTING;
+    socket_host_->state_ = P2PSocket::STATE_CONNECTING;
     socket_host_->OnConnected(net::OK);
     base::RunLoop().RunUntilIdle();
   }
@@ -81,48 +80,46 @@
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   std::string sent_data_;
   FakeSocket* socket_;  // Owned by |socket_host_|.
-  std::unique_ptr<P2PSocketHostTcpBase> socket_host_;
+  std::unique_ptr<P2PSocketTcpBase> socket_host_;
   std::unique_ptr<FakeSocketClient> fake_client_;
 
   net::IPEndPoint local_address_;
-  network::P2PHostAndIPEndPoint dest_;
-  network::P2PSocketType socket_type_;
+  P2PHostAndIPEndPoint dest_;
+  P2PSocketType socket_type_;
 };
 
-class P2PSocketHostTcpTest : public P2PSocketHostTcpTestBase {
+class P2PSocketTcpTest : public P2PSocketTcpTestBase {
  protected:
-  P2PSocketHostTcpTest()
-      : P2PSocketHostTcpTestBase(network::P2P_SOCKET_TCP_CLIENT) {}
+  P2PSocketTcpTest() : P2PSocketTcpTestBase(P2P_SOCKET_TCP_CLIENT) {}
 };
 
-class P2PSocketHostStunTcpTest : public P2PSocketHostTcpTestBase {
+class P2PSocketStunTcpTest : public P2PSocketTcpTestBase {
  protected:
-  P2PSocketHostStunTcpTest()
-      : P2PSocketHostTcpTestBase(network::P2P_SOCKET_STUN_TCP_CLIENT) {}
+  P2PSocketStunTcpTest() : P2PSocketTcpTestBase(P2P_SOCKET_STUN_TCP_CLIENT) {}
 };
 
 // Verify that we can send STUN message and that they are formatted
 // properly.
-TEST_F(P2PSocketHostTcpTest, SendStunNoAuth) {
+TEST_F(P2PSocketTcpTest, SendStunNoAuth) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(3);
 
   rtc::PacketOptions options;
   std::vector<int8_t> packet1;
   CreateStunRequest(&packet1);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet2, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet3;
   CreateStunError(&packet3);
   socket_host_->Send(
-      packet3, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet3, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::string expected_data;
@@ -140,26 +137,26 @@
 
 // Verify that we can receive STUN messages from the socket, and that
 // the messages are parsed properly.
-TEST_F(P2PSocketHostTcpTest, ReceiveStun) {
+TEST_F(P2PSocketTcpTest, ReceiveStun) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(3);
 
   rtc::PacketOptions options;
   std::vector<int8_t> packet1;
   CreateStunRequest(&packet1);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet2, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet3;
   CreateStunError(&packet3);
   socket_host_->Send(
-      packet3, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet3, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::string received_data;
@@ -190,12 +187,12 @@
 
 // Verify that we can't send data before we've received STUN response
 // from the other side.
-TEST_F(P2PSocketHostTcpTest, SendDataNoAuth) {
+TEST_F(P2PSocketTcpTest, SendDataNoAuth) {
   rtc::PacketOptions options;
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   EXPECT_EQ(0U, sent_data_.size());
@@ -206,15 +203,14 @@
 }
 
 // Verify that SetOption() doesn't crash after an error.
-TEST_F(P2PSocketHostTcpTest, SetOptionAfterError) {
+TEST_F(P2PSocketTcpTest, SetOptionAfterError) {
   // Get the sender into the error state.
   socket_host_->Send(
-      {1, 2, 3, 4},
-      network::P2PPacketInfo(dest_.ip_address, rtc::PacketOptions(), 0),
+      {1, 2, 3, 4}, P2PPacketInfo(dest_.ip_address, rtc::PacketOptions(), 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   // Verify that SetOptions() fails, but doesn't crash.
-  socket_host_->SetOption(network::P2P_SOCKET_OPT_RCVBUF, 2048);
+  socket_host_->SetOption(P2P_SOCKET_OPT_RCVBUF, 2048);
 
   base::RunLoop().RunUntilIdle();
 
@@ -223,7 +219,7 @@
 
 // Verify that we can send data after we've received STUN response
 // from the other side.
-TEST_F(P2PSocketHostTcpTest, SendAfterStunRequest) {
+TEST_F(P2PSocketTcpTest, SendAfterStunRequest) {
   // Receive packet from |dest_|.
   std::vector<int8_t> request_packet;
   CreateStunRequest(&request_packet);
@@ -242,7 +238,7 @@
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::string expected_data;
@@ -255,7 +251,7 @@
 }
 
 // Verify that asynchronous writes are handled correctly.
-TEST_F(P2PSocketHostTcpTest, AsyncWrites) {
+TEST_F(P2PSocketTcpTest, AsyncWrites) {
   socket_->set_async_write(true);
 
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(2);
@@ -265,13 +261,13 @@
   CreateStunRequest(&packet1);
 
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet2, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   base::RunLoop().RunUntilIdle();
@@ -287,7 +283,7 @@
   base::RunLoop().RunUntilIdle();
 }
 
-TEST_F(P2PSocketHostTcpTest, PacketIdIsPropagated) {
+TEST_F(P2PSocketTcpTest, PacketIdIsPropagated) {
   socket_->set_async_write(true);
 
   const int32_t kRtcPacketId = 1234;
@@ -304,7 +300,7 @@
   CreateStunRequest(&packet1);
 
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   base::RunLoop().RunUntilIdle();
@@ -316,7 +312,7 @@
   EXPECT_EQ(expected_data, sent_data_);
 }
 
-TEST_F(P2PSocketHostTcpTest, SendDataWithPacketOptions) {
+TEST_F(P2PSocketTcpTest, SendDataWithPacketOptions) {
   std::vector<int8_t> request_packet;
   CreateStunRequest(&request_packet);
 
@@ -336,7 +332,7 @@
   // Make it a RTP packet.
   *reinterpret_cast<uint16_t*>(&*packet.begin()) = base::HostToNet16(0x8000);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::string expected_data;
@@ -350,26 +346,26 @@
 
 // Verify that we can send STUN message and that they are formatted
 // properly.
-TEST_F(P2PSocketHostStunTcpTest, SendStunNoAuth) {
+TEST_F(P2PSocketStunTcpTest, SendStunNoAuth) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(3);
 
   rtc::PacketOptions options;
   std::vector<int8_t> packet1;
   CreateStunRequest(&packet1);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet2, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet3;
   CreateStunError(&packet3);
   socket_host_->Send(
-      packet3, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet3, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::string expected_data;
@@ -384,26 +380,26 @@
 
 // Verify that we can receive STUN messages from the socket, and that
 // the messages are parsed properly.
-TEST_F(P2PSocketHostStunTcpTest, ReceiveStun) {
+TEST_F(P2PSocketStunTcpTest, ReceiveStun) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(3);
 
   rtc::PacketOptions options;
   std::vector<int8_t> packet1;
   CreateStunRequest(&packet1);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet2, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet3;
   CreateStunError(&packet3);
   socket_host_->Send(
-      packet3, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet3, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::string received_data;
@@ -431,12 +427,12 @@
 
 // Verify that we can't send data before we've received STUN response
 // from the other side.
-TEST_F(P2PSocketHostStunTcpTest, SendDataNoAuth) {
+TEST_F(P2PSocketStunTcpTest, SendDataNoAuth) {
   rtc::PacketOptions options;
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   EXPECT_EQ(0U, sent_data_.size());
@@ -447,7 +443,7 @@
 }
 
 // Verify that asynchronous writes are handled correctly.
-TEST_F(P2PSocketHostStunTcpTest, AsyncWrites) {
+TEST_F(P2PSocketStunTcpTest, AsyncWrites) {
   socket_->set_async_write(true);
 
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(2);
@@ -456,13 +452,13 @@
   std::vector<int8_t> packet1;
   CreateStunRequest(&packet1);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet1, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest_.ip_address, options, 0),
+      packet2, P2PPacketInfo(dest_.ip_address, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   base::RunLoop().RunUntilIdle();
@@ -475,15 +471,15 @@
 }
 
 // When pseudo-tls is used (e.g. for P2P_SOCKET_SSLTCP_CLIENT),
-// network::ProxyResolvingClientSocket::Connect() won't be called twice.
+// ProxyResolvingClientSocket::Connect() won't be called twice.
 // Regression test for crbug.com/840797.
-TEST(P2PSocketHostTcpWithPseudoTlsTest, Basic) {
+TEST(P2PSocketTcpWithPseudoTlsTest, Basic) {
   base::test::ScopedTaskEnvironment scoped_task_environment(
       base::test::ScopedTaskEnvironment::MainThreadType::IO);
 
-  network::mojom::P2PSocketClientPtr socket_client;
+  mojom::P2PSocketClientPtr socket_client;
   auto socket_client_request = mojo::MakeRequest(&socket_client);
-  network::mojom::P2PSocketPtr socket;
+  mojom::P2PSocketPtr socket;
   auto socket_request = mojo::MakeRequest(&socket);
 
   FakeSocketClient fake_client2(std::move(socket),
@@ -494,7 +490,7 @@
   net::MockClientSocketFactory mock_socket_factory;
   context.set_client_socket_factory(&mock_socket_factory);
   context.Init();
-  network::ProxyResolvingClientSocketFactory factory(&context);
+  ProxyResolvingClientSocketFactory factory(&context);
 
   base::StringPiece ssl_client_hello =
       jingle_glue::FakeSSLClientSocket::GetSslClientHello();
@@ -512,10 +508,10 @@
       net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr));
   mock_socket_factory.AddSocketDataProvider(&data_provider);
 
-  P2PSocketHostTcp host(nullptr, std::move(socket_client),
-                        std::move(socket_request),
-                        network::P2P_SOCKET_SSLTCP_CLIENT, nullptr, &factory);
-  network::P2PHostAndIPEndPoint dest;
+  P2PSocketTcp host(nullptr, std::move(socket_client),
+                    std::move(socket_request), P2P_SOCKET_SSLTCP_CLIENT,
+                    &factory);
+  P2PHostAndIPEndPoint dest;
   dest.ip_address = server_addr;
   bool success = host.Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0),
                            0, 0, dest);
@@ -526,26 +522,25 @@
   EXPECT_TRUE(data_provider.AllWriteDataConsumed());
 }
 
-class P2PSocketHostTcpWithTlsTest
-    : public testing::TestWithParam<
-          std::tuple<net::IoMode, network::P2PSocketType>> {};
+class P2PSocketTcpWithTlsTest
+    : public testing::TestWithParam<std::tuple<net::IoMode, P2PSocketType>> {};
 
 INSTANTIATE_TEST_CASE_P(
     /* no prefix */,
-    P2PSocketHostTcpWithTlsTest,
+    P2PSocketTcpWithTlsTest,
     ::testing::Combine(::testing::Values(net::SYNCHRONOUS, net::ASYNC),
-                       ::testing::Values(network::P2P_SOCKET_TLS_CLIENT,
-                                         network::P2P_SOCKET_STUN_TLS_CLIENT)));
+                       ::testing::Values(P2P_SOCKET_TLS_CLIENT,
+                                         P2P_SOCKET_STUN_TLS_CLIENT)));
 
 // Tests that if a socket type satisfies IsTlsClientSocket(), TLS connection is
 // established.
-TEST_P(P2PSocketHostTcpWithTlsTest, Basic) {
+TEST_P(P2PSocketTcpWithTlsTest, Basic) {
   base::test::ScopedTaskEnvironment scoped_task_environment(
       base::test::ScopedTaskEnvironment::MainThreadType::IO);
 
-  network::mojom::P2PSocketClientPtr socket_client;
+  mojom::P2PSocketClientPtr socket_client;
   auto socket_client_request = mojo::MakeRequest(&socket_client);
-  network::mojom::P2PSocketPtr socket;
+  mojom::P2PSocketPtr socket;
   auto socket_request = mojo::MakeRequest(&socket);
 
   FakeSocketClient fake_client2(std::move(socket),
@@ -556,9 +551,9 @@
   net::MockClientSocketFactory mock_socket_factory;
   context.set_client_socket_factory(&mock_socket_factory);
   context.Init();
-  network::ProxyResolvingClientSocketFactory factory(&context);
+  ProxyResolvingClientSocketFactory factory(&context);
   const net::IoMode io_mode = std::get<0>(GetParam());
-  const network::P2PSocketType socket_type = std::get<1>(GetParam());
+  const P2PSocketType socket_type = std::get<1>(GetParam());
   // OnOpen() calls DoRead(), so populate the mock socket with a pending read.
   net::MockRead reads[] = {
       net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)};
@@ -571,17 +566,17 @@
   mock_socket_factory.AddSocketDataProvider(&data_provider);
   mock_socket_factory.AddSSLSocketDataProvider(&ssl_socket_provider);
 
-  std::unique_ptr<P2PSocketHostTcpBase> host;
-  if (socket_type == network::P2P_SOCKET_STUN_TLS_CLIENT) {
-    host = std::make_unique<P2PSocketHostStunTcp>(
-        nullptr, std::move(socket_client), std::move(socket_request),
-        socket_type, nullptr, &factory);
-  } else {
-    host = std::make_unique<P2PSocketHostTcp>(nullptr, std::move(socket_client),
+  std::unique_ptr<P2PSocketTcpBase> host;
+  if (socket_type == P2P_SOCKET_STUN_TLS_CLIENT) {
+    host = std::make_unique<P2PSocketStunTcp>(nullptr, std::move(socket_client),
                                               std::move(socket_request),
-                                              socket_type, nullptr, &factory);
+                                              socket_type, &factory);
+  } else {
+    host = std::make_unique<P2PSocketTcp>(nullptr, std::move(socket_client),
+                                          std::move(socket_request),
+                                          socket_type, &factory);
   }
-  network::P2PHostAndIPEndPoint dest;
+  P2PHostAndIPEndPoint dest;
   dest.ip_address = server_addr;
   bool success = host->Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0),
                             0, 0, dest);
@@ -593,4 +588,4 @@
   EXPECT_TRUE(ssl_socket_provider.ConnectDataConsumed());
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/browser/renderer_host/p2p/socket_host_test_utils.cc b/services/network/p2p/socket_test_utils.cc
similarity index 88%
rename from content/browser/renderer_host/p2p/socket_host_test_utils.cc
rename to services/network/p2p/socket_test_utils.cc
index dfe85abd..5efa3953 100644
--- a/content/browser/renderer_host/p2p/socket_host_test_utils.cc
+++ b/services/network/p2p/socket_test_utils.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
+#include "services/network/p2p/socket_test_utils.h"
 
 #include <stddef.h>
 
@@ -15,24 +15,22 @@
 #include "net/base/ip_address.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 
+namespace network {
+
 const int kStunHeaderSize = 20;
 const uint16_t kStunBindingRequest = 0x0001;
 const uint16_t kStunBindingResponse = 0x0102;
 const uint16_t kStunBindingError = 0x0111;
 const uint32_t kStunMagicCookie = 0x2112A442;
 
-MockIPCSender::MockIPCSender() { }
-MockIPCSender::~MockIPCSender() { }
-
 FakeSocket::FakeSocket(std::string* written_data)
     : read_pending_(false),
       input_pos_(0),
       written_data_(written_data),
       async_write_(false),
-      write_pending_(false) {
-}
+      write_pending_(false) {}
 
-FakeSocket::~FakeSocket() { }
+FakeSocket::~FakeSocket() {}
 
 void FakeSocket::AppendInputData(const char* data, int data_size) {
   input_data_.insert(input_data_.end(), data, data + data_size);
@@ -61,9 +59,9 @@
                      int buf_len,
                      net::CompletionOnceCallback callback) {
   DCHECK(buf);
-  if (input_pos_ < static_cast<int>(input_data_.size())){
-    int result = std::min(buf_len,
-                          static_cast<int>(input_data_.size()) - input_pos_);
+  if (input_pos_ < static_cast<int>(input_data_.size())) {
+    int result =
+        std::min(buf_len, static_cast<int>(input_data_.size()) - input_pos_);
     memcpy(buf->data(), &(*input_data_.begin()) + input_pos_, result);
     input_pos_ += result;
     return result;
@@ -95,8 +93,8 @@
   }
 
   if (written_data_) {
-    written_data_->insert(written_data_->end(),
-                          buf->data(), buf->data() + buf_len);
+    written_data_->insert(written_data_->end(), buf->data(),
+                          buf->data() + buf_len);
   }
   return buf_len;
 }
@@ -107,8 +105,8 @@
   write_pending_ = false;
 
   if (written_data_) {
-    written_data_->insert(written_data_->end(),
-                          buf->data(), buf->data() + buf_len);
+    written_data_->insert(written_data_->end(), buf->data(),
+                          buf->data() + buf_len);
   }
   std::move(callback).Run(buf_len);
 }
@@ -179,9 +177,8 @@
   return 0;
 }
 
-FakeSocketClient::FakeSocketClient(
-    network::mojom::P2PSocketPtr socket,
-    network::mojom::P2PSocketClientRequest client_request)
+FakeSocketClient::FakeSocketClient(mojom::P2PSocketPtr socket,
+                                   mojom::P2PSocketClientRequest client_request)
     : socket_(std::move(socket)), binding_(this, std::move(client_request)) {
   binding_.set_connection_error_handler(
       base::BindLambdaForTesting([&]() { connection_error_ = true; }));
@@ -226,3 +223,5 @@
   EXPECT_TRUE(ip.AssignFromIPLiteral(ip_str));
   return net::IPEndPoint(ip, port);
 }
+
+}  // namespace network
diff --git a/content/browser/renderer_host/p2p/socket_host_test_utils.h b/services/network/p2p/socket_test_utils.h
similarity index 83%
rename from content/browser/renderer_host/p2p/socket_host_test_utils.h
rename to services/network/p2p/socket_test_utils.h
index 5ed10f1..fb4da3a 100644
--- a/content/browser/renderer_host/p2p/socket_host_test_utils.h
+++ b/services/network/p2p/socket_test_utils.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 CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TEST_UTILS_H_
-#define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TEST_UTILS_H_
+#ifndef SERVICES_NETWORK_P2P_SOCKET_TEST_UTILS_H_
+#define SERVICES_NETWORK_P2P_SOCKET_TEST_UTILS_H_
 
 #include <stdint.h>
 
@@ -11,7 +11,6 @@
 #include <tuple>
 #include <vector>
 
-#include "ipc/ipc_sender.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "net/base/net_errors.h"
 #include "net/log/net_log_with_source.h"
@@ -22,20 +21,14 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+namespace network {
+
 const char kTestLocalIpAddress[] = "123.44.22.4";
 const char kTestIpAddress1[] = "123.44.22.31";
 const uint16_t kTestPort1 = 234;
 const char kTestIpAddress2[] = "133.11.22.33";
 const uint16_t kTestPort2 = 543;
 
-class MockIPCSender : public IPC::Sender {
- public:
-  MockIPCSender();
-  ~MockIPCSender() override;
-
-  MOCK_METHOD1(Send, bool(IPC::Message* msg));
-};
-
 class FakeSocket : public net::StreamSocket {
  public:
   FakeSocket(std::string* written_data);
@@ -100,16 +93,16 @@
   net::NetLogWithSource net_log_;
 };
 
-class FakeSocketClient : public network::mojom::P2PSocketClient {
+class FakeSocketClient : public mojom::P2PSocketClient {
  public:
-  FakeSocketClient(network::mojom::P2PSocketPtr socket,
-                   network::mojom::P2PSocketClientRequest client_request);
+  FakeSocketClient(mojom::P2PSocketPtr socket,
+                   mojom::P2PSocketClientRequest client_request);
   ~FakeSocketClient() override;
 
-  // network::mojom::P2PSocketClient interface.
+  // mojom::P2PSocketClient interface.
   MOCK_METHOD2(SocketCreated,
                void(const net::IPEndPoint&, const net::IPEndPoint&));
-  MOCK_METHOD1(SendComplete, void(const network::P2PSendPacketMetrics&));
+  MOCK_METHOD1(SendComplete, void(const P2PSendPacketMetrics&));
   MOCK_METHOD1(IncomingTcpConnection, void(const net::IPEndPoint&));
   MOCK_METHOD3(DataReceived,
                void(const net::IPEndPoint&,
@@ -119,8 +112,8 @@
   bool connection_error() { return connection_error_; }
 
  private:
-  network::mojom::P2PSocketPtr socket_;
-  mojo::Binding<network::mojom::P2PSocketClient> binding_;
+  mojom::P2PSocketPtr socket_;
+  mojo::Binding<mojom::P2PSocketClient> binding_;
   bool connection_error_ = false;
 };
 
@@ -141,4 +134,6 @@
          arg.send_time <= base::TimeTicks::Now();
 }
 
-#endif  // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_TEST_UTILS_H_
+}  // namespace network
+
+#endif  // SERVICES_NETWORK_P2P_SOCKET_TEST_UTILS_H_
diff --git a/content/browser/renderer_host/p2p/socket_host_throttler.cc b/services/network/p2p/socket_throttler.cc
similarity index 76%
rename from content/browser/renderer_host/p2p/socket_host_throttler.cc
rename to services/network/p2p/socket_throttler.cc
index e54d190e..ddcfca4 100644
--- a/content/browser/renderer_host/p2p/socket_host_throttler.cc
+++ b/services/network/p2p/socket_throttler.cc
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_throttler.h"
+#include "services/network/p2p/socket_throttler.h"
 
 #include <utility>
 
 #include "third_party/webrtc/rtc_base/data_rate_limiter.h"
 #include "third_party/webrtc/rtc_base/timeutils.h"
 
-namespace content {
+namespace network {
 
-namespace  {
+namespace {
 
 const int kMaxIceMessageBandwidth = 256 * 1024;
 
@@ -20,16 +20,14 @@
 P2PMessageThrottler::P2PMessageThrottler()
     : rate_limiter_(new rtc::DataRateLimiter(kMaxIceMessageBandwidth, 1.0)) {}
 
-P2PMessageThrottler::~P2PMessageThrottler() {
-}
+P2PMessageThrottler::~P2PMessageThrottler() {}
 
 void P2PMessageThrottler::SetSendIceBandwidth(int bandwidth_kbps) {
   rate_limiter_.reset(new rtc::DataRateLimiter(bandwidth_kbps, 1.0));
 }
 
 bool P2PMessageThrottler::DropNextPacket(size_t packet_len) {
-  double now =
-      rtc::TimeNanos() / static_cast<double>(rtc::kNumNanosecsPerSec);
+  double now = rtc::TimeNanos() / static_cast<double>(rtc::kNumNanosecsPerSec);
   if (!rate_limiter_->CanUse(packet_len, now)) {
     // Exceeding the send rate, this packet should be dropped.
     return true;
@@ -39,4 +37,4 @@
   return false;
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/browser/renderer_host/p2p/socket_host_throttler.h b/services/network/p2p/socket_throttler.h
similarity index 69%
rename from content/browser/renderer_host/p2p/socket_host_throttler.h
rename to services/network/p2p/socket_throttler.h
index d8ad20c7..baefc44 100644
--- a/content/browser/renderer_host/p2p/socket_host_throttler.h
+++ b/services/network/p2p/socket_throttler.h
@@ -2,27 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_THROTTLER_H_
-#define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_THROTTLER_H_
+#ifndef SERVICES_NETWORK_P2P_SOCKET_THROTTLER_H_
+#define SERVICES_NETWORK_P2P_SOCKET_THROTTLER_H_
 
 #include <stddef.h>
 
 #include <memory>
 
+#include "base/component_export.h"
 #include "base/macros.h"
-#include "content/common/content_export.h"
 
 namespace rtc {
 class DataRateLimiter;
 }
 
-namespace content {
+namespace network {
 
 // A very simple message throtller. User of this class must drop the packet if
 // DropNextPacket returns false for that packet. This method verifies the
 // current sendrate against the required sendrate.
 
-class CONTENT_EXPORT P2PMessageThrottler {
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PMessageThrottler {
  public:
   P2PMessageThrottler();
   virtual ~P2PMessageThrottler();
@@ -36,6 +36,6 @@
   DISALLOW_COPY_AND_ASSIGN(P2PMessageThrottler);
 };
 
-}  // namespace content
+}  // namespace network
 
-#endif  // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_THROTTLER_H_
+#endif  // SERVICES_NETWORK_P2P_SOCKET_THROTTLER_H_
diff --git a/content/browser/renderer_host/p2p/socket_host_udp.cc b/services/network/p2p/socket_udp.cc
similarity index 74%
rename from content/browser/renderer_host/p2p/socket_host_udp.cc
rename to services/network/p2p/socket_udp.cc
index cb71b436..1cbc7103 100644
--- a/content/browser/renderer_host/p2p/socket_host_udp.cc
+++ b/services/network/p2p/socket_udp.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_udp.h"
+#include "services/network/p2p/socket_udp.h"
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
@@ -11,13 +11,10 @@
 #include "base/strings/stringprintf.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
-#include "content/browser/renderer_host/p2p/socket_host_throttler.h"
-#include "content/public/browser/content_browser_client.h"
-#include "content/public/common/content_client.h"
-#include "ipc/ipc_sender.h"
 #include "net/base/io_buffer.h"
 #include "net/base/net_errors.h"
 #include "net/log/net_log_source.h"
+#include "services/network/p2p/socket_throttler.h"
 #include "services/network/public/mojom/p2p.mojom.h"
 #include "third_party/webrtc/media/base/rtputils.h"
 
@@ -45,14 +42,13 @@
 struct {
   int code;
   const char* name;
-} static const kTransientErrors[] {
-  {net::ERR_ADDRESS_UNREACHABLE, "net::ERR_ADDRESS_UNREACHABLE"},
-  {net::ERR_ADDRESS_INVALID, "net::ERR_ADDRESS_INVALID"},
-  {net::ERR_ACCESS_DENIED, "net::ERR_ACCESS_DENIED"},
-  {net::ERR_CONNECTION_RESET, "net::ERR_CONNECTION_RESET"},
-  {net::ERR_OUT_OF_MEMORY, "net::ERR_OUT_OF_MEMORY"},
-  {net::ERR_INTERNET_DISCONNECTED, "net::ERR_INTERNET_DISCONNECTED"}
-};
+} static const kTransientErrors[]{
+    {net::ERR_ADDRESS_UNREACHABLE, "net::ERR_ADDRESS_UNREACHABLE"},
+    {net::ERR_ADDRESS_INVALID, "net::ERR_ADDRESS_INVALID"},
+    {net::ERR_ACCESS_DENIED, "net::ERR_ACCESS_DENIED"},
+    {net::ERR_CONNECTION_RESET, "net::ERR_CONNECTION_RESET"},
+    {net::ERR_OUT_OF_MEMORY, "net::ERR_OUT_OF_MEMORY"},
+    {net::ERR_INTERNET_DISCONNECTED, "net::ERR_INTERNET_DISCONNECTED"}};
 
 bool IsTransientError(int error) {
   for (const auto& transient_error : kTransientErrors) {
@@ -72,9 +68,9 @@
 
 }  // namespace
 
-namespace content {
+namespace network {
 
-P2PSocketHostUdp::PendingPacket::PendingPacket(
+P2PSocketUdp::PendingPacket::PendingPacket(
     const net::IPEndPoint& to,
     const std::vector<int8_t>& content,
     const rtc::PacketOptions& options,
@@ -89,23 +85,21 @@
   memcpy(data->data(), &content[0], size);
 }
 
-P2PSocketHostUdp::PendingPacket::PendingPacket(const PendingPacket& other) =
+P2PSocketUdp::PendingPacket::PendingPacket(const PendingPacket& other) =
     default;
 
-P2PSocketHostUdp::PendingPacket::~PendingPacket() {
-}
+P2PSocketUdp::PendingPacket::~PendingPacket() {}
 
-P2PSocketHostUdp::P2PSocketHostUdp(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    P2PMessageThrottler* throttler,
-    net::NetLog* net_log,
-    const DatagramServerSocketFactory& socket_factory)
-    : P2PSocketHost(socket_dispatcher_host,
-                    std::move(client),
-                    std::move(socket),
-                    P2PSocketHost::UDP),
+P2PSocketUdp::P2PSocketUdp(P2PSocketManager* socket_manager,
+                           mojom::P2PSocketClientPtr client,
+                           mojom::P2PSocketRequest socket,
+                           P2PMessageThrottler* throttler,
+                           net::NetLog* net_log,
+                           const DatagramServerSocketFactory& socket_factory)
+    : P2PSocket(socket_manager,
+                std::move(client),
+                std::move(socket),
+                P2PSocket::UDP),
       socket_(socket_factory.Run(net_log)),
       send_pending_(false),
       last_dscp_(net::DSCP_CS0),
@@ -113,31 +107,29 @@
       net_log_(net_log),
       socket_factory_(socket_factory) {}
 
-P2PSocketHostUdp::P2PSocketHostUdp(
-    P2PSocketDispatcherHost* socket_dispatcher_host,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket,
-    P2PMessageThrottler* throttler,
-    net::NetLog* net_log)
-    : P2PSocketHostUdp(socket_dispatcher_host,
-                       std::move(client),
-                       std::move(socket),
-                       throttler,
-                       net_log,
-                       base::Bind(&P2PSocketHostUdp::DefaultSocketFactory)) {}
+P2PSocketUdp::P2PSocketUdp(P2PSocketManager* socket_manager,
+                           mojom::P2PSocketClientPtr client,
+                           mojom::P2PSocketRequest socket,
+                           P2PMessageThrottler* throttler,
+                           net::NetLog* net_log)
+    : P2PSocketUdp(socket_manager,
+                   std::move(client),
+                   std::move(socket),
+                   throttler,
+                   net_log,
+                   base::Bind(&P2PSocketUdp::DefaultSocketFactory)) {}
 
-P2PSocketHostUdp::~P2PSocketHostUdp() {
+P2PSocketUdp::~P2PSocketUdp() {
   if (state_ == STATE_OPEN) {
     DCHECK(socket_.get());
     socket_.reset();
   }
 }
 
-bool P2PSocketHostUdp::Init(
-    const net::IPEndPoint& local_address,
-    uint16_t min_port,
-    uint16_t max_port,
-    const network::P2PHostAndIPEndPoint& remote_address) {
+bool P2PSocketUdp::Init(const net::IPEndPoint& local_address,
+                        uint16_t min_port,
+                        uint16_t max_port,
+                        const P2PHostAndIPEndPoint& remote_address) {
   DCHECK_EQ(state_, STATE_UNINITIALIZED);
   DCHECK((min_port == 0 && max_port == 0) || min_port > 0);
   DCHECK_LE(min_port, max_port);
@@ -181,7 +173,7 @@
   net::IPEndPoint address;
   result = socket_->GetLocalAddress(&address);
   if (result < 0) {
-    LOG(ERROR) << "P2PSocketHostUdp::Init(): unable to get local address: "
+    LOG(ERROR) << "P2PSocketUdp::Init(): unable to get local address: "
                << result;
     OnError();
     return false;
@@ -199,7 +191,7 @@
   return true;
 }
 
-void P2PSocketHostUdp::OnError() {
+void P2PSocketUdp::OnError() {
   socket_.reset();
   send_queue_.clear();
 
@@ -211,26 +203,26 @@
   state_ = STATE_ERROR;
 }
 
-void P2PSocketHostUdp::DoRead() {
+void P2PSocketUdp::DoRead() {
   int result;
   do {
     result = socket_->RecvFrom(
         recv_buffer_.get(), kUdpReadBufferSize, &recv_address_,
-        base::BindOnce(&P2PSocketHostUdp::OnRecv, base::Unretained(this)));
+        base::BindOnce(&P2PSocketUdp::OnRecv, base::Unretained(this)));
     if (result == net::ERR_IO_PENDING)
       return;
     HandleReadResult(result);
   } while (state_ == STATE_OPEN);
 }
 
-void P2PSocketHostUdp::OnRecv(int result) {
+void P2PSocketUdp::OnRecv(int result) {
   HandleReadResult(result);
   if (state_ == STATE_OPEN) {
     DoRead();
   }
 }
 
-void P2PSocketHostUdp::HandleReadResult(int result) {
+void P2PSocketUdp::HandleReadResult(int result) {
   DCHECK_EQ(STATE_OPEN, state_);
 
   if (result > 0) {
@@ -238,7 +230,7 @@
                              recv_buffer_->data() + result);
 
     if (!base::ContainsKey(connected_peers_, recv_address_)) {
-      P2PSocketHost::StunMessageType type;
+      P2PSocket::StunMessageType type;
       bool stun = GetStunPacketType(
           reinterpret_cast<const int8_t*>(&*data.begin()), data.size(), &type);
       if ((stun && IsRequestOrResponse(type))) {
@@ -261,7 +253,7 @@
   }
 }
 
-void P2PSocketHostUdp::DoSend(const PendingPacket& packet) {
+void P2PSocketUdp::DoSend(const PendingPacket& packet) {
   base::TimeTicks send_time = base::TimeTicks::Now();
 
   // The peer is considered not connected until the first incoming STUN
@@ -270,7 +262,7 @@
   // has to be done here instead of Send() to ensure P2PMsg_OnSendComplete
   // messages are sent in correct order.
   if (!base::ContainsKey(connected_peers_, packet.to)) {
-    P2PSocketHost::StunMessageType type = P2PSocketHost::StunMessageType();
+    P2PSocket::StunMessageType type = P2PSocket::StunMessageType();
     bool stun =
         GetStunPacketType(reinterpret_cast<const int8_t*>(packet.data->data()),
                           packet.size, &type);
@@ -286,7 +278,7 @@
       // The renderer expects P2PMsg_OnSendComplete for all packets it generates
       // and in the same order it generates them, so we need to respond even
       // when the packet is dropped.
-      client_->SendComplete(network::P2PSendPacketMetrics(
+      client_->SendComplete(P2PSendPacketMetrics(
           packet.id, packet.packet_options.packet_id, send_time));
       // Do not reset the socket.
       return;
@@ -319,7 +311,7 @@
                               packet.packet_options.packet_time_params,
                               (send_time - base::TimeTicks()).InMicroseconds());
   auto callback_binding =
-      base::Bind(&P2PSocketHostUdp::OnSend, base::Unretained(this), packet.id,
+      base::Bind(&P2PSocketUdp::OnSend, base::Unretained(this), packet.id,
                  packet.packet_options.packet_id, send_time);
 
   // TODO(crbug.com/656607): Pass traffic annotation after DatagramSocketServer
@@ -347,10 +339,10 @@
                   packet.size, false);
 }
 
-void P2PSocketHostUdp::OnSend(uint64_t packet_id,
-                              int32_t transport_sequence_number,
-                              base::TimeTicks send_time,
-                              int result) {
+void P2PSocketUdp::OnSend(uint64_t packet_id,
+                          int32_t transport_sequence_number,
+                          base::TimeTicks send_time,
+                          int result) {
   DCHECK(send_pending_);
   DCHECK_NE(result, net::ERR_IO_PENDING);
 
@@ -367,12 +359,11 @@
   }
 }
 
-void P2PSocketHostUdp::HandleSendResult(uint64_t packet_id,
-                                        int32_t transport_sequence_number,
-                                        base::TimeTicks send_time,
-                                        int result) {
-  TRACE_EVENT_ASYNC_END1("p2p", "Send", packet_id,
-                         "result", result);
+void P2PSocketUdp::HandleSendResult(uint64_t packet_id,
+                                    int32_t transport_sequence_number,
+                                    base::TimeTicks send_time,
+                                    int result) {
+  TRACE_EVENT_ASYNC_END1("p2p", "Send", packet_id, "result", result);
   if (result < 0) {
     ReportSocketError(result, "WebRTC.ICE.UdpSocketWriteErrorCode");
 
@@ -382,8 +373,8 @@
       return;
     }
     VLOG(0) << "sendto() has failed twice returning a "
-               " transient error " << GetTransientErrorName(result)
-            << ". Dropping the packet.";
+               " transient error "
+            << GetTransientErrorName(result) << ". Dropping the packet.";
   }
 
   // UMA to track the histograms from 1ms to 1 sec for how long a packet spends
@@ -391,21 +382,21 @@
   UMA_HISTOGRAM_TIMES("WebRTC.SystemSendPacketDuration_UDP" /* name */,
                       base::TimeTicks::Now() - send_time /* sample */);
 
-  client_->SendComplete(network::P2PSendPacketMetrics(
-      packet_id, transport_sequence_number, send_time));
+  client_->SendComplete(
+      P2PSendPacketMetrics(packet_id, transport_sequence_number, send_time));
 }
 
-void P2PSocketHostUdp::AcceptIncomingTcpConnection(
+void P2PSocketUdp::AcceptIncomingTcpConnection(
     const net::IPEndPoint& remote_address,
-    network::mojom::P2PSocketClientPtr client,
-    network::mojom::P2PSocketRequest socket) {
+    mojom::P2PSocketClientPtr client,
+    mojom::P2PSocketRequest socket) {
   NOTREACHED();
   OnError();
 }
 
-void P2PSocketHostUdp::Send(
+void P2PSocketUdp::Send(
     const std::vector<int8_t>& data,
-    const network::P2PPacketInfo& packet_info,
+    const P2PPacketInfo& packet_info,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
   if (data.size() > kMaximumPacketSize) {
     LOG(ERROR) << "Received P2PHostMsg_Send with a packet that is too big: "
@@ -436,20 +427,19 @@
   }
 }
 
-void P2PSocketHostUdp::SetOption(network::P2PSocketOption option,
-                                 int32_t value) {
+void P2PSocketUdp::SetOption(P2PSocketOption option, int32_t value) {
   if (state_ != STATE_OPEN) {
     DCHECK_EQ(state_, STATE_ERROR);
     return;
   }
   switch (option) {
-    case network::P2P_SOCKET_OPT_RCVBUF:
+    case P2P_SOCKET_OPT_RCVBUF:
       socket_->SetReceiveBufferSize(value);
       break;
-    case network::P2P_SOCKET_OPT_SNDBUF:
+    case P2P_SOCKET_OPT_SNDBUF:
       socket_->SetSendBufferSize(value);
       break;
-    case network::P2P_SOCKET_OPT_DSCP:
+    case P2P_SOCKET_OPT_DSCP:
       SetSocketDiffServCodePointInternal(
           static_cast<net::DiffServCodePoint>(value));
       break;
@@ -460,7 +450,7 @@
 
 // TODO(crbug.com/812137): We don't call SetDiffServCodePoint for the Windows
 // UDP socket, because this is known to cause a hanging thread.
-int P2PSocketHostUdp::SetSocketDiffServCodePointInternal(
+int P2PSocketUdp::SetSocketDiffServCodePointInternal(
     net::DiffServCodePoint dscp) {
 #if defined(OS_WIN)
   return net::OK;
@@ -470,8 +460,8 @@
 }
 
 // static
-std::unique_ptr<net::DatagramServerSocket>
-P2PSocketHostUdp::DefaultSocketFactory(net::NetLog* net_log) {
+std::unique_ptr<net::DatagramServerSocket> P2PSocketUdp::DefaultSocketFactory(
+    net::NetLog* net_log) {
   net::UDPServerSocket* socket =
       new net::UDPServerSocket(net_log, net::NetLogSource());
 #if defined(OS_WIN)
@@ -481,4 +471,4 @@
   return base::WrapUnique(socket);
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/browser/renderer_host/p2p/socket_host_udp.h b/services/network/p2p/socket_udp.h
similarity index 65%
rename from content/browser/renderer_host/p2p/socket_host_udp.h
rename to services/network/p2p/socket_udp.h
index 010ec93..4a25fd96 100644
--- a/content/browser/renderer_host/p2p/socket_host_udp.h
+++ b/services/network/p2p/socket_udp.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 CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_UDP_H_
-#define CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_UDP_H_
+#ifndef SERVICES_NETWORK_P2P_SOCKET_UDP_H_
+#define SERVICES_NETWORK_P2P_SOCKET_UDP_H_
 
 #include <stddef.h>
 #include <stdint.h>
@@ -14,15 +14,15 @@
 
 #include "base/callback.h"
 #include "base/compiler_specific.h"
+#include "base/component_export.h"
 #include "base/containers/circular_deque.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "content/browser/renderer_host/p2p/socket_host.h"
-#include "content/common/content_export.h"
 #include "net/base/ip_endpoint.h"
 #include "net/socket/diff_serv_code_point.h"
 #include "net/socket/udp_server_socket.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/network/p2p/socket.h"
 #include "services/network/public/cpp/p2p_socket_type.h"
 #include "third_party/webrtc/rtc_base/asyncpacketsocket.h"
 
@@ -30,47 +30,46 @@
 class NetLog;
 }  // namespace net
 
-namespace content {
+namespace network {
 
 class P2PMessageThrottler;
 
-class CONTENT_EXPORT P2PSocketHostUdp : public P2PSocketHost {
+class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketUdp : public P2PSocket {
  public:
   typedef base::Callback<std::unique_ptr<net::DatagramServerSocket>(
       net::NetLog* net_log)>
       DatagramServerSocketFactory;
-  P2PSocketHostUdp(P2PSocketDispatcherHost* socket_dispatcher_host,
-                   network::mojom::P2PSocketClientPtr client,
-                   network::mojom::P2PSocketRequest socket,
-                   P2PMessageThrottler* throttler,
-                   net::NetLog* net_log,
-                   const DatagramServerSocketFactory& socket_factory);
-  P2PSocketHostUdp(P2PSocketDispatcherHost* socket_dispatcher_host,
-                   network::mojom::P2PSocketClientPtr client,
-                   network::mojom::P2PSocketRequest socket,
-                   P2PMessageThrottler* throttler,
-                   net::NetLog* net_log);
-  ~P2PSocketHostUdp() override;
+  P2PSocketUdp(P2PSocketManager* socket_manager,
+               mojom::P2PSocketClientPtr client,
+               mojom::P2PSocketRequest socket,
+               P2PMessageThrottler* throttler,
+               net::NetLog* net_log,
+               const DatagramServerSocketFactory& socket_factory);
+  P2PSocketUdp(P2PSocketManager* socket_manager,
+               mojom::P2PSocketClientPtr client,
+               mojom::P2PSocketRequest socket,
+               P2PMessageThrottler* throttler,
+               net::NetLog* net_log);
+  ~P2PSocketUdp() override;
 
-  // P2PSocketHost overrides.
+  // P2PSocket overrides.
   bool Init(const net::IPEndPoint& local_address,
             uint16_t min_port,
             uint16_t max_port,
-            const network::P2PHostAndIPEndPoint& remote_address) override;
+            const P2PHostAndIPEndPoint& remote_address) override;
 
-  // network::mojom::P2PSocket implementation:
-  void AcceptIncomingTcpConnection(
-      const net::IPEndPoint& remote_address,
-      network::mojom::P2PSocketClientPtr client,
-      network::mojom::P2PSocketRequest socket) override;
+  // mojom::P2PSocket implementation:
+  void AcceptIncomingTcpConnection(const net::IPEndPoint& remote_address,
+                                   mojom::P2PSocketClientPtr client,
+                                   mojom::P2PSocketRequest socket) override;
   void Send(const std::vector<int8_t>& data,
-            const network::P2PPacketInfo& packet_info,
+            const P2PPacketInfo& packet_info,
             const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
       override;
-  void SetOption(network::P2PSocketOption option, int32_t value) override;
+  void SetOption(P2PSocketOption option, int32_t value) override;
 
  private:
-  friend class P2PSocketHostUdpTest;
+  friend class P2PSocketUdpTest;
 
   typedef std::set<net::IPEndPoint> ConnectedPeerSet;
 
@@ -127,9 +126,9 @@
   // Callback object that returns a new socket when invoked.
   DatagramServerSocketFactory socket_factory_;
 
-  DISALLOW_COPY_AND_ASSIGN(P2PSocketHostUdp);
+  DISALLOW_COPY_AND_ASSIGN(P2PSocketUdp);
 };
 
-}  // namespace content
+}  // namespace network
 
-#endif  // CONTENT_BROWSER_RENDERER_HOST_P2P_SOCKET_HOST_UDP_H_
+#endif  // SERVICES_NETWORK_P2P_SOCKET_UDP_H_
diff --git a/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc b/services/network/p2p/socket_udp_unittest.cc
similarity index 81%
rename from content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
rename to services/network/p2p/socket_udp_unittest.cc
index 8e007ac..050d323 100644
--- a/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
+++ b/services/network/p2p/socket_udp_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/browser/renderer_host/p2p/socket_host_udp.h"
+#include "services/network/p2p/socket_udp.h"
 
 #include <stdint.h>
 #include <utility>
@@ -13,8 +13,6 @@
 #include "base/run_loop.h"
 #include "base/sys_byteorder.h"
 #include "base/test/scoped_task_environment.h"
-#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
-#include "content/browser/renderer_host/p2p/socket_host_throttler.h"
 #include "net/base/completion_once_callback.h"
 #include "net/base/io_buffer.h"
 #include "net/base/ip_endpoint.h"
@@ -22,6 +20,8 @@
 #include "net/log/net_log_with_source.h"
 #include "net/socket/datagram_server_socket.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
+#include "services/network/p2p/socket_test_utils.h"
+#include "services/network/p2p/socket_throttler.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -54,7 +54,7 @@
  public:
   typedef std::pair<net::IPEndPoint, std::vector<int8_t>> UDPPacket;
 
-  // P2PSocketHostUdp destroys a socket on errors so sent packets
+  // P2PSocketUdp destroys a socket on errors so sent packets
   // need to be stored outside of this object.
   FakeDatagramServerSocket(base::circular_deque<UDPPacket>* sent_packets,
                            std::vector<uint16_t>* used_ports)
@@ -202,14 +202,14 @@
 
 }  // namespace
 
-namespace content {
+namespace network {
 
-class P2PSocketHostUdpTest : public testing::Test {
+class P2PSocketUdpTest : public testing::Test {
  protected:
   void SetUp() override {
-    network::mojom::P2PSocketClientPtr socket_client;
+    mojom::P2PSocketClientPtr socket_client;
     auto socket_client_request = mojo::MakeRequest(&socket_client);
-    network::mojom::P2PSocketPtr socket;
+    mojom::P2PSocketPtr socket;
     auto socket_request = mojo::MakeRequest(&socket);
 
     fake_client_.reset(new FakeSocketClient(std::move(socket),
@@ -217,7 +217,7 @@
 
     EXPECT_CALL(*fake_client_.get(), SocketCreated(_, _)).Times(1);
 
-    socket_host_.reset(new P2PSocketHostUdp(
+    socket_host_.reset(new P2PSocketUdp(
         nullptr, std::move(socket_client), std::move(socket_request),
         &throttler_, /*net_log=*/nullptr,
         base::Bind(&CreateFakeDatagramServerSocket, &sent_packets_, nullptr)));
@@ -225,8 +225,8 @@
     local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1);
     socket_host_->Init(
         local_address_, 0, 0,
-        network::P2PHostAndIPEndPoint(
-            std::string(), ParseAddress(kTestIpAddress1, kTestPort1)));
+        P2PHostAndIPEndPoint(std::string(),
+                             ParseAddress(kTestIpAddress1, kTestPort1)));
     socket_ = GetSocketFromHost(socket_host_.get());
 
     dest1_ = ParseAddress(kTestIpAddress1, kTestPort1);
@@ -234,7 +234,7 @@
   }
 
   static FakeDatagramServerSocket* GetSocketFromHost(
-      P2PSocketHostUdp* socket_host) {
+      P2PSocketUdp* socket_host) {
     return static_cast<FakeDatagramServerSocket*>(socket_host->socket_.get());
   }
 
@@ -243,7 +243,7 @@
   ScopedFakeClock fake_clock_;
   base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets_;
   FakeDatagramServerSocket* socket_;  // Owned by |socket_host_|.
-  std::unique_ptr<P2PSocketHostUdp> socket_host_;
+  std::unique_ptr<P2PSocketUdp> socket_host_;
   std::unique_ptr<FakeSocketClient> fake_client_;
 
   net::IPEndPoint local_address_;
@@ -254,26 +254,26 @@
 
 // Verify that we can send STUN messages before we receive anything
 // from the other side.
-TEST_F(P2PSocketHostUdpTest, SendStunNoAuth) {
+TEST_F(P2PSocketUdpTest, SendStunNoAuth) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(3);
 
   rtc::PacketOptions options;
   std::vector<int8_t> packet1;
   CreateStunRequest(&packet1);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest1_, options, 0),
+      packet1, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet2;
   CreateStunResponse(&packet2);
   socket_host_->Send(
-      packet2, network::P2PPacketInfo(dest1_, options, 0),
+      packet2, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   std::vector<int8_t> packet3;
   CreateStunError(&packet3);
   socket_host_->Send(
-      packet3, network::P2PPacketInfo(dest1_, options, 0),
+      packet3, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   ASSERT_EQ(sent_packets_.size(), 3U);
@@ -286,12 +286,12 @@
 
 // Verify that no data packets can be sent before STUN binding has
 // finished.
-TEST_F(P2PSocketHostUdpTest, SendDataNoAuth) {
+TEST_F(P2PSocketUdpTest, SendDataNoAuth) {
   rtc::PacketOptions options;
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   ASSERT_EQ(sent_packets_.size(), 0U);
@@ -302,14 +302,14 @@
 }
 
 // Verify that SetOption() doesn't crash after an error.
-TEST_F(P2PSocketHostUdpTest, SetOptionAfterError) {
+TEST_F(P2PSocketUdpTest, SetOptionAfterError) {
   // Get the sender into the error state.
   socket_host_->Send(
-      {1, 2, 3, 4}, network::P2PPacketInfo(dest1_, rtc::PacketOptions(), 0),
+      {1, 2, 3, 4}, P2PPacketInfo(dest1_, rtc::PacketOptions(), 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   // Verify that SetOptions() fails, but doesn't crash.
-  socket_host_->SetOption(network::P2P_SOCKET_OPT_RCVBUF, 2048);
+  socket_host_->SetOption(P2P_SOCKET_OPT_RCVBUF, 2048);
 
   base::RunLoop().RunUntilIdle();
 
@@ -318,7 +318,7 @@
 
 // Verify that we can send data after we've received STUN request
 // from the other side.
-TEST_F(P2PSocketHostUdpTest, SendAfterStunRequest) {
+TEST_F(P2PSocketUdpTest, SendAfterStunRequest) {
   // Receive packet from |dest1_|.
   std::vector<int8_t> request_packet;
   CreateStunRequest(&request_packet);
@@ -333,7 +333,7 @@
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   ASSERT_EQ(1U, sent_packets_.size());
@@ -344,7 +344,7 @@
 
 // Verify that we can send data after we've received STUN response
 // from the other side.
-TEST_F(P2PSocketHostUdpTest, SendAfterStunResponse) {
+TEST_F(P2PSocketUdpTest, SendAfterStunResponse) {
   // Receive packet from |dest1_|.
   std::vector<int8_t> request_packet;
   CreateStunRequest(&request_packet);
@@ -359,7 +359,7 @@
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   ASSERT_EQ(1U, sent_packets_.size());
@@ -370,7 +370,7 @@
 
 // Verify messages still cannot be sent to an unathorized host after
 // successful binding with different host.
-TEST_F(P2PSocketHostUdpTest, SendAfterStunResponseDifferentHost) {
+TEST_F(P2PSocketUdpTest, SendAfterStunResponseDifferentHost) {
   // Receive packet from |dest1_|.
   std::vector<int8_t> request_packet;
   CreateStunRequest(&request_packet);
@@ -383,7 +383,7 @@
   std::vector<int8_t> packet;
   CreateRandomPacket(&packet);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   base::RunLoop().RunUntilIdle();
@@ -393,7 +393,7 @@
 
 // Verify throttler not allowing unlimited sending of ICE messages to
 // any destination.
-TEST_F(P2PSocketHostUdpTest, ThrottleAfterLimit) {
+TEST_F(P2PSocketUdpTest, ThrottleAfterLimit) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(3);
 
   rtc::PacketOptions options;
@@ -401,16 +401,16 @@
   CreateStunRequest(&packet1);
   throttler_.SetSendIceBandwidth(packet1.size() * 2);
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest1_, options, 0),
+      packet1, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest2_, options, 0),
+      packet1, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   net::IPEndPoint dest3 = ParseAddress(kTestIpAddress1, 2222);
   // This packet must be dropped by the throttler.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest3, options, 0),
+      packet1, P2PPacketInfo(dest3, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   ASSERT_EQ(sent_packets_.size(), 2U);
 
@@ -419,7 +419,7 @@
 
 // Verify we can send packets to a known destination when ICE throttling is
 // active.
-TEST_F(P2PSocketHostUdpTest, ThrottleAfterLimitAfterReceive) {
+TEST_F(P2PSocketUdpTest, ThrottleAfterLimitAfterReceive) {
   // Receive packet from |dest1_|.
   std::vector<int8_t> request_packet;
   CreateStunRequest(&request_packet);
@@ -435,31 +435,31 @@
   throttler_.SetSendIceBandwidth(packet1.size());
   // |dest1_| is known address, throttling will not be applied.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest1_, options, 0),
+      packet1, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   // Trying to send the packet to dest1_ in the same window. It should go.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest1_, options, 0),
+      packet1, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   // Throttler should allow this packet to go through.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest2_, options, 0),
+      packet1, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
 
   net::IPEndPoint dest3 = ParseAddress(kTestIpAddress1, 2223);
   // This packet will be dropped, as limit only for a single packet.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest3, options, 0),
+      packet1, P2PPacketInfo(dest3, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   net::IPEndPoint dest4 = ParseAddress(kTestIpAddress1, 2224);
   // This packet should also be dropped.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest4, options, 0),
+      packet1, P2PPacketInfo(dest4, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   // |dest1| is known, we can send as many packets to it.
   socket_host_->Send(
-      packet1, network::P2PPacketInfo(dest1_, options, 0),
+      packet1, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   ASSERT_EQ(sent_packets_.size(), 4U);
 
@@ -469,13 +469,14 @@
 // The fake clock mechanism used for this test doesn't work in component builds.
 // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=6490
 #if defined(COMPONENT_BUILD)
-#define MAYBE_ThrottlingStopsAtExpectedTimes DISABLED_ThrottlingStopsAtExpectedTimes
+#define MAYBE_ThrottlingStopsAtExpectedTimes \
+  DISABLED_ThrottlingStopsAtExpectedTimes
 #else
 #define MAYBE_ThrottlingStopsAtExpectedTimes ThrottlingStopsAtExpectedTimes
 #endif
 // Test that once the limit is hit, the throttling stops at the expected time,
 // allowing packets to be sent again.
-TEST_F(P2PSocketHostUdpTest, MAYBE_ThrottlingStopsAtExpectedTimes) {
+TEST_F(P2PSocketUdpTest, MAYBE_ThrottlingStopsAtExpectedTimes) {
   EXPECT_CALL(*fake_client_.get(), SendComplete(_)).Times(12);
 
   rtc::PacketOptions options;
@@ -484,20 +485,20 @@
   // Limit of 2 packets per second.
   throttler_.SetSendIceBandwidth(packet.size() * 2);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(2U, sent_packets_.size());
 
   // These packets must be dropped by the throttler since the limit was hit and
   // the time hasn't advanced.
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(2U, sent_packets_.size());
 
@@ -505,10 +506,10 @@
   // active.
   fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 999);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(2U, sent_packets_.size());
 
@@ -516,32 +517,32 @@
   // Add an extra millisecond to account for rounding errors.
   fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 1001);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(3U, sent_packets_.size());
 
   // This time, hit the limit in the middle of the period.
   fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 1500);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(4U, sent_packets_.size());
 
   // Again, throttling should be active until the next second mark.
   fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 1999);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(4U, sent_packets_.size());
   fake_clock_.SetTimeNanos(rtc::kNumNanosecsPerMillisec * 2002);
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest1_, options, 0),
+      packet, P2PPacketInfo(dest1_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   socket_host_->Send(
-      packet, network::P2PPacketInfo(dest2_, options, 0),
+      packet, P2PPacketInfo(dest2_, options, 0),
       net::MutableNetworkTrafficAnnotationTag(TRAFFIC_ANNOTATION_FOR_TESTS));
   EXPECT_EQ(6U, sent_packets_.size());
 
@@ -550,18 +551,18 @@
 
 // Verify that we can open UDP sockets listening in a given port range,
 // and fail if all ports in the range are already in use.
-TEST_F(P2PSocketHostUdpTest, PortRangeImplicitPort) {
+TEST_F(P2PSocketUdpTest, PortRangeImplicitPort) {
   const uint16_t min_port = 10000;
   const uint16_t max_port = 10001;
   base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets;
   std::vector<uint16_t> used_ports;
-  P2PSocketHostUdp::DatagramServerSocketFactory fake_socket_factory =
+  P2PSocketUdp::DatagramServerSocketFactory fake_socket_factory =
       base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports);
   P2PMessageThrottler throttler;
 
-  network::mojom::P2PSocketClientPtr socket_client;
+  mojom::P2PSocketClientPtr socket_client;
   auto socket_client_request = mojo::MakeRequest(&socket_client);
-  network::mojom::P2PSocketPtr socket;
+  mojom::P2PSocketPtr socket;
   auto socket_request = mojo::MakeRequest(&socket);
 
   FakeSocketClient fake_client2(std::move(socket),
@@ -569,14 +570,14 @@
   EXPECT_CALL(fake_client2, SocketCreated(_, _)).Times(max_port - min_port + 1);
 
   for (unsigned port = min_port; port <= max_port; ++port) {
-    std::unique_ptr<P2PSocketHostUdp> socket_host(new P2PSocketHostUdp(
+    std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp(
         nullptr, std::move(socket_client), std::move(socket_request),
         &throttler, /*net_log=*/nullptr, fake_socket_factory));
     net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, 0);
     bool rv = socket_host->Init(
         local_address, min_port, max_port,
-        network::P2PHostAndIPEndPoint(
-            std::string(), ParseAddress(kTestIpAddress1, kTestPort1)));
+        P2PHostAndIPEndPoint(std::string(),
+                             ParseAddress(kTestIpAddress1, kTestPort1)));
     EXPECT_TRUE(rv);
 
     FakeDatagramServerSocket* socket = GetSocketFromHost(socket_host.get());
@@ -590,14 +591,14 @@
     socket_request = socket_host->ReleaseBindingForTesting();
   }
 
-  std::unique_ptr<P2PSocketHostUdp> socket_host(new P2PSocketHostUdp(
+  std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp(
       nullptr, std::move(socket_client), std::move(socket_request), &throttler,
       /*net_log=*/nullptr, std::move(fake_socket_factory)));
   net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, 0);
   bool rv = socket_host->Init(
       local_address, min_port, max_port,
-      network::P2PHostAndIPEndPoint(std::string(),
-                                    ParseAddress(kTestIpAddress1, kTestPort1)));
+      P2PHostAndIPEndPoint(std::string(),
+                           ParseAddress(kTestIpAddress1, kTestPort1)));
   EXPECT_FALSE(rv);
 
   base::RunLoop().RunUntilIdle();
@@ -607,19 +608,19 @@
 
 // Verify that we can open a UDP socket listening in a given port included in
 // a given valid range.
-TEST_F(P2PSocketHostUdpTest, PortRangeExplictValidPort) {
+TEST_F(P2PSocketUdpTest, PortRangeExplictValidPort) {
   const uint16_t min_port = 10000;
   const uint16_t max_port = 10001;
   const uint16_t valid_port = min_port;
   base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets;
   std::vector<uint16_t> used_ports;
-  P2PSocketHostUdp::DatagramServerSocketFactory fake_socket_factory =
+  P2PSocketUdp::DatagramServerSocketFactory fake_socket_factory =
       base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports);
   P2PMessageThrottler throttler;
 
-  network::mojom::P2PSocketClientPtr socket_client;
+  mojom::P2PSocketClientPtr socket_client;
   auto socket_client_request = mojo::MakeRequest(&socket_client);
-  network::mojom::P2PSocketPtr socket;
+  mojom::P2PSocketPtr socket;
   auto socket_request = mojo::MakeRequest(&socket);
 
   FakeSocketClient fake_client2(std::move(socket),
@@ -627,14 +628,14 @@
 
   EXPECT_CALL(fake_client2, SocketCreated(_, _)).Times(1);
 
-  std::unique_ptr<P2PSocketHostUdp> socket_host(new P2PSocketHostUdp(
+  std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp(
       nullptr, std::move(socket_client), std::move(socket_request), &throttler,
       /*net_log=*/nullptr, std::move(fake_socket_factory)));
   net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, valid_port);
   bool rv = socket_host->Init(
       local_address, min_port, max_port,
-      network::P2PHostAndIPEndPoint(std::string(),
-                                    ParseAddress(kTestIpAddress1, kTestPort1)));
+      P2PHostAndIPEndPoint(std::string(),
+                           ParseAddress(kTestIpAddress1, kTestPort1)));
   EXPECT_TRUE(rv);
 
   FakeDatagramServerSocket* fake_socket = GetSocketFromHost(socket_host.get());
@@ -647,33 +648,33 @@
 
 // Verify that we cannot open a UDP socket listening in a given port not
 // included in a given valid range.
-TEST_F(P2PSocketHostUdpTest, PortRangeExplictInvalidPort) {
+TEST_F(P2PSocketUdpTest, PortRangeExplictInvalidPort) {
   const uint16_t min_port = 10000;
   const uint16_t max_port = 10001;
   const uint16_t invalid_port = max_port + 1;
   base::circular_deque<FakeDatagramServerSocket::UDPPacket> sent_packets;
   std::vector<uint16_t> used_ports;
-  P2PSocketHostUdp::DatagramServerSocketFactory fake_socket_factory =
+  P2PSocketUdp::DatagramServerSocketFactory fake_socket_factory =
       base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports);
   P2PMessageThrottler throttler;
 
-  network::mojom::P2PSocketClientPtr socket_client;
+  mojom::P2PSocketClientPtr socket_client;
   auto socket_client_request = mojo::MakeRequest(&socket_client);
-  network::mojom::P2PSocketPtr socket;
+  mojom::P2PSocketPtr socket;
   auto socket_request = mojo::MakeRequest(&socket);
 
   FakeSocketClient fake_client2(std::move(socket),
                                 std::move(socket_client_request));
 
-  std::unique_ptr<P2PSocketHostUdp> socket_host(new P2PSocketHostUdp(
+  std::unique_ptr<P2PSocketUdp> socket_host(new P2PSocketUdp(
       nullptr, std::move(socket_client), std::move(socket_request), &throttler,
       /*net_log=*/nullptr, std::move(fake_socket_factory)));
   net::IPEndPoint local_address =
       ParseAddress(kTestLocalIpAddress, invalid_port);
   bool rv = socket_host->Init(
       local_address, min_port, max_port,
-      network::P2PHostAndIPEndPoint(std::string(),
-                                    ParseAddress(kTestIpAddress1, kTestPort1)));
+      P2PHostAndIPEndPoint(std::string(),
+                           ParseAddress(kTestIpAddress1, kTestPort1)));
   EXPECT_FALSE(rv);
 
   base::RunLoop().RunUntilIdle();
@@ -681,4 +682,4 @@
   EXPECT_TRUE(fake_client2.connection_error());
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/services/network/proxy_resolver_factory_mojo.cc b/services/network/proxy_resolver_factory_mojo.cc
index 02331a5..383ef89 100644
--- a/services/network/proxy_resolver_factory_mojo.cc
+++ b/services/network/proxy_resolver_factory_mojo.cc
@@ -308,9 +308,6 @@
     factory_->mojo_proxy_factory_->CreateResolver(
         base::UTF16ToUTF8(pac_script->utf16()),
         mojo::MakeRequest(&resolver_ptr_), std::move(client));
-    resolver_ptr_.set_connection_error_handler(
-        base::Bind(&ProxyResolverFactoryMojo::Job::OnConnectionError,
-                   base::Unretained(this)));
     binding_.set_connection_error_handler(
         base::Bind(&ProxyResolverFactoryMojo::Job::OnConnectionError,
                    base::Unretained(this)));
@@ -320,12 +317,14 @@
 
  private:
   void ReportResult(int32_t error) override {
-    resolver_ptr_.set_connection_error_handler(base::Closure());
-    binding_.set_connection_error_handler(base::Closure());
+    // Prevent any other messages arriving unexpectedly, in the case |this|
+    // isn't destroyed immediately.
+    binding_.Close();
+
     if (error == net::OK) {
-      resolver_->reset(new ProxyResolverMojo(
+      *resolver_ = std::make_unique<ProxyResolverMojo>(
           std::move(resolver_ptr_), factory_->host_resolver_,
-          std::move(error_observer_), factory_->net_log_));
+          std::move(error_observer_), factory_->net_log_);
     }
     std::move(callback_).Run(error);
   }
@@ -365,10 +364,10 @@
       pac_script->utf16().empty()) {
     return net::ERR_PAC_SCRIPT_FAILED;
   }
-  request->reset(new Job(this, pac_script, resolver, std::move(callback),
-                         error_observer_factory_.is_null()
-                             ? nullptr
-                             : error_observer_factory_.Run()));
+  *request = std::make_unique<Job>(
+      this, pac_script, resolver, std::move(callback),
+      error_observer_factory_.is_null() ? nullptr
+                                        : error_observer_factory_.Run());
   return net::ERR_IO_PENDING;
 }
 
diff --git a/services/network/proxy_resolver_factory_mojo_unittest.cc b/services/network/proxy_resolver_factory_mojo_unittest.cc
index 73d65533..f1fd78bd 100644
--- a/services/network/proxy_resolver_factory_mojo_unittest.cc
+++ b/services/network/proxy_resolver_factory_mojo_unittest.cc
@@ -345,6 +345,8 @@
 
   void ClearBlockedClients();
 
+  void RespondToBlockedClientsWithResult(net::Error error);
+
  private:
   // Overridden from proxy_resolver::mojom::ProxyResolver:
   void CreateResolver(
@@ -400,6 +402,13 @@
   blocked_clients_.clear();
 }
 
+void MockMojoProxyResolverFactory::RespondToBlockedClientsWithResult(
+    net::Error error) {
+  for (const auto& client : blocked_clients_) {
+    (*client)->ReportResult(error);
+  }
+}
+
 void MockMojoProxyResolverFactory::CreateResolver(
     const std::string& pac_script,
     mojo::InterfaceRequest<proxy_resolver::mojom::ProxyResolver> request,
@@ -682,18 +691,71 @@
   scoped_refptr<net::PacFileData> pac_script(
       net::PacFileData::FromUTF8(kScriptData));
   std::unique_ptr<net::ProxyResolverFactory::Request> request;
+
+  // When the ResolverRequest pipe is dropped, the ProxyResolverFactory should
+  // still wait to get an error from the client pipe.
   net::TestCompletionCallback callback;
   EXPECT_EQ(
-      net::ERR_PAC_SCRIPT_TERMINATED,
-      callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver(
-          pac_script, &proxy_resolver_mojo_, callback.callback(), &request)));
+      net::ERR_IO_PENDING,
+      proxy_resolver_factory_mojo_->CreateProxyResolver(
+          pac_script, &proxy_resolver_mojo_, callback.callback(), &request));
   EXPECT_TRUE(request);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(callback.have_result());
+
+  mock_proxy_resolver_factory_->RespondToBlockedClientsWithResult(
+      net::ERR_PAC_SCRIPT_FAILED);
+  EXPECT_EQ(net::ERR_PAC_SCRIPT_FAILED, callback.WaitForResult());
+}
+
+// The resolver pipe is dropped, but the client is told the request succeeded
+// (This could happen if a proxy resolver is created successfully, but then the
+// proxy crashes before the client reads the success message).
+TEST_F(ProxyResolverFactoryMojoTest,
+       CreateProxyResolver_ResolverDisconnectedButClientSucceeded) {
+  mock_proxy_resolver_factory_->AddCreateProxyResolverAction(
+      CreateProxyResolverAction::DropResolver(kScriptData));
+
+  scoped_refptr<net::PacFileData> pac_script(
+      net::PacFileData::FromUTF8(kScriptData));
+  std::unique_ptr<net::ProxyResolverFactory::Request> request;
+
+  // When the ResolverRequest pipe is dropped, the ProxyResolverFactory
+  // shouldn't notice, and should just continue to wait for a response on the
+  // other pipe.
+  net::TestCompletionCallback callback;
+  EXPECT_EQ(
+      net::ERR_IO_PENDING,
+      proxy_resolver_factory_mojo_->CreateProxyResolver(
+          pac_script, &proxy_resolver_mojo_, callback.callback(), &request));
+  EXPECT_TRUE(request);
+  mock_proxy_resolver_factory_->WaitForNextRequest();
+
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(callback.have_result());
+
+  // The client pipe reports success!
+  mock_proxy_resolver_factory_->RespondToBlockedClientsWithResult(net::OK);
+  EXPECT_EQ(net::OK, callback.WaitForResult());
+
+  // Proxy resolutions should fail with ERR_PAC_SCRIPT_TERMINATED, however. That
+  // error should normally cause the ProxyResolutionService to destroy the
+  // resolver.
+  net::ProxyInfo results;
+  std::unique_ptr<net::ProxyResolver::Request> pac_request;
+  EXPECT_EQ(net::ERR_PAC_SCRIPT_TERMINATED,
+            callback.GetResult(proxy_resolver_mojo_->GetProxyForURL(
+                GURL(kExampleUrl), &results,
+                base::BindOnce(
+                    &ProxyResolverFactoryMojoTest::DeleteProxyResolverCallback,
+                    base::Unretained(this), callback.callback()),
+                &pac_request, net::NetLogWithSource())));
 }
 
 TEST_F(ProxyResolverFactoryMojoTest,
        CreateProxyResolver_ResolverDisconnected_DeleteRequestInCallback) {
   mock_proxy_resolver_factory_->AddCreateProxyResolverAction(
-      CreateProxyResolverAction::DropResolver(kScriptData));
+      CreateProxyResolverAction::DropClient(kScriptData));
 
   scoped_refptr<net::PacFileData> pac_script(
       net::PacFileData::FromUTF8(kScriptData));
@@ -703,8 +765,8 @@
       net::ERR_PAC_SCRIPT_TERMINATED,
       callback.GetResult(proxy_resolver_factory_mojo_->CreateProxyResolver(
           pac_script, &proxy_resolver_mojo_,
-          base::Bind(&DeleteResolverFactoryRequestCallback, &request,
-                     callback.callback()),
+          base::BindOnce(&DeleteResolverFactoryRequestCallback, &request,
+                         callback.callback()),
           &request)));
 }
 
@@ -871,13 +933,13 @@
   net::TestCompletionCallback callback;
   std::unique_ptr<net::ProxyResolver::Request> request;
   net::NetLogWithSource net_log;
-  EXPECT_EQ(
-      net::OK,
-      callback.GetResult(proxy_resolver_mojo_->GetProxyForURL(
-          GURL(kExampleUrl), &results,
-          base::Bind(&ProxyResolverFactoryMojoTest::DeleteProxyResolverCallback,
-                     base::Unretained(this), callback.callback()),
-          &request, net_log)));
+  EXPECT_EQ(net::OK,
+            callback.GetResult(proxy_resolver_mojo_->GetProxyForURL(
+                GURL(kExampleUrl), &results,
+                base::BindOnce(
+                    &ProxyResolverFactoryMojoTest::DeleteProxyResolverCallback,
+                    base::Unretained(this), callback.callback()),
+                &request, net_log)));
 }
 
 TEST_F(ProxyResolverFactoryMojoTest,
@@ -890,13 +952,13 @@
   net::TestCompletionCallback callback;
   std::unique_ptr<net::ProxyResolver::Request> request;
   net::NetLogWithSource net_log;
-  EXPECT_EQ(
-      net::ERR_PAC_SCRIPT_TERMINATED,
-      callback.GetResult(proxy_resolver_mojo_->GetProxyForURL(
-          GURL(kExampleUrl), &results,
-          base::Bind(&ProxyResolverFactoryMojoTest::DeleteProxyResolverCallback,
-                     base::Unretained(this), callback.callback()),
-          &request, net_log)));
+  EXPECT_EQ(net::ERR_PAC_SCRIPT_TERMINATED,
+            callback.GetResult(proxy_resolver_mojo_->GetProxyForURL(
+                GURL(kExampleUrl), &results,
+                base::BindOnce(
+                    &ProxyResolverFactoryMojoTest::DeleteProxyResolverCallback,
+                    base::Unretained(this), callback.callback()),
+                &request, net_log)));
 }
 
 TEST_F(ProxyResolverFactoryMojoTest, GetProxyForURL_DnsRequest) {
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
index bbf5ded..ccf815a 100644
--- a/services/network/public/cpp/BUILD.gn
+++ b/services/network/public/cpp/BUILD.gn
@@ -20,6 +20,8 @@
     "features.h",
     "net_adapters.cc",
     "net_adapters.h",
+    "network_connection_tracker.cc",
+    "network_connection_tracker.h",
     "network_quality_tracker.cc",
     "network_quality_tracker.h",
     "network_switches.cc",
@@ -117,7 +119,7 @@
     "//mojo/public/mojom/base",
     "//net",
     "//services/network/public/mojom:mojom_shared",
-    "//third_party/webrtc/rtc_base:rtc_base",
+    "//third_party/webrtc/rtc_base",
     "//third_party/webrtc_overrides",
     "//third_party/webrtc_overrides:init_webrtc",
   ]
@@ -144,6 +146,7 @@
     "digitally_signed_mojom_traits_unittest.cc",
     "mutable_network_traffic_annotation_tag_mojom_traits_unittest.cc",
     "mutable_partial_network_traffic_annotation_tag_mojom_traits_unittest.cc",
+    "network_connection_tracker_unittest.cc",
     "network_mojom_traits_unittest.cc",
     "network_quality_tracker_unittest.cc",
     "proxy_config_mojom_traits_unittest.cc",
diff --git a/services/network/public/cpp/cross_thread_shared_url_loader_factory_info_unittest.cc b/services/network/public/cpp/cross_thread_shared_url_loader_factory_info_unittest.cc
index 4655f2df..67c41e39 100644
--- a/services/network/public/cpp/cross_thread_shared_url_loader_factory_info_unittest.cc
+++ b/services/network/public/cpp/cross_thread_shared_url_loader_factory_info_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/sequenced_task_runner_handle.h"
diff --git a/content/public/browser/network_connection_tracker.cc b/services/network/public/cpp/network_connection_tracker.cc
similarity index 97%
rename from content/public/browser/network_connection_tracker.cc
rename to services/network/public/cpp/network_connection_tracker.cc
index 278ab984..9b1b457 100644
--- a/content/public/browser/network_connection_tracker.cc
+++ b/services/network/public/cpp/network_connection_tracker.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 #include <utility>
 
@@ -11,7 +11,7 @@
 #include "services/network/public/mojom/network_change_manager.mojom.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 
-namespace content {
+namespace network {
 
 namespace {
 
@@ -188,4 +188,4 @@
   Initialize();
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/public/browser/network_connection_tracker.h b/services/network/public/cpp/network_connection_tracker.h
similarity index 93%
rename from content/public/browser/network_connection_tracker.h
rename to services/network/public/cpp/network_connection_tracker.h
index 066e04bc..82051cea 100644
--- a/content/public/browser/network_connection_tracker.h
+++ b/services/network/public/cpp/network_connection_tracker.h
@@ -2,38 +2,38 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_PUBLIC_BROWSER_NETWORK_CONNECTION_TRACKER_H_
-#define CONTENT_PUBLIC_BROWSER_NETWORK_CONNECTION_TRACKER_H_
+#ifndef SERVICES_NETWORK_PUBLIC_CPP_NETWORK_CONNECTION_TRACKER_H_
+#define SERVICES_NETWORK_PUBLIC_CPP_NETWORK_CONNECTION_TRACKER_H_
 
 #include <list>
 #include <memory>
 
 #include "base/atomicops.h"
 #include "base/callback.h"
+#include "base/component_export.h"
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/sequence_checker.h"
 #include "base/synchronization/lock.h"
-#include "content/common/content_export.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "services/network/public/mojom/network_change_manager.mojom.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 
-namespace content {
+namespace network {
 
 // This class subscribes to network change events from
 // network::mojom::NetworkChangeManager and propogates these notifications to
 // its NetworkConnectionObservers registered through
 // AddNetworkConnectionObserver()/RemoveNetworkConnectionObserver().
-class CONTENT_EXPORT NetworkConnectionTracker
+class COMPONENT_EXPORT(NETWORK_CPP) NetworkConnectionTracker
     : public network::mojom::NetworkChangeManagerClient {
  public:
   using ConnectionTypeCallback =
       base::OnceCallback<void(network::mojom::ConnectionType)>;
 
-  class CONTENT_EXPORT NetworkConnectionObserver {
+  class COMPONENT_EXPORT(NETWORK_CPP) NetworkConnectionObserver {
    public:
     // Please refer to NetworkChangeManagerClient::OnNetworkChanged for when
     // this method is invoked.
@@ -145,6 +145,6 @@
   DISALLOW_COPY_AND_ASSIGN(NetworkConnectionTracker);
 };
 
-}  // namespace content
+}  // namespace network
 
-#endif  // CONTENT_PUBLIC_BROWSER_NETWORK_CONNECTION_TRACKER_H_
+#endif  // SERVICES_NETWORK_PUBLIC_CPP_NETWORK_CONNECTION_TRACKER_H_
diff --git a/content/public/browser/network_connection_tracker_unittest.cc b/services/network/public/cpp/network_connection_tracker_unittest.cc
similarity index 97%
rename from content/public/browser/network_connection_tracker_unittest.cc
rename to services/network/public/cpp/network_connection_tracker_unittest.cc
index 6286c4a..6635a287 100644
--- a/content/public/browser/network_connection_tracker_unittest.cc
+++ b/services/network/public/cpp/network_connection_tracker_unittest.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
 #include "base/macros.h"
 #include "base/run_loop.h"
@@ -14,7 +14,7 @@
 #include "services/network/public/mojom/network_change_manager.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-namespace content {
+namespace network {
 
 namespace {
 
@@ -179,8 +179,8 @@
     network::mojom::NetworkServiceRequest network_service_request =
         mojo::MakeRequest(&network_service_ptr);
     network_service_ =
-        network::NetworkService::Create(std::move(network_service_request),
-                                        /*netlog=*/nullptr);
+        NetworkService::Create(std::move(network_service_request),
+                               /*netlog=*/nullptr);
     tracker_ = std::make_unique<NetworkConnectionTracker>(
         base::BindRepeating(&NetworkConnectionTrackerTest::network_service,
                             base::Unretained(this)));
@@ -213,7 +213,7 @@
  private:
   base::test::ScopedTaskEnvironment scoped_task_environment_;
   net::test::MockNetworkChangeNotifier mock_network_change_notifier_;
-  std::unique_ptr<network::NetworkService> network_service_;
+  std::unique_ptr<NetworkService> network_service_;
   std::unique_ptr<NetworkConnectionTracker> tracker_;
   std::unique_ptr<TestNetworkConnectionObserver> observer_;
 
@@ -404,4 +404,4 @@
   }
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/services/network/public/cpp/simple_url_loader.cc b/services/network/public/cpp/simple_url_loader.cc
index 39d43811..66431e6 100644
--- a/services/network/public/cpp/simple_url_loader.cc
+++ b/services/network/public/cpp/simple_url_loader.cc
@@ -20,8 +20,8 @@
 #include "base/sequence_checker.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_piece.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
@@ -188,6 +188,8 @@
   void DownloadToStringOfUnboundedSizeUntilCrashAndDie(
       mojom::URLLoaderFactory* url_loader_factory,
       BodyAsStringCallback body_as_string_callback) override;
+  void DownloadHeadersOnly(mojom::URLLoaderFactory* url_loader_factory,
+                           HeadersOnlyCallback headers_only_callback) override;
   void DownloadToFile(
       mojom::URLLoaderFactory* url_loader_factory,
       DownloadToFileCompleteCallback download_to_file_complete_callback,
@@ -622,6 +624,58 @@
   DISALLOW_COPY_AND_ASSIGN(SaveToStringBodyHandler);
 };
 
+// BodyHandler that discards the response body.
+class HeadersOnlyBodyHandler : public BodyHandler, public BodyReader::Delegate {
+ public:
+  HeadersOnlyBodyHandler(
+      SimpleURLLoaderImpl* simple_url_loader,
+      SimpleURLLoader::HeadersOnlyCallback headers_only_callback)
+      : BodyHandler(simple_url_loader),
+        headers_only_callback_(std::move(headers_only_callback)) {}
+
+  ~HeadersOnlyBodyHandler() override {}
+
+  // BodyHandler implementation
+  void OnStartLoadingResponseBody(
+      mojo::ScopedDataPipeConsumerHandle body_data_pipe) override {
+    // TODO(crbug.com/871420): The request can be completed at this point
+    // however that requires more changes to SimpleURLLoader as OnComplete()
+    // will not have been called yet.
+    DCHECK(!body_reader_);
+    body_reader_ =
+        std::make_unique<BodyReader>(this, std::numeric_limits<int64_t>::max());
+    body_reader_->Start(std::move(body_data_pipe));
+  }
+
+  void NotifyConsumerOfCompletion(bool destroy_results) override {
+    body_reader_.reset();
+    std::move(headers_only_callback_)
+        .Run(simple_url_loader()->ResponseInfo()
+                 ? simple_url_loader()->ResponseInfo()->headers
+                 : nullptr);
+  }
+
+  void PrepareToRetry(base::OnceClosure retry_callback) override {
+    body_reader_.reset();
+    std::move(retry_callback).Run();
+  }
+
+ private:
+  // BodyReader::Delegate implementation
+  net::Error OnDataRead(uint32_t length, const char* data) override {
+    return net::OK;
+  }
+
+  void OnDone(net::Error error, int64_t total_bytes) override {
+    simple_url_loader()->OnBodyHandlerDone(error, total_bytes);
+  }
+
+  SimpleURLLoader::HeadersOnlyCallback headers_only_callback_;
+  std::unique_ptr<BodyReader> body_reader_;
+
+  DISALLOW_COPY_AND_ASSIGN(HeadersOnlyBodyHandler);
+};
+
 // BodyHandler implementation for saving the response to a file
 class SaveToFileBodyHandler : public BodyHandler {
  public:
@@ -1058,6 +1112,14 @@
   Start(url_loader_factory);
 }
 
+void SimpleURLLoaderImpl::DownloadHeadersOnly(
+    mojom::URLLoaderFactory* url_loader_factory,
+    HeadersOnlyCallback headers_only_callback) {
+  body_handler_ = std::make_unique<HeadersOnlyBodyHandler>(
+      this, std::move(headers_only_callback));
+  Start(url_loader_factory);
+}
+
 void SimpleURLLoaderImpl::DownloadToFile(
     mojom::URLLoaderFactory* url_loader_factory,
     DownloadToFileCompleteCallback download_to_file_complete_callback,
@@ -1237,6 +1299,7 @@
 
   request_state_->finished = true;
   request_state_->net_error = net_error;
+
   // If it's a partial download or an error was received, erase the body.
   bool destroy_results =
       request_state_->net_error != net::OK && !allow_partial_results_;
@@ -1302,7 +1365,6 @@
   url_loader_.reset();
 
   request_state_ = std::make_unique<RequestState>();
-
   body_handler_->PrepareToRetry(base::BindOnce(
       &SimpleURLLoaderImpl::StartRequest, weak_ptr_factory_.GetWeakPtr(),
       url_loader_factory_ptr_.get()));
diff --git a/services/network/public/cpp/simple_url_loader.h b/services/network/public/cpp/simple_url_loader.h
index cb3e0843..e6c36dd 100644
--- a/services/network/public/cpp/simple_url_loader.h
+++ b/services/network/public/cpp/simple_url_loader.h
@@ -18,11 +18,15 @@
 
 class GURL;
 
+template <class T>
+class scoped_refptr;
+
 namespace base {
 class FilePath;
 }
 
 namespace net {
+class HttpResponseHeaders;
 struct NetworkTrafficAnnotationTag;
 struct RedirectInfo;
 }  // namespace net
@@ -85,8 +89,14 @@
   using BodyAsStringCallback =
       base::OnceCallback<void(std::unique_ptr<std::string> response_body)>;
 
-  // Callback used when download the response body to a file. On failure, |path|
-  // will be empty. It is safe to delete the SimpleURLLoader during the
+  // Callback used when ignoring the response body. |headers| are the received
+  // HTTP headers, or nullptr if none were received. It is safe to delete the
+  // SimpleURLLoader during the callback.
+  using HeadersOnlyCallback =
+      base::OnceCallback<void(scoped_refptr<net::HttpResponseHeaders> headers)>;
+
+  // Callback used when downloading the response body to a file. On failure,
+  // |path| will be empty. It is safe to delete the SimpleURLLoader during the
   // callback.
   using DownloadToFileCompleteCallback =
       base::OnceCallback<void(base::FilePath path)>;
@@ -115,7 +125,7 @@
 
   virtual ~SimpleURLLoader();
 
-  // Starts the request using |network_context|. The SimpleURLLoader will
+  // Starts the request using |url_loader_factory|. The SimpleURLLoader will
   // accumulate all downloaded data in an in-memory string of bounded size. If
   // |max_body_size| is exceeded, the request will fail with
   // net::ERR_INSUFFICIENT_RESOURCES. |max_body_size| must be no greater than 1
@@ -140,6 +150,14 @@
       mojom::URLLoaderFactory* url_loader_factory,
       BodyAsStringCallback body_as_string_callback) = 0;
 
+  // Starts the request using |url_loader_factory|. The SimpleURLLoader will
+  // discard the response body as it is received and |headers_only_callback|
+  // will be invoked on completion. It is safe to delete the SimpleURLLoader in
+  // this callback.
+  virtual void DownloadHeadersOnly(
+      mojom::URLLoaderFactory* url_loader_factory,
+      HeadersOnlyCallback headers_only_callback) = 0;
+
   // SimpleURLLoader will download the entire response to a file at the
   // specified path. File I/O will happen on another sequence, so it's safe to
   // use this on any sequence.
diff --git a/services/network/public/cpp/simple_url_loader_unittest.cc b/services/network/public/cpp/simple_url_loader_unittest.cc
index 804b2df8..1a8e46e 100644
--- a/services/network/public/cpp/simple_url_loader_unittest.cc
+++ b/services/network/public/cpp/simple_url_loader_unittest.cc
@@ -93,7 +93,13 @@
  public:
   // What the response should be downloaded to. Running all tests for all types
   // is more than strictly needed, but simplest just to cover all cases.
-  enum class DownloadType { TO_STRING, TO_FILE, TO_TEMP_FILE, AS_STREAM };
+  enum class DownloadType {
+    TO_STRING,
+    TO_FILE,
+    TO_TEMP_FILE,
+    HEADERS_ONLY,
+    AS_STREAM
+  };
 
   explicit SimpleLoaderTestHelper(
       std::unique_ptr<network::ResourceRequest> resource_request,
@@ -176,6 +182,12 @@
               max_body_size);
         }
         break;
+      case DownloadType::HEADERS_ONLY:
+        simple_url_loader_->DownloadHeadersOnly(
+            url_loader_factory,
+            base::BindOnce(&SimpleLoaderTestHelper::DownloadedHeadersOnly,
+                           base::Unretained(this)));
+        break;
       case DownloadType::AS_STREAM:
         // Downloading to stream doesn't support a max body size.
         DCHECK_LT(max_body_size, 0);
@@ -342,6 +354,19 @@
     run_loop_.Quit();
   }
 
+  void DownloadedHeadersOnly(scoped_refptr<net::HttpResponseHeaders> headers) {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    EXPECT_FALSE(done_);
+    EXPECT_EQ(DownloadType::HEADERS_ONLY, download_type_);
+    EXPECT_FALSE(response_body_);
+
+    if (destroy_loader_on_complete_)
+      simple_url_loader_.reset();
+
+    done_ = true;
+    run_loop_.Quit();
+  }
+
   // SimpleURLLoaderStreamConsumer implementation:
 
   void OnDataReceived(base::StringPiece string_piece,
@@ -647,8 +672,11 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("Expected Response", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("Expected Response", *test_helper->response_body());
+  }
 }
 
 // Test that SimpleURLLoader handles data URLs, which don't have headers.
@@ -660,8 +688,11 @@
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   ASSERT_TRUE(test_helper->simple_url_loader()->ResponseInfo());
   EXPECT_FALSE(test_helper->simple_url_loader()->ResponseInfo()->headers);
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("foo", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("foo", *test_helper->response_body());
+  }
 }
 
 // Make sure the class works when the size of the encoded and decoded bodies are
@@ -673,8 +704,11 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("foo", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("foo", *test_helper->response_body());
+  }
 }
 
 // Make sure redirects are followed.
@@ -686,8 +720,11 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("Echo", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("Echo", *test_helper->response_body());
+  }
 }
 
 // Make sure OnRedirectCallback is invoked on a redirect.
@@ -713,8 +750,11 @@
       base::Unretained(&response_head)));
 
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("Echo", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("Echo", *test_helper->response_body());
+  }
 
   EXPECT_EQ(1, num_redirects);
   EXPECT_EQ(test_server_.GetURL("/echo"), redirect_info.new_url);
@@ -739,8 +779,10 @@
 
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
 
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("Echo", *test_helper->response_body());
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("Echo", *test_helper->response_body());
+  }
 
   EXPECT_EQ(2, num_redirects);
 }
@@ -792,8 +834,12 @@
 
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kShortUploadBody, *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kShortUploadBody, *test_helper->response_body());
+  }
+
   // Make sure request really was redirected.
   EXPECT_EQ(1, num_redirects);
 }
@@ -816,8 +862,12 @@
 
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(GetLongUploadBody(), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(GetLongUploadBody(), *test_helper->response_body());
+  }
+
   // Make sure request really was redirected.
   EXPECT_EQ(1, num_redirects);
 }
@@ -847,10 +897,14 @@
 
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  // The "foo" header is removed since the SimpleURLLoader's redirect callback
-  // marks "foo" header to be removed.
-  EXPECT_EQ("None", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    // The "foo" header is removed since the SimpleURLLoader's redirect callback
+    // marks "foo" header to be removed.
+    EXPECT_EQ("None", *test_helper->response_body());
+  }
+
   // Make sure request really was redirected.
   EXPECT_EQ(1, num_redirects);
 }
@@ -877,10 +931,14 @@
 
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  // The "foo" header is not removed since the SimpleURLLoader's redirect
-  // callback marks "bar" header to be removed.
-  EXPECT_EQ("Expected Response", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    // The "foo" header is not removed since the SimpleURLLoader's redirect
+    // callback marks "bar" header to be removed.
+    EXPECT_EQ("Expected Response", *test_helper->response_body());
+  }
+
   // Make sure request really was redirected.
   EXPECT_EQ(1, num_redirects);
 }
@@ -954,8 +1012,11 @@
       CreateHelper(std::move(resource_request));
   test_helper->set_destroy_loader_on_complete(true);
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("Expected Response", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("Expected Response", *test_helper->response_body());
+  }
 }
 
 // Check the case where a URLLoaderFactory with a closed Mojo pipe was passed
@@ -999,8 +1060,11 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(400, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("Echo", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("Echo", *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, EmptyResponseBody) {
@@ -1010,9 +1074,12 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(204, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  // A response body is sent from the NetworkService, but it's empty.
-  EXPECT_EQ("", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    // A response body is sent from the NetworkService, but it's empty.
+    EXPECT_EQ("", *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, BigResponseBody) {
@@ -1028,9 +1095,12 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
-  EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, ResponseBodyWithSizeMatchingLimit) {
@@ -1047,9 +1117,12 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
-  EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, ResponseBodyWithSizeBelowLimit) {
@@ -1067,9 +1140,12 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
-  EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, ResponseBodyWithSizeAboveLimit) {
@@ -1084,8 +1160,12 @@
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get(),
                                         kResponseSize - 1);
 
-  EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
-            test_helper->simple_url_loader()->NetError());
+  if (GetParam() == SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
+  } else {
+    EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
+              test_helper->simple_url_loader()->NetError());
+  }
   EXPECT_FALSE(test_helper->response_body());
 }
 
@@ -1104,11 +1184,17 @@
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get(),
                                         kMaxResponseSize);
 
-  EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
-            test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(std::string(kMaxResponseSize, 'a'), *test_helper->response_body());
-  EXPECT_EQ(kMaxResponseSize, test_helper->response_body()->length());
+  if (GetParam() == SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
+    EXPECT_FALSE(test_helper->response_body());
+  } else {
+    EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
+              test_helper->simple_url_loader()->NetError());
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(std::string(kMaxResponseSize, 'a'),
+              *test_helper->response_body());
+    EXPECT_EQ(kMaxResponseSize, test_helper->response_body()->length());
+  }
 }
 
 // The next 4 tests duplicate the above 4, but with larger response sizes. This
@@ -1126,9 +1212,12 @@
                                         kResponseSize);
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
-  EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, BigResponseBodyWithSizeBelowLimit) {
@@ -1145,9 +1234,12 @@
                                         kMaxResponseSize);
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
-  EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kResponseSize, test_helper->response_body()->length());
+    EXPECT_EQ(std::string(kResponseSize, 'a'), *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, BigResponseBodyWithSizeAboveLimit) {
@@ -1162,8 +1254,12 @@
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get(),
                                         kResponseSize - 1);
 
-  EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
-            test_helper->simple_url_loader()->NetError());
+  if (GetParam() == SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
+  } else {
+    EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
+              test_helper->simple_url_loader()->NetError());
+  }
   EXPECT_FALSE(test_helper->response_body());
 }
 
@@ -1181,11 +1277,17 @@
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get(),
                                         kMaxResponseSize);
 
-  EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
-            test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(std::string(kMaxResponseSize, 'a'), *test_helper->response_body());
-  EXPECT_EQ(kMaxResponseSize, test_helper->response_body()->length());
+  if (GetParam() == SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
+    EXPECT_FALSE(test_helper->response_body());
+  } else {
+    EXPECT_EQ(net::ERR_INSUFFICIENT_RESOURCES,
+              test_helper->simple_url_loader()->NetError());
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(std::string(kMaxResponseSize, 'a'),
+              *test_helper->response_body());
+    EXPECT_EQ(kMaxResponseSize, test_helper->response_body()->length());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, NetErrorBeforeHeaders) {
@@ -1235,8 +1337,11 @@
   EXPECT_EQ(net::ERR_CONTENT_DECODING_FAILED,
             test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("", *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, TruncatedBody) {
@@ -1259,8 +1364,11 @@
   EXPECT_EQ(net::ERR_CONTENT_LENGTH_MISMATCH,
             test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kTruncatedBody, *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kTruncatedBody, *test_helper->response_body());
+  }
 }
 
 // Test case where NetworkService is destroyed before headers are received (and
@@ -1289,8 +1397,11 @@
                                                           "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kShortUploadBody, *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kShortUploadBody, *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, UploadLongString) {
@@ -1301,8 +1412,11 @@
                                                           "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(long_string, *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(long_string, *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, UploadEmptyString) {
@@ -1311,19 +1425,25 @@
   test_helper->simple_url_loader()->AttachStringForUpload("", "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("", *test_helper->response_body());
+  }
 
   // Also make sure the correct method was sent, with the right content-type.
   test_helper = CreateHelperForURL(test_server_.GetURL("/echoall"), "POST");
   test_helper->simple_url_loader()->AttachStringForUpload("", "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_NE(std::string::npos,
-            test_helper->response_body()->find("Content-Type: text/plain"));
-  EXPECT_NE(std::string::npos, test_helper->response_body()->find("POST /"));
-  EXPECT_EQ(std::string::npos, test_helper->response_body()->find("PUT /"));
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_NE(std::string::npos,
+              test_helper->response_body()->find("Content-Type: text/plain"));
+    EXPECT_NE(std::string::npos, test_helper->response_body()->find("POST /"));
+    EXPECT_EQ(std::string::npos, test_helper->response_body()->find("PUT /"));
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, UploadShortStringWithRetry) {
@@ -1335,8 +1455,11 @@
       1, SimpleURLLoader::RETRY_ON_5XX);
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(kShortUploadBody, *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(kShortUploadBody, *test_helper->response_body());
+  }
 
   if (GetParam() == SimpleLoaderTestHelper::DownloadType::AS_STREAM)
     EXPECT_EQ(1, test_helper->download_as_stream_retries());
@@ -1352,8 +1475,11 @@
       1, SimpleURLLoader::RETRY_ON_5XX);
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(long_string, *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(long_string, *test_helper->response_body());
+  }
 
   if (GetParam() == SimpleLoaderTestHelper::DownloadType::AS_STREAM)
     EXPECT_EQ(1, test_helper->download_as_stream_retries());
@@ -1366,8 +1492,11 @@
                                                         "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+  }
 
   // Also make sure the correct method was sent, with the right content-type.
   test_helper = CreateHelperForURL(test_server_.GetURL("/echoall"), "POST");
@@ -1375,11 +1504,14 @@
                                                         "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_NE(std::string::npos,
-            test_helper->response_body()->find("Content-Type: text/plain"));
-  EXPECT_NE(std::string::npos, test_helper->response_body()->find("POST /"));
-  EXPECT_EQ(std::string::npos, test_helper->response_body()->find("PUT /"));
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_NE(std::string::npos,
+              test_helper->response_body()->find("Content-Type: text/plain"));
+    EXPECT_NE(std::string::npos, test_helper->response_body()->find("POST /"));
+    EXPECT_EQ(std::string::npos, test_helper->response_body()->find("PUT /"));
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, UploadFileWithPut) {
@@ -1389,8 +1521,11 @@
                                                         "text/plain");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+  }
 
   // Also make sure the correct method was sent, with the right content-type.
   test_helper = CreateHelperForURL(test_server_.GetURL("/echoall"), "PUT");
@@ -1398,13 +1533,16 @@
                                                         "text/salted");
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_NE(std::string::npos,
-            test_helper->response_body()->find("Content-Type: text/salted"));
-  EXPECT_EQ(std::string::npos,
-            test_helper->response_body()->find("Content-Type: text/plain"));
-  EXPECT_EQ(std::string::npos, test_helper->response_body()->find("POST /"));
-  EXPECT_NE(std::string::npos, test_helper->response_body()->find("PUT /"));
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_NE(std::string::npos,
+              test_helper->response_body()->find("Content-Type: text/salted"));
+    EXPECT_EQ(std::string::npos,
+              test_helper->response_body()->find("Content-Type: text/plain"));
+    EXPECT_EQ(std::string::npos, test_helper->response_body()->find("POST /"));
+    EXPECT_NE(std::string::npos, test_helper->response_body()->find("PUT /"));
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, UploadFileWithRetry) {
@@ -1416,8 +1554,11 @@
       1, SimpleURLLoader::RETRY_ON_5XX);
   test_helper->StartSimpleLoaderAndWait(url_loader_factory_.get());
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ(GetTestFileContents(), *test_helper->response_body());
+  }
 
   if (GetParam() == SimpleLoaderTestHelper::DownloadType::AS_STREAM)
     EXPECT_EQ(1, test_helper->download_as_stream_retries());
@@ -1972,16 +2113,21 @@
             }
             if (!allow_partial_results) {
               EXPECT_FALSE(test_helper->response_body());
-            } else {
+            } else if (GetParam() !=
+                       SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
               ASSERT_TRUE(test_helper->response_body());
               EXPECT_EQ(std::string(bytes_received, 'a'),
                         *test_helper->response_body());
             }
           } else {
             EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-            ASSERT_TRUE(test_helper->response_body());
-            EXPECT_EQ(std::string(bytes_received, 'a'),
-                      *test_helper->response_body());
+
+            if (GetParam() !=
+                SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+              ASSERT_TRUE(test_helper->response_body());
+              EXPECT_EQ(std::string(bytes_received, 'a'),
+                        *test_helper->response_body());
+            }
           }
         }
       }
@@ -2017,8 +2163,11 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("a", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("a", *test_helper->response_body());
+  }
 }
 
 // Make sure the close client pipe message doesn't cause any issues.
@@ -2034,8 +2183,11 @@
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("a", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("a", *test_helper->response_body());
+  }
 }
 
 TEST_P(SimpleURLLoaderTest, DoubleReceivedResponse) {
@@ -2209,8 +2361,11 @@
     if (test_case.expect_success) {
       EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
       EXPECT_EQ(200, test_helper->GetResponseCode());
-      ASSERT_TRUE(test_helper->response_body());
-      EXPECT_EQ(1u, test_helper->response_body()->size());
+
+      if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+        ASSERT_TRUE(test_helper->response_body());
+        EXPECT_EQ(1u, test_helper->response_body()->size());
+      }
     } else {
       EXPECT_EQ(501, test_helper->GetResponseCode());
       EXPECT_FALSE(test_helper->response_body());
@@ -2274,7 +2429,8 @@
   loader_factory.RunTest(test_helper.get());
 
   EXPECT_EQ(200, test_helper->GetResponseCode());
-  EXPECT_TRUE(test_helper->response_body());
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY)
+    EXPECT_TRUE(test_helper->response_body());
   EXPECT_EQ(2, num_redirects);
 
   EXPECT_EQ(2u, loader_factory.requested_urls().size());
@@ -2377,8 +2533,11 @@
       if (test_case.expect_success) {
         EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
         EXPECT_EQ(200, test_helper->GetResponseCode());
-        ASSERT_TRUE(test_helper->response_body());
-        EXPECT_EQ(1u, test_helper->response_body()->size());
+
+        if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+          ASSERT_TRUE(test_helper->response_body());
+          EXPECT_EQ(1u, test_helper->response_body()->size());
+        }
       } else {
         EXPECT_EQ(net::ERR_NETWORK_CHANGED,
                   test_helper->simple_url_loader()->NetError());
@@ -2465,8 +2624,10 @@
   loader_factory.RunTest(test_helper.get());
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("", *test_helper->response_body());
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("", *test_helper->response_body());
+  }
 }
 
 // Test the case where DataPipeGetter::Read is called a second time, after only
@@ -2492,8 +2653,11 @@
   loader_factory.RunTest(test_helper.get());
 
   EXPECT_EQ(net::OK, test_helper->simple_url_loader()->NetError());
-  ASSERT_TRUE(test_helper->response_body());
-  EXPECT_EQ("", *test_helper->response_body());
+
+  if (GetParam() != SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY) {
+    ASSERT_TRUE(test_helper->response_body());
+    EXPECT_EQ("", *test_helper->response_body());
+  }
 }
 
 // Test for GetFinalURL.
@@ -2527,6 +2691,7 @@
     testing::Values(SimpleLoaderTestHelper::DownloadType::TO_STRING,
                     SimpleLoaderTestHelper::DownloadType::TO_FILE,
                     SimpleLoaderTestHelper::DownloadType::TO_TEMP_FILE,
+                    SimpleLoaderTestHelper::DownloadType::HEADERS_ONLY,
                     SimpleLoaderTestHelper::DownloadType::AS_STREAM));
 
 class SimpleURLLoaderFileTest : public SimpleURLLoaderTestBase,
diff --git a/services/network/public/mojom/BUILD.gn b/services/network/public/mojom/BUILD.gn
index 44642d4..9024ad4 100644
--- a/services/network/public/mojom/BUILD.gn
+++ b/services/network/public/mojom/BUILD.gn
@@ -88,6 +88,7 @@
     "network_service_test.mojom",
     "network_types.mojom",
     "p2p.mojom",
+    "p2p_trusted.mojom",
     "proxy_config.mojom",
     "proxy_config_with_annotation.mojom",
     "proxy_lookup_client.mojom",
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
index 65034a6b..610f5bf 100644
--- a/services/network/public/mojom/network_context.mojom
+++ b/services/network/public/mojom/network_context.mojom
@@ -16,6 +16,8 @@
 import "services/network/public/mojom/host_resolver.mojom";
 import "services/network/public/mojom/mutable_network_traffic_annotation_tag.mojom";
 import "services/network/public/mojom/network_param.mojom";
+import "services/network/public/mojom/p2p.mojom";
+import "services/network/public/mojom/p2p_trusted.mojom";
 import "services/network/public/mojom/proxy_config.mojom";
 import "services/network/public/mojom/proxy_config_with_annotation.mojom";
 import "services/network/public/mojom/proxy_lookup_client.mojom";
@@ -533,6 +535,11 @@
                     int32 load_flags,
                     bool privacy_mode_enabled);
 
+  // Creates a P2PSocketManager instance, used for WebRTC.
+  CreateP2PSocketManager(P2PTrustedSocketManagerClient client,
+                         P2PTrustedSocketManager& trusted_socket_manager,
+                         P2PSocketManager& socket_manager);
+
   // Destroys all URLLoaderFactory bindings, which should then be regenerated.
   // This should be called if there is a change to the proxies which should be
   // used on URLLoaders.
@@ -557,9 +564,9 @@
   // TODO(crbug.com/821021): Create (or move) a version of this API in some sort
   // of separate (and possibly restrictable) HostResolver mojo interface that
   // can be shared with processes without access to NetworkContext.
-  ResolveHost(HostPortPair host,

-              ResolveHostHandle&? control_handle,

-              ResolveHostClient response_client);

+  ResolveHost(HostPortPair host,
+              ResolveHostHandle&? control_handle,
+              ResolveHostClient response_client);
 
   [Sync]
   // Adds explicitly-specified data as if it was processed from an
diff --git a/services/network/public/mojom/network_service.mojom b/services/network/public/mojom/network_service.mojom
index 2eeab65..e95cf1d 100644
--- a/services/network/public/mojom/network_service.mojom
+++ b/services/network/public/mojom/network_service.mojom
@@ -6,6 +6,7 @@
 
 import "mojo/public/mojom/base/file.mojom";
 import "mojo/public/mojom/base/file_path.mojom";
+import "mojo/public/mojom/base/values.mojom";
 import "services/network/public/mojom/cookie_manager.mojom";
 import "services/network/public/mojom/network_change_manager.mojom";
 import "services/network/public/mojom/network_context.mojom";
@@ -183,6 +184,15 @@
 interface NetworkService {
   SetClient(NetworkServiceClient client);
 
+  // Starts observing the NetLog event stream and writing entries to |file|.
+  // |constants| is a legend used for decoding constant values in the log; it
+  // will be merged with the |GetNetConstants()| dictionary before being passed
+  // through to the FileObserver. (See |FileNetLogObserver::CreateBounded()|
+  // for more details). Most clients will just be adding a dictionary under
+  // the key "clientInfo".
+  StartNetLog(mojo_base.mojom.File file,
+              mojo_base.mojom.DictionaryValue constants);
+
   // Creates a new network context with the given parameters.
   CreateNetworkContext(NetworkContext& context,
                        NetworkContextParams params);
diff --git a/services/network/public/mojom/p2p_trusted.mojom b/services/network/public/mojom/p2p_trusted.mojom
new file mode 100644
index 0000000..6a8f4b0
--- /dev/null
+++ b/services/network/public/mojom/p2p_trusted.mojom
@@ -0,0 +1,29 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module network.mojom;
+
+import "services/network/public/mojom/p2p.mojom";
+
+// Trusted interfaces for socket-related communication between the browser and
+// network process
+
+// From the network process to the browser process.
+interface P2PTrustedSocketManagerClient {
+  // Called when the P2PSocketManager client requests socket creation with a
+  // port that's in an invalid range.
+  InvalidSocketPortRangeRequested();
+
+  // Called when packet dumping is enabled.
+  DumpPacket(array<uint8> packet_header,
+             uint64 packet_length,
+             bool incoming);
+};
+
+// From the browser process to the network process.
+interface P2PTrustedSocketManager {
+  // Start or stop dumping of packet headers.
+  StartRtpDump(bool incoming, bool outgoing);
+  StopRtpDump(bool incoming, bool outgoing);
+};
diff --git a/services/network/session_cleanup_cookie_store.cc b/services/network/session_cleanup_cookie_store.cc
index 96cce54f..548f78c3 100644
--- a/services/network/session_cleanup_cookie_store.cc
+++ b/services/network/session_cleanup_cookie_store.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_util.h"
 #include "base/memory/ref_counted.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "net/cookies/canonical_cookie.h"
 #include "net/cookies/cookie_constants.h"
 #include "net/cookies/cookie_util.h"
diff --git a/services/network/session_cleanup_cookie_store_unittest.cc b/services/network/session_cleanup_cookie_store_unittest.cc
index e80173e..e2afd9a 100644
--- a/services/network/session_cleanup_cookie_store_unittest.cc
+++ b/services/network/session_cleanup_cookie_store_unittest.cc
@@ -9,8 +9,8 @@
 #include "base/memory/ref_counted.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/time/time.h"
 #include "testing/gtest/include/gtest/gtest.h"
diff --git a/services/network/ssl_config_service_mojo.cc b/services/network/ssl_config_service_mojo.cc
index df77ad0..36c6512 100644
--- a/services/network/ssl_config_service_mojo.cc
+++ b/services/network/ssl_config_service_mojo.cc
@@ -34,12 +34,11 @@
     mojom::SSLConfigPtr initial_config,
     mojom::SSLConfigClientRequest ssl_config_client_request)
     : binding_(this),
-      ssl_config_(initial_config ? mojo::ConvertTo<net::SSLConfig>(
-                                       std::move(initial_config))
-                                 : net::SSLConfig()),
       client_cert_pooling_policy_(
           initial_config ? initial_config->client_cert_pooling_policy
                          : std::vector<std::string>()) {
+  if (initial_config)
+    ssl_config_ = mojo::ConvertTo<net::SSLConfig>(std::move(initial_config));
   if (ssl_config_client_request)
     binding_.Bind(std::move(ssl_config_client_request));
 }
@@ -47,11 +46,12 @@
 SSLConfigServiceMojo::~SSLConfigServiceMojo() = default;
 
 void SSLConfigServiceMojo::OnSSLConfigUpdated(mojom::SSLConfigPtr ssl_config) {
-  net::SSLConfig old_config = ssl_config_;
-  ssl_config_ = mojo::ConvertTo<net::SSLConfig>(std::move(ssl_config));
   bool force_notification =
       client_cert_pooling_policy_ != ssl_config->client_cert_pooling_policy;
   client_cert_pooling_policy_ = ssl_config->client_cert_pooling_policy;
+
+  net::SSLConfig old_config = ssl_config_;
+  ssl_config_ = mojo::ConvertTo<net::SSLConfig>(std::move(ssl_config));
   ProcessConfigUpdate(old_config, ssl_config_, force_notification);
 }
 
diff --git a/content/public/test/mock_network_connection_tracker.cc b/services/network/test/test_network_connection_tracker.cc
similarity index 73%
rename from content/public/test/mock_network_connection_tracker.cc
rename to services/network/test/test_network_connection_tracker.cc
index 8e85aab4..4f2b0c7b 100644
--- a/content/public/test/mock_network_connection_tracker.cc
+++ b/services/network/test/test_network_connection_tracker.cc
@@ -2,19 +2,19 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "content/public/test/mock_network_connection_tracker.h"
+#include "services/network/test/test_network_connection_tracker.h"
 
 #include "base/logging.h"
 #include "base/threading/thread_task_runner_handle.h"
 
-namespace content {
+namespace network {
 
-MockNetworkConnectionTracker::MockNetworkConnectionTracker(
+TestNetworkConnectionTracker::TestNetworkConnectionTracker(
     bool respond_synchronously,
     network::mojom::ConnectionType initial_type)
     : respond_synchronously_(respond_synchronously), type_(initial_type) {}
 
-bool MockNetworkConnectionTracker::GetConnectionType(
+bool TestNetworkConnectionTracker::GetConnectionType(
     network::mojom::ConnectionType* type,
     ConnectionTypeCallback callback) {
   if (respond_synchronously_) {
@@ -27,10 +27,10 @@
   return false;
 }
 
-void MockNetworkConnectionTracker::SetConnectionType(
+void TestNetworkConnectionTracker::SetConnectionType(
     network::mojom::ConnectionType type) {
   type_ = type;
   OnNetworkChanged(type_);
 }
 
-}  // namespace content
+}  // namespace network
diff --git a/content/public/test/mock_network_connection_tracker.h b/services/network/test/test_network_connection_tracker.h
similarity index 64%
rename from content/public/test/mock_network_connection_tracker.h
rename to services/network/test/test_network_connection_tracker.h
index 60ea5f6..b0999c2 100644
--- a/content/public/test/mock_network_connection_tracker.h
+++ b/services/network/test/test_network_connection_tracker.h
@@ -2,22 +2,22 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_PUBLIC_TEST_MOCK_NETWORK_CONNECTION_TRACKER_H_
-#define CONTENT_PUBLIC_TEST_MOCK_NETWORK_CONNECTION_TRACKER_H_
+#ifndef SERVICES_NETWORK_TEST_TEST_NETWORK_CONNECTION_TRACKER_H_
+#define SERVICES_NETWORK_TEST_TEST_NETWORK_CONNECTION_TRACKER_H_
 
-#include "content/public/browser/network_connection_tracker.h"
+#include "services/network/public/cpp/network_connection_tracker.h"
 
-namespace content {
+namespace network {
 
 // Allows unit tests to set the network connection type.
 // GetConnectionType() can be set to respond synchronously or asynchronously,
 // so that it may be tested that tested units are able to correctly handle
 // either.
-class MockNetworkConnectionTracker : public content::NetworkConnectionTracker {
+class TestNetworkConnectionTracker : public NetworkConnectionTracker {
  public:
-  MockNetworkConnectionTracker(bool respond_synchronously,
+  TestNetworkConnectionTracker(bool respond_synchronously,
                                network::mojom::ConnectionType initial_type);
-  ~MockNetworkConnectionTracker() override = default;
+  ~TestNetworkConnectionTracker() override = default;
 
   bool GetConnectionType(network::mojom::ConnectionType* type,
                          ConnectionTypeCallback callback) override;
@@ -32,6 +32,6 @@
   network::mojom::ConnectionType type_;
 };
 
-}  // namespace content
+}  // namespace network
 
-#endif  // CONTENT_PUBLIC_TEST_MOCK_NETWORK_CONNECTION_TRACKER_H_
+#endif  // SERVICES_NETWORK_TEST_TEST_NETWORK_CONNECTION_TRACKER_H_
diff --git a/services/network/test/test_network_context.h b/services/network/test/test_network_context.h
index 84db6a0..826f3a6 100644
--- a/services/network/test/test_network_context.h
+++ b/services/network/test/test_network_context.h
@@ -118,6 +118,10 @@
                          const GURL& url,
                          int32_t load_flags,
                          bool privacy_mode_enabled) override {}
+  void CreateP2PSocketManager(
+      mojom::P2PTrustedSocketManagerClientPtr client,
+      mojom::P2PTrustedSocketManagerRequest trusted_socket_manager,
+      mojom::P2PSocketManagerRequest socket_manager_request) override {}
   void ResetURLLoaderFactories() override {}
 };
 
diff --git a/services/network/test/test_network_service_client.cc b/services/network/test/test_network_service_client.cc
index 224d509..f465929 100644
--- a/services/network/test/test_network_service_client.cc
+++ b/services/network/test/test_network_service_client.cc
@@ -4,7 +4,7 @@
 
 #include "services/network/test/test_network_service_client.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 
 namespace network {
 
diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
index a2de867..1584563 100644
--- a/services/network/url_loader.cc
+++ b/services/network/url_loader.cc
@@ -12,7 +12,7 @@
 #include "base/files/file.h"
 #include "base/memory/weak_ptr.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "mojo/public/cpp/system/simple_watcher.h"
diff --git a/services/resource_coordinator/observers/metrics_collector.cc b/services/resource_coordinator/observers/metrics_collector.cc
index 6c9a907..9db60f28 100644
--- a/services/resource_coordinator/observers/metrics_collector.cc
+++ b/services/resource_coordinator/observers/metrics_collector.cc
@@ -16,8 +16,6 @@
 
 namespace resource_coordinator {
 
-const size_t kDefaultMaxCPUUsageMeasurements = 30u;
-
 // Audio is considered to have started playing if the page has never
 // previously played audio, or has been silent for at least one minute.
 const base::TimeDelta kMaxAudioSlientTimeout = base::TimeDelta::FromMinutes(1);
@@ -54,8 +52,7 @@
   return coresident_tabs.size() - 1;
 }
 
-MetricsCollector::MetricsCollector()
-    : max_ukm_cpu_usage_measurements_(kDefaultMaxCPUUsageMeasurements) {
+MetricsCollector::MetricsCollector() {
   UpdateWithFieldTrialParams();
 }
 
@@ -135,15 +132,7 @@
     const ProcessCoordinationUnitImpl* process_cu,
     const mojom::PropertyType property_type,
     int64_t value) {
-  if (property_type == mojom::PropertyType::kCPUUsage) {
-    for (auto* page_cu : process_cu->GetAssociatedPageCoordinationUnits()) {
-      if (IsCollectingCPUUsageForUkm(page_cu->id())) {
-        RecordCPUUsageForUkm(page_cu->id(), page_cu->GetCPUUsage(),
-                             GetNumCoresidentTabs(page_cu));
-      }
-    }
-  } else if (property_type ==
-             mojom::PropertyType::kExpectedTaskQueueingDuration) {
+  if (property_type == mojom::PropertyType::kExpectedTaskQueueingDuration) {
     for (auto* page_cu : process_cu->GetAssociatedPageCoordinationUnits()) {
       if (IsCollectingExpectedQueueingTimeForUkm(page_cu->id())) {
         int64_t expected_queueing_time;
@@ -213,14 +202,6 @@
   return page_cu->TimeSinceLastNavigation() > kMetricsReportDelayTimeout;
 }
 
-bool MetricsCollector::IsCollectingCPUUsageForUkm(
-    const CoordinationUnitID& page_cu_id) {
-  const UkmCollectionState& state = ukm_collection_state_map_[page_cu_id];
-
-  return state.ukm_source_id != ukm::kInvalidSourceId &&
-         state.num_cpu_usage_measurements < max_ukm_cpu_usage_measurements_;
-}
-
 bool MetricsCollector::IsCollectingExpectedQueueingTimeForUkm(
     const CoordinationUnitID& page_cu_id) {
   UkmCollectionState& state = ukm_collection_state_map_[page_cu_id];
@@ -228,18 +209,6 @@
          ++state.num_unreported_eqt_measurements >= frequency_ukm_eqt_reported_;
 }
 
-void MetricsCollector::RecordCPUUsageForUkm(
-    const CoordinationUnitID& page_cu_id,
-    double cpu_usage,
-    size_t num_coresident_tabs) {
-  UkmCollectionState& state = ukm_collection_state_map_[page_cu_id];
-
-  ukm::builders::CPUUsageMeasurement(state.ukm_source_id)
-      .SetCPUUsage(cpu_usage)
-      .SetNumberOfCoresidentTabs(num_coresident_tabs)
-      .Record(coordination_unit_graph().ukm_recorder());
-}
-
 void MetricsCollector::RecordExpectedQueueingTimeForUkm(
     const CoordinationUnitID& page_cu_id,
     int64_t expected_queueing_time) {
@@ -257,19 +226,10 @@
 
   state.ukm_source_id = ukm_source_id;
   // Updating the |ukm_source_id| restarts usage collection.
-  state.num_cpu_usage_measurements = 0u;
   state.num_unreported_eqt_measurements = 0u;
 }
 
 void MetricsCollector::UpdateWithFieldTrialParams() {
-  int64_t interval_ms = GetGRCRenderProcessCPUProfilingIntervalInMs();
-  int64_t duration_ms = GetGRCRenderProcessCPUProfilingDurationInMs();
-
-  if (interval_ms > 0 && duration_ms > 0 && duration_ms >= interval_ms) {
-    max_ukm_cpu_usage_measurements_ =
-        static_cast<size_t>(duration_ms / interval_ms);
-  }
-
   frequency_ukm_eqt_reported_ = base::GetFieldTrialParamByFeatureAsInt(
       ukm::kUkmFeature, "FrequencyUKMExpectedQueueingTime",
       kDefaultFrequencyUkmEQTReported);
diff --git a/services/resource_coordinator/observers/metrics_collector.h b/services/resource_coordinator/observers/metrics_collector.h
index 301a7d9..dc29a64 100644
--- a/services/resource_coordinator/observers/metrics_collector.h
+++ b/services/resource_coordinator/observers/metrics_collector.h
@@ -91,18 +91,13 @@
   };
 
   struct UkmCollectionState {
-    size_t num_cpu_usage_measurements = 0u;
     int num_unreported_eqt_measurements = 0u;
     ukm::SourceId ukm_source_id = ukm::kInvalidSourceId;
   };
 
   bool ShouldReportMetrics(const PageCoordinationUnitImpl* page_cu);
-  bool IsCollectingCPUUsageForUkm(const CoordinationUnitID& page_cu_id);
   bool IsCollectingExpectedQueueingTimeForUkm(
       const CoordinationUnitID& page_cu_id);
-  void RecordCPUUsageForUkm(const CoordinationUnitID& page_cu_id,
-                            double cpu_usage,
-                            size_t num_coresident_tabs);
   void RecordExpectedQueueingTimeForUkm(const CoordinationUnitID& page_cu_id,
                                         int64_t expected_queueing_time);
   void UpdateUkmSourceIdForPage(const CoordinationUnitID& page_cu_id,
@@ -114,7 +109,6 @@
   // already reported to avoid reporting multiple metrics.
   std::map<CoordinationUnitID, MetricsReportRecord> metrics_report_record_map_;
   std::map<CoordinationUnitID, UkmCollectionState> ukm_collection_state_map_;
-  size_t max_ukm_cpu_usage_measurements_ = 0u;
   // The number of reports to wait before reporting ExpectedQueueingTime. For
   // example, if |frequency_ukm_eqt_reported_| is 2, then the first value is not
   // reported, the second one is, the third one isn't, etc.
diff --git a/services/resource_coordinator/public/cpp/resource_coordinator_features.cc b/services/resource_coordinator/public/cpp/resource_coordinator_features.cc
index 7b15886f..b1ea6a7 100644
--- a/services/resource_coordinator/public/cpp/resource_coordinator_features.cc
+++ b/services/resource_coordinator/public/cpp/resource_coordinator_features.cc
@@ -11,28 +11,9 @@
 
 namespace {
 
-constexpr char kUkmPageLoadCPUUsageProfilingTrialName[] =
-    "UkmPageLoadCPUUsageProfiling";
-constexpr char kIntervalInMsParameterName[] = "intervalInMs";
-constexpr char kDurationInMsParameterName[] = "durationInMs";
 constexpr char kMainThreadTaskLoadLowThresholdParameterName[] =
     "mainThreadTaskLoadLowThreshold";
 
-int64_t GetIntegerFieldTrialParam(const std::string& trial_name,
-                                  const std::string& parameter_name,
-                                  int64_t default_val) {
-  std::string parameter_str =
-      base::GetFieldTrialParamValue(trial_name, parameter_name);
-
-  int64_t parameter_value;
-  if (parameter_str.empty() ||
-      !base::StringToInt64(parameter_str, &parameter_value)) {
-    return default_val;
-  }
-
-  return parameter_value;
-}
-
 }  // namespace
 
 namespace features {
@@ -41,10 +22,6 @@
 const base::Feature kGlobalResourceCoordinator{
     "GlobalResourceCoordinator", base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enable render process CPU profiling for GRC.
-const base::Feature kGRCRenderProcessCPUProfiling{
-    "GRCRenderProcessCPUProfiling", base::FEATURE_DISABLED_BY_DEFAULT};
-
 const base::Feature kPageAlmostIdle{"PageAlmostIdle",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -56,20 +33,6 @@
   return base::FeatureList::IsEnabled(features::kGlobalResourceCoordinator);
 }
 
-bool IsGRCRenderProcessCPUProfilingEnabled() {
-  return base::FeatureList::IsEnabled(features::kGRCRenderProcessCPUProfiling);
-}
-
-int64_t GetGRCRenderProcessCPUProfilingDurationInMs() {
-  return GetIntegerFieldTrialParam(kUkmPageLoadCPUUsageProfilingTrialName,
-                                   kDurationInMsParameterName, -1);
-}
-
-int64_t GetGRCRenderProcessCPUProfilingIntervalInMs() {
-  return GetIntegerFieldTrialParam(kUkmPageLoadCPUUsageProfilingTrialName,
-                                   kIntervalInMsParameterName, -1);
-}
-
 bool IsPageAlmostIdleSignalEnabled() {
   return base::FeatureList::IsEnabled(features::kPageAlmostIdle);
 }
diff --git a/services/resource_coordinator/public/cpp/resource_coordinator_features.h b/services/resource_coordinator/public/cpp/resource_coordinator_features.h
index 1f180b0..ec485ac0 100644
--- a/services/resource_coordinator/public/cpp/resource_coordinator_features.h
+++ b/services/resource_coordinator/public/cpp/resource_coordinator_features.h
@@ -18,8 +18,6 @@
 extern const SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT base::Feature
     kGlobalResourceCoordinator;
 extern const SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT base::Feature
-    kGRCRenderProcessCPUProfiling;
-extern const SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT base::Feature
     kPageAlmostIdle;
 
 }  // namespace features
@@ -29,12 +27,6 @@
 bool SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT
 IsResourceCoordinatorEnabled();
 
-int64_t SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT
-GetGRCRenderProcessCPUProfilingDurationInMs();
-
-int64_t SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT
-GetGRCRenderProcessCPUProfilingIntervalInMs();
-
 bool SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_EXPORT
 IsPageAlmostIdleSignalEnabled();
 
diff --git a/services/service_manager/embedder/mac_init.mm b/services/service_manager/embedder/mac_init.mm
index 64953e7..21497a4 100644
--- a/services/service_manager/embedder/mac_init.mm
+++ b/services/service_manager/embedder/mac_init.mm
@@ -19,6 +19,12 @@
     // application:openFile:], because they are handled directly. @"NO" looks
     // like a mistake, but the value really is supposed to be a string.
     @"NSTreatUnknownArgumentsAsOpen" : @"NO",
+
+    // Don't allow the browser process to enter AppNap. Doing so will result in
+    // large number of queued IPCs from renderers, potentially so many that
+    // Chrome is unusable for a long period after returning from sleep.
+    // https://crbug.com/871235.
+    @"NSAppSleepDisabled" : @YES,
   }];
 }
 
diff --git a/services/service_manager/embedder/main.cc b/services/service_manager/embedder/main.cc
index e9cb822..bc7399c 100644
--- a/services/service_manager/embedder/main.cc
+++ b/services/service_manager/embedder/main.cc
@@ -19,7 +19,7 @@
 #include "base/process/memory.h"
 #include "base/process/process.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/trace_event/trace_config.h"
 #include "base/trace_event/trace_log.h"
diff --git a/services/service_manager/public/cpp/service_keepalive.cc b/services/service_manager/public/cpp/service_keepalive.cc
index 3299e6de..4eb0d60b1 100644
--- a/services/service_manager/public/cpp/service_keepalive.cc
+++ b/services/service_manager/public/cpp/service_keepalive.cc
@@ -5,7 +5,7 @@
 #include "services/service_manager/public/cpp/service_keepalive.h"
 
 #include "base/bind.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "services/service_manager/public/cpp/service_context.h"
 
 namespace service_manager {
diff --git a/services/service_manager/public/cpp/service_test.cc b/services/service_manager/public/cpp/service_test.cc
index 1f9cccc..613458e3 100644
--- a/services/service_manager/public/cpp/service_test.cc
+++ b/services/service_manager/public/cpp/service_test.cc
@@ -60,6 +60,15 @@
   initialize_called_.Run();
 }
 
+void ServiceTest::Shutdown() {
+  background_service_manager_.reset();
+  context_.reset();
+}
+
+void ServiceTest::RunUntilIdle() {
+  scoped_task_environment_.RunUntilIdle();
+}
+
 void ServiceTest::SetUp() {
   background_service_manager_ =
       std::make_unique<service_manager::BackgroundServiceManager>(
@@ -80,8 +89,7 @@
 }
 
 void ServiceTest::TearDown() {
-  background_service_manager_.reset();
-  context_.reset();
+  Shutdown();
 }
 
 }  // namespace test
diff --git a/services/service_manager/public/cpp/service_test.h b/services/service_manager/public/cpp/service_test.h
index d0026e4..7bccecf6 100644
--- a/services/service_manager/public/cpp/service_test.h
+++ b/services/service_manager/public/cpp/service_test.h
@@ -91,6 +91,15 @@
                      const std::string& name,
                      const std::string& userid);
 
+  // Explicitly shuts down the ServiceManager and |context_|. This is called
+  // from TearDown(), but may be called explicitly to test shutdown behavior.
+  void Shutdown();
+
+  // Calls RunUntilIdle() on the current process's ScopedTaskEnvironment. Does
+  // not wait until the task environments of other processes, if there are any,
+  // are idle.
+  void RunUntilIdle();
+
   // testing::Test:
   void SetUp() override;
   void TearDown() override;
diff --git a/services/service_manager/public/cpp/standalone_service/main.cc b/services/service_manager/public/cpp/standalone_service/main.cc
index 069ae76..4064f6e5 100644
--- a/services/service_manager/public/cpp/standalone_service/main.cc
+++ b/services/service_manager/public/cpp/standalone_service/main.cc
@@ -12,7 +12,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/process/launch.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "services/service_manager/public/cpp/standalone_service/standalone_service.h"
 #include "services/service_manager/public/cpp/standalone_service/switches.h"
diff --git a/services/service_manager/public/cpp/standalone_service/standalone_service.cc b/services/service_manager/public/cpp/standalone_service/standalone_service.cc
index 0d14048..19bbea4 100644
--- a/services/service_manager/public/cpp/standalone_service/standalone_service.cc
+++ b/services/service_manager/public/cpp/standalone_service/standalone_service.cc
@@ -10,7 +10,7 @@
 #include "base/message_loop/message_loop.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "build/build_config.h"
 #include "mojo/core/embedder/embedder.h"
diff --git a/services/service_manager/runner/host/service_process_launcher.cc b/services/service_manager/runner/host/service_process_launcher.cc
index c7a061c..8353cc47 100644
--- a/services/service_manager/runner/host/service_process_launcher.cc
+++ b/services/service_manager/runner/host/service_process_launcher.cc
@@ -15,7 +15,7 @@
 #include "base/process/kill.h"
 #include "base/process/launch.h"
 #include "base/synchronization/lock.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
 #include "mojo/public/cpp/bindings/interface_ptr_info.h"
diff --git a/services/service_manager/sandbox/BUILD.gn b/services/service_manager/sandbox/BUILD.gn
index 1974757..9b0d5b0 100644
--- a/services/service_manager/sandbox/BUILD.gn
+++ b/services/service_manager/sandbox/BUILD.gn
@@ -8,8 +8,6 @@
 component("sandbox") {
   sources = [
     "export.h",
-    "features.cc",
-    "features.h",
     "sandbox.cc",
     "sandbox.h",
     "sandbox_delegate.h",
@@ -85,6 +83,8 @@
   }
   if (is_win) {
     sources += [
+      "features.cc",
+      "features.h",
       "win/sandbox_win.cc",
       "win/sandbox_win.h",
     ]
diff --git a/services/service_manager/sandbox/mac/BUILD.gn b/services/service_manager/sandbox/mac/BUILD.gn
index 1400738..277202f 100644
--- a/services/service_manager/sandbox/mac/BUILD.gn
+++ b/services/service_manager/sandbox/mac/BUILD.gn
@@ -5,7 +5,6 @@
 action_foreach("package_sb_files") {
   script = "package_sb_file.py"
   sources = [
-    "audio.sb",
     "cdm.sb",
     "common.sb",
     "common_v2.sb",
diff --git a/services/service_manager/sandbox/mac/audio.sb b/services/service_manager/sandbox/mac/audio.sb
deleted file mode 100644
index 775cc12..0000000
--- a/services/service_manager/sandbox/mac/audio.sb
+++ /dev/null
@@ -1,46 +0,0 @@
-; Copyright 2018 The Chromium Authors. All rights reserved.
-; Use of this source code is governed by a BSD-style license that can be
-; found in the LICENSE file.
-
-; --- The contents of common.sb implicitly included here. ---
-
-; File access.
-(allow file-read*
-  (path (user-homedir-path "/Library/Caches/com.apple.coreaudio.components.plist"))
-  (regex (user-homedir-path #"/Library/Preferences/com.apple.coreaudio.*"))
-  (subpath (user-homedir-path "/Library/Audio/Plug-Ins"))
-  (subpath "/Library/Audio/Plug-Ins")
-  (subpath "/Library/Video/Plug-Ins")
-  (subpath "/Library/QuickTime")
-  (subpath "/System/Library/Components")
-  (subpath "/System/Library/Extensions"))
-
-(allow device-microphone)
-
-(allow iokit-open
-  (iokit-user-client-class "IOAudioControlUserClient")
-  (iokit-user-client-class "IOAudioEngineUserClient"))
-
-(allow ipc-posix-shm-read* ipc-posix-shm-write-data
-  (ipc-posix-name-regex #"^AudioIO"))
-
-; Mach IPC.
-(allow mach-lookup
-  (global-name "com.apple.audio.SystemSoundServer-OSX")
-  (global-name "com.apple.audio.VDCAssistant")
-  (global-name "com.apple.audio.coreaudiod")
-  (global-name "com.apple.audio.audiohald"))
-
-(if (>= os-version 1013)
-  (allow mach-lookup
-    (global-name "com.apple.audio.AudioComponentRegistrar")
-    (xpc-service-name "com.apple.audio.SandboxHelper")))
-
-; sysctls.
-(allow sysctl-read
-  (sysctl-name "hw.optional.avx2_0")
-  (sysctl-name "hw.optional.avx1_0")
-  (sysctl-name "hw.optional.sse4_2")
-  (sysctl-name "hw.optional.sse4_1")
-  (sysctl-name "hw.optional.sse3")
-  (sysctl-name "hw.optional.sse2"))
diff --git a/services/service_manager/sandbox/mac/common_v2.sb b/services/service_manager/sandbox/mac/common_v2.sb
index be20890..8ec6abd 100644
--- a/services/service_manager/sandbox/mac/common_v2.sb
+++ b/services/service_manager/sandbox/mac/common_v2.sb
@@ -85,9 +85,8 @@
 (allow file-read* (subpath (param bundle-path)))
 
 ; Allow reads of system libraries and frameworks.
-(allow file-read*
+(allow file-read-data
   (subpath "/System/Library/Frameworks")
-  (subpath "/System/Library/Preferences/Logging")
   (subpath "/System/Library/PrivateFrameworks")
   (subpath "/usr/lib"))
 
diff --git a/services/service_manager/sandbox/mac/sandbox_mac.mm b/services/service_manager/sandbox/mac/sandbox_mac.mm
index 36b90f6..d69fcc0 100644
--- a/services/service_manager/sandbox/mac/sandbox_mac.mm
+++ b/services/service_manager/sandbox/mac/sandbox_mac.mm
@@ -38,7 +38,6 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/sys_info.h"
 #include "sandbox/mac/sandbox_compiler.h"
-#include "services/service_manager/sandbox/mac/audio.sb.h"
 #include "services/service_manager/sandbox/mac/cdm.sb.h"
 #include "services/service_manager/sandbox/mac/common.sb.h"
 #include "services/service_manager/sandbox/mac/gpu.sb.h"
@@ -63,6 +62,7 @@
 // Mapping from sandbox process types to resource IDs containing the sandbox
 // profile for all process types known to service_manager.
 // TODO(tsepez): Implement profile for SANDBOX_TYPE_NETWORK.
+// TODO(https://crbug.com/850878): Implement profile for SANDBOX_TYPE_AUDIO.
 SandboxTypeToResourceIDMapping kDefaultSandboxTypeToResourceIDMapping[] = {
     {SANDBOX_TYPE_NO_SANDBOX, nullptr},
     {SANDBOX_TYPE_RENDERER, kSeatbeltPolicyString_renderer},
@@ -74,7 +74,7 @@
     {SANDBOX_TYPE_NACL_LOADER, kSeatbeltPolicyString_nacl_loader},
     {SANDBOX_TYPE_PDF_COMPOSITOR, kSeatbeltPolicyString_ppapi},
     {SANDBOX_TYPE_PROFILING, kSeatbeltPolicyString_utility},
-    {SANDBOX_TYPE_AUDIO, kSeatbeltPolicyString_audio},
+    {SANDBOX_TYPE_AUDIO, nullptr},
 };
 
 static_assert(arraysize(kDefaultSandboxTypeToResourceIDMapping) ==
diff --git a/services/service_manager/sandbox/sandbox_type.cc b/services/service_manager/sandbox/sandbox_type.cc
index 9a9568a1..cfd27c1 100644
--- a/services/service_manager/sandbox/sandbox_type.cc
+++ b/services/service_manager/sandbox/sandbox_type.cc
@@ -7,9 +7,12 @@
 #include <string>
 
 #include "base/feature_list.h"
-#include "services/service_manager/sandbox/features.h"
 #include "services/service_manager/sandbox/switches.h"
 
+#if defined(OS_WIN)
+#include "services/service_manager/sandbox/features.h"
+#endif
+
 namespace service_manager {
 
 bool IsUnsandboxedSandboxType(SandboxType sandbox_type) {
@@ -21,7 +24,7 @@
       return true;
 #endif
     case SANDBOX_TYPE_AUDIO:
-#if defined(OS_WIN) || defined(OS_MACOSX)
+#if defined(OS_WIN)
       return !base::FeatureList::IsEnabled(
           service_manager::features::kAudioServiceSandbox);
 #else
diff --git a/services/tracing/coordinator.cc b/services/tracing/coordinator.cc
index d82a8ac..5535cee 100644
--- a/services/tracing/coordinator.cc
+++ b/services/tracing/coordinator.cc
@@ -19,8 +19,8 @@
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
diff --git a/services/tracing/perfetto/perfetto_service.cc b/services/tracing/perfetto/perfetto_service.cc
index d07d3451..abd7917 100644
--- a/services/tracing/perfetto/perfetto_service.cc
+++ b/services/tracing/perfetto/perfetto_service.cc
@@ -6,7 +6,7 @@
 
 #include <utility>
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "services/service_manager/public/cpp/bind_source_info.h"
 #include "services/tracing/perfetto/producer_host.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
diff --git a/services/tracing/public/cpp/perfetto/producer_client.cc b/services/tracing/public/cpp/perfetto/producer_client.cc
index 2717c76f..2e2fc068 100644
--- a/services/tracing/public/cpp/perfetto/producer_client.cc
+++ b/services/tracing/public/cpp/perfetto/producer_client.cc
@@ -7,7 +7,7 @@
 #include <utility>
 
 #include "base/no_destructor.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "services/tracing/public/cpp/perfetto/shared_memory.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/commit_data_request.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/shared_memory_arbiter.h"
diff --git a/services/ui/public/interfaces/screen_provider_observer.mojom b/services/ui/public/interfaces/screen_provider_observer.mojom
index 3ea030a..c49f3f5 100644
--- a/services/ui/public/interfaces/screen_provider_observer.mojom
+++ b/services/ui/public/interfaces/screen_provider_observer.mojom
@@ -12,8 +12,11 @@
   // that WS is running on has an integrated display, for example a laptop
   // internal display, then |internal_display_id| will be the corresponding
   // dislay id. If there is no internal display then |internal_display_id| will
-  // be kInvalidDisplayID.
+  // be kInvalidDisplayID. |display_id_for_new_windows| is the display on which
+  // to place new top-level windows, usually the display on which a window was
+  // last activated.
   OnDisplaysChanged(array<WsDisplay> displays,
                     int64 primary_display_id,
-                    int64 internal_display_id);
+                    int64 internal_display_id,
+                    int64 display_id_for_new_windows);
 };
diff --git a/services/ui/ws2/BUILD.gn b/services/ui/ws2/BUILD.gn
index c1ad085..b171a50e 100644
--- a/services/ui/ws2/BUILD.gn
+++ b/services/ui/ws2/BUILD.gn
@@ -78,6 +78,7 @@
     "//ui/aura",
     "//ui/base/mojo:lib",
     "//ui/wm",
+    "//ui/wm/public",
   ]
 
   defines = [ "IS_WINDOW_SERVICE_IMPL" ]
diff --git a/services/ui/ws2/screen_provider.cc b/services/ui/ws2/screen_provider.cc
index 2e80e21..bd2e61f3 100644
--- a/services/ui/ws2/screen_provider.cc
+++ b/services/ui/ws2/screen_provider.cc
@@ -49,6 +49,13 @@
   max_title_bar_button_width_ = max_title_bar_button_width;
 }
 
+void ScreenProvider::SetDisplayForNewWindows(int64_t display_id) {
+  if (display_id == display_id_for_new_windows_)
+    return;
+  display_id_for_new_windows_ = display_id;
+  NotifyAllObservers();
+}
+
 void ScreenProvider::DisplayMetricsChanged(const display::Display& display,
                                            uint32_t changed_metrics) {
   if ((changed_metrics &
@@ -70,7 +77,8 @@
 
 void ScreenProvider::NotifyObserver(mojom::ScreenProviderObserver* observer) {
   observer->OnDisplaysChanged(GetAllDisplays(), GetPrimaryDisplayId(),
-                              GetInternalDisplayId());
+                              GetInternalDisplayId(),
+                              display_id_for_new_windows_);
 }
 
 std::vector<mojom::WsDisplayPtr> ScreenProvider::GetAllDisplays() {
diff --git a/services/ui/ws2/screen_provider.h b/services/ui/ws2/screen_provider.h
index 00ecd24..6c1d60f5 100644
--- a/services/ui/ws2/screen_provider.h
+++ b/services/ui/ws2/screen_provider.h
@@ -13,6 +13,7 @@
 #include "services/ui/public/interfaces/screen_provider_observer.mojom.h"
 #include "services/ui/public/interfaces/window_tree_constants.mojom.h"
 #include "ui/display/display_observer.h"
+#include "ui/display/types/display_constants.h"
 #include "ui/gfx/geometry/insets.h"
 
 namespace display {
@@ -37,6 +38,9 @@
   void SetFrameDecorationValues(const gfx::Insets& client_area_insets,
                                 int max_title_bar_button_width);
 
+  // See WindowService documentation.
+  void SetDisplayForNewWindows(int64_t display_id);
+
   // See comment in WindowService as to why this is special cased.
   void DisplayMetricsChanged(const display::Display& display,
                              uint32_t changed_metrics);
@@ -58,6 +62,8 @@
   gfx::Insets client_area_insets_;
   int max_title_bar_button_width_ = 0;
 
+  int64_t display_id_for_new_windows_ = display::kInvalidDisplayId;
+
   base::ObserverList<mojom::ScreenProviderObserver> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(ScreenProvider);
diff --git a/services/ui/ws2/screen_provider_unittest.cc b/services/ui/ws2/screen_provider_unittest.cc
index 2ef4063b..1612109 100644
--- a/services/ui/ws2/screen_provider_unittest.cc
+++ b/services/ui/ws2/screen_provider_unittest.cc
@@ -93,6 +93,25 @@
   EXPECT_EQ(222, observer.primary_display_id());
 }
 
+TEST(ScreenProviderTest, SetDisplayForNewWindows) {
+  // Set up 2 displays.
+  constexpr int64_t kDisplayId1 = 111;
+  constexpr int64_t kDisplayId2 = 222;
+  TestScreen screen;
+  screen.AddDisplay(Display(kDisplayId1), DisplayList::Type::PRIMARY);
+  screen.AddDisplay(Display(kDisplayId2), DisplayList::Type::NOT_PRIMARY);
+
+  // Set the display for new windows to the second display.
+  ScreenProvider screen_provider;
+  screen_provider.SetDisplayForNewWindows(kDisplayId2);
+
+  TestScreenProviderObserver observer;
+  screen_provider.AddObserver(&observer);
+
+  // The screen information includes the display for new windows.
+  EXPECT_EQ(kDisplayId2, observer.display_id_for_new_windows());
+}
+
 TEST(ScreenProviderTest, SetFrameDecorationValues) {
   // Set up a single display.
   TestScreen screen;
diff --git a/services/ui/ws2/test_screen_provider_observer.cc b/services/ui/ws2/test_screen_provider_observer.cc
index 2b5eed5e..0ee9693 100644
--- a/services/ui/ws2/test_screen_provider_observer.cc
+++ b/services/ui/ws2/test_screen_provider_observer.cc
@@ -30,11 +30,13 @@
 void TestScreenProviderObserver::OnDisplaysChanged(
     std::vector<mojom::WsDisplayPtr> displays,
     int64_t primary_display_id,
-    int64_t internal_display_id) {
+    int64_t internal_display_id,
+    int64_t display_id_for_new_windows) {
   displays_ = std::move(displays);
   display_ids_ = DisplayIdsToString(displays_);
   primary_display_id_ = primary_display_id;
   internal_display_id_ = internal_display_id;
+  display_id_for_new_windows_ = display_id_for_new_windows;
 }
 
 }  // namespace ws2
diff --git a/services/ui/ws2/test_screen_provider_observer.h b/services/ui/ws2/test_screen_provider_observer.h
index 9b09e36a..2a114002 100644
--- a/services/ui/ws2/test_screen_provider_observer.h
+++ b/services/ui/ws2/test_screen_provider_observer.h
@@ -13,6 +13,7 @@
 #include "base/macros.h"
 #include "services/ui/public/interfaces/screen_provider_observer.mojom.h"
 #include "services/ui/ws2/window_service_delegate.h"
+#include "ui/display/types/display_constants.h"
 #include "ui/events/event.h"
 
 namespace ui {
@@ -29,17 +30,22 @@
   std::string& display_ids() { return display_ids_; }
   int64_t primary_display_id() const { return primary_display_id_; }
   int64_t internal_display_id() const { return internal_display_id_; }
+  int64_t display_id_for_new_windows() const {
+    return display_id_for_new_windows_;
+  }
 
   // mojom::ScreenProviderObserver:
   void OnDisplaysChanged(std::vector<mojom::WsDisplayPtr> displays,
                          int64_t primary_display_id,
-                         int64_t internal_display_id) override;
+                         int64_t internal_display_id,
+                         int64_t display_id_for_new_windows) override;
 
  private:
   std::vector<mojom::WsDisplayPtr> displays_;
   std::string display_ids_;
-  int64_t primary_display_id_ = 0;
-  int64_t internal_display_id_ = 0;
+  int64_t primary_display_id_ = display::kInvalidDisplayId;
+  int64_t internal_display_id_ = display::kInvalidDisplayId;
+  int64_t display_id_for_new_windows_ = display::kInvalidDisplayId;
 
   DISALLOW_COPY_AND_ASSIGN(TestScreenProviderObserver);
 };
diff --git a/services/ui/ws2/window_service.cc b/services/ui/ws2/window_service.cc
index 998a1a72..9bc55fd 100644
--- a/services/ui/ws2/window_service.cc
+++ b/services/ui/ws2/window_service.cc
@@ -100,6 +100,10 @@
                                              max_title_bar_button_width);
 }
 
+void WindowService::SetDisplayForNewWindows(int64_t display_id) {
+  screen_provider_->SetDisplayForNewWindows(display_id);
+}
+
 // static
 bool WindowService::HasRemoteClient(const aura::Window* window) {
   return ServerWindow::GetMayBeNull(window);
diff --git a/services/ui/ws2/window_service.h b/services/ui/ws2/window_service.h
index 2f5df2f..451f7465 100644
--- a/services/ui/ws2/window_service.h
+++ b/services/ui/ws2/window_service.h
@@ -90,6 +90,10 @@
   void SetFrameDecorationValues(const gfx::Insets& client_area_insets,
                                 int max_title_bar_button_width);
 
+  // Sets the display to use for new windows. The window server broadcasts this
+  // over mojo to all remote clients.
+  void SetDisplayForNewWindows(int64_t display_id);
+
   // Whether |window| hosts a remote client.
   static bool HasRemoteClient(const aura::Window* window);
 
diff --git a/services/ui/ws2/window_service_test_setup.cc b/services/ui/ws2/window_service_test_setup.cc
index 5ea6a4d9..ac9e0cdc 100644
--- a/services/ui/ws2/window_service_test_setup.cc
+++ b/services/ui/ws2/window_service_test_setup.cc
@@ -12,6 +12,7 @@
 #include "ui/gl/test/gl_surface_test_support.h"
 #include "ui/wm/core/base_focus_rules.h"
 #include "ui/wm/core/capture_controller.h"
+#include "ui/wm/public/activation_client.h"
 
 namespace ui {
 namespace ws2 {
@@ -50,6 +51,7 @@
   service_ =
       std::make_unique<WindowService>(&delegate_, nullptr, focus_controller());
   aura::client::SetFocusClient(root(), focus_controller());
+  wm::SetActivationClient(root(), focus_controller());
   delegate_.set_top_level_parent(aura_test_helper_.root_window());
 
   window_tree_ = service_->CreateWindowTree(&window_tree_client_);
diff --git a/services/ui/ws2/window_tree.cc b/services/ui/ws2/window_tree.cc
index e94f371..baeb995 100644
--- a/services/ui/ws2/window_tree.cc
+++ b/services/ui/ws2/window_tree.cc
@@ -45,6 +45,7 @@
 #include "ui/wm/core/capture_controller.h"
 #include "ui/wm/core/window_modality_controller.h"
 #include "ui/wm/core/window_util.h"
+#include "ui/wm/public/activation_client.h"
 
 namespace ui {
 namespace ws2 {
@@ -1171,11 +1172,8 @@
   // destructor.
 
   auto iter = FindClientRootWithRoot(window);
-  if (iter != client_roots_.end()) {
-    // TODO(sky): add test coverage of this. I'm pretty sure this isn't wired
-    // up correctly.
+  if (iter != client_roots_.end())
     DeleteClientRoot(iter->get(), WindowTree::DeleteClientRootReason::kDeleted);
-  }
 
   DCHECK_NE(0u, window_to_client_window_id_map_.count(window));
   const ClientWindowId client_window_id =
@@ -1666,8 +1664,34 @@
   }
 }
 
-void WindowTree::DeactivateWindow(Id window_id) {
-  NOTIMPLEMENTED_LOG_ONCE();
+void WindowTree::DeactivateWindow(Id transport_window_id) {
+  DVLOG(3) << "DeactivateWindow id="
+           << MakeClientWindowId(transport_window_id).ToString();
+  aura::Window* window = GetWindowByTransportId(transport_window_id);
+  if (!window) {
+    DVLOG(1) << "DeactivateWindow failed (no window)";
+    return;
+  }
+
+  if (!IsClientCreatedWindow(window) || !IsTopLevel(window)) {
+    DVLOG(1) << "DeactivateWindow failed (access denied)";
+    return;
+  }
+
+  wm::ActivationClient* activation_client =
+      wm::GetActivationClient(window->GetRootWindow());
+  if (!activation_client) {
+    DVLOG(1) << "DeactivateWindow failed (no activation client)";
+    return;
+  }
+
+  // Only allow deactivation if |window| is the active window.
+  if (activation_client->GetActiveWindow() != window) {
+    DVLOG(1) << "DeactivateWindow failed (window is not active)";
+    return;
+  }
+
+  activation_client->DeactivateWindow(window);
 }
 
 void WindowTree::StackAbove(uint32_t change_id, Id above_id, Id below_id) {
diff --git a/services/ui/ws2/window_tree.h b/services/ui/ws2/window_tree.h
index 6a832fd..0e4d12e1 100644
--- a/services/ui/ws2/window_tree.h
+++ b/services/ui/ws2/window_tree.h
@@ -401,7 +401,7 @@
                                ui::mojom::EventTargetingPolicy policy) override;
   void OnWindowInputEventAck(uint32_t event_id,
                              mojom::EventResult result) override;
-  void DeactivateWindow(Id window_id) override;
+  void DeactivateWindow(Id transport_window_id) override;
   void StackAbove(uint32_t change_id, Id above_id, Id below_id) override;
   void StackAtTop(uint32_t change_id, Id window_id) override;
   void PerformWmAction(Id window_id, const std::string& action) override;
diff --git a/services/ui/ws2/window_tree_unittest.cc b/services/ui/ws2/window_tree_unittest.cc
index 13b8454..ce7d4c8 100644
--- a/services/ui/ws2/window_tree_unittest.cc
+++ b/services/ui/ws2/window_tree_unittest.cc
@@ -31,6 +31,7 @@
 #include "ui/events/test/event_generator.h"
 #include "ui/wm/core/capture_controller.h"
 #include "ui/wm/core/focus_controller.h"
+#include "ui/wm/core/window_util.h"
 
 namespace ui {
 namespace ws2 {
@@ -996,6 +997,17 @@
       setup.window_tree_test_helper()->GetWindowByClientId(top_level_id));
 }
 
+TEST(WindowTreeTest, ExternalDeleteTopLevel) {
+  WindowServiceTestSetup setup;
+  aura::Window* top_level =
+      setup.window_tree_test_helper()->NewTopLevelWindow();
+  setup.changes()->clear();
+  ASSERT_TRUE(top_level);
+  delete top_level;
+  EXPECT_EQ("WindowDeleted window=0,1",
+            SingleChangeToDescription(*setup.changes()));
+}
+
 TEST(WindowTreeTest, ExternalDeleteWindow) {
   WindowServiceTestSetup setup;
   aura::Window* window = setup.window_tree_test_helper()->NewWindow();
@@ -1728,6 +1740,36 @@
   EXPECT_TRUE(setup.window_tree_client()->input_events().empty());
 }
 
+TEST(WindowTreeTest, DeactivateWindow) {
+  // Create two top-levels and focuses (activates) the second.
+  WindowServiceTestSetup setup;
+  aura::Window* top_level1 =
+      setup.window_tree_test_helper()->NewTopLevelWindow();
+  ASSERT_TRUE(top_level1);
+  top_level1->Show();
+  aura::Window* top_level2 =
+      setup.window_tree_test_helper()->NewTopLevelWindow();
+  ASSERT_TRUE(top_level2);
+  top_level2->Show();
+  EXPECT_TRUE(setup.window_tree_test_helper()->SetFocus(top_level2));
+  EXPECT_TRUE(wm::IsActiveWindow(top_level2));
+
+  // Attempting to deactivate |top_level1| should do nothing.
+  setup.window_tree_test_helper()->window_tree()->DeactivateWindow(
+      setup.window_tree_test_helper()->TransportIdForWindow(top_level1));
+  EXPECT_TRUE(wm::IsActiveWindow(top_level2));
+
+  // Similarly, calling Deactivate() with an invalid id should do nothing.
+  setup.window_tree_test_helper()->window_tree()->DeactivateWindow(
+      kInvalidTransportId);
+  EXPECT_TRUE(wm::IsActiveWindow(top_level2));
+
+  // Deactivate() with |top_level2| should activate |top_level1|.
+  setup.window_tree_test_helper()->window_tree()->DeactivateWindow(
+      setup.window_tree_test_helper()->TransportIdForWindow(top_level2));
+  EXPECT_TRUE(wm::IsActiveWindow(top_level1));
+}
+
 }  // namespace
 }  // namespace ws2
 }  // namespace ui
diff --git a/services/video_capture/device_factory_provider_impl.cc b/services/video_capture/device_factory_provider_impl.cc
index 1b01a76..c523977 100644
--- a/services/video_capture/device_factory_provider_impl.cc
+++ b/services/video_capture/device_factory_provider_impl.cc
@@ -4,7 +4,7 @@
 
 #include "services/video_capture/device_factory_provider_impl.h"
 
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
 #include "media/capture/video/create_video_capture_device_factory.h"
 #include "media/capture/video/fake_video_capture_device_factory.h"
diff --git a/storage/browser/BUILD.gn b/storage/browser/BUILD.gn
index bdc7a36f..2205922 100644
--- a/storage/browser/BUILD.gn
+++ b/storage/browser/BUILD.gn
@@ -175,6 +175,7 @@
     "quota/quota_client.h",
     "quota/quota_database.cc",
     "quota/quota_database.h",
+    "quota/quota_macros.h",
     "quota/quota_manager.cc",
     "quota/quota_manager.h",
     "quota/quota_manager_proxy.cc",
diff --git a/storage/browser/blob/blob_builder_from_stream.cc b/storage/browser/blob/blob_builder_from_stream.cc
index b195e57..1dac8b1 100644
--- a/storage/browser/blob/blob_builder_from_stream.cc
+++ b/storage/browser/blob/blob_builder_from_stream.cc
@@ -7,7 +7,7 @@
 #include "base/containers/span.h"
 #include "base/guid.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "storage/browser/blob/blob_data_item.h"
 #include "storage/browser/blob/blob_storage_context.h"
 #include "storage/browser/blob/shareable_file_reference.h"
diff --git a/storage/browser/blob/blob_builder_from_stream_unittest.cc b/storage/browser/blob/blob_builder_from_stream_unittest.cc
index f89b2508..4940825b 100644
--- a/storage/browser/blob/blob_builder_from_stream_unittest.cc
+++ b/storage/browser/blob/blob_builder_from_stream_unittest.cc
@@ -8,8 +8,8 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/rand_util.h"
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "mojo/public/cpp/bindings/associated_binding.h"
diff --git a/storage/browser/blob/blob_impl_unittest.cc b/storage/browser/blob/blob_impl_unittest.cc
index ee02116..3295c4e 100644
--- a/storage/browser/blob/blob_impl_unittest.cc
+++ b/storage/browser/blob/blob_impl_unittest.cc
@@ -7,7 +7,7 @@
 #include <memory>
 
 #include "base/run_loop.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "mojo/public/cpp/system/data_pipe_drainer.h"
 #include "net/base/net_errors.h"
diff --git a/storage/browser/blob/blob_reader.cc b/storage/browser/blob/blob_reader.cc
index 7bf43aef..5ea58ed 100644
--- a/storage/browser/blob/blob_reader.cc
+++ b/storage/browser/blob/blob_reader.cc
@@ -15,7 +15,7 @@
 #include "base/bind.h"
 #include "base/callback_helpers.h"
 #include "base/memory/ptr_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "net/base/io_buffer.h"
diff --git a/storage/browser/blob/blob_registry_impl_unittest.cc b/storage/browser/blob/blob_registry_impl_unittest.cc
index 5cb6029..d8b94809 100644
--- a/storage/browser/blob/blob_registry_impl_unittest.cc
+++ b/storage/browser/blob/blob_registry_impl_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/rand_util.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_restrictions.h"
diff --git a/storage/browser/blob/blob_transport_strategy_unittest.cc b/storage/browser/blob/blob_transport_strategy_unittest.cc
index 8cbc3be1..f4946338 100644
--- a/storage/browser/blob/blob_transport_strategy_unittest.cc
+++ b/storage/browser/blob/blob_transport_strategy_unittest.cc
@@ -11,7 +11,7 @@
 #include "base/rand_util.h"
 #include "base/run_loop.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_restrictions.h"
 #include "mojo/core/embedder/embedder.h"
diff --git a/storage/browser/database/database_quota_client_unittest.cc b/storage/browser/database/database_quota_client_unittest.cc
index 0fbe1e2..3d9986d 100644
--- a/storage/browser/database/database_quota_client_unittest.cc
+++ b/storage/browser/database/database_quota_client_unittest.cc
@@ -5,6 +5,7 @@
 #include <stdint.h>
 
 #include <map>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/callback_helpers.h"
@@ -15,7 +16,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_task_environment.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "net/base/net_errors.h"
 #include "storage/browser/database/database_quota_client.h"
 #include "storage/browser/database/database_tracker.h"
@@ -70,20 +71,20 @@
   }
 
   int DeleteDataForOrigin(const std::string& origin_identifier,
-                          const net::CompletionCallback& callback) override {
+                          net::CompletionOnceCallback callback) override {
     ++delete_called_count_;
     if (async_delete()) {
       base::ThreadTaskRunnerHandle::Get()->PostTask(
           FROM_HERE,
           base::BindOnce(&MockDatabaseTracker::AsyncDeleteDataForOrigin, this,
-                         callback));
+                         std::move(callback)));
       return net::ERR_IO_PENDING;
     }
     return net::OK;
   }
 
-  void AsyncDeleteDataForOrigin(const net::CompletionCallback& callback) {
-    callback.Run(net::OK);
+  void AsyncDeleteDataForOrigin(net::CompletionOnceCallback callback) {
+    std::move(callback).Run(net::OK);
   }
 
   void AddMockDatabase(const url::Origin& origin, const char* name, int size) {
diff --git a/storage/browser/database/database_tracker.cc b/storage/browser/database/database_tracker.cc
index b3de5ff..d33b7067 100644
--- a/storage/browser/database/database_tracker.cc
+++ b/storage/browser/database/database_tracker.cc
@@ -14,7 +14,7 @@
 #include "base/files/file_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "net/base/net_errors.h"
 #include "sql/database.h"
 #include "sql/meta_table.h"
@@ -176,7 +176,7 @@
   // a small optimization, see WebDatabaseObserverImpl::HandleSqliteError.
   if (error == SQLITE_CORRUPT || error == SQLITE_NOTADB) {
     DeleteDatabase(origin_identifier, database_name,
-                   net::CompletionCallback());
+                   net::CompletionOnceCallback());
   }
 }
 
@@ -222,8 +222,7 @@
         if (databases.empty()) {
           callback->second.erase(found_origin);
           if (callback->second.empty()) {
-            net::CompletionCallback cb = callback->first;
-            cb.Run(net::OK);
+            std::move(callback->first).Run(net::OK);
             callback = deletion_callbacks_.erase(callback);
             continue;
           }
@@ -640,11 +639,12 @@
 
 void DatabaseTracker::ScheduleDatabasesForDeletion(
     const DatabaseSet& databases,
-    const net::CompletionCallback& callback) {
+    net::CompletionOnceCallback callback) {
   DCHECK(!databases.empty());
 
   if (!callback.is_null())
-    deletion_callbacks_.push_back(std::make_pair(callback, databases));
+    deletion_callbacks_.push_back(
+        std::make_pair(std::move(callback), databases));
   for (const auto& origin_dbs : databases) {
     for (const base::string16& db : origin_dbs.second)
       ScheduleDatabaseForDeletion(origin_dbs.first, db);
@@ -653,7 +653,7 @@
 
 int DatabaseTracker::DeleteDatabase(const std::string& origin_identifier,
                                     const base::string16& database_name,
-                                    const net::CompletionCallback& callback) {
+                                    net::CompletionOnceCallback callback) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (!LazyInit())
     return net::ERR_FAILED;
@@ -663,7 +663,7 @@
     if (!callback.is_null()) {
       DatabaseSet set;
       set[origin_identifier].insert(database_name);
-      deletion_callbacks_.emplace_back(callback, set);
+      deletion_callbacks_.emplace_back(std::move(callback), set);
     }
     ScheduleDatabaseForDeletion(origin_identifier, database_name);
     return net::ERR_IO_PENDING;
@@ -674,7 +674,7 @@
 
 int DatabaseTracker::DeleteDataModifiedSince(
     const base::Time& cutoff,
-    const net::CompletionCallback& callback) {
+    net::CompletionOnceCallback callback) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (!LazyInit())
     return net::ERR_FAILED;
@@ -715,14 +715,14 @@
     return rv;
 
   if (!to_be_deleted.empty()) {
-    ScheduleDatabasesForDeletion(to_be_deleted, callback);
+    ScheduleDatabasesForDeletion(to_be_deleted, std::move(callback));
     return net::ERR_IO_PENDING;
   }
   return net::OK;
 }
 
-int DatabaseTracker::DeleteDataForOrigin(
-    const std::string& origin, const net::CompletionCallback& callback) {
+int DatabaseTracker::DeleteDataForOrigin(const std::string& origin,
+                                         net::CompletionOnceCallback callback) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   if (!LazyInit())
     return net::ERR_FAILED;
@@ -742,7 +742,7 @@
   }
 
   if (!to_be_deleted.empty()) {
-    ScheduleDatabasesForDeletion(to_be_deleted, callback);
+    ScheduleDatabasesForDeletion(to_be_deleted, std::move(callback));
     return net::ERR_IO_PENDING;
   }
   return net::OK;
diff --git a/storage/browser/database/database_tracker.h b/storage/browser/database/database_tracker.h
index b7e7103..f2961d3a 100644
--- a/storage/browser/database/database_tracker.h
+++ b/storage/browser/database/database_tracker.h
@@ -21,7 +21,7 @@
 #include "base/strings/string16.h"
 #include "base/strings/string_util.h"
 #include "base/time/time.h"
-#include "net/base/completion_callback.h"
+#include "net/base/completion_once_callback.h"
 #include "storage/browser/storage_browser_export.h"
 #include "storage/common/database/database_connections.h"
 
@@ -145,7 +145,7 @@
   // if non-null.
   int DeleteDatabase(const std::string& origin_identifier,
                      const base::string16& database_name,
-                     const net::CompletionCallback& callback);
+                     net::CompletionOnceCallback callback);
 
   // Delete any databases that have been touched since the cutoff date that's
   // supplied, omitting any that match IDs within |protected_origins|.
@@ -154,14 +154,14 @@
   // if non-null. Protected origins, according the the SpecialStoragePolicy,
   // are not deleted by this method.
   int DeleteDataModifiedSince(const base::Time& cutoff,
-                              const net::CompletionCallback& callback);
+                              net::CompletionOnceCallback callback);
 
   // Delete all databases that belong to the given origin. Returns net::OK on
   // success, net::FAILED if not all databases could be deleted, and
   // net::ERR_IO_PENDING and |callback| is invoked upon completion, if non-null.
   // virtual for unit testing only
   virtual int DeleteDataForOrigin(const std::string& origin_identifier,
-                                  const net::CompletionCallback& callback);
+                                  net::CompletionOnceCallback callback);
 
   bool IsIncognitoProfile() const { return is_incognito_; }
 
@@ -185,7 +185,7 @@
   friend class content::MockDatabaseTracker; // for testing
 
   typedef std::map<std::string, std::set<base::string16> > DatabaseSet;
-  typedef std::vector<std::pair<net::CompletionCallback, DatabaseSet> >
+  typedef std::vector<std::pair<net::CompletionOnceCallback, DatabaseSet>>
       PendingDeletionCallbacks;
   typedef std::map<base::string16, base::File*> FileHandlesMap;
   typedef std::map<std::string, base::string16> OriginDirectoriesMap;
@@ -267,7 +267,7 @@
   // Schedule a set of open databases for deletion. If non-null, callback is
   // invoked upon completion.
   void ScheduleDatabasesForDeletion(const DatabaseSet& databases,
-                                    const net::CompletionCallback& callback);
+                                    net::CompletionOnceCallback callback);
 
   // Returns the directory where all DB files for the given origin are stored.
   base::string16 GetOriginDirectory(const std::string& origin_identifier);
diff --git a/storage/browser/database/database_tracker_unittest.cc b/storage/browser/database/database_tracker_unittest.cc
index f213778c..b9a194b 100644
--- a/storage/browser/database/database_tracker_unittest.cc
+++ b/storage/browser/database/database_tracker_unittest.cc
@@ -475,7 +475,7 @@
     tracker->DatabaseClosed(kOriginId, kName);
     EXPECT_TRUE(test_quota_proxy->WasAccessNotified(kOrigin));
     EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kName,
-                                               net::CompletionCallback()));
+                                               net::CompletionOnceCallback()));
     EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
     test_quota_proxy->reset();
 
@@ -494,9 +494,9 @@
     EXPECT_TRUE(test_quota_proxy->WasModificationNotified(kOrigin, 100));
     test_quota_proxy->reset();
 
-    EXPECT_EQ(
-        net::ERR_IO_PENDING,
-        tracker->DeleteDatabase(kOriginId, kName, net::CompletionCallback()));
+    EXPECT_EQ(net::ERR_IO_PENDING,
+              tracker->DeleteDatabase(kOriginId, kName,
+                                      net::CompletionOnceCallback()));
     EXPECT_FALSE(test_quota_proxy->WasModificationNotified(kOrigin, -100));
 
     tracker->DatabaseClosed(kOriginId, kName);
@@ -728,7 +728,7 @@
 
     // Deleting it should return to the initial state.
     EXPECT_EQ(net::OK, tracker->DeleteDatabase(kOriginId, kEmptyName,
-                                               net::CompletionCallback()));
+                                               net::CompletionOnceCallback()));
     infos.clear();
     EXPECT_TRUE(tracker->GetAllOriginsInfo(&infos));
     EXPECT_TRUE(infos.empty());
diff --git a/storage/browser/quota/quota_macros.h b/storage/browser/quota/quota_macros.h
new file mode 100644
index 0000000..d21f6313
--- /dev/null
+++ b/storage/browser/quota/quota_macros.h
@@ -0,0 +1,14 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef STORAGE_BROWSER_QUOTA_QUOTA_MACROS_H_
+#define STORAGE_BROWSER_QUOTA_QUOTA_MACROS_H_
+
+#include "base/metrics/histogram_macros.h"
+
+#define UMA_HISTOGRAM_MBYTES(name, sample)                                     \
+  UMA_HISTOGRAM_CUSTOM_COUNTS((name), static_cast<int>((sample) / kMBytes), 1, \
+                              10 * 1024 * 1024 /* 10TB */, 100)
+
+#endif  // STORAGE_BROWSER_QUOTA_QUOTA_MACROS_H_
diff --git a/storage/browser/quota/quota_manager.cc b/storage/browser/quota/quota_manager.cc
index 5e8632c..59c97c9 100644
--- a/storage/browser/quota/quota_manager.cc
+++ b/storage/browser/quota/quota_manager.cc
@@ -19,13 +19,12 @@
 #include "base/command_line.h"
 #include "base/files/file_util.h"
 #include "base/macros.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/sequenced_task_runner.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner_util.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
@@ -33,6 +32,7 @@
 #include "base/trace_event/trace_event.h"
 #include "net/base/url_util.h"
 #include "storage/browser/quota/client_usage_tracker.h"
+#include "storage/browser/quota/quota_macros.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "storage/browser/quota/quota_temporary_storage_evictor.h"
 #include "storage/browser/quota/storage_monitor.h"
@@ -48,10 +48,6 @@
 const int kMinutesInMilliSeconds = 60 * 1000;
 const int64_t kReportHistogramInterval = 60 * 60 * 1000;  // 1 hour
 
-#define UMA_HISTOGRAM_MBYTES(name, sample)                                     \
-  UMA_HISTOGRAM_CUSTOM_COUNTS((name), static_cast<int>((sample) / kMBytes), 1, \
-                              10 * 1024 * 1024 /* 10TB */, 100)
-
 }  // namespace
 
 const int64_t QuotaManager::kNoLimit = INT64_MAX;
diff --git a/storage/browser/quota/quota_settings.cc b/storage/browser/quota/quota_settings.cc
index b3f3feb3..35a4b6b1 100644
--- a/storage/browser/quota/quota_settings.cc
+++ b/storage/browser/quota/quota_settings.cc
@@ -6,16 +6,12 @@
 
 #include <algorithm>
 
-#include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
-
-#define UMA_HISTOGRAM_MBYTES(name, sample)                                     \
-  UMA_HISTOGRAM_CUSTOM_COUNTS((name), static_cast<int>((sample) / kMBytes), 1, \
-                              10 * 1024 * 1024 /* 10TB */, 100)
+#include "storage/browser/quota/quota_macros.h"
 
 namespace storage {
 
diff --git a/storage/browser/quota/quota_temporary_storage_evictor.cc b/storage/browser/quota/quota_temporary_storage_evictor.cc
index 18185663..e933928 100644
--- a/storage/browser/quota/quota_temporary_storage_evictor.cc
+++ b/storage/browser/quota/quota_temporary_storage_evictor.cc
@@ -10,16 +10,11 @@
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
-#include "base/metrics/histogram_macros.h"
+#include "storage/browser/quota/quota_macros.h"
 #include "storage/browser/quota/quota_manager.h"
 #include "third_party/blink/public/mojom/quota/quota_types.mojom.h"
 #include "url/gurl.h"
 
-#define UMA_HISTOGRAM_MBYTES(name, sample)          \
-  UMA_HISTOGRAM_CUSTOM_COUNTS(                      \
-      (name), static_cast<int>((sample) / kMBytes), \
-      1, 10 * 1024 * 1024 /* 10TB */, 100)
-
 #define UMA_HISTOGRAM_MINUTES(name, sample) \
   UMA_HISTOGRAM_CUSTOM_TIMES(             \
       (name), (sample),                   \
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json
index b60bcb71..e28f745 100644
--- a/testing/buildbot/chromium.android.fyi.json
+++ b/testing/buildbot/chromium.android.fyi.json
@@ -1522,7 +1522,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -3905,7 +3905,7 @@
               "os": "Android"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -5473,7 +5473,7 @@
               "os": "Android"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index e8b50843..5f99f64 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -1376,7 +1376,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -4033,7 +4033,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -6756,7 +6756,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -9519,7 +9519,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -12310,7 +12310,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -15012,7 +15012,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -18101,7 +18101,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -20774,7 +20774,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 7477a39..7e92952 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -7,6 +7,22 @@
     ],
     "gtest_tests": [
       {
+        "args": [
+          "--ozone-platform=headless"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "kvm": "1",
+              "os": "Ubuntu-14.04",
+              "pool": "Chrome-CrOS-VM"
+            }
+          ]
+        },
+        "test": "aura_unittests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -59,6 +75,23 @@
         "test": "cc_unittests"
       },
       {
+        "args": [
+          "--dbus-stub",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.chromeos_unittests.filter"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "kvm": "1",
+              "os": "Ubuntu-14.04",
+              "pool": "Chrome-CrOS-VM"
+            }
+          ]
+        },
+        "test": "chromeos_unittests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -192,6 +225,22 @@
         "test": "mojo_unittests"
       },
       {
+        "args": [
+          "--ozone-platform=headless"
+        ],
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "kvm": "1",
+              "os": "Ubuntu-14.04",
+              "pool": "Chrome-CrOS-VM"
+            }
+          ]
+        },
+        "test": "ozone_gl_unittests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json
index 3c515f5..63349ce 100644
--- a/testing/buildbot/chromium.clang.json
+++ b/testing/buildbot/chromium.clang.json
@@ -96,17 +96,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -776,17 +765,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -4826,2670 +4804,6 @@
       }
     ]
   },
-  "CrWinClangLLD": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "angle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "app_shell_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "battor_agent_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_fuzzer_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_heap_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_platform_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_crypto_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_ssl_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_browser_tests.filter"
-        ],
-        "name": "network_service_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 15
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_app_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_cleaner_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_import_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_components_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter"
-        ],
-        "name": "network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "courgette_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crashpad_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "elevation_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_extensions_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "filesystem_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gfx_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gin_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "install_static_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "installer_util_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_interactive_ui_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "leveldb_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "libjingle_xmpp_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "message_center_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_core_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "sbox_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_validation_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "service_manager_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "services_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "setup_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "shell_dialogs_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "snapshot_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sync_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "traffic_annotation_auditor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "viz_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_pixeltests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "webkit_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wtf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "zucchini_unittests"
-      }
-    ]
-  },
-  "CrWinClangLLD64": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "angle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "app_shell_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "battor_agent_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_fuzzer_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_heap_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_platform_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_crypto_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_ssl_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_browser_tests.filter"
-        ],
-        "name": "network_service_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 15
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_app_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_cleaner_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_import_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_components_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter"
-        ],
-        "name": "network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "courgette_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crashpad_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "elevation_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_extensions_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "filesystem_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gfx_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gin_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "install_static_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "installer_util_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_interactive_ui_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "leveldb_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "libjingle_xmpp_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "message_center_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_core_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "sbox_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_validation_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "service_manager_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "services_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "setup_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "shell_dialogs_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "snapshot_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sync_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "traffic_annotation_auditor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "viz_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_pixeltests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "webkit_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wtf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "zucchini_unittests"
-      }
-    ]
-  },
-  "CrWinClngLLD64dbg": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "angle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "app_shell_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "battor_agent_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_fuzzer_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_heap_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_platform_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_crypto_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_ssl_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_browser_tests.filter"
-        ],
-        "name": "network_service_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 15
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_app_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_cleaner_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_import_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_components_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter"
-        ],
-        "name": "network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "courgette_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crashpad_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "elevation_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_extensions_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "filesystem_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gfx_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gin_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "install_static_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "installer_util_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_interactive_ui_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "leveldb_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "libjingle_xmpp_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "message_center_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_core_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "sbox_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_validation_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "service_manager_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "services_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "setup_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "shell_dialogs_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "snapshot_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sync_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "traffic_annotation_auditor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "viz_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_pixeltests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "webkit_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wtf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "zucchini_unittests"
-      }
-    ]
-  },
-  "CrWinClngLLDdbg": {
-    "gtest_tests": [
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "accessibility_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "angle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "app_shell_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "aura_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "battor_agent_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_fuzzer_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_heap_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "blink_platform_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_crypto_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "boringssl_ssl_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_browser_tests.filter"
-        ],
-        "name": "network_service_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 15
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cacheinvalidation_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "capture_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cast_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cc_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_app_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_cleaner_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_import_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chrome_elf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "chromedriver_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_components_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "components_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "compositor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/mojo.fyi.network_content_browsertests.filter"
-        ],
-        "name": "network_service_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 2
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "content_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "args": [
-          "--enable-features=VizDisplayCompositor"
-        ],
-        "name": "viz_content_unittests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "content_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "courgette_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crashpad_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "cronet_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "crypto_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "device_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "display_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "elevation_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "events_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_extensions_browsertests",
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "extensions_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "filesystem_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gcm_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gfx_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gin_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "google_apis_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "gpu_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_browsertests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "headless_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "install_static_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "installer_util_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "args": [
-          "--enable-features=NetworkService"
-        ],
-        "name": "network_service_interactive_ui_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 3
-        },
-        "test": "interactive_ui_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ipc_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "jingle_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "latency_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "leveldb_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "libjingle_xmpp_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_blink_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_service_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "media_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "message_center_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "midi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_core_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "mojo_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "nacl_loader_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "native_theme_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "net_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "pdf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ppapi_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "printing_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "remoting_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "sbox_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sbox_validation_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "service_manager_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "services_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "integrity": "high"
-            }
-          ]
-        },
-        "test": "setup_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "shell_dialogs_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "skia_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "snapshot_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sql_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "storage_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "sync_integration_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "traffic_annotation_auditor_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_base_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "ui_touch_selection_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "url_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "views_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "viz_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_common_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "vr_pixeltests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "webkit_unit_tests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wm_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "wtf_unittests"
-      },
-      {
-        "swarming": {
-          "can_use_on_swarming_builders": true
-        },
-        "test": "zucchini_unittests"
-      }
-    ]
-  },
   "ToTAndroid": {
     "additional_compile_targets": [
       "all"
@@ -8357,7 +5671,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -11058,7 +8372,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -12973,17 +10287,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -13649,17 +10952,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -14295,17 +11587,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -14951,17 +12232,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -15616,17 +12886,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -23989,17 +21248,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index dbf36f5..e1fa7c7 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -1349,7 +1349,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -2754,7 +2754,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -2817,24 +2817,6 @@
     ],
     "gtest_tests": [
       {
-        "args": [
-          "--ozone-platform=headless"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "kvm": "1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-CrOS-VM"
-            }
-          ],
-          "hard_timeout": 3600,
-          "io_timeout": 3600
-        },
-        "test": "aura_unittests"
-      },
-      {
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2911,24 +2893,6 @@
       },
       {
         "args": [
-          "--ozone-platform=headless"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "kvm": "1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-CrOS-VM"
-            }
-          ],
-          "hard_timeout": 3600,
-          "io_timeout": 3600
-        },
-        "test": "ozone_gl_unittests"
-      },
-      {
-        "args": [
           "--vpython-dir=../../vpython_dir_linux_amd64",
           "--ozone-platform=headless",
           "--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.services_unittests.filter"
@@ -2962,6 +2926,7 @@
           "--remote=127.0.0.1",
           "--remote-ssh-port=9222",
           "--xvfb",
+          "--skip=core.perf_benchmark_unittest.PerfBenchmarkTest.testVariationArgs",
           "--skip=measurements.clock_domain_test.ClockDomainTest.testTelemetryUsesChromeClockDomain"
         ],
         "isolate_name": "telemetry_perf_unittests",
@@ -2978,7 +2943,7 @@
           "hard_timeout": 3600,
           "idempotent": false,
           "io_timeout": 3600,
-          "shards": 12
+          "shards": 6
         }
       },
       {
@@ -2988,7 +2953,8 @@
           "--remote=127.0.0.1",
           "--remote-ssh-port=9222",
           "--skip=telemetry.core.tracing_controller_unittest.TracingControllerTest.testBattOrTracing",
-          "--skip=telemetry.internal.app.android_app_unittest.AndroidAppTest.testWebView"
+          "--skip=telemetry.internal.app.android_app_unittest.AndroidAppTest.testWebView",
+          "--skip=telemetry.internal.backends.browser_backend_unittest.BrowserBackendIntegrationTest.testSmokeIsBrowserRunningReturnFalse"
         ],
         "isolate_name": "telemetry_unittests",
         "name": "telemetry_unittests",
@@ -3004,7 +2970,7 @@
           "hard_timeout": 3600,
           "idempotent": false,
           "io_timeout": 3600,
-          "shards": 6
+          "shards": 12
         }
       }
     ]
@@ -4103,17 +4069,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -4892,17 +4847,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json
index ca71057..dd926ad 100644
--- a/testing/buildbot/chromium.gpu.fyi.json
+++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -5799,7 +5799,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5816,7 +5816,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5836,7 +5836,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5853,7 +5853,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5869,7 +5869,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5885,7 +5885,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5898,7 +5898,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5915,7 +5915,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ]
@@ -5940,7 +5940,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -5963,7 +5963,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -5986,7 +5986,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6009,7 +6009,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6036,7 +6036,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6066,7 +6066,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6104,7 +6104,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6128,7 +6128,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6151,7 +6151,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6176,7 +6176,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -6200,7 +6200,7 @@
           "dimension_sets": [
             {
               "gpu": "8086:0a2e",
-              "os": "Mac-10.13.5",
+              "os": "Mac-10.13.6",
               "pool": "Chrome-GPU"
             }
           ],
@@ -11064,7 +11064,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -11433,7 +11433,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12029,7 +12029,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -12701,6 +12701,28 @@
       },
       {
         "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--gtest_filter=WebVrBrowserTest*:WebXrVrBrowserTest*",
+          "--enable-pixel-output-in-tests",
+          "--gtest_also_run_disabled_tests"
+        ],
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "8086:5912-24.20.100.6025",
+              "os": "Windows-10",
+              "pool": "Chrome-GPU"
+            }
+          ]
+        },
+        "test": "browser_tests"
+      },
+      {
+        "args": [
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
@@ -13351,7 +13373,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -14082,7 +14104,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -16064,6 +16086,28 @@
       },
       {
         "args": [
+          "--enable-gpu",
+          "--test-launcher-bot-mode",
+          "--test-launcher-jobs=1",
+          "--gtest_filter=WebVrBrowserTest*:WebXrVrBrowserTest*",
+          "--enable-pixel-output-in-tests",
+          "--gtest_also_run_disabled_tests"
+        ],
+        "name": "xr_browser_tests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "dimension_sets": [
+            {
+              "gpu": "1002:6613",
+              "os": "Windows-2008ServerR2-SP1",
+              "pool": "Chrome-GPU"
+            }
+          ]
+        },
+        "test": "browser_tests"
+      },
+      {
+        "args": [
           "--use-gpu-in-tests",
           "--use-cmd-decoder=validating"
         ],
diff --git a/testing/buildbot/chromium.gpu.json b/testing/buildbot/chromium.gpu.json
index df8abf08f..b6b2361b 100644
--- a/testing/buildbot/chromium.gpu.json
+++ b/testing/buildbot/chromium.gpu.json
@@ -2295,7 +2295,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
@@ -2730,7 +2730,7 @@
           "--enable-pixel-output-in-tests",
           "--gtest_also_run_disabled_tests"
         ],
-        "name": "vr_browser_tests",
+        "name": "xr_browser_tests",
         "swarming": {
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index 85c5bb2a..d578263d 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -922,17 +922,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -1734,17 +1723,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -3242,22 +3220,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "os": "Ubuntu-16.04"
-            }
-          ],
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index f570fd46..902ef26 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -2290,7 +2290,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:0a2e",
+              "gpu": "none",
               "os": "Mac-10.12.6"
             }
           ],
@@ -2873,7 +2873,7 @@
       {
         "alternate_swarming_dimensions": [
           {
-            "gpu": "8086:0a2e",
+            "gpu": "none",
             "os": "Mac-10.12.6"
           }
         ],
@@ -2890,7 +2890,7 @@
           "can_use_on_swarming_builders": true,
           "dimension_sets": [
             {
-              "gpu": "8086:0a2e",
+              "gpu": "none",
               "os": "Mac-10.13"
             }
           ],
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index d055041..c96ede0c 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -821,7 +821,7 @@
               "name": "shard #${SHARD_INDEX} logcats"
             }
           ],
-          "shards": 2
+          "shards": 9
         },
         "test": "content_browsertests"
       },
@@ -3647,17 +3647,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -5581,17 +5570,6 @@
       },
       {
         "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
-        "args": [
           "--enable-features=VizDisplayCompositor"
         ],
         "name": "viz_browser_tests",
@@ -7139,5 +7117,10 @@
         "test": "wtf_unittests"
       }
     ]
+  },
+  "win-asan": {
+    "additional_compile_targets": [
+      "base_unittests"
+    ]
   }
 }
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 5d0954a..20b945a 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -341,102 +341,6 @@
       }
     ]
   },
-  "Android One Perf": {
-    "isolated_scripts": [
-      {
-        "args": [
-          "-v",
-          "--browser=android-chromium",
-          "--upload-results",
-          "--run-ref-build",
-          "--test-shard-map-filename=android_one_16_shard_map.json",
-          "--assert-gpu-compositing"
-        ],
-        "isolate_name": "performance_test_suite",
-        "merge": {
-          "args": [
-            "--service-account-file",
-            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "performance_test_suite",
-        "override_compile_targets": [
-          "performance_test_suite"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "device_os": "LMY47W",
-              "device_os_flavor": "google",
-              "device_type": "sprout",
-              "os": "Android",
-              "pool": "chrome.tests.perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 25200,
-          "ignore_task_failure": false,
-          "io_timeout": 1800,
-          "shards": 16,
-          "upload_test_results": true
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name",
-          "tracing_perftests",
-          "--non-telemetry=true",
-          "--migrated-test=true"
-        ],
-        "isolate_name": "tracing_perftests",
-        "merge": {
-          "args": [
-            "--service-account-file",
-            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "tracing_perftests",
-        "override_compile_targets": [
-          "tracing_perftests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "device_os": "LMY47W",
-              "device_os_flavor": "google",
-              "device_type": "sprout",
-              "os": "Android",
-              "pool": "chrome.tests.perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 25200,
-          "ignore_task_failure": false,
-          "io_timeout": 1800,
-          "shards": 1,
-          "upload_test_results": true
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      }
-    ]
-  },
   "Android arm64 Compile Perf": {
     "additional_compile_targets": [
       "microdump_stackwalk",
@@ -1543,51 +1447,6 @@
           ],
           "script": "//testing/trigger_scripts/perf_device_trigger.py"
         }
-      },
-      {
-        "args": [
-          "-v",
-          "--browser=release",
-          "--upload-results",
-          "--run-ref-build",
-          "--test-shard-map-filename=mac_1012_low_end_26_shard_map.json",
-          "--assert-gpu-compositing"
-        ],
-        "isolate_name": "performance_test_suite",
-        "merge": {
-          "args": [
-            "--service-account-file",
-            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "performance_test_suite",
-        "override_compile_targets": [
-          "performance_test_suite"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "os": "Mac-10.12",
-              "pool": "chrome.tests.perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 25200,
-          "ignore_task_failure": false,
-          "io_timeout": 1800,
-          "shards": 26,
-          "upload_test_results": true
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
       }
     ]
   },
@@ -1681,51 +1540,6 @@
       },
       {
         "args": [
-          "-v",
-          "--browser=release",
-          "--upload-results",
-          "--run-ref-build",
-          "--test-shard-map-filename=mac_1013_high_end_26_shard_map.json",
-          "--assert-gpu-compositing"
-        ],
-        "isolate_name": "performance_test_suite",
-        "merge": {
-          "args": [
-            "--service-account-file",
-            "/creds/service_accounts/service-account-chromium-perf-histograms.json"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "performance_test_suite",
-        "override_compile_targets": [
-          "performance_test_suite"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "os": "Mac-10.13",
-              "pool": "chrome.tests.perf"
-            }
-          ],
-          "expiration": 21600,
-          "hard_timeout": 25200,
-          "ignore_task_failure": false,
-          "io_timeout": 1800,
-          "shards": 26,
-          "upload_test_results": true
-        },
-        "trigger_script": {
-          "args": [
-            "--multiple-dimension-script-verbose",
-            "True"
-          ],
-          "script": "//testing/trigger_scripts/perf_device_trigger.py"
-        }
-      },
-      {
-        "args": [
           "--gtest-benchmark-name",
           "views_perftests",
           "--non-telemetry=true",
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json
index e2e1c06..fd42bd21c 100644
--- a/testing/buildbot/chromium.win.json
+++ b/testing/buildbot/chromium.win.json
@@ -2050,6 +2050,7 @@
         "args": [
           "--jobs=1"
         ],
+        "experiment_percentage": 100,
         "isolate_name": "telemetry_unittests",
         "name": "telemetry_unittests",
         "swarming": {
diff --git a/testing/buildbot/client.v8.chromium.json b/testing/buildbot/client.v8.chromium.json
index cf8537d..ec53bc6d 100644
--- a/testing/buildbot/client.v8.chromium.json
+++ b/testing/buildbot/client.v8.chromium.json
@@ -17,17 +17,6 @@
         "test": "browser_tests"
       },
       {
-        "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -283,17 +272,6 @@
         "test": "browser_tests"
       },
       {
-        "args": [
-          "--disable-site-isolation-trials"
-        ],
-        "name": "not_site_per_process_browser_tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "shards": 10
-        },
-        "test": "browser_tests"
-      },
-      {
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/filters/mash.browser_tests.filter b/testing/buildbot/filters/mash.browser_tests.filter
index a8b2d01a..8c7cb6fd 100644
--- a/testing/buildbot/filters/mash.browser_tests.filter
+++ b/testing/buildbot/filters/mash.browser_tests.filter
@@ -47,6 +47,7 @@
 # Direct access to ash window frames, tablet mode, overview mode, etc.
 -HomeLauncherBrowserNonClientFrameViewAshTest.*
 -HostedAppNonClientFrameViewAshTest.*
+-NonHomeLauncherBrowserNonClientFrameViewAshTest.*
 
 # Fix immersive fullscreen mode in mash. https://crbug.com/844748.
 -ImmersiveModeBrowserViewTest.TestCaptionButtonsReceiveEventsInAppImmersiveMode*
diff --git a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
index 05f668b5..5dd0fb3d 100644
--- a/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
+++ b/testing/buildbot/filters/mojo.fyi.network_browser_tests.filter
@@ -263,6 +263,11 @@
 # about an origin.
 -ReportingBrowserTest.TestReportingHeadersProcessed
 
+# Add magic x-frame-options headers to web store requests
+# https://crbug.com/852877
+-ExtensionWebstorePrivateApiTest.FrameErrorPageBlocked
+-ExtensionWebstorePrivateApiTest.FrameWebstorePageBlocked
+
 # NOTE: if adding an exclusion for an existing failure (e.g. additional test for
 # feature X that is already not working), please add it beside the existing
 # failures. Otherwise please reach out to network-service-dev@.
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 1b591a26..5d87eda 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -918,10 +918,6 @@
       'CrWinAsan',
       'CrWinAsan(dll)',
       'CrWinAsanCov',
-      'CrWinClangLLD',
-      'CrWinClangLLD64',
-      'CrWinClngLLD64dbg',
-      'CrWinClngLLDdbg',
       'ToTWin',
       'ToTWin(dbg)',
       'ToTWin(dll)',
@@ -952,30 +948,6 @@
       'Linux MSan Tests',  # https://crbug.com/831676
     ],
   },
-  'not_site_per_process_browser_tests': {
-    'remove_from': [
-      # chromium.fyi
-      'Site Isolation Android',
-      # chromium.linux
-      'Linux Tests (dbg)(1)(32)',
-      # chromium.memory
-      'Linux ASan LSan Tests (1)',  # No capacity, https://crbug.com/852442
-      'Linux TSan Tests',  # No capacity, https://crbug.com/852442
-    ],
-    'modifications': {
-      'Linux Tests (dbg)(1)': {
-        'swarming': {
-          'shards': 10,
-        },
-      },
-      # client.v8.chromium
-      'Linux - Future (dbg)': {
-        'swarming': {
-          'shards': 10,
-        },
-      },
-    },
-  },
   'site_per_process_components_browsertests': {
     'remove_from': [
       # chromium.linux
@@ -1144,6 +1116,13 @@
       'Win7 FYI Debug (AMD)',
     ],
   },
+  'telemetry_unittests': {
+    'modifications': {
+      'Win10 Tests x64 (dbg)': {
+        'experiment_percentage': 100,  # crbug.com/870673
+      }
+    }
+  },
   'telemetry_perf_unittests': {
     'modifications': {
       # chromium.android
@@ -1438,18 +1417,7 @@
       'Win10 Tests x64',
     ],
   },
-  'vr_browser_tests': {
-    'remove_from': [
-      # chromium.gpu.fyi
-      # TODO(kbr): remove the following two exceptions after switching
-      # to the new generate_buildbot_json script.
-      'Win10 FYI Exp Release (Intel HD 630)',
-      'Win7 FYI Release (AMD)',
-      # This exception probably needs to stay due to lack of capacity
-      # on the Win AMD bots.
-      'Win7 FYI Debug (AMD)',
-    ],
-  },
+
   'vr_pixeltests': {
     'remove_from': [
       # chromium.fyi
@@ -1674,7 +1642,7 @@
         'swarming': {
           'dimension_sets': [
             {
-              'gpu': '8086:0a2e',
+              'gpu': 'none',
               'os': 'Mac-10.12.6',
             },
           ],
@@ -1685,7 +1653,7 @@
         # TODO(crbug.com/853356): Switch this to 10.13.
         'use_multi_dimension_trigger_script': True,
         'alternate_swarming_dimensions': [{
-          'gpu': '8086:0a2e',
+          'gpu': 'none',
           'os': 'Mac-10.12.6',
         }],
 
@@ -1694,7 +1662,7 @@
         'swarming': {
           'dimension_sets': [
             {
-              'gpu': '8086:0a2e',
+              'gpu': 'none',
               'os': 'Mac-10.13',
             },
           ],
@@ -1840,4 +1808,12 @@
       },
     },
   },
+  'xr_browser_tests': {
+    'remove_from': [
+      # chromium.gpu.fyi
+      # This exception probably needs to stay due to lack of capacity
+      # on the Win AMD bots.
+      'Win7 FYI Debug (AMD)',
+    ],
+  },
 }
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index b1002d56..f86561f 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -333,10 +333,22 @@
   },
 
   'chromeos_gtests': {
+    'aura_unittests': {
+      'args': [
+        '--ozone-platform=headless',
+      ],
+    },
     'base_unittests': {},
     'cacheinvalidation_unittests': {},
     'capture_unittests': {},
     'cc_unittests': {},
+    'chromeos_unittests': {
+      'args': [
+        # TODO(crbug.com/865693): Don't stub out dbus clients.
+        '--dbus-stub',
+        '--test-launcher-filter-file=../../testing/buildbot/filters/chromeos.chromeos_unittests.filter',
+      ],
+    },
     'cros_vm_sanity_test': {},
     'crypto_unittests': {},
     'display_unittests': {},
@@ -351,6 +363,11 @@
     },
     'midi_unittests': {},
     'mojo_unittests': {},
+    'ozone_gl_unittests': {
+      'args': [
+        '--ozone-platform=headless',
+      ],
+    },
     'ozone_unittests': {},
     'pdf_unittests': {},
     'printing_unittests': {},
@@ -360,11 +377,6 @@
   },
 
   'chromeos_gtests_experimental': {
-    'aura_unittests': {
-      'args': [
-        '--ozone-platform=headless',
-      ],
-    },
     'base_unittests': {},
     'chromeos_unittests': {
       'args': [
@@ -392,11 +404,6 @@
         'shards': 3,
       },
     },
-    'ozone_gl_unittests': {
-      'args': [
-        '--ozone-platform=headless',
-      ],
-    },
     'services_unittests': {
       'args': [
         '--vpython-dir=../../vpython_dir_linux_amd64',
@@ -423,12 +430,13 @@
         '--remote=127.0.0.1',
         '--remote-ssh-port=9222',
         '--xvfb',
+        '--skip=core.perf_benchmark_unittest.PerfBenchmarkTest.testVariationArgs',
         '--skip=measurements.clock_domain_test.ClockDomainTest.testTelemetryUsesChromeClockDomain',
       ],
       'swarming': {
         'hard_timeout': 1200,
-        'idempotent': False,
-        'shards': 12,
+        'idempotent': False,  # https://crbug.com/549140
+        'shards': 6,
       },
     },
     'telemetry_unittests': {
@@ -442,11 +450,12 @@
         '--skip=telemetry.core.tracing_controller_unittest.TracingControllerTest.testBattOrTracing',
         # Always fails.
         '--skip=telemetry.internal.app.android_app_unittest.AndroidAppTest.testWebView',
+        '--skip=telemetry.internal.backends.browser_backend_unittest.BrowserBackendIntegrationTest.testSmokeIsBrowserRunningReturnFalse',
       ],
       'swarming': {
         'hard_timeout': 1200,
-        'idempotent': False,
-        'shards': 6,
+        'idempotent': False,  # https://crbug.com/549140
+        'shards': 12,
       },
     },
   },
@@ -460,7 +469,7 @@
       ],
       'swarming': {
         'hard_timeout': 960,
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 12,
       },
     },
@@ -471,7 +480,7 @@
         '--jobs=1',
       ],
       'swarming': {
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 4,
       },
     },
@@ -813,15 +822,6 @@
     'remoting_unittests': {},
     'services_unittests': {},
 
-    'not_site_per_process_browser_tests': {
-      'args': [
-        '--disable-site-isolation-trials'
-      ],
-      'swarming': {
-        'shards': 10,
-      },
-      'test': 'browser_tests',
-    },
     'site_per_process_content_browsertests': {
       'args': [
         '--site-per-process'
@@ -844,7 +844,7 @@
     'devtools_eslint': {},
     'telemetry_gpu_unittests': {
       'swarming': {
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
       },
     },
     'telemetry_perf_unittests': {
@@ -853,7 +853,7 @@
       ],
       'swarming': {
         'hard_timeout': 960,
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 12,
       },
     },
@@ -862,7 +862,7 @@
         '--jobs=1',
       ],
       'swarming': {
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 4,
       },
     },
@@ -892,7 +892,7 @@
     'metrics_python_tests': {},
     'telemetry_gpu_unittests': {
       'swarming': {
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
       },
     },
     'telemetry_unittests': {
@@ -900,7 +900,7 @@
         '--jobs=1',
       ],
       'swarming': {
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 4,
       },
     },
@@ -1240,7 +1240,7 @@
   },
 
   'gpu_default_and_optional_win_specific_gtests': {
-    'vr_browser_tests': {
+    'xr_browser_tests': {
       'args': [
       '--enable-gpu',
         '--test-launcher-bot-mode',
@@ -1635,7 +1635,7 @@
       ],
       'swarming': {
         'hard_timeout': 960,
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 12,
       },
     },
@@ -1647,7 +1647,7 @@
       ],
       'swarming': {
         'hard_timeout': 960,
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 12,
       },
     },
@@ -1657,13 +1657,13 @@
         '--extra-browser-args=--enable-features=VizDisplayCompositor',
       ],
       'swarming': {
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 4,
       },
      },
      'telemetry_unittests': {
        'swarming': {
-         'idempotent': False,
+         'idempotent': False,  # https://crbug.com/549140
          'shards': 4,
        },
      },
@@ -1944,15 +1944,6 @@
   },
 
   'site_isolation_chromium_gtests': {
-    'not_site_per_process_browser_tests': {
-      'args': [
-        '--disable-site-isolation-trials'
-      ],
-      'swarming': {
-        'shards': 10,
-      },
-      'test': 'browser_tests',
-    },
     'site_per_process_content_browsertests': {
       'args': [
         '--site-per-process'
@@ -2023,8 +2014,8 @@
       'args': [
         '--enable-surface-synchronization',
       ],
-      'swarming': {
-        'shards': 2,
+      'android_swarming': {
+        'shards': 9,
       },
       'test': 'content_browsertests',
     },
@@ -2057,7 +2048,7 @@
     'telemetry_perf_unittests': {
       'swarming': {
         'hard_timeout': 960,
-        'idempotent': False,
+        'idempotent': False,  # https://crbug.com/549140
         'shards': 12,
       },
     },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 91936841..b366721 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -553,26 +553,6 @@
           ],
         },
       },
-      'CrWinClangLLD': {
-        'test_suites': {
-          'gtest_tests': 'chromium_win_gtests',
-        },
-      },
-      'CrWinClangLLD64': {
-        'test_suites': {
-          'gtest_tests': 'chromium_win_gtests',
-        },
-      },
-      'CrWinClngLLD64dbg': {
-        'test_suites': {
-          'gtest_tests': 'chromium_win_gtests',
-        },
-      },
-      'CrWinClngLLDdbg': {
-        'test_suites': {
-          'gtest_tests': 'chromium_win_gtests',
-        },
-      },
       'ToTAndroid': {
         'additional_compile_targets': [
           'all',
@@ -1478,7 +1458,7 @@
           'dimension_sets': [
             {
               'gpu': '8086:0a2e',
-              'os': 'Mac-10.13.5',
+              'os': 'Mac-10.13.6',
               'pool': 'Chrome-GPU',
             },
           ],
@@ -3000,6 +2980,12 @@
           'gtest_tests': 'chromium_mac_gtests',
         },
       },
+      'win-asan': {
+        # TODO(thakis): test_suites 'gtest_tests': 'chromium_win_gtests' instead
+        'additional_compile_targets': [
+          'base_unittests',
+        ],
+      },
     },
   },
   {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index ed4d737..a08dbab 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -410,7 +410,6 @@
         {
             "platforms": [
                 "linux",
-                "mac",
                 "windows"
             ],
             "experiments": [
@@ -430,7 +429,8 @@
         {
             "platforms": [
                 "android",
-                "chromeos"
+                "chromeos",
+                "mac"
             ],
             "experiments": [
                 {
@@ -555,6 +555,27 @@
             ]
         }
     ],
+    "AutofillUpstreamDisallowEloAndJcb": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "ios",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutofillUpstreamDisallowElo",
+                        "AutofillUpstreamDisallowJcb"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillUpstreamUpdatePromptExplanation": [
         {
             "platforms": [
@@ -876,6 +897,21 @@
             ]
         }
     ],
+    "CCTModule": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "CCTModule"
+                    ]
+                }
+            ]
+        }
+    ],
     "CSSExternalScanner": [
         {
             "platforms": [
@@ -1266,7 +1302,7 @@
             ],
             "experiments": [
                 {
-                    "name": "DefaultPassthroughCommandDecoder",
+                    "name": "Enabled",
                     "enable_features": [
                         "DefaultPassthroughCommandDecoder"
                     ]
@@ -2245,19 +2281,6 @@
             ],
             "experiments": [
                 {
-                    "//0": "This experiment is used for M69 release rollouts.",
-                    "//1": "The name change is required to update Canary, Dev",
-                    "//2": "and Beta Finch studies that previously used ",
-                    "//3": "NewTabPageAllBirthday_Enabled.",
-                    "name": "NewTabPageM69AllBirthday_Enabled",
-                    "enable_features": [
-                        "NewTabPageBackgrounds",
-                        "NewTabPageCustomLinks",
-                        "NewTabPageIcons",
-                        "NewTabPageUIMd"
-                    ]
-                },
-                {
                     "name": "NewTabPageM68AllBirthday_Enabled",
                     "enable_features": [
                         "NewTabPageBackgrounds",
@@ -2265,7 +2288,6 @@
                     ]
                 },
                 {
-                    "//0": "Deprecated.",
                     "name": "NewTabPageAllBirthday_Enabled",
                     "enable_features": [
                         "NewTabPageBackgrounds",
@@ -4692,6 +4714,25 @@
             ]
         }
     ],
+    "WebPaymentsJustInTimePaymentApp": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "WebPaymentsJustInTimePaymentApp"
+                    ]
+                }
+            ]
+        }
+    ],
     "WebRTC-ApmGainController2Limiter": [
         {
             "platforms": [
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
index 32a3b3a..093d260 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-features=LayoutNG
@@ -71,7 +71,7 @@
 crbug.com/591099 css3/flexbox/line-wrapping.html [ Failure ]
 crbug.com/591099 css3/flexbox/scrollbars-auto.html [ Failure ]
 crbug.com/714962 css3/masking/clip-path-reference-box-inline.html [ Failure ]
-crbug.com/591099 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure ]
+crbug.com/591099 editing/selection/continuations-with-move-caret-to-boundary.html [ Failure Pass ]
 crbug.com/591099 editing/selection/paint-hyphen.html [ Pass ]
 crbug.com/591099 external/wpt/2dcontext/drawing-images-to-the-canvas/drawimage_html_image_11.html [ Pass ]
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/failures.worker.html [ Timeout ]
@@ -88,7 +88,8 @@
 crbug.com/591099 external/wpt/WebCryptoAPI/generateKey/successes.worker.html [ Timeout ]
 crbug.com/591099 external/wpt/WebCryptoAPI/import_export/rsa_importKey.worker.html [ Timeout ]
 crbug.com/709227 external/wpt/WebCryptoAPI/import_export/symmetric_importKey.worker.html [ Failure ]
-crbug.com/591099 external/wpt/background-fetch/get.https.window.html [ Crash Pass ]
+crbug.com/591099 external/wpt/background-fetch/get-ids.https.window.html [ Crash Pass ]
+crbug.com/591099 external/wpt/background-fetch/get.https.window.html [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/floats/floats-line-wrap-shifted-001.html [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-001.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-empty-004.xht [ Pass ]
@@ -99,6 +100,7 @@
 crbug.com/591099 external/wpt/css/CSS2/normal-flow/block-in-inline-remove-006.xht [ Pass ]
 crbug.com/591099 external/wpt/css/CSS2/text/white-space-mixed-003.xht [ Pass ]
 crbug.com/591099 external/wpt/css/css-backgrounds/box-shadow-syntax-001.xht [ Failure ]
+crbug.com/591099 external/wpt/css/css-contain/contain-paint-001.html [ Pass ]
 crbug.com/714962 external/wpt/css/css-fonts/font-features-across-space-1.html [ Pass ]
 crbug.com/714962 external/wpt/css/css-fonts/font-features-across-space-3.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-position/position-sticky-writing-modes.html [ Failure ]
@@ -227,8 +229,8 @@
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-definite-sizes-002.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-definite-sizes-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure Pass ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Crash ]
-crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Crash ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-011.html [ Pass ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-writing-mode-012.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-1.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/emptyspan-4.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/ib-split/remove-from-split-inline-6.html [ Pass ]
@@ -276,7 +278,7 @@
 crbug.com/591099 external/wpt/fetch/cross-origin-resource-policy/fetch.any.html [ Timeout ]
 crbug.com/591099 external/wpt/fetch/http-cache/basic-auth-cache-test.html [ Timeout ]
 crbug.com/591099 external/wpt/fullscreen/api/document-exit-fullscreen-nested-in-iframe-manual.html [ Pass ]
-crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure Pass ]
+crbug.com/591099 external/wpt/geolocation-API/PositionOptions.https.html [ Failure ]
 crbug.com/591099 external/wpt/html-media-capture/capture_audio_cancel-manual.html [ Failure ]
 crbug.com/591099 external/wpt/html-media-capture/capture_image_cancel-manual.html [ Failure ]
 crbug.com/591099 external/wpt/html-media-capture/capture_video_cancel-manual.html [ Failure ]
@@ -409,7 +411,6 @@
 crbug.com/591099 fast/css-grid-layout/grid-self-baseline-horiz-04.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-self-baseline-horiz-05.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-self-baseline-vertical-lr-02.html [ Failure ]
-crbug.com/591099 fast/css-grid-layout/grid-self-baseline-vertical-lr-03.html [ Crash ]
 crbug.com/591099 fast/css-grid-layout/grid-self-baseline-vertical-lr-04.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/grid-self-baseline-vertical-lr-05.html [ Failure ]
 crbug.com/591099 fast/css-grid-layout/maximize-tracks-definite-indefinite-width.html [ Failure ]
@@ -420,12 +421,11 @@
 crbug.com/807708 fast/css-intrinsic-dimensions/width-avoid-floats.html [ Failure ]
 crbug.com/591099 fast/css/absolute-inline-alignment-2.html [ Pass ]
 crbug.com/591099 fast/css/case-transform.html [ Failure ]
-crbug.com/591099 fast/css/focus-ring-continuations.html [ Failure ]
-crbug.com/714962 fast/css/focus-ring-recursive-continuations.html [ Failure ]
-crbug.com/714962 fast/css/focus-ring-recursive-inlines.html [ Failure ]
+crbug.com/835484 fast/css/focus-ring-continuations.html [ Failure ]
+crbug.com/835484 fast/css/focus-ring-recursive-continuations.html [ Failure ]
+crbug.com/835484 fast/css/focus-ring-recursive-inlines.html [ Failure ]
 crbug.com/591099 fast/css/getComputedStyle/computed-style-percentage-top-with-position-inline.html [ Failure ]
-crbug.com/591099 fast/css/outline-narrowLine.html [ Failure ]
-crbug.com/591099 fast/css/transform-inline-style-remove.html [ Failure ]
+crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ]
 crbug.com/591099 fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ]
 crbug.com/591099 fast/dom/nodesFromRect/nodesFromRect-basic.html [ Failure ]
 crbug.com/591099 fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
@@ -433,13 +433,13 @@
 crbug.com/591099 fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass ]
 crbug.com/591099 fast/forms/text-control-intrinsic-widths.html [ Pass Timeout ]
 crbug.com/591099 fast/inline-block/vertical-align-top-and-bottom-2.html [ Failure ]
-crbug.com/714962 fast/inline/continuation-outlines-with-layers-2.html [ Failure ]
-crbug.com/591099 fast/inline/continuation-outlines-with-layers.html [ Failure ]
-crbug.com/591099 fast/inline/continuation-outlines.html [ Failure ]
-crbug.com/591099 fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ]
-crbug.com/591099 fast/inline/nested-text-descendants.html [ Failure ]
-crbug.com/591099 fast/inline/outline-continuations.html [ Failure ]
-crbug.com/714962 fast/inline/outline-offset.html [ Failure ]
+crbug.com/835484 fast/inline/continuation-outlines-with-layers-2.html [ Failure ]
+crbug.com/835484 fast/inline/continuation-outlines-with-layers.html [ Failure ]
+crbug.com/835484 fast/inline/continuation-outlines.html [ Failure ]
+crbug.com/835484 fast/inline/inline-focus-ring-under-absolute-enclosing-relative-div.html [ Failure ]
+crbug.com/835484 fast/inline/nested-text-descendants.html [ Failure ]
+crbug.com/835484 fast/inline/outline-continuations.html [ Failure ]
+crbug.com/835484 fast/inline/outline-offset.html [ Failure ]
 crbug.com/591099 fast/overflow/overflow-update-transform.html [ Failure ]
 crbug.com/591099 fast/overflow/recompute-overflow-of-layout-root-container.html [ Failure ]
 crbug.com/591099 fast/replaced/table-replaced-element.html [ Failure ]
@@ -454,8 +454,8 @@
 crbug.com/591099 fast/table/dynamic-descendant-percentage-height.html [ Failure ]
 crbug.com/591099 fast/table/empty-table-percent-height.html [ Failure ]
 crbug.com/591099 fast/table/height-percent-test-vertical.html [ Failure ]
-crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure ]
-crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure ]
+crbug.com/591099 fast/table/percent-height-overflow-auto-content-in-cell.html [ Failure Pass ]
+crbug.com/591099 fast/table/percent-height-overflow-scroll-content-in-cell.html [ Failure Pass ]
 crbug.com/591099 fast/table/percent-height-replaced-content-in-cell.html [ Failure ]
 crbug.com/858998 fast/table/table-continuation-outline-paint-crash.html [ Failure ]
 crbug.com/591099 fast/table/table-display-types-vertical.html [ Failure ]
@@ -465,7 +465,6 @@
 crbug.com/591099 fast/text/ellipsis-in-relative-inline-right.html [ Failure ]
 crbug.com/591099 fast/text/ellipsis-in-relative-inline.html [ Failure ]
 crbug.com/714962 fast/text/emoticons.html [ Failure ]
-crbug.com/591099 fast/text/hide-atomic-inlines-after-ellipsis.html [ Failure ]
 crbug.com/796943 fast/text/international/shape-across-elements-simple.html [ Pass ]
 crbug.com/591099 fast/text/selection/emphasis.html [ Failure ]
 crbug.com/591099 fast/text/unicode-fallback-font.html [ Failure ]
@@ -494,22 +493,22 @@
 crbug.com/591099 http/tests/devtools/tracing/timeline-paint/timeline-paint-with-layout-invalidations.js [ Failure ]
 crbug.com/591099 http/tests/devtools/tracing/timeline-paint/timeline-paint-with-style-recalc-invalidations.js [ Failure ]
 crbug.com/591099 http/tests/images/restyle-decode-error.html [ Failure ]
-crbug.com/591099 http/tests/local/blob/send-sliced-data-blob.html [ Crash Pass ]
 crbug.com/591099 http/tests/local/fileapi/select-dragged-file-input.html [ Skip ]
 crbug.com/591099 http/tests/misc/object-embedding-svg-delayed-size-negotiation.xhtml [ Failure ]
 crbug.com/591099 http/tests/preload/dynamic_remove_preload_href.html [ Failure Pass ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-appcache.https.html [ Crash Failure ]
 crbug.com/591099 http/tests/security/cors-rfc1918/addressspace-document-csp-appcache.https.html [ Crash Failure Pass ]
 crbug.com/591099 http/tests/security/setDomainRelaxationForbiddenForURLScheme.html [ Crash ]
-crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Pass ]
+crbug.com/591099 idle-callback/test-runner-run-idle-tasks.html [ Crash Pass Timeout ]
 crbug.com/714962 images/color-profile-background-clip-text.html [ Failure ]
 crbug.com/591099 images/color-profile-image-filter-all.html [ Failure ]
 crbug.com/714962 inspector-protocol/css/css-get-platform-fonts.js [ Failure ]
+crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-pseudo-element.js [ Failure ]
 crbug.com/714962 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot-viewport.js [ Failure ]
 crbug.com/591099 inspector-protocol/dom-snapshot/dom-snapshot-getSnapshot.js [ Failure ]
 crbug.com/714962 inspector-protocol/layout-fonts/languages-emoji-rare-glyphs.js [ Failure ]
 crbug.com/591099 inspector-protocol/timeline/page-frames.js [ Failure Pass ]
-crbug.com/591099 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ]
+crbug.com/835484 paint/inline/focus-ring-under-absolute-with-relative-continuation.html [ Failure ]
 crbug.com/591099 paint/invalidation/background/background-misaligned.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/control-clip.html [ Failure ]
 crbug.com/591099 paint/invalidation/clip/outline-clip-change.html [ Failure ]
@@ -527,7 +526,7 @@
 crbug.com/591099 paint/invalidation/flexbox/repaint-on-margin-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ]
 crbug.com/591099 paint/invalidation/float-new-in-block.html [ Failure ]
-crbug.com/591099 paint/invalidation/forms/slider-thumb-float.html [ Failure ]
+crbug.com/835484 paint/invalidation/forms/slider-thumb-float.html [ Failure ]
 crbug.com/591099 paint/invalidation/line-flow-with-floats-1.html [ Failure ]
 crbug.com/591099 paint/invalidation/line-flow-with-floats-10.html [ Failure ]
 crbug.com/591099 paint/invalidation/line-flow-with-floats-3.html [ Failure ]
@@ -538,18 +537,18 @@
 crbug.com/591099 paint/invalidation/line-flow-with-floats-9.html [ Failure ]
 crbug.com/824918 paint/invalidation/multicol/multicol-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-continuations.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-layers.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/inline-focus.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/inline-outline-repaint-2.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/outline-change-continuations.html [ Failure ]
-crbug.com/591099 paint/invalidation/outline/outline-continuations.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/focus-continuations.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/focus-enable-continuations.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/focus-layers.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/focus-ring-on-continuation-move.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/focus-ring-on-inline-continuation-move.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/inline-focus.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/inline-outline-repaint-2.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/outline-change-continuations.html [ Failure ]
+crbug.com/835484 paint/invalidation/outline/outline-continuations.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/align-items-overflow-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/align-self-overflow-change.html [ Failure ]
-crbug.com/591099 paint/invalidation/overflow/inline-box-overflow-repaint.html [ Failure ]
+crbug.com/835484 paint/invalidation/overflow/inline-box-overflow-repaint.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/justify-items-overflow-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/overflow/justify-self-overflow-change.html [ Failure ]
 crbug.com/591099 paint/invalidation/position/intermediate-layout-position.html [ Failure ]
@@ -580,9 +579,9 @@
 crbug.com/591099 printing/iframe-svg-in-object-print.html [ Failure ]
 crbug.com/591099 scrollbars/auto-scrollbar-fit-content.html [ Failure ]
 crbug.com/591099 storage/indexeddb/cursor-continue-validity.html [ Pass Timeout ]
-crbug.com/591099 storage/indexeddb/index-cursor.html [ Timeout ]
-crbug.com/591099 storage/indexeddb/mozilla/indexes.html [ Timeout ]
-crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Timeout ]
+crbug.com/591099 storage/indexeddb/index-cursor.html [ Pass Timeout ]
+crbug.com/591099 storage/indexeddb/mozilla/indexes.html [ Pass Timeout ]
+crbug.com/591099 storage/indexeddb/mozilla/test_objectStore_openKeyCursor.html [ Pass Timeout ]
 crbug.com/591099 storage/indexeddb/objectstore-cursor.html [ Pass ]
 crbug.com/591099 storage/indexeddb/objectstore-keycursor.html [ Pass Timeout ]
 crbug.com/591099 svg/custom/object-sizing-no-width-height.xhtml [ Failure ]
@@ -616,7 +615,7 @@
 crbug.com/591099 virtual/gpu/fast/canvas/canvas-blending-gradient-over-pattern.html [ Pass Timeout ]
 crbug.com/591099 virtual/layout_ng/ [ Skip ]
 crbug.com/824918 virtual/layout_ng_experimental/ [ Skip ]
-crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass Timeout ]
+crbug.com/591099 virtual/mojo-blob-urls/external/wpt/FileAPI/url/sandboxed-iframe.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/mainthread-touchpad-fling-latching.html [ Pass ]
 crbug.com/591099 virtual/mouseevent_fractional/fast/events/wheel/wheel-scroll-latching-on-scrollbar.html [ Pass ]
@@ -632,8 +631,10 @@
 crbug.com/591099 virtual/reporting-api/external/wpt/content-security-policy/reporting-api/reporting-api-doesnt-send-reports-without-violation.https.sub.html [ Pass ]
 crbug.com/591099 virtual/scroll_customization/ [ Skip ]
 crbug.com/591099 virtual/scroll_customization/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
+crbug.com/591099 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-simple-success.html [ Pass ]
 crbug.com/591099 virtual/spv2/paint/invalidation/box/margin.html [ Failure Pass ]
 crbug.com/591099 virtual/stable/ [ Skip ]
 crbug.com/591099 virtual/threaded/ [ Skip ]
 crbug.com/591099 virtual/user-activation-v2/fast/events/mouse-cursor.html [ Failure ]
 crbug.com/591099 virtual/user-activation-v2/fast/events/touch/compositor-touch-hit-rects.html [ Failure ]
+crbug.com/591099 virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Pass ]
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
index e31cbc0..1ae914b 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-blink-gen-property-trees
@@ -48,7 +48,6 @@
 Bug(none) netinfo/ [ Skip ]
 Bug(none) nfc/ [ Skip ]
 Bug(none) payments/ [ Skip ]
-Bug(none) performance/ [ Skip ]
 Bug(none) permissionclient/ [ Skip ]
 Bug(none) platform/ [ Skip ]
 Bug(none) plugins/ [ Skip ]
diff --git a/third_party/WebKit/LayoutTests/NeverFixTests b/third_party/WebKit/LayoutTests/NeverFixTests
index a97660d7..683254e 100644
--- a/third_party/WebKit/LayoutTests/NeverFixTests
+++ b/third_party/WebKit/LayoutTests/NeverFixTests
@@ -986,6 +986,10 @@
 external/wpt/quirks/active-and-hover-manual.html [ WontFix ]
 external/wpt/screen-orientation/page-visibility-manual.html [ WontFix ]
 external/wpt/selection/dir-manual.html [ WontFix ]
+external/wpt/speech-api/SpeechRecognition-abort-manual.https.html [ WontFix ]
+external/wpt/speech-api/SpeechRecognition-onerror-manual.https.html [ WontFix ]
+external/wpt/speech-api/SpeechRecognition-onresult-manual.https.html [ WontFix ]
+external/wpt/speech-api/SpeechRecognition-stop-manual.https.html [ WontFix ]
 external/wpt/uievents/interface/click-event-manual.htm [ WontFix ]
 external/wpt/uievents/interface/dblclick-event-manual.htm [ WontFix ]
 external/wpt/uievents/keyboard/key-101en-us-manual.html [ WontFix ]
diff --git a/third_party/WebKit/LayoutTests/SlowTests b/third_party/WebKit/LayoutTests/SlowTests
index 15b2d5a..245376f 100644
--- a/third_party/WebKit/LayoutTests/SlowTests
+++ b/third_party/WebKit/LayoutTests/SlowTests
@@ -120,6 +120,8 @@
 # These tests are intentionally SLOW because of throttled loading.
 crbug.com/73609 http/tests/media/video-play-stall.html [ Slow ]
 crbug.com/73609 http/tests/media/video-preload-metadata.html [ Slow ]
+crbug.com/869829 http/tests/media/video-cancel-load.html [ Slow ]
+crbug.com/870259 http/tests/media/video-throttled-load-metadata.html [ Slow ]
 
 # Many of the virtual animations tests are slow.
 crbug.com/243871 virtual/threaded/fast/scroll-behavior/ [ Slow ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index 19526a3b..4d07ae5 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -1685,7 +1685,6 @@
 
 # Failing tests in dictionary order.
 crbug.com/867834 virtual/outofblink-cors/external/wpt/fetch/api/cors/sandboxed-iframe.html [ Failure ]
-crbug.com/736308 virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https.html [ Failure ]
 crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/access-control-and-redirects-async.htm [ Failure ]
 crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/access-control-sandboxed-iframe-denied-without-wildcard.htm [ Failure ]
 crbug.com/736308 virtual/outofblink-cors/external/wpt/xhr/access-control-sandboxed-iframe-denied.htm [ Failure ]
@@ -1701,7 +1700,6 @@
 crbug.com/736308 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-subdomains.html [ Failure ]
 crbug.com/736308 virtual/outofblink-cors/http/tests/xmlhttprequest/origin-whitelisting-ip-addresses.html [ Failure ]
 crbug.com/867834 virtual/outofblink-cors-ns/external/wpt/fetch/api/cors/sandboxed-iframe.html [ Failure ]
-crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/navigation-timing.https.html [ Failure ]
 crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-and-redirects-async.htm [ Failure ]
 crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-sandboxed-iframe-denied-without-wildcard.htm [ Failure ]
 crbug.com/736308 virtual/outofblink-cors-ns/external/wpt/xhr/access-control-sandboxed-iframe-denied.htm [ Failure ]
@@ -1899,6 +1897,7 @@
 
 # Web Components related tests (Shadow DOM, Custom Elements) failures.
 crbug.com/392771 external/wpt/shadow-dom/untriaged/styles/test-003.html [ Failure ]
+crbug.com/869308 shadow-dom/imperative-api.html [ Failure ]
 
 crbug.com/552494 virtual/prefer_compositing_to_lcd_text/scrollbars/overflow-scrollbar-combinations.html [ Pass Failure ]
 
@@ -2702,9 +2701,9 @@
 crbug.com/870526 external/wpt/payment-handler/idlharness.https.any.serviceworker.html [ Skip ]
 
 # ====== New tests from wpt-importer added here ======
-crbug.com/626703 external/wpt/css/css-contain/contain-paint-021.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-contain/contain-paint-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-contain/contain-layout-016.html [ Failure ]
+crbug.com/868102 external/wpt/css/css-contain/contain-paint-021.html [ Failure ]
+crbug.com/870811 external/wpt/css/css-contain/contain-paint-001.html [ Failure ]
+crbug.com/870157 external/wpt/css/css-contain/contain-layout-016.html [ Failure ]
 crbug.com/626703 external/wpt/clear-site-data/executionContexts.sub.html [ Timeout ]
 crbug.com/626703 [ Win10 ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Failure ]
 crbug.com/626703 [ Linux Mac Win7 ] external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-004.html [ Failure ]
@@ -2816,14 +2815,12 @@
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-021.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-circle-050.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-050.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-grid/alignment/grid-gutters-009.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-012.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-024.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-ellipse-047.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-010.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-011.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-border-box-border-radius-006.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-grid/alignment/grid-gutters-010.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-inset-023.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-padding-box-border-radius-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/shapes1/shape-outside-polygon-023.html [ Failure ]
@@ -3855,6 +3852,8 @@
 crbug.com/716320 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.html [ Timeout ]
 crbug.com/716320 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-sharedworker-failure.html [ Timeout ]
 
+crbug.com/798572 virtual/sharedarraybuffer/external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-simple-success.html [ Timeout ]
+
 crbug.com/831509 external/wpt/service-workers/service-worker/skip-waiting-installed.https.html [ Failure Pass ]
 crbug.com/831509 virtual/navigation-mojo-response/external/wpt/service-workers/service-worker/skip-waiting-installed.https.html [ Failure Pass ]
 crbug.com/831509 virtual/service-worker-servicification/external/wpt/service-workers/service-worker/skip-waiting-installed.https.html [ Failure Pass ]
@@ -4284,8 +4283,6 @@
 crbug.com/779087 external/wpt/feature-policy/autoplay-default-feature-policy.https.sub.html [ Skip ]
 crbug.com/779087 external/wpt/feature-policy/autoplay-disabled-by-feature-policy.https.sub.html [ Skip ]
 
-crbug.com/798572 virtual/enable_wasm/external/wpt/wasm/wasm_service_worker_test.https.html [ Failure ]
-
 # Does not work on Mac
 crbug.com/793771 [ Mac ] media/controls/modern/scrubbing.html [ Skip ]
 crbug.com/793771 [ Mac ] virtual/new-remote-playback-pipeline/media/controls/modern/scrubbing.html [ Skip ]
@@ -4511,7 +4508,7 @@
 crbug.com/831993 [ Linux ] virtual/gpu-rasterization/images/cross-fade-overflow-position.html [ Pass Timeout ]
 
 # Sheriff 2018-04-13
-crbug.com/832842 [ Win7 ] virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Failure ]
+crbug.com/832842 [ Win7 Linux ] virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCDTMFSender-ontonechange.https.html [ Failure ]
 crbug.com/833655 [ Linux ] media/controls/closed-captions-dynamic-update.html [ Skip ]
 crbug.com/833655 [ Linux ] virtual/new-remote-playback-pipeline/media/controls/closed-captions-dynamic-update.html [ Skip ]
 crbug.com/833655 [ Linux ] virtual/video-surface-layer/media/controls/closed-captions-dynamic-update.html [ Skip ]
@@ -4623,6 +4620,10 @@
 crbug.com/853360 [ Mac ] fast/forms/calendar-picker/month-picker-appearance.html [ Failure ]
 crbug.com/853360 [ Mac ] fast/forms/select/menulist-appearance-rtl.html [ Failure ]
 
+# Origin Policy: Skip tests that rely on --feature-enabled=OriginPolicy, so
+#   they can be run via virtual/origin-policy instead.
+crbug.com/751996 external/wpt/origin-policy [ Skip ]
+
 # Sheriff 2018-06-18
 crbug.com/853852 [ Win7 Linux ] virtual/threaded/external/wpt/feature-policy/experimental-features/vertical-scroll-wheel-block-manual.tentative.html [ Pass Timeout ]
 crbug.com/853852 [ Linux ] virtual/video-surface-layer/external/wpt/feature-policy/experimental-features/vertical-scroll-touch-action-manual.tentative.html [ Skip ]
@@ -4836,8 +4837,17 @@
 
 # Sheriff 2018-08-01
 crbug.com/869773 [ Mac Linux ] http/tests/misc/window-dot-stop.html [ Pass Failure ]
-crbug.com/869829 [ Mac Release ] http/tests/media/video-cancel-load.html [ Pass Failure ]
 crbug.com/862806 [ Linux ] css3/filters/effect-drop-shadow-hw.html [ Pass Timeout ]
 
-# Sheriff 2018-08-02
-crbug.com/870259 [ Mac ] http/tests/media/video-throttled-load-metadata.html [ Pass Timeout ]
+# Sheriff 2018-08-06
+crbug.com/871139 [ Android ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow.html [ Failure ]
+crbug.com/871139 [ Android ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-out-slow.html [ Failure ]
+crbug.com/871139 [ Android ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen.html [ Failure ]
+crbug.com/869726 [ Mac ] virtual/mouseevent_fractional/fast/events/touch/touch-latched-scroll-node-removed.html [ Pass Failure ]
+
+crbug.com/871578 [ Mac ] external/wpt/xhr/timeout-multiple-fetches.html [ Failure Pass ]
+crbug.com/871578 [ Mac ] virtual/outofblink-cors/external/wpt/xhr/timeout-multiple-fetches.html [ Failure Pass ]
+crbug.com/871578 [ Mac ] virtual/outofblink-cors-ns/external/wpt/xhr/timeout-multiple-fetches.html [ Failure Pass ]
+
+# Only passes on bots with GPUs.
+crbug.com/871445 [ Mac ] http/tests/media/video-load-metadata-decode-error.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/VirtualTestSuites b/third_party/WebKit/LayoutTests/VirtualTestSuites
index 4bbc2c7..bf3ea3a1 100644
--- a/third_party/WebKit/LayoutTests/VirtualTestSuites
+++ b/third_party/WebKit/LayoutTests/VirtualTestSuites
@@ -712,5 +712,10 @@
     "prefix": "mojo-blob-urls",
     "base": "external/wpt/FileAPI/url",
     "args": ["--enable-features=MojoBlobURLs"]
+  },
+  {
+    "prefix": "origin-policy",
+    "base": "external/wpt/origin-policy",
+    "args": ["--enable-features=OriginPolicy"]
   }
 ]
diff --git a/third_party/WebKit/LayoutTests/animations/svg/svg-presentation-attribute-animation.html b/third_party/WebKit/LayoutTests/animations/svg/svg-presentation-attribute-animation.html
index 20915d6..2d33c12 100644
--- a/third_party/WebKit/LayoutTests/animations/svg/svg-presentation-attribute-animation.html
+++ b/third_party/WebKit/LayoutTests/animations/svg/svg-presentation-attribute-animation.html
@@ -17,7 +17,7 @@
   ['color', 'rgb(1, 2, 3)'],
   ['color-interpolation', 'linearRGB'],
   ['color-interpolation-filters', 'sRGB'],
-  ['color-rendering', 'optimizeSpeed'],
+  ['color-rendering', 'optimizespeed'],
   ['cursor', 'url("test://uri/"), auto'],
   ['dominant-baseline', 'middle'],
   ['fill', 'rgb(1, 2, 3)'],
@@ -44,7 +44,7 @@
   ['overflow', 'hidden'],
   ['paint-order', 'fill markers stroke'],
   ['pointer-events', 'all'],
-  ['shape-rendering', 'geometricPrecision'],
+  ['shape-rendering', 'geometricprecision'],
   ['stop-color', 'rgb(1, 2, 3)'],
   ['stop-opacity', '0.25'],
   ['stroke', 'rgb(1, 2, 3)'],
@@ -57,7 +57,7 @@
   ['stroke-width', '123px'],
   ['text-anchor', 'middle'],
   ['text-decoration', 'underline solid rgb(1, 2, 3)'],
-  ['text-rendering', 'geometricPrecision'],
+  ['text-rendering', 'geometricprecision'],
   ['vector-effect', 'non-scaling-stroke'],
   ['visibility', 'collapse'],
   ['word-spacing', '123px'],
diff --git a/third_party/WebKit/LayoutTests/editing/selection/continuations-with-move-caret-to-boundary.html b/third_party/WebKit/LayoutTests/editing/selection/continuations-with-move-caret-to-boundary.html
index bf66f0b..a4ce7cc 100644
--- a/third_party/WebKit/LayoutTests/editing/selection/continuations-with-move-caret-to-boundary.html
+++ b/third_party/WebKit/LayoutTests/editing/selection/continuations-with-move-caret-to-boundary.html
@@ -1,105 +1,46 @@
 <!DOCTYPE HTML>
+<script src="../../resources/ahem.js"></script>
 <script src="../../resources/testharness.js"></script>
 <script src="../../resources/testharnessreport.js"></script>
 <script src="../assert_selection.js"></script>
 <script>
-// Mac supports the 'moveCaretToBoundary' editing behavior.
-if (window.internals)
-    internals.settings.setEditingBehavior('mac');
+const isMac = navigator.platform.indexOf('Mac') === 0;
 
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
+function dragOverBlocks(selection, offsetTopToDestination) {
+  const document = selection.document;
+  const divlist = document.querySelectorAll('p');
+  const div0 = divlist[0];
+  const div1 = divlist[1];
+  eventSender.mouseMoveTo(document.offsetLeft + div0.offsetLeft,
+                          document.offsetTop + div0.offsetTop + 5);
+  eventSender.mouseDown();
+  eventSender.mouseMoveTo(document.offsetLeft + div1.offsetLeft + 40,
+                          document.offsetTop + div1.offsetTop
+                          + offsetTopToDestination);
+  eventSender.mouseUp();
+}
 
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop + 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CC|CCC</p></font>'),
-    'Continuations across a block when not hitting the margin');
+const kStyle = '<style>* { font: 20px Ahem; }</style>';
 
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
+selection_test(
+    [kStyle, '<p>AAAAA</p><p>BBBBB</p>'],
+    selection => dragOverBlocks(selection, -20),
+    [kStyle, '<p>^AA|AAA</p><p>BBBBB</p>'],
+    'Continuations across a block -20');
 
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<p>BBBBB</p><p id="secondP">|CCCCC</p></font>'),
-    'Continuation margin');
+selection_test(
+    [kStyle, '<p>AAAAA</p><p>BBBBB</p>'],
+    selection => dragOverBlocks(selection, -15),
+    [kStyle,
+    isMac
+    ? '<p>^AAAAA</p><p>|BBBBB</p>'
+    : '<p>^AAAAA</p><p>BB|BBB</p>'
+    ],
+    'Continuations across a block -15');
 
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">|CCCCC</p></font>'),
-    'Continuation margin across a block 1');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<p>BBBBB</p><div>BLOCK</div><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<p>BBBBB</p><div>BLOCK</div><p id="secondP">|CCCCC</p></font>'),
-    'Continuation margin across a block 2');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<div style="position: relative; margin-top: 50px;">BLOCK</div><p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<div style="position: relative; margin-top: 50px;">BLOCK</div><p>BBBBB</p><p id="secondP">|CCCCC</p></font>'),
-    'Continuation margin across a relative block 1');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<p>BBBBB</p><div style="position: relative; margin-top: 50px;">BLOCK</div><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<p>BBBBB</p><div style="position: relative; margin-top: 50px;">BLOCK</div><p id="secondP">|CCCCC</p></font>'),
-    'Continuation margin across a relative block 2');
+selection_test(
+    [kStyle, '<p>AAAAA</p><p>BBBBB</p>'],
+    selection => dragOverBlocks(selection, 5),
+    [kStyle,'<p>^AAAAA</p><p>BB|BBB</p>'],
+    'Continuations across a block 5');
 </script>
diff --git a/third_party/WebKit/LayoutTests/editing/selection/continuations-without-move-caret-to-boundary.html b/third_party/WebKit/LayoutTests/editing/selection/continuations-without-move-caret-to-boundary.html
deleted file mode 100644
index bb825de..0000000
--- a/third_party/WebKit/LayoutTests/editing/selection/continuations-without-move-caret-to-boundary.html
+++ /dev/null
@@ -1,105 +0,0 @@
-<!DOCTYPE HTML>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script src="../assert_selection.js"></script>
-<script>
-// Win does not support the 'moveCaretToBoundary' editing behavior.
-if (window.internals)
-    internals.settings.setEditingBehavior('win');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop + 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CC|CCC</p></font>'),
-    'Continuations across a block when not hitting the margin');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<p>BBBBB</p><p id="secondP">CC|CCC</p></font>'),
-    'Continuation margin');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<div>BLOCK</div><p>BBBBB</p><p id="secondP">CC|CCC</p></font>'),
-    'Continuation margin across a block 1');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<p>BBBBB</p><div>BLOCK</div><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<p>BBBBB</p><div>BLOCK</div><p id="secondP">CC|CCC</p></font>'),
-    'Continuation margin across a block 2');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<div style="position: relative; margin-top: 50px;">BLOCK</div><p>BBBBB</p><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<div style="position: relative; margin-top: 50px;">BLOCK</div><p>BBBBB</p><p id="secondP">CC|CCC</p></font>'),
-    'Continuation margin across a relative block 1');
-
-test(() =>
-    assert_selection(
-        '<font color="blue" id="font">|AAAAA<p>BBBBB</p><div style="position: relative; margin-top: 50px;">BLOCK</div><p id="secondP">CCCCC</p></font>',
-        selection => {
-            var document = selection.document;
-            var font = document.getElementById('font');
-            var secondP = document.getElementById('secondP');
-
-            eventSender.mouseMoveTo(document.offsetLeft + font.offsetLeft, document.offsetTop + font.offsetTop + 5);
-            eventSender.mouseDown();
-            eventSender.mouseMoveTo(document.offsetLeft + secondP.offsetLeft + 20, document.offsetTop + secondP.offsetTop - 5);
-            eventSender.mouseUp();
-        },
-        '<font color="blue" id="font">^AAAAA<p>BBBBB</p><div style="position: relative; margin-top: 50px;">BLOCK</div><p id="secondP">CC|CCC</p></font>'),
-    'Continuation margin across a relative block 2');
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
index b36e443..b77e245a 100644
--- a/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
+++ b/third_party/WebKit/LayoutTests/external/WPT_BASE_MANIFEST.json
@@ -125410,6 +125410,11 @@
      {}
     ]
    ],
+   "css/css-pseudo/idlharness-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "css/css-pseudo/interfaces-expected.txt": [
     [
      {}
@@ -140975,6 +140980,11 @@
      {}
     ]
    ],
+   "domparsing/interfaces.any.worker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "domxpath/001-expected.txt": [
     [
      {}
@@ -145085,6 +145095,21 @@
      {}
     ]
    ],
+   "hr-time/idlharness.any.sharedworker-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "hr-time/idlharness.any.worker-expected.txt": [
+    [
+     {}
+    ]
+   ],
+   "hr-time/idlharness.https.any.serviceworker-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "hr-time/resources/now_frame.html": [
     [
      {}
@@ -145110,6 +145135,11 @@
      {}
     ]
    ],
+   "html-media-capture/idlharness.window-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "html-media-capture/support/upload.txt": [
     [
      {}
@@ -159165,6 +159195,11 @@
      {}
     ]
    ],
+   "interfaces/html-media-capture.idl": [
+    [
+     {}
+    ]
+   ],
    "interfaces/html.idl": [
     [
      {}
@@ -159180,6 +159215,11 @@
      {}
     ]
    ],
+   "interfaces/intersection-observer.idl": [
+    [
+     {}
+    ]
+   ],
    "interfaces/keyboard-lock.idl": [
     [
      {}
@@ -159395,11 +159435,6 @@
      {}
     ]
    ],
-   "interfaces/touchevents.idl": [
-    [
-     {}
-    ]
-   ],
    "interfaces/uievents.idl": [
     [
      {}
@@ -159475,6 +159510,11 @@
      {}
     ]
    ],
+   "interfaces/webmidi.idl": [
+    [
+     {}
+    ]
+   ],
    "interfaces/webrtc-stats.idl": [
     [
      {}
@@ -159520,6 +159560,11 @@
      {}
     ]
    ],
+   "intersection-observer/idlharness.window-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "intersection-observer/observer-in-iframe.html": [
     [
      {}
@@ -171195,6 +171240,16 @@
      {}
     ]
    ],
+   "webmidi/META.yml": [
+    [
+     {}
+    ]
+   ],
+   "webmidi/idlharness.window-expected.txt": [
+    [
+     {}
+    ]
+   ],
    "webrtc-stats/META.yml": [
     [
      {}
@@ -192865,9 +192920,9 @@
      {}
     ]
    ],
-   "css/css-pseudo/interfaces.html": [
+   "css/css-pseudo/idlharness.html": [
     [
-     "/css/css-pseudo/interfaces.html",
+     "/css/css-pseudo/idlharness.html",
      {}
     ]
    ],
@@ -213371,9 +213426,21 @@
      {}
     ]
    ],
-   "hr-time/idlharness.html": [
+   "hr-time/idlharness.any.js": [
     [
-     "/hr-time/idlharness.html",
+     "/hr-time/idlharness.any.html",
+     {}
+    ],
+    [
+     "/hr-time/idlharness.any.sharedworker.html",
+     {}
+    ],
+    [
+     "/hr-time/idlharness.any.worker.html",
+     {}
+    ],
+    [
+     "/hr-time/idlharness.https.any.serviceworker.html",
      {}
     ]
    ],
@@ -213423,9 +213490,9 @@
      {}
     ]
    ],
-   "html-media-capture/idlharness.html": [
+   "html-media-capture/idlharness.window.js": [
     [
-     "/html-media-capture/idlharness.html",
+     "/html-media-capture/idlharness.window.html",
      {}
     ]
    ],
@@ -226131,6 +226198,12 @@
      {}
     ]
    ],
+   "intersection-observer/idlharness.window.js": [
+    [
+     "/intersection-observer/idlharness.window.html",
+     {}
+    ]
+   ],
    "intersection-observer/iframe-no-root.html": [
     [
      "/intersection-observer/iframe-no-root.html",
@@ -228649,6 +228722,12 @@
      {}
     ]
    ],
+   "navigation-timing/nav2_test_navigate_iframe.html": [
+    [
+     "/navigation-timing/nav2_test_navigate_iframe.html",
+     {}
+    ]
+   ],
    "navigation-timing/nav2_test_navigate_within_document.html": [
     [
      "/navigation-timing/nav2_test_navigate_within_document.html",
@@ -256263,6 +256342,12 @@
      {}
     ]
    ],
+   "webmidi/idlharness.window.js": [
+    [
+     "/webmidi/idlharness.window.html",
+     {}
+    ]
+   ],
    "webrtc-stats/idlharness.window.js": [
     [
      "/webrtc-stats/idlharness.window.html",
@@ -300781,7 +300866,7 @@
    "reftest"
   ],
   "css/css-conditional/idlharness-expected.txt": [
-   "0040a92bd91e0e8c33c8525579451b56b88bd925",
+   "d3f6718b9da3e7069b31aaf77b738e1281d92aa7",
    "support"
   ],
   "css/css-conditional/idlharness.html": [
@@ -301097,7 +301182,7 @@
    "support"
   ],
   "css/css-contain/reference/contain-paint-001-ref.html": [
-   "be57e942110661fd32f0342bbe2870e4e3280d86",
+   "d0436a070b9a3483ab3d054a040fd9f7e1536112",
    "support"
   ],
   "css/css-contain/reference/contain-paint-007-ref.html": [
@@ -318760,14 +318845,18 @@
    "829ee2c50f5b6198f9cc0b3ae01b208d20ed7702",
    "reftest"
   ],
+  "css/css-pseudo/idlharness-expected.txt": [
+   "333f33503c4802eadf75e6c5e0245619af9a9db0",
+   "support"
+  ],
+  "css/css-pseudo/idlharness.html": [
+   "69f7458b252b1f5df6471c303b3b770d3e6dcdec",
+   "testharness"
+  ],
   "css/css-pseudo/interfaces-expected.txt": [
    "adcef7d3f460c192fd96d528c5cd7924672d340b",
    "support"
   ],
-  "css/css-pseudo/interfaces.html": [
-   "9317f150deae389549c0626af8224ed3710ae554",
-   "testharness"
-  ],
   "css/css-pseudo/marker-and-other-pseudo-elements-ref.html": [
    "73ab862dcf3131ae7d7166ef06e52db0cd0eb7c7",
    "support"
@@ -332709,7 +332798,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/color-rendering.html": [
-   "3bef7a7daf59dba5b1c5d0a54fe5b22fbe8c7bb7",
+   "c1656bd907aa154b31f4acbf8cd706fd4e27ab6c",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/color.html": [
@@ -333365,7 +333454,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/shape-rendering.html": [
-   "fc8eb7dc50fb534c1f351a1b5336aff8979e87c2",
+   "19a2a13ea657c00e8a968e80601d77105da6984d",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/speak-expected.txt": [
@@ -333533,7 +333622,7 @@
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-rendering.html": [
-   "2e18286848b05dda619c9708d858d19b7dbcd8d2",
+   "7f3249ee54a41376995240d65f1ddcd06804a672",
    "testharness"
   ],
   "css/css-typed-om/the-stylepropertymap/properties/text-shadow.html": [
@@ -352437,9 +352526,13 @@
    "support"
   ],
   "domparsing/interfaces.any.js": [
-   "c839218d1a8dd146fa204f2d4d366bb0958770b9",
+   "83d6ea5fc8556e7ffcd9172dee993047ffc02a57",
    "testharness"
   ],
+  "domparsing/interfaces.any.worker-expected.txt": [
+   "cf87a8e134deb338c910811b1dbd027d06c4a098",
+   "support"
+  ],
   "domparsing/outerhtml-01.html": [
    "8c5c0ac91406ee6c8da4845b8ac10c7fec42a7d3",
    "testharness"
@@ -358532,10 +358625,22 @@
    "5c727eed4efd84b4b280b2584b7338217971a9e7",
    "testharness"
   ],
-  "hr-time/idlharness.html": [
-   "17353579d4224ac08fd90453fd065acee56d7621",
+  "hr-time/idlharness.any.js": [
+   "e4937f43e5fdd404a9086a959d62ab7f849953c7",
    "testharness"
   ],
+  "hr-time/idlharness.any.sharedworker-expected.txt": [
+   "20e1a5fc47db5a795912bc199156ba375f6150ed",
+   "support"
+  ],
+  "hr-time/idlharness.any.worker-expected.txt": [
+   "20e1a5fc47db5a795912bc199156ba375f6150ed",
+   "support"
+  ],
+  "hr-time/idlharness.https.any.serviceworker-expected.txt": [
+   "20e1a5fc47db5a795912bc199156ba375f6150ed",
+   "support"
+  ],
   "hr-time/monotonic-clock.any.js": [
    "4aef47650d5cbc750393c3ac9423dbff24a15917",
    "testharness"
@@ -358636,8 +358741,12 @@
    "d9842bff2995c045e4c5d2787325a46cfa5c9fff",
    "support"
   ],
-  "html-media-capture/idlharness.html": [
-   "d6f14981f18dda4e5720cf3e9bf4d4724746664d",
+  "html-media-capture/idlharness.window-expected.txt": [
+   "68c9ce8746f55bf8039e3890ac0859162f5d44e7",
+   "support"
+  ],
+  "html-media-capture/idlharness.window.js": [
+   "234b98dab1b2840408d4cb328089991e44931855",
    "testharness"
   ],
   "html-media-capture/support/upload.txt": [
@@ -362717,15 +362826,15 @@
    "testharness"
   ],
   "html/dom/interfaces.https_exclude=(Document_Window_HTML._)-expected.txt": [
-   "77a2c1e101b85492e037620440c75432cd4be793",
+   "4156970554ad10c2305da9868c41cfb98ebc0fc0",
    "support"
   ],
   "html/dom/interfaces.https_include=(Document_Window)-expected.txt": [
-   "00ad35653fcce64c5289d94a80cc833c4fc2f3c7",
+   "4156970554ad10c2305da9868c41cfb98ebc0fc0",
    "support"
   ],
   "html/dom/interfaces.https_include=HTML._-expected.txt": [
-   "df5c31403f52298d99cf18bc6cf0fecb3f2dc16d",
+   "4156970554ad10c2305da9868c41cfb98ebc0fc0",
    "support"
   ],
   "html/dom/interfaces.worker-expected.txt": [
@@ -362733,7 +362842,7 @@
    "support"
   ],
   "html/dom/interfaces.worker.js": [
-   "e0916d634075e22c3542de6729ea762ed4b8f8ed",
+   "353492634985819e7c3c5bb2553607a0c63f4b78",
    "testharness"
   ],
   "html/dom/new-harness.js": [
@@ -379161,7 +379270,7 @@
    "support"
   ],
   "interfaces/META.yml": [
-   "a3257f92e35aa53f9a2130ab2b3d5c6c42f5964f",
+   "991f7ff8f305a82ca70ba254cdbb019bbf1d00ce",
    "support"
   ],
   "interfaces/ResizeObserver.idl": [
@@ -379253,7 +379362,7 @@
    "support"
   ],
   "interfaces/css-conditional.idl": [
-   "0019e54201874e5d2a2b10c887e44b8c42199c32",
+   "f3357deaf2511c5d36ba92723461fb14b832574c",
    "support"
   ],
   "interfaces/css-counter-styles.idl": [
@@ -379337,7 +379446,7 @@
    "support"
   ],
   "interfaces/filter-effects.idl": [
-   "ac18d472517953807d548a7bc3b53f7fe777fb66",
+   "7854a8fdde207892c53f927e3f99bf44e9fc9c01",
    "support"
   ],
   "interfaces/fullscreen.idl": [
@@ -379369,7 +379478,11 @@
    "support"
   ],
   "interfaces/hr-time.idl": [
-   "db4f313176e4fdfb8efd78545079da42cbb0729b",
+   "565edd1574ed7165a00c23345f2ea584f07b7686",
+   "support"
+  ],
+  "interfaces/html-media-capture.idl": [
+   "712e1ef9d2e43a901b2b2fd6570c6bd33061fd88",
    "support"
   ],
   "interfaces/html.idl": [
@@ -379384,6 +379497,10 @@
    "5a76e3df1b2e66e36470781f407c8080f70fdddc",
    "support"
   ],
+  "interfaces/intersection-observer.idl": [
+   "dd985857e5ded5a80e782744bcdc408ad5bd4902",
+   "support"
+  ],
   "interfaces/keyboard-lock.idl": [
    "de86b3ca38839202b4b31e055cfb6e18591b7857",
    "support"
@@ -379556,10 +379673,6 @@
    "4e456ecce04a5f8fb19a7be5ae0d9e5bd69a1ec1",
    "support"
   ],
-  "interfaces/touchevents.idl": [
-   "6ce4f601cda6cd3b99a300e0b28d2886647f06d3",
-   "support"
-  ],
   "interfaces/uievents.idl": [
    "872f7b943e89660d3491bcb176dd1976ce21dc0f",
    "support"
@@ -379620,6 +379733,10 @@
    "5ec433d860f230c3eddddc38bc1f4d40e94d4b23",
    "support"
   ],
+  "interfaces/webmidi.idl": [
+   "47930880a20607801676fa37a915138e5837e5a1",
+   "support"
+  ],
   "interfaces/webrtc-stats.idl": [
    "a4a2e5152e3c96a5efa26893ed34856ebe5348c0",
    "support"
@@ -379684,6 +379801,14 @@
    "97921caeabdafb402de1a6f64fc28176eda3e6db",
    "testharness"
   ],
+  "intersection-observer/idlharness.window-expected.txt": [
+   "c45c1bdb9b2d05982e4ae4c2e71bda062325c571",
+   "support"
+  ],
+  "intersection-observer/idlharness.window.js": [
+   "f0c6e884f256631737f19ade780fefb312a1c618",
+   "testharness"
+  ],
   "intersection-observer/iframe-no-root.html": [
    "6cbea44f209e59ea0b901b0fe1cec7ac1aee0b64",
    "testharness"
@@ -380061,15 +380186,15 @@
    "support"
   ],
   "media-capabilities/idlharness.any-expected.txt": [
-   "e6a818daebab604a5168893763b72ec763f5b5be",
+   "e041b518c0a7516f541f8d6d1ab773e07f142fe4",
    "support"
   ],
   "media-capabilities/idlharness.any.js": [
-   "593b7e0daf0e7e315baf573f6d777bcc1fd71b4b",
+   "dabfb912aaeeb67b539a27b6ea657fd3908090b7",
    "testharness"
   ],
   "media-capabilities/idlharness.any.worker-expected.txt": [
-   "0f52878fdd839b84c26dcde5ff2b05f0867ff2e0",
+   "ec38b051c9b2c87fda09b643112488d84ebe72a9",
    "support"
   ],
   "media-source/META.yml": [
@@ -382600,6 +382725,10 @@
    "174ed39ea3b79363142e49b781b70d506829f9ca",
    "testharness"
   ],
+  "navigation-timing/nav2_test_navigate_iframe.html": [
+   "ce129cf910f32e599bf7fd69591d49d64c3703ab",
+   "testharness"
+  ],
   "navigation-timing/nav2_test_navigate_within_document.html": [
    "81d5d810a10e1aa235cdab6edd830000d407629a",
    "testharness"
@@ -407869,7 +407998,7 @@
    "support"
   ],
   "web-animations/animation-model/animation-types/accumulation-per-property-expected.txt": [
-   "08e6ff17ad327538257f3661dbb0f61565eeb497",
+   "5680b0fc54a21ac89b3abde03136ff7ddb73b487",
    "support"
   ],
   "web-animations/animation-model/animation-types/accumulation-per-property.html": [
@@ -407877,7 +408006,7 @@
    "testharness"
   ],
   "web-animations/animation-model/animation-types/addition-per-property-expected.txt": [
-   "997c4d22b37eecd73647fa81bf93fdafb2bd8388",
+   "1f80d1c2c837ea8d71703f31b4d524f96b10639e",
    "support"
   ],
   "web-animations/animation-model/animation-types/addition-per-property.html": [
@@ -407889,7 +408018,7 @@
    "testharness"
   ],
   "web-animations/animation-model/animation-types/interpolation-per-property-expected.txt": [
-   "9d80aeb38f3b0cc8119694a84d0a19a170b97a7a",
+   "ae829a467fa7ff0728c48c70120db0fd0229f86e",
    "support"
   ],
   "web-animations/animation-model/animation-types/interpolation-per-property.html": [
@@ -410220,6 +410349,18 @@
    "7665873355c531e009824021a2b75daaf2dd6e3f",
    "testharness"
   ],
+  "webmidi/META.yml": [
+   "92d1714903f2fb2f0aa8365be451ca9cd86def9d",
+   "support"
+  ],
+  "webmidi/idlharness.window-expected.txt": [
+   "4bed56f6514ff0b32aad8578b93d5cfde6a78ff5",
+   "support"
+  ],
+  "webmidi/idlharness.window.js": [
+   "7d7dc2ed6fbf39329ca8c3992fa7fff493d26ca9",
+   "testharness"
+  ],
   "webrtc-stats/META.yml": [
    "82d75eadab74e4e1723396af5e85dca885c8077b",
    "support"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-csp-1 b/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-csp-1
new file mode 100644
index 0000000..adbfc362
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-csp-1
@@ -0,0 +1,3 @@
+{
+  "content-security-policy": [{ "policy": "script-src 'self' 'unsafe-inline'" }]
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-csp-2 b/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-csp-2
new file mode 100644
index 0000000..e896da3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-csp-2
@@ -0,0 +1,5 @@
+{
+  "content-security-policy": [{
+    "policy": "script-src 'self' 'nonce-test'"
+  }]
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-noimg b/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-noimg
new file mode 100644
index 0000000..fce2d40
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/.well-known/origin-policy/policy-noimg
@@ -0,0 +1,3 @@
+{
+  "content-security-policy": [{ "policy": "img-src 'none'" }]
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-conditional/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-conditional/idlharness-expected.txt
index bc9cdc9..330c8bd 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-conditional/idlharness-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-conditional/idlharness-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
 PASS Test css-conditional IDL implementation
 PASS Partial interface CSSRule: original interface defined
-FAIL Partial interface CSS: original interface defined assert_true: Original CSS definition should have type interface expected true got false
+PASS Partial namespace CSS: original namespace defined
 PASS CSSGroupingRule interface: existence and properties of interface object
 PASS CSSGroupingRule interface object length
 PASS CSSGroupingRule interface object name
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-001-ref.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-001-ref.html
index 1ed4eca6..639fbb22 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-001-ref.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-contain/reference/contain-paint-001-ref.html
@@ -11,7 +11,6 @@
   background: blue;
   padding: 50px;
   border-radius: 100px;
-  border: white 50px solid;
   overflow: hidden
 }
 div::before {
@@ -21,16 +20,6 @@
   width: 100px;
   height: 100px;
 }
-div::after {
-  content:"";
-  display: block;
-  background: red;
-  width: 50px;
-  height: 50px;
-  float: left;
-  margin-top: 36px;
-  margin-left: -86px;
-}
 </style>
 
 <p>Test passes if there is a green square in a rounded blue box, and no red.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-001.html
new file mode 100644
index 0000000..5b4bbab
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-001.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Content alignment second pass</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#algo-overview">
+<meta name="flags" content="ahem dom">
+<meta name="assert" content="This test checks that content alignment is properly applied when the size of the tracks changes in the second pass of the track sizing algorithm.">
+<link rel="stylesheet" href="../../support/grid.css">
+<link rel="stylesheet" href="../../support/alignment.css">
+
+<style>
+.grid {
+  position: relative;
+  width: 100px;
+  height: 50px;
+  font: 25px/1 Ahem;
+  margin: 10px;
+}
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<body onLoad="checkLayout('.grid');">
+
+<div id="log"></div>
+
+<div class="grid">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50">XX X</div>
+</div>
+
+<div class="grid contentStretch">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="0" data-offset-y="0" data-expected-width="100" data-expected-height="50">XX X</div>
+</div>
+
+<div class="grid contentStart">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XX X</div>
+</div>
+
+<div class="grid contentCenter">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="25" data-offset-y="0" data-expected-width="50" data-expected-height="50">XX X</div>
+</div>
+
+<div class="grid contentEnd">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="50" data-offset-y="0" data-expected-width="50" data-expected-height="50">XX X</div>
+</div>
+
+<div class="grid contentSpaceBetween">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="0" data-offset-y="0" data-expected-width="50" data-expected-height="50">XX X</div>
+  <div class="firstRowSecondColumn" data-offset-x="75" data-offset-y="0" data-expected-width="25" data-expected-height="50">X</div>
+</div>
+
+<div class="grid contentSpaceEvenly" style="width: 105px;">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="10" data-offset-y="0" data-expected-width="50" data-expected-height="50">XX X</div>
+  <div class="firstRowSecondColumn" data-offset-x="70" data-offset-y="0" data-expected-width="25" data-expected-height="50">X</div>
+</div>
+
+<div class="grid contentSpaceAround" style="width: 115px;">
+  <div class="firstRowFirstColumn verticalLR" data-offset-x="10" data-offset-y="0" data-expected-width="50" data-expected-height="50">XX X</div>
+  <div class="firstRowSecondColumn" data-offset-x="80" data-offset-y="0" data-expected-width="25" data-expected-height="50">X</div>
+</div>
+
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002-expected.txt
new file mode 100644
index 0000000..e359c5eb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002-expected.txt
@@ -0,0 +1,16 @@
+This is a testharness.js-based test.
+PASS .grid 1
+PASS .grid 2
+PASS .grid 3
+PASS .grid 4
+PASS .grid 5
+PASS .grid 6
+PASS .grid 7
+FAIL .grid 8 assert_equals: 
+<div class="grid contentSpaceAround" style="grid-template-rows: 25%;" data-expected-width="100" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-offset-x="15" data-offset-y="5" data-expected-width="70" data-expected-height="20">XXX X</div>
+  <div class="secondRowFirstColumn" data-offset-x="15" data-offset-y="35" data-expected-width="70" data-expected-height="40">X<br>X</div>
+</div>
+height expected 80 but got 60
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002.html
new file mode 100644
index 0000000..a6837e3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/alignment/grid-content-alignment-second-pass-002.html
@@ -0,0 +1,65 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Content alignment second pass</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#grid-align">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#algo-overview">
+<meta name="flags" content="ahem dom">
+<meta name="assert" content="This test checks that content alignment is properly applied when the size of the tracks changes in the second pass of the track sizing algorithm.">
+<link rel="stylesheet" href="../../support/grid.css">
+<link rel="stylesheet" href="../../support/alignment.css">
+
+<style>
+.grid {
+  position: relative;
+  font: 20px/1 Ahem;
+  margin: 10px;
+  display: inline-grid;
+  grid: 50% / 70%;
+}
+</style>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+
+<body onLoad="checkLayout('.grid');">
+
+<div id="log"></div>
+
+<div class="grid" data-expected-width="100" data-expected-height="40">
+  <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="70" data-expected-height="20">XXX X</div>
+</div>
+
+<div class="grid contentStretch" data-expected-width="100" data-expected-height="40">
+  <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="70" data-expected-height="20">XXX X</div>
+</div>
+
+<div class="grid contentStart" data-expected-width="100" data-expected-height="40">
+  <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="70" data-expected-height="20">XXX X</div>
+</div>
+
+<div class="grid contentCenter" data-expected-width="100" data-expected-height="40">
+  <div class="firstRowFirstColumn" data-offset-x="15" data-offset-y="10" data-expected-width="70" data-expected-height="20">XXX X</div>
+</div>
+
+<div class="grid contentEnd" data-expected-width="100" data-expected-height="40">
+  <div class="firstRowFirstColumn" data-offset-x="30" data-offset-y="20" data-expected-width="70" data-expected-height="20">XXX X</div>
+</div>
+
+<div class="grid contentSpaceBetween" data-expected-width="100" data-expected-height="60">
+  <div class="firstRowFirstColumn" data-offset-x="0" data-offset-y="0" data-expected-width="70" data-expected-height="30">XXX X</div>
+  <div class="secondRowFirstColumn" data-offset-x="0" data-offset-y="40" data-expected-width="70" data-expected-height="20">X</div>
+</div>
+
+<div class="grid contentSpaceEvenly" style="grid-template-rows: 30%;" data-expected-width="100" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-offset-x="15" data-offset-y="5" data-expected-width="70" data-expected-height="24">XXX X</div>
+  <div class="secondRowFirstColumn" data-offset-x="15" data-offset-y="35" data-expected-width="70" data-expected-height="40">X<br>X</div>
+</div>
+
+<div class="grid contentSpaceAround" style="grid-template-rows: 25%;" data-expected-width="100" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-offset-x="15" data-offset-y="5" data-expected-width="70" data-expected-height="20">XXX X</div>
+  <div class="secondRowFirstColumn" data-offset-x="15" data-offset-y="35" data-expected-width="70" data-expected-height="40">X<br>X</div>
+</div>
+
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-001.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-001.html
new file mode 100644
index 0000000..cdae02a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-001.html
@@ -0,0 +1,572 @@
+<!DOCTYPE html>
+<html lang="en">
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Percentage rows indefinite height</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#track-sizing">
+<meta name="assert" content="This test checks that percentage rows on grid containers with indefinite height are treated as 'auto' to compute the intrinsic height, but are later resolved against the intrinsic height during layout.">
+<meta name="flags" content="ahem">
+<link rel="stylesheet" href="support/grid.css">
+<style>
+.grid {
+  position: relative;
+  font: 25px/1 Ahem;
+  margin: 50px 0;
+}
+
+.border {
+  border: 10px solid;
+}
+
+.padding {
+  padding: 5px;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.grid');">
+
+<div id="log"></div>
+
+<p>grid-template-rows: 60%;</p>
+
+<div class="grid" style="grid-template-rows: 60%;" data-expected-height="0">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: 60%;" data-expected-height="25">
+  <div class="firstRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 60%;" data-expected-height="50">
+  <div class="firstRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 60%;" data-expected-height="20">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 60%;" data-expected-height="45">
+  <div class="firstRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 60%;" data-expected-height="70">
+  <div class="firstRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 60%;" data-expected-height="10">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 60%;" data-expected-height="35">
+  <div class="firstRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 60%;" data-expected-height="60">
+  <div class="firstRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 60%;" data-expected-height="30">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 60%;" data-expected-height="55">
+  <div class="firstRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 60%;" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<p>grid-template-rows: 140%;</p>
+
+<div class="grid" style="grid-template-rows: 140%;" data-expected-height="0">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: 140%;" data-expected-height="25">
+  <div class="firstRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 140%;" data-expected-height="50">
+  <div class="firstRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 140%;" data-expected-height="20">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 140%;" data-expected-height="45">
+  <div class="firstRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 140%;" data-expected-height="70">
+  <div class="firstRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 140%;" data-expected-height="10">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 140%;" data-expected-height="35">
+  <div class="firstRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 140%;" data-expected-height="60">
+  <div class="firstRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 140%;" data-expected-height="30">
+  <div class="firstRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 140%;" data-expected-height="55">
+  <div class="firstRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 140%;" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<p>grid-template-rows: 100px 60%;</p>
+
+<div class="grid" style="grid-template-rows: 100px 60%;" data-expected-height="100">
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 60%;" data-expected-height="125">
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 60%;" data-expected-height="150">
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 60%;" data-expected-height="100">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 60%;" data-expected-height="125">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 60%;" data-expected-height="150">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 60%;" data-expected-height="120">
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 60%;" data-expected-height="145">
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 60%;" data-expected-height="170">
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 60%;" data-expected-height="120">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 60%;" data-expected-height="145">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 60%;" data-expected-height="170">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 60%;" data-expected-height="110">
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 60%;" data-expected-height="135">
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 60%;" data-expected-height="160">
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 60%;" data-expected-height="110">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 60%;" data-expected-height="135">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 60%;" data-expected-height="160">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 60%;" data-expected-height="130">
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 60%;" data-expected-height="155">
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 60%;" data-expected-height="180">
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 60%;" data-expected-height="130">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="60"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 60%;" data-expected-height="155">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="75">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 60%;" data-expected-height="180">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="90">X<br>X</div>
+</div>
+
+<p>grid-template-rows: 100px 140%;</p>
+
+<div class="grid" style="grid-template-rows: 100px 140%;" data-expected-height="100">
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 140%;" data-expected-height="125">
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 140%;" data-expected-height="150">
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 140%;" data-expected-height="100">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 140%;" data-expected-height="125">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: 100px 140%;" data-expected-height="150">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 140%;" data-expected-height="120">
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 140%;" data-expected-height="145">
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 140%;" data-expected-height="170">
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 140%;" data-expected-height="120">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 140%;" data-expected-height="145">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: 100px 140%;" data-expected-height="170">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 140%;" data-expected-height="110">
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 140%;" data-expected-height="135">
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 140%;" data-expected-height="160">
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 140%;" data-expected-height="110">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 140%;" data-expected-height="135">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: 100px 140%;" data-expected-height="160">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 140%;" data-expected-height="130">
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 140%;" data-expected-height="155">
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 140%;" data-expected-height="180">
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 140%;" data-expected-height="130">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="140"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 140%;" data-expected-height="155">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="175">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: 100px 140%;" data-expected-height="180">
+  <div class="firstRowFirstColumn" data-expected-height="100">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="210">X<br>X</div>
+</div>
+
+<p>grid-template-rows: auto 60%;</p>
+
+<div class="grid" style="grid-template-rows: auto 60%;" data-expected-height="0">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 60%;" data-expected-height="25">
+  <div class="secondRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 60%;" data-expected-height="50">
+  <div class="secondRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 60%;" data-expected-height="25">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="15"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 60%;" data-expected-height="50">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="30">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 60%;" data-expected-height="75">
+  <div class="firstRowFirstColumn" data-expected-height="30">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="45">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 60%;" data-expected-height="20">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 60%;" data-expected-height="45">
+  <div class="secondRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 60%;" data-expected-height="70">
+  <div class="secondRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 60%;" data-expected-height="45">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="15"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 60%;" data-expected-height="70">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="30">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 60%;" data-expected-height="95">
+  <div class="firstRowFirstColumn" data-expected-height="30">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="45">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 60%;" data-expected-height="10">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 60%;" data-expected-height="35">
+  <div class="secondRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 60%;" data-expected-height="60">
+  <div class="secondRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 60%;" data-expected-height="35">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="15"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 60%;" data-expected-height="60">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="30">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 60%;" data-expected-height="85">
+  <div class="firstRowFirstColumn" data-expected-height="30">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="45">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 60%;" data-expected-height="30">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 60%;" data-expected-height="55">
+  <div class="secondRowFirstColumn" data-expected-height="15">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 60%;" data-expected-height="80">
+  <div class="secondRowFirstColumn" data-expected-height="30">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 60%;" data-expected-height="55">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="15"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 60%;" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="30">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 60%;" data-expected-height="105">
+  <div class="firstRowFirstColumn" data-expected-height="30">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="45">X<br>X</div>
+</div>
+
+<p>grid-template-rows: auto 140%;</p>
+
+<div class="grid" style="grid-template-rows: auto 140%;" data-expected-height="0">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 140%;" data-expected-height="25">
+  <div class="secondRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 140%;" data-expected-height="50">
+  <div class="secondRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 140%;" data-expected-height="25">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="35"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 140%;" data-expected-height="50">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="70">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 140%;" data-expected-height="75">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="105">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 140%;" data-expected-height="20">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 140%;" data-expected-height="45">
+  <div class="secondRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 140%;" data-expected-height="70">
+  <div class="secondRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 140%;" data-expected-height="45">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="35"></div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 140%;" data-expected-height="70">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="70">X</div>
+</div>
+
+<div class="grid border" style="grid-template-rows: auto 140%;" data-expected-height="95">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="105">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 140%;" data-expected-height="10">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 140%;" data-expected-height="35">
+  <div class="secondRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 140%;" data-expected-height="60">
+  <div class="secondRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 140%;" data-expected-height="35">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="35"></div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 140%;" data-expected-height="60">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="70">X</div>
+</div>
+
+<div class="grid padding" style="grid-template-rows: auto 140%;" data-expected-height="85">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="105">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 140%;" data-expected-height="30">
+  <div class="secondRowFirstColumn" data-expected-height="0"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 140%;" data-expected-height="55">
+  <div class="secondRowFirstColumn" data-expected-height="35">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 140%;" data-expected-height="80">
+  <div class="secondRowFirstColumn" data-expected-height="70">X<br>X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 140%;" data-expected-height="55">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="35"></div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 140%;" data-expected-height="80">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="70">X</div>
+</div>
+
+<div class="grid border padding" style="grid-template-rows: auto 140%;" data-expected-height="105">
+  <div class="firstRowFirstColumn" data-expected-height="25">X</div>
+  <div class="secondRowFirstColumn" data-expected-height="105">X<br>X</div>
+</div>
+
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-002.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-002.html
new file mode 100644
index 0000000..8285a91
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-grid/grid-definition/grid-percentage-rows-indefinite-height-002.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html lang="en">
+<meta charset="utf-8">
+<title>CSS Grid Layout Test: Percentage rows indefinite height 2nd pass</title>
+<link rel="author" title="Manuel Rego Casasnovas" href="mailto:rego@igalia.com">
+<link rel="help" href="https://drafts.csswg.org/css-grid-1/#track-sizing">
+<meta name="assert" content="This test checkds that when we have percentage rows in indefinite height grid containers, we need to do a second pass of the track sizing algorithm to get the expected results.">
+<meta name="flags" content="ahem">
+<style>
+.grid {
+  display: grid;
+  border: solid 5px;
+  position: relative;
+  font: 25px/1 Ahem;
+  margin: 50px 0;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<body onload="checkLayout('.grid');">
+
+<div id="log"></div>
+
+<div class="grid" style="grid-template-rows: auto 60% auto;" data-expected-height="35">
+  <div style="grid-row: 1; grid-column: 1; background: cyan;" data-expected-height="5" data-offset-top="0"></div>
+  <div style="grid-row: 1 / 4; grid-column: 2; background: magenta;" data-expected-height="25" data-offset-top="0">X</div>
+  <div style="grid-row: 3; grid-column: 3; background: lime;" data-expected-height="5" data-offset-top="20"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 20% auto;" data-expected-height="60">
+  <div style="grid-row: 1; grid-column: 1; background: cyan;" data-expected-height="25" data-offset-top="0">X</div>
+  <div style="grid-row: 1 / 4; grid-column: 2; background: magenta;" data-expected-height="60" data-offset-top="0">X</div>
+  <div style="grid-row: 3; grid-column: 3; background: lime;" data-expected-height="25" data-offset-top="35">X</div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 10% auto; grid-template-columns: repeat(3, 50px);" data-expected-height="110">
+  <div style="grid-row: 1; grid-column: 1; background: cyan;" data-expected-height="45"></div>
+  <div style="grid-row: 1 / 4; grid-column: 2; background: magenta;" data-expected-height="100">X X X X</div>
+  <div style="grid-row: 3; grid-column: 3; background: lime;" data-expected-height="45"></div>
+</div>
+
+<div class="grid" style="grid-template-rows: auto 10% auto; grid-template-columns: repeat(3, 50px);" data-expected-height="110">
+  <div style="grid-row: 1; grid-column: 1; background: cyan;" data-expected-height="45">X</div>
+  <div style="grid-row: 1 / 4; grid-column: 2; background: magenta;" data-expected-height="100">X X X X</div>
+  <div style="grid-row: 3; grid-column: 3; background: lime;" data-expected-height="45">X</div>
+</div>
+
+</body>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/idlharness-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/idlharness-expected.txt
new file mode 100644
index 0000000..8b356c83
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/idlharness-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+FAIL idl_test setup promise_test: Unhandled rejection with value: object "TypeError: window.getPseudoElements is not a function"
+PASS Partial interface Window: original interface defined
+FAIL CSSPseudoElement interface: existence and properties of interface object assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface object length assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface object name assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface: attribute type assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement interface: attribute style assert_own_property: self does not have own property "CSSPseudoElement" expected property "CSSPseudoElement" missing
+FAIL CSSPseudoElement must be primary interface of beforeElements.item(0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL Stringification of beforeElements.item(0) assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElement interface: beforeElements.item(0) must inherit property "type" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElement interface: beforeElements.item(0) must inherit property "style" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElementList interface: existence and properties of interface object assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface object length assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface object name assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface: existence and properties of interface prototype object assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface: attribute length assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface: operation item(unsigned long) assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList interface: operation getByType(CSSOMString) assert_own_property: self does not have own property "CSSPseudoElementList" expected property "CSSPseudoElementList" missing
+FAIL CSSPseudoElementList must be primary interface of beforeElements assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL Stringification of beforeElements assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElementList interface: beforeElements must inherit property "length" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElementList interface: beforeElements must inherit property "item(unsigned long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElementList interface: calling item(unsigned long) on beforeElements with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElementList interface: beforeElements must inherit property "getByType(CSSOMString)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL CSSPseudoElementList interface: calling getByType(CSSOMString) on beforeElements with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: beforeElements is not defined"
+FAIL Window interface: operation getPseudoElements(Element, CSSOMString) assert_own_property: global object missing non-static operation expected property "getPseudoElements" missing
+FAIL Window interface: window must inherit property "getPseudoElements(Element, CSSOMString)" with the proper type assert_own_property: expected property "getPseudoElements" missing
+FAIL Window interface: calling getPseudoElements(Element, CSSOMString) on window with too few arguments must throw TypeError assert_own_property: expected property "getPseudoElements" missing
+PASS WorkerGlobalScope interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/idlharness.html
new file mode 100644
index 0000000..4c113fc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/idlharness.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<title>CSS Pseudo Element API IDL tests</title>
+<link rel="help" href="https://drafts.csswg.org/css-pseudo-4/">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+<script>
+'use strict';
+
+idl_test(
+  ['css-pseudo'],
+  ['cssom', 'html', 'dom'],
+  idl_array => {
+    idl_array.add_objects({
+      Window: ['window'],
+      CSSPseudoElementList: ['beforeElements'],
+      CSSPseudoElement: ['beforeElements.item(0)'],
+    });
+
+    window.beforeElements =
+      window.getPseudoElements(document.body, 'before');
+  }
+);
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/interfaces.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/interfaces.html
deleted file mode 100644
index 572f87f..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-pseudo/interfaces.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<meta charset=utf-8>
-<link rel="help" href="https://drafts.csswg.org/css-pseudo-4"/>
-<script src=/resources/testharness.js></script>
-<script src=/resources/testharnessreport.js></script>
-<script src=/resources/WebIDLParser.js></script>
-<script src=/resources/idlharness.js></script>
-
-<h1>CSS Pseudo-Elements IDL tests</h1>
-<div id=log></div>
-
-<script>
-'use strict';
-
-idl_test(
-  ['css-pseudo'],
-  ['cssom', 'html', 'dom'],
-  async idlArray => {
-    idlArray.add_objects({
-      Window: ['window'],
-      // TODO: CSSPseudoElement + CSSPseudoElementList
-    });
-  },
-  'CSS Pseudo-Elements interfaces'
-);
-</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html
new file mode 100644
index 0000000..fa95069
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-sizing/orthogonal-writing-mode-float-in-inline.html
@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<title>Shrink-to-fit float inside inline inside a shrink-to-fit-container</title>
+<link rel="author" title="Morten Stenshorne" href="mstensho@chromium.org">
+<meta name="assert" content="This tests that intrinsic size calculation realizes that the four words are going to fit on the same line in final layout">
+<link rel="help" href="https://www.w3.org/TR/css-sizing-3/#intrinsic-sizes" title="4.1. Intrinsic Sizes">
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+<div style="float:left; height:100px; background:red;">
+  <span>
+    <div style="float:left; writing-mode:vertical-rl; height:100%; line-height:100px; background:green;">
+      &nbsp; &nbsp; &nbsp; &nbsp;
+    </div>
+  </span>
+</div>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/color-rendering.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/color-rendering.html
index 3c47e3e..e6abf50 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/color-rendering.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/color-rendering.html
@@ -15,8 +15,8 @@
 
 runPropertyTests('color-rendering', [
   { syntax: 'auto' },
-  { syntax: 'optimizeSpeed' },
-  { syntax: 'optimizeQuality' },
+  { syntax: 'optimizespeed' },
+  { syntax: 'optimizequality' },
 ]);
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-rendering.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-rendering.html
index 28ecdab..f7cb419 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-rendering.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/shape-rendering.html
@@ -15,9 +15,9 @@
 
 runPropertyTests('shape-rendering', [
   { syntax: 'auto' },
-  { syntax: 'optimizeSpeed' },
-  { syntax: 'crispEdges' },
-  { syntax: 'geometricPrecision' },
+  { syntax: 'optimizespeed' },
+  { syntax: 'crispedges' },
+  { syntax: 'geometricprecision' },
 ]);
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-rendering.html b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-rendering.html
index 13d2e3b..88ef17d 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-rendering.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/css/css-typed-om/the-stylepropertymap/properties/text-rendering.html
@@ -15,9 +15,9 @@
 
 runPropertyTests('text-rendering', [
   { syntax: 'auto' },
-  { syntax: 'optimizeSpeed' },
-  { syntax: 'optimizeLegibility' },
-  { syntax: 'geometricPrecision' },
+  { syntax: 'optimizespeed' },
+  { syntax: 'optimizelegibility' },
+  { syntax: 'geometricprecision' },
 ]);
 
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.js b/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.js
index 4eaeabe..f01aff0 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.js
@@ -5,12 +5,15 @@
 
 // https://w3c.github.io/DOM-Parsing/
 
-promise_test(async () => {
-  const dom = await fetch('/interfaces/dom.idl').then(r => r.text());
-  const idl = await fetch('/interfaces/DOM-Parsing.idl').then(r => r.text());
-  const idlArray = new IdlArray();
-  idlArray.add_untested_idls(dom);
-  idlArray.add_idls(idl);
-  idlArray.test();
-  done();
-}, 'Test driver');
+idl_test(
+  ['DOM-Parsing'],
+  ['dom'],
+  idlArray => {
+    idlArray.add_objects({
+      DOMParser: ['new DOMParser()'],
+      Element: ['document.createElement("div")'],
+      Range: ['new Range()'],
+      XMLSerializer: ['new XMLSerializer()'],
+    })
+  },
+  'DOM-Parsing interfaces');
diff --git a/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.worker-expected.txt
new file mode 100644
index 0000000..d87eba3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/domparsing/interfaces.any.worker-expected.txt
@@ -0,0 +1,28 @@
+This is a testharness.js-based test.
+PASS DOM-Parsing interfaces
+PASS Partial interface Element: original interface defined
+PASS Partial interface Range: original interface defined
+PASS DOMParser interface: existence and properties of interface object
+FAIL DOMParser must be primary interface of new DOMParser() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: DOMParser is not defined"
+FAIL Stringification of new DOMParser() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: DOMParser is not defined"
+FAIL DOMParser interface: new DOMParser() must not have property "parseFromString" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: DOMParser is not defined"
+PASS XMLSerializer interface: existence and properties of interface object
+FAIL XMLSerializer must be primary interface of new XMLSerializer() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: XMLSerializer is not defined"
+FAIL Stringification of new XMLSerializer() assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: XMLSerializer is not defined"
+FAIL XMLSerializer interface: new XMLSerializer() must not have property "serializeToString" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: XMLSerializer is not defined"
+PASS Node interface: existence and properties of interface object
+PASS Document interface: existence and properties of interface object
+PASS DocumentType interface: existence and properties of interface object
+PASS DocumentFragment interface: existence and properties of interface object
+PASS ShadowRoot interface: existence and properties of interface object
+PASS Element interface: existence and properties of interface object
+FAIL Element interface: document.createElement("div") must not have property "innerHTML" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: document is not defined"
+FAIL Element interface: document.createElement("div") must not have property "outerHTML" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: document is not defined"
+FAIL Element interface: document.createElement("div") must not have property "insertAdjacentHTML" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: document is not defined"
+PASS CharacterData interface: existence and properties of interface object
+PASS Text interface: existence and properties of interface object
+PASS AbstractRange interface: existence and properties of interface object
+PASS Range interface: existence and properties of interface object
+FAIL Range interface: new Range() must not have property "createContextualFragment" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: Range is not defined"
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.js b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.js
new file mode 100644
index 0000000..4e266c09
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.js
@@ -0,0 +1,22 @@
+// META: global=window,worker
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+// https://w3c.github.io/hr-time/
+
+idl_test(
+  ['hr-time'],
+  ['html', 'dom'],
+  async idl_array => {
+    if (self.GLOBAL.isWorker()) {
+      idl_array.add_objects({ WorkerGlobalScope: ['self'] });
+    } else {
+      idl_array.add_objects({ Window: ['self'] });
+    }
+    idl_array.add_objects({
+      Performance: ['performance'],
+    });
+  }
+);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.sharedworker-expected.txt
new file mode 100644
index 0000000..02975ba
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.sharedworker-expected.txt
@@ -0,0 +1,34 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined
+PASS Performance interface: existence and properties of interface object
+PASS Performance interface object length
+PASS Performance interface object name
+PASS Performance interface: existence and properties of interface prototype object
+PASS Performance interface: existence and properties of interface prototype object's "constructor" property
+PASS Performance interface: existence and properties of interface prototype object's @@unscopables property
+PASS Performance interface: operation now()
+PASS Performance interface: attribute timeOrigin
+PASS Performance interface: operation toJSON()
+PASS Performance must be primary interface of performance
+PASS Stringification of performance
+PASS Performance interface: performance must inherit property "now()" with the proper type
+PASS Performance interface: performance must inherit property "timeOrigin" with the proper type
+PASS Performance interface: performance must inherit property "toJSON()" with the proper type
+PASS Test default toJSON operation of Performance
+PASS HTMLElement interface: existence and properties of interface object
+PASS HTMLBodyElement interface: existence and properties of interface object
+PASS Window interface: existence and properties of interface object
+FAIL WorkerGlobalScope interface: attribute performance assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+PASS WorkerGlobalScope interface: self must inherit property "performance" with the proper type
+PASS HTMLFrameSetElement interface: existence and properties of interface object
+PASS Node interface: existence and properties of interface object
+PASS Document interface: existence and properties of interface object
+PASS DocumentType interface: existence and properties of interface object
+PASS DocumentFragment interface: existence and properties of interface object
+PASS ShadowRoot interface: existence and properties of interface object
+PASS Element interface: existence and properties of interface object
+PASS CharacterData interface: existence and properties of interface object
+PASS Text interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.worker-expected.txt
new file mode 100644
index 0000000..02975ba
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.any.worker-expected.txt
@@ -0,0 +1,34 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined
+PASS Performance interface: existence and properties of interface object
+PASS Performance interface object length
+PASS Performance interface object name
+PASS Performance interface: existence and properties of interface prototype object
+PASS Performance interface: existence and properties of interface prototype object's "constructor" property
+PASS Performance interface: existence and properties of interface prototype object's @@unscopables property
+PASS Performance interface: operation now()
+PASS Performance interface: attribute timeOrigin
+PASS Performance interface: operation toJSON()
+PASS Performance must be primary interface of performance
+PASS Stringification of performance
+PASS Performance interface: performance must inherit property "now()" with the proper type
+PASS Performance interface: performance must inherit property "timeOrigin" with the proper type
+PASS Performance interface: performance must inherit property "toJSON()" with the proper type
+PASS Test default toJSON operation of Performance
+PASS HTMLElement interface: existence and properties of interface object
+PASS HTMLBodyElement interface: existence and properties of interface object
+PASS Window interface: existence and properties of interface object
+FAIL WorkerGlobalScope interface: attribute performance assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+PASS WorkerGlobalScope interface: self must inherit property "performance" with the proper type
+PASS HTMLFrameSetElement interface: existence and properties of interface object
+PASS Node interface: existence and properties of interface object
+PASS Document interface: existence and properties of interface object
+PASS DocumentType interface: existence and properties of interface object
+PASS DocumentFragment interface: existence and properties of interface object
+PASS ShadowRoot interface: existence and properties of interface object
+PASS Element interface: existence and properties of interface object
+PASS CharacterData interface: existence and properties of interface object
+PASS Text interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html
deleted file mode 100644
index d28cee3..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>High Resolution Time IDL tests</title>
-<link rel="author" title="W3C" href="http://www.w3.org/" />
-<link rel="help" href="http://www.w3.org/TR/hr-time/#sec-extenstions-performance-interface"/>
-<script src="/resources/testharness.js"></script>
-<script src="/resources/testharnessreport.js"></script>
-<script src="/resources/WebIDLParser.js"></script>
-<script src="/resources/idlharness.js"></script>
-</head>
-<body>
-<h1>High Resolution Time IDL tests</h1>
-<div id="log"></div>
-<script>
-'use strict';
-
-function doTest([dom, html, hr_time]) {
-  var idl_array = new IdlArray();
-  idl_array.add_untested_idls(dom, { only: ['EventTarget'] });
-  idl_array.add_untested_idls(html, { only: ['WindowOrWorkerGlobalScope'] });
-  idl_array.add_idls(hr_time);
-  idl_array.add_objects({
-    Performance: ["window.performance"],
-    Window: ["window"],
-  });
-  idl_array.test();
-}
-
-function fetchText(url) {
-  return fetch(url).then((response) => response.text());
-}
-
-promise_test(() => {
-  return Promise.all(['/interfaces/dom.idl',
-                      '/interfaces/html.idl',
-                      '/interfaces/hr-time.idl'].map(fetchText))
-                .then(doTest);
-}, 'Test driver');
-</script>
-</body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.https.any.serviceworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.https.any.serviceworker-expected.txt
new file mode 100644
index 0000000..02975ba
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/hr-time/idlharness.https.any.serviceworker-expected.txt
@@ -0,0 +1,34 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface mixin WindowOrWorkerGlobalScope: original interface mixin defined
+PASS Performance interface: existence and properties of interface object
+PASS Performance interface object length
+PASS Performance interface object name
+PASS Performance interface: existence and properties of interface prototype object
+PASS Performance interface: existence and properties of interface prototype object's "constructor" property
+PASS Performance interface: existence and properties of interface prototype object's @@unscopables property
+PASS Performance interface: operation now()
+PASS Performance interface: attribute timeOrigin
+PASS Performance interface: operation toJSON()
+PASS Performance must be primary interface of performance
+PASS Stringification of performance
+PASS Performance interface: performance must inherit property "now()" with the proper type
+PASS Performance interface: performance must inherit property "timeOrigin" with the proper type
+PASS Performance interface: performance must inherit property "toJSON()" with the proper type
+PASS Test default toJSON operation of Performance
+PASS HTMLElement interface: existence and properties of interface object
+PASS HTMLBodyElement interface: existence and properties of interface object
+PASS Window interface: existence and properties of interface object
+FAIL WorkerGlobalScope interface: attribute performance assert_equals: setter must be function for PutForwards, Replaceable, or non-readonly attributes expected "function" but got "undefined"
+PASS WorkerGlobalScope interface: self must inherit property "performance" with the proper type
+PASS HTMLFrameSetElement interface: existence and properties of interface object
+PASS Node interface: existence and properties of interface object
+PASS Document interface: existence and properties of interface object
+PASS DocumentType interface: existence and properties of interface object
+PASS DocumentFragment interface: existence and properties of interface object
+PASS ShadowRoot interface: existence and properties of interface object
+PASS Element interface: existence and properties of interface object
+PASS CharacterData interface: existence and properties of interface object
+PASS Text interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.html b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.html
deleted file mode 100644
index 93014f3..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset='utf-8'>
-    <title>HTML Media Capture IDL tests</title>
-    <link rel='author' title='Intel' href='http://www.intel.com/'>
-    <link rel='help' href='https://w3c.github.io/html-media-capture'>
-    <script src='/resources/testharness.js'></script>
-    <script src='/resources/testharnessreport.js'></script>
-    <script src='/resources/WebIDLParser.js'></script>
-    <script src='/resources/idlharness.js'></script>
-  </head>
-  <body>
-    <h1>HTML Media Capture IDL tests</h1>
-    <div id='log'></div>
-
-    <pre id='untested_idl' style='display:none'>
-      interface HTMLInputElement {
-      };
-      interface HTMLElement {
-      };
-      interface Element{
-      };
-    </pre>
-
-    <pre id='idl' style='display:none'>
-      partial interface HTMLInputElement {
-          [CEReactions]
-          attribute DOMString capture;
-      };
-    </pre>
-
-    <form style='display:none'>
-      <input id='testElement' type='file' accept='image/*' capture="user">
-    </form>
-
-    <script>
-      (function() {
-        let idl_array = new IdlArray();
-
-        idl_array.add_untested_idls(document.getElementById('untested_idl').textContent);
-        idl_array.add_idls(document.getElementById('idl').textContent);
-
-        let testElement = document.getElementById('testElement');
-        idl_array.add_objects({HTMLInputElement: [testElement]});
-        idl_array.test();
-      })();
-    </script>
-  </body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.window-expected.txt
new file mode 100644
index 0000000..dc579f49
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.window-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+PASS html-media-capture interfaces.
+PASS Partial interface HTMLInputElement: original interface defined
+FAIL HTMLInputElement interface: attribute capture assert_true: The prototype object must have a property "capture" expected true got false
+FAIL HTMLInputElement interface: input must inherit property "capture" with the proper type assert_inherits: property "capture" not found in prototype chain
+PASS WorkerGlobalScope interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.window.js
new file mode 100644
index 0000000..5382f53
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html-media-capture/idlharness.window.js
@@ -0,0 +1,18 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+// https://w3c.github.io/html-media-capture/
+
+idl_test(
+  ['html-media-capture'],
+  ['html', 'dom'],
+  idl_array => {
+    idl_array.add_objects({
+      HTMLInputElement: ['input'],
+    });
+
+    self.input = document.createElement('input');
+  },
+  'html-media-capture interfaces.');
diff --git "a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
index 21a8a489..ec0075917 100644
--- "a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
+++ "b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -1,6 +1,33 @@
 This is a testharness.js-based test.
-PASS html interfaces
-PASS Partial interface Document: original interface defined
+FAIL html interfaces promise_test: Unhandled rejection with value: object "Got an error before parsing any named definition: Unrecognised tokens, line 1 (tokens: "{\"error\": {\"message\"")
+[
+    {
+        "type": "{",
+        "value": "{",
+        "trivia": ""
+    },
+    {
+        "type": "string",
+        "value": "\"error\"",
+        "trivia": ""
+    },
+    {
+        "type": ":",
+        "value": ":",
+        "trivia": ""
+    },
+    {
+        "type": "{",
+        "value": "{",
+        "trivia": " "
+    },
+    {
+        "type": "string",
+        "value": "\"message\"",
+        "trivia": ""
+    }
+]"
+FAIL Partial interface Document: original interface defined assert_true: Original interface should be defined expected true got false
 PASS Partial interface NavigatorID: original interface defined
 PASS Partial interface HTMLAnchorElement: original interface defined
 PASS Partial interface HTMLAreaElement: original interface defined
@@ -34,1155 +61,7 @@
 PASS Partial interface HTMLTableCellElement: original interface defined
 PASS Partial interface HTMLTableRowElement: original interface defined
 PASS Partial interface HTMLUListElement: original interface defined
-PASS Partial interface Document[2]: original interface defined
+FAIL Partial interface Document[2]: original interface defined assert_true: Original interface should be defined expected true got false
 PASS Partial interface Window: original interface defined
-PASS RadioNodeList interface: existence and properties of interface object
-PASS RadioNodeList interface object length
-PASS RadioNodeList interface object name
-PASS RadioNodeList interface: existence and properties of interface prototype object
-PASS RadioNodeList interface: existence and properties of interface prototype object's "constructor" property
-PASS RadioNodeList interface: existence and properties of interface prototype object's @@unscopables property
-PASS RadioNodeList interface: attribute value
-PASS DOMStringList interface: existence and properties of interface object
-PASS DOMStringList interface object length
-PASS DOMStringList interface object name
-PASS DOMStringList interface: existence and properties of interface prototype object
-PASS DOMStringList interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMStringList interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMStringList interface: attribute length
-PASS DOMStringList interface: operation item(unsigned long)
-PASS DOMStringList interface: operation contains(DOMString)
-PASS DOMStringMap interface: existence and properties of interface object
-PASS DOMStringMap interface object length
-PASS DOMStringMap interface object name
-PASS DOMStringMap interface: existence and properties of interface prototype object
-PASS DOMStringMap interface: existence and properties of interface prototype object's "constructor" property
-PASS DOMStringMap interface: existence and properties of interface prototype object's @@unscopables property
-PASS DOMStringMap must be primary interface of document.head.dataset
-PASS Stringification of document.head.dataset
-PASS MediaError interface: existence and properties of interface object
-PASS MediaError interface object length
-PASS MediaError interface object name
-PASS MediaError interface: existence and properties of interface prototype object
-PASS MediaError interface: existence and properties of interface prototype object's "constructor" property
-PASS MediaError interface: existence and properties of interface prototype object's @@unscopables property
-PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface object
-PASS MediaError interface: constant MEDIA_ERR_ABORTED on interface prototype object
-PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface object
-PASS MediaError interface: constant MEDIA_ERR_NETWORK on interface prototype object
-PASS MediaError interface: constant MEDIA_ERR_DECODE on interface object
-PASS MediaError interface: constant MEDIA_ERR_DECODE on interface prototype object
-PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface object
-PASS MediaError interface: constant MEDIA_ERR_SRC_NOT_SUPPORTED on interface prototype object
-PASS MediaError interface: attribute code
-PASS MediaError interface: attribute message
-PASS MediaError must be primary interface of errorVideo.error
-PASS Stringification of errorVideo.error
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_ABORTED" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_NETWORK" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_DECODE" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "MEDIA_ERR_SRC_NOT_SUPPORTED" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "code" with the proper type
-PASS MediaError interface: errorVideo.error must inherit property "message" with the proper type
-PASS AudioTrackList interface: existence and properties of interface object
-PASS AudioTrackList interface object length
-PASS AudioTrackList interface object name
-PASS AudioTrackList interface: existence and properties of interface prototype object
-PASS AudioTrackList interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioTrackList interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioTrackList interface: attribute length
-PASS AudioTrackList interface: operation getTrackById(DOMString)
-PASS AudioTrackList interface: attribute onchange
-PASS AudioTrackList interface: attribute onaddtrack
-PASS AudioTrackList interface: attribute onremovetrack
-PASS AudioTrack interface: existence and properties of interface object
-PASS AudioTrack interface object length
-PASS AudioTrack interface object name
-PASS AudioTrack interface: existence and properties of interface prototype object
-PASS AudioTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS AudioTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS AudioTrack interface: attribute id
-PASS AudioTrack interface: attribute kind
-PASS AudioTrack interface: attribute label
-PASS AudioTrack interface: attribute language
-PASS AudioTrack interface: attribute enabled
-PASS VideoTrackList interface: existence and properties of interface object
-PASS VideoTrackList interface object length
-PASS VideoTrackList interface object name
-PASS VideoTrackList interface: existence and properties of interface prototype object
-PASS VideoTrackList interface: existence and properties of interface prototype object's "constructor" property
-PASS VideoTrackList interface: existence and properties of interface prototype object's @@unscopables property
-PASS VideoTrackList interface: attribute length
-PASS VideoTrackList interface: operation getTrackById(DOMString)
-PASS VideoTrackList interface: attribute selectedIndex
-PASS VideoTrackList interface: attribute onchange
-PASS VideoTrackList interface: attribute onaddtrack
-PASS VideoTrackList interface: attribute onremovetrack
-PASS VideoTrack interface: existence and properties of interface object
-PASS VideoTrack interface object length
-PASS VideoTrack interface object name
-PASS VideoTrack interface: existence and properties of interface prototype object
-PASS VideoTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS VideoTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS VideoTrack interface: attribute id
-PASS VideoTrack interface: attribute kind
-PASS VideoTrack interface: attribute label
-PASS VideoTrack interface: attribute language
-PASS VideoTrack interface: attribute selected
-PASS TextTrackList interface: existence and properties of interface object
-PASS TextTrackList interface object length
-PASS TextTrackList interface object name
-PASS TextTrackList interface: existence and properties of interface prototype object
-PASS TextTrackList interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrackList interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrackList interface: attribute length
-PASS TextTrackList interface: operation getTrackById(DOMString)
-PASS TextTrackList interface: attribute onchange
-PASS TextTrackList interface: attribute onaddtrack
-PASS TextTrackList interface: attribute onremovetrack
-PASS TextTrackList must be primary interface of document.createElement("video").textTracks
-PASS Stringification of document.createElement("video").textTracks
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "length" with the proper type
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "getTrackById(DOMString)" with the proper type
-PASS TextTrackList interface: calling getTrackById(DOMString) on document.createElement("video").textTracks with too few arguments must throw TypeError
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onchange" with the proper type
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onaddtrack" with the proper type
-PASS TextTrackList interface: document.createElement("video").textTracks must inherit property "onremovetrack" with the proper type
-PASS TextTrack interface: existence and properties of interface object
-PASS TextTrack interface object length
-PASS TextTrack interface object name
-PASS TextTrack interface: existence and properties of interface prototype object
-PASS TextTrack interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrack interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrack interface: attribute kind
-PASS TextTrack interface: attribute label
-PASS TextTrack interface: attribute language
-PASS TextTrack interface: attribute id
-FAIL TextTrack interface: attribute inBandMetadataTrackDispatchType assert_true: The prototype object must have a property "inBandMetadataTrackDispatchType" expected true got false
-PASS TextTrack interface: attribute mode
-PASS TextTrack interface: attribute cues
-PASS TextTrack interface: attribute activeCues
-PASS TextTrack interface: operation addCue(TextTrackCue)
-PASS TextTrack interface: operation removeCue(TextTrackCue)
-PASS TextTrack interface: attribute oncuechange
-PASS TextTrack must be primary interface of document.createElement("track").track
-PASS Stringification of document.createElement("track").track
-PASS TextTrack interface: document.createElement("track").track must inherit property "kind" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "label" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "language" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "id" with the proper type
-FAIL TextTrack interface: document.createElement("track").track must inherit property "inBandMetadataTrackDispatchType" with the proper type assert_inherits: property "inBandMetadataTrackDispatchType" not found in prototype chain
-PASS TextTrack interface: document.createElement("track").track must inherit property "mode" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "cues" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "activeCues" with the proper type
-PASS TextTrack interface: document.createElement("track").track must inherit property "addCue(TextTrackCue)" with the proper type
-PASS TextTrack interface: calling addCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
-PASS TextTrack interface: document.createElement("track").track must inherit property "removeCue(TextTrackCue)" with the proper type
-PASS TextTrack interface: calling removeCue(TextTrackCue) on document.createElement("track").track with too few arguments must throw TypeError
-PASS TextTrack interface: document.createElement("track").track must inherit property "oncuechange" with the proper type
-PASS TextTrackCueList interface: existence and properties of interface object
-PASS TextTrackCueList interface object length
-PASS TextTrackCueList interface object name
-PASS TextTrackCueList interface: existence and properties of interface prototype object
-PASS TextTrackCueList interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrackCueList interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrackCueList interface: attribute length
-PASS TextTrackCueList interface: operation getCueById(DOMString)
-PASS TextTrackCueList must be primary interface of document.createElement("video").addTextTrack("subtitles").cues
-PASS Stringification of document.createElement("video").addTextTrack("subtitles").cues
-PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "length" with the proper type
-PASS TextTrackCueList interface: document.createElement("video").addTextTrack("subtitles").cues must inherit property "getCueById(DOMString)" with the proper type
-PASS TextTrackCueList interface: calling getCueById(DOMString) on document.createElement("video").addTextTrack("subtitles").cues with too few arguments must throw TypeError
-PASS TextTrackCue interface: existence and properties of interface object
-PASS TextTrackCue interface object length
-PASS TextTrackCue interface object name
-PASS TextTrackCue interface: existence and properties of interface prototype object
-PASS TextTrackCue interface: existence and properties of interface prototype object's "constructor" property
-PASS TextTrackCue interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextTrackCue interface: attribute track
-PASS TextTrackCue interface: attribute id
-PASS TextTrackCue interface: attribute startTime
-PASS TextTrackCue interface: attribute endTime
-PASS TextTrackCue interface: attribute pauseOnExit
-PASS TextTrackCue interface: attribute onenter
-PASS TextTrackCue interface: attribute onexit
-PASS TimeRanges interface: existence and properties of interface object
-PASS TimeRanges interface object length
-PASS TimeRanges interface object name
-PASS TimeRanges interface: existence and properties of interface prototype object
-PASS TimeRanges interface: existence and properties of interface prototype object's "constructor" property
-PASS TimeRanges interface: existence and properties of interface prototype object's @@unscopables property
-PASS TimeRanges interface: attribute length
-PASS TimeRanges interface: operation start(unsigned long)
-PASS TimeRanges interface: operation end(unsigned long)
-PASS TimeRanges must be primary interface of document.createElement("video").buffered
-PASS Stringification of document.createElement("video").buffered
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "length" with the proper type
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "start(unsigned long)" with the proper type
-PASS TimeRanges interface: calling start(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
-PASS TimeRanges interface: document.createElement("video").buffered must inherit property "end(unsigned long)" with the proper type
-PASS TimeRanges interface: calling end(unsigned long) on document.createElement("video").buffered with too few arguments must throw TypeError
-PASS TrackEvent interface: existence and properties of interface object
-PASS TrackEvent interface object length
-PASS TrackEvent interface object name
-PASS TrackEvent interface: existence and properties of interface prototype object
-PASS TrackEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS TrackEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS TrackEvent interface: attribute track
-PASS TrackEvent must be primary interface of new TrackEvent("addtrack", {track:document.createElement("track").track})
-PASS Stringification of new TrackEvent("addtrack", {track:document.createElement("track").track})
-PASS TrackEvent interface: new TrackEvent("addtrack", {track:document.createElement("track").track}) must inherit property "track" with the proper type
-PASS ValidityState interface: existence and properties of interface object
-PASS ValidityState interface object length
-PASS ValidityState interface object name
-PASS ValidityState interface: existence and properties of interface prototype object
-PASS ValidityState interface: existence and properties of interface prototype object's "constructor" property
-PASS ValidityState interface: existence and properties of interface prototype object's @@unscopables property
-PASS ValidityState interface: attribute valueMissing
-PASS ValidityState interface: attribute typeMismatch
-PASS ValidityState interface: attribute patternMismatch
-PASS ValidityState interface: attribute tooLong
-PASS ValidityState interface: attribute tooShort
-PASS ValidityState interface: attribute rangeUnderflow
-PASS ValidityState interface: attribute rangeOverflow
-PASS ValidityState interface: attribute stepMismatch
-PASS ValidityState interface: attribute badInput
-PASS ValidityState interface: attribute customError
-PASS ValidityState interface: attribute valid
-PASS ValidityState must be primary interface of document.createElement("input").validity
-PASS Stringification of document.createElement("input").validity
-PASS ValidityState interface: document.createElement("input").validity must inherit property "valueMissing" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "typeMismatch" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "patternMismatch" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "tooLong" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "tooShort" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeUnderflow" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "rangeOverflow" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "stepMismatch" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "badInput" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "customError" with the proper type
-PASS ValidityState interface: document.createElement("input").validity must inherit property "valid" with the proper type
-PASS CanvasRenderingContext2D interface: existence and properties of interface object
-PASS CanvasRenderingContext2D interface object length
-PASS CanvasRenderingContext2D interface object name
-PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object
-PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
-PASS CanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
-PASS CanvasRenderingContext2D interface: attribute canvas
-PASS CanvasRenderingContext2D interface: operation save()
-PASS CanvasRenderingContext2D interface: operation restore()
-PASS CanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation rotate(unrestricted double)
-PASS CanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation getTransform()
-PASS CanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit)
-PASS CanvasRenderingContext2D interface: operation resetTransform()
-PASS CanvasRenderingContext2D interface: attribute globalAlpha
-PASS CanvasRenderingContext2D interface: attribute globalCompositeOperation
-PASS CanvasRenderingContext2D interface: attribute imageSmoothingEnabled
-PASS CanvasRenderingContext2D interface: attribute imageSmoothingQuality
-PASS CanvasRenderingContext2D interface: attribute strokeStyle
-PASS CanvasRenderingContext2D interface: attribute fillStyle
-PASS CanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
-PASS CanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
-PASS CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
-PASS CanvasRenderingContext2D interface: attribute shadowOffsetX
-PASS CanvasRenderingContext2D interface: attribute shadowOffsetY
-PASS CanvasRenderingContext2D interface: attribute shadowBlur
-PASS CanvasRenderingContext2D interface: attribute shadowColor
-PASS CanvasRenderingContext2D interface: attribute filter
-PASS CanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation beginPath()
-PASS CanvasRenderingContext2D interface: operation fill(CanvasFillRule)
-PASS CanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
-PASS CanvasRenderingContext2D interface: operation stroke()
-PASS CanvasRenderingContext2D interface: operation stroke(Path2D)
-PASS CanvasRenderingContext2D interface: operation clip(CanvasFillRule)
-PASS CanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
-FAIL CanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing
-PASS CanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
-PASS CanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
-PASS CanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Element)
-PASS CanvasRenderingContext2D interface: operation drawFocusIfNeeded(Path2D, Element)
-PASS CanvasRenderingContext2D interface: operation scrollPathIntoView()
-PASS CanvasRenderingContext2D interface: operation scrollPathIntoView(Path2D)
-PASS CanvasRenderingContext2D interface: operation fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation measureText(DOMString)
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation createImageData(long, long)
-PASS CanvasRenderingContext2D interface: operation createImageData(ImageData)
-PASS CanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
-PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
-PASS CanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
-PASS CanvasRenderingContext2D interface: attribute lineWidth
-PASS CanvasRenderingContext2D interface: attribute lineCap
-PASS CanvasRenderingContext2D interface: attribute lineJoin
-PASS CanvasRenderingContext2D interface: attribute miterLimit
-PASS CanvasRenderingContext2D interface: operation setLineDash([object Object])
-PASS CanvasRenderingContext2D interface: operation getLineDash()
-PASS CanvasRenderingContext2D interface: attribute lineDashOffset
-PASS CanvasRenderingContext2D interface: attribute font
-PASS CanvasRenderingContext2D interface: attribute textAlign
-PASS CanvasRenderingContext2D interface: attribute textBaseline
-PASS CanvasRenderingContext2D interface: attribute direction
-PASS CanvasRenderingContext2D interface: operation closePath()
-PASS CanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS CanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS CanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS CanvasRenderingContext2D must be primary interface of document.createElement("canvas").getContext("2d")
-PASS Stringification of document.createElement("canvas").getContext("2d")
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "canvas" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "save()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "restore()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scale(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling scale(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rotate(unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling rotate(unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "translate(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling translate(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setTransform(DOMMatrix2DInit)" with the proper type
-PASS CanvasRenderingContext2D interface: calling setTransform(DOMMatrix2DInit) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetTransform()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalAlpha" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "globalCompositeOperation" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingEnabled" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "imageSmoothingQuality" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeStyle" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillStyle" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createLinearGradient(double, double, double, double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createLinearGradient(double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createRadialGradient(double, double, double, double, double, double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createRadialGradient(double, double, double, double, double, double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createPattern(CanvasImageSource, DOMString)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource, DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "filter" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "beginPath()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fill(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fill(Path2D, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fill(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "stroke(Path2D)" with the proper type
-PASS CanvasRenderingContext2D interface: calling stroke(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip(Path2D, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling clip(Path2D, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-FAIL CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "resetClip()" with the proper type assert_inherits: property "resetClip" not found in prototype chain
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInPath(unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInStroke(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "isPointInStroke(Path2D, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling isPointInStroke(Path2D, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Element)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawFocusIfNeeded(Path2D, Element)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawFocusIfNeeded(Path2D, Element) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "scrollPathIntoView(Path2D)" with the proper type
-PASS CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "fillText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling fillText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling strokeText(DOMString, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "measureText(DOMString)" with the proper type
-PASS CanvasRenderingContext2D interface: calling measureText(DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createImageData(long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "createImageData(ImageData)" with the proper type
-PASS CanvasRenderingContext2D interface: calling createImageData(ImageData) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getImageData(long, long, long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling getImageData(long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "putImageData(ImageData, long, long, long, long, long, long)" with the proper type
-PASS CanvasRenderingContext2D interface: calling putImageData(ImageData, long, long, long, long, long, long) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineWidth" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineCap" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineJoin" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "miterLimit" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "setLineDash([object Object])" with the proper type
-PASS CanvasRenderingContext2D interface: calling setLineDash([object Object]) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getLineDash()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineDashOffset" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "font" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textAlign" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "textBaseline" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "direction" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "closePath()" with the proper type
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "moveTo(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling moveTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "lineTo(unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling lineTo(unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)" with the proper type
-PASS CanvasRenderingContext2D interface: calling rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
-PASS CanvasRenderingContext2D interface: calling arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)" with the proper type
-PASS CanvasRenderingContext2D interface: calling ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError
-PASS CanvasGradient interface: existence and properties of interface object
-PASS CanvasGradient interface object length
-PASS CanvasGradient interface object name
-PASS CanvasGradient interface: existence and properties of interface prototype object
-PASS CanvasGradient interface: existence and properties of interface prototype object's "constructor" property
-PASS CanvasGradient interface: existence and properties of interface prototype object's @@unscopables property
-PASS CanvasGradient interface: operation addColorStop(double, DOMString)
-PASS CanvasPattern interface: existence and properties of interface object
-PASS CanvasPattern interface object length
-PASS CanvasPattern interface object name
-PASS CanvasPattern interface: existence and properties of interface prototype object
-PASS CanvasPattern interface: existence and properties of interface prototype object's "constructor" property
-PASS CanvasPattern interface: existence and properties of interface prototype object's @@unscopables property
-PASS CanvasPattern interface: operation setTransform(DOMMatrix2DInit)
-PASS TextMetrics interface: existence and properties of interface object
-PASS TextMetrics interface object length
-PASS TextMetrics interface object name
-PASS TextMetrics interface: existence and properties of interface prototype object
-PASS TextMetrics interface: existence and properties of interface prototype object's "constructor" property
-PASS TextMetrics interface: existence and properties of interface prototype object's @@unscopables property
-PASS TextMetrics interface: attribute width
-PASS TextMetrics interface: attribute actualBoundingBoxLeft
-PASS TextMetrics interface: attribute actualBoundingBoxRight
-PASS TextMetrics interface: attribute fontBoundingBoxAscent
-PASS TextMetrics interface: attribute fontBoundingBoxDescent
-PASS TextMetrics interface: attribute actualBoundingBoxAscent
-PASS TextMetrics interface: attribute actualBoundingBoxDescent
-PASS TextMetrics interface: attribute emHeightAscent
-PASS TextMetrics interface: attribute emHeightDescent
-PASS TextMetrics interface: operation getBaselines()
-PASS ImageData interface: existence and properties of interface object
-PASS ImageData interface object length
-PASS ImageData interface object name
-PASS ImageData interface: existence and properties of interface prototype object
-PASS ImageData interface: existence and properties of interface prototype object's "constructor" property
-PASS ImageData interface: existence and properties of interface prototype object's @@unscopables property
-PASS ImageData interface: attribute width
-PASS ImageData interface: attribute height
-PASS ImageData interface: attribute data
-PASS Path2D interface: existence and properties of interface object
-PASS Path2D interface object length
-PASS Path2D interface object name
-PASS Path2D interface: existence and properties of interface prototype object
-PASS Path2D interface: existence and properties of interface prototype object's "constructor" property
-PASS Path2D interface: existence and properties of interface prototype object's @@unscopables property
-PASS Path2D interface: operation addPath(Path2D, DOMMatrix2DInit)
-PASS Path2D interface: operation closePath()
-PASS Path2D interface: operation moveTo(unrestricted double, unrestricted double)
-PASS Path2D interface: operation lineTo(unrestricted double, unrestricted double)
-PASS Path2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Path2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Path2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Path2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS Path2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS Path2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS ImageBitmapRenderingContext interface: existence and properties of interface object
-PASS ImageBitmapRenderingContext interface object length
-PASS ImageBitmapRenderingContext interface object name
-PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object
-PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's "constructor" property
-PASS ImageBitmapRenderingContext interface: existence and properties of interface prototype object's @@unscopables property
-PASS ImageBitmapRenderingContext interface: attribute canvas
-PASS ImageBitmapRenderingContext interface: operation transferFromImageBitmap(ImageBitmap)
-PASS OffscreenCanvas interface: existence and properties of interface object
-PASS OffscreenCanvas interface object length
-PASS OffscreenCanvas interface object name
-PASS OffscreenCanvas interface: existence and properties of interface prototype object
-PASS OffscreenCanvas interface: existence and properties of interface prototype object's "constructor" property
-PASS OffscreenCanvas interface: existence and properties of interface prototype object's @@unscopables property
-PASS OffscreenCanvas interface: attribute width
-PASS OffscreenCanvas interface: attribute height
-PASS OffscreenCanvas interface: operation getContext(OffscreenRenderingContextId, any)
-PASS OffscreenCanvas interface: operation transferToImageBitmap()
-PASS OffscreenCanvas interface: operation convertToBlob(ImageEncodeOptions)
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface object
-PASS OffscreenCanvasRenderingContext2D interface object length
-PASS OffscreenCanvasRenderingContext2D interface object name
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's "constructor" property
-PASS OffscreenCanvasRenderingContext2D interface: existence and properties of interface prototype object's @@unscopables property
-PASS OffscreenCanvasRenderingContext2D interface: operation commit()
-PASS OffscreenCanvasRenderingContext2D interface: attribute canvas
-PASS OffscreenCanvasRenderingContext2D interface: operation save()
-PASS OffscreenCanvasRenderingContext2D interface: operation restore()
-PASS OffscreenCanvasRenderingContext2D interface: operation scale(unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation rotate(unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation translate(unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation transform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-FAIL OffscreenCanvasRenderingContext2D interface: operation getTransform() assert_own_property: interface prototype object missing non-static operation expected property "getTransform" missing
-FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double) assert_equals: property has wrong .length expected 0 but got 6
-FAIL OffscreenCanvasRenderingContext2D interface: operation setTransform(DOMMatrix2DInit) assert_equals: property has wrong .length expected 0 but got 6
-PASS OffscreenCanvasRenderingContext2D interface: operation resetTransform()
-PASS OffscreenCanvasRenderingContext2D interface: attribute globalAlpha
-PASS OffscreenCanvasRenderingContext2D interface: attribute globalCompositeOperation
-PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled
-PASS OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingQuality
-PASS OffscreenCanvasRenderingContext2D interface: attribute strokeStyle
-PASS OffscreenCanvasRenderingContext2D interface: attribute fillStyle
-PASS OffscreenCanvasRenderingContext2D interface: operation createLinearGradient(double, double, double, double)
-PASS OffscreenCanvasRenderingContext2D interface: operation createRadialGradient(double, double, double, double, double, double)
-PASS OffscreenCanvasRenderingContext2D interface: operation createPattern(CanvasImageSource, DOMString)
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetX
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowOffsetY
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowBlur
-PASS OffscreenCanvasRenderingContext2D interface: attribute shadowColor
-PASS OffscreenCanvasRenderingContext2D interface: attribute filter
-PASS OffscreenCanvasRenderingContext2D interface: operation clearRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation fillRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation strokeRect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation beginPath()
-PASS OffscreenCanvasRenderingContext2D interface: operation fill(CanvasFillRule)
-PASS OffscreenCanvasRenderingContext2D interface: operation fill(Path2D, CanvasFillRule)
-PASS OffscreenCanvasRenderingContext2D interface: operation stroke()
-PASS OffscreenCanvasRenderingContext2D interface: operation stroke(Path2D)
-PASS OffscreenCanvasRenderingContext2D interface: operation clip(CanvasFillRule)
-PASS OffscreenCanvasRenderingContext2D interface: operation clip(Path2D, CanvasFillRule)
-FAIL OffscreenCanvasRenderingContext2D interface: operation resetClip() assert_own_property: interface prototype object missing non-static operation expected property "resetClip" missing
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(unrestricted double, unrestricted double, CanvasFillRule)
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInPath(Path2D, unrestricted double, unrestricted double, CanvasFillRule)
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation isPointInStroke(Path2D, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation drawImage(CanvasImageSource, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(long, long)
-PASS OffscreenCanvasRenderingContext2D interface: operation createImageData(ImageData)
-PASS OffscreenCanvasRenderingContext2D interface: operation getImageData(long, long, long, long)
-PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long)
-PASS OffscreenCanvasRenderingContext2D interface: operation putImageData(ImageData, long, long, long, long, long, long)
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineWidth
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineCap
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineJoin
-PASS OffscreenCanvasRenderingContext2D interface: attribute miterLimit
-PASS OffscreenCanvasRenderingContext2D interface: operation setLineDash([object Object])
-PASS OffscreenCanvasRenderingContext2D interface: operation getLineDash()
-PASS OffscreenCanvasRenderingContext2D interface: attribute lineDashOffset
-PASS OffscreenCanvasRenderingContext2D interface: operation closePath()
-PASS OffscreenCanvasRenderingContext2D interface: operation moveTo(unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation lineTo(unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation quadraticCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation bezierCurveTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation arcTo(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation rect(unrestricted double, unrestricted double, unrestricted double, unrestricted double)
-PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
-PASS CustomElementRegistry interface: existence and properties of interface object
-PASS CustomElementRegistry interface object length
-PASS CustomElementRegistry interface object name
-PASS CustomElementRegistry interface: existence and properties of interface prototype object
-PASS CustomElementRegistry interface: existence and properties of interface prototype object's "constructor" property
-PASS CustomElementRegistry interface: existence and properties of interface prototype object's @@unscopables property
-PASS CustomElementRegistry interface: operation define(DOMString, Function, ElementDefinitionOptions)
-PASS CustomElementRegistry interface: operation get(DOMString)
-PASS CustomElementRegistry interface: operation whenDefined(DOMString)
-PASS CustomElementRegistry interface: operation upgrade(Node)
-PASS DataTransfer interface: existence and properties of interface object
-PASS DataTransfer interface object length
-PASS DataTransfer interface object name
-PASS DataTransfer interface: existence and properties of interface prototype object
-PASS DataTransfer interface: existence and properties of interface prototype object's "constructor" property
-PASS DataTransfer interface: existence and properties of interface prototype object's @@unscopables property
-PASS DataTransfer interface: attribute dropEffect
-PASS DataTransfer interface: attribute effectAllowed
-PASS DataTransfer interface: attribute items
-PASS DataTransfer interface: operation setDragImage(Element, long, long)
-PASS DataTransfer interface: attribute types
-PASS DataTransfer interface: operation getData(DOMString)
-PASS DataTransfer interface: operation setData(DOMString, DOMString)
-PASS DataTransfer interface: operation clearData(DOMString)
-PASS DataTransfer interface: attribute files
-PASS DataTransferItemList interface: existence and properties of interface object
-PASS DataTransferItemList interface object length
-PASS DataTransferItemList interface object name
-PASS DataTransferItemList interface: existence and properties of interface prototype object
-PASS DataTransferItemList interface: existence and properties of interface prototype object's "constructor" property
-PASS DataTransferItemList interface: existence and properties of interface prototype object's @@unscopables property
-PASS DataTransferItemList interface: attribute length
-PASS DataTransferItemList interface: operation add(DOMString, DOMString)
-PASS DataTransferItemList interface: operation add(File)
-PASS DataTransferItemList interface: operation remove(unsigned long)
-PASS DataTransferItemList interface: operation clear()
-PASS DataTransferItem interface: existence and properties of interface object
-PASS DataTransferItem interface object length
-PASS DataTransferItem interface object name
-PASS DataTransferItem interface: existence and properties of interface prototype object
-PASS DataTransferItem interface: existence and properties of interface prototype object's "constructor" property
-PASS DataTransferItem interface: existence and properties of interface prototype object's @@unscopables property
-PASS DataTransferItem interface: attribute kind
-PASS DataTransferItem interface: attribute type
-PASS DataTransferItem interface: operation getAsString(FunctionStringCallback)
-PASS DataTransferItem interface: operation getAsFile()
-PASS DragEvent interface: existence and properties of interface object
-PASS DragEvent interface object length
-PASS DragEvent interface object name
-PASS DragEvent interface: existence and properties of interface prototype object
-PASS DragEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS DragEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS DragEvent interface: attribute dataTransfer
-PASS BarProp interface: existence and properties of interface object
-PASS BarProp interface object length
-PASS BarProp interface object name
-PASS BarProp interface: existence and properties of interface prototype object
-PASS BarProp interface: existence and properties of interface prototype object's "constructor" property
-PASS BarProp interface: existence and properties of interface prototype object's @@unscopables property
-PASS BarProp interface: attribute visible
-PASS History interface: existence and properties of interface object
-PASS History interface object length
-PASS History interface object name
-PASS History interface: existence and properties of interface prototype object
-PASS History interface: existence and properties of interface prototype object's "constructor" property
-PASS History interface: existence and properties of interface prototype object's @@unscopables property
-FAIL History interface: attribute index assert_true: The prototype object must have a property "index" expected true got false
-PASS History interface: attribute length
-PASS History interface: attribute scrollRestoration
-PASS History interface: attribute state
-PASS History interface: operation go(long)
-PASS History interface: operation back()
-PASS History interface: operation forward()
-PASS History interface: operation pushState(any, DOMString, USVString)
-PASS History interface: operation replaceState(any, DOMString, USVString)
-PASS History must be primary interface of window.history
-PASS Stringification of window.history
-FAIL History interface: window.history must inherit property "index" with the proper type assert_inherits: property "index" not found in prototype chain
-PASS History interface: window.history must inherit property "length" with the proper type
-PASS History interface: window.history must inherit property "scrollRestoration" with the proper type
-PASS History interface: window.history must inherit property "state" with the proper type
-PASS History interface: window.history must inherit property "go(long)" with the proper type
-PASS History interface: calling go(long) on window.history with too few arguments must throw TypeError
-PASS History interface: window.history must inherit property "back()" with the proper type
-PASS History interface: window.history must inherit property "forward()" with the proper type
-PASS History interface: window.history must inherit property "pushState(any, DOMString, USVString)" with the proper type
-PASS History interface: calling pushState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
-PASS History interface: window.history must inherit property "replaceState(any, DOMString, USVString)" with the proper type
-PASS History interface: calling replaceState(any, DOMString, USVString) on window.history with too few arguments must throw TypeError
-PASS Location interface: existence and properties of interface object
-PASS Location interface object length
-PASS Location interface object name
-PASS Location interface: existence and properties of interface prototype object
-PASS Location interface: existence and properties of interface prototype object's "constructor" property
-PASS Location interface: existence and properties of interface prototype object's @@unscopables property
-FAIL Location interface: stringifier assert_own_property: interface prototype object missing non-static operation expected property "toString" missing
-PASS Location must be primary interface of window.location
-PASS Stringification of window.location
-FAIL Location interface: window.location must have own property "href" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Location interface: window.location must have own property "origin"
-PASS Location interface: window.location must have own property "protocol"
-PASS Location interface: window.location must have own property "host"
-PASS Location interface: window.location must have own property "hostname"
-PASS Location interface: window.location must have own property "port"
-PASS Location interface: window.location must have own property "pathname"
-PASS Location interface: window.location must have own property "search"
-PASS Location interface: window.location must have own property "hash"
-PASS Location interface: window.location must have own property "assign"
-PASS Location interface: calling assign(USVString) on window.location with too few arguments must throw TypeError
-PASS Location interface: window.location must have own property "replace"
-PASS Location interface: calling replace(USVString) on window.location with too few arguments must throw TypeError
-PASS Location interface: window.location must have own property "reload"
-PASS Location interface: window.location must have own property "ancestorOrigins"
-PASS PopStateEvent interface: existence and properties of interface object
-PASS PopStateEvent interface object length
-PASS PopStateEvent interface object name
-PASS PopStateEvent interface: existence and properties of interface prototype object
-PASS PopStateEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS PopStateEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS PopStateEvent interface: attribute state
-PASS PopStateEvent must be primary interface of new PopStateEvent("popstate", { data: {} })
-PASS Stringification of new PopStateEvent("popstate", { data: {} })
-PASS PopStateEvent interface: new PopStateEvent("popstate", { data: {} }) must inherit property "state" with the proper type
-PASS HashChangeEvent interface: existence and properties of interface object
-PASS HashChangeEvent interface object length
-PASS HashChangeEvent interface object name
-PASS HashChangeEvent interface: existence and properties of interface prototype object
-PASS HashChangeEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS HashChangeEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS HashChangeEvent interface: attribute oldURL
-PASS HashChangeEvent interface: attribute newURL
-PASS PageTransitionEvent interface: existence and properties of interface object
-PASS PageTransitionEvent interface object length
-PASS PageTransitionEvent interface object name
-PASS PageTransitionEvent interface: existence and properties of interface prototype object
-PASS PageTransitionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS PageTransitionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS PageTransitionEvent interface: attribute persisted
-PASS BeforeUnloadEvent interface: existence and properties of interface object
-PASS BeforeUnloadEvent interface object length
-PASS BeforeUnloadEvent interface object name
-PASS BeforeUnloadEvent interface: existence and properties of interface prototype object
-PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS BeforeUnloadEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS BeforeUnloadEvent interface: attribute returnValue
-PASS ApplicationCache interface: existence and properties of interface object
-PASS ApplicationCache interface object length
-PASS ApplicationCache interface object name
-PASS ApplicationCache interface: existence and properties of interface prototype object
-PASS ApplicationCache interface: existence and properties of interface prototype object's "constructor" property
-PASS ApplicationCache interface: existence and properties of interface prototype object's @@unscopables property
-PASS ApplicationCache interface: constant UNCACHED on interface object
-PASS ApplicationCache interface: constant UNCACHED on interface prototype object
-PASS ApplicationCache interface: constant IDLE on interface object
-PASS ApplicationCache interface: constant IDLE on interface prototype object
-PASS ApplicationCache interface: constant CHECKING on interface object
-PASS ApplicationCache interface: constant CHECKING on interface prototype object
-PASS ApplicationCache interface: constant DOWNLOADING on interface object
-PASS ApplicationCache interface: constant DOWNLOADING on interface prototype object
-PASS ApplicationCache interface: constant UPDATEREADY on interface object
-PASS ApplicationCache interface: constant UPDATEREADY on interface prototype object
-PASS ApplicationCache interface: constant OBSOLETE on interface object
-PASS ApplicationCache interface: constant OBSOLETE on interface prototype object
-PASS ApplicationCache interface: attribute status
-PASS ApplicationCache interface: operation update()
-PASS ApplicationCache interface: operation abort()
-PASS ApplicationCache interface: operation swapCache()
-PASS ApplicationCache interface: attribute onchecking
-PASS ApplicationCache interface: attribute onerror
-PASS ApplicationCache interface: attribute onnoupdate
-PASS ApplicationCache interface: attribute ondownloading
-PASS ApplicationCache interface: attribute onprogress
-PASS ApplicationCache interface: attribute onupdateready
-PASS ApplicationCache interface: attribute oncached
-PASS ApplicationCache interface: attribute onobsolete
-PASS ApplicationCache must be primary interface of window.applicationCache
-PASS Stringification of window.applicationCache
-PASS ApplicationCache interface: window.applicationCache must inherit property "UNCACHED" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "IDLE" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "CHECKING" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "DOWNLOADING" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "UPDATEREADY" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "OBSOLETE" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "status" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "update()" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "abort()" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "swapCache()" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onchecking" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onerror" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onnoupdate" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onprogress" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onupdateready" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "oncached" with the proper type
-PASS ApplicationCache interface: window.applicationCache must inherit property "onobsolete" with the proper type
-PASS ErrorEvent interface: existence and properties of interface object
-PASS ErrorEvent interface object length
-PASS ErrorEvent interface object name
-PASS ErrorEvent interface: existence and properties of interface prototype object
-PASS ErrorEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS ErrorEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS ErrorEvent interface: attribute message
-PASS ErrorEvent interface: attribute filename
-PASS ErrorEvent interface: attribute lineno
-PASS ErrorEvent interface: attribute colno
-PASS ErrorEvent interface: attribute error
-PASS PromiseRejectionEvent interface: existence and properties of interface object
-PASS PromiseRejectionEvent interface object length
-PASS PromiseRejectionEvent interface object name
-PASS PromiseRejectionEvent interface: existence and properties of interface prototype object
-PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS PromiseRejectionEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS PromiseRejectionEvent interface: attribute promise
-PASS PromiseRejectionEvent interface: attribute reason
-PASS Navigator interface: existence and properties of interface object
-PASS Navigator interface object length
-PASS Navigator interface object name
-PASS Navigator interface: existence and properties of interface prototype object
-PASS Navigator interface: existence and properties of interface prototype object's "constructor" property
-PASS Navigator interface: existence and properties of interface prototype object's @@unscopables property
-PASS Navigator interface: attribute appCodeName
-PASS Navigator interface: attribute appName
-PASS Navigator interface: attribute appVersion
-PASS Navigator interface: attribute platform
-PASS Navigator interface: attribute product
-PASS Navigator interface: attribute productSub
-PASS Navigator interface: attribute userAgent
-PASS Navigator interface: attribute vendor
-PASS Navigator interface: attribute vendorSub
-FAIL Navigator interface: operation taintEnabled() assert_own_property: interface prototype object missing non-static operation expected property "taintEnabled" missing
-FAIL Navigator interface: attribute oscpu assert_true: The prototype object must have a property "oscpu" expected true got false
-PASS Navigator interface: attribute language
-PASS Navigator interface: attribute languages
-PASS Navigator interface: attribute onLine
-PASS Navigator interface: operation registerProtocolHandler(DOMString, USVString, DOMString)
-PASS Navigator interface: operation unregisterProtocolHandler(DOMString, USVString)
-PASS Navigator interface: attribute cookieEnabled
-PASS Navigator interface: attribute plugins
-PASS Navigator interface: attribute mimeTypes
-PASS Navigator interface: operation javaEnabled()
-PASS Navigator interface: attribute hardwareConcurrency
-PASS Navigator must be primary interface of window.navigator
-PASS Stringification of window.navigator
-PASS Navigator interface: window.navigator must inherit property "appCodeName" with the proper type
-PASS Navigator interface: window.navigator must inherit property "appName" with the proper type
-PASS Navigator interface: window.navigator must inherit property "appVersion" with the proper type
-PASS Navigator interface: window.navigator must inherit property "platform" with the proper type
-PASS Navigator interface: window.navigator must inherit property "product" with the proper type
-PASS Navigator interface: window.navigator must inherit property "productSub" with the proper type
-PASS Navigator interface: window.navigator must inherit property "userAgent" with the proper type
-PASS Navigator interface: window.navigator must inherit property "vendor" with the proper type
-PASS Navigator interface: window.navigator must inherit property "vendorSub" with the proper type
-FAIL Navigator interface: window.navigator must inherit property "taintEnabled()" with the proper type assert_inherits: property "taintEnabled" not found in prototype chain
-FAIL Navigator interface: window.navigator must inherit property "oscpu" with the proper type assert_inherits: property "oscpu" not found in prototype chain
-PASS Navigator interface: window.navigator must inherit property "language" with the proper type
-PASS Navigator interface: window.navigator must inherit property "languages" with the proper type
-PASS Navigator interface: window.navigator must inherit property "onLine" with the proper type
-PASS Navigator interface: window.navigator must inherit property "registerProtocolHandler(DOMString, USVString, DOMString)" with the proper type
-PASS Navigator interface: calling registerProtocolHandler(DOMString, USVString, DOMString) on window.navigator with too few arguments must throw TypeError
-PASS Navigator interface: window.navigator must inherit property "unregisterProtocolHandler(DOMString, USVString)" with the proper type
-PASS Navigator interface: calling unregisterProtocolHandler(DOMString, USVString) on window.navigator with too few arguments must throw TypeError
-PASS Navigator interface: window.navigator must inherit property "cookieEnabled" with the proper type
-PASS Navigator interface: window.navigator must inherit property "plugins" with the proper type
-PASS Navigator interface: window.navigator must inherit property "mimeTypes" with the proper type
-PASS Navigator interface: window.navigator must inherit property "javaEnabled()" with the proper type
-PASS Navigator interface: window.navigator must inherit property "hardwareConcurrency" with the proper type
-PASS PluginArray interface: existence and properties of interface object
-PASS PluginArray interface object length
-PASS PluginArray interface object name
-PASS PluginArray interface: existence and properties of interface prototype object
-PASS PluginArray interface: existence and properties of interface prototype object's "constructor" property
-PASS PluginArray interface: existence and properties of interface prototype object's @@unscopables property
-PASS PluginArray interface: operation refresh(boolean)
-PASS PluginArray interface: attribute length
-PASS PluginArray interface: operation item(unsigned long)
-PASS PluginArray interface: operation namedItem(DOMString)
-PASS MimeTypeArray interface: existence and properties of interface object
-PASS MimeTypeArray interface object length
-PASS MimeTypeArray interface object name
-PASS MimeTypeArray interface: existence and properties of interface prototype object
-PASS MimeTypeArray interface: existence and properties of interface prototype object's "constructor" property
-PASS MimeTypeArray interface: existence and properties of interface prototype object's @@unscopables property
-PASS MimeTypeArray interface: attribute length
-PASS MimeTypeArray interface: operation item(unsigned long)
-PASS MimeTypeArray interface: operation namedItem(DOMString)
-PASS Plugin interface: existence and properties of interface object
-PASS Plugin interface object length
-PASS Plugin interface object name
-PASS Plugin interface: existence and properties of interface prototype object
-PASS Plugin interface: existence and properties of interface prototype object's "constructor" property
-PASS Plugin interface: existence and properties of interface prototype object's @@unscopables property
-PASS Plugin interface: attribute name
-PASS Plugin interface: attribute description
-PASS Plugin interface: attribute filename
-PASS Plugin interface: attribute length
-PASS Plugin interface: operation item(unsigned long)
-PASS Plugin interface: operation namedItem(DOMString)
-PASS MimeType interface: existence and properties of interface object
-PASS MimeType interface object length
-PASS MimeType interface object name
-PASS MimeType interface: existence and properties of interface prototype object
-PASS MimeType interface: existence and properties of interface prototype object's "constructor" property
-PASS MimeType interface: existence and properties of interface prototype object's @@unscopables property
-PASS MimeType interface: attribute type
-PASS MimeType interface: attribute description
-PASS MimeType interface: attribute suffixes
-PASS MimeType interface: attribute enabledPlugin
-PASS ImageBitmap interface: existence and properties of interface object
-PASS ImageBitmap interface object length
-PASS ImageBitmap interface object name
-PASS ImageBitmap interface: existence and properties of interface prototype object
-PASS ImageBitmap interface: existence and properties of interface prototype object's "constructor" property
-PASS ImageBitmap interface: existence and properties of interface prototype object's @@unscopables property
-PASS ImageBitmap interface: attribute width
-PASS ImageBitmap interface: attribute height
-PASS ImageBitmap interface: operation close()
-PASS MessageEvent interface: existence and properties of interface object
-PASS MessageEvent interface object length
-PASS MessageEvent interface object name
-PASS MessageEvent interface: existence and properties of interface prototype object
-PASS MessageEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS MessageEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS MessageEvent interface: attribute data
-PASS MessageEvent interface: attribute origin
-PASS MessageEvent interface: attribute lastEventId
-PASS MessageEvent interface: attribute source
-PASS MessageEvent interface: attribute ports
-PASS MessageEvent interface: operation initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])
-PASS MessageEvent must be primary interface of new MessageEvent("message", { data: 5 })
-PASS Stringification of new MessageEvent("message", { data: 5 })
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "data" with the proper type
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "origin" with the proper type
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "lastEventId" with the proper type
-FAIL MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "source" with the proper type Unrecognized type WindowProxy
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "ports" with the proper type
-PASS MessageEvent interface: new MessageEvent("message", { data: 5 }) must inherit property "initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object])" with the proper type
-PASS MessageEvent interface: calling initMessageEvent(DOMString, boolean, boolean, any, USVString, DOMString, MessageEventSource, [object Object]) on new MessageEvent("message", { data: 5 }) with too few arguments must throw TypeError
-PASS EventSource interface: existence and properties of interface object
-PASS EventSource interface object length
-PASS EventSource interface object name
-PASS EventSource interface: existence and properties of interface prototype object
-PASS EventSource interface: existence and properties of interface prototype object's "constructor" property
-PASS EventSource interface: existence and properties of interface prototype object's @@unscopables property
-PASS EventSource interface: attribute url
-PASS EventSource interface: attribute withCredentials
-PASS EventSource interface: constant CONNECTING on interface object
-PASS EventSource interface: constant CONNECTING on interface prototype object
-PASS EventSource interface: constant OPEN on interface object
-PASS EventSource interface: constant OPEN on interface prototype object
-PASS EventSource interface: constant CLOSED on interface object
-PASS EventSource interface: constant CLOSED on interface prototype object
-PASS EventSource interface: attribute readyState
-PASS EventSource interface: attribute onopen
-PASS EventSource interface: attribute onmessage
-PASS EventSource interface: attribute onerror
-PASS EventSource interface: operation close()
-PASS WebSocket interface: existence and properties of interface object
-PASS WebSocket interface object length
-PASS WebSocket interface object name
-PASS WebSocket interface: existence and properties of interface prototype object
-PASS WebSocket interface: existence and properties of interface prototype object's "constructor" property
-PASS WebSocket interface: existence and properties of interface prototype object's @@unscopables property
-PASS WebSocket interface: attribute url
-PASS WebSocket interface: constant CONNECTING on interface object
-PASS WebSocket interface: constant CONNECTING on interface prototype object
-PASS WebSocket interface: constant OPEN on interface object
-PASS WebSocket interface: constant OPEN on interface prototype object
-PASS WebSocket interface: constant CLOSING on interface object
-PASS WebSocket interface: constant CLOSING on interface prototype object
-PASS WebSocket interface: constant CLOSED on interface object
-PASS WebSocket interface: constant CLOSED on interface prototype object
-PASS WebSocket interface: attribute readyState
-PASS WebSocket interface: attribute bufferedAmount
-PASS WebSocket interface: attribute onopen
-PASS WebSocket interface: attribute onerror
-PASS WebSocket interface: attribute onclose
-PASS WebSocket interface: attribute extensions
-PASS WebSocket interface: attribute protocol
-PASS WebSocket interface: operation close(unsigned short, USVString)
-PASS WebSocket interface: attribute onmessage
-PASS WebSocket interface: attribute binaryType
-PASS WebSocket interface: operation send(USVString)
-PASS WebSocket interface: operation send(Blob)
-PASS WebSocket interface: operation send(ArrayBuffer)
-PASS WebSocket interface: operation send(ArrayBufferView)
-PASS WebSocket must be primary interface of new WebSocket("wss://foo")
-PASS Stringification of new WebSocket("wss://foo")
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "url" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "CONNECTING" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "OPEN" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "CLOSING" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "CLOSED" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "readyState" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "bufferedAmount" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "onopen" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "onerror" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "onclose" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "extensions" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "protocol" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "close(unsigned short, USVString)" with the proper type
-PASS WebSocket interface: calling close(unsigned short, USVString) on new WebSocket("wss://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "onmessage" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "binaryType" with the proper type
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "send(USVString)" with the proper type
-PASS WebSocket interface: calling send(USVString) on new WebSocket("wss://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "send(Blob)" with the proper type
-PASS WebSocket interface: calling send(Blob) on new WebSocket("wss://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "send(ArrayBuffer)" with the proper type
-PASS WebSocket interface: calling send(ArrayBuffer) on new WebSocket("wss://foo") with too few arguments must throw TypeError
-PASS WebSocket interface: new WebSocket("wss://foo") must inherit property "send(ArrayBufferView)" with the proper type
-PASS WebSocket interface: calling send(ArrayBufferView) on new WebSocket("wss://foo") with too few arguments must throw TypeError
-PASS CloseEvent interface: existence and properties of interface object
-PASS CloseEvent interface object length
-PASS CloseEvent interface object name
-PASS CloseEvent interface: existence and properties of interface prototype object
-PASS CloseEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS CloseEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS CloseEvent interface: attribute wasClean
-PASS CloseEvent interface: attribute code
-PASS CloseEvent interface: attribute reason
-PASS CloseEvent must be primary interface of new CloseEvent("close")
-PASS Stringification of new CloseEvent("close")
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "wasClean" with the proper type
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "code" with the proper type
-PASS CloseEvent interface: new CloseEvent("close") must inherit property "reason" with the proper type
-PASS MessageChannel interface: existence and properties of interface object
-PASS MessageChannel interface object length
-PASS MessageChannel interface object name
-PASS MessageChannel interface: existence and properties of interface prototype object
-PASS MessageChannel interface: existence and properties of interface prototype object's "constructor" property
-PASS MessageChannel interface: existence and properties of interface prototype object's @@unscopables property
-PASS MessageChannel interface: attribute port1
-PASS MessageChannel interface: attribute port2
-PASS MessagePort interface: existence and properties of interface object
-PASS MessagePort interface object length
-PASS MessagePort interface object name
-PASS MessagePort interface: existence and properties of interface prototype object
-PASS MessagePort interface: existence and properties of interface prototype object's "constructor" property
-PASS MessagePort interface: existence and properties of interface prototype object's @@unscopables property
-PASS MessagePort interface: operation postMessage(any, [object Object])
-PASS MessagePort interface: operation start()
-PASS MessagePort interface: operation close()
-PASS MessagePort interface: attribute onmessage
-PASS MessagePort interface: attribute onmessageerror
-PASS BroadcastChannel interface: existence and properties of interface object
-PASS BroadcastChannel interface object length
-PASS BroadcastChannel interface object name
-PASS BroadcastChannel interface: existence and properties of interface prototype object
-PASS BroadcastChannel interface: existence and properties of interface prototype object's "constructor" property
-PASS BroadcastChannel interface: existence and properties of interface prototype object's @@unscopables property
-PASS BroadcastChannel interface: attribute name
-PASS BroadcastChannel interface: operation postMessage(any)
-PASS BroadcastChannel interface: operation close()
-PASS BroadcastChannel interface: attribute onmessage
-PASS BroadcastChannel interface: attribute onmessageerror
-PASS WorkerGlobalScope interface: existence and properties of interface object
-PASS DedicatedWorkerGlobalScope interface: existence and properties of interface object
-PASS SharedWorkerGlobalScope interface: existence and properties of interface object
-PASS Worker interface: existence and properties of interface object
-PASS Worker interface object length
-PASS Worker interface object name
-PASS Worker interface: existence and properties of interface prototype object
-PASS Worker interface: existence and properties of interface prototype object's "constructor" property
-PASS Worker interface: existence and properties of interface prototype object's @@unscopables property
-PASS Worker interface: operation terminate()
-PASS Worker interface: operation postMessage(any, [object Object])
-PASS Worker interface: attribute onmessage
-FAIL Worker interface: attribute onmessageerror assert_true: The prototype object must have a property "onmessageerror" expected true got false
-PASS Worker interface: attribute onerror
-PASS SharedWorker interface: existence and properties of interface object
-PASS SharedWorker interface object length
-PASS SharedWorker interface object name
-PASS SharedWorker interface: existence and properties of interface prototype object
-PASS SharedWorker interface: existence and properties of interface prototype object's "constructor" property
-PASS SharedWorker interface: existence and properties of interface prototype object's @@unscopables property
-PASS SharedWorker interface: attribute port
-PASS SharedWorker interface: attribute onerror
-PASS WorkerNavigator interface: existence and properties of interface object
-PASS WorkerLocation interface: existence and properties of interface object
-PASS Storage interface: existence and properties of interface object
-PASS Storage interface object length
-PASS Storage interface object name
-PASS Storage interface: existence and properties of interface prototype object
-PASS Storage interface: existence and properties of interface prototype object's "constructor" property
-PASS Storage interface: existence and properties of interface prototype object's @@unscopables property
-PASS Storage interface: attribute length
-PASS Storage interface: operation key(unsigned long)
-PASS Storage interface: operation getItem(DOMString)
-PASS Storage interface: operation setItem(DOMString, DOMString)
-PASS Storage interface: operation removeItem(DOMString)
-PASS Storage interface: operation clear()
-PASS StorageEvent interface: existence and properties of interface object
-PASS StorageEvent interface object length
-PASS StorageEvent interface object name
-PASS StorageEvent interface: existence and properties of interface prototype object
-PASS StorageEvent interface: existence and properties of interface prototype object's "constructor" property
-PASS StorageEvent interface: existence and properties of interface prototype object's @@unscopables property
-PASS StorageEvent interface: attribute key
-PASS StorageEvent interface: attribute oldValue
-PASS StorageEvent interface: attribute newValue
-PASS StorageEvent interface: attribute url
-PASS StorageEvent interface: attribute storageArea
-PASS Stringification of window.external
-PASS External interface: window.external must inherit property "AddSearchProvider()" with the proper type
-PASS External interface: window.external must inherit property "IsSearchProviderInstalled()" with the proper type
-PASS SVGElement interface: attribute onabort
-PASS SVGElement interface: attribute onauxclick
-PASS SVGElement interface: attribute onblur
-PASS SVGElement interface: attribute oncancel
-PASS SVGElement interface: attribute oncanplay
-PASS SVGElement interface: attribute oncanplaythrough
-PASS SVGElement interface: attribute onchange
-PASS SVGElement interface: attribute onclick
-PASS SVGElement interface: attribute onclose
-PASS SVGElement interface: attribute oncontextmenu
-PASS SVGElement interface: attribute oncuechange
-PASS SVGElement interface: attribute ondblclick
-PASS SVGElement interface: attribute ondrag
-PASS SVGElement interface: attribute ondragend
-PASS SVGElement interface: attribute ondragenter
-FAIL SVGElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
-PASS SVGElement interface: attribute ondragleave
-PASS SVGElement interface: attribute ondragover
-PASS SVGElement interface: attribute ondragstart
-PASS SVGElement interface: attribute ondrop
-PASS SVGElement interface: attribute ondurationchange
-PASS SVGElement interface: attribute onemptied
-PASS SVGElement interface: attribute onended
-PASS SVGElement interface: attribute onerror
-PASS SVGElement interface: attribute onfocus
-PASS SVGElement interface: attribute oninput
-PASS SVGElement interface: attribute oninvalid
-PASS SVGElement interface: attribute onkeydown
-PASS SVGElement interface: attribute onkeypress
-PASS SVGElement interface: attribute onkeyup
-PASS SVGElement interface: attribute onload
-PASS SVGElement interface: attribute onloadeddata
-PASS SVGElement interface: attribute onloadedmetadata
-FAIL SVGElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
-PASS SVGElement interface: attribute onloadstart
-PASS SVGElement interface: attribute onmousedown
-PASS SVGElement interface: attribute onmouseenter
-PASS SVGElement interface: attribute onmouseleave
-PASS SVGElement interface: attribute onmousemove
-PASS SVGElement interface: attribute onmouseout
-PASS SVGElement interface: attribute onmouseover
-PASS SVGElement interface: attribute onmouseup
-PASS SVGElement interface: attribute onwheel
-PASS SVGElement interface: attribute onpause
-PASS SVGElement interface: attribute onplay
-PASS SVGElement interface: attribute onplaying
-PASS SVGElement interface: attribute onprogress
-PASS SVGElement interface: attribute onratechange
-PASS SVGElement interface: attribute onreset
-PASS SVGElement interface: attribute onresize
-PASS SVGElement interface: attribute onscroll
-FAIL SVGElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
-PASS SVGElement interface: attribute onseeked
-PASS SVGElement interface: attribute onseeking
-PASS SVGElement interface: attribute onselect
-PASS SVGElement interface: attribute onstalled
-PASS SVGElement interface: attribute onsubmit
-PASS SVGElement interface: attribute onsuspend
-PASS SVGElement interface: attribute ontimeupdate
-PASS SVGElement interface: attribute ontoggle
-PASS SVGElement interface: attribute onvolumechange
-PASS SVGElement interface: attribute onwaiting
-FAIL SVGElement interface: attribute oncopy assert_own_property: expected property "oncopy" missing
-FAIL SVGElement interface: attribute oncut assert_own_property: expected property "oncut" missing
-FAIL SVGElement interface: attribute onpaste assert_own_property: expected property "onpaste" missing
-PASS SVGElement interface: attribute dataset
-PASS SVGElement interface: attribute nonce
-PASS SVGElement interface: attribute tabIndex
-PASS SVGElement interface: operation focus(FocusOptions)
-PASS SVGElement interface: operation blur()
 Harness: the test ran to completion.
 
diff --git "a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=\050Document_Window\051-expected.txt" "b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=\050Document_Window\051-expected.txt"
index 3eb13f3fa..ec0075917 100644
--- "a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=\050Document_Window\051-expected.txt"
+++ "b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=\050Document_Window\051-expected.txt"
@@ -1,6 +1,33 @@
 This is a testharness.js-based test.
-PASS html interfaces
-PASS Partial interface Document: original interface defined
+FAIL html interfaces promise_test: Unhandled rejection with value: object "Got an error before parsing any named definition: Unrecognised tokens, line 1 (tokens: "{\"error\": {\"message\"")
+[
+    {
+        "type": "{",
+        "value": "{",
+        "trivia": ""
+    },
+    {
+        "type": "string",
+        "value": "\"error\"",
+        "trivia": ""
+    },
+    {
+        "type": ":",
+        "value": ":",
+        "trivia": ""
+    },
+    {
+        "type": "{",
+        "value": "{",
+        "trivia": " "
+    },
+    {
+        "type": "string",
+        "value": "\"message\"",
+        "trivia": ""
+    }
+]"
+FAIL Partial interface Document: original interface defined assert_true: Original interface should be defined expected true got false
 PASS Partial interface NavigatorID: original interface defined
 PASS Partial interface HTMLAnchorElement: original interface defined
 PASS Partial interface HTMLAreaElement: original interface defined
@@ -34,648 +61,7 @@
 PASS Partial interface HTMLTableCellElement: original interface defined
 PASS Partial interface HTMLTableRowElement: original interface defined
 PASS Partial interface HTMLUListElement: original interface defined
-PASS Partial interface Document[2]: original interface defined
+FAIL Partial interface Document[2]: original interface defined assert_true: Original interface should be defined expected true got false
 PASS Partial interface Window: original interface defined
-PASS Window interface: existence and properties of interface object
-PASS Window interface object length
-PASS Window interface object name
-PASS Window interface: existence and properties of interface prototype object
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via __proto__ should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Object.setPrototypeOf should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via __proto__ should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of interface prototype object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS Window interface: existence and properties of interface prototype object's "constructor" property
-PASS Window interface: existence and properties of interface prototype object's @@unscopables property
-FAIL Window interface: attribute self assert_equals: "self" must have a getter expected "function" but got "undefined"
-PASS Window interface: attribute name
-PASS Window interface: attribute history
-PASS Window interface: attribute customElements
-PASS Window interface: attribute locationbar
-PASS Window interface: attribute menubar
-PASS Window interface: attribute personalbar
-PASS Window interface: attribute scrollbars
-PASS Window interface: attribute statusbar
-PASS Window interface: attribute toolbar
-PASS Window interface: attribute status
-PASS Window interface: operation close()
-FAIL Window interface: attribute closed assert_equals: "closed" must have a getter expected "function" but got "undefined"
-PASS Window interface: operation stop()
-PASS Window interface: operation focus()
-PASS Window interface: operation blur()
-FAIL Window interface: attribute frames assert_equals: "frames" must have a getter expected "function" but got "undefined"
-FAIL Window interface: attribute length assert_equals: "length" must have a getter expected "function" but got "undefined"
-FAIL Window interface: attribute opener assert_equals: "opener" must have a getter expected "function" but got "undefined"
-FAIL Window interface: attribute parent assert_equals: "parent" must have a getter expected "function" but got "undefined"
-PASS Window interface: attribute frameElement
-PASS Window interface: operation open(USVString, DOMString, DOMString)
-PASS Window interface: attribute navigator
-PASS Window interface: attribute applicationCache
-PASS Window interface: operation alert()
-PASS Window interface: operation alert(DOMString)
-PASS Window interface: operation confirm(DOMString)
-PASS Window interface: operation prompt(DOMString, DOMString)
-PASS Window interface: operation print()
-PASS Window interface: operation requestAnimationFrame(FrameRequestCallback)
-PASS Window interface: operation cancelAnimationFrame(unsigned long)
-PASS Window interface: operation postMessage(any, USVString, [object Object])
-PASS Window interface: operation postMessage(any, [object Object], WindowPostMessageOptions)
-PASS Window interface: operation captureEvents()
-PASS Window interface: operation releaseEvents()
-PASS Window interface: attribute external
-PASS Window interface: attribute onabort
-PASS Window interface: attribute onauxclick
-PASS Window interface: attribute onblur
-PASS Window interface: attribute oncancel
-PASS Window interface: attribute oncanplay
-PASS Window interface: attribute oncanplaythrough
-PASS Window interface: attribute onchange
-PASS Window interface: attribute onclick
-PASS Window interface: attribute onclose
-PASS Window interface: attribute oncontextmenu
-PASS Window interface: attribute oncuechange
-PASS Window interface: attribute ondblclick
-PASS Window interface: attribute ondrag
-PASS Window interface: attribute ondragend
-PASS Window interface: attribute ondragenter
-FAIL Window interface: attribute ondragexit assert_own_property: The global object must have a property "ondragexit" expected property "ondragexit" missing
-PASS Window interface: attribute ondragleave
-PASS Window interface: attribute ondragover
-PASS Window interface: attribute ondragstart
-PASS Window interface: attribute ondrop
-PASS Window interface: attribute ondurationchange
-PASS Window interface: attribute onemptied
-PASS Window interface: attribute onended
-PASS Window interface: attribute onerror
-PASS Window interface: attribute onfocus
-PASS Window interface: attribute oninput
-PASS Window interface: attribute oninvalid
-PASS Window interface: attribute onkeydown
-PASS Window interface: attribute onkeypress
-PASS Window interface: attribute onkeyup
-PASS Window interface: attribute onload
-PASS Window interface: attribute onloadeddata
-PASS Window interface: attribute onloadedmetadata
-FAIL Window interface: attribute onloadend assert_own_property: The global object must have a property "onloadend" expected property "onloadend" missing
-PASS Window interface: attribute onloadstart
-PASS Window interface: attribute onmousedown
-PASS Window interface: attribute onmouseenter
-PASS Window interface: attribute onmouseleave
-PASS Window interface: attribute onmousemove
-PASS Window interface: attribute onmouseout
-PASS Window interface: attribute onmouseover
-PASS Window interface: attribute onmouseup
-PASS Window interface: attribute onwheel
-PASS Window interface: attribute onpause
-PASS Window interface: attribute onplay
-PASS Window interface: attribute onplaying
-PASS Window interface: attribute onprogress
-PASS Window interface: attribute onratechange
-PASS Window interface: attribute onreset
-PASS Window interface: attribute onresize
-PASS Window interface: attribute onscroll
-FAIL Window interface: attribute onsecuritypolicyviolation assert_own_property: The global object must have a property "onsecuritypolicyviolation" expected property "onsecuritypolicyviolation" missing
-PASS Window interface: attribute onseeked
-PASS Window interface: attribute onseeking
-PASS Window interface: attribute onselect
-PASS Window interface: attribute onstalled
-PASS Window interface: attribute onsubmit
-PASS Window interface: attribute onsuspend
-PASS Window interface: attribute ontimeupdate
-PASS Window interface: attribute ontoggle
-PASS Window interface: attribute onvolumechange
-PASS Window interface: attribute onwaiting
-PASS Window interface: attribute onafterprint
-PASS Window interface: attribute onbeforeprint
-PASS Window interface: attribute onbeforeunload
-PASS Window interface: attribute onhashchange
-PASS Window interface: attribute onlanguagechange
-PASS Window interface: attribute onmessage
-PASS Window interface: attribute onmessageerror
-PASS Window interface: attribute onoffline
-PASS Window interface: attribute ononline
-PASS Window interface: attribute onpagehide
-PASS Window interface: attribute onpageshow
-PASS Window interface: attribute onpopstate
-PASS Window interface: attribute onrejectionhandled
-PASS Window interface: attribute onstorage
-PASS Window interface: attribute onunhandledrejection
-PASS Window interface: attribute onunload
-PASS Window interface: attribute origin
-PASS Window interface: operation btoa(DOMString)
-PASS Window interface: operation atob(DOMString)
-PASS Window interface: operation setTimeout(TimerHandler, long, any)
-PASS Window interface: operation clearTimeout(long)
-PASS Window interface: operation setInterval(TimerHandler, long, any)
-PASS Window interface: operation clearInterval(long)
-PASS Window interface: operation createImageBitmap(ImageBitmapSource, ImageBitmapOptions)
-PASS Window interface: operation createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)
-PASS Window interface: attribute sessionStorage
-PASS Window interface: attribute localStorage
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Object.setPrototypeOf should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via __proto__ should throw a TypeError
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to a new value via Reflect.setPrototypeOf should return false
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Object.setPrototypeOf should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via __proto__ should not throw
-PASS Window interface: internal [[SetPrototypeOf]] method of global platform object - setting to its original value via Reflect.setPrototypeOf should return true
-PASS Window must be primary interface of window
-PASS Stringification of window
-FAIL Window interface: window must have own property "window" assert_false: property descriptor should not have a "value" field expected false got true
-FAIL Window interface: window must inherit property "self" with the proper type Unrecognized type WindowProxy
-PASS Window interface: window must have own property "document"
-PASS Window interface: window must inherit property "name" with the proper type
-FAIL Window interface: window must have own property "location" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "history" with the proper type
-PASS Window interface: window must inherit property "customElements" with the proper type
-PASS Window interface: window must inherit property "locationbar" with the proper type
-PASS Window interface: window must inherit property "menubar" with the proper type
-PASS Window interface: window must inherit property "personalbar" with the proper type
-PASS Window interface: window must inherit property "scrollbars" with the proper type
-PASS Window interface: window must inherit property "statusbar" with the proper type
-PASS Window interface: window must inherit property "toolbar" with the proper type
-PASS Window interface: window must inherit property "status" with the proper type
-PASS Window interface: window must inherit property "close()" with the proper type
-PASS Window interface: window must inherit property "closed" with the proper type
-PASS Window interface: window must inherit property "stop()" with the proper type
-PASS Window interface: window must inherit property "focus()" with the proper type
-PASS Window interface: window must inherit property "blur()" with the proper type
-FAIL Window interface: window must inherit property "frames" with the proper type Unrecognized type WindowProxy
-PASS Window interface: window must inherit property "length" with the proper type
-FAIL Window interface: window must have own property "top" assert_false: property descriptor should not have a "value" field expected false got true
-PASS Window interface: window must inherit property "opener" with the proper type
-FAIL Window interface: window must inherit property "parent" with the proper type Unrecognized type WindowProxy
-PASS Window interface: window must inherit property "frameElement" with the proper type
-PASS Window interface: window must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Window interface: calling open(USVString, DOMString, DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "navigator" with the proper type
-PASS Window interface: window must inherit property "applicationCache" with the proper type
-PASS Window interface: window must inherit property "alert()" with the proper type
-PASS Window interface: window must inherit property "alert(DOMString)" with the proper type
-PASS Window interface: calling alert(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "confirm(DOMString)" with the proper type
-PASS Window interface: calling confirm(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "prompt(DOMString, DOMString)" with the proper type
-PASS Window interface: calling prompt(DOMString, DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "print()" with the proper type
-PASS Window interface: window must inherit property "requestAnimationFrame(FrameRequestCallback)" with the proper type
-PASS Window interface: calling requestAnimationFrame(FrameRequestCallback) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "cancelAnimationFrame(unsigned long)" with the proper type
-PASS Window interface: calling cancelAnimationFrame(unsigned long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "postMessage(any, USVString, [object Object])" with the proper type
-PASS Window interface: calling postMessage(any, USVString, [object Object]) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "postMessage(any, [object Object], WindowPostMessageOptions)" with the proper type
-PASS Window interface: calling postMessage(any, [object Object], WindowPostMessageOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "captureEvents()" with the proper type
-PASS Window interface: window must inherit property "releaseEvents()" with the proper type
-PASS Window interface: window must inherit property "external" with the proper type
-PASS Window interface: window must inherit property "onabort" with the proper type
-PASS Window interface: window must inherit property "onauxclick" with the proper type
-PASS Window interface: window must inherit property "onblur" with the proper type
-PASS Window interface: window must inherit property "oncancel" with the proper type
-PASS Window interface: window must inherit property "oncanplay" with the proper type
-PASS Window interface: window must inherit property "oncanplaythrough" with the proper type
-PASS Window interface: window must inherit property "onchange" with the proper type
-PASS Window interface: window must inherit property "onclick" with the proper type
-PASS Window interface: window must inherit property "onclose" with the proper type
-PASS Window interface: window must inherit property "oncontextmenu" with the proper type
-PASS Window interface: window must inherit property "oncuechange" with the proper type
-PASS Window interface: window must inherit property "ondblclick" with the proper type
-PASS Window interface: window must inherit property "ondrag" with the proper type
-PASS Window interface: window must inherit property "ondragend" with the proper type
-PASS Window interface: window must inherit property "ondragenter" with the proper type
-FAIL Window interface: window must inherit property "ondragexit" with the proper type assert_own_property: expected property "ondragexit" missing
-PASS Window interface: window must inherit property "ondragleave" with the proper type
-PASS Window interface: window must inherit property "ondragover" with the proper type
-PASS Window interface: window must inherit property "ondragstart" with the proper type
-PASS Window interface: window must inherit property "ondrop" with the proper type
-PASS Window interface: window must inherit property "ondurationchange" with the proper type
-PASS Window interface: window must inherit property "onemptied" with the proper type
-PASS Window interface: window must inherit property "onended" with the proper type
-PASS Window interface: window must inherit property "onerror" with the proper type
-PASS Window interface: window must inherit property "onfocus" with the proper type
-PASS Window interface: window must inherit property "oninput" with the proper type
-PASS Window interface: window must inherit property "oninvalid" with the proper type
-PASS Window interface: window must inherit property "onkeydown" with the proper type
-PASS Window interface: window must inherit property "onkeypress" with the proper type
-PASS Window interface: window must inherit property "onkeyup" with the proper type
-PASS Window interface: window must inherit property "onload" with the proper type
-PASS Window interface: window must inherit property "onloadeddata" with the proper type
-PASS Window interface: window must inherit property "onloadedmetadata" with the proper type
-FAIL Window interface: window must inherit property "onloadend" with the proper type assert_own_property: expected property "onloadend" missing
-PASS Window interface: window must inherit property "onloadstart" with the proper type
-PASS Window interface: window must inherit property "onmousedown" with the proper type
-PASS Window interface: window must inherit property "onmouseenter" with the proper type
-PASS Window interface: window must inherit property "onmouseleave" with the proper type
-PASS Window interface: window must inherit property "onmousemove" with the proper type
-PASS Window interface: window must inherit property "onmouseout" with the proper type
-PASS Window interface: window must inherit property "onmouseover" with the proper type
-PASS Window interface: window must inherit property "onmouseup" with the proper type
-PASS Window interface: window must inherit property "onwheel" with the proper type
-PASS Window interface: window must inherit property "onpause" with the proper type
-PASS Window interface: window must inherit property "onplay" with the proper type
-PASS Window interface: window must inherit property "onplaying" with the proper type
-PASS Window interface: window must inherit property "onprogress" with the proper type
-PASS Window interface: window must inherit property "onratechange" with the proper type
-PASS Window interface: window must inherit property "onreset" with the proper type
-PASS Window interface: window must inherit property "onresize" with the proper type
-PASS Window interface: window must inherit property "onscroll" with the proper type
-FAIL Window interface: window must inherit property "onsecuritypolicyviolation" with the proper type assert_own_property: expected property "onsecuritypolicyviolation" missing
-PASS Window interface: window must inherit property "onseeked" with the proper type
-PASS Window interface: window must inherit property "onseeking" with the proper type
-PASS Window interface: window must inherit property "onselect" with the proper type
-PASS Window interface: window must inherit property "onstalled" with the proper type
-PASS Window interface: window must inherit property "onsubmit" with the proper type
-PASS Window interface: window must inherit property "onsuspend" with the proper type
-PASS Window interface: window must inherit property "ontimeupdate" with the proper type
-PASS Window interface: window must inherit property "ontoggle" with the proper type
-PASS Window interface: window must inherit property "onvolumechange" with the proper type
-PASS Window interface: window must inherit property "onwaiting" with the proper type
-PASS Window interface: window must inherit property "onafterprint" with the proper type
-PASS Window interface: window must inherit property "onbeforeprint" with the proper type
-PASS Window interface: window must inherit property "onbeforeunload" with the proper type
-PASS Window interface: window must inherit property "onhashchange" with the proper type
-PASS Window interface: window must inherit property "onlanguagechange" with the proper type
-PASS Window interface: window must inherit property "onmessage" with the proper type
-PASS Window interface: window must inherit property "onmessageerror" with the proper type
-PASS Window interface: window must inherit property "onoffline" with the proper type
-PASS Window interface: window must inherit property "ononline" with the proper type
-PASS Window interface: window must inherit property "onpagehide" with the proper type
-PASS Window interface: window must inherit property "onpageshow" with the proper type
-PASS Window interface: window must inherit property "onpopstate" with the proper type
-PASS Window interface: window must inherit property "onrejectionhandled" with the proper type
-PASS Window interface: window must inherit property "onstorage" with the proper type
-PASS Window interface: window must inherit property "onunhandledrejection" with the proper type
-PASS Window interface: window must inherit property "onunload" with the proper type
-PASS Window interface: window must inherit property "origin" with the proper type
-PASS Window interface: window must inherit property "btoa(DOMString)" with the proper type
-PASS Window interface: calling btoa(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "atob(DOMString)" with the proper type
-PASS Window interface: calling atob(DOMString) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "setTimeout(TimerHandler, long, any)" with the proper type
-PASS Window interface: calling setTimeout(TimerHandler, long, any) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "clearTimeout(long)" with the proper type
-PASS Window interface: calling clearTimeout(long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "setInterval(TimerHandler, long, any)" with the proper type
-PASS Window interface: calling setInterval(TimerHandler, long, any) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "clearInterval(long)" with the proper type
-PASS Window interface: calling clearInterval(long) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, ImageBitmapOptions)" with the proper type
-PASS Window interface: calling createImageBitmap(ImageBitmapSource, ImageBitmapOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions)" with the proper type
-PASS Window interface: calling createImageBitmap(ImageBitmapSource, long, long, long, long, ImageBitmapOptions) on window with too few arguments must throw TypeError
-PASS Window interface: window must inherit property "sessionStorage" with the proper type
-PASS Window interface: window must inherit property "localStorage" with the proper type
-PASS Document interface: attribute domain
-PASS Document interface: attribute referrer
-PASS Document interface: attribute cookie
-PASS Document interface: attribute lastModified
-PASS Document interface: attribute readyState
-PASS Document interface: attribute title
-PASS Document interface: attribute dir
-PASS Document interface: attribute body
-PASS Document interface: attribute head
-PASS Document interface: attribute images
-PASS Document interface: attribute embeds
-PASS Document interface: attribute plugins
-PASS Document interface: attribute links
-PASS Document interface: attribute forms
-PASS Document interface: attribute scripts
-PASS Document interface: operation getElementsByName(DOMString)
-PASS Document interface: attribute currentScript
-PASS Document interface: operation open(DOMString, DOMString)
-PASS Document interface: operation open(USVString, DOMString, DOMString)
-PASS Document interface: operation close()
-PASS Document interface: operation write(DOMString)
-PASS Document interface: operation writeln(DOMString)
-PASS Document interface: attribute defaultView
-PASS Document interface: attribute activeElement
-PASS Document interface: operation hasFocus()
-PASS Document interface: attribute designMode
-PASS Document interface: operation execCommand(DOMString, boolean, DOMString)
-PASS Document interface: operation queryCommandEnabled(DOMString)
-PASS Document interface: operation queryCommandIndeterm(DOMString)
-PASS Document interface: operation queryCommandState(DOMString)
-PASS Document interface: operation queryCommandSupported(DOMString)
-PASS Document interface: operation queryCommandValue(DOMString)
-PASS Document interface: attribute onreadystatechange
-PASS Document interface: attribute fgColor
-PASS Document interface: attribute linkColor
-PASS Document interface: attribute vlinkColor
-PASS Document interface: attribute alinkColor
-PASS Document interface: attribute bgColor
-PASS Document interface: attribute anchors
-PASS Document interface: attribute applets
-PASS Document interface: operation clear()
-PASS Document interface: operation captureEvents()
-PASS Document interface: operation releaseEvents()
-PASS Document interface: attribute all
-PASS Document interface: attribute onabort
-PASS Document interface: attribute onauxclick
-PASS Document interface: attribute onblur
-PASS Document interface: attribute oncancel
-PASS Document interface: attribute oncanplay
-PASS Document interface: attribute oncanplaythrough
-PASS Document interface: attribute onchange
-PASS Document interface: attribute onclick
-PASS Document interface: attribute onclose
-PASS Document interface: attribute oncontextmenu
-PASS Document interface: attribute oncuechange
-PASS Document interface: attribute ondblclick
-PASS Document interface: attribute ondrag
-PASS Document interface: attribute ondragend
-PASS Document interface: attribute ondragenter
-FAIL Document interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
-PASS Document interface: attribute ondragleave
-PASS Document interface: attribute ondragover
-PASS Document interface: attribute ondragstart
-PASS Document interface: attribute ondrop
-PASS Document interface: attribute ondurationchange
-PASS Document interface: attribute onemptied
-PASS Document interface: attribute onended
-PASS Document interface: attribute onerror
-PASS Document interface: attribute onfocus
-PASS Document interface: attribute oninput
-PASS Document interface: attribute oninvalid
-PASS Document interface: attribute onkeydown
-PASS Document interface: attribute onkeypress
-PASS Document interface: attribute onkeyup
-PASS Document interface: attribute onload
-PASS Document interface: attribute onloadeddata
-PASS Document interface: attribute onloadedmetadata
-FAIL Document interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
-PASS Document interface: attribute onloadstart
-PASS Document interface: attribute onmousedown
-PASS Document interface: attribute onmouseenter
-PASS Document interface: attribute onmouseleave
-PASS Document interface: attribute onmousemove
-PASS Document interface: attribute onmouseout
-PASS Document interface: attribute onmouseover
-PASS Document interface: attribute onmouseup
-PASS Document interface: attribute onwheel
-PASS Document interface: attribute onpause
-PASS Document interface: attribute onplay
-PASS Document interface: attribute onplaying
-PASS Document interface: attribute onprogress
-PASS Document interface: attribute onratechange
-PASS Document interface: attribute onreset
-PASS Document interface: attribute onresize
-PASS Document interface: attribute onscroll
-PASS Document interface: attribute onsecuritypolicyviolation
-PASS Document interface: attribute onseeked
-PASS Document interface: attribute onseeking
-PASS Document interface: attribute onselect
-PASS Document interface: attribute onstalled
-PASS Document interface: attribute onsubmit
-PASS Document interface: attribute onsuspend
-PASS Document interface: attribute ontimeupdate
-PASS Document interface: attribute ontoggle
-PASS Document interface: attribute onvolumechange
-PASS Document interface: attribute onwaiting
-PASS Document interface: attribute oncopy
-PASS Document interface: attribute oncut
-PASS Document interface: attribute onpaste
-PASS Document interface: iframe.contentDocument must have own property "location"
-PASS Document interface: iframe.contentDocument must inherit property "domain" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "referrer" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "cookie" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "lastModified" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "readyState" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "title" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "dir" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "body" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "head" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "images" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "embeds" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "plugins" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "links" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "forms" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "scripts" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "getElementsByName(DOMString)" with the proper type
-PASS Document interface: calling getElementsByName(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "currentScript" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "open(DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(USVString, DOMString, DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "close()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "write(DOMString)" with the proper type
-PASS Document interface: calling write(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "writeln(DOMString)" with the proper type
-PASS Document interface: calling writeln(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-FAIL Document interface: iframe.contentDocument must inherit property "defaultView" with the proper type Unrecognized type WindowProxy
-PASS Document interface: iframe.contentDocument must inherit property "activeElement" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "hasFocus()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "designMode" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type
-PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandEnabled(DOMString)" with the proper type
-PASS Document interface: calling queryCommandEnabled(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandIndeterm(DOMString)" with the proper type
-PASS Document interface: calling queryCommandIndeterm(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandState(DOMString)" with the proper type
-PASS Document interface: calling queryCommandState(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandSupported(DOMString)" with the proper type
-PASS Document interface: calling queryCommandSupported(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "queryCommandValue(DOMString)" with the proper type
-PASS Document interface: calling queryCommandValue(DOMString) on iframe.contentDocument with too few arguments must throw TypeError
-PASS Document interface: iframe.contentDocument must inherit property "onreadystatechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "fgColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "linkColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "vlinkColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "alinkColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "bgColor" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "anchors" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "applets" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "clear()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "captureEvents()" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "releaseEvents()" with the proper type
-FAIL Document interface: iframe.contentDocument must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
-PASS Document interface: iframe.contentDocument must inherit property "onabort" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onauxclick" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onblur" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncancel" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncanplay" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncanplaythrough" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onchange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onclick" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onclose" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncontextmenu" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncuechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondblclick" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondrag" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragend" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragenter" with the proper type
-FAIL Document interface: iframe.contentDocument must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: iframe.contentDocument must inherit property "ondragleave" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragover" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondragstart" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondrop" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ondurationchange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onemptied" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onended" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onerror" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onfocus" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oninput" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oninvalid" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onkeydown" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onkeypress" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onkeyup" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onload" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onloadeddata" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onloadedmetadata" with the proper type
-FAIL Document interface: iframe.contentDocument must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: iframe.contentDocument must inherit property "onloadstart" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmousedown" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseenter" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseleave" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmousemove" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseout" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseover" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onmouseup" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onwheel" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onpause" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onplay" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onplaying" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onprogress" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onratechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onreset" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onresize" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onscroll" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onsecuritypolicyviolation" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onseeked" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onseeking" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onselect" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onstalled" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onsubmit" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onsuspend" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ontimeupdate" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "ontoggle" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onvolumechange" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onwaiting" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncopy" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "oncut" with the proper type
-PASS Document interface: iframe.contentDocument must inherit property "onpaste" with the proper type
-PASS Document interface: new Document() must have own property "location"
-PASS Document interface: new Document() must inherit property "domain" with the proper type
-PASS Document interface: new Document() must inherit property "referrer" with the proper type
-PASS Document interface: new Document() must inherit property "cookie" with the proper type
-PASS Document interface: new Document() must inherit property "lastModified" with the proper type
-PASS Document interface: new Document() must inherit property "readyState" with the proper type
-PASS Document interface: new Document() must inherit property "title" with the proper type
-PASS Document interface: new Document() must inherit property "dir" with the proper type
-PASS Document interface: new Document() must inherit property "body" with the proper type
-PASS Document interface: new Document() must inherit property "head" with the proper type
-PASS Document interface: new Document() must inherit property "images" with the proper type
-PASS Document interface: new Document() must inherit property "embeds" with the proper type
-PASS Document interface: new Document() must inherit property "plugins" with the proper type
-PASS Document interface: new Document() must inherit property "links" with the proper type
-PASS Document interface: new Document() must inherit property "forms" with the proper type
-PASS Document interface: new Document() must inherit property "scripts" with the proper type
-PASS Document interface: new Document() must inherit property "getElementsByName(DOMString)" with the proper type
-PASS Document interface: calling getElementsByName(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "currentScript" with the proper type
-PASS Document interface: new Document() must inherit property "open(DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(DOMString, DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "open(USVString, DOMString, DOMString)" with the proper type
-PASS Document interface: calling open(USVString, DOMString, DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "close()" with the proper type
-PASS Document interface: new Document() must inherit property "write(DOMString)" with the proper type
-PASS Document interface: calling write(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "writeln(DOMString)" with the proper type
-PASS Document interface: calling writeln(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "defaultView" with the proper type
-PASS Document interface: new Document() must inherit property "activeElement" with the proper type
-PASS Document interface: new Document() must inherit property "hasFocus()" with the proper type
-PASS Document interface: new Document() must inherit property "designMode" with the proper type
-PASS Document interface: new Document() must inherit property "execCommand(DOMString, boolean, DOMString)" with the proper type
-PASS Document interface: calling execCommand(DOMString, boolean, DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandEnabled(DOMString)" with the proper type
-PASS Document interface: calling queryCommandEnabled(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandIndeterm(DOMString)" with the proper type
-PASS Document interface: calling queryCommandIndeterm(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandState(DOMString)" with the proper type
-PASS Document interface: calling queryCommandState(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandSupported(DOMString)" with the proper type
-PASS Document interface: calling queryCommandSupported(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "queryCommandValue(DOMString)" with the proper type
-PASS Document interface: calling queryCommandValue(DOMString) on new Document() with too few arguments must throw TypeError
-PASS Document interface: new Document() must inherit property "onreadystatechange" with the proper type
-PASS Document interface: new Document() must inherit property "fgColor" with the proper type
-PASS Document interface: new Document() must inherit property "linkColor" with the proper type
-PASS Document interface: new Document() must inherit property "vlinkColor" with the proper type
-PASS Document interface: new Document() must inherit property "alinkColor" with the proper type
-PASS Document interface: new Document() must inherit property "bgColor" with the proper type
-PASS Document interface: new Document() must inherit property "anchors" with the proper type
-PASS Document interface: new Document() must inherit property "applets" with the proper type
-PASS Document interface: new Document() must inherit property "clear()" with the proper type
-PASS Document interface: new Document() must inherit property "captureEvents()" with the proper type
-PASS Document interface: new Document() must inherit property "releaseEvents()" with the proper type
-FAIL Document interface: new Document() must inherit property "all" with the proper type assert_in_array: wrong type: not object or function value "undefined" not in array ["object", "function"]
-PASS Document interface: new Document() must inherit property "onabort" with the proper type
-PASS Document interface: new Document() must inherit property "onauxclick" with the proper type
-PASS Document interface: new Document() must inherit property "onblur" with the proper type
-PASS Document interface: new Document() must inherit property "oncancel" with the proper type
-PASS Document interface: new Document() must inherit property "oncanplay" with the proper type
-PASS Document interface: new Document() must inherit property "oncanplaythrough" with the proper type
-PASS Document interface: new Document() must inherit property "onchange" with the proper type
-PASS Document interface: new Document() must inherit property "onclick" with the proper type
-PASS Document interface: new Document() must inherit property "onclose" with the proper type
-PASS Document interface: new Document() must inherit property "oncontextmenu" with the proper type
-PASS Document interface: new Document() must inherit property "oncuechange" with the proper type
-PASS Document interface: new Document() must inherit property "ondblclick" with the proper type
-PASS Document interface: new Document() must inherit property "ondrag" with the proper type
-PASS Document interface: new Document() must inherit property "ondragend" with the proper type
-PASS Document interface: new Document() must inherit property "ondragenter" with the proper type
-FAIL Document interface: new Document() must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS Document interface: new Document() must inherit property "ondragleave" with the proper type
-PASS Document interface: new Document() must inherit property "ondragover" with the proper type
-PASS Document interface: new Document() must inherit property "ondragstart" with the proper type
-PASS Document interface: new Document() must inherit property "ondrop" with the proper type
-PASS Document interface: new Document() must inherit property "ondurationchange" with the proper type
-PASS Document interface: new Document() must inherit property "onemptied" with the proper type
-PASS Document interface: new Document() must inherit property "onended" with the proper type
-PASS Document interface: new Document() must inherit property "onerror" with the proper type
-PASS Document interface: new Document() must inherit property "onfocus" with the proper type
-PASS Document interface: new Document() must inherit property "oninput" with the proper type
-PASS Document interface: new Document() must inherit property "oninvalid" with the proper type
-PASS Document interface: new Document() must inherit property "onkeydown" with the proper type
-PASS Document interface: new Document() must inherit property "onkeypress" with the proper type
-PASS Document interface: new Document() must inherit property "onkeyup" with the proper type
-PASS Document interface: new Document() must inherit property "onload" with the proper type
-PASS Document interface: new Document() must inherit property "onloadeddata" with the proper type
-PASS Document interface: new Document() must inherit property "onloadedmetadata" with the proper type
-FAIL Document interface: new Document() must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS Document interface: new Document() must inherit property "onloadstart" with the proper type
-PASS Document interface: new Document() must inherit property "onmousedown" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseenter" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseleave" with the proper type
-PASS Document interface: new Document() must inherit property "onmousemove" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseout" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseover" with the proper type
-PASS Document interface: new Document() must inherit property "onmouseup" with the proper type
-PASS Document interface: new Document() must inherit property "onwheel" with the proper type
-PASS Document interface: new Document() must inherit property "onpause" with the proper type
-PASS Document interface: new Document() must inherit property "onplay" with the proper type
-PASS Document interface: new Document() must inherit property "onplaying" with the proper type
-PASS Document interface: new Document() must inherit property "onprogress" with the proper type
-PASS Document interface: new Document() must inherit property "onratechange" with the proper type
-PASS Document interface: new Document() must inherit property "onreset" with the proper type
-PASS Document interface: new Document() must inherit property "onresize" with the proper type
-PASS Document interface: new Document() must inherit property "onscroll" with the proper type
-PASS Document interface: new Document() must inherit property "onsecuritypolicyviolation" with the proper type
-PASS Document interface: new Document() must inherit property "onseeked" with the proper type
-PASS Document interface: new Document() must inherit property "onseeking" with the proper type
-PASS Document interface: new Document() must inherit property "onselect" with the proper type
-PASS Document interface: new Document() must inherit property "onstalled" with the proper type
-PASS Document interface: new Document() must inherit property "onsubmit" with the proper type
-PASS Document interface: new Document() must inherit property "onsuspend" with the proper type
-PASS Document interface: new Document() must inherit property "ontimeupdate" with the proper type
-PASS Document interface: new Document() must inherit property "ontoggle" with the proper type
-PASS Document interface: new Document() must inherit property "onvolumechange" with the proper type
-PASS Document interface: new Document() must inherit property "onwaiting" with the proper type
-PASS Document interface: new Document() must inherit property "oncopy" with the proper type
-PASS Document interface: new Document() must inherit property "oncut" with the proper type
-PASS Document interface: new Document() must inherit property "onpaste" with the proper type
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt
index d2b11d1..ec0075917 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt
@@ -1,6 +1,33 @@
 This is a testharness.js-based test.
-PASS html interfaces
-PASS Partial interface Document: original interface defined
+FAIL html interfaces promise_test: Unhandled rejection with value: object "Got an error before parsing any named definition: Unrecognised tokens, line 1 (tokens: "{\"error\": {\"message\"")
+[
+    {
+        "type": "{",
+        "value": "{",
+        "trivia": ""
+    },
+    {
+        "type": "string",
+        "value": "\"error\"",
+        "trivia": ""
+    },
+    {
+        "type": ":",
+        "value": ":",
+        "trivia": ""
+    },
+    {
+        "type": "{",
+        "value": "{",
+        "trivia": " "
+    },
+    {
+        "type": "string",
+        "value": "\"message\"",
+        "trivia": ""
+    }
+]"
+FAIL Partial interface Document: original interface defined assert_true: Original interface should be defined expected true got false
 PASS Partial interface NavigatorID: original interface defined
 PASS Partial interface HTMLAnchorElement: original interface defined
 PASS Partial interface HTMLAreaElement: original interface defined
@@ -34,3549 +61,7 @@
 PASS Partial interface HTMLTableCellElement: original interface defined
 PASS Partial interface HTMLTableRowElement: original interface defined
 PASS Partial interface HTMLUListElement: original interface defined
-PASS Partial interface Document[2]: original interface defined
+FAIL Partial interface Document[2]: original interface defined assert_true: Original interface should be defined expected true got false
 PASS Partial interface Window: original interface defined
-PASS HTMLAllCollection interface: existence and properties of interface object
-PASS HTMLAllCollection interface object length
-PASS HTMLAllCollection interface object name
-PASS HTMLAllCollection interface: existence and properties of interface prototype object
-PASS HTMLAllCollection interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAllCollection interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAllCollection interface: attribute length
-PASS HTMLAllCollection interface: operation namedItem(DOMString)
-PASS HTMLAllCollection interface: operation item(DOMString)
-FAIL HTMLAllCollection must be primary interface of document.all assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL Stringification of document.all assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "length" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "namedItem(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: calling namedItem(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: document.all must inherit property "item(DOMString)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL HTMLAllCollection interface: calling item(DOMString) on document.all with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
-PASS HTMLFormControlsCollection interface: existence and properties of interface object
-PASS HTMLFormControlsCollection interface object length
-PASS HTMLFormControlsCollection interface object name
-PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object
-PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFormControlsCollection interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFormControlsCollection interface: operation namedItem(DOMString)
-PASS HTMLFormControlsCollection must be primary interface of document.createElement("form").elements
-PASS Stringification of document.createElement("form").elements
-PASS HTMLFormControlsCollection interface: document.createElement("form").elements must inherit property "namedItem(DOMString)" with the proper type
-PASS HTMLFormControlsCollection interface: calling namedItem(DOMString) on document.createElement("form").elements with too few arguments must throw TypeError
-PASS HTMLOptionsCollection interface: existence and properties of interface object
-PASS HTMLOptionsCollection interface object length
-PASS HTMLOptionsCollection interface object name
-PASS HTMLOptionsCollection interface: existence and properties of interface prototype object
-PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOptionsCollection interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOptionsCollection interface: attribute length
-PASS HTMLOptionsCollection interface: operation add([object Object],[object Object], [object Object],[object Object])
-PASS HTMLOptionsCollection interface: operation remove(long)
-PASS HTMLOptionsCollection interface: attribute selectedIndex
-PASS HTMLOptionsCollection must be primary interface of document.createElement("select").options
-PASS Stringification of document.createElement("select").options
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "length" with the proper type
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type
-PASS HTMLOptionsCollection interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select").options with too few arguments must throw TypeError
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "remove(long)" with the proper type
-PASS HTMLOptionsCollection interface: calling remove(long) on document.createElement("select").options with too few arguments must throw TypeError
-PASS HTMLOptionsCollection interface: document.createElement("select").options must inherit property "selectedIndex" with the proper type
-PASS HTMLElement interface: existence and properties of interface object
-PASS HTMLElement interface object length
-PASS HTMLElement interface object name
-PASS HTMLElement interface: existence and properties of interface prototype object
-PASS HTMLElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLElement interface: attribute title
-PASS HTMLElement interface: attribute lang
-PASS HTMLElement interface: attribute translate
-PASS HTMLElement interface: attribute dir
-PASS HTMLElement interface: attribute hidden
-PASS HTMLElement interface: operation click()
-PASS HTMLElement interface: attribute accessKey
-FAIL HTMLElement interface: attribute accessKeyLabel assert_true: The prototype object must have a property "accessKeyLabel" expected true got false
-PASS HTMLElement interface: attribute draggable
-PASS HTMLElement interface: attribute spellcheck
-PASS HTMLElement interface: attribute innerText
-PASS HTMLElement interface: attribute onabort
-PASS HTMLElement interface: attribute onauxclick
-PASS HTMLElement interface: attribute onblur
-PASS HTMLElement interface: attribute oncancel
-PASS HTMLElement interface: attribute oncanplay
-PASS HTMLElement interface: attribute oncanplaythrough
-PASS HTMLElement interface: attribute onchange
-PASS HTMLElement interface: attribute onclick
-PASS HTMLElement interface: attribute onclose
-PASS HTMLElement interface: attribute oncontextmenu
-PASS HTMLElement interface: attribute oncuechange
-PASS HTMLElement interface: attribute ondblclick
-PASS HTMLElement interface: attribute ondrag
-PASS HTMLElement interface: attribute ondragend
-PASS HTMLElement interface: attribute ondragenter
-FAIL HTMLElement interface: attribute ondragexit assert_true: The prototype object must have a property "ondragexit" expected true got false
-PASS HTMLElement interface: attribute ondragleave
-PASS HTMLElement interface: attribute ondragover
-PASS HTMLElement interface: attribute ondragstart
-PASS HTMLElement interface: attribute ondrop
-PASS HTMLElement interface: attribute ondurationchange
-PASS HTMLElement interface: attribute onemptied
-PASS HTMLElement interface: attribute onended
-PASS HTMLElement interface: attribute onerror
-PASS HTMLElement interface: attribute onfocus
-PASS HTMLElement interface: attribute oninput
-PASS HTMLElement interface: attribute oninvalid
-PASS HTMLElement interface: attribute onkeydown
-PASS HTMLElement interface: attribute onkeypress
-PASS HTMLElement interface: attribute onkeyup
-PASS HTMLElement interface: attribute onload
-PASS HTMLElement interface: attribute onloadeddata
-PASS HTMLElement interface: attribute onloadedmetadata
-FAIL HTMLElement interface: attribute onloadend assert_true: The prototype object must have a property "onloadend" expected true got false
-PASS HTMLElement interface: attribute onloadstart
-PASS HTMLElement interface: attribute onmousedown
-PASS HTMLElement interface: attribute onmouseenter
-PASS HTMLElement interface: attribute onmouseleave
-PASS HTMLElement interface: attribute onmousemove
-PASS HTMLElement interface: attribute onmouseout
-PASS HTMLElement interface: attribute onmouseover
-PASS HTMLElement interface: attribute onmouseup
-PASS HTMLElement interface: attribute onwheel
-PASS HTMLElement interface: attribute onpause
-PASS HTMLElement interface: attribute onplay
-PASS HTMLElement interface: attribute onplaying
-PASS HTMLElement interface: attribute onprogress
-PASS HTMLElement interface: attribute onratechange
-PASS HTMLElement interface: attribute onreset
-PASS HTMLElement interface: attribute onresize
-PASS HTMLElement interface: attribute onscroll
-FAIL HTMLElement interface: attribute onsecuritypolicyviolation assert_true: The prototype object must have a property "onsecuritypolicyviolation" expected true got false
-PASS HTMLElement interface: attribute onseeked
-PASS HTMLElement interface: attribute onseeking
-PASS HTMLElement interface: attribute onselect
-PASS HTMLElement interface: attribute onstalled
-PASS HTMLElement interface: attribute onsubmit
-PASS HTMLElement interface: attribute onsuspend
-PASS HTMLElement interface: attribute ontimeupdate
-PASS HTMLElement interface: attribute ontoggle
-PASS HTMLElement interface: attribute onvolumechange
-PASS HTMLElement interface: attribute onwaiting
-FAIL HTMLElement interface: attribute oncopy assert_own_property: expected property "oncopy" missing
-FAIL HTMLElement interface: attribute oncut assert_own_property: expected property "oncut" missing
-FAIL HTMLElement interface: attribute onpaste assert_own_property: expected property "onpaste" missing
-PASS HTMLElement interface: attribute contentEditable
-PASS HTMLElement interface: attribute isContentEditable
-PASS HTMLElement interface: attribute inputMode
-PASS HTMLElement interface: attribute dataset
-PASS HTMLElement interface: attribute nonce
-PASS HTMLElement interface: attribute tabIndex
-PASS HTMLElement interface: operation focus(FocusOptions)
-PASS HTMLElement interface: operation blur()
-PASS HTMLElement must be primary interface of document.createElement("noscript")
-PASS Stringification of document.createElement("noscript")
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "title" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "lang" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "translate" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "dir" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "hidden" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "click()" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "accessKey" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "accessKeyLabel" with the proper type assert_inherits: property "accessKeyLabel" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "draggable" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncancel" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplay" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncanplaythrough" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onchange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclick" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onclose" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncontextmenu" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncuechange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondblclick" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrag" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragend" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragenter" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "ondragexit" with the proper type assert_inherits: property "ondragexit" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragleave" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragover" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondragstart" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondrop" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ondurationchange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onemptied" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onended" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onerror" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onfocus" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninput" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oninvalid" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeydown" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeypress" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onkeyup" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onload" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadeddata" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadedmetadata" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onloadend" with the proper type assert_inherits: property "onloadend" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onloadstart" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousedown" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseenter" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseleave" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmousemove" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseout" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseover" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onmouseup" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwheel" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpause" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplay" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onplaying" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onprogress" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onratechange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onreset" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onresize" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onscroll" with the proper type
-FAIL HTMLElement interface: document.createElement("noscript") must inherit property "onsecuritypolicyviolation" with the proper type assert_inherits: property "onsecuritypolicyviolation" not found in prototype chain
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeked" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onseeking" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onselect" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onstalled" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsubmit" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onsuspend" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontimeupdate" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "ontoggle" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onvolumechange" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onwaiting" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncopy" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "oncut" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "onpaste" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "contentEditable" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "isContentEditable" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "inputMode" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "dataset" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "nonce" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "tabIndex" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "focus(FocusOptions)" with the proper type
-PASS HTMLElement interface: calling focus(FocusOptions) on document.createElement("noscript") with too few arguments must throw TypeError
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "blur()" with the proper type
-PASS HTMLUnknownElement interface: existence and properties of interface object
-PASS HTMLUnknownElement interface object length
-PASS HTMLUnknownElement interface object name
-PASS HTMLUnknownElement interface: existence and properties of interface prototype object
-PASS HTMLUnknownElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLUnknownElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLUnknownElement must be primary interface of document.createElement("bgsound")
-PASS Stringification of document.createElement("bgsound")
-PASS HTMLHtmlElement interface: existence and properties of interface object
-PASS HTMLHtmlElement interface object length
-PASS HTMLHtmlElement interface object name
-PASS HTMLHtmlElement interface: existence and properties of interface prototype object
-PASS HTMLHtmlElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHtmlElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHtmlElement interface: attribute version
-PASS HTMLHtmlElement must be primary interface of document.createElement("html")
-PASS Stringification of document.createElement("html")
-PASS HTMLHtmlElement interface: document.createElement("html") must inherit property "version" with the proper type
-PASS HTMLHeadElement interface: existence and properties of interface object
-PASS HTMLHeadElement interface object length
-PASS HTMLHeadElement interface object name
-PASS HTMLHeadElement interface: existence and properties of interface prototype object
-PASS HTMLHeadElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHeadElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHeadElement must be primary interface of document.createElement("head")
-PASS Stringification of document.createElement("head")
-PASS HTMLTitleElement interface: existence and properties of interface object
-PASS HTMLTitleElement interface object length
-PASS HTMLTitleElement interface object name
-PASS HTMLTitleElement interface: existence and properties of interface prototype object
-PASS HTMLTitleElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTitleElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTitleElement interface: attribute text
-PASS HTMLTitleElement must be primary interface of document.createElement("title")
-PASS Stringification of document.createElement("title")
-PASS HTMLTitleElement interface: document.createElement("title") must inherit property "text" with the proper type
-PASS HTMLBaseElement interface: existence and properties of interface object
-PASS HTMLBaseElement interface object length
-PASS HTMLBaseElement interface object name
-PASS HTMLBaseElement interface: existence and properties of interface prototype object
-PASS HTMLBaseElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLBaseElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLBaseElement interface: attribute href
-PASS HTMLBaseElement interface: attribute target
-PASS HTMLBaseElement must be primary interface of document.createElement("base")
-PASS Stringification of document.createElement("base")
-PASS HTMLBaseElement interface: document.createElement("base") must inherit property "href" with the proper type
-PASS HTMLBaseElement interface: document.createElement("base") must inherit property "target" with the proper type
-PASS HTMLLinkElement interface: existence and properties of interface object
-PASS HTMLLinkElement interface object length
-PASS HTMLLinkElement interface object name
-PASS HTMLLinkElement interface: existence and properties of interface prototype object
-PASS HTMLLinkElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLinkElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLinkElement interface: attribute href
-PASS HTMLLinkElement interface: attribute crossOrigin
-PASS HTMLLinkElement interface: attribute rel
-PASS HTMLLinkElement interface: attribute as
-PASS HTMLLinkElement interface: attribute relList
-PASS HTMLLinkElement interface: attribute media
-PASS HTMLLinkElement interface: attribute integrity
-PASS HTMLLinkElement interface: attribute hreflang
-PASS HTMLLinkElement interface: attribute type
-PASS HTMLLinkElement interface: attribute sizes
-PASS HTMLLinkElement interface: attribute referrerPolicy
-PASS HTMLLinkElement interface: attribute charset
-PASS HTMLLinkElement interface: attribute rev
-PASS HTMLLinkElement interface: attribute target
-PASS HTMLLinkElement must be primary interface of document.createElement("link")
-PASS Stringification of document.createElement("link")
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "href" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "crossOrigin" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rel" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "as" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "relList" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "media" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "integrity" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type
-PASS HTMLLinkElement interface: document.createElement("link") must inherit property "target" with the proper type
-PASS HTMLMetaElement interface: existence and properties of interface object
-PASS HTMLMetaElement interface object length
-PASS HTMLMetaElement interface object name
-PASS HTMLMetaElement interface: existence and properties of interface prototype object
-PASS HTMLMetaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMetaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMetaElement interface: attribute name
-PASS HTMLMetaElement interface: attribute httpEquiv
-PASS HTMLMetaElement interface: attribute content
-PASS HTMLMetaElement interface: attribute scheme
-PASS HTMLMetaElement must be primary interface of document.createElement("meta")
-PASS Stringification of document.createElement("meta")
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "name" with the proper type
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "httpEquiv" with the proper type
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "content" with the proper type
-PASS HTMLMetaElement interface: document.createElement("meta") must inherit property "scheme" with the proper type
-PASS HTMLStyleElement interface: existence and properties of interface object
-PASS HTMLStyleElement interface object length
-PASS HTMLStyleElement interface object name
-PASS HTMLStyleElement interface: existence and properties of interface prototype object
-PASS HTMLStyleElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLStyleElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLStyleElement interface: attribute media
-PASS HTMLStyleElement interface: attribute type
-PASS HTMLStyleElement must be primary interface of document.createElement("style")
-PASS Stringification of document.createElement("style")
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "media" with the proper type
-PASS HTMLStyleElement interface: document.createElement("style") must inherit property "type" with the proper type
-PASS HTMLBodyElement interface: existence and properties of interface object
-PASS HTMLBodyElement interface object length
-PASS HTMLBodyElement interface object name
-PASS HTMLBodyElement interface: existence and properties of interface prototype object
-PASS HTMLBodyElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLBodyElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLBodyElement interface: attribute text
-PASS HTMLBodyElement interface: attribute link
-PASS HTMLBodyElement interface: attribute vLink
-PASS HTMLBodyElement interface: attribute aLink
-PASS HTMLBodyElement interface: attribute bgColor
-PASS HTMLBodyElement interface: attribute background
-PASS HTMLBodyElement interface: attribute onafterprint
-PASS HTMLBodyElement interface: attribute onbeforeprint
-PASS HTMLBodyElement interface: attribute onbeforeunload
-PASS HTMLBodyElement interface: attribute onhashchange
-PASS HTMLBodyElement interface: attribute onlanguagechange
-PASS HTMLBodyElement interface: attribute onmessage
-PASS HTMLBodyElement interface: attribute onmessageerror
-PASS HTMLBodyElement interface: attribute onoffline
-PASS HTMLBodyElement interface: attribute ononline
-PASS HTMLBodyElement interface: attribute onpagehide
-PASS HTMLBodyElement interface: attribute onpageshow
-PASS HTMLBodyElement interface: attribute onpopstate
-PASS HTMLBodyElement interface: attribute onrejectionhandled
-PASS HTMLBodyElement interface: attribute onstorage
-PASS HTMLBodyElement interface: attribute onunhandledrejection
-PASS HTMLBodyElement interface: attribute onunload
-PASS HTMLBodyElement must be primary interface of document.createElement("body")
-PASS Stringification of document.createElement("body")
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "text" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "link" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "vLink" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "aLink" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "bgColor" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "background" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onafterprint" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeprint" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onbeforeunload" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onhashchange" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onlanguagechange" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessage" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onmessageerror" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onoffline" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "ononline" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpagehide" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpageshow" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onpopstate" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onrejectionhandled" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onstorage" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunhandledrejection" with the proper type
-PASS HTMLBodyElement interface: document.createElement("body") must inherit property "onunload" with the proper type
-PASS HTMLHeadingElement interface: existence and properties of interface object
-PASS HTMLHeadingElement interface object length
-PASS HTMLHeadingElement interface object name
-PASS HTMLHeadingElement interface: existence and properties of interface prototype object
-PASS HTMLHeadingElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHeadingElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHeadingElement interface: attribute align
-PASS HTMLHeadingElement must be primary interface of document.createElement("h1")
-PASS Stringification of document.createElement("h1")
-PASS HTMLHeadingElement interface: document.createElement("h1") must inherit property "align" with the proper type
-PASS HTMLParagraphElement interface: existence and properties of interface object
-PASS HTMLParagraphElement interface object length
-PASS HTMLParagraphElement interface object name
-PASS HTMLParagraphElement interface: existence and properties of interface prototype object
-PASS HTMLParagraphElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLParagraphElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLParagraphElement interface: attribute align
-PASS HTMLParagraphElement must be primary interface of document.createElement("p")
-PASS Stringification of document.createElement("p")
-PASS HTMLParagraphElement interface: document.createElement("p") must inherit property "align" with the proper type
-PASS HTMLHRElement interface: existence and properties of interface object
-PASS HTMLHRElement interface object length
-PASS HTMLHRElement interface object name
-PASS HTMLHRElement interface: existence and properties of interface prototype object
-PASS HTMLHRElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLHRElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLHRElement interface: attribute align
-PASS HTMLHRElement interface: attribute color
-PASS HTMLHRElement interface: attribute noShade
-PASS HTMLHRElement interface: attribute size
-PASS HTMLHRElement interface: attribute width
-PASS HTMLHRElement must be primary interface of document.createElement("hr")
-PASS Stringification of document.createElement("hr")
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "align" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "color" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "noShade" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "size" with the proper type
-PASS HTMLHRElement interface: document.createElement("hr") must inherit property "width" with the proper type
-PASS HTMLPreElement interface: existence and properties of interface object
-PASS HTMLPreElement interface object length
-PASS HTMLPreElement interface object name
-PASS HTMLPreElement interface: existence and properties of interface prototype object
-PASS HTMLPreElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLPreElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLPreElement interface: attribute width
-PASS HTMLPreElement must be primary interface of document.createElement("pre")
-PASS Stringification of document.createElement("pre")
-PASS HTMLPreElement interface: document.createElement("pre") must inherit property "width" with the proper type
-PASS HTMLPreElement must be primary interface of document.createElement("listing")
-PASS Stringification of document.createElement("listing")
-PASS HTMLPreElement interface: document.createElement("listing") must inherit property "width" with the proper type
-PASS HTMLPreElement must be primary interface of document.createElement("xmp")
-PASS Stringification of document.createElement("xmp")
-PASS HTMLPreElement interface: document.createElement("xmp") must inherit property "width" with the proper type
-PASS HTMLQuoteElement interface: existence and properties of interface object
-PASS HTMLQuoteElement interface object length
-PASS HTMLQuoteElement interface object name
-PASS HTMLQuoteElement interface: existence and properties of interface prototype object
-PASS HTMLQuoteElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLQuoteElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLQuoteElement interface: attribute cite
-PASS HTMLQuoteElement must be primary interface of document.createElement("blockquote")
-PASS Stringification of document.createElement("blockquote")
-PASS HTMLQuoteElement interface: document.createElement("blockquote") must inherit property "cite" with the proper type
-PASS HTMLQuoteElement must be primary interface of document.createElement("q")
-PASS Stringification of document.createElement("q")
-PASS HTMLQuoteElement interface: document.createElement("q") must inherit property "cite" with the proper type
-PASS HTMLOListElement interface: existence and properties of interface object
-PASS HTMLOListElement interface object length
-PASS HTMLOListElement interface object name
-PASS HTMLOListElement interface: existence and properties of interface prototype object
-PASS HTMLOListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOListElement interface: attribute reversed
-PASS HTMLOListElement interface: attribute start
-PASS HTMLOListElement interface: attribute type
-PASS HTMLOListElement interface: attribute compact
-PASS HTMLUListElement interface: existence and properties of interface object
-PASS HTMLUListElement interface object length
-PASS HTMLUListElement interface object name
-PASS HTMLUListElement interface: existence and properties of interface prototype object
-PASS HTMLUListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLUListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLUListElement interface: attribute compact
-PASS HTMLUListElement interface: attribute type
-PASS HTMLMenuElement interface: existence and properties of interface object
-PASS HTMLMenuElement interface object length
-PASS HTMLMenuElement interface object name
-PASS HTMLMenuElement interface: existence and properties of interface prototype object
-PASS HTMLMenuElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMenuElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMenuElement interface: attribute compact
-PASS HTMLMenuElement must be primary interface of document.createElement("menu")
-PASS Stringification of document.createElement("menu")
-PASS HTMLMenuElement interface: document.createElement("menu") must inherit property "compact" with the proper type
-PASS HTMLLIElement interface: existence and properties of interface object
-PASS HTMLLIElement interface object length
-PASS HTMLLIElement interface object name
-PASS HTMLLIElement interface: existence and properties of interface prototype object
-PASS HTMLLIElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLIElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLIElement interface: attribute value
-PASS HTMLLIElement interface: attribute type
-PASS HTMLLIElement must be primary interface of document.createElement("li")
-PASS Stringification of document.createElement("li")
-PASS HTMLLIElement interface: document.createElement("li") must inherit property "value" with the proper type
-PASS HTMLLIElement interface: document.createElement("li") must inherit property "type" with the proper type
-PASS HTMLDListElement interface: existence and properties of interface object
-PASS HTMLDListElement interface object length
-PASS HTMLDListElement interface object name
-PASS HTMLDListElement interface: existence and properties of interface prototype object
-PASS HTMLDListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDListElement interface: attribute compact
-PASS HTMLDivElement interface: existence and properties of interface object
-PASS HTMLDivElement interface object length
-PASS HTMLDivElement interface object name
-PASS HTMLDivElement interface: existence and properties of interface prototype object
-PASS HTMLDivElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDivElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDivElement interface: attribute align
-PASS HTMLDivElement must be primary interface of document.createElement("div")
-PASS Stringification of document.createElement("div")
-PASS HTMLDivElement interface: document.createElement("div") must inherit property "align" with the proper type
-PASS HTMLAnchorElement interface: existence and properties of interface object
-PASS HTMLAnchorElement interface object length
-PASS HTMLAnchorElement interface object name
-PASS HTMLAnchorElement interface: existence and properties of interface prototype object
-PASS HTMLAnchorElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAnchorElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAnchorElement interface: attribute target
-PASS HTMLAnchorElement interface: attribute download
-PASS HTMLAnchorElement interface: attribute ping
-PASS HTMLAnchorElement interface: attribute rel
-PASS HTMLAnchorElement interface: attribute relList
-PASS HTMLAnchorElement interface: attribute hreflang
-PASS HTMLAnchorElement interface: attribute type
-PASS HTMLAnchorElement interface: attribute text
-PASS HTMLAnchorElement interface: attribute referrerPolicy
-PASS HTMLAnchorElement interface: attribute coords
-PASS HTMLAnchorElement interface: attribute charset
-PASS HTMLAnchorElement interface: attribute name
-PASS HTMLAnchorElement interface: attribute rev
-PASS HTMLAnchorElement interface: attribute shape
-PASS HTMLAnchorElement interface: attribute href
-PASS HTMLAnchorElement interface: stringifier
-PASS HTMLAnchorElement interface: attribute origin
-PASS HTMLAnchorElement interface: attribute protocol
-PASS HTMLAnchorElement interface: attribute username
-PASS HTMLAnchorElement interface: attribute password
-PASS HTMLAnchorElement interface: attribute host
-PASS HTMLAnchorElement interface: attribute hostname
-PASS HTMLAnchorElement interface: attribute port
-PASS HTMLAnchorElement interface: attribute pathname
-PASS HTMLAnchorElement interface: attribute search
-PASS HTMLAnchorElement interface: attribute hash
-PASS HTMLAnchorElement must be primary interface of document.createElement("a")
-PASS Stringification of document.createElement("a")
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "target" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "download" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "ping" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rel" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "relList" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hreflang" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "type" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "text" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "referrerPolicy" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "coords" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "charset" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "name" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "rev" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "shape" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "href" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "origin" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "protocol" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "username" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "password" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "host" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hostname" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "port" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "pathname" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "search" with the proper type
-PASS HTMLAnchorElement interface: document.createElement("a") must inherit property "hash" with the proper type
-PASS HTMLDataElement interface: existence and properties of interface object
-PASS HTMLDataElement interface object length
-PASS HTMLDataElement interface object name
-PASS HTMLDataElement interface: existence and properties of interface prototype object
-PASS HTMLDataElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDataElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDataElement interface: attribute value
-PASS HTMLDataElement must be primary interface of document.createElement("data")
-PASS Stringification of document.createElement("data")
-PASS HTMLDataElement interface: document.createElement("data") must inherit property "value" with the proper type
-PASS HTMLTimeElement interface: existence and properties of interface object
-PASS HTMLTimeElement interface object length
-PASS HTMLTimeElement interface object name
-PASS HTMLTimeElement interface: existence and properties of interface prototype object
-PASS HTMLTimeElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTimeElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTimeElement interface: attribute dateTime
-PASS HTMLTimeElement must be primary interface of document.createElement("time")
-PASS Stringification of document.createElement("time")
-PASS HTMLTimeElement interface: document.createElement("time") must inherit property "dateTime" with the proper type
-PASS HTMLSpanElement interface: existence and properties of interface object
-PASS HTMLSpanElement interface object length
-PASS HTMLSpanElement interface object name
-PASS HTMLSpanElement interface: existence and properties of interface prototype object
-PASS HTMLSpanElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSpanElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSpanElement must be primary interface of document.createElement("span")
-PASS Stringification of document.createElement("span")
-PASS HTMLBRElement interface: existence and properties of interface object
-PASS HTMLBRElement interface object length
-PASS HTMLBRElement interface object name
-PASS HTMLBRElement interface: existence and properties of interface prototype object
-PASS HTMLBRElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLBRElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLBRElement interface: attribute clear
-PASS HTMLBRElement must be primary interface of document.createElement("br")
-PASS Stringification of document.createElement("br")
-PASS HTMLBRElement interface: document.createElement("br") must inherit property "clear" with the proper type
-PASS HTMLModElement interface: existence and properties of interface object
-PASS HTMLModElement interface object length
-PASS HTMLModElement interface object name
-PASS HTMLModElement interface: existence and properties of interface prototype object
-PASS HTMLModElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLModElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLModElement interface: attribute cite
-PASS HTMLModElement interface: attribute dateTime
-PASS HTMLModElement must be primary interface of document.createElement("ins")
-PASS Stringification of document.createElement("ins")
-PASS HTMLModElement interface: document.createElement("ins") must inherit property "cite" with the proper type
-PASS HTMLModElement interface: document.createElement("ins") must inherit property "dateTime" with the proper type
-PASS HTMLModElement must be primary interface of document.createElement("del")
-PASS Stringification of document.createElement("del")
-PASS HTMLModElement interface: document.createElement("del") must inherit property "cite" with the proper type
-PASS HTMLModElement interface: document.createElement("del") must inherit property "dateTime" with the proper type
-PASS HTMLPictureElement interface: existence and properties of interface object
-PASS HTMLPictureElement interface object length
-PASS HTMLPictureElement interface object name
-PASS HTMLPictureElement interface: existence and properties of interface prototype object
-PASS HTMLPictureElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLPictureElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLPictureElement must be primary interface of document.createElement("picture")
-PASS Stringification of document.createElement("picture")
-PASS HTMLSourceElement interface: existence and properties of interface object
-PASS HTMLSourceElement interface object length
-PASS HTMLSourceElement interface object name
-PASS HTMLSourceElement interface: existence and properties of interface prototype object
-PASS HTMLSourceElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSourceElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSourceElement interface: attribute src
-PASS HTMLSourceElement interface: attribute type
-PASS HTMLSourceElement interface: attribute srcset
-PASS HTMLSourceElement interface: attribute sizes
-PASS HTMLSourceElement interface: attribute media
-PASS HTMLSourceElement must be primary interface of document.createElement("source")
-PASS Stringification of document.createElement("source")
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "src" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "type" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "srcset" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "sizes" with the proper type
-PASS HTMLSourceElement interface: document.createElement("source") must inherit property "media" with the proper type
-PASS HTMLImageElement interface: existence and properties of interface object
-PASS HTMLImageElement interface object length
-PASS HTMLImageElement interface object name
-PASS HTMLImageElement interface: existence and properties of interface prototype object
-PASS HTMLImageElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLImageElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLImageElement interface: attribute alt
-PASS HTMLImageElement interface: attribute src
-PASS HTMLImageElement interface: attribute srcset
-PASS HTMLImageElement interface: attribute sizes
-PASS HTMLImageElement interface: attribute crossOrigin
-PASS HTMLImageElement interface: attribute useMap
-PASS HTMLImageElement interface: attribute isMap
-PASS HTMLImageElement interface: attribute width
-PASS HTMLImageElement interface: attribute height
-PASS HTMLImageElement interface: attribute naturalWidth
-PASS HTMLImageElement interface: attribute naturalHeight
-PASS HTMLImageElement interface: attribute complete
-PASS HTMLImageElement interface: attribute currentSrc
-PASS HTMLImageElement interface: attribute referrerPolicy
-PASS HTMLImageElement interface: operation decode()
-PASS HTMLImageElement interface: attribute name
-PASS HTMLImageElement interface: attribute lowsrc
-PASS HTMLImageElement interface: attribute align
-PASS HTMLImageElement interface: attribute hspace
-PASS HTMLImageElement interface: attribute vspace
-PASS HTMLImageElement interface: attribute longDesc
-PASS HTMLImageElement interface: attribute border
-PASS HTMLImageElement must be primary interface of document.createElement("img")
-PASS Stringification of document.createElement("img")
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "alt" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "src" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "srcset" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "sizes" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "crossOrigin" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "useMap" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "isMap" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "width" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "height" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalWidth" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "naturalHeight" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "complete" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "currentSrc" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "decode()" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "name" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "lowsrc" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "align" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "hspace" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "vspace" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "longDesc" with the proper type
-PASS HTMLImageElement interface: document.createElement("img") must inherit property "border" with the proper type
-PASS HTMLImageElement must be primary interface of new Image()
-PASS Stringification of new Image()
-PASS HTMLImageElement interface: new Image() must inherit property "alt" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "src" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "srcset" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "sizes" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "crossOrigin" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "useMap" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "isMap" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "width" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "height" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "naturalWidth" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "naturalHeight" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "complete" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "currentSrc" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "decode()" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "name" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "lowsrc" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "align" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "hspace" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "vspace" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "longDesc" with the proper type
-PASS HTMLImageElement interface: new Image() must inherit property "border" with the proper type
-PASS HTMLIFrameElement interface: existence and properties of interface object
-PASS HTMLIFrameElement interface object length
-PASS HTMLIFrameElement interface object name
-PASS HTMLIFrameElement interface: existence and properties of interface prototype object
-PASS HTMLIFrameElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLIFrameElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLIFrameElement interface: attribute src
-PASS HTMLIFrameElement interface: attribute srcdoc
-PASS HTMLIFrameElement interface: attribute name
-PASS HTMLIFrameElement interface: attribute sandbox
-PASS HTMLIFrameElement interface: attribute allowFullscreen
-PASS HTMLIFrameElement interface: attribute allowPaymentRequest
-FAIL HTMLIFrameElement interface: attribute allowUserMedia assert_true: The prototype object must have a property "allowUserMedia" expected true got false
-PASS HTMLIFrameElement interface: attribute width
-PASS HTMLIFrameElement interface: attribute height
-PASS HTMLIFrameElement interface: attribute referrerPolicy
-PASS HTMLIFrameElement interface: attribute contentDocument
-PASS HTMLIFrameElement interface: attribute contentWindow
-PASS HTMLIFrameElement interface: operation getSVGDocument()
-FAIL HTMLIFrameElement interface: attribute delegateStickyUserActivation assert_true: The prototype object must have a property "delegateStickyUserActivation" expected true got false
-PASS HTMLIFrameElement interface: attribute align
-PASS HTMLIFrameElement interface: attribute scrolling
-PASS HTMLIFrameElement interface: attribute frameBorder
-PASS HTMLIFrameElement interface: attribute longDesc
-PASS HTMLIFrameElement interface: attribute marginHeight
-PASS HTMLIFrameElement interface: attribute marginWidth
-PASS HTMLEmbedElement interface: existence and properties of interface object
-PASS HTMLEmbedElement interface object length
-PASS HTMLEmbedElement interface object name
-PASS HTMLEmbedElement interface: existence and properties of interface prototype object
-PASS HTMLEmbedElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLEmbedElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLEmbedElement interface: attribute src
-PASS HTMLEmbedElement interface: attribute type
-PASS HTMLEmbedElement interface: attribute width
-PASS HTMLEmbedElement interface: attribute height
-PASS HTMLEmbedElement interface: operation getSVGDocument()
-PASS HTMLEmbedElement interface: attribute align
-PASS HTMLEmbedElement interface: attribute name
-PASS HTMLEmbedElement must be primary interface of document.createElement("embed")
-PASS Stringification of document.createElement("embed")
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "src" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "type" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "width" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "height" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "getSVGDocument()" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "align" with the proper type
-PASS HTMLEmbedElement interface: document.createElement("embed") must inherit property "name" with the proper type
-PASS HTMLObjectElement interface: existence and properties of interface object
-PASS HTMLObjectElement interface object length
-PASS HTMLObjectElement interface object name
-PASS HTMLObjectElement interface: existence and properties of interface prototype object
-PASS HTMLObjectElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLObjectElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLObjectElement interface: attribute data
-PASS HTMLObjectElement interface: attribute type
-FAIL HTMLObjectElement interface: attribute typeMustMatch assert_true: The prototype object must have a property "typeMustMatch" expected true got false
-PASS HTMLObjectElement interface: attribute name
-PASS HTMLObjectElement interface: attribute useMap
-PASS HTMLObjectElement interface: attribute form
-PASS HTMLObjectElement interface: attribute width
-PASS HTMLObjectElement interface: attribute height
-PASS HTMLObjectElement interface: attribute contentDocument
-PASS HTMLObjectElement interface: attribute contentWindow
-PASS HTMLObjectElement interface: operation getSVGDocument()
-PASS HTMLObjectElement interface: attribute willValidate
-PASS HTMLObjectElement interface: attribute validity
-PASS HTMLObjectElement interface: attribute validationMessage
-PASS HTMLObjectElement interface: operation checkValidity()
-PASS HTMLObjectElement interface: operation reportValidity()
-PASS HTMLObjectElement interface: operation setCustomValidity(DOMString)
-PASS HTMLObjectElement interface: attribute align
-PASS HTMLObjectElement interface: attribute archive
-PASS HTMLObjectElement interface: attribute code
-PASS HTMLObjectElement interface: attribute declare
-PASS HTMLObjectElement interface: attribute hspace
-PASS HTMLObjectElement interface: attribute standby
-PASS HTMLObjectElement interface: attribute vspace
-PASS HTMLObjectElement interface: attribute codeBase
-PASS HTMLObjectElement interface: attribute codeType
-PASS HTMLObjectElement interface: attribute border
-PASS HTMLObjectElement must be primary interface of document.createElement("object")
-PASS Stringification of document.createElement("object")
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "data" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "type" with the proper type
-FAIL HTMLObjectElement interface: document.createElement("object") must inherit property "typeMustMatch" with the proper type assert_inherits: property "typeMustMatch" not found in prototype chain
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "name" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "useMap" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "form" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "width" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "height" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentDocument" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "contentWindow" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "getSVGDocument()" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "willValidate" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validity" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "validationMessage" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "checkValidity()" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "reportValidity()" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLObjectElement interface: calling setCustomValidity(DOMString) on document.createElement("object") with too few arguments must throw TypeError
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "align" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "archive" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "code" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "declare" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "hspace" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "standby" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "vspace" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeBase" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "codeType" with the proper type
-PASS HTMLObjectElement interface: document.createElement("object") must inherit property "border" with the proper type
-PASS HTMLParamElement interface: existence and properties of interface object
-PASS HTMLParamElement interface object length
-PASS HTMLParamElement interface object name
-PASS HTMLParamElement interface: existence and properties of interface prototype object
-PASS HTMLParamElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLParamElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLParamElement interface: attribute name
-PASS HTMLParamElement interface: attribute value
-PASS HTMLParamElement interface: attribute type
-PASS HTMLParamElement interface: attribute valueType
-PASS HTMLParamElement must be primary interface of document.createElement("param")
-PASS Stringification of document.createElement("param")
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "name" with the proper type
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "value" with the proper type
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "type" with the proper type
-PASS HTMLParamElement interface: document.createElement("param") must inherit property "valueType" with the proper type
-PASS HTMLVideoElement interface: existence and properties of interface object
-PASS HTMLVideoElement interface object length
-PASS HTMLVideoElement interface object name
-PASS HTMLVideoElement interface: existence and properties of interface prototype object
-PASS HTMLVideoElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLVideoElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLVideoElement interface: attribute width
-PASS HTMLVideoElement interface: attribute height
-PASS HTMLVideoElement interface: attribute videoWidth
-PASS HTMLVideoElement interface: attribute videoHeight
-PASS HTMLVideoElement interface: attribute poster
-FAIL HTMLVideoElement interface: attribute playsInline assert_true: The prototype object must have a property "playsInline" expected true got false
-PASS HTMLVideoElement must be primary interface of document.createElement("video")
-PASS Stringification of document.createElement("video")
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "width" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "height" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoWidth" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "videoHeight" with the proper type
-PASS HTMLVideoElement interface: document.createElement("video") must inherit property "poster" with the proper type
-FAIL HTMLVideoElement interface: document.createElement("video") must inherit property "playsInline" with the proper type assert_inherits: property "playsInline" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "error" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "src" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "srcObject" with the proper type Unrecognized type MediaStream
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentSrc" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "crossOrigin" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_EMPTY" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_IDLE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_LOADING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "NETWORK_NO_SOURCE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "networkState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "preload" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "buffered" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "load()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "canPlayType(DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("video") with too few arguments must throw TypeError
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_NOTHING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_METADATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_CURRENT_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_FUTURE_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "HAVE_ENOUGH_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "readyState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seeking" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "currentTime" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
-FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("video") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "duration" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("video") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "paused" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultPlaybackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "playbackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "played" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "seekable" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "ended" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "autoplay" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "loop" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "play()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "pause()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "controls" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "volume" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "muted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "defaultMuted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "audioTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "videoTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "textTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("video") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("video") with too few arguments must throw TypeError
-PASS HTMLAudioElement interface: existence and properties of interface object
-PASS HTMLAudioElement interface object length
-PASS HTMLAudioElement interface object name
-PASS HTMLAudioElement interface: existence and properties of interface prototype object
-PASS HTMLAudioElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAudioElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAudioElement must be primary interface of document.createElement("audio")
-PASS Stringification of document.createElement("audio")
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "error" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "src" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "srcObject" with the proper type Unrecognized type MediaStream
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentSrc" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "crossOrigin" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_EMPTY" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_IDLE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_LOADING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "NETWORK_NO_SOURCE" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "networkState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "preload" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "buffered" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "load()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "canPlayType(DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling canPlayType(DOMString) on document.createElement("audio") with too few arguments must throw TypeError
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_NOTHING" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_METADATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_CURRENT_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_FUTURE_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "HAVE_ENOUGH_DATA" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "readyState" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seeking" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "currentTime" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
-FAIL HTMLMediaElement interface: calling fastSeek(double) on document.createElement("audio") with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "duration" with the proper type
-FAIL HTMLMediaElement interface: document.createElement("audio") must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "paused" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultPlaybackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "playbackRate" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "played" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "seekable" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "ended" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "autoplay" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "loop" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "play()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "pause()" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "controls" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "volume" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "muted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "defaultMuted" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "audioTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "videoTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "textTracks" with the proper type
-PASS HTMLMediaElement interface: document.createElement("audio") must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on document.createElement("audio") with too few arguments must throw TypeError
-PASS HTMLAudioElement must be primary interface of new Audio()
-PASS Stringification of new Audio()
-PASS HTMLMediaElement interface: new Audio() must inherit property "error" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "src" with the proper type
-FAIL HTMLMediaElement interface: new Audio() must inherit property "srcObject" with the proper type Unrecognized type MediaStream
-PASS HTMLMediaElement interface: new Audio() must inherit property "currentSrc" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "crossOrigin" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_EMPTY" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_IDLE" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_LOADING" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "NETWORK_NO_SOURCE" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "networkState" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "preload" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "buffered" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "load()" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "canPlayType(DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling canPlayType(DOMString) on new Audio() with too few arguments must throw TypeError
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_NOTHING" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_METADATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_CURRENT_DATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_FUTURE_DATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "HAVE_ENOUGH_DATA" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "readyState" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "seeking" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "currentTime" with the proper type
-FAIL HTMLMediaElement interface: new Audio() must inherit property "fastSeek(double)" with the proper type assert_inherits: property "fastSeek" not found in prototype chain
-FAIL HTMLMediaElement interface: calling fastSeek(double) on new Audio() with too few arguments must throw TypeError assert_inherits: property "fastSeek" not found in prototype chain
-PASS HTMLMediaElement interface: new Audio() must inherit property "duration" with the proper type
-FAIL HTMLMediaElement interface: new Audio() must inherit property "getStartDate()" with the proper type assert_inherits: property "getStartDate" not found in prototype chain
-PASS HTMLMediaElement interface: new Audio() must inherit property "paused" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "defaultPlaybackRate" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "playbackRate" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "played" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "seekable" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "ended" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "autoplay" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "loop" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "play()" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "pause()" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "controls" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "volume" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "muted" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "defaultMuted" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "audioTracks" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "videoTracks" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "textTracks" with the proper type
-PASS HTMLMediaElement interface: new Audio() must inherit property "addTextTrack(TextTrackKind, DOMString, DOMString)" with the proper type
-PASS HTMLMediaElement interface: calling addTextTrack(TextTrackKind, DOMString, DOMString) on new Audio() with too few arguments must throw TypeError
-PASS HTMLTrackElement interface: existence and properties of interface object
-PASS HTMLTrackElement interface object length
-PASS HTMLTrackElement interface object name
-PASS HTMLTrackElement interface: existence and properties of interface prototype object
-PASS HTMLTrackElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTrackElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTrackElement interface: attribute kind
-PASS HTMLTrackElement interface: attribute src
-PASS HTMLTrackElement interface: attribute srclang
-PASS HTMLTrackElement interface: attribute label
-PASS HTMLTrackElement interface: attribute default
-PASS HTMLTrackElement interface: constant NONE on interface object
-PASS HTMLTrackElement interface: constant NONE on interface prototype object
-PASS HTMLTrackElement interface: constant LOADING on interface object
-PASS HTMLTrackElement interface: constant LOADING on interface prototype object
-PASS HTMLTrackElement interface: constant LOADED on interface object
-PASS HTMLTrackElement interface: constant LOADED on interface prototype object
-PASS HTMLTrackElement interface: constant ERROR on interface object
-PASS HTMLTrackElement interface: constant ERROR on interface prototype object
-PASS HTMLTrackElement interface: attribute readyState
-PASS HTMLTrackElement interface: attribute track
-PASS HTMLTrackElement must be primary interface of document.createElement("track")
-PASS Stringification of document.createElement("track")
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "kind" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "src" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "srclang" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "label" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "default" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "NONE" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADING" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "LOADED" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "ERROR" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "readyState" with the proper type
-PASS HTMLTrackElement interface: document.createElement("track") must inherit property "track" with the proper type
-PASS HTMLMediaElement interface: existence and properties of interface object
-PASS HTMLMediaElement interface object length
-PASS HTMLMediaElement interface object name
-PASS HTMLMediaElement interface: existence and properties of interface prototype object
-PASS HTMLMediaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMediaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMediaElement interface: attribute error
-PASS HTMLMediaElement interface: attribute src
-PASS HTMLMediaElement interface: attribute srcObject
-PASS HTMLMediaElement interface: attribute currentSrc
-PASS HTMLMediaElement interface: attribute crossOrigin
-PASS HTMLMediaElement interface: constant NETWORK_EMPTY on interface object
-PASS HTMLMediaElement interface: constant NETWORK_EMPTY on interface prototype object
-PASS HTMLMediaElement interface: constant NETWORK_IDLE on interface object
-PASS HTMLMediaElement interface: constant NETWORK_IDLE on interface prototype object
-PASS HTMLMediaElement interface: constant NETWORK_LOADING on interface object
-PASS HTMLMediaElement interface: constant NETWORK_LOADING on interface prototype object
-PASS HTMLMediaElement interface: constant NETWORK_NO_SOURCE on interface object
-PASS HTMLMediaElement interface: constant NETWORK_NO_SOURCE on interface prototype object
-PASS HTMLMediaElement interface: attribute networkState
-PASS HTMLMediaElement interface: attribute preload
-PASS HTMLMediaElement interface: attribute buffered
-PASS HTMLMediaElement interface: operation load()
-PASS HTMLMediaElement interface: operation canPlayType(DOMString)
-PASS HTMLMediaElement interface: constant HAVE_NOTHING on interface object
-PASS HTMLMediaElement interface: constant HAVE_NOTHING on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_METADATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_METADATA on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_CURRENT_DATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_CURRENT_DATA on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_FUTURE_DATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_FUTURE_DATA on interface prototype object
-PASS HTMLMediaElement interface: constant HAVE_ENOUGH_DATA on interface object
-PASS HTMLMediaElement interface: constant HAVE_ENOUGH_DATA on interface prototype object
-PASS HTMLMediaElement interface: attribute readyState
-PASS HTMLMediaElement interface: attribute seeking
-PASS HTMLMediaElement interface: attribute currentTime
-FAIL HTMLMediaElement interface: operation fastSeek(double) assert_own_property: interface prototype object missing non-static operation expected property "fastSeek" missing
-PASS HTMLMediaElement interface: attribute duration
-FAIL HTMLMediaElement interface: operation getStartDate() assert_own_property: interface prototype object missing non-static operation expected property "getStartDate" missing
-PASS HTMLMediaElement interface: attribute paused
-PASS HTMLMediaElement interface: attribute defaultPlaybackRate
-PASS HTMLMediaElement interface: attribute playbackRate
-PASS HTMLMediaElement interface: attribute played
-PASS HTMLMediaElement interface: attribute seekable
-PASS HTMLMediaElement interface: attribute ended
-PASS HTMLMediaElement interface: attribute autoplay
-PASS HTMLMediaElement interface: attribute loop
-PASS HTMLMediaElement interface: operation play()
-PASS HTMLMediaElement interface: operation pause()
-PASS HTMLMediaElement interface: attribute controls
-PASS HTMLMediaElement interface: attribute volume
-PASS HTMLMediaElement interface: attribute muted
-PASS HTMLMediaElement interface: attribute defaultMuted
-PASS HTMLMediaElement interface: attribute audioTracks
-PASS HTMLMediaElement interface: attribute videoTracks
-PASS HTMLMediaElement interface: attribute textTracks
-PASS HTMLMediaElement interface: operation addTextTrack(TextTrackKind, DOMString, DOMString)
-PASS HTMLMapElement interface: existence and properties of interface object
-PASS HTMLMapElement interface object length
-PASS HTMLMapElement interface object name
-PASS HTMLMapElement interface: existence and properties of interface prototype object
-PASS HTMLMapElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMapElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMapElement interface: attribute name
-PASS HTMLMapElement interface: attribute areas
-PASS HTMLMapElement must be primary interface of document.createElement("map")
-PASS Stringification of document.createElement("map")
-PASS HTMLMapElement interface: document.createElement("map") must inherit property "name" with the proper type
-PASS HTMLMapElement interface: document.createElement("map") must inherit property "areas" with the proper type
-PASS HTMLAreaElement interface: existence and properties of interface object
-PASS HTMLAreaElement interface object length
-PASS HTMLAreaElement interface object name
-PASS HTMLAreaElement interface: existence and properties of interface prototype object
-PASS HTMLAreaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLAreaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLAreaElement interface: attribute alt
-PASS HTMLAreaElement interface: attribute coords
-PASS HTMLAreaElement interface: attribute shape
-PASS HTMLAreaElement interface: attribute target
-PASS HTMLAreaElement interface: attribute download
-PASS HTMLAreaElement interface: attribute ping
-PASS HTMLAreaElement interface: attribute rel
-PASS HTMLAreaElement interface: attribute relList
-PASS HTMLAreaElement interface: attribute referrerPolicy
-PASS HTMLAreaElement interface: attribute noHref
-PASS HTMLAreaElement interface: attribute href
-PASS HTMLAreaElement interface: stringifier
-PASS HTMLAreaElement interface: attribute origin
-PASS HTMLAreaElement interface: attribute protocol
-PASS HTMLAreaElement interface: attribute username
-PASS HTMLAreaElement interface: attribute password
-PASS HTMLAreaElement interface: attribute host
-PASS HTMLAreaElement interface: attribute hostname
-PASS HTMLAreaElement interface: attribute port
-PASS HTMLAreaElement interface: attribute pathname
-PASS HTMLAreaElement interface: attribute search
-PASS HTMLAreaElement interface: attribute hash
-PASS HTMLAreaElement must be primary interface of document.createElement("area")
-PASS Stringification of document.createElement("area")
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "alt" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "coords" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "shape" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "target" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "download" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "ping" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "rel" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "relList" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "referrerPolicy" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "noHref" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "href" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "origin" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "protocol" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "username" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "password" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "host" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hostname" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "port" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "pathname" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "search" with the proper type
-PASS HTMLAreaElement interface: document.createElement("area") must inherit property "hash" with the proper type
-PASS HTMLTableElement interface: existence and properties of interface object
-PASS HTMLTableElement interface object length
-PASS HTMLTableElement interface object name
-PASS HTMLTableElement interface: existence and properties of interface prototype object
-PASS HTMLTableElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableElement interface: attribute caption
-PASS HTMLTableElement interface: operation createCaption()
-PASS HTMLTableElement interface: operation deleteCaption()
-PASS HTMLTableElement interface: attribute tHead
-PASS HTMLTableElement interface: operation createTHead()
-PASS HTMLTableElement interface: operation deleteTHead()
-PASS HTMLTableElement interface: attribute tFoot
-PASS HTMLTableElement interface: operation createTFoot()
-PASS HTMLTableElement interface: operation deleteTFoot()
-PASS HTMLTableElement interface: attribute tBodies
-PASS HTMLTableElement interface: operation createTBody()
-PASS HTMLTableElement interface: attribute rows
-PASS HTMLTableElement interface: operation insertRow(long)
-PASS HTMLTableElement interface: operation deleteRow(long)
-PASS HTMLTableElement interface: attribute align
-PASS HTMLTableElement interface: attribute border
-PASS HTMLTableElement interface: attribute frame
-PASS HTMLTableElement interface: attribute rules
-PASS HTMLTableElement interface: attribute summary
-PASS HTMLTableElement interface: attribute width
-PASS HTMLTableElement interface: attribute bgColor
-PASS HTMLTableElement interface: attribute cellPadding
-PASS HTMLTableElement interface: attribute cellSpacing
-PASS HTMLTableElement must be primary interface of document.createElement("table")
-PASS Stringification of document.createElement("table")
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "caption" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createCaption()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteCaption()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tHead" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTHead()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTHead()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tFoot" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTFoot()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteTFoot()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "tBodies" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "createTBody()" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "rows" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableElement interface: calling insertRow(long) on document.createElement("table") with too few arguments must throw TypeError
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableElement interface: calling deleteRow(long) on document.createElement("table") with too few arguments must throw TypeError
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "align" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "border" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "frame" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "rules" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "summary" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "width" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "bgColor" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellPadding" with the proper type
-PASS HTMLTableElement interface: document.createElement("table") must inherit property "cellSpacing" with the proper type
-PASS HTMLTableCaptionElement interface: existence and properties of interface object
-PASS HTMLTableCaptionElement interface object length
-PASS HTMLTableCaptionElement interface object name
-PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object
-PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableCaptionElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableCaptionElement interface: attribute align
-PASS HTMLTableCaptionElement must be primary interface of document.createElement("caption")
-PASS Stringification of document.createElement("caption")
-PASS HTMLTableCaptionElement interface: document.createElement("caption") must inherit property "align" with the proper type
-PASS HTMLTableColElement interface: existence and properties of interface object
-PASS HTMLTableColElement interface object length
-PASS HTMLTableColElement interface object name
-PASS HTMLTableColElement interface: existence and properties of interface prototype object
-PASS HTMLTableColElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableColElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableColElement interface: attribute span
-PASS HTMLTableColElement interface: attribute align
-PASS HTMLTableColElement interface: attribute ch
-PASS HTMLTableColElement interface: attribute chOff
-PASS HTMLTableColElement interface: attribute vAlign
-PASS HTMLTableColElement interface: attribute width
-PASS HTMLTableColElement must be primary interface of document.createElement("colgroup")
-PASS Stringification of document.createElement("colgroup")
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "span" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "align" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "ch" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "chOff" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "vAlign" with the proper type
-PASS HTMLTableColElement interface: document.createElement("colgroup") must inherit property "width" with the proper type
-PASS HTMLTableColElement must be primary interface of document.createElement("col")
-PASS Stringification of document.createElement("col")
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "span" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "align" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "ch" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "chOff" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "vAlign" with the proper type
-PASS HTMLTableColElement interface: document.createElement("col") must inherit property "width" with the proper type
-PASS HTMLTableSectionElement interface: existence and properties of interface object
-PASS HTMLTableSectionElement interface object length
-PASS HTMLTableSectionElement interface object name
-PASS HTMLTableSectionElement interface: existence and properties of interface prototype object
-PASS HTMLTableSectionElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableSectionElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableSectionElement interface: attribute rows
-PASS HTMLTableSectionElement interface: operation insertRow(long)
-PASS HTMLTableSectionElement interface: operation deleteRow(long)
-PASS HTMLTableSectionElement interface: attribute align
-PASS HTMLTableSectionElement interface: attribute ch
-PASS HTMLTableSectionElement interface: attribute chOff
-PASS HTMLTableSectionElement interface: attribute vAlign
-PASS HTMLTableSectionElement must be primary interface of document.createElement("tbody")
-PASS Stringification of document.createElement("tbody")
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "rows" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tbody") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tbody") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "align" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "ch" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "chOff" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tbody") must inherit property "vAlign" with the proper type
-PASS HTMLTableSectionElement must be primary interface of document.createElement("thead")
-PASS Stringification of document.createElement("thead")
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "rows" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("thead") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("thead") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "align" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "ch" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "chOff" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("thead") must inherit property "vAlign" with the proper type
-PASS HTMLTableSectionElement must be primary interface of document.createElement("tfoot")
-PASS Stringification of document.createElement("tfoot")
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "rows" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "insertRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling insertRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "deleteRow(long)" with the proper type
-PASS HTMLTableSectionElement interface: calling deleteRow(long) on document.createElement("tfoot") with too few arguments must throw TypeError
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "align" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "ch" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "chOff" with the proper type
-PASS HTMLTableSectionElement interface: document.createElement("tfoot") must inherit property "vAlign" with the proper type
-PASS HTMLTableRowElement interface: existence and properties of interface object
-PASS HTMLTableRowElement interface object length
-PASS HTMLTableRowElement interface object name
-PASS HTMLTableRowElement interface: existence and properties of interface prototype object
-PASS HTMLTableRowElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableRowElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableRowElement interface: attribute rowIndex
-PASS HTMLTableRowElement interface: attribute sectionRowIndex
-PASS HTMLTableRowElement interface: attribute cells
-PASS HTMLTableRowElement interface: operation insertCell(long)
-PASS HTMLTableRowElement interface: operation deleteCell(long)
-PASS HTMLTableRowElement interface: attribute align
-PASS HTMLTableRowElement interface: attribute ch
-PASS HTMLTableRowElement interface: attribute chOff
-PASS HTMLTableRowElement interface: attribute vAlign
-PASS HTMLTableRowElement interface: attribute bgColor
-PASS HTMLTableRowElement must be primary interface of document.createElement("tr")
-PASS Stringification of document.createElement("tr")
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "rowIndex" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "sectionRowIndex" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "cells" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "insertCell(long)" with the proper type
-PASS HTMLTableRowElement interface: calling insertCell(long) on document.createElement("tr") with too few arguments must throw TypeError
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "deleteCell(long)" with the proper type
-PASS HTMLTableRowElement interface: calling deleteCell(long) on document.createElement("tr") with too few arguments must throw TypeError
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "align" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "ch" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "chOff" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "vAlign" with the proper type
-PASS HTMLTableRowElement interface: document.createElement("tr") must inherit property "bgColor" with the proper type
-PASS HTMLTableCellElement interface: existence and properties of interface object
-PASS HTMLTableCellElement interface object length
-PASS HTMLTableCellElement interface object name
-PASS HTMLTableCellElement interface: existence and properties of interface prototype object
-PASS HTMLTableCellElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTableCellElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTableCellElement interface: attribute colSpan
-PASS HTMLTableCellElement interface: attribute rowSpan
-PASS HTMLTableCellElement interface: attribute headers
-PASS HTMLTableCellElement interface: attribute cellIndex
-PASS HTMLTableCellElement interface: attribute scope
-PASS HTMLTableCellElement interface: attribute abbr
-PASS HTMLTableCellElement interface: attribute align
-PASS HTMLTableCellElement interface: attribute axis
-PASS HTMLTableCellElement interface: attribute height
-PASS HTMLTableCellElement interface: attribute width
-PASS HTMLTableCellElement interface: attribute ch
-PASS HTMLTableCellElement interface: attribute chOff
-PASS HTMLTableCellElement interface: attribute noWrap
-PASS HTMLTableCellElement interface: attribute vAlign
-PASS HTMLTableCellElement interface: attribute bgColor
-PASS HTMLTableCellElement must be primary interface of document.createElement("td")
-PASS Stringification of document.createElement("td")
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "colSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "rowSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "headers" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "cellIndex" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "scope" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "abbr" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "align" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "axis" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "height" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "width" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "ch" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "chOff" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "noWrap" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "vAlign" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("td") must inherit property "bgColor" with the proper type
-PASS HTMLTableCellElement must be primary interface of document.createElement("th")
-PASS Stringification of document.createElement("th")
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "colSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "rowSpan" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "headers" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "cellIndex" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "scope" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "abbr" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "align" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "axis" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "height" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "width" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "ch" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "chOff" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "noWrap" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "vAlign" with the proper type
-PASS HTMLTableCellElement interface: document.createElement("th") must inherit property "bgColor" with the proper type
-PASS HTMLFormElement interface: existence and properties of interface object
-PASS HTMLFormElement interface object length
-PASS HTMLFormElement interface object name
-PASS HTMLFormElement interface: existence and properties of interface prototype object
-PASS HTMLFormElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFormElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFormElement interface: attribute acceptCharset
-PASS HTMLFormElement interface: attribute action
-PASS HTMLFormElement interface: attribute autocomplete
-PASS HTMLFormElement interface: attribute enctype
-PASS HTMLFormElement interface: attribute encoding
-PASS HTMLFormElement interface: attribute method
-PASS HTMLFormElement interface: attribute name
-PASS HTMLFormElement interface: attribute noValidate
-PASS HTMLFormElement interface: attribute target
-PASS HTMLFormElement interface: attribute elements
-PASS HTMLFormElement interface: attribute length
-PASS HTMLFormElement interface: operation submit()
-PASS HTMLFormElement interface: operation reset()
-PASS HTMLFormElement interface: operation checkValidity()
-PASS HTMLFormElement interface: operation reportValidity()
-PASS HTMLFormElement must be primary interface of document.createElement("form")
-PASS Stringification of document.createElement("form")
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "acceptCharset" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "action" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "autocomplete" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "enctype" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "encoding" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "method" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "name" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "noValidate" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "target" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "elements" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "length" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "submit()" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "reset()" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "checkValidity()" with the proper type
-PASS HTMLFormElement interface: document.createElement("form") must inherit property "reportValidity()" with the proper type
-PASS HTMLLabelElement interface: existence and properties of interface object
-PASS HTMLLabelElement interface object length
-PASS HTMLLabelElement interface object name
-PASS HTMLLabelElement interface: existence and properties of interface prototype object
-PASS HTMLLabelElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLabelElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLabelElement interface: attribute form
-PASS HTMLLabelElement interface: attribute htmlFor
-PASS HTMLLabelElement interface: attribute control
-PASS HTMLLabelElement must be primary interface of document.createElement("label")
-PASS Stringification of document.createElement("label")
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "form" with the proper type
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "htmlFor" with the proper type
-PASS HTMLLabelElement interface: document.createElement("label") must inherit property "control" with the proper type
-PASS HTMLInputElement interface: existence and properties of interface object
-PASS HTMLInputElement interface object length
-PASS HTMLInputElement interface object name
-PASS HTMLInputElement interface: existence and properties of interface prototype object
-PASS HTMLInputElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLInputElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLInputElement interface: attribute accept
-PASS HTMLInputElement interface: attribute alt
-PASS HTMLInputElement interface: attribute autocomplete
-PASS HTMLInputElement interface: attribute autofocus
-PASS HTMLInputElement interface: attribute defaultChecked
-PASS HTMLInputElement interface: attribute checked
-PASS HTMLInputElement interface: attribute dirName
-PASS HTMLInputElement interface: attribute disabled
-PASS HTMLInputElement interface: attribute form
-PASS HTMLInputElement interface: attribute files
-PASS HTMLInputElement interface: attribute formAction
-PASS HTMLInputElement interface: attribute formEnctype
-PASS HTMLInputElement interface: attribute formMethod
-PASS HTMLInputElement interface: attribute formNoValidate
-PASS HTMLInputElement interface: attribute formTarget
-PASS HTMLInputElement interface: attribute height
-PASS HTMLInputElement interface: attribute indeterminate
-PASS HTMLInputElement interface: attribute list
-PASS HTMLInputElement interface: attribute max
-PASS HTMLInputElement interface: attribute maxLength
-PASS HTMLInputElement interface: attribute min
-PASS HTMLInputElement interface: attribute minLength
-PASS HTMLInputElement interface: attribute multiple
-PASS HTMLInputElement interface: attribute name
-PASS HTMLInputElement interface: attribute pattern
-PASS HTMLInputElement interface: attribute placeholder
-PASS HTMLInputElement interface: attribute readOnly
-PASS HTMLInputElement interface: attribute required
-PASS HTMLInputElement interface: attribute size
-PASS HTMLInputElement interface: attribute src
-PASS HTMLInputElement interface: attribute step
-PASS HTMLInputElement interface: attribute type
-PASS HTMLInputElement interface: attribute defaultValue
-PASS HTMLInputElement interface: attribute value
-PASS HTMLInputElement interface: attribute valueAsDate
-PASS HTMLInputElement interface: attribute valueAsNumber
-PASS HTMLInputElement interface: attribute width
-PASS HTMLInputElement interface: operation stepUp(long)
-PASS HTMLInputElement interface: operation stepDown(long)
-PASS HTMLInputElement interface: attribute willValidate
-PASS HTMLInputElement interface: attribute validity
-PASS HTMLInputElement interface: attribute validationMessage
-PASS HTMLInputElement interface: operation checkValidity()
-PASS HTMLInputElement interface: operation reportValidity()
-PASS HTMLInputElement interface: operation setCustomValidity(DOMString)
-PASS HTMLInputElement interface: attribute labels
-PASS HTMLInputElement interface: operation select()
-PASS HTMLInputElement interface: attribute selectionStart
-PASS HTMLInputElement interface: attribute selectionEnd
-PASS HTMLInputElement interface: attribute selectionDirection
-PASS HTMLInputElement interface: operation setRangeText(DOMString)
-PASS HTMLInputElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)
-PASS HTMLInputElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString)
-PASS HTMLInputElement interface: attribute align
-PASS HTMLInputElement interface: attribute useMap
-PASS HTMLInputElement must be primary interface of document.createElement("input")
-PASS Stringification of document.createElement("input")
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("input") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: document.createElement("input") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("text")
-PASS Stringification of createInput("text")
-PASS HTMLInputElement interface: createInput("text") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("text") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("text") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("text") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("hidden")
-PASS Stringification of createInput("hidden")
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("hidden") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("hidden") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("search")
-PASS Stringification of createInput("search")
-PASS HTMLInputElement interface: createInput("search") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("search") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("search") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("search") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("tel")
-PASS Stringification of createInput("tel")
-PASS HTMLInputElement interface: createInput("tel") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("tel") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("tel") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("tel") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("url")
-PASS Stringification of createInput("url")
-PASS HTMLInputElement interface: createInput("url") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("url") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("url") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("url") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("email")
-PASS Stringification of createInput("email")
-PASS HTMLInputElement interface: createInput("email") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("email") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("email") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("email") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("password")
-PASS Stringification of createInput("password")
-PASS HTMLInputElement interface: createInput("password") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("password") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("password") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("password") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("date")
-PASS Stringification of createInput("date")
-PASS HTMLInputElement interface: createInput("date") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("date") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("date") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("date") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("month")
-PASS Stringification of createInput("month")
-PASS HTMLInputElement interface: createInput("month") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("month") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("month") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("month") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("week")
-PASS Stringification of createInput("week")
-PASS HTMLInputElement interface: createInput("week") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("week") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("week") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("week") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("time")
-PASS Stringification of createInput("time")
-PASS HTMLInputElement interface: createInput("time") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("time") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("time") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("datetime-local")
-PASS Stringification of createInput("datetime-local")
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("datetime-local") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("datetime-local") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("number")
-PASS Stringification of createInput("number")
-PASS HTMLInputElement interface: createInput("number") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("number") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("number") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("number") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("range")
-PASS Stringification of createInput("range")
-PASS HTMLInputElement interface: createInput("range") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("range") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("range") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("range") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("color")
-PASS Stringification of createInput("color")
-PASS HTMLInputElement interface: createInput("color") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("color") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("color") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("color") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("checkbox")
-PASS Stringification of createInput("checkbox")
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("checkbox") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("checkbox") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("radio")
-PASS Stringification of createInput("radio")
-PASS HTMLInputElement interface: createInput("radio") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("radio") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("radio") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("radio") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("file")
-PASS Stringification of createInput("file")
-PASS HTMLInputElement interface: createInput("file") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "form" with the proper type
-FAIL HTMLInputElement interface: createInput("file") must inherit property "files" with the proper type Unrecognized type FileList
-PASS HTMLInputElement interface: createInput("file") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("file") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("file") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("file") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("submit")
-PASS Stringification of createInput("submit")
-PASS HTMLInputElement interface: createInput("submit") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("submit") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("submit") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("submit") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("image")
-PASS Stringification of createInput("image")
-PASS HTMLInputElement interface: createInput("image") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("image") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("image") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("image") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("reset")
-PASS Stringification of createInput("reset")
-PASS HTMLInputElement interface: createInput("reset") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("reset") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("reset") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("reset") must inherit property "useMap" with the proper type
-PASS HTMLInputElement must be primary interface of createInput("button")
-PASS Stringification of createInput("button")
-PASS HTMLInputElement interface: createInput("button") must inherit property "accept" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "alt" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "autocomplete" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "autofocus" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "defaultChecked" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "checked" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "dirName" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "disabled" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "form" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "files" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formAction" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formEnctype" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formMethod" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formNoValidate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "formTarget" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "height" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "indeterminate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "list" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "max" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "maxLength" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "min" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "minLength" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "multiple" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "name" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "pattern" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "placeholder" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "readOnly" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "required" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "size" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "src" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "step" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "type" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "defaultValue" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "value" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsDate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "valueAsNumber" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "width" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "stepUp(long)" with the proper type
-PASS HTMLInputElement interface: calling stepUp(long) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "stepDown(long)" with the proper type
-PASS HTMLInputElement interface: calling stepDown(long) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "willValidate" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "validity" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "validationMessage" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "checkValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "reportValidity()" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setCustomValidity(DOMString) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "labels" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "select()" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionStart" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionEnd" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "selectionDirection" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLInputElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLInputElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on createInput("button") with too few arguments must throw TypeError
-PASS HTMLInputElement interface: createInput("button") must inherit property "align" with the proper type
-PASS HTMLInputElement interface: createInput("button") must inherit property "useMap" with the proper type
-PASS HTMLButtonElement interface: existence and properties of interface object
-PASS HTMLButtonElement interface object length
-PASS HTMLButtonElement interface object name
-PASS HTMLButtonElement interface: existence and properties of interface prototype object
-PASS HTMLButtonElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLButtonElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLButtonElement interface: attribute autofocus
-PASS HTMLButtonElement interface: attribute disabled
-PASS HTMLButtonElement interface: attribute form
-PASS HTMLButtonElement interface: attribute formAction
-PASS HTMLButtonElement interface: attribute formEnctype
-PASS HTMLButtonElement interface: attribute formMethod
-PASS HTMLButtonElement interface: attribute formNoValidate
-PASS HTMLButtonElement interface: attribute formTarget
-PASS HTMLButtonElement interface: attribute name
-PASS HTMLButtonElement interface: attribute type
-PASS HTMLButtonElement interface: attribute value
-PASS HTMLButtonElement interface: attribute willValidate
-PASS HTMLButtonElement interface: attribute validity
-PASS HTMLButtonElement interface: attribute validationMessage
-PASS HTMLButtonElement interface: operation checkValidity()
-PASS HTMLButtonElement interface: operation reportValidity()
-PASS HTMLButtonElement interface: operation setCustomValidity(DOMString)
-PASS HTMLButtonElement interface: attribute labels
-PASS HTMLButtonElement must be primary interface of document.createElement("button")
-PASS Stringification of document.createElement("button")
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "autofocus" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "disabled" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "form" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formAction" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formEnctype" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formMethod" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formNoValidate" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "formTarget" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "name" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "type" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "value" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "willValidate" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validity" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "validationMessage" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "checkValidity()" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "reportValidity()" with the proper type
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLButtonElement interface: calling setCustomValidity(DOMString) on document.createElement("button") with too few arguments must throw TypeError
-PASS HTMLButtonElement interface: document.createElement("button") must inherit property "labels" with the proper type
-PASS HTMLSelectElement interface: existence and properties of interface object
-PASS HTMLSelectElement interface object length
-PASS HTMLSelectElement interface object name
-PASS HTMLSelectElement interface: existence and properties of interface prototype object
-PASS HTMLSelectElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSelectElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSelectElement interface: attribute autocomplete
-PASS HTMLSelectElement interface: attribute autofocus
-PASS HTMLSelectElement interface: attribute disabled
-PASS HTMLSelectElement interface: attribute form
-PASS HTMLSelectElement interface: attribute multiple
-PASS HTMLSelectElement interface: attribute name
-PASS HTMLSelectElement interface: attribute required
-PASS HTMLSelectElement interface: attribute size
-PASS HTMLSelectElement interface: attribute type
-PASS HTMLSelectElement interface: attribute options
-PASS HTMLSelectElement interface: attribute length
-PASS HTMLSelectElement interface: operation item(unsigned long)
-PASS HTMLSelectElement interface: operation namedItem(DOMString)
-PASS HTMLSelectElement interface: operation add([object Object],[object Object], [object Object],[object Object])
-PASS HTMLSelectElement interface: operation remove()
-PASS HTMLSelectElement interface: operation remove(long)
-PASS HTMLSelectElement interface: attribute selectedOptions
-PASS HTMLSelectElement interface: attribute selectedIndex
-PASS HTMLSelectElement interface: attribute value
-PASS HTMLSelectElement interface: attribute willValidate
-PASS HTMLSelectElement interface: attribute validity
-PASS HTMLSelectElement interface: attribute validationMessage
-PASS HTMLSelectElement interface: operation checkValidity()
-PASS HTMLSelectElement interface: operation reportValidity()
-PASS HTMLSelectElement interface: operation setCustomValidity(DOMString)
-PASS HTMLSelectElement interface: attribute labels
-PASS HTMLSelectElement must be primary interface of document.createElement("select")
-PASS Stringification of document.createElement("select")
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autocomplete" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "autofocus" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "disabled" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "form" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "multiple" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "name" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "required" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "size" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "type" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "options" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "length" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "item(unsigned long)" with the proper type
-PASS HTMLSelectElement interface: calling item(unsigned long) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "namedItem(DOMString)" with the proper type
-PASS HTMLSelectElement interface: calling namedItem(DOMString) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "add([object Object],[object Object], [object Object],[object Object])" with the proper type
-PASS HTMLSelectElement interface: calling add([object Object],[object Object], [object Object],[object Object]) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove()" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "remove(long)" with the proper type
-PASS HTMLSelectElement interface: calling remove(long) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedOptions" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "selectedIndex" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "value" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "willValidate" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validity" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "validationMessage" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "checkValidity()" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "reportValidity()" with the proper type
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLSelectElement interface: calling setCustomValidity(DOMString) on document.createElement("select") with too few arguments must throw TypeError
-PASS HTMLSelectElement interface: document.createElement("select") must inherit property "labels" with the proper type
-PASS HTMLDataListElement interface: existence and properties of interface object
-PASS HTMLDataListElement interface object length
-PASS HTMLDataListElement interface object name
-PASS HTMLDataListElement interface: existence and properties of interface prototype object
-PASS HTMLDataListElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDataListElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDataListElement interface: attribute options
-PASS HTMLDataListElement must be primary interface of document.createElement("datalist")
-PASS Stringification of document.createElement("datalist")
-PASS HTMLDataListElement interface: document.createElement("datalist") must inherit property "options" with the proper type
-PASS HTMLOptGroupElement interface: existence and properties of interface object
-PASS HTMLOptGroupElement interface object length
-PASS HTMLOptGroupElement interface object name
-PASS HTMLOptGroupElement interface: existence and properties of interface prototype object
-PASS HTMLOptGroupElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOptGroupElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOptGroupElement interface: attribute disabled
-PASS HTMLOptGroupElement interface: attribute label
-PASS HTMLOptGroupElement must be primary interface of document.createElement("optgroup")
-PASS Stringification of document.createElement("optgroup")
-PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "disabled" with the proper type
-PASS HTMLOptGroupElement interface: document.createElement("optgroup") must inherit property "label" with the proper type
-PASS HTMLOptionElement interface: existence and properties of interface object
-PASS HTMLOptionElement interface object length
-PASS HTMLOptionElement interface object name
-PASS HTMLOptionElement interface: existence and properties of interface prototype object
-PASS HTMLOptionElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOptionElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOptionElement interface: attribute disabled
-PASS HTMLOptionElement interface: attribute form
-PASS HTMLOptionElement interface: attribute label
-PASS HTMLOptionElement interface: attribute defaultSelected
-PASS HTMLOptionElement interface: attribute selected
-PASS HTMLOptionElement interface: attribute value
-PASS HTMLOptionElement interface: attribute text
-PASS HTMLOptionElement interface: attribute index
-PASS HTMLOptionElement must be primary interface of document.createElement("option")
-PASS Stringification of document.createElement("option")
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "disabled" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "form" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "label" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "defaultSelected" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "selected" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "value" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "text" with the proper type
-PASS HTMLOptionElement interface: document.createElement("option") must inherit property "index" with the proper type
-PASS HTMLOptionElement must be primary interface of new Option()
-PASS Stringification of new Option()
-PASS HTMLOptionElement interface: new Option() must inherit property "disabled" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "form" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "label" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "defaultSelected" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "selected" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "value" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "text" with the proper type
-PASS HTMLOptionElement interface: new Option() must inherit property "index" with the proper type
-PASS HTMLTextAreaElement interface: existence and properties of interface object
-PASS HTMLTextAreaElement interface object length
-PASS HTMLTextAreaElement interface object name
-PASS HTMLTextAreaElement interface: existence and properties of interface prototype object
-PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTextAreaElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTextAreaElement interface: attribute autocomplete
-PASS HTMLTextAreaElement interface: attribute autofocus
-PASS HTMLTextAreaElement interface: attribute cols
-PASS HTMLTextAreaElement interface: attribute dirName
-PASS HTMLTextAreaElement interface: attribute disabled
-PASS HTMLTextAreaElement interface: attribute form
-PASS HTMLTextAreaElement interface: attribute maxLength
-PASS HTMLTextAreaElement interface: attribute minLength
-PASS HTMLTextAreaElement interface: attribute name
-PASS HTMLTextAreaElement interface: attribute placeholder
-PASS HTMLTextAreaElement interface: attribute readOnly
-PASS HTMLTextAreaElement interface: attribute required
-PASS HTMLTextAreaElement interface: attribute rows
-PASS HTMLTextAreaElement interface: attribute wrap
-PASS HTMLTextAreaElement interface: attribute type
-PASS HTMLTextAreaElement interface: attribute defaultValue
-PASS HTMLTextAreaElement interface: attribute value
-PASS HTMLTextAreaElement interface: attribute textLength
-PASS HTMLTextAreaElement interface: attribute willValidate
-PASS HTMLTextAreaElement interface: attribute validity
-PASS HTMLTextAreaElement interface: attribute validationMessage
-PASS HTMLTextAreaElement interface: operation checkValidity()
-PASS HTMLTextAreaElement interface: operation reportValidity()
-PASS HTMLTextAreaElement interface: operation setCustomValidity(DOMString)
-PASS HTMLTextAreaElement interface: attribute labels
-PASS HTMLTextAreaElement interface: operation select()
-PASS HTMLTextAreaElement interface: attribute selectionStart
-PASS HTMLTextAreaElement interface: attribute selectionEnd
-PASS HTMLTextAreaElement interface: attribute selectionDirection
-PASS HTMLTextAreaElement interface: operation setRangeText(DOMString)
-PASS HTMLTextAreaElement interface: operation setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)
-PASS HTMLTextAreaElement interface: operation setSelectionRange(unsigned long, unsigned long, DOMString)
-PASS HTMLTextAreaElement must be primary interface of document.createElement("textarea")
-PASS Stringification of document.createElement("textarea")
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autocomplete" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "autofocus" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "cols" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "dirName" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "disabled" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "form" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "maxLength" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "minLength" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "name" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "placeholder" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "readOnly" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "required" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "rows" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "wrap" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "type" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "defaultValue" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "value" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "textLength" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "willValidate" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validity" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "validationMessage" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "checkValidity()" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "reportValidity()" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLTextAreaElement interface: calling setCustomValidity(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "labels" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "select()" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionStart" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionEnd" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "selectionDirection" with the proper type
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString)" with the proper type
-PASS HTMLTextAreaElement interface: calling setRangeText(DOMString) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setRangeText(DOMString, unsigned long, unsigned long, SelectionMode)" with the proper type
-PASS HTMLTextAreaElement interface: calling setRangeText(DOMString, unsigned long, unsigned long, SelectionMode) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLTextAreaElement interface: document.createElement("textarea") must inherit property "setSelectionRange(unsigned long, unsigned long, DOMString)" with the proper type
-PASS HTMLTextAreaElement interface: calling setSelectionRange(unsigned long, unsigned long, DOMString) on document.createElement("textarea") with too few arguments must throw TypeError
-PASS HTMLOutputElement interface: existence and properties of interface object
-PASS HTMLOutputElement interface object length
-PASS HTMLOutputElement interface object name
-PASS HTMLOutputElement interface: existence and properties of interface prototype object
-PASS HTMLOutputElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLOutputElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLOutputElement interface: attribute htmlFor
-PASS HTMLOutputElement interface: attribute form
-PASS HTMLOutputElement interface: attribute name
-PASS HTMLOutputElement interface: attribute type
-PASS HTMLOutputElement interface: attribute defaultValue
-PASS HTMLOutputElement interface: attribute value
-PASS HTMLOutputElement interface: attribute willValidate
-PASS HTMLOutputElement interface: attribute validity
-PASS HTMLOutputElement interface: attribute validationMessage
-PASS HTMLOutputElement interface: operation checkValidity()
-PASS HTMLOutputElement interface: operation reportValidity()
-PASS HTMLOutputElement interface: operation setCustomValidity(DOMString)
-PASS HTMLOutputElement interface: attribute labels
-PASS HTMLOutputElement must be primary interface of document.createElement("output")
-PASS Stringification of document.createElement("output")
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "htmlFor" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "form" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "name" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "type" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "defaultValue" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "value" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "willValidate" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validity" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "validationMessage" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "checkValidity()" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "reportValidity()" with the proper type
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "setCustomValidity(DOMString)" with the proper type
-PASS HTMLOutputElement interface: calling setCustomValidity(DOMString) on document.createElement("output") with too few arguments must throw TypeError
-PASS HTMLOutputElement interface: document.createElement("output") must inherit property "labels" with the proper type
-PASS HTMLProgressElement interface: existence and properties of interface object
-PASS HTMLProgressElement interface object length
-PASS HTMLProgressElement interface object name
-PASS HTMLProgressElement interface: existence and properties of interface prototype object
-PASS HTMLProgressElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLProgressElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLProgressElement interface: attribute value
-PASS HTMLProgressElement interface: attribute max
-PASS HTMLProgressElement interface: attribute position
-PASS HTMLProgressElement interface: attribute labels
-PASS HTMLProgressElement must be primary interface of document.createElement("progress")
-PASS Stringification of document.createElement("progress")
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "value" with the proper type
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "max" with the proper type
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "position" with the proper type
-PASS HTMLProgressElement interface: document.createElement("progress") must inherit property "labels" with the proper type
-PASS HTMLMeterElement interface: existence and properties of interface object
-PASS HTMLMeterElement interface object length
-PASS HTMLMeterElement interface object name
-PASS HTMLMeterElement interface: existence and properties of interface prototype object
-PASS HTMLMeterElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMeterElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMeterElement interface: attribute value
-PASS HTMLMeterElement interface: attribute min
-PASS HTMLMeterElement interface: attribute max
-PASS HTMLMeterElement interface: attribute low
-PASS HTMLMeterElement interface: attribute high
-PASS HTMLMeterElement interface: attribute optimum
-PASS HTMLMeterElement interface: attribute labels
-PASS HTMLMeterElement must be primary interface of document.createElement("meter")
-PASS Stringification of document.createElement("meter")
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "value" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "min" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "max" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "low" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "high" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "optimum" with the proper type
-PASS HTMLMeterElement interface: document.createElement("meter") must inherit property "labels" with the proper type
-PASS HTMLFieldSetElement interface: existence and properties of interface object
-PASS HTMLFieldSetElement interface object length
-PASS HTMLFieldSetElement interface object name
-PASS HTMLFieldSetElement interface: existence and properties of interface prototype object
-PASS HTMLFieldSetElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFieldSetElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFieldSetElement interface: attribute disabled
-PASS HTMLFieldSetElement interface: attribute form
-PASS HTMLFieldSetElement interface: attribute name
-PASS HTMLFieldSetElement interface: attribute type
-PASS HTMLFieldSetElement interface: attribute elements
-PASS HTMLFieldSetElement interface: attribute willValidate
-PASS HTMLFieldSetElement interface: attribute validity
-PASS HTMLFieldSetElement interface: attribute validationMessage
-PASS HTMLFieldSetElement interface: operation checkValidity()
-PASS HTMLFieldSetElement interface: operation reportValidity()
-PASS HTMLFieldSetElement interface: operation setCustomValidity(DOMString)
-PASS HTMLLegendElement interface: existence and properties of interface object
-PASS HTMLLegendElement interface object length
-PASS HTMLLegendElement interface object name
-PASS HTMLLegendElement interface: existence and properties of interface prototype object
-PASS HTMLLegendElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLLegendElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLLegendElement interface: attribute form
-PASS HTMLLegendElement interface: attribute align
-PASS HTMLLegendElement must be primary interface of document.createElement("legend")
-PASS Stringification of document.createElement("legend")
-PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "form" with the proper type
-PASS HTMLLegendElement interface: document.createElement("legend") must inherit property "align" with the proper type
-PASS HTMLDetailsElement interface: existence and properties of interface object
-PASS HTMLDetailsElement interface object length
-PASS HTMLDetailsElement interface object name
-PASS HTMLDetailsElement interface: existence and properties of interface prototype object
-PASS HTMLDetailsElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDetailsElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDetailsElement interface: attribute open
-PASS HTMLDetailsElement must be primary interface of document.createElement("details")
-PASS Stringification of document.createElement("details")
-PASS HTMLDetailsElement interface: document.createElement("details") must inherit property "open" with the proper type
-PASS HTMLDialogElement interface: existence and properties of interface object
-PASS HTMLDialogElement interface object length
-PASS HTMLDialogElement interface object name
-PASS HTMLDialogElement interface: existence and properties of interface prototype object
-PASS HTMLDialogElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDialogElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDialogElement interface: attribute open
-PASS HTMLDialogElement interface: attribute returnValue
-PASS HTMLDialogElement interface: operation show()
-PASS HTMLDialogElement interface: operation showModal()
-PASS HTMLDialogElement interface: operation close(DOMString)
-PASS HTMLScriptElement interface: existence and properties of interface object
-PASS HTMLScriptElement interface object length
-PASS HTMLScriptElement interface object name
-PASS HTMLScriptElement interface: existence and properties of interface prototype object
-PASS HTMLScriptElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLScriptElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLScriptElement interface: attribute src
-PASS HTMLScriptElement interface: attribute type
-PASS HTMLScriptElement interface: attribute noModule
-PASS HTMLScriptElement interface: attribute async
-PASS HTMLScriptElement interface: attribute defer
-PASS HTMLScriptElement interface: attribute crossOrigin
-PASS HTMLScriptElement interface: attribute text
-PASS HTMLScriptElement interface: attribute integrity
-PASS HTMLScriptElement interface: attribute charset
-PASS HTMLScriptElement interface: attribute event
-PASS HTMLScriptElement interface: attribute htmlFor
-PASS HTMLScriptElement must be primary interface of document.createElement("script")
-PASS Stringification of document.createElement("script")
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "src" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "type" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "noModule" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "async" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "defer" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "crossOrigin" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "text" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "integrity" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "charset" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "event" with the proper type
-PASS HTMLScriptElement interface: document.createElement("script") must inherit property "htmlFor" with the proper type
-PASS HTMLTemplateElement interface: existence and properties of interface object
-PASS HTMLTemplateElement interface object length
-PASS HTMLTemplateElement interface object name
-PASS HTMLTemplateElement interface: existence and properties of interface prototype object
-PASS HTMLTemplateElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLTemplateElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLTemplateElement interface: attribute content
-PASS HTMLTemplateElement must be primary interface of document.createElement("template")
-PASS Stringification of document.createElement("template")
-PASS HTMLTemplateElement interface: document.createElement("template") must inherit property "content" with the proper type
-PASS HTMLSlotElement interface: existence and properties of interface object
-PASS HTMLSlotElement interface object length
-PASS HTMLSlotElement interface object name
-PASS HTMLSlotElement interface: existence and properties of interface prototype object
-PASS HTMLSlotElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLSlotElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLSlotElement interface: attribute name
-PASS HTMLSlotElement interface: operation assignedNodes(AssignedNodesOptions)
-PASS HTMLSlotElement interface: operation assignedElements(AssignedNodesOptions)
-PASS HTMLSlotElement must be primary interface of document.createElement("slot")
-PASS Stringification of document.createElement("slot")
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "name" with the proper type
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedNodes(AssignedNodesOptions)" with the proper type
-PASS HTMLSlotElement interface: calling assignedNodes(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError
-PASS HTMLSlotElement interface: document.createElement("slot") must inherit property "assignedElements(AssignedNodesOptions)" with the proper type
-PASS HTMLSlotElement interface: calling assignedElements(AssignedNodesOptions) on document.createElement("slot") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: existence and properties of interface object
-PASS HTMLCanvasElement interface object length
-PASS HTMLCanvasElement interface object name
-PASS HTMLCanvasElement interface: existence and properties of interface prototype object
-PASS HTMLCanvasElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLCanvasElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLCanvasElement interface: attribute width
-PASS HTMLCanvasElement interface: attribute height
-PASS HTMLCanvasElement interface: operation getContext(DOMString, any)
-PASS HTMLCanvasElement interface: operation toDataURL(DOMString, any)
-PASS HTMLCanvasElement interface: operation toBlob(BlobCallback, DOMString, any)
-PASS HTMLCanvasElement interface: operation transferControlToOffscreen()
-PASS HTMLCanvasElement must be primary interface of document.createElement("canvas")
-PASS Stringification of document.createElement("canvas")
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "width" with the proper type
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "height" with the proper type
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "getContext(DOMString, any)" with the proper type
-PASS HTMLCanvasElement interface: calling getContext(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toDataURL(DOMString, any)" with the proper type
-PASS HTMLCanvasElement interface: calling toDataURL(DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "toBlob(BlobCallback, DOMString, any)" with the proper type
-PASS HTMLCanvasElement interface: calling toBlob(BlobCallback, DOMString, any) on document.createElement("canvas") with too few arguments must throw TypeError
-PASS HTMLCanvasElement interface: document.createElement("canvas") must inherit property "transferControlToOffscreen()" with the proper type
-PASS HTMLMarqueeElement interface: existence and properties of interface object
-PASS HTMLMarqueeElement interface object length
-PASS HTMLMarqueeElement interface object name
-PASS HTMLMarqueeElement interface: existence and properties of interface prototype object
-PASS HTMLMarqueeElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLMarqueeElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLMarqueeElement interface: attribute behavior
-PASS HTMLMarqueeElement interface: attribute bgColor
-PASS HTMLMarqueeElement interface: attribute direction
-PASS HTMLMarqueeElement interface: attribute height
-PASS HTMLMarqueeElement interface: attribute hspace
-PASS HTMLMarqueeElement interface: attribute loop
-PASS HTMLMarqueeElement interface: attribute scrollAmount
-PASS HTMLMarqueeElement interface: attribute scrollDelay
-PASS HTMLMarqueeElement interface: attribute trueSpeed
-PASS HTMLMarqueeElement interface: attribute vspace
-PASS HTMLMarqueeElement interface: attribute width
-FAIL HTMLMarqueeElement interface: attribute onbounce assert_true: The prototype object must have a property "onbounce" expected true got false
-FAIL HTMLMarqueeElement interface: attribute onfinish assert_true: The prototype object must have a property "onfinish" expected true got false
-FAIL HTMLMarqueeElement interface: attribute onstart assert_true: The prototype object must have a property "onstart" expected true got false
-PASS HTMLMarqueeElement interface: operation start()
-PASS HTMLMarqueeElement interface: operation stop()
-PASS HTMLMarqueeElement must be primary interface of document.createElement("marquee")
-PASS Stringification of document.createElement("marquee")
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "behavior" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "bgColor" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "direction" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "height" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "hspace" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "loop" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollAmount" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "scrollDelay" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "trueSpeed" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "vspace" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "width" with the proper type
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onbounce" with the proper type assert_inherits: property "onbounce" not found in prototype chain
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onfinish" with the proper type assert_inherits: property "onfinish" not found in prototype chain
-FAIL HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "onstart" with the proper type assert_inherits: property "onstart" not found in prototype chain
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "start()" with the proper type
-PASS HTMLMarqueeElement interface: document.createElement("marquee") must inherit property "stop()" with the proper type
-PASS HTMLFrameSetElement interface: existence and properties of interface object
-PASS HTMLFrameSetElement interface object length
-PASS HTMLFrameSetElement interface object name
-PASS HTMLFrameSetElement interface: existence and properties of interface prototype object
-PASS HTMLFrameSetElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFrameSetElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFrameSetElement interface: attribute cols
-PASS HTMLFrameSetElement interface: attribute rows
-PASS HTMLFrameSetElement interface: attribute onafterprint
-PASS HTMLFrameSetElement interface: attribute onbeforeprint
-PASS HTMLFrameSetElement interface: attribute onbeforeunload
-PASS HTMLFrameSetElement interface: attribute onhashchange
-PASS HTMLFrameSetElement interface: attribute onlanguagechange
-PASS HTMLFrameSetElement interface: attribute onmessage
-PASS HTMLFrameSetElement interface: attribute onmessageerror
-PASS HTMLFrameSetElement interface: attribute onoffline
-PASS HTMLFrameSetElement interface: attribute ononline
-PASS HTMLFrameSetElement interface: attribute onpagehide
-PASS HTMLFrameSetElement interface: attribute onpageshow
-PASS HTMLFrameSetElement interface: attribute onpopstate
-PASS HTMLFrameSetElement interface: attribute onrejectionhandled
-PASS HTMLFrameSetElement interface: attribute onstorage
-PASS HTMLFrameSetElement interface: attribute onunhandledrejection
-PASS HTMLFrameSetElement interface: attribute onunload
-PASS HTMLFrameSetElement must be primary interface of document.createElement("frameset")
-PASS Stringification of document.createElement("frameset")
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "cols" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "rows" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onafterprint" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeprint" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onbeforeunload" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onhashchange" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onlanguagechange" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessage" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onmessageerror" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onoffline" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "ononline" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpagehide" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpageshow" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onpopstate" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onrejectionhandled" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onstorage" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunhandledrejection" with the proper type
-PASS HTMLFrameSetElement interface: document.createElement("frameset") must inherit property "onunload" with the proper type
-PASS HTMLFrameElement interface: existence and properties of interface object
-PASS HTMLFrameElement interface object length
-PASS HTMLFrameElement interface object name
-PASS HTMLFrameElement interface: existence and properties of interface prototype object
-PASS HTMLFrameElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFrameElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFrameElement interface: attribute name
-PASS HTMLFrameElement interface: attribute scrolling
-PASS HTMLFrameElement interface: attribute src
-PASS HTMLFrameElement interface: attribute frameBorder
-PASS HTMLFrameElement interface: attribute longDesc
-PASS HTMLFrameElement interface: attribute noResize
-PASS HTMLFrameElement interface: attribute contentDocument
-PASS HTMLFrameElement interface: attribute contentWindow
-PASS HTMLFrameElement interface: attribute marginHeight
-PASS HTMLFrameElement interface: attribute marginWidth
-PASS HTMLFrameElement must be primary interface of document.createElement("frame")
-PASS Stringification of document.createElement("frame")
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "name" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "scrolling" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "src" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "frameBorder" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "longDesc" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "noResize" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentDocument" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "contentWindow" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginHeight" with the proper type
-PASS HTMLFrameElement interface: document.createElement("frame") must inherit property "marginWidth" with the proper type
-PASS HTMLDirectoryElement interface: existence and properties of interface object
-PASS HTMLDirectoryElement interface object length
-PASS HTMLDirectoryElement interface object name
-PASS HTMLDirectoryElement interface: existence and properties of interface prototype object
-PASS HTMLDirectoryElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLDirectoryElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLDirectoryElement interface: attribute compact
-PASS HTMLDirectoryElement must be primary interface of document.createElement("dir")
-PASS Stringification of document.createElement("dir")
-PASS HTMLDirectoryElement interface: document.createElement("dir") must inherit property "compact" with the proper type
-PASS HTMLFontElement interface: existence and properties of interface object
-PASS HTMLFontElement interface object length
-PASS HTMLFontElement interface object name
-PASS HTMLFontElement interface: existence and properties of interface prototype object
-PASS HTMLFontElement interface: existence and properties of interface prototype object's "constructor" property
-PASS HTMLFontElement interface: existence and properties of interface prototype object's @@unscopables property
-PASS HTMLFontElement interface: attribute color
-PASS HTMLFontElement interface: attribute face
-PASS HTMLFontElement interface: attribute size
-PASS HTMLFontElement must be primary interface of document.createElement("font")
-PASS Stringification of document.createElement("font")
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "color" with the proper type
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "face" with the proper type
-PASS HTMLFontElement interface: document.createElement("font") must inherit property "size" with the proper type
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker.js b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker.js
index 9fc3dccc..8bf24b5 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/dom/interfaces.worker.js
@@ -28,7 +28,7 @@
   return Promise.all([fetchData("/interfaces/html.idl"),
                       fetchData("/interfaces/dom.idl"),
                       fetchData("/interfaces/cssom.idl"),
-                      fetchData("/interfaces/touchevents.idl"),
+                      fetchData("/interfaces/touch-events.idl"),
                       fetchData("/interfaces/uievents.idl")])
                 .then(doTest);
 }, "Test driver");
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/META.yml b/third_party/WebKit/LayoutTests/external/wpt/interfaces/META.yml
index e9ce8729..6895a5fc 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/META.yml
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/META.yml
@@ -1,3 +1,3 @@
 suggested_reviewers:
-  - jensl
-  - yuki3
+  - foolip
+  - lukebjerring
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-conditional.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-conditional.idl
index 6671de29..bfc384db3 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-conditional.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/css-conditional.idl
@@ -1,6 +1,7 @@
 // GENERATED CONTENT - DO NOT EDIT
-// Content of this file was automatically extracted from the CSS Conditional Rules spec.
-// See https://drafts.csswg.org/css-conditional/
+// Content of this file was automatically extracted from the
+// "CSS Conditional Rules Module Level 3" spec.
+// See: https://drafts.csswg.org/css-conditional-3/
 
 partial interface CSSRule {
     const unsigned short SUPPORTS_RULE = 12;
@@ -27,7 +28,7 @@
 interface CSSSupportsRule : CSSConditionRule {
 };
 
-partial interface CSS {
-  static boolean supports(CSSOMString property, CSSOMString value);
-  static boolean supports(CSSOMString conditionText);
+partial namespace CSS {
+  boolean supports(CSSOMString property, CSSOMString value);
+  boolean supports(CSSOMString conditionText);
 };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl
index d2d7b35..8ea9a86b 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/filter-effects.idl
@@ -1,6 +1,7 @@
 // GENERATED CONTENT - DO NOT EDIT
-// Content of this file was automatically extracted from the Filter Effects spec.
-// See https://drafts.fxtf.org/filter-effects/
+// Content of this file was automatically extracted from the
+// "Filter Effects Module Level 1" spec.
+// See: https://drafts.fxtf.org/filter-effects/
 
 interface SVGFilterElement : SVGElement {
   readonly attribute SVGAnimatedEnumeration filterUnits;
@@ -30,6 +31,17 @@
   const unsigned short SVG_FEBLEND_MODE_SCREEN = 3;
   const unsigned short SVG_FEBLEND_MODE_DARKEN = 4;
   const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5;
+  const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6;
+  const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7;
+  const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8;
+  const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9;
+  const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10;
+  const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11;
+  const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12;
+  const unsigned short SVG_FEBLEND_MODE_HUE = 13;
+  const unsigned short SVG_FEBLEND_MODE_SATURATION = 14;
+  const unsigned short SVG_FEBLEND_MODE_COLOR = 15;
+  const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16;
 
   readonly attribute SVGAnimatedString in1;
   readonly attribute SVGAnimatedString in2;
@@ -132,6 +144,7 @@
   readonly attribute SVGAnimatedEnumeration edgeMode;
   readonly attribute SVGAnimatedNumber kernelUnitLengthX;
   readonly attribute SVGAnimatedNumber kernelUnitLengthY;
+  readonly attribute SVGAnimatedBoolean preserveAlpha;
 };
 
 SVGFEConvolveMatrixElement includes SVGFilterPrimitiveStandardAttributes;
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/hr-time.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/hr-time.idl
index 3c793c32..ca15cf8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/hr-time.idl
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/hr-time.idl
@@ -1,17 +1,18 @@
 // GENERATED CONTENT - DO NOT EDIT
-// Content of this file was automatically extracted from the High Resolution Time spec.
-// See https://w3c.github.io/hr-time/
+// Content of this file was automatically extracted from the
+// "High Resolution Time Level 2" spec.
+// See: https://w3c.github.io/hr-time/
 
 typedef double DOMHighResTimeStamp;
 
 [Exposed=(Window,Worker)]
 interface Performance : EventTarget {
-    DOMHighResTimeStamp now ();
+    DOMHighResTimeStamp now();
     readonly attribute DOMHighResTimeStamp timeOrigin;
     [Default] object toJSON();
 };
 
-partial interface WindowOrWorkerGlobalScope {
+partial interface mixin WindowOrWorkerGlobalScope {
     [Replaceable]
     readonly    attribute Performance performance;
 };
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/html-media-capture.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/html-media-capture.idl
new file mode 100644
index 0000000..a398330
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/html-media-capture.idl
@@ -0,0 +1,8 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the
+// "HTML Media Capture" spec.
+// See: https://w3c.github.io/html-media-capture/
+
+partial interface HTMLInputElement {
+    [CEReactions] attribute DOMString capture;
+};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/intersection-observer.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/intersection-observer.idl
new file mode 100644
index 0000000..83c5d90
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/intersection-observer.idl
@@ -0,0 +1,45 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the
+// "Intersection Observer" spec.
+// See: https://w3c.github.io/IntersectionObserver/
+
+callback IntersectionObserverCallback = void (sequence<IntersectionObserverEntry> entries, IntersectionObserver observer);
+
+[Constructor(IntersectionObserverCallback callback, optional IntersectionObserverInit options),
+ Exposed=Window]
+interface IntersectionObserver {
+  readonly attribute Element? root;
+  readonly attribute DOMString rootMargin;
+  readonly attribute FrozenArray<double> thresholds;
+  void observe(Element target);
+  void unobserve(Element target);
+  void disconnect();
+  sequence<IntersectionObserverEntry> takeRecords();
+};
+
+[Constructor(IntersectionObserverEntryInit intersectionObserverEntryInit)]
+interface IntersectionObserverEntry {
+  readonly attribute DOMHighResTimeStamp time;
+  readonly attribute DOMRectReadOnly rootBounds;
+  readonly attribute DOMRectReadOnly boundingClientRect;
+  readonly attribute DOMRectReadOnly intersectionRect;
+  readonly attribute boolean isIntersecting;
+  readonly attribute double intersectionRatio;
+  readonly attribute Element target;
+};
+
+dictionary IntersectionObserverEntryInit {
+  required DOMHighResTimeStamp time;
+  required DOMRectInit rootBounds;
+  required DOMRectInit boundingClientRect;
+  required DOMRectInit intersectionRect;
+  required boolean isIntersecting;
+  required double intersectionRatio;
+  required Element target;
+};
+
+dictionary IntersectionObserverInit {
+  Element?  root = null;
+  DOMString rootMargin = "0px";
+  (double or sequence<double>) threshold = 0;
+};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/touchevents.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/touchevents.idl
deleted file mode 100644
index 81eec01..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/interfaces/touchevents.idl
+++ /dev/null
@@ -1,10 +0,0 @@
-interface Touch {
-    readonly    attribute long        identifier;
-    readonly    attribute EventTarget target;
-    readonly    attribute long        screenX;
-    readonly    attribute long        screenY;
-    readonly    attribute long        clientX;
-    readonly    attribute long        clientY;
-    readonly    attribute long        pageX;
-    readonly    attribute long        pageY;
-};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/interfaces/webmidi.idl b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webmidi.idl
new file mode 100644
index 0000000..eb7ed6bef
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/interfaces/webmidi.idl
@@ -0,0 +1,70 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content of this file was automatically extracted from the
+// "Web MIDI API" spec.
+// See: http://webaudio.github.io/web-midi-api/
+
+partial interface Navigator {
+    Promise<MIDIAccess> requestMIDIAccess(optional MIDIOptions options);
+};
+dictionary MIDIOptions {
+    boolean sysex;
+    boolean software;
+};
+interface MIDIInputMap {
+    readonly maplike<DOMString, MIDIInput>;
+};
+interface MIDIOutputMap {
+    readonly maplike<DOMString, MIDIOutput>;
+};
+interface MIDIAccess : EventTarget {
+    readonly attribute MIDIInputMap  inputs;
+    readonly attribute MIDIOutputMap outputs;
+             attribute EventHandler  onstatechange;
+    readonly attribute boolean       sysexEnabled;
+};
+interface MIDIPort : EventTarget {
+    readonly attribute DOMString               id;
+    readonly attribute DOMString?              manufacturer;
+    readonly attribute DOMString?              name;
+    readonly attribute MIDIPortType            type;
+    readonly attribute DOMString?              version;
+    readonly attribute MIDIPortDeviceState     state;
+    readonly attribute MIDIPortConnectionState connection;
+             attribute EventHandler            onstatechange;
+    Promise<MIDIPort> open();
+    Promise<MIDIPort> close();
+};
+interface MIDIInput : MIDIPort {
+    attribute EventHandler onmidimessage;
+};
+interface MIDIOutput : MIDIPort {
+    void send(sequence<octet> data, optional DOMHighResTimeStamp timestamp = 0);
+    void clear();
+};
+enum MIDIPortType {
+    "input",
+    "output",
+};
+enum MIDIPortDeviceState {
+    "disconnected",
+    "connected",
+};
+enum MIDIPortConnectionState {
+    "open",
+    "closed",
+    "pending",
+};
+[Constructor(DOMString type, optional MIDIMessageEventInit eventInitDict)]
+interface MIDIMessageEvent : Event {
+    readonly attribute Uint8Array data;
+};
+dictionary MIDIMessageEventInit : EventInit {
+    Uint8Array data;
+};
+[Constructor(DOMString type, optional MIDIConnectionEventInit eventInitDict)]
+interface MIDIConnectionEvent : Event {
+    readonly attribute MIDIPort port;
+};
+dictionary MIDIConnectionEventInit : EventInit {
+    MIDIPort port;
+};
diff --git a/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/idlharness.window-expected.txt
new file mode 100644
index 0000000..1eabbd4
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/idlharness.window-expected.txt
@@ -0,0 +1,41 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS IntersectionObserver interface: existence and properties of interface object
+PASS IntersectionObserver interface object length
+PASS IntersectionObserver interface object name
+PASS IntersectionObserver interface: existence and properties of interface prototype object
+PASS IntersectionObserver interface: existence and properties of interface prototype object's "constructor" property
+PASS IntersectionObserver interface: existence and properties of interface prototype object's @@unscopables property
+PASS IntersectionObserver interface: attribute root
+PASS IntersectionObserver interface: attribute rootMargin
+PASS IntersectionObserver interface: attribute thresholds
+PASS IntersectionObserver interface: operation observe(Element)
+PASS IntersectionObserver interface: operation unobserve(Element)
+PASS IntersectionObserver interface: operation disconnect()
+PASS IntersectionObserver interface: operation takeRecords()
+PASS IntersectionObserver must be primary interface of observer
+PASS Stringification of observer
+PASS IntersectionObserver interface: observer must inherit property "root" with the proper type
+PASS IntersectionObserver interface: observer must inherit property "rootMargin" with the proper type
+PASS IntersectionObserver interface: observer must inherit property "thresholds" with the proper type
+PASS IntersectionObserver interface: observer must inherit property "observe(Element)" with the proper type
+PASS IntersectionObserver interface: calling observe(Element) on observer with too few arguments must throw TypeError
+PASS IntersectionObserver interface: observer must inherit property "unobserve(Element)" with the proper type
+PASS IntersectionObserver interface: calling unobserve(Element) on observer with too few arguments must throw TypeError
+PASS IntersectionObserver interface: observer must inherit property "disconnect()" with the proper type
+PASS IntersectionObserver interface: observer must inherit property "takeRecords()" with the proper type
+PASS IntersectionObserverEntry interface: existence and properties of interface object
+FAIL IntersectionObserverEntry interface object length assert_equals: wrong value for IntersectionObserverEntry.length expected 1 but got 0
+PASS IntersectionObserverEntry interface object name
+PASS IntersectionObserverEntry interface: existence and properties of interface prototype object
+PASS IntersectionObserverEntry interface: existence and properties of interface prototype object's "constructor" property
+PASS IntersectionObserverEntry interface: existence and properties of interface prototype object's @@unscopables property
+PASS IntersectionObserverEntry interface: attribute time
+PASS IntersectionObserverEntry interface: attribute rootBounds
+PASS IntersectionObserverEntry interface: attribute boundingClientRect
+PASS IntersectionObserverEntry interface: attribute intersectionRect
+PASS IntersectionObserverEntry interface: attribute isIntersecting
+PASS IntersectionObserverEntry interface: attribute intersectionRatio
+PASS IntersectionObserverEntry interface: attribute target
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/idlharness.window.js
new file mode 100644
index 0000000..2059e1c
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/intersection-observer/idlharness.window.js
@@ -0,0 +1,22 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+'use strict';
+
+// https://w3c.github.io/IntersectionObserver/
+
+idl_test(
+  ['intersection-observer'],
+  ['dom'],
+  idl_array => {
+    idl_array.add_objects({
+      IntersectionObserver: ['observer'],
+    });
+    var options = {
+      root: document.body,
+      rootMargin: '0px',
+      threshold: 1.0
+    }
+    self.observer = new IntersectionObserver(() => {}, options);
+  }
+);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any-expected.txt
index 386002af..686525e2 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 63 tests; 37 PASS, 26 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 63 tests; 43 PASS, 20 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idlharness
 PASS Test IDL implementation of Media Capabilities
 PASS Partial interface Navigator: original interface defined
@@ -34,12 +34,12 @@
 PASS MediaCapabilities interface: existence and properties of interface prototype object's @@unscopables property
 PASS MediaCapabilities interface: operation decodingInfo(MediaDecodingConfiguration)
 PASS MediaCapabilities interface: operation encodingInfo(MediaEncodingConfiguration)
-FAIL MediaCapabilities must be primary interface of navigatior.mediaCapabilities assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL Stringification of navigatior.mediaCapabilities assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: navigatior.mediaCapabilities must inherit property "decodingInfo(MediaDecodingConfiguration)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: calling decodingInfo(MediaDecodingConfiguration) on navigatior.mediaCapabilities with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: navigatior.mediaCapabilities must inherit property "encodingInfo(MediaEncodingConfiguration)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: calling encodingInfo(MediaEncodingConfiguration) on navigatior.mediaCapabilities with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
+PASS MediaCapabilities must be primary interface of navigator.mediaCapabilities
+PASS Stringification of navigator.mediaCapabilities
+PASS MediaCapabilities interface: navigator.mediaCapabilities must inherit property "decodingInfo(MediaDecodingConfiguration)" with the proper type
+PASS MediaCapabilities interface: calling decodingInfo(MediaDecodingConfiguration) on navigator.mediaCapabilities with too few arguments must throw TypeError
+PASS MediaCapabilities interface: navigator.mediaCapabilities must inherit property "encodingInfo(MediaEncodingConfiguration)" with the proper type
+PASS MediaCapabilities interface: calling encodingInfo(MediaEncodingConfiguration) on navigator.mediaCapabilities with too few arguments must throw TypeError
 FAIL ScreenLuminance interface: existence and properties of interface object assert_own_property: self does not have own property "ScreenLuminance" expected property "ScreenLuminance" missing
 FAIL ScreenLuminance interface object length assert_own_property: self does not have own property "ScreenLuminance" expected property "ScreenLuminance" missing
 FAIL ScreenLuminance interface object name assert_own_property: self does not have own property "ScreenLuminance" expected property "ScreenLuminance" missing
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.js b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.js
index 41ede3d0..0be4674f 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.js
@@ -36,7 +36,7 @@
         idl_array.add_objects({ Navigator: ['navigator'] });
       }
       idl_array.add_objects({
-        MediaCapabilities: ['navigatior.mediaCapabilities'],
+        MediaCapabilities: ['navigator.mediaCapabilities'],
         MediaCapabilitiesInfo: ['decodingInfo', 'encodingInfo'],
         Screen: ['screen'],
         ScreenLuminance: ['screen.luminance'],
diff --git a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.worker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.worker-expected.txt
index f0e2b93..3f3eb88 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/media-capabilities/idlharness.any.worker-expected.txt
@@ -34,12 +34,12 @@
 FAIL MediaCapabilities interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MediaCapabilities" expected property "MediaCapabilities" missing
 FAIL MediaCapabilities interface: operation decodingInfo(MediaDecodingConfiguration) assert_own_property: self does not have own property "MediaCapabilities" expected property "MediaCapabilities" missing
 FAIL MediaCapabilities interface: operation encodingInfo(MediaEncodingConfiguration) assert_own_property: self does not have own property "MediaCapabilities" expected property "MediaCapabilities" missing
-FAIL MediaCapabilities must be primary interface of navigatior.mediaCapabilities assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL Stringification of navigatior.mediaCapabilities assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: navigatior.mediaCapabilities must inherit property "decodingInfo(MediaDecodingConfiguration)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: calling decodingInfo(MediaDecodingConfiguration) on navigatior.mediaCapabilities with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: navigatior.mediaCapabilities must inherit property "encodingInfo(MediaEncodingConfiguration)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
-FAIL MediaCapabilities interface: calling encodingInfo(MediaEncodingConfiguration) on navigatior.mediaCapabilities with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: navigatior is not defined"
+FAIL MediaCapabilities must be primary interface of navigator.mediaCapabilities assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL Stringification of navigator.mediaCapabilities assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MediaCapabilities interface: navigator.mediaCapabilities must inherit property "decodingInfo(MediaDecodingConfiguration)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MediaCapabilities interface: calling decodingInfo(MediaDecodingConfiguration) on navigator.mediaCapabilities with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MediaCapabilities interface: navigator.mediaCapabilities must inherit property "encodingInfo(MediaEncodingConfiguration)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MediaCapabilities interface: calling encodingInfo(MediaEncodingConfiguration) on navigator.mediaCapabilities with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
 PASS ScreenLuminance interface: existence and properties of interface object
 FAIL ScreenLuminance must be primary interface of screen.luminance assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: screen is not defined"
 FAIL Stringification of screen.luminance assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: screen is not defined"
diff --git a/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_test_navigate_iframe.html b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_test_navigate_iframe.html
new file mode 100644
index 0000000..0490610
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/navigation-timing/nav2_test_navigate_iframe.html
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML>
+<html>
+  <head>
+    <meta charset=utf-8>
+    <title>PerformanceNavigationTiming.name updated in iframes</title>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+  </head>
+  <body>
+    <script>
+async_test(async function (t) {
+  var ifr = document.createElement("iframe");
+  document.body.appendChild(ifr);
+
+  ifr.src="resources/blank_page_green.html";
+  await new Promise(resolve => {
+    ifr.onload = function() {
+      assert_equals(ifr.contentWindow.performance.getEntriesByType("navigation").length, 1, "Only one navigation time entry");
+      assert_equals(ifr.contentWindow.performance.getEntriesByType("navigation")[0].name, ifr.contentWindow.location.toString(), "navigation name matches the window.location");
+      assert_true(ifr.contentWindow.performance.getEntriesByType("navigation")[0].name.endsWith("blank_page_green.html"), "navigation name is blank_page_green.html");
+      resolve();
+    }
+  });
+
+
+  await new Promise(resolve => { setTimeout(resolve, 100); });
+  ifr.src ="resources/blank_page_yellow.html";
+
+  await new Promise(resolve => {
+    ifr.onload = function() {
+      assert_equals(ifr.contentWindow.performance.getEntriesByType("navigation").length, 1, "Only one navigation time entry");
+      assert_equals(ifr.contentWindow.performance.getEntriesByType("navigation")[0].name, ifr.contentWindow.location.toString(), "navigation name matches the window.location");
+      assert_true(ifr.contentWindow.performance.getEntriesByType("navigation")[0].name.endsWith("blank_page_yellow.html"), "navigation name is blank_page_yellow.html");
+      resolve();
+    }
+  });
+
+  t.done();
+}, "navigation.name updated when iframe URL changes");
+    </script>
+  </body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy-single-report.https.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy-single-report.https.tentative.html
new file mode 100644
index 0000000..24ee8999
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy-single-report.https.tentative.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <script src='/resources/testharness.js'></script>
+  <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+  <iframe id=frame></iframe>
+  <script>
+    async_test(t => {
+      let violations = [];
+      window.addEventListener("message", (e) => {
+        violations.push(e);
+        t.step_timeout(() => {
+          assert_equals(violations.length, 1);
+          t.done();
+        });
+      });
+
+      let forbidden_image = "<img src=https://127.0.0.1:1234/bla.jpg>";
+      let event_bouncer = "<script>document.addEventListener(" +
+          "'securitypolicyviolation'," +
+          "(e) => window.parent.postMessage(e.blockedURI, '*'));</sc" +
+          "ript>";
+      document.getElementById("frame").src =
+        "data:text/html;charset=utf-8," + event_bouncer + forbidden_image;
+    }, "Origin-Policy-based CSP violation should trigger 1 violation event");
+  </script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy-single-report.https.tentative.html.headers b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy-single-report.https.tentative.html.headers
new file mode 100644
index 0000000..cb596cf
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy-single-report.https.tentative.html.headers
@@ -0,0 +1 @@
+Sec-Origin-Policy: policy-noimg
diff --git a/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy.https.tentative.html b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy.https.tentative.html
new file mode 100644
index 0000000..34a71fe
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/origin-policy.https.tentative.html
@@ -0,0 +1,143 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+  <script src='/resources/testharness.js'></script>
+  <script src='/resources/testharnessreport.js'></script>
+</head>
+<body>
+  <div id=log></div>
+  <iframe id=frame></iframe>
+  <script>
+    // Navigate the frame to a test page with the given policy and wait for
+    // postMessage to arrive. Resolve the result promise with the message.
+    function navigate(policy) {
+      return new Promise(resolve => {
+        window.addEventListener("message", event => { resolve(event.data); },
+                                { once: true });
+        document.getElementById("frame").src =
+            "/origin-policy/sec-origin-policy-header.html.py?policy=" + policy;
+      });
+    }
+
+    // Check whether the message returned from the frame meets our expectations.
+    function expect(expect_script, expect_eval, message) {
+      assert_own_property(message, "inline_allowed");
+      assert_own_property(message, "eval_allowed");
+      assert_equals(message.inline_allowed, expect_script);
+      assert_equals(message.eval_allowed, expect_eval);
+    }
+
+    // Generate a more descriptive error message. Re-throw the error.
+    function descriptive_message(policy, expect_inline, expect_eval,
+                                 index, error) {
+      error.message = `Error occured on entry #${index + 1} ["${policy
+          }", ${expect_inline}, ${expect_eval}]: "${error}".`;
+      throw(error);
+    }
+
+    // Run the navigation + expectation checking for one test case line.
+    function test_case_entry([policy, expect_inline, expect_eval], index) {
+      return navigate(policy)
+          .then(message => expect(expect_inline, expect_eval, message))
+
+          // This catch handler merely logs a more friendly message,
+          // pointing you to the exact line of the failing test.
+          .catch(error => descriptive_message(policy, expect_inline,
+                                              expect_eval, index, error));
+    }
+
+    function origin_policy_csp_test_case(test_case_list) {
+      return t => {
+        // Setup the promise chain for the test.
+        let chain = Promise.resolve();
+        for ([index, val] of test_case_list.entries())
+          chain = chain.then(test_case_entry.bind(this, val, index));
+
+        // Delete the policy as the last element of the chain, on both
+        // resolve + reject paths, so that a left-over policy won't break
+        // subsequent tests.
+        return chain.then(() => navigate("0"),
+                          (error) => { navigate("0"); throw error; });
+      }
+    }
+
+
+    // Sanity check: A request with no policy.
+    promise_test(origin_policy_csp_test_case([
+        ["", true, true],  // No policy.
+    ]), "sanity check");
+
+    // Basic functionality. A policy should have an effect.
+    promise_test(origin_policy_csp_test_case([
+        ["",             true, true],  // No policy.
+        ["policy-csp-1", true, false], // policy-csp-1, which forbids eval.
+        ["0",            true, true],  // Delete the policy again.
+      ]), "The basics: A policy should have an effect..");
+
+    // Basic functionality. Set a policy. Make sure it "sticks".
+    promise_test(origin_policy_csp_test_case([
+        ["",             true, true],  // No policy.
+        ["policy-csp-1", true, false], // policy-csp-1, which forbids eval.
+        ["",             true, false], // No policy. Should remember p...-csp-1.
+        ["0",            true, true],  // Delete the policy again.
+      ]), "The basics: A policy should stick.");
+
+    // Set, update, and delete a policy.
+    promise_test(origin_policy_csp_test_case([
+        ["",             true,  true],
+        ["policy-csp-1", true,  false], // policy-csp-1, which forbids eval.
+        ["policy-csp-2", false, false], // policy-csp-2, forbids script + eval.
+        ["0",            true,  true],  // Delete the policy.
+      ]), "Policy set, update, and delete.");
+
+    // Set, update, and delete a policy. Check on each step whether it 'sticks'.
+    promise_test(origin_policy_csp_test_case([
+        ["",             true,  true],
+        ["policy-csp-1", true,  false], // policy-csp-1, which forbids eval.
+        ["",             true,  false],
+        ["policy-csp-2", false, false], // Forbid script + eval.
+        ["",             false, false],
+        ["0",            true,  true],  // Delete the policy.
+        ["",             true,  true],
+      ]), "Policy set-update-delete cycle with checks.");
+
+    // Set a policy, update, then revert to the old one.
+    promise_test(origin_policy_csp_test_case([
+        ["",             true,  true],
+        ["policy-csp-1", true,  false], // policy-csp-1, which forbids eval.
+        ["policy-csp-2", false, false], // Forbid script + eval.
+        ["policy-csp-1", true,  false], // policy-csp-1 again.
+        ["0",            true,  true],
+      ]), "Policy set-update-delete cycle.");
+
+    // Set, delete, re-set, and re-delete a policy.
+    promise_test(origin_policy_csp_test_case([
+        ["",             true, true],  // No policy.
+        ["policy-csp-1", true, false], // policy-csp-1, which forbids eval.
+        ["",             true, false],
+        ["0",            true, true],  // Delete the policy.
+        ["",             true, true],
+        ["policy-csp-1", true, false], // Set policy after policy was deleted.
+        ["",             true, false],
+        ["0",            true, true],  // Delete the policy again.
+        ["",             true, true],
+      ]), "Policy re-set and re-delete.");
+
+    // We've had some bugs with repeated policies being set, so lets just
+    // run through a set-update-delete cycle but with every request being
+    // made twice.
+    promise_test(origin_policy_csp_test_case([
+        ["",             true,  true],
+        ["",             true,  true],
+        ["policy-csp-1", true,  false],
+        ["policy-csp-1", true,  false],
+        ["policy-csp-2", false, false],
+        ["policy-csp-2", false, false],
+        ["0",            true,  true],
+        ["0",            true,  true],
+        ["",             true,  true],
+        ["",             true,  true],
+      ]), "Double Trouble");
+  </script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/origin-policy/sec-origin-policy-header.html.py b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/sec-origin-policy-header.html.py
new file mode 100644
index 0000000..8e62b6c2
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/origin-policy/sec-origin-policy-header.html.py
@@ -0,0 +1,64 @@
+def main(request, response):
+  """Send a response with the origin policy indicated by the ?policy= argument.
+
+     Won't send a policy when the browser doesn't indicate support.
+     The response tests whether inline script and eval are allowed, and will
+     send a corresponding message to the parent frame.
+     For easier debugging, we'll also show the results in-page.
+  """
+  origin_policy_header = "Sec-Origin-Policy"
+  request_policy = request.headers.get(origin_policy_header)
+  response_policy = request.GET.first("policy", default="")
+
+  if request_policy and response_policy:
+    response.headers.set(origin_policy_header, response_policy)
+    response.headers.set("Vary", "sec-origin-policy")
+
+  response.headers.set("Content-Type", "text/html");
+  return """
+    <html>
+    <head>
+     <title>Page with an Origin Policy</title>
+    </head>
+    <body>
+    <script nonce=test>
+      let inlineAllowed = false;
+      let evalAllowed = false;
+      try { eval('evalAllowed = true;'); } catch (e) {};
+    </script>
+    <script>
+      inlineAllowed = true;
+    </script>
+
+    <p>Reveal whether CSP with "unsafe-inline" or "unsafe-eval" is present:</p>
+    <ul>
+      <li>inline script allowed: <span id=inline_allowed></span></li>
+      <li>eval allowed: <span id=eval_allowed></span></li>
+    </ul>
+
+    <script nonce=test>
+      const result = {
+        "inline_allowed": inlineAllowed,
+        "eval_allowed": evalAllowed,
+      };
+
+      // Mirror content into the page for easy debugging:
+      const styles = {
+        true: "font-weight: bold; color: green;",
+        false: "font-weight: bold; color: red",
+      }
+      for (const [key, value] of Object.entries(result)) {
+        let element = document.getElementById(key);
+        element.textContent = value.toString();
+        element.style = styles[value];
+      }
+
+      // Send result to parent frame for evaluation.
+      if (window.parent) {
+        window.parent.postMessage(result, "*");
+      }
+    </script>
+    </body>
+    </html>
+  """
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor-expected.txt
deleted file mode 100644
index 0df4c4e14..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-FAIL TransformStream constructor should stop after get on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable)" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after validate on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after get on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after validate on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-FAIL TransformStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.dedicatedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.dedicatedworker-expected.txt
deleted file mode 100644
index 0df4c4e14..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.dedicatedworker-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-FAIL TransformStream constructor should stop after get on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable)" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after validate on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after get on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after validate on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-FAIL TransformStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.serviceworker.https-expected.txt
deleted file mode 100644
index efc32b0..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.serviceworker.https-expected.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-This is a testharness.js-based test.
-PASS Service worker test setup
-FAIL TransformStream constructor should stop after get on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable)" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after validate on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after get on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after validate on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-FAIL TransformStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.sharedworker-expected.txt
deleted file mode 100644
index 0df4c4e14..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/constructor.sharedworker-expected.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-This is a testharness.js-based test.
-FAIL TransformStream constructor should stop after get on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable)" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after get on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on writableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType"
-FAIL TransformStream constructor should stop after validate on size (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType" but got "get on readableType,get on writableType,get on size (writable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (writable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable)"
-FAIL TransformStream constructor should stop after get on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on readableType fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType"
-FAIL TransformStream constructor should stop after validate on size (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable)"
-FAIL TransformStream constructor should stop after tonumber on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after validate on highWaterMark (readable) fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable)" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable)"
-FAIL TransformStream constructor should stop after get on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after validate on transform fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform"
-FAIL TransformStream constructor should stop after get on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after validate on flush fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush"
-FAIL TransformStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-FAIL TransformStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size (writable),get on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),get on writableType,tonumber on highWaterMark (writable),get on readableType,tonumber on highWaterMark (readable),get on transform,get on flush,get on start" but got "get on readableType,get on writableType,get on size (writable),get on highWaterMark (writable),tonumber on highWaterMark (writable),get on size (readable),get on highWaterMark (readable),tonumber on highWaterMark (readable),get on transform,get on flush,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties-expected.txt
deleted file mode 100644
index 8ebf5ec..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-This is a testharness.js-based test.
-PASS TransformStreamDefaultController should not be exported on the global object
-PASS TransformStream.prototype.constructor should have standard properties
-PASS TransformStream.prototype.constructor should be a constructor
-PASS TransformStream.prototype.readable should have standard properties
-PASS TransformStream.prototype.readable should be a getter
-PASS TransformStream.prototype.writable should have standard properties
-PASS TransformStream.prototype.writable should be a getter
-PASS TransformStream.prototype should have exactly the expected properties
-PASS TransformStreamDefaultController.prototype.constructor should have standard properties
-PASS TransformStreamDefaultController.prototype.constructor should be a constructor
-PASS TransformStreamDefaultController.prototype.desiredSize should have standard properties
-PASS TransformStreamDefaultController.prototype.desiredSize should be a getter
-PASS TransformStreamDefaultController.prototype.enqueue should have standard properties
-PASS TransformStreamDefaultController.prototype.enqueue should be a method
-PASS TransformStreamDefaultController.prototype.error should have standard properties
-PASS TransformStreamDefaultController.prototype.error should be a method
-PASS TransformStreamDefaultController.prototype.terminate should have standard properties
-PASS TransformStreamDefaultController.prototype.terminate should be a method
-PASS TransformStreamDefaultController.prototype should have exactly the expected properties
-PASS transformer method start should be called with the right number of arguments
-PASS transformer method start should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method start assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method transform should be called with the right number of arguments
-PASS transformer method transform should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method transform assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method flush should be called with the right number of arguments
-PASS transformer method flush should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method flush assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.dedicatedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.dedicatedworker-expected.txt
deleted file mode 100644
index 8ebf5ec..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.dedicatedworker-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-This is a testharness.js-based test.
-PASS TransformStreamDefaultController should not be exported on the global object
-PASS TransformStream.prototype.constructor should have standard properties
-PASS TransformStream.prototype.constructor should be a constructor
-PASS TransformStream.prototype.readable should have standard properties
-PASS TransformStream.prototype.readable should be a getter
-PASS TransformStream.prototype.writable should have standard properties
-PASS TransformStream.prototype.writable should be a getter
-PASS TransformStream.prototype should have exactly the expected properties
-PASS TransformStreamDefaultController.prototype.constructor should have standard properties
-PASS TransformStreamDefaultController.prototype.constructor should be a constructor
-PASS TransformStreamDefaultController.prototype.desiredSize should have standard properties
-PASS TransformStreamDefaultController.prototype.desiredSize should be a getter
-PASS TransformStreamDefaultController.prototype.enqueue should have standard properties
-PASS TransformStreamDefaultController.prototype.enqueue should be a method
-PASS TransformStreamDefaultController.prototype.error should have standard properties
-PASS TransformStreamDefaultController.prototype.error should be a method
-PASS TransformStreamDefaultController.prototype.terminate should have standard properties
-PASS TransformStreamDefaultController.prototype.terminate should be a method
-PASS TransformStreamDefaultController.prototype should have exactly the expected properties
-PASS transformer method start should be called with the right number of arguments
-PASS transformer method start should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method start assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method transform should be called with the right number of arguments
-PASS transformer method transform should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method transform assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method flush should be called with the right number of arguments
-PASS transformer method flush should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method flush assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.serviceworker.https-expected.txt
deleted file mode 100644
index d62df1e..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.serviceworker.https-expected.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-This is a testharness.js-based test.
-PASS Service worker test setup
-PASS TransformStreamDefaultController should not be exported on the global object
-PASS TransformStream.prototype.constructor should have standard properties
-PASS TransformStream.prototype.constructor should be a constructor
-PASS TransformStream.prototype.readable should have standard properties
-PASS TransformStream.prototype.readable should be a getter
-PASS TransformStream.prototype.writable should have standard properties
-PASS TransformStream.prototype.writable should be a getter
-PASS TransformStream.prototype should have exactly the expected properties
-PASS TransformStreamDefaultController.prototype.constructor should have standard properties
-PASS TransformStreamDefaultController.prototype.constructor should be a constructor
-PASS TransformStreamDefaultController.prototype.desiredSize should have standard properties
-PASS TransformStreamDefaultController.prototype.desiredSize should be a getter
-PASS TransformStreamDefaultController.prototype.enqueue should have standard properties
-PASS TransformStreamDefaultController.prototype.enqueue should be a method
-PASS TransformStreamDefaultController.prototype.error should have standard properties
-PASS TransformStreamDefaultController.prototype.error should be a method
-PASS TransformStreamDefaultController.prototype.terminate should have standard properties
-PASS TransformStreamDefaultController.prototype.terminate should be a method
-PASS TransformStreamDefaultController.prototype should have exactly the expected properties
-PASS transformer method start should be called with the right number of arguments
-PASS transformer method start should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method start assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method transform should be called with the right number of arguments
-PASS transformer method transform should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method transform assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method flush should be called with the right number of arguments
-PASS transformer method flush should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method flush assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.sharedworker-expected.txt
deleted file mode 100644
index 8ebf5ec..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/transform-streams/properties.sharedworker-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-This is a testharness.js-based test.
-PASS TransformStreamDefaultController should not be exported on the global object
-PASS TransformStream.prototype.constructor should have standard properties
-PASS TransformStream.prototype.constructor should be a constructor
-PASS TransformStream.prototype.readable should have standard properties
-PASS TransformStream.prototype.readable should be a getter
-PASS TransformStream.prototype.writable should have standard properties
-PASS TransformStream.prototype.writable should be a getter
-PASS TransformStream.prototype should have exactly the expected properties
-PASS TransformStreamDefaultController.prototype.constructor should have standard properties
-PASS TransformStreamDefaultController.prototype.constructor should be a constructor
-PASS TransformStreamDefaultController.prototype.desiredSize should have standard properties
-PASS TransformStreamDefaultController.prototype.desiredSize should be a getter
-PASS TransformStreamDefaultController.prototype.enqueue should have standard properties
-PASS TransformStreamDefaultController.prototype.enqueue should be a method
-PASS TransformStreamDefaultController.prototype.error should have standard properties
-PASS TransformStreamDefaultController.prototype.error should be a method
-PASS TransformStreamDefaultController.prototype.terminate should have standard properties
-PASS TransformStreamDefaultController.prototype.terminate should be a method
-PASS TransformStreamDefaultController.prototype should have exactly the expected properties
-PASS transformer method start should be called with the right number of arguments
-PASS transformer method start should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method start assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method transform should be called with the right number of arguments
-PASS transformer method transform should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method transform assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-PASS transformer method flush should be called with the right number of arguments
-PASS transformer method flush should be called even when it's located on the prototype chain
-FAIL unexpected properties should not be accessed when calling transformer method flush assert_array_equals: expected properties should be got property 0, expected "writableType" but got "readableType"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor-expected.txt
deleted file mode 100644
index ff17f4a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-This is a testharness.js-based test.
-PASS controller argument should be passed to start method
-PASS controller argument should be passed to write method
-PASS controller argument should not be passed to close method
-PASS highWaterMark should be reflected to desiredSize
-PASS WritableStream should be writable and ready should fulfill immediately if the strategy does not apply backpressure
-PASS WritableStream should be constructible with no arguments
-PASS WritableStream instances should have standard methods and properties
-PASS private constructors should not be exported
-PASS WritableStreamDefaultController constructor should throw
-PASS WritableStreamDefaultController constructor should throw when passed an initialised WritableStream
-PASS WritableStreamDefaultWriter should throw unless passed a WritableStream
-PASS WritableStreamDefaultWriter constructor should throw when stream argument is locked
-FAIL WritableStream constructor should stop after get on size fails assert_equals: operations should be performed in the right order expected "get on size" but got "get on type,get on size"
-FAIL WritableStream constructor should stop after get on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after get on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type"
-FAIL WritableStream constructor should stop after validate on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after validate on size fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after tonumber on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after validate on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after get on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after validate on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after get on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after validate on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after get on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after validate on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-FAIL WritableStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.dedicatedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.dedicatedworker-expected.txt
deleted file mode 100644
index ff17f4a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.dedicatedworker-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-This is a testharness.js-based test.
-PASS controller argument should be passed to start method
-PASS controller argument should be passed to write method
-PASS controller argument should not be passed to close method
-PASS highWaterMark should be reflected to desiredSize
-PASS WritableStream should be writable and ready should fulfill immediately if the strategy does not apply backpressure
-PASS WritableStream should be constructible with no arguments
-PASS WritableStream instances should have standard methods and properties
-PASS private constructors should not be exported
-PASS WritableStreamDefaultController constructor should throw
-PASS WritableStreamDefaultController constructor should throw when passed an initialised WritableStream
-PASS WritableStreamDefaultWriter should throw unless passed a WritableStream
-PASS WritableStreamDefaultWriter constructor should throw when stream argument is locked
-FAIL WritableStream constructor should stop after get on size fails assert_equals: operations should be performed in the right order expected "get on size" but got "get on type,get on size"
-FAIL WritableStream constructor should stop after get on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after get on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type"
-FAIL WritableStream constructor should stop after validate on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after validate on size fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after tonumber on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after validate on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after get on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after validate on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after get on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after validate on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after get on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after validate on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-FAIL WritableStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.serviceworker.https-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.serviceworker.https-expected.txt
deleted file mode 100644
index 37e52c5e..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.serviceworker.https-expected.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-This is a testharness.js-based test.
-PASS Service worker test setup
-PASS controller argument should be passed to start method
-PASS controller argument should be passed to write method
-PASS controller argument should not be passed to close method
-PASS highWaterMark should be reflected to desiredSize
-PASS WritableStream should be writable and ready should fulfill immediately if the strategy does not apply backpressure
-PASS WritableStream should be constructible with no arguments
-PASS WritableStream instances should have standard methods and properties
-PASS private constructors should not be exported
-PASS WritableStreamDefaultController constructor should throw
-PASS WritableStreamDefaultController constructor should throw when passed an initialised WritableStream
-PASS WritableStreamDefaultWriter should throw unless passed a WritableStream
-PASS WritableStreamDefaultWriter constructor should throw when stream argument is locked
-FAIL WritableStream constructor should stop after get on size fails assert_equals: operations should be performed in the right order expected "get on size" but got "get on type,get on size"
-FAIL WritableStream constructor should stop after get on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after get on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type"
-FAIL WritableStream constructor should stop after validate on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after validate on size fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after tonumber on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after validate on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after get on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after validate on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after get on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after validate on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after get on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after validate on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-FAIL WritableStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.sharedworker-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.sharedworker-expected.txt
deleted file mode 100644
index ff17f4a..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/streams/writable-streams/constructor.sharedworker-expected.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-This is a testharness.js-based test.
-PASS controller argument should be passed to start method
-PASS controller argument should be passed to write method
-PASS controller argument should not be passed to close method
-PASS highWaterMark should be reflected to desiredSize
-PASS WritableStream should be writable and ready should fulfill immediately if the strategy does not apply backpressure
-PASS WritableStream should be constructible with no arguments
-PASS WritableStream instances should have standard methods and properties
-PASS private constructors should not be exported
-PASS WritableStreamDefaultController constructor should throw
-PASS WritableStreamDefaultController constructor should throw when passed an initialised WritableStream
-PASS WritableStreamDefaultWriter should throw unless passed a WritableStream
-PASS WritableStreamDefaultWriter constructor should throw when stream argument is locked
-FAIL WritableStream constructor should stop after get on size fails assert_equals: operations should be performed in the right order expected "get on size" but got "get on type,get on size"
-FAIL WritableStream constructor should stop after get on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after get on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type"
-FAIL WritableStream constructor should stop after validate on type fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after validate on size fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type" but got "get on type,get on size,get on highWaterMark"
-FAIL WritableStream constructor should stop after tonumber on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after validate on highWaterMark fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark"
-FAIL WritableStream constructor should stop after get on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after validate on write fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write"
-FAIL WritableStream constructor should stop after get on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after validate on close fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close"
-FAIL WritableStream constructor should stop after get on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after validate on abort fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort"
-FAIL WritableStream constructor should stop after get on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-FAIL WritableStream constructor should stop after validate on start fails assert_equals: operations should be performed in the right order expected "get on size,get on highWaterMark,get on type,tonumber on highWaterMark,get on write,get on close,get on abort,get on start" but got "get on type,get on size,get on highWaterMark,tonumber on highWaterMark,get on write,get on close,get on abort,get on start"
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wasm/resources/service-worker.js b/third_party/WebKit/LayoutTests/external/wpt/wasm/resources/service-worker.js
index bb0ec21..684eaf6 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wasm/resources/service-worker.js
+++ b/third_party/WebKit/LayoutTests/external/wpt/wasm/resources/service-worker.js
@@ -24,3 +24,7 @@
             .catch(e => port.postMessage({type:"OTHER ERROR"}));
     }
 });
+
+self.addEventListener('messageerror', function(e) {
+  port.postMessage({type:"RECEIVE ERROR"});
+});
diff --git a/third_party/WebKit/LayoutTests/external/wpt/wasm/wasm_service_worker_test.https.html b/third_party/WebKit/LayoutTests/external/wpt/wasm/wasm_service_worker_test.https.html
index e350ed95..cced4b8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/wasm/wasm_service_worker_test.https.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/wasm/wasm_service_worker_test.https.html
@@ -8,14 +8,16 @@
   promise_test(async test => {
     var registration = await service_worker_unregister_and_register(
       test, 'resources/service-worker.js', 'resources/blank.html');
-      add_completion_callback(() => registration.unregister());
-      var worker = registration.installing;
-      var data = await new Promise((resolve, reject) => {
-        var messageChannel = new MessageChannel();
-        worker.postMessage({port: messageChannel.port2}, [messageChannel.port2]);
-        worker.postMessage({compile: true});
-        messageChannel.port1.onmessage = event => resolve(event.data);
-      });
-      assert_equals(data, null);
+    add_completion_callback(() => registration.unregister());
+    var worker = registration.installing;
+    var event = await new Promise((resolve, reject) => {
+      var messageChannel = new MessageChannel();
+      worker.postMessage({port: messageChannel.port2}, [messageChannel.port2]);
+      worker.postMessage({compile: true});
+      messageChannel.port1.onmessage = event => reject(event);
+      messageChannel.port1.onmessageerror = event => resolve(event);
+    });
+    assert_equals(event.type, "messageerror");
+    assert_equals(event.data, null);
   }, 'postMessaging wasm from a service worker should fail');
 </script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/accumulation-per-property-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/accumulation-per-property-expected.txt
index 66693b2..17524985 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/accumulation-per-property-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/accumulation-per-property-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 566 tests; 389 PASS, 177 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 566 tests; 393 PASS, 173 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Setup
 PASS align-content (type: discrete) has testAccumulation function
 PASS align-content: "flex-end" onto "flex-start"
@@ -436,8 +436,8 @@
 PASS shape-outside: "url("http://localhost/test-2")" onto "url("http://localhost/test-1")"
 PASS shape-outside: "url("http://localhost/test-1")" onto "url("http://localhost/test-2")"
 PASS shape-rendering (type: discrete) has testAccumulation function
-FAIL shape-rendering: "crispEdges" onto "optimizeSpeed" assert_equals: The value should be crispedges at 0ms expected "crispedges" but got "crispEdges"
-FAIL shape-rendering: "optimizeSpeed" onto "crispEdges" assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
+PASS shape-rendering: "crispEdges" onto "optimizeSpeed"
+PASS shape-rendering: "optimizeSpeed" onto "crispEdges"
 PASS stop-color (type: color) has testAccumulation function
 FAIL stop-color supports animating as color of rgb() with overflowed  from and to values assert_equals: The value should be rgb(255, 128, 128) at 0ms expected "rgb(255, 128, 128)" but got "rgb(255, 0, 0)"
 FAIL stop-color supports animating as color of #RGB assert_equals: The value should be rgb(255, 128, 128) at 0ms expected "rgb(255, 128, 128)" but got "rgb(255, 0, 0)"
@@ -496,8 +496,8 @@
 PASS text-overflow: "ellipsis" onto "clip"
 PASS text-overflow: "clip" onto "ellipsis"
 PASS text-rendering (type: discrete) has testAccumulation function
-FAIL text-rendering: "optimizeLegibility" onto "optimizeSpeed" assert_equals: The value should be optimizelegibility at 0ms expected "optimizelegibility" but got "optimizeLegibility"
-FAIL text-rendering: "optimizeSpeed" onto "optimizeLegibility" assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
+PASS text-rendering: "optimizeLegibility" onto "optimizeSpeed"
+PASS text-rendering: "optimizeSpeed" onto "optimizeLegibility"
 PASS text-shadow (type: textShadowList) has testAccumulation function
 FAIL text-shadow: shadow assert_equals: The value should be rgb(240, 240, 240) 20px 20px 20px at 0ms expected "rgb(240, 240, 240) 20px 20px 20px" but got "rgb(120, 120, 120) 10px 10px 10px"
 PASS text-transform (type: discrete) has testAccumulation function
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/addition-per-property-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/addition-per-property-expected.txt
index bb4d94d..bd44950 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/addition-per-property-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/addition-per-property-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 562 tests; 521 PASS, 41 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 562 tests; 525 PASS, 37 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Setup
 PASS align-content (type: discrete) has testAddition function
 PASS align-content: "flex-end" onto "flex-start"
@@ -436,8 +436,8 @@
 PASS shape-outside: "url("http://localhost/test-2")" onto "url("http://localhost/test-1")"
 PASS shape-outside: "url("http://localhost/test-1")" onto "url("http://localhost/test-2")"
 PASS shape-rendering (type: discrete) has testAddition function
-FAIL shape-rendering: "crispEdges" onto "optimizeSpeed" assert_equals: The value should be crispedges at 0ms expected "crispedges" but got "crispEdges"
-FAIL shape-rendering: "optimizeSpeed" onto "crispEdges" assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
+PASS shape-rendering: "crispEdges" onto "optimizeSpeed"
+PASS shape-rendering: "optimizeSpeed" onto "crispEdges"
 PASS stop-color (type: color) has testAddition function
 PASS stop-color supports animating as color of rgb() with overflowed  from and to values
 PASS stop-color supports animating as color of #RGB
@@ -496,8 +496,8 @@
 PASS text-overflow: "ellipsis" onto "clip"
 PASS text-overflow: "clip" onto "ellipsis"
 PASS text-rendering (type: discrete) has testAddition function
-FAIL text-rendering: "optimizeLegibility" onto "optimizeSpeed" assert_equals: The value should be optimizelegibility at 0ms expected "optimizelegibility" but got "optimizeLegibility"
-FAIL text-rendering: "optimizeSpeed" onto "optimizeLegibility" assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
+PASS text-rendering: "optimizeLegibility" onto "optimizeSpeed"
+PASS text-rendering: "optimizeSpeed" onto "optimizeLegibility"
 PASS text-shadow (type: textShadowList) has testAddition function
 FAIL text-shadow: shadow assert_equals: The value should be rgb(0, 0, 0) 0px 0px 0px, rgb(120, 120, 120) 10px 10px 10px at 0ms expected "rgb(0, 0, 0) 0px 0px 0px, rgb(120, 120, 120) 10px 10px 10px" but got "rgb(120, 120, 120) 10px 10px 10px"
 PASS text-transform (type: discrete) has testAddition function
diff --git a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/interpolation-per-property-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/interpolation-per-property-expected.txt
index e8c6cb1f..52f0a08 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/interpolation-per-property-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/web-animations/animation-model/animation-types/interpolation-per-property-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 700 tests; 626 PASS, 74 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 700 tests; 632 PASS, 68 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Setup
 PASS align-content (type: discrete) has testInterpolation function
 PASS align-content uses discrete animation when animating between "flex-start" and "flex-end" with linear easing
@@ -542,9 +542,9 @@
 PASS shape-outside uses discrete animation when animating between "url("http://localhost/test-1")" and "url("http://localhost/test-2")" with effect easing
 PASS shape-outside uses discrete animation when animating between "url("http://localhost/test-1")" and "url("http://localhost/test-2")" with keyframe easing
 PASS shape-rendering (type: discrete) has testInterpolation function
-FAIL shape-rendering uses discrete animation when animating between "optimizeSpeed" and "crispEdges" with linear easing assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
-FAIL shape-rendering uses discrete animation when animating between "optimizeSpeed" and "crispEdges" with effect easing assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
-FAIL shape-rendering uses discrete animation when animating between "optimizeSpeed" and "crispEdges" with keyframe easing assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
+PASS shape-rendering uses discrete animation when animating between "optimizeSpeed" and "crispEdges" with linear easing
+PASS shape-rendering uses discrete animation when animating between "optimizeSpeed" and "crispEdges" with effect easing
+PASS shape-rendering uses discrete animation when animating between "optimizeSpeed" and "crispEdges" with keyframe easing
 PASS stop-color (type: color) has testInterpolation function
 PASS stop-color supports animating as color of rgb()
 PASS stop-color supports animating as color of #RGB
@@ -615,9 +615,9 @@
 PASS text-overflow uses discrete animation when animating between "clip" and "ellipsis" with effect easing
 PASS text-overflow uses discrete animation when animating between "clip" and "ellipsis" with keyframe easing
 PASS text-rendering (type: discrete) has testInterpolation function
-FAIL text-rendering uses discrete animation when animating between "optimizeSpeed" and "optimizeLegibility" with linear easing assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
-FAIL text-rendering uses discrete animation when animating between "optimizeSpeed" and "optimizeLegibility" with effect easing assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
-FAIL text-rendering uses discrete animation when animating between "optimizeSpeed" and "optimizeLegibility" with keyframe easing assert_equals: The value should be optimizespeed at 0ms expected "optimizespeed" but got "optimizeSpeed"
+PASS text-rendering uses discrete animation when animating between "optimizeSpeed" and "optimizeLegibility" with linear easing
+PASS text-rendering uses discrete animation when animating between "optimizeSpeed" and "optimizeLegibility" with effect easing
+PASS text-rendering uses discrete animation when animating between "optimizeSpeed" and "optimizeLegibility" with keyframe easing
 PASS text-shadow (type: textShadowList) has testInterpolation function
 PASS text-shadow: from none to other
 PASS text-shadow: from other to none
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webmidi/META.yml b/third_party/WebKit/LayoutTests/external/wpt/webmidi/META.yml
new file mode 100644
index 0000000..f39d412
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webmidi/META.yml
@@ -0,0 +1,3 @@
+spec: https://webaudio.github.io/web-midi-api/
+suggested_reviewers:
+  - cwilso
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webmidi/idlharness.window-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webmidi/idlharness.window-expected.txt
new file mode 100644
index 0000000..3b29d89
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webmidi/idlharness.window-expected.txt
@@ -0,0 +1,88 @@
+This is a testharness.js-based test.
+Found 84 tests; 72 PASS, 12 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL idl_test setup promise_test: Unhandled rejection with value: object "SecurityError: An attempt was made to break through the security policy of the user agent."
+PASS Partial interface Navigator: original interface defined
+PASS MIDIInputMap interface: existence and properties of interface object
+PASS MIDIInputMap interface object length
+PASS MIDIInputMap interface object name
+PASS MIDIInputMap interface: existence and properties of interface prototype object
+PASS MIDIInputMap interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIInputMap interface: existence and properties of interface prototype object's @@unscopables property
+FAIL MIDIInputMap must be primary interface of inputs assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: inputs is not defined"
+FAIL Stringification of inputs assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: inputs is not defined"
+PASS MIDIOutputMap interface: existence and properties of interface object
+PASS MIDIOutputMap interface object length
+PASS MIDIOutputMap interface object name
+PASS MIDIOutputMap interface: existence and properties of interface prototype object
+PASS MIDIOutputMap interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIOutputMap interface: existence and properties of interface prototype object's @@unscopables property
+FAIL MIDIOutputMap must be primary interface of outputs assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: outputs is not defined"
+FAIL Stringification of outputs assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: outputs is not defined"
+PASS MIDIAccess interface: existence and properties of interface object
+PASS MIDIAccess interface object length
+PASS MIDIAccess interface object name
+PASS MIDIAccess interface: existence and properties of interface prototype object
+PASS MIDIAccess interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIAccess interface: existence and properties of interface prototype object's @@unscopables property
+PASS MIDIAccess interface: attribute inputs
+PASS MIDIAccess interface: attribute outputs
+PASS MIDIAccess interface: attribute onstatechange
+PASS MIDIAccess interface: attribute sysexEnabled
+FAIL MIDIAccess must be primary interface of access assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: access is not defined"
+FAIL Stringification of access assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: access is not defined"
+FAIL MIDIAccess interface: access must inherit property "inputs" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: access is not defined"
+FAIL MIDIAccess interface: access must inherit property "outputs" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: access is not defined"
+FAIL MIDIAccess interface: access must inherit property "onstatechange" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: access is not defined"
+FAIL MIDIAccess interface: access must inherit property "sysexEnabled" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: access is not defined"
+PASS MIDIPort interface: existence and properties of interface object
+PASS MIDIPort interface object length
+PASS MIDIPort interface object name
+PASS MIDIPort interface: existence and properties of interface prototype object
+PASS MIDIPort interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIPort interface: existence and properties of interface prototype object's @@unscopables property
+PASS MIDIPort interface: attribute id
+PASS MIDIPort interface: attribute manufacturer
+PASS MIDIPort interface: attribute name
+PASS MIDIPort interface: attribute type
+PASS MIDIPort interface: attribute version
+PASS MIDIPort interface: attribute state
+PASS MIDIPort interface: attribute connection
+PASS MIDIPort interface: attribute onstatechange
+PASS MIDIPort interface: operation open()
+PASS MIDIPort interface: operation close()
+PASS MIDIInput interface: existence and properties of interface object
+PASS MIDIInput interface object length
+PASS MIDIInput interface object name
+PASS MIDIInput interface: existence and properties of interface prototype object
+PASS MIDIInput interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIInput interface: existence and properties of interface prototype object's @@unscopables property
+PASS MIDIInput interface: attribute onmidimessage
+PASS MIDIOutput interface: existence and properties of interface object
+PASS MIDIOutput interface object length
+PASS MIDIOutput interface object name
+PASS MIDIOutput interface: existence and properties of interface prototype object
+PASS MIDIOutput interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIOutput interface: existence and properties of interface prototype object's @@unscopables property
+PASS MIDIOutput interface: operation send([object Object], DOMHighResTimeStamp)
+FAIL MIDIOutput interface: operation clear() assert_own_property: interface prototype object missing non-static operation expected property "clear" missing
+PASS MIDIMessageEvent interface: existence and properties of interface object
+PASS MIDIMessageEvent interface object length
+PASS MIDIMessageEvent interface object name
+PASS MIDIMessageEvent interface: existence and properties of interface prototype object
+PASS MIDIMessageEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIMessageEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MIDIMessageEvent interface: attribute data
+PASS MIDIConnectionEvent interface: existence and properties of interface object
+PASS MIDIConnectionEvent interface object length
+PASS MIDIConnectionEvent interface object name
+PASS MIDIConnectionEvent interface: existence and properties of interface prototype object
+PASS MIDIConnectionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS MIDIConnectionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS MIDIConnectionEvent interface: attribute port
+PASS MIDIConnectionEvent must be primary interface of new MIDIConnectionEvent("type")
+PASS Stringification of new MIDIConnectionEvent("type")
+PASS MIDIConnectionEvent interface: new MIDIConnectionEvent("type") must inherit property "port" with the proper type
+PASS Navigator interface: operation requestMIDIAccess(MIDIOptions)
+PASS WorkerNavigator interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webmidi/idlharness.window.js b/third_party/WebKit/LayoutTests/external/wpt/webmidi/idlharness.window.js
new file mode 100644
index 0000000..5fb88073
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/webmidi/idlharness.window.js
@@ -0,0 +1,31 @@
+// META: script=/resources/WebIDLParser.js
+// META: script=/resources/idlharness.js
+
+// https://webaudio.github.io/web-midi-api/
+
+'use strict';
+
+idl_test(
+  ['webmidi'],
+  ['html', 'dom'],
+  async idl_array => {
+    idl_array.add_objects({
+      MIDIAccess: ['access'],
+      MIDIInputMap: ['inputs'],
+      MIDIOutputMap: ['outputs'],
+      MIDIConnectionEvent: ['new MIDIConnectionEvent("type")'],
+    })
+
+    self.access = await navigator.requestMIDIAccess();
+    self.inputs = access.inputs;
+    if (inputs.size) {
+      self.input = Array.from(access.inputs.values())[0];
+      idl_array.add_objects({ MIDIInput: ['input'] });
+    }
+    self.outputs = access.outputs;
+    if (outputs.size) {
+      self.output = Array.from(access.outputs.values())[0];
+      idl_array.add_objects({ MIDIOutput: ['output'] });
+    }
+  }
+);
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt
index 312e321a..482a2e9 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
 FAIL sender.getParameters() should return different transaction IDs for each call promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument."
 FAIL sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument."
-FAIL sender.setParameters() with transaction ID unset should reject with InvalidModificationError promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument."
+FAIL sender.setParameters() with transaction ID unset should reject with TypeError promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument."
 FAIL setParameters() twice with the same parameters should reject with InvalidStateError promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument."
 FAIL setParameters() with parameters older than last getParameters() should reject with InvalidModificationError promise_test: Unhandled rejection with value: object "InvalidStateError: Failed to execute 'addTransceiver' on 'RTCPeerConnection': This operation is only supported in 'unified-plan'. 'unified-plan' will become the default behavior in the future, but it is currently experimental. To try it out, construct the RTCPeerConnection with sdpSemantics:'unified-plan' present in the RTCConfiguration argument."
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId.html b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId.html
index ac6f6d19..472b0439 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/webrtc/RTCRtpParameters-transactionId.html
@@ -112,9 +112,9 @@
 
     param.transactionId = undefined;
 
-    return promise_rejects(t, 'InvalidModificationError',
+    return promise_rejects(t, new TypeError(),
       sender.setParameters(param));
-  }, `sender.setParameters() with transaction ID unset should reject with InvalidModificationError`);
+  }, `sender.setParameters() with transaction ID unset should reject with TypeError`);
 
   promise_test(async t => {
     const pc = new RTCPeerConnection();
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
index 1c35bb81..75fca51 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-expected.txt
@@ -14,13 +14,13 @@
 PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "0px"
 PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "0px"
 PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-columns') is "3.5px"
-PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-rows') is "11px"
+PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-rows') is "4px"
 PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-columns') is "0px"
 PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-rows') is "0px"
 PASS window.getComputedStyle(gridWithAutoWithoutSizeElement, '').getPropertyValue('grid-template-columns') is "0px"
 PASS window.getComputedStyle(gridWithAutoWithoutSizeElement, '').getPropertyValue('grid-template-rows') is "0px"
 PASS window.getComputedStyle(gridWithAutoWithChildrenElement, '').getPropertyValue('grid-template-columns') is "7px"
-PASS window.getComputedStyle(gridWithAutoWithChildrenElement, '').getPropertyValue('grid-template-rows') is "11px"
+PASS window.getComputedStyle(gridWithAutoWithChildrenElement, '').getPropertyValue('grid-template-rows') is "16px"
 PASS window.getComputedStyle(gridWithEMElement, '').getPropertyValue('grid-template-columns') is "100px"
 PASS window.getComputedStyle(gridWithEMElement, '').getPropertyValue('grid-template-rows') is "150px"
 PASS window.getComputedStyle(gridWithViewPortPercentageElement, '').getPropertyValue('grid-template-columns') is "64px"
@@ -30,11 +30,11 @@
 PASS window.getComputedStyle(gridWithMinContentElement, '').getPropertyValue('grid-template-columns') is "0px"
 PASS window.getComputedStyle(gridWithMinContentElement, '').getPropertyValue('grid-template-rows') is "0px"
 PASS window.getComputedStyle(gridWithMinContentWithChildrenElement, '').getPropertyValue('grid-template-columns') is "17px"
-PASS window.getComputedStyle(gridWithMinContentWithChildrenElement, '').getPropertyValue('grid-template-rows') is "11px"
+PASS window.getComputedStyle(gridWithMinContentWithChildrenElement, '').getPropertyValue('grid-template-rows') is "16px"
 PASS window.getComputedStyle(gridWithMaxContentElement, '').getPropertyValue('grid-template-columns') is "0px"
 PASS window.getComputedStyle(gridWithMaxContentElement, '').getPropertyValue('grid-template-rows') is "0px"
 PASS window.getComputedStyle(gridWithMaxContentWithChildrenElement, '').getPropertyValue('grid-template-columns') is "17px"
-PASS window.getComputedStyle(gridWithMaxContentWithChildrenElement, '').getPropertyValue('grid-template-rows') is "11px"
+PASS window.getComputedStyle(gridWithMaxContentWithChildrenElement, '').getPropertyValue('grid-template-rows') is "16px"
 PASS window.getComputedStyle(gridWithFractionElement, '').getPropertyValue('grid-template-columns') is "800px"
 PASS window.getComputedStyle(gridWithFractionElement, '').getPropertyValue('grid-template-rows') is "600px"
 PASS window.getComputedStyle(gridWithCalcElement, '').getPropertyValue('grid-template-columns') is "150px"
@@ -46,9 +46,9 @@
 PASS window.getComputedStyle(gridWithCalcComplexInsideMinMaxElement, '').getPropertyValue('grid-template-columns') is "415px"
 PASS window.getComputedStyle(gridWithCalcComplexInsideMinMaxElement, '').getPropertyValue('grid-template-rows') is "300px"
 PASS window.getComputedStyle(gridWithAutoInsideMinMaxElement, '').getPropertyValue('grid-template-columns') is "20px"
-PASS window.getComputedStyle(gridWithAutoInsideMinMaxElement, '').getPropertyValue('grid-template-rows') is "11px"
+PASS window.getComputedStyle(gridWithAutoInsideMinMaxElement, '').getPropertyValue('grid-template-rows') is "16px"
 PASS window.getComputedStyle(gridWithFitContentFunctionElement, '').getPropertyValue('grid-template-columns') is "7px"
-PASS window.getComputedStyle(gridWithFitContentFunctionElement, '').getPropertyValue('grid-template-rows') is "11px"
+PASS window.getComputedStyle(gridWithFitContentFunctionElement, '').getPropertyValue('grid-template-rows') is "16px"
 
 Test getting wrong values for grid-template-columns and grid-template-rows through CSS (they should resolve to the default: 'none')
 PASS window.getComputedStyle(gridWithFitContentElement, '').getPropertyValue('grid-template-columns') is "none"
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt
index 171b686f3..fcdc484 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple-expected.txt
@@ -8,9 +8,9 @@
 PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-columns') is "7px 11px"
 PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-rows') is "17px 2px"
 PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "400px 800px"
-PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "162px 312px"
+PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "150px 450px"
 PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "3.5px 7px"
-PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "11px 0px"
+PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "4px 12px"
 PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-columns') is "0px 17px"
 PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-rows') is "0px 3px"
 PASS window.getComputedStyle(gridWithEMElement, '').getPropertyValue('grid-template-columns') is "100px 120px"
@@ -24,7 +24,7 @@
 PASS window.getComputedStyle(gridWithMinMaxContent, '').getPropertyValue('grid-template-columns') is "0px 0px"
 PASS window.getComputedStyle(gridWithMinMaxContent, '').getPropertyValue('grid-template-rows') is "0px 0px"
 PASS window.getComputedStyle(gridWithMinMaxContentWithChildrenElement, '').getPropertyValue('grid-template-columns') is "7px 17px"
-PASS window.getComputedStyle(gridWithMinMaxContentWithChildrenElement, '').getPropertyValue('grid-template-rows') is "11px 3px"
+PASS window.getComputedStyle(gridWithMinMaxContentWithChildrenElement, '').getPropertyValue('grid-template-rows') is "16px 3px"
 PASS window.getComputedStyle(gridWithMinMaxAndFixed, '').getPropertyValue('grid-template-columns') is "240px 15px"
 PASS window.getComputedStyle(gridWithMinMaxAndFixed, '').getPropertyValue('grid-template-rows') is "120px 210px"
 PASS window.getComputedStyle(gridWithMinMaxAndMinMaxContent, '').getPropertyValue('grid-template-columns') is "240px 15px"
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple.html
index 8593f97..0546eae 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set-multiple.html
@@ -15,7 +15,7 @@
     grid-column: 1;
     grid-row: 1;
     width: 7px;
-    height: 11px;
+    height: 16px;
 }
 
 .gridItem2 {
@@ -32,7 +32,7 @@
 
 .gridWithPercent {
     grid-template-columns: 50% 100%;
-    grid-template-rows: 27% 52%;
+    grid-template-rows: 25% 75%;
 }
 .gridWithAuto {
     grid-template-columns: auto auto;
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html
index ab7647e..ea79d1c 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-columns-rows-get-set.html
@@ -14,7 +14,7 @@
     grid-column: 1;
     grid-row: 1;
     width: 7px;
-    height: 11px;
+    height: 16px;
 }
 .gridItem2 {
     grid-column: 1;
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-container-percentage-rows.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-container-percentage-rows.html
index b922d38..49c8bcd 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-container-percentage-rows.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-container-percentage-rows.html
@@ -98,7 +98,7 @@
 <div class="wrapper">
     <div class="grid oneRow50" data-expected-width="40" data-expected-height="10">
         <div class="firstRowFirstColumn"
-            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="5">
             XX X
         </div>
     </div>
@@ -116,7 +116,7 @@
 <div class="wrapper">
     <div class="grid abspos oneRow50" data-expected-width="40" data-expected-height="10">
         <div class="firstRowFirstColumn"
-            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="5">
             XX X
         </div>
     </div>
@@ -125,7 +125,7 @@
 <div class="wrapper">
     <div class="grid max-content oneRow50" data-expected-width="40" data-expected-height="10">
         <div class="firstRowFirstColumn"
-            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="5">
             XX X
         </div>
     </div>
@@ -134,7 +134,7 @@
 <div class="wrapper">
     <div class="grid fit-content oneRow50" data-expected-width="40" data-expected-height="10">
         <div class="firstRowFirstColumn"
-            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="5">
             XX X
         </div>
     </div>
@@ -143,7 +143,7 @@
 <div class="wrapper">
     <div class="grid min-content oneRow50" data-expected-width="40" data-expected-height="10">
         <div class="firstRowFirstColumn"
-            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="5">
             XX X
         </div>
     </div>
@@ -155,7 +155,7 @@
             data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="100">
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="55">
             XX X
         </div>
     </div>
@@ -179,7 +179,7 @@
             data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="100">
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="55">
             XX X
         </div>
     </div>
@@ -191,7 +191,7 @@
             data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="100">
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="55">
             XX X
         </div>
     </div>
@@ -203,7 +203,7 @@
             data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="100">
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="55">
             XX X
         </div>
     </div>
@@ -215,7 +215,7 @@
             data-offset-x="0" data-offset-y="0" data-expected-width="40" data-expected-height="100">
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="10">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="55">
             XX X
         </div>
     </div>
@@ -228,7 +228,7 @@
             XX X
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="0">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="50">
         </div>
     </div>
 </div>
@@ -252,7 +252,7 @@
             XX X
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="0">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="50">
         </div>
     </div>
 </div>
@@ -264,7 +264,7 @@
             XX X
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="0">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="50">
         </div>
     </div>
 </div>
@@ -276,7 +276,7 @@
             XX X
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="0">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="50">
         </div>
     </div>
 </div>
@@ -288,7 +288,7 @@
             XX X
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="0">
+            data-offset-x="0" data-offset-y="100" data-expected-width="40" data-expected-height="50">
         </div>
     </div>
 </div>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-as-percentage.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-as-percentage.html
index 683fce9..3a4f96f 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-as-percentage.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-gutters-as-percentage.html
@@ -26,73 +26,73 @@
 <body onload="checkLayout('.grid')">
 <div id="log"></div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'auto' width, which will reduce the available space for tracks; however, they can grow exceeding their content's max-width.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'auto' width, which will reduce the available space for tracks; however, they can grow exceeding their content's max-width.</p>
 <div class="width400">
     <div class="grid columnGap10Percent rowGap20Percent" data-expected-width="400" data-expected-height="20">
         <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="180" data-expected-height="10">XXX X XX X</div>
         <div class="firstRowSecondColumn"  data-offset-x="220" data-offset-y="0"  data-expected-width="180" data-expected-height="10">XX XXX X X</div>
-        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="10" data-expected-width="180" data-expected-height="10">X XX XXX X</div>
-        <div class="secondRowSecondColumn" data-offset-x="220" data-offset-y="10" data-expected-width="180" data-expected-height="10">XXXXX X XX</div>
+        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="14" data-expected-width="180" data-expected-height="10">X XX XXX X</div>
+        <div class="secondRowSecondColumn" data-offset-x="220" data-offset-y="14" data-expected-width="180" data-expected-height="10">XXXXX X XX</div>
     </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'instrinsic' width, which reduce the available space for tracks; however, since we use 'fit-content' intrinsic size, first column's width is reduced and height increased to let its content to fit.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'instrinsic' width, which reduce the available space for tracks; however, since we use 'fit-content' intrinsic size, first column's width is reduced and height increased to let its content to fit.</p>
 <div class="width400">
     <div class="grid fit-content heightAuto columnGap10Percent rowGap20Percent" data-expected-width="200" data-expected-height="40">
         <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="80"  data-expected-height="20">XXX X XX X</div>
         <div class="firstRowSecondColumn"  data-offset-x="100" data-offset-y="0"  data-expected-width="100" data-expected-height="20">XX XXX X X</div>
-        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="20" data-expected-width="80"  data-expected-height="20">X XX XXX X</div>
-        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="20" data-expected-width="100" data-expected-height="20">XXXXX X XX</div>
+        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="28" data-expected-width="80"  data-expected-height="20">X XX XXX X</div>
+        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="28" data-expected-width="100" data-expected-height="20">XXXXX X XX</div>
     </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'auto' width, which will reduce the available space for tracks; however, they can grow exceeding their content's max-width.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'auto' width, which will reduce the available space for tracks; however, they can grow exceeding their content's max-width.</p>
 <div class="width400">
     <div class="grid fit-content widthAuto columnGap10Percent rowGap20Percent" data-expected-width="400" data-expected-height="20">
         <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="180" data-expected-height="10">XXX X XX X</div>
         <div class="firstRowSecondColumn"  data-offset-x="220" data-offset-y="0"  data-expected-width="180" data-expected-height="10">XX XXX X X</div>
-        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="10" data-expected-width="180" data-expected-height="10">X XX XXX X</div>
-        <div class="secondRowSecondColumn" data-offset-x="220" data-offset-y="10" data-expected-width="180" data-expected-height="10">XXXXX X XX</div>
+        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="14" data-expected-width="180" data-expected-height="10">X XX XXX X</div>
+        <div class="secondRowSecondColumn" data-offset-x="220" data-offset-y="14" data-expected-width="180" data-expected-height="10">XXXXX X XX</div>
     </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'instrinsic' width, which reduce the available space for tracks; however, since we use 'fit-content' intrinsic size, first column's width is reduced and height increased to let its content to fit.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'instrinsic' width, which reduce the available space for tracks; however, since we use 'fit-content' intrinsic size, first column's width is reduced and height increased to let its content to fit.</p>
 <div class="width400">
     <div class="grid fit-content columnGap10Percent rowGap20Percent" data-expected-width="200" data-expected-height="40">
         <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="80"  data-expected-height="20">XXX X XX X</div>
         <div class="firstRowSecondColumn"  data-offset-x="100" data-offset-y="0"  data-expected-width="100" data-expected-height="20">XX XXX X X</div>
-        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="20" data-expected-width="80"  data-expected-height="20">X XX XXX X</div>
-        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="20" data-expected-width="100" data-expected-height="20">XXXXX X XX</div>
+        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="28" data-expected-width="80"  data-expected-height="20">X XX XXX X</div>
+        <div class="secondRowSecondColumn" data-offset-x="100" data-offset-y="28" data-expected-width="100" data-expected-height="20">XXXXX X XX</div>
     </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'auto' width, which reduce the available space for tracks; however, they are fixed sized and fit.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'auto' width, which reduce the available space for tracks; however, they are fixed sized and fit.</p>
 <div class="width400">
      <div class="grid columns100-100 rows50-50 columnGap10Percent rowGap20Percent" data-expected-width="400" data-expected-height="100">
          <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="100" data-expected-height="50">XXX X XX X</div>
          <div class="firstRowSecondColumn"  data-offset-x="140" data-offset-y="0"  data-expected-width="100" data-expected-height="50">XX XXX X X</div>
-         <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="50" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
-         <div class="secondRowSecondColumn" data-offset-x="140" data-offset-y="50" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
+         <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="70" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
+         <div class="secondRowSecondColumn" data-offset-x="140" data-offset-y="70" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
      </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'intrinsic' width, which reduce the available space for tracks; however, they are fixed sized and don't fit so they overflow the grid container.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'intrinsic' width, which reduce the available space for tracks; however, they are fixed sized and don't fit so they overflow the grid container.</p>
 <div class="width400">
      <div class="grid fit-content heightAuto columns100-100 rows50-50 columnGap10Percent rowGap20Percent" data-expected-width="200" data-expected-height="100">
          <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="100" data-expected-height="50">XXX X XX X</div>
          <div class="firstRowSecondColumn"  data-offset-x="120" data-offset-y="0"  data-expected-width="100" data-expected-height="50">XX XXX X X</div>
-         <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="50" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
-         <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="50" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
+         <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="70" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
+         <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="70" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
      </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'auto' width, which reduce the available space for tracks; however, they are fixed sized and fit.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'auto' width, which reduce the available space for tracks; however, they are fixed sized and fit.</p>
 <div class="width400">
      <div class="grid fit-content widthAuto columns100-100 rows50-50 columnGap10Percent rowGap20Percent" data-expected-width="400" data-expected-height="100">
          <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="100" data-expected-height="50">XXX X XX X</div>
          <div class="firstRowSecondColumn"  data-offset-x="140" data-offset-y="0"  data-expected-width="100" data-expected-height="50">XX XXX X X</div>
-         <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="50" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
-         <div class="secondRowSecondColumn" data-offset-x="140" data-offset-y="50" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
+         <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="70" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
+         <div class="secondRowSecondColumn" data-offset-x="140" data-offset-y="70" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
      </div>
 </div>
 
@@ -136,13 +136,13 @@
     </div>
 </div>
 
-<p>Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'instrinsic' width, which reduce the available space for tracks; however, since we use 'fit-content' intrinsic size, only 1 repeteation is allowed, so tracks are adjusted to fit in the intrinsic size reduced by the gaps.</p>
+<p>Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'instrinsic' width, which reduce the available space for tracks; however, since we use 'fit-content' intrinsic size, only 1 repeteation is allowed, so tracks are adjusted to fit in the intrinsic size reduced by the gaps.</p>
 <div class="width400">
     <div class="grid fit-content autoRepeat columnGap10Percent rowGap20Percent" data-expected-width="200" data-expected-height="70">
         <div class="firstRowFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="100" data-expected-height="50">XXX X XX X</div>
         <div class="firstRowSecondColumn"  data-offset-x="120" data-offset-y="0"  data-expected-width="80" data-expected-height="50">XX XXX X X</div>
-        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="50" data-expected-width="100" data-expected-height="20">X XX XXX X</div>
-        <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="50" data-expected-width="80" data-expected-height="20">XXXXX X XX</div>
+        <div class="secondRowFirstColumn"  data-offset-x="0"   data-offset-y="64" data-expected-width="100" data-expected-height="20">X XX XXX X</div>
+        <div class="secondRowSecondColumn" data-offset-x="120" data-offset-y="64" data-expected-width="80" data-expected-height="20">XXXXX X XX</div>
     </div>
 </div>
 
@@ -168,13 +168,13 @@
     </div>
 </div>
 
-<p>Grid with positioned items. Height is indefinite, so row gaps should be 0. Column gaps based on a grid's 'auto' width, which reduce the available space for tracks; however, they are fixed sized and fit.</p>
+<p>Grid with positioned items. Height is indefinite, so row gaps should be based on grid's 'auto' height. Column gaps based on a grid's 'auto' width, which reduce the available space for tracks; however, they are fixed sized and fit.</p>
 <div class="width400">
     <div class="grid columns100-100 rows50-50 columnGap10Percent rowGap20Percent" data-expected-width="400" data-expected-height="100">
         <div class="positioned onlyFirstRowOnlyFirstColumn"   data-offset-x="0"   data-offset-y="0"  data-expected-width="100" data-expected-height="50">XXX X XX X</div>
         <div class="positioned onlyFirstRowOnlySecondColumn"  data-offset-x="140" data-offset-y="0"  data-expected-width="100" data-expected-height="50">XX XXX X X</div>
-        <div class="positioned onlySecondRowOnlyFirstColumn"  data-offset-x="0"   data-offset-y="50" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
-        <div class="positioned onlySecondRowOnlySecondColumn" data-offset-x="140" data-offset-y="50" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
+        <div class="positioned onlySecondRowOnlyFirstColumn"  data-offset-x="0"   data-offset-y="70" data-expected-width="100" data-expected-height="50">X XX XXX X</div>
+        <div class="positioned onlySecondRowOnlySecondColumn" data-offset-x="140" data-offset-y="70" data-expected-width="100" data-expected-height="50">XXXXX X XX</div>
     </div>
 </div>
 
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html
index 5844119f..aa72f8b7 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/grid-track-sizing-with-percentages-and-orthogonal-flows.html
@@ -40,8 +40,8 @@
     <div class="grid itemsStart contentStart fit-content" data-expected-width="120" data-expected-height="260">
         <div class="firstRowFirstColumn   verticalLR" data-offset-x="0"  data-offset-y="0"  data-expected-width="10" data-expected-height="50">X X X</div>
         <div class="firstRowSecondColumn  verticalLR" data-offset-x="100" data-offset-y="0"  data-expected-width="10" data-expected-height="110">X X X X X X</div>
-        <div class="secondRowFirstColumn  verticalLR" data-offset-x="0"  data-offset-y="110" data-expected-width="10" data-expected-height="110">X X X X X X</div>
-        <div class="secondRowSecondColumn verticalLR" data-offset-x="100" data-offset-y="110" data-expected-width="20" data-expected-height="150">X X X X X X X X X X X X</div>
+        <div class="secondRowFirstColumn  verticalLR" data-offset-x="0"  data-offset-y="130" data-expected-width="10" data-expected-height="110">X X X X X X</div>
+        <div class="secondRowSecondColumn verticalLR" data-offset-x="100" data-offset-y="130" data-expected-width="20" data-expected-height="150">X X X X X X X X X X X X</div>
     </div>
 </div>
 
@@ -50,8 +50,8 @@
     <div class="grid itemsStart contentStart fit-content" data-expected-width="120" data-expected-height="260">
         <div class="firstRowFirstColumn   verticalRL" data-offset-x="0"  data-offset-y="0"  data-expected-width="10" data-expected-height="50">X X X</div>
         <div class="firstRowSecondColumn  verticalRL" data-offset-x="100" data-offset-y="0"  data-expected-width="10" data-expected-height="110">X X X X X X</div>
-        <div class="secondRowFirstColumn  verticalRL" data-offset-x="0"  data-offset-y="110" data-expected-width="10" data-expected-height="110">X X X X X X</div>
-        <div class="secondRowSecondColumn verticalRL" data-offset-x="100" data-offset-y="110" data-expected-width="20" data-expected-height="150">X X X X X X X X X X X X</div>
+        <div class="secondRowFirstColumn  verticalRL" data-offset-x="0"  data-offset-y="130" data-expected-width="10" data-expected-height="110">X X X X X X</div>
+        <div class="secondRowSecondColumn verticalRL" data-offset-x="100" data-offset-y="130" data-expected-width="20" data-expected-height="150">X X X X X X X X X X X X</div>
     </div>
 </div>
 
@@ -60,8 +60,8 @@
     <div class="grid itemsStart contentStart verticalLR fit-content" data-expected-width="260" data-expected-height="120">
         <div class="firstRowFirstColumn   horizontalTB" data-offset-x="0"   data-offset-y="0"  data-expected-width="50" data-expected-height="10">X X X</div>
         <div class="firstRowSecondColumn  horizontalTB" data-offset-x="0" data-offset-y="100" data-expected-width="110" data-expected-height="10">X X X X X X</div>
-        <div class="secondRowFirstColumn  horizontalTB" data-offset-x="110"   data-offset-y="0"  data-expected-width="110" data-expected-height="10">X X X X X X</div>
-        <div class="secondRowSecondColumn horizontalTB" data-offset-x="110" data-offset-y="100" data-expected-width="150" data-expected-height="20">X X X X X X X X X X X X</div>
+        <div class="secondRowFirstColumn  horizontalTB" data-offset-x="130"   data-offset-y="0"  data-expected-width="110" data-expected-height="10">X X X X X X</div>
+        <div class="secondRowSecondColumn horizontalTB" data-offset-x="130" data-offset-y="100" data-expected-width="150" data-expected-height="20">X X X X X X X X X X X X</div>
     </div>
 </div>
 
@@ -70,8 +70,8 @@
     <div class="grid itemsStart contentStart verticalRL fit-content" data-expected-width="260" data-expected-height="120">
         <div class="firstRowFirstColumn   horizontalTB" data-offset-x="210"   data-offset-y="0"  data-expected-width="50" data-expected-height="10">X X X</div>
         <div class="firstRowSecondColumn  horizontalTB" data-offset-x="150" data-offset-y="100" data-expected-width="110" data-expected-height="10">X X X X X X</div>
-        <div class="secondRowFirstColumn  horizontalTB" data-offset-x="40"   data-offset-y="0"  data-expected-width="110" data-expected-height="10">X X X X X X</div>
-        <div class="secondRowSecondColumn horizontalTB" data-offset-x="0" data-offset-y="100" data-expected-width="150" data-expected-height="20">X X X X X X X X X X X X</div>
+        <div class="secondRowFirstColumn  horizontalTB" data-offset-x="20"   data-offset-y="0"  data-expected-width="110" data-expected-height="10">X X X X X X</div>
+        <div class="secondRowSecondColumn horizontalTB" data-offset-x="-20" data-offset-y="100" data-expected-width="150" data-expected-height="20">X X X X X X X X X X X X</div>
     </div>
 </div>
 
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt b/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt
index d5aa4584a..f50e947 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set-expected.txt
@@ -8,11 +8,11 @@
 PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-columns') is "[first] 10px"
 PASS window.getComputedStyle(gridWithFixedElement, '').getPropertyValue('grid-template-rows') is "[first] 15px"
 PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-columns') is "400px [last]"
-PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "162px [last]"
+PASS window.getComputedStyle(gridWithPercentElement, '').getPropertyValue('grid-template-rows') is "150px [last]"
 PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-columns') is "0px [last]"
 PASS window.getComputedStyle(gridWithPercentWithoutSize, '').getPropertyValue('grid-template-rows') is "0px [last]"
 PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-columns') is "38.5px [last]"
-PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-rows') is "22px [last]"
+PASS window.getComputedStyle(gridWithPercentWithoutSizeWithChildren, '').getPropertyValue('grid-template-rows') is "5.5px [last]"
 PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-columns') is "[first] 0px"
 PASS window.getComputedStyle(gridWithAutoElement, '').getPropertyValue('grid-template-rows') is "0px [last]"
 PASS window.getComputedStyle(gridWithAutoWithChildrenElement, '').getPropertyValue('grid-template-columns') is "[first] 77px"
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set.html
index 149fc388..7b817c6 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/named-grid-line-get-set.html
@@ -22,7 +22,7 @@
 }
 .gridWithPercent {
     grid-template-columns: 50% [last];
-    grid-template-rows: 27% [last];
+    grid-template-rows: 25% [last];
 }
 .gridWithAuto {
     grid-template-columns: [first] auto;
@@ -104,9 +104,9 @@
 
     debug("Test getting grid-template-columns and grid-template-rows set through CSS");
     testGridDefinitionsValues(document.getElementById("gridWithFixedElement"), "[first] 10px", "[first] 15px");
-    testGridDefinitionsValues(document.getElementById("gridWithPercentElement"), "400px [last]", "162px [last]");
+    testGridDefinitionsValues(document.getElementById("gridWithPercentElement"), "400px [last]", "150px [last]");
     testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSize"), "0px [last]", "0px [last]");
-    testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "38.5px [last]", "22px [last]");
+    testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "38.5px [last]", "5.5px [last]");
     testGridDefinitionsValues(document.getElementById("gridWithAutoElement"), "[first] 0px", "0px [last]");
     testGridDefinitionsValues(document.getElementById("gridWithAutoWithChildrenElement"), "[first] 77px", "22px [last]");
     testGridDefinitionsValues(document.getElementById("gridWithMinMax"), "[first] 80px", "300px [last]");
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size.html
index cc27b89f..440681400 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/percent-track-breadths-regarding-container-size.html
@@ -53,17 +53,17 @@
     <p>This test checks percentage track breadths are resolved properly regarding the container size.</p>
     <div class="unconstrainedContainer">
         <div class="grid">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="200" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="500" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="300" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="200" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="500" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="300" data-expected-height="4">XXX</div>
         </div>
     </div>
 
     <div class="fit-content indefiniteHeight">
         <div class="grid">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="4">XXX</div>
         </div>
     </div>
 
@@ -85,9 +85,9 @@
 
     <div class="fit-content indefiniteHeight">
         <div class="grid calculatedSize">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="44" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="110" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="66" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="44" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="110" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="66" data-expected-height="4">XXX</div>
         </div>
     </div>
 
@@ -101,9 +101,9 @@
 
     <div class="fit-content indefiniteHeight">
         <div class="grid percentageSize">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="10" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="25" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="15" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="10" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="25" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="15" data-expected-height="4">XXX</div>
         </div>
     </div>
 
@@ -117,33 +117,33 @@
 
     <div class="fit-content indefiniteHeight">
         <div class="grid fit-content indefiniteHeight">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="4">XXX</div>
         </div>
     </div>
 
     <div class="unconstrainedContainer">
         <div class="grid fit-content indefiniteHeight">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="4">XXX</div>
         </div>
     </div>
 
     <div class="indefiniteHeight fit-content">
         <div class="grid fit-content">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="4">XXX</div>
         </div>
     </div>
 
     <div class="unconstrainedContainer">
         <div class="grid fit-content">
-            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="10">XX</div>
-            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="10">XXXXX</div>
-            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="10">XXX</div>
+            <div class="firstRowFirstColumn sizedToGridArea" data-expected-width="20" data-expected-height="4">XX</div>
+            <div class="firstRowSecondColumn sizedToGridArea" data-expected-width="50" data-expected-height="4">XXXXX</div>
+            <div class="firstRowThirdColumn sizedToGridArea" data-expected-width="30" data-expected-height="4">XXX</div>
         </div>
     </div>
 
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/positioned-grid-container-percentage-tracks.html b/third_party/WebKit/LayoutTests/fast/css-grid-layout/positioned-grid-container-percentage-tracks.html
index 821471f..54bbe758 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/positioned-grid-container-percentage-tracks.html
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/positioned-grid-container-percentage-tracks.html
@@ -66,19 +66,19 @@
 <div class="wrapper">
     <div class="grid twoRowsTwoColumns">
         <div class="firstRowFirstColumn"
-            data-offset-x="0" data-offset-y="0" data-expected-width="36" data-expected-height="10">
+            data-offset-x="0" data-offset-y="0" data-expected-width="36" data-expected-height="5">
             XXX
         </div>
         <div class="firstRowSecondColumn"
-            data-offset-x="36" data-offset-y="0" data-expected-width="24" data-expected-height="10">
+            data-offset-x="36" data-offset-y="0" data-expected-width="24" data-expected-height="5">
             XXX
         </div>
         <div class="secondRowFirstColumn"
-            data-offset-x="0" data-offset-y="10" data-expected-width="36" data-expected-height="10">
+            data-offset-x="0" data-offset-y="5" data-expected-width="36" data-expected-height="15">
             XXX
         </div>
         <div class="secondRowSecondColumn"
-            data-offset-x="36" data-offset-y="10" data-expected-width="24" data-expected-height="10">
+            data-offset-x="36" data-offset-y="5" data-expected-width="24" data-expected-height="15">
             XXX
         </div>
     </div>
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js
index d1f577f..8597977 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set-multiple.js
@@ -2,15 +2,15 @@
 
 debug("Test getting |grid-template-columns| and |grid-template-rows| set through CSS");
 testGridDefinitionsValues(document.getElementById("gridWithFixedElement"), "7px 11px", "17px 2px");
-testGridDefinitionsValues(document.getElementById("gridWithPercentElement"), "400px 800px", "162px 312px");
-testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSize"), "3.5px 7px", "11px 0px");
+testGridDefinitionsValues(document.getElementById("gridWithPercentElement"), "400px 800px", "150px 450px");
+testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSize"), "3.5px 7px", "4px 12px");
 testGridDefinitionsValues(document.getElementById("gridWithAutoElement"), "0px 17px", "0px 3px");
 testGridDefinitionsValues(document.getElementById("gridWithEMElement"), "100px 120px", "150px 170px");
 testGridDefinitionsValues(document.getElementById("gridWithThreeItems"), "15px 0px 100px", "120px 18px 0px");
 testGridDefinitionsValues(document.getElementById("gridWithPercentAndViewportPercent"), "400px 120px", "210px 168px");
 testGridDefinitionsValues(document.getElementById("gridWithFitContentAndFitAvailable"), "none", "none");
 testGridDefinitionsValues(document.getElementById("gridWithMinMaxContent"), "0px 0px", "0px 0px");
-testGridDefinitionsValues(document.getElementById("gridWithMinMaxContentWithChildrenElement"), "7px 17px", "11px 3px");
+testGridDefinitionsValues(document.getElementById("gridWithMinMaxContentWithChildrenElement"), "7px 17px", "16px 3px");
 testGridDefinitionsValues(document.getElementById("gridWithMinMaxAndFixed"), "240px 15px", "120px 210px");
 testGridDefinitionsValues(document.getElementById("gridWithMinMaxAndMinMaxContent"), "240px 15px", "120px 210px");
 testGridDefinitionsValues(document.getElementById("gridWithFractionFraction"), "320px 480px", "225px 375px");
diff --git a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js
index e9a2d0f..77a98c7e1 100644
--- a/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js
+++ b/third_party/WebKit/LayoutTests/fast/css-grid-layout/resources/grid-columns-rows-get-set.js
@@ -5,24 +5,24 @@
 testGridDefinitionsValues(document.getElementById("gridWithFixedElement"), "10px", "15px");
 testGridDefinitionsValues(document.getElementById("gridWithPercentElement"), "400px", "150px");
 testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSize"), "0px", "0px");
-testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "3.5px", "11px");
+testGridDefinitionsValues(document.getElementById("gridWithPercentWithoutSizeWithChildren"), "3.5px", "4px");
 testGridDefinitionsValues(document.getElementById("gridWithAutoElement"), "0px", "0px");
 testGridDefinitionsValues(document.getElementById("gridWithAutoWithoutSizeElement"), "0px", "0px");
-testGridDefinitionsValues(document.getElementById("gridWithAutoWithChildrenElement"), "7px", "11px");
+testGridDefinitionsValues(document.getElementById("gridWithAutoWithChildrenElement"), "7px", "16px");
 testGridDefinitionsValues(document.getElementById("gridWithEMElement"), "100px", "150px");
 testGridDefinitionsValues(document.getElementById("gridWithViewPortPercentageElement"), "64px", "60px");
 testGridDefinitionsValues(document.getElementById("gridWithMinMaxElement"), "80px", "300px");
 testGridDefinitionsValues(document.getElementById("gridWithMinContentElement"), "0px", "0px");
-testGridDefinitionsValues(document.getElementById("gridWithMinContentWithChildrenElement"), "17px", "11px");
+testGridDefinitionsValues(document.getElementById("gridWithMinContentWithChildrenElement"), "17px", "16px");
 testGridDefinitionsValues(document.getElementById("gridWithMaxContentElement"), "0px", "0px");
-testGridDefinitionsValues(document.getElementById("gridWithMaxContentWithChildrenElement"), "17px", "11px");
+testGridDefinitionsValues(document.getElementById("gridWithMaxContentWithChildrenElement"), "17px", "16px");
 testGridDefinitionsValues(document.getElementById("gridWithFractionElement"), "800px", "600px");
 testGridDefinitionsValues(document.getElementById("gridWithCalcElement"), "150px", "75px");
 testGridDefinitionsValues(document.getElementById("gridWithCalcComplexElement"), "550px", "465px");
 testGridDefinitionsValues(document.getElementById("gridWithCalcInsideMinMaxElement"), "80px", "300px");
 testGridDefinitionsValues(document.getElementById("gridWithCalcComplexInsideMinMaxElement"), "415px", "300px");
-testGridDefinitionsValues(document.getElementById("gridWithAutoInsideMinMaxElement"), "20px", "11px");
-testGridDefinitionsValues(document.getElementById("gridWithFitContentFunctionElement"), "7px", "11px");
+testGridDefinitionsValues(document.getElementById("gridWithAutoInsideMinMaxElement"), "20px", "16px");
+testGridDefinitionsValues(document.getElementById("gridWithFitContentFunctionElement"), "7px", "16px");
 
 debug("");
 debug("Test getting wrong values for grid-template-columns and grid-template-rows through CSS (they should resolve to the default: 'none')");
diff --git a/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html b/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
index 1dc3810..c0d358148 100644
--- a/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
+++ b/third_party/WebKit/LayoutTests/fast/css/CSSStyleSheet-constructable.html
@@ -28,6 +28,56 @@
   assert_equals(sheet.cssRules[0].cssText, redStyleTexts[1]);
 }, 'Empty CSSStyleSheet can be constructed using script');
 
+test(() => {
+  const sheet = document.createEmptyCSSStyleSheet({title: "Red", disabled: true, media: "screen, print"});
+  assert_equals(sheet.title, "Red");
+  assert_equals(sheet.ownerNode, null);
+  assert_equals(sheet.ownerRule, null);
+  assert_equals(sheet.media.length, 2);
+  assert_equals(sheet.media.item(0), "screen");
+  assert_equals(sheet.media.item(1), "print");
+  assert_true(sheet.disabled);
+  assert_equals(sheet.cssRules.length, 0);
+
+  sheet.insertRule(redStyleTexts[0]);
+  assert_equals(sheet.cssRules.length, 1);
+  assert_equals(sheet.cssRules[0].cssText, redStyleTexts[0]);
+
+  sheet.insertRule(redStyleTexts[1]);
+  assert_equals(sheet.cssRules.length, 2);
+  assert_equals(sheet.cssRules[0].cssText, redStyleTexts[1]);
+
+  const sheet2 = document.createEmptyCSSStyleSheet({});
+  assert_equals(sheet2.title, "")
+  assert_equals(sheet2.ownerNode, null);
+  assert_equals(sheet2.ownerRule, null);
+  assert_equals(sheet2.media.length, 0);
+  assert_false(sheet2.disabled);
+  assert_equals(sheet2.cssRules.length, 0);
+
+  sheet2.insertRule(redStyleTexts[1]);
+  assert_equals(sheet2.cssRules.length, 1);
+  assert_equals(sheet2.cssRules[0].cssText, redStyleTexts[1]);
+
+  sheet2.deleteRule(0);
+  assert_equals(sheet2.cssRules.length, 0);
+
+const sheet3 = document.createEmptyCSSStyleSheet();
+  assert_equals(sheet3.title, "")
+  assert_equals(sheet3.ownerNode, null);
+  assert_equals(sheet3.ownerRule, null);
+  assert_equals(sheet3.media.length, 0);
+  assert_false(sheet3.disabled);
+  assert_equals(sheet3.cssRules.length, 0);
+
+  sheet3.insertRule(redStyleTexts[1]);
+  assert_equals(sheet3.cssRules.length, 1);
+  assert_equals(sheet3.cssRules[0].cssText, redStyleTexts[1]);
+
+  sheet3.deleteRule(0);
+  assert_equals(sheet3.cssRules.length, 0);
+}, 'Document.createEmptyCSSStyleSheet produces empty CSSStyleSheet');
+
 promise_test(() => {
   const promise_sheet = document.createCSSStyleSheet(redStyleTexts[0], {title: "Red", disabled: true, media: "screen, print"});
   return promise_sheet.then(function(sheet) {
diff --git a/third_party/WebKit/LayoutTests/fast/css/containment/contain-parse-and-apply-expected.txt b/third_party/WebKit/LayoutTests/fast/css/containment/contain-parse-and-apply-expected.txt
index eba40098..582980e 100644
--- a/third_party/WebKit/LayoutTests/fast/css/containment/contain-parse-and-apply-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/containment/contain-parse-and-apply-expected.txt
@@ -12,6 +12,13 @@
 PASS computedContainValue(children[i]) is "none"
 PASS computedContainValue(children[i]) is "none"
 PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
+PASS computedContainValue(children[i]) is "none"
 PASS getContainValue('#test') is "strict"
 PASS getContainValue('#test') is "layout paint"
 PASS getContainValue('#test') is "strict"
diff --git a/third_party/WebKit/LayoutTests/fast/css/parsing-text-rendering-expected.txt b/third_party/WebKit/LayoutTests/fast/css/parsing-text-rendering-expected.txt
index 07a92d2..ffefb853 100644
--- a/third_party/WebKit/LayoutTests/fast/css/parsing-text-rendering-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/css/parsing-text-rendering-expected.txt
@@ -1,13 +1,13 @@
-This tests checks that all of the input values for background-repeat parse correctly.
+This tests checks that all of the input values for text-rendering parse correctly.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
 PASS test("text-rendering: auto;") is "auto"
-PASS test("text-rendering: optimizeSpeed;") is "optimizeSpeed"
-PASS test("text-rendering: optimizeLegibility;") is "optimizeLegibility"
-PASS test("text-rendering: geometricPrecision;") is "geometricPrecision"
-PASS test("text-rendering: OptIMizESpEEd;") is "optimizeSpeed"
+PASS test("text-rendering: optimizespeed;") is "optimizespeed"
+PASS test("text-rendering: optimizelegibility;") is "optimizelegibility"
+PASS test("text-rendering: geometricprecision;") is "geometricprecision"
+PASS test("text-rendering: OptIMizESpEEd;") is "optimizespeed"
 PASS test("text-rendering: auto auto;") is ""
 PASS test("text-rendering: optimizeCoconuts;") is ""
 PASS test("text-rendering: 15;") is ""
diff --git a/third_party/WebKit/LayoutTests/fast/css/resources/parsing-text-rendering.js b/third_party/WebKit/LayoutTests/fast/css/resources/parsing-text-rendering.js
index 2104e14..a090598 100644
--- a/third_party/WebKit/LayoutTests/fast/css/resources/parsing-text-rendering.js
+++ b/third_party/WebKit/LayoutTests/fast/css/resources/parsing-text-rendering.js
@@ -1,4 +1,4 @@
-description("This tests checks that all of the input values for background-repeat parse correctly.");
+description("This tests checks that all of the input values for text-rendering parse correctly.");
 
 function test(value)
 {
@@ -12,10 +12,10 @@
 }
 
 shouldBe('test("text-rendering: auto;")', '"auto"');
-shouldBe('test("text-rendering: optimizeSpeed;")', '"optimizeSpeed"');
-shouldBe('test("text-rendering: optimizeLegibility;")', '"optimizeLegibility"');
-shouldBe('test("text-rendering: geometricPrecision;")', '"geometricPrecision"');
-shouldBe('test("text-rendering: OptIMizESpEEd;")', '"optimizeSpeed"');
+shouldBe('test("text-rendering: optimizespeed;")', '"optimizespeed"');
+shouldBe('test("text-rendering: optimizelegibility;")', '"optimizelegibility"');
+shouldBe('test("text-rendering: geometricprecision;")', '"geometricprecision"');
+shouldBe('test("text-rendering: OptIMizESpEEd;")', '"optimizespeed"');
 
 shouldBeEqualToString('test("text-rendering: auto auto;")', '');
 shouldBeEqualToString('test("text-rendering: optimizeCoconuts;")', '');
diff --git a/third_party/WebKit/LayoutTests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt b/third_party/WebKit/LayoutTests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt
index 8998b79..becd869 100644
--- a/third_party/WebKit/LayoutTests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/events/event-fire-disconnected-shadow-dom-crash-expected.txt
@@ -1,4 +1,5 @@
-ABCABC
+ABC
+ABC
 
 ABC
 
diff --git a/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child-1.html b/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child-1.html
new file mode 100644
index 0000000..a5bce3f
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child-1.html
@@ -0,0 +1 @@
+test1
diff --git a/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child-2.html b/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child-2.html
new file mode 100644
index 0000000..180cf83
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child-2.html
@@ -0,0 +1 @@
+test2
diff --git a/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child.html b/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child.html
index ec581c58..b8ae01075 100644
--- a/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child.html
+++ b/third_party/WebKit/LayoutTests/fast/frames/resources/frame-navigation-child.html
@@ -1,9 +1,10 @@
 <p>This tests that navigating to two pages in a subframe, and then going back does not cause an assertion.</p>
 <p>SUCCESS - Didn't assert!</p>
 <script>
+
 if (window.testRunner) {
-    testRunner.queueLoad('data:text/html,test1', 'target')
-    testRunner.queueLoad('data:text/html,test2', 'target')
+    testRunner.queueLoad('resources/frame-navigation-child-1.html', 'target')
+    testRunner.queueLoad('resources/frame-navigation-child-2.html', 'target')
     testRunner.queueBackNavigation(1);
 } else
     document.write('This test must be run by DumpRenderTree!')
diff --git a/third_party/WebKit/LayoutTests/fast/mediastream/getdisplaymedia.html b/third_party/WebKit/LayoutTests/fast/mediastream/getdisplaymedia.html
new file mode 100644
index 0000000..32c1b38
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/mediastream/getdisplaymedia.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+
+promise_test(function() {
+  assert_idl_attribute(navigator, 'getDisplayMedia');
+
+  return navigator.getDisplayMedia().then(function(s) {
+    fail('getDisplayMedia should have failed');
+  }).catch(function(e) {
+    assert_equals(e.name, 'NotSupportedError');
+  });
+}, 'getDisplayMedia() call');
+
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-address-harvesting.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-address-harvesting.html
new file mode 100644
index 0000000..84e1bee
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-address-harvesting.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>RTCPeerConnection address harvesting</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+</head>
+<body>
+<script>
+promise_test(async function() {
+    let pc = new RTCPeerConnection();
+    pc.createDataChannel('foo');
+    let candidates = [];
+    pc.onicecandidate = function(event) {
+        if (event.candidate) {
+            candidates.push(event.candidate);
+        }
+    }
+    let gatheringDone = new Promise(function(resolve, reject) {
+        pc.onicegatheringstatechange = function() {
+            if (pc.iceGatheringState == 'complete') {
+                resolve();
+            }
+        }
+    });
+    const offer = await pc.createOffer();
+    await pc.setLocalDescription(offer);
+    await gatheringDone;
+    assert_true(candidates.length > 0);
+    pc.close();
+}, 'Test that address harvesting does not cause crash');
+
+</script>
+</body>
+</html>
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/20110323/list-style-position-005-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/20110323/list-style-position-005-expected.txt
index 7e248cf..408fb407 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/20110323/list-style-position-005-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/20110323/list-style-position-005-expected.txt
@@ -13,9 +13,9 @@
           text run at (124,0) width 274: " be a green bar stacked on top of a blue bar."
       LayoutNGListItem {DIV} at (0,36) size 784x202 [color=#00FF00] [bgcolor=#00FF00]
         LayoutNGBlockFlow (anonymous) at (0,0) size 784x101
-          LayoutInline (anonymous) at (0,0) size 30x97
-            LayoutText (anonymous) at (-1,2) size 30x97
-              text run at (-1,2) width 30: "\x{2022}"
+          LayoutInline (anonymous) at (0,0) size 27x97
+            LayoutText (anonymous) at (-1,2) size 27x97
+              text run at (-1,2) width 27: "\x{2022}"
         LayoutNGBlockFlow {DIV} at (0,101) size 784x101 [bgcolor=#0000FF]
           LayoutText {#text} at (0,2) size 21x97
             text run at (0,2) width 21: " "
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.txt
index 1879f49..6d2ccc67 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-13-b-expected.txt
@@ -73,10 +73,10 @@
               text run at (139,0) width 12: "K"
         LayoutText {#text} at (151,0) size 4x19
           text run at (151,0) width 4: " "
-        LayoutInline {SPAN} at (0,0) size 9x19
-          LayoutInline {<pseudo:before>} at (0,0) size 9x19
-            LayoutCounter (anonymous) at (155,0) size 9x19
-              text run at (155,0) width 9: "L"
+        LayoutInline {SPAN} at (0,0) size 10x19
+          LayoutInline {<pseudo:before>} at (0,0) size 10x19
+            LayoutCounter (anonymous) at (155,0) size 10x19
+              text run at (155,0) width 10: "L"
         LayoutText {#text} at (0,0) size 0x0
       LayoutNGBlockFlow {DIV} at (0,56) size 784x20
         LayoutText {#text} at (0,0) size 165x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.txt
index 1879f49..6d2ccc67 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counter-14-b-expected.txt
@@ -73,10 +73,10 @@
               text run at (139,0) width 12: "K"
         LayoutText {#text} at (151,0) size 4x19
           text run at (151,0) width 4: " "
-        LayoutInline {SPAN} at (0,0) size 9x19
-          LayoutInline {<pseudo:before>} at (0,0) size 9x19
-            LayoutCounter (anonymous) at (155,0) size 9x19
-              text run at (155,0) width 9: "L"
+        LayoutInline {SPAN} at (0,0) size 10x19
+          LayoutInline {<pseudo:before>} at (0,0) size 10x19
+            LayoutCounter (anonymous) at (155,0) size 10x19
+              text run at (155,0) width 10: "L"
         LayoutText {#text} at (0,0) size 0x0
       LayoutNGBlockFlow {DIV} at (0,56) size 784x20
         LayoutText {#text} at (0,0) size 165x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt
index 24d1224..fe075f7 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-13-b-expected.txt
@@ -73,10 +73,10 @@
               text run at (289,0) width 28: "A.K"
         LayoutText {#text} at (317,0) size 3x19
           text run at (317,0) width 3: " "
-        LayoutInline {SPAN} at (0,0) size 25x19
-          LayoutInline {<pseudo:before>} at (0,0) size 25x19
-            LayoutCounter (anonymous) at (320,0) size 25x19
-              text run at (320,0) width 25: "A.L"
+        LayoutInline {SPAN} at (0,0) size 26x19
+          LayoutInline {<pseudo:before>} at (0,0) size 26x19
+            LayoutCounter (anonymous) at (320,0) size 26x19
+              text run at (320,0) width 26: "A.L"
         LayoutText {#text} at (0,0) size 0x0
       LayoutNGBlockFlow {DIV} at (0,56) size 784x20
         LayoutText {#text} at (0,0) size 346x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt
index 24d1224..fe075f7 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/css2.1/t1202-counters-14-b-expected.txt
@@ -73,10 +73,10 @@
               text run at (289,0) width 28: "A.K"
         LayoutText {#text} at (317,0) size 3x19
           text run at (317,0) width 3: " "
-        LayoutInline {SPAN} at (0,0) size 25x19
-          LayoutInline {<pseudo:before>} at (0,0) size 25x19
-            LayoutCounter (anonymous) at (320,0) size 25x19
-              text run at (320,0) width 25: "A.L"
+        LayoutInline {SPAN} at (0,0) size 26x19
+          LayoutInline {<pseudo:before>} at (0,0) size 26x19
+            LayoutCounter (anonymous) at (320,0) size 26x19
+              text run at (320,0) width 26: "A.L"
         LayoutText {#text} at (0,0) size 0x0
       LayoutNGBlockFlow {DIV} at (0,56) size 784x20
         LayoutText {#text} at (0,0) size 346x19
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.txt
index 551d754..6fca2c1 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/editing/selection/dont-select-text-overflow-ellipsis-when-wrapping-rtl-expected.txt
@@ -12,8 +12,7 @@
             text run at (0,0) width 212: "Lorem ipsum dolor sit amet"
 layer at (208,52) size 344x22 scrollX 873.00 scrollWidth 1217
   LayoutNGBlockFlow {DD} at (0,0) size 344x22
-    LayoutText {#text} at (-873,0) size 1217x21
-      text run at (-873,0) width 5: "."
+    LayoutText {#text} at (21,0) size 342x21
       text run at (21,0) width 323: "e magna aliquyam erat, sed diam voluptua"
       text run at (2,0) width 19: "\x{2026}"
 selection start: position 0 of child 0 {#text} of child 1 {DD} of child 2 {DL} of body
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt
index ba147583..8202077 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-bidi-expected.txt
@@ -27,8 +27,7 @@
       text run at (203,0) width 4: "\x{202B} "
 layer at (8,108) size 207x20 scrollX 125.00 scrollWidth 332
   LayoutNGBlockFlow {DIV} at (0,100) size 207x20
-    LayoutText {#text} at (-125,0) size 332x19
-      text run at (-125,0) width 4: " \x{202C}"
+    LayoutText {#text} at (20,0) size 203x19
       text run at (20,0) width 99: "\x{5D8}\x{5E7}\x{5E1}\x{5D8} \x{5E2}\x{5D1}\x{5E8}\x{5D9} \x{5DC}\x{5D3}\x{5D5}\x{5D2}"
       text run at (119,0) width 4: " "
       text run at (123,0) width 80: "English Text"
@@ -47,9 +46,9 @@
       text run at (187,0) width 4: " "
       text run at (191,0) width 23: "yet "
       text run at (214,0) width 29: "\x{5D0}\x{5D7}\x{5EA}"
-layer at (8,188) size 207x20 scrollWidth 266
+layer at (8,188) size 207x20 scrollWidth 243
   LayoutNGBlockFlow {DIV} at (0,180) size 207x20
-    LayoutText {#text} at (0,0) size 266x19
+    LayoutText {#text} at (0,0) size 207x19
       text run at (0,0) width 29: "\x{5DE}\x{5D9}\x{5DC}\x{5D4}"
       text run at (29,0) width 4: " "
       text run at (33,0) width 37: "word "
@@ -58,6 +57,4 @@
       text run at (111,0) width 51: "another "
       text run at (162,0) width 25: "\x{5D5}\x{5E2}\x{5D5}\x{5D3}"
       text run at (187,0) width 4: " "
-      text run at (243,0) width 23: "yet "
-      text run at (214,0) width 29: "\x{5D0}\x{5D7}\x{5EA}"
       text run at (191,0) width 16: "\x{2026}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt
index 43ed862..8b40ec6 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-center-expected.txt
@@ -43,19 +43,19 @@
     LayoutText {#text} at (1,1) size 303x19
       text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (288,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (719,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,21) size 306x19
       text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (291,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (709,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,41) size 302x19
       text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (287,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (701,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,61) size 305x19
       text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (290,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (696,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,352) size 310x32 clip at (9,353) size 308x30 scrollWidth 747
   LayoutNGBlockFlow {DIV} at (0,343.88) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 181x19
@@ -64,14 +64,13 @@
     LayoutText {#text} at (207,11) size 102x19
       text run at (207,11) width 86: " consectetur a"
       text run at (293,11) width 16: "\x{2026}"
-layer at (8,446) size 310x32 clip at (9,447) size 308x30 scrollWidth 1190
+layer at (8,446) size 310x32 clip at (9,447) size 308x30 scrollWidth 743
   LayoutNGBlockFlow {DIV} at (0,437.59) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 287x19
       text run at (1,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (272,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (744,1) size 25x25
-    LayoutText {#text} at (744,11) size 447x19
-      text run at (744,11) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,539) size 310x22 clip at (9,540) size 308x20 scrollX 411.00 scrollWidth 719
   LayoutNGBlockFlow {DIV} at (0,531.31) size 310x22 [border: (1px solid #000000)]
     LayoutText {#text} at (22,1) size 303x19
@@ -82,19 +81,19 @@
     LayoutText {#text} at (22,1) size 303x19
       text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (6,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (-410,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (19,21) size 306x19
       text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (3,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (-400,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (23,41) size 302x19
       text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (7,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (-392,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (20,61) size 305x19
       text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (4,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (-387,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,767) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748
   LayoutNGBlockFlow {DIV} at (0,758.75) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (128,11) size 181x19
@@ -108,6 +107,5 @@
     LayoutText {#text} at (38,11) size 287x19
       text run at (38,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (22,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (309,1) size 25x25
-    LayoutText {#text} at (309,11) size 448x19
-      text run at (309,11) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt
index db8a3b2..8fb1dbb 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-justify-expected.txt
@@ -44,19 +44,19 @@
     LayoutText {#text} at (1,1) size 303x19
       text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (288,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (719,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,21) size 306x19
       text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (291,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (709,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,41) size 302x19
       text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (287,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (701,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,61) size 305x19
       text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (290,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (696,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,372) size 310x32 clip at (9,373) size 308x30 scrollWidth 747
   LayoutNGBlockFlow {DIV} at (0,363.88) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 181x19
@@ -65,14 +65,13 @@
     LayoutText {#text} at (207,11) size 102x19
       text run at (207,11) width 86: " consectetur a"
       text run at (293,11) width 16: "\x{2026}"
-layer at (8,466) size 310x32 clip at (9,467) size 308x30 scrollWidth 1190
+layer at (8,466) size 310x32 clip at (9,467) size 308x30 scrollWidth 743
   LayoutNGBlockFlow {DIV} at (0,457.59) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 287x19
       text run at (1,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (272,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (744,1) size 25x25
-    LayoutText {#text} at (744,11) size 447x19
-      text run at (744,11) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,559) size 310x22 clip at (9,560) size 308x20 scrollX 411.00 scrollWidth 719
   LayoutNGBlockFlow {DIV} at (0,551.31) size 310x22 [border: (1px solid #000000)]
     LayoutText {#text} at (22,1) size 303x19
@@ -83,19 +82,19 @@
     LayoutText {#text} at (22,1) size 303x19
       text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (6,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (-410,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (19,21) size 306x19
       text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (3,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (-400,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (23,41) size 302x19
       text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (7,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (-392,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (20,61) size 305x19
       text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (4,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (-387,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,787) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748
   LayoutNGBlockFlow {DIV} at (0,778.75) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (128,11) size 181x19
@@ -109,6 +108,5 @@
     LayoutText {#text} at (38,11) size 287x19
       text run at (38,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (22,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (309,1) size 25x25
-    LayoutText {#text} at (309,11) size 448x19
-      text run at (309,11) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt
index 85e03e2..4fd9f57 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-left-expected.txt
@@ -43,19 +43,19 @@
     LayoutText {#text} at (1,1) size 303x19
       text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (288,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (719,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,21) size 306x19
       text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (291,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (709,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,41) size 302x19
       text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (287,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (701,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,61) size 305x19
       text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (290,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (696,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,352) size 310x32 clip at (9,353) size 308x30 scrollWidth 747
   LayoutNGBlockFlow {DIV} at (0,343.88) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 181x19
@@ -64,14 +64,13 @@
     LayoutText {#text} at (207,11) size 102x19
       text run at (207,11) width 86: " consectetur a"
       text run at (293,11) width 16: "\x{2026}"
-layer at (8,446) size 310x32 clip at (9,447) size 308x30 scrollWidth 1190
+layer at (8,446) size 310x32 clip at (9,447) size 308x30 scrollWidth 743
   LayoutNGBlockFlow {DIV} at (0,437.59) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 287x19
       text run at (1,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (272,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (744,1) size 25x25
-    LayoutText {#text} at (744,11) size 447x19
-      text run at (744,11) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,539) size 310x22 clip at (9,540) size 308x20 scrollX 411.00 scrollWidth 719
   LayoutNGBlockFlow {DIV} at (0,531.31) size 310x22 [border: (1px solid #000000)]
     LayoutText {#text} at (22,1) size 303x19
@@ -82,19 +81,19 @@
     LayoutText {#text} at (22,1) size 303x19
       text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (6,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (-410,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (19,21) size 306x19
       text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (3,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (-400,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (23,41) size 302x19
       text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (7,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (-392,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (20,61) size 305x19
       text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (4,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (-387,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,767) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748
   LayoutNGBlockFlow {DIV} at (0,758.75) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (128,11) size 181x19
@@ -108,6 +107,5 @@
     LayoutText {#text} at (38,11) size 287x19
       text run at (38,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (22,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (309,1) size 25x25
-    LayoutText {#text} at (309,11) size 448x19
-      text run at (309,11) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt
index 7c5f817..338d8c0 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/text-overflow-ellipsis-text-align-right-expected.txt
@@ -43,19 +43,19 @@
     LayoutText {#text} at (1,1) size 303x19
       text run at (1,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (288,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (719,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,21) size 306x19
       text run at (1,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (291,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (709,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,41) size 302x19
       text run at (1,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (287,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (701,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (1,61) size 305x19
       text run at (1,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (290,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (696,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,352) size 310x32 clip at (9,353) size 308x30 scrollWidth 747
   LayoutNGBlockFlow {DIV} at (0,343.88) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 181x19
@@ -64,14 +64,13 @@
     LayoutText {#text} at (207,11) size 102x19
       text run at (207,11) width 86: " consectetur a"
       text run at (293,11) width 16: "\x{2026}"
-layer at (8,446) size 310x32 clip at (9,447) size 308x30 scrollWidth 1190
+layer at (8,446) size 310x32 clip at (9,447) size 308x30 scrollWidth 743
   LayoutNGBlockFlow {DIV} at (0,437.59) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (1,11) size 287x19
       text run at (1,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (272,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (744,1) size 25x25
-    LayoutText {#text} at (744,11) size 447x19
-      text run at (744,11) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,539) size 310x22 clip at (9,540) size 308x20 scrollX 411.00 scrollWidth 719
   LayoutNGBlockFlow {DIV} at (0,531.31) size 310x22 [border: (1px solid #000000)]
     LayoutText {#text} at (22,1) size 303x19
@@ -82,19 +81,19 @@
     LayoutText {#text} at (22,1) size 303x19
       text run at (22,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (6,1) width 16: "\x{2026}"
-    LayoutBR {BR} at (-410,1) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (19,21) size 306x19
       text run at (19,21) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (3,21) width 16: "\x{2026}"
-    LayoutBR {BR} at (-400,21) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (23,41) size 302x19
       text run at (23,41) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (7,41) width 16: "\x{2026}"
-    LayoutBR {BR} at (-392,41) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (20,61) size 305x19
       text run at (20,61) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (4,61) width 16: "\x{2026}"
-    LayoutBR {BR} at (-387,61) size 0x19
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,767) size 310x32 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollX 440.00 scrollWidth 748
   LayoutNGBlockFlow {DIV} at (0,758.75) size 310x32 [border: (1px solid #000000)]
     LayoutText {#text} at (128,11) size 181x19
@@ -108,6 +107,5 @@
     LayoutText {#text} at (38,11) size 287x19
       text run at (38,11) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (22,11) width 16: "\x{2026}"
-    LayoutImage {IMG} at (309,1) size 25x25
-    LayoutText {#text} at (309,11) size 448x19
-      text run at (309,11) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/transform-inline-style-remove-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/transform-inline-style-remove-expected.txt
index 62fd2c9..f6b6b80 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/transform-inline-style-remove-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/transform-inline-style-remove-expected.txt
@@ -3,7 +3,7 @@
 
 All "after" results should be null/empty
 
-transition (before): all 1s ease, left 3s cubic-bezier(0.2, 0.3, 0.6, 0.8) 2s
+transition (before): all 1s ease 0s, left 3s cubic-bezier(0.2, 0.3, 0.6, 0.8) 2s
 transition property (before): all, left
 transition duration (before): 1s, 3s
 transition timing function (before): ease, cubic-bezier(0.2, 0.3, 0.6, 0.8)
@@ -19,7 +19,7 @@
 transform origin X (after):
 transform origin Y (after):
 
-animation (before): test 5s ease-in-out infinite alternate
+animation (before): test 5s ease-in-out 0s infinite alternate none running
 animation name (before): test
 animation duration (before): 5s
 animation timing function (before): ease-in-out
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
index 625a1ba..0641ab69 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-center-expected.txt
@@ -37,19 +37,19 @@
     LayoutText {#text} at (62,1) size 19x303
       text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,288) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,719) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,1) size 19x306
       text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,291) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,709) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,1) size 19x302
       text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,287) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,701) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,1) size 19x305
       text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,290) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,696) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x181
@@ -58,14 +58,13 @@
     LayoutText {#text} at (2,207) size 19x102
       text run at (2,207) width 86: " consectetur a"
       text run at (2,293) width 16: "\x{2026}"
-layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 1190
+layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x287
       text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,272) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,744) size 25x25
-    LayoutText {#text} at (2,744) size 19x447
-      text run at (2,744) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,22) size 19x303
@@ -76,19 +75,19 @@
     LayoutText {#text} at (62,22) size 19x303
       text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,6) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,-410) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,19) size 19x306
       text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,3) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,-400) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,23) size 19x302
       text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,7) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,-392) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,20) size 19x305
       text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,4) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,-387) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,128) size 19x181
@@ -102,6 +101,5 @@
     LayoutText {#text} at (2,38) size 19x287
       text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,22) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,309) size 25x25
-    LayoutText {#text} at (2,309) size 19x448
-      text run at (2,309) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
index 625a1ba..0641ab69 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-justify-expected.txt
@@ -37,19 +37,19 @@
     LayoutText {#text} at (62,1) size 19x303
       text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,288) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,719) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,1) size 19x306
       text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,291) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,709) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,1) size 19x302
       text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,287) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,701) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,1) size 19x305
       text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,290) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,696) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x181
@@ -58,14 +58,13 @@
     LayoutText {#text} at (2,207) size 19x102
       text run at (2,207) width 86: " consectetur a"
       text run at (2,293) width 16: "\x{2026}"
-layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 1190
+layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x287
       text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,272) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,744) size 25x25
-    LayoutText {#text} at (2,744) size 19x447
-      text run at (2,744) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,22) size 19x303
@@ -76,19 +75,19 @@
     LayoutText {#text} at (62,22) size 19x303
       text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,6) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,-410) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,19) size 19x306
       text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,3) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,-400) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,23) size 19x302
       text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,7) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,-392) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,20) size 19x305
       text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,4) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,-387) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,128) size 19x181
@@ -102,6 +101,5 @@
     LayoutText {#text} at (2,38) size 19x287
       text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,22) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,309) size 25x25
-    LayoutText {#text} at (2,309) size 19x448
-      text run at (2,309) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
index 625a1ba..0641ab69 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-left-expected.txt
@@ -37,19 +37,19 @@
     LayoutText {#text} at (62,1) size 19x303
       text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,288) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,719) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,1) size 19x306
       text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,291) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,709) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,1) size 19x302
       text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,287) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,701) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,1) size 19x305
       text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,290) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,696) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x181
@@ -58,14 +58,13 @@
     LayoutText {#text} at (2,207) size 19x102
       text run at (2,207) width 86: " consectetur a"
       text run at (2,293) width 16: "\x{2026}"
-layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 1190
+layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x287
       text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,272) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,744) size 25x25
-    LayoutText {#text} at (2,744) size 19x447
-      text run at (2,744) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,22) size 19x303
@@ -76,19 +75,19 @@
     LayoutText {#text} at (62,22) size 19x303
       text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,6) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,-410) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,19) size 19x306
       text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,3) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,-400) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,23) size 19x302
       text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,7) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,-392) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,20) size 19x305
       text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,4) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,-387) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,128) size 19x181
@@ -102,6 +101,5 @@
     LayoutText {#text} at (2,38) size 19x287
       text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,22) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,309) size 25x25
-    LayoutText {#text} at (2,309) size 19x448
-      text run at (2,309) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
index 625a1ba..0641ab69 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/css/vertical-text-overflow-ellipsis-text-align-right-expected.txt
@@ -37,19 +37,19 @@
     LayoutText {#text} at (62,1) size 19x303
       text run at (62,1) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,288) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,719) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,1) size 19x306
       text run at (42,1) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,291) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,709) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,1) size 19x302
       text run at (22,1) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,287) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,701) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,1) size 19x305
       text run at (2,1) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,290) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,696) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,793) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 747
   LayoutNGBlockFlow {DIV} at (0,785.16) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x181
@@ -58,14 +58,13 @@
     LayoutText {#text} at (2,207) size 19x102
       text run at (2,207) width 86: " consectetur a"
       text run at (2,293) width 16: "\x{2026}"
-layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 1190
+layer at (8,1165) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollHeight 743
   LayoutNGBlockFlow {DIV} at (0,1156.88) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,1) size 19x287
       text run at (2,1) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,272) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,744) size 25x25
-    LayoutText {#text} at (2,744) size 19x447
-      text run at (2,744) width 447: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
 layer at (8,1537) size 22x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 411.00 scrollHeight 719
   LayoutNGBlockFlow {DIV} at (0,1528.59) size 22x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,22) size 19x303
@@ -76,19 +75,19 @@
     LayoutText {#text} at (62,22) size 19x303
       text run at (62,22) width 287: "Lorem ipsum dolor sit amet, consectetur adipi"
       text run at (62,6) width 16: "\x{2026}"
-    LayoutBR {BR} at (62,-410) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (42,19) size 19x306
       text run at (42,19) width 290: "orem ipsum dolor sit amet, consectetur adipisc"
       text run at (42,3) width 16: "\x{2026}"
-    LayoutBR {BR} at (42,-400) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (22,23) size 19x302
       text run at (22,23) width 286: "rem ipsum dolor sit amet, consectetur adipisci"
       text run at (22,7) width 16: "\x{2026}"
-    LayoutBR {BR} at (22,-392) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
     LayoutText {#text} at (2,20) size 19x305
       text run at (2,20) width 289: "em ipsum dolor sit amet, consectetur adipiscin"
       text run at (2,4) width 16: "\x{2026}"
-    LayoutBR {BR} at (2,-387) size 19x0
+    LayoutBR {BR} at (0,0) size 0x0
 layer at (8,2280) size 32x310 backgroundClip at (0,0) size 0x0 clip at (0,0) size 0x0 scrollY 440.00 scrollHeight 748
   LayoutNGBlockFlow {DIV} at (0,2272.03) size 32x310 [border: (1px solid #000000)]
     LayoutText {#text} at (2,128) size 19x181
@@ -102,6 +101,5 @@
     LayoutText {#text} at (2,38) size 19x287
       text run at (2,38) width 271: "Lorem ipsum dolor sit amet, consectetur ad"
       text run at (2,22) width 16: "\x{2026}"
-    LayoutImage {IMG} at (1,309) size 25x25
-    LayoutText {#text} at (2,309) size 19x448
-      text run at (2,309) width 448: "ipiscing elit. Vivamus vitae eros non libero faucibus sagittis sed ut eros."
+    LayoutImage {IMG} at (0,0) size 25x25
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/mouseclick-target-and-positioning-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/mouseclick-target-and-positioning-expected.txt
deleted file mode 100644
index c6b0c82c..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/events/mouseclick-target-and-positioning-expected.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-This page tests whether a click event propagates with the correct target and positioning. See rdar://problem/4477126.
-
-click inside the red box:[]
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/drawStyledEmptyInlinesWithWS-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/drawStyledEmptyInlinesWithWS-expected.png
deleted file mode 100644
index 0c23738..0000000
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/inline/drawStyledEmptyInlinesWithWS-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/hide-atomic-inlines-after-ellipsis-expected.png b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/hide-atomic-inlines-after-ellipsis-expected.png
new file mode 100644
index 0000000..ca5c74a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/fast/text/hide-atomic-inlines-after-ellipsis-expected.png
Binary files differ
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-in-positioned-container-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-in-positioned-container-expected.txt
new file mode 100644
index 0000000..62ab364
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-in-positioned-container-expected.txt
@@ -0,0 +1,16 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x36
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x36
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x20
+      LayoutText {#text} at (0,0) size 551x19
+        text run at (0,0) width 551: "Tests that we paint area outline properly when the image is inside positioned containers."
+layer at (20,50) size 0x0
+  LayoutNGBlockFlow (positioned) {DIV} at (20,50) size 0x0
+layer at (30,60) size 50x55
+  LayoutNGBlockFlow (positioned) {DIV} at (10,10) size 50x55
+    LayoutImage {IMG} at (0,0) size 50x50
+    LayoutText {#text} at (0,0) size 0x0
+    LayoutInline {MAP} at (0,0) size 0x19
+      LayoutInline {AREA} at (0,0) size 0x19
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-with-paint-root-offset-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-with-paint-root-offset-expected.txt
new file mode 100644
index 0000000..6043cfc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/images/imagemap-focus-ring-with-paint-root-offset-expected.txt
@@ -0,0 +1,14 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x36
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x36
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x20
+      LayoutText {#text} at (0,0) size 437x19
+        text run at (0,0) width 437: "Tests that we paint area outline properly when the paintroot is shifted."
+layer at (5,50) size 50x55
+  LayoutNGBlockFlow (positioned) {DIV} at (5,50) size 50x55
+    LayoutImage {IMG} at (0,0) size 50x50
+    LayoutText {#text} at (0,0) size 0x0
+    LayoutInline {MAP} at (0,0) size 0x19
+      LayoutInline {AREA} at (0,0) size 0x19
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.txt
index 7c7690ac..45ab021 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-ltr-flow-with-markers-expected.txt
@@ -5,97 +5,85 @@
     LayoutNGBlockFlow {BODY} at (8,8) size 784x240
 layer at (8,8) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,0) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,28) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,20) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,48) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,40) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,68) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,60) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,88) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,80) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,108) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,100) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,128) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,120) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,148) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,140) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,168) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,160) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,188) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,180) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,208) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,200) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
 layer at (8,228) size 100x20 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,220) size 100x20
-    LayoutText {#text} at (0,0) size 134x19
+    LayoutText {#text} at (0,0) size 95x19
       text run at (0,0) width 35: "Hello"
       text run at (35,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (67,0) width 12: "H"
-      text run at (102,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (79,0) width 16: "\x{2026}"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.txt
index 210c26e..3e1cec54 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.txt
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/paint/markers/ellipsis-mixed-text-in-rtl-flow-with-markers-expected.txt
@@ -5,96 +5,84 @@
     LayoutNGBlockFlow {BODY} at (8,8) size 784x240
 layer at (8,8) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,0) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,28) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,20) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,48) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,40) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,68) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,60) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,88) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,80) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,108) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,100) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,128) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,120) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,148) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,140) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,168) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,160) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,188) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,180) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,208) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,200) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
       text run at (1,0) width 16: "\x{2026}"
 layer at (8,228) size 100x20 scrollX 34.00 scrollWidth 134
   LayoutNGBlockFlow {DIV} at (0,220) size 100x20
-    LayoutText {#text} at (-34,0) size 134x19
-      text run at (-34,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
+    LayoutText {#text} at (17,0) size 99x19
       text run at (17,0) width 16: "llo"
       text run at (33,0) width 32: "\x{5E9}\x{5DC}\x{5D5}\x{5DD}"
       text run at (65,0) width 35: "Hello"
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.txt
new file mode 100644
index 0000000..62ab364
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-in-positioned-container-expected.txt
@@ -0,0 +1,16 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x36
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x36
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x20
+      LayoutText {#text} at (0,0) size 551x19
+        text run at (0,0) width 551: "Tests that we paint area outline properly when the image is inside positioned containers."
+layer at (20,50) size 0x0
+  LayoutNGBlockFlow (positioned) {DIV} at (20,50) size 0x0
+layer at (30,60) size 50x55
+  LayoutNGBlockFlow (positioned) {DIV} at (10,10) size 50x55
+    LayoutImage {IMG} at (0,0) size 50x50
+    LayoutText {#text} at (0,0) size 0x0
+    LayoutInline {MAP} at (0,0) size 0x19
+      LayoutInline {AREA} at (0,0) size 0x19
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.txt b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.txt
new file mode 100644
index 0000000..6043cfc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/flag-specific/enable-blink-features=LayoutNG/virtual/gpu-rasterization/images/imagemap-focus-ring-with-paint-root-offset-expected.txt
@@ -0,0 +1,14 @@
+layer at (0,0) size 800x600
+  LayoutView at (0,0) size 800x600
+layer at (0,0) size 800x36
+  LayoutNGBlockFlow {HTML} at (0,0) size 800x36
+    LayoutNGBlockFlow {BODY} at (8,8) size 784x20
+      LayoutText {#text} at (0,0) size 437x19
+        text run at (0,0) width 437: "Tests that we paint area outline properly when the paintroot is shifted."
+layer at (5,50) size 50x55
+  LayoutNGBlockFlow (positioned) {DIV} at (5,50) size 50x55
+    LayoutImage {IMG} at (0,0) size 50x50
+    LayoutText {#text} at (0,0) size 0x0
+    LayoutInline {MAP} at (0,0) size 0x19
+      LayoutInline {AREA} at (0,0) size 0x19
+    LayoutText {#text} at (0,0) size 0x0
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html
index b079667..e35cef1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-basics.html
@@ -4,7 +4,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
index 51251ad..96ef490 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-from-nested-frame.html
@@ -4,8 +4,8 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-origins.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-origins.html
index 9f617ea4..9cbccb6 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-origins.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-origins.html
@@ -4,7 +4,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script>
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html
index f615b77..366442a 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-create-with-virtual-authenticator.html
@@ -4,8 +4,8 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html
index 0ab29126..104d7b9 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-basics.html
@@ -4,7 +4,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-errors.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-errors.html
index 40d165b..dae4d01 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-errors.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-errors.html
@@ -3,7 +3,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
index acde25f3..a355fdfe 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-from-nested-frame.html
@@ -4,8 +4,8 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-origins.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-origins.html
index 8bd81ea..f0bcc6c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-origins.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-origins.html
@@ -4,7 +4,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html
index 58cec0d1..109690b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-get-with-virtual-authenticator.html
@@ -4,8 +4,8 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html
index adf7bec..3baccabe 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-preventsilentaccess-basics.html
@@ -4,7 +4,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-store-basics.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-store-basics.html
index 959e54c..dfd0da1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-store-basics.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/credentialscontainer-store-basics.html
@@ -4,7 +4,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/mock-authenticator.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/mock-authenticator.html
index cdbea746..cf30545 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/mock-authenticator.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/mock-authenticator.html
@@ -3,7 +3,7 @@
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html
index 845af717..6224469 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/register-then-sign.html
@@ -3,7 +3,7 @@
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="resources/test-inputs.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-create-helper.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-create-helper.html
index 7ff6f2bc..5e2ca6d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-create-helper.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-create-helper.html
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="test-inputs.js"></script>
 <script src="mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-get-helper.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-get-helper.html
index 36ccc0f7..3a694509 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-get-helper.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/resources/publickey-get-helper.html
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
 <script src="/gen/third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/authenticator.mojom.js"></script>
 <script src="test-inputs.js"></script>
 <script src="mock-navigator-credentials.js"></script>
 <script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html
index 853a250..90994b7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/tools/virtual-authenticator-environment-manual.html
@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <title>Credential Manager: helper page for manual testing using the Testing API.</title>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="../resources/virtual-navigator-credentials.js"></script>
 <script>
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html
index dbe13fb..2198b627 100644
--- a/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html
+++ b/third_party/WebKit/LayoutTests/http/tests/credentialmanager/virtual-navigator-credentials.html
@@ -3,7 +3,7 @@
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
 <script src="/gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
-<script src="/gen/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom.js"></script>
+<script src="/gen/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom.js"></script>
 <script src="resources/virtual-navigator-credentials.js"></script>
 <script>
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/compiler-script-mapping.js b/third_party/WebKit/LayoutTests/http/tests/devtools/compiler-script-mapping.js
index 5b7552a..7d149013 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/compiler-script-mapping.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/compiler-script-mapping.js
@@ -60,11 +60,11 @@
         SourcesTestRunner.checkUILocation(originalUISourceCode, 1, 200, uiLocation(script, 1, 200));
 
         SourcesTestRunner.checkRawLocation(
-            script, 0, 48, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode1, 3, 10));
+            script, 0, 48, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode1, 3, 10)[0]);
         SourcesTestRunner.checkRawLocation(
-            script, 1, 85, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode2, 1, 0));
+            script, 1, 85, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode2, 1, 0)[0]);
         SourcesTestRunner.checkRawLocation(
-            script, 1, 140, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode2, 5, 2));
+            script, 1, 140, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode2, 5, 2)[0]);
 
         TestRunner.addResult('Location checks passed. Requesting content');
         uiSourceCode1.requestContent().then(didRequestContent1);
@@ -116,7 +116,7 @@
         TestRunner.addResult('source3.js UISourceCode arrived');
         SourcesTestRunner.checkUILocation(uiSourceCode, 2, 4, uiLocation(script, 0, 18));
         SourcesTestRunner.checkRawLocation(
-            script, 0, 18, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, 2, 4));
+            script, 0, 18, Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, 2, 4)[0]);
 
         TestRunner.addResult('Location checks passed. Requesting content');
         uiSourceCode.requestContent().then(didRequestContent);
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/copy-network-request-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/copy-network-request-expected.txt
index bc2671fa..9ba1929 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/copy-network-request-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/copy-network-request-expected.txt
@@ -3,31 +3,31 @@
 cURL Windows: curl "http://example.org/path" --compressed
 cURL Unix: curl 'http://example.org/path' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path"
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"method":"GET","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","method":"GET","mode":"cors"});
 cURL Windows: curl "http://example.org/path" --data-binary "123" --compressed
 cURL Unix: curl 'http://example.org/path' --data-binary '123' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -Body "123"
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"123","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","body":"123","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/x-www-form-urlencoded" --data "1^&b" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/x-www-form-urlencoded' --data '1&b' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/x-www-form-urlencoded" -Body "1&b"
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"1&b","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/x-www-form-urlencoded"},"body":"1&b","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/json" --data-binary "^{^\^"a^\^":1^}" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/json' --data-binary '{"a":1}' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/json" -Body "{`"a`":1}"
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"{\"a\":1}","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/json"},"body":"{\"a\":1}","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/binary" --data-binary ^"1234^
 
 00^^^^'^\^"^!^" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/binary' --data-binary $'1234\r\n00\x02\x03\x04\x05\'"!' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/binary" -Body ([System.Text.Encoding]::UTF8.GetBytes("1234$([char]13)$([char]10)00$([char]2)$([char]3)$([char]4)$([char]5)'`"!"))
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"1234\r\n00\u0002\u0003\u0004\u0005'\"!","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/binary"},"body":"1234\r\n00\u0002\u0003\u0004\u0005'\"!","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/binary" --data-binary ^"1234^
 
 ^00^^^^'^\^"^!^" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/binary' --data-binary $'1234\r\n\x0100\x02\x03\x04\x05\'"!' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/binary" -Body ([System.Text.Encoding]::UTF8.GetBytes("1234$([char]13)$([char]10)$([char]1)00$([char]2)$([char]3)$([char]4)$([char]5)'`"!"))
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"1234\r\n\u000100\u0002\u0003\u0004\u0005'\"!","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/binary"},"body":"1234\r\n\u000100\u0002\u0003\u0004\u0005'\"!","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/binary" --data-binary ^"^%^OS^%^
 
 ^%^%^OS^%^%^
@@ -35,7 +35,7 @@
 ^\^"^\^\^\^"'^$^&^!^" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/binary' --data-binary $'%OS%\r\n%%OS%%\r\n"\\"\'$&!' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/binary" -Body ([System.Text.Encoding]::UTF8.GetBytes("%OS%$([char]13)$([char]10)%%OS%%$([char]13)$([char]10)`"\`"'`$&!"))
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"%OS%\r\n%%OS%%\r\n\"\\\"'$&!","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/binary"},"body":"%OS%\r\n%%OS%%\r\n\"\\\"'$&!","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/binary" --data-binary ^"^!^@^#^$^%^^^&*()_+~`1234567890-=^[^]^{^};':^\^",./^
 
 ^<^>?^
@@ -49,25 +49,25 @@
 yuiopasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM^" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/binary' --data-binary $'!@#$%^&*()_+~`1234567890-=[]{};\':",./\r<>?\r\nqwer\nt\n\nyuiopasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/binary" -Body ([System.Text.Encoding]::UTF8.GetBytes("!@#`$%^&*()_+~``1234567890-=[]{};':`",./$([char]13)<>?$([char]13)$([char]10)qwer$([char]10)t$([char]10)$([char]10)yuiopasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM"))
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"!@#$%^&*()_+~`1234567890-=[]{};':\",./\r<>?\r\nqwer\nt\n\nyuiopasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/binary"},"body":"!@#$%^&*()_+~`1234567890-=[]{};':\",./\r<>?\r\nqwer\nt\n\nyuiopasdfghjklmnbvcxzQWERTYUIOPLKJHGFDSAZXCVBNM","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/binary" --data-binary "^^€^^ÿ	^܀" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/binary' --data-binary $'\x7f\x80\x90\xff\x09\u0700' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/binary" -Body ([System.Text.Encoding]::UTF8.GetBytes("$([char]127)$([char]128)$([char]144)$([char]255)$([char]9)$([char]1792)"))
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"€ÿ\t܀","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/binary"},"body":"€ÿ\t܀","method":"POST","mode":"cors"});
 cURL Windows: curl "http://labs.ft.com/?querystring=^\[^\]^\{^\}" --compressed
 cURL Unix: curl 'http://labs.ft.com/?querystring=\[\]\{\}' --compressed
 Powershell: Invoke-WebRequest -Uri "http://labs.ft.com/?querystring=[]{}"
-fetch: fetch("http://labs.ft.com/?querystring=[]{}", {"credentials":"omit","headers":{},"body":null,"method":"GET","mode":"cors"});
+fetch: fetch("http://labs.ft.com/?querystring=[]{}", {"credentials":"omit","body":null,"method":"GET","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Content-Type: application/binary" --data-binary "^%^PATH^%^$PATH" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Content-Type: application/binary' --data-binary '%PATH%$PATH' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Method "POST" -ContentType "application/binary" -Body "%PATH%`$PATH"
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"body":"%PATH%$PATH","method":"POST","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{"content-type":"application/binary"},"body":"%PATH%$PATH","method":"POST","mode":"cors"});
 cURL Windows: curl "http://example.org/path" --compressed
 cURL Unix: curl 'http://example.org/path' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Headers @{"version"="v"}
-fetch: fetch("http://example.org/path", {"credentials":"omit","headers":{},"method":"GET","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"omit","method":"GET","mode":"cors"});
 cURL Windows: curl "http://example.org/path" -H "Cookie: _x=fdsfs; aA=fdsfdsf; FOO=ID=BAR:BAZ=FOO:F=d:AO=21.212.2.212-:A=dsadas8d9as8d9a8sd9sa8d9a; AAA=117" --compressed
 cURL Unix: curl 'http://example.org/path' -H 'Cookie: _x=fdsfs; aA=fdsfdsf; FOO=ID=BAR:BAZ=FOO:F=d:AO=21.212.2.212-:A=dsadas8d9as8d9a8sd9sa8d9a; AAA=117' --compressed
 Powershell: Invoke-WebRequest -Uri "http://example.org/path" -Headers @{"Cookie"="_x=fdsfs; aA=fdsfdsf; FOO=ID=BAR:BAZ=FOO:F=d:AO=21.212.2.212-:A=dsadas8d9as8d9a8sd9sa8d9a; AAA=117"}
-fetch: fetch("http://example.org/path", {"credentials":"include","headers":{},"method":"GET","mode":"cors"});
+fetch: fetch("http://example.org/path", {"credentials":"include","method":"GET","mode":"cors"});
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map-expected.txt
new file mode 100644
index 0000000..edb7ee44
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map-expected.txt
@@ -0,0 +1,7 @@
+Tests that breakpoints work when one target has source map and another does not.
+
+Script execution paused.
+Call stack:
+    0) onmessage (worker-with-sourcemap.ts:3)
+Script execution resumed.
+
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js
new file mode 100644
index 0000000..20f19a63
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/breakpoint-one-target-with-source-map.js
@@ -0,0 +1,32 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function() {
+  TestRunner.addResult(`Tests that breakpoints work when one target has source map and another does not.\n`);
+  await TestRunner.loadModule('sources_test_runner');
+  await TestRunner.showPanel('sources');
+
+  await addWorker(TestRunner.url('resources/worker-with-sourcemap.js'));
+  await addWorker(TestRunner.url('resources/worker-with-sourcemap.js'));
+
+  await SourcesTestRunner.startDebuggerTestPromise();
+
+  const sourceFrame = await SourcesTestRunner.showScriptSourcePromise('worker-with-sourcemap.ts');
+  SourcesTestRunner.createNewBreakpoint(sourceFrame, 2, '', true);
+  await SourcesTestRunner.waitDebuggerPluginBreakpoints(sourceFrame);
+
+  TestRunner.evaluateInPageAnonymously('window.workers[1].postMessage("")');
+  let callFrames = await SourcesTestRunner.waitUntilPausedPromise();
+  SourcesTestRunner.captureStackTrace(callFrames);
+  SourcesTestRunner.completeDebuggerTest();
+
+  function addWorker(url) {
+    return TestRunner.evaluateInPageAsync(`
+      (function(){
+        window.workers = window.workers || [];
+        window.workers.push(new Worker('${url}'));
+      })();
+    `);
+  }
+})();
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/resources/worker-with-sourcemap.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/resources/worker-with-sourcemap.js
new file mode 100644
index 0000000..64fe116
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger-breakpoints/resources/worker-with-sourcemap.js
@@ -0,0 +1,7 @@
+onmessage = function (data) {
+    var a = 1;
+    var b = 2;
+    return a + b;
+};
+postMessage('ready');
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXdpdGgtc291cmNlbWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid29ya2VyLXdpdGgtc291cmNlbWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsR0FBRyxVQUFBLElBQUk7SUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixDQUFDLENBQUM7QUFDRixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJvbm1lc3NhZ2UgPSBkYXRhID0+IHtcbiAgdmFyIGEgPSAxO1xuICB2YXIgYiA9IDI7XG4gIHJldHVybiBhICsgYjtcbn07XG5wb3N0TWVzc2FnZSgncmVhZHknKTsiXX0=
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/resource-script-mapping.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/resource-script-mapping.js
index 1bf24e2..5d9511b1 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/resource-script-mapping.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/resource-script-mapping.js
@@ -48,7 +48,7 @@
       var rawLocation = TestRunner.debuggerModel.createRawLocation(script, line, column);
       var uiLocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(rawLocation);
       SourcesTestRunner.checkUILocation(uiSourceCode, line, column, uiLocation);
-      var reverseLocation = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, line, column);
+      var reverseLocation = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, line, column)[0];
       SourcesTestRunner.checkRawLocation(script, line, column, reverseLocation);
     }
     TestRunner.completeTest();
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse-expected.txt b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse-expected.txt
index 92bdceb..b8091a21 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse-expected.txt
@@ -1,4 +1,4 @@
-Tests that FailedToParseScriptSource event is raised after compile script with syntax error.
+Tests that ParsedScriptSource event is raised after compile script with syntax error.
 
 
 Running: testScriptParsedEvent
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse.js
index 1215a23..63754be 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/debugger/script-failed-to-parse.js
@@ -4,7 +4,7 @@
 
 (async function() {
   TestRunner.addResult(
-      `Tests that FailedToParseScriptSource event is raised after compile script with syntax error.\n`);
+      `Tests that ParsedScriptSource event is raised after compile script with syntax error.\n`);
   await TestRunner.loadModule('sources_test_runner');
   await TestRunner.showPanel('sources');
   await TestRunner.evaluateInPagePromise(`
@@ -20,7 +20,7 @@
   SourcesTestRunner.runDebuggerTestSuite([
     function testScriptParsedEvent(next) {
       TestRunner.debuggerModel.addEventListener(
-          SDK.DebuggerModel.Events.FailedToParseScriptSource, scriptFailedToParse);
+          SDK.DebuggerModel.Events.ParsedScriptSource, scriptFailedToParse);
       TestRunner.evaluateInPage('addScript(\'resources/script-failed-to-parse.js\')');
 
       function scriptFailedToParse(event) {
@@ -28,7 +28,7 @@
         if (script.sourceURL.indexOf('script-failed-to-parse.js') !== -1) {
           TestRunner.addResult('Event with script-failed-to-parse.js received');
           TestRunner.debuggerModel.removeEventListener(
-              SDK.DebuggerModel.Events.FailedToParseScriptSource, scriptFailedToParse);
+              SDK.DebuggerModel.Events.ParsedScriptSource, scriptFailedToParse);
           next();
         }
       }
diff --git a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/formatter-js.js b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/formatter-js.js
index c717042..01943cf 100644
--- a/third_party/WebKit/LayoutTests/http/tests/devtools/sources/formatter-js.js
+++ b/third_party/WebKit/LayoutTests/http/tests/devtools/sources/formatter-js.js
@@ -19,7 +19,7 @@
   var positions = [];
   for (var offset = originalContent.indexOf('{'); offset >= 0; offset = originalContent.indexOf('{', offset + 1))
     positions.push(text.positionFromOffset(offset));
-  var script = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, 0, 0).script();
+  var script = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, 0, 0)[0].script();
 
   TestRunner.addResult('Location mapping with formatted source:');
   dumpLocations(positions);
@@ -35,8 +35,8 @@
     for (var position of positions) {
       var rawLocation = TestRunner.debuggerModel.createRawLocation(script, position.lineNumber, position.columnNumber);
       var uiLocation = Bindings.debuggerWorkspaceBinding.rawLocationToUILocation(rawLocation);
-      var reverseRawLocation = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(
-          uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
+      var reverseRawLocation = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(
+          uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber)[0];
       TestRunner.addResult(
           `${rawLocation.lineNumber}:${rawLocation.columnNumber} -> ${uiLocation.lineNumber}:${
               uiLocation.columnNumber}` +
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js
index ee03a8b4..646b4138 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/multiple-headers.js
@@ -9,7 +9,7 @@
 
   session.evaluate(`fetch("${url}?fetch=1")`);
   const fetchResponse = (await dp.Network.onceResponseReceived()).params.response;
-  testRunner.log(`Pragma header of fetch of ${fetchResponse.url}: ${fetchResponse.headers['Pragma']}`);
+  testRunner.log(`Pragma header of fetch of ${fetchResponse.url}: ${fetchResponse.headers['Access-Control-Pragma']}`);
   await dp.Network.onceLoadingFinished();
 
   session.evaluate(`
@@ -18,6 +18,6 @@
     document.body.appendChild(f);
   `);
   const navigationResponse = (await dp.Network.onceResponseReceived()).params.response;
-  testRunner.log(`Pragma header of navigation to ${navigationResponse.url}: ${navigationResponse.headers['Pragma']}`);
+  testRunner.log(`Pragma header of navigation to ${navigationResponse.url}: ${navigationResponse.headers['Access-Control-Pragma']}`);
   testRunner.completeTest();
 })
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/resources/multiple-headers.php b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/resources/multiple-headers.php
index 252012c..e090929d 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/resources/multiple-headers.php
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/resources/multiple-headers.php
@@ -1,8 +1,8 @@
 <?php
     // We need live headers, so make sure it's not cached.
     header('Cache-Control: no-cache, no-store, must-revalidate, max-age=0');
-    header('Pragma: value1');
-    header('Pragma: value2', false /* = $replace */);
+    header('Access-Control-Pragma: value1');
+    header('Access-Control-Pragma: value2', false /* = $replace */);
 ?>
 <html>
 <body>
diff --git a/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/mediasource-changetype-origin-trial-interfaces.html b/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/mediasource-changetype-origin-trial-interfaces.html
new file mode 100644
index 0000000..362cea0
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/origin_trials/webexposed/mediasource-changetype-origin-trial-interfaces.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<!-- Generate token with the command:
+tools/origin_trials/generate_token.py http://127.0.0.1:8000 MediaSourceChangeType --expire-timestamp=2000000000
+
+To test whether the token is working, run the suite virtual/origin-trials-runtimeflags-disabled/http/tests/origin_trials.
+-->
+<title>MediaSourceChangeType - interfaces exposed by origin trial</title>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../../resources/origin-trials-helper.js"></script>
+<script>
+
+let token = "AtRt0SH3CPMu71uc+KvPkp74coHka5l2c5KbiC1pzdUW0g7Fbkjfd/pjQIJtOrHnbRJz9331CP1xHwneskoHnw4AAABdeyJvcmlnaW4iOiAiaHR0cDovLzEyNy4wLjAuMTo4MDAwIiwgImZlYXR1cmUiOiAiTWVkaWFTb3VyY2VDaGFuZ2VUeXBlIiwgImV4cGlyeSI6IDIwMDAwMDAwMDB9";
+
+let properties_to_check = {'SourceBuffer': ['changeType']};
+
+// Skip this test if flags are not set properly.
+if(!self.internals.runtimeFlags.mediaSourceChangeTypeEnabled) {
+  test(t => {
+    OriginTrialsHelper.check_properties_missing(this, properties_to_check);
+  }, "MSE changeType method is not available without a token.");
+}
+
+OriginTrialsHelper.add_token(token);
+
+test(t => {
+  OriginTrialsHelper.check_properties(this, properties_to_check);
+}, "MSE changeType method is available.");
+</script>
diff --git a/third_party/WebKit/LayoutTests/performance/performance-observer-crash-expected.txt b/third_party/WebKit/LayoutTests/performance/performance-observer-crash-expected.txt
deleted file mode 100644
index 8b13789..0000000
--- a/third_party/WebKit/LayoutTests/performance/performance-observer-crash-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/third_party/WebKit/LayoutTests/performance/performance-observer-crash.html b/third_party/WebKit/LayoutTests/performance/performance-observer-crash.html
deleted file mode 100644
index d9387120..0000000
--- a/third_party/WebKit/LayoutTests/performance/performance-observer-crash.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<html>
-  <head>
-    <title>Crash page</title>
-    <script>
-      var observer = new PerformanceObserver(() => {});
-      function disconnectObserver() {
-        observer.disconnect();
-        testRunner.notifyDone();
-      }
-      function beginFetch() {
-        fetch('http://localhost/not-exists.jpg').catch(disconnectObserver);
-      }
-      function navigate() {
-        window.addEventListener("unload", beginFetch);
-        location.assign("about:blank");
-      };
-      testRunner.dumpAsText();
-      testRunner.setCustomTextOutput("");
-      testRunner.waitUntilDone();
-    </script>
-  </head>
-  <body onload="navigate()">
-    <p>This page will try to crash the renderer</p>
-  </body>
-</html>
diff --git a/third_party/WebKit/LayoutTests/resources/js-test.js b/third_party/WebKit/LayoutTests/resources/js-test.js
index c3e77a3..1d0483c 100644
--- a/third_party/WebKit/LayoutTests/resources/js-test.js
+++ b/third_party/WebKit/LayoutTests/resources/js-test.js
@@ -67,7 +67,7 @@
         if (self._lazyTestResults) {
             self._lazyTestResults.push(msg);
         } else {
-            var span = document.createElement("span");
+            var span = document.createElement("div");
             // insert it first so XHTML knows the namespace;
             getOrCreateTestElement("console", "div").appendChild(span);
             span.innerHTML = msg + '<br />';
diff --git a/third_party/WebKit/LayoutTests/shadow-dom/imperative-api.html b/third_party/WebKit/LayoutTests/shadow-dom/imperative-api.html
new file mode 100644
index 0000000..5633352
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/shadow-dom/imperative-api.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<!--
+Tests for Imperative Shadow DOM Distribution API.
+See https://crbug.com/869308
+-->
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<div id="host">
+  <div id="child1"></div>
+</div>
+
+<script>
+const host = document.querySelector('#host');
+const child1 = document.querySelector('#child1');
+const shadow_root = host.attachShadow({ mode: 'open', slotting: 'manual' });
+const slot1 = document.createElement('slot');
+shadow_root.appendChild(slot1);
+
+test(() => {
+  assert_equals(child1.assignedSlot, null);
+  assert_array_equals(slot1.assignedElements(), []);
+
+  slot1.assign([child1]);
+
+  assert_equals(child1.assignedSlot, slot1);
+  assert_array_equals(slot1.assignedElements(), [child1]);
+}, 'slot.assign(nodes) should work');
+</script>
diff --git a/third_party/WebKit/LayoutTests/virtual/origin-policy/external/wpt/origin-policy/README.txt b/third_party/WebKit/LayoutTests/virtual/origin-policy/external/wpt/origin-policy/README.txt
new file mode 100644
index 0000000..309d6722
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/origin-policy/external/wpt/origin-policy/README.txt
@@ -0,0 +1,3 @@
+# This suite runs the tests in external/wpt/origin-policy with
+# --enable-blink-features=OriginPolicy.
+# Origin Policy is being standardized here: https://github.com/WICG/origin-policy
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
similarity index 61%
rename from third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
rename to third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
index 7392266d..3cf6933e 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors-ns/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 FAIL Service worker controlled navigation timing assert_unreached: unexpected rejection: assert_true: Expected workerStart <= fetchStart expected true got false Reached unreachable code
-FAIL Service worker controlled navigation timing network fallback assert_unreached: unexpected rejection: assert_true: Expected workerStart <= fetchStart expected true got false Reached unreachable code
+PASS Service worker controlled navigation timing network fallback
 PASS Service worker controlled navigation timing redirect
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt b/third_party/WebKit/LayoutTests/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
similarity index 61%
copy from third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
copy to third_party/WebKit/LayoutTests/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
index 7392266d..3cf6933e 100644
--- a/third_party/WebKit/LayoutTests/flag-specific/enable-features=NetworkService/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/outofblink-cors/external/wpt/service-workers/service-worker/navigation-timing.https-expected.txt
@@ -1,6 +1,6 @@
 This is a testharness.js-based test.
 FAIL Service worker controlled navigation timing assert_unreached: unexpected rejection: assert_true: Expected workerStart <= fetchStart expected true got false Reached unreachable code
-FAIL Service worker controlled navigation timing network fallback assert_unreached: unexpected rejection: assert_true: Expected workerStart <= fetchStart expected true got false Reached unreachable code
+PASS Service worker controlled navigation timing network fallback
 PASS Service worker controlled navigation timing redirect
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt
index babbdc5..cda6ce89 100644
--- a/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/webrtc-wpt-unified-plan/external/wpt/webrtc/RTCRtpParameters-transactionId-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
 PASS sender.getParameters() should return different transaction IDs for each call
 PASS sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError
-FAIL sender.setParameters() with transaction ID unset should reject with InvalidModificationError assert_throws: function "function() { throw e }" threw object "TypeError: Failed to execute 'setParameters' on 'RTCRtpSender': required member transactionId is undefined." that is not a DOMException InvalidModificationError: property "code" is equal to undefined, expected 13
+PASS sender.setParameters() with transaction ID unset should reject with TypeError
 PASS setParameters() twice with the same parameters should reject with InvalidStateError
 PASS setParameters() with parameters older than last getParameters() should reject with InvalidModificationError
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 99a7720..c763cbe0 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -1635,6 +1635,7 @@
     method createDocumentFragment
     method createElement
     method createElementNS
+    method createEmptyCSSStyleSheet
     method createEvent
     method createExpression
     method createNSResolver
@@ -4665,6 +4666,7 @@
     getter xr
     method constructor
     method getBattery
+    method getDisplayMedia
     method getGamepads
     method getInstalledRelatedApps
     method getUserMedia
diff --git a/third_party/blink/common/message_port/cloneable_message_struct_traits.cc b/third_party/blink/common/message_port/cloneable_message_struct_traits.cc
index 4cc6f31a..0d62abc 100644
--- a/third_party/blink/common/message_port/cloneable_message_struct_traits.cc
+++ b/third_party/blink/common/message_port/cloneable_message_struct_traits.cc
@@ -20,7 +20,9 @@
     Read(blink::mojom::CloneableMessage::DataView data,
          blink::CloneableMessage* out) {
   mojo_base::BigBufferView message_view;
-  if (!data.ReadEncodedMessage(&message_view) || !data.ReadBlobs(&out->blobs)) {
+  base::Optional<base::UnguessableToken> locked_agent_cluster_id;
+  if (!data.ReadEncodedMessage(&message_view) || !data.ReadBlobs(&out->blobs) ||
+      !data.ReadLockedAgentClusterId(&locked_agent_cluster_id)) {
     return false;
   }
 
@@ -30,6 +32,7 @@
   out->stack_trace_id = data.stack_trace_id();
   out->stack_trace_debugger_id_first = data.stack_trace_debugger_id_first();
   out->stack_trace_debugger_id_second = data.stack_trace_debugger_id_second();
+  out->locked_agent_cluster_id = locked_agent_cluster_id;
   return true;
 }
 
diff --git a/third_party/blink/common/message_port/cloneable_message_struct_traits.h b/third_party/blink/common/message_port/cloneable_message_struct_traits.h
index 483224f..27860b8 100644
--- a/third_party/blink/common/message_port/cloneable_message_struct_traits.h
+++ b/third_party/blink/common/message_port/cloneable_message_struct_traits.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_COMMON_MESSAGE_PORT_CLONEABLE_MESSAGE_STRUCT_TRAITS_H_
 
 #include "mojo/public/cpp/base/big_buffer.h"
+#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
 #include "third_party/blink/public/common/message_port/cloneable_message.h"
 #include "third_party/blink/public/mojom/message_port/message_port.mojom.h"
 
@@ -23,19 +24,25 @@
     return input.blobs;
   }
 
-  static uint64_t stack_trace_id(blink::CloneableMessage& input) {
+  static uint64_t stack_trace_id(const blink::CloneableMessage& input) {
     return input.stack_trace_id;
   }
 
-  static int64_t stack_trace_debugger_id_first(blink::CloneableMessage& input) {
+  static int64_t stack_trace_debugger_id_first(
+      const blink::CloneableMessage& input) {
     return input.stack_trace_debugger_id_first;
   }
 
   static int64_t stack_trace_debugger_id_second(
-      blink::CloneableMessage& input) {
+      const blink::CloneableMessage& input) {
     return input.stack_trace_debugger_id_second;
   }
 
+  static const base::Optional<base::UnguessableToken>& locked_agent_cluster_id(
+      const blink::CloneableMessage& input) {
+    return input.locked_agent_cluster_id;
+  }
+
   static bool Read(blink::mojom::CloneableMessage::DataView data,
                    blink::CloneableMessage* out);
 };
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index acc2c1a..e289b32 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -715,7 +715,7 @@
     "platform/modules/payments/payment_app.mojom",
     "platform/modules/permissions/permission.mojom",
     "platform/modules/permissions/permission_status.mojom",
-    "platform/modules/webauth/virtual_authenticator.mojom",
+    "platform/modules/webauthn/virtual_authenticator.mojom",
     "platform/modules/webdatabase/web_database.mojom",
     "platform/oom_intervention.mojom",
     "platform/referrer.mojom",
@@ -779,7 +779,7 @@
     "platform/modules/installedapp/related_application.mojom",
     "platform/modules/mediasession/media_session.mojom",
     "platform/modules/payments/payment_request.mojom",
-    "platform/modules/webauth/authenticator.mojom",
+    "platform/modules/webauthn/authenticator.mojom",
     "platform/modules/webshare/webshare.mojom",
     "web/remote_objects.mojom",
   ]
diff --git a/third_party/blink/public/common/message_port/cloneable_message.h b/third_party/blink/public/common/message_port/cloneable_message.h
index f7d981ae..8f6d3fc 100644
--- a/third_party/blink/public/common/message_port/cloneable_message.h
+++ b/third_party/blink/public/common/message_port/cloneable_message.h
@@ -9,6 +9,8 @@
 
 #include "base/containers/span.h"
 #include "base/macros.h"
+#include "base/optional.h"
+#include "base/unguessable_token.h"
 #include "mojo/public/cpp/bindings/struct_ptr.h"
 #include "third_party/blink/common/common_export.h"
 #include "third_party/blink/public/mojom/blob/serialized_blob.mojom.h"
@@ -47,6 +49,11 @@
   int64_t stack_trace_debugger_id_first = 0;
   int64_t stack_trace_debugger_id_second = 0;
 
+  // If not null, this message is locked to the given agent cluster ID.
+  // See
+  // https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism
+  base::Optional<base::UnguessableToken> locked_agent_cluster_id;
+
  private:
   DISALLOW_COPY_AND_ASSIGN(CloneableMessage);
 };
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn
index bb6945f..d66f88f8 100644
--- a/third_party/blink/public/mojom/BUILD.gn
+++ b/third_party/blink/public/mojom/BUILD.gn
@@ -45,6 +45,7 @@
     "service_worker/service_worker_client.mojom",
     "service_worker/service_worker_error_type.mojom",
     "service_worker/service_worker_event_status.mojom",
+    "service_worker/service_worker_fetch_response_callback.mojom",
     "service_worker/service_worker_installed_scripts_manager.mojom",
     "service_worker/service_worker_provider_type.mojom",
     "service_worker/service_worker_state.mojom",
diff --git a/third_party/blink/public/mojom/fetch/fetch_api_response.mojom b/third_party/blink/public/mojom/fetch/fetch_api_response.mojom
index 7c34373..9f2482e 100644
--- a/third_party/blink/public/mojom/fetch/fetch_api_response.mojom
+++ b/third_party/blink/public/mojom/fetch/fetch_api_response.mojom
@@ -12,9 +12,8 @@
 
 // Describes a Response in terms of the concept from the Fetch spec.
 // https://fetch.spec.whatwg.org/#response-class
-// It is currently used by the Cache Storage API, and the plan is to use it also
-// in Service Worker and Background Fetch implementations to replace
-// content::ServiceWorkerResponse.
+// It is currently used by Cache Storage and Service Worker, and the plan is to
+// use it also in Background Fetch to replace content::ServiceWorkerResponse.
 // Note: Be sure to update CacheStorageCache::EstimatedResponseSizeWithoutBlob()
 // when adding or removing members.
 struct FetchAPIResponse {
@@ -25,14 +24,17 @@
   array<url.mojom.Url> url_list;
 
   // Status code as number, e.g.: 200, 404.
-  int32 status_code;
+  // Zero status code indicates an error happened and the request was not
+  // handled.
+  int32 status_code = 0;
 
   // Status code as text. e.g.: "OK", "Not Found".
   string status_text;
 
   // Corresponds to response types from the Fetch spec:
   // https://fetch.spec.whatwg.org/#concept-response-type
-  network.mojom.FetchResponseType response_type;
+  network.mojom.FetchResponseType response_type =
+    network.mojom.FetchResponseType.kOpaque;
 
   // The response headers. It's case insensitive for header name as key.
   map<string, string> headers;
@@ -40,8 +42,9 @@
   // Mojo interface to read the response payload.
   SerializedBlob? blob;
 
-  // Error codes for service worker APIs. This enum is used by
-  ServiceWorkerResponseError error;
+  // Error codes for service worker APIs.
+  ServiceWorkerResponseError error =
+    blink.mojom.ServiceWorkerResponseError.kUnknown;
 
   // The time at which the response headers were received.  For cached
   // responses, this time could be "far" in the past.
diff --git a/third_party/blink/public/mojom/message_port/message_port.mojom b/third_party/blink/public/mojom/message_port/message_port.mojom
index e727b40..fad68a35 100644
--- a/third_party/blink/public/mojom/message_port/message_port.mojom
+++ b/third_party/blink/public/mojom/message_port/message_port.mojom
@@ -5,6 +5,7 @@
 module blink.mojom;
 
 import "mojo/public/mojom/base/big_buffer.mojom";
+import "mojo/public/mojom/base/unguessable_token.mojom";
 import "third_party/blink/public/mojom/array_buffer/array_buffer_contents.mojom";
 import "third_party/blink/public/mojom/blob/serialized_blob.mojom";
 import "third_party/blink/public/mojom/message_port/user_activation_snapshot.mojom";
@@ -29,6 +30,9 @@
   uint64 stack_trace_id;
   int64 stack_trace_debugger_id_first;
   int64 stack_trace_debugger_id_second;
+  // If not null, this message is locked to the given agent cluster ID.
+  // See https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism
+  mojo_base.mojom.UnguessableToken? locked_agent_cluster_id;
 };
 
 // This struct combines the cloneable part of a message with the parts of the
diff --git a/third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom b/third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom
new file mode 100644
index 0000000..9c18474
--- /dev/null
+++ b/third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom
@@ -0,0 +1,28 @@
+// 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.
+
+module blink.mojom;
+
+import "mojo/public/mojom/base/time.mojom";
+import "third_party/blink/public/mojom/blob/blob.mojom";
+import "third_party/blink/public/mojom/fetch/fetch_api_response.mojom";
+import "third_party/blink/public/mojom/service_worker/service_worker_stream_handle.mojom";
+
+// Callback interface which is passed to a controller service worker through
+// DispatchFetchEvent (either via ServiceWorker or via ControllerServiceWorker
+// interface).
+// The receiver service worker uses this interface to respond to a fetch event.
+interface ServiceWorkerFetchResponseCallback {
+  // Responds to the request with |response|.
+  OnResponse(FetchAPIResponse response,
+             mojo_base.mojom.Time dispatch_event_time);
+  // Responds to the request with |response|. |response.blob| should be empty
+  // since the body is provided as a stream.
+  OnResponseStream(FetchAPIResponse response,
+                   ServiceWorkerStreamHandle body_as_stream,
+                   mojo_base.mojom.Time dispatch_event_time);
+  // Provides no response to the request. The callee should fall back to the
+  // network.
+  OnFallback(mojo_base.mojom.Time dispatch_event_time);
+};
diff --git a/third_party/blink/public/platform/modules/webauth/OWNERS b/third_party/blink/public/platform/modules/webauthn/OWNERS
similarity index 100%
rename from third_party/blink/public/platform/modules/webauth/OWNERS
rename to third_party/blink/public/platform/modules/webauthn/OWNERS
diff --git a/third_party/blink/public/platform/modules/webauth/authenticator.mojom b/third_party/blink/public/platform/modules/webauthn/authenticator.mojom
similarity index 100%
rename from third_party/blink/public/platform/modules/webauth/authenticator.mojom
rename to third_party/blink/public/platform/modules/webauthn/authenticator.mojom
diff --git a/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom b/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom
similarity index 95%
rename from third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom
rename to third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom
index 63f54ae..95f8458 100644
--- a/third_party/blink/public/platform/modules/webauth/virtual_authenticator.mojom
+++ b/third_party/blink/public/platform/modules/webauthn/virtual_authenticator.mojom
@@ -5,7 +5,7 @@
 module blink.test.mojom;
 
 import "url/mojom/url.mojom";
-import "third_party/blink/public/platform/modules/webauth/authenticator.mojom";
+import "third_party/blink/public/platform/modules/webauthn/authenticator.mojom";
 
 // Application protocol that the virtual authenticator should simulate.
 enum ClientToAuthenticatorProtocol {
diff --git a/third_party/blink/public/platform/platform.h b/third_party/blink/public/platform/platform.h
index 8629aea2c..be5ee36 100644
--- a/third_party/blink/public/platform/platform.h
+++ b/third_party/blink/public/platform/platform.h
@@ -141,6 +141,21 @@
   static void Initialize(Platform*, WebThread* main_thread);
   static Platform* Current();
 
+  // This is another entry point for embedders that only require single-
+  // threaded execution of Blink. This version automatically sets up Blink
+  // with a minimally viable implementation of WebThread for the main thread.
+  // The WebThread object is returned by Platform::CurrentThread(), therefore
+  // embedders do not need to override CurrentThread().
+  //
+  // When this function is used, the WebThread instance for the main thread
+  // is owned by Platform (unlike Initialize()).
+  //
+  // In the future, we would like to let Platform own the WebThread object for
+  // the main thread in all cases, as part of Blink Thread Initialization
+  // Cleanup project:
+  // https://docs.google.com/document/d/1ehd6Lp5czBzOCHWrDkL9x62gjdlrtbMtJqt_eRaauYo/edit?usp=sharing
+  static void CreateMainThreadAndInitialize(Platform*);
+
   // Used to switch the current platform only for testing.
   // You should not pass in a Platform object that is not fully instantiated.
   static void SetCurrentPlatformForTesting(Platform*);
@@ -392,9 +407,13 @@
   // for any other purpose.
   virtual std::unique_ptr<WebThread> CreateWebAudioThread();
 
-  // Returns an interface to the current thread. This is owned by the
-  // embedder.
-  virtual WebThread* CurrentThread() { return nullptr; }
+  // Returns an interface to the current thread. This is usually owned by the
+  // embedder, except when CreateMainThreadAndInitialize() is used. See comments
+  // above for details.
+  //
+  // The default implementation works only if CreateMainThreadAndInitialize() is
+  // used. Otherwise, the embedder *must* implement their own version.
+  virtual WebThread* CurrentThread();
 
   // Returns a blame context for attributing top-level work which does not
   // belong to a particular frame scope.
@@ -687,6 +706,17 @@
   virtual ~Platform();
 
   WebThread* main_thread_;
+
+ private:
+  static void InitializeCommon(Platform* platform);
+
+  // We eventually want to let Platform own the main thread WebThread, but
+  // currently the main thread is owned in a few selected cases. This variable
+  // is non-null when the main thread is owned by Platform. The pointer value
+  // is the same as main_thread_.
+  //
+  // For details, see comments around CreateMainThreadAndInitialize() above.
+  std::unique_ptr<WebThread> owned_main_thread_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/platform/web_feature.mojom b/third_party/blink/public/platform/web_feature.mojom
index cd9f0ff0..5acef1dd 100644
--- a/third_party/blink/public/platform/web_feature.mojom
+++ b/third_party/blink/public/platform/web_feature.mojom
@@ -1979,6 +1979,8 @@
   kAddDocumentLevelPassiveDefaultWheelEventListener = 2520,
   kDocumentLevelPassiveDefaultEventListenerPreventedWheel = 2521,
   kShapeDetectionAPI = 2522,
+  kV8SourceBuffer_ChangeType_Method = 2523,
+  kPPAPIWebSocket = 2524,
 
   // Add new features immediately above this line. Don't change assigned
   // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/blink/public/platform/web_rtc_configuration.h b/third_party/blink/public/platform/web_rtc_configuration.h
index b3b36f0..5d4b8da 100644
--- a/third_party/blink/public/platform/web_rtc_configuration.h
+++ b/third_party/blink/public/platform/web_rtc_configuration.h
@@ -33,35 +33,24 @@
 
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_rtc_certificate.h"
-#include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/webrtc/api/peerconnectioninterface.h"
 
 #include <memory>
 
 namespace blink {
 
-class WebString;
-
-struct WebRTCIceServer {
-  WebURL url;
-  WebString username;
-  WebString credential;
-};
-
-enum class WebRTCIceTransportPolicy { kRelay, kAll };
-
-enum class WebRTCBundlePolicy { kBalanced, kMaxCompat, kMaxBundle };
-
-enum class WebRTCRtcpMuxPolicy { kNegotiate, kRequire };
-
+// This is distinct from webrtc::SdpSemantics to add the kDefault option.
 enum class WebRTCSdpSemantics { kDefault, kPlanB, kUnifiedPlan };
 
 struct WebRTCConfiguration {
-  WebVector<WebRTCIceServer> ice_servers;
-  WebRTCIceTransportPolicy ice_transport_policy =
-      WebRTCIceTransportPolicy::kAll;
-  WebRTCBundlePolicy bundle_policy = WebRTCBundlePolicy::kBalanced;
-  WebRTCRtcpMuxPolicy rtcp_mux_policy = WebRTCRtcpMuxPolicy::kRequire;
+  std::vector<webrtc::PeerConnectionInterface::IceServer> ice_servers;
+  webrtc::PeerConnectionInterface::IceTransportsType ice_transport_policy =
+      webrtc::PeerConnectionInterface::kAll;
+  webrtc::PeerConnectionInterface::BundlePolicy bundle_policy =
+      webrtc::PeerConnectionInterface::kBundlePolicyBalanced;
+  webrtc::PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy =
+      webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire;
   WebVector<std::unique_ptr<WebRTCCertificate>> certificates;
   int ice_candidate_pool_size = 0;
   WebRTCSdpSemantics sdp_semantics = WebRTCSdpSemantics::kDefault;
diff --git a/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h b/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h
index 134f34d4..49d72e0 100644
--- a/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h
+++ b/third_party/blink/public/platform/web_rtc_peer_connection_handler_client.h
@@ -79,6 +79,7 @@
       std::vector<std::unique_ptr<WebRTCRtpTransceiver>>,
       bool is_remote_description) = 0;
   virtual void DidAddRemoteDataChannel(WebRTCDataChannelHandler*) = 0;
+  virtual void DidNoteInterestingUsage(int usage_pattern) = 0;
   virtual void ReleasePeerConnectionHandler() = 0;
   virtual void ClosePeerConnection();
 };
diff --git a/third_party/blink/public/web/blink.h b/third_party/blink/public/web/blink.h
index 501b849..322a311 100644
--- a/third_party/blink/public/web/blink.h
+++ b/third_party/blink/public/web/blink.h
@@ -47,6 +47,18 @@
                              service_manager::BinderRegistry*,
                              WebThread* main_thread);
 
+// The same as above, but this only supports simple single-threaded execution
+// environment. The main thread WebThread object is owned by Platform when this
+// version is used. This version is mainly for tests and other components
+// requiring only the simple environment.
+//
+// When this version is used, your Platform implementation needs to follow
+// a certain convention on CurrentThread(); see the comments at
+// Platform::CreateMainThreadAndInitialize().
+BLINK_EXPORT void CreateMainThreadAndInitialize(
+    Platform*,
+    service_manager::BinderRegistry*);
+
 // Get the V8 Isolate for the main thread.
 // initialize must have been called first.
 BLINK_EXPORT v8::Isolate* MainThreadIsolate();
diff --git a/third_party/blink/public/web/devtools_agent.mojom b/third_party/blink/public/web/devtools_agent.mojom
index 16f016b..6cf36591 100644
--- a/third_party/blink/public/web/devtools_agent.mojom
+++ b/third_party/blink/public/web/devtools_agent.mojom
@@ -38,8 +38,8 @@
   // e.g. requesting a pause. There is no ordering guarantee relative to
   // regular |session|.
   //
-  // If |reattach_state| is present, restores the state of the session to
-  // previously saved one (see DevToolsSessionHost). This is useful when
+  // If |reattach_session_state| is present, restores the state of the session
+  // to previously saved one (see DevToolsSessionHost). This is useful when
   // transferring a session from one agent to another while preserving the
   // state. For example, cross-process navigation in a frame creates a new
   // DevToolsAgent (in a different process), but we can preserve the state of
@@ -65,7 +65,6 @@
   AttachDevToolsSession(associated DevToolsSessionHost host,
                         associated DevToolsSession& session,
                         DevToolsSession& io_session,
-                        string? reattach_state,
                         DevToolsSessionState? reattach_session_state);
 
   // Requests an element at specific position to be inspected in every
@@ -97,16 +96,15 @@
 interface DevToolsSessionHost {
   // Dispatches protocol command response to a remote debugging client.
   // |call_id| is a command id as defined in protocol.
-  // |state| is a state for future reattach (see DevToolsAgent),
-  // may be missing if the state did not change since last time.
+  // |updates| are the session state deltas for future reattach (see
+  // DevToolsAgent), may be missing if the state did not change since
+  // last time.
   DispatchProtocolResponse(mojo_base.mojom.BigString message,
                            int32 call_id,
-                           string? state,
                            DevToolsSessionState? updates);
 
   // Dispatches protocol notification to a remote debugging client.
   DispatchProtocolNotification(mojo_base.mojom.BigString message,
-                               string? state,
                                DevToolsSessionState? updates);
 };
 
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h
index 4f82311..acfa63964 100644
--- a/third_party/blink/public/web/web_settings.h
+++ b/third_party/blink/public/web/web_settings.h
@@ -177,7 +177,7 @@
                                     UScriptCode = USCRIPT_COMMON) = 0;
   virtual void SetFixedFontFamily(const WebString&,
                                   UScriptCode = USCRIPT_COMMON) = 0;
-  virtual void SetFMPNetworkQuietTimeout(double timeout) = 0;
+  virtual void SetNetworkQuietTimeout(double timeout) = 0;
   virtual void SetForceMainWorldInitialization(bool) = 0;
   virtual void SetForcePreloadNoneForMediaElements(bool) = 0;
   virtual void SetForceZeroLayoutHeight(bool) = 0;
diff --git a/third_party/blink/public/web/web_user_media_request.h b/third_party/blink/public/web/web_user_media_request.h
index f7d6242..0196f53f 100644
--- a/third_party/blink/public/web/web_user_media_request.h
+++ b/third_party/blink/public/web/web_user_media_request.h
@@ -60,6 +60,11 @@
     kKillSwitchOn
   };
 
+  enum class MediaType {
+    kUserMedia,
+    kDisplayMedia,
+  };
+
   WebUserMediaRequest() = default;
   WebUserMediaRequest(const WebUserMediaRequest& request) { Assign(request); }
   ~WebUserMediaRequest() { Reset(); }
@@ -74,6 +79,7 @@
   bool Equals(const WebUserMediaRequest&) const;
   void Assign(const WebUserMediaRequest&);
 
+  MediaType MediaRequestType() const;
   bool Audio() const;
   bool Video() const;
   WebMediaConstraints AudioConstraints() const;
diff --git a/third_party/blink/renderer/DEPS b/third_party/blink/renderer/DEPS
index 11370c6..6f18593 100644
--- a/third_party/blink/renderer/DEPS
+++ b/third_party/blink/renderer/DEPS
@@ -22,7 +22,7 @@
     "+base/stl_util.h",
     "+base/sys_byteorder.h",
     "+base/sys_info.h",
-    "+base/task_scheduler/post_task.h",
+    "+base/task/post_task.h",
     "+base/test/scoped_feature_list.h",
     "+base/thread_annotations.h",
     "+base/threading/thread_checker.h",
diff --git a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
index 3b6fbe59..bffb605a 100644
--- a/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/activity_logger_test.cc
@@ -90,14 +90,14 @@
   void ExecuteScriptInMainWorld(const String& script) const {
     v8::HandleScope scope(v8::Isolate::GetCurrent());
     script_controller_->ExecuteScriptInMainWorld(script);
-    PumpPendingRequestsForFrameToLoad();
+    PumpPendingRequestsForFrameToLoad(web_view_helper_.LocalMainFrame());
   }
 
   void ExecuteScriptInIsolatedWorld(const String& script) const {
     v8::HandleScope scope(v8::Isolate::GetCurrent());
     script_controller_->ExecuteScriptInIsolatedWorld(kIsolatedWorldId,
                                                      ScriptSourceCode(script));
-    PumpPendingRequestsForFrameToLoad();
+    PumpPendingRequestsForFrameToLoad(web_view_helper_.LocalMainFrame());
   }
 
   bool VerifyActivities(const String& activities) {
diff --git a/third_party/blink/renderer/bindings/core/v8/custom/v8_message_event_custom.cc b/third_party/blink/renderer/bindings/core/v8/custom/v8_message_event_custom.cc
index e5e6016..ff1de20 100644
--- a/third_party/blink/renderer/bindings/core/v8/custom/v8_message_event_custom.cc
+++ b/third_party/blink/renderer/bindings/core/v8/custom/v8_message_event_custom.cc
@@ -59,6 +59,10 @@
 
   v8::Local<v8::Value> result;
   switch (event->GetDataType()) {
+    case MessageEvent::kDataTypeNull:
+      result = v8::Null(isolate);
+      break;
+
     case MessageEvent::kDataTypeScriptValue:
       result =
           event->DataAsScriptValue().V8ValueFor(ScriptState::Current(isolate));
diff --git a/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc b/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
index 7294894..d19d56b9 100644
--- a/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
+++ b/third_party/blink/renderer/bindings/core/v8/rejected_promises.cc
@@ -76,7 +76,7 @@
           script_state_, EventTypeNames::unhandledrejection, init);
       // Log to console if event was not canceled.
       should_log_to_console_ =
-          target->DispatchEvent(event) == DispatchEventResult::kNotCanceled;
+          target->DispatchEvent(*event) == DispatchEventResult::kNotCanceled;
     }
 
     if (should_log_to_console_) {
@@ -113,7 +113,7 @@
       init.setReason(ScriptValue(script_state_, reason));
       PromiseRejectionEvent* event = PromiseRejectionEvent::Create(
           script_state_, EventTypeNames::rejectionhandled, init);
-      target->DispatchEvent(event);
+      target->DispatchEvent(*event);
     }
 
     if (should_log_to_console_ && promise_rejection_id_) {
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc
index 643a43de..c9edbdb 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.cc
@@ -14,9 +14,6 @@
     : PausableObject(ExecutionContext::From(script_state)),
       state_(kPending),
       script_state_(script_state),
-      timer_(GetExecutionContext()->GetTaskRunner(TaskType::kMicrotask),
-             this,
-             &ScriptPromiseResolver::OnTimerFired),
       resolver_(script_state) {
   if (GetExecutionContext()->IsContextDestroyed()) {
     state_ = kDetached;
@@ -31,18 +28,18 @@
 }
 
 void ScriptPromiseResolver::Pause() {
-  timer_.Stop();
+  deferred_resolve_task_.Cancel();
 }
 
 void ScriptPromiseResolver::Unpause() {
   if (state_ == kResolving || state_ == kRejecting)
-    timer_.StartOneShot(TimeDelta(), FROM_HERE);
+    ScheduleResolveOrReject();
 }
 
 void ScriptPromiseResolver::Detach() {
   if (state_ == kDetached)
     return;
-  timer_.Stop();
+  deferred_resolve_task_.Cancel();
   state_ = kDetached;
   resolver_.Clear();
   value_.Clear();
@@ -61,17 +58,6 @@
   keep_alive_ = this;
 }
 
-void ScriptPromiseResolver::OnTimerFired(TimerBase*) {
-  DCHECK(state_ == kResolving || state_ == kRejecting);
-  if (!GetScriptState()->ContextIsValid()) {
-    Detach();
-    return;
-  }
-
-  ScriptState::Scope scope(script_state_);
-  ResolveOrRejectImmediately();
-}
-
 void ScriptPromiseResolver::ResolveOrRejectImmediately() {
   DCHECK(!GetExecutionContext()->IsContextDestroyed());
   DCHECK(!GetExecutionContext()->IsContextPaused());
@@ -86,6 +72,24 @@
   Detach();
 }
 
+void ScriptPromiseResolver::ScheduleResolveOrReject() {
+  deferred_resolve_task_ = PostCancellableTask(
+      *GetExecutionContext()->GetTaskRunner(TaskType::kMicrotask), FROM_HERE,
+      WTF::Bind(&ScriptPromiseResolver::ResolveOrRejectDeferred,
+                WrapPersistent(this)));
+}
+
+void ScriptPromiseResolver::ResolveOrRejectDeferred() {
+  DCHECK(state_ == kResolving || state_ == kRejecting);
+  if (!GetScriptState()->ContextIsValid()) {
+    Detach();
+    return;
+  }
+
+  ScriptState::Scope scope(script_state_);
+  ResolveOrRejectImmediately();
+}
+
 void ScriptPromiseResolver::Trace(blink::Visitor* visitor) {
   visitor->Trace(script_state_);
   PausableObject::Trace(visitor);
diff --git a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h
index 4eb63b8..ee40284 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h
+++ b/third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h
@@ -15,7 +15,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
 #include "third_party/blink/renderer/platform/heap/self_keep_alive.h"
-#include "third_party/blink/renderer/platform/timer.h"
+#include "third_party/blink/renderer/platform/web_task_runner.h"
 #include "v8/include/v8.h"
 
 namespace blink {
@@ -153,20 +153,19 @@
     // resolve.
     // See: http://crbug.com/663476
     if (ScriptForbiddenScope::IsScriptForbidden()) {
-      // Retain this object until it is actually resolved or rejected.
-      KeepAliveWhilePending();
-      timer_.StartOneShot(TimeDelta(), FROM_HERE);
+      ScheduleResolveOrReject();
       return;
     }
     ResolveOrRejectImmediately();
   }
 
   void ResolveOrRejectImmediately();
-  void OnTimerFired(TimerBase*);
+  void ScheduleResolveOrReject();
+  void ResolveOrRejectDeferred();
 
   ResolutionState state_;
   const Member<ScriptState> script_state_;
-  TaskRunnerTimer<ScriptPromiseResolver> timer_;
+  TaskHandle deferred_resolve_task_;
   Resolver resolver_;
   ScopedPersistent<v8::Value> value_;
 
diff --git a/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc b/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
index 8433fcd..4f28a9b 100644
--- a/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
+++ b/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
@@ -16,31 +16,123 @@
 
 namespace blink {
 
-static void PreciselyCollectGarbage() {
+namespace {
+
+// Temporarily swaps out the underlying v8 heap controller from a given
+// v8::Isolate. Gracefully finalized potentially running garbage collections.
+class TemporaryV8HeapControllerScope {
+  WTF_MAKE_NONCOPYABLE(TemporaryV8HeapControllerScope);
+  STACK_ALLOCATED();
+
+ public:
+  TemporaryV8HeapControllerScope(v8::Isolate* isolate,
+                                 std::unique_ptr<V8HeapController> controller)
+      : isolate_(isolate), saved_controller_(std::move(controller)) {
+    SwapWithV8PerIsolateDataVisitor();
+  }
+  ~TemporaryV8HeapControllerScope() { SwapWithV8PerIsolateDataVisitor(); }
+
+  V8HeapController* CurrentController() {
+    return V8PerIsolateData::From(isolate_)->GetV8HeapController();
+  }
+
+ private:
+  void SwapWithV8PerIsolateDataVisitor() {
+    V8HeapController* current = CurrentController();
+    if (current)
+      current->FinalizeAndCleanup();
+    V8PerIsolateData::From(isolate_)->SwapV8HeapController(saved_controller_);
+    isolate_->SetEmbedderHeapTracer(CurrentController());
+  }
+
+  v8::Isolate* const isolate_;
+  std::unique_ptr<V8HeapController> saved_controller_;
+};
+
+class InterceptingScriptWrappableMarkingVisitor
+    : public blink::ScriptWrappableMarkingVisitor {
+ public:
+  InterceptingScriptWrappableMarkingVisitor(v8::Isolate* isolate)
+      : ScriptWrappableMarkingVisitor(isolate),
+        marked_wrappers_(new size_t(0)) {}
+  ~InterceptingScriptWrappableMarkingVisitor() override {
+    delete marked_wrappers_;
+  }
+
+  void Visit(const TraceWrapperV8Reference<v8::Value>&) override {
+    *marked_wrappers_ += 1;
+    // Do not actually mark this visitor, as this would call into v8, which
+    // would require executing an actual GC.
+  }
+
+  size_t NumberOfMarkedWrappers() const { return *marked_wrappers_; }
+
+  void Start() { TracePrologue(); }
+
+  void End() {
+    // Gracefully terminate tracing.
+    AdvanceTracing(
+        0,
+        v8::EmbedderHeapTracer::AdvanceTracingActions(
+            v8::EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
+    AbortTracing();
+  }
+
+ private:
+  size_t* marked_wrappers_;  // Indirection required because of const override.
+};
+
+class InterceptingScriptWrappableMarkingVisitorScope
+    : public TemporaryV8HeapControllerScope {
+  WTF_MAKE_NONCOPYABLE(InterceptingScriptWrappableMarkingVisitorScope);
+  STACK_ALLOCATED();
+
+ public:
+  InterceptingScriptWrappableMarkingVisitorScope(v8::Isolate* isolate)
+      : TemporaryV8HeapControllerScope(
+            isolate,
+            std::unique_ptr<InterceptingScriptWrappableMarkingVisitor>{
+                new InterceptingScriptWrappableMarkingVisitor(isolate)}) {
+    Visitor()->Start();
+  }
+
+  virtual ~InterceptingScriptWrappableMarkingVisitorScope() {
+    Visitor()->End();
+  }
+
+  InterceptingScriptWrappableMarkingVisitor* Visitor() {
+    return static_cast<InterceptingScriptWrappableMarkingVisitor*>(
+        CurrentController());
+  }
+};
+
+void PreciselyCollectGarbage() {
   ThreadState::Current()->CollectAllGarbage();
 }
 
-static void RunV8Scavenger(v8::Isolate* isolate) {
+void RunV8Scavenger(v8::Isolate* isolate) {
   V8GCController::CollectGarbage(isolate, true);
 }
 
-static void RunV8FullGc(v8::Isolate* isolate) {
+void RunV8FullGc(v8::Isolate* isolate) {
   V8GCController::CollectGarbage(isolate, false);
 }
 
+}  // namespace
+
 TEST(ScriptWrappableMarkingVisitorTest,
      ScriptWrappableMarkingVisitorTracesWrappers) {
-  V8TestingScope scope;
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
+  V8TestingScope testing_scope;
+
+  // The graph needs to be set up before starting tracing as otherwise the
+  // conservative write barrier would trigger.
   DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
   DeathAwareScriptWrappable* dependency = DeathAwareScriptWrappable::Create();
   target->SetWrappedDependency(dependency);
 
-  // The graph needs to be set up before starting tracing as otherwise the
-  // conservative write barrier would trigger.
-  visitor->TracePrologue();
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      testing_scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   HeapObjectHeader* target_header = HeapObjectHeader::FromPayload(target);
   HeapObjectHeader* dependency_header =
@@ -61,8 +153,6 @@
   EXPECT_EQ(visitor->MarkingDeque()->size(), 0ul);
   EXPECT_TRUE(target_header->IsWrapperHeaderMarked());
   EXPECT_TRUE(dependency_header->IsWrapperHeaderMarked());
-
-  visitor->AbortTracing();
 }
 
 TEST(ScriptWrappableMarkingVisitorTest,
@@ -145,51 +235,47 @@
 }
 
 TEST(ScriptWrappableMarkingVisitorTest, OilpanClearsHeadersWhenObjectDied) {
-  V8TestingScope scope;
+  V8TestingScope testing_scope;
 
   DeathAwareScriptWrappable* object = DeathAwareScriptWrappable::Create();
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
-  visitor->TracePrologue();
+
+  // The graph needs to be set up before starting tracing as otherwise the
+  // conservative write barrier would trigger.
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      testing_scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
+
   auto* header = HeapObjectHeader::FromPayload(object);
   visitor->headers_to_unmark_.push_back(header);
-
   PreciselyCollectGarbage();
-
   EXPECT_FALSE(visitor->headers_to_unmark_.Contains(header));
-  visitor->AbortTracing();
 }
 
 TEST(ScriptWrappableMarkingVisitorTest,
      OilpanClearsMarkingDequeWhenObjectDied) {
-  V8TestingScope scope;
+  V8TestingScope testing_scope;
 
   DeathAwareScriptWrappable* object = DeathAwareScriptWrappable::Create();
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
-  visitor->TracePrologue();
+
+  // The graph needs to be set up before starting tracing as otherwise the
+  // conservative write barrier would trigger.
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      testing_scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   visitor->TraceWithWrappers(object);
 
   EXPECT_EQ(visitor->MarkingDeque()->front().RawObjectPointer(), object);
-
   PreciselyCollectGarbage();
-
   EXPECT_EQ(visitor->MarkingDeque()->front().RawObjectPointer(), nullptr);
-
-  visitor->AbortTracing();
 }
 
 TEST(ScriptWrappableMarkingVisitorTest,
      MarkedObjectDoesNothingOnWriteBarrierHitWhenDependencyIsMarkedToo) {
-  V8TestingScope scope;
-
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
-  visitor->TracePrologue();
+  V8TestingScope testing_scope;
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      testing_scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
   DeathAwareScriptWrappable* dependencies[] = {
@@ -202,23 +288,18 @@
   }
 
   EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-
   target->SetWrappedDependency(dependencies[0]);
   target->AddWrappedVectorDependency(dependencies[1]);
   target->AddWrappedHashMapDependency(dependencies[2], dependencies[3]);
-
   EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-  visitor->AbortTracing();
 }
 
 TEST(ScriptWrappableMarkingVisitorTest,
      MarkedObjectMarksDependencyOnWriteBarrierHitWhenNotMarked) {
-  V8TestingScope scope;
-
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
-  visitor->TracePrologue();
+  V8TestingScope testing_scope;
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      testing_scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
   DeathAwareScriptWrappable* dependencies[] = {
@@ -236,8 +317,6 @@
   for (int i = 0; i < 4; i++) {
     EXPECT_TRUE(visitor->MarkingDequeContains(dependencies[i]));
   }
-
-  visitor->AbortTracing();
 }
 
 namespace {
@@ -262,63 +341,6 @@
   TraceWrapperV8Reference<v8::String> handle_;
 };
 
-class InterceptingScriptWrappableMarkingVisitor
-    : public blink::ScriptWrappableMarkingVisitor {
- public:
-  InterceptingScriptWrappableMarkingVisitor(v8::Isolate* isolate)
-      : ScriptWrappableMarkingVisitor(isolate),
-        marked_wrappers_(new size_t(0)) {}
-  ~InterceptingScriptWrappableMarkingVisitor() override {
-    delete marked_wrappers_;
-  }
-
-  void Visit(const TraceWrapperV8Reference<v8::Value>&) override {
-    *marked_wrappers_ += 1;
-    // Do not actually mark this visitor, as this would call into v8, which
-    // would require executing an actual GC.
-  }
-
-  size_t NumberOfMarkedWrappers() const { return *marked_wrappers_; }
-
-  void Start() { TracePrologue(); }
-
-  void end() {
-    // Gracefully terminate tracing.
-    AdvanceTracing(
-        0,
-        v8::EmbedderHeapTracer::AdvanceTracingActions(
-            v8::EmbedderHeapTracer::ForceCompletionAction::FORCE_COMPLETION));
-    AbortTracing();
-  }
-
- private:
-  size_t* marked_wrappers_;  // Indirection required because of const override.
-};
-
-class InterceptingScriptWrappableMarkingVisitorScope
-    : public V8PerIsolateData::TemporaryScriptWrappableVisitorScope {
-  WTF_MAKE_NONCOPYABLE(InterceptingScriptWrappableMarkingVisitorScope);
-  STACK_ALLOCATED();
-
- public:
-  InterceptingScriptWrappableMarkingVisitorScope(v8::Isolate* isolate)
-      : V8PerIsolateData::TemporaryScriptWrappableVisitorScope(
-            isolate,
-            std::unique_ptr<InterceptingScriptWrappableMarkingVisitor>(
-                new InterceptingScriptWrappableMarkingVisitor(isolate))) {
-    Visitor()->Start();
-  }
-
-  virtual ~InterceptingScriptWrappableMarkingVisitorScope() {
-    Visitor()->end();
-  }
-
-  InterceptingScriptWrappableMarkingVisitor* Visitor() {
-    return reinterpret_cast<InterceptingScriptWrappableMarkingVisitor*>(
-        CurrentVisitor());
-  }
-};
-
 }  // namespace
 
 TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierOnUnmarkedContainer) {
@@ -356,25 +378,12 @@
   CHECK_EQ(1u, raw_visitor->NumberOfMarkedWrappers());
 }
 
-TEST(ScriptWrappableMarkingVisitorTest, VtableAtObjectStart) {
-  // This test makes sure that the subobject v8::EmbedderHeapTracer is placed
-  // at the start of a ScriptWrappableMarkingVisitor object. We do this to
-  // mitigate potential problems that could be caused by LTO when passing
-  // v8::EmbedderHeapTracer across the API boundary.
-  V8TestingScope scope;
-  std::unique_ptr<blink::ScriptWrappableMarkingVisitor> visitor(
-      new ScriptWrappableMarkingVisitor(scope.GetIsolate()));
-  CHECK_EQ(
-      static_cast<void*>(visitor.get()),
-      static_cast<void*>(dynamic_cast<v8::EmbedderHeapTracer*>(visitor.get())));
-}
-
 TEST(ScriptWrappableMarkingVisitor, WriteBarrierForScriptWrappable) {
   // Regression test for crbug.com/702490.
   V8TestingScope scope;
-  InterceptingScriptWrappableMarkingVisitorScope visitor_scope(
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
       scope.GetIsolate());
-  auto* raw_visitor = visitor_scope.Visitor();
+  auto* raw_visitor = intercepting_scope.Visitor();
 
   // Mark the ScriptWrappable.
   DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
@@ -396,9 +405,6 @@
 
 TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierOnHeapVectorSwap1) {
   V8TestingScope scope;
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
 
   HeapVector<DeathAwareScriptWrappable::Wrapper> vector1;
   DeathAwareScriptWrappable* entry1 = DeathAwareScriptWrappable::Create();
@@ -407,22 +413,18 @@
   DeathAwareScriptWrappable* entry2 = DeathAwareScriptWrappable::Create();
   vector2.push_back(entry2);
 
-  visitor->TracePrologue();
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
   swap(vector1, vector2);
-
   EXPECT_TRUE(visitor->MarkingDequeContains(entry1));
   EXPECT_TRUE(visitor->MarkingDequeContains(entry2));
-
-  visitor->AbortTracing();
 }
 
 TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierOnHeapVectorSwap2) {
   V8TestingScope scope;
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
 
   HeapVector<DeathAwareScriptWrappable::Wrapper> vector1;
   DeathAwareScriptWrappable* entry1 = DeathAwareScriptWrappable::Create();
@@ -431,16 +433,15 @@
   DeathAwareScriptWrappable* entry2 = DeathAwareScriptWrappable::Create();
   vector2.push_back(entry2);
 
-  visitor->TracePrologue();
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
   swap(vector1, vector2);
-
   // Only entry2 is held alive by TraceWrapperMember, so we only expect this
   // barrier to fire.
   EXPECT_TRUE(visitor->MarkingDequeContains(entry2));
-
-  visitor->AbortTracing();
 }
 
 namespace {
@@ -495,9 +496,6 @@
 
 TEST(ScriptWrappableMarkingVisitorTest, MixinTracing) {
   V8TestingScope scope;
-  ScriptWrappableMarkingVisitor* visitor =
-      V8PerIsolateData::From(scope.GetIsolate())
-          ->GetScriptWrappableMarkingVisitor();
 
   DeathAwareScriptWrappable* base_wrapper = DeathAwareScriptWrappable::Create();
   DeathAwareScriptWrappable* mixin_wrapper =
@@ -510,7 +508,9 @@
   // Make sure that mixin does not point to the object header.
   EXPECT_NE(static_cast<void*>(base), static_cast<void*>(mixin));
 
-  visitor->TracePrologue();
+  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
+      scope.GetIsolate());
+  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
 
   EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
 
@@ -531,7 +531,6 @@
       HeapObjectHeader::FromPayload(mixin_wrapper)->IsWrapperHeaderMarked());
 
   mixin_handle = nullptr;
-  visitor->AbortTracing();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
index 3c13bf9..3cc792db 100644
--- a/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
+++ b/third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h
@@ -250,6 +250,11 @@
   }
   void SetImageBitmapContentsArray(ImageBitmapContentsArray contents);
 
+  bool IsLockedToAgentCluster() const {
+    return !wasm_modules_.IsEmpty() ||
+           !shared_array_buffers_contents_.IsEmpty();
+  }
+
  private:
   friend class ScriptValueSerializer;
   friend class V8ScriptValueSerializer;
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc
index 500b0ed..99611d9 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_abstract_event_listener.cc
@@ -114,6 +114,9 @@
 
 void V8AbstractEventListener::HandleEvent(ScriptState* script_state,
                                           Event* event) {
+  if (!script_state->ContextIsValid())
+    return;
+
   ScriptState::Scope scope(script_state);
 
   // Get the V8 wrapper for the event object.
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
index 3ce2910..833c8df 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -65,6 +65,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h"
 #include "third_party/blink/renderer/platform/bindings/v8_per_context_data.h"
 #include "third_party/blink/renderer/platform/bindings/v8_private_property.h"
+#include "third_party/blink/renderer/platform/heap/v8_heap_controller.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 #include "third_party/blink/renderer/platform/loader/fetch/access_control_status.h"
 #include "third_party/blink/renderer/platform/runtime_enabled_features.h"
@@ -622,12 +623,11 @@
 static void InitializeV8Common(v8::Isolate* isolate) {
   isolate->AddGCPrologueCallback(V8GCController::GcPrologue);
   isolate->AddGCEpilogueCallback(V8GCController::GcEpilogue);
-  std::unique_ptr<ScriptWrappableMarkingVisitor> visitor(
-      new ScriptWrappableMarkingVisitor(isolate));
-  V8PerIsolateData::From(isolate)->SetScriptWrappableMarkingVisitor(
-      std::move(visitor));
+  V8PerIsolateData::From(isolate)->SetV8HeapController(
+      std::unique_ptr<V8HeapController>{
+          new ScriptWrappableMarkingVisitor(isolate)});
   isolate->SetEmbedderHeapTracer(
-      V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor());
+      V8PerIsolateData::From(isolate)->GetV8HeapController());
 
   isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped);
 
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.cc b/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.cc
index 3149829..79cff5ba 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.cc
@@ -49,26 +49,6 @@
     ScriptState* script_state)
     : V8EventListener(is_inline, script_state) {}
 
-void V8WorkerOrWorkletEventListener::HandleEvent(ScriptState* script_state,
-                                                 Event* event) {
-  v8::Local<v8::Context> context = script_state->GetContext();
-  WorkerOrWorkletScriptController* script_controller =
-      ToWorkerOrWorkletGlobalScope(ToExecutionContext(context))
-          ->ScriptController();
-  if (!script_controller)
-    return;
-
-  ScriptState::Scope scope(script_state);
-
-  // Get the V8 wrapper for the event object.
-  v8::Local<v8::Value> js_event = ToV8(event, context->Global(), GetIsolate());
-  if (js_event.IsEmpty())
-    return;
-
-  InvokeEventHandler(script_state, event,
-                     v8::Local<v8::Value>::New(GetIsolate(), js_event));
-}
-
 v8::Local<v8::Value> V8WorkerOrWorkletEventListener::CallListenerFunction(
     ScriptState* script_state,
     v8::Local<v8::Value> js_event,
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.h b/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.h
index b95fb7a..59a9d23c 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.h
+++ b/third_party/blink/renderer/bindings/core/v8/v8_worker_or_worklet_event_listener.h
@@ -52,8 +52,6 @@
     return event_listener;
   }
 
-  void HandleEvent(ScriptState*, Event*) override;
-
  protected:
   V8WorkerOrWorkletEventListener(bool is_inline, ScriptState*);
 
diff --git a/third_party/blink/renderer/controller/blink_initializer.cc b/third_party/blink/renderer/controller/blink_initializer.cc
index 8c762d1..5b58c90 100644
--- a/third_party/blink/renderer/controller/blink_initializer.cc
+++ b/third_party/blink/renderer/controller/blink_initializer.cc
@@ -73,22 +73,16 @@
   }
 };
 
-}  // namespace
+WebThread::TaskObserver* g_end_of_task_runner = nullptr;
 
-static WebThread::TaskObserver* g_end_of_task_runner = nullptr;
-
-static BlinkInitializer& GetBlinkInitializer() {
+BlinkInitializer& GetBlinkInitializer() {
   DEFINE_STATIC_LOCAL(std::unique_ptr<BlinkInitializer>, initializer,
                       (std::make_unique<BlinkInitializer>()));
   return *initializer;
 }
 
-void Initialize(Platform* platform,
-                service_manager::BinderRegistry* registry,
-                WebThread* main_thread) {
-  DCHECK(registry);
-  Platform::Initialize(platform, main_thread);
-
+void InitializeCommon(Platform* platform,
+                      service_manager::BinderRegistry* registry) {
 #if !defined(ARCH_CPU_X86_64) && !defined(ARCH_CPU_ARM64) && defined(OS_WIN)
   // Reserve address space on 32 bit Windows, to make it likelier that large
   // array buffer allocations succeed.
@@ -141,6 +135,23 @@
   }
 }
 
+}  // namespace
+
+void Initialize(Platform* platform,
+                service_manager::BinderRegistry* registry,
+                WebThread* main_thread) {
+  DCHECK(registry);
+  Platform::Initialize(platform, main_thread);
+  InitializeCommon(platform, registry);
+}
+
+void CreateMainThreadAndInitialize(Platform* platform,
+                                   service_manager::BinderRegistry* registry) {
+  DCHECK(registry);
+  Platform::CreateMainThreadAndInitialize(platform);
+  InitializeCommon(platform, registry);
+}
+
 void BlinkInitializer::RegisterInterfaces(
     service_manager::BinderRegistry& registry) {
   ModulesInitializer::RegisterInterfaces(registry);
diff --git a/third_party/blink/renderer/core/animation/animation.cc b/third_party/blink/renderer/core/animation/animation.cc
index 9dcdf44..2c2d624 100644
--- a/third_party/blink/renderer/core/animation/animation.cc
+++ b/third_party/blink/renderer/core/animation/animation.cc
@@ -728,8 +728,8 @@
   pending_finished_event_ = nullptr;
 }
 
-DispatchEventResult Animation::DispatchEventInternal(Event* event) {
-  if (pending_finished_event_ == event)
+DispatchEventResult Animation::DispatchEventInternal(Event& event) {
+  if (pending_finished_event_ == &event)
     pending_finished_event_ = nullptr;
   return EventTargetWithInlineData::DispatchEventInternal(event);
 }
diff --git a/third_party/blink/renderer/core/animation/animation.h b/third_party/blink/renderer/core/animation/animation.h
index 1bbb016..b9c05ac 100644
--- a/third_party/blink/renderer/core/animation/animation.h
+++ b/third_party/blink/renderer/core/animation/animation.h
@@ -228,7 +228,7 @@
   bool CompositorPendingForTesting() const { return compositor_pending_; }
 
  protected:
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
   void AddedEventListener(const AtomicString& event_type,
                           RegisteredEventListener&) override;
 
diff --git a/third_party/blink/renderer/core/animation/css/css_animations_test.cc b/third_party/blink/renderer/core/animation/css/css_animations_test.cc
index 3183baa..59d5c1a6 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations_test.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animations_test.cc
@@ -9,33 +9,27 @@
 #include "third_party/blink/renderer/core/layout/layout_object.h"
 #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 #include "third_party/blink/renderer/platform/animation/compositor_animation_delegate.h"
-#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
 
 namespace blink {
 
-namespace {
-
-class TestingPlatformSupportWithMockSchedulerAndThreadedAnimations
-    : public TestingPlatformSupportWithMockScheduler {
- public:
-  bool IsThreadedAnimationEnabled() override { return true; }
-};
-
-}  // namespace
-
 class CSSAnimationsTest : public RenderingTest {
  public:
+  CSSAnimationsTest() {
+    EnablePlatform();
+    platform()->SetThreadedAnimationEnabled(true);
+  }
+
   void SetUp() override {
-    platform_->SetAutoAdvanceNowToPendingTasks(false);
+    platform()->SetAutoAdvanceNowToPendingTasks(false);
     // Advance timer manually as RenderingTest expects the time to be non-zero.
-    platform_->AdvanceClockSeconds(1.);
+    platform()->AdvanceClockSeconds(1.);
     RenderingTest::SetUp();
     EnableCompositing();
   }
 
   void TearDown() override {
-    platform_->SetAutoAdvanceNowToPendingTasks(true);
-    platform_->RunUntilIdle();
+    platform()->SetAutoAdvanceNowToPendingTasks(true);
+    platform()->RunUntilIdle();
   }
 
   void StartAnimationOnCompositor(Animation* animation) {
@@ -46,8 +40,8 @@
   }
 
   void AdvanceClockSeconds(double seconds) {
-    platform_->AdvanceClockSeconds(seconds);
-    platform_->RunUntilIdle();
+    platform()->AdvanceClockSeconds(seconds);
+    platform()->RunUntilIdle();
   }
 
   double GetContrastFilterAmount(Element* element) {
@@ -58,11 +52,6 @@
     return static_cast<const BasicComponentTransferFilterOperation*>(filter)
         ->Amount();
   }
-
- private:
-  ScopedTestingPlatformSupport<
-      TestingPlatformSupportWithMockSchedulerAndThreadedAnimations>
-      platform_;
 };
 
 // Verify that a composited animation is retargeted according to its composited
diff --git a/third_party/blink/renderer/core/css/CSSProperties.json5 b/third_party/blink/renderer/core/css/CSSProperties.json5
index c09f646..3fb4382 100644
--- a/third_party/blink/renderer/core/css/CSSProperties.json5
+++ b/third_party/blink/renderer/core/css/CSSProperties.json5
@@ -791,7 +791,7 @@
       inherited: true,
       font: true,
       type_name: "TextRenderingMode",
-      keywords: ["auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision"],
+      keywords: ["auto", "optimizespeed", "optimizelegibility", "geometricprecision"],
       typedom_types: ["Keyword"],
       priority: "High",
     },
@@ -1452,7 +1452,7 @@
       property_methods: ["CSSValueFromComputedStyleInternal"],
       inherited: true,
       svg: true,
-      keywords: ["auto", "optimizeSpeed", "optimizeQuality"],
+      keywords: ["auto", "optimizespeed", "optimizequality"],
       typedom_types: ["Keyword"],
     },
     {
@@ -1870,7 +1870,7 @@
       field_group: "*",
       field_template: "keyword",
       keywords: [
-        "auto", "optimizeSpeed", "optimizeQuality",
+        "auto", "optimizespeed", "optimizequality",
         "-webkit-optimize-contrast", "pixelated"
       ],
       typedom_types: ["Keyword"],
@@ -2881,7 +2881,7 @@
       property_methods: ["CSSValueFromComputedStyleInternal"],
       inherited: true,
       svg: true,
-      keywords: ["auto", "optimizeSpeed", "crispEdges", "geometricPrecision"],
+      keywords: ["auto", "optimizespeed", "crispedges", "geometricprecision"],
       typedom_types: ["Keyword"],
     },
     {
@@ -3246,7 +3246,6 @@
     {
       name: "transform-box",
       property_methods: ["CSSValueFromComputedStyleInternal"],
-      runtime_flag: "CSSTransformBox",
       field_template: "keyword",
       keywords: ["fill-box", "view-box"],
       default_value: "view-box",
diff --git a/third_party/blink/renderer/core/css/CSSValueKeywords.json5 b/third_party/blink/renderer/core/css/CSSValueKeywords.json5
index 45113ba..61ddcf7 100644
--- a/third_party/blink/renderer/core/css/CSSValueKeywords.json5
+++ b/third_party/blink/renderer/core/css/CSSValueKeywords.json5
@@ -824,9 +824,15 @@
 
     // text-rendering
     //auto
-    "optimizeSpeed",
-    "optimizeLegibility",
-    "geometricPrecision",
+    "optimizespeed",
+    "optimizelegibility",
+    "geometricprecision",
+
+    // shape-rendering
+    //auto
+    //optimizespeed
+    //geometricprecision
+    "crispedges",
 
     // -webkit-color-adjust
     "economy",
@@ -887,8 +893,8 @@
 
     // image-rendering
     //auto
-    //optimizeSpeed
-    "optimizeQuality",
+    //optimizespeed
+    "optimizequality",
     "pixelated",
     "-webkit-optimize-contrast",
 
diff --git a/third_party/blink/renderer/core/css/SVGCSSValueKeywords.json5 b/third_party/blink/renderer/core/css/SVGCSSValueKeywords.json5
index 719ae3e..5f4007b 100644
--- a/third_party/blink/renderer/core/css/SVGCSSValueKeywords.json5
+++ b/third_party/blink/renderer/core/css/SVGCSSValueKeywords.json5
@@ -193,8 +193,8 @@
 
     // CSS_PROP_COLOR_RENDERING
     //auto
-    //optimizeSpeed
-    //optimizeQuality
+    //optimizespeed
+    //optimizequality
 
     //// CSS_PROP_FILL
     //currentColor
@@ -206,8 +206,8 @@
 
     // CSS_PROP_IMAGE_RENDERING
     //auto
-    //optimizeSpeed
-    //optimizeQuality
+    //optimizespeed
+    //optimizequality
 
     // CSS_PROP_MARKER
     // CSS_PROP_MARKER_END
@@ -215,9 +215,9 @@
     // CSS_PROP_MARKER_START
     // CSS_PROP_SHAPE_RENDERING
     //auto
-    //optimizeSpeed
-    "crispEdges",
-    //geometricPrecision
+    //optimizespeed
+    //crispedges
+    //geometricprecision
 
     // CSS_PROP_STROKE
     // CSS_PROP_STROKE_DASHARRAY
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
index 0b9818b4e..24e7c51 100644
--- a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
+++ b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
@@ -888,13 +888,13 @@
       value_id_ = CSSValueAuto;
       break;
     case kOptimizeSpeed:
-      value_id_ = CSSValueOptimizeSpeed;
+      value_id_ = CSSValueOptimizespeed;
       break;
     case kOptimizeLegibility:
-      value_id_ = CSSValueOptimizeLegibility;
+      value_id_ = CSSValueOptimizelegibility;
       break;
     case kGeometricPrecision:
-      value_id_ = CSSValueGeometricPrecision;
+      value_id_ = CSSValueGeometricprecision;
       break;
   }
 }
@@ -904,11 +904,11 @@
   switch (value_id_) {
     case CSSValueAuto:
       return kAutoTextRendering;
-    case CSSValueOptimizeSpeed:
+    case CSSValueOptimizespeed:
       return kOptimizeSpeed;
-    case CSSValueOptimizeLegibility:
+    case CSSValueOptimizelegibility:
       return kOptimizeLegibility;
-    case CSSValueGeometricPrecision:
+    case CSSValueGeometricprecision:
       return kGeometricPrecision;
     default:
       break;
@@ -1192,10 +1192,10 @@
       value_id_ = CSSValueAuto;
       break;
     case CR_OPTIMIZESPEED:
-      value_id_ = CSSValueOptimizeSpeed;
+      value_id_ = CSSValueOptimizespeed;
       break;
     case CR_OPTIMIZEQUALITY:
-      value_id_ = CSSValueOptimizeQuality;
+      value_id_ = CSSValueOptimizequality;
       break;
   }
 }
@@ -1203,9 +1203,9 @@
 template <>
 inline EColorRendering CSSIdentifierValue::ConvertTo() const {
   switch (value_id_) {
-    case CSSValueOptimizeSpeed:
+    case CSSValueOptimizespeed:
       return CR_OPTIMIZESPEED;
-    case CSSValueOptimizeQuality:
+    case CSSValueOptimizequality:
       return CR_OPTIMIZEQUALITY;
     case CSSValueAuto:
       return CR_AUTO;
@@ -1303,13 +1303,13 @@
       value_id_ = CSSValueAuto;
       break;
     case SR_OPTIMIZESPEED:
-      value_id_ = CSSValueOptimizeSpeed;
+      value_id_ = CSSValueOptimizespeed;
       break;
     case SR_CRISPEDGES:
-      value_id_ = CSSValueCrispEdges;
+      value_id_ = CSSValueCrispedges;
       break;
     case SR_GEOMETRICPRECISION:
-      value_id_ = CSSValueGeometricPrecision;
+      value_id_ = CSSValueGeometricprecision;
       break;
   }
 }
@@ -1319,11 +1319,11 @@
   switch (value_id_) {
     case CSSValueAuto:
       return SR_AUTO;
-    case CSSValueOptimizeSpeed:
+    case CSSValueOptimizespeed:
       return SR_OPTIMIZESPEED;
-    case CSSValueCrispEdges:
+    case CSSValueCrispedges:
       return SR_CRISPEDGES;
-    case CSSValueGeometricPrecision:
+    case CSSValueGeometricprecision:
       return SR_GEOMETRICPRECISION;
     default:
       break;
diff --git a/third_party/blink/renderer/core/css/font_face_set.cc b/third_party/blink/renderer/core/css/font_face_set.cc
index 3dcf115..573b2d7 100644
--- a/third_party/blink/renderer/core/css/font_face_set.cc
+++ b/third_party/blink/renderer/core/css/font_face_set.cc
@@ -39,7 +39,7 @@
   if (should_fire_loading_event_) {
     should_fire_loading_event_ = false;
     DispatchEvent(
-        FontFaceSetLoadEvent::CreateForFontFaces(EventTypeNames::loading));
+        *FontFaceSetLoadEvent::CreateForFontFaces(EventTypeNames::loading));
   }
 }
 
@@ -244,9 +244,9 @@
       failed_fonts_.clear();
     }
     is_loading_ = false;
-    DispatchEvent(done_event);
+    DispatchEvent(*done_event);
     if (error_event)
-      DispatchEvent(error_event);
+      DispatchEvent(*error_event);
   }
 
   if (ready_->GetState() == ReadyProperty::kPending)
diff --git a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
index ecfe64c..ff57391 100644
--- a/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
+++ b/third_party/blink/renderer/core/css/parser/css_parser_fast_paths.cc
@@ -592,8 +592,8 @@
       return value_id == CSSValueAuto || value_id == CSSValueSRGB ||
              value_id == CSSValueLinearRGB;
     case CSSPropertyColorRendering:
-      return value_id == CSSValueAuto || value_id == CSSValueOptimizeSpeed ||
-             value_id == CSSValueOptimizeQuality;
+      return value_id == CSSValueAuto || value_id == CSSValueOptimizespeed ||
+             value_id == CSSValueOptimizequality;
     case CSSPropertyDirection:
       return value_id == CSSValueLtr || value_id == CSSValueRtl;
     case CSSPropertyDisplay:
@@ -673,9 +673,9 @@
       DCHECK(RuntimeEnabledFeatures::CSSOMSmoothScrollEnabled());
       return value_id == CSSValueAuto || value_id == CSSValueSmooth;
     case CSSPropertyShapeRendering:
-      return value_id == CSSValueAuto || value_id == CSSValueOptimizeSpeed ||
-             value_id == CSSValueCrispEdges ||
-             value_id == CSSValueGeometricPrecision;
+      return value_id == CSSValueAuto || value_id == CSSValueOptimizespeed ||
+             value_id == CSSValueCrispedges ||
+             value_id == CSSValueGeometricprecision;
     case CSSPropertySpeak:
       return value_id == CSSValueNone || value_id == CSSValueNormal ||
              value_id == CSSValueSpellOut || value_id == CSSValueDigits ||
@@ -722,9 +722,9 @@
     case CSSPropertyTextOverflow:
       return value_id == CSSValueClip || value_id == CSSValueEllipsis;
     case CSSPropertyTextRendering:
-      return value_id == CSSValueAuto || value_id == CSSValueOptimizeSpeed ||
-             value_id == CSSValueOptimizeLegibility ||
-             value_id == CSSValueGeometricPrecision;
+      return value_id == CSSValueAuto || value_id == CSSValueOptimizespeed ||
+             value_id == CSSValueOptimizelegibility ||
+             value_id == CSSValueGeometricprecision;
     case CSSPropertyTextTransform:  // capitalize | uppercase | lowercase | none
       return (value_id >= CSSValueCapitalize &&
               value_id <= CSSValueLowercase) ||
diff --git a/third_party/blink/renderer/core/dom/abort_signal.cc b/third_party/blink/renderer/core/dom/abort_signal.cc
index 03d53ab..b088e00856 100644
--- a/third_party/blink/renderer/core/dom/abort_signal.cc
+++ b/third_party/blink/renderer/core/dom/abort_signal.cc
@@ -43,7 +43,7 @@
     std::move(closure).Run();
   }
   abort_algorithms_.clear();
-  DispatchEvent(Event::Create(EventTypeNames::abort));
+  DispatchEvent(*Event::Create(EventTypeNames::abort));
 }
 
 void AbortSignal::Follow(AbortSignal* parentSignal) {
diff --git a/third_party/blink/renderer/core/dom/character_data.cc b/third_party/blink/renderer/core/dom/character_data.cc
index 4fe5a46d..e10a705 100644
--- a/third_party/blink/renderer/core/dom/character_data.cc
+++ b/third_party/blink/renderer/core/dom/character_data.cc
@@ -217,7 +217,7 @@
   if (source != kUpdateFromParser && !IsInShadowTree()) {
     if (GetDocument().HasListenerType(
             Document::kDOMCharacterDataModifiedListener)) {
-      DispatchScopedEvent(MutationEvent::Create(
+      DispatchScopedEvent(*MutationEvent::Create(
           EventTypeNames::DOMCharacterDataModified, Event::Bubbles::kYes,
           nullptr, old_data, data_));
     }
diff --git a/third_party/blink/renderer/core/dom/container_node.cc b/third_party/blink/renderer/core/dom/container_node.cc
index f687aa1..31d76e8 100644
--- a/third_party/blink/renderer/core/dom/container_node.cc
+++ b/third_party/blink/renderer/core/dom/container_node.cc
@@ -1278,15 +1278,15 @@
   if (c->parentNode() &&
       document->HasListenerType(Document::kDOMNodeInsertedListener)) {
     c->DispatchScopedEvent(
-        MutationEvent::Create(EventTypeNames::DOMNodeInserted,
-                              Event::Bubbles::kYes, c->parentNode()));
+        *MutationEvent::Create(EventTypeNames::DOMNodeInserted,
+                               Event::Bubbles::kYes, c->parentNode()));
   }
 
   // dispatch the DOMNodeInsertedIntoDocument event to all descendants
   if (c->isConnected() && document->HasListenerType(
                               Document::kDOMNodeInsertedIntoDocumentListener)) {
     for (; c; c = NodeTraversal::Next(*c, &child)) {
-      c->DispatchScopedEvent(MutationEvent::Create(
+      c->DispatchScopedEvent(*MutationEvent::Create(
           EventTypeNames::DOMNodeInsertedIntoDocument, Event::Bubbles::kNo));
     }
   }
@@ -1320,7 +1320,7 @@
           Document::InDOMNodeRemovedHandlerState::kDOMNodeRemoved);
     }
     NodeChildRemovalTracker scope(child);
-    c->DispatchScopedEvent(MutationEvent::Create(
+    c->DispatchScopedEvent(*MutationEvent::Create(
         EventTypeNames::DOMNodeRemoved, Event::Bubbles::kYes, c->parentNode()));
     document.SetInDOMNodeRemovedHandlerState(original_document_state);
     c->SetInDOMNodeRemovedHandler(original_node_flag);
@@ -1341,7 +1341,7 @@
     }
     NodeChildRemovalTracker scope(child);
     for (; c; c = NodeTraversal::Next(*c, &child)) {
-      c->DispatchScopedEvent(MutationEvent::Create(
+      c->DispatchScopedEvent(*MutationEvent::Create(
           EventTypeNames::DOMNodeRemovedFromDocument, Event::Bubbles::kNo));
     }
     document.SetInDOMNodeRemovedHandlerState(original_document_state);
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 1fec6fd..70b424f 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -562,7 +562,7 @@
     Document* document = ToDocument(GetExecutionContext());
     if (!document->domWindow())
       return;
-    document->domWindow()->DispatchEvent(Event::Create(event_name));
+    document->domWindow()->DispatchEvent(*Event::Create(event_name));
     probe::networkStateChanged(document->GetFrame(), on_line);
   }
 
@@ -696,7 +696,8 @@
       slot_assignment_recalc_forbidden_recursion_depth_(0),
 #endif
       needs_to_record_ukm_outlive_time_(false),
-      viewport_data_(new ViewportData(*this)) {
+      viewport_data_(new ViewportData(*this)),
+      agent_cluster_id_(base::UnguessableToken::Create()) {
   if (frame_) {
     DCHECK(frame_->GetPage());
     ProvideContextFeaturesToDocumentFrom(*this, *frame_->GetPage());
@@ -1143,6 +1144,20 @@
                              ScriptValue::From(script_state, sheet));
 }
 
+CSSStyleSheet* Document::createEmptyCSSStyleSheet(
+    ScriptState* script_state,
+    const CSSStyleSheetInit& options,
+    ExceptionState& exception_state) {
+  return CSSStyleSheet::Create(*this, options, exception_state);
+}
+
+CSSStyleSheet* Document::createEmptyCSSStyleSheet(
+    ScriptState* script_state,
+    ExceptionState& exception_state) {
+  return Document::createEmptyCSSStyleSheet(script_state, CSSStyleSheetInit(),
+                                            exception_state);
+}
+
 ScriptValue Document::registerElement(ScriptState* script_state,
                                       const AtomicString& name,
                                       const ElementRegistrationOptions& options,
@@ -1437,7 +1452,7 @@
   }
 
   ready_state_ = ready_state;
-  DispatchEvent(Event::Create(EventTypeNames::readystatechange));
+  DispatchEvent(*Event::Create(EventTypeNames::readystatechange));
 }
 
 bool Document::IsLoadCompleted() const {
@@ -1764,9 +1779,9 @@
 }
 
 void Document::DidChangeVisibilityState() {
-  DispatchEvent(Event::CreateBubble(EventTypeNames::visibilitychange));
+  DispatchEvent(*Event::CreateBubble(EventTypeNames::visibilitychange));
   // Also send out the deprecated version until it can be removed.
-  DispatchEvent(Event::CreateBubble(EventTypeNames::webkitvisibilitychange));
+  DispatchEvent(*Event::CreateBubble(EventTypeNames::webkitvisibilitychange));
 
   if (GetPageVisibilityState() == mojom::PageVisibilityState::kVisible)
     Timeline().SetAllCompositorPending();
@@ -3566,7 +3581,7 @@
         // Dispatch visibilitychange event, but don't bother doing
         // other notifications as we're about to be unloaded.
         const TimeTicks pagevisibility_hidden_event_start = CurrentTimeTicks();
-        DispatchEvent(Event::CreateBubble(EventTypeNames::visibilitychange));
+        DispatchEvent(*Event::CreateBubble(EventTypeNames::visibilitychange));
         const TimeTicks pagevisibility_hidden_event_end = CurrentTimeTicks();
         DEFINE_STATIC_LOCAL(CustomCountHistogram, pagevisibility_histogram,
                             ("DocumentEventTiming.PageVibilityHiddenDuration",
@@ -3575,7 +3590,7 @@
             pagevisibility_hidden_event_end -
             pagevisibility_hidden_event_start);
         DispatchEvent(
-            Event::CreateBubble(EventTypeNames::webkitvisibilitychange));
+            *Event::CreateBubble(EventTypeNames::webkitvisibilitychange));
       }
       if (!frame_)
         return;
@@ -3628,7 +3643,7 @@
   DCHECK(RuntimeEnabledFeatures::PageLifecycleEnabled());
   const TimeTicks freeze_event_start = CurrentTimeTicks();
   SetFreezingInProgress(true);
-  DispatchEvent(Event::Create(EventTypeNames::freeze));
+  DispatchEvent(*Event::Create(EventTypeNames::freeze));
   SetFreezingInProgress(false);
   const TimeTicks freeze_event_end = CurrentTimeTicks();
   DEFINE_STATIC_LOCAL(CustomCountHistogram, freeze_histogram,
@@ -5862,7 +5877,7 @@
   // dispatched in a queued task, see https://crbug.com/425790
   if (document_timing_.DomContentLoadedEventStart().is_null())
     document_timing_.MarkDomContentLoadedEventStart();
-  DispatchEvent(Event::CreateBubble(EventTypeNames::DOMContentLoaded));
+  DispatchEvent(*Event::CreateBubble(EventTypeNames::DOMContentLoaded));
   if (document_timing_.DomContentLoadedEventEnd().is_null())
     document_timing_.MarkDomContentLoadedEventEnd();
   SetParsingState(kFinishedParsing);
@@ -5929,8 +5944,6 @@
 
   if (IsPrefetchOnly())
     WebPrerenderingSupport::Current()->PrefetchFinished();
-
-  FirstMeaningfulPaintDetector::From(*this).CheckNetworkStable();
 }
 
 void Document::ElementDataCacheClearTimerFired(TimerBase*) {
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index d9bb54c..7b38e0a 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -362,6 +362,12 @@
   Element* CreateRawElement(const QualifiedName&,
                             const CreateElementFlags = CreateElementFlags());
 
+  CSSStyleSheet* createEmptyCSSStyleSheet(ScriptState*,
+                                          const CSSStyleSheetInit&,
+                                          ExceptionState&);
+
+  CSSStyleSheet* createEmptyCSSStyleSheet(ScriptState*, ExceptionState&);
+
   ScriptPromise createCSSStyleSheet(ScriptState*,
                                     const String&,
                                     ExceptionState&);
@@ -1445,6 +1451,18 @@
 
   bool IsVerticalScrollEnforced() const { return is_vertical_scroll_enforced_; }
 
+  // TODO(binji): See http://crbug.com/798572. This implementation shares the
+  // same agent cluster ID for any one document. The proper implementation of
+  // this function must follow the rules described here:
+  // https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism.
+  //
+  // Even with this simple implementation, we can prevent sharing
+  // SharedArrayBuffers and WebAssembly modules with workers that happen to be
+  // in the same process.
+  const base::UnguessableToken& GetAgentClusterID() const final {
+    return agent_cluster_id_;
+  }
+
  protected:
   Document(const DocumentInit&, DocumentClassFlags = kDefaultDocumentClass);
 
@@ -1871,6 +1889,9 @@
 
   // This is set through feature policy 'vertical-scroll'.
   bool is_vertical_scroll_enforced_ = false;
+
+  // https://tc39.github.io/ecma262/#sec-agent-clusters
+  const base::UnguessableToken agent_cluster_id_;
 };
 
 extern template class CORE_EXTERN_TEMPLATE_EXPORT Supplement<Document>;
diff --git a/third_party/blink/renderer/core/dom/document.idl b/third_party/blink/renderer/core/dom/document.idl
index 7f86ca1..ea340c2 100644
--- a/third_party/blink/renderer/core/dom/document.idl
+++ b/third_party/blink/renderer/core/dom/document.idl
@@ -76,6 +76,8 @@
     [NewObject] Range createRange();
 
     [CallWith=ScriptState, NewObject, RaisesException, RuntimeEnabled=ConstructableStylesheets] Promise<CSSStyleSheet> createCSSStyleSheet(DOMString text, optional CSSStyleSheetInit options);
+    [CallWith=ScriptState, NewObject, RaisesException, RuntimeEnabled=ConstructableStylesheets] CSSStyleSheet createEmptyCSSStyleSheet(optional CSSStyleSheetInit options);
+
 
     // NodeFilter.SHOW_ALL = 0xFFFFFFFF
     [NewObject] NodeIterator createNodeIterator(Node root, optional unsigned long whatToShow = 0xFFFFFFFF, optional NodeFilter? filter = null);
diff --git a/third_party/blink/renderer/core/dom/document_init.cc b/third_party/blink/renderer/core/dom/document_init.cc
index 0dbe289..b1793b5 100644
--- a/third_party/blink/renderer/core/dom/document_init.cc
+++ b/third_party/blink/renderer/core/dom/document_init.cc
@@ -40,10 +40,11 @@
 namespace blink {
 
 // FIXME: Broken with OOPI.
-static Document* ParentDocument(LocalFrame* frame) {
-  DCHECK(frame);
+static Document* ParentDocument(DocumentLoader* loader) {
+  DCHECK(loader);
+  DCHECK(loader->GetFrame());
 
-  Element* owner_element = frame->DeprecatedLocalOwner();
+  Element* owner_element = loader->GetFrame()->DeprecatedLocalOwner();
   if (!owner_element)
     return nullptr;
   return &owner_element->GetDocument();
@@ -71,33 +72,37 @@
 DocumentInit::~DocumentInit() = default;
 
 bool DocumentInit::ShouldSetURL() const {
-  LocalFrame* frame = FrameForSecurityContext();
-  return (frame && frame->Tree().Parent()) || !url_.IsEmpty();
+  DocumentLoader* loader = MasterDocumentLoader();
+  return (loader && loader->GetFrame()->Tree().Parent()) || !url_.IsEmpty();
 }
 
 bool DocumentInit::ShouldTreatURLAsSrcdocDocument() const {
   return parent_document_ &&
-         frame_->Loader().ShouldTreatURLAsSrcdocDocument(url_);
+         document_loader_->GetFrame()->Loader().ShouldTreatURLAsSrcdocDocument(
+             url_);
 }
 
-LocalFrame* DocumentInit::FrameForSecurityContext() const {
-  if (frame_)
-    return frame_;
-  if (imports_controller_)
-    return imports_controller_->Master()->GetFrame();
+DocumentLoader* DocumentInit::MasterDocumentLoader() const {
+  if (document_loader_)
+    return document_loader_;
+  if (imports_controller_) {
+    return imports_controller_->Master()
+        ->GetFrame()
+        ->Loader()
+        .GetDocumentLoader();
+  }
   return nullptr;
 }
 
 SandboxFlags DocumentInit::GetSandboxFlags() const {
-  DCHECK(FrameForSecurityContext());
-  FrameLoader* loader = &FrameForSecurityContext()->Loader();
-  SandboxFlags flags = loader->EffectiveSandboxFlags();
+  DCHECK(MasterDocumentLoader());
+  DocumentLoader* loader = MasterDocumentLoader();
+  SandboxFlags flags = loader->GetFrame()->Loader().EffectiveSandboxFlags();
 
   // If the load was blocked by CSP, force the Document's origin to be unique,
   // so that the blocked document appears to be a normal cross-origin document's
   // load per CSP spec: https://www.w3.org/TR/CSP3/#directive-frame-ancestors.
-  if (loader->GetDocumentLoader() &&
-      loader->GetDocumentLoader()->WasBlockedAfterCSP()) {
+  if (loader->WasBlockedAfterCSP()) {
     flags |= kSandboxOrigin;
   }
 
@@ -105,48 +110,50 @@
 }
 
 WebInsecureRequestPolicy DocumentInit::GetInsecureRequestPolicy() const {
-  DCHECK(FrameForSecurityContext());
-  return FrameForSecurityContext()->Loader().GetInsecureRequestPolicy();
+  DCHECK(MasterDocumentLoader());
+  Frame* parent_frame = MasterDocumentLoader()->GetFrame()->Tree().Parent();
+  if (!parent_frame)
+    return kLeaveInsecureRequestsAlone;
+  return parent_frame->GetSecurityContext()->GetInsecureRequestPolicy();
 }
 
 SecurityContext::InsecureNavigationsSet*
 DocumentInit::InsecureNavigationsToUpgrade() const {
-  DCHECK(FrameForSecurityContext());
-  return FrameForSecurityContext()->Loader().InsecureNavigationsToUpgrade();
+  DCHECK(MasterDocumentLoader());
+  Frame* parent_frame = MasterDocumentLoader()->GetFrame()->Tree().Parent();
+  if (!parent_frame)
+    return nullptr;
+  return parent_frame->GetSecurityContext()->InsecureNavigationsToUpgrade();
 }
 
 bool DocumentInit::IsHostedInReservedIPRange() const {
-  if (LocalFrame* frame = FrameForSecurityContext()) {
-    if (DocumentLoader* loader =
-            frame->Loader().GetProvisionalDocumentLoader()
-                ? frame->Loader().GetProvisionalDocumentLoader()
-                : frame->Loader().GetDocumentLoader()) {
-      if (!loader->GetResponse().RemoteIPAddress().IsEmpty())
-        return NetworkUtils::IsReservedIPAddress(
-            loader->GetResponse().RemoteIPAddress());
+  if (DocumentLoader* loader = MasterDocumentLoader()) {
+    if (!loader->GetResponse().RemoteIPAddress().IsEmpty()) {
+      return NetworkUtils::IsReservedIPAddress(
+          loader->GetResponse().RemoteIPAddress());
     }
   }
   return false;
 }
 
 Settings* DocumentInit::GetSettings() const {
-  DCHECK(FrameForSecurityContext());
-  return FrameForSecurityContext()->GetSettings();
+  DCHECK(MasterDocumentLoader());
+  return MasterDocumentLoader()->GetFrame()->GetSettings();
 }
 
-KURL DocumentInit::ParentBaseURL() const {
-  return parent_document_->BaseURL();
-}
-
-DocumentInit& DocumentInit::WithFrame(LocalFrame* frame) {
-  DCHECK(!frame_);
+DocumentInit& DocumentInit::WithDocumentLoader(DocumentLoader* loader) {
+  DCHECK(!document_loader_);
   DCHECK(!imports_controller_);
-  frame_ = frame;
-  if (frame_)
-    parent_document_ = ParentDocument(frame_);
+  document_loader_ = loader;
+  if (document_loader_)
+    parent_document_ = ParentDocument(document_loader_);
   return *this;
 }
 
+LocalFrame* DocumentInit::GetFrame() const {
+  return document_loader_ ? document_loader_->GetFrame() : nullptr;
+}
+
 DocumentInit& DocumentInit::WithContextDocument(Document* context_document) {
   DCHECK(!context_document_);
   context_document_ = context_document;
diff --git a/third_party/blink/renderer/core/dom/document_init.h b/third_party/blink/renderer/core/dom/document_init.h
index 6ebf5351..e3d0dff0 100644
--- a/third_party/blink/renderer/core/dom/document_init.h
+++ b/third_party/blink/renderer/core/dom/document_init.h
@@ -41,6 +41,7 @@
 namespace blink {
 
 class Document;
+class DocumentLoader;
 class LocalFrame;
 class HTMLImportsController;
 class Settings;
@@ -56,7 +57,7 @@
   // Example:
   //
   //   DocumentInit init = DocumentInit::Create()
-  //       .WithFrame(frame)
+  //       .WithDocumentLoader(loader)
   //       .WithContextDocument(context_document)
   //       .WithURL(url);
   //   Document* document = Document::Create(init);
@@ -70,21 +71,18 @@
     return imports_controller_;
   }
 
-  bool HasSecurityContext() const { return FrameForSecurityContext(); }
+  bool HasSecurityContext() const { return MasterDocumentLoader(); }
   bool ShouldTreatURLAsSrcdocDocument() const;
   bool ShouldSetURL() const;
-  bool IsSeamlessAllowedFor(Document* child) const;
   SandboxFlags GetSandboxFlags() const;
   bool IsHostedInReservedIPRange() const;
   WebInsecureRequestPolicy GetInsecureRequestPolicy() const;
   SecurityContext::InsecureNavigationsSet* InsecureNavigationsToUpgrade() const;
 
-  KURL ParentBaseURL() const;
-  LocalFrame* OwnerFrame() const;
   Settings* GetSettings() const;
 
-  DocumentInit& WithFrame(LocalFrame*);
-  LocalFrame* GetFrame() const { return frame_; }
+  DocumentInit& WithDocumentLoader(DocumentLoader*);
+  LocalFrame* GetFrame() const;
 
   // Used by the DOMImplementation and DOMParser to pass their parent Document
   // so that the created Document will return the Document when the
@@ -106,9 +104,13 @@
  private:
   DocumentInit(HTMLImportsController*);
 
-  LocalFrame* FrameForSecurityContext() const;
+  // For a Document associated directly with a frame, this will be the
+  // DocumentLoader driving the commit. For an import, XSLT-generated
+  // document, etc., it will be the DocumentLoader that drove the commit
+  // of its owning Document.
+  DocumentLoader* MasterDocumentLoader() const;
 
-  Member<LocalFrame> frame_;
+  Member<DocumentLoader> document_loader_;
   Member<Document> parent_document_;
 
   Member<HTMLImportsController> imports_controller_;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index 086af79..eabb632 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3378,17 +3378,17 @@
 void Element::DispatchFocusEvent(Element* old_focused_element,
                                  WebFocusType type,
                                  InputDeviceCapabilities* source_capabilities) {
-  DispatchEvent(FocusEvent::Create(EventTypeNames::focus, Event::Bubbles::kNo,
-                                   GetDocument().domWindow(), 0,
-                                   old_focused_element, source_capabilities));
+  DispatchEvent(*FocusEvent::Create(EventTypeNames::focus, Event::Bubbles::kNo,
+                                    GetDocument().domWindow(), 0,
+                                    old_focused_element, source_capabilities));
 }
 
 void Element::DispatchBlurEvent(Element* new_focused_element,
                                 WebFocusType type,
                                 InputDeviceCapabilities* source_capabilities) {
-  DispatchEvent(FocusEvent::Create(EventTypeNames::blur, Event::Bubbles::kNo,
-                                   GetDocument().domWindow(), 0,
-                                   new_focused_element, source_capabilities));
+  DispatchEvent(*FocusEvent::Create(EventTypeNames::blur, Event::Bubbles::kNo,
+                                    GetDocument().domWindow(), 0,
+                                    new_focused_element, source_capabilities));
 }
 
 void Element::DispatchFocusInEvent(
@@ -3401,7 +3401,7 @@
 #endif
   DCHECK(event_type == EventTypeNames::focusin ||
          event_type == EventTypeNames::DOMFocusIn);
-  DispatchScopedEvent(FocusEvent::Create(
+  DispatchScopedEvent(*FocusEvent::Create(
       event_type, Event::Bubbles::kYes, GetDocument().domWindow(), 0,
       old_focused_element, source_capabilities));
 }
@@ -3415,7 +3415,7 @@
 #endif
   DCHECK(event_type == EventTypeNames::focusout ||
          event_type == EventTypeNames::DOMFocusOut);
-  DispatchScopedEvent(FocusEvent::Create(
+  DispatchScopedEvent(*FocusEvent::Create(
       event_type, Event::Bubbles::kYes, GetDocument().domWindow(), 0,
       new_focused_element, source_capabilities));
 }
diff --git a/third_party/blink/renderer/core/dom/events/event_dispatcher.cc b/third_party/blink/renderer/core/dom/events/event_dispatcher.cc
index 533a4ec..83fe71a8 100644
--- a/third_party/blink/renderer/core/dom/events/event_dispatcher.cc
+++ b/third_party/blink/renderer/core/dom/events/event_dispatcher.cc
@@ -49,27 +49,26 @@
 
 namespace blink {
 
-DispatchEventResult EventDispatcher::DispatchEvent(Node& node, Event* event) {
+DispatchEventResult EventDispatcher::DispatchEvent(Node& node, Event& event) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("blink.debug"),
                "EventDispatcher::dispatchEvent");
 #if DCHECK_IS_ON()
   DCHECK(!EventDispatchForbiddenScope::IsEventDispatchForbidden());
 #endif
   EventDispatcher dispatcher(node, event);
-  return event->DispatchEvent(dispatcher);
+  return event.DispatchEvent(dispatcher);
 }
 
-EventDispatcher::EventDispatcher(Node& node, Event* event)
+EventDispatcher::EventDispatcher(Node& node, Event& event)
     : node_(node), event_(event) {
-  DCHECK(event_.Get());
   view_ = node.GetDocument().View();
   event_->InitEventPath(*node_);
 }
 
-void EventDispatcher::DispatchScopedEvent(Node& node, Event* event) {
+void EventDispatcher::DispatchScopedEvent(Node& node, Event& event) {
   // We need to set the target here because it can go away by the time we
   // actually fire the event.
-  event->SetTarget(EventPath::EventTargetRespectingTargetRules(node));
+  event.SetTarget(EventPath::EventTargetRespectingTargetRules(node));
   ScopedEventQueue::Instance()->EnqueueEvent(event);
 }
 
@@ -95,20 +94,20 @@
   nodes_dispatching_simulated_clicks.insert(&node);
 
   if (mouse_event_options == kSendMouseOverUpDownEvents)
-    EventDispatcher(node, MouseEvent::Create(EventTypeNames::mouseover,
-                                             node.GetDocument().domWindow(),
-                                             underlying_event, creation_scope))
+    EventDispatcher(node, *MouseEvent::Create(EventTypeNames::mouseover,
+                                              node.GetDocument().domWindow(),
+                                              underlying_event, creation_scope))
         .Dispatch();
 
   if (mouse_event_options != kSendNoEvents) {
-    EventDispatcher(node, MouseEvent::Create(EventTypeNames::mousedown,
-                                             node.GetDocument().domWindow(),
-                                             underlying_event, creation_scope))
+    EventDispatcher(node, *MouseEvent::Create(EventTypeNames::mousedown,
+                                              node.GetDocument().domWindow(),
+                                              underlying_event, creation_scope))
         .Dispatch();
     node.SetActive(true);
-    EventDispatcher(node, MouseEvent::Create(EventTypeNames::mouseup,
-                                             node.GetDocument().domWindow(),
-                                             underlying_event, creation_scope))
+    EventDispatcher(node, *MouseEvent::Create(EventTypeNames::mouseup,
+                                              node.GetDocument().domWindow(),
+                                              underlying_event, creation_scope))
         .Dispatch();
   }
   // Some elements (e.g. the color picker) may set active state to true before
@@ -116,9 +115,9 @@
   node.SetActive(false);
 
   // always send click
-  EventDispatcher(node, MouseEvent::Create(EventTypeNames::click,
-                                           node.GetDocument().domWindow(),
-                                           underlying_event, creation_scope))
+  EventDispatcher(node, *MouseEvent::Create(EventTypeNames::click,
+                                            node.GetDocument().domWindow(),
+                                            underlying_event, creation_scope))
       .Dispatch();
 
   nodes_dispatching_simulated_clicks.erase(&node);
diff --git a/third_party/blink/renderer/core/dom/events/event_dispatcher.h b/third_party/blink/renderer/core/dom/events/event_dispatcher.h
index 5504bea..e09e49f 100644
--- a/third_party/blink/renderer/core/dom/events/event_dispatcher.h
+++ b/third_party/blink/renderer/core/dom/events/event_dispatcher.h
@@ -52,8 +52,8 @@
   STACK_ALLOCATED();
 
  public:
-  static DispatchEventResult DispatchEvent(Node&, Event*);
-  static void DispatchScopedEvent(Node&, Event*);
+  static DispatchEventResult DispatchEvent(Node&, Event&);
+  static void DispatchScopedEvent(Node&, Event&);
 
   static void DispatchSimulatedClick(Node&,
                                      Event* underlying_event,
@@ -65,7 +65,7 @@
   Event& GetEvent() const { return *event_; }
 
  private:
-  EventDispatcher(Node&, Event*);
+  EventDispatcher(Node&, Event&);
 
   EventDispatchContinuation DispatchEventPreProcess(
       Node* activation_target,
diff --git a/third_party/blink/renderer/core/dom/events/event_queue.cc b/third_party/blink/renderer/core/dom/events/event_queue.cc
index 53166a9..acedb80f 100644
--- a/third_party/blink/renderer/core/dom/events/event_queue.cc
+++ b/third_party/blink/renderer/core/dom/events/event_queue.cc
@@ -102,9 +102,9 @@
   probe::AsyncTask async_task(GetExecutionContext(), event);
   EventTarget* target = event->target();
   if (LocalDOMWindow* window = target->ToLocalDOMWindow())
-    window->DispatchEvent(event, nullptr);
+    window->DispatchEvent(*event, nullptr);
   else
-    target->DispatchEvent(event);
+    target->DispatchEvent(*event);
 }
 
 void EventQueue::ContextDestroyed(ExecutionContext* context) {
diff --git a/third_party/blink/renderer/core/dom/events/event_target.cc b/third_party/blink/renderer/core/dom/events/event_target.cc
index ede06503..4797cf2c 100644
--- a/third_party/blink/renderer/core/dom/events/event_target.cc
+++ b/third_party/blink/renderer/core/dom/events/event_target.cc
@@ -113,17 +113,17 @@
 }
 
 base::TimeDelta BlockedEventsWarningThreshold(ExecutionContext* context,
-                                              const Event* event) {
-  if (!event->cancelable())
+                                              const Event& event) {
+  if (!event.cancelable())
     return base::TimeDelta();
-  if (!IsScrollBlockingEvent(event->type()))
+  if (!IsScrollBlockingEvent(event.type()))
     return base::TimeDelta();
   return PerformanceMonitor::Threshold(context,
                                        PerformanceMonitor::kBlockedEvent);
 }
 
 void ReportBlockedEvent(ExecutionContext* context,
-                        const Event* event,
+                        const Event& event,
                         RegisteredEventListener* registered_listener,
                         base::TimeDelta delayed) {
   if (registered_listener->Callback()->GetType() !=
@@ -135,7 +135,7 @@
       " ms due to main thread being busy. "
       "Consider marking event handler as 'passive' to make the page more "
       "responsive.",
-      event->type().GetString().Utf8().data(), delayed.InMilliseconds());
+      event.type().GetString().Utf8().data(), delayed.InMilliseconds());
 
   PerformanceMonitor::ReportGenericViolation(
       context, PerformanceMonitor::kBlockedEvent, message_text, delayed,
@@ -145,11 +145,11 @@
 
 // UseCounts the event if it has the specified type. Returns true iff the event
 // type matches.
-bool CheckTypeThenUseCount(const Event* event,
+bool CheckTypeThenUseCount(const Event& event,
                            const AtomicString& event_type_to_count,
                            const WebFeature feature,
                            const Document* document) {
-  if (event->type() != event_type_to_count)
+  if (event.type() != event_type_to_count)
     return false;
   UseCounter::Count(*document, feature);
   return true;
@@ -570,40 +570,40 @@
   // Return whether the event was cancelled or not to JS not that it
   // might have actually been default handled; so check only against
   // CanceledByEventHandler.
-  return DispatchEventInternal(event) !=
+  return DispatchEventInternal(*event) !=
          DispatchEventResult::kCanceledByEventHandler;
 }
 
-DispatchEventResult EventTarget::DispatchEvent(Event* event) {
-  event->SetTrusted(true);
+DispatchEventResult EventTarget::DispatchEvent(Event& event) {
+  event.SetTrusted(true);
   return DispatchEventInternal(event);
 }
 
-DispatchEventResult EventTarget::DispatchEventInternal(Event* event) {
-  event->SetTarget(this);
-  event->SetCurrentTarget(this);
-  event->SetEventPhase(Event::kAtTarget);
+DispatchEventResult EventTarget::DispatchEventInternal(Event& event) {
+  event.SetTarget(this);
+  event.SetCurrentTarget(this);
+  event.SetEventPhase(Event::kAtTarget);
   DispatchEventResult dispatch_result = FireEventListeners(event);
-  event->SetEventPhase(0);
+  event.SetEventPhase(0);
   return dispatch_result;
 }
 
 void EventTarget::UncaughtExceptionInEventHandler() {}
 
-static const AtomicString& LegacyType(const Event* event) {
-  if (event->type() == EventTypeNames::transitionend)
+static const AtomicString& LegacyType(const Event& event) {
+  if (event.type() == EventTypeNames::transitionend)
     return EventTypeNames::webkitTransitionEnd;
 
-  if (event->type() == EventTypeNames::animationstart)
+  if (event.type() == EventTypeNames::animationstart)
     return EventTypeNames::webkitAnimationStart;
 
-  if (event->type() == EventTypeNames::animationend)
+  if (event.type() == EventTypeNames::animationend)
     return EventTypeNames::webkitAnimationEnd;
 
-  if (event->type() == EventTypeNames::animationiteration)
+  if (event.type() == EventTypeNames::animationiteration)
     return EventTypeNames::webkitAnimationIteration;
 
-  if (event->type() == EventTypeNames::wheel)
+  if (event.type() == EventTypeNames::wheel)
     return EventTypeNames::mousewheel;
 
   return g_empty_atom;
@@ -658,12 +658,11 @@
   }
 }
 
-DispatchEventResult EventTarget::FireEventListeners(Event* event) {
+DispatchEventResult EventTarget::FireEventListeners(Event& event) {
 #if DCHECK_IS_ON()
   DCHECK(!EventDispatchForbiddenScope::IsEventDispatchForbidden());
 #endif
-  DCHECK(event);
-  DCHECK(event->WasInitialized());
+  DCHECK(event.WasInitialized());
 
   EventTargetData* d = GetEventTargetData();
   if (!d)
@@ -675,33 +674,33 @@
     legacy_listeners_vector = d->event_listener_map.Find(legacy_type_name);
 
   EventListenerVector* listeners_vector =
-      d->event_listener_map.Find(event->type());
+      d->event_listener_map.Find(event.type());
 
   bool fired_event_listeners = false;
   if (listeners_vector) {
     fired_event_listeners = FireEventListeners(event, d, *listeners_vector);
-  } else if (event->isTrusted() && legacy_listeners_vector) {
-    AtomicString unprefixed_type_name = event->type();
-    event->SetType(legacy_type_name);
+  } else if (event.isTrusted() && legacy_listeners_vector) {
+    AtomicString unprefixed_type_name = event.type();
+    event.SetType(legacy_type_name);
     fired_event_listeners =
         FireEventListeners(event, d, *legacy_listeners_vector);
-    event->SetType(unprefixed_type_name);
+    event.SetType(unprefixed_type_name);
   }
 
   // Only invoke the callback if event listeners were fired for this phase.
   if (fired_event_listeners) {
-    event->DoneDispatchingEventAtCurrentTarget();
-    event->SetExecutedListenerOrDefaultAction();
+    event.DoneDispatchingEventAtCurrentTarget();
+    event.SetExecutedListenerOrDefaultAction();
 
     // Only count uma metrics if we really fired an event listener.
     Editor::CountEvent(GetExecutionContext(), event);
     CountLegacyEvents(legacy_type_name, listeners_vector,
                       legacy_listeners_vector);
   }
-  return GetDispatchEventResult(*event);
+  return GetDispatchEventResult(event);
 }
 
-bool EventTarget::FireEventListeners(Event* event,
+bool EventTarget::FireEventListeners(Event& event,
                                      EventTargetData* d,
                                      EventListenerVector& entry) {
   // Fire all listeners registered for this event. Don't fire listeners removed
@@ -747,8 +746,8 @@
       } else if (CheckTypeThenUseCount(event, EventTypeNames::pointerdown,
                                        WebFeature::kPointerDownFired,
                                        document)) {
-        if (event->IsPointerEvent() &&
-            static_cast<PointerEvent*>(event)->pointerType() == "touch") {
+        if (event.IsPointerEvent() &&
+            static_cast<PointerEvent&>(event).pointerType() == "touch") {
           UseCounter::Count(*document, WebFeature::kPointerDownFiredForTouch);
         }
       } else if (CheckTypeThenUseCount(event, EventTypeNames::pointerenter,
@@ -763,8 +762,8 @@
       } else if (CheckTypeThenUseCount(event, EventTypeNames::pointerout,
                                        WebFeature::kPointerOverOutFired,
                                        document)) {
-      } else if (event->eventPhase() == Event::kCapturingPhase ||
-                 event->eventPhase() == Event::kBubblingPhase) {
+      } else if (event.eventPhase() == Event::kCapturingPhase ||
+                 event.eventPhase() == Event::kBubblingPhase) {
         if (CheckTypeThenUseCount(
                 event, EventTypeNames::DOMNodeRemoved,
                 WebFeature::kDOMNodeRemovedEventListenedAtNonTarget,
@@ -788,7 +787,7 @@
   if (!d->firing_event_iterators)
     d->firing_event_iterators = std::make_unique<FiringEventIteratorVector>();
   d->firing_event_iterators->push_back(
-      FiringEventIterator(event->type(), i, size));
+      FiringEventIterator(event.type(), i, size));
 
   base::TimeDelta blocked_event_threshold =
       BlockedEventsWarningThreshold(context, event);
@@ -797,7 +796,7 @@
   if (!blocked_event_threshold.is_zero()) {
     now = CurrentTimeTicks();
     should_report_blocked_event =
-        now - event->PlatformTimeStamp() > blocked_event_threshold;
+        now - event.PlatformTimeStamp() > blocked_event_threshold;
   }
   bool fired_listener = false;
 
@@ -809,10 +808,10 @@
     // EventTarget::removeEventListener.
     ++i;
 
-    if (event->eventPhase() == Event::kCapturingPhase &&
+    if (event.eventPhase() == Event::kCapturingPhase &&
         !registered_listener.Capture())
       continue;
-    if (event->eventPhase() == Event::kBubblingPhase &&
+    if (event.eventPhase() == Event::kBubblingPhase &&
         registered_listener.Capture())
       continue;
 
@@ -821,25 +820,25 @@
     // registeredListener, i and size are updated with the firing event iterator
     // in case the listener is removed from the listener vector below.
     if (registered_listener.Once())
-      removeEventListener(event->type(), listener,
+      removeEventListener(event.type(), listener,
                           registered_listener.Capture());
 
     // If stopImmediatePropagation has been called, we just break out
     // immediately, without handling any more events on this target.
-    if (event->ImmediatePropagationStopped())
+    if (event.ImmediatePropagationStopped())
       break;
 
-    event->SetHandlingPassive(EventPassiveMode(registered_listener));
+    event.SetHandlingPassive(EventPassiveMode(registered_listener));
     bool passive_forced = registered_listener.PassiveForcedForDocumentTarget();
 
-    probe::UserCallback probe(context, nullptr, event->type(), false, this);
+    probe::UserCallback probe(context, nullptr, event.type(), false, this);
     probe::AsyncTask async_task(
         context, V8AbstractEventListener::Cast(listener), "event",
-        IsInstrumentedForAsyncStack(event->type()));
+        IsInstrumentedForAsyncStack(event.type()));
 
     // To match Mozilla, the AT_TARGET phase fires both capturing and bubbling
     // event listeners, even though that violates some versions of the DOM spec.
-    listener->handleEvent(context, event);
+    listener->handleEvent(context, &event);
     fired_listener = true;
 
     // If we're about to report this event listener as blocking, make sure it
@@ -847,9 +846,9 @@
     if (should_report_blocked_event && i > 0 &&
         entry[i - 1].Callback() == listener && !entry[i - 1].Passive() &&
         !entry[i - 1].BlockedEventWarningEmitted() &&
-        !event->defaultPrevented()) {
+        !event.defaultPrevented()) {
       ReportBlockedEvent(context, event, &entry[i - 1],
-                         now - event->PlatformTimeStamp());
+                         now - event.PlatformTimeStamp());
     }
 
     if (passive_forced) {
@@ -857,13 +856,13 @@
                           ("Event.PassiveForcedEventDispatchCancelled",
                            kPassiveForcedListenerResultTypeMax));
       PassiveForcedListenerResultType breakage_type = kPreventDefaultNotCalled;
-      if (event->PreventDefaultCalledDuringPassive())
+      if (event.PreventDefaultCalledDuringPassive())
         breakage_type = kDocumentLevelTouchPreventDefaultCalled;
 
       passive_forced_histogram.Count(breakage_type);
     }
 
-    event->SetHandlingPassive(Event::PassiveMode::kNotPassive);
+    event.SetHandlingPassive(Event::PassiveMode::kNotPassive);
 
     CHECK_LE(i, size);
   }
@@ -926,7 +925,7 @@
     return;
   }
   probe::AsyncTask async_task(context, event);
-  DispatchEvent(event);
+  DispatchEvent(*event);
 }
 
 STATIC_ASSERT_ENUM(WebSettings::PassiveEventListenerDefault::kFalse,
diff --git a/third_party/blink/renderer/core/dom/events/event_target.h b/third_party/blink/renderer/core/dom/events/event_target.h
index 4e26491..7c33c10 100644
--- a/third_party/blink/renderer/core/dom/events/event_target.h
+++ b/third_party/blink/renderer/core/dom/events/event_target.h
@@ -154,7 +154,7 @@
                            EventListenerOptions&);
   virtual void RemoveAllEventListeners();
 
-  DispatchEventResult DispatchEvent(Event*);
+  DispatchEventResult DispatchEvent(Event&);
 
   void EnqueueEvent(Event*, TaskType);
 
@@ -175,13 +175,14 @@
   EventListenerVector* GetEventListeners(const AtomicString& event_type);
   Vector<AtomicString> EventTypes();
 
-  DispatchEventResult FireEventListeners(Event*);
+  DispatchEventResult FireEventListeners(Event&);
 
   static DispatchEventResult GetDispatchEventResult(const Event&);
 
   virtual bool KeepEventInNode(Event*) { return false; }
 
-  // Returns true if the target is window, window.document, or window.document.body.
+  // Returns true if the target is window, window.document, or
+  // window.document.body.
   bool IsTopLevelNode();
 
  protected:
@@ -203,7 +204,7 @@
   virtual void RemovedEventListener(const AtomicString& event_type,
                                     const RegisteredEventListener&);
 
-  virtual DispatchEventResult DispatchEventInternal(Event*);
+  virtual DispatchEventResult DispatchEventInternal(Event&);
 
   // Subclasses should likely not override these themselves; instead, they
   // should subclass EventTargetWithInlineData.
@@ -219,7 +220,7 @@
   RegisteredEventListener* GetAttributeRegisteredEventListener(
       const AtomicString& event_type);
 
-  bool FireEventListeners(Event*, EventTargetData*, EventListenerVector&);
+  bool FireEventListeners(Event&, EventTargetData*, EventListenerVector&);
   void CountLegacyEvents(const AtomicString& legacy_type_name,
                          EventListenerVector*,
                          EventListenerVector*);
diff --git a/third_party/blink/renderer/core/dom/events/scoped_event_queue.cc b/third_party/blink/renderer/core/dom/events/scoped_event_queue.cc
index af89d3b..fc03321 100644
--- a/third_party/blink/renderer/core/dom/events/scoped_event_queue.cc
+++ b/third_party/blink/renderer/core/dom/events/scoped_event_queue.cc
@@ -55,7 +55,7 @@
   instance_ = instance.release();
 }
 
-void ScopedEventQueue::EnqueueEvent(Event* event) {
+void ScopedEventQueue::EnqueueEvent(Event& event) {
   if (ShouldQueueEvents())
     queued_events_.push_back(event);
   else
@@ -67,12 +67,12 @@
   queued_events.swap(queued_events_);
 
   for (auto& event : queued_events)
-    DispatchEvent(event);
+    DispatchEvent(*event);
 }
 
-void ScopedEventQueue::DispatchEvent(Event* event) const {
-  DCHECK(event->target());
-  Node* node = event->target()->ToNode();
+void ScopedEventQueue::DispatchEvent(Event& event) const {
+  DCHECK(event.target());
+  Node* node = event.target()->ToNode();
   EventDispatcher::DispatchEvent(*node, event);
 }
 
diff --git a/third_party/blink/renderer/core/dom/events/scoped_event_queue.h b/third_party/blink/renderer/core/dom/events/scoped_event_queue.h
index e91711d6..a90b9a0 100644
--- a/third_party/blink/renderer/core/dom/events/scoped_event_queue.h
+++ b/third_party/blink/renderer/core/dom/events/scoped_event_queue.h
@@ -46,7 +46,7 @@
  public:
   ~ScopedEventQueue();
 
-  void EnqueueEvent(Event*);
+  void EnqueueEvent(Event&);
   static ScopedEventQueue* Instance();
 
   void IncrementScopingLevel();
@@ -57,7 +57,7 @@
   ScopedEventQueue();
   static void Initialize();
   void DispatchAllEvents();
-  void DispatchEvent(Event*) const;
+  void DispatchEvent(Event&) const;
 
   PersistentHeapVector<Member<Event>> queued_events_;
   unsigned scoping_level_;
diff --git a/third_party/blink/renderer/core/dom/events/window_event_context.cc b/third_party/blink/renderer/core/dom/events/window_event_context.cc
index ebddd9b..cf6ac7fe 100644
--- a/third_party/blink/renderer/core/dom/events/window_event_context.cc
+++ b/third_party/blink/renderer/core/dom/events/window_event_context.cc
@@ -53,7 +53,7 @@
 
   event.SetTarget(Target());
   event.SetCurrentTarget(Window());
-  window_->FireEventListeners(&event);
+  window_->FireEventListeners(event);
   return true;
 }
 
diff --git a/third_party/blink/renderer/core/dom/flat_tree_traversal.cc b/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
index 8f8dff21..f98a8b5 100644
--- a/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
+++ b/third_party/blink/renderer/core/dom/flat_tree_traversal.cc
@@ -64,23 +64,6 @@
   return child;
 }
 
-// This needs only for v0
-// Node* FlatTreeTraversalNg::ResolveDistributionStartingAt(
-//     const Node* node,
-//     TraversalDirection direction) {
-//   if (!node)
-//     return nullptr;
-//   for (const Node* sibling = node; sibling;
-//        sibling = (direction == kTraversalDirectionForward
-//                       ? sibling->nextSibling()
-//                       : sibling->previousSibling())) {
-//     if (node->IsInV0ShadowTree())
-//       return V0ResolveDistributionStartingAt(*sibling, direction);
-//     return const_cast<Node*>(sibling);
-//   }
-//   return nullptr;
-// }
-
 Node* FlatTreeTraversal::V0ResolveDistributionStartingAt(
     const Node& node,
     TraversalDirection direction) {
@@ -125,13 +108,6 @@
     if (Node* found = V0ResolveDistributionStartingAt(*sibling, direction))
       return found;
   }
-
-  // // Slotted nodes are already handled in traverseSiblingsForV1HostChild()
-  // // above, here is for fallback contents.
-  // if (auto* slot = ToHTMLSlotElementOrNull(node.parentElement())) {
-  //   if (slot->SupportsAssignment() && slot->AssignedNodes().IsEmpty())
-  //     return TraverseSiblings(*slot, direction);
-  // }
   return nullptr;
 }
 
diff --git a/third_party/blink/renderer/core/dom/flat_tree_traversal.h b/third_party/blink/renderer/core/dom/flat_tree_traversal.h
index d741cc3..31054b6b 100644
--- a/third_party/blink/renderer/core/dom/flat_tree_traversal.h
+++ b/third_party/blink/renderer/core/dom/flat_tree_traversal.h
@@ -49,9 +49,6 @@
 // |InsertionPoint::isActive()| for details of active insertion points, since
 // they aren't appeared in the flat tree. |assertPrecondition()| and
 // |assertPostCondition()| check this condition.
-//
-// FIXME: Make some functions inline to optimise the performance.
-// https://bugs.webkit.org/show_bug.cgi?id=82702
 class CORE_EXPORT FlatTreeTraversal {
   STATIC_ONLY(FlatTreeTraversal);
 
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc
index 5629f817..a9d1b695 100644
--- a/third_party/blink/renderer/core/dom/node.cc
+++ b/third_party/blink/renderer/core/dom/node.cc
@@ -2261,15 +2261,15 @@
     return;
   }
 
-  FireEventListeners(&event);
+  FireEventListeners(event);
 }
 
-void Node::DispatchScopedEvent(Event* event) {
-  event->SetTrusted(true);
+void Node::DispatchScopedEvent(Event& event) {
+  event.SetTrusted(true);
   EventDispatcher::DispatchScopedEvent(*this, event);
 }
 
-DispatchEventResult Node::DispatchEventInternal(Event* event) {
+DispatchEventResult Node::DispatchEventInternal(Event& event) {
   return EventDispatcher::DispatchEvent(*this, event);
 }
 
@@ -2284,8 +2284,8 @@
   if (!GetDocument().HasListenerType(Document::kDOMSubtreeModifiedListener))
     return;
 
-  DispatchScopedEvent(MutationEvent::Create(EventTypeNames::DOMSubtreeModified,
-                                            Event::Bubbles::kYes));
+  DispatchScopedEvent(*MutationEvent::Create(EventTypeNames::DOMSubtreeModified,
+                                             Event::Bubbles::kYes));
 }
 
 DispatchEventResult Node::DispatchDOMActivateEvent(int detail,
@@ -2293,16 +2293,16 @@
 #if DCHECK_IS_ON()
   DCHECK(!EventDispatchForbiddenScope::IsEventDispatchForbidden());
 #endif
-  UIEvent* event = UIEvent::Create();
-  event->initUIEvent(EventTypeNames::DOMActivate, true, true,
-                     GetDocument().domWindow(), detail);
-  event->SetUnderlyingEvent(&underlying_event);
-  event->SetComposed(underlying_event.composed());
+  UIEvent& event = *UIEvent::Create();
+  event.initUIEvent(EventTypeNames::DOMActivate, true, true,
+                    GetDocument().domWindow(), detail);
+  event.SetUnderlyingEvent(&underlying_event);
+  event.SetComposed(underlying_event.composed());
   DispatchScopedEvent(event);
 
   // TODO(dtapuska): Dispatching scoped events shouldn't check the return
   // type because the scoped event could get put off in the delayed queue.
-  return EventTarget::GetDispatchEventResult(*event);
+  return EventTarget::GetDispatchEventResult(event);
 }
 
 void Node::CreateAndDispatchPointerEvent(const AtomicString& mouse_event_name,
@@ -2347,7 +2347,7 @@
       static_cast<WebInputEvent::Modifiers>(mouse_event.GetModifiers()));
   pointer_event_init.setView(view);
 
-  DispatchEvent(PointerEvent::Create(pointer_event_name, pointer_event_init));
+  DispatchEvent(*PointerEvent::Create(pointer_event_name, pointer_event_init));
 }
 
 // TODO(crbug.com/665924): This function bypasses all Blink event path.
@@ -2385,7 +2385,7 @@
                                       ->FiresTouchEvents(event.FromTouch())
                                 : nullptr);
 
-  DispatchEvent(MouseEvent::Create(
+  DispatchEvent(*MouseEvent::Create(
       mouse_event_type, initializer, event.TimeStamp(),
       event.FromTouch() ? MouseEvent::kFromTouch
                         : MouseEvent::kRealOrIndistinguishable,
@@ -2401,7 +2401,7 @@
 
 void Node::DispatchInputEvent() {
   // Legacy 'input' event for forms set value and checked.
-  DispatchScopedEvent(Event::CreateBubble(EventTypeNames::input));
+  DispatchScopedEvent(*Event::CreateBubble(EventTypeNames::input));
 }
 
 void Node::DefaultEventHandler(Event* event) {
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h
index 3b04cb2..1e2b4d7 100644
--- a/third_party/blink/renderer/core/dom/node.h
+++ b/third_party/blink/renderer/core/dom/node.h
@@ -776,7 +776,7 @@
   }
   virtual void PostDispatchEventHandler(Event*, EventDispatchHandlingState*) {}
 
-  void DispatchScopedEvent(Event*);
+  void DispatchScopedEvent(Event&);
 
   virtual void HandleLocalEvents(Event&);
 
@@ -959,7 +959,7 @@
                           RegisteredEventListener&) override;
   void RemovedEventListener(const AtomicString& event_type,
                             const RegisteredEventListener&) override;
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
 
   bool HasRareData() const { return GetFlag(kHasRareDataFlag); }
 
diff --git a/third_party/blink/renderer/core/dom/scripted_animation_controller.cc b/third_party/blink/renderer/core/dom/scripted_animation_controller.cc
index 7921474a..ac322f2d 100644
--- a/third_party/blink/renderer/core/dom/scripted_animation_controller.cc
+++ b/third_party/blink/renderer/core/dom/scripted_animation_controller.cc
@@ -122,7 +122,7 @@
     if (LocalDOMWindow* window = event_target->ToLocalDOMWindow())
       window->DispatchEvent(event, nullptr);
     else
-      event_target->DispatchEvent(event);
+      event_target->DispatchEvent(*event);
   }
 }
 
diff --git a/third_party/blink/renderer/core/dom/slot_assignment.cc b/third_party/blink/renderer/core/dom/slot_assignment.cc
index 4049af22..a4dc566 100644
--- a/third_party/blink/renderer/core/dom/slot_assignment.cc
+++ b/third_party/blink/renderer/core/dom/slot_assignment.cc
@@ -9,12 +9,10 @@
 #include "third_party/blink/renderer/core/dom/node_traversal.h"
 #include "third_party/blink/renderer/core/dom/shadow_root.h"
 #include "third_party/blink/renderer/core/dom/slot_assignment_engine.h"
-#include "third_party/blink/renderer/core/dom/v0_insertion_point.h"
 #include "third_party/blink/renderer/core/html/forms/html_opt_group_element.h"
 #include "third_party/blink/renderer/core/html/forms/html_select_element.h"
 #include "third_party/blink/renderer/core/html/html_details_element.h"
 #include "third_party/blink/renderer/core/html/html_slot_element.h"
-#include "third_party/blink/renderer/core/html_names.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/dom/slot_assignment.h b/third_party/blink/renderer/core/dom/slot_assignment.h
index 579df6a1..ff94d9c 100644
--- a/third_party/blink/renderer/core/dom/slot_assignment.h
+++ b/third_party/blink/renderer/core/dom/slot_assignment.h
@@ -7,10 +7,7 @@
 
 #include "third_party/blink/renderer/core/dom/tree_ordered_map.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-#include "third_party/blink/renderer/platform/wtf/hash_map.h"
 #include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
-#include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/core/editing/BUILD.gn b/third_party/blink/renderer/core/editing/BUILD.gn
index ea78e47..9b6c9a7 100644
--- a/third_party/blink/renderer/core/editing/BUILD.gn
+++ b/third_party/blink/renderer/core/editing/BUILD.gn
@@ -105,6 +105,8 @@
     "commands/unlink_command.h",
     "commands/wrap_contents_in_dummy_span_command.cc",
     "commands/wrap_contents_in_dummy_span_command.h",
+    "compute_layer_selection.cc",
+    "compute_layer_selection.h",
     "dom_selection.cc",
     "dom_selection.h",
     "drag_caret.cc",
@@ -237,8 +239,6 @@
     "position_with_affinity.h",
     "relocatable_position.cc",
     "relocatable_position.h",
-    "rendered_position.cc",
-    "rendered_position.h",
     "reveal_selection_scope.cc",
     "reveal_selection_scope.h",
     "selection_adjuster.cc",
@@ -351,6 +351,7 @@
     "commands/set_character_data_command_test.cc",
     "commands/split_text_node_command_test.cc",
     "commands/typing_command_test.cc",
+    "compute_layer_selection_test.cc",
     "editing_strategy_test.cc",
     "editing_style_test.cc",
     "editing_utilities_test.cc",
@@ -394,7 +395,6 @@
     "position_test.cc",
     "position_with_affinity_test.cc",
     "relocatable_position_test.cc",
-    "rendered_position_test.cc",
     "selection_adjuster_test.cc",
     "selection_controller_test.cc",
     "selection_modifier_character_test.cc",
diff --git a/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc b/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc
index ec22fd5..f73e198 100644
--- a/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc
+++ b/third_party/blink/renderer/core/editing/commands/clipboard_commands.cc
@@ -115,7 +115,7 @@
                                : DataObject::CreateFromClipboard(paste_mode));
 
   Event* const evt = ClipboardEvent::Create(event_type, data_transfer);
-  target->DispatchEvent(evt);
+  target->DispatchEvent(*evt);
   const bool no_default_processing = evt->defaultPrevented();
   if (no_default_processing && policy == DataTransferAccessPolicy::kWritable) {
     SystemClipboard::GetInstance().WriteDataObject(
@@ -328,7 +328,7 @@
   Element* const target = FindEventTargetForClipboardEvent(frame, source);
   if (!target)
     return;
-  target->DispatchEvent(TextEvent::CreateForFragmentPaste(
+  target->DispatchEvent(*TextEvent::CreateForFragmentPaste(
       frame.DomWindow(), pasting_fragment, smart_replace, match_style));
 }
 
@@ -338,7 +338,7 @@
   Element* const target = FindEventTargetForClipboardEvent(frame, source);
   if (!target)
     return;
-  target->DispatchEvent(TextEvent::CreateForPlainTextPaste(
+  target->DispatchEvent(*TextEvent::CreateForPlainTextPaste(
       frame.DomWindow(), SystemClipboard::GetInstance().ReadPlainText(),
       CanSmartReplaceInClipboard(frame)));
 }
diff --git a/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc b/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc
index fe65f08c..98e2d27d 100644
--- a/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc
+++ b/third_party/blink/renderer/core/editing/commands/editing_commands_utilities.cc
@@ -579,11 +579,11 @@
                                           Element* end_root) {
   if (start_root) {
     start_root->DispatchEvent(
-        Event::Create(EventTypeNames::webkitEditableContentChanged));
+        *Event::Create(EventTypeNames::webkitEditableContentChanged));
   }
   if (end_root && end_root != start_root) {
     end_root->DispatchEvent(
-        Event::Create(EventTypeNames::webkitEditableContentChanged));
+        *Event::Create(EventTypeNames::webkitEditableContentChanged));
   }
 }
 
@@ -597,7 +597,7 @@
   // http://w3c.github.io/editing/input-events.html#dom-inputevent-inputtype
   InputEvent* const input_event =
       InputEvent::CreateInput(input_type, data, is_composing, nullptr);
-  target->DispatchScopedEvent(input_event);
+  target->DispatchScopedEvent(*input_event);
 }
 
 void DispatchInputEventEditableContentChanged(
diff --git a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
index 2832a98..d812da07 100644
--- a/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/replace_selection_command.cc
@@ -212,7 +212,7 @@
       String original_text = fragment_->textContent();
       BeforeTextInsertedEvent* event =
           BeforeTextInsertedEvent::Create(original_text);
-      editable_root->DispatchEvent(event);
+      editable_root->DispatchEvent(*event);
       if (original_text != event->GetText()) {
         fragment_ = CreateFragmentFromText(
             selection.ToNormalizedEphemeralRange(), event->GetText());
@@ -244,7 +244,7 @@
 
   // Give the root a chance to change the text.
   BeforeTextInsertedEvent* evt = BeforeTextInsertedEvent::Create(text);
-  editable_root->DispatchEvent(evt);
+  editable_root->DispatchEvent(*evt);
   if (text != evt->GetText() || !HasRichlyEditableStyle(*editable_root)) {
     RestoreAndRemoveTestRenderingNodesToFragment(holder);
 
diff --git a/third_party/blink/renderer/core/editing/commands/typing_command.cc b/third_party/blink/renderer/core/editing/commands/typing_command.cc
index 327bb72..e877e165 100644
--- a/third_party/blink/renderer/core/editing/commands/typing_command.cc
+++ b/third_party/blink/renderer/core/editing/commands/typing_command.cc
@@ -74,7 +74,7 @@
   // necessary.
   const Document& document = start_node->GetDocument();
   BeforeTextInsertedEvent* evt = BeforeTextInsertedEvent::Create(text);
-  RootEditableElement(*start_node)->DispatchEvent(evt);
+  RootEditableElement(*start_node)->DispatchEvent(*evt);
   if (IsValidDocument(document) && selection.IsValidFor(document))
     return evt->GetText();
   // editing/inserting/webkitBeforeTextInserted-removes-frame.html
@@ -98,7 +98,7 @@
   TextEvent* event = TextEvent::Create(frame->DomWindow(), text,
                                        kTextEventInputIncrementalInsertion);
   event->SetUnderlyingEvent(nullptr);
-  DispatchEventResult result = target->DispatchEvent(event);
+  DispatchEventResult result = target->DispatchEvent(*event);
   if (IsValidDocument(document))
     return result;
   // editing/inserting/insert-text-remove-iframe-on-textInput-event.html
@@ -147,7 +147,7 @@
   const Document& document = element->GetDocument();
   BeforeTextInsertedEvent* event =
       BeforeTextInsertedEvent::Create(String("\n"));
-  element->DispatchEvent(event);
+  element->DispatchEvent(*event);
   // event may invalidate frame or selection
   if (IsValidDocument(document) && selection.IsValidFor(document))
     return event->GetText().length();
diff --git a/third_party/blink/renderer/core/editing/rendered_position.cc b/third_party/blink/renderer/core/editing/compute_layer_selection.cc
similarity index 98%
rename from third_party/blink/renderer/core/editing/rendered_position.cc
rename to third_party/blink/renderer/core/editing/compute_layer_selection.cc
index f5e38f3..4f69de9c 100644
--- a/third_party/blink/renderer/core/editing/rendered_position.cc
+++ b/third_party/blink/renderer/core/editing/compute_layer_selection.cc
@@ -28,7 +28,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "third_party/blink/renderer/core/editing/rendered_position.h"
+#include "third_party/blink/renderer/core/editing/compute_layer_selection.h"
 
 #include "cc/layers/picture_layer.h"
 #include "third_party/blink/renderer/core/editing/editing_utilities.h"
diff --git a/third_party/blink/renderer/core/editing/rendered_position.h b/third_party/blink/renderer/core/editing/compute_layer_selection.h
similarity index 85%
rename from third_party/blink/renderer/core/editing/rendered_position.h
rename to third_party/blink/renderer/core/editing/compute_layer_selection.h
index 722d186..a7a6637 100644
--- a/third_party/blink/renderer/core/editing/rendered_position.h
+++ b/third_party/blink/renderer/core/editing/compute_layer_selection.h
@@ -28,10 +28,8 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_RENDERED_POSITION_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_RENDERED_POSITION_H_
-
-// TODO(editing-dev): Consider rename/move this file.
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMPUTE_LAYER_SELECTION_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMPUTE_LAYER_SELECTION_H_
 
 #include "cc/input/layer_selection_bound.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -40,9 +38,10 @@
 
 class FrameSelection;
 
+// Compute coodinates to paint selection handles on touch devices.
 CORE_EXPORT cc::LayerSelection ComputeLayerSelection(
     const FrameSelection& frame_selection);
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_RENDERED_POSITION_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_EDITING_COMPUTE_LAYER_SELECTION_H_
diff --git a/third_party/blink/renderer/core/editing/rendered_position_test.cc b/third_party/blink/renderer/core/editing/compute_layer_selection_test.cc
similarity index 93%
rename from third_party/blink/renderer/core/editing/rendered_position_test.cc
rename to third_party/blink/renderer/core/editing/compute_layer_selection_test.cc
index f1882ca..becf7b2e 100644
--- a/third_party/blink/renderer/core/editing/rendered_position_test.cc
+++ b/third_party/blink/renderer/core/editing/compute_layer_selection_test.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 "third_party/blink/renderer/core/editing/rendered_position.h"
+#include "third_party/blink/renderer/core/editing/compute_layer_selection.h"
 
 #include "build/build_config.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
@@ -18,7 +18,7 @@
 
 namespace blink {
 
-class RenderedPositionTest : public EditingTestBase {
+class ComputeLayerSelectionTest : public EditingTestBase {
  public:
   void SetUp() override {
     EditingTestBase::SetUp();
@@ -45,7 +45,7 @@
   UseMockScrollbarSettings mock_scrollbars_;
 };
 
-TEST_F(RenderedPositionTest, ComputeLayerSelection) {
+TEST_F(ComputeLayerSelectionTest, ComputeLayerSelection) {
   SetBodyContent(R"HTML(
       <!DOCTYPE html>
       input {
@@ -65,7 +65,7 @@
   EXPECT_TRUE(composited_selection.end.hidden);
 }
 
-TEST_F(RenderedPositionTest, PositionInScrollableRoot) {
+TEST_F(ComputeLayerSelectionTest, PositionInScrollableRoot) {
   SetBodyContent(R"HTML(
       <!DOCTYPE html>
       <style>
@@ -107,7 +107,7 @@
   EXPECT_EQ(gfx::Point(1369, 915), composited_selection.end.edge_bottom);
 }
 
-TEST_F(RenderedPositionTest, PositionInScroller) {
+TEST_F(ComputeLayerSelectionTest, PositionInScroller) {
   SetBodyContent(R"HTML(
       <!DOCTYPE html>
       <style>
@@ -171,7 +171,7 @@
 }
 
 // crbug.com/807930
-TEST_F(RenderedPositionTest, ContentEditableLinebreak) {
+TEST_F(ComputeLayerSelectionTest, ContentEditableLinebreak) {
   SetBodyContent(
       "<div style='font: 10px/10px Ahem;' contenteditable>"
       "test<br><br></div>");
@@ -186,7 +186,7 @@
 }
 
 // crbug.com/807930
-TEST_F(RenderedPositionTest, TextAreaLinebreak) {
+TEST_F(ComputeLayerSelectionTest, TextAreaLinebreak) {
   SetBodyContent(
       "<textarea style='font: 10px/10px Ahem;'>"
       "test\n</textarea>");
@@ -200,7 +200,7 @@
 }
 
 // crbug.com/815099
-TEST_F(RenderedPositionTest, CaretBeforeSoftWrap) {
+TEST_F(ComputeLayerSelectionTest, CaretBeforeSoftWrap) {
   SetBodyContent(
       "<div style='font: 10px/10px Ahem; width:20px;' "
       "contenteditable>foo</div>");
@@ -222,7 +222,7 @@
   EXPECT_EQ(composited_selection.end.edge_bottom, gfx::Point(27, 18));
 }
 
-TEST_F(RenderedPositionTest, CaretAfterSoftWrap) {
+TEST_F(ComputeLayerSelectionTest, CaretAfterSoftWrap) {
   SetBodyContent(
       "<div style='font: 10px/10px Ahem; width:20px;' "
       "contenteditable>foo</div>");
@@ -245,7 +245,7 @@
 }
 
 // crbug.com/834686
-TEST_F(RenderedPositionTest, RangeBeginAtBlockEnd) {
+TEST_F(ComputeLayerSelectionTest, RangeBeginAtBlockEnd) {
   const SelectionInDOMTree& selection = SetSelectionTextToBody(
       "<div style='font: 10px/10px Ahem;'>"
       "<div>foo\n^</div><div>ba|r</div></div>");
diff --git a/third_party/blink/renderer/core/editing/editing_utilities.cc b/third_party/blink/renderer/core/editing/editing_utilities.cc
index 45b02042..362ee91 100644
--- a/third_party/blink/renderer/core/editing/editing_utilities.cc
+++ b/third_party/blink/renderer/core/editing/editing_utilities.cc
@@ -1609,7 +1609,7 @@
       input_type, data, InputTypeIsCancelable(input_type),
       InputEvent::EventIsComposing::kNotComposing,
       ranges ? ranges : TargetRangesForInputEvent(*target));
-  return target->DispatchEvent(before_input_event);
+  return target->DispatchEvent(*before_input_event);
 }
 
 DispatchEventResult DispatchBeforeInputEditorCommand(
@@ -1621,7 +1621,7 @@
   InputEvent* before_input_event = InputEvent::CreateBeforeInput(
       input_type, g_null_atom, InputTypeIsCancelable(input_type),
       InputEvent::EventIsComposing::kNotComposing, ranges);
-  return target->DispatchEvent(before_input_event);
+  return target->DispatchEvent(*before_input_event);
 }
 
 DispatchEventResult DispatchBeforeInputDataTransfer(
@@ -1653,7 +1653,7 @@
         InputEvent::EventIsComposing::kNotComposing,
         TargetRangesForInputEvent(*target));
   }
-  return target->DispatchEvent(before_input_event);
+  return target->DispatchEvent(*before_input_event);
 }
 
 // |IsEmptyNonEditableNodeInEditable()| is introduced for fixing
diff --git a/third_party/blink/renderer/core/editing/editor.cc b/third_party/blink/renderer/core/editing/editor.cc
index ef0a85a..520c592f 100644
--- a/third_party/blink/renderer/core/editing/editor.cc
+++ b/third_party/blink/renderer/core/editing/editor.cc
@@ -556,12 +556,12 @@
 }
 
 static void CountEditingEvent(ExecutionContext* execution_context,
-                              const Event* event,
+                              const Event& event,
                               WebFeature feature_on_input,
                               WebFeature feature_on_text_area,
                               WebFeature feature_on_content_editable,
                               WebFeature feature_on_non_node) {
-  EventTarget* event_target = event->target();
+  EventTarget* event_target = event.target();
   Node* node = event_target->ToNode();
   if (!node) {
     UseCounter::Count(execution_context, feature_on_non_node);
@@ -593,11 +593,11 @@
 }
 
 void Editor::CountEvent(ExecutionContext* execution_context,
-                        const Event* event) {
+                        const Event& event) {
   if (!execution_context)
     return;
 
-  if (event->type() == EventTypeNames::textInput) {
+  if (event.type() == EventTypeNames::textInput) {
     CountEditingEvent(execution_context, event,
                       WebFeature::kTextInputEventOnInput,
                       WebFeature::kTextInputEventOnTextArea,
@@ -606,7 +606,7 @@
     return;
   }
 
-  if (event->type() == EventTypeNames::webkitBeforeTextInserted) {
+  if (event.type() == EventTypeNames::webkitBeforeTextInserted) {
     CountEditingEvent(execution_context, event,
                       WebFeature::kWebkitBeforeTextInsertedOnInput,
                       WebFeature::kWebkitBeforeTextInsertedOnTextArea,
@@ -615,7 +615,7 @@
     return;
   }
 
-  if (event->type() == EventTypeNames::webkitEditableContentChanged) {
+  if (event.type() == EventTypeNames::webkitEditableContentChanged) {
     CountEditingEvent(
         execution_context, event,
         WebFeature::kWebkitEditableContentChangedOnInput,
@@ -931,7 +931,7 @@
 void Editor::ReplaceSelection(const String& text) {
   DCHECK(!GetFrame().GetDocument()->NeedsLayoutTreeUpdate());
   bool select_replacement = Behavior().ShouldSelectReplacement();
-  bool smart_replace = true;
+  bool smart_replace = false;
   ReplaceSelectionWithText(text, select_replacement, smart_replace,
                            InputEvent::InputType::kInsertReplacementText);
 }
diff --git a/third_party/blink/renderer/core/editing/editor.h b/third_party/blink/renderer/core/editing/editor.h
index a92656b..2f391faf 100644
--- a/third_party/blink/renderer/core/editing/editor.h
+++ b/third_party/blink/renderer/core/editing/editor.h
@@ -82,7 +82,7 @@
   bool CanPaste() const;
   bool CanDelete() const;
 
-  static void CountEvent(ExecutionContext*, const Event*);
+  static void CountEvent(ExecutionContext*, const Event&);
   void CopyImage(const HitTestResult&);
 
   void RespondToChangedContents(const Position&);
@@ -193,7 +193,8 @@
                                 bool smart_replace,
                                 InputEvent::InputType);
 
-  // Implementation of WebLocalFrameImpl::replaceSelection.
+  // Implementation of WebLocalFrameImpl::ReplaceSelection. Does not use smart
+  // replacement.
   void ReplaceSelection(const String&);
 
   void ReplaceSelectionAfterDragging(DocumentFragment*,
diff --git a/third_party/blink/renderer/core/editing/editor_test.cc b/third_party/blink/renderer/core/editing/editor_test.cc
index 724217ea..505a0f5 100644
--- a/third_party/blink/renderer/core/editing/editor_test.cc
+++ b/third_party/blink/renderer/core/editing/editor_test.cc
@@ -91,4 +91,19 @@
   EXPECT_TRUE(copied.IsEmpty()) << copied << " was copied.";
 }
 
+TEST_F(EditorTest, ReplaceSelection) {
+  const char* body_content = "<input id=text value='HELLO'>";
+  SetBodyContent(body_content);
+
+  HTMLInputElement& text_control =
+      ToHTMLInputElement(*GetDocument().getElementById("text"));
+  text_control.select();
+  text_control.SetSelectionRange(2, 2);
+
+  Editor& editor = GetDocument().GetFrame()->GetEditor();
+  editor.ReplaceSelection("NEW");
+
+  EXPECT_EQ("HENEWLLO", text_control.value());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/editing/frame_selection.cc b/third_party/blink/renderer/core/editing/frame_selection.cc
index c1ef78a..f922217e 100644
--- a/third_party/blink/renderer/core/editing/frame_selection.cc
+++ b/third_party/blink/renderer/core/editing/frame_selection.cc
@@ -334,7 +334,7 @@
     return DispatchEventResult::kNotCanceled;
 
   return select_start_target->DispatchEvent(
-      Event::CreateCancelableBubble(EventTypeNames::selectstart));
+      *Event::CreateCancelableBubble(EventTypeNames::selectstart));
 }
 
 // The return value of |FrameSelection::modify()| is different based on
@@ -728,7 +728,7 @@
 
   if (select_start_target) {
     const Document& expected_document = GetDocument();
-    if (select_start_target->DispatchEvent(Event::CreateCancelableBubble(
+    if (select_start_target->DispatchEvent(*Event::CreateCancelableBubble(
             EventTypeNames::selectstart)) != DispatchEventResult::kNotCanceled)
       return;
     // The frame may be detached due to selectstart event.
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
index f70a399..91bacfe 100644
--- a/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
+++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.cc
@@ -68,7 +68,7 @@
 
   CompositionEvent* event = CompositionEvent::Create(
       EventTypeNames::compositionupdate, frame.DomWindow(), text);
-  target->DispatchEvent(event);
+  target->DispatchEvent(*event);
 }
 
 void DispatchCompositionEndEvent(LocalFrame& frame, const String& text) {
@@ -83,7 +83,7 @@
 
   CompositionEvent* event = CompositionEvent::Create(
       EventTypeNames::compositionend, frame.DomWindow(), text);
-  EventDispatcher::DispatchScopedEvent(*target, event);
+  EventDispatcher::DispatchScopedEvent(*target, *event);
 }
 
 bool NeedsIncrementalInsertion(const LocalFrame& frame,
@@ -110,7 +110,7 @@
   InputEvent* before_input_event = InputEvent::CreateBeforeInput(
       input_type, data, InputEvent::kNotCancelable,
       InputEvent::EventIsComposing::kIsComposing, nullptr);
-  target->DispatchEvent(before_input_event);
+  target->DispatchEvent(*before_input_event);
 }
 
 // Used to insert/replace text during composition update and confirm
@@ -735,7 +735,7 @@
 
   CompositionEvent* event = CompositionEvent::Create(
       EventTypeNames::compositionstart, GetFrame().DomWindow(), text);
-  target->DispatchEvent(event);
+  target->DispatchEvent(*event);
 
   return IsAvailable();
 }
diff --git a/third_party/blink/renderer/core/editing/selection_controller.cc b/third_party/blink/renderer/core/editing/selection_controller.cc
index 3afb8fa..03e45bd 100644
--- a/third_party/blink/renderer/core/editing/selection_controller.cc
+++ b/third_party/blink/renderer/core/editing/selection_controller.cc
@@ -81,7 +81,7 @@
     return DispatchEventResult::kNotCanceled;
 
   return node->DispatchEvent(
-      Event::CreateCancelableBubble(EventTypeNames::selectstart));
+      *Event::CreateCancelableBubble(EventTypeNames::selectstart));
 }
 
 SelectionInFlatTree ExpandSelectionToRespectUserSelectAll(
diff --git a/third_party/blink/renderer/core/events/message_event.cc b/third_party/blink/renderer/core/events/message_event.cc
index 9c47945..9fd9a53 100644
--- a/third_party/blink/renderer/core/events/message_event.cc
+++ b/third_party/blink/renderer/core/events/message_event.cc
@@ -131,6 +131,14 @@
   DCHECK(IsValidSource(source_.Get()));
 }
 
+MessageEvent::MessageEvent(const String& origin, EventTarget* source)
+    : Event(EventTypeNames::messageerror, Bubbles::kNo, Cancelable::kNo),
+      data_type_(kDataTypeNull),
+      origin_(origin),
+      source_(source) {
+  DCHECK(IsValidSource(source_.Get()));
+}
+
 MessageEvent::MessageEvent(const String& data, const String& origin)
     : Event(EventTypeNames::message, Bubbles::kNo, Cancelable::kNo),
       data_type_(kDataTypeString),
@@ -269,6 +277,7 @@
   // how much memory is used via the wrapper. To keep the wrapper alive, it's
   // set to the wrapper of the MessageEvent as a private value.
   switch (GetDataType()) {
+    case MessageEvent::kDataTypeNull:
     case MessageEvent::kDataTypeScriptValue:
     case MessageEvent::kDataTypeSerializedScriptValue:
       break;
diff --git a/third_party/blink/renderer/core/events/message_event.h b/third_party/blink/renderer/core/events/message_event.h
index bf3f165..31ad4c46 100644
--- a/third_party/blink/renderer/core/events/message_event.h
+++ b/third_party/blink/renderer/core/events/message_event.h
@@ -73,6 +73,10 @@
     return new MessageEvent(std::move(data), origin, last_event_id, source,
                             std::move(channels), user_activation);
   }
+  static MessageEvent* CreateError(const String& origin = String(),
+                                   EventTarget* source = nullptr) {
+    return new MessageEvent(origin, source);
+  }
   static MessageEvent* Create(const String& data,
                               const String& origin = String()) {
     return new MessageEvent(data, origin);
@@ -127,6 +131,7 @@
   const AtomicString& InterfaceName() const override;
 
   enum DataType {
+    kDataTypeNull,  // For "messageerror" events.
     kDataTypeScriptValue,
     kDataTypeSerializedScriptValue,
     kDataTypeString,
@@ -204,6 +209,9 @@
                Vector<MessagePortChannel>,
                UserActivation* user_activation);
 
+  // Creates a "messageerror" event.
+  MessageEvent(const String& origin, EventTarget* source);
+
   MessageEvent(const String& data, const String& origin);
   MessageEvent(Blob* data, const String& origin);
   MessageEvent(DOMArrayBuffer* data, const String& origin);
diff --git a/third_party/blink/renderer/core/events/mouse_event.cc b/third_party/blink/renderer/core/events/mouse_event.cc
index a4ab128..8d32e856 100644
--- a/third_party/blink/renderer/core/events/mouse_event.cc
+++ b/third_party/blink/renderer/core/events/mouse_event.cc
@@ -427,17 +427,17 @@
   // event. This is not part of the DOM specs, but is used for compatibility
   // with the ondblclick="" attribute. This is treated as a separate event in
   // other DOM-compliant browsers like Firefox, and so we do the same.
-  MouseEvent* double_click_event = MouseEvent::Create();
-  double_click_event->InitMouseEventInternal(
+  MouseEvent& double_click_event = *MouseEvent::Create();
+  double_click_event.InitMouseEventInternal(
       EventTypeNames::dblclick, bubbles(), cancelable(), view(), detail(),
       screenX(), screenY(), clientX(), clientY(), GetModifiers(), button(),
       related_target, sourceCapabilities(), buttons());
-  double_click_event->SetComposed(composed());
+  double_click_event.SetComposed(composed());
 
   // Inherit the trusted status from the original event.
-  double_click_event->SetTrusted(isTrusted());
+  double_click_event.SetTrusted(isTrusted());
   if (DefaultHandled())
-    double_click_event->SetDefaultHandled();
+    double_click_event.SetDefaultHandled();
   DispatchEventResult double_click_dispatch_result =
       EventDispatcher::DispatchEvent(dispatcher.GetNode(), double_click_event);
   if (double_click_dispatch_result != DispatchEventResult::kNotCanceled)
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.cc b/third_party/blink/renderer/core/execution_context/execution_context.cc
index 34fda80..b5eec8a 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.cc
+++ b/third_party/blink/renderer/core/execution_context/execution_context.cc
@@ -152,7 +152,7 @@
 
   DCHECK(!in_dispatch_error_event_);
   in_dispatch_error_event_ = true;
-  target->DispatchEvent(error_event);
+  target->DispatchEvent(*error_event);
   in_dispatch_error_event_ = false;
   return error_event->defaultPrevented();
 }
@@ -259,4 +259,14 @@
   Supplementable<ExecutionContext>::Trace(visitor);
 }
 
+bool ExecutionContext::IsSameAgentCluster(
+    const base::UnguessableToken& other_id) const {
+  base::UnguessableToken this_id = GetAgentClusterID();
+  // If the AgentClusterID is empty then it should never be the same (e.g.
+  // currently for worklets).
+  if (this_id.is_empty() || other_id.is_empty())
+    return false;
+  return this_id == other_id;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/execution_context/execution_context.h b/third_party/blink/renderer/core/execution_context/execution_context.h
index 8c0d545..2ff9392 100644
--- a/third_party/blink/renderer/core/execution_context/execution_context.h
+++ b/third_party/blink/renderer/core/execution_context/execution_context.h
@@ -32,6 +32,7 @@
 
 #include "base/location.h"
 #include "base/macros.h"
+#include "base/unguessable_token.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/context_lifecycle_notifier.h"
 #include "third_party/blink/renderer/core/dom/context_lifecycle_observer.h"
@@ -153,6 +154,11 @@
 
   virtual SecurityContext& GetSecurityContext() = 0;
 
+  // https://tc39.github.io/ecma262/#sec-agent-clusters
+  virtual const base::UnguessableToken& GetAgentClusterID() const = 0;
+
+  bool IsSameAgentCluster(const base::UnguessableToken&) const;
+
   virtual bool CanExecuteScripts(ReasonForCallingCanExecuteScripts) {
     return false;
   }
diff --git a/third_party/blink/renderer/core/exported/shared_worker_repository_client_impl.cc b/third_party/blink/renderer/core/exported/shared_worker_repository_client_impl.cc
index c72e0d15..476ecac 100644
--- a/third_party/blink/renderer/core/exported/shared_worker_repository_client_impl.cc
+++ b/third_party/blink/renderer/core/exported/shared_worker_repository_client_impl.cc
@@ -87,7 +87,7 @@
   }
 
   void ScriptLoadFailed() override {
-    worker_->DispatchEvent(Event::CreateCancelable(EventTypeNames::error));
+    worker_->DispatchEvent(*Event::CreateCancelable(EventTypeNames::error));
     worker_->SetIsBeingConnected(false);
   }
 
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
index d250bb0..eef3bcc9 100644
--- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
@@ -207,7 +207,6 @@
           mojom::blink::DevToolsSessionHostAssociatedPtrInfo host_ptr_info,
           mojom::blink::DevToolsSessionAssociatedRequest main_request,
           mojom::blink::DevToolsSessionRequest io_request,
-          const String& reattach_state,
           mojom::blink::DevToolsSessionStatePtr reattach_session_state);
   ~Session() override;
 
@@ -233,19 +232,16 @@
       int session_id,
       int call_id,
       const String& response,
-      const String& state,
       mojom::blink::DevToolsSessionStatePtr updates) override;
   void SendProtocolNotification(
       int session_id,
       const String& message,
-      const String& state,
       mojom::blink::DevToolsSessionStatePtr updates) override;
 
   void DispatchProtocolCommandInternal(int call_id,
                                        const String& method,
                                        const String& message);
   void InitializeInspectorSession(
-      const String& reattach_state,
       mojom::blink::DevToolsSessionStatePtr reattach_session_state);
 
   Member<WebDevToolsAgentImpl> agent_;
@@ -317,7 +313,6 @@
     mojom::blink::DevToolsSessionHostAssociatedPtrInfo host_ptr_info,
     mojom::blink::DevToolsSessionAssociatedRequest request,
     mojom::blink::DevToolsSessionRequest io_request,
-    const String& reattach_state,
     mojom::blink::DevToolsSessionStatePtr reattach_session_state)
     : agent_(agent),
       frame_(agent->web_local_frame_impl_),
@@ -331,7 +326,7 @@
   host_ptr_.set_connection_error_handler(WTF::Bind(
       &WebDevToolsAgentImpl::Session::Detach, WrapWeakPersistent(this)));
 
-  InitializeInspectorSession(reattach_state, std::move(reattach_session_state));
+  InitializeInspectorSession(std::move(reattach_session_state));
 }
 
 WebDevToolsAgentImpl::Session::~Session() {
@@ -363,7 +358,6 @@
     int session_id,
     int call_id,
     const String& response,
-    const String& state,
     mojom::blink::DevToolsSessionStatePtr updates) {
   if (detached_)
     return;
@@ -372,16 +366,14 @@
   // protocol response in any of them.
   if (LayoutTestSupport::IsRunningLayoutTest())
     agent_->FlushProtocolNotifications();
-  host_ptr_->DispatchProtocolResponse(response, call_id, state,
-                                      std::move(updates));
+  host_ptr_->DispatchProtocolResponse(response, call_id, std::move(updates));
 }
 
 void WebDevToolsAgentImpl::Session::SendProtocolNotification(
     int session_id,
     const String& message,
-    const String& state,
     mojom::blink::DevToolsSessionStatePtr updates) {
-  host_ptr_->DispatchProtocolNotification(message, state, std::move(updates));
+  host_ptr_->DispatchProtocolNotification(message, std::move(updates));
 }
 
 void WebDevToolsAgentImpl::Session::DispatchProtocolCommand(
@@ -404,18 +396,19 @@
 }
 
 void WebDevToolsAgentImpl::Session::InitializeInspectorSession(
-    const String& reattach_state,
     mojom::blink::DevToolsSessionStatePtr reattach_session_state) {
   ClientMessageLoopAdapter::EnsureMainThreadDebuggerCreated();
   MainThreadDebugger* main_thread_debugger = MainThreadDebugger::Instance();
   v8::Isolate* isolate = V8PerIsolateData::MainThreadIsolate();
   InspectedFrames* inspected_frames = agent_->inspected_frames_.Get();
 
+  bool should_reattach = !reattach_session_state.is_null();
+
   inspector_session_ = new InspectorSession(
       this, agent_->probe_sink_.Get(), 0,
       main_thread_debugger->GetV8Inspector(),
       main_thread_debugger->ContextGroupId(inspected_frames->Root()),
-      reattach_state, std::move(reattach_session_state));
+      std::move(reattach_session_state));
 
   InspectorDOMAgent* dom_agent = new InspectorDOMAgent(
       isolate, inspected_frames, inspector_session_->V8Session());
@@ -489,7 +482,7 @@
       inspector_session_, agent_->include_view_agents_, dom_agent,
       inspected_frames, frame_->ViewImpl()->GetPage());
 
-  if (!reattach_state.IsNull()) {
+  if (should_reattach) {
     inspector_session_->Restore();
     if (agent_->worker_client_)
       agent_->worker_client_->ResumeStartup();
@@ -564,14 +557,12 @@
     mojom::blink::DevToolsSessionHostAssociatedPtrInfo host,
     mojom::blink::DevToolsSessionAssociatedRequest session_request,
     mojom::blink::DevToolsSessionRequest io_session_request,
-    const String& reattach_state,
     mojom::blink::DevToolsSessionStatePtr reattach_session_state) {
   if (!sessions_.size())
     Platform::Current()->CurrentThread()->AddTaskObserver(this);
-  Session* session =
-      new Session(this, std::move(host), std::move(session_request),
-                  std::move(io_session_request), reattach_state,
-                  std::move(reattach_session_state));
+  Session* session = new Session(
+      this, std::move(host), std::move(session_request),
+      std::move(io_session_request), std::move(reattach_session_state));
   sessions_.insert(session);
   if (node_to_inspect_) {
     session->overlay_agent()->Inspect(node_to_inspect_);
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
index 2c3ae4f..c4cbf7f5 100644
--- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
+++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h
@@ -100,7 +100,6 @@
       mojom::blink::DevToolsSessionHostAssociatedPtrInfo,
       mojom::blink::DevToolsSessionAssociatedRequest main_session,
       mojom::blink::DevToolsSessionRequest io_session,
-      const String& reattach_state,
       mojom::blink::DevToolsSessionStatePtr reattach_session_state) override;
   void InspectElement(const WebPoint& point_in_local_root) override;
 
diff --git a/third_party/blink/renderer/core/exported/web_form_control_element.cc b/third_party/blink/renderer/core/exported/web_form_control_element.cc
index 192e291..31a463e 100644
--- a/third_party/blink/renderer/core/exported/web_form_control_element.cc
+++ b/third_party/blink/renderer/core/exported/web_form_control_element.cc
@@ -133,10 +133,10 @@
                                             nullptr);
     }
     Unwrap<Element>()->DispatchScopedEvent(
-        Event::CreateBubble(EventTypeNames::keydown));
+        *Event::CreateBubble(EventTypeNames::keydown));
     Unwrap<TextControlElement>()->SetAutofillValue(value);
     Unwrap<Element>()->DispatchScopedEvent(
-        Event::CreateBubble(EventTypeNames::keyup));
+        *Event::CreateBubble(EventTypeNames::keyup));
     if (!Focused()) {
       Unwrap<Element>()->DispatchBlurEvent(nullptr, kWebFocusTypeForward,
                                            nullptr);
diff --git a/third_party/blink/renderer/core/exported/web_frame_test.cc b/third_party/blink/renderer/core/exported/web_frame_test.cc
index f27eff93..b5e5f28 100644
--- a/third_party/blink/renderer/core/exported/web_frame_test.cc
+++ b/third_party/blink/renderer/core/exported/web_frame_test.cc
@@ -4498,7 +4498,8 @@
   // Reload the page and end up at the same url. State should not be propagated.
   web_view_helper.GetWebView()->MainFrameImpl()->StartReload(
       WebFrameLoadType::kReload);
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view_helper.LocalMainFrame());
   EXPECT_EQ(0, web_view_helper.LocalMainFrame()->GetScrollOffset().width);
   EXPECT_EQ(0, web_view_helper.LocalMainFrame()->GetScrollOffset().height);
   EXPECT_EQ(1.0f, web_view_helper.GetWebView()->PageScaleFactor());
@@ -4551,7 +4552,8 @@
   web_view_helper.InitializeAndLoad(base_url_ + "iframe_redirect.html");
   // Pump pending requests one more time. The test page loads script that
   // navigates.
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view_helper.LocalMainFrame());
 
   WebFrame* iframe = web_view_helper.LocalMainFrame()->FindFrameByName(
       WebString::FromUTF8("ifr"));
@@ -7277,7 +7279,8 @@
       ->Loader()
       .StartNavigation(frame_request, WebFrameLoadType::kStandard,
                        NavigationPolicyFromEvent(event));
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view_helper.LocalMainFrame());
 
   // decidePolicyForNavigation should be called for the ctrl+click.
   EXPECT_EQ(1, web_frame_client.DecidePolicyCallCount());
@@ -7352,7 +7355,8 @@
                               "javascript:document.forms[0].submit()");
   // Pump requests one more time after the javascript URL has executed to
   // trigger the actual POST load request.
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view_helper.LocalMainFrame());
   EXPECT_EQ(WebString::FromUTF8("POST"),
             frame->GetDocumentLoader()->GetRequest().HttpMethod());
 
@@ -7507,7 +7511,8 @@
   ToLocalFrame(web_view_helper.GetWebView()->GetPage()->MainFrame())
       ->Loader()
       .StartNavigation(frame_request);
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view_helper.LocalMainFrame());
 
   EXPECT_TRUE(client.FrameLoadTypeReloadSeen());
 }
@@ -7865,7 +7870,8 @@
   // Before commit, there is no history item.
   EXPECT_FALSE(main_frame_loader.GetDocumentLoader()->GetHistoryItem());
 
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view_helper.LocalMainFrame());
 
   // After commit, there is.
   HistoryItem* item = main_frame_loader.GetDocumentLoader()->GetHistoryItem();
diff --git a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
index b6a4b95..ad59af0 100644
--- a/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_page_popup_impl.cc
@@ -338,7 +338,7 @@
     return;
   ScriptForbiddenScope::AllowUserAgentScript allow_script;
   if (LocalDOMWindow* window = ToLocalFrame(page_->MainFrame())->DomWindow())
-    window->DispatchEvent(MessageEvent::Create(message));
+    window->DispatchEvent(*MessageEvent::Create(message));
 }
 
 void WebPagePopupImpl::DestroyPage() {
diff --git a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
index cf141b7..e623502 100644
--- a/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_plugin_container_impl.cc
@@ -453,7 +453,7 @@
     event = ResourceProgressEvent::Create(type, length_computable, loaded,
                                           total, url);
   }
-  element_->DispatchEvent(event);
+  element_->DispatchEvent(*event);
 }
 
 void WebPluginContainerImpl::EnqueueMessageEvent(
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc
index 3bfe2a81..c72a0a5 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -71,8 +71,8 @@
     settings_->NotifyGenericFontFamilyChange();
 }
 
-void WebSettingsImpl::SetFMPNetworkQuietTimeout(double timeout) {
-  settings_->SetFMPNetworkQuietTimeout(timeout);
+void WebSettingsImpl::SetNetworkQuietTimeout(double timeout) {
+  settings_->SetNetworkQuietTimeout(timeout);
 }
 
 void WebSettingsImpl::SetForceMainWorldInitialization(bool enabled) {
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h
index e2f24b1..7c20340c 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.h
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -91,7 +91,7 @@
                             UScriptCode = USCRIPT_COMMON) override;
   void SetFixedFontFamily(const WebString&,
                           UScriptCode = USCRIPT_COMMON) override;
-  void SetFMPNetworkQuietTimeout(double timeout) override;
+  void SetNetworkQuietTimeout(double timeout) override;
   void SetForceMainWorldInitialization(bool) override;
   void SetForcePreloadNoneForMediaElements(bool) override;
   void SetForceZeroLayoutHeight(bool) override;
diff --git a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
index a4c9638..832c884 100644
--- a/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_shared_worker_impl.cc
@@ -204,7 +204,7 @@
   MessagePort* port = MessagePort::Create(*worker_global_scope);
   port->Entangle(std::move(channel));
   SECURITY_DCHECK(worker_global_scope->IsSharedWorkerGlobalScope());
-  worker_global_scope->DispatchEvent(CreateConnectEvent(port));
+  worker_global_scope->DispatchEvent(*CreateConnectEvent(port));
 }
 
 void WebSharedWorkerImpl::StartWorkerContext(
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc
index 5468190..3ab8efdf 100644
--- a/third_party/blink/renderer/core/exported/web_view_test.cc
+++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -2484,7 +2484,8 @@
   widget->DragTargetDragEnter(drag_data, client_point, screen_point,
                               kWebDragOperationCopy, 0);
   widget->DragTargetDrop(drag_data, client_point, screen_point, 0);
-  FrameTestHelpers::PumpPendingRequestsForFrameToLoad();
+  FrameTestHelpers::PumpPendingRequestsForFrameToLoad(
+      web_view->MainFrameImpl());
 }
 
 TEST_F(WebViewTest, DragDropURL) {
diff --git a/third_party/blink/renderer/core/fetch/fetch_manager.cc b/third_party/blink/renderer/core/fetch/fetch_manager.cc
index a8f81a3..105cbbb 100644
--- a/third_party/blink/renderer/core/fetch/fetch_manager.cc
+++ b/third_party/blink/renderer/core/fetch/fetch_manager.cc
@@ -33,6 +33,7 @@
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
+#include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
 #include "third_party/blink/renderer/platform/exported/wrapped_resource_response.h"
diff --git a/third_party/blink/renderer/core/fileapi/file_reader.cc b/third_party/blink/renderer/core/fileapi/file_reader.cc
index d2e87ac..a875dcf 100644
--- a/third_party/blink/renderer/core/fileapi/file_reader.cc
+++ b/third_party/blink/renderer/core/fileapi/file_reader.cc
@@ -459,16 +459,16 @@
 void FileReader::FireEvent(const AtomicString& type) {
   probe::AsyncTask async_task(GetExecutionContext(), this, "event");
   if (!loader_) {
-    DispatchEvent(ProgressEvent::Create(type, false, 0, 0));
+    DispatchEvent(*ProgressEvent::Create(type, false, 0, 0));
     return;
   }
 
   if (loader_->TotalBytes()) {
-    DispatchEvent(ProgressEvent::Create(type, true, loader_->BytesLoaded(),
-                                        *loader_->TotalBytes()));
+    DispatchEvent(*ProgressEvent::Create(type, true, loader_->BytesLoaded(),
+                                         *loader_->TotalBytes()));
   } else {
     DispatchEvent(
-        ProgressEvent::Create(type, false, loader_->BytesLoaded(), 0));
+        *ProgressEvent::Create(type, false, loader_->BytesLoaded(), 0));
   }
 }
 
diff --git a/third_party/blink/renderer/core/frame/deprecation.cc b/third_party/blink/renderer/core/frame/deprecation.cc
index e65f2511..d5c2fa7 100644
--- a/third_party/blink/renderer/core/frame/deprecation.cc
+++ b/third_party/blink/renderer/core/frame/deprecation.cc
@@ -584,6 +584,12 @@
               WillBeRemoved("speechSynthesis.speak() without user activation",
                             kM71, "5687444770914304")};
 
+    case WebFeature::kPPAPIWebSocket:
+      // TODO(ricea): Update once we have an expected release date for M74.
+      return {"PPAPIWebSocket", kUnknown,
+              "The Native Client Pepper WebSocket API is deprecated and will "
+              "be disabled in M74, mid-2019"};
+
     // Features that aren't deprecated don't have a deprecation message.
     default:
       return {"NotDeprecated", kUnknown, ""};
diff --git a/third_party/blink/renderer/core/frame/device_single_window_event_controller.cc b/third_party/blink/renderer/core/frame/device_single_window_event_controller.cc
index b8aeb9c..e804905 100644
--- a/third_party/blink/renderer/core/frame/device_single_window_event_controller.cc
+++ b/third_party/blink/renderer/core/frame/device_single_window_event_controller.cc
@@ -30,7 +30,7 @@
       GetDocument().IsContextDestroyed())
     return;
 
-  GetDocument().domWindow()->DispatchEvent(event);
+  GetDocument().domWindow()->DispatchEvent(*event);
 
   if (needs_checking_null_events_) {
     if (IsNullEvent(event))
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
index 25b337f1..c054a70a 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -78,13 +78,13 @@
 //    progress, it exits the run loop.
 // 7. At this point, all parsing, resource loads, and layout should be finished.
 
-void RunServeAsyncRequestsTask() {
+void RunServeAsyncRequestsTask(scoped_refptr<base::TaskRunner> task_runner) {
   // TODO(kinuko,toyoshim): Create a mock factory and use it instead of
   // getting the platform's one. (crbug.com/751425)
   Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
   if (TestWebFrameClient::IsLoading()) {
-    Platform::Current()->CurrentThread()->GetTaskRunner()->PostTask(
-        FROM_HERE, WTF::Bind(&RunServeAsyncRequestsTask));
+    task_runner->PostTask(FROM_HERE,
+                          WTF::Bind(&RunServeAsyncRequestsTask, task_runner));
   } else {
     test::ExitRunLoop();
   }
@@ -120,14 +120,14 @@
         blink::WebHistoryItem(), false, base::UnguessableToken::Create(),
         nullptr, BuildDummyWebNavigationTimings());
   }
-  PumpPendingRequestsForFrameToLoad();
+  PumpPendingRequestsForFrameToLoad(frame);
 }
 
 void LoadHTMLString(WebLocalFrame* frame,
                     const std::string& html,
                     const WebURL& base_url) {
   frame->LoadHTMLString(WebData(html.data(), html.size()), base_url);
-  PumpPendingRequestsForFrameToLoad();
+  PumpPendingRequestsForFrameToLoad(frame);
 }
 
 void LoadHistoryItem(WebLocalFrame* frame,
@@ -139,22 +139,24 @@
       WebFrameLoadType::kBackForward, item,
       /*is_client_redirect=*/false, base::UnguessableToken::Create(), nullptr,
       BuildDummyWebNavigationTimings());
-  PumpPendingRequestsForFrameToLoad();
+  PumpPendingRequestsForFrameToLoad(frame);
 }
 
 void ReloadFrame(WebLocalFrame* frame) {
   frame->StartReload(WebFrameLoadType::kReload);
-  PumpPendingRequestsForFrameToLoad();
+  PumpPendingRequestsForFrameToLoad(frame);
 }
 
 void ReloadFrameBypassingCache(WebLocalFrame* frame) {
   frame->StartReload(WebFrameLoadType::kReloadBypassingCache);
-  PumpPendingRequestsForFrameToLoad();
+  PumpPendingRequestsForFrameToLoad(frame);
 }
 
-void PumpPendingRequestsForFrameToLoad() {
-  Platform::Current()->CurrentThread()->GetTaskRunner()->PostTask(
-      FROM_HERE, WTF::Bind(&RunServeAsyncRequestsTask));
+void PumpPendingRequestsForFrameToLoad(WebLocalFrame* frame) {
+  scoped_refptr<base::TaskRunner> task_runner =
+      frame->GetTaskRunner(blink::TaskType::kInternalTest);
+  task_runner->PostTask(FROM_HERE,
+                        WTF::Bind(&RunServeAsyncRequestsTask, task_runner));
   test::EnterRunLoop();
 }
 
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h
index d257734..ceabae35 100644
--- a/third_party/blink/renderer/core/frame/frame_test_helpers.h
+++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -111,7 +111,7 @@
 
 // Pumps pending resource requests while waiting for a frame to load. Consider
 // using one of the above helper methods whenever possible.
-void PumpPendingRequestsForFrameToLoad();
+void PumpPendingRequestsForFrameToLoad(WebLocalFrame*);
 
 WebMouseEvent CreateMouseEvent(WebInputEvent::Type,
                                WebMouseEvent::Button,
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index d99f96d..e41b02e 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -279,7 +279,7 @@
   if (navigator_)
     navigator_->SetLanguagesChanged();
 
-  DispatchEvent(Event::Create(EventTypeNames::languagechange));
+  DispatchEvent(*Event::Create(EventTypeNames::languagechange));
 }
 
 TrustedTypePolicyFactory* LocalDOMWindow::trustedTypes() const {
@@ -399,7 +399,7 @@
     scoped_refptr<SerializedScriptValue> state_object) {
   // FIXME: https://bugs.webkit.org/show_bug.cgi?id=36202 Popstate event needs
   // to fire asynchronously
-  DispatchEvent(PopStateEvent::Create(std::move(state_object), history()));
+  DispatchEvent(*PopStateEvent::Create(std::move(state_object), history()));
 }
 
 void LocalDOMWindow::StatePopped(
@@ -498,7 +498,7 @@
 
   for (LocalFrame* frame : frames) {
     frame->DomWindow()->DispatchEvent(
-        Event::Create(EventTypeNames::orientationchange));
+        *Event::Create(EventTypeNames::orientationchange));
   }
 }
 
@@ -667,7 +667,7 @@
         GetFrame(), WebFeature::kPostMessageIncomingWouldBeBlockedByConnectSrc);
   }
 
-  DispatchEvent(event);
+  DispatchEvent(*event);
 }
 
 DOMSelection* LocalDOMWindow::getSelection() {
@@ -1487,19 +1487,19 @@
   probe::loadEventFired(GetFrame());
 }
 
-DispatchEventResult LocalDOMWindow::DispatchEvent(Event* event,
+DispatchEventResult LocalDOMWindow::DispatchEvent(Event& event,
                                                   EventTarget* target) {
 #if DCHECK_IS_ON()
   DCHECK(!EventDispatchForbiddenScope::IsEventDispatchForbidden());
 #endif
 
-  event->SetTrusted(true);
-  event->SetTarget(target ? target : this);
-  event->SetCurrentTarget(this);
-  event->SetEventPhase(Event::kAtTarget);
+  event.SetTrusted(true);
+  event.SetTarget(target ? target : this);
+  event.SetCurrentTarget(this);
+  event.SetEventPhase(Event::kAtTarget);
 
   TRACE_EVENT1("devtools.timeline", "EventDispatch", "data",
-               InspectorEventDispatchEvent::Data(*event));
+               InspectorEventDispatchEvent::Data(event));
   return FireEventListeners(event);
 }
 
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h
index bdc4d4c..6c1c776 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.h
+++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -312,7 +312,14 @@
   void RemoveAllEventListeners() override;
 
   using EventTarget::DispatchEvent;
-  DispatchEventResult DispatchEvent(Event*, EventTarget*);
+  DispatchEventResult DispatchEvent(Event&, EventTarget*);
+  // Deprecated: Use DispatchEvent(Event&, ...), instead of this.
+  // This will be removed after every callers of this function are replaced.
+  // See crbub.com/871637.
+  DispatchEventResult DispatchEvent(Event* event, EventTarget* event_target) {
+    DCHECK(event);
+    return DispatchEvent(*event, event_target);
+  }
 
   void FinishedLoading();
 
diff --git a/third_party/blink/renderer/core/frame/local_frame.cc b/third_party/blink/renderer/core/frame/local_frame.cc
index c33dbdc..e681cb8 100644
--- a/third_party/blink/renderer/core/frame/local_frame.cc
+++ b/third_party/blink/renderer/core/frame/local_frame.cc
@@ -145,54 +145,6 @@
   return true;
 }
 
-class EmptyFrameScheduler final : public FrameScheduler {
- public:
-  EmptyFrameScheduler() { DCHECK(IsMainThread()); }
-
-  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner(
-      TaskType type) override {
-    return Platform::Current()->MainThread()->GetTaskRunner();
-  }
-
-  std::unique_ptr<scheduler::WebResourceLoadingTaskRunnerHandle>
-  CreateResourceLoadingTaskRunnerHandle() override {
-    return scheduler::WebResourceLoadingTaskRunnerHandle::CreateUnprioritized(
-        GetTaskRunner(TaskType::kNetworkingWithURLLoaderAnnotation));
-  }
-
-  void SetFrameVisible(bool) override {}
-  bool IsFrameVisible() const override { return false; }
-  bool IsPageVisible() const override { return false; }
-  void SetPaused(bool) override {}
-  void SetCrossOrigin(bool) override {}
-  bool IsCrossOrigin() const override { return false; }
-  void SetIsAdFrame() override {}
-  bool IsAdFrame() const override { return false; }
-  void TraceUrlChange(const String& override) override {}
-  FrameScheduler::FrameType GetFrameType() const override {
-    return FrameScheduler::FrameType::kSubframe;
-  }
-  PageScheduler* GetPageScheduler() const override { return nullptr; }
-  WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
-      const String&,
-      WebScopedVirtualTimePauser::VirtualTaskDuration) override {
-    return WebScopedVirtualTimePauser();
-  }
-  void DidStartProvisionalLoad(bool is_main_frame) override {}
-  void DidCommitProvisionalLoad(bool is_web_history_inert_commit,
-                                bool is_reload,
-                                bool is_main_frame) override {}
-  void OnFirstMeaningfulPaint() override {}
-  std::unique_ptr<ActiveConnectionHandle> OnActiveConnectionCreated() override {
-    return nullptr;
-  }
-  bool IsExemptFromBudgetBasedThrottling() const override { return false; }
-  std::unique_ptr<blink::mojom::blink::PauseSubresourceLoadingHandle>
-  GetPauseSubresourceLoadingHandle() override {
-    return nullptr;
-  }
-};
-
 }  // namespace
 
 template class CORE_TEMPLATE_EXPORT Supplement<LocalFrame>;
@@ -561,7 +513,7 @@
   DCHECK(RuntimeEnabledFeatures::PageLifecycleEnabled());
   if (GetDocument()) {
     const TimeTicks resume_event_start = CurrentTimeTicks();
-    GetDocument()->DispatchEvent(Event::Create(EventTypeNames::resume));
+    GetDocument()->DispatchEvent(*Event::Create(EventTypeNames::resume));
     const TimeTicks resume_event_end = CurrentTimeTicks();
     DEFINE_STATIC_LOCAL(
         CustomCountHistogram, resume_histogram,
@@ -916,14 +868,11 @@
                               FrameOwner* owner,
                               InterfaceRegistry* interface_registry)
     : Frame(client, page, owner, LocalWindowProxyManager::Create(*this)),
-      frame_scheduler_(page.GetPageScheduler()
-                           ? page.GetPageScheduler()->CreateFrameScheduler(
-                                 this,
-                                 client->GetFrameBlameContext(),
-                                 IsMainFrame()
-                                     ? FrameScheduler::FrameType::kMainFrame
-                                     : FrameScheduler::FrameType::kSubframe)
-                           : std::make_unique<EmptyFrameScheduler>()),
+      frame_scheduler_(page.GetPageScheduler()->CreateFrameScheduler(
+          this,
+          client->GetFrameBlameContext(),
+          IsMainFrame() ? FrameScheduler::FrameType::kMainFrame
+                        : FrameScheduler::FrameType::kSubframe)),
       loader_(this),
       navigation_scheduler_(NavigationScheduler::Create(this)),
       script_controller_(ScriptController::Create(
@@ -1377,7 +1326,9 @@
   GetDocument()->Shutdown();
 
   DomWindow()->InstallNewDocument(
-      mime_type, DocumentInit::Create().WithFrame(this), false);
+      mime_type,
+      DocumentInit::Create().WithDocumentLoader(loader_.GetDocumentLoader()),
+      false);
   loader_.StateMachine()->AdvanceTo(
       FrameLoaderStateMachine::kCommittedFirstRealLoad);
 
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index f6b5d59f..fbd25ea 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -42,10 +42,10 @@
 #include "third_party/blink/renderer/core/css/style_change_reason.h"
 #include "third_party/blink/renderer/core/dom/element_visibility_observer.h"
 #include "third_party/blink/renderer/core/dom/static_node_list.h"
+#include "third_party/blink/renderer/core/editing/compute_layer_selection.h"
 #include "third_party/blink/renderer/core/editing/drag_caret.h"
 #include "third_party/blink/renderer/core/editing/frame_selection.h"
 #include "third_party/blink/renderer/core/editing/markers/document_marker_controller.h"
-#include "third_party/blink/renderer/core/editing/rendered_position.h"
 #include "third_party/blink/renderer/core/events/error_event.h"
 #include "third_party/blink/renderer/core/exported/web_plugin_container_impl.h"
 #include "third_party/blink/renderer/core/frame/browser_controls.h"
@@ -169,6 +169,7 @@
 // EnsureUkmTimeAggregator().
 enum class UkmMetricNames {
   kCompositing,
+  kCompositingCommit,
   kIntersectionObservation,
   kPaint,
   kPrePaint,
@@ -2524,8 +2525,8 @@
   DCHECK(layout_view);
 
   if (!RuntimeEnabledFeatures::SlimmingPaintV2Enabled()) {
-    SCOPED_UMA_AND_UKM_TIMER("Blink.Compositing.UpdateTime",
-                             UkmMetricNames::kCompositing);
+    SCOPED_UMA_AND_UKM_TIMER("Blink.CompositingCommit.UpdateTime",
+                             UkmMetricNames::kCompositingCommit);
     layout_view->Compositor()->UpdateIfNeededRecursive(target_state);
   } else {
     ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) {
@@ -4439,8 +4440,8 @@
         frame_->GetDocument()->UkmRecorder(),
         // Note that changing the order or values of the following vector
         // requires changing the UkmMetricNames enum.
-        {"Compositing", "IntersectionObservation", "Paint", "PrePaint",
-         "StyleAndLayout"},
+        {"Compositing", "CompositingCommit", "IntersectionObservation", "Paint",
+         "PrePaint", "StyleAndLayout"},
         TimeDelta::FromSeconds(30)));
   }
   return *ukm_time_aggregator_;
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5
index 24f03d2..4394795 100644
--- a/third_party/blink/renderer/core/frame/settings.json5
+++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -575,11 +575,11 @@
       initial: false,
     },
 
-    // Set the timeout seconds of NetworkQuietTimers in FirstMeaningfulPainterDetector.
+    // Set the timeout seconds of the network-quiet timers in IdlenessDetector.
     // Used by embedders who want to change the timeout time in order to run web contents
     // on various embedded devices and changeable network bandwidths in different regions.
     {
-      name: "FMPNetworkQuietTimeout",
+      name: "NetworkQuietTimeout",
       initial: "0.5",
       type: "double",
     },
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 3ccc357b..4a3dbc8 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -1490,7 +1490,7 @@
     }
     if (!frame->Tree().IsDescendantOf(frame_))
       continue;
-    ToLocalFrame(frame)->DomWindow()->DispatchEvent(Event::Create(event_type));
+    ToLocalFrame(frame)->DomWindow()->DispatchEvent(*Event::Create(event_type));
   }
 }
 
diff --git a/third_party/blink/renderer/core/fullscreen/fullscreen.cc b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
index 1cc5721..6b1ea5c7f 100644
--- a/third_party/blink/renderer/core/fullscreen/fullscreen.cc
+++ b/third_party/blink/renderer/core/fullscreen/fullscreen.cc
@@ -440,7 +440,7 @@
   // set to true, at |target|.
   Event* event = Event::CreateBubble(type);
   event->SetComposed(true);
-  target->DispatchEvent(event);
+  target->DispatchEvent(*event);
 }
 
 const AtomicString& AdjustEventType(const AtomicString& type,
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
index 97277c0..2e92bd47 100644
--- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
+++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.h
@@ -269,7 +269,7 @@
   }
 
   DispatchEventResult HostDispatchEvent(Event* event) override {
-    return DispatchEvent(event);
+    return DispatchEvent(*event);
   }
 
   bool IsWebGL1Enabled() const override;
diff --git a/third_party/blink/renderer/core/html/focus_options.idl b/third_party/blink/renderer/core/html/focus_options.idl
index 8a9ef0fc..e9ee380 100644
--- a/third_party/blink/renderer/core/html/focus_options.idl
+++ b/third_party/blink/renderer/core/html/focus_options.idl
@@ -1,3 +1,3 @@
 dictionary FocusOptions {
-    [RuntimeEnabled=FocusOptions]boolean preventScroll = false;
+    boolean preventScroll = false;
 };
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index f0fd988..5c641aa1 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -361,7 +361,7 @@
 }
 
 void HTMLFormControlElement::DispatchChangeEvent() {
-  DispatchScopedEvent(Event::CreateBubble(EventTypeNames::change));
+  DispatchScopedEvent(*Event::CreateBubble(EventTypeNames::change));
 }
 
 HTMLFormElement* HTMLFormControlElement::formOwner() const {
@@ -544,7 +544,7 @@
     return false;
   Document* original_document = &GetDocument();
   DispatchEventResult dispatch_result =
-      DispatchEvent(Event::CreateCancelable(EventTypeNames::invalid));
+      DispatchEvent(*Event::CreateCancelable(EventTypeNames::invalid));
   if (dispatch_result == DispatchEventResult::kNotCanceled &&
       unhandled_invalid_controls && isConnected() &&
       original_document == GetDocument())
diff --git a/third_party/blink/renderer/core/html/forms/html_form_element.cc b/third_party/blink/renderer/core/html/forms/html_form_element.cc
index 7fd27d2..a8a475c 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_element.cc
@@ -289,7 +289,7 @@
                 "the end of the file. Please add an explicit end tag "
                 "('</" +
                 tag_name + ">')"));
-        DispatchEvent(Event::Create(EventTypeNames::error));
+        DispatchEvent(*Event::Create(EventTypeNames::error));
         return;
       }
     }
@@ -311,7 +311,7 @@
                                                      true);
     frame->Client()->DispatchWillSendSubmitEvent(this);
     should_submit =
-        DispatchEvent(Event::CreateCancelableBubble(EventTypeNames::submit)) ==
+        DispatchEvent(*Event::CreateCancelableBubble(EventTypeNames::submit)) ==
         DispatchEventResult::kNotCanceled;
   }
   if (should_submit) {
@@ -409,7 +409,7 @@
   // TODO(tkent): We might move the event dispatching later than the
   // ListedElements iteration.
   if (RuntimeEnabledFeatures::FormDataEventEnabled())
-    DispatchEvent(FormDataEvent::Create(form_data));
+    DispatchEvent(*FormDataEvent::Create(form_data));
 
   if (submit_button)
     submit_button->SetActivatedSubmit(true);
@@ -502,7 +502,7 @@
 
   is_in_reset_function_ = true;
 
-  if (DispatchEvent(Event::CreateCancelableBubble(EventTypeNames::reset)) !=
+  if (DispatchEvent(*Event::CreateCancelableBubble(EventTypeNames::reset)) !=
       DispatchEventResult::kNotCanceled) {
     is_in_reset_function_ = false;
     return;
diff --git a/third_party/blink/renderer/core/html/forms/search_input_type.cc b/third_party/blink/renderer/core/html/forms/search_input_type.cc
index 76c8167..e529bb0d 100644
--- a/third_party/blink/renderer/core/html/forms/search_input_type.cc
+++ b/third_party/blink/renderer/core/html/forms/search_input_type.cc
@@ -124,7 +124,7 @@
 
 void SearchInputType::DispatchSearchEvent() {
   search_event_timer_.Stop();
-  GetElement().DispatchEvent(Event::CreateBubble(EventTypeNames::search));
+  GetElement().DispatchEvent(*Event::CreateBubble(EventTypeNames::search));
 }
 
 void SearchInputType::SearchEventTimerFired(TimerBase*) {
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc
index 6526691..a17e8c2c 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -733,7 +733,7 @@
       frame->Selection().GetSelectionInDOMTree();
   if (selection.Type() != kRangeSelection)
     return;
-  DispatchEvent(Event::CreateBubble(EventTypeNames::select));
+  DispatchEvent(*Event::CreateBubble(EventTypeNames::select));
 }
 
 void TextControlElement::ScheduleSelectEvent() {
diff --git a/third_party/blink/renderer/core/html/html_details_element.cc b/third_party/blink/renderer/core/html/html_details_element.cc
index 5f229ac5..3873d06 100644
--- a/third_party/blink/renderer/core/html/html_details_element.cc
+++ b/third_party/blink/renderer/core/html/html_details_element.cc
@@ -67,7 +67,7 @@
 }
 
 void HTMLDetailsElement::DispatchPendingEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::toggle));
+  DispatchEvent(*Event::Create(EventTypeNames::toggle));
 }
 
 LayoutObject* HTMLDetailsElement::CreateLayoutObject(
diff --git a/third_party/blink/renderer/core/html/html_frame_owner_element.cc b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
index 4fd26d2..3bec9322 100644
--- a/third_party/blink/renderer/core/html/html_frame_owner_element.cc
+++ b/third_party/blink/renderer/core/html/html_frame_owner_element.cc
@@ -252,7 +252,7 @@
   if (lazy_load_frame_observer_)
     lazy_load_frame_observer_->RecordMetricsOnLoadFinished();
 
-  DispatchScopedEvent(Event::Create(EventTypeNames::load));
+  DispatchScopedEvent(*Event::Create(EventTypeNames::load));
 }
 
 const ParsedFeaturePolicy& HTMLFrameOwnerElement::ContainerPolicy() const {
diff --git a/third_party/blink/renderer/core/html/html_image_loader.cc b/third_party/blink/renderer/core/html/html_image_loader.cc
index 45bcc55..037b0f9 100644
--- a/third_party/blink/renderer/core/html/html_image_loader.cc
+++ b/third_party/blink/renderer/core/html/html_image_loader.cc
@@ -52,7 +52,7 @@
     // An <object> considers a 404 to be an error and should fire onerror.
     error_occurred = (GetContent()->GetResponse().HttpStatusCode() >= 400);
   }
-  GetElement()->DispatchEvent(Event::Create(
+  GetElement()->DispatchEvent(*Event::Create(
       error_occurred ? EventTypeNames::error : EventTypeNames::load));
 }
 
diff --git a/third_party/blink/renderer/core/html/html_link_element.cc b/third_party/blink/renderer/core/html/html_link_element.cc
index fc310ad5..f666bc92 100644
--- a/third_party/blink/renderer/core/html/html_link_element.cc
+++ b/third_party/blink/renderer/core/html/html_link_element.cc
@@ -261,27 +261,28 @@
 }
 
 void HTMLLinkElement::LinkLoaded() {
-  DispatchEvent(Event::Create(EventTypeNames::load));
+  DispatchEvent(*Event::Create(EventTypeNames::load));
 }
 
 void HTMLLinkElement::LinkLoadingErrored() {
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 void HTMLLinkElement::DidStartLinkPrerender() {
-  DispatchEvent(Event::Create(EventTypeNames::webkitprerenderstart));
+  DispatchEvent(*Event::Create(EventTypeNames::webkitprerenderstart));
 }
 
 void HTMLLinkElement::DidStopLinkPrerender() {
-  DispatchEvent(Event::Create(EventTypeNames::webkitprerenderstop));
+  DispatchEvent(*Event::Create(EventTypeNames::webkitprerenderstop));
 }
 
 void HTMLLinkElement::DidSendLoadForLinkPrerender() {
-  DispatchEvent(Event::Create(EventTypeNames::webkitprerenderload));
+  DispatchEvent(*Event::Create(EventTypeNames::webkitprerenderload));
 }
 
 void HTMLLinkElement::DidSendDOMContentLoadedForLinkPrerender() {
-  DispatchEvent(Event::Create(EventTypeNames::webkitprerenderdomcontentloaded));
+  DispatchEvent(
+      *Event::Create(EventTypeNames::webkitprerenderdomcontentloaded));
 }
 
 scoped_refptr<base::SingleThreadTaskRunner>
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.cc b/third_party/blink/renderer/core/html/html_plugin_element.cc
index 87a0e73..fb66fe1 100644
--- a/third_party/blink/renderer/core/html/html_plugin_element.cc
+++ b/third_party/blink/renderer/core/html/html_plugin_element.cc
@@ -636,11 +636,12 @@
 }
 
 void HTMLPlugInElement::DispatchErrorEvent() {
-  if (GetDocument().IsPluginDocument() && GetDocument().LocalOwner())
+  if (GetDocument().IsPluginDocument() && GetDocument().LocalOwner()) {
     GetDocument().LocalOwner()->DispatchEvent(
-        Event::Create(EventTypeNames::error));
-  else
-    DispatchEvent(Event::Create(EventTypeNames::error));
+        *Event::Create(EventTypeNames::error));
+  } else {
+    DispatchEvent(*Event::Create(EventTypeNames::error));
+  }
 }
 
 bool HTMLPlugInElement::AllowedToLoadObject(const KURL& url,
diff --git a/third_party/blink/renderer/core/html/html_script_element.cc b/third_party/blink/renderer/core/html/html_script_element.cc
index d469962..50187b0 100644
--- a/third_party/blink/renderer/core/html/html_script_element.cc
+++ b/third_party/blink/renderer/core/html/html_script_element.cc
@@ -208,11 +208,11 @@
 }
 
 void HTMLScriptElement::DispatchLoadEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::load));
+  DispatchEvent(*Event::Create(EventTypeNames::load));
 }
 
 void HTMLScriptElement::DispatchErrorEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 void HTMLScriptElement::SetScriptElementForBinding(
diff --git a/third_party/blink/renderer/core/html/html_slot_element.cc b/third_party/blink/renderer/core/html/html_slot_element.cc
index aae0b3c..ee8af18 100644
--- a/third_party/blink/renderer/core/html/html_slot_element.cc
+++ b/third_party/blink/renderer/core/html/html_slot_element.cc
@@ -278,7 +278,7 @@
   DCHECK(!IsInUserAgentShadowRoot());
   Event* event = Event::CreateBubble(EventTypeNames::slotchange);
   event->SetTarget(this);
-  DispatchScopedEvent(event);
+  DispatchScopedEvent(*event);
 }
 
 Node* HTMLSlotElement::AssignedNodeNextTo(const Node& node) const {
diff --git a/third_party/blink/renderer/core/html/html_source_element.cc b/third_party/blink/renderer/core/html/html_source_element.cc
index ff13fd9..ed02971 100644
--- a/third_party/blink/renderer/core/html/html_source_element.cc
+++ b/third_party/blink/renderer/core/html/html_source_element.cc
@@ -155,7 +155,7 @@
 
 void HTMLSourceElement::DispatchPendingEvent() {
   DVLOG(SOURCE_LOG_LEVEL) << "dispatchPendingEvent - " << (void*)this;
-  DispatchEvent(Event::CreateCancelable(EventTypeNames::error));
+  DispatchEvent(*Event::CreateCancelable(EventTypeNames::error));
 }
 
 bool HTMLSourceElement::MediaQueryMatches() const {
diff --git a/third_party/blink/renderer/core/html/html_style_element.cc b/third_party/blink/renderer/core/html/html_style_element.cc
index 9822de60..1f5d4cf 100644
--- a/third_party/blink/renderer/core/html/html_style_element.cc
+++ b/third_party/blink/renderer/core/html/html_style_element.cc
@@ -113,9 +113,9 @@
   if (loaded_sheet_) {
     if (GetDocument().HasListenerType(
             Document::kLoadListenerAtCapturePhaseOrAtStyleElement))
-      DispatchEvent(Event::Create(EventTypeNames::load));
+      DispatchEvent(*Event::Create(EventTypeNames::load));
   } else {
-    DispatchEvent(Event::Create(EventTypeNames::error));
+    DispatchEvent(*Event::Create(EventTypeNames::error));
   }
   // Checks Document's load event synchronously here for performance.
   // This is safe because dispatchPendingEvent() is called asynchronously.
diff --git a/third_party/blink/renderer/core/html/image_document_test.cc b/third_party/blink/renderer/core/html/image_document_test.cc
index 97a78a6a..05cf416 100644
--- a/third_party/blink/renderer/core/html/image_document_test.cc
+++ b/third_party/blink/renderer/core/html/image_document_test.cc
@@ -105,7 +105,8 @@
 
   LocalFrame& frame = dummy_page_holder_->GetFrame();
   frame.GetDocument()->Shutdown();
-  DocumentInit init = DocumentInit::Create().WithFrame(&frame);
+  DocumentInit init = DocumentInit::Create().WithDocumentLoader(
+      frame.Loader().GetDocumentLoader());
   frame.DomWindow()->InstallNewDocument("image/jpeg", init, false);
 }
 
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.cc b/third_party/blink/renderer/core/html/track/html_track_element.cc
index 323b423..7e294424 100644
--- a/third_party/blink/renderer/core/html/track/html_track_element.cc
+++ b/third_party/blink/renderer/core/html/track/html_track_element.cc
@@ -259,7 +259,7 @@
   // simple event named error at the track element.
   if (status == kFailure) {
     SetReadyState(kError);
-    DispatchEvent(Event::Create(EventTypeNames::error));
+    DispatchEvent(*Event::Create(EventTypeNames::error));
     return;
   }
 
@@ -269,7 +269,7 @@
   // readiness state to loaded, and fire a simple event named load at the track
   // element.
   SetReadyState(kLoaded);
-  DispatchEvent(Event::Create(EventTypeNames::load));
+  DispatchEvent(*Event::Create(EventTypeNames::load));
 }
 
 void HTMLTrackElement::NewCuesAvailable(TextTrackLoader* loader) {
diff --git a/third_party/blink/renderer/core/html/track/text_track_cue.cc b/third_party/blink/renderer/core/html/track/text_track_cue.cc
index dd087a5..2c037af 100644
--- a/third_party/blink/renderer/core/html/track/text_track_cue.cc
+++ b/third_party/blink/renderer/core/html/track/text_track_cue.cc
@@ -120,7 +120,7 @@
   return cue_index_;
 }
 
-DispatchEventResult TextTrackCue::DispatchEventInternal(Event* event) {
+DispatchEventResult TextTrackCue::DispatchEventInternal(Event& event) {
   // When a TextTrack's mode is disabled: no cues are active, no events fired.
   if (!track() || track()->mode() == TextTrack::DisabledKeyword())
     return DispatchEventResult::kCanceledBeforeDispatch;
diff --git a/third_party/blink/renderer/core/html/track/text_track_cue.h b/third_party/blink/renderer/core/html/track/text_track_cue.h
index ab7eac0..51d3734 100644
--- a/third_party/blink/renderer/core/html/track/text_track_cue.h
+++ b/third_party/blink/renderer/core/html/track/text_track_cue.h
@@ -109,7 +109,7 @@
   void CueWillChange();
   virtual void CueDidChange(
       CueMutationAffectsOrder = kCueMutationDoesNotAffectOrder);
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
 
  private:
   AtomicString id_;
diff --git a/third_party/blink/renderer/core/input/event_handler.cc b/third_party/blink/renderer/core/input/event_handler.cc
index e0037e8..245172b 100644
--- a/third_party/blink/renderer/core/input/event_handler.cc
+++ b/third_party/blink/renderer/core/input/event_handler.cc
@@ -2108,7 +2108,7 @@
   TextEvent* event = TextEvent::Create(frame_->DomWindow(), text, input_type);
   event->SetUnderlyingEvent(underlying_event);
 
-  target->DispatchEvent(event);
+  target->DispatchEvent(*event);
   return event->DefaultHandled() || event->defaultPrevented();
 }
 
diff --git a/third_party/blink/renderer/core/input/gesture_manager.cc b/third_party/blink/renderer/core/input/gesture_manager.cc
index ec56b34..7f90e404 100644
--- a/third_party/blink/renderer/core/input/gesture_manager.cc
+++ b/third_party/blink/renderer/core/input/gesture_manager.cc
@@ -103,7 +103,7 @@
         event_target->GetDocument().domWindow(), gesture_event);
     if (gesture_dom_event) {
       DispatchEventResult gesture_dom_event_result =
-          event_target->DispatchEvent(gesture_dom_event);
+          event_target->DispatchEvent(*gesture_dom_event);
       if (gesture_dom_event_result != DispatchEventResult::kNotCanceled) {
         DCHECK(gesture_dom_event_result !=
                DispatchEventResult::kCanceledByEventHandler);
diff --git a/third_party/blink/renderer/core/input/keyboard_event_manager.cc b/third_party/blink/renderer/core/input/keyboard_event_manager.cc
index c38c4648..a3be8df0 100644
--- a/third_party/blink/renderer/core/input/keyboard_event_manager.cc
+++ b/third_party/blink/renderer/core/input/keyboard_event_manager.cc
@@ -221,7 +221,7 @@
         initial_key_event, frame_->GetDocument()->domWindow());
 
     return EventHandlingUtil::ToWebInputEventResult(
-        node->DispatchEvent(dom_event));
+        node->DispatchEvent(*dom_event));
   }
 
   WebKeyboardEvent key_down_event = initial_key_event;
@@ -233,7 +233,7 @@
     keydown->SetDefaultPrevented(true);
   keydown->SetTarget(node);
 
-  DispatchEventResult dispatch_result = node->DispatchEvent(keydown);
+  DispatchEventResult dispatch_result = node->DispatchEvent(*keydown);
   if (dispatch_result != DispatchEventResult::kNotCanceled)
     return EventHandlingUtil::ToWebInputEventResult(dispatch_result);
   // If frame changed as a result of keydown dispatch, then return early to
@@ -273,7 +273,7 @@
       key_press_event, frame_->GetDocument()->domWindow());
   keypress->SetTarget(node);
   return EventHandlingUtil::ToWebInputEventResult(
-      node->DispatchEvent(keypress));
+      node->DispatchEvent(*keypress));
 }
 
 void KeyboardEventManager::CapsLockStateMayHaveChanged() {
@@ -410,7 +410,7 @@
 
 void KeyboardEventManager::DefaultEscapeEventHandler(KeyboardEvent* event) {
   if (HTMLDialogElement* dialog = frame_->GetDocument()->ActiveModalDialog())
-    dialog->DispatchEvent(Event::CreateCancelable(EventTypeNames::cancel));
+    dialog->DispatchEvent(*Event::CreateCancelable(EventTypeNames::cancel));
 }
 
 static OverrideCapsLockState g_override_caps_lock_state;
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc
index e0d2de7f..862480d 100644
--- a/third_party/blink/renderer/core/input/mouse_event_manager.cc
+++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -256,7 +256,7 @@
                                 : MouseEvent::kRealOrIndistinguishable,
         mouse_event.menu_source_type);
 
-    DispatchEventResult dispatch_result = target->DispatchEvent(event);
+    DispatchEventResult dispatch_result = target->DispatchEvent(*event);
     return EventHandlingUtil::ToWebInputEventResult(dispatch_result);
   }
   return WebInputEventResult::kNotHandled;
@@ -1051,7 +1051,7 @@
                                         : MouseEvent::kRealOrIndistinguishable);
 
   return EventHandlingUtil::ToWebInputEventResult(
-      drag_target->DispatchEvent(me));
+      drag_target->DispatchEvent(*me));
 }
 
 void MouseEventManager::ClearDragDataTransfer() {
diff --git a/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc b/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc
index b0de43f4..5525e3d 100644
--- a/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc
+++ b/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc
@@ -83,7 +83,7 @@
     bool should_enforce_vertical_scroll =
         wheel_target_->GetDocument().IsVerticalScrollEnforced();
     DispatchEventResult dom_event_result =
-        wheel_target_->DispatchEvent(dom_event);
+        wheel_target_->DispatchEvent(*dom_event);
     if (dom_event_result != DispatchEventResult::kNotCanceled) {
       // Reset the target if the dom event is cancelled to make sure that new
       // targeting happens for the next wheel event.
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc
index 1a98185..6986dedf 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -181,7 +181,7 @@
 
     DCHECK(!dispatching_pointer_id_);
     base::AutoReset<int> dispatch_holder(&dispatching_pointer_id_, pointer_id);
-    DispatchEventResult dispatch_result = target->DispatchEvent(pointer_event);
+    DispatchEventResult dispatch_result = target->DispatchEvent(*pointer_event);
     return EventHandlingUtil::ToWebInputEventResult(dispatch_result);
   }
   return WebInputEventResult::kNotHandled;
diff --git a/third_party/blink/renderer/core/input/scroll_manager.cc b/third_party/blink/renderer/core/input/scroll_manager.cc
index 9bce900f..76198bea 100644
--- a/third_party/blink/renderer/core/input/scroll_manager.cc
+++ b/third_party/blink/renderer/core/input/scroll_manager.cc
@@ -810,7 +810,7 @@
         event_target->GetDocument().domWindow(), gesture_event);
     if (gesture_dom_event) {
       DispatchEventResult gesture_dom_event_result =
-          event_target->DispatchEvent(gesture_dom_event);
+          event_target->DispatchEvent(*gesture_dom_event);
       if (gesture_dom_event_result != DispatchEventResult::kNotCanceled) {
         DCHECK(gesture_dom_event_result !=
                DispatchEventResult::kCanceledByEventHandler);
diff --git a/third_party/blink/renderer/core/input/touch_event_manager.cc b/third_party/blink/renderer/core/input/touch_event_manager.cc
index adc2e8d8..6f2fa50 100644
--- a/third_party/blink/renderer/core/input/touch_event_manager.cc
+++ b/third_party/blink/renderer/core/input/touch_event_manager.cc
@@ -478,7 +478,7 @@
           current_touch_action_);
 
       DispatchEventResult dom_dispatch_result =
-          touch_event_target->DispatchEvent(touch_event);
+          touch_event_target->DispatchEvent(*touch_event);
 
       event_result = EventHandlingUtil::MergeEventResult(
           event_result,
diff --git a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
index 519a149..d0c272a 100644
--- a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.cc
@@ -35,36 +35,32 @@
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
 namespace blink {
-
 using protocol::Response;
 
-namespace ApplicationCacheAgentState {
-static const char kApplicationCacheAgentEnabled[] =
-    "applicationCacheAgentEnabled";
-}
-
 InspectorApplicationCacheAgent::InspectorApplicationCacheAgent(
     InspectedFrames* inspected_frames)
-    : inspected_frames_(inspected_frames) {}
+    : inspected_frames_(inspected_frames),
+      enabled_(&agent_state_, /*default_value=*/false) {}
+
+void InspectorApplicationCacheAgent::InnerEnable() {
+  enabled_.Set(true);
+  instrumenting_agents_->addInspectorApplicationCacheAgent(this);
+  GetFrontend()->networkStateUpdated(GetNetworkStateNotifier().OnLine());
+}
 
 void InspectorApplicationCacheAgent::Restore() {
-  if (state_->booleanProperty(
-          ApplicationCacheAgentState::kApplicationCacheAgentEnabled, false)) {
-    enable();
-  }
+  if (enabled_.Get())
+    InnerEnable();
 }
 
 Response InspectorApplicationCacheAgent::enable() {
-  state_->setBoolean(ApplicationCacheAgentState::kApplicationCacheAgentEnabled,
-                     true);
-  instrumenting_agents_->addInspectorApplicationCacheAgent(this);
-  GetFrontend()->networkStateUpdated(GetNetworkStateNotifier().OnLine());
+  if (!enabled_.Get())
+    InnerEnable();
   return Response::OK();
 }
 
 Response InspectorApplicationCacheAgent::disable() {
-  state_->setBoolean(ApplicationCacheAgentState::kApplicationCacheAgentEnabled,
-                     false);
+  enabled_.Clear();
   instrumenting_agents_->removeInspectorApplicationCacheAgent(this);
   return Response::OK();
 }
diff --git a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h
index 8aa426b..8853a40 100644
--- a/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_application_cache_agent.h
@@ -68,6 +68,9 @@
       std::unique_ptr<protocol::ApplicationCache::ApplicationCache>*) override;
 
  private:
+  // Unconditionally enables the agent, even if |enabled_.Get()==true|.
+  // For idempotence, call enable().
+  void InnerEnable();
   explicit InspectorApplicationCacheAgent(InspectedFrames*);
 
   std::unique_ptr<protocol::ApplicationCache::ApplicationCache>
@@ -85,6 +88,7 @@
                                                    DocumentLoader*&);
 
   Member<InspectedFrames> inspected_frames_;
+  InspectorAgentState::Boolean enabled_;
   DISALLOW_COPY_AND_ASSIGN(InspectorApplicationCacheAgent);
 };
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_base_agent.h b/third_party/blink/renderer/core/inspector/inspector_base_agent.h
index e089208..2f7c429 100644
--- a/third_party/blink/renderer/core/inspector/inspector_base_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_base_agent.h
@@ -56,7 +56,6 @@
 
   virtual void Init(CoreProbeSink*,
                     protocol::UberDispatcher*,
-                    protocol::DictionaryValue*,
                     InspectorSessionState*) = 0;
   virtual void Dispose() = 0;
 };
@@ -69,20 +68,12 @@
 
   void Init(CoreProbeSink* instrumenting_agents,
             protocol::UberDispatcher* dispatcher,
-            protocol::DictionaryValue* state,
             InspectorSessionState* session_state) override {
     instrumenting_agents_ = instrumenting_agents;
     frontend_.reset(
         new typename DomainMetainfo::FrontendClass(dispatcher->channel()));
     DomainMetainfo::DispatcherClass::wire(dispatcher, this);
 
-    state_ = state->getObject(DomainMetainfo::domainName);
-    if (!state_) {
-      std::unique_ptr<protocol::DictionaryValue> new_state =
-          protocol::DictionaryValue::create();
-      state_ = new_state.get();
-      state->setObject(DomainMetainfo::domainName, std::move(new_state));
-    }
     agent_state_.InitFrom(session_state);
   }
 
@@ -91,7 +82,6 @@
   void Dispose() override {
     disable();
     frontend_.reset();
-    state_ = nullptr;
     instrumenting_agents_ = nullptr;
   }
 
@@ -107,7 +97,6 @@
     return frontend_.get();
   }
   Member<CoreProbeSink> instrumenting_agents_;
-  protocol::DictionaryValue* state_;
   InspectorAgentState agent_state_;
 
  private:
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
index 6e6dc1c..701df26 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.cc
@@ -90,10 +90,6 @@
 using protocol::Maybe;
 using protocol::Response;
 
-namespace DOMAgentState {
-static const char kDomAgentEnabled[] = "domAgentEnabled";
-};
-
 namespace {
 
 const size_t kMaxTextSize = 10000;
@@ -242,14 +238,14 @@
       dom_listener_(nullptr),
       document_node_to_id_map_(new NodeToIdMap()),
       last_node_id_(1),
-      suppress_attribute_modified_event_(false) {}
+      suppress_attribute_modified_event_(false),
+      enabled_(&agent_state_, /*default_value=*/false) {}
 
 InspectorDOMAgent::~InspectorDOMAgent() = default;
 
 void InspectorDOMAgent::Restore() {
-  if (!Enabled())
-    return;
-  InnerEnable();
+  if (enabled_.Get())
+    EnableAndReset();
 }
 
 HeapVector<Member<Document>> InspectorDOMAgent::Documents() {
@@ -274,7 +270,7 @@
   DiscardFrontendBindings();
   document_ = doc;
 
-  if (!Enabled())
+  if (!enabled_.Get())
     return;
 
   // Immediately communicate 0 document or document that has finished loading.
@@ -282,6 +278,10 @@
     GetFrontend()->documentUpdated();
 }
 
+bool InspectorDOMAgent::Enabled() const {
+  return enabled_.Get();
+}
+
 void InspectorDOMAgent::ReleaseDanglingNodes() {
   dangling_node_to_id_maps_.clear();
 }
@@ -448,8 +448,8 @@
   return Response::OK();
 }
 
-void InspectorDOMAgent::InnerEnable() {
-  state_->setBoolean(DOMAgentState::kDomAgentEnabled, true);
+void InspectorDOMAgent::EnableAndReset() {
+  enabled_.Set(true);
   history_ = new InspectorHistory();
   dom_editor_ = new DOMEditor(history_.Get());
   document_ = inspected_frames_->Root()->GetDocument();
@@ -457,19 +457,15 @@
 }
 
 Response InspectorDOMAgent::enable() {
-  if (!Enabled())
-    InnerEnable();
+  if (!enabled_.Get())
+    EnableAndReset();
   return Response::OK();
 }
 
-bool InspectorDOMAgent::Enabled() const {
-  return state_->booleanProperty(DOMAgentState::kDomAgentEnabled, false);
-}
-
 Response InspectorDOMAgent::disable() {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent hasn't been enabled");
-  state_->setBoolean(DOMAgentState::kDomAgentEnabled, false);
+  enabled_.Clear();
   instrumenting_agents_->removeInspectorDOMAgent(this);
   history_.Clear();
   dom_editor_.Clear();
@@ -482,8 +478,7 @@
     Maybe<bool> pierce,
     std::unique_ptr<protocol::DOM::Node>* root) {
   // Backward compatibility. Mark agent as enabled when it requests document.
-  if (!Enabled())
-    InnerEnable();
+  enable();
 
   if (!document_)
     return Response::Error("Document is not available");
@@ -504,7 +499,7 @@
     Maybe<int> depth,
     Maybe<bool> pierce,
     std::unique_ptr<protocol::Array<protocol::DOM::Node>>* nodes) {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent hasn't been enabled");
 
   if (!document_)
@@ -964,7 +959,7 @@
     Maybe<bool> optional_include_user_agent_shadow_dom,
     String* search_id,
     int* result_count) {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent is not enabled");
 
   // FIXME: Few things are missing here:
@@ -1224,7 +1219,7 @@
 }
 
 Response InspectorDOMAgent::undo() {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent is not enabled");
   DummyExceptionStateForTesting exception_state;
   history_->Undo(exception_state);
@@ -1232,7 +1227,7 @@
 }
 
 Response InspectorDOMAgent::redo() {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent is not enabled");
   DummyExceptionStateForTesting exception_state;
   history_->Redo(exception_state);
@@ -1317,7 +1312,7 @@
     int y,
     Maybe<bool> optional_include_user_agent_shadow_dom,
     int* node_id) {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent is not enabled");
   bool include_user_agent_shadow_dom =
       optional_include_user_agent_shadow_dom.fromMaybe(false);
@@ -1812,7 +1807,7 @@
 
   // Re-push document once it is loaded.
   DiscardFrontendBindings();
-  if (Enabled())
+  if (enabled_.Get())
     GetFrontend()->documentUpdated();
 }
 
@@ -2145,7 +2140,7 @@
 
 Response InspectorDOMAgent::pushNodeByPathToFrontend(const String& path,
                                                      int* node_id) {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent is not enabled");
   if (Node* node = NodeForPath(path))
     *node_id = PushNodePathToFrontend(node);
@@ -2157,7 +2152,7 @@
 Response InspectorDOMAgent::pushNodesByBackendIdsToFrontend(
     std::unique_ptr<protocol::Array<int>> backend_node_ids,
     std::unique_ptr<protocol::Array<int>>* result) {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM agent is not enabled");
   *result = protocol::Array<int>::create();
   for (size_t index = 0; index < backend_node_ids->length(); ++index) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_agent.h b/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
index cf7a5d1..7399d07 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_agent.h
@@ -279,7 +279,9 @@
 
  private:
   void SetDocument(Document*);
-  void InnerEnable();
+  // Unconditionally enables the agent, even if |enabled_.Get()==true|.
+  // For idempotence, call enable().
+  void EnableAndReset();
 
   // Node-related methods.
   typedef HeapHashMap<Member<Node>, int> NodeToIdMap;
@@ -347,6 +349,7 @@
   Member<InspectorHistory> history_;
   Member<DOMEditor> dom_editor_;
   bool suppress_attribute_modified_event_;
+  InspectorAgentState::Boolean enabled_;
   DISALLOW_COPY_AND_ASSIGN(InspectorDOMAgent);
 };
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
index 7c659df..c278a3b 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_debugger_agent.cc
@@ -216,9 +216,7 @@
 Response InspectorDOMDebuggerAgent::disable() {
   SetEnabled(false);
   dom_breakpoints_.clear();
-  xhr_breakpoints_.ClearAll();
-  pause_on_all_xhrs_.Clear();
-  event_listener_breakpoints_.ClearAll();
+  agent_state_.ClearAllFields();
   return Response::OK();
 }
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
index 71dcf382..cddcb5b2 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.cc
@@ -43,14 +43,9 @@
 #include "v8/include/v8-inspector.h"
 
 namespace blink {
-
 using protocol::Maybe;
 using protocol::Response;
 
-namespace DOMSnapshotAgentState {
-static const char kDomSnapshotAgentEnabled[] = "DOMSnapshotAgentEnabled";
-};
-
 namespace {
 
 std::unique_ptr<protocol::DOM::Rect> BuildRectForFloatRect(
@@ -148,15 +143,11 @@
     InspectedFrames* inspected_frames,
     InspectorDOMDebuggerAgent* dom_debugger_agent)
     : inspected_frames_(inspected_frames),
-      dom_debugger_agent_(dom_debugger_agent) {}
+      dom_debugger_agent_(dom_debugger_agent),
+      enabled_(&agent_state_, /*default_value=*/false) {}
 
 InspectorDOMSnapshotAgent::~InspectorDOMSnapshotAgent() = default;
 
-bool InspectorDOMSnapshotAgent::Enabled() const {
-  return state_->booleanProperty(
-      DOMSnapshotAgentState::kDomSnapshotAgentEnabled, false);
-}
-
 void InspectorDOMSnapshotAgent::GetOriginUrl(String* origin_url_ptr,
                                              const Node* node) {
   v8::Isolate* isolate = v8::Isolate::GetCurrent();
@@ -197,28 +188,27 @@
     origin_url_map_->insert(DOMNodeIds::IdForNode(node), origin_url);
 }
 
-void InspectorDOMSnapshotAgent::InnerEnable() {
-  state_->setBoolean(DOMSnapshotAgentState::kDomSnapshotAgentEnabled, true);
+void InspectorDOMSnapshotAgent::EnableAndReset() {
+  enabled_.Set(true);
   origin_url_map_ = std::make_unique<OriginUrlMap>();
   instrumenting_agents_->addInspectorDOMSnapshotAgent(this);
 }
 
 void InspectorDOMSnapshotAgent::Restore() {
-  if (!Enabled())
-    return;
-  InnerEnable();
+  if (enabled_.Get())
+    EnableAndReset();
 }
 
 Response InspectorDOMSnapshotAgent::enable() {
-  if (!Enabled())
-    InnerEnable();
+  if (!enabled_.Get())
+    EnableAndReset();
   return Response::OK();
 }
 
 Response InspectorDOMSnapshotAgent::disable() {
-  if (!Enabled())
+  if (!enabled_.Get())
     return Response::Error("DOM snapshot agent hasn't been enabled.");
-  state_->setBoolean(DOMSnapshotAgentState::kDomSnapshotAgentEnabled, false);
+  enabled_.Clear();
   origin_url_map_.reset();
   instrumenting_agents_->removeInspectorDOMSnapshotAgent(this);
   return Response::OK();
diff --git a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h
index 455ab8b..603dad2 100644
--- a/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_dom_snapshot_agent.h
@@ -55,15 +55,15 @@
           documents,
       std::unique_ptr<protocol::Array<String>>* strings) override;
 
-  bool Enabled() const;
-
   // InspectorInstrumentation API.
   void CharacterDataModified(CharacterData*);
   void DidInsertDOMNode(Node*);
 
  private:
   InspectorDOMSnapshotAgent(InspectedFrames*, InspectorDOMDebuggerAgent*);
-  void InnerEnable();
+  // Unconditionally enables the agent, even if |enabled_.Get()==true|.
+  // For idempotence, call enable().
+  void EnableAndReset();
 
   int VisitNode(Node*,
                 bool include_event_listeners,
@@ -165,7 +165,7 @@
   DocumentOrderMap document_order_map_;
   Member<InspectedFrames> inspected_frames_;
   Member<InspectorDOMDebuggerAgent> dom_debugger_agent_;
-
+  InspectorAgentState::Boolean enabled_;
   DISALLOW_COPY_AND_ASSIGN(InspectorDOMSnapshotAgent);
 };
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
index 93b97d2..a0f3790 100644
--- a/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_log_agent.cc
@@ -227,7 +227,7 @@
   if (!performance_monitor_)
     return Response::Error("Violations are not supported for this target");
   performance_monitor_->UnsubscribeAll(this);
-  violation_thresholds_.ClearAll();
+  violation_thresholds_.Clear();
   for (size_t i = 0; i < settings->length(); ++i) {
     const WTF::String& name = settings->get(i)->getName();
     double threshold = settings->get(i)->getThreshold();
@@ -242,7 +242,7 @@
 }
 
 Response InspectorLogAgent::stopViolationsReport() {
-  violation_thresholds_.ClearAll();
+  violation_thresholds_.Clear();
   if (!performance_monitor_)
     return Response::Error("Violations are not supported for this target");
   performance_monitor_->UnsubscribeAll(this);
diff --git a/third_party/blink/renderer/core/inspector/inspector_session.cc b/third_party/blink/renderer/core/inspector/inspector_session.cc
index 7a0fa050..caa6c8bb 100644
--- a/third_party/blink/renderer/core/inspector/inspector_session.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_session.cc
@@ -25,7 +25,6 @@
     int session_id,
     v8_inspector::V8Inspector* inspector,
     int context_group_id,
-    const String& reattach_state,
     mojom::blink::DevToolsSessionStatePtr reattach_session_state)
     : client_(client),
       v8_session_(nullptr),
@@ -33,21 +32,13 @@
       disposed_(false),
       instrumenting_agents_(instrumenting_agents),
       inspector_backend_dispatcher_(new protocol::UberDispatcher(this)),
-      session_state_(std::move(reattach_session_state)) {
-  String v8_state;
-  if (!reattach_state.IsNull()) {
-    std::unique_ptr<protocol::Value> state =
-        protocol::StringUtil::parseJSON(reattach_state);
-    if (state)
-      state_ = protocol::DictionaryValue::cast(std::move(state));
-    if (!state_)
-      state_ = protocol::DictionaryValue::create();
-    state_->getString(kV8StateKey, &v8_state);
-  } else {
-    state_ = protocol::DictionaryValue::create();
-  }
-  v8_session_ = inspector->connect(context_group_id, this,
-                                   ToV8InspectorStringView(v8_state));
+      session_state_(std::move(reattach_session_state)),
+      v8_session_state_(kV8StateKey),
+      v8_session_state_json_(&v8_session_state_, /*default_value=*/String()) {
+  v8_session_state_.InitFrom(&session_state_);
+  v8_session_ =
+      inspector->connect(context_group_id, this,
+                         ToV8InspectorStringView(v8_session_state_json_.Get()));
 }
 
 InspectorSession::~InspectorSession() {
@@ -57,7 +48,7 @@
 void InspectorSession::Append(InspectorAgent* agent) {
   agents_.push_back(agent);
   agent->Init(instrumenting_agents_.Get(), inspector_backend_dispatcher_.get(),
-              state_.get(), &session_state_);
+              &session_state_);
 }
 
 void InspectorSession::Restore() {
@@ -140,21 +131,11 @@
   if (disposed_)
     return;
   flushProtocolNotifications();
-  client_->SendProtocolResponse(session_id_, call_id, message, GetStateToSend(),
+  v8_session_state_json_.Set(ToCoreString(v8_session_->stateJSON()));
+  client_->SendProtocolResponse(session_id_, call_id, message,
                                 session_state_.TakeUpdates());
 }
 
-String InspectorSession::GetStateToSend() {
-  if (v8_session_)
-    state_->setString(kV8StateKey, ToCoreString(v8_session_->stateJSON()));
-  String state_to_send = state_->serialize();
-  if (state_to_send == last_sent_state_)
-    state_to_send = String();
-  else
-    last_sent_state_ = state_to_send;
-  return state_to_send;
-}
-
 class InspectorSession::Notification {
  public:
   static std::unique_ptr<Notification> CreateForBlink(
@@ -216,13 +197,11 @@
     agents_[i]->FlushPendingProtocolNotifications();
   if (!notification_queue_.size())
     return;
-  String state_to_send = GetStateToSend();
+  v8_session_state_json_.Set(ToCoreString(v8_session_->stateJSON()));
   for (size_t i = 0; i < notification_queue_.size(); ++i) {
-    client_->SendProtocolNotification(
-        session_id_, notification_queue_[i]->Serialize(), state_to_send,
-        session_state_.TakeUpdates());
-    // Only send state once in this series of serialized updates.
-    state_to_send = String();
+    client_->SendProtocolNotification(session_id_,
+                                      notification_queue_[i]->Serialize(),
+                                      session_state_.TakeUpdates());
   }
   notification_queue_.clear();
 }
diff --git a/third_party/blink/renderer/core/inspector/inspector_session.h b/third_party/blink/renderer/core/inspector/inspector_session.h
index 8d56cbb..1f913f21 100644
--- a/third_party/blink/renderer/core/inspector/inspector_session.h
+++ b/third_party/blink/renderer/core/inspector/inspector_session.h
@@ -33,12 +33,10 @@
         int session_id,
         int call_id,
         const String& response,
-        const String& state,
         mojom::blink::DevToolsSessionStatePtr updates) = 0;
     virtual void SendProtocolNotification(
         int session_id,
         const String& message,
-        const String& state,
         mojom::blink::DevToolsSessionStatePtr updates) = 0;
     virtual ~Client() = default;
   };
@@ -49,7 +47,6 @@
       int session_id,
       v8_inspector::V8Inspector*,
       int context_group_id,
-      const String& reattach_state,
       mojom::blink::DevToolsSessionStatePtr reattach_session_state);
   ~InspectorSession() override;
   // TODO(dgozman): remove session id once WokrerInspectorController
@@ -89,20 +86,18 @@
                    const String& method,
                    const String& message) override;
 
-  String GetStateToSend();
-
   Client* client_;
   std::unique_ptr<v8_inspector::V8InspectorSession> v8_session_;
   int session_id_;
   bool disposed_;
   Member<CoreProbeSink> instrumenting_agents_;
   std::unique_ptr<protocol::UberDispatcher> inspector_backend_dispatcher_;
-  std::unique_ptr<protocol::DictionaryValue> state_;
   InspectorSessionState session_state_;
   HeapVector<Member<InspectorAgent>> agents_;
   class Notification;
   Vector<std::unique_ptr<Notification>> notification_queue_;
-  String last_sent_state_;
+  InspectorAgentState v8_session_state_;
+  InspectorAgentState::String v8_session_state_json_;
 
   DISALLOW_COPY_AND_ASSIGN(InspectorSession);
 };
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state.h b/third_party/blink/renderer/core/inspector/inspector_session_state.h
index ec2fccc0..3c5c8c6 100644
--- a/third_party/blink/renderer/core/inspector/inspector_session_state.h
+++ b/third_party/blink/renderer/core/inspector/inspector_session_state.h
@@ -212,10 +212,6 @@
       session_state_->EnqueueUpdate(prefix_key_ + key, WTF::String());
     }
 
-    // TODO(johannes): Remove this method after callers are migrated to
-    // ::Clear().
-    void ClearAll() { Clear(); }
-
     // Clears the entire field.
     void Clear() override {
       // TODO(johannes): Handle this in a single update.
diff --git a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc
index cae7ce5..73dc4ea7 100644
--- a/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_session_state_test.cc
@@ -194,7 +194,7 @@
     EXPECT_EQ("updated message for key 2", maps_agent.strings_.Get("key2"));
     EXPECT_EQ("new message for key 3", maps_agent.strings_.Get("key3"));
 
-    maps_agent.strings_.ClearAll();
+    maps_agent.strings_.Clear();
 
     dev_tools_session.ApplyUpdates(session_state.TakeUpdates());
   }
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc b/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
index f1f5273..6197024e 100644
--- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
+++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.cc
@@ -74,7 +74,7 @@
 
   InspectorSession* session = new InspectorSession(
       this, probe_sink_.Get(), session_id, debugger_->GetV8Inspector(),
-      debugger_->ContextGroupId(thread_), String(), nullptr);
+      debugger_->ContextGroupId(thread_), nullptr);
   session->Append(new InspectorLogAgent(thread_->GetConsoleMessageStorage(),
                                         nullptr, session->V8Session()));
   if (thread_->GlobalScope()->IsWorkerGlobalScope()) {
@@ -129,7 +129,6 @@
     int session_id,
     int call_id,
     const String& response,
-    const String& state,
     mojom::blink::DevToolsSessionStatePtr updates) {
   // Make tests more predictable by flushing all sessions before sending
   // protocol response in any of them.
@@ -143,7 +142,6 @@
 void WorkerInspectorController::SendProtocolNotification(
     int session_id,
     const String& message,
-    const String& state,
     mojom::blink::DevToolsSessionStatePtr updates) {
   thread_->GetWorkerReportingProxy().PostMessageToPageInspector(session_id,
                                                                 message);
diff --git a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
index 57f984a..51f4e17 100644
--- a/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
+++ b/third_party/blink/renderer/core/inspector/worker_inspector_controller.h
@@ -71,12 +71,10 @@
       int session_id,
       int call_id,
       const String& response,
-      const String& state,
       mojom::blink::DevToolsSessionStatePtr updates) override;
   void SendProtocolNotification(
       int session_id,
       const String& message,
-      const String& state,
       mojom::blink::DevToolsSessionStatePtr updates) override;
 
   // WebThread::TaskObserver implementation.
diff --git a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
index b92100e3..2f11e326 100644
--- a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.cc
@@ -786,15 +786,7 @@
 bool GridTrackSizingAlgorithm::IsRelativeGridLengthAsAuto(
     const GridLength& length,
     GridTrackSizingDirection direction) const {
-  if (!length.HasPercentage())
-    return false;
-  // TODO(svillar): we should remove the second check later. We need it
-  // because during the second iteration of the algorithm we set definite
-  // sizes in the grid container so percents would not resolve properly (it
-  // would think that the height is definite when it is not).
-  return !AvailableSpace(direction) ||
-         (direction == kForRows &&
-          !layout_grid_->CachedHasDefiniteLogicalHeight());
+  return length.HasPercentage() && !AvailableSpace(direction);
 }
 
 bool GridTrackSizingAlgorithm::IsRelativeSizedTrackAsAuto(
@@ -887,8 +879,11 @@
   DCHECK(content_sized_tracks_index_.IsEmpty());
   DCHECK(flexible_sized_tracks_index_.IsEmpty());
   DCHECK(auto_sized_tracks_for_stretch_index_.IsEmpty());
+  DCHECK(!has_percent_sized_rows_indefinite_height_);
   Vector<GridTrack>& track_list = Tracks(direction_);
   bool has_definite_free_space = !!AvailableSpace();
+  bool indefinite_height =
+      direction_ == kForRows && !layout_grid_->CachedHasDefiniteLogicalHeight();
   size_t num_tracks = track_list.size();
   for (size_t i = 0; i < num_tracks; ++i) {
     GridTrackSize track_size = GetGridTrackSize(direction_, i);
@@ -911,6 +906,13 @@
       flexible_sized_tracks_index_.push_back(i);
     if (track_size.HasAutoMaxTrackBreadth() && !track_size.IsFitContent())
       auto_sized_tracks_for_stretch_index_.push_back(i);
+
+    if (!has_percent_sized_rows_indefinite_height_ && indefinite_height) {
+      GridTrackSize raw_track_size = RawGridTrackSize(direction_, i);
+      if (raw_track_size.MinTrackBreadth().HasPercentage() ||
+          raw_track_size.MaxTrackBreadth().HasPercentage())
+        has_percent_sized_rows_indefinite_height_ = true;
+    }
   }
 }
 
@@ -1566,6 +1568,7 @@
   content_sized_tracks_index_.Shrink(0);
   flexible_sized_tracks_index_.Shrink(0);
   auto_sized_tracks_for_stretch_index_.Shrink(0);
+  has_percent_sized_rows_indefinite_height_ = false;
 
   if (available_space) {
     LayoutUnit gutters_size = layout_grid_->GuttersSize(
@@ -1641,6 +1644,7 @@
   content_sized_tracks_index_.Shrink(0);
   flexible_sized_tracks_index_.Shrink(0);
   auto_sized_tracks_for_stretch_index_.Shrink(0);
+  has_percent_sized_rows_indefinite_height_ = false;
   SetAvailableSpace(kForRows, base::nullopt);
   SetAvailableSpace(kForColumns, base::nullopt);
 }
diff --git a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h
index 5127dd2..36ae436b6 100644
--- a/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h
+++ b/third_party/blink/renderer/core/layout/grid_track_sizing_algorithm.h
@@ -117,6 +117,12 @@
   bool TracksAreWiderThanMinTrackBreadth() const;
 #endif
 
+  LayoutUnit ComputeTrackBasedSize() const;
+
+  bool HasAnyPercentSizedRowsIndefiniteHeight() const {
+    return has_percent_sized_rows_indefinite_height_;
+  }
+
  private:
   base::Optional<LayoutUnit> AvailableSpace() const;
   bool IsRelativeGridLengthAsAuto(const GridLength&,
@@ -127,7 +133,6 @@
                                  size_t translated_index) const;
   GridTrackSize RawGridTrackSize(GridTrackSizingDirection,
                                  size_t translated_index) const;
-  LayoutUnit ComputeTrackBasedSize() const;
 
   // Helper methods for step 1. initializeTrackSizes().
   LayoutUnit InitialBaseSize(const GridTrackSize&) const;
@@ -195,6 +200,7 @@
   // Data.
   bool WasSetup() const { return !!strategy_; }
   bool needs_setup_{true};
+  bool has_percent_sized_rows_indefinite_height_{false};
   base::Optional<LayoutUnit> available_space_columns_;
   base::Optional<LayoutUnit> available_space_rows_;
 
diff --git a/third_party/blink/renderer/core/layout/layout_block.cc b/third_party/blink/renderer/core/layout/layout_block.cc
index db10a7f..665460e 100644
--- a/third_party/blink/renderer/core/layout/layout_block.cc
+++ b/third_party/blink/renderer/core/layout/layout_block.cc
@@ -291,6 +291,8 @@
     // The overflow clip paint property depends on whether overflow clip is
     // present so we need to update paint properties if this changes.
     SetNeedsPaintPropertyUpdate();
+    if (Layer())
+      Layer()->SetNeedsCompositingInputsUpdate();
   }
   SetHasOverflowClip(should_clip_overflow);
 }
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc
index a3cfcfa..7719f110 100644
--- a/third_party/blink/renderer/core/layout/layout_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -336,8 +336,11 @@
       // overflowClipRect(), and border radii, so we update properties on
       // border size or radii change.
       if (!old_style->BorderSizeEquals(new_style) ||
-          !old_style->RadiiEqual(new_style))
+          !old_style->RadiiEqual(new_style)) {
         SetNeedsPaintPropertyUpdate();
+        if (Layer())
+          Layer()->SetNeedsCompositingInputsUpdate();
+      }
     }
   }
 
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
index a2beac2..cbac05e 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -317,6 +317,8 @@
   } else if (had_transform_related_property != HasTransformRelatedProperty()) {
     // This affects whether to create transform node.
     SetNeedsPaintPropertyUpdate();
+    if (Layer())
+      Layer()->SetNeedsCompositingInputsUpdate();
   }
 
   if (Layer()) {
diff --git a/third_party/blink/renderer/core/layout/layout_grid.cc b/third_party/blink/renderer/core/layout/layout_grid.cc
index c7843c2..49ec2bcf 100644
--- a/third_party/blink/renderer/core/layout/layout_grid.cc
+++ b/third_party/blink/renderer/core/layout/layout_grid.cc
@@ -198,34 +198,6 @@
          old_style.NamedGridColumnLines() != StyleRef().NamedGridColumnLines();
 }
 
-// This method optimizes the gutters computation by skiping the available size
-// call if gaps are fixed size (it's only needed for percentages).
-base::Optional<LayoutUnit> LayoutGrid::AvailableSpaceForGutters(
-    GridTrackSizingDirection direction) const {
-  bool is_row_axis = direction == kForColumns;
-
-  const GapLength& gap =
-      is_row_axis ? StyleRef().ColumnGap() : StyleRef().RowGap();
-  if (!gap.IsNormal() && !gap.GetLength().IsPercentOrCalc())
-    return base::nullopt;
-
-  return is_row_axis ? AvailableLogicalWidth()
-                     : AvailableLogicalHeightForPercentageComputation();
-}
-
-LayoutUnit LayoutGrid::ComputeTrackBasedLogicalHeight() const {
-  LayoutUnit logical_height;
-
-  const Vector<GridTrack>& all_rows = track_sizing_algorithm_.Tracks(kForRows);
-  for (const auto& row : all_rows)
-    logical_height += row.BaseSize();
-
-  logical_height += GuttersSize(*grid_, kForRows, 0, all_rows.size(),
-                                AvailableSpaceForGutters(kForRows));
-
-  return logical_height;
-}
-
 void LayoutGrid::ComputeTrackSizesForDefiniteSize(
     GridTrackSizingDirection direction,
     LayoutUnit available_space) {
@@ -249,7 +221,8 @@
   // all the cases with orthogonal flows require this extra cycle; we need a
   // more specific condition to detect whether child's min-content contribution
   // has changed or not.
-  if (!has_any_orthogonal_item_)
+  if (!has_any_orthogonal_item_ &&
+      !track_sizing_algorithm_.HasAnyPercentSizedRowsIndefiniteHeight())
     return;
 
   // TODO (lajava): Whenever the min-content contribution of a grid item changes
@@ -262,7 +235,13 @@
   // Hence we need to repeat computeUsedBreadthOfGridTracks for both, columns
   // and rows, to determine the final values.
   ComputeTrackSizesForDefiniteSize(kForColumns, available_space_for_columns);
+  ComputeContentPositionAndDistributionOffset(
+      kForColumns, track_sizing_algorithm_.FreeSpace(kForColumns).value(),
+      NonCollapsedTracks(kForColumns));
   ComputeTrackSizesForDefiniteSize(kForRows, available_space_for_rows);
+  ComputeContentPositionAndDistributionOffset(
+      kForRows, track_sizing_algorithm_.FreeSpace(kForRows).value(),
+      NonCollapsedTracks(kForRows));
 }
 
 void LayoutGrid::UpdateBlockLayout(bool relayout_children) {
@@ -330,9 +309,9 @@
                                          min_content_height_,
                                          max_content_height_);
     }
-    LayoutUnit track_based_logical_height = ComputeTrackBasedLogicalHeight() +
-                                            BorderAndPaddingLogicalHeight() +
-                                            ScrollbarLogicalHeight();
+    LayoutUnit track_based_logical_height =
+        track_sizing_algorithm_.ComputeTrackBasedSize() +
+        BorderAndPaddingLogicalHeight() + ScrollbarLogicalHeight();
     SetLogicalHeight(track_based_logical_height);
 
     LayoutUnit old_client_after_edge = ClientLogicalBottom();
@@ -398,10 +377,10 @@
   if (gap.IsNormal())
     return LayoutUnit();
 
-  if (gap.GetLength().IsPercentOrCalc())
-    available_size = is_row_axis
-                         ? AvailableLogicalWidth()
-                         : AvailableLogicalHeightForPercentageComputation();
+  if (gap.GetLength().IsPercentOrCalc()) {
+    available_size =
+        is_row_axis ? AvailableLogicalWidth() : ContentLogicalHeight();
+  }
 
   // TODO(rego): Maybe we could cache the computed percentage as a performance
   // improvement.
@@ -2026,12 +2005,14 @@
     end = positions[end_line];
     // These vectors store line positions including gaps, but we shouldn't
     // consider them for the edges of the grid.
-    base::Optional<LayoutUnit> available_size_for_gutters =
-        AvailableSpaceForGutters(direction);
     if (end_line > 0 && end_line < last_line) {
       DCHECK(!grid_->NeedsItemsPlacement());
-      end -= GuttersSize(*grid_, direction, end_line - 1, 2,
-                         available_size_for_gutters);
+      // TODO(rego): It would be more efficient to call GridGap(direction) and
+      // pass that value to GuttersSize(), so we could avoid the call to
+      // available size if the gutter doesn't use percentages.
+      end -= GuttersSize(
+          *grid_, direction, end_line - 1, 2,
+          is_row_axis ? AvailableLogicalWidth() : ContentLogicalHeight());
       end -= is_row_axis ? offset_between_columns_.distribution_offset
                          : offset_between_rows_.distribution_offset;
     }
diff --git a/third_party/blink/renderer/core/layout/layout_grid.h b/third_party/blink/renderer/core/layout/layout_grid.h
index 0836d14..1516957 100644
--- a/third_party/blink/renderer/core/layout/layout_grid.h
+++ b/third_party/blink/renderer/core/layout/layout_grid.h
@@ -161,9 +161,6 @@
                                    const ComputedStyle& new_style) const;
   void StyleDidChange(StyleDifference, const ComputedStyle*) override;
 
-  base::Optional<LayoutUnit> AvailableSpaceForGutters(
-      GridTrackSizingDirection) const;
-
   bool ExplicitGridDidResize(const ComputedStyle&) const;
   bool NamedGridLinesDefinitionDidChange(const ComputedStyle&) const;
 
@@ -202,7 +199,6 @@
                                           GridTrackSizingDirection,
                                           LayoutUnit& min_intrinsic_size,
                                           LayoutUnit& max_intrinsic_size) const;
-  LayoutUnit ComputeTrackBasedLogicalHeight() const;
   void ComputeTrackSizesForDefiniteSize(GridTrackSizingDirection,
                                         LayoutUnit free_space);
 
diff --git a/third_party/blink/renderer/core/layout/layout_menu_list.cc b/third_party/blink/renderer/core/layout/layout_menu_list.cc
index a9421e4..7d60efb 100644
--- a/third_party/blink/renderer/core/layout/layout_menu_list.cc
+++ b/third_party/blink/renderer/core/layout/layout_menu_list.cc
@@ -35,6 +35,7 @@
 #include "third_party/blink/renderer/core/layout/layout_block_flow.h"
 #include "third_party/blink/renderer/core/layout/layout_text.h"
 #include "third_party/blink/renderer/core/layout/layout_theme.h"
+#include "third_party/blink/renderer/core/paint/paint_layer.h"
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 
 namespace blink {
@@ -77,6 +78,8 @@
   inner_block_->SetStyleInternal(std::move(inner_style));
   // LayoutMenuList::ControlClipRect() depends on inner_block_->ContentsSize().
   SetNeedsPaintPropertyUpdate();
+  if (Layer())
+    Layer()->SetNeedsCompositingInputsUpdate();
 }
 
 void LayoutMenuList::CreateInnerBlock() {
@@ -101,6 +104,8 @@
 
   // LayoutMenuList::ControlClipRect() depends on inner_block_->ContentsSize().
   SetNeedsPaintPropertyUpdate();
+  if (Layer())
+    Layer()->SetNeedsCompositingInputsUpdate();
 }
 
 bool LayoutMenuList::HasOptionStyleChanged(
@@ -168,6 +173,8 @@
 
   // LayoutMenuList::ControlClipRect() depends on inner_block_->ContentsSize().
   SetNeedsPaintPropertyUpdate();
+  if (Layer())
+    Layer()->SetNeedsCompositingInputsUpdate();
 }
 
 void LayoutMenuList::RemoveChild(LayoutObject* old_child) {
@@ -275,6 +282,8 @@
   }
   // LayoutMenuList::ControlClipRect() depends on inner_block_->ContentsSize().
   SetNeedsPaintPropertyUpdate();
+  if (Layer())
+    Layer()->SetNeedsCompositingInputsUpdate();
 }
 
 String LayoutMenuList::GetText() const {
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index 2da14298..0c3d6ac 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2084,6 +2084,9 @@
                     diff.BackdropFilterChanged() || diff.CssClipChanged() ||
                     diff.BlendModeChanged())) {
     SetNeedsPaintPropertyUpdate();
+    if (HasLayer() && IsBoxModelObject()) {
+      ToLayoutBoxModelObject(this)->Layer()->SetNeedsCompositingInputsUpdate();
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_replaced.cc b/third_party/blink/renderer/core/layout/layout_replaced.cc
index 34f4b1e..2ac18339 100644
--- a/third_party/blink/renderer/core/layout/layout_replaced.cc
+++ b/third_party/blink/renderer/core/layout/layout_replaced.cc
@@ -75,8 +75,11 @@
 
   // Replaced elements can have border-radius clips without clipping overflow;
   // the overflow clipping case is already covered in LayoutBox::StyleDidChange
-  if (old_style && !old_style->RadiiEqual(StyleRef()))
+  if (old_style && !old_style->RadiiEqual(StyleRef())) {
     SetNeedsPaintPropertyUpdate();
+    if (Layer())
+      Layer()->SetNeedsCompositingInputsUpdate();
+  }
 
   bool had_style = !!old_style;
   float old_zoom = had_style ? old_style->EffectiveZoom()
diff --git a/third_party/blink/renderer/core/layout/layout_table_section.cc b/third_party/blink/renderer/core/layout/layout_table_section.cc
index 94b8560..07b1f20a 100644
--- a/third_party/blink/renderer/core/layout/layout_table_section.cc
+++ b/third_party/blink/renderer/core/layout/layout_table_section.cc
@@ -773,10 +773,9 @@
 }
 
 bool LayoutTableSection::RowHasVisibilityCollapse(unsigned row) const {
-  return (RuntimeEnabledFeatures::VisibilityCollapseRowEnabled() &&
-          ((grid_[row].row &&
-            grid_[row].row->Style()->Visibility() == EVisibility::kCollapse) ||
-           Style()->Visibility() == EVisibility::kCollapse));
+  return ((grid_[row].row &&
+           grid_[row].row->Style()->Visibility() == EVisibility::kCollapse) ||
+          Style()->Visibility() == EVisibility::kCollapse);
 }
 
 // Find out the baseline of the cell
diff --git a/third_party/blink/renderer/core/layout/layout_view.cc b/third_party/blink/renderer/core/layout/layout_view.cc
index 59d094b9..9aea5af 100644
--- a/third_party/blink/renderer/core/layout/layout_view.cc
+++ b/third_party/blink/renderer/core/layout/layout_view.cc
@@ -889,6 +889,8 @@
       SetMayNeedPaintInvalidation();
     GetFrameView()->AdjustViewSize();
     SetNeedsPaintPropertyUpdate();
+    if (Layer())
+      Layer()->SetNeedsCompositingInputsUpdate();
   }
   return result;
 }
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_fragment_traversal.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_fragment_traversal.cc
index 6ce8dc88..7f33e95a 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_fragment_traversal.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_fragment_traversal.cc
@@ -61,7 +61,7 @@
 
     // Traverse descendants unless the fragment is laid out separately from the
     // inline layout algorithm.
-    if (&fragment != root_fragment_ && fragment.IsBlockLayoutRoot())
+    if (&fragment != root_fragment_ && fragment.IsBlockFormattingContextRoot())
       return;
 
     DCHECK(fragment.IsContainer());
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
index da17cbb..5a2e860 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.cc
@@ -56,8 +56,7 @@
                            unsigned start,
                            unsigned end,
                            const ComputedStyle* style,
-                           LayoutObject* layout_object,
-                           bool end_may_collapse)
+                           LayoutObject* layout_object)
     : start_offset_(start),
       end_offset_(end),
       style_(style),
@@ -72,7 +71,7 @@
       should_create_box_fragment_(false),
       style_variant_(static_cast<unsigned>(NGStyleVariant::kStandard)),
       end_collapse_type_(kNotCollapsible),
-      end_may_collapse_(end_may_collapse),
+      is_end_collapsible_newline_(false),
       is_symbol_marker_(false) {
   DCHECK_GE(end, start);
   ComputeBoxProperties();
@@ -97,7 +96,7 @@
       should_create_box_fragment_(other.should_create_box_fragment_),
       style_variant_(other.style_variant_),
       end_collapse_type_(other.end_collapse_type_),
-      end_may_collapse_(other.end_may_collapse_),
+      is_end_collapsible_newline_(other.is_end_collapsible_newline_),
       is_symbol_marker_(other.is_symbol_marker_) {
   DCHECK_GE(end, start);
 }
@@ -329,4 +328,15 @@
          !ToLayoutInline(GetLayoutObject())->Continuation();
 }
 
+void NGInlineItem::SetEndCollapseType(NGCollapseType type) {
+  DCHECK(Type() == NGInlineItem::kText || type == kOpaqueToCollapsing ||
+         (Type() == NGInlineItem::kControl && type == kCollapsible));
+  end_collapse_type_ = type;
+}
+
+void NGInlineItem::SetEndCollapseType(NGCollapseType type, bool is_newline) {
+  SetEndCollapseType(type);
+  is_end_collapsible_newline_ = is_newline;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.h
index 2e2a046..52307972 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_item.h
@@ -51,12 +51,12 @@
   enum NGCollapseType {
     // No collapsible spaces.
     kNotCollapsible,
-    // A collapsible space run that does not contain segment breaks.
-    kCollapsibleSpace,
-    // A collapsible space run that contains segment breaks.
-    kCollapsibleNewline,
     // This item is opaque to whitespace collapsing.
-    kOpaqueToCollapsing
+    kOpaqueToCollapsing,
+    // This item ends with collapsible spaces.
+    kCollapsible,
+    // Collapsible spaces at the end of this item were collapsed.
+    kCollapsed,
   };
 
   // The constructor and destructor can't be implicit or inlined, because they
@@ -65,8 +65,7 @@
                unsigned start,
                unsigned end,
                const ComputedStyle* style = nullptr,
-               LayoutObject* layout_object = nullptr,
-               bool end_may_collapse = false);
+               LayoutObject* layout_object = nullptr);
   ~NGInlineItem();
 
   // Copy constructor adjusting start/end and shape results.
@@ -123,12 +122,12 @@
   NGCollapseType EndCollapseType() const {
     return static_cast<NGCollapseType>(end_collapse_type_);
   }
-  void SetEndCollapseType(NGCollapseType type) { end_collapse_type_ = type; }
+  void SetEndCollapseType(NGCollapseType type);
 
-  // Whether the item may be affected by whitespace collapsing. Unlike the
-  // EndCollapseType() method this returns true even if a trailing space has
-  // been removed.
-  bool EndMayCollapse() const { return end_may_collapse_; }
+  // Whether the end collapsible space run contains a newline.
+  // Valid only when kCollapsible or kCollapsed.
+  bool IsEndCollapsibleNewline() const { return is_end_collapsible_newline_; }
+  void SetEndCollapseType(NGCollapseType type, bool is_newline);
 
   static void Split(Vector<NGInlineItem>&, unsigned index, unsigned offset);
 
@@ -189,7 +188,7 @@
   unsigned should_create_box_fragment_ : 1;
   unsigned style_variant_ : 2;
   unsigned end_collapse_type_ : 2;  // NGCollapseType
-  unsigned end_may_collapse_ : 1;
+  unsigned is_end_collapsible_newline_ : 1;
   unsigned is_symbol_marker_ : 1;
   friend class NGInlineNode;
 };
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc
index 2482f1f..6357c08 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.cc
@@ -21,29 +21,9 @@
 
 template <typename OffsetMappingBuilder>
 String NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::ToString() {
-  // Segment Break Transformation Rules[1] defines to keep trailing new lines in
-  // Phase I, but to remove after line break, in Phase II[2]. Although the spec
-  // defines so, trailing collapsible spaces at the end of an inline formatting
-  // context will be removed in Phase II and that removing here makes no
-  // differences.
-  //
-  // However, doing so reduces the opportunities to re-use NGInlineItem a lot in
-  // appending scenario, which is quite common. In order to re-use NGInlineItem
-  // as much as posssible, trailing spaces are removed in Phase II, exactly as
-  // defined in the spec.
-  //
-  // [1] https://drafts.csswg.org/css-text-3/#line-break-transform
-  // [2] https://drafts.csswg.org/css-text-3/#white-space-phase-2
-  return text_.ToString();
-}
-
-template <>
-String NGInlineItemsBuilderTemplate<NGOffsetMappingBuilder>::ToString() {
-  // While trailing collapsible space is kept as above, NGOffsetMappingBuilder
-  // assumes NGLineBreaker does not remove it. For now, remove only for
-  // NGOffsetMappingBuilder.
-  // TODO(kojii): Consider NGOffsetMappingBuilder to support NGLineBreaker to
-  // remove trailing spaces.
+  // Segment Break Transformation Rules[1] defines to keep trailing new lines,
+  // but it will be removed in Phase II[2]. We prefer not to add trailing new
+  // lines and collapsible spaces in Phase I.
   RemoveTrailingCollapsibleSpaceIfExists();
 
   return text_.ToString();
@@ -133,10 +113,8 @@
                 unsigned start,
                 unsigned end,
                 const ComputedStyle* style = nullptr,
-                LayoutObject* layout_object = nullptr,
-                bool end_may_collapse = false) {
-  items->push_back(
-      NGInlineItem(type, start, end, style, layout_object, end_may_collapse));
+                LayoutObject* layout_object = nullptr) {
+  items->push_back(NGInlineItem(type, start, end, style, layout_object));
 }
 
 inline bool ShouldIgnore(UChar c) {
@@ -194,10 +172,6 @@
   return nullptr;
 }
 
-inline bool MayCollapseWithLast(const NGInlineItem& item) {
-  return item.EndMayCollapse();
-}
-
 }  // anonymous namespace
 
 template <typename OffsetMappingBuilder>
@@ -210,33 +184,56 @@
   // TODO(layout-dev): This could likely be optimized further.
   // TODO(layout-dev): Handle cases where the old items are not consecutive.
   const ComputedStyle& new_style = layout_text->StyleRef();
-  const ComputedStyle& old_style = *items[0]->Style();
   bool collapse_spaces = new_style.CollapseWhiteSpace();
-  if (collapse_spaces != old_style.CollapseWhiteSpace())
-    return false;
-
-  NGInlineItem* last_item = LastItemToCollapseWith(items_);
-  if (collapse_spaces) {
-    if (!last_item || MayCollapseWithLast(*last_item)) {
-      // If the original string starts with a collapsible space, it may be
-      // collapsed.
-      if (original_string[items[0]->StartOffset()] == kSpaceCharacter)
-        return false;
-    } else {
-      // If the start of the original string was collapsed, it may be
-      // restored.
-      const String& source_text = layout_text->GetText();
-      if (source_text.length() && IsCollapsibleSpace(source_text[0]) &&
-          original_string[items[0]->StartOffset()] != kSpaceCharacter)
-        return false;
+  if (NGInlineItem* last_item = LastItemToCollapseWith(items_)) {
+    const NGInlineItem& old_item0 = *items[0];
+    if (collapse_spaces) {
+      DCHECK_GT(old_item0.Length(), 0u);
+      switch (last_item->EndCollapseType()) {
+        case NGInlineItem::kCollapsible:
+          // If the original string starts with a collapsible space, it may be
+          // collapsed.
+          if (original_string[old_item0.StartOffset()] == kSpaceCharacter)
+            return false;
+          break;
+        case NGInlineItem::kNotCollapsible: {
+          // If the start of the original string was collapsed, it may be
+          // restored.
+          const String& source_text = layout_text->GetText();
+          if (source_text.length() && IsCollapsibleSpace(source_text[0]) &&
+              original_string[old_item0.StartOffset()] != kSpaceCharacter)
+            return false;
+          break;
+        }
+        case NGInlineItem::kCollapsed:
+          RestoreTrailingCollapsibleSpace(last_item);
+          return false;
+        case NGInlineItem::kOpaqueToCollapsing:
+          NOTREACHED();
+          break;
+      }
     }
+
+    // On nowrap -> wrap boundary, a break opporunity may be inserted.
+    DCHECK(last_item->Style());
+    if (!last_item->Style()->AutoWrap() && new_style.AutoWrap())
+      return false;
+
+  } else if (collapse_spaces) {
+    // If the original string starts with a collapsible space, it may be
+    // collapsed because it is now a leading collapsible space.
+    const NGInlineItem& old_item0 = *items[0];
+    DCHECK_GT(old_item0.Length(), 0u);
+    if (original_string[old_item0.StartOffset()] == kSpaceCharacter)
+      return false;
   }
 
-  // On nowrap -> wrap boundary, a break opporunity may be inserted.
-  if (last_item && !last_item->Style()->AutoWrap() && new_style.AutoWrap())
-    return false;
-
   for (const NGInlineItem* item : items) {
+    // Collapsed space item at the start will not be restored, and that not
+    // needed to add.
+    if (!text_.length() && !item->Length() && collapse_spaces)
+      continue;
+
     unsigned start = text_.length();
     text_.Append(original_string, item->StartOffset(), item->Length());
 
@@ -304,6 +301,8 @@
   EWhiteSpace whitespace = style->WhiteSpace();
   bool is_svg_text = layout_object && layout_object->IsSVGInlineText();
 
+  RestoreTrailingCollapsibleSpaceIfRemoved();
+
   if (!ComputedStyle::CollapseWhiteSpace(whitespace))
     AppendPreserveWhitespace(string, style, layout_object);
   else if (ComputedStyle::PreserveNewline(whitespace) && !is_svg_text)
@@ -335,9 +334,10 @@
   NGInlineItem::NGCollapseType end_collapse = NGInlineItem::kNotCollapsible;
   unsigned i = 0;
   UChar c = string[i];
+  bool space_run_has_newline = false;
   if (IsCollapsibleSpace(c)) {
     // Find the end of the collapsible space run.
-    bool space_run_has_newline = MoveToEndOfCollapsibleSpaces(string, &i, &c);
+    space_run_has_newline = MoveToEndOfCollapsibleSpaces(string, &i, &c);
 
     // LayoutBR does not set preserve_newline, but should be preserved.
     if (UNLIKELY(space_run_has_newline && string.length() == 1 &&
@@ -356,15 +356,13 @@
       } else {
         // The last item ends with a collapsible space this run should collapse
         // to. Collapse the entire space run in this item.
-        DCHECK(item->EndCollapseType() == NGInlineItem::kCollapsibleSpace ||
-               item->EndCollapseType() == NGInlineItem::kCollapsibleNewline);
+        DCHECK(item->EndCollapseType() == NGInlineItem::kCollapsible);
         insert_space = false;
 
         // If the space run either in this item or in the last item contains a
         // newline, apply segment break rules. This may result in removal of
         // the space in the last item.
-        if ((space_run_has_newline ||
-             item->EndCollapseType() == NGInlineItem::kCollapsibleNewline) &&
+        if ((space_run_has_newline || item->IsEndCollapsibleNewline()) &&
             item->Type() == NGInlineItem::kText &&
             ShouldRemoveNewline(text_, item->EndOffset() - 1, item->Style(),
                                 StringView(string, i), style)) {
@@ -416,15 +414,15 @@
     // If this space run is at the end of this item, keep whether the
     // collapsible space run has a newline or not in the item.
     if (i == string.length()) {
-      end_collapse = space_run_has_newline ? NGInlineItem::kCollapsibleNewline
-                                           : NGInlineItem::kCollapsibleSpace;
+      end_collapse = NGInlineItem::kCollapsible;
     }
   } else {
     // If the last item ended with a collapsible space run with segment breaks,
     // apply segment break rules. This may result in removal of the space in the
     // last item.
     if (NGInlineItem* item = LastItemToCollapseWith(items_)) {
-      if (item->EndCollapseType() == NGInlineItem::kCollapsibleNewline &&
+      if (item->EndCollapseType() == NGInlineItem::kCollapsible &&
+          item->IsEndCollapsibleNewline() &&
           ShouldRemoveNewline(text_, item->EndOffset() - 1, item->Style(),
                               string, style)) {
         RemoveTrailingCollapsibleSpace(item);
@@ -449,14 +447,16 @@
       text_.Append(string, start_of_non_space, i - start_of_non_space);
       mapping_builder_.AppendIdentityMapping(i - start_of_non_space);
 
-      if (i == string.length())
+      if (i == string.length()) {
+        DCHECK_EQ(end_collapse, NGInlineItem::kNotCollapsible);
         break;
+      }
 
       // Process a collapsible space run. First, find the end of the run.
       DCHECK_EQ(c, string[i]);
       DCHECK(IsCollapsibleSpace(c));
       unsigned start_of_spaces = i;
-      bool space_run_has_newline = MoveToEndOfCollapsibleSpaces(string, &i, &c);
+      space_run_has_newline = MoveToEndOfCollapsibleSpaces(string, &i, &c);
 
       // Because leading spaces are handled before this loop, no need to check
       // cross-item collapsing.
@@ -481,8 +481,7 @@
       // If this space run is at the end of this item, keep whether the
       // collapsible space run has a newline or not in the item.
       if (i == string.length()) {
-        end_collapse = space_run_has_newline ? NGInlineItem::kCollapsibleNewline
-                                             : NGInlineItem::kCollapsibleSpace;
+        end_collapse = NGInlineItem::kCollapsible;
         break;
       }
     }
@@ -490,9 +489,9 @@
 
   if (text_.length() > start_offset) {
     AppendItem(items_, NGInlineItem::kText, start_offset, text_.length(), style,
-               layout_object, end_collapse != NGInlineItem::kNotCollapsible);
+               layout_object);
     NGInlineItem& item = items_->back();
-    item.SetEndCollapseType(end_collapse);
+    item.SetEndCollapseType(end_collapse, space_run_has_newline);
     is_empty_inline_ &= item.IsEmptyItem();
   }
 }
@@ -570,7 +569,7 @@
   // are leading spaces and that they should be collapsed.
   // Pretend that this item ends with a collapsible space, so that following
   // collapsible spaces can be collapsed.
-  items_->back().SetEndCollapseType(NGInlineItem::kCollapsibleSpace);
+  items_->back().SetEndCollapseType(NGInlineItem::kCollapsible, false);
 
   // Then re-add bidi controls to restore the bidi context.
   if (!bidi_context_.IsEmpty()) {
@@ -621,6 +620,7 @@
     LayoutObject* layout_object) {
   typename OffsetMappingBuilder::SourceNodeScope scope(&mapping_builder_,
                                                        layout_object);
+  RestoreTrailingCollapsibleSpaceIfRemoved();
   Append(NGInlineItem::kAtomicInline, kObjectReplacementCharacter, style,
          layout_object);
 }
@@ -659,7 +659,7 @@
 void NGInlineItemsBuilderTemplate<
     OffsetMappingBuilder>::RemoveTrailingCollapsibleSpaceIfExists() {
   if (NGInlineItem* item = LastItemToCollapseWith(items_)) {
-    if (item->EndCollapseType() != NGInlineItem::kNotCollapsible)
+    if (item->EndCollapseType() == NGInlineItem::kCollapsible)
       RemoveTrailingCollapsibleSpace(item);
   }
 }
@@ -669,9 +669,8 @@
 void NGInlineItemsBuilderTemplate<
     OffsetMappingBuilder>::RemoveTrailingCollapsibleSpace(NGInlineItem* item) {
   DCHECK(item);
+  DCHECK_EQ(item->EndCollapseType(), NGInlineItem::kCollapsible);
   DCHECK_GT(item->Length(), 0u);
-  DCHECK(item->EndCollapseType() == NGInlineItem::kCollapsibleSpace ||
-         item->EndCollapseType() == NGInlineItem::kCollapsibleNewline);
 
   // A forced break pretends that it's a collapsible space, see
   // |AppendForcedBreak()|. It should not be removed.
@@ -679,6 +678,7 @@
     return;
   DCHECK_EQ(item->Type(), NGInlineItem::kText);
 
+  DCHECK_GT(item->EndOffset(), item->StartOffset());
   unsigned space_offset = item->EndOffset() - 1;
   DCHECK_EQ(text_[space_offset], kSpaceCharacter);
   text_.erase(space_offset);
@@ -695,7 +695,7 @@
     item = &(*items_)[index];
   } else {
     item->SetEndOffset(item->EndOffset() - 1);
-    item->SetEndCollapseType(NGInlineItem::kNotCollapsible);
+    item->SetEndCollapseType(NGInlineItem::kCollapsed);
     item++;
   }
 
@@ -706,6 +706,42 @@
   }
 }
 
+// Restore removed collapsible space at the end of items.
+template <typename OffsetMappingBuilder>
+void NGInlineItemsBuilderTemplate<
+    OffsetMappingBuilder>::RestoreTrailingCollapsibleSpaceIfRemoved() {
+  if (NGInlineItem* last_item = LastItemToCollapseWith(items_)) {
+    if (last_item->EndCollapseType() == NGInlineItem::kCollapsed)
+      RestoreTrailingCollapsibleSpace(last_item);
+  }
+}
+
+// Restore removed collapsible space at the end of the specified item.
+template <typename OffsetMappingBuilder>
+void NGInlineItemsBuilderTemplate<
+    OffsetMappingBuilder>::RestoreTrailingCollapsibleSpace(NGInlineItem* item) {
+  DCHECK(item);
+  DCHECK(item->EndCollapseType() == NGInlineItem::kCollapsed);
+
+  // TODO(kojii): Implement StringBuilder::insert().
+  if (text_.length() == item->EndOffset()) {
+    text_.Append(' ');
+  } else {
+    String current = text_.ToString();
+    text_.Clear();
+    text_.Append(StringView(current, 0, item->EndOffset()));
+    text_.Append(' ');
+    text_.Append(StringView(current, item->EndOffset()));
+  }
+
+  item->SetEndOffset(item->EndOffset() + 1);
+  item->SetEndCollapseType(NGInlineItem::kCollapsible);
+
+  for (item++; item != items_->end(); item++) {
+    item->SetOffset(item->StartOffset() + 1, item->EndOffset() + 1);
+  }
+}
+
 template <typename OffsetMappingBuilder>
 void NGInlineItemsBuilderTemplate<OffsetMappingBuilder>::EnterBidiContext(
     LayoutObject* node,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h
index f050e466..0d5b52a 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_items_builder.h
@@ -154,14 +154,13 @@
   void RemoveTrailingCollapsibleSpaceIfExists();
   void RemoveTrailingCollapsibleSpace(NGInlineItem*);
 
+  void RestoreTrailingCollapsibleSpaceIfRemoved();
+  void RestoreTrailingCollapsibleSpace(NGInlineItem*);
+
   void Exit(LayoutObject*);
 };
 
 template <>
-CORE_EXPORT String
-NGInlineItemsBuilderTemplate<NGOffsetMappingBuilder>::ToString();
-
-template <>
 CORE_EXPORT bool NGInlineItemsBuilderTemplate<NGOffsetMappingBuilder>::Append(
     const String&,
     LayoutNGText*,
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
index 38dd472..d797831d 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.cc
@@ -26,6 +26,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_positioned_float.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_space_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_unpositioned_float.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/fonts/shaping/harfbuzz_shaper.h"
@@ -294,16 +295,12 @@
     NGInlineItemsBuilderForOffsetMapping builder(&items);
     CollectInlinesInternal(GetLayoutBlockFlow(), &builder, nullptr);
     String text = builder.ToString();
-
-    // The trailing space of the text for offset mapping may be removed. If not,
-    // share the string instance.
-    if (text == data->text_content)
-      text = data->text_content;
+    DCHECK_EQ(data->text_content, text);
 
     // TODO(xiaochengh): This doesn't compute offset mapping correctly when
     // text-transform CSS property changes text length.
     NGOffsetMappingBuilder& mapping_builder = builder.GetOffsetMappingBuilder();
-    mapping_builder.SetDestinationString(text);
+    mapping_builder.SetDestinationString(data->text_content);
     data->offset_mapping =
         std::make_unique<NGOffsetMapping>(mapping_builder.Build());
   }
@@ -661,9 +658,12 @@
   return algorithm.Layout();
 }
 
-static LayoutUnit ComputeContentSize(NGInlineNode node,
-                                     const MinMaxSizeInput& input,
-                                     NGLineBreakerMode mode) {
+static LayoutUnit ComputeContentSize(
+    NGInlineNode node,
+    WritingMode container_writing_mode,
+    const MinMaxSizeInput& input,
+    NGLineBreakerMode mode,
+    const NGConstraintSpace* constraint_space) {
   const ComputedStyle& style = node.Style();
   WritingMode writing_mode = style.GetWritingMode();
   LayoutUnit available_inline_size =
@@ -721,8 +721,20 @@
       const ComputedStyle& float_style = float_node.Style();
 
       MinMaxSizeInput zero_input;  // Floats don't intrude into floats.
+      // We'll need extrinsic sizing data when computing min/max for orthogonal
+      // flow roots.
+      scoped_refptr<NGConstraintSpace> extrinsic_constraint_space;
+      const NGConstraintSpace* optional_constraint_space = nullptr;
+      if (!IsParallelWritingMode(container_writing_mode,
+                                 float_node.Style().GetWritingMode())) {
+        DCHECK(constraint_space);
+        extrinsic_constraint_space = CreateExtrinsicConstraintSpaceForChild(
+            *constraint_space, input.extrinsic_block_size, float_node);
+        optional_constraint_space = extrinsic_constraint_space.get();
+      }
+
       MinMaxSize child_sizes = ComputeMinAndMaxContentContribution(
-          writing_mode, float_node, zero_input);
+          writing_mode, float_node, zero_input, optional_constraint_space);
       LayoutUnit child_inline_margins =
           ComputeMinMaxMargins(style, float_node).InlineSum();
 
@@ -758,7 +770,10 @@
   return result;
 }
 
-MinMaxSize NGInlineNode::ComputeMinMaxSize(const MinMaxSizeInput& input) {
+MinMaxSize NGInlineNode::ComputeMinMaxSize(
+    WritingMode container_writing_mode,
+    const MinMaxSizeInput& input,
+    const NGConstraintSpace* constraint_space) {
   PrepareLayoutIfNeeded();
 
   // Run line breaking with 0 and indefinite available width.
@@ -771,14 +786,16 @@
   // break opportunity.
   MinMaxSize sizes;
   sizes.min_size =
-      ComputeContentSize(*this, input, NGLineBreakerMode::kMinContent);
+      ComputeContentSize(*this, container_writing_mode, input,
+                         NGLineBreakerMode::kMinContent, constraint_space);
 
   // Compute the sum of inline sizes of all inline boxes with no line breaks.
   // TODO(kojii): NGConstraintSpaceBuilder does not allow NGSizeIndefinite
   // inline available size. We can allow it, or make this more efficient
   // without using NGLineBreaker.
   sizes.max_size =
-      ComputeContentSize(*this, input, NGLineBreakerMode::kMaxContent);
+      ComputeContentSize(*this, container_writing_mode, input,
+                         NGLineBreakerMode::kMaxContent, constraint_space);
 
   // Negative text-indent can make min > max. Ensure min is the minimum size.
   sizes.min_size = std::min(sizes.min_size, sizes.max_size);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
index 73d49d80..76843ec 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h
@@ -43,7 +43,9 @@
   // Computes the value of min-content and max-content for this anonymous block
   // box. min-content is the inline size when lines wrap at every break
   // opportunity, and max-content is when lines do not wrap at all.
-  MinMaxSize ComputeMinMaxSize(const MinMaxSizeInput&);
+  MinMaxSize ComputeMinMaxSize(WritingMode container_writing_mode,
+                               const MinMaxSizeInput&,
+                               const NGConstraintSpace* = nullptr);
 
   // Instruct to re-compute |PrepareLayout| on the next layout.
   void InvalidatePrepareLayoutForTest();
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
index 1c38589..0922cea 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_node_test.cc
@@ -406,7 +406,8 @@
   LoadAhem();
   SetupHtml("t", "<div id=t style='font:10px Ahem'>AB CDEF</div>");
   NGInlineNodeForTest node = CreateInlineNode();
-  MinMaxSize sizes = node.ComputeMinMaxSize(MinMaxSizeInput());
+  MinMaxSize sizes =
+      node.ComputeMinMaxSize(WritingMode::kHorizontalTb, MinMaxSizeInput());
   EXPECT_EQ(40, sizes.min_size);
   EXPECT_EQ(70, sizes.max_size);
 }
@@ -415,7 +416,8 @@
   LoadAhem();
   SetupHtml("t", "<div id=t style='font:10px Ahem'>A B<span>C D</span></div>");
   NGInlineNodeForTest node = CreateInlineNode();
-  MinMaxSize sizes = node.ComputeMinMaxSize(MinMaxSizeInput());
+  MinMaxSize sizes =
+      node.ComputeMinMaxSize(WritingMode::kHorizontalTb, MinMaxSizeInput());
   // |min_content| should be the width of "BC" because there is an element
   // boundary between "B" and "C" but no break opportunities.
   EXPECT_EQ(20, sizes.min_size);
@@ -434,7 +436,8 @@
   )HTML");
 
   NGInlineNodeForTest node = CreateInlineNode();
-  MinMaxSize sizes = node.ComputeMinMaxSize(MinMaxSizeInput());
+  MinMaxSize sizes =
+      node.ComputeMinMaxSize(WritingMode::kHorizontalTb, MinMaxSizeInput());
 
   EXPECT_EQ(50, sizes.min_size);
   EXPECT_EQ(130, sizes.max_size);
@@ -453,7 +456,8 @@
   )HTML");
 
   NGInlineNodeForTest node = CreateInlineNode();
-  MinMaxSize sizes = node.ComputeMinMaxSize(MinMaxSizeInput());
+  MinMaxSize sizes =
+      node.ComputeMinMaxSize(WritingMode::kHorizontalTb, MinMaxSizeInput());
 
   EXPECT_EQ(50, sizes.min_size);
   EXPECT_EQ(160, sizes.max_size);
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc
index 919cb68..49df71cf 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.cc
@@ -112,6 +112,16 @@
   return std::max(ellipsis_inline_offset + ellipsis_width, line_width);
 }
 
+// Hide this child from being painted.
+void NGLineTruncator::HideChild(NGLineBoxFragmentBuilder::Child* child) {
+  DCHECK(child->HasInFlowFragment());
+  // TODO(kojii): Not producing fragments is the most clean and efficient way to
+  // hide them, but we may want to revisit how to do this to reduce special
+  // casing in other code.
+  child->layout_result = nullptr;
+  child->fragment = nullptr;
+}
+
 // Return the offset to place the ellipsis.
 //
 // This function may truncate or move the child so that the ellipsis can fit.
@@ -131,16 +141,24 @@
           ? child->offset.inline_offset
           : line_width - (child->offset.inline_offset + child->inline_size);
   LayoutUnit space_for_child = available_width_ - child_inline_offset;
-  if (space_for_child <= 0)
+  if (space_for_child <= 0) {
+    // This child is outside of the content box, but we still need to hide it.
+    // When the box has paddings, this child outside of the content box maybe
+    // still inside of the clipping box.
+    if (!is_first_child)
+      HideChild(child);
     return base::nullopt;
+  }
 
+  // At least part of this child is in the box.
   // If not all of this child can fit, try to truncate.
   space_for_child -= ellipsis_width;
   if (space_for_child < child->inline_size &&
       !TruncateChild(space_for_child, is_first_child, child)) {
-    // This child maybe partially visible. When it can't be truncated, move it
-    // out so that none of this child should be visible.
-    child->offset.inline_offset = line_width;
+    // This child is partially in the box, but it should not be visible because
+    // earlier sibling will be truncated and ellipsized.
+    if (!is_first_child)
+      HideChild(child);
     return base::nullopt;
   }
 
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.h
index adfcd22..83bfbd12 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_truncator.h
@@ -39,6 +39,7 @@
   bool TruncateChild(LayoutUnit space_for_this_child,
                      bool is_first_child,
                      NGLineBoxFragmentBuilder::Child* child);
+  void HideChild(NGLineBoxFragmentBuilder::Child* child);
 
   NGInlineNode& node_;
   scoped_refptr<const ComputedStyle> line_style_;
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
index 3187df3..a2e471d5 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_physical_line_box_fragment.cc
@@ -72,7 +72,7 @@
   // should compute and store it during layout.
   const TextDirection direction = Style().Direction();
   const NGPhysicalFragment* runner = this;
-  while (runner->IsContainer() && !runner->IsBlockLayoutRoot()) {
+  while (runner->IsContainer() && !runner->IsBlockFormattingContextRoot()) {
     const NGPhysicalContainerFragment* runner_as_container =
         ToNGPhysicalContainerFragment(runner);
     if (runner_as_container->Children().IsEmpty())
@@ -92,7 +92,7 @@
   // should compute and store it during layout.
   const TextDirection direction = Style().Direction();
   const NGPhysicalFragment* runner = this;
-  while (runner->IsContainer() && !runner->IsBlockLayoutRoot()) {
+  while (runner->IsContainer() && !runner->IsBlockFormattingContextRoot()) {
     const NGPhysicalContainerFragment* runner_as_container =
         ToNGPhysicalContainerFragment(runner);
     if (runner_as_container->Children().IsEmpty())
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index 828cf16..39d8d52 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -131,42 +131,6 @@
           child_bfc_offset.block_offset - parent_bfc_offset.block_offset};
 }
 
-// Create a child constraint space with only extrinsic block sizing data. This
-// will and can not be used for final layout, but is needed in an intermediate
-// measure pass that calculates the min/max size contribution from a child that
-// establishes an orthogonal flow root.
-//
-// Note that it's the child's *block* size that will be propagated as min/max
-// inline size to the container. Therefore it's crucial to provide the child
-// with an available inline size (which can be derived from the block size of
-// the container if definite). We'll provide any extrinsic available block size
-// that we have. This includes fixed and resolvable percentage sizes, for
-// instance, while auto will not resolve. If no extrinsic size can be
-// determined, we will resort to using a fallback later on, such as the initial
-// containing block size. Spec:
-// https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto
-scoped_refptr<NGConstraintSpace> CreateExtrinsicConstraintSpace(
-    const NGConstraintSpace& container_space,
-    NGBlockNode container,
-    NGBlockNode child) {
-  LayoutUnit extrinsic_block_size = ComputeBlockSizeForFragment(
-      container_space, container.Style(), NGSizeIndefinite);
-  if (extrinsic_block_size != NGSizeIndefinite) {
-    extrinsic_block_size -=
-        CalculateBorderScrollbarPadding(container_space, container).BlockSum();
-    extrinsic_block_size = std::max(extrinsic_block_size, LayoutUnit());
-  }
-  NGLogicalSize extrinsic_size(NGSizeIndefinite, extrinsic_block_size);
-
-  return NGConstraintSpaceBuilder(container_space)
-      .SetAvailableSize(extrinsic_size)
-      .SetPercentageResolutionSize(extrinsic_size)
-      .SetIsIntermediateLayout(true)
-      .SetIsNewFormattingContext(child.CreatesNewFormattingContext())
-      .SetFloatsBfcBlockOffset(LayoutUnit())
-      .ToConstraintSpace(child.Style().GetWritingMode());
-}
-
 // Stop margin collapsing on one side of a block when
 // -webkit-margin-{after,before}-collapse is something other than 'collapse'
 // (the initial value)
@@ -213,6 +177,14 @@
   LayoutUnit float_left_inline_size = input.float_left_inline_size;
   LayoutUnit float_right_inline_size = input.float_right_inline_size;
 
+  LayoutUnit extrinsic_block_size =
+      ComputeBlockSizeForFragment(ConstraintSpace(), Style(), NGSizeIndefinite);
+  if (extrinsic_block_size != NGSizeIndefinite) {
+    extrinsic_block_size -=
+        CalculateBorderScrollbarPadding(ConstraintSpace(), Node()).BlockSum();
+    extrinsic_block_size = extrinsic_block_size.ClampNegativeToZero();
+  }
+
   for (NGLayoutInputNode child = Node().FirstChild(); child;
        child = child.NextSibling()) {
     if (child.IsOutOfFlowPositioned() || child.IsColumnSpanAll())
@@ -242,8 +214,10 @@
     }
 
     MinMaxSizeInput child_input;
-    if (child.IsInline() || child.IsAnonymousBlock())
-      child_input = {float_left_inline_size, float_right_inline_size};
+    if (child.IsInline() || child.IsAnonymousBlock()) {
+      child_input = {float_left_inline_size, float_right_inline_size,
+                     extrinsic_block_size};
+    }
 
     MinMaxSize child_sizes;
     if (child.IsInline()) {
@@ -252,18 +226,22 @@
       // all inline nodes following |child| and their descendants, and produces
       // an anonymous box that contains all line boxes.
       // |NextSibling| returns the next block sibling, or nullptr, skipping all
-      // following inline siblings and descendants.
-      child_sizes =
-          child.ComputeMinMaxSize(Style().GetWritingMode(), child_input);
+      // following inline siblings and descendants. We'll pass our constraint
+      // space here, so that floated orthogonal flow roots can calculate an
+      // extrinsic constraint space.
+      child_sizes = child.ComputeMinMaxSize(Style().GetWritingMode(),
+                                            child_input, &constraint_space_);
     } else {
       // We'll need extrinsic sizing data when computing min/max for orthogonal
-      // flow roots.
+      // flow roots. If the child is a block node, we can check that right away,
+      // but if it's inline, there's no way of telling; there may be floated
+      // children that establish an orthogonal flow root.
       scoped_refptr<NGConstraintSpace> extrinsic_constraint_space;
       const NGConstraintSpace* optional_constraint_space = nullptr;
       if (!IsParallelWritingMode(Style().GetWritingMode(),
                                  child.Style().GetWritingMode())) {
-        extrinsic_constraint_space = CreateExtrinsicConstraintSpace(
-            ConstraintSpace(), Node(), ToNGBlockNode(child));
+        extrinsic_constraint_space = CreateExtrinsicConstraintSpaceForChild(
+            ConstraintSpace(), extrinsic_block_size, child);
         optional_constraint_space = extrinsic_constraint_space.get();
       }
       child_sizes = ComputeMinAndMaxContentContribution(
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 13c0b407..125b8f7 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
@@ -153,10 +153,10 @@
       }
 
       // The Location() of inline LayoutObject is relative to the
-      // LayoutBlockFlow. If |child| is a block layout root (e.g., inline block,
-      // float, etc.), it creates another inline formatting context. Do not copy
-      // to its descendants in this case.
-      if (!child->IsBlockLayoutRoot()) {
+      // LayoutBlockFlow. If |child| establishes a new block formatting context,
+      // it also creates another inline formatting context. Do not copy to its
+      // descendants in this case.
+      if (!child->IsBlockFormattingContextRoot()) {
         CopyFragmentDataToLayoutBoxForInlineChildren(
             ToNGPhysicalContainerFragment(*child), initial_container_width,
             initial_container_is_flipped, child_offset);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
index 6c45715..c86811c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.cc
@@ -136,9 +136,9 @@
     WritingMode writing_mode,
     const MinMaxSizeInput& input,
     const NGConstraintSpace* space) {
-  return IsInline() ? ToNGInlineNode(*this).ComputeMinMaxSize(input)
-                    : ToNGBlockNode(*this).ComputeMinMaxSize(writing_mode,
-                                                             input, space);
+  if (IsInline())
+    return ToNGInlineNode(*this).ComputeMinMaxSize(writing_mode, input, space);
+  return ToNGBlockNode(*this).ComputeMinMaxSize(writing_mode, input, space);
 }
 
 void NGLayoutInputNode::IntrinsicSize(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
index c19c680..4ea79329 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h
@@ -7,6 +7,7 @@
 
 #include "base/optional.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/layout/ng/geometry/ng_logical_size.h"
 #include "third_party/blink/renderer/platform/layout_unit.h"
 #include "third_party/blink/renderer/platform/text/writing_mode.h"
 
@@ -25,10 +26,14 @@
 
 // Input to the min/max inline size calculation algorithm for child nodes. Child
 // nodes within the same formatting context need to know which floats are beside
-// them.
+// them. Additionally, orthogonal writing mode roots will need the extrinsic
+// block-size of the container.
 struct MinMaxSizeInput {
   LayoutUnit float_left_inline_size;
   LayoutUnit float_right_inline_size;
+
+  // Extrinsic block-size of the containing block.
+  LayoutUnit extrinsic_block_size = NGSizeIndefinite;
 };
 
 // Represents the input to a layout algorithm for a given node. The layout
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc
index ccc8d918..15fe4ce 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment_test.cc
@@ -30,7 +30,7 @@
   EXPECT_TRUE(fragment->IsBox());
   EXPECT_EQ(NGPhysicalFragment::kNormalBox, fragment->BoxType());
   EXPECT_TRUE(fragment->IsOldLayoutRoot());
-  EXPECT_TRUE(fragment->IsBlockLayoutRoot());
+  EXPECT_TRUE(fragment->IsBlockFormattingContextRoot());
 }
 
 // TODO(editing-dev): Once LayoutNG supports editing, we should change this
@@ -44,7 +44,7 @@
   EXPECT_TRUE(fragment->IsBox());
   EXPECT_EQ(NGPhysicalFragment::kFloating, fragment->BoxType());
   EXPECT_TRUE(fragment->IsOldLayoutRoot());
-  EXPECT_TRUE(fragment->IsBlockLayoutRoot());
+  EXPECT_TRUE(fragment->IsBlockFormattingContextRoot());
 }
 
 // TODO(editing-dev): Once LayoutNG supports editing, we should change this
@@ -60,7 +60,7 @@
   EXPECT_TRUE(fragment->IsBox());
   EXPECT_EQ(NGPhysicalFragment::kAtomicInline, fragment->BoxType());
   EXPECT_TRUE(fragment->IsOldLayoutRoot());
-  EXPECT_TRUE(fragment->IsBlockLayoutRoot());
+  EXPECT_TRUE(fragment->IsBlockFormattingContextRoot());
 }
 
 // TODO(editing-dev): Once LayoutNG supports editing, we should change this
@@ -77,7 +77,7 @@
   EXPECT_TRUE(fragment->IsBox());
   EXPECT_EQ(NGPhysicalFragment::kOutOfFlowPositioned, fragment->BoxType());
   EXPECT_TRUE(fragment->IsOldLayoutRoot());
-  EXPECT_TRUE(fragment->IsBlockLayoutRoot());
+  EXPECT_TRUE(fragment->IsBlockFormattingContextRoot());
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
index 2f6642c..8c6900d 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h
@@ -63,9 +63,10 @@
     // When adding new values, make sure the bit size of |sub_type_| is large
     // enough to store.
 
-    // Also, add after kMinimumBlockLayoutRoot if the box type is a block layout
-    // root, or before otherwise. See IsBlockLayoutRoot().
-    kMinimumBlockLayoutRoot = kAtomicInline
+    // Also, add after kMinimumBlockFormattingContextRoot if the box type is a
+    // block formatting context root, or before otherwise. See
+    // IsBlockFormattingContextRoot().
+    kMinimumBlockFormattingContextRoot = kAtomicInline
   };
 
   ~NGPhysicalFragment();
@@ -113,11 +114,9 @@
   // Returns whether the fragment is old layout root.
   bool IsOldLayoutRoot() const { return is_old_layout_root_; }
 
-  // A block sub-layout starts on this fragment. Inline blocks, floats, out of
-  // flow positioned objects are such examples. This is also true on NG/legacy
-  // boundary.
-  bool IsBlockLayoutRoot() const {
-    return (IsBox() && BoxType() >= NGBoxType::kMinimumBlockLayoutRoot) ||
+  bool IsBlockFormattingContextRoot() const {
+    return (IsBox() &&
+            BoxType() >= NGBoxType::kMinimumBlockFormattingContextRoot) ||
            IsOldLayoutRoot();
   }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_space_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_space_utils.cc
index a06aa67..97333992 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_space_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_space_utils.cc
@@ -5,6 +5,8 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_space_utils.h"
 
 #include "third_party/blink/renderer/core/layout/ng/geometry/ng_bfc_offset.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/platform/text/writing_mode.h"
 
@@ -31,4 +33,20 @@
   return false;
 }
 
+scoped_refptr<NGConstraintSpace> CreateExtrinsicConstraintSpaceForChild(
+    const NGConstraintSpace& container_constraint_space,
+    LayoutUnit container_extrinsic_block_size,
+    NGLayoutInputNode child) {
+  NGLogicalSize extrinsic_size(NGSizeIndefinite,
+                               container_extrinsic_block_size);
+
+  return NGConstraintSpaceBuilder(container_constraint_space)
+      .SetAvailableSize(extrinsic_size)
+      .SetPercentageResolutionSize(extrinsic_size)
+      .SetIsIntermediateLayout(true)
+      .SetIsNewFormattingContext(child.CreatesNewFormattingContext())
+      .SetFloatsBfcBlockOffset(LayoutUnit())
+      .ToConstraintSpace(child.Style().GetWritingMode());
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_space_utils.h b/third_party/blink/renderer/core/layout/ng/ng_space_utils.h
index 66262ad..a14d857 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_space_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_space_utils.h
@@ -5,8 +5,10 @@
 #ifndef NGSpaceUtils_h
 #define NGSpaceUtils_h
 
+#include "base/memory/scoped_refptr.h"
 #include "base/optional.h"
 #include "third_party/blink/renderer/core/core_export.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_layout_input_node.h"
 #include "third_party/blink/renderer/platform/layout_unit.h"
 
 namespace blink {
@@ -24,6 +26,25 @@
 CORE_EXPORT bool AdjustToClearance(LayoutUnit clearance_offset,
                                    NGBfcOffset* offset);
 
+// Create a child constraint space with only extrinsic block sizing data. This
+// will and can not be used for final layout, but is needed in an intermediate
+// measure pass that calculates the min/max size contribution from a child that
+// establishes an orthogonal flow root.
+//
+// Note that it's the child's *block* size that will be propagated as min/max
+// inline size to the container. Therefore it's crucial to provide the child
+// with an available inline size (which can be derived from the block size of
+// the container if definite). We'll provide any extrinsic available block size
+// that we have. This includes fixed and resolvable percentage sizes, for
+// instance, while auto will not resolve. If no extrinsic size can be
+// determined, we will resort to using a fallback later on, such as the initial
+// containing block size. Spec:
+// https://www.w3.org/TR/css-writing-modes-3/#orthogonal-auto
+scoped_refptr<NGConstraintSpace> CreateExtrinsicConstraintSpaceForChild(
+    const NGConstraintSpace& container_constraint_space,
+    LayoutUnit container_extrinsic_block_size,
+    NGLayoutInputNode child);
+
 }  // namespace blink
 
 #endif  // NGSpaceUtils_h
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.cc
index 3d21038..007629c 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_foreign_object.cc
@@ -180,6 +180,9 @@
                     SVGLayoutSupport::IsOverflowHidden(StyleRef()))) {
     // See NeedsOverflowClip() in PaintPropertyTreeBuilder for the reason.
     SetNeedsPaintPropertyUpdate();
+
+    if (Layer())
+      Layer()->SetNeedsCompositingInputsUpdate();
   }
 }
 
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
index a7b509a..f07aa0e 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_root.cc
@@ -198,6 +198,9 @@
       viewport_may_have_changed) {
     SetMayNeedPaintInvalidationSubtree();
     SetNeedsPaintPropertyUpdate();
+
+    if (Layer())
+      Layer()->SetNeedsCompositingInputsUpdate();
   }
 
   SVGSVGElement* svg = ToSVGSVGElement(GetNode());
@@ -362,6 +365,8 @@
       break;
   }
   SetNeedsPaintPropertyUpdate();
+  if (Layer())
+    Layer()->SetNeedsCompositingInputsUpdate();
 }
 
 void LayoutSVGRoot::InsertedIntoTree() {
diff --git a/third_party/blink/renderer/core/loader/appcache/application_cache_host.cc b/third_party/blink/renderer/core/loader/appcache/application_cache_host.cc
index e9ff97a6..4510299e 100644
--- a/third_party/blink/renderer/core/loader/appcache/application_cache_host.cc
+++ b/third_party/blink/renderer/core/loader/appcache/application_cache_host.cc
@@ -299,7 +299,7 @@
   } else {
     event = Event::Create(event_type);
   }
-  dom_application_cache_->DispatchEvent(event);
+  dom_application_cache_->DispatchEvent(*event);
 }
 
 ApplicationCacheHost::Status ApplicationCacheHost::GetStatus() const {
diff --git a/third_party/blink/renderer/core/loader/document_loader.cc b/third_party/blink/renderer/core/loader/document_loader.cc
index 175e3ca..8203771d 100644
--- a/third_party/blink/renderer/core/loader/document_loader.cc
+++ b/third_party/blink/renderer/core/loader/document_loader.cc
@@ -1091,7 +1091,7 @@
   Document* document = frame_->DomWindow()->InstallNewDocument(
       mime_type,
       DocumentInit::Create()
-          .WithFrame(frame_)
+          .WithDocumentLoader(this)
           .WithURL(url)
           .WithOwnerDocument(owner_document)
           .WithNewRegistrationContext(),
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
index f2c1072..df843406 100644
--- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc
+++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -792,7 +792,6 @@
 void FrameFetchContext::DidLoadResource(Resource* resource) {
   if (!document_)
     return;
-  FirstMeaningfulPaintDetector::From(*document_).CheckNetworkStable();
   if (LocalFrame* local_frame = document_->GetFrame()) {
     if (IdlenessDetector* idleness_detector =
             local_frame->GetIdlenessDetector()) {
diff --git a/third_party/blink/renderer/core/loader/frame_loader.cc b/third_party/blink/renderer/core/loader/frame_loader.cc
index 85298ed..07da0cc5 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.cc
+++ b/third_party/blink/renderer/core/loader/frame_loader.cc
@@ -85,7 +85,9 @@
 #include "third_party/blink/renderer/core/svg/graphics/svg_image.h"
 #include "third_party/blink/renderer/core/xml/parser/xml_document_parser.h"
 #include "third_party/blink/renderer/platform/bindings/dom_wrapper_world.h"
+#include "third_party/blink/renderer/platform/bindings/microtask.h"
 #include "third_party/blink/renderer/platform/bindings/script_forbidden_scope.h"
+#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/instance_counters.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
@@ -1187,6 +1189,14 @@
   if (!frame_->Client())
     return false;
   DCHECK_EQ(provisional_document_loader_, pdl);
+
+  // Flush microtask queue so that they all run on pre-navigation context.
+  Microtask::PerformCheckpoint(V8PerIsolateData::MainThreadIsolate());
+
+  // Ensure that the frame_ hasn't detached from running the microtasks.
+  if (!frame_->Client())
+    return false;
+
   // No more events will be dispatched so detach the Document.
   // TODO(yoav): Should we also be nullifying domWindow's document (or
   // domWindow) since the doc is now detached?
@@ -1601,24 +1611,6 @@
   return flags;
 }
 
-WebInsecureRequestPolicy FrameLoader::GetInsecureRequestPolicy() const {
-  Frame* parent_frame = frame_->Tree().Parent();
-  if (!parent_frame)
-    return kLeaveInsecureRequestsAlone;
-
-  return parent_frame->GetSecurityContext()->GetInsecureRequestPolicy();
-}
-
-SecurityContext::InsecureNavigationsSet*
-FrameLoader::InsecureNavigationsToUpgrade() const {
-  DCHECK(frame_);
-  Frame* parent_frame = frame_->Tree().Parent();
-  if (!parent_frame)
-    return nullptr;
-
-  return parent_frame->GetSecurityContext()->InsecureNavigationsToUpgrade();
-}
-
 void FrameLoader::ModifyRequestForCSP(ResourceRequest& resource_request,
                                       Document* origin_document) const {
   if (RuntimeEnabledFeatures::EmbedderCSPEnforcementEnabled() &&
diff --git a/third_party/blink/renderer/core/loader/frame_loader.h b/third_party/blink/renderer/core/loader/frame_loader.h
index cfd082b..9fa41625 100644
--- a/third_party/blink/renderer/core/loader/frame_loader.h
+++ b/third_party/blink/renderer/core/loader/frame_loader.h
@@ -165,8 +165,6 @@
   void ForceSandboxFlags(SandboxFlags flags) { forced_sandbox_flags_ |= flags; }
   SandboxFlags EffectiveSandboxFlags() const;
 
-  WebInsecureRequestPolicy GetInsecureRequestPolicy() const;
-  SecurityContext::InsecureNavigationsSet* InsecureNavigationsToUpgrade() const;
   void ModifyRequestForCSP(ResourceRequest&, Document*) const;
 
   Frame* Opener();
diff --git a/third_party/blink/renderer/core/loader/idleness_detector.cc b/third_party/blink/renderer/core/loader/idleness_detector.cc
index ef0fd58..f8aa794 100644
--- a/third_party/blink/renderer/core/loader/idleness_detector.cc
+++ b/third_party/blink/renderer/core/loader/idleness_detector.cc
@@ -9,6 +9,8 @@
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/instrumentation/resource_coordinator/frame_resource_coordinator.h"
 #include "third_party/blink/renderer/platform/loader/fetch/resource_fetcher.h"
@@ -125,11 +127,11 @@
 }
 
 void IdlenessDetector::WillProcessTask(base::TimeTicks start_time) {
-  // If we have idle time and we are kNetworkQuietWindow seconds past it, emit
+  // If we have idle time and we are network_quiet_window_ seconds past it, emit
   // idle signals.
   DocumentLoader* loader = local_frame_->Loader().GetDocumentLoader();
   if (in_network_2_quiet_period_ && !network_2_quiet_.is_null() &&
-      start_time - network_2_quiet_ > kNetworkQuietWindow) {
+      start_time - network_2_quiet_ > network_quiet_window_) {
     probe::lifecycleEvent(local_frame_, loader, "networkAlmostIdle",
                           TimeTicksInSeconds(network_2_quiet_start_time_));
     if (::resource_coordinator::IsPageAlmostIdleSignalEnabled()) {
@@ -139,14 +141,18 @@
       }
     }
     local_frame_->GetDocument()->Fetcher()->OnNetworkQuiet();
+    FirstMeaningfulPaintDetector::From(*local_frame_->GetDocument())
+        .OnNetwork2Quiet();
     in_network_2_quiet_period_ = false;
     network_2_quiet_ = TimeTicks();
   }
 
   if (in_network_0_quiet_period_ && !network_0_quiet_.is_null() &&
-      start_time - network_0_quiet_ > kNetworkQuietWindow) {
+      start_time - network_0_quiet_ > network_quiet_window_) {
     probe::lifecycleEvent(local_frame_, loader, "networkIdle",
                           TimeTicksInSeconds(network_0_quiet_start_time_));
+    FirstMeaningfulPaintDetector::From(*local_frame_->GetDocument())
+        .OnNetwork0Quiet();
     in_network_0_quiet_period_ = false;
     network_0_quiet_ = TimeTicks();
   }
@@ -170,7 +176,12 @@
       network_quiet_timer_(
           local_frame->GetTaskRunner(TaskType::kInternalLoading),
           this,
-          &IdlenessDetector::NetworkQuietTimerFired) {}
+          &IdlenessDetector::NetworkQuietTimerFired) {
+  if (local_frame->GetSettings()) {
+    network_quiet_window_ = TimeDelta::FromSecondsD(
+        local_frame->GetSettings()->GetNetworkQuietTimeout());
+  }
+}
 
 void IdlenessDetector::Stop() {
   network_quiet_timer_.Stop();
diff --git a/third_party/blink/renderer/core/loader/idleness_detector.h b/third_party/blink/renderer/core/loader/idleness_detector.h
index e898c71..91a63a5 100644
--- a/third_party/blink/renderer/core/loader/idleness_detector.h
+++ b/third_party/blink/renderer/core/loader/idleness_detector.h
@@ -64,6 +64,7 @@
   bool in_network_0_quiet_period_ = true;
   bool in_network_2_quiet_period_ = true;
 
+  TimeDelta network_quiet_window_ = kNetworkQuietWindow;
   // Store the accumulated time of network quiet.
   TimeTicks network_0_quiet_;
   TimeTicks network_2_quiet_;
diff --git a/third_party/blink/renderer/core/loader/image_loader.cc b/third_party/blink/renderer/core/loader/image_loader.cc
index a5903fe..a9fdb27 100644
--- a/third_party/blink/renderer/core/loader/image_loader.cc
+++ b/third_party/blink/renderer/core/loader/image_loader.cc
@@ -745,7 +745,7 @@
 void ImageLoader::DispatchPendingErrorEvent(
     std::unique_ptr<IncrementLoadEventDelayCount> count) {
   if (GetElement()->GetDocument().GetFrame())
-    GetElement()->DispatchEvent(Event::Create(EventTypeNames::error));
+    GetElement()->DispatchEvent(*Event::Create(EventTypeNames::error));
 
   // Checks Document's load event synchronously here for performance.
   // This is safe because DispatchPendingErrorEvent() is called asynchronously.
diff --git a/third_party/blink/renderer/core/loader/link_loader.cc b/third_party/blink/renderer/core/loader/link_loader.cc
index 395b5439..70d3ad8 100644
--- a/third_party/blink/renderer/core/loader/link_loader.cc
+++ b/third_party/blink/renderer/core/loader/link_loader.cc
@@ -544,8 +544,7 @@
       ScriptFetchOptions(params.nonce, integrity_metadata, params.integrity,
                          kNotParserInserted, credentials_mode,
                          params.referrer_policy),
-      Referrer(Referrer::NoReferrer(), params.referrer_policy),
-      TextPosition::MinimumPosition());
+      Referrer::NoReferrer(), TextPosition::MinimumPosition());
 
   // Step 11. "Fetch a single module script given url, settings object,
   // destination, options, settings object, "client", and with the top-level
diff --git a/third_party/blink/renderer/core/loader/link_loader_test.cc b/third_party/blink/renderer/core/loader/link_loader_test.cc
index 9d6369e4..ce3eadf 100644
--- a/third_party/blink/renderer/core/loader/link_loader_test.cc
+++ b/third_party/blink/renderer/core/loader/link_loader_test.cc
@@ -480,8 +480,8 @@
     EXPECT_EQ(kNotParserInserted, request.Options().ParserState());
     EXPECT_EQ(params_->expected_credentials_mode,
               request.Options().CredentialsMode());
-    EXPECT_EQ(Referrer::NoReferrer(), request.GetReferrer().referrer);
-    EXPECT_EQ(params_->referrer_policy, request.GetReferrer().referrer_policy);
+    EXPECT_EQ(Referrer::NoReferrer(), request.ReferrerString());
+    EXPECT_EQ(params_->referrer_policy, request.Options().GetReferrerPolicy());
     EXPECT_EQ(params_->integrity,
               request.Options().GetIntegrityAttributeValue());
     EXPECT_EQ(ModuleScriptCustomFetchType::kNone, custom_fetch_type);
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h b/third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h
index 687c8cf..518c7d4 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_fetch_request.h
@@ -8,7 +8,6 @@
 #include "third_party/blink/public/platform/web_url_request.h"
 #include "third_party/blink/renderer/platform/loader/fetch/script_fetch_options.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
-#include "third_party/blink/renderer/platform/weborigin/referrer.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
@@ -24,32 +23,32 @@
   ModuleScriptFetchRequest(const KURL& url,
                            WebURLRequest::RequestContext destination,
                            const ScriptFetchOptions& options,
-                           const Referrer& referrer,
+                           const String& referrer_string,
                            const TextPosition& referrer_position)
       : url_(url),
         destination_(destination),
         options_(options),
-        referrer_(referrer),
+        referrer_string_(referrer_string),
         referrer_position_(referrer_position) {}
 
   static ModuleScriptFetchRequest CreateForTest(const KURL& url) {
-    return ModuleScriptFetchRequest(url, WebURLRequest::kRequestContextScript,
-                                    ScriptFetchOptions(), Referrer(),
-                                    TextPosition::MinimumPosition());
+    return ModuleScriptFetchRequest(
+        url, WebURLRequest::kRequestContextScript, ScriptFetchOptions(),
+        Referrer::ClientReferrerString(), TextPosition::MinimumPosition());
   }
   ~ModuleScriptFetchRequest() = default;
 
   const KURL& Url() const { return url_; }
   WebURLRequest::RequestContext Destination() const { return destination_; }
   const ScriptFetchOptions& Options() const { return options_; }
-  const Referrer& GetReferrer() const { return referrer_; }
+  const String& ReferrerString() const { return referrer_string_; }
   const TextPosition& GetReferrerPosition() const { return referrer_position_; }
 
  private:
   const KURL url_;
   const WebURLRequest::RequestContext destination_;
   const ScriptFetchOptions options_;
-  const Referrer referrer_;
+  const String referrer_string_;
   const TextPosition referrer_position_;
 };
 
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
index b12dd2a..69f1678 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_script_loader.cc
@@ -128,7 +128,7 @@
 
   if (level == ModuleGraphLevel::kDependentModuleFetch) {
     options.initiator_info.imported_module_referrer =
-        module_request.GetReferrer().referrer;
+        module_request.ReferrerString();
     options.initiator_info.position = module_request.GetReferrerPosition();
   }
 
@@ -145,10 +145,8 @@
   // cryptographic nonce, ..." [spec text]
   fetch_params.SetContentSecurityPolicyNonce(options_.Nonce());
 
-  // [SMSR] "... its referrer policy to options's referrer policy.
-  // TODO(domfarolino): Implement this so we can set ResourceRequest's referrer
-  // string and referrer policy separately, and have the final referrer string
-  // generated in BaseFetchContext. See https://crbug.com/863769.
+  // [SMSR] "... its referrer policy to options's referrer policy." [spec text]
+  // Note: For now this is done below with SetHTTPReferrer()
 
   // Step 5. "... mode is "cors", ..."
   // [SMSR] "... and its credentials mode to options's credentials mode."
@@ -158,10 +156,17 @@
       options_.CredentialsMode());
 
   // Step 5. "... referrer is referrer, ..." [spec text]
-  // TODO(domfarolino): Use ResourceRequest::SetReferrerString here instead
-  // of SetHTTPReferrer. See https://crbug.com/863769.
+  // Note: For now this is done below with SetHTTPReferrer()
+  String referrer_string = module_request.ReferrerString();
+  if (referrer_string == Referrer::ClientReferrerString())
+    referrer_string = fetch_client_settings_object->GetOutgoingReferrer();
+
+  // TODO(domfarolino): Stop storing ResourceRequest's referrer as a
+  // blink::Referrer (https://crbug.com/850813).
   fetch_params.MutableResourceRequest().SetHTTPReferrer(
-      module_request.GetReferrer());
+      SecurityPolicy::GenerateReferrer(
+          module_request.Options().GetReferrerPolicy(),
+          fetch_params.GetResourceRequest().Url(), referrer_string));
 
   // Step 5. "... and client is fetch client settings object." [spec text]
   // -> set by ResourceFetcher
diff --git a/third_party/blink/renderer/core/loader/modulescript/module_tree_linker.cc b/third_party/blink/renderer/core/loader/modulescript/module_tree_linker.cc
index 0579ebc..95869da 100644
--- a/third_party/blink/renderer/core/loader/modulescript/module_tree_linker.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/module_tree_linker.cc
@@ -188,21 +188,11 @@
   visited_set_.insert(url);
 
   // Step 2. Perform the internal module script graph fetching procedure given
-  // ... with the top-level module fetch flag set. ...
-  // TODO(domfarolino): We should refrain from storing referrer as a generated
-  // blink::Referrer for a couple reasons (https://crbug.com/863769):
-  // 1.) It is awkward that now both ModuleScriptFetchRequest::Referrer and
-  // ScriptFetchOptions have a referrer_policy member from this point forward.
-  // 2.) We can instead just set the referrer string here to
-  // Referrer::ClientReferrerString, communicate this to the ResourceRequest in
-  // ModuleScriptLoader::FetchInternal, and generate the final referrer in
-  // BaseFetchContext::AddAdditionalRequestHeaders.
-  ModuleScriptFetchRequest request(
-      url, destination_, options,
-      SecurityPolicy::GenerateReferrer(
-          options.GetReferrerPolicy(), url,
-          fetch_client_settings_object_->GetOutgoingReferrer()),
-      TextPosition::MinimumPosition());
+  // url, settings object, destination, options, settings object, visited set,
+  // "client", and with the top-level module fetch flag set.
+  ModuleScriptFetchRequest request(url, destination_, options,
+                                   Referrer::ClientReferrerString(),
+                                   TextPosition::MinimumPosition());
 
   InitiateInternalModuleScriptGraphFetching(
       request, ModuleGraphLevel::kTopLevelModuleFetch);
@@ -394,15 +384,9 @@
     // procedure given url, fetch client settings object, destination, options,
     // module script's settings object, visited set, module script's base URL,
     // and with the top-level module fetch flag unset. ...
-    // TODO(domfarolino): We should set ModuleScriptFetchRequest's referrer
-    // string without generating a full blink::Referrer. The final generated
-    // referrer string should be generated down in BaseFetchContext.
-    // See https://crbug.com/863769.
-    ModuleScriptFetchRequest request(
-        urls[i], destination_, options,
-        SecurityPolicy::GenerateReferrer(options.GetReferrerPolicy(), urls[i],
-                                         module_script->BaseURL().GetString()),
-        positions[i]);
+    ModuleScriptFetchRequest request(urls[i], destination_, options,
+                                     module_script->BaseURL().GetString(),
+                                     positions[i]);
     InitiateInternalModuleScriptGraphFetching(
         request, ModuleGraphLevel::kDependentModuleFetch);
   }
diff --git a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
index 3920612..1b632dc0 100644
--- a/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
+++ b/third_party/blink/renderer/core/loader/resource/image_resource_test.cc
@@ -1805,6 +1805,9 @@
 }
 
 TEST(ImageResourceTest, PeriodicFlushTest) {
+  ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
+      platform;
+
   EmptyChromeClient* chrome_client = new EmptyChromeClient();
   Page::PageClients clients;
   FillWithEmptyClients(clients);
@@ -1812,8 +1815,6 @@
   std::unique_ptr<DummyPageHolder> page_holder = DummyPageHolder::Create(
       IntSize(800, 600), &clients, EmptyLocalFrameClient::Create(), nullptr);
 
-  ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
-      platform;
   KURL test_url(kTestURL);
   ScopedMockedURLLoad scoped_mocked_url_load(test_url, GetTestFilePath());
 
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message.h b/third_party/blink/renderer/core/messaging/blink_cloneable_message.h
index f6d052e..a51e888 100644
--- a/third_party/blink/renderer/core/messaging/blink_cloneable_message.h
+++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_MESSAGING_BLINK_CLONEABLE_MESSAGE_H_
 
 #include "base/macros.h"
+#include "base/unguessable_token.h"
 #include "third_party/blink/renderer/bindings/core/v8/serialization/serialized_script_value.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "v8/include/v8-inspector.h"
@@ -25,6 +26,7 @@
 
   scoped_refptr<blink::SerializedScriptValue> message;
   v8_inspector::V8StackTraceId sender_stack_trace_id;
+  base::Optional<base::UnguessableToken> locked_agent_cluster_id;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BlinkCloneableMessage);
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.cc b/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.cc
index 5afbd1b..9c00950e 100644
--- a/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.cc
+++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.cc
@@ -41,6 +41,10 @@
       std::make_pair(data.stack_trace_debugger_id_first(),
                      data.stack_trace_debugger_id_second()));
 
+  base::Optional<base::UnguessableToken> locked_agent_cluster_id;
+  if (!data.ReadLockedAgentClusterId(&locked_agent_cluster_id))
+    return false;
+  out->locked_agent_cluster_id = locked_agent_cluster_id;
   return true;
 }
 
diff --git a/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.h b/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.h
index 7420e0d..f74cfcb 100644
--- a/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.h
+++ b/third_party/blink/renderer/core/messaging/blink_cloneable_message_struct_traits.h
@@ -6,6 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_CORE_MESSAGING_BLINK_CLONEABLE_MESSAGE_STRUCT_TRAITS_H_
 
 #include "mojo/public/cpp/base/big_buffer.h"
+#include "mojo/public/cpp/base/unguessable_token_mojom_traits.h"
 #include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
 #include "mojo/public/cpp/bindings/string_traits_wtf.h"
 #include "third_party/blink/public/mojom/message_port/message_port.mojom-blink.h"
@@ -27,20 +28,25 @@
   static Vector<scoped_refptr<blink::BlobDataHandle>> blobs(
       blink::BlinkCloneableMessage& input);
 
-  static uint64_t stack_trace_id(blink::BlinkCloneableMessage& input) {
+  static uint64_t stack_trace_id(const blink::BlinkCloneableMessage& input) {
     return static_cast<uint64_t>(input.sender_stack_trace_id.id);
   }
 
   static int64_t stack_trace_debugger_id_first(
-      blink::BlinkCloneableMessage& input) {
+      const blink::BlinkCloneableMessage& input) {
     return input.sender_stack_trace_id.debugger_id.first;
   }
 
   static int64_t stack_trace_debugger_id_second(
-      blink::BlinkCloneableMessage& input) {
+      const blink::BlinkCloneableMessage& input) {
     return input.sender_stack_trace_id.debugger_id.second;
   }
 
+  static const base::Optional<base::UnguessableToken>& locked_agent_cluster_id(
+      const blink::BlinkCloneableMessage& input) {
+    return input.locked_agent_cluster_id;
+  }
+
   static bool Read(blink::mojom::blink::CloneableMessage::DataView,
                    blink::BlinkCloneableMessage* out);
 };
diff --git a/third_party/blink/renderer/core/messaging/blink_transferable_message.cc b/third_party/blink/renderer/core/messaging/blink_transferable_message.cc
index 3be8c7fb..3bed37ca 100644
--- a/third_party/blink/renderer/core/messaging/blink_transferable_message.cc
+++ b/third_party/blink/renderer/core/messaging/blink_transferable_message.cc
@@ -36,6 +36,7 @@
       message.stack_trace_id,
       std::make_pair(message.stack_trace_debugger_id_first,
                      message.stack_trace_debugger_id_second));
+  result.locked_agent_cluster_id = message.locked_agent_cluster_id;
   result.ports.AppendRange(message.ports.begin(), message.ports.end());
   result.has_user_gesture = message.has_user_gesture;
   if (message.user_activation) {
@@ -63,6 +64,7 @@
       message.sender_stack_trace_id.debugger_id.first;
   result.stack_trace_debugger_id_second =
       message.sender_stack_trace_id.debugger_id.second;
+  result.locked_agent_cluster_id = message.locked_agent_cluster_id;
   result.ports.assign(message.ports.begin(), message.ports.end());
   result.has_user_gesture = message.has_user_gesture;
   if (message.user_activation) {
diff --git a/third_party/blink/renderer/core/messaging/message_port.cc b/third_party/blink/renderer/core/messaging/message_port.cc
index ce45e3fd..bb0ab33 100644
--- a/third_party/blink/renderer/core/messaging/message_port.cc
+++ b/third_party/blink/renderer/core/messaging/message_port.cc
@@ -47,8 +47,12 @@
 
 namespace blink {
 
+// TODO(altimin): Remove these after per-task mojo dispatching.
 // The maximum number of MessageEvents to dispatch from one task.
-static const int kMaximumMessagesPerTask = 200;
+constexpr int kMaximumMessagesPerTask = 200;
+// The threshold to stop processing new tasks.
+constexpr base::TimeDelta kYieldThreshold =
+    base::TimeDelta::FromMilliseconds(50);
 
 MessagePort* MessagePort::Create(ExecutionContext& execution_context) {
   return new MessagePort(execution_context);
@@ -92,6 +96,12 @@
   if (debugger)
     msg.sender_stack_trace_id = debugger->StoreCurrentStackTrace("postMessage");
 
+  if (message->IsLockedToAgentCluster()) {
+    msg.locked_agent_cluster_id = GetExecutionContext()->GetAgentClusterID();
+  } else {
+    msg.locked_agent_cluster_id = base::nullopt;
+  }
+
   mojo::Message mojo_message =
       mojom::blink::TransferableMessage::WrapAsMessage(std::move(msg));
   connector_->Accept(&mojo_message);
@@ -239,12 +249,13 @@
   // the connector is temporarily paused after |kMaximumMessagesPerTask| have
   // been received without other tasks having had a chance to run (in particular
   // the ResetMessageCount task posted here).
+  // TODO(altimin): Remove this after per-task mojo dispatching lands[1].
+  // [1] https://chromium-review.googlesource.com/c/chromium/src/+/1145692
   if (messages_in_current_task_ == 0) {
     task_runner_->PostTask(FROM_HERE, WTF::Bind(&MessagePort::ResetMessageCount,
                                                 WrapWeakPersistent(this)));
   }
-  ++messages_in_current_task_;
-  if (messages_in_current_task_ > kMaximumMessagesPerTask) {
+  if (ShouldYieldAfterNewMessage()) {
     connector_->PauseIncomingMethodCallProcessing();
   }
 
@@ -261,15 +272,22 @@
     return true;
   }
 
-  MessagePortArray* ports = MessagePort::EntanglePorts(
-      *GetExecutionContext(), std::move(message.ports));
-  Event* evt = MessageEvent::Create(ports, std::move(message.message));
+  Event* evt;
+  if (!message.locked_agent_cluster_id ||
+      GetExecutionContext()->IsSameAgentCluster(
+          *message.locked_agent_cluster_id)) {
+    MessagePortArray* ports = MessagePort::EntanglePorts(
+        *GetExecutionContext(), std::move(message.ports));
+    evt = MessageEvent::Create(ports, std::move(message.message));
+  } else {
+    evt = MessageEvent::CreateError();
+  }
 
   v8::Isolate* isolate = ToIsolate(GetExecutionContext());
   ThreadDebugger* debugger = ThreadDebugger::From(isolate);
   if (debugger)
     debugger->ExternalAsyncTaskStarted(message.sender_stack_trace_id);
-  DispatchEvent(evt);
+  DispatchEvent(*evt);
   if (debugger)
     debugger->ExternalAsyncTaskFinished(message.sender_stack_trace_id);
   return true;
@@ -278,9 +296,20 @@
 void MessagePort::ResetMessageCount() {
   DCHECK_GT(messages_in_current_task_, 0);
   messages_in_current_task_ = 0;
+  task_start_time_ = base::nullopt;
   // No-op if not paused already.
   if (connector_)
     connector_->ResumeIncomingMethodCallProcessing();
 }
 
+bool MessagePort::ShouldYieldAfterNewMessage() {
+  ++messages_in_current_task_;
+  if (messages_in_current_task_ > kMaximumMessagesPerTask)
+    return true;
+  base::TimeTicks now = base::TimeTicks::Now();
+  if (!task_start_time_)
+    task_start_time_ = now;
+  return now - task_start_time_.value() > kYieldThreshold;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/messaging/message_port.h b/third_party/blink/renderer/core/messaging/message_port.h
index f940655..41c3f8b2 100644
--- a/third_party/blink/renderer/core/messaging/message_port.h
+++ b/third_party/blink/renderer/core/messaging/message_port.h
@@ -135,6 +135,7 @@
   // mojo::MessageReceiver implementation.
   bool Accept(mojo::Message*) override;
   void ResetMessageCount();
+  bool ShouldYieldAfterNewMessage();
 
   std::unique_ptr<mojo::Connector> connector_;
   int messages_in_current_task_ = 0;
@@ -142,6 +143,8 @@
   bool started_ = false;
   bool closed_ = false;
 
+  base::Optional<base::TimeTicks> task_start_time_;
+
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 };
 
diff --git a/third_party/blink/renderer/core/mojo/test/mojo_interface_interceptor.cc b/third_party/blink/renderer/core/mojo/test/mojo_interface_interceptor.cc
index 6e7bd8f..dc8e244 100644
--- a/third_party/blink/renderer/core/mojo/test/mojo_interface_interceptor.cc
+++ b/third_party/blink/renderer/core/mojo/test/mojo_interface_interceptor.cc
@@ -173,7 +173,7 @@
 
 void MojoInterfaceInterceptor::DispatchInterfaceRequestEvent(
     mojo::ScopedMessagePipeHandle handle) {
-  DispatchEvent(MojoInterfaceRequestEvent::Create(
+  DispatchEvent(*MojoInterfaceRequestEvent::Create(
       MojoHandle::Create(mojo::ScopedHandle::From(std::move(handle)))));
 }
 
diff --git a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
index a1c67e0..45f1634e 100644
--- a/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
+++ b/third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.h
@@ -158,7 +158,7 @@
   bool IsAccelerated() const final;
 
   DispatchEventResult HostDispatchEvent(Event* event) override {
-    return DispatchEvent(event);
+    return DispatchEvent(*event);
   }
 
   bool IsWebGL1Enabled() const override { return true; }
diff --git a/third_party/blink/renderer/core/page/drag_controller.cc b/third_party/blink/renderer/core/page/drag_controller.cc
index 5348f488..208bc07a 100644
--- a/third_party/blink/renderer/core/page/drag_controller.cc
+++ b/third_party/blink/renderer/core/page/drag_controller.cc
@@ -517,7 +517,7 @@
       CreateVisibleSelection(
           SelectionInDOMTree::Builder().Collapse(caret_position).Build()));
   return target->DispatchEvent(
-      TextEvent::CreateForDrop(inner_frame->DomWindow(), text));
+      *TextEvent::CreateForDrop(inner_frame->DomWindow(), text));
 }
 
 bool DragController::ConcludeEditDrag(DragData* drag_data) {
diff --git a/third_party/blink/renderer/core/page/focus_controller.cc b/third_party/blink/renderer/core/page/focus_controller.cc
index e2e6d4af..9581299 100644
--- a/third_party/blink/renderer/core/page/focus_controller.cc
+++ b/third_party/blink/renderer/core/page/focus_controller.cc
@@ -399,9 +399,10 @@
     DispatchBlurEvent(*document, *focused_element);
   }
 
-  if (LocalDOMWindow* window = document->domWindow())
+  if (LocalDOMWindow* window = document->domWindow()) {
     window->DispatchEvent(
-        Event::Create(focused ? EventTypeNames::focus : EventTypeNames::blur));
+        *Event::Create(focused ? EventTypeNames::focus : EventTypeNames::blur));
+  }
   if (focused && document->FocusedElement()) {
     Element* focused_element(document->FocusedElement());
     // Use focus_type kWebFocusTypePage, same as used in DispatchFocusEvent.
@@ -789,12 +790,13 @@
   // states of both frames.
   if (old_frame && old_frame->View()) {
     old_frame->Selection().SetFrameIsFocused(false);
-    old_frame->DomWindow()->DispatchEvent(Event::Create(EventTypeNames::blur));
+    old_frame->DomWindow()->DispatchEvent(*Event::Create(EventTypeNames::blur));
   }
 
   if (new_frame && new_frame->View() && IsFocused()) {
     new_frame->Selection().SetFrameIsFocused(true);
-    new_frame->DomWindow()->DispatchEvent(Event::Create(EventTypeNames::focus));
+    new_frame->DomWindow()->DispatchEvent(
+        *Event::Create(EventTypeNames::focus));
   }
 
   is_changing_focused_frame_ = false;
diff --git a/third_party/blink/renderer/core/page/page.cc b/third_party/blink/renderer/core/page/page.cc
index 2a285aab..d49490d 100644
--- a/third_party/blink/renderer/core/page/page.cc
+++ b/third_party/blink/renderer/core/page/page.cc
@@ -122,11 +122,16 @@
   return page->DeviceScaleFactorDeprecated();
 }
 
-Page* Page::CreateOrdinary(PageClients& page_clients, Page* opener) {
-  Page* page = Create(page_clients);
+Page* Page::Create(PageClients& page_clients) {
+  Page* page = new Page(page_clients);
   page->SetPageScheduler(
       Platform::Current()->CurrentThread()->Scheduler()->CreatePageScheduler(
           page));
+  return page;
+}
+
+Page* Page::CreateOrdinary(PageClients& page_clients, Page* opener) {
+  Page* page = Create(page_clients);
 
   if (opener) {
     // Before: ... -> opener -> next -> ...
diff --git a/third_party/blink/renderer/core/page/page.h b/third_party/blink/renderer/core/page/page.h
index ce8c409..9c25836 100644
--- a/third_party/blink/renderer/core/page/page.h
+++ b/third_party/blink/renderer/core/page/page.h
@@ -102,9 +102,7 @@
     DISALLOW_COPY_AND_ASSIGN(PageClients);
   };
 
-  static Page* Create(PageClients& page_clients) {
-    return new Page(page_clients);
-  }
+  static Page* Create(PageClients& page_clients);
 
   // An "ordinary" page is a fully-featured page owned by a web view.
   static Page* CreateOrdinary(PageClients&, Page* opener);
diff --git a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
index 472ac46..14797920 100644
--- a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
+++ b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.cc
@@ -7,7 +7,6 @@
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_layer_tree_view.h"
 #include "third_party/blink/renderer/core/css/font_face_set_document.h"
-#include "third_party/blink/renderer/core/frame/settings.h"
 #include "third_party/blink/renderer/core/paint/paint_timing.h"
 #include "third_party/blink/renderer/core/probe/core_probes.h"
 #include "third_party/blink/renderer/platform/cross_thread_functional.h"
@@ -34,23 +33,8 @@
 }
 
 FirstMeaningfulPaintDetector::FirstMeaningfulPaintDetector(
-    PaintTiming* paint_timing,
-    Document& document)
-    : paint_timing_(paint_timing),
-      network0_quiet_timer_(
-          document.GetTaskRunner(TaskType::kInternalDefault),
-          this,
-          &FirstMeaningfulPaintDetector::Network0QuietTimerFired),
-      network2_quiet_timer_(
-          document.GetTaskRunner(TaskType::kInternalDefault),
-          this,
-          &FirstMeaningfulPaintDetector::Network2QuietTimerFired) {
-  if (GetDocument() && GetDocument()->GetSettings()) {
-    network2_quiet_window_timeout_ = TimeDelta::FromSecondsD(
-        GetDocument()->GetSettings()->GetFMPNetworkQuietTimeout());
-    network0_quiet_window_timeout_ = network2_quiet_window_timeout_;
-  }
-}
+    PaintTiming* paint_timing)
+    : paint_timing_(paint_timing) {}
 
 Document* FirstMeaningfulPaintDetector::GetDocument() {
   return paint_timing_->GetSupplementable();
@@ -123,44 +107,10 @@
   had_user_input_ = kHadUserInput;
 }
 
-int FirstMeaningfulPaintDetector::ActiveConnections() {
-  DCHECK(GetDocument());
-  ResourceFetcher* fetcher = GetDocument()->Fetcher();
-  return fetcher->BlockingRequestCount() + fetcher->NonblockingRequestCount();
-}
-
-// This function is called when the number of active connections is decreased
-// and when the document is parsed.
-void FirstMeaningfulPaintDetector::CheckNetworkStable() {
-  DCHECK(GetDocument());
-  if (!GetDocument()->HasFinishedParsing())
-    return;
-
-  SetNetworkQuietTimers(ActiveConnections());
-}
-
-void FirstMeaningfulPaintDetector::SetNetworkQuietTimers(
-    int active_connections) {
-  if (!network2_quiet_reached_ && active_connections <= 2) {
-    // If activeConnections < 2 and the timer is already running, current
-    // 2-quiet window continues; the timer shouldn't be restarted.
-    if (active_connections == 2 || !network2_quiet_timer_.IsActive()) {
-      network2_quiet_timer_.StartOneShot(network2_quiet_window_timeout_,
-                                         FROM_HERE);
-    }
-  }
-  if (!network0_quiet_reached_ && active_connections == 0) {
-    // This restarts 0-quiet timer if it's already running.
-    network0_quiet_timer_.StartOneShot(network0_quiet_window_timeout_,
-                                       FROM_HERE);
-  }
-}
-
-void FirstMeaningfulPaintDetector::Network0QuietTimerFired(TimerBase*) {
-  if (!GetDocument() || network0_quiet_reached_ || ActiveConnections() > 0 ||
-      paint_timing_->FirstContentfulPaintRendered().is_null())
-    return;
+void FirstMeaningfulPaintDetector::OnNetwork0Quiet() {
   network0_quiet_reached_ = true;
+  if (!GetDocument() || paint_timing_->FirstContentfulPaintRendered().is_null())
+    return;
 
   if (!provisional_first_meaningful_paint_.is_null()) {
     // Enforce FirstContentfulPaint <= FirstMeaningfulPaint.
@@ -171,8 +121,8 @@
   ReportHistograms();
 }
 
-void FirstMeaningfulPaintDetector::Network2QuietTimerFired(TimerBase*) {
-  if (!GetDocument() || network2_quiet_reached_ || ActiveConnections() > 2 ||
+void FirstMeaningfulPaintDetector::OnNetwork2Quiet() {
+  if (!GetDocument() || network2_quiet_reached_ ||
       paint_timing_->FirstContentfulPaintRendered().is_null())
     return;
   network2_quiet_reached_ = true;
diff --git a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h
index ff6f60d8..8c1c48d7 100644
--- a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h
+++ b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector.h
@@ -10,7 +10,6 @@
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/paint/paint_event.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
-#include "third_party/blink/renderer/platform/timer.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
 
 namespace blink {
@@ -29,7 +28,7 @@
  public:
   static FirstMeaningfulPaintDetector& From(Document&);
 
-  FirstMeaningfulPaintDetector(PaintTiming*, Document&);
+  explicit FirstMeaningfulPaintDetector(PaintTiming*);
   virtual ~FirstMeaningfulPaintDetector() = default;
 
   void MarkNextPaintAsMeaningfulIfNeeded(const LayoutObjectCounter&,
@@ -38,11 +37,12 @@
                                          int visible_height);
   void NotifyInputEvent();
   void NotifyPaint();
-  void CheckNetworkStable();
   void ReportSwapTime(PaintEvent,
                       WebLayerTreeView::SwapResult,
                       base::TimeTicks);
   void NotifyFirstContentfulPaint(TimeTicks swap_stamp);
+  void OnNetwork0Quiet();
+  void OnNetwork2Quiet();
 
   void Trace(blink::Visitor*);
 
@@ -66,9 +66,6 @@
 
   Document* GetDocument();
   int ActiveConnections();
-  void SetNetworkQuietTimers(int active_connections);
-  void Network0QuietTimerFired(TimerBase*);
-  void Network2QuietTimerFired(TimerBase*);
   void ReportHistograms();
   void RegisterNotifySwapTime(PaintEvent);
   void SetFirstMeaningfulPaint(TimeTicks stamp, TimeTicks swap_stamp);
@@ -93,8 +90,6 @@
   TimeTicks first_meaningful_paint2_quiet_;
   unsigned outstanding_swap_promise_count_ = 0;
   DeferFirstMeaningfulPaint defer_first_meaningful_paint_ = kDoNotDefer;
-  TaskRunnerTimer<FirstMeaningfulPaintDetector> network0_quiet_timer_;
-  TaskRunnerTimer<FirstMeaningfulPaintDetector> network2_quiet_timer_;
   DISALLOW_COPY_AND_ASSIGN(FirstMeaningfulPaintDetector);
 };
 
diff --git a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc
index 756ad3f..a4bd180 100644
--- a/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/first_meaningful_paint_detector_test.cc
@@ -20,15 +20,6 @@
   void SetUp() override {
     platform_->AdvanceClock(TimeDelta::FromSeconds(1));
     PageTestBase::SetUp();
-    ResetNetworkQuietTimer();
-  }
-
-  // The initial document doesn't need to load any resources other than itself.
-  // It means initially, the network quiet timers are already active. This
-  // function is used to reset them.
-  void ResetNetworkQuietTimer() {
-    Detector().network2_quiet_timer_.Stop();
-    Detector().network0_quiet_timer_.Stop();
   }
 
   TimeTicks AdvanceClockAndGetTime() {
@@ -53,37 +44,22 @@
 
   void SimulateNetworkStable() {
     GetDocument().SetParsingState(Document::kFinishedParsing);
-    Detector().Network0QuietTimerFired(nullptr);
-    Detector().Network2QuietTimerFired(nullptr);
+    Detector().OnNetwork0Quiet();
+    Detector().OnNetwork2Quiet();
   }
 
   void SimulateNetwork0Quiet() {
     GetDocument().SetParsingState(Document::kFinishedParsing);
-    Detector().Network0QuietTimerFired(nullptr);
+    Detector().OnNetwork0Quiet();
   }
 
   void SimulateNetwork2Quiet() {
     GetDocument().SetParsingState(Document::kFinishedParsing);
-    Detector().Network2QuietTimerFired(nullptr);
+    Detector().OnNetwork2Quiet();
   }
 
   void SimulateUserInput() { Detector().NotifyInputEvent(); }
 
-  void SetActiveConnections(int connections) {
-    Detector().SetNetworkQuietTimers(connections);
-  }
-
-  bool IsNetwork0QuietTimerActive() {
-    return Detector().network0_quiet_timer_.IsActive();
-  }
-
-  bool IsNetwork2QuietTimerActive() {
-    return Detector().network2_quiet_timer_.IsActive();
-  }
-
-  bool HadNetwork0Quiet() { return Detector().network0_quiet_reached_; }
-  bool HadNetwork2Quiet() { return Detector().network2_quiet_reached_; }
-
   void ClearFirstPaintSwapPromise() {
     platform_->AdvanceClock(TimeDelta::FromMilliseconds(1));
     GetPaintTiming().ReportSwapTime(PaintEvent::kFirstPaint,
@@ -324,51 +300,6 @@
             GetPaintTiming().FirstMeaningfulPaintRendered());
 }
 
-TEST_F(FirstMeaningfulPaintDetectorTest, Network0QuietTimer) {
-  MarkFirstContentfulPaintAndClearSwapPromise();
-
-  SetActiveConnections(1);
-  EXPECT_FALSE(IsNetwork0QuietTimerActive());
-
-  SetActiveConnections(0);
-  platform_->RunForPeriod(GetNetwork0QuietWindowTimeout() -
-                          TimeDelta::FromMilliseconds(100));
-  EXPECT_TRUE(IsNetwork0QuietTimerActive());
-  EXPECT_FALSE(HadNetwork0Quiet());
-
-  SetActiveConnections(0);  // This should reset the 0-quiet timer.
-  platform_->RunForPeriod(GetNetwork0QuietWindowTimeout() -
-                          TimeDelta::FromMilliseconds(100));
-  EXPECT_TRUE(IsNetwork0QuietTimerActive());
-  EXPECT_FALSE(HadNetwork0Quiet());
-
-  platform_->RunForPeriod(TimeDelta::FromMicroseconds(100100));
-  EXPECT_TRUE(HadNetwork0Quiet());
-}
-
-TEST_F(FirstMeaningfulPaintDetectorTest, Network2QuietTimer) {
-  MarkFirstContentfulPaintAndClearSwapPromise();
-
-  SetActiveConnections(3);
-  EXPECT_FALSE(IsNetwork2QuietTimerActive());
-
-  SetActiveConnections(2);
-  platform_->RunForPeriod(GetNetwork2QuietWindowTimeout() -
-                          TimeDelta::FromMilliseconds(100));
-  EXPECT_TRUE(IsNetwork2QuietTimerActive());
-  EXPECT_FALSE(HadNetwork2Quiet());
-
-  SetActiveConnections(2);  // This should reset the 2-quiet timer.
-  platform_->RunForPeriod(GetNetwork2QuietWindowTimeout() -
-                          TimeDelta::FromMilliseconds(100));
-  EXPECT_TRUE(IsNetwork2QuietTimerActive());
-  EXPECT_FALSE(HadNetwork2Quiet());
-
-  SetActiveConnections(1);  // This should not reset the 2-quiet timer.
-  platform_->RunForPeriod(TimeDelta::FromMicroseconds(100100));
-  EXPECT_TRUE(HadNetwork2Quiet());
-}
-
 TEST_F(FirstMeaningfulPaintDetectorTest,
        FirstMeaningfulPaintAfterUserInteraction) {
   MarkFirstContentfulPaintAndClearSwapPromise();
diff --git a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
index e3e187e..20a2fab 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_box_fragment_painter.cc
@@ -331,7 +331,7 @@
 bool FragmentRequiresLegacyFallback(const NGPhysicalFragment& fragment) {
   // Fallback to LayoutObject if this is a root of NG block layout.
   // If this box is for this painter, LayoutNGBlockFlow will call back.
-  if (fragment.IsBlockLayoutRoot())
+  if (fragment.IsBlockFormattingContextRoot())
     return true;
 
   // TODO(kojii): Review if this is still needed.
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
index e2e6d2de..29fc84d 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment.cc
@@ -271,12 +271,12 @@
     child->inline_offset_to_container_box_ =
         inline_offset_to_container_box + child_fragment->Offset();
 
-    // Recurse chlidren, except when this is a block layout root.
-    // TODO(kojii): At the block layout root, chlidren maybe for NGPaint,
-    // LayoutNG but not for NGPaint, or legacy. In order to get the maximum
-    // test coverage, split the NGPaintFragment tree at all possible engine
-    // boundaries.
-    if (!child_fragment->IsBlockLayoutRoot()) {
+    // Recurse children, except when this is a block formatting context root.
+    // TODO(kojii): At the block formatting context root, children may be for
+    // NGPaint, LayoutNG but not for NGPaint, or legacy. In order to get the
+    // maximum test coverage, split the NGPaintFragment tree at all possible
+    // engine boundaries.
+    if (!child_fragment->IsBlockFormattingContextRoot()) {
       child->PopulateDescendants(child->inline_offset_to_container_box_,
                                  first_fragment_map, last_fragment_map);
     }
diff --git a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc
index aad88b1..37c1a67 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_paint_fragment_traversal.cc
@@ -56,7 +56,7 @@
   }
   bool IsTraverse(const NGPaintFragment* fragment) {
     return fragment->PhysicalFragment().IsContainer() &&
-           !fragment->PhysicalFragment().IsBlockLayoutRoot();
+           !fragment->PhysicalFragment().IsBlockFormattingContextRoot();
   }
 };
 
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc
index 2603238..687d40b 100644
--- a/third_party/blink/renderer/core/paint/paint_layer.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -3159,13 +3159,36 @@
 
   const ComputedStyle& new_style = GetLayoutObject().StyleRef();
 
+  if (diff.CompositingReasonsChanged()) {
+    SetNeedsCompositingInputsUpdate();
+  } else {
+    // For querying stale GetCompositingState().
+    DisableCompositingQueryAsserts disable;
+
+    // Compositing inputs update is required when the PaintLayer is currently
+    // composited. This is because even style changes as simple as background
+    // color change, or pointer-events state change, can update compositing
+    // state.
+    if (old_style && GetCompositingState() == kPaintsIntoOwnBacking)
+      SetNeedsCompositingInputsUpdate();
+  }
+
+  // A scroller that changes background color might become opaque or not
+  // opaque, which in turn affects whether it can be composited on low-DPI
+  // screens.
+  if (GetScrollableArea() && GetScrollableArea()->ScrollsOverflow() &&
+      diff.HasDifference()) {
+    SetNeedsCompositingInputsUpdate();
+  }
+
+  // HasNonContainedAbsolutePositionDescendant depends on position changes.
+  if (!old_style || old_style->GetPosition() != new_style.GetPosition())
+    MarkAncestorChainForDescendantDependentFlagsUpdate();
+
   UpdateTransform(old_style, new_style);
   UpdateFilters(old_style, new_style);
   UpdateClipPath(old_style, new_style);
 
-  SetNeedsCompositingInputsUpdate();
-  GetLayoutObject().SetNeedsPaintPropertyUpdate();
-
   if (!NeedsRepaint()) {
     if (diff.ZIndexChanged()) {
       // We don't need to invalidate paint of objects when paint order
diff --git a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
index 5090c310..1f249d2 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_scrollable_area_test.cc
@@ -376,7 +376,7 @@
   ASSERT_TRUE(paint_layer);
   EXPECT_FALSE(paint_layer->NeedsCompositedScrolling());
 
-  // Change the background to transparent
+  // Change the background to opaque
   scroller->setAttribute(HTMLNames::styleAttr,
                          "background: white local content-box;");
   GetDocument().View()->UpdateAllLifecyclePhases();
diff --git a/third_party/blink/renderer/core/paint/paint_timing.cc b/third_party/blink/renderer/core/paint/paint_timing.cc
index 95085800..b9963652 100644
--- a/third_party/blink/renderer/core/paint/paint_timing.cc
+++ b/third_party/blink/renderer/core/paint/paint_timing.cc
@@ -157,7 +157,7 @@
 
 PaintTiming::PaintTiming(Document& document)
     : Supplement<Document>(document),
-      fmp_detector_(new FirstMeaningfulPaintDetector(this, document)) {}
+      fmp_detector_(new FirstMeaningfulPaintDetector(this)) {}
 
 LocalFrame* PaintTiming::GetFrame() const {
   return GetSupplementable()->GetFrame();
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer.idl b/third_party/blink/renderer/core/resize_observer/resize_observer.idl
index c27d6a3..ca88e70 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer.idl
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer.idl
@@ -11,8 +11,7 @@
 [
     ActiveScriptWrappable,
     Constructor(ResizeObserverCallback callback),
-    ConstructorCallWith=Document,
-    RuntimeEnabled=ResizeObserver
+    ConstructorCallWith=Document
 ] interface ResizeObserver {
     void observe(Element target);
     void unobserve(Element target);
diff --git a/third_party/blink/renderer/core/resize_observer/resize_observer_entry.idl b/third_party/blink/renderer/core/resize_observer/resize_observer_entry.idl
index 29e5d96e..835d47f 100644
--- a/third_party/blink/renderer/core/resize_observer/resize_observer_entry.idl
+++ b/third_party/blink/renderer/core/resize_observer/resize_observer_entry.idl
@@ -4,9 +4,7 @@
 
 // https://wicg.github.io/ResizeObserver/#resize-observer-entry-interface
 
-[
-    RuntimeEnabled=ResizeObserver
-] interface ResizeObserverEntry {
+interface ResizeObserverEntry {
     readonly attribute Element target;
     readonly attribute DOMRectReadOnly contentRect;
 };
diff --git a/third_party/blink/renderer/core/streams/TransformStream.js b/third_party/blink/renderer/core/streams/TransformStream.js
index fc8f9695..0ea5859 100644
--- a/third_party/blink/renderer/core/streams/TransformStream.js
+++ b/third_party/blink/renderer/core/streams/TransformStream.js
@@ -66,31 +66,33 @@
         useCounted = true;
       }
 
-      // readable and writableType are extension points for future byte streams.
-      const readableType = transformer.readableType;
-      if (readableType !== undefined) {
-        throw new RangeError(streamErrors.invalidType);
-      }
+      const writableSizeFunction = writableStrategy.size;
+      let writableHighWaterMark = writableStrategy.highWaterMark;
 
+      const readableSizeFunction = readableStrategy.size;
+      let readableHighWaterMark = readableStrategy.highWaterMark;
+
+      // readable and writableType are extension points for future byte streams.
       const writableType = transformer.writableType;
       if (writableType !== undefined) {
         throw new RangeError(streamErrors.invalidType);
       }
 
-      const writableSizeFunction = writableStrategy.size;
       const writableSizeAlgorithm =
           MakeSizeAlgorithmFromSizeFunction(writableSizeFunction);
-      let writableHighWaterMark = writableStrategy.highWaterMark;
       if (writableHighWaterMark === undefined) {
         writableHighWaterMark = 1;
       }
       writableHighWaterMark =
           ValidateAndNormalizeHighWaterMark(writableHighWaterMark);
 
-      const readableSizeFunction = readableStrategy.size;
+      const readableType = transformer.readableType;
+      if (readableType !== undefined) {
+        throw new RangeError(streamErrors.invalidType);
+      }
+
       const readableSizeAlgorithm =
           MakeSizeAlgorithmFromSizeFunction(readableSizeFunction);
-      let readableHighWaterMark = readableStrategy.highWaterMark;
       if (readableHighWaterMark === undefined) {
         readableHighWaterMark = 0;
       }
@@ -207,6 +209,8 @@
   }
 
   function TransformStreamErrorWritableAndUnblockWrite(stream, e) {
+    TransformStreamDefaultControllerClearAlgorithms(
+        stream[_transformStreamController]);
     binding.WritableStreamDefaultControllerErrorIfNeeded(
         binding.getWritableStreamController(stream[_writable]), e);
 
@@ -324,6 +328,11 @@
         stream, controller, transformAlgorithm, flushAlgorithm);
   }
 
+  function TransformStreamDefaultControllerClearAlgorithms(controller) {
+    controller[_transformAlgorithm] = undefined;
+    controller[_flushAlgorithm] = undefined;
+  }
+
   function TransformStreamDefaultControllerEnqueue(controller, chunk) {
     const stream = controller[_controlledTransformStream];
     const readableController =
@@ -402,8 +411,9 @@
 
   function TransformStreamDefaultSinkCloseAlgorithm(stream) {
     const readable = stream[_readable];
-
-    const flushPromise = stream[_transformStreamController][_flushAlgorithm]();
+    const controller = stream[_transformStreamController];
+    const flushPromise = controller[_flushAlgorithm]();
+    TransformStreamDefaultControllerClearAlgorithms(controller);
 
     return thenPromise(
         flushPromise,
diff --git a/third_party/blink/renderer/core/streams/WritableStream.js b/third_party/blink/renderer/core/streams/WritableStream.js
index 4b1622a4..3ee1c57 100644
--- a/third_party/blink/renderer/core/streams/WritableStream.js
+++ b/third_party/blink/renderer/core/streams/WritableStream.js
@@ -144,9 +144,9 @@
       }
 
       InitializeWritableStream(this);
-      const type = underlyingSink.type;
       const size = strategy.size;
       let highWaterMark = strategy.highWaterMark;
+      const type = underlyingSink.type;
       if (type !== undefined) {
         throw new RangeError(streamErrors.invalidType);
       }
@@ -822,7 +822,9 @@
   // or impossible, so use static dispatch for now. This will have to be fixed
   // when adding a byte controller.
   function WritableStreamDefaultControllerAbortSteps(controller, reason) {
-    return controller[_abortAlgorithm](reason);
+    const result = controller[_abortAlgorithm](reason);
+    WritableStreamDefaultControllerClearAlgorithms(controller);
+    return result;
   }
 
   function WritableStreamDefaultControllerErrorSteps(controller) {
@@ -897,6 +899,12 @@
         sizeAlgorithm);
   }
 
+  function WritableStreamDefaultControllerClearAlgorithms(controller) {
+    controller[_writeAlgorithm] = undefined;
+    controller[_closeAlgorithm] = undefined;
+    controller[_abortAlgorithm] = undefined;
+  }
+
   function WritableStreamDefaultControllerClose(controller) {
     EnqueueValueWithSize(controller, 'close', 0);
     WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
@@ -979,6 +987,7 @@
     // assert(controller[_queue].length === 0,
     //        'controller.[[queue]] is empty.');
     const sinkClosePromise = controller[_closeAlgorithm]();
+    WritableStreamDefaultControllerClearAlgorithms(controller);
     thenPromise(
         sinkClosePromise, () => WritableStreamFinishInFlightClose(stream),
         reason => WritableStreamFinishInFlightCloseWithError(stream, reason));
@@ -1005,6 +1014,10 @@
           WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller);
         },
         reason => {
+          const state = stream[_stateAndFlags] & STATE_MASK;
+          if (state === WRITABLE) {
+            WritableStreamDefaultControllerClearAlgorithms(controller);
+          }
           WritableStreamFinishInFlightWriteWithError(stream, reason);
         });
   }
@@ -1019,6 +1032,7 @@
     const stream = controller[_controlledWritableStream];
     // assert((stream[_stateAndFlags] & STATE_MASK) === WRITABLE,
     //        '_stream_.[[state]] is `"writable"`.');
+    WritableStreamDefaultControllerClearAlgorithms(controller);
     WritableStreamStartErroring(stream, error);
   }
 
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 2847c7d..688d8ba 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -1479,10 +1479,10 @@
   }
 
   bool BorderSizeEquals(const ComputedStyle& o) const {
-    return BorderLeftWidthInternal() == o.BorderLeftWidthInternal() &&
-           BorderTopWidthInternal() == o.BorderTopWidthInternal() &&
-           BorderRightWidthInternal() == o.BorderRightWidthInternal() &&
-           BorderBottomWidthInternal() == o.BorderBottomWidthInternal();
+    return BorderLeftWidth() == o.BorderLeftWidth() &&
+           BorderTopWidth() == o.BorderTopWidth() &&
+           BorderRightWidth() == o.BorderRightWidth() &&
+           BorderBottomWidth() == o.BorderBottomWidth();
   }
 
   BorderValue BorderBeforeUsing(const ComputedStyle& other) const {
diff --git a/third_party/blink/renderer/core/style/computed_style_test.cc b/third_party/blink/renderer/core/style/computed_style_test.cc
index db7bb16..55d364d3 100644
--- a/third_party/blink/renderer/core/style/computed_style_test.cc
+++ b/third_party/blink/renderer/core/style/computed_style_test.cc
@@ -286,4 +286,69 @@
   EXPECT_EQ(*style, *other);
 }
 
+TEST(ComputedStyleTest, BorderStyle) {
+  scoped_refptr<ComputedStyle> style = ComputedStyle::Create();
+  scoped_refptr<ComputedStyle> other = ComputedStyle::Create();
+  style->SetBorderLeftStyle(EBorderStyle::kSolid);
+  style->SetBorderTopStyle(EBorderStyle::kSolid);
+  style->SetBorderRightStyle(EBorderStyle::kSolid);
+  style->SetBorderBottomStyle(EBorderStyle::kSolid);
+  other->SetBorderLeftStyle(EBorderStyle::kSolid);
+  other->SetBorderTopStyle(EBorderStyle::kSolid);
+  other->SetBorderRightStyle(EBorderStyle::kSolid);
+  other->SetBorderBottomStyle(EBorderStyle::kSolid);
+
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+  style->SetBorderLeftWidth(1.0);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  other->SetBorderLeftWidth(1.0);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+  style->SetBorderTopWidth(1.0);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  other->SetBorderTopWidth(1.0);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+  style->SetBorderRightWidth(1.0);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  other->SetBorderRightWidth(1.0);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+  style->SetBorderBottomWidth(1.0);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  other->SetBorderBottomWidth(1.0);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  style->SetBorderLeftStyle(EBorderStyle::kHidden);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderLeftStyle(EBorderStyle::kNone);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderLeftStyle(EBorderStyle::kSolid);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  style->SetBorderTopStyle(EBorderStyle::kHidden);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderTopStyle(EBorderStyle::kNone);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderTopStyle(EBorderStyle::kSolid);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  style->SetBorderRightStyle(EBorderStyle::kHidden);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderRightStyle(EBorderStyle::kNone);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderRightStyle(EBorderStyle::kSolid);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+
+  style->SetBorderBottomStyle(EBorderStyle::kHidden);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderBottomStyle(EBorderStyle::kNone);
+  EXPECT_FALSE(style->BorderSizeEquals(*other));
+  style->SetBorderBottomStyle(EBorderStyle::kSolid);
+  EXPECT_TRUE(style->BorderSizeEquals(*other));
+}
+
 }  // namespace blink
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 472b2eb..cdc28cd 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
@@ -1253,9 +1253,9 @@
   if (event_type == "repeatn") {
     unsigned repeat_event_count = repeat_event_count_list_.front();
     repeat_event_count_list_.EraseAt(0);
-    DispatchEvent(RepeatEvent::Create(event_type, repeat_event_count));
+    DispatchEvent(*RepeatEvent::Create(event_type, repeat_event_count));
   } else {
-    DispatchEvent(Event::Create(event_type));
+    DispatchEvent(*Event::Create(event_type));
   }
 }
 
diff --git a/third_party/blink/renderer/core/svg/svg_element.cc b/third_party/blink/renderer/core/svg/svg_element.cc
index e9a1fd9..cab34a8 100644
--- a/third_party/blink/renderer/core/svg/svg_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_element.cc
@@ -312,17 +312,6 @@
 static FloatRect ComputeTransformReferenceBox(const SVGElement& element) {
   const LayoutObject& layout_object = *element.GetLayoutObject();
   const ComputedStyle& style = layout_object.StyleRef();
-  if (!RuntimeEnabledFeatures::CSSTransformBoxEnabled()) {
-    FloatRect reference_box = layout_object.ObjectBoundingBox();
-    // Set the reference origin to zero when transform-origin (x/y) has a
-    // non-percentage unit.
-    const TransformOrigin& transform_origin = style.GetTransformOrigin();
-    if (transform_origin.X().GetType() != kPercent)
-      reference_box.SetX(0);
-    if (transform_origin.Y().GetType() != kPercent)
-      reference_box.SetY(0);
-    return reference_box;
-  }
   if (style.TransformBox() == ETransformBox::kFillBox)
     return layout_object.ObjectBoundingBox();
   DCHECK_EQ(style.TransformBox(), ETransformBox::kViewBox);
@@ -918,7 +907,7 @@
     return false;
   if ((IsStructurallyExternal() || IsSVGSVGElement(*this)) &&
       HasLoadListener(this))
-    DispatchEvent(Event::Create(EventTypeNames::load));
+    DispatchEvent(*Event::Create(EventTypeNames::load));
   return true;
 }
 
diff --git a/third_party/blink/renderer/core/svg/svg_image_loader.cc b/third_party/blink/renderer/core/svg/svg_image_loader.cc
index f4e6d92..a7ce9fe9 100644
--- a/third_party/blink/renderer/core/svg/svg_image_loader.cc
+++ b/third_party/blink/renderer/core/svg/svg_image_loader.cc
@@ -29,7 +29,7 @@
 
 void SVGImageLoader::DispatchLoadEvent() {
   if (GetContent()->ErrorOccurred()) {
-    GetElement()->DispatchEvent(Event::Create(EventTypeNames::error));
+    GetElement()->DispatchEvent(*Event::Create(EventTypeNames::error));
   } else {
     SVGImageElement* image_element = ToSVGImageElement(GetElement());
     image_element->SendSVGLoadEventToSelfAndAncestorChainIfPossible();
diff --git a/third_party/blink/renderer/core/svg/svg_script_element.cc b/third_party/blink/renderer/core/svg/svg_script_element.cc
index 12bee5b..ddcc037 100644
--- a/third_party/blink/renderer/core/svg/svg_script_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_script_element.cc
@@ -155,12 +155,12 @@
 }
 
 void SVGScriptElement::DispatchLoadEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::load));
+  DispatchEvent(*Event::Create(EventTypeNames::load));
   have_fired_load_ = true;
 }
 
 void SVGScriptElement::DispatchErrorEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 void SVGScriptElement::SetScriptElementForBinding(
diff --git a/third_party/blink/renderer/core/svg/svg_style_element.cc b/third_party/blink/renderer/core/svg/svg_style_element.cc
index df0dd356..91137d5 100644
--- a/third_party/blink/renderer/core/svg/svg_style_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_style_element.cc
@@ -139,7 +139,7 @@
 }
 
 void SVGStyleElement::DispatchPendingEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 void SVGStyleElement::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/svg/svg_use_element.cc b/third_party/blink/renderer/core/svg/svg_use_element.cc
index 3f07e9b8..0c711130 100644
--- a/third_party/blink/renderer/core/svg/svg_use_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_use_element.cc
@@ -700,7 +700,7 @@
 void SVGUseElement::DispatchPendingEvent() {
   DCHECK(IsStructurallyExternal());
   DCHECK(have_fired_load_event_);
-  DispatchEvent(Event::Create(EventTypeNames::load));
+  DispatchEvent(*Event::Create(EventTypeNames::load));
 }
 
 void SVGUseElement::NotifyFinished(Resource* resource) {
@@ -710,7 +710,7 @@
 
   InvalidateShadowTree();
   if (!ResourceIsValid()) {
-    DispatchEvent(Event::Create(EventTypeNames::error));
+    DispatchEvent(*Event::Create(EventTypeNames::error));
   } else if (!resource->WasCanceled()) {
     if (have_fired_load_event_)
       return;
diff --git a/third_party/blink/renderer/core/testing/internals.cc b/third_party/blink/renderer/core/testing/internals.cc
index abe9fa1..cac8c17 100644
--- a/third_party/blink/renderer/core/testing/internals.cc
+++ b/third_party/blink/renderer/core/testing/internals.cc
@@ -1318,15 +1318,16 @@
   }
 
   if (auto* input = ToHTMLInputElementOrNull(*element)) {
-    input->DispatchScopedEvent(Event::CreateBubble(EventTypeNames::keydown));
+    input->DispatchScopedEvent(*Event::CreateBubble(EventTypeNames::keydown));
     input->SetAutofillValue(value);
-    input->DispatchScopedEvent(Event::CreateBubble(EventTypeNames::keyup));
+    input->DispatchScopedEvent(*Event::CreateBubble(EventTypeNames::keyup));
   }
 
   if (auto* textarea = ToHTMLTextAreaElementOrNull(*element)) {
-    textarea->DispatchScopedEvent(Event::CreateBubble(EventTypeNames::keydown));
+    textarea->DispatchScopedEvent(
+        *Event::CreateBubble(EventTypeNames::keydown));
     textarea->SetAutofillValue(value);
-    textarea->DispatchScopedEvent(Event::CreateBubble(EventTypeNames::keyup));
+    textarea->DispatchScopedEvent(*Event::CreateBubble(EventTypeNames::keyup));
   }
 
   if (auto* select = ToHTMLSelectElementOrNull(*element))
diff --git a/third_party/blink/renderer/core/testing/null_execution_context.h b/third_party/blink/renderer/core/testing/null_execution_context.h
index d642abe..c73cf99 100644
--- a/third_party/blink/renderer/core/testing/null_execution_context.h
+++ b/third_party/blink/renderer/core/testing/null_execution_context.h
@@ -42,6 +42,9 @@
   void DidUpdateSecurityOrigin() override {}
   SecurityContext& GetSecurityContext() override { return *this; }
   DOMTimerCoordinator* Timers() override { return nullptr; }
+  const base::UnguessableToken& GetAgentClusterID() const final {
+    return base::UnguessableToken::Null();
+  }
 
   void AddConsoleMessage(ConsoleMessage*) override {}
   void ExceptionThrown(ErrorEvent*) override {}
diff --git a/third_party/blink/renderer/core/testing/page_test_base.cc b/third_party/blink/renderer/core/testing/page_test_base.cc
index d3c91c86..d4d083f 100644
--- a/third_party/blink/renderer/core/testing/page_test_base.cc
+++ b/third_party/blink/renderer/core/testing/page_test_base.cc
@@ -137,4 +137,10 @@
   return GetDocument().GetPage()->GetFocusController();
 }
 
+void PageTestBase::EnablePlatform() {
+  DCHECK(!platform_);
+  platform_ = std::make_unique<
+      ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>>();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/testing/page_test_base.h b/third_party/blink/renderer/core/testing/page_test_base.h
index c09bef01..0b1eb9c1 100644
--- a/third_party/blink/renderer/core/testing/page_test_base.h
+++ b/third_party/blink/renderer/core/testing/page_test_base.h
@@ -7,6 +7,7 @@
 
 #include <gtest/gtest.h>
 #include "third_party/blink/renderer/core/testing/dummy_page_holder.h"
+#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
 
 namespace blink {
 
@@ -53,8 +54,19 @@
 
  protected:
   void LoadAhem();
+  void EnablePlatform();
+
+  ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>&
+  platform() {
+    return *platform_;
+  }
 
  private:
+  // The order is important: |platform_| must be destroyed after
+  // |dummy_page_holder_| is destroyed.
+  std::unique_ptr<
+      ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>>
+      platform_;
   std::unique_ptr<DummyPageHolder> dummy_page_holder_;
 };
 
diff --git a/third_party/blink/renderer/core/timing/performance.cc b/third_party/blink/renderer/core/timing/performance.cc
index 44bda18..8c15e40 100644
--- a/third_party/blink/renderer/core/timing/performance.cc
+++ b/third_party/blink/renderer/core/timing/performance.cc
@@ -309,7 +309,7 @@
 void Performance::setResourceTimingBufferSize(unsigned size) {
   resource_timing_buffer_size_ = size;
   if (IsResourceTimingBufferFull())
-    DispatchEvent(Event::Create(EventTypeNames::resourcetimingbufferfull));
+    DispatchEvent(*Event::Create(EventTypeNames::resourcetimingbufferfull));
 }
 
 bool Performance::PassesTimingAllowCheck(
@@ -490,7 +490,7 @@
   event_timing_buffer_.push_back(&entry);
 
   if (IsEventTimingBufferFull())
-    DispatchEvent(Event::Create(EventTypeNames::eventtimingbufferfull));
+    DispatchEvent(*Event::Create(EventTypeNames::eventtimingbufferfull));
 }
 
 unsigned Performance::EventTimingBufferSize() const {
@@ -504,7 +504,7 @@
 void Performance::setEventTimingBufferMaxSize(unsigned size) {
   event_timing_buffer_max_size_ = size;
   if (IsEventTimingBufferFull())
-    DispatchEvent(Event::Create(EventTypeNames::eventtimingbufferfull));
+    DispatchEvent(*Event::Create(EventTypeNames::eventtimingbufferfull));
 }
 
 void Performance::AddFirstPaintTiming(TimeTicks start_time) {
@@ -535,7 +535,7 @@
   resource_timing_buffer_.push_back(&entry);
 
   if (IsResourceTimingBufferFull())
-    DispatchEvent(Event::Create(EventTypeNames::resourcetimingbufferfull));
+    DispatchEvent(*Event::Create(EventTypeNames::resourcetimingbufferfull));
 }
 
 bool Performance::IsResourceTimingBufferFull() {
diff --git a/third_party/blink/renderer/core/timing/performance_resource_timing.idl b/third_party/blink/renderer/core/timing/performance_resource_timing.idl
index 59386eb4..068e2415 100644
--- a/third_party/blink/renderer/core/timing/performance_resource_timing.idl
+++ b/third_party/blink/renderer/core/timing/performance_resource_timing.idl
@@ -49,6 +49,6 @@
     [MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long transferSize;
     [MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long encodedBodySize;
     [MeasureAs=PerformanceResourceTimingSizes] readonly attribute unsigned long long decodedBodySize;
-    [RuntimeEnabled=ServerTiming] readonly attribute FrozenArray<PerformanceServerTiming> serverTiming;
+    readonly attribute FrozenArray<PerformanceServerTiming> serverTiming;
     serializer = {inherit, attribute};
 };
diff --git a/third_party/blink/renderer/core/timing/performance_server_timing.cc b/third_party/blink/renderer/core/timing/performance_server_timing.cc
index a375765f..9bc079fc 100644
--- a/third_party/blink/renderer/core/timing/performance_server_timing.cc
+++ b/third_party/blink/renderer/core/timing/performance_server_timing.cc
@@ -29,15 +29,13 @@
 WebVector<WebServerTimingInfo> PerformanceServerTiming::ParseServerTiming(
     const ResourceTimingInfo& info) {
   WebVector<WebServerTimingInfo> result;
-  if (RuntimeEnabledFeatures::ServerTimingEnabled()) {
-    const ResourceResponse& response = info.FinalResponse();
-    std::unique_ptr<ServerTimingHeaderVector> headers = ParseServerTimingHeader(
-        response.HttpHeaderField(HTTPNames::Server_Timing));
-    result.reserve(headers->size());
-    for (const auto& header : *headers) {
-      result.emplace_back(header->Name(), header->Duration(),
-                          header->Description());
-    }
+  const ResourceResponse& response = info.FinalResponse();
+  std::unique_ptr<ServerTimingHeaderVector> headers = ParseServerTimingHeader(
+      response.HttpHeaderField(HTTPNames::Server_Timing));
+  result.reserve(headers->size());
+  for (const auto& header : *headers) {
+    result.emplace_back(header->Name(), header->Duration(),
+                        header->Description());
   }
   return result;
 }
diff --git a/third_party/blink/renderer/core/timing/performance_server_timing.idl b/third_party/blink/renderer/core/timing/performance_server_timing.idl
index f96527f6..b5b3460 100644
--- a/third_party/blink/renderer/core/timing/performance_server_timing.idl
+++ b/third_party/blink/renderer/core/timing/performance_server_timing.idl
@@ -5,7 +5,6 @@
 // https://w3c.github.io/server-timing/#dom-performanceservertiming
 
 [
-    RuntimeEnabled=ServerTiming,
     Exposed=(Window,Worker)
 ] interface PerformanceServerTiming {
     readonly attribute DOMString name;
diff --git a/third_party/blink/renderer/core/timing/window_performance_test.cc b/third_party/blink/renderer/core/timing/window_performance_test.cc
index 6e014a0b..a1b0e26 100644
--- a/third_party/blink/renderer/core/timing/window_performance_test.cc
+++ b/third_party/blink/renderer/core/timing/window_performance_test.cc
@@ -144,7 +144,8 @@
   EXPECT_TRUE(ObservingLongTasks());
 
   // Simulate navigation commit.
-  DocumentInit init = DocumentInit::Create().WithFrame(GetFrame());
+  DocumentInit init = DocumentInit::Create().WithDocumentLoader(
+      GetFrame()->Loader().GetDocumentLoader());
   GetDocument()->Shutdown();
   GetFrame()->SetDOMWindow(LocalDOMWindow::Create(*GetFrame()));
   GetFrame()->DomWindow()->InstallNewDocument(AtomicString(), init, false);
@@ -178,7 +179,7 @@
   page_holder->GetDocument().Shutdown();
   page_holder->GetFrame().DomWindow()->InstallNewDocument(
       AtomicString(),
-      DocumentInit::Create().WithFrame(&page_holder->GetFrame()), false);
+      DocumentInit::Create().WithDocumentLoader(document_loader), false);
 
   EXPECT_EQ(perf, DOMWindowPerformance::performance(
                       *page_holder->GetFrame().DomWindow()));
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker.cc b/third_party/blink/renderer/core/workers/dedicated_worker.cc
index 7ad31e5..ed773e19 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker.cc
@@ -254,7 +254,7 @@
   if (classic_script_loader_->Canceled()) {
     // Do nothing.
   } else if (classic_script_loader_->Failed()) {
-    DispatchEvent(Event::CreateCancelable(EventTypeNames::error));
+    DispatchEvent(*Event::CreateCancelable(EventTypeNames::error));
   } else {
     ReferrerPolicy referrer_policy = kReferrerPolicyDefault;
     if (!classic_script_loader_->GetReferrerPolicy().IsNull()) {
@@ -313,7 +313,8 @@
       ConnectToWorkerInterfaceProvider(GetExecutionContext(),
                                        SecurityOrigin::Create(script_url)),
       CreateBeginFrameProviderParams(),
-      GetExecutionContext()->GetSecurityContext().GetFeaturePolicy());
+      GetExecutionContext()->GetSecurityContext().GetFeaturePolicy(),
+      GetExecutionContext()->GetAgentClusterID());
 }
 
 const AtomicString& DedicatedWorker::InterfaceName() const {
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc
index 769fca7..12221bb 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_messaging_proxy.cc
@@ -143,7 +143,7 @@
       MessagePort::EntanglePorts(*GetExecutionContext(), std::move(channels));
   debugger->ExternalAsyncTaskStarted(stack_id);
   worker_object_->DispatchEvent(
-      MessageEvent::Create(ports, std::move(message)));
+      *MessageEvent::Create(ports, std::move(message)));
   debugger->ExternalAsyncTaskFinished(stack_id);
 }
 
@@ -165,7 +165,8 @@
   // https://html.spec.whatwg.org/multipage/workers.html#runtime-script-errors-2
   ErrorEvent* event =
       ErrorEvent::Create(error_message, location->Clone(), nullptr);
-  if (worker_object_->DispatchEvent(event) != DispatchEventResult::kNotCanceled)
+  if (worker_object_->DispatchEvent(*event) !=
+      DispatchEventResult::kNotCanceled)
     return;
 
   // The worker thread can already be terminated.
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_object_proxy.cc b/third_party/blink/renderer/core/workers/dedicated_worker_object_proxy.cc
index ec1d5b186f..2355f9d 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_object_proxy.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_object_proxy.cc
@@ -87,7 +87,7 @@
 
   ThreadDebugger* debugger = ThreadDebugger::From(worker_thread->GetIsolate());
   debugger->ExternalAsyncTaskStarted(stack_id);
-  global_scope->DispatchEvent(MessageEvent::Create(ports, std::move(message)));
+  global_scope->DispatchEvent(*MessageEvent::Create(ports, std::move(message)));
   debugger->ExternalAsyncTaskFinished(stack_id);
 }
 
diff --git a/third_party/blink/renderer/core/workers/global_scope_creation_params.cc b/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
index e95d125e..65e23bb 100644
--- a/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
+++ b/third_party/blink/renderer/core/workers/global_scope_creation_params.cc
@@ -27,7 +27,8 @@
     service_manager::mojom::blink::InterfaceProviderPtrInfo
         interface_provider_info,
     BeginFrameProviderParams begin_frame_provider_params,
-    const FeaturePolicy* parent_feature_policy)
+    const FeaturePolicy* parent_feature_policy,
+    base::UnguessableToken agent_cluster_id)
     : script_url(script_url.Copy()),
       script_type(script_type),
       user_agent(user_agent.IsolatedCopy()),
@@ -47,7 +48,8 @@
       worker_feature_policy(FeaturePolicy::CreateFromParentPolicy(
           parent_feature_policy,
           ParsedFeaturePolicy() /* container_policy */,
-          starter_origin->ToUrlOrigin())) {
+          starter_origin->ToUrlOrigin())),
+      agent_cluster_id(agent_cluster_id) {
   this->content_security_policy_parsed_headers.ReserveInitialCapacity(
       content_security_policy_parsed_headers.size());
   for (const auto& header : content_security_policy_parsed_headers) {
diff --git a/third_party/blink/renderer/core/workers/global_scope_creation_params.h b/third_party/blink/renderer/core/workers/global_scope_creation_params.h
index a5c263e..99560b66 100644
--- a/third_party/blink/renderer/core/workers/global_scope_creation_params.h
+++ b/third_party/blink/renderer/core/workers/global_scope_creation_params.h
@@ -53,7 +53,8 @@
       WorkletModuleResponsesMap*,
       service_manager::mojom::blink::InterfaceProviderPtrInfo = {},
       BeginFrameProviderParams begin_frame_provider_params = {},
-      const FeaturePolicy* parent_feature_policy = nullptr);
+      const FeaturePolicy* parent_feature_policy = nullptr,
+      base::UnguessableToken agent_cluster_id = {});
 
   ~GlobalScopeCreationParams() = default;
 
@@ -135,6 +136,11 @@
 
   std::unique_ptr<FeaturePolicy> worker_feature_policy;
 
+  // Set when the worker/worklet has the same AgentClusterID as the execution
+  // context that created it (e.g. for a dedicated worker).
+  // See https://tc39.github.io/ecma262/#sec-agent-clusters
+  base::UnguessableToken agent_cluster_id;
+
   DISALLOW_COPY_AND_ASSIGN(GlobalScopeCreationParams);
 };
 
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc
index a3afa17..2faf1e9 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -344,7 +344,10 @@
       font_selector_(OffscreenFontSelector::Create(this)),
       animation_frame_provider_(WorkerAnimationFrameProvider::Create(
           this,
-          creation_params->begin_frame_provider_params)) {
+          creation_params->begin_frame_provider_params)),
+      agent_cluster_id_(creation_params->agent_cluster_id.is_empty()
+                            ? base::UnguessableToken::Create()
+                            : creation_params->agent_cluster_id) {
   InstanceCounters::IncrementCounter(
       InstanceCounters::kWorkerGlobalScopeCounter);
   scoped_refptr<SecurityOrigin> security_origin = SecurityOrigin::Create(url_);
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h
index 492cb63..68ef015e 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -112,6 +112,9 @@
   bool IsContextThread() const final;
   const KURL& BaseURL() const final { return url_; }
   String UserAgent() const final { return user_agent_; }
+  const base::UnguessableToken& GetAgentClusterID() const final {
+    return agent_cluster_id_;
+  }
 
   DOMTimerCoordinator* Timers() final { return &timers_; }
   SecurityContext& GetSecurityContext() final { return *this; }
@@ -226,6 +229,8 @@
   Member<WorkerAnimationFrameProvider> animation_frame_provider_;
 
   service_manager::InterfaceProvider interface_provider_;
+
+  const base::UnguessableToken agent_cluster_id_;
 };
 
 DEFINE_TYPE_CASTS(WorkerGlobalScope,
diff --git a/third_party/blink/renderer/core/workers/worklet_global_scope.h b/third_party/blink/renderer/core/workers/worklet_global_scope.h
index c19ef39..80935f0 100644
--- a/third_party/blink/renderer/core/workers/worklet_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worklet_global_scope.h
@@ -51,6 +51,12 @@
   SecurityContext& GetSecurityContext() final { return *this; }
   bool IsSecureContext(String& error_message) const final;
 
+  // Currently, worklet agents have no clearly defined owner. See
+  // https://html.spec.whatwg.org/multipage/webappapis.html#integration-with-the-javascript-agent-cluster-formalism
+  const base::UnguessableToken& GetAgentClusterID() const final {
+    return base::UnguessableToken::Null();
+  }
+
   DOMTimerCoordinator* Timers() final {
     // WorkletGlobalScopes don't have timers.
     NOTREACHED();
diff --git a/third_party/blink/renderer/core/xml/xslt_processor.cc b/third_party/blink/renderer/core/xml/xslt_processor.cc
index b59f7fc..c421ca11 100644
--- a/third_party/blink/renderer/core/xml/xslt_processor.cc
+++ b/third_party/blink/renderer/core/xml/xslt_processor.cc
@@ -70,7 +70,11 @@
   if (owner_document == source_node)
     url = owner_document->Url();
 
-  DocumentInit init = DocumentInit::Create().WithFrame(frame).WithURL(url);
+  DocumentInit init =
+      DocumentInit::Create()
+          .WithDocumentLoader(frame ? frame->Loader().GetDocumentLoader()
+                                    : nullptr)
+          .WithURL(url);
 
   String document_source = source_string;
   bool force_xhtml = source_mime_type == "text/plain";
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
index 67b5f31..8602411 100644
--- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
+++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -1028,7 +1028,7 @@
     if (http_body && upload_) {
       upload_events = upload_->HasEventListeners();
       upload_->DispatchEvent(
-          ProgressEvent::Create(EventTypeNames::loadstart, false, 0, 0));
+          *ProgressEvent::Create(EventTypeNames::loadstart, false, 0, 0));
       // See above.
       if (!send_flag_ || loader_)
         return;
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc
index c4ccc751..d7cc325 100644
--- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc
+++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_progress_event_throttle.cc
@@ -96,7 +96,7 @@
   // we don't have to worry about event dispatching while suspended.
   if (type != EventTypeNames::progress) {
     target_->DispatchEvent(
-        ProgressEvent::Create(type, length_computable, loaded, total));
+        *ProgressEvent::Create(type, length_computable, loaded, total));
     return;
   }
 
@@ -133,7 +133,7 @@
     // readystatechange should have been already dispatched if necessary.
     probe::AsyncTask async_task(target_->GetExecutionContext(), target_,
                                 "progress", target_->IsAsync());
-    target_->DispatchEvent(event);
+    target_->DispatchEvent(*event);
   }
 }
 
@@ -147,7 +147,7 @@
                      target_->GetExecutionContext(), target_));
     probe::AsyncTask async_task(target_->GetExecutionContext(), target_,
                                 "progress", target_->IsAsync());
-    target_->DispatchEvent(Event::Create(EventTypeNames::readystatechange));
+    target_->DispatchEvent(*Event::Create(EventTypeNames::readystatechange));
   }
 
   if (target_->readyState() != state)
@@ -156,7 +156,7 @@
   has_dispatched_progress_progress_event_ = true;
   probe::AsyncTask async_task(target_->GetExecutionContext(), target_,
                               "progress", target_->IsAsync());
-  target_->DispatchEvent(progress_event);
+  target_->DispatchEvent(*progress_event);
 }
 
 void XMLHttpRequestProgressEventThrottle::Fired() {
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_upload.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_upload.cc
index bded997..7eef081 100644
--- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_upload.cc
+++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request_upload.cc
@@ -53,8 +53,8 @@
   last_total_bytes_to_be_sent_ = total_bytes_to_be_sent;
   probe::AsyncTask async_task(GetExecutionContext(), xml_http_request_,
                               "progress", xml_http_request_->IsAsync());
-  DispatchEvent(ProgressEvent::Create(EventTypeNames::progress, true,
-                                      bytes_sent, total_bytes_to_be_sent));
+  DispatchEvent(*ProgressEvent::Create(EventTypeNames::progress, true,
+                                       bytes_sent, total_bytes_to_be_sent));
 }
 
 void XMLHttpRequestUpload::DispatchEventAndLoadEnd(
@@ -67,9 +67,9 @@
   probe::AsyncTask async_task(GetExecutionContext(), xml_http_request_, "event",
                               xml_http_request_->IsAsync());
   DispatchEvent(
-      ProgressEvent::Create(type, length_computable, bytes_sent, total));
-  DispatchEvent(ProgressEvent::Create(EventTypeNames::loadend,
-                                      length_computable, bytes_sent, total));
+      *ProgressEvent::Create(type, length_computable, bytes_sent, total));
+  DispatchEvent(*ProgressEvent::Create(EventTypeNames::loadend,
+                                       length_computable, bytes_sent, total));
 }
 
 void XMLHttpRequestUpload::HandleRequestError(const AtomicString& type) {
@@ -77,9 +77,9 @@
                            last_bytes_sent_ <= last_total_bytes_to_be_sent_;
   probe::AsyncTask async_task(GetExecutionContext(), xml_http_request_, "error",
                               xml_http_request_->IsAsync());
-  DispatchEvent(ProgressEvent::Create(EventTypeNames::progress,
-                                      length_computable, last_bytes_sent_,
-                                      last_total_bytes_to_be_sent_));
+  DispatchEvent(*ProgressEvent::Create(EventTypeNames::progress,
+                                       length_computable, last_bytes_sent_,
+                                       last_total_bytes_to_be_sent_));
   DispatchEventAndLoadEnd(type, length_computable, last_bytes_sent_,
                           last_total_bytes_to_be_sent_);
 }
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js b/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js
index f8f4fac..07c43e4 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/BlackboxManager.js
@@ -13,17 +13,13 @@
     this._debuggerWorkspaceBinding = debuggerWorkspaceBinding;
 
     SDK.targetManager.addModelListener(
-        SDK.DebuggerModel, SDK.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);
-    SDK.targetManager.addModelListener(
-        SDK.DebuggerModel, SDK.DebuggerModel.Events.GlobalObjectCleared, this._globalObjectCleared, this);
+        SDK.DebuggerModel, SDK.DebuggerModel.Events.GlobalObjectCleared, this._clearCacheIfNeeded.bind(this), this);
     Common.moduleSetting('skipStackFramesPattern').addChangeListener(this._patternChanged.bind(this));
     Common.moduleSetting('skipContentScripts').addChangeListener(this._patternChanged.bind(this));
 
     /** @type {!Set<function()>} */
     this._listeners = new Set();
 
-    /** @type {!Map<!SDK.DebuggerModel, !Map<string, !Array<!Protocol.Debugger.ScriptPosition>>>} */
-    this._debuggerModelData = new Map();
     /** @type {!Map<string, boolean>} */
     this._isBlackboxedURLCache = new Map();
 
@@ -57,8 +53,12 @@
    * @param {!SDK.DebuggerModel} debuggerModel
    */
   modelRemoved(debuggerModel) {
-    this._debuggerModelData.delete(debuggerModel);
-    this._isBlackboxedURLCache.clear();
+    this._clearCacheIfNeeded();
+  }
+
+  _clearCacheIfNeeded() {
+    if (this._isBlackboxedURLCache.size > 1024)
+      this._isBlackboxedURLCache.clear();
   }
 
   /**
@@ -83,10 +83,10 @@
     const script = location.script();
     if (!script)
       return false;
-    const positions = this._scriptPositions(script);
-    if (!positions)
-      return this._isBlackboxedScript(script);
-    const index = positions.lowerBound(location, comparator);
+    const ranges = script[Bindings.BlackboxManager._blackboxedRanges];
+    if (!ranges)
+      return this.isBlackboxedURL(script.sourceURL, script.isContentScript());
+    const index = ranges.lowerBound(location, comparator);
     return !!(index % 2);
 
     /**
@@ -125,7 +125,7 @@
     if (isContentScript && Common.moduleSetting('skipContentScripts').get())
       return true;
     const regex = Common.moduleSetting('skipStackFramesPattern').asRegExp();
-    const isBlackboxed = regex && regex.test(url);
+    const isBlackboxed = (regex && regex.test(url)) || false;
     this._isBlackboxedURLCache.set(url, isBlackboxed);
     return isBlackboxed;
   }
@@ -135,47 +135,45 @@
    * @param {?SDK.SourceMap} sourceMap
    * @return {!Promise<undefined>}
    */
-  sourceMapLoaded(script, sourceMap) {
-    if (!sourceMap)
-      return Promise.resolve();
-    const previousScriptState = this._scriptPositions(script);
-    if (!previousScriptState)
-      return Promise.resolve();
-
-    const hasBlackboxedMappings = sourceMap.sourceURLs().some(url => this.isBlackboxedURL(url));
-    const mappings = hasBlackboxedMappings ? sourceMap.mappings().slice() : [];
-    if (!mappings.length) {
-      if (previousScriptState.length > 0)
-        return this._setScriptState(script, []);
-      return Promise.resolve();
+  async sourceMapLoaded(script, sourceMap) {
+    const hasBlackboxedMappings = sourceMap ? sourceMap.sourceURLs().some(url => this.isBlackboxedURL(url)) : false;
+    if (!hasBlackboxedMappings) {
+      if (script[Bindings.BlackboxManager._blackboxedRanges] && await script.setBlackboxedRanges([]))
+        delete script[Bindings.BlackboxManager._blackboxedRanges];
+      return;
     }
-    mappings.sort(mappingComparator);
 
+    const mappings = sourceMap.mappings();
+    const newRanges = [];
     let currentBlackboxed = false;
-    let isBlackboxed = false;
-    const positions = [];
-    // If content in script file begin is not mapped and one or more ranges are blackboxed then blackbox it.
     if (mappings[0].lineNumber !== 0 || mappings[0].columnNumber !== 0) {
-      positions.push({lineNumber: 0, columnNumber: 0});
+      newRanges.push({lineNumber: 0, columnNumber: 0});
       currentBlackboxed = true;
     }
     for (const mapping of mappings) {
       if (mapping.sourceURL && currentBlackboxed !== this.isBlackboxedURL(mapping.sourceURL)) {
-        positions.push({lineNumber: mapping.lineNumber, columnNumber: mapping.columnNumber});
+        newRanges.push({lineNumber: mapping.lineNumber, columnNumber: mapping.columnNumber});
         currentBlackboxed = !currentBlackboxed;
       }
-      isBlackboxed = currentBlackboxed || isBlackboxed;
     }
-    return this._setScriptState(script, !isBlackboxed ? [] : positions);
+
+    const oldRanges = script[Bindings.BlackboxManager._blackboxedRanges] || [];
+    if (!isEqual(oldRanges, newRanges) && await script.setBlackboxedRanges(newRanges))
+      script[Bindings.BlackboxManager._blackboxedRanges] = newRanges;
+
     /**
-     * @param {!SDK.SourceMapEntry} a
-     * @param {!SDK.SourceMapEntry} b
-     * @return {number}
+     * @param {!Array<!{lineNumber: number, columnNumber: number}>} rangesA
+     * @param {!Array<!{lineNumber: number, columnNumber: number}>} rangesB
+     * @return {boolean}
      */
-    function mappingComparator(a, b) {
-      if (a.lineNumber !== b.lineNumber)
-        return a.lineNumber - b.lineNumber;
-      return a.columnNumber - b.columnNumber;
+    function isEqual(rangesA, rangesB) {
+      if (rangesA.length !== rangesB.length)
+        return false;
+      for (let i = 0; i < rangesA.length; ++i) {
+        if (rangesA[i].lineNumber !== rangesB[i].lineNumber || rangesA[i].columnNumber !== rangesB[i].columnNumber)
+          return false;
+      }
+      return true;
     }
   }
 
@@ -269,31 +267,23 @@
     Common.moduleSetting('skipStackFramesPattern').setAsArray(regexPatterns);
   }
 
-  _patternChanged() {
+  async _patternChanged() {
     this._isBlackboxedURLCache.clear();
 
     /** @type {!Array<!Promise>} */
     const promises = [];
     for (const debuggerModel of SDK.targetManager.models(SDK.DebuggerModel)) {
       promises.push(this._setBlackboxPatterns(debuggerModel));
-      for (const script of debuggerModel.scripts())
-        promises.push(this._addScript(script).then(loadSourceMap.bind(this, script)));
+      for (const script of debuggerModel.scripts()) {
+        promises.push(this.sourceMapLoaded(script, this._debuggerWorkspaceBinding.sourceMapForScript(script))
+                          .then(() => this._debuggerWorkspaceBinding.updateLocations(script)));
+      }
     }
-    Promise.all(promises).then(() => {
-      const listeners = Array.from(this._listeners);
-      for (const listener of listeners)
-        listener();
-      this._patternChangeFinishedForTests();
-    });
-
-    /**
-     * @param {!SDK.Script} script
-     * @return {!Promise<undefined>}
-     * @this {Bindings.BlackboxManager}
-     */
-    function loadSourceMap(script) {
-      return this.sourceMapLoaded(script, this._debuggerWorkspaceBinding.sourceMapForScript(script));
-    }
+    await Promise.all(promises);
+    const listeners = Array.from(this._listeners);
+    for (const listener of listeners)
+      listener();
+    this._patternChangeFinishedForTests();
   }
 
   _patternChangeFinishedForTests() {
@@ -301,105 +291,6 @@
   }
 
   /**
-   * @param {!Common.Event} event
-   */
-  _globalObjectCleared(event) {
-    const debuggerModel = /** @type {!SDK.DebuggerModel} */ (event.data);
-    this._debuggerModelData.delete(debuggerModel);
-    this._isBlackboxedURLCache.clear();
-  }
-
-  /**
-   * @param {!Common.Event} event
-   */
-  _parsedScriptSource(event) {
-    const script = /** @type {!SDK.Script} */ (event.data);
-    this._addScript(script);
-  }
-
-  /**
-   * @param {!SDK.Script} script
-   * @return {!Promise<undefined>}
-   */
-  _addScript(script) {
-    if (!script.sourceURL && !script.sourceMapURL)
-      return Promise.resolve();
-    const blackboxed = this._isBlackboxedScript(script);
-    return this._setScriptState(script, blackboxed ? [{lineNumber: 0, columnNumber: 0}] : []);
-  }
-
-  /**
-   * @param {!SDK.Script} script
-   * @return {boolean}
-   */
-  _isBlackboxedScript(script) {
-    return this.isBlackboxedURL(script.sourceURL, script.isContentScript());
-  }
-
-  /**
-   * @param {!SDK.Script} script
-   * @return {?Array<!Protocol.Debugger.ScriptPosition>}
-   */
-  _scriptPositions(script) {
-    if (this._debuggerModelData.has(script.debuggerModel))
-      return this._debuggerModelData.get(script.debuggerModel).get(script.scriptId) || null;
-    return null;
-  }
-
-  /**
-   * @param {!SDK.Script} script
-   * @param {!Array<!Protocol.Debugger.ScriptPosition>} positions
-   */
-  _setScriptPositions(script, positions) {
-    const debuggerModel = script.debuggerModel;
-    if (!this._debuggerModelData.has(debuggerModel))
-      this._debuggerModelData.set(debuggerModel, new Map());
-    this._debuggerModelData.get(debuggerModel).set(script.scriptId, positions);
-  }
-
-  /**
-   * @param {!SDK.Script} script
-   * @param {!Array<!Protocol.Debugger.ScriptPosition>} positions
-   * @return {!Promise<undefined>}
-   */
-  _setScriptState(script, positions) {
-    const previousScriptState = this._scriptPositions(script);
-    if (previousScriptState) {
-      let hasChanged = false;
-      hasChanged = previousScriptState.length !== positions.length;
-      for (let i = 0; !hasChanged && i < positions.length; ++i) {
-        hasChanged = positions[i].lineNumber !== previousScriptState[i].lineNumber ||
-            positions[i].columnNumber !== previousScriptState[i].columnNumber;
-      }
-      if (!hasChanged)
-        return Promise.resolve();
-    } else {
-      if (positions.length === 0)
-        return Promise.resolve().then(updateState.bind(this, false));
-    }
-
-    return script.setBlackboxedRanges(positions).then(updateState.bind(this));
-
-    /**
-     * @param {boolean} success
-     * @this {Bindings.BlackboxManager}
-     */
-    function updateState(success) {
-      if (success) {
-        this._setScriptPositions(script, positions);
-        this._debuggerWorkspaceBinding.updateLocations(script);
-        const isBlackboxed = positions.length !== 0;
-        if (!isBlackboxed && script.sourceMapURL)
-          this._debuggerWorkspaceBinding.maybeLoadSourceMap(script);
-      } else {
-        const hasPositions = !!this._scriptPositions(script);
-        if (!hasPositions)
-          this._setScriptPositions(script, []);
-      }
-    }
-  }
-
-  /**
    * @param {string} url
    * @return {string}
    */
@@ -430,5 +321,7 @@
   }
 };
 
+Bindings.BlackboxManager._blackboxedRanges = Symbol('blackboxedRanged');
+
 /** @type {!Bindings.BlackboxManager} */
 Bindings.blackboxManager;
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/BreakpointManager.js b/third_party/blink/renderer/devtools/front_end/bindings/BreakpointManager.js
index d57b5ff0..82ae82e 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/BreakpointManager.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/BreakpointManager.js
@@ -187,11 +187,24 @@
    * @return {!Promise<!Array<!Workspace.UILocation>>}
    */
   possibleBreakpoints(uiSourceCode, textRange) {
-    const startLocation = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(
+    const startLocations = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(
         uiSourceCode, textRange.startLine, textRange.startColumn);
-    const endLocation =
-        Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, textRange.endLine, textRange.endColumn);
-    if (!startLocation || !endLocation || startLocation.debuggerModel !== endLocation.debuggerModel)
+    const endLocations = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(
+        uiSourceCode, textRange.endLine, textRange.endColumn);
+    const endLocationByModel = new Map();
+    for (const location of endLocations)
+      endLocationByModel.set(location.debuggerModel, location);
+    let startLocation = null;
+    let endLocation = null;
+    for (const location of startLocations) {
+      const endLocationCandidate = endLocationByModel.get(location.debuggerModel);
+      if (endLocationCandidate) {
+        startLocation = location;
+        endLocation = endLocationCandidate;
+        break;
+      }
+    }
+    if (!startLocation || !endLocation)
       return Promise.resolve([]);
 
     return startLocation.debuggerModel
@@ -715,10 +728,12 @@
     const columnNumber = this._breakpoint._columnNumber;
     const condition = this._breakpoint.condition();
 
-    let debuggerLocation = uiSourceCode &&
-        Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-    if (debuggerLocation && debuggerLocation.debuggerModel !== this._debuggerModel)
-      debuggerLocation = null;
+    let debuggerLocation = null;
+    if (uiSourceCode) {
+      const locations =
+          Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber);
+      debuggerLocation = locations.find(location => location.debuggerModel === this._debuggerModel);
+    }
     let newState;
     if (this._breakpoint._isRemoved || !this._breakpoint.enabled() || this._scriptDiverged()) {
       newState = null;
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js b/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js
index d484ae0d..cd13fd1 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/CompilerScriptMapping.js
@@ -167,22 +167,22 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
     const sourceMap = uiSourceCode[Bindings.CompilerScriptMapping._sourceMapSymbol];
     if (!sourceMap)
-      return null;
+      return [];
     const scripts = this._sourceMapManager.clientsForSourceMap(sourceMap);
-    const script = scripts.length ? scripts[0] : null;
-    if (!script)
-      return null;
+    if (!scripts.length)
+      return [];
     const entry = sourceMap.sourceLineMapping(uiSourceCode.url(), lineNumber, columnNumber);
     if (!entry)
-      return null;
-    return this._debuggerModel.createRawLocation(
-        script, entry.lineNumber + script.lineOffset,
-        !entry.lineNumber ? entry.columnNumber + script.columnOffset : entry.columnNumber);
+      return [];
+    return scripts.map(
+        script => this._debuggerModel.createRawLocation(
+            script, entry.lineNumber + script.lineOffset,
+            !entry.lineNumber ? entry.columnNumber + script.columnOffset : entry.columnNumber));
   }
 
   /**
@@ -245,16 +245,6 @@
   }
 
   /**
-   * @param {!SDK.Script} script
-   */
-  maybeLoadSourceMap(script) {
-    const sourceMap = this._sourceMapManager.sourceMapForClient(script);
-    if (!sourceMap)
-      return;
-    this._populateSourceMapSources(script, sourceMap);
-  }
-
-  /**
    * @param {?SDK.SourceMap} sourceMap
    */
   _sourceMapAttachedForTest(sourceMap) {
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js b/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js
index 8b971eb4..f9417f9 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/DebuggerWorkspaceBinding.js
@@ -131,21 +131,17 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
-    for (let i = 0; i < this._sourceMappings.length; ++i) {
-      const rawLocation = this._sourceMappings[i].uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-      if (rawLocation)
-        return rawLocation;
-    }
-
-    for (const modelData of this._debuggerModelToData.values()) {
-      const rawLocation = modelData._uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-      if (rawLocation)
-        return rawLocation;
-    }
-    return null;
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
+    let locations = [];
+    for (let i = 0; i < this._sourceMappings.length && !locations.length; ++i)
+      locations = this._sourceMappings[i].uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber);
+    if (locations.length)
+      return locations;
+    for (const modelData of this._debuggerModelToData.values())
+      locations.push(...modelData._uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber));
+    return locations;
   }
 
   /**
@@ -153,10 +149,13 @@
    * @return {!Workspace.UILocation}
    */
   normalizeUILocation(uiLocation) {
-    const rawLocation =
-        this.uiLocationToRawLocation(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
-    if (rawLocation)
-      return this.rawLocationToUILocation(rawLocation) || uiLocation;
+    const rawLocations =
+        this.uiLocationToRawLocations(uiLocation.uiSourceCode, uiLocation.lineNumber, uiLocation.columnNumber);
+    for (const location of rawLocations) {
+      const uiLocationCandidate = this.rawLocationToUILocation(location);
+      if (uiLocationCandidate)
+        return uiLocationCandidate;
+    }
     return uiLocation;
   }
 
@@ -319,16 +318,20 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  _uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
-    let rawLocation = null;
-    rawLocation = rawLocation || this._compilerMapping.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-    rawLocation = rawLocation || this._resourceMapping.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-    rawLocation =
-        rawLocation || Bindings.resourceMapping.uiLocationToJSLocation(uiSourceCode, lineNumber, columnNumber);
-    rawLocation = rawLocation || this._defaultMapping.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-    return rawLocation;
+  _uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
+    let locations = this._compilerMapping.uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber);
+    locations = locations.length ?
+        locations :
+        this._resourceMapping.uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber);
+    locations = locations.length ?
+        locations :
+        Bindings.resourceMapping.uiLocationToJSLocations(uiSourceCode, lineNumber, columnNumber);
+    locations = locations.length ?
+        locations :
+        this._defaultMapping.uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber);
+    return locations;
   }
 
   /**
@@ -466,9 +469,9 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {},
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {},
 };
 
 /**
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/DefaultScriptMapping.js b/third_party/blink/renderer/devtools/front_end/bindings/DefaultScriptMapping.js
index dab1e802..26fea96 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/DefaultScriptMapping.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/DefaultScriptMapping.js
@@ -47,10 +47,9 @@
       debuggerModel.addEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this),
       debuggerModel.addEventListener(SDK.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this),
       debuggerModel.addEventListener(
-          SDK.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSource, this),
-      debuggerModel.addEventListener(
           SDK.DebuggerModel.Events.DiscardedAnonymousScriptSource, this._discardedScriptSource, this)
     ];
+    this._scriptSymbol = Symbol('symbol');
   }
 
   /**
@@ -58,7 +57,8 @@
    * @return {?SDK.Script}
    */
   static scriptForUISourceCode(uiSourceCode) {
-    return uiSourceCode[Bindings.DefaultScriptMapping._scriptSymbol] || null;
+    const scripts = uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol];
+    return scripts ? scripts.values().next().value : null;
   }
 
   /**
@@ -83,17 +83,17 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
-    const script = uiSourceCode[Bindings.DefaultScriptMapping._scriptSymbol];
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
+    const script = uiSourceCode[this._scriptSymbol];
     if (!script)
-      return null;
+      return [];
     if (script.isInlineScriptWithSourceURL()) {
-      return this._debuggerModel.createRawLocation(
-          script, lineNumber + script.lineOffset, lineNumber ? columnNumber : columnNumber + script.columnOffset);
+      return [this._debuggerModel.createRawLocation(
+          script, lineNumber + script.lineOffset, lineNumber ? columnNumber : columnNumber + script.columnOffset)];
     }
-    return this._debuggerModel.createRawLocation(script, lineNumber, columnNumber);
+    return [this._debuggerModel.createRawLocation(script, lineNumber, columnNumber)];
   }
 
   /**
@@ -105,7 +105,11 @@
     const url = 'debugger:///VM' + script.scriptId + (name ? ' ' + name : '');
 
     const uiSourceCode = this._project.createUISourceCode(url, Common.resourceTypes.Script);
-    uiSourceCode[Bindings.DefaultScriptMapping._scriptSymbol] = script;
+    uiSourceCode[this._scriptSymbol] = script;
+    if (!uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol])
+      uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol] = new Set([script]);
+    else
+      uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol].add(script);
     script[Bindings.DefaultScriptMapping._uiSourceCodeSymbol] = uiSourceCode;
     this._project.addUISourceCodeWithProvider(uiSourceCode, script, null, 'text/javascript');
     this._debuggerWorkspaceBinding.updateLocations(script);
@@ -120,7 +124,10 @@
     if (!uiSourceCode)
       return;
     delete script[Bindings.DefaultScriptMapping._uiSourceCodeSymbol];
-    delete uiSourceCode[Bindings.DefaultScriptMapping._scriptSymbol];
+    delete uiSourceCode[this._scriptSymbol];
+    uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol].delete(script);
+    if (!uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol].size)
+      delete uiSourceCode[Bindings.DefaultScriptMapping._scriptsSymbol];
     this._project.removeUISourceCode(uiSourceCode.url());
   }
 
@@ -135,5 +142,5 @@
   }
 };
 
-Bindings.DefaultScriptMapping._scriptSymbol = Symbol('symbol');
+Bindings.DefaultScriptMapping._scriptsSymbol = Symbol('symbol');
 Bindings.DefaultScriptMapping._uiSourceCodeSymbol = Symbol('uiSourceCodeSymbol');
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/PresentationConsoleMessageHelper.js b/third_party/blink/renderer/devtools/front_end/bindings/PresentationConsoleMessageHelper.js
index f639ae6..41c62e7 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/PresentationConsoleMessageHelper.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/PresentationConsoleMessageHelper.js
@@ -94,9 +94,6 @@
     // TODO(dgozman): setImmediate because we race with DebuggerWorkspaceBinding on ParsedScriptSource event delivery.
     debuggerModel.addEventListener(
         SDK.DebuggerModel.Events.ParsedScriptSource, event => setImmediate(this._parsedScriptSource.bind(this, event)));
-    debuggerModel.addEventListener(
-        SDK.DebuggerModel.Events.FailedToParseScriptSource,
-        event => setImmediate(this._parsedScriptSource.bind(this, event)));
     debuggerModel.addEventListener(SDK.DebuggerModel.Events.GlobalObjectCleared, this._debuggerReset, this);
 
     this._locationPool = new Bindings.LiveLocationPool();
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/ResourceMapping.js b/third_party/blink/renderer/devtools/front_end/bindings/ResourceMapping.js
index 2acdd128..c26e274 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/ResourceMapping.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/ResourceMapping.js
@@ -95,18 +95,19 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToJSLocation(uiSourceCode, lineNumber, columnNumber) {
+  uiLocationToJSLocations(uiSourceCode, lineNumber, columnNumber) {
     if (!uiSourceCode[Bindings.ResourceMapping._symbol])
-      return null;
+      return [];
     const target = Bindings.NetworkProject.targetForUISourceCode(uiSourceCode);
     if (!target)
-      return null;
+      return [];
     const debuggerModel = target.model(SDK.DebuggerModel);
     if (!debuggerModel)
-      return null;
-    return debuggerModel.createRawLocationByURL(uiSourceCode.url(), lineNumber, columnNumber);
+      return [];
+    const location = debuggerModel.createRawLocationByURL(uiSourceCode.url(), lineNumber, columnNumber);
+    return location ? [location] : [];
   }
 
   /**
diff --git a/third_party/blink/renderer/devtools/front_end/bindings/ResourceScriptMapping.js b/third_party/blink/renderer/devtools/front_end/bindings/ResourceScriptMapping.js
index f6eea9a..3dcdfa18 100644
--- a/third_party/blink/renderer/devtools/front_end/bindings/ResourceScriptMapping.js
+++ b/third_party/blink/renderer/devtools/front_end/bindings/ResourceScriptMapping.js
@@ -53,8 +53,6 @@
     this._eventListeners = [
       this._debuggerModel.addEventListener(SDK.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this),
       this._debuggerModel.addEventListener(
-          SDK.DebuggerModel.Events.FailedToParseScriptSource, this._parsedScriptSource, this),
-      this._debuggerModel.addEventListener(
           SDK.DebuggerModel.Events.GlobalObjectCleared, this._globalObjectCleared, this),
       runtimeModel.addEventListener(
           SDK.RuntimeModel.Events.ExecutionContextDestroyed, this._executionContextDestroyed, this),
@@ -113,18 +111,18 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
     const scriptFile = this._uiSourceCodeToScriptFile.get(uiSourceCode);
     if (!scriptFile)
-      return null;
+      return [];
     const script = scriptFile._script;
     if (script.isInlineScriptWithSourceURL()) {
-      return this._debuggerModel.createRawLocation(
-          script, lineNumber + script.lineOffset, lineNumber ? columnNumber : columnNumber + script.columnOffset);
+      return [this._debuggerModel.createRawLocation(
+          script, lineNumber + script.lineOffset, lineNumber ? columnNumber : columnNumber + script.columnOffset)];
     }
-    return this._debuggerModel.createRawLocation(script, lineNumber, columnNumber);
+    return [this._debuggerModel.createRawLocation(script, lineNumber, columnNumber)];
   }
 
   /**
diff --git a/third_party/blink/renderer/devtools/front_end/coverage/CoverageDecorationManager.js b/third_party/blink/renderer/devtools/front_end/coverage/CoverageDecorationManager.js
index aec0f908..8aa4513 100644
--- a/third_party/blink/renderer/devtools/front_end/coverage/CoverageDecorationManager.js
+++ b/third_party/blink/renderer/devtools/front_end/coverage/CoverageDecorationManager.js
@@ -138,8 +138,9 @@
     const result = [];
     const contentType = uiSourceCode.contentType();
     if (contentType.hasScripts()) {
-      let location = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, line, column);
-      if (location && location.script()) {
+      let locations = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, line, column);
+      locations = locations.filter(location => !!location.script());
+      for (let location of locations) {
         const script = location.script();
         if (script.isInlineScript() && contentType.isDocument()) {
           if (comparePositions(script.lineOffset, script.columnOffset, location.lineNumber, location.columnNumber) >
diff --git a/third_party/blink/renderer/devtools/front_end/formatter_worker/FormatterWorker.js b/third_party/blink/renderer/devtools/front_end/formatter_worker/FormatterWorker.js
index cb05d74..064e04c 100644
--- a/third_party/blink/renderer/devtools/front_end/formatter_worker/FormatterWorker.js
+++ b/third_party/blink/renderer/devtools/front_end/formatter_worker/FormatterWorker.js
@@ -152,8 +152,15 @@
  */
 FormatterWorker.preprocessTopLevelAwaitExpressions = function(content) {
   let wrapped = '(async () => {' + content + '})()';
-  const root = acorn.parse(wrapped, {ecmaVersion: 9});
-  const body = root.body[0].expression.callee.body;
+  let root;
+  let body;
+  try {
+    root = acorn.parse(wrapped, {ecmaVersion: 9});
+    body = root.body[0].expression.callee.body;
+  } catch (e) {
+    postMessage('');
+    return;
+  }
   const changes = [];
   let containsAwait = false;
   let containsReturn = false;
@@ -236,7 +243,11 @@
  * @param {string} content
  */
 FormatterWorker.javaScriptIdentifiers = function(content) {
-  const root = acorn.parse(content, {ranges: false, ecmaVersion: 9});
+  let root = null;
+  try {
+    root = acorn.parse(content, {ranges: false, ecmaVersion: 9});
+  } catch (e) {
+  }
 
   /** @type {!Array<!ESTree.Node>} */
   const identifiers = [];
diff --git a/third_party/blink/renderer/devtools/front_end/main/Main.js b/third_party/blink/renderer/devtools/front_end/main/Main.js
index c5dcc842..1eccc5d 100644
--- a/third_party/blink/renderer/devtools/front_end/main/Main.js
+++ b/third_party/blink/renderer/devtools/front_end/main/Main.js
@@ -518,7 +518,8 @@
           'Placement of DevTools relative to the page. (%s to restore last position)', toggleDockSideShorcuts[0].name);
       dockItemElement.appendChild(titleElement);
       const dockItemToolbar = new UI.Toolbar('', dockItemElement);
-      dockItemToolbar.makeBlueOnHover();
+      if (Host.isMac() && !UI.themeSupport.hasTheme())
+        dockItemToolbar.makeBlueOnHover();
       const undock = new UI.ToolbarToggle(Common.UIString('Undock into separate window'), 'largeicon-undock');
       const bottom = new UI.ToolbarToggle(Common.UIString('Dock to bottom'), 'largeicon-dock-to-bottom');
       const right = new UI.ToolbarToggle(Common.UIString('Dock to right'), 'largeicon-dock-to-right');
diff --git a/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js b/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js
index 308d7fd..712917f 100644
--- a/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js
+++ b/third_party/blink/renderer/devtools/front_end/network/NetworkLogView.js
@@ -1544,8 +1544,7 @@
 
     const headers = {};
     for (const headerArray of headerData)
-      headers[headerArray[0]] = headers[headerArray[1]];
-
+      headers[headerArray[0]] = headerArray[1];
 
     const credentials =
         request.requestCookies || requestHeaders.some(({name}) => credentialHeaders[name.toLowerCase()]) ? 'include' :
@@ -1561,7 +1560,7 @@
 
     const fetchOptions = {
       credentials,
-      headers,
+      headers: Object.keys(headers).length ? headers : void 0,
       referrer,
       referrerPolicy,
       body: requestBody,
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js b/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js
index 5bc6a1cf..6322caed 100644
--- a/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js
+++ b/third_party/blink/renderer/devtools/front_end/sdk/DebuggerModel.js
@@ -571,10 +571,7 @@
         this, scriptId, sourceURL, startLine, startColumn, endLine, endColumn, executionContextId,
         this._internString(hash), isContentScript, isLiveEdit, sourceMapURL, hasSourceURLComment, length);
     this._registerScript(script);
-    if (!hasSyntaxError)
-      this.dispatchEventToListeners(SDK.DebuggerModel.Events.ParsedScriptSource, script);
-    else
-      this.dispatchEventToListeners(SDK.DebuggerModel.Events.FailedToParseScriptSource, script);
+    this.dispatchEventToListeners(SDK.DebuggerModel.Events.ParsedScriptSource, script);
 
     const sourceMapId =
         SDK.DebuggerModel._sourceMapId(script.executionContextId, script.sourceURL, script.sourceMapURL);
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/Script.js b/third_party/blink/renderer/devtools/front_end/sdk/Script.js
index 7a2a822..bddfa32 100644
--- a/third_party/blink/renderer/devtools/front_end/sdk/Script.js
+++ b/third_party/blink/renderer/devtools/front_end/sdk/Script.js
@@ -254,10 +254,7 @@
   async setBlackboxedRanges(positions) {
     const response = await this.debuggerModel.target().debuggerAgent().invoke_setBlackboxedRanges(
         {scriptId: this.scriptId, positions});
-    const error = response[Protocol.Error];
-    if (error)
-      console.error(error);
-    return !error;
+    return !response[Protocol.Error];
   }
 };
 
diff --git a/third_party/blink/renderer/devtools/front_end/snippets/ScriptSnippetModel.js b/third_party/blink/renderer/devtools/front_end/snippets/ScriptSnippetModel.js
index 1420585..b495421 100644
--- a/third_party/blink/renderer/devtools/front_end/snippets/ScriptSnippetModel.js
+++ b/third_party/blink/renderer/devtools/front_end/snippets/ScriptSnippetModel.js
@@ -87,15 +87,13 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
-    for (const mapping of this._mappingForDebuggerModel.values()) {
-      const rawLocation = mapping.uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber);
-      if (rawLocation)
-        return rawLocation;
-    }
-    return null;
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
+    const locations = [];
+    for (const mapping of this._mappingForDebuggerModel.values())
+      locations.push(...mapping.uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber));
+    return locations;
   }
 
   /**
@@ -429,14 +427,13 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
     const script = this._scriptForUISourceCode.get(uiSourceCode);
     if (!script)
-      return null;
-
-    return this._debuggerModel.createRawLocation(script, lineNumber, columnNumber);
+      return [];
+    return [this._debuggerModel.createRawLocation(script, lineNumber, columnNumber)];
   }
 
   /**
diff --git a/third_party/blink/renderer/devtools/front_end/sources/SourceFormatter.js b/third_party/blink/renderer/devtools/front_end/sources/SourceFormatter.js
index 527fe64a..86e202c3 100644
--- a/third_party/blink/renderer/devtools/front_end/sources/SourceFormatter.js
+++ b/third_party/blink/renderer/devtools/front_end/sources/SourceFormatter.js
@@ -176,17 +176,18 @@
    * @param {!Workspace.UISourceCode} uiSourceCode
    * @param {number} lineNumber
    * @param {number} columnNumber
-   * @return {?SDK.DebuggerModel.Location}
+   * @return {!Array<!SDK.DebuggerModel.Location>}
    */
-  uiLocationToRawLocation(uiSourceCode, lineNumber, columnNumber) {
+  uiLocationToRawLocations(uiSourceCode, lineNumber, columnNumber) {
     const formatData = Sources.SourceFormatData._for(uiSourceCode);
     if (!formatData)
-      return null;
+      return [];
     const originalLocation = formatData.mapping.formattedToOriginal(lineNumber, columnNumber);
     const scripts = this._scriptsForUISourceCode(formatData.originalSourceCode);
     if (!scripts.length)
-      return null;
-    return scripts[0].debuggerModel.createRawLocation(scripts[0], originalLocation[0], originalLocation[1]);
+      return [];
+    return scripts.map(
+        script => script.debuggerModel.createRawLocation(script, originalLocation[0], originalLocation[1]));
   }
 
   /**
@@ -223,9 +224,8 @@
       }
     }
     if (uiSourceCode.contentType().isScript()) {
-      const rawLocation = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, 0, 0);
-      if (rawLocation)
-        return [rawLocation.script()];
+      const rawLocations = Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, 0, 0);
+      return rawLocations.map(location => location.script());
     }
     return [];
   }
diff --git a/third_party/blink/renderer/devtools/front_end/sources/SourceMapNamesResolver.js b/third_party/blink/renderer/devtools/front_end/sources/SourceMapNamesResolver.js
index 2990a5ef..e72955c 100644
--- a/third_party/blink/renderer/devtools/front_end/sources/SourceMapNamesResolver.js
+++ b/third_party/blink/renderer/devtools/front_end/sources/SourceMapNamesResolver.js
@@ -228,22 +228,25 @@
   if (!uiSourceCode.contentType().isFromSourceMap())
     return Promise.resolve('');
 
-  return Sources.SourceMapNamesResolver._allVariablesInCallFrame(callFrame).then(findCompiledName);
+  return Sources.SourceMapNamesResolver._allVariablesInCallFrame(callFrame).then(
+      reverseMapping => findCompiledName(callFrame.debuggerModel, reverseMapping));
 
   /**
+   * @param {!SDK.DebuggerModel} debuggerModel
    * @param {!Map<string, string>} reverseMapping
    * @return {!Promise<string>}
    */
-  function findCompiledName(reverseMapping) {
+  function findCompiledName(debuggerModel, reverseMapping) {
     if (reverseMapping.has(originalText))
       return Promise.resolve(reverseMapping.get(originalText) || '');
 
     return Sources.SourceMapNamesResolver._resolveExpression(
-        uiSourceCode, lineNumber, startColumnNumber, endColumnNumber);
+        debuggerModel, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber);
   }
 };
 
 /**
+ * @param {!SDK.DebuggerModel} debuggerModel
  * @param {!Workspace.UISourceCode} uiSourceCode
  * @param {number} lineNumber
  * @param {number} startColumnNumber
@@ -251,9 +254,10 @@
  * @return {!Promise<string>}
  */
 Sources.SourceMapNamesResolver._resolveExpression = function(
-    uiSourceCode, lineNumber, startColumnNumber, endColumnNumber) {
-  const rawLocation =
-      Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiSourceCode, lineNumber, startColumnNumber);
+    debuggerModel, uiSourceCode, lineNumber, startColumnNumber, endColumnNumber) {
+  const rawLocations =
+      Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiSourceCode, lineNumber, startColumnNumber);
+  const rawLocation = rawLocations.find(location => location.debuggerModel === debuggerModel);
   if (!rawLocation)
     return Promise.resolve('');
 
diff --git a/third_party/blink/renderer/devtools/front_end/sources/SourcesPanel.js b/third_party/blink/renderer/devtools/front_end/sources/SourcesPanel.js
index 4b9571a..d88b9f67b 100644
--- a/third_party/blink/renderer/devtools/front_end/sources/SourcesPanel.js
+++ b/third_party/blink/renderer/devtools/front_end/sources/SourcesPanel.js
@@ -673,9 +673,10 @@
     if (!executionContext)
       return;
     // Always use 0 column.
-    const rawLocation =
-        Bindings.debuggerWorkspaceBinding.uiLocationToRawLocation(uiLocation.uiSourceCode, uiLocation.lineNumber, 0);
-    if (!rawLocation || rawLocation.debuggerModel !== executionContext.debuggerModel)
+    const rawLocations =
+        Bindings.debuggerWorkspaceBinding.uiLocationToRawLocations(uiLocation.uiSourceCode, uiLocation.lineNumber, 0);
+    const rawLocation = rawLocations.find(location => location.debuggerModel === executionContext.debuggerModel);
+    if (!rawLocation)
       return;
     if (!this._prepareToResume())
       return;
diff --git a/third_party/blink/renderer/devtools/front_end/ui/ContextMenu.js b/third_party/blink/renderer/devtools/front_end/ui/ContextMenu.js
index 759b485..65da0ee 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/ContextMenu.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/ContextMenu.js
@@ -434,7 +434,8 @@
 
   _innerShow() {
     const menuObject = this._buildMenuDescriptors();
-    if (this._useSoftMenu || UI.ContextMenu._useSoftMenu || InspectorFrontendHost.isHostedMode()) {
+    if (this._useSoftMenu || UI.ContextMenu._useSoftMenu || InspectorFrontendHost.isHostedMode() ||
+        (UI.themeSupport.hasTheme() && menuObject.length)) {
       this._softMenu = new UI.SoftContextMenu(menuObject, this._itemSelected.bind(this));
       this._softMenu.show(this._event.target.ownerDocument, new AnchorBox(this._x, this._y, 0, 0));
     } else {
diff --git a/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js b/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
index 79304c3..1f2a605 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
+++ b/third_party/blink/renderer/devtools/front_end/ui/SoftContextMenu.js
@@ -146,8 +146,13 @@
 
     menuItemElement.createTextChild(item.label);
 
-    const subMenuArrowElement = menuItemElement.createChild('span', 'soft-context-menu-item-submenu-arrow');
-    subMenuArrowElement.textContent = '\u25B6';  // BLACK RIGHT-POINTING TRIANGLE
+    if (Host.isMac() && !UI.themeSupport.hasTheme()) {
+      const subMenuArrowElement = menuItemElement.createChild('span', 'soft-context-menu-item-submenu-arrow');
+      subMenuArrowElement.textContent = '\u25B6';  // BLACK RIGHT-POINTING TRIANGLE
+    } else {
+      const subMenuArrowElement = UI.Icon.create('smallicon-triangle-right', 'soft-context-menu-item-submenu-arrow');
+      menuItemElement.appendChild(subMenuArrowElement);
+    }
 
     menuItemElement.addEventListener('mousedown', this._menuItemMouseDown.bind(this), false);
     menuItemElement.addEventListener('mouseup', this._menuItemMouseUp.bind(this), false);
@@ -254,7 +259,8 @@
     }
     this._highlightedMenuItemElement = menuItemElement;
     if (this._highlightedMenuItemElement) {
-      this._highlightedMenuItemElement.classList.add('force-white-icons');
+      if (UI.themeSupport.hasTheme() || Host.isMac())
+        this._highlightedMenuItemElement.classList.add('force-white-icons');
       this._highlightedMenuItemElement.classList.add('soft-context-menu-item-mouse-over');
       this._contextMenuElement.focus();
       if (scheduleSubMenu && this._highlightedMenuItemElement._subItems &&
diff --git a/third_party/blink/renderer/devtools/front_end/ui/softContextMenu.css b/third_party/blink/renderer/devtools/front_end/ui/softContextMenu.css
index e159a13..ced1f40 100644
--- a/third_party/blink/renderer/devtools/front_end/ui/softContextMenu.css
+++ b/third_party/blink/renderer/devtools/front_end/ui/softContextMenu.css
@@ -5,19 +5,32 @@
  */
 
 .soft-context-menu {
-    border: 1px solid rgba(196, 196, 196, 0.9);
-    border-top: 1px solid rgba(196, 196, 196, 0.5);
+    overflow-y: auto;
+    min-width: 160px !important;
     /* NOTE: Keep padding in sync with padding adjustment in SoftContextMenu.js */
     padding: 4px 0 4px 0;
+    border: 1px solid #b9b9b9;
+    background-color: #FFF;
+    box-shadow: var(--drop-shadow);
+    --context-menu-hover-bg: #ebebeb;
+    --context-menu-hover-color: #222;
+    --context-menu-seperator-color: var(--divider-color);
+}
+
+:host:host-context(.platform-mac):host-context(html:not(.-theme-with-dark-background)) .soft-context-menu {
+    border: 1px solid rgba(196, 196, 196, 0.9);
+    border-top: 1px solid rgba(196, 196, 196, 0.5);
     border-radius: 4px;
     background-color: rgb(240, 240, 240);
     box-shadow: 0 5px 10px rgba(0, 0, 0, 0.25);
-    overflow-y: auto;
-    min-width: 160px !important;
+    --context-menu-hover-color: #FFF;
+    --context-menu-seperator-color: rgb(222, 222, 222);
 }
 
 :host-context(.-theme-with-dark-background) .soft-context-menu {
-    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.25);
+    --context-menu-hover-bg: var(--selection-bg-color);
+    --context-menu-hover-color: var(--selection-fg-color);
+    border: none;
 }
 
 .soft-context-menu-item {
@@ -45,33 +58,34 @@
 .soft-context-menu-separator > .separator-line {
     margin: 0;
     height: 5px;
-    border-bottom: 1px solid rgb(222, 222, 222);
+    border-bottom: 1px solid var(--context-menu-seperator-color);
     pointer-events: none;
 }
 
 .soft-context-menu-item-mouse-over,
 .-theme-selection-color {
-    border-top: 1px solid var(--selection-bg-color);
-    border-bottom: 1px solid var(--selection-bg-color);
-    background-color: var(--selection-bg-color);
-    color: white;
+    border-top: 1px solid var(--context-menu-hover-bg);
+    border-bottom: 1px solid var(--context-menu-hover-bg);
+    background-color: var(--context-menu-hover-bg);
+    color: var(--context-menu-hover-color);
 }
 
-:host-context(.platform-mac) .soft-context-menu-item-mouse-over, -theme-preserve {
+:host:host-context(.platform-mac):host-context(html:not(.-theme-with-dark-background)) .soft-context-menu-item-mouse-over {
     border-top: 1px solid transparent;
     border-bottom: 1px solid transparent;
     background-image: linear-gradient(to right, hsl(214, 81%, 60%), hsl(214, 100%, 56%));
 }
 
-:host-context(.platform-mac) .separator-line {
+:host:host-context(.platform-mac):host-context(html:not(.-theme-with-dark-background)) .separator-line {
     border-width: 2px;
 }
 
 .soft-context-menu-item-submenu-arrow {
     pointer-events: none;
     font-size: 11px;
-    flex: 1 1 auto;
     text-align: right;
+    align-self: center;
+    margin-left: auto;
 }
 
 .soft-context-menu-item-mouse-over .soft-context-menu-item-checkmark {
@@ -103,6 +117,11 @@
     margin: auto 5px auto 0px;
 }
 
+:host-context(.-theme-with-dark-background) .checkmark {
+    filter: invert(80%);
+}
+
 .soft-context-menu-item-mouse-over .checkmark {
     opacity: 1;
+    filter: none;
 }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
index 53269b7..34fc28c 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_layout_object.cc
@@ -2288,7 +2288,7 @@
 
   if (anchor_object->GetLayoutObject()->GetNode() &&
       anchor_object->GetLayoutObject()->GetNode()->DispatchEvent(
-          Event::CreateCancelableBubble(EventTypeNames::selectstart)) !=
+          *Event::CreateCancelableBubble(EventTypeNames::selectstart)) !=
           DispatchEventResult::kNotCanceled)
     return false;
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 936c36e1..b4aa9a6 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -1076,7 +1076,7 @@
       break;
 
     event.SetCurrentTarget(event_path[i]);
-    event_path[i]->FireEventListeners(&event);
+    event_path[i]->FireEventListeners(event);
     if (event.PropagationStopped())
       return true;
   }
@@ -1084,7 +1084,7 @@
   // Targeting phase.
   event.SetEventPhase(Event::kAtTarget);
   event.SetCurrentTarget(event_path[0]);
-  event_path[0]->FireEventListeners(&event);
+  event_path[0]->FireEventListeners(event);
   if (event.PropagationStopped())
     return true;
 
@@ -1092,7 +1092,7 @@
   event.SetEventPhase(Event::kBubblingPhase);
   for (size_t i = 1; i < event_path.size(); i++) {
     event.SetCurrentTarget(event_path[i]);
-    event_path[i]->FireEventListeners(&event);
+    event_path[i]->FireEventListeners(event);
     if (event.PropagationStopped())
       return true;
   }
diff --git a/third_party/blink/renderer/modules/app_banner/app_banner_controller.cc b/third_party/blink/renderer/modules/app_banner/app_banner_controller.cc
index b747c91..db1cdf8 100644
--- a/third_party/blink/renderer/modules/app_banner/app_banner_controller.cc
+++ b/third_party/blink/renderer/modules/app_banner/app_banner_controller.cc
@@ -42,7 +42,7 @@
   }
 
   mojom::AppBannerPromptReply reply =
-      frame_->DomWindow()->DispatchEvent(BeforeInstallPromptEvent::Create(
+      frame_->DomWindow()->DispatchEvent(*BeforeInstallPromptEvent::Create(
           EventTypeNames::beforeinstallprompt, *frame_, std::move(service_ptr),
           std::move(event_request), platforms, require_gesture)) ==
               DispatchEventResult::kNotCanceled
diff --git a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
index 15567ad..0264130 100644
--- a/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
+++ b/third_party/blink/renderer/modules/background_fetch/background_fetch_registration.cc
@@ -59,7 +59,7 @@
     return;
 
   DCHECK(context->IsContextThread());
-  DispatchEvent(Event::Create(EventTypeNames::progress));
+  DispatchEvent(*Event::Create(EventTypeNames::progress));
 }
 
 String BackgroundFetchRegistration::id() const {
diff --git a/third_party/blink/renderer/modules/battery/battery_manager.cc b/third_party/blink/renderer/modules/battery/battery_manager.cc
index 826039ea..81f73d98 100644
--- a/third_party/blink/renderer/modules/battery/battery_manager.cc
+++ b/third_party/blink/renderer/modules/battery/battery_manager.cc
@@ -74,13 +74,13 @@
     return;
 
   if (battery_status_.Charging() != old_status.Charging())
-    DispatchEvent(Event::Create(EventTypeNames::chargingchange));
+    DispatchEvent(*Event::Create(EventTypeNames::chargingchange));
   if (battery_status_.charging_time() != old_status.charging_time())
-    DispatchEvent(Event::Create(EventTypeNames::chargingtimechange));
+    DispatchEvent(*Event::Create(EventTypeNames::chargingtimechange));
   if (battery_status_.discharging_time() != old_status.discharging_time())
-    DispatchEvent(Event::Create(EventTypeNames::dischargingtimechange));
+    DispatchEvent(*Event::Create(EventTypeNames::dischargingtimechange));
   if (battery_status_.Level() != old_status.Level())
-    DispatchEvent(Event::Create(EventTypeNames::levelchange));
+    DispatchEvent(*Event::Create(EventTypeNames::levelchange));
 }
 
 void BatteryManager::RegisterWithDispatcher() {
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
index 76f9ced..0707a4f 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_device.cc
@@ -79,7 +79,7 @@
 
 void BluetoothDevice::ClearAttributeInstanceMapAndFireEvent() {
   attribute_instance_map_->Clear();
-  DispatchEvent(Event::CreateBubble(EventTypeNames::gattserverdisconnected));
+  DispatchEvent(*Event::CreateBubble(EventTypeNames::gattserverdisconnected));
 }
 
 const WTF::AtomicString& BluetoothDevice::InterfaceName() const {
diff --git a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
index 8df76df..af626a26 100644
--- a/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
+++ b/third_party/blink/renderer/modules/bluetooth/bluetooth_remote_gatt_characteristic.cc
@@ -56,7 +56,7 @@
   if (!GetGatt()->connected())
     return;
   this->SetValue(BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value));
-  DispatchEvent(Event::Create(EventTypeNames::characteristicvaluechanged));
+  DispatchEvent(*Event::Create(EventTypeNames::characteristicvaluechanged));
 }
 
 void BluetoothRemoteGATTCharacteristic::ContextDestroyed(ExecutionContext*) {
@@ -111,7 +111,7 @@
     DOMDataView* dom_data_view =
         BluetoothRemoteGATTUtils::ConvertWTFVectorToDataView(value.value());
     SetValue(dom_data_view);
-    DispatchEvent(Event::Create(EventTypeNames::characteristicvaluechanged));
+    DispatchEvent(*Event::Create(EventTypeNames::characteristicvaluechanged));
     resolver->Resolve(dom_data_view);
   } else {
     resolver->Reject(BluetoothError::CreateDOMException(result));
diff --git a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
index 03a7e1da..2e48b960 100644
--- a/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
+++ b/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.cc
@@ -96,9 +96,17 @@
 
 void BroadcastChannel::OnMessage(BlinkCloneableMessage message) {
   // Queue a task to dispatch the event.
-  MessageEvent* event = MessageEvent::Create(
-      nullptr, std::move(message.message),
-      GetExecutionContext()->GetSecurityOrigin()->ToString());
+  MessageEvent* event;
+  if (!message.locked_agent_cluster_id ||
+      GetExecutionContext()->IsSameAgentCluster(
+          *message.locked_agent_cluster_id)) {
+    event = MessageEvent::Create(
+        nullptr, std::move(message.message),
+        GetExecutionContext()->GetSecurityOrigin()->ToString());
+  } else {
+    event = MessageEvent::CreateError(
+        GetExecutionContext()->GetSecurityOrigin()->ToString());
+  }
   EnqueueEvent(event, TaskType::kPostedMessage);
 }
 
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
index a854c83..5c8de91 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.cc
@@ -223,7 +223,7 @@
 void CanvasRenderingContext2D::DispatchContextLostEvent(TimerBase*) {
   if (canvas() && ContextLostRestoredEventsEnabled()) {
     Event* event = Event::CreateCancelable(EventTypeNames::contextlost);
-    canvas()->DispatchEvent(event);
+    canvas()->DispatchEvent(*event);
     if (event->defaultPrevented()) {
       context_restorable_ = false;
     }
@@ -268,7 +268,7 @@
   context_lost_mode_ = kNotLostContext;
   if (ContextLostRestoredEventsEnabled()) {
     Event* event(Event::Create(EventTypeNames::contextrestored));
-    canvas()->DispatchEvent(event);
+    canvas()->DispatchEvent(*event);
   }
 }
 
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
index eada762..896ba70a 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d_test.cc
@@ -35,7 +35,6 @@
 #include "third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h"
 #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
-#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
 #include "third_party/skia/include/core/SkColorSpaceXform.h"
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkSurface.h"
@@ -1108,25 +1107,17 @@
 class CanvasRenderingContext2DTestWithTestingPlatform
     : public CanvasRenderingContext2DTest {
  protected:
+  CanvasRenderingContext2DTestWithTestingPlatform() {
+    EnablePlatform();
+    platform()->AdvanceClockSeconds(1.);  // For non-zero DocumentParserTimings.
+  }
+
   void SetUp() override {
-    platform_ = std::make_unique<ScopedTestingPlatformSupport<
-        TestingPlatformSupportWithMockScheduler>>();
-    (*platform_)
-        ->AdvanceClockSeconds(1.);  // For non-zero DocumentParserTimings.
     CanvasRenderingContext2DTest::SetUp();
     GetDocument().View()->UpdateLayout();
   }
 
-  void TearDown() override {
-    platform_.reset();
-    CanvasRenderingContext2DTest::TearDown();
-  }
-
-  void RunUntilIdle() { (*platform_)->RunUntilIdle(); }
-
-  std::unique_ptr<
-      ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>>
-      platform_;
+  void RunUntilIdle() { platform()->RunUntilIdle(); }
 };
 
 // https://crbug.com/708445: When the Canvas2DLayerBridge hibernates or wakes up
diff --git a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
index f36fea3..9dc633c5 100644
--- a/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
+++ b/third_party/blink/renderer/modules/cookie_store/cookie_store.cc
@@ -415,7 +415,7 @@
     // The backend only reported OVERWRITE events, which are dropped.
     return;
   }
-  DispatchEvent(CookieChangeEvent::Create(
+  DispatchEvent(*CookieChangeEvent::Create(
       EventTypeNames::change, std::move(changed), std::move(deleted)));
 }
 
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.h b/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.h
index 11ea9bf..5d9c7b6 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.h
+++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_proxy.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGER_CREDENTIAL_MANAGER_PROXY_H_
 
 #include "third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom-blink.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom-blink.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
diff --git a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h
index 44769ec..987e102a7 100644
--- a/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h
+++ b/third_party/blink/renderer/modules/credentialmanager/credential_manager_type_converters.h
@@ -6,7 +6,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_CREDENTIALMANAGER_CREDENTIAL_MANAGER_TYPE_CONVERTERS_H_
 
 #include "third_party/blink/public/platform/modules/credentialmanager/credential_manager.mojom-blink.h"
-#include "third_party/blink/public/platform/modules/webauth/authenticator.mojom-blink.h"
+#include "third_party/blink/public/platform/modules/webauthn/authenticator.mojom-blink.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
diff --git a/third_party/blink/renderer/modules/eventsource/event_source.cc b/third_party/blink/renderer/modules/eventsource/event_source.cc
index 0061ecc..8c68e3c 100644
--- a/third_party/blink/renderer/modules/eventsource/event_source.cc
+++ b/third_party/blink/renderer/modules/eventsource/event_source.cc
@@ -172,7 +172,7 @@
   state_ = kConnecting;
   connect_timer_.StartOneShot(TimeDelta::FromMilliseconds(reconnect_delay_),
                               FROM_HERE);
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 void EventSource::ConnectTimerFired(TimerBase*) {
@@ -273,7 +273,7 @@
       last_event_id = parser_->LastEventId();
     }
     parser_ = new EventSourceParser(last_event_id, this);
-    DispatchEvent(Event::Create(EventTypeNames::open));
+    DispatchEvent(*Event::Create(EventTypeNames::open));
   } else {
     loader_->Cancel();
   }
@@ -333,7 +333,7 @@
   probe::willDispatchEventSourceEvent(GetExecutionContext(),
                                       resource_identifier_, event_type,
                                       last_event_id, data);
-  DispatchEvent(e);
+  DispatchEvent(*e);
 }
 
 void EventSource::OnReconnectionTimeSet(unsigned long long reconnection_time) {
@@ -347,7 +347,7 @@
   state_ = kClosed;
   NetworkRequestEnded();
 
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 void EventSource::ContextDestroyed(ExecutionContext*) {
diff --git a/third_party/blink/renderer/modules/exported/web_user_media_request.cc b/third_party/blink/renderer/modules/exported/web_user_media_request.cc
index ad2a312..20f62db 100644
--- a/third_party/blink/renderer/modules/exported/web_user_media_request.cc
+++ b/third_party/blink/renderer/modules/exported/web_user_media_request.cc
@@ -57,6 +57,11 @@
   private_.Reset();
 }
 
+WebUserMediaRequest::MediaType WebUserMediaRequest::MediaRequestType() const {
+  DCHECK(!IsNull());
+  return private_->MediaRequestType();
+}
+
 bool WebUserMediaRequest::Audio() const {
   DCHECK(!IsNull());
   return private_->Audio();
diff --git a/third_party/blink/renderer/modules/filesystem/file_writer.cc b/third_party/blink/renderer/modules/filesystem/file_writer.cc
index 1736ebc..b8f8bb66 100644
--- a/third_party/blink/renderer/modules/filesystem/file_writer.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_writer.cc
@@ -293,7 +293,7 @@
   probe::AsyncTask async_task(GetExecutionContext(), this);
   ++recursion_depth_;
   DispatchEvent(
-      ProgressEvent::Create(type, true, bytes_written_, bytes_to_write_));
+      *ProgressEvent::Create(type, true, bytes_written_, bytes_to_write_));
   --recursion_depth_;
   DCHECK_GE(recursion_depth_, 0);
 }
diff --git a/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc b/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc
index a6e566ae..a43eaf46 100644
--- a/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc
+++ b/third_party/blink/renderer/modules/gamepad/navigator_gamepad.cc
@@ -256,7 +256,7 @@
   const AtomicString& event_name = gamepad->connected()
                                        ? EventTypeNames::gamepadconnected
                                        : EventTypeNames::gamepaddisconnected;
-  DomWindow()->DispatchEvent(GamepadEvent::Create(
+  DomWindow()->DispatchEvent(*GamepadEvent::Create(
       event_name, Event::Bubbles::kNo, Event::Cancelable::kYes, gamepad));
 
   if (!pending_events_.IsEmpty()) {
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.cc b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
index 32f6f19..6b8fc330 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.cc
@@ -500,16 +500,16 @@
   event_queue_->EnqueueEvent(FROM_HERE, event);
 }
 
-DispatchEventResult IDBDatabase::DispatchEventInternal(Event* event) {
+DispatchEventResult IDBDatabase::DispatchEventInternal(Event& event) {
   IDB_TRACE("IDBDatabase::dispatchEvent");
   if (!GetExecutionContext())
     return DispatchEventResult::kCanceledBeforeDispatch;
-  DCHECK(event->type() == EventTypeNames::versionchange ||
-         event->type() == EventTypeNames::close);
+  DCHECK(event.type() == EventTypeNames::versionchange ||
+         event.type() == EventTypeNames::close);
 
   DispatchEventResult dispatch_result =
       EventTarget::DispatchEventInternal(event);
-  if (event->type() == EventTypeNames::versionchange && !close_pending_ &&
+  if (event.type() == EventTypeNames::versionchange && !close_pending_ &&
       backend_)
     backend_->VersionChangeIgnored();
   return dispatch_result;
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_database.h b/third_party/blink/renderer/modules/indexeddb/idb_database.h
index 24a6484..90c1175 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_database.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_database.h
@@ -172,7 +172,7 @@
 
  protected:
   // EventTarget
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
 
  private:
   IDBDatabase(ExecutionContext*,
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.cc b/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.cc
index 7d2b7e99..67f5ea8 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.cc
@@ -34,37 +34,37 @@
 namespace blink {
 
 DispatchEventResult IDBEventDispatcher::Dispatch(
-    Event* event,
+    Event& event,
     HeapVector<Member<EventTarget>>& event_targets) {
   size_t size = event_targets.size();
   DCHECK(size);
 
-  event->SetEventPhase(Event::kCapturingPhase);
+  event.SetEventPhase(Event::kCapturingPhase);
   for (size_t i = size - 1; i; --i) {  // Don't do the first element.
-    event->SetCurrentTarget(event_targets[i].Get());
+    event.SetCurrentTarget(event_targets[i].Get());
     event_targets[i]->FireEventListeners(event);
-    if (event->PropagationStopped())
+    if (event.PropagationStopped())
       goto doneDispatching;
   }
 
-  event->SetEventPhase(Event::kAtTarget);
-  event->SetCurrentTarget(event_targets[0].Get());
+  event.SetEventPhase(Event::kAtTarget);
+  event.SetCurrentTarget(event_targets[0].Get());
   event_targets[0]->FireEventListeners(event);
-  if (event->PropagationStopped() || !event->bubbles() || event->cancelBubble())
+  if (event.PropagationStopped() || !event.bubbles() || event.cancelBubble())
     goto doneDispatching;
 
-  event->SetEventPhase(Event::kBubblingPhase);
+  event.SetEventPhase(Event::kBubblingPhase);
   for (size_t i = 1; i < size; ++i) {  // Don't do the first element.
-    event->SetCurrentTarget(event_targets[i].Get());
+    event.SetCurrentTarget(event_targets[i].Get());
     event_targets[i]->FireEventListeners(event);
-    if (event->PropagationStopped() || event->cancelBubble())
+    if (event.PropagationStopped() || event.cancelBubble())
       goto doneDispatching;
   }
 
 doneDispatching:
-  event->SetCurrentTarget(nullptr);
-  event->SetEventPhase(Event::kNone);
-  return EventTarget::GetDispatchEventResult(*event);
+  event.SetCurrentTarget(nullptr);
+  event.SetEventPhase(Event::kNone);
+  return EventTarget::GetDispatchEventResult(event);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.h b/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.h
index 62b32ec..d9f5685 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_event_dispatcher.h
@@ -45,7 +45,7 @@
  public:
   // The second argument contains the target first and then its ancestors in
   // order of how the event bubbles.
-  static DispatchEventResult Dispatch(Event*, HeapVector<Member<EventTarget>>&);
+  static DispatchEventResult Dispatch(Event&, HeapVector<Member<EventTarget>>&);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
index 38205ce..25779b6 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.cc
@@ -186,10 +186,10 @@
   return true;
 }
 
-DispatchEventResult IDBOpenDBRequest::DispatchEventInternal(Event* event) {
+DispatchEventResult IDBOpenDBRequest::DispatchEventInternal(Event& event) {
   // If the connection closed between onUpgradeNeeded and the delivery of the
   // "success" event, an "error" event should be fired instead.
-  if (event->type() == EventTypeNames::success &&
+  if (event.type() == EventTypeNames::success &&
       ResultAsAny()->GetType() == IDBAny::kIDBDatabaseType &&
       ResultAsAny()->IdbDatabase()->IsClosePending()) {
     SetResult(nullptr);
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h
index 6f9efa5..36d9ecb 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_open_db_request.h
@@ -71,7 +71,7 @@
   bool ShouldEnqueueEvent() const override;
 
   // EventTarget
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
 
  private:
   IDBOpenDBRequest(ScriptState*,
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.cc b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
index 94d677f..50acf9ca 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.cc
@@ -632,15 +632,15 @@
   return PausableObject::GetExecutionContext();
 }
 
-DispatchEventResult IDBRequest::DispatchEventInternal(Event* event) {
+DispatchEventResult IDBRequest::DispatchEventInternal(Event& event) {
   IDB_TRACE("IDBRequest::dispatchEvent");
   if (!GetExecutionContext())
     return DispatchEventResult::kCanceledBeforeDispatch;
   DCHECK_EQ(ready_state_, PENDING);
   DCHECK(has_pending_activity_);
-  DCHECK_EQ(event->target(), this);
+  DCHECK_EQ(event.target(), this);
 
-  if (event->type() != EventTypeNames::blocked)
+  if (event.type() != EventTypeNames::blocked)
     ready_state_ = DONE;
 
   HeapVector<Member<EventTarget>> targets;
@@ -657,7 +657,7 @@
   // Cursor properties should not be updated until the success event is being
   // dispatched.
   IDBCursor* cursor_to_notify = nullptr;
-  if (event->type() == EventTypeNames::success) {
+  if (event.type() == EventTypeNames::success) {
     cursor_to_notify = GetResultCursor();
     if (cursor_to_notify) {
       cursor_to_notify->SetValueReady(std::move(cursor_key_),
@@ -666,23 +666,23 @@
     }
   }
 
-  if (event->type() == EventTypeNames::upgradeneeded) {
+  if (event.type() == EventTypeNames::upgradeneeded) {
     DCHECK(!did_fire_upgrade_needed_event_);
     did_fire_upgrade_needed_event_ = true;
   }
 
   // FIXME: When we allow custom event dispatching, this will probably need to
   // change.
-  DCHECK(event->type() == EventTypeNames::success ||
-         event->type() == EventTypeNames::error ||
-         event->type() == EventTypeNames::blocked ||
-         event->type() == EventTypeNames::upgradeneeded)
-      << "event type was " << event->type();
+  DCHECK(event.type() == EventTypeNames::success ||
+         event.type() == EventTypeNames::error ||
+         event.type() == EventTypeNames::blocked ||
+         event.type() == EventTypeNames::upgradeneeded)
+      << "event type was " << event.type();
   const bool set_transaction_active =
       transaction_ &&
-      (event->type() == EventTypeNames::success ||
-       event->type() == EventTypeNames::upgradeneeded ||
-       (event->type() == EventTypeNames::error && !request_aborted_));
+      (event.type() == EventTypeNames::success ||
+       event.type() == EventTypeNames::upgradeneeded ||
+       (event.type() == EventTypeNames::error && !request_aborted_));
 
   if (set_transaction_active)
     transaction_->SetActive(true);
@@ -708,7 +708,7 @@
             DOMException::Create(DOMExceptionCode::kAbortError,
                                  "Uncaught exception in event handler."));
         transaction_->abort(IGNORE_EXCEPTION_FOR_TESTING);
-      } else if (event->type() == EventTypeNames::error &&
+      } else if (event.type() == EventTypeNames::error &&
                  dispatch_result == DispatchEventResult::kNotCanceled) {
         transaction_->SetError(error_);
         transaction_->abort(IGNORE_EXCEPTION_FOR_TESTING);
@@ -726,7 +726,7 @@
 
   // An upgradeneeded event will always be followed by a success or error event,
   // so must be kept alive.
-  if (ready_state_ == DONE && event->type() != EventTypeNames::upgradeneeded)
+  if (ready_state_ == DONE && event.type() != EventTypeNames::upgradeneeded)
     has_pending_activity_ = false;
 
   return dispatch_result;
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_request.h b/third_party/blink/renderer/modules/indexeddb/idb_request.h
index 51017b0..34e4217 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_request.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_request.h
@@ -344,7 +344,7 @@
   virtual void EnqueueResponse(int64_t);
 
   // EventTarget
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
 
   // Can be nullptr for requests that are not associated with a transaction,
   // i.e. delete requests and completed or unsuccessful open requests.
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc b/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
index 5e2930db..969a80d 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.cc
@@ -518,7 +518,7 @@
   return nullptr;
 }
 
-DispatchEventResult IDBTransaction::DispatchEventInternal(Event* event) {
+DispatchEventResult IDBTransaction::DispatchEventInternal(Event& event) {
   IDB_TRACE1("IDBTransaction::dispatchEvent", "txn.id", id_);
   if (!GetExecutionContext()) {
     state_ = kFinished;
@@ -527,7 +527,7 @@
   DCHECK_NE(state_, kFinished);
   DCHECK(has_pending_activity_);
   DCHECK(GetExecutionContext());
-  DCHECK_EQ(event->target(), this);
+  DCHECK_EQ(event.target(), this);
   state_ = kFinished;
 
   HeapVector<Member<EventTarget>> targets;
@@ -536,8 +536,8 @@
 
   // FIXME: When we allow custom event dispatching, this will probably need to
   // change.
-  DCHECK(event->type() == EventTypeNames::complete ||
-         event->type() == EventTypeNames::abort);
+  DCHECK(event.type() == EventTypeNames::complete ||
+         event.type() == EventTypeNames::abort);
   DispatchEventResult dispatch_result =
       IDBEventDispatcher::Dispatch(event, targets);
   // FIXME: Try to construct a test where |this| outlives openDBRequest and we
diff --git a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
index 5a2970a..bf07fc65 100644
--- a/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
+++ b/third_party/blink/renderer/modules/indexeddb/idb_transaction.h
@@ -161,7 +161,7 @@
 
  protected:
   // EventTarget
-  DispatchEventResult DispatchEventInternal(Event*) override;
+  DispatchEventResult DispatchEventInternal(Event&) override;
 
  private:
   using IDBObjectStoreMap = HeapHashMap<String, Member<IDBObjectStore>>;
diff --git a/third_party/blink/renderer/modules/installation/installation_service_impl.cc b/third_party/blink/renderer/modules/installation/installation_service_impl.cc
index 72a6b08..b41e432 100644
--- a/third_party/blink/renderer/modules/installation/installation_service_impl.cc
+++ b/third_party/blink/renderer/modules/installation/installation_service_impl.cc
@@ -33,7 +33,7 @@
   if (!dom_window)
     return;
 
-  dom_window->DispatchEvent(Event::Create(EventTypeNames::appinstalled));
+  dom_window->DispatchEvent(*Event::Create(EventTypeNames::appinstalled));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_loading_panel_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_loading_panel_element_test.cc
index 27a0c7e..8132357 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_loading_panel_element_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_loading_panel_element_test.cc
@@ -169,7 +169,7 @@
 
   void TriggerEvent(const AtomicString& name) {
     Event* event = Event::Create(name);
-    loading_element_->mask1_background_->DispatchEvent(event);
+    loading_element_->mask1_background_->DispatchEvent(*event);
   }
 
   Persistent<HTMLMediaElement> media_element_;
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element.cc
index 693d40f..f65966e 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element.cc
@@ -273,7 +273,7 @@
     return false;
 
   // For mouse events, only keep in node if they're on the internal button.
-  if (event->IsMouseEvent())
+  if (event->IsMouseEvent() && MediaControlsImpl::IsModern())
     return IsMouseEventOnInternalButton(ToMouseEvent(event));
 
   return true;
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element_test.cc
index e9ebad6..9ca6ab5 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_overlay_play_button_element_test.cc
@@ -39,7 +39,7 @@
 
   void SimulateAnimationIteration() {
     Event* event = Event::Create(EventTypeNames::animationiteration);
-    GetElementById("arrow-3")->DispatchEvent(event);
+    GetElementById("arrow-3")->DispatchEvent(*event);
   }
 
  private:
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc
index 92c35bd..d158961 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_panel_element_test.cc
@@ -53,7 +53,7 @@
  private:
   void TriggerEvent(const AtomicString& name) {
     Event* event = Event::Create(name);
-    GetPanel().DispatchEvent(event);
+    GetPanel().DispatchEvent(*event);
   }
 
   Persistent<HTMLMediaElement> media_element_;
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc
index 7d638481..b0697b0 100644
--- a/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_timeline_element_test.cc
@@ -55,7 +55,7 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -65,7 +65,7 @@
 
   PointerEventInit init = GetValidPointerEventInit();
   init.setButton(static_cast<int>(WebPointerProperties::Button::kRight));
-  Timeline()->DispatchEvent(PointerEvent::Create("pointerdown", init));
+  Timeline()->DispatchEvent(*PointerEvent::Create("pointerdown", init));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -75,7 +75,7 @@
 
   PointerEventInit init = GetValidPointerEventInit();
   init.setIsPrimary(false);
-  Timeline()->DispatchEvent(PointerEvent::Create("pointerdown", init));
+  Timeline()->DispatchEvent(*PointerEvent::Create("pointerdown", init));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -84,9 +84,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerup", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerup", GetValidPointerEventInit()));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -95,11 +95,11 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
 
   PointerEventInit init = GetValidPointerEventInit();
   init.setButton(static_cast<int>(WebPointerProperties::Button::kRight));
-  Timeline()->DispatchEvent(PointerEvent::Create("pointerup", init));
+  Timeline()->DispatchEvent(*PointerEvent::Create("pointerup", init));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -108,11 +108,11 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
 
   PointerEventInit init = GetValidPointerEventInit();
   init.setIsPrimary(false);
-  Timeline()->DispatchEvent(PointerEvent::Create("pointerup", init));
+  Timeline()->DispatchEvent(*PointerEvent::Create("pointerup", init));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -121,9 +121,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerout", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerout", GetValidPointerEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -132,9 +132,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointermove", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointermove", GetValidPointerEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -143,9 +143,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointercancel", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointercancel", GetValidPointerEventInit()));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -154,7 +154,7 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -163,9 +163,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchend", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchend", GetValidTouchEventInit()));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -174,9 +174,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchcancel", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchcancel", GetValidTouchEventInit()));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -185,9 +185,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("change", GetValidTouchEventInit()));
+      *TouchEvent::Create("change", GetValidTouchEventInit()));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -196,9 +196,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchmove", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchmove", GetValidTouchEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -207,9 +207,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchmove", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchmove", GetValidTouchEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -218,9 +218,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchend", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchend", GetValidTouchEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -229,9 +229,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchcancel", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchcancel", GetValidTouchEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -240,9 +240,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("change", GetValidTouchEventInit()));
+      *TouchEvent::Create("change", GetValidTouchEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -251,9 +251,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerup", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerup", GetValidPointerEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -262,9 +262,9 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointercancel", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointercancel", GetValidPointerEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
@@ -273,11 +273,11 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchend", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchend", GetValidTouchEventInit()));
   EXPECT_FALSE(Video()->paused());
 }
 
@@ -286,11 +286,11 @@
   ASSERT_FALSE(Video()->paused());
 
   Timeline()->DispatchEvent(
-      TouchEvent::Create("touchstart", GetValidTouchEventInit()));
+      *TouchEvent::Create("touchstart", GetValidTouchEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerdown", GetValidPointerEventInit()));
   Timeline()->DispatchEvent(
-      PointerEvent::Create("pointerup", GetValidPointerEventInit()));
+      *PointerEvent::Create("pointerup", GetValidPointerEventInit()));
   EXPECT_TRUE(Video()->paused());
 }
 
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc
index 22e5a52..bd53ac6 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_display_cutout_delegate_test.cc
@@ -119,7 +119,8 @@
   }
 
   void SimulateEvent(TouchEvent* event) {
-    GetVideoElement().FireEventListeners(event);
+    DCHECK(event);
+    GetVideoElement().FireEventListeners(*event);
   }
 
   TouchList* CreateTouchListWithOnePoint(int x, int y) {
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
index 4bd7bae..fb6f02e3 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_impl_test.cc
@@ -43,7 +43,6 @@
 #include "third_party/blink/renderer/platform/testing/empty_web_media_player.h"
 #include "third_party/blink/renderer/platform/testing/histogram_tester.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
-#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 
 // The MediaTimelineWidths histogram suffix expected to be encountered in these
@@ -159,7 +158,7 @@
 }
 
 void SimulateTransitionEnd(Element& element) {
-  element.DispatchEvent(Event::Create(EventTypeNames::transitionend));
+  element.DispatchEvent(*Event::Create(EventTypeNames::transitionend));
 }
 
 // This must match MediaControlDownloadButtonElement::DownloadActionMetrics.
@@ -997,10 +996,13 @@
 namespace {
 
 class MediaControlsImplTestWithMockScheduler : public MediaControlsImplTest {
+ public:
+  MediaControlsImplTestWithMockScheduler() { EnablePlatform(); }
+
  protected:
   void SetUp() override {
     // DocumentParserTiming has DCHECKS to make sure time > 0.0.
-    platform_->AdvanceClockSeconds(1);
+    platform()->AdvanceClockSeconds(1);
 
     MediaControlsImplTest::SetUp();
   }
@@ -1011,9 +1013,6 @@
       return false;
     return style->GetPropertyValue(CSSPropertyCursor) == "none";
   }
-
-  ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
-      platform_;
 };
 
 }  // namespace
@@ -1031,23 +1030,23 @@
   EXPECT_TRUE(IsElementVisible(*panel));
 
   // Tabbing between controls prevents controls from hiding.
-  platform_->RunForPeriodSeconds(2);
-  MediaControls().DispatchEvent(Event::Create("focusin"));
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
+  MediaControls().DispatchEvent(*Event::Create("focusin"));
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 
   // Seeking on the timeline or volume bar prevents controls from hiding.
-  MediaControls().DispatchEvent(Event::Create("input"));
-  platform_->RunForPeriodSeconds(2);
+  MediaControls().DispatchEvent(*Event::Create("input"));
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 
   // Pressing a key prevents controls from hiding.
-  MediaControls().PanelElement()->DispatchEvent(Event::Create("keypress"));
-  platform_->RunForPeriodSeconds(2);
+  MediaControls().PanelElement()->DispatchEvent(*Event::Create("keypress"));
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 
   // Once user interaction stops, controls can hide.
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
   SimulateTransitionEnd(*panel);
   EXPECT_FALSE(IsElementVisible(*panel));
 }
@@ -1063,20 +1062,20 @@
   MediaControls().MediaElement().Play();
 
   // Tabbing into the controls shows the controls and therefore the cursor.
-  MediaControls().DispatchEvent(Event::Create("focusin"));
+  MediaControls().DispatchEvent(*Event::Create("focusin"));
   EXPECT_FALSE(IsCursorHidden());
 
   // Once the controls hide, the cursor is hidden.
-  platform_->RunForPeriodSeconds(4);
+  platform()->RunForPeriodSeconds(4);
   EXPECT_TRUE(IsCursorHidden());
 
   // If the mouse moves, the controls are shown and the cursor is no longer
   // hidden.
-  MediaControls().DispatchEvent(Event::Create("pointermove"));
+  MediaControls().DispatchEvent(*Event::Create("pointermove"));
   EXPECT_FALSE(IsCursorHidden());
 
   // Once the controls hide again, the cursor is hidden again.
-  platform_->RunForPeriodSeconds(4);
+  platform()->RunForPeriodSeconds(4);
   EXPECT_TRUE(IsCursorHidden());
 }
 
@@ -1088,18 +1087,18 @@
   MediaControls().MediaElement().SetSrc("http://example.com");
   MediaControls().MediaElement().Play();
 
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 
   MediaControls().OnAccessibleFocus();
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
   EXPECT_FALSE(IsElementVisible(*panel));
 
   MediaControls().OnAccessibleFocus();
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 }
 
@@ -1112,11 +1111,11 @@
   MediaControls().MediaElement().SetSrc("http://example.com");
   MediaControls().MediaElement().Play();
 
-  platform_->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
   EXPECT_TRUE(IsElementVisible(*panel));
 
   MediaControls().OnAccessibleFocus();
-  platform_->RunForPeriodSeconds(4);
+  platform()->RunForPeriodSeconds(4);
   EXPECT_FALSE(IsElementVisible(*panel));
 
   // Display is none but can't be checked via InlineStyle. Adding checks of this
@@ -1329,7 +1328,7 @@
 
   for (auto* const event_name :
        {"gesturetap", "click", "pointerover", "pointermove"}) {
-    overlay_enclosure->DispatchEvent(Event::Create(event_name));
+    overlay_enclosure->DispatchEvent(*Event::Create(event_name));
     EXPECT_TRUE(IsElementVisible(*cast_overlay_button));
 
     SimulateHideMediaControlsTimerFired();
diff --git a/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc b/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc
index c01ec30..ee2a82d 100644
--- a/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/media_controls_rotate_to_fullscreen_delegate_test.cc
@@ -150,7 +150,7 @@
   }
 
   void DispatchEvent(EventTarget& target, const AtomicString& type) {
-    target.DispatchEvent(Event::Create(type));
+    target.DispatchEvent(*Event::Create(type));
   }
 
   void InitScreenAndVideo(WebScreenOrientationType initial_screen_orientation,
diff --git a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.idl b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.idl
index 8b8f92df..f8e28bb9 100644
--- a/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.idl
+++ b/third_party/blink/renderer/modules/mediacapturefromelement/html_media_element_capture.idl
@@ -5,9 +5,7 @@
 // https://w3c.github.io/mediacapture-fromelement/#html-media-element-media-capture-extensions
 
 [
-    ImplementedAs=HTMLMediaElementCapture,
-    RuntimeEnabled=MediaCaptureFromVideo
+    ImplementedAs=HTMLMediaElementCapture
 ] partial interface HTMLMediaElement {
     [RaisesException, CallWith=ScriptState] MediaStream captureStream();
-    // TODO(mcasas): Implement captureStreamUntilEnded() http://crbug.com/575495.
 };
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc
index 06ae2472..7aaa749 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder.cc
@@ -397,7 +397,7 @@
   events.swap(scheduled_events_);
 
   for (const auto& event : events)
-    DispatchEvent(event);
+    DispatchEvent(*event);
 }
 
 void MediaRecorder::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer.idl b/third_party/blink/renderer/modules/mediasource/source_buffer.idl
index 5c56ebf..bb50fde 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer.idl
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer.idl
@@ -74,7 +74,7 @@
     [RaisesException] void remove(double start, unrestricted double end);
 
     // Explicitly change the container or codecs
-    [RaisesException, RuntimeEnabled=MediaSourceExperimental] void changeType(DOMString type);
+    [RaisesException, Measure, OriginTrialEnabled=MediaSourceChangeType] void changeType(DOMString type);
 
     // Gets or sets the TrackDefaultList this SourceBuffer may consult during
     // the initialization segment algorithm.
diff --git a/third_party/blink/renderer/modules/mediastream/BUILD.gn b/third_party/blink/renderer/modules/mediastream/BUILD.gn
index eac66d3..0503186 100644
--- a/third_party/blink/renderer/modules/mediastream/BUILD.gn
+++ b/third_party/blink/renderer/modules/mediastream/BUILD.gn
@@ -30,6 +30,8 @@
     "media_stream_track_content_hint.h",
     "media_stream_track_event.cc",
     "media_stream_track_event.h",
+    "navigator_display_media.cc",
+    "navigator_display_media.h",
     "navigator_media_stream.cc",
     "navigator_media_stream.h",
     "navigator_user_media.cc",
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.cc b/third_party/blink/renderer/modules/mediastream/media_devices.cc
index 0d83576..03a93fb8 100644
--- a/third_party/blink/renderer/modules/mediastream/media_devices.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_devices.cc
@@ -20,7 +20,6 @@
 #include "third_party/blink/renderer/modules/mediastream/media_stream_constraints.h"
 #include "third_party/blink/renderer/modules/mediastream/navigator_media_stream.h"
 #include "third_party/blink/renderer/modules/mediastream/user_media_controller.h"
-#include "third_party/blink/renderer/modules/mediastream/user_media_request.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -105,6 +104,16 @@
 ScriptPromise MediaDevices::getUserMedia(ScriptState* script_state,
                                          const MediaStreamConstraints& options,
                                          ExceptionState& exception_state) {
+  return SendUserMediaRequest(script_state,
+                              WebUserMediaRequest::MediaType::kUserMedia,
+                              options, exception_state);
+}
+
+ScriptPromise MediaDevices::SendUserMediaRequest(
+    ScriptState* script_state,
+    WebUserMediaRequest::MediaType media_type,
+    const MediaStreamConstraints& options,
+    ExceptionState& exception_state) {
   ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
   PromiseResolverCallbacks* callbacks =
       PromiseResolverCallbacks::Create(resolver);
@@ -121,7 +130,7 @@
 
   MediaErrorState error_state;
   UserMediaRequest* request = UserMediaRequest::Create(
-      document, user_media, options, callbacks, error_state);
+      document, user_media, media_type, options, callbacks, error_state);
   if (!request) {
     DCHECK(error_state.HadException());
     if (error_state.CanGenerateException()) {
@@ -224,7 +233,7 @@
   events.swap(scheduled_events_);
 
   for (const auto& event : events)
-    DispatchEvent(event);
+    DispatchEvent(*event);
 }
 
 void MediaDevices::StartObserving() {
diff --git a/third_party/blink/renderer/modules/mediastream/media_devices.h b/third_party/blink/renderer/modules/mediastream/media_devices.h
index 00171c2..b8a99e5e3 100644
--- a/third_party/blink/renderer/modules/mediastream/media_devices.h
+++ b/third_party/blink/renderer/modules/mediastream/media_devices.h
@@ -13,6 +13,7 @@
 #include "third_party/blink/renderer/core/dom/pausable_object.h"
 #include "third_party/blink/renderer/modules/event_target_modules.h"
 #include "third_party/blink/renderer/modules/mediastream/media_device_info.h"
+#include "third_party/blink/renderer/modules/mediastream/user_media_request.h"
 #include "third_party/blink/renderer/modules/modules_export.h"
 #include "third_party/blink/renderer/platform/async_method_runner.h"
 #include "third_party/blink/renderer/platform/heap/heap_allocator.h"
@@ -44,6 +45,10 @@
   ScriptPromise getUserMedia(ScriptState*,
                              const MediaStreamConstraints&,
                              ExceptionState&);
+  ScriptPromise SendUserMediaRequest(ScriptState*,
+                                     WebUserMediaRequest::MediaType,
+                                     const MediaStreamConstraints&,
+                                     ExceptionState&);
 
   // EventTarget overrides.
   const AtomicString& InterfaceName() const override;
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream.cc b/third_party/blink/renderer/modules/mediastream/media_stream.cc
index 99bea50..d48dfc7 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream.cc
@@ -492,7 +492,7 @@
 
   HeapVector<Member<Event>>::iterator it = events.begin();
   for (; it != events.end(); ++it)
-    DispatchEvent((*it).Release());
+    DispatchEvent(*it->Release());
 
   events.clear();
 }
diff --git a/third_party/blink/renderer/modules/mediastream/media_stream_track.cc b/third_party/blink/renderer/modules/mediastream/media_stream_track.cc
index 3f8ac81..666ef98 100644
--- a/third_party/blink/renderer/modules/mediastream/media_stream_track.cc
+++ b/third_party/blink/renderer/modules/mediastream/media_stream_track.cc
@@ -581,14 +581,14 @@
   switch (ready_state_) {
     case MediaStreamSource::kReadyStateLive:
       component_->SetMuted(false);
-      DispatchEvent(Event::Create(EventTypeNames::unmute));
+      DispatchEvent(*Event::Create(EventTypeNames::unmute));
       break;
     case MediaStreamSource::kReadyStateMuted:
       component_->SetMuted(true);
-      DispatchEvent(Event::Create(EventTypeNames::mute));
+      DispatchEvent(*Event::Create(EventTypeNames::mute));
       break;
     case MediaStreamSource::kReadyStateEnded:
-      DispatchEvent(Event::Create(EventTypeNames::ended));
+      DispatchEvent(*Event::Create(EventTypeNames::ended));
       PropagateTrackEnded();
       break;
   }
diff --git a/third_party/blink/renderer/modules/mediastream/navigator_display_media.cc b/third_party/blink/renderer/modules/mediastream/navigator_display_media.cc
new file mode 100644
index 0000000..a78d87f
--- /dev/null
+++ b/third_party/blink/renderer/modules/mediastream/navigator_display_media.cc
@@ -0,0 +1,33 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/modules/mediastream/navigator_display_media.h"
+
+#include "third_party/blink/public/platform/platform.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
+#include "third_party/blink/renderer/core/dom/dom_exception.h"
+#include "third_party/blink/renderer/modules/mediastream/media_devices.h"
+#include "third_party/blink/renderer/modules/mediastream/navigator_user_media.h"
+
+namespace blink {
+
+ScriptPromise NavigatorDisplayMedia::getDisplayMedia(
+    ScriptState* script_state,
+    Navigator& navigator,
+    const MediaStreamConstraints& options,
+    ExceptionState& exception_state) {
+  MediaDevices* const media_devices =
+      NavigatorUserMedia::mediaDevices(navigator);
+  if (!media_devices) {
+    return ScriptPromise::RejectWithDOMException(
+        script_state, DOMException::Create(DOMExceptionCode::kNotSupportedError,
+                                           "Current frame is detached."));
+  }
+
+  return media_devices->SendUserMediaRequest(
+      script_state, WebUserMediaRequest::MediaType::kDisplayMedia, options,
+      exception_state);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediastream/navigator_display_media.h b/third_party/blink/renderer/modules/mediastream/navigator_display_media.h
new file mode 100644
index 0000000..ab22babc
--- /dev/null
+++ b/third_party/blink/renderer/modules/mediastream/navigator_display_media.h
@@ -0,0 +1,31 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_NAVIGATOR_DISPLAY_MEDIA_H_
+#define THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_NAVIGATOR_DISPLAY_MEDIA_H_
+
+#include "third_party/blink/renderer/platform/wtf/allocator.h"
+
+#include "third_party/blink/renderer/core/frame/navigator.h"
+
+namespace blink {
+
+class ExceptionState;
+class MediaStreamConstraints;
+class ScriptPromise;
+class ScriptState;
+
+class NavigatorDisplayMedia {
+  STATIC_ONLY(NavigatorDisplayMedia);
+
+ public:
+  static ScriptPromise getDisplayMedia(ScriptState*,
+                                       Navigator&,
+                                       const MediaStreamConstraints&,
+                                       ExceptionState&);
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_MEDIASTREAM_NAVIGATOR_DISPLAY_MEDIA_H_
diff --git a/third_party/blink/renderer/modules/mediastream/navigator_display_media.idl b/third_party/blink/renderer/modules/mediastream/navigator_display_media.idl
new file mode 100644
index 0000000..8afdc7e
--- /dev/null
+++ b/third_party/blink/renderer/modules/mediastream/navigator_display_media.idl
@@ -0,0 +1,12 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://w3c.github.io/mediacapture-screen-share/
+[
+    ImplementedAs = NavigatorDisplayMedia,
+    RuntimeEnabled = GetDisplayMedia
+] partial interface Navigator {
+    [CallWith = ScriptState, RaisesException] Promise<MediaStream>
+    getDisplayMedia(optional MediaStreamConstraints constraints);
+};
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_client.cc b/third_party/blink/renderer/modules/mediastream/user_media_client.cc
index 2d82433..4573ac2 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_client.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_client.cc
@@ -44,12 +44,14 @@
     : client_(client) {}
 
 void UserMediaClient::RequestUserMedia(UserMediaRequest* request) {
-  if (client_) {
+  // TODO(emircan): Hook up kDisplayMedia calls.
+  if (client_ && request->MediaRequestType() !=
+                     WebUserMediaRequest::MediaType::kDisplayMedia) {
     client_->RequestUserMedia(request);
-  } else {
-    request->Fail(WebUserMediaRequest::Error::kNotSupported,
-                  "User Media support is disabled");
+    return;
   }
+  request->Fail(WebUserMediaRequest::Error::kNotSupported,
+                "User Media support is disabled");
 }
 
 void UserMediaClient::CancelUserMediaRequest(UserMediaRequest* request) {
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.cc b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
index 71c2aa7..d145864 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_request.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_request.cc
@@ -362,6 +362,7 @@
 UserMediaRequest* UserMediaRequest::Create(
     ExecutionContext* context,
     UserMediaController* controller,
+    WebUserMediaRequest::MediaType media_type,
     const MediaStreamConstraints& options,
     Callbacks* callbacks,
     MediaErrorState& error_state) {
@@ -375,10 +376,17 @@
   if (error_state.HadException())
     return nullptr;
 
-  if (audio.IsNull() && video.IsNull()) {
-    error_state.ThrowTypeError(
-        "At least one of audio and video must be requested");
-    return nullptr;
+  switch (media_type) {
+    case WebUserMediaRequest::MediaType::kUserMedia: {
+      if (audio.IsNull() && video.IsNull()) {
+        error_state.ThrowTypeError(
+            "At least one of audio and video must be requested");
+        return nullptr;
+      }
+      break;
+    }
+    case WebUserMediaRequest::MediaType::kDisplayMedia:
+      break;
   }
 
   if (!audio.IsNull())
@@ -386,7 +394,8 @@
   if (!video.IsNull())
     CountVideoConstraintUses(context, video);
 
-  return new UserMediaRequest(context, controller, audio, video, callbacks);
+  return new UserMediaRequest(context, controller, media_type, audio, video,
+                              callbacks);
 }
 
 UserMediaRequest* UserMediaRequest::Create(
@@ -396,23 +405,27 @@
     V8NavigatorUserMediaSuccessCallback* success_callback,
     V8NavigatorUserMediaErrorCallback* error_callback,
     MediaErrorState& error_state) {
-  return Create(context, controller, options,
-                V8Callbacks::Create(success_callback, error_callback),
+  return Create(context, controller, WebUserMediaRequest::MediaType::kUserMedia,
+                options, V8Callbacks::Create(success_callback, error_callback),
                 error_state);
 }
 
 UserMediaRequest* UserMediaRequest::CreateForTesting(
     const WebMediaConstraints& audio,
     const WebMediaConstraints& video) {
-  return new UserMediaRequest(nullptr, nullptr, audio, video, nullptr);
+  return new UserMediaRequest(nullptr, nullptr,
+                              WebUserMediaRequest::MediaType::kUserMedia, audio,
+                              video, nullptr);
 }
 
 UserMediaRequest::UserMediaRequest(ExecutionContext* context,
                                    UserMediaController* controller,
+                                   WebUserMediaRequest::MediaType media_type,
                                    WebMediaConstraints audio,
                                    WebMediaConstraints video,
                                    Callbacks* callbacks)
     : ContextLifecycleObserver(context),
+      media_type_(media_type),
       audio_(audio),
       video_(video),
       should_disable_hardware_noise_suppression_(
@@ -432,6 +445,10 @@
 
 UserMediaRequest::~UserMediaRequest() = default;
 
+WebUserMediaRequest::MediaType UserMediaRequest::MediaRequestType() const {
+  return media_type_;
+}
+
 bool UserMediaRequest::Audio() const {
   return !audio_.IsNull();
 }
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_request.h b/third_party/blink/renderer/modules/mediastream/user_media_request.h
index 21c2f14..4809285 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_request.h
+++ b/third_party/blink/renderer/modules/mediastream/user_media_request.h
@@ -73,6 +73,7 @@
 
   static UserMediaRequest* Create(ExecutionContext*,
                                   UserMediaController*,
+                                  WebUserMediaRequest::MediaType media_type,
                                   const MediaStreamConstraints& options,
                                   Callbacks*,
                                   MediaErrorState&);
@@ -94,6 +95,7 @@
   void FailConstraint(const String& constraint_name, const String& message);
   void Fail(WebUserMediaRequest::Error name, const String& message);
 
+  WebUserMediaRequest::MediaType MediaRequestType() const;
   bool Audio() const;
   bool Video() const;
   WebMediaConstraints AudioConstraints() const;
@@ -115,10 +117,12 @@
  private:
   UserMediaRequest(ExecutionContext*,
                    UserMediaController*,
+                   WebUserMediaRequest::MediaType media_type,
                    WebMediaConstraints audio,
                    WebMediaConstraints video,
                    Callbacks*);
 
+  WebUserMediaRequest::MediaType media_type_;
   WebMediaConstraints audio_;
   WebMediaConstraints video_;
   bool should_disable_hardware_noise_suppression_;
diff --git a/third_party/blink/renderer/modules/modules_idl_files.gni b/third_party/blink/renderer/modules/modules_idl_files.gni
index d073108e..0eae7b43 100644
--- a/third_party/blink/renderer/modules/modules_idl_files.gni
+++ b/third_party/blink/renderer/modules/modules_idl_files.gni
@@ -737,6 +737,7 @@
           "mediasource/html_video_element_media_source.idl",
           "mediasource/url_media_source.idl",
           "mediastream/media_stream_track_content_hint.idl",
+          "mediastream/navigator_display_media.idl",
           "mediastream/navigator_media_stream.idl",
           "mediastream/navigator_user_media.idl",
           "mediastream/url_media_stream.idl",
diff --git a/third_party/blink/renderer/modules/netinfo/network_information.cc b/third_party/blink/renderer/modules/netinfo/network_information.cc
index 1e4fd25..127db758 100644
--- a/third_party/blink/renderer/modules/netinfo/network_information.cc
+++ b/third_party/blink/renderer/modules/netinfo/network_information.cc
@@ -177,8 +177,8 @@
   save_data_ = save_data;
 
   if (type_changed)
-    DispatchEvent(Event::Create(EventTypeNames::typechange));
-  DispatchEvent(Event::Create(EventTypeNames::change));
+    DispatchEvent(*Event::Create(EventTypeNames::typechange));
+  DispatchEvent(*Event::Create(EventTypeNames::change));
 }
 
 const AtomicString& NetworkInformation::InterfaceName() const {
diff --git a/third_party/blink/renderer/modules/notifications/OWNERS b/third_party/blink/renderer/modules/notifications/OWNERS
index f3d5fb2..2fd0e4b 100644
--- a/third_party/blink/renderer/modules/notifications/OWNERS
+++ b/third_party/blink/renderer/modules/notifications/OWNERS
@@ -1,4 +1,3 @@
-awdf@chromium.org
 peter@chromium.org
 
 # TEAM: platform-capabilities@chromium.org
diff --git a/third_party/blink/renderer/modules/notifications/notification.cc b/third_party/blink/renderer/modules/notifications/notification.cc
index 7dc85ef..c46ab76 100644
--- a/third_party/blink/renderer/modules/notifications/notification.cc
+++ b/third_party/blink/renderer/modules/notifications/notification.cc
@@ -225,7 +225,7 @@
 }
 
 void Notification::OnShow() {
-  DispatchEvent(Event::Create(EventTypeNames::show));
+  DispatchEvent(*Event::Create(EventTypeNames::show));
 }
 
 void Notification::OnClick(OnClickCallback completed_closure) {
@@ -235,7 +235,7 @@
       Frame::NotifyUserActivation(document ? document->GetFrame() : nullptr,
                                   UserGestureToken::kNewGesture);
   ScopedWindowFocusAllowedIndicator window_focus_allowed(GetExecutionContext());
-  DispatchEvent(Event::Create(EventTypeNames::click));
+  DispatchEvent(*Event::Create(EventTypeNames::click));
 
   std::move(completed_closure).Run();
 }
@@ -245,13 +245,13 @@
   // should be Closing if the developer initiated the close.
   if (state_ == State::kShowing || state_ == State::kClosing) {
     state_ = State::kClosed;
-    DispatchEvent(Event::Create(EventTypeNames::close));
+    DispatchEvent(*Event::Create(EventTypeNames::close));
   }
   std::move(completed_closure).Run();
 }
 
 void Notification::DispatchErrorEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::error));
+  DispatchEvent(*Event::Create(EventTypeNames::error));
 }
 
 String Notification::title() const {
@@ -437,7 +437,7 @@
   return kWebNotificationMaxActions;
 }
 
-DispatchEventResult Notification::DispatchEventInternal(Event* event) {
+DispatchEventResult Notification::DispatchEventInternal(Event& event) {
   DCHECK(GetExecutionContext()->IsContextThread());
   return EventTarget::DispatchEventInternal(event);
 }
diff --git a/third_party/blink/renderer/modules/notifications/notification.h b/third_party/blink/renderer/modules/notifications/notification.h
index 879da4f..98bf0c86 100644
--- a/third_party/blink/renderer/modules/notifications/notification.h
+++ b/third_party/blink/renderer/modules/notifications/notification.h
@@ -135,7 +135,7 @@
 
  protected:
   // EventTarget interface.
-  DispatchEventResult DispatchEventInternal(Event* event) final;
+  DispatchEventResult DispatchEventInternal(Event& event) final;
 
  private:
   // The type of notification this instance represents. Non-persistent
diff --git a/third_party/blink/renderer/modules/notifications/notification_image_loader_test.cc b/third_party/blink/renderer/modules/notifications/notification_image_loader_test.cc
index e4654d0d..1495b7f 100644
--- a/third_party/blink/renderer/modules/notifications/notification_image_loader_test.cc
+++ b/third_party/blink/renderer/modules/notifications/notification_image_loader_test.cc
@@ -11,7 +11,6 @@
 #include "third_party/blink/renderer/core/testing/page_test_base.h"
 #include "third_party/blink/renderer/platform/loader/fetch/memory_cache.h"
 #include "third_party/blink/renderer/platform/testing/histogram_tester.h"
-#include "third_party/blink/renderer/platform/testing/testing_platform_support_with_mock_scheduler.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 #include "third_party/blink/renderer/platform/testing/url_test_helpers.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
@@ -40,11 +39,13 @@
          // use.
         loader_(
             new NotificationImageLoader(NotificationImageLoader::Type::kIcon)) {
+    EnablePlatform();
   }
 
   ~NotificationImageLoaderTest() override {
     loader_->Stop();
-    platform_->GetURLLoaderMockFactory()
+    platform()
+        ->GetURLLoaderMockFactory()
         ->UnregisterAllURLsAndClearMemoryCache();
   }
 
@@ -80,7 +81,6 @@
 
  protected:
   HistogramTester histogram_tester_;
-  ScopedTestingPlatformSupport<TestingPlatformSupport> platform_;
 
  private:
   Persistent<NotificationImageLoader> loader_;
@@ -93,7 +93,7 @@
   histogram_tester_.ExpectTotalCount("Notifications.LoadFinishTime.Icon", 0);
   histogram_tester_.ExpectTotalCount("Notifications.LoadFileSize.Icon", 0);
   histogram_tester_.ExpectTotalCount("Notifications.LoadFailTime.Icon", 0);
-  platform_->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
+  platform()->GetURLLoaderMockFactory()->ServeAsynchronousRequests();
   EXPECT_EQ(NotificationLoadState::kLoadSuccessful, Loaded());
   histogram_tester_.ExpectTotalCount("Notifications.LoadFinishTime.Icon", 1);
   histogram_tester_.ExpectUniqueSample("Notifications.LoadFileSize.Icon", 7439,
@@ -102,9 +102,6 @@
 }
 
 TEST_F(NotificationImageLoaderTest, TimeoutTest) {
-  ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
-      platform;
-
   // To test for a timeout, this needs to override the clock in the platform.
   // Just creating the mock platform will do everything to set it up.
   KURL url = RegisterMockedURL(kNotificationImageLoaderIcon500x500);
@@ -112,14 +109,14 @@
 
   // Run the platform for kImageFetchTimeoutInMs-1 seconds. This should not
   // result in a timeout.
-  platform->RunForPeriodSeconds(kImageFetchTimeoutInMs / 1000 - 1);
+  platform()->RunForPeriodSeconds(kImageFetchTimeoutInMs / 1000 - 1);
   EXPECT_EQ(NotificationLoadState::kNotLoaded, Loaded());
   histogram_tester_.ExpectTotalCount("Notifications.LoadFinishTime.Icon", 0);
   histogram_tester_.ExpectTotalCount("Notifications.LoadFileSize.Icon", 0);
   histogram_tester_.ExpectTotalCount("Notifications.LoadFailTime.Icon", 0);
 
   // Now advance time until a timeout should be expected.
-  platform->RunForPeriodSeconds(2);
+  platform()->RunForPeriodSeconds(2);
 
   // If the loader times out, it calls the callback and returns an empty bitmap.
   EXPECT_EQ(NotificationLoadState::kLoadFailed, Loaded());
diff --git a/third_party/blink/renderer/modules/payments/payment_request.cc b/third_party/blink/renderer/modules/payments/payment_request.cc
index cf08c83..487384a 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.cc
+++ b/third_party/blink/renderer/modules/payments/payment_request.cc
@@ -776,7 +776,7 @@
 PaymentRequest::~PaymentRequest() = default;
 
 ScriptPromise PaymentRequest::show(ScriptState* script_state) {
-  if (!payment_provider_.is_bound() || show_resolver_) {
+  if (!payment_provider_.is_bound() || accept_resolver_) {
     return ScriptPromise::RejectWithDOMException(
         script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
                                            "Already called show() once"));
@@ -807,8 +807,8 @@
 
   payment_provider_->Show(is_user_gesture);
 
-  show_resolver_ = ScriptPromiseResolver::Create(script_state);
-  return show_resolver_->Promise();
+  accept_resolver_ = ScriptPromiseResolver::Create(script_state);
+  return accept_resolver_->Promise();
 }
 
 ScriptPromise PaymentRequest::abort(ScriptState* script_state) {
@@ -826,7 +826,7 @@
                              "has resolved or rejected"));
   }
 
-  if (!show_resolver_ && !retry_resolver_) {
+  if (!GetPendingAcceptPromiseResolver()) {
     return ScriptPromise::RejectWithDOMException(
         script_state,
         DOMException::Create(
@@ -840,7 +840,7 @@
 }
 
 ScriptPromise PaymentRequest::canMakePayment(ScriptState* script_state) {
-  if (!payment_provider_.is_bound() || show_resolver_ || retry_resolver_ ||
+  if (!payment_provider_.is_bound() || GetPendingAcceptPromiseResolver() ||
       can_make_payment_resolver_ || !script_state->ContextIsValid()) {
     return ScriptPromise::RejectWithDOMException(
         script_state, DOMException::Create(DOMExceptionCode::kInvalidStateError,
@@ -854,7 +854,7 @@
 }
 
 bool PaymentRequest::HasPendingActivity() const {
-  return show_resolver_ || retry_resolver_ || complete_resolver_;
+  return GetPendingAcceptPromiseResolver() || complete_resolver_;
 }
 
 const AtomicString& PaymentRequest::InterfaceName() const {
@@ -1019,7 +1019,7 @@
   visitor->Trace(options_);
   visitor->Trace(shipping_address_);
   visitor->Trace(payment_response_);
-  visitor->Trace(show_resolver_);
+  visitor->Trace(accept_resolver_);
   visitor->Trace(retry_resolver_);
   visitor->Trace(complete_resolver_);
   visitor->Trace(abort_resolver_);
@@ -1122,7 +1122,7 @@
       GetExecutionContext(), EventTypeNames::shippingaddresschange);
   event->SetTarget(this);
   event->SetPaymentDetailsUpdater(this);
-  DispatchEvent(event);
+  DispatchEvent(*event);
   if (!event->is_waiting_for_update()) {
     GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create(
         kJSMessageSource, kWarningMessageLevel,
@@ -1141,7 +1141,7 @@
       GetExecutionContext(), EventTypeNames::shippingoptionchange);
   event->SetTarget(this);
   event->SetPaymentDetailsUpdater(this);
-  DispatchEvent(event);
+  DispatchEvent(*event);
   if (!event->is_waiting_for_update()) {
     GetExecutionContext()->AddConsoleMessage(ConsoleMessage::Create(
         kJSMessageSource, kWarningMessageLevel,
@@ -1205,15 +1205,15 @@
     // PaymentResponse::complete(String), which will be forwarded over the mojo
     // connection to display a success or failure message to the user.
     retry_resolver_.Clear();
-  } else if (show_resolver_) {
+  } else if (accept_resolver_) {
     payment_response_ = new PaymentResponse(std::move(response),
                                             shipping_address_.Get(), this, id_);
-    show_resolver_->Resolve(payment_response_);
+    accept_resolver_->Resolve(payment_response_);
 
     // Do not close the mojo connection here. The merchant website should call
     // PaymentResponse::complete(String), which will be forwarded over the mojo
     // connection to display a success or failure message to the user.
-    show_resolver_.Clear();
+    accept_resolver_.Clear();
   }
 }
 
@@ -1291,7 +1291,7 @@
 
 void PaymentRequest::OnAbort(bool aborted_successfully) {
   DCHECK(abort_resolver_);
-  DCHECK(show_resolver_ || retry_resolver_);
+  DCHECK(GetPendingAcceptPromiseResolver());
 
   if (!aborted_successfully) {
     abort_resolver_->Reject(DOMException::Create(
@@ -1351,7 +1351,7 @@
 void PaymentRequest::ClearResolversAndCloseMojoConnection() {
   complete_timer_.Stop();
   complete_resolver_.Clear();
-  show_resolver_.Clear();
+  accept_resolver_.Clear();
   retry_resolver_.Clear();
   abort_resolver_.Clear();
   can_make_payment_resolver_.Clear();
@@ -1360,8 +1360,8 @@
   payment_provider_.reset();
 }
 
-ScriptPromiseResolver* PaymentRequest::GetPendingAcceptPromiseResolver() {
-  return retry_resolver_ ? retry_resolver_.Get() : show_resolver_.Get();
+ScriptPromiseResolver* PaymentRequest::GetPendingAcceptPromiseResolver() const {
+  return retry_resolver_ ? retry_resolver_.Get() : accept_resolver_.Get();
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/payments/payment_request.h b/third_party/blink/renderer/modules/payments/payment_request.h
index 04f7b98a..e532388 100644
--- a/third_party/blink/renderer/modules/payments/payment_request.h
+++ b/third_party/blink/renderer/modules/payments/payment_request.h
@@ -133,7 +133,7 @@
   // be resolved if the user accepts or aborts the payment request.
   // The pending promise can be [[acceptPromise]] or [[retryPromise]] in the
   // spec.
-  ScriptPromiseResolver* GetPendingAcceptPromiseResolver();
+  ScriptPromiseResolver* GetPendingAcceptPromiseResolver() const;
 
   PaymentOptions options_;
   Member<PaymentAddress> shipping_address_;
@@ -142,7 +142,7 @@
   String shipping_option_;
   String shipping_type_;
   HashSet<String> method_names_;
-  Member<ScriptPromiseResolver> show_resolver_;
+  Member<ScriptPromiseResolver> accept_resolver_;
   Member<ScriptPromiseResolver> complete_resolver_;
   Member<ScriptPromiseResolver> retry_resolver_;
   Member<ScriptPromiseResolver> abort_resolver_;
diff --git a/third_party/blink/renderer/modules/peerconnection/DEPS b/third_party/blink/renderer/modules/peerconnection/DEPS
index 35eb7040..1e08706b 100644
--- a/third_party/blink/renderer/modules/peerconnection/DEPS
+++ b/third_party/blink/renderer/modules/peerconnection/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+    "+services/metrics/public/cpp/ukm_builders.h",
     "-third_party/blink/renderer/modules",
     "+third_party/blink/renderer/modules/crypto",
     "+third_party/blink/renderer/modules/event_modules.h",
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
index b68c03908..2c89785 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_data_channel.cc
@@ -373,7 +373,7 @@
 
   HeapVector<Member<Event>>::iterator it = events.begin();
   for (; it != events.end(); ++it)
-    DispatchEvent((*it).Release());
+    DispatchEvent(*it->Release());
 
   events.clear();
 }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc b/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
index 0e47b722..8f44593 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_dtmf_sender.cc
@@ -164,7 +164,7 @@
 
   HeapVector<Member<Event>>::iterator it = events.begin();
   for (; it != events.end(); ++it)
-    DispatchEvent((*it).Release());
+    DispatchEvent(*it->Release());
 }
 
 void RTCDTMFSender::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index 1506e6e..35f5af9 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -37,6 +37,7 @@
 
 #include "base/memory/ptr_util.h"
 #include "base/optional.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/public/platform/web_crypto_algorithm_params.h"
@@ -249,11 +250,12 @@
   Persistent<ScriptPromiseResolver> resolver_;
 };
 
-WebRTCIceTransportPolicy IceTransportPolicyFromString(const String& policy) {
+webrtc::PeerConnectionInterface::IceTransportsType IceTransportPolicyFromString(
+    const String& policy) {
   if (policy == "relay")
-    return WebRTCIceTransportPolicy::kRelay;
+    return webrtc::PeerConnectionInterface::kRelay;
   DCHECK_EQ(policy, "all");
-  return WebRTCIceTransportPolicy::kAll;
+  return webrtc::PeerConnectionInterface::kAll;
 }
 
 WebRTCConfiguration ParseConfiguration(ExecutionContext* context,
@@ -261,56 +263,47 @@
                                        ExceptionState& exception_state) {
   DCHECK(context);
 
-  WebRTCIceTransportPolicy ice_transport_policy =
-      WebRTCIceTransportPolicy::kAll;
+  WebRTCConfiguration web_configuration;
+
   if (configuration.hasIceTransportPolicy()) {
     UseCounter::Count(context, WebFeature::kRTCConfigurationIceTransportPolicy);
-    ice_transport_policy =
+    web_configuration.ice_transport_policy =
         IceTransportPolicyFromString(configuration.iceTransportPolicy());
   } else if (configuration.hasIceTransports()) {
     UseCounter::Count(context, WebFeature::kRTCConfigurationIceTransports);
-    ice_transport_policy =
+    web_configuration.ice_transport_policy =
         IceTransportPolicyFromString(configuration.iceTransports());
   }
 
-  WebRTCBundlePolicy bundle_policy = WebRTCBundlePolicy::kBalanced;
-  String bundle_policy_string = configuration.bundlePolicy();
-  if (bundle_policy_string == "max-compat") {
-    bundle_policy = WebRTCBundlePolicy::kMaxCompat;
-  } else if (bundle_policy_string == "max-bundle") {
-    bundle_policy = WebRTCBundlePolicy::kMaxBundle;
+  if (configuration.bundlePolicy() == "max-compat") {
+    web_configuration.bundle_policy =
+        webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat;
+  } else if (configuration.bundlePolicy() == "max-bundle") {
+    web_configuration.bundle_policy =
+        webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle;
   } else {
-    DCHECK_EQ(bundle_policy_string, "balanced");
+    DCHECK_EQ(configuration.bundlePolicy(), "balanced");
   }
 
-  WebRTCRtcpMuxPolicy rtcp_mux_policy = WebRTCRtcpMuxPolicy::kRequire;
-  String rtcp_mux_policy_string = configuration.rtcpMuxPolicy();
-  if (rtcp_mux_policy_string == "negotiate") {
-    rtcp_mux_policy = WebRTCRtcpMuxPolicy::kNegotiate;
+  if (configuration.rtcpMuxPolicy() == "negotiate") {
+    web_configuration.rtcp_mux_policy =
+        webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
     Deprecation::CountDeprecation(context, WebFeature::kRtcpMuxPolicyNegotiate);
   } else {
-    DCHECK_EQ(rtcp_mux_policy_string, "require");
+    DCHECK_EQ(configuration.rtcpMuxPolicy(), "require");
   }
 
-  WebRTCSdpSemantics sdp_semantics = WebRTCSdpSemantics::kDefault;
   if (configuration.hasSdpSemantics()) {
-    String sdp_semantics_string = configuration.sdpSemantics();
-    if (sdp_semantics_string == "plan-b") {
-      sdp_semantics = WebRTCSdpSemantics::kPlanB;
+    if (configuration.sdpSemantics() == "plan-b") {
+      web_configuration.sdp_semantics = WebRTCSdpSemantics::kPlanB;
     } else {
-      DCHECK_EQ(sdp_semantics_string, "unified-plan");
-      sdp_semantics = WebRTCSdpSemantics::kUnifiedPlan;
+      DCHECK_EQ(configuration.sdpSemantics(), "unified-plan");
+      web_configuration.sdp_semantics = WebRTCSdpSemantics::kUnifiedPlan;
     }
   }
 
-  WebRTCConfiguration web_configuration;
-  web_configuration.ice_transport_policy = ice_transport_policy;
-  web_configuration.bundle_policy = bundle_policy;
-  web_configuration.rtcp_mux_policy = rtcp_mux_policy;
-  web_configuration.sdp_semantics = sdp_semantics;
-
   if (configuration.hasIceServers()) {
-    Vector<WebRTCIceServer> ice_servers;
+    std::vector<webrtc::PeerConnectionInterface::IceServer> ice_servers;
     for (const RTCIceServer& ice_server : configuration.iceServers()) {
       Vector<String> url_strings;
       if (ice_server.hasURLs()) {
@@ -358,7 +351,11 @@
               "required when the URL scheme is "
               "\"turn\" or \"turns\".");
         }
-        ice_servers.push_back(WebRTCIceServer{url, username, credential});
+        ice_servers.emplace_back();
+        auto& converted_ice_server = ice_servers.back();
+        converted_ice_server.urls.push_back(WebString(url).Utf8());
+        converted_ice_server.username = WebString(username).Utf8();
+        converted_ice_server.password = WebString(credential).Utf8();
       }
     }
     web_configuration.ice_servers = ice_servers;
@@ -1930,7 +1927,7 @@
   if (!negotiation_needed_ || closed_)
     return;
   negotiation_needed_ = false;
-  DispatchEvent(Event::Create(EventTypeNames::negotiationneeded));
+  DispatchEvent(*Event::Create(EventTypeNames::negotiationneeded));
 }
 
 void RTCPeerConnection::DidGenerateICECandidate(
@@ -2191,6 +2188,14 @@
   has_data_channels_ = true;
 }
 
+void RTCPeerConnection::DidNoteInterestingUsage(int usage_pattern) {
+  Document* document = ToDocument(GetExecutionContext());
+  ukm::SourceId source_id = document->UkmSourceID();
+  ukm::builders::WebRTC_AddressHarvesting(source_id)
+      .SetUsagePattern(usage_pattern)
+      .Record(document->UkmRecorder());
+}
+
 void RTCPeerConnection::ReleasePeerConnectionHandler() {
   if (stopped_)
     return;
@@ -2242,7 +2247,7 @@
     signaling_state_ = signaling_state;
     Event* event = Event::Create(EventTypeNames::signalingstatechange);
     if (dispatch_event_immediately)
-      DispatchEvent(event);
+      DispatchEvent(*event);
     else
       ScheduleDispatchEvent(event);
   }
@@ -2338,7 +2343,7 @@
   HeapVector<Member<EventWrapper>>::iterator it = events.begin();
   for (; it != events.end(); ++it) {
     if ((*it)->Setup()) {
-      DispatchEvent((*it)->event_.Release());
+      DispatchEvent(*(*it)->event_.Release());
     }
   }
 
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h
index 0c170bb7..e055c8f 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.h
@@ -234,6 +234,7 @@
   void DidModifyTransceivers(std::vector<std::unique_ptr<WebRTCRtpTransceiver>>,
                              bool is_remote_description) override;
   void DidAddRemoteDataChannel(WebRTCDataChannelHandler*) override;
+  void DidNoteInterestingUsage(int usage_pattern) override;
   void ReleasePeerConnectionHandler() override;
   void ClosePeerConnection() override;
 
diff --git a/third_party/blink/renderer/modules/permissions/permission_status.cc b/third_party/blink/renderer/modules/permissions/permission_status.cc
index 1a7178b..ca9bfea 100644
--- a/third_party/blink/renderer/modules/permissions/permission_status.cc
+++ b/third_party/blink/renderer/modules/permissions/permission_status.cc
@@ -106,7 +106,7 @@
     return;
 
   status_ = status;
-  DispatchEvent(Event::Create(EventTypeNames::change));
+  DispatchEvent(*Event::Create(EventTypeNames::change));
 }
 
 void PermissionStatus::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
index 8a54faa..00e759b 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_controller_impl.cc
@@ -118,7 +118,7 @@
   picture_in_picture_element_->OnEnteredPictureInPicture();
 
   picture_in_picture_element_->DispatchEvent(
-      Event::CreateBubble(EventTypeNames::enterpictureinpicture));
+      *Event::CreateBubble(EventTypeNames::enterpictureinpicture));
 
   // Closes the current Picture-in-Picture window if any.
   if (picture_in_picture_window_)
@@ -160,7 +160,7 @@
 
     element->OnExitedPictureInPicture();
     element->DispatchEvent(
-        Event::CreateBubble(EventTypeNames::leavepictureinpicture));
+        *Event::CreateBubble(EventTypeNames::leavepictureinpicture));
   }
 
   if (resolver)
@@ -178,7 +178,7 @@
   if (RuntimeEnabledFeatures::PictureInPictureControlEnabled() &&
       picture_in_picture_element_) {
     picture_in_picture_element_->DispatchEvent(
-        PictureInPictureControlEvent::Create(
+        *PictureInPictureControlEvent::Create(
             EventTypeNames::pictureinpicturecontrolclick, control_id));
   }
 }
diff --git a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window.cc b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window.cc
index dfcbcfc..847602d 100644
--- a/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window.cc
+++ b/third_party/blink/renderer/modules/picture_in_picture/picture_in_picture_window.cc
@@ -24,7 +24,7 @@
     return;
 
   size_ = size;
-  DispatchEvent(Event::Create(EventTypeNames::resize));
+  DispatchEvent(*Event::Create(EventTypeNames::resize));
 }
 
 const AtomicString& PictureInPictureWindow::InterfaceName() const {
diff --git a/third_party/blink/renderer/modules/presentation/presentation_availability.cc b/third_party/blink/renderer/modules/presentation/presentation_availability.cc
index 724b191..a677e26a 100644
--- a/third_party/blink/renderer/modules/presentation/presentation_availability.cc
+++ b/third_party/blink/renderer/modules/presentation/presentation_availability.cc
@@ -70,7 +70,7 @@
     return;
 
   value_ = value;
-  DispatchEvent(Event::Create(EventTypeNames::change));
+  DispatchEvent(*Event::Create(EventTypeNames::change));
 }
 
 bool PresentationAvailability::HasPendingActivity() const {
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection.cc b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
index 918a2ef..983ae05 100644
--- a/third_party/blink/renderer/modules/presentation/presentation_connection.cc
+++ b/third_party/blink/renderer/modules/presentation/presentation_connection.cc
@@ -534,7 +534,7 @@
   if (state_ != mojom::blink::PresentationConnectionState::CONNECTED)
     return;
 
-  DispatchEvent(MessageEvent::Create(message));
+  DispatchEvent(*MessageEvent::Create(message));
 }
 
 void PresentationConnection::DidReceiveBinaryMessage(const uint8_t* data,
@@ -548,12 +548,12 @@
       blob_data->AppendBytes(data, length);
       Blob* blob =
           Blob::Create(BlobDataHandle::Create(std::move(blob_data), length));
-      DispatchEvent(MessageEvent::Create(blob));
+      DispatchEvent(*MessageEvent::Create(blob));
       return;
     }
     case kBinaryTypeArrayBuffer:
       DOMArrayBuffer* buffer = DOMArrayBuffer::Create(data, length);
-      DispatchEvent(MessageEvent::Create(buffer));
+      DispatchEvent(*MessageEvent::Create(buffer));
       return;
   }
   NOTREACHED();
@@ -644,7 +644,7 @@
                                                 Event* event) {
   DCHECK(target);
   DCHECK(event);
-  target->DispatchEvent(event);
+  target->DispatchEvent(*event);
 }
 
 void PresentationConnection::TearDown() {
diff --git a/third_party/blink/renderer/modules/presentation/presentation_connection_list.cc b/third_party/blink/renderer/modules/presentation/presentation_connection_list.cc
index b0507d31..b3e4f00 100644
--- a/third_party/blink/renderer/modules/presentation/presentation_connection_list.cc
+++ b/third_party/blink/renderer/modules/presentation/presentation_connection_list.cc
@@ -54,7 +54,7 @@
 
 void PresentationConnectionList::DispatchConnectionAvailableEvent(
     PresentationConnection* connection) {
-  DispatchEvent(PresentationConnectionAvailableEvent::Create(
+  DispatchEvent(*PresentationConnectionAvailableEvent::Create(
       EventTypeNames::connectionavailable, connection));
 }
 
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
index 02e692b..4df8379 100644
--- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
+++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
@@ -348,7 +348,7 @@
   state_ = state;
   switch (state_) {
     case WebRemotePlaybackState::kConnecting:
-      DispatchEvent(Event::Create(EventTypeNames::connecting));
+      DispatchEvent(*Event::Create(EventTypeNames::connecting));
       if (RuntimeEnabledFeatures::NewRemotePlaybackPipelineEnabled()) {
         if (media_element_->IsHTMLVideoElement()) {
           // TODO(xjz): Pass the remote device name.
@@ -358,10 +358,10 @@
       }
       break;
     case WebRemotePlaybackState::kConnected:
-      DispatchEvent(Event::Create(EventTypeNames::connect));
+      DispatchEvent(*Event::Create(EventTypeNames::connect));
       break;
     case WebRemotePlaybackState::kDisconnected:
-      DispatchEvent(Event::Create(EventTypeNames::disconnect));
+      DispatchEvent(*Event::Create(EventTypeNames::disconnect));
       if (RuntimeEnabledFeatures::NewRemotePlaybackPipelineEnabled()) {
         if (media_element_->IsHTMLVideoElement()) {
           ToHTMLVideoElement(media_element_)
diff --git a/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl.cc b/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl.cc
index 2f7ab9a..784fbab 100644
--- a/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl.cc
+++ b/third_party/blink/renderer/modules/screen_orientation/screen_orientation_controller_impl.cc
@@ -220,7 +220,7 @@
     return;
 
   ScopedOrientationChangeIndicator orientation_change_indicator;
-  orientation_->DispatchEvent(Event::Create(EventTypeNames::change));
+  orientation_->DispatchEvent(*Event::Create(EventTypeNames::change));
 }
 
 void ScreenOrientationControllerImpl::DidUpdateData() {
diff --git a/third_party/blink/renderer/modules/sensor/sensor.cc b/third_party/blink/renderer/modules/sensor/sensor.cc
index a819ae10..a3ea53a 100644
--- a/third_party/blink/renderer/modules/sensor/sensor.cc
+++ b/third_party/blink/renderer/modules/sensor/sensor.cc
@@ -337,7 +337,7 @@
 void Sensor::NotifyReading() {
   DCHECK_EQ(state_, SensorState::kActivated);
   last_reported_timestamp_ = sensor_proxy_->GetReading().timestamp();
-  DispatchEvent(Event::Create(EventTypeNames::reading));
+  DispatchEvent(*Event::Create(EventTypeNames::reading));
 }
 
 void Sensor::NotifyActivated() {
@@ -353,13 +353,13 @@
         WTF::Bind(&Sensor::NotifyReading, WrapWeakPersistent(this)));
   }
 
-  DispatchEvent(Event::Create(EventTypeNames::activate));
+  DispatchEvent(*Event::Create(EventTypeNames::activate));
 }
 
 void Sensor::NotifyError(DOMException* error) {
   DCHECK_NE(state_, SensorState::kIdle);
   state_ = SensorState::kIdle;
-  DispatchEvent(SensorErrorEvent::Create(EventTypeNames::error, error));
+  DispatchEvent(*SensorErrorEvent::Create(EventTypeNames::error, error));
 }
 
 bool Sensor::IsIdleOrErrored() const {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker.cc b/third_party/blink/renderer/modules/service_worker/service_worker.cc
index 33dad765d..35d1012 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker.cc
@@ -89,7 +89,7 @@
 }
 
 void ServiceWorker::DispatchStateChangeEvent() {
-  this->DispatchEvent(Event::Create(EventTypeNames::statechange));
+  this->DispatchEvent(*Event::Create(EventTypeNames::statechange));
 }
 
 String ServiceWorker::scriptURL() const {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_container.cc b/third_party/blink/renderer/modules/service_worker/service_worker_container.cc
index c2cd91e..b86eca31 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_container.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_container.cc
@@ -422,7 +422,7 @@
                       WebFeature::kServiceWorkerControlledPage);
   }
   if (should_notify_controller_change)
-    DispatchEvent(Event::Create(EventTypeNames::controllerchange));
+    DispatchEvent(*Event::Create(EventTypeNames::controllerchange));
 }
 
 void ServiceWorkerContainer::DispatchMessageEvent(
@@ -435,10 +435,18 @@
       MessagePort::EntanglePorts(*GetExecutionContext(), std::move(msg.ports));
   ServiceWorker* source =
       ServiceWorker::From(GetExecutionContext(), std::move(handle));
-  DispatchEvent(MessageEvent::Create(
-      ports, std::move(msg.message),
-      GetExecutionContext()->GetSecurityOrigin()->ToString(),
-      String() /* lastEventId */, source));
+  MessageEvent* event;
+  if (!msg.locked_agent_cluster_id ||
+      GetExecutionContext()->IsSameAgentCluster(*msg.locked_agent_cluster_id)) {
+    event = MessageEvent::Create(
+        ports, std::move(msg.message),
+        GetExecutionContext()->GetSecurityOrigin()->ToString(),
+        String() /* lastEventId */, source);
+  } else {
+    event = MessageEvent::CreateError(
+        GetExecutionContext()->GetSecurityOrigin()->ToString(), source);
+  }
+  DispatchEvent(*event);
 }
 
 void ServiceWorkerContainer::CountFeature(mojom::WebFeature feature) {
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index 1b70ae8..d0a0abc 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -287,7 +287,7 @@
     Event* event,
     WaitUntilObserver* observer) {
   observer->WillDispatchEvent();
-  DispatchEvent(event);
+  DispatchEvent(*event);
 
   // Check if the worker thread is forcibly terminated during the event
   // because of timeout etc.
@@ -300,7 +300,7 @@
     RespondWithObserver* respond_with_observer) {
   wait_until_observer->WillDispatchEvent();
   respond_with_observer->WillDispatchEvent();
-  DispatchEventResult dispatch_result = DispatchEvent(event);
+  DispatchEventResult dispatch_result = DispatchEvent(*event);
   respond_with_observer->DidDispatchEvent(dispatch_result);
   // false is okay because waitUntil() for events with respondWith() doesn't
   // care about the promise rejection or an uncaught runtime script error.
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc b/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
index eb4d7c6..f65cf9c 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_registration.cc
@@ -37,7 +37,7 @@
 }
 
 void ServiceWorkerRegistration::DispatchUpdateFoundEvent() {
-  DispatchEvent(Event::Create(EventTypeNames::updatefound));
+  DispatchEvent(*Event::Create(EventTypeNames::updatefound));
 }
 
 void ServiceWorkerRegistration::SetInstalling(
diff --git a/third_party/blink/renderer/modules/speech/speech_recognition.cc b/third_party/blink/renderer/modules/speech/speech_recognition.cc
index 2394ae84..9f2d558 100644
--- a/third_party/blink/renderer/modules/speech/speech_recognition.cc
+++ b/third_party/blink/renderer/modules/speech/speech_recognition.cc
@@ -130,7 +130,7 @@
   final_results_ = std::move(new_final_results);
 
   // We dispatch an event with (1) + (2) + (3).
-  DispatchEvent(SpeechRecognitionEvent::CreateResult(
+  DispatchEvent(*SpeechRecognitionEvent::CreateResult(
       aggregated_results.size() - results.size(),
       std::move(aggregated_results)));
 }
@@ -138,33 +138,33 @@
 void SpeechRecognition::ErrorOccurred(
     mojom::blink::SpeechRecognitionErrorPtr error) {
   if (error->code == mojom::blink::SpeechRecognitionErrorCode::kNoMatch) {
-    DispatchEvent(SpeechRecognitionEvent::CreateNoMatch(nullptr));
+    DispatchEvent(*SpeechRecognitionEvent::CreateNoMatch(nullptr));
   } else {
     // TODO(primiano): message?
-    DispatchEvent(SpeechRecognitionError::Create(error->code, String()));
+    DispatchEvent(*SpeechRecognitionError::Create(error->code, String()));
   }
 }
 
 void SpeechRecognition::Started() {
-  DispatchEvent(Event::Create(EventTypeNames::start));
+  DispatchEvent(*Event::Create(EventTypeNames::start));
 }
 
 void SpeechRecognition::AudioStarted() {
-  DispatchEvent(Event::Create(EventTypeNames::audiostart));
+  DispatchEvent(*Event::Create(EventTypeNames::audiostart));
 }
 
 void SpeechRecognition::SoundStarted() {
-  DispatchEvent(Event::Create(EventTypeNames::soundstart));
-  DispatchEvent(Event::Create(EventTypeNames::speechstart));
+  DispatchEvent(*Event::Create(EventTypeNames::soundstart));
+  DispatchEvent(*Event::Create(EventTypeNames::speechstart));
 }
 
 void SpeechRecognition::SoundEnded() {
-  DispatchEvent(Event::Create(EventTypeNames::speechend));
-  DispatchEvent(Event::Create(EventTypeNames::soundend));
+  DispatchEvent(*Event::Create(EventTypeNames::speechend));
+  DispatchEvent(*Event::Create(EventTypeNames::soundend));
 }
 
 void SpeechRecognition::AudioEnded() {
-  DispatchEvent(Event::Create(EventTypeNames::audioend));
+  DispatchEvent(*Event::Create(EventTypeNames::audioend));
 }
 
 void SpeechRecognition::Ended() {
@@ -172,7 +172,7 @@
   stopping_ = false;
   session_.reset();
   binding_.Close();
-  DispatchEvent(Event::Create(EventTypeNames::end));
+  DispatchEvent(*Event::Create(EventTypeNames::end));
 }
 
 const AtomicString& SpeechRecognition::InterfaceName() const {
diff --git a/third_party/blink/renderer/modules/speech/speech_synthesis.cc b/third_party/blink/renderer/modules/speech/speech_synthesis.cc
index c43061c..b873d8e 100644
--- a/third_party/blink/renderer/modules/speech/speech_synthesis.cc
+++ b/third_party/blink/renderer/modules/speech/speech_synthesis.cc
@@ -56,7 +56,7 @@
 void SpeechSynthesis::VoicesDidChange() {
   voice_list_.clear();
   if (GetExecutionContext())
-    DispatchEvent(Event::Create(EventTypeNames::voiceschanged));
+    DispatchEvent(*Event::Create(EventTypeNames::voiceschanged));
 }
 
 const HeapVector<Member<SpeechSynthesisVoice>>& SpeechSynthesis::getVoices() {
@@ -159,7 +159,7 @@
     return;
 
   double elapsed_time_millis = millis - utterance->StartTime() * 1000.0;
-  utterance->DispatchEvent(SpeechSynthesisEvent::Create(
+  utterance->DispatchEvent(*SpeechSynthesisEvent::Create(
       type, utterance, char_index, elapsed_time_millis, name));
 }
 
diff --git a/third_party/blink/renderer/modules/vr/navigator_vr.cc b/third_party/blink/renderer/modules/vr/navigator_vr.cc
index 8158472..3a5c107 100644
--- a/third_party/blink/renderer/modules/vr/navigator_vr.cc
+++ b/third_party/blink/renderer/modules/vr/navigator_vr.cc
@@ -239,7 +239,7 @@
   LocalDOMWindow* window = GetSupplementable()->GetFrame()->DomWindow();
   DCHECK(window);
   event->SetTarget(window);
-  window->DispatchEvent(event);
+  window->DispatchEvent(*event);
 }
 
 void NavigatorVR::FocusedFrameChanged() {
diff --git a/third_party/blink/renderer/modules/webaudio/audio_scheduled_source_node.cc b/third_party/blink/renderer/modules/webaudio/audio_scheduled_source_node.cc
index 27936b8..0b17e1f6 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_scheduled_source_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_scheduled_source_node.cc
@@ -243,7 +243,7 @@
   if (!Context() || !Context()->GetExecutionContext())
     return;
   if (GetNode())
-    GetNode()->DispatchEvent(Event::Create(EventTypeNames::ended));
+    GetNode()->DispatchEvent(*Event::Create(EventTypeNames::ended));
 }
 
 // ----------------------------------------------------------------
diff --git a/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc b/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc
index 7dc449a..185f945 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_worklet_node.cc
@@ -379,7 +379,7 @@
 }
 
 void AudioWorkletNode::FireProcessorError() {
-  DispatchEvent(Event::Create(EventTypeNames::processorerror));
+  DispatchEvent(*Event::Create(EventTypeNames::processorerror));
 }
 
 scoped_refptr<AudioWorkletHandler> AudioWorkletNode::GetWorkletHandler() const {
diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
index f30bd88..33061f0 100644
--- a/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.cc
@@ -629,7 +629,7 @@
 }
 
 void BaseAudioContext::NotifyStateChange() {
-  DispatchEvent(Event::Create(EventTypeNames::statechange));
+  DispatchEvent(*Event::Create(EventTypeNames::statechange));
 }
 
 void BaseAudioContext::NotifySourceNodeFinishedProcessing(
diff --git a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
index a8626462..fa3c1d6 100644
--- a/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
+++ b/third_party/blink/renderer/modules/webaudio/offline_audio_context.cc
@@ -369,7 +369,7 @@
 
     // Call the offline rendering completion event listener and resolve the
     // promise too.
-    DispatchEvent(OfflineAudioCompletionEvent::Create(rendered_buffer));
+    DispatchEvent(*OfflineAudioCompletionEvent::Create(rendered_buffer));
     complete_resolver_->Resolve(rendered_buffer);
   } else {
     // The resolver should be rejected when the execution context is gone.
diff --git a/third_party/blink/renderer/modules/webaudio/script_processor_node.cc b/third_party/blink/renderer/modules/webaudio/script_processor_node.cc
index 12f620d..d6da662 100644
--- a/third_party/blink/renderer/modules/webaudio/script_processor_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/script_processor_node.cc
@@ -279,7 +279,7 @@
                            static_cast<double>(Context()->sampleRate());
 
     // Call the JavaScript event handler which will do the audio processing.
-    GetNode()->DispatchEvent(AudioProcessingEvent::Create(
+    GetNode()->DispatchEvent(*AudioProcessingEvent::Create(
         input_buffer, output_buffer, playback_time));
   }
 }
@@ -311,7 +311,7 @@
     // is locked by the waitable event.
     double playback_time = (Context()->CurrentSampleFrame() + buffer_size_) /
                            static_cast<double>(Context()->sampleRate());
-    GetNode()->DispatchEvent(AudioProcessingEvent::Create(
+    GetNode()->DispatchEvent(*AudioProcessingEvent::Create(
         input_buffer, output_buffer, playback_time));
   }
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.cc
index 0e65481..cef47c71 100644
--- a/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl2_compute_rendering_context.cc
@@ -87,7 +87,7 @@
 
 void WebGL2ComputeRenderingContext::Factory::OnError(HTMLCanvasElement* canvas,
                                                      const String& error) {
-  canvas->DispatchEvent(WebGLContextEvent::Create(
+  canvas->DispatchEvent(*WebGLContextEvent::Create(
       EventTypeNames::webglcontextcreationerror, error));
 }
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
index acb7f46..c0c85e3 100644
--- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
@@ -85,7 +85,7 @@
 
 void WebGL2RenderingContext::Factory::OnError(HTMLCanvasElement* canvas,
                                               const String& error) {
-  canvas->DispatchEvent(WebGLContextEvent::Create(
+  canvas->DispatchEvent(*WebGLContextEvent::Create(
       EventTypeNames::webglcontextcreationerror, error));
 }
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
index 0e87448..c5d482b 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
@@ -113,7 +113,7 @@
 
 void WebGLRenderingContext::Factory::OnError(HTMLCanvasElement* canvas,
                                              const String& error) {
-  canvas->DispatchEvent(WebGLContextEvent::Create(
+  canvas->DispatchEvent(*WebGLContextEvent::Create(
       EventTypeNames::webglcontextcreationerror, error));
 }
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
index 8a58769c..ff46ff2 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -1007,31 +1007,15 @@
     Platform::ContextType context_type)
     : CanvasRenderingContext(host, requested_attributes),
       context_group_(new WebGLContextGroup()),
-      is_origin_top_left_(false),
-      is_hidden_(false),
-      context_lost_mode_(kNotLostContext),
-      auto_recovery_method_(kManual),
       dispatch_context_lost_event_timer_(
           task_runner,
           this,
           &WebGLRenderingContextBase::DispatchContextLostEvent),
-      restore_allowed_(false),
       restore_timer_(task_runner,
                      this,
                      &WebGLRenderingContextBase::MaybeRestoreContext),
       task_runner_(task_runner),
-      generated_image_cache_(4),
-      synthesized_errors_to_console_(true),
       num_gl_errors_to_console_allowed_(kMaxGLErrorsAllowedToConsole),
-      one_plus_max_non_default_texture_unit_(0),
-      is_web_gl2_formats_types_added_(false),
-      is_web_gl2_tex_image_source_formats_types_added_(false),
-      is_web_gl2_internal_formats_copy_tex_image_added_(false),
-      is_oes_texture_float_formats_types_added_(false),
-      is_oes_texture_half_float_formats_types_added_(false),
-      is_web_gl_depth_texture_formats_types_added_(false),
-      is_ext_srgb_formats_types_added_(false),
-      is_ext_color_buffer_float_formats_added_(false),
       context_type_(context_type) {
   DCHECK(context_provider);
 
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
index 0c81258..1652ac55 100644
--- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
+++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -712,18 +712,18 @@
 
   TraceWrapperMember<WebGLContextGroup> context_group_;
 
-  bool is_origin_top_left_;
+  bool is_origin_top_left_ = false;
 
-  bool is_hidden_;
-  LostContextMode context_lost_mode_;
-  AutoRecoveryMethod auto_recovery_method_;
+  bool is_hidden_ = false;
+  LostContextMode context_lost_mode_ = kNotLostContext;
+  AutoRecoveryMethod auto_recovery_method_ = kManual;
   // Dispatches a context lost event once it is determined that one is needed.
   // This is used for synthetic, WEBGL_lose_context and real context losses. For
   // real ones, it's likely that there's no JavaScript on the stack, but that
   // might be dependent on how exactly the platform discovers that the context
   // was lost. For better portability we always defer the dispatch of the event.
   TaskRunnerTimer<WebGLRenderingContextBase> dispatch_context_lost_event_timer_;
-  bool restore_allowed_;
+  bool restore_allowed_ = false;
   TaskRunnerTimer<WebGLRenderingContextBase> restore_timer_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
@@ -771,7 +771,8 @@
     void BubbleToFront(size_t idx);
     Vector<std::unique_ptr<CanvasResourceProvider>> resource_providers_;
   };
-  LRUCanvasResourceProviderCache generated_image_cache_;
+  LRUCanvasResourceProviderCache generated_image_cache_ =
+      LRUCanvasResourceProviderCache(4);
 
   GLint max_texture_size_;
   GLint max_cube_map_texture_size_;
@@ -818,10 +819,10 @@
 
   bool is_depth_stencil_supported_;
 
-  bool synthesized_errors_to_console_;
+  bool synthesized_errors_to_console_ = true;
   int num_gl_errors_to_console_allowed_;
 
-  unsigned long one_plus_max_non_default_texture_unit_;
+  unsigned long one_plus_max_non_default_texture_unit_ = 0;
 
   std::unique_ptr<Extensions3DUtil> extensions_util_;
 
@@ -967,14 +968,14 @@
   // Other errors raised by synthesizeGLError().
   Vector<GLenum> synthetic_errors_;
 
-  bool is_web_gl2_formats_types_added_;
-  bool is_web_gl2_tex_image_source_formats_types_added_;
-  bool is_web_gl2_internal_formats_copy_tex_image_added_;
-  bool is_oes_texture_float_formats_types_added_;
-  bool is_oes_texture_half_float_formats_types_added_;
-  bool is_web_gl_depth_texture_formats_types_added_;
-  bool is_ext_srgb_formats_types_added_;
-  bool is_ext_color_buffer_float_formats_added_;
+  bool is_web_gl2_formats_types_added_ = false;
+  bool is_web_gl2_tex_image_source_formats_types_added_ = false;
+  bool is_web_gl2_internal_formats_copy_tex_image_added_ = false;
+  bool is_oes_texture_float_formats_types_added_ = false;
+  bool is_oes_texture_half_float_formats_types_added_ = false;
+  bool is_web_gl_depth_texture_formats_types_added_ = false;
+  bool is_ext_srgb_formats_types_added_ = false;
+  bool is_ext_color_buffer_float_formats_added_ = false;
 
   std::set<GLenum> supported_internal_formats_;
   std::set<GLenum> supported_tex_image_source_internal_formats_;
diff --git a/third_party/blink/renderer/modules/webmidi/midi_access.cc b/third_party/blink/renderer/modules/webmidi/midi_access.cc
index 52a91208..884e88a 100644
--- a/third_party/blink/renderer/modules/webmidi/midi_access.cc
+++ b/third_party/blink/renderer/modules/webmidi/midi_access.cc
@@ -146,7 +146,7 @@
   MIDIInput* port = MIDIInput::Create(this, id, manufacturer, name, version,
                                       ToDeviceState(state));
   inputs_.push_back(port);
-  DispatchEvent(MIDIConnectionEvent::Create(port));
+  DispatchEvent(*MIDIConnectionEvent::Create(port));
 }
 
 void MIDIAccess::DidAddOutputPort(const String& id,
@@ -159,7 +159,7 @@
   MIDIOutput* port = MIDIOutput::Create(this, port_index, id, manufacturer,
                                         name, version, ToDeviceState(state));
   outputs_.push_back(port);
-  DispatchEvent(MIDIConnectionEvent::Create(port));
+  DispatchEvent(*MIDIConnectionEvent::Create(port));
 }
 
 void MIDIAccess::DidSetInputPortState(unsigned port_index, PortState state) {
diff --git a/third_party/blink/renderer/modules/webmidi/midi_input.cc b/third_party/blink/renderer/modules/webmidi/midi_input.cc
index 045ed46..0992d95 100644
--- a/third_party/blink/renderer/modules/webmidi/midi_input.cc
+++ b/third_party/blink/renderer/modules/webmidi/midi_input.cc
@@ -99,7 +99,7 @@
   if (data[0] == 0xf0 && !midiAccess()->sysexEnabled())
     return;
   DOMUint8Array* array = DOMUint8Array::Create(data, length);
-  DispatchEvent(MIDIMessageEvent::Create(time_stamp, array));
+  DispatchEvent(*MIDIMessageEvent::Create(time_stamp, array));
 
   UseCounter::Count(*ToDocument(GetExecutionContext()),
                     WebFeature::kMIDIMessageEvent);
diff --git a/third_party/blink/renderer/modules/webmidi/midi_port.cc b/third_party/blink/renderer/modules/webmidi/midi_port.cc
index 48a502e4..da3e04f 100644
--- a/third_party/blink/renderer/modules/webmidi/midi_port.cc
+++ b/third_party/blink/renderer/modules/webmidi/midi_port.cc
@@ -247,8 +247,8 @@
     return;
   state_ = state;
   connection_ = connection;
-  DispatchEvent(MIDIConnectionEvent::Create(this));
-  access_->DispatchEvent(MIDIConnectionEvent::Create(this));
+  DispatchEvent(*MIDIConnectionEvent::Create(this));
+  access_->DispatchEvent(*MIDIConnectionEvent::Create(this));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/websockets/dom_websocket.cc b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
index aee55ad..7089e6d3 100644
--- a/third_party/blink/renderer/modules/websockets/dom_websocket.cc
+++ b/third_party/blink/renderer/modules/websockets/dom_websocket.cc
@@ -82,7 +82,7 @@
     case kActive:
       DCHECK(events_.IsEmpty());
       DCHECK(target_->GetExecutionContext());
-      target_->DispatchEvent(event);
+      target_->DispatchEvent(*event);
       break;
     case kPaused:
     case kUnpausePosted:
@@ -140,7 +140,7 @@
       break;
     DCHECK_EQ(state_, kActive);
     DCHECK(target_->GetExecutionContext());
-    target_->DispatchEvent(events.TakeFirst());
+    target_->DispatchEvent(*events.TakeFirst());
     // |this| can be stopped here.
   }
   if (state_ == kPaused || state_ == kUnpausePosted) {
diff --git a/third_party/blink/renderer/modules/websockets/web_pepper_socket_impl.cc b/third_party/blink/renderer/modules/websockets/web_pepper_socket_impl.cc
index ed6b889..52655c4 100644
--- a/third_party/blink/renderer/modules/websockets/web_pepper_socket_impl.cc
+++ b/third_party/blink/renderer/modules/websockets/web_pepper_socket_impl.cc
@@ -32,10 +32,12 @@
 
 #include <stddef.h>
 #include <memory>
+#include "third_party/blink/public/platform/web_feature.mojom-shared.h"
 #include "third_party/blink/public/platform/web_url.h"
 #include "third_party/blink/public/web/web_array_buffer.h"
 #include "third_party/blink/public/web/web_document.h"
 #include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/frame/deprecation.h"
 #include "third_party/blink/renderer/core/inspector/console_types.h"
 #include "third_party/blink/renderer/core/typed_arrays/dom_array_buffer.h"
 #include "third_party/blink/renderer/modules/websockets/web_pepper_socket_channel_client_proxy.h"
@@ -64,6 +66,7 @@
   Document* core_document = document;
   private_ = WebSocketChannelImpl::Create(core_document, channel_proxy_.Get(),
                                           SourceLocation::Capture());
+  Deprecation::CountDeprecation(*core_document, WebFeature::kPPAPIWebSocket);
   DCHECK(private_);
 }
 
diff --git a/third_party/blink/renderer/modules/webusb/usb.cc b/third_party/blink/renderer/modules/webusb/usb.cc
index df63696..9f416570 100644
--- a/third_party/blink/renderer/modules/webusb/usb.cc
+++ b/third_party/blink/renderer/modules/webusb/usb.cc
@@ -203,7 +203,7 @@
   if (!device_manager_)
     return;
 
-  DispatchEvent(USBConnectionEvent::Create(
+  DispatchEvent(*USBConnectionEvent::Create(
       EventTypeNames::connect, GetOrCreateDevice(std::move(device_info))));
 }
 
@@ -214,7 +214,8 @@
     device = USBDevice::Create(std::move(device_info), nullptr,
                                GetExecutionContext());
   }
-  DispatchEvent(USBConnectionEvent::Create(EventTypeNames::disconnect, device));
+  DispatchEvent(
+      *USBConnectionEvent::Create(EventTypeNames::disconnect, device));
   device_cache_.erase(guid);
 }
 
diff --git a/third_party/blink/renderer/modules/xr/xr.cc b/third_party/blink/renderer/modules/xr/xr.cc
index 55850ad..32fbd78 100644
--- a/third_party/blink/renderer/modules/xr/xr.cc
+++ b/third_party/blink/renderer/modules/xr/xr.cc
@@ -136,7 +136,7 @@
 
   devices_.push_back(xr_device);
 
-  DispatchEvent(blink::Event::Create(EventTypeNames::devicechange));
+  DispatchEvent(*blink::Event::Create(EventTypeNames::devicechange));
 }
 
 // Called when the XRService has called OnDevicesConnected for all active
diff --git a/third_party/blink/renderer/modules/xr/xr_session.cc b/third_party/blink/renderer/modules/xr/xr_session.cc
index b3ca9f0..65b97408 100644
--- a/third_party/blink/renderer/modules/xr/xr_session.cc
+++ b/third_party/blink/renderer/modules/xr/xr_session.cc
@@ -380,7 +380,7 @@
     device_->frameProvider()->OnImmersiveSessionEnded();
   }
 
-  DispatchEvent(XRSessionEvent::Create(EventTypeNames::end, this));
+  DispatchEvent(*XRSessionEvent::Create(EventTypeNames::end, this));
 }
 
 double XRSession::NativeFramebufferScale() const {
@@ -422,7 +422,7 @@
     return;
 
   blurred_ = false;
-  DispatchEvent(XRSessionEvent::Create(EventTypeNames::focus, this));
+  DispatchEvent(*XRSessionEvent::Create(EventTypeNames::focus, this));
 }
 
 void XRSession::OnBlur() {
@@ -430,7 +430,7 @@
     return;
 
   blurred_ = true;
-  DispatchEvent(XRSessionEvent::Create(EventTypeNames::blur, this));
+  DispatchEvent(*XRSessionEvent::Create(EventTypeNames::blur, this));
 }
 
 // Immersive sessions may still not be blurred in headset even if the page isn't
@@ -597,7 +597,7 @@
 
   if (devices_changed) {
     DispatchEvent(
-        XRSessionEvent::Create(EventTypeNames::inputsourceschange, this));
+        *XRSessionEvent::Create(EventTypeNames::inputsourceschange, this));
   }
 }
 
@@ -611,7 +611,7 @@
 
   XRInputSourceEvent* event =
       CreateInputSourceEvent(EventTypeNames::selectstart, input_source);
-  DispatchEvent(event);
+  DispatchEvent(*event);
 
   if (event->defaultPrevented())
     input_source->selection_cancelled = true;
@@ -633,7 +633,7 @@
 
   XRInputSourceEvent* event =
       CreateInputSourceEvent(EventTypeNames::selectend, input_source);
-  DispatchEvent(event);
+  DispatchEvent(*event);
 
   if (event->defaultPrevented())
     input_source->selection_cancelled = true;
@@ -653,12 +653,12 @@
   if (!input_source->selection_cancelled) {
     XRInputSourceEvent* event =
         CreateInputSourceEvent(EventTypeNames::select, input_source);
-    DispatchEvent(event);
+    DispatchEvent(*event);
   }
 }
 
 void XRSession::OnPoseReset() {
-  DispatchEvent(XRSessionEvent::Create(EventTypeNames::resetpose, this));
+  DispatchEvent(*XRSessionEvent::Create(EventTypeNames::resetpose, this));
 }
 
 void XRSession::UpdateInputSourceState(
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
index ef9e142..641c62e8 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.cc
@@ -67,6 +67,7 @@
 }
 
 void ScriptWrappableMarkingVisitor::AbortTracing() {
+  CHECK(tracing_in_progress_);
   CHECK(ThreadState::Current());
   should_cleanup_ = true;
   tracing_in_progress_ = false;
@@ -218,10 +219,12 @@
 void ScriptWrappableMarkingVisitor::WriteBarrier(
     v8::Isolate* isolate,
     const TraceWrapperV8Reference<v8::Value>& dst_object) {
-  ScriptWrappableMarkingVisitor* visitor = CurrentVisitor(isolate);
-  if (dst_object.IsEmpty() || !visitor->WrapperTracingInProgress())
+  if (!ThreadState::IsAnyWrapperTracing() || dst_object.IsEmpty())
     return;
 
+  ScriptWrappableMarkingVisitor* visitor = CurrentVisitor(isolate);
+  if (!visitor->WrapperTracingInProgress())
+    return;
   // Conservatively assume that the source object containing |dst_object| is
   // marked.
   visitor->Trace(dst_object);
@@ -231,6 +234,9 @@
     v8::Isolate* isolate,
     DOMWrapperMap<ScriptWrappable>* wrapper_map,
     ScriptWrappable* key) {
+  if (!ThreadState::IsAnyWrapperTracing())
+    return;
+
   ScriptWrappableMarkingVisitor* visitor = CurrentVisitor(isolate);
   if (!visitor->WrapperTracingInProgress())
     return;
@@ -301,24 +307,32 @@
   }
 }
 
+void ScriptWrappableMarkingVisitor::FinalizeAndCleanup() {
+  FinalizeTracing();
+  PerformCleanup();
+}
+
 void ScriptWrappableMarkingVisitor::InvalidateDeadObjectsInMarkingDeque(
     v8::Isolate* isolate) {
   ScriptWrappableMarkingVisitor* script_wrappable_visitor =
-      V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor();
+      static_cast<ScriptWrappableMarkingVisitor*>(
+          V8PerIsolateData::From(isolate)->GetV8HeapController());
   if (script_wrappable_visitor)
     script_wrappable_visitor->InvalidateDeadObjectsInMarkingDeque();
 }
 
 void ScriptWrappableMarkingVisitor::PerformCleanup(v8::Isolate* isolate) {
   ScriptWrappableMarkingVisitor* script_wrappable_visitor =
-      V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor();
+      static_cast<ScriptWrappableMarkingVisitor*>(
+          V8PerIsolateData::From(isolate)->GetV8HeapController());
   if (script_wrappable_visitor)
     script_wrappable_visitor->PerformCleanup();
 }
 
 ScriptWrappableMarkingVisitor* ScriptWrappableMarkingVisitor::CurrentVisitor(
     v8::Isolate* isolate) {
-  return V8PerIsolateData::From(isolate)->GetScriptWrappableMarkingVisitor();
+  return static_cast<ScriptWrappableMarkingVisitor*>(
+      V8PerIsolateData::From(isolate)->GetV8HeapController());
 }
 
 bool ScriptWrappableMarkingVisitor::MarkingDequeContains(void* needle) {
diff --git a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h
index 4050f64..7327105d 100644
--- a/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h
+++ b/third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/platform/bindings/script_wrappable_visitor.h"
 #include "third_party/blink/renderer/platform/heap/heap_page.h"
 #include "third_party/blink/renderer/platform/heap/threading_traits.h"
+#include "third_party/blink/renderer/platform/heap/v8_heap_controller.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/deque.h"
 #include "third_party/blink/renderer/platform/wtf/time.h"
@@ -29,8 +30,8 @@
 // reachable wrappers. V8 calls this visitor during its garbage collection,
 // see v8::EmbedderHeapTracer.
 class PLATFORM_EXPORT ScriptWrappableMarkingVisitor
-    : public v8::EmbedderHeapTracer,
-      public ScriptWrappableVisitor {
+    : public ScriptWrappableVisitor,
+      public V8HeapController {
   DISALLOW_IMPLICIT_CONSTRUCTORS(ScriptWrappableMarkingVisitor);
 
  public:
@@ -69,7 +70,6 @@
   bool WrapperTracingInProgress() const { return tracing_in_progress_; }
 
   // v8::EmbedderHeapTracer interface.
-
   void TracePrologue() override;
   void RegisterV8References(const std::vector<std::pair<void*, void*>>&
                                 internal_fields_of_potential_wrappers) override;
@@ -81,8 +81,10 @@
   void EnterFinalPause() override;
   size_t NumberOfWrappersToTrace() override;
 
-  // ScriptWrappableVisitor interface.
+  // V8HeapController interface.
+  void FinalizeAndCleanup() override;
 
+  // ScriptWrappableVisitor interface.
   void Visit(const TraceWrapperV8Reference<v8::Value>&) override;
   void VisitWithWrappers(void*, TraceDescriptor) override;
   void Visit(DOMWrapperMap<ScriptWrappable>*,
diff --git a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h
index 831498f..f4ab456 100644
--- a/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h
+++ b/third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h
@@ -114,13 +114,12 @@
   wrapper->SetAlignedPointerInInternalFields(base::size(indices), indices,
                                              values);
   auto* per_isolate_data = V8PerIsolateData::From(isolate);
-  // We notify ScriptWrappableVisitor about the new wrapper association,
-  // so the visitor can make sure to trace the association (in case it is
+  // We notify V8HeapController about the new wrapper association,
+  // so the controller can make sure to trace the association (in case it is
   // currently tracing).  Because of some optimizations, V8 will not
   // necessarily detect wrappers created during its incremental marking.
-  per_isolate_data->GetScriptWrappableMarkingVisitor()->RegisterV8Reference(
-      std::make_pair(const_cast<WrapperTypeInfo*>(wrapper_type_info),
-                     wrappable));
+  per_isolate_data->GetV8HeapController()->RegisterV8References({std::make_pair(
+      const_cast<WrapperTypeInfo*>(wrapper_type_info), wrappable)});
 }
 
 inline void V8DOMWrapper::ClearNativeInfo(v8::Isolate* isolate,
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
index 44cb5a94..f6c5cbf9 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
@@ -153,9 +153,8 @@
 
   // Detach V8's garbage collector.
   isolate->SetEmbedderHeapTracer(nullptr);
-  if (data->script_wrappable_visitor_->WrapperTracingInProgress())
-    data->script_wrappable_visitor_->AbortTracing();
-  data->script_wrappable_visitor_.reset();
+  data->v8_heap_controller_->FinalizeAndCleanup();
+  data->v8_heap_controller_.reset();
 }
 
 // destroy() clear things that should be cleared after ThreadState::detach()
@@ -368,16 +367,4 @@
   active_script_wrappables_->insert(wrappable);
 }
 
-void V8PerIsolateData::TemporaryScriptWrappableVisitorScope::
-    SwapWithV8PerIsolateDataVisitor(
-        std::unique_ptr<ScriptWrappableMarkingVisitor>& visitor) {
-  ScriptWrappableMarkingVisitor* current = CurrentVisitor();
-  if (current)
-    ScriptWrappableMarkingVisitor::PerformCleanup(isolate_);
-
-  V8PerIsolateData::From(isolate_)->script_wrappable_visitor_.swap(
-      saved_visitor_);
-  isolate_->SetEmbedderHeapTracer(CurrentVisitor());
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
index 7788274..35cef52 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
@@ -33,9 +33,9 @@
 #include "gin/public/isolate_holder.h"
 #include "third_party/blink/renderer/platform/bindings/runtime_call_stats.h"
 #include "third_party/blink/renderer/platform/bindings/scoped_persistent.h"
-#include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h"
 #include "third_party/blink/renderer/platform/bindings/v8_global_value_map.h"
 #include "third_party/blink/renderer/platform/heap/handle.h"
+#include "third_party/blink/renderer/platform/heap/v8_heap_controller.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/forward.h"
 #include "third_party/blink/renderer/platform/wtf/hash_map.h"
@@ -200,41 +200,19 @@
     return active_script_wrappables_.Get();
   }
 
-  class PLATFORM_EXPORT TemporaryScriptWrappableVisitorScope {
-    WTF_MAKE_NONCOPYABLE(TemporaryScriptWrappableVisitorScope);
-    STACK_ALLOCATED();
-
-   public:
-    TemporaryScriptWrappableVisitorScope(
-        v8::Isolate* isolate,
-        std::unique_ptr<ScriptWrappableMarkingVisitor> visitor)
-        : isolate_(isolate), saved_visitor_(std::move(visitor)) {
-      SwapWithV8PerIsolateDataVisitor(saved_visitor_);
-    }
-    ~TemporaryScriptWrappableVisitorScope() {
-      SwapWithV8PerIsolateDataVisitor(saved_visitor_);
-    }
-
-    inline ScriptWrappableMarkingVisitor* CurrentVisitor() {
-      return V8PerIsolateData::From(isolate_)
-          ->GetScriptWrappableMarkingVisitor();
-    }
-
-   private:
-    void SwapWithV8PerIsolateDataVisitor(
-        std::unique_ptr<ScriptWrappableMarkingVisitor>&);
-
-    v8::Isolate* isolate_;
-    std::unique_ptr<ScriptWrappableMarkingVisitor> saved_visitor_;
-  };
-
-  void SetScriptWrappableMarkingVisitor(
-      std::unique_ptr<ScriptWrappableMarkingVisitor> visitor) {
-    script_wrappable_visitor_ = std::move(visitor);
+  void SetV8HeapController(std::unique_ptr<V8HeapController> controller) {
+    DCHECK(!v8_heap_controller_);
+    v8_heap_controller_ = std::move(controller);
   }
-  ScriptWrappableMarkingVisitor* GetScriptWrappableMarkingVisitor() {
-    return script_wrappable_visitor_.get();
+
+  V8HeapController* GetV8HeapController() const {
+    return v8_heap_controller_.get();
   }
+
+  void SwapV8HeapController(std::unique_ptr<V8HeapController>& other) {
+    v8_heap_controller_.swap(other);
+  }
+
   int IsNearV8HeapLimitHandled() { return handled_near_v8_heap_limit_; }
 
   void HandledNearV8HeapLimit() { handled_near_v8_heap_limit_ = true; }
@@ -306,7 +284,8 @@
   std::unique_ptr<Data> thread_debugger_;
 
   Persistent<ActiveScriptWrappableSet> active_script_wrappables_;
-  std::unique_ptr<ScriptWrappableMarkingVisitor> script_wrappable_visitor_;
+
+  std::unique_ptr<V8HeapController> v8_heap_controller_;
 
   RuntimeCallStats runtime_call_stats_;
   bool handled_near_v8_heap_limit_;
diff --git a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
index 412ae11..5c7bc7a 100644
--- a/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
+++ b/third_party/blink/renderer/platform/blob/blob_bytes_provider.cc
@@ -5,7 +5,7 @@
 #include "third_party/blink/renderer/platform/blob/blob_bytes_provider.h"
 
 #include "base/numerics/safe_conversions.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/task/post_task.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_thread.h"
diff --git a/third_party/blink/renderer/platform/exported/platform.cc b/third_party/blink/renderer/platform/exported/platform.cc
index 81333f91..a685d5c 100644
--- a/third_party/blink/renderer/platform/exported/platform.cc
+++ b/third_party/blink/renderer/platform/exported/platform.cc
@@ -114,12 +114,44 @@
 
 Platform::~Platform() = default;
 
+namespace {
+
+class SingleThreadedWebThread : public WebThread {
+ public:
+  bool IsCurrentThread() const override {
+    DCHECK(WTF::IsMainThread());
+    return true;
+  }
+  ThreadScheduler* Scheduler() const override {
+    // TODO(yutak): Implement default scheduler.
+    return nullptr;
+  }
+  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const override {
+    DCHECK(WTF::IsMainThread());
+    return base::ThreadTaskRunnerHandle::Get();
+  }
+};
+
+}  // namespace
+
 void Platform::Initialize(Platform* platform, WebThread* main_thread) {
   DCHECK(!g_platform);
   DCHECK(platform);
   g_platform = platform;
   g_platform->main_thread_ = main_thread;
+  InitializeCommon(platform);
+}
 
+void Platform::CreateMainThreadAndInitialize(Platform* platform) {
+  DCHECK(!g_platform);
+  DCHECK(platform);
+  g_platform = platform;
+  g_platform->owned_main_thread_ = std::make_unique<SingleThreadedWebThread>();
+  g_platform->main_thread_ = g_platform->owned_main_thread_.get();
+  InitializeCommon(platform);
+}
+
+void Platform::InitializeCommon(Platform* platform) {
   WTF::Initialize(CallOnMainThreadFunction);
 
   ProcessHeap::Init();
@@ -175,6 +207,13 @@
   return main_thread_;
 }
 
+WebThread* Platform::CurrentThread() {
+  // This version must be called only if the main thread is owned by Platform.
+  // See the comments in the header.
+  DCHECK(owned_main_thread_);
+  return main_thread_;
+}
+
 service_manager::Connector* Platform::GetConnector() {
   DEFINE_STATIC_LOCAL(DefaultConnector, connector, ());
   return connector.Get();
diff --git a/third_party/blink/renderer/platform/heap/BUILD.gn b/third_party/blink/renderer/platform/heap/BUILD.gn
index 3859f8c..120d392 100644
--- a/third_party/blink/renderer/platform/heap/BUILD.gn
+++ b/third_party/blink/renderer/platform/heap/BUILD.gn
@@ -79,6 +79,7 @@
     "thread_state.h",
     "threading_traits.h",
     "trace_traits.h",
+    "v8_heap_controller.h",
     "visitor.h",
     "worklist.h",
   ]
diff --git a/third_party/blink/renderer/platform/heap/v8_heap_controller.h b/third_party/blink/renderer/platform/heap/v8_heap_controller.h
new file mode 100644
index 0000000..d7e5f43
--- /dev/null
+++ b/third_party/blink/renderer/platform/heap/v8_heap_controller.h
@@ -0,0 +1,22 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_HEAP_CONTROLLER_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_HEAP_CONTROLLER_H_
+
+#include "v8/include/v8.h"
+
+namespace blink {
+
+// Common interface for all V8 heap tracers used in Blink.
+class V8HeapController : public v8::EmbedderHeapTracer {
+ public:
+  ~V8HeapController() override = default;
+
+  virtual void FinalizeAndCleanup() = 0;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_HEAP_V8_HEAP_CONTROLLER_H_
diff --git a/third_party/blink/renderer/platform/loader/OWNERS b/third_party/blink/renderer/platform/loader/OWNERS
index fa3423b..b2c834a 100644
--- a/third_party/blink/renderer/platform/loader/OWNERS
+++ b/third_party/blink/renderer/platform/loader/OWNERS
@@ -1,5 +1,6 @@
 japhet@chromium.org
 mkwst@chromium.org
+toyoshim@chromium.org
 yhirano@chromium.org
 yoav@yoav.ws
 
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
index a010169..3605966 100644
--- a/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
+++ b/third_party/blink/renderer/platform/loader/fetch/resource_load_scheduler.cc
@@ -192,53 +192,15 @@
                       ("Blink.ResourceLoadScheduler.RequestCount",
                        ToSample(ReportCircumstance::kNumOfCircumstances)));
 
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, main_frame_throttled_traffic_bytes,
-      ("Blink.ResourceLoadScheduler.TrafficBytes.MainframeThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, main_frame_not_throttled_traffic_bytes,
-      ("Blink.ResourceLoadScheduler.TrafficBytes.MainframeNotThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, sub_frame_throttled_traffic_bytes,
-      ("Blink.ResourceLoadScheduler.TrafficBytes.SubframeThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, sub_frame_not_throttled_traffic_bytes,
-      ("Blink.ResourceLoadScheduler.TrafficBytes.SubframeNotThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, main_frame_throttled_decoded_bytes,
-      ("Blink.ResourceLoadScheduler.DecodedBytes.MainframeThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, main_frame_not_throttled_decoded_bytes,
-      ("Blink.ResourceLoadScheduler.DecodedBytes.MainframeNotThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, sub_frame_throttled_decoded_bytes,
-      ("Blink.ResourceLoadScheduler.DecodedBytes.SubframeThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-  DEFINE_STATIC_LOCAL(
-      CustomCountHistogram, sub_frame_not_throttled_decoded_bytes,
-      ("Blink.ResourceLoadScheduler.DecodedBytes.SubframeNotThrottled", 0,
-       kMaximumReportSize1G, kReportBucketCount));
-
   switch (current_state_) {
     case scheduler::SchedulingLifecycleState::kThrottled:
     case scheduler::SchedulingLifecycleState::kHidden:
       if (is_main_frame_) {
         request_count_by_circumstance.Count(
             ToSample(ReportCircumstance::kMainframeThrottled));
-        main_frame_throttled_traffic_bytes.Count(hints.encoded_data_length());
-        main_frame_throttled_decoded_bytes.Count(hints.decoded_body_length());
       } else {
         request_count_by_circumstance.Count(
             ToSample(ReportCircumstance::kSubframeThrottled));
-        sub_frame_throttled_traffic_bytes.Count(hints.encoded_data_length());
-        sub_frame_throttled_decoded_bytes.Count(hints.decoded_body_length());
       }
       total_throttled_request_count_++;
       total_throttled_traffic_bytes_ += hints.encoded_data_length();
@@ -248,17 +210,9 @@
       if (is_main_frame_) {
         request_count_by_circumstance.Count(
             ToSample(ReportCircumstance::kMainframeNotThrottled));
-        main_frame_not_throttled_traffic_bytes.Count(
-            hints.encoded_data_length());
-        main_frame_not_throttled_decoded_bytes.Count(
-            hints.decoded_body_length());
       } else {
         request_count_by_circumstance.Count(
             ToSample(ReportCircumstance::kSubframeNotThrottled));
-        sub_frame_not_throttled_traffic_bytes.Count(
-            hints.encoded_data_length());
-        sub_frame_not_throttled_decoded_bytes.Count(
-            hints.decoded_body_length());
       }
       total_not_throttled_request_count_++;
       total_not_throttled_traffic_bytes_ += hints.encoded_data_length();
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 324273ee..bc35aeb 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -340,10 +340,6 @@
       status: "experimental",
     },
     {
-      name: "CSSTransformBox",
-      status: "stable",
-    },
-    {
       name: "CSSVariables2",
       status: "experimental",
     },
@@ -501,10 +497,6 @@
       status: "stable",
     },
     {
-      name: "FocusOptions",
-      status: "stable",
-    },
-    {
       name: "FontCacheScaling",
       status: "test",
     },
@@ -564,12 +556,15 @@
       status: "experimental",
     },
     {
+      name: "GetDisplayMedia",
+      status: "experimental",
+    },
+    {
       name: "HeapCompaction",
       status: "stable",
     },
     {
       name: "HeapIncrementalMarking",
-      status: "stable",
     },
     {
       name: "HeapIncrementalMarkingStress"
@@ -715,10 +710,6 @@
       name: "MediaCaptureDepthVideoKind",
       status: "experimental",
     },
-    {
-      name: "MediaCaptureFromVideo",
-      status: "stable",
-    },
     // Set to reflect the MediaCastOverlayButton feature.
     {
       name: "MediaCastOverlayButton",
@@ -748,6 +739,11 @@
       status: "test",
     },
     {
+      name: "MediaSourceChangeType",
+      origin_trial_feature_name: "MediaSourceChangeType",
+      status: "experimental",
+    },
+    {
       name: "MediaSourceExperimental",
       status: "experimental",
     },
@@ -1087,10 +1083,6 @@
       status: "stable",
     },
     {
-      name: "ResizeObserver",
-      status: "stable",
-    },
-    {
       name: "ResourceLoadScheduler",
       status: "experimental",
     },
@@ -1164,10 +1156,6 @@
       status: "experimental",
     },
     {
-      name: "ServerTiming",
-      status: "stable",
-    },
-    {
       name: "ServiceWorkerScriptFullCodeCache",
     },
     {
@@ -1318,10 +1306,6 @@
       status: "experimental",
     },
     {
-      name: "VisibilityCollapseRow",
-      status: "stable",
-    },
-    {
       name: "VisualViewportAPI",
       status: "stable",
     },
diff --git a/third_party/blink/renderer/platform/scheduler/BUILD.gn b/third_party/blink/renderer/platform/scheduler/BUILD.gn
index a066b51..170ca91 100644
--- a/third_party/blink/renderer/platform/scheduler/BUILD.gn
+++ b/third_party/blink/renderer/platform/scheduler/BUILD.gn
@@ -33,6 +33,8 @@
     "common/scheduler_helper.h",
     "common/scheduling_lifecycle_state.cc",
     "common/thread_scheduler.cc",
+    "common/thread_scheduler_impl.cc",
+    "common/thread_scheduler_impl.h",
     "common/throttling/budget_pool.cc",
     "common/throttling/budget_pool.h",
     "common/throttling/cpu_time_budget_pool.cc",
@@ -135,6 +137,7 @@
     "//components/scheduling_metrics",
     "//device/base/synchronization",
     "//services/metrics/public/cpp:ukm_builders",
+    "//services/metrics/public/mojom",
     "//third_party/blink/renderer/platform:make_platform_generated",
     "//third_party/blink/renderer/platform/wtf",
   ]
diff --git a/third_party/blink/renderer/platform/scheduler/DEPS b/third_party/blink/renderer/platform/scheduler/DEPS
index 24efe4a..da65e99 100644
--- a/third_party/blink/renderer/platform/scheduler/DEPS
+++ b/third_party/blink/renderer/platform/scheduler/DEPS
@@ -39,7 +39,7 @@
   "+base/task/sequence_manager/sequence_manager.h",
   "+base/task/sequence_manager/task_queue.h",
   "+base/task/sequence_manager/time_domain.h",
-  "+base/task_scheduler/task_traits.h",
+  "+base/task/task_traits.h",
   "+base/threading/platform_thread.h",
   "+base/threading/sequenced_task_runner_handle.h",
   "+base/threading/thread.h",
@@ -62,6 +62,7 @@
   ".*test\.cc": [
     "+base/metrics/field_trial_param_associator.h",
     "+base/task/sequence_manager/test",
+    "+components/ukm/test_ukm_recorder.h",
     "+testing",
   ],
  "sequence_manager_fuzzer.cc": [
diff --git a/third_party/blink/renderer/platform/scheduler/child/process_state.h b/third_party/blink/renderer/platform/scheduler/child/process_state.h
index 5b5899d..37d0fbc 100644
--- a/third_party/blink/renderer/platform/scheduler/child/process_state.h
+++ b/third_party/blink/renderer/platform/scheduler/child/process_state.h
@@ -7,14 +7,16 @@
 
 #include <atomic>
 
+#include "third_party/blink/renderer/platform/platform_export.h"
+
 namespace blink {
 namespace scheduler {
 namespace internal {
 
 // Helper lock-free struct to share main state of the process between threads
-// for recording methods.
+// for recording metrics.
 // This class should not be used for synchronization between threads.
-struct ProcessState {
+struct PLATFORM_EXPORT ProcessState {
   static ProcessState* Get();
 
   std::atomic_bool is_process_backgrounded;
diff --git a/third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc
index 5337518..dbf59fa 100644
--- a/third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/background_scheduler.cc
@@ -5,7 +5,7 @@
 #include "third_party/blink/renderer/platform/scheduler/public/background_scheduler.h"
 
 #include "base/location.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/task/post_task.h"
 
 namespace blink {
 
diff --git a/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h b/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h
index b38bf13..e2f6697e 100644
--- a/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h
+++ b/third_party/blink/renderer/platform/scheduler/common/metrics_helper.h
@@ -23,6 +23,8 @@
 namespace blink {
 namespace scheduler {
 
+constexpr int kUkmMetricVersion = 2;
+
 // Helper class to take care of task metrics shared between main thread
 // and worker threads of the renderer process, including per-thread
 // task metrics.
diff --git a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
index 896081b..8d56b92 100644
--- a/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/scheduler_helper.cc
@@ -135,7 +135,9 @@
 }
 
 const base::TickClock* SchedulerHelper::GetClock() const {
-  return sequence_manager_->GetTickClock();
+  if (sequence_manager_)
+    return sequence_manager_->GetTickClock();
+  return nullptr;
 }
 
 base::TimeTicks SchedulerHelper::NowTicks() const {
diff --git a/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.cc
new file mode 100644
index 0000000..afcd0c2
--- /dev/null
+++ b/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.cc
@@ -0,0 +1,51 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.h"
+
+#include "third_party/blink/renderer/platform/scheduler/common/scheduler_helper.h"
+
+namespace blink {
+namespace scheduler {
+
+namespace {
+const double kSamplingRateForTaskUkm = 0.0001;
+}  // namespace
+
+ThreadSchedulerImpl::ThreadSchedulerImpl()
+    : ukm_task_sampling_rate_(kSamplingRateForTaskUkm),
+      uniform_distribution_(0.0f, 1.0f) {}
+
+ThreadSchedulerImpl::~ThreadSchedulerImpl() = default;
+
+bool ThreadSchedulerImpl::ShouldIgnoreTaskForUkm(bool has_thread_time,
+                                                 double* sampling_rate) {
+  const double thread_time_sampling_rate =
+      GetHelper()->GetSamplingRateForRecordingCPUTime();
+  if (thread_time_sampling_rate && *sampling_rate < thread_time_sampling_rate) {
+    if (!has_thread_time)
+      return true;
+    *sampling_rate /= thread_time_sampling_rate;
+  }
+  return false;
+}
+
+bool ThreadSchedulerImpl::ShouldRecordTaskUkm(bool has_thread_time) {
+  double sampling_rate = ukm_task_sampling_rate_;
+
+  // If thread_time is sampled as well, try to align UKM sampling with it so
+  // that we only record UKMs for tasks that also record thread_time.
+  if (ShouldIgnoreTaskForUkm(has_thread_time, &sampling_rate)) {
+    return false;
+  }
+
+  return uniform_distribution_(random_generator_) < sampling_rate;
+}
+
+void ThreadSchedulerImpl::SetUkmTaskSamplingRateForTest(double sampling_rate) {
+  ukm_task_sampling_rate_ = sampling_rate;
+}
+
+}  // namespace scheduler
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.h
index 20ac914b..270cbdf 100644
--- a/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/common/thread_scheduler_impl.h
@@ -7,6 +7,8 @@
 
 #include "third_party/blink/renderer/platform/platform_export.h"
 
+#include <random>
+
 #include "base/single_thread_task_runner.h"
 #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h"
 #include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
@@ -21,6 +23,7 @@
 
 namespace blink {
 namespace scheduler {
+class SchedulerHelper;
 
 // Scheduler-internal interface for the common methods between
 // MainThreadSchedulerImpl and NonMainThreadSchedulerImpl which should
@@ -42,6 +45,28 @@
   virtual base::sequence_manager::TimeDomain* GetActiveTimeDomain() = 0;
 
   virtual const base::TickClock* GetTickClock() = 0;
+
+ protected:
+  ThreadSchedulerImpl();
+  ~ThreadSchedulerImpl() override;
+
+  // Returns true if the current task should not be reported in UKM because no
+  // thread time was recorded for it. Also updates |sampling_rate| to account
+  // for the ignored tasks by sampling the remaining tasks with higher
+  // probability.
+  bool ShouldIgnoreTaskForUkm(bool has_thread_time, double* sampling_rate);
+
+  // Returns true with probability of kSamplingRateForTaskUkm.
+  bool ShouldRecordTaskUkm(bool has_thread_time);
+
+  virtual SchedulerHelper* GetHelper() = 0;
+
+  void SetUkmTaskSamplingRateForTest(double sampling_rate);
+
+  double ukm_task_sampling_rate_;
+
+  std::mt19937_64 random_generator_;
+  std::uniform_real_distribution<double> uniform_distribution_;
 };
 
 }  // namespace scheduler
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
index 936e0ea..8b7f4b2 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.cc
@@ -296,8 +296,14 @@
   if (!time_budget_pool)
     return;
 
-  time_budget_pool->RemoveQueue(
-      main_thread_scheduler_->tick_clock()->NowTicks(), task_queue);
+  // On tests, the scheduler helper might already be shut down and tick is not
+  // available.
+  base::TimeTicks now;
+  if (main_thread_scheduler_->tick_clock())
+    now = main_thread_scheduler_->tick_clock()->NowTicks();
+  else
+    now = base::TimeTicks::Now();
+  time_budget_pool->RemoveQueue(now, task_queue);
 }
 
 void FrameSchedulerImpl::SetFrameVisible(bool frame_visible) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h
index 35f53fb..d8359c4b 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h
@@ -132,8 +132,8 @@
   base::sequence_manager::TaskQueue::QueuePriority ComputePriority(
       MainThreadTaskQueue* task_queue) const;
 
+  ukm::SourceId GetUkmSourceId() override;
   ukm::UkmRecorder* GetUkmRecorder();
-  ukm::SourceId GetUkmSourceId();
 
   // FrameTaskQueueController::Delegate implementation.
   void OnTaskQueueCreated(
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index 7b171164..eb714f7d 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -63,7 +63,6 @@
 const double kFastCompositingIdleTimeThreshold = .2;
 constexpr base::TimeDelta kQueueingTimeWindowDuration =
     base::TimeDelta::FromSeconds(1);
-const double kSamplingRateForTaskUkm = 0.0001;
 const int64_t kSecondsPerMinute = 60;
 
 // Wake-up throttling trial.
@@ -503,7 +502,6 @@
       max_virtual_time_task_starvation_count(0),
       virtual_time_stopped(false),
       nested_runloop(false),
-      uniform_distribution(0.0f, 1.0f),
       compositing_experiment(main_thread_scheduler_impl),
       should_prioritize_compositing(false) {}
 
@@ -1745,6 +1743,10 @@
   }
 }
 
+SchedulerHelper* MainThreadSchedulerImpl::GetHelper() {
+  return &helper_;
+}
+
 bool MainThreadSchedulerImpl::CanEnterLongIdlePeriod(
     base::TimeTicks now,
     base::TimeDelta* next_long_idle_period_delay_out) {
@@ -2552,6 +2554,7 @@
   ukm::builders::RendererSchedulerTask builder(
       frame_scheduler->GetUkmSourceId());
 
+  builder.SetVersion(kUkmMetricVersion);
   builder.SetPageSchedulers(main_thread_only().page_schedulers.size());
 
   builder.SetRendererBackgrounded(main_thread_only().renderer_backgrounded);
@@ -2763,31 +2766,6 @@
   return main_thread_only().is_audio_playing;
 }
 
-bool MainThreadSchedulerImpl::ShouldIgnoreTaskForUkm(bool has_thread_time,
-                                                     double* sampling_rate) {
-  const double thread_time_sampling_rate =
-      helper_.GetSamplingRateForRecordingCPUTime();
-  if (thread_time_sampling_rate && *sampling_rate < thread_time_sampling_rate) {
-    if (!has_thread_time)
-      return true;
-    *sampling_rate /= thread_time_sampling_rate;
-  }
-  return false;
-}
-
-bool MainThreadSchedulerImpl::ShouldRecordTaskUkm(bool has_thread_time) {
-  double sampling_rate = kSamplingRateForTaskUkm;
-
-  // If thread_time is sampled as well, try to align UKM sampling with it so
-  // that we only record UKMs for tasks that also record thread_time.
-  if (ShouldIgnoreTaskForUkm(has_thread_time, &sampling_rate)) {
-    return false;
-  }
-
-  return main_thread_only().uniform_distribution(
-             main_thread_only().random_generator) < sampling_rate;
-}
-
 bool MainThreadSchedulerImpl::ShouldUpdateTaskQueuePriorities(
     Policy old_policy) const {
   return old_policy.use_case() !=
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index 8bce663..d288964 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -125,9 +125,6 @@
                net::RequestPrioritySize::NUM_PRIORITIES>
         net_to_blink_priority;
 
-    // Turn on relevant experiments during the loading phase.
-    bool experiment_only_when_loading;
-
     using FrameTaskTypeToQueueTraitsArray =
         std::array<base::Optional<MainThreadTaskQueue::QueueTraits>,
                    static_cast<size_t>(TaskType::kCount)>;
@@ -590,6 +587,9 @@
     MainThreadSchedulerImpl* scheduler_;  // NOT OWNED
   };
 
+  // ThreadSchedulerImpl implementation:
+  SchedulerHelper* GetHelper() override;
+
   // IdleHelper::Delegate implementation:
   bool CanEnterLongIdlePeriod(
       base::TimeTicks now,
@@ -597,8 +597,8 @@
   void IsNotQuiescent() override {}
   void OnIdlePeriodStarted() override;
   void OnIdlePeriodEnded() override;
-
   void OnPendingTasksChanged(bool has_tasks) override;
+
   void DispatchRequestBeginMainFrameNotExpected(bool has_tasks);
 
   void EndIdlePeriod();
@@ -651,7 +651,7 @@
     kForceUpdate,
   };
 
-  // The implelemtation of UpdatePolicy & ForceUpdatePolicy.  It is allowed to
+  // The implementation of UpdatePolicy & ForceUpdatePolicy.  It is allowed to
   // early out if |update_type| is kMayEarlyOutIfPolicyUnchanged.
   virtual void UpdatePolicyLocked(UpdateType update_type);
 
@@ -710,15 +710,6 @@
   // TaskQueueThrottler.
   void VirtualTimeResumed();
 
-  // Returns true if the current task should not be reported in UKM because no
-  // thread time was recorded for it. Also updates |sampling_rate| to account
-  // for the ignored tasks by sampling the remaining tasks with higher
-  // probability.
-  bool ShouldIgnoreTaskForUkm(bool has_thread_time, double* sampling_rate);
-
-  // Returns true with probability of kSamplingRateForTaskUkm.
-  bool ShouldRecordTaskUkm(bool has_thread_time);
-
   // Returns true if there is a change in the main thread's policy that should
   // trigger a priority update.
   bool ShouldUpdateTaskQueuePriorities(Policy new_policy) const;
@@ -861,9 +852,9 @@
     std::unique_ptr<base::SingleSampleMetric> max_queueing_time_metric;
     base::TimeDelta max_queueing_time;
     base::TimeTicks background_status_changed_at;
-    std::set<PageSchedulerImpl*> page_schedulers;  // Not owned.
+    std::set<PageSchedulerImpl*> page_schedulers;                 // Not owned.
     base::ObserverList<WebRAILModeObserver> rail_mode_observers;  // Not owned.
-    WakeUpBudgetPool* wake_up_budget_pool;         // Not owned.
+    WakeUpBudgetPool* wake_up_budget_pool;                        // Not owned.
     MainThreadMetricsHelper metrics_helper;
     TraceableState<RendererProcessType, kTracingCategoryNameTopLevel>
         process_type;
@@ -904,9 +895,6 @@
     // True if a nested RunLoop is running.
     bool nested_runloop;
 
-    std::mt19937_64 random_generator;
-    std::uniform_real_distribution<double> uniform_distribution;
-
     // High-priority for compositing events after input experiment.
     PrioritizeCompositingAfterInputExperiment compositing_experiment;
     bool should_prioritize_compositing;
diff --git a/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h
index 57bffd3..8139d02a 100644
--- a/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/public/background_scheduler.h
@@ -7,7 +7,7 @@
 
 #include "base/location.h"
 #include "base/sequenced_task_runner.h"
-#include "base/task_scheduler/task_traits.h"
+#include "base/task/task_traits.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
diff --git a/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h
index 15dd03b7..a644fbe 100644
--- a/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h
@@ -33,7 +33,7 @@
     virtual ~Delegate() = default;
 
     virtual ukm::UkmRecorder* GetUkmRecorder() = 0;
-    virtual int64_t GetUkmSourceId() = 0;
+    virtual ukm::SourceId GetUkmSourceId() = 0;
   };
 
   ~FrameScheduler() override = default;
@@ -148,6 +148,9 @@
   // of the page.
   virtual bool IsExemptFromBudgetBasedThrottling() const = 0;
 
+  // Returns UKM source id for recording metrics associated with this frame.
+  virtual ukm::SourceId GetUkmSourceId() = 0;
+
   FrameScheduler* ToFrameScheduler() override { return this; }
 
   // Returns a handle that prevents resource loading as long as the handle
diff --git a/third_party/blink/renderer/platform/scheduler/test/fake_frame_scheduler.h b/third_party/blink/renderer/platform/scheduler/test/fake_frame_scheduler.h
index 4bf9815d..fb070668 100644
--- a/third_party/blink/renderer/platform/scheduler/test/fake_frame_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/test/fake_frame_scheduler.h
@@ -38,13 +38,16 @@
         frame_type_(FrameScheduler::FrameType::kSubframe),
         is_cross_origin_(false),
         is_exempt_from_throttling_(false) {}
+
   FakeFrameScheduler(PageScheduler* page_scheduler,
                      bool is_page_visible,
                      bool is_frame_visible,
                      FrameScheduler::FrameType frame_type,
                      bool is_cross_origin,
-                     bool is_exempt_from_throttling)
-      : page_scheduler_(page_scheduler),
+                     bool is_exempt_from_throttling,
+                     FrameScheduler::Delegate* delegate)
+      : FrameSchedulerImpl(nullptr, nullptr, delegate, nullptr, frame_type),
+        page_scheduler_(page_scheduler),
         is_page_visible_(is_page_visible),
         is_frame_visible_(is_frame_visible),
         frame_type_(frame_type),
@@ -61,7 +64,7 @@
     std::unique_ptr<FakeFrameScheduler> Build() {
       return std::make_unique<FakeFrameScheduler>(
           page_scheduler_, is_page_visible_, is_frame_visible_, frame_type_,
-          is_cross_origin_, is_exempt_from_throttling_);
+          is_cross_origin_, is_exempt_from_throttling_, delegate_);
     }
 
     Builder& SetPageScheduler(PageScheduler* page_scheduler) {
@@ -94,6 +97,11 @@
       return *this;
     }
 
+    Builder& SetDelegate(FrameScheduler::Delegate* delegate) {
+      delegate_ = delegate;
+      return *this;
+    }
+
    private:
     PageScheduler* page_scheduler_ = nullptr;
     bool is_page_visible_ = false;
@@ -102,6 +110,7 @@
         FrameScheduler::FrameType::kMainFrame;
     bool is_cross_origin_ = false;
     bool is_exempt_from_throttling_ = false;
+    FrameScheduler::Delegate* delegate_ = nullptr;
   };
 
   // FrameScheduler implementation:
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
index dab72573..3b795781 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.cc
@@ -101,5 +101,9 @@
   return helper_.GetClock();
 }
 
+SchedulerHelper* NonMainThreadSchedulerImpl::GetHelper() {
+  return &helper_;
+}
+
 }  // namespace scheduler
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
index 6ea7939d..019dae1 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h
@@ -100,6 +100,8 @@
   NonMainThreadSchedulerHelper* helper() { return &helper_; }
 
  private:
+  SchedulerHelper* GetHelper() override;
+
   NonMainThreadSchedulerHelper helper_;
 
   DISALLOW_COPY_AND_ASSIGN(NonMainThreadSchedulerImpl);
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.cc
index 67d6279..9400efc 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.cc
@@ -4,6 +4,8 @@
 
 #include "third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h"
 
+#include "services/metrics/public/cpp/mojo_ukm_recorder.h"
+#include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_scheduler_impl.h"
 #include "third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h"
 #include "third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h"
@@ -17,6 +19,12 @@
       FrameOrWorkerScheduler::ObserverType::kWorkerScheduler, this);
   if (FrameScheduler* frame_scheduler = scheduler->ToFrameScheduler()) {
     parent_frame_type_ = GetFrameOriginType(frame_scheduler);
+    initial_frame_status_ = GetFrameStatus(frame_scheduler);
+    ukm_source_id_ = frame_scheduler->GetUkmSourceId();
+    if (ukm_source_id_ != ukm::kInvalidSourceId) {
+      ukm_recorder_ =
+          ukm::MojoUkmRecorder::Create(Platform::Current()->GetConnector());
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h
index e01b24f..5699b21 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_scheduler_proxy.h
@@ -11,9 +11,12 @@
 #include "base/optional.h"
 #include "base/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
+#include "services/metrics/public/cpp/ukm_source_id.h"
 #include "third_party/blink/renderer/platform/platform_export.h"
 #include "third_party/blink/renderer/platform/scheduler/main_thread/frame_origin_type.h"
 #include "third_party/blink/renderer/platform/scheduler/public/frame_or_worker_scheduler.h"
+#include "third_party/blink/renderer/platform/scheduler/renderer/frame_status.h"
 #include "third_party/blink/renderer/platform/wtf/wtf.h"
 
 namespace blink {
@@ -52,6 +55,28 @@
     return parent_frame_type_;
   }
 
+  // Accessed only during init.
+  ukm::SourceId ukm_source_id() const {
+    DCHECK(!initialized_);
+    return ukm_source_id_;
+  }
+
+  // Accessed only during init.
+  std::unique_ptr<ukm::UkmRecorder> TakeUkmRecorder() {
+    DCHECK(!initialized_);
+#if DCHECK_IS_ON()
+    DCHECK(!ukm_recorder_taken_);
+    ukm_recorder_taken_ = true;
+#endif
+    return std::move(ukm_recorder_);
+  }
+
+  // Accessed only during init.
+  FrameStatus initial_frame_status() const {
+    DCHECK(!initialized_);
+    return initial_frame_status_;
+  }
+
  private:
   // Can be accessed only from the worker thread.
   base::WeakPtr<WorkerScheduler> worker_scheduler_;
@@ -66,8 +91,14 @@
       throttling_observer_handle_;
 
   bool initialized_ = false;
-
   base::Optional<FrameOriginType> parent_frame_type_;
+  FrameStatus initial_frame_status_ = FrameStatus::kNone;
+  ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId;
+  std::unique_ptr<ukm::UkmRecorder> ukm_recorder_;
+
+#if DCHECK_IS_ON()
+  bool ukm_recorder_taken_ = false;
+#endif
 
   THREAD_CHECKER(parent_thread_checker_);
 
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
index 6541a2c..259928f 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.cc
@@ -15,8 +15,10 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/trace_event/trace_event.h"
 #include "base/trace_event/trace_event_argument.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
 #include "third_party/blink/renderer/platform/histogram.h"
 #include "third_party/blink/renderer/platform/scheduler/child/features.h"
+#include "third_party/blink/renderer/platform/scheduler/child/process_state.h"
 #include "third_party/blink/renderer/platform/scheduler/common/throttling/task_queue_throttler.h"
 #include "third_party/blink/renderer/platform/scheduler/public/worker_scheduler.h"
 #include "third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_helper.h"
@@ -98,6 +100,7 @@
     WorkerSchedulerProxy* proxy)
     : NonMainThreadSchedulerImpl(std::move(sequence_manager),
                                  TaskType::kWorkerThreadTaskQueueDefault),
+      thread_type_(thread_type),
       idle_helper_(helper(),
                    this,
                    "WorkerSchedulerIdlePeriod",
@@ -110,7 +113,11 @@
                     kUnspecifiedWorkerThreadLoadTrackerReportingInterval),
       lifecycle_state_(proxy ? proxy->lifecycle_state()
                              : SchedulingLifecycleState::kNotThrottled),
-      worker_metrics_helper_(thread_type, helper()->HasCPUTimingForEachTask()) {
+      worker_metrics_helper_(thread_type, helper()->HasCPUTimingForEachTask()),
+      initial_frame_status_(proxy ? proxy->initial_frame_status()
+                                  : FrameStatus::kNone),
+      ukm_source_id_(proxy ? proxy->ukm_source_id() : ukm::kInvalidSourceId),
+      ukm_recorder_(proxy ? proxy->TakeUkmRecorder() : nullptr) {
   thread_start_time_ = helper()->NowTicks();
   load_tracker_.Resume(thread_start_time_);
   helper()->AddTaskTimeObserver(this);
@@ -209,16 +216,17 @@
 }
 
 void WorkerThreadScheduler::OnTaskCompleted(
-    NonMainThreadTaskQueue* worker_task_queue,
+    NonMainThreadTaskQueue* task_queue,
     const TaskQueue::Task& task,
     const TaskQueue::TaskTiming& task_timing) {
-  worker_metrics_helper_.RecordTaskMetrics(worker_task_queue, task,
-                                           task_timing);
+  worker_metrics_helper_.RecordTaskMetrics(task_queue, task, task_timing);
 
   if (task_queue_throttler_) {
     task_queue_throttler_->OnTaskRunTimeReported(
-        worker_task_queue, task_timing.start_time(), task_timing.end_time());
+        task_queue, task_timing.start_time(), task_timing.end_time());
   }
+
+  RecordTaskUkm(task_queue, task, task_timing);
 }
 
 SchedulerHelper* WorkerThreadScheduler::GetSchedulerHelperForTesting() {
@@ -286,6 +294,34 @@
   cpu_time_budget_pool_->SetMaxThrottlingDelay(now, GetMaxThrottlingDelay());
 }
 
+void WorkerThreadScheduler::RecordTaskUkm(
+    NonMainThreadTaskQueue* worker_task_queue,
+    const base::sequence_manager::TaskQueue::Task& task,
+    const base::sequence_manager::TaskQueue::TaskTiming& task_timing) {
+  if (!ShouldRecordTaskUkm(task_timing.has_thread_time()))
+    return;
+  ukm::builders::RendererSchedulerTask builder(ukm_source_id_);
+
+  builder.SetVersion(kUkmMetricVersion);
+  builder.SetThreadType(static_cast<int>(thread_type_));
+
+  builder.SetRendererBackgrounded(
+      internal::ProcessState::Get()->is_process_backgrounded);
+  builder.SetTaskType(task.task_type());
+  builder.SetFrameStatus(static_cast<int>(initial_frame_status_));
+  builder.SetTaskDuration(task_timing.wall_duration().InMicroseconds());
+
+  if (task_timing.has_thread_time())
+    builder.SetTaskCPUDuration(task_timing.thread_duration().InMicroseconds());
+
+  builder.Record(ukm_recorder_.get());
+}
+
+void WorkerThreadScheduler::SetUkmRecorderForTest(
+    std::unique_ptr<ukm::UkmRecorder> ukm_recorder) {
+  ukm_recorder_ = std::move(ukm_recorder);
+}
+
 void WorkerThreadScheduler::SetCPUTimeBudgetPoolForTesting(
     CPUTimeBudgetPool* cpu_time_budget_pool) {
   cpu_time_budget_pool_ = cpu_time_budget_pool;
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h
index e1f6590b..7d560b95a 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h
@@ -14,6 +14,7 @@
 #include "third_party/blink/renderer/platform/scheduler/common/idle_canceled_delayed_task_sweeper.h"
 #include "third_party/blink/renderer/platform/scheduler/common/idle_helper.h"
 #include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
+#include "third_party/blink/renderer/platform/scheduler/renderer/frame_status.h"
 #include "third_party/blink/renderer/platform/scheduler/util/thread_load_tracker.h"
 #include "third_party/blink/renderer/platform/scheduler/worker/non_main_thread_scheduler_impl.h"
 #include "third_party/blink/renderer/platform/scheduler/worker/worker_metrics_helper.h"
@@ -24,6 +25,10 @@
 }
 }  // namespace base
 
+namespace ukm {
+class UkmRecorder;
+}
+
 namespace blink {
 namespace scheduler {
 
@@ -116,9 +121,17 @@
 
   std::unordered_set<WorkerScheduler*>& GetWorkerSchedulersForTesting();
 
+  void SetUkmRecorderForTest(std::unique_ptr<ukm::UkmRecorder> ukm_recorder);
+
  private:
   void MaybeStartLongIdlePeriod();
 
+  void RecordTaskUkm(
+      NonMainThreadTaskQueue* worker_task_queue,
+      const base::sequence_manager::TaskQueue::Task& task,
+      const base::sequence_manager::TaskQueue::TaskTiming& task_timing);
+
+  const WebThreadType thread_type_;
   IdleHelper idle_helper_;
   IdleCanceledDelayedTaskSweeper idle_canceled_delayed_task_sweeper_;
   ThreadLoadTracker load_tracker_;
@@ -143,6 +156,12 @@
   WakeUpBudgetPool* wake_up_budget_pool_ = nullptr;
   CPUTimeBudgetPool* cpu_time_budget_pool_ = nullptr;
 
+  // The status of the parent frame when the worker was created.
+  const FrameStatus initial_frame_status_;
+
+  const ukm::SourceId ukm_source_id_;
+  std::unique_ptr<ukm::UkmRecorder> ukm_recorder_;
+
   DISALLOW_COPY_AND_ASSIGN(WorkerThreadScheduler);
 };
 
diff --git a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc
index 67979a0..afaf4d1 100644
--- a/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler_unittest.cc
@@ -3,15 +3,18 @@
 // found in the LICENSE file.
 
 #include "third_party/blink/renderer/platform/scheduler/worker/worker_thread_scheduler.h"
-
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/stringprintf.h"
+#include "base/task/sequence_manager/test/fake_task.h"
 #include "base/task/sequence_manager/test/sequence_manager_for_test.h"
 #include "base/test/scoped_task_environment.h"
+#include "components/ukm/test_ukm_recorder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/renderer/platform/scheduler/child/process_state.h"
+#include "third_party/blink/renderer/platform/scheduler/test/fake_frame_scheduler.h"
 
 using testing::ElementsAreArray;
 
@@ -61,6 +64,20 @@
         clock_(clock_),
         timeline_(timeline) {}
 
+  WorkerThreadSchedulerForTest(
+      std::unique_ptr<base::sequence_manager::SequenceManager> manager,
+      const base::TickClock* clock_,
+      std::vector<std::string>* timeline,
+      WorkerSchedulerProxy* proxy)
+      : WorkerThreadScheduler(WebThreadType::kTestThread,
+                              std::move(manager),
+                              proxy),
+        clock_(clock_),
+        timeline_(timeline) {}
+
+  using ThreadSchedulerImpl::SetUkmTaskSamplingRateForTest;
+  using WorkerThreadScheduler::SetUkmRecorderForTest;
+
  private:
   bool CanEnterLongIdlePeriod(
       base::TimeTicks now,
@@ -370,6 +387,113 @@
   EXPECT_THAT(timeline_, ElementsAreArray(expected_timeline));
 }
 
+namespace {
+
+class FrameSchedulerDelegateWithUkmSourceId : public FrameScheduler::Delegate {
+ public:
+  FrameSchedulerDelegateWithUkmSourceId(ukm::SourceId source_id)
+      : source_id_(source_id) {}
+
+  ~FrameSchedulerDelegateWithUkmSourceId() override {}
+
+  ukm::UkmRecorder* GetUkmRecorder() override { return nullptr; }
+
+  ukm::SourceId GetUkmSourceId() override { return source_id_; }
+
+ private:
+  ukm::SourceId source_id_;
+};
+
+}  // namespace
+
+class WorkerThreadSchedulerWithProxyTest : public testing::Test {
+ public:
+  WorkerThreadSchedulerWithProxyTest()
+      : task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME,
+            base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED) {
+    frame_scheduler_delegate_ =
+        std::make_unique<FrameSchedulerDelegateWithUkmSourceId>(42);
+    frame_scheduler_ = FakeFrameScheduler::Builder()
+                           .SetIsPageVisible(false)
+                           .SetFrameType(FrameScheduler::FrameType::kSubframe)
+                           .SetIsCrossOrigin(true)
+                           .SetDelegate(frame_scheduler_delegate_.get())
+                           .Build();
+    frame_scheduler_->SetCrossOrigin(true);
+
+    worker_scheduler_proxy_ =
+        std::make_unique<WorkerSchedulerProxy>(frame_scheduler_.get());
+
+    scheduler_ = std::make_unique<WorkerThreadSchedulerForTest>(
+        base::sequence_manager::SequenceManagerForTest::Create(
+            nullptr, task_environment_.GetMainThreadTaskRunner(),
+            task_environment_.GetMockTickClock()),
+        task_environment_.GetMockTickClock(), &timeline_,
+        worker_scheduler_proxy_.get());
+
+    task_environment_.FastForwardBy(base::TimeDelta::FromMilliseconds(5));
+
+    scheduler_->Init();
+  }
+
+  ~WorkerThreadSchedulerWithProxyTest() override = default;
+
+  void TearDown() override {
+    task_environment_.FastForwardUntilNoTasksRemain();
+  }
+
+ protected:
+  base::test::ScopedTaskEnvironment task_environment_;
+  std::vector<std::string> timeline_;
+  std::unique_ptr<FrameScheduler::Delegate> frame_scheduler_delegate_;
+  std::unique_ptr<FrameScheduler> frame_scheduler_;
+  std::unique_ptr<WorkerSchedulerProxy> worker_scheduler_proxy_;
+  std::unique_ptr<WorkerThreadSchedulerForTest> scheduler_;
+  scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_;
+  scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_;
+
+  DISALLOW_COPY_AND_ASSIGN(WorkerThreadSchedulerWithProxyTest);
+};
+
+TEST_F(WorkerThreadSchedulerWithProxyTest, UkmTaskRecording) {
+  internal::ProcessState::Get()->is_process_backgrounded = true;
+
+  std::unique_ptr<ukm::TestUkmRecorder> owned_ukm_recorder =
+      std::make_unique<ukm::TestUkmRecorder>();
+  ukm::TestUkmRecorder* ukm_recorder = owned_ukm_recorder.get();
+
+  scheduler_->SetUkmTaskSamplingRateForTest(1);
+  scheduler_->SetUkmRecorderForTest(std::move(owned_ukm_recorder));
+
+  base::sequence_manager::FakeTask task(
+      static_cast<int>(TaskType::kJavascriptTimer));
+  base::sequence_manager::FakeTaskTiming task_timing(
+      base::TimeTicks() + base::TimeDelta::FromMilliseconds(200),
+      base::TimeTicks() + base::TimeDelta::FromMilliseconds(700),
+      base::ThreadTicks() + base::TimeDelta::FromMilliseconds(250),
+      base::ThreadTicks() + base::TimeDelta::FromMilliseconds(500));
+
+  scheduler_->OnTaskCompleted(nullptr, task, task_timing);
+
+  auto entries = ukm_recorder->GetEntriesByName("RendererSchedulerTask");
+
+  EXPECT_EQ(entries.size(), static_cast<size_t>(1));
+
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      entries[0], "ThreadType", static_cast<int>(WebThreadType::kTestThread));
+  ukm::TestUkmRecorder::ExpectEntryMetric(entries[0], "RendererBackgrounded",
+                                          true);
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      entries[0], "TaskType", static_cast<int>(TaskType::kJavascriptTimer));
+  ukm::TestUkmRecorder::ExpectEntryMetric(
+      entries[0], "FrameStatus",
+      static_cast<int>(FrameStatus::kCrossOriginBackground));
+  ukm::TestUkmRecorder::ExpectEntryMetric(entries[0], "TaskDuration", 500000);
+  ukm::TestUkmRecorder::ExpectEntryMetric(entries[0], "TaskCPUDuration",
+                                          250000);
+}
+
 }  // namespace worker_thread_scheduler_unittest
 }  // namespace scheduler
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support.cc b/third_party/blink/renderer/platform/testing/testing_platform_support.cc
index c79a317..2017a8c 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support.cc
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support.cc
@@ -150,6 +150,14 @@
   base::RunLoop().RunUntilIdle();
 }
 
+bool TestingPlatformSupport::IsThreadedAnimationEnabled() {
+  return is_threaded_animation_enabled_;
+}
+
+void TestingPlatformSupport::SetThreadedAnimationEnabled(bool enabled) {
+  is_threaded_animation_enabled_ = enabled;
+}
+
 class ScopedUnittestsEnvironmentSetup::DummyPlatform final
     : public blink::Platform {
  public:
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support.h b/third_party/blink/renderer/platform/testing/testing_platform_support.h
index 649aff36..2e9e5ff3 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support.h
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support.h
@@ -68,8 +68,10 @@
       override;
   WebData GetDataResource(const char* name) override;
   InterfaceProvider* GetInterfaceProvider() override;
+  bool IsThreadedAnimationEnabled() override;
 
   virtual void RunUntilIdle();
+  void SetThreadedAnimationEnabled(bool enabled);
 
   // Overrides the handling of GetInterface on the platform's associated
   // interface provider.
@@ -91,6 +93,9 @@
   Platform* const old_platform_;
   std::unique_ptr<TestingInterfaceProvider> interface_provider_;
 
+ private:
+  bool is_threaded_animation_enabled_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(TestingPlatformSupport);
 };
 
diff --git a/third_party/blink/renderer/platform/timer_test.cc b/third_party/blink/renderer/platform/timer_test.cc
index f7760e11..faa5559 100644
--- a/third_party/blink/renderer/platform/timer_test.cc
+++ b/third_party/blink/renderer/platform/timer_test.cc
@@ -28,6 +28,14 @@
 
 class TimerTest : public testing::Test {
  public:
+  TimerTest() {
+    scoped_refptr<MainThreadTaskQueue> task_queue =
+        platform_->GetMainThreadScheduler()->NewTaskQueue(
+            MainThreadTaskQueue::QueueCreationParams(
+                MainThreadTaskQueue::QueueType::kTest));
+    task_runner_ = task_queue->CreateTaskRunner(TaskType::kInternalTest);
+  }
+
   void SetUp() override {
     run_times_.clear();
     platform_->AdvanceClock(TimeDelta::FromSeconds(10));
@@ -63,12 +71,17 @@
     return true;
   }
 
+  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() {
+    return task_runner_;
+  }
+
  protected:
   TimeTicks start_time_;
   WTF::Vector<TimeTicks> run_times_;
   WTF::Vector<TimeTicks> next_fire_times_;
   ScopedTestingPlatformSupport<TestingPlatformSupportWithMockScheduler>
       platform_;
+  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
   base::MessageLoop message_loop_;
 };
@@ -127,9 +140,8 @@
 };
 
 TEST_F(TimerTest, StartOneShot_Zero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   TimeDelta run_time;
@@ -140,9 +152,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_ZeroAndCancel) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   TimeDelta run_time;
@@ -155,9 +166,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_ZeroAndCancelThenRepost) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   TimeDelta run_time;
@@ -177,9 +187,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_Zero_RepostingAfterRunning) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   TimeDelta run_time;
@@ -197,9 +206,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_NonZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   TimeDelta run_time;
@@ -212,9 +220,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_NonZeroAndCancel) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   TimeDelta run_time;
@@ -229,9 +236,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_NonZeroAndCancelThenRepost) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   TimeDelta run_time;
@@ -256,9 +262,8 @@
 }
 
 TEST_F(TimerTest, StartOneShot_NonZero_RepostingAfterRunning) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   TimeDelta run_time;
@@ -281,9 +286,8 @@
 }
 
 TEST_F(TimerTest, PostingTimerTwiceWithSameRunTimeDoesNothing) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
@@ -297,9 +301,8 @@
 }
 
 TEST_F(TimerTest, PostingTimerTwiceWithNewerRunTimeCancelsOriginalTask) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
@@ -308,9 +311,8 @@
 }
 
 TEST_F(TimerTest, PostingTimerTwiceWithLaterRunTimeCancelsOriginalTask) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
@@ -320,9 +322,8 @@
 }
 
 TEST_F(TimerTest, StartRepeatingTask) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE);
 
   TimeDelta run_time;
@@ -338,9 +339,8 @@
 }
 
 TEST_F(TimerTest, StartRepeatingTask_ThenCancel) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE);
 
   TimeDelta run_time;
@@ -359,9 +359,8 @@
 }
 
 TEST_F(TimerTest, StartRepeatingTask_ThenPostOneShot) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE);
 
   TimeDelta run_time;
@@ -382,44 +381,39 @@
 }
 
 TEST_F(TimerTest, IsActive_NeverPosted) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
 
   EXPECT_FALSE(timer.IsActive());
 }
 
 TEST_F(TimerTest, IsActive_AfterPosting_OneShotZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   EXPECT_TRUE(timer.IsActive());
 }
 
 TEST_F(TimerTest, IsActive_AfterPosting_OneShotNonZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   EXPECT_TRUE(timer.IsActive());
 }
 
 TEST_F(TimerTest, IsActive_AfterPosting_Repeating) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE);
 
   EXPECT_TRUE(timer.IsActive());
 }
 
 TEST_F(TimerTest, IsActive_AfterRunning_OneShotZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   platform_->RunUntilIdle();
@@ -427,9 +421,8 @@
 }
 
 TEST_F(TimerTest, IsActive_AfterRunning_OneShotNonZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   platform_->RunUntilIdle();
@@ -437,9 +430,8 @@
 }
 
 TEST_F(TimerTest, IsActive_AfterRunning_Repeating) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(1), FROM_HERE);
 
   RunUntilDeadline(start_time_ + TimeDelta::FromSeconds(10));
@@ -447,18 +439,16 @@
 }
 
 TEST_F(TimerTest, NextFireInterval_OneShotZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   EXPECT_TRUE(timer.NextFireInterval().is_zero());
 }
 
 TEST_F(TimerTest, NextFireInterval_OneShotNonZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   EXPECT_EQ(TimeDelta::FromSeconds(10), timer.NextFireInterval());
@@ -467,9 +457,8 @@
 TEST_F(TimerTest, NextFireInterval_OneShotNonZero_AfterAFewSeconds) {
   platform_->SetAutoAdvanceNowToPendingTasks(false);
 
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   platform_->AdvanceClock(TimeDelta::FromSeconds(2));
@@ -477,53 +466,47 @@
 }
 
 TEST_F(TimerTest, NextFireInterval_Repeating) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(20), FROM_HERE);
 
   EXPECT_EQ(TimeDelta::FromSeconds(20), timer.NextFireInterval());
 }
 
 TEST_F(TimerTest, RepeatInterval_NeverStarted) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
 
   EXPECT_TRUE(timer.RepeatInterval().is_zero());
 }
 
 TEST_F(TimerTest, RepeatInterval_OneShotZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta(), FROM_HERE);
 
   EXPECT_TRUE(timer.RepeatInterval().is_zero());
 }
 
 TEST_F(TimerTest, RepeatInterval_OneShotNonZero) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
 
   EXPECT_TRUE(timer.RepeatInterval().is_zero());
 }
 
 TEST_F(TimerTest, RepeatInterval_Repeating) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(20), FROM_HERE);
 
   EXPECT_EQ(TimeDelta::FromSeconds(20), timer.RepeatInterval());
 }
 
 TEST_F(TimerTest, AugmentRepeatInterval) {
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(10), FROM_HERE);
   EXPECT_EQ(TimeDelta::FromSeconds(10), timer.RepeatInterval());
   EXPECT_EQ(TimeDelta::FromSeconds(10), timer.NextFireInterval());
@@ -543,9 +526,8 @@
 TEST_F(TimerTest, AugmentRepeatInterval_TimerFireDelayed) {
   platform_->SetAutoAdvanceNowToPendingTasks(false);
 
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::CountingTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::CountingTask);
   timer.StartRepeating(TimeDelta::FromSeconds(10), FROM_HERE);
   EXPECT_EQ(TimeDelta::FromSeconds(10), timer.RepeatInterval());
   EXPECT_EQ(TimeDelta::FromSeconds(10), timer.NextFireInterval());
@@ -562,9 +544,8 @@
 TEST_F(TimerTest, RepeatingTimerDoesNotDrift) {
   platform_->SetAutoAdvanceNowToPendingTasks(false);
 
-  TaskRunnerTimer<TimerTest> timer(
-      platform_->GetMainThreadScheduler()->DefaultTaskRunner(), this,
-      &TimerTest::RecordNextFireTimeTask);
+  TaskRunnerTimer<TimerTest> timer(GetTaskRunner(), this,
+                                   &TimerTest::RecordNextFireTimeTask);
   timer.StartRepeating(TimeDelta::FromSeconds(2), FROM_HERE);
 
   RecordNextFireTimeTask(
@@ -635,8 +616,8 @@
 TEST_F(TimerTest, RunOnHeapTimer) {
   scoped_refptr<OnHeapTimerOwner::Record> record =
       OnHeapTimerOwner::Record::Create();
-  Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(
-      record, platform_->GetMainThreadScheduler()->DefaultTaskRunner());
+  Persistent<OnHeapTimerOwner> owner =
+      new OnHeapTimerOwner(record, GetTaskRunner());
 
   owner->StartOneShot(TimeDelta(), FROM_HERE);
 
@@ -648,8 +629,8 @@
 TEST_F(TimerTest, DestructOnHeapTimer) {
   scoped_refptr<OnHeapTimerOwner::Record> record =
       OnHeapTimerOwner::Record::Create();
-  Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(
-      record, platform_->GetMainThreadScheduler()->DefaultTaskRunner());
+  Persistent<OnHeapTimerOwner> owner =
+      new OnHeapTimerOwner(record, GetTaskRunner());
 
   record->Dispose();
   owner->StartOneShot(TimeDelta(), FROM_HERE);
@@ -668,8 +649,8 @@
 TEST_F(TimerTest, MarkOnHeapTimerAsUnreachable) {
   scoped_refptr<OnHeapTimerOwner::Record> record =
       OnHeapTimerOwner::Record::Create();
-  Persistent<OnHeapTimerOwner> owner = new OnHeapTimerOwner(
-      record, platform_->GetMainThreadScheduler()->DefaultTaskRunner());
+  Persistent<OnHeapTimerOwner> owner =
+      new OnHeapTimerOwner(record, GetTaskRunner());
 
   record->Dispose();
   owner->StartOneShot(TimeDelta(), FROM_HERE);
diff --git a/third_party/blink/renderer/platform/weborigin/scheme_registry.cc b/third_party/blink/renderer/platform/weborigin/scheme_registry.cc
index 8b511f95..a86de19 100644
--- a/third_party/blink/renderer/platform/weborigin/scheme_registry.cc
+++ b/third_party/blink/renderer/platform/weborigin/scheme_registry.cc
@@ -224,11 +224,6 @@
       scheme);
 }
 
-void SchemeRegistry::RegisterURLSchemeAsCORSEnabled(const String& scheme) {
-  DCHECK_EQ(scheme, scheme.LowerASCII());
-  GetMutableURLSchemesRegistry().cors_enabled_schemes.insert(scheme);
-}
-
 bool SchemeRegistry::ShouldTreatURLSchemeAsCORSEnabled(const String& scheme) {
   DCHECK_EQ(scheme, scheme.LowerASCII());
   if (scheme.IsEmpty())
diff --git a/third_party/blink/renderer/platform/weborigin/scheme_registry.h b/third_party/blink/renderer/platform/weborigin/scheme_registry.h
index 09189d0..4676a712 100644
--- a/third_party/blink/renderer/platform/weborigin/scheme_registry.h
+++ b/third_party/blink/renderer/platform/weborigin/scheme_registry.h
@@ -87,12 +87,6 @@
   static bool ShouldTreatURLSchemeAsNotAllowingJavascriptURLs(
       const String& scheme);
 
-  // Allow non-HTTP schemes to be registered to allow CORS requests.
-  // This is not used in Chromium anymore but left here intentionally
-  // to allow other embedders of Blink to add more schemes
-  // to the CORS-enabled schemes list.
-  // As for now (Nov 2017) it is used by Electron.
-  static void RegisterURLSchemeAsCORSEnabled(const String& scheme);
   static bool ShouldTreatURLSchemeAsCORSEnabled(const String& scheme);
 
   // Serialize the registered schemes in a comma-separated list.
diff --git a/third_party/blink/renderer/platform/wtf/allocator.h b/third_party/blink/renderer/platform/wtf/allocator.h
index 8fa9e5f..31722fdd 100644
--- a/third_party/blink/renderer/platform/wtf/allocator.h
+++ b/third_party/blink/renderer/platform/wtf/allocator.h
@@ -71,20 +71,21 @@
   friend class ::WTF::internal::__thisIsHereToForceASemicolonAfterThisMacro
 
 #if defined(__clang__)
-#define STACK_ALLOCATED()                                                \
- public:                                                                 \
-  using IsStackAllocatedTypeMarker[[maybe_unused]] = int;                \
-                                                                         \
- private:                                                                \
-  __attribute__((annotate("blink_stack_allocated"))) void* operator new( \
-      size_t) = delete;                                                  \
-  void* operator new(size_t, NotNullTag, void*) = delete;                \
-  void* operator new(size_t, void*) = delete
-
+#define ANNOTATE_STACK_ALLOCATED \
+  __attribute__((annotate("blink_stack_allocated")))
 #else
-#define STACK_ALLOCATED() DISALLOW_NEW()
+#define ANNOTATE_STACK_ALLOCATED
 #endif
 
+#define STACK_ALLOCATED()                                       \
+ public:                                                        \
+  using IsStackAllocatedTypeMarker[[maybe_unused]] = int;       \
+                                                                \
+ private:                                                       \
+  ANNOTATE_STACK_ALLOCATED void* operator new(size_t) = delete; \
+  void* operator new(size_t, NotNullTag, void*) = delete;       \
+  void* operator new(size_t, void*) = delete
+
 // Provides customizable overrides of fastMalloc/fastFree and operator
 // new/delete
 //
diff --git a/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h b/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h
index aadf62a..1708acd 100644
--- a/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h
+++ b/third_party/tcmalloc/chromium/src/base/spinlock_linux-inl.h
@@ -42,6 +42,17 @@
 #define FUTEX_WAKE 1
 #define FUTEX_PRIVATE_FLAG 128
 
+// Note: Instead of making direct system calls that are inlined, we rely
+//       on the syscall() function in glibc to do the right thing. This
+//       is necessary to make the code compatible with the seccomp sandbox,
+//       which needs to be able to find and patch all places where system
+//       calls are made. Scanning through and patching glibc is fast, but
+//       doing so on the entire Chrome binary would be prohibitively
+//       expensive.
+//       This is a notable change from the upstream version of tcmalloc,
+//       which prefers direct system calls in order to improve compatibility
+//       with older toolchains and runtime libraries.
+
 static bool have_futex;
 static int futex_private_flag = FUTEX_PRIVATE_FLAG;
 
@@ -51,10 +62,10 @@
     int x = 0;
     // futexes are ints, so we can use them only when
     // that's the same size as the lockword_ in SpinLock.
-    have_futex = (sizeof (Atomic32) == sizeof (int) &&
-                  sys_futex(&x, FUTEX_WAKE, 1, NULL, NULL, 0) >= 0);
-    if (have_futex &&
-        sys_futex(&x, FUTEX_WAKE | futex_private_flag, 1, NULL, NULL, 0) < 0) {
+    have_futex = (sizeof(Atomic32) == sizeof(int) &&
+                  syscall(__NR_futex, &x, FUTEX_WAKE, 1, NULL, NULL, 0) >= 0);
+    if (have_futex && syscall(__NR_futex, &x, FUTEX_WAKE | futex_private_flag,
+                              1, NULL, NULL, 0) < 0) {
       futex_private_flag = 0;
     }
   }
@@ -78,10 +89,9 @@
     }
     if (have_futex) {
       tm.tv_nsec *= 16;  // increase the delay; we expect explicit wakeups
-      sys_futex(reinterpret_cast<int *>(const_cast<Atomic32 *>(w)),
-                FUTEX_WAIT | futex_private_flag,
-                value, reinterpret_cast<struct kernel_timespec *>(&tm),
-                NULL, 0);
+      syscall(__NR_futex, reinterpret_cast<int*>(const_cast<Atomic32*>(w)),
+              FUTEX_WAIT | futex_private_flag, value,
+              reinterpret_cast<struct kernel_timespec*>(&tm), NULL, 0);
     } else {
       nanosleep(&tm, NULL);
     }
@@ -91,9 +101,8 @@
 
 void SpinLockWake(volatile Atomic32 *w, bool all) {
   if (have_futex) {
-    sys_futex(reinterpret_cast<int *>(const_cast<Atomic32 *>(w)),
-              FUTEX_WAKE | futex_private_flag, all? INT_MAX : 1,
-              NULL, NULL, 0);
+    syscall(__NR_futex, reinterpret_cast<int*>(const_cast<Atomic32*>(w)),
+            FUTEX_WAKE | futex_private_flag, all ? INT_MAX : 1, NULL, NULL, 0);
   }
 }
 
diff --git a/third_party/tcmalloc/chromium/src/malloc_hook_mmap_linux.h b/third_party/tcmalloc/chromium/src/malloc_hook_mmap_linux.h
old mode 100755
new mode 100644
index 2f6116f..17415aa
--- a/third_party/tcmalloc/chromium/src/malloc_hook_mmap_linux.h
+++ b/third_party/tcmalloc/chromium/src/malloc_hook_mmap_linux.h
@@ -61,7 +61,9 @@
 static inline void* do_mmap64(void *start, size_t length,
                               int prot, int flags,
                               int fd, __off64_t offset) __THROW {
-  return sys_mmap(start, length, prot, flags, fd, offset);
+  // The original gperftools uses sys_mmap() here.  But, it is not allowed by
+  // Chromium's sandbox.
+  return (void*)syscall(SYS_mmap, start, length, prot, flags, fd, offset);
 }
 
 #define MALLOC_HOOK_HAVE_DO_MMAP64 1
@@ -189,7 +191,9 @@
   MallocHook::InvokeMunmapHook(start, length);
   int result;
   if (!MallocHook::InvokeMunmapReplacement(start, length, &result)) {
-    result = sys_munmap(start, length);
+    // The original gperftools uses sys_munmap() here.  But, it is not allowed
+    // by Chromium's sandbox.
+    result = syscall(SYS_munmap, start, length);
   }
   return result;
 }
@@ -200,7 +204,10 @@
   va_start(ap, flags);
   void *new_address = va_arg(ap, void *);
   va_end(ap);
-  void* result = sys_mremap(old_addr, old_size, new_size, flags, new_address);
+  // The original gperftools uses sys_mremap() here.  But, it is not allowed by
+  // Chromium's sandbox.
+  void* result = (void*)syscall(SYS_mremap, old_addr, old_size, new_size, flags,
+                                new_address);
   MallocHook::InvokeMremapHook(result, old_addr, old_size, new_size, flags,
                                new_address);
   return result;
diff --git a/third_party/test_fonts/README.chromium b/third_party/test_fonts/README.chromium
index 2235562..2396b4b 100644
--- a/third_party/test_fonts/README.chromium
+++ b/third_party/test_fonts/README.chromium
@@ -27,7 +27,9 @@
 6.  Add all the font_bundle.tar.gz.sha1 file to the chromium src repository, by
     executing the following command:
 	$ git add ./third_party/test_fonts/test_fonts.tar.gz.sha1
-7.  (optional) Update FONT_FILES in
+7.  Update filename constant for fontconfig cache in //base/test/BUILD.gn and
+    //base/test/generate_fontconfig_caches.cc when test fonts change.
+8.  (optional) Update FONT_FILES in
     third_party/blink/tools/blinkpy/web_tests/port/base.py .
 
 If you need access to the chromium-fonts bucket, contact Chrome infra.% For
diff --git a/third_party/webrtc_overrides/rtc_base/task_queue.cc b/third_party/webrtc_overrides/rtc_base/task_queue.cc
index 07dd208..c569be8 100644
--- a/third_party/webrtc_overrides/rtc_base/task_queue.cc
+++ b/third_party/webrtc_overrides/rtc_base/task_queue.cc
@@ -14,7 +14,7 @@
 #include "base/lazy_instance.h"
 #include "base/memory/ref_counted.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/task_scheduler/post_task.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_local.h"
 #include "build/build_config.h"
 #include "third_party/webrtc/rtc_base/refcount.h"
diff --git a/third_party/zlib/contrib/minizip/unzip.c b/third_party/zlib/contrib/minizip/unzip.c
index 199b472..e8b2bc5c 100644
--- a/third_party/zlib/contrib/minizip/unzip.c
+++ b/third_party/zlib/contrib/minizip/unzip.c
@@ -68,10 +68,6 @@
 #include <stdlib.h>
 #include <string.h>
 
-#ifndef NOUNCRYPT
-        #define NOUNCRYPT
-#endif
-
 #include "third_party/zlib/zlib.h"
 #include "unzip.h"
 
@@ -1630,6 +1626,7 @@
             zdecode(s->keys,s->pcrc_32_tab,source[i]);
 
         s->pfile_in_zip_read->pos_in_zipfile+=12;
+        s->pfile_in_zip_read->rest_read_compressed-=12;
         s->encrypted=1;
     }
 #    endif
diff --git a/tools/battor_agent/battor_agent_bin.cc b/tools/battor_agent/battor_agent_bin.cc
index 90990e2..d37b2035 100644
--- a/tools/battor_agent/battor_agent_bin.cc
+++ b/tools/battor_agent/battor_agent_bin.cc
@@ -50,7 +50,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_tokenizer.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 04835f7..e4e54350 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -493,6 +493,14 @@
 
   print 'Locally building Clang %s...' % PACKAGE_VERSION
 
+  if use_head_revision:
+    # TODO(hans): Trunk version was updated; remove after the next roll.
+    # Remove the old lib dir.
+    old_lib_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang', '7.0.0')
+    if (os.path.isdir(old_lib_dir)):
+      print 'Removing old lib dir: %s' % old_lib_dir
+      RmTree(old_lib_dir)
+
   DownloadHostGcc(args)
   AddCMakeToPath(args)
   AddGnuWinToPath()
diff --git a/tools/determinism/compare_build_artifacts.py b/tools/determinism/compare_build_artifacts.py
index 6a82825..d17b037 100755
--- a/tools/determinism/compare_build_artifacts.py
+++ b/tools/determinism/compare_build_artifacts.py
@@ -25,7 +25,9 @@
   # TODO(maruel): Add '.pdb'.
   allowed = frozenset(
       ('', '.apk', '.app', '.dll', '.dylib', '.exe', '.nexe', '.so'))
-  non_x_ok_exts = frozenset(('.apk', '.isolated'))
+
+  # .bin is for the V8 snapshot files natives_blob.bin, snapshot_blob.bin
+  non_x_ok_exts = frozenset(('.apk', '.bin', '.isolated', '.zip'))
   def check(f):
     if not os.path.isfile(f):
       return False
@@ -75,57 +77,26 @@
   diffs = 0
   streams = []
   offset = 0
-  with open(first_filepath, 'rb') as lhs:
-    with open(second_filepath, 'rb') as rhs:
-      # Skip part of Win32 COFF header if timestamps are different.
-      #
-      # COFF header:
-      #   0 -  1: magic.
-      #   2 -  3: # sections.
-      #   4 -  7: timestamp.
-      #   ....
-      #
-      # COFF BigObj header:
-      #   0 -  3: signature (0000 FFFF)
-      #   4 -  5: version
-      #   6 -  7: machine
-      #   8 - 11: timestamp.
-      COFF_HEADER_TO_COMPARE_SIZE = 12
-      if (sys.platform == 'win32'
-          and os.path.splitext(first_filepath)[1] in ('.o', '.obj')
-          and file_len > COFF_HEADER_TO_COMPARE_SIZE):
-        rhs_data = rhs.read(COFF_HEADER_TO_COMPARE_SIZE)
-        lhs_data = lhs.read(COFF_HEADER_TO_COMPARE_SIZE)
-        if (lhs_data[0:4] == rhs_data[0:4] and lhs_data[4:8] != rhs_data[4:8]
-            and lhs_data[8:12] == rhs_data[8:12]):
-          offset += COFF_HEADER_TO_COMPARE_SIZE
-        elif (lhs_data[0:4] == '\x00\x00\xff\xff' and
-              lhs_data[0:8] == rhs_data[0:8] and
-              lhs_data[8:12] != rhs_data[8:12]):
-          offset += COFF_HEADER_TO_COMPARE_SIZE
-        else:
-          lhs.seek(0)
-          rhs.seek(0)
-
-      while True:
-        lhs_data = lhs.read(BLOCK_SIZE)
-        rhs_data = rhs.read(BLOCK_SIZE)
-        if not lhs_data:
-          break
-        if lhs_data != rhs_data:
-          diffs += sum(l != r for l, r in zip(lhs_data, rhs_data))
-          for idx in xrange(NUM_CHUNKS_IN_BLOCK):
-            lhs_chunk = lhs_data[idx * CHUNK_SIZE:(idx + 1) * CHUNK_SIZE]
-            rhs_chunk = rhs_data[idx * CHUNK_SIZE:(idx + 1) * CHUNK_SIZE]
-            if streams is not None and lhs_chunk != rhs_chunk:
-              if len(streams) < MAX_STREAMS:
-                streams.append((offset + CHUNK_SIZE * idx,
-                                lhs_chunk, rhs_chunk))
-              else:
-                streams = None
-        offset += len(lhs_data)
-        del lhs_data
-        del rhs_data
+  with open(first_filepath, 'rb') as lhs, open(second_filepath, 'rb') as rhs:
+    while True:
+      lhs_data = lhs.read(BLOCK_SIZE)
+      rhs_data = rhs.read(BLOCK_SIZE)
+      if not lhs_data:
+        break
+      if lhs_data != rhs_data:
+        diffs += sum(l != r for l, r in zip(lhs_data, rhs_data))
+        for idx in xrange(NUM_CHUNKS_IN_BLOCK):
+          lhs_chunk = lhs_data[idx * CHUNK_SIZE:(idx + 1) * CHUNK_SIZE]
+          rhs_chunk = rhs_data[idx * CHUNK_SIZE:(idx + 1) * CHUNK_SIZE]
+          if streams is not None and lhs_chunk != rhs_chunk:
+            if len(streams) < MAX_STREAMS:
+              streams.append((offset + CHUNK_SIZE * idx,
+                              lhs_chunk, rhs_chunk))
+            else:
+              streams = None
+      offset += len(lhs_data)
+      del lhs_data
+      del rhs_data
   if not diffs:
     return None
   result = '%d out of %d bytes are different (%.2f%%)' % (
@@ -220,7 +191,7 @@
       print 'deps on %s are different: %s' % (
           target, set(first_deps).symmetric_difference(set(second_deps)))
       continue
-    max_filepath_len = max(len(n) for n in first_deps)
+    max_filepath_len = max([0] + [len(n) for n in first_deps])
     for d in first_deps:
       first_file = os.path.join(first_dir, d)
       second_file = os.path.join(second_dir, d)
@@ -245,14 +216,12 @@
   print('Epoch: %s' %
       ' '.join(epoch_hex[i:i+2] for i in xrange(0, len(epoch_hex), 2)))
 
-  with open(os.path.join(BASE_DIR, 'deterministic_build_blacklist.json')) as f:
-    blacklist = frozenset(json.load(f))
   with open(os.path.join(BASE_DIR, 'deterministic_build_whitelist.pyl')) as f:
     whitelist = frozenset(ast.literal_eval(f.read())[target_platform])
 
   # The two directories.
-  first_list = get_files_to_compare(first_dir, recursive) - blacklist
-  second_list = get_files_to_compare(second_dir, recursive) - blacklist
+  first_list = get_files_to_compare(first_dir, recursive)
+  second_list = get_files_to_compare(second_dir, recursive)
 
   equals = []
   expected_diffs = []
diff --git a/tools/determinism/deterministic_build_blacklist.json b/tools/determinism/deterministic_build_blacklist.json
deleted file mode 100644
index 0d4f101c..0000000
--- a/tools/determinism/deterministic_build_blacklist.json
+++ /dev/null
@@ -1,2 +0,0 @@
-[
-]
diff --git a/tools/determinism/deterministic_build_whitelist.pyl b/tools/determinism/deterministic_build_whitelist.pyl
index ce6a518..2516fb8 100644
--- a/tools/determinism/deterministic_build_whitelist.pyl
+++ b/tools/determinism/deterministic_build_whitelist.pyl
@@ -8,7 +8,7 @@
 # * comments are allowed, using '#' syntax; and
 # * trailing commas are allowed.
 #
-# List of files that are known to be non deterministic. This is a "temporary"
+# List of files that are known to be _not_ deterministic. This is a "temporary"
 # workaround to find regression on the deterministic builders.
 #
 # PNaCl general bug: https://crbug.com/429358
@@ -22,6 +22,11 @@
   # https://crbug.com/330263
   'linux': [
     'ppapi_nacl_tests_pnacl_newlib_x64.nexe',
+
+    # TODO(tikuta): Remove this when crbug.com/870611 is fixed.
+    'remoting-webapp.v2.zip',
+
+    'zucchini_apply_fuzzer_seed_corpus.zip',
   ],
 
   # https://crbug.com/330262
@@ -158,192 +163,9 @@
 
   # https://crbug.com/330260
   'win': [
-    'accessibility_unittests.exe',
-    'angle_end2end_tests.exe',
-    'angle_perftests.exe',
-    'angle_unittests.exe',
-    'app_driver_library.dll',
-    'app_list_demo.exe',
-    'app_list_unittests.exe',
-    'app_shell.exe',
-    'app_shell_unittests.exe',
-    'ar_sample_test_driver.exe',
-    'audio_unittests.exe',
-    'aura_demo.exe',
-    'aura_unittests.exe',
-    'base_i18n_perftests.exe',
-    'base_perftests.exe',
-    'base_unittests.exe',
-    'blink_converters_unittests.exe',
-    'blink_deprecated_test_plugin.dll',
-    'blink_heap_unittests.exe',
-    'blink_platform_perftests.exe',
-    'blink_platform_unittests.exe',
-    'blink_test_plugin.dll',
-    'bluetooth_metrics_hash.exe',
-    'browser_library.dll',
-    'browser_tests.exe',
-    'capture_unittests.exe',
-    'cast_benchmarks.exe',
-    'cast_receiver_app.exe',
-    'cast_sender_app.exe',
-    'cast_simulator.exe',
-    'cast_unittests.exe',
-    'catalog_viewer_library.dll',
-    'cc_perftests.exe',
-    'cctest.exe',
-    'cc_unittests.exe',
-    'ced_unittests.exe',
-    'cert_verify_tool.exe',
-    'chrome_app_unittests.exe',
-    'chrome_child.dll',
-    'chrome.dll',
-    'chromedriver.exe',
-    'chromedriver_tests.exe',
-    'chromedriver_unittests.exe',
-    'chrome_elf_unittests.exe',
-    'chrome.exe',
-    'chromoting_test_driver.exe',
-    'command_buffer_gles2.dll',
-    'components_browsertests.exe',
-    'components_perftests.exe',
-    'components_unittests.exe',
-    'compositor_unittests.exe',
-    'content_browsertests.exe',
-    'content_perftests.exe',
-    'content_shell.exe',
-    'content_unittests.exe',
-    'courgette64.exe',
-    'crypto_unittests.exe',
-    'd8.exe',
-    'device_unittests.exe',
-    'display_unittests.exe',
-    'events_unittests.exe',
-    'extensions_browsertests.exe',
-    'extensions_unittests.exe',
-    'ffmpeg_regression_tests.exe',
-    'filesystem_service_unittests.exe',
-    'filter_fuzz_stub.exe',
-    'force_mic_volume_max.exe',
-    'gcapi_test.exe',
-    'gcm_unit_tests.exe',
-    'generate_barcode_video.exe',
-    'generate-bytecode-expectations.exe',
-    'generate_timecode_audio.exe',
-    'gfx_unittests.exe',
-    'gin_shell.exe',
-    'gin_unittests.exe',
-    'gles2_conform_support.exe',
-    'gles2_conform_test.exe',
-    'gl_tests.exe',
-    'gl_unittests.exe',
-    'google_apis_unittests.exe',
-    'gpu_ipc_service_unittests.exe',
-    'gpu_perftests.exe',
-    'gpu_unittests.exe',
-    'image_operations_bench.exe',
-    'interactive_ui_tests.exe',
-    'ipc_perftests.exe',
-    'ipc_tests.exe',
-    'it2me_standalone_host_main.exe',
-    'jingle_unittests.exe',
-    'keyboard_unittests.exe',
-    'khronos_glcts_test.exe',
-    'latency_unittests.exe',
-    'leveldb_service_unittests.exe',
-    'libaddressinput_unittests.exe',
-    'login_library.dll',
-    'mash_init_library.dll',
-    'media_blink_unittests.exe',
-    'media_library.dll',
-    'media_service_unittests.exe',
-    'media_mojo_unittests.exe',
-    'media_perftests.exe',
-    'media_pipeline_integration_unittests.exe',
-    'media_unittests.exe',
-    'message_center_unittests.exe',
-    'midi_unittests.exe',
+    'crashpad_snapshot_test_image_reader.exe',
+    'crashpad_snapshot_test_image_reader_module.dll',
     'mini_installer.exe',
-    'mksnapshot.exe',
-    'mojo_perftests.exe',
-    'mojo_unittests.exe',
-    'mus_demo_library.dll',
-    'nacl_irt_x86_32.nexe',
-    'nacl_irt_x86_64.nexe',
-    'nacl_loader_unittests.exe',
-    'native_theme_unittests.exe',
-    'navigation.exe',
-    'net_perftests.exe',
-    'net_unittests.exe',
     'previous_version_mini_installer.exe',
-    'pdfium_embeddertests.exe',
-    'pdfium_test.exe',
-    'performance_browser_tests.exe',
-    'power_saver_test_plugin.dll',
-    'ppapi_nacl_tests_newlib_x86_32.nexe',
-    'ppapi_nacl_tests_newlib_x86_64.nexe',
-    'ppapi_nacl_tests_pnacl_newlib_x32.nexe',
-    'ppapi_nacl_tests_pnacl_newlib_x32_nonsfi.nexe',
-    'ppapi_nacl_tests_pnacl_newlib_x64.nexe',
-    'ppapi_perftests.exe',
-    'ppapi_tests.dll',
-    'ppapi_unittests.exe',
-    'printing_unittests.exe',
-    'proximity_auth_unittests.exe',
-    'quic_client.exe',
-    'quick_launch_library.dll',
-    'quic_packet_printer.exe',
-    'quic_server.exe',
-    'remoting_breakpad_tester.exe',
-    'remoting_core.dll',
-    'remoting_perftests.exe',
-    'remoting_unittests.exe',
-    'sbox_unittests.exe',
-    'screenlock_library.dll',
-    'shell_dialogs_unittests.exe',
-    'skia_unittests.exe',
-    'snapshot_unittests.exe',
-    'sql_unittests.exe',
-    'storage_unittests.exe',
-    'sync_client.exe',
-    'sync_integration_tests.exe',
-    'sync_listen_notifications.exe',
-    'sync_performance_tests.exe',
-    'sync_unit_tests.exe',
-    'task_viewer_library.dll',
-    'test_ime_driver_library.dll',
-    'test_wm_library.dll',
-    'touch_hud_library.dll',
-    'udp_proxy.exe',
-    'ui_base_unittests.exe',
-    'ui_library.dll',
-    'ui_struct_traits_unittests.exe',
-    'ui_touch_selection_unittests.exe',
-    'unit_tests.exe',
-    'unittests.exe',
-    'url_unittests.exe',
-    'v8_hello_world.exe',
-    'v8_parser_shell.exe',
-    'v8_sample_process.exe',
-    'v8_shell.exe',
-    'v8_simple_json_fuzzer.exe',
-    'v8_simple_parser_fuzzer.exe',
-    'v8_simple_regexp_fuzzer.exe',
-    'v8_simple_wasm_asmjs_fuzzer.exe',
-    'v8_simple_wasm_fuzzer.exe',
-    'video_decode_accelerator_unittest.exe',
-    'video_encode_accelerator_unittest.exe',
-    'views_examples_exe.exe',
-    'views_examples_library.dll',
-    'views_examples_with_content_exe.exe',
-    'views_mus_interactive_ui_tests.exe',
-    'views_mus_unittests.exe',
-    'views_unittests.exe',
-    'viz_benchmark.exe',
-    'webkit_unit_tests.exe',
-    'webtest_library.dll',
-    'window_type_launcher_library.dll',
-    'wm_unittests.exe',
-    'wtf_unittests.exe',
   ],
 }
diff --git a/tools/determinism/platform_whitelist.py b/tools/determinism/platform_whitelist.py
deleted file mode 100755
index a4d4218..0000000
--- a/tools/determinism/platform_whitelist.py
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env python
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Print platform's deterministic build whitelist."""
-
-import ast
-import argparse
-import json
-import os
-import sys
-
-BASE_DIR = os.path.dirname(os.path.abspath(__file__))
-
-
-def PrintWhitelist(target_platform, output_json):
-  """Print whitelist to output.
-
-  Args:
-    target_platform: name of target platform.
-    output_json: output filename to store result with JSON.
-                 print to stdout if the field is False.
-  """
-  with open(os.path.join(BASE_DIR, 'deterministic_build_whitelist.pyl')) as f:
-    whitelist = ast.literal_eval(f.read())[target_platform]
-
-  if output_json:
-    with open(output_json, 'w') as f:
-      json.dump(whitelist, f)
-  else:
-    json.dump(whitelist, sys.stdout)
-
-
-def main():
-  parser = argparse.ArgumentParser()
-  target = {
-      'darwin': 'mac', 'linux2': 'linux', 'win32': 'win'
-  }.get(sys.platform, sys.platform)
-  parser.add_argument('-t', '--target-platform',
-                      default=target,
-                      choices=('android', 'mac', 'linux', 'win'),
-                      help='The target platform.')
-  parser.add_argument('--output-json', help='JSON file to output differences')
-  args = parser.parse_args()
-
-  if not args.target_platform:
-    parser.error('--target-platform is required')
-
-  PrintWhitelist(args.target_platform, args.output_json)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/tools/fuchsia/local-sdk.py b/tools/fuchsia/local-sdk.py
index 6751ba0..156ef48 100755
--- a/tools/fuchsia/local-sdk.py
+++ b/tools/fuchsia/local-sdk.py
@@ -34,7 +34,7 @@
 def BuildForArch(arch):
   build_dir = 'out/release-' + arch
   Run('scripts/fx', 'set', arch,
-      '--packages=garnet/packages/sdk/base',
+      '--packages=topaz/packages/sdk/topaz',
       '--args=is_debug=false', build_dir)
   Run('scripts/fx', 'full-build')
 
diff --git a/tools/json_schema_compiler/json_schema_api.gni b/tools/json_schema_compiler/json_schema_api.gni
index e459a4c5..61cc368 100644
--- a/tools/json_schema_compiler/json_schema_api.gni
+++ b/tools/json_schema_compiler/json_schema_api.gni
@@ -2,65 +2,39 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-# Defines a static library corresponding to the output of schema compiler tools
-# over a set of extensions API schemas (IDL or JSON format.) The library target
+# This file contains templates for generating static libraries based on the
+# corresponding output of the schema compiler tools. The output can be either
+# the generated C++ types (generated_types template), the bundled extension
+# function registration (json_schema_api template with
+# bundle_registration = true), or the bundled JSON strings of the APIs
+# (json_schema_api template with bundle = true). The generated library target
 # has implicit hard dependencies on all schema files listed by the invoker and
 # is itself a hard dependency.
 #
-# Invocations of this template may use the following variables:
+# Common variables that can be used in all templates are:
+# - sources [required] A list of schema files used to generate the C++ types.
 #
-# sources [required] A list of schema files to be compiled.
-#
-# root_namespace [required]
+# - root_namespace [required]
 #     A Python string substituion pattern used to generate the C++
 #     namespace for each API. Use %(namespace)s to replace with the API
 #     namespace, like "toplevel::%(namespace)s_api".
 #
 # schema_include_rules [optional]
-#     A list of paths to include when searching for referenced objects,
-#     with the namespace separated by a :.
-#     Example:
-#       [ '/foo/bar:Foo::Bar::%(namespace)s' ]
+#   A list of paths to include when searching for referenced objects,
+#   with the namespace separated by a :.
+#   Example:
+#     [ '/foo/bar:Foo::Bar::%(namespace)s' ]
 #
-# schemas [optional, default = false]
-#   Boolean indicating if the schema files should be generated.
+# - configs [optional]
+#     Extra gn configs to apply to the compile step.
 #
-# bundle [optional, default = false]
-#   Boolean indicating if the schema bundle files should be generated.
+# - deps [optional]
+#     If any deps are specified they will be inherited by the static library
+#     target.
 #
-# bundle_registration [optional, default = false]
-#   Boolean indicating if the API registration bundle files should be generated.
-#
-# bundle_name [required if bundle or bundle_registrations]:
-#     A string to prepend to generated bundle class names, so that multiple
-#     bundle rules can be used without conflicting.  Only used with one of
-#     the cpp-bundle generators.
-#
-# impl_dir [required if bundle_registration = true, otherwise unused]
-#   The path containing C++ implementations of API functions. This path is
-#   used as the root path when looking for {schema}/{schema}_api.h headers
-#   when generating API registration bundles. Such headers, if found, are
-#   automatically included by the generated code.
-#
-# uncompiled_sources [optional, only used when bundle = true or
-#     bundle_registration = true]
-#   A list of schema files which should not be compiled, but which should still
-#   be processed for API bundle generation.
-#
-# uncompiled_bundle_schema_sources [optional, only used when bundle = true]
-#   A list of schema files which should not be compiled nor registered, but
-#   should still be processed for the schema generation.
-#
-# configs [optional]
-#   Extra configs to apply to the compile step.
-#
-# deps [optional]
-#   If any deps are specified they will be inherited by the static library
-#   target.
-#
-# visibility [optional]
-#   A specific visibility to apply for the generated static library. If omitted,
-#   visibility will be inherited from the invoker.
+# - visibility [optional]
+#     A specific visibility to apply for the generated static library. If
+#     omitted, visibility will be inherited from the invoker.
 
 # NOTE: Common variables here for when multiple templates use them.
 compiler_root = "//tools/json_schema_compiler"
@@ -79,16 +53,49 @@
   "$compiler_root/util_cc_helper.py",
 ]
 
+# Outputs either the bundle of extension function registrations or the bundle of
+# generated JSON strings for each API.
+#
+# Template-specific variables (in addition to the common ones described above):
+#
+# bundle [optional, default = false]
+#   Boolean indicating if the schema bundle files should be generated.
+#
+# bundle_registration [optional, default = false]
+#   Boolean indicating if the API registration bundle files should be generated.
+#
+# bundle_name [required]
+#   A string to prepend to generated bundle class names, so that multiple
+#   bundle rules can be used without conflicting.  Only used with one of
+#   the cpp-bundle generators.
+#
+# impl_dir [required if bundle_registration = true, otherwise unused]
+#   The path containing C++ implementations of API functions. This path is
+#   used as the root path when looking for {schema}/{schema}_api.h headers
+#   when generating API registration bundles. Such headers, if found, are
+#   automatically included by the generated code.
+#
+# uncompiled_sources [optional]
+#   A list of schema files which should not be compiled, but which should still
+#   be processed for API bundle generation.
+#
+# uncompiled_bundle_schema_sources [optional, only used when bundle = true]
+#   A list of schema files which should not be compiled nor registered, but
+#   should still be processed for the schema generation.
+#
+# TODO(devlin): Break this up into two targets, one for extension function
+# registration and one for generated JSON strings. https://crbug.com/864576.
 template("json_schema_api") {
   assert(defined(invoker.sources),
          "\"sources\" must be defined for the $target_name template.")
   assert(defined(invoker.root_namespace),
          "\"root_namespace\" must be defined for the $target_name template.")
 
-  schemas = defined(invoker.schemas) && invoker.schemas
   bundle = defined(invoker.bundle) && invoker.bundle
   bundle_registration =
       defined(invoker.bundle_registration) && invoker.bundle_registration
+  assert(bundle || bundle_registration,
+         "$target_name must specify \"bundle\" or \"bundle_registration\".")
 
   schema_include_rules = ""
   if (defined(invoker.schema_include_rules)) {
@@ -107,28 +114,6 @@
   # target_name variable.
   root_target_name = target_name
 
-  if (schemas) {
-    schema_generator_name = target_name + "_schema_generator"
-    action_foreach(schema_generator_name) {
-      visibility = [":$root_target_name"]
-      script = compiler_script
-      sources = invoker.sources
-      inputs = compiler_sources
-      outputs = [
-        "$target_gen_dir/{{source_name_part}}.cc",
-        "$target_gen_dir/{{source_name_part}}.h",
-      ]
-      args = [
-        "{{source}}",
-        "--root=" + rebase_path("//", root_build_dir),
-        "--destdir=" + rebase_path(root_gen_dir, root_build_dir),
-        "--namespace=$root_namespace",
-        "--generator=cpp",
-        "--include-rules=$schema_include_rules",
-      ]
-    }
-  }
-
   if (bundle) {
     assert(defined(invoker.bundle_name),
            "\"bundle_name\" must be defined for bundles")
@@ -146,7 +131,7 @@
 
     bundle_generator_schema_name = target_name + "_bundle_generator_schema"
     action(bundle_generator_schema_name) {
-      visibility = [":$root_target_name"]
+      visibility = [ ":$root_target_name" ]
       script = compiler_script
       inputs = compiler_sources + invoker.sources + uncompiled_sources +
                uncompiled_bundle_schema_sources
@@ -185,7 +170,7 @@
     bundle_generator_registration_name =
         target_name + "_bundle_generator_registration"
     action(bundle_generator_registration_name) {
-      visibility = [":$root_target_name"]
+      visibility = [ ":$root_target_name" ]
       script = compiler_script
       inputs = compiler_sources + invoker.sources + uncompiled_sources
       outputs = [
@@ -214,13 +199,6 @@
     lib_extra_configs += invoker.configs
   }
 
-  if (schemas) {
-    lib_sources += get_target_outputs(":$schema_generator_name")
-    lib_public_deps += [ ":$schema_generator_name" ]
-    lib_deps += [ "//tools/json_schema_compiler:generated_api_util" ]
-    lib_extra_configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-  }
-
   if (bundle) {
     lib_sources += get_target_outputs(":$bundle_generator_schema_name")
     lib_deps += [ ":$bundle_generator_schema_name" ]
@@ -247,3 +225,73 @@
     }
   }
 }
+
+# Generates the C++ types for the given APIs.
+template("generated_types") {
+  assert(defined(invoker.sources),
+         "\"sources\" must be defined for the $target_name template.")
+  assert(defined(invoker.root_namespace),
+         "\"root_namespace\" must be defined for the $target_name template.")
+
+  schema_include_rules = ""
+  if (defined(invoker.schema_include_rules)) {
+    schema_include_rules = invoker.schema_include_rules
+  }
+
+  generated_config_name = target_name + "_generated_config"
+  config(generated_config_name) {
+    include_dirs = [ root_gen_dir ]
+  }
+
+  root_namespace = invoker.root_namespace
+
+  # Save the target_name, since other targets (like the action() and
+  # action_foreach() below) need to reference them, but would have their own
+  # target_name variable.
+  root_target_name = target_name
+
+  schema_generator_name = target_name + "_schema_generator"
+  action_foreach(schema_generator_name) {
+    visibility = [ ":$root_target_name" ]
+    script = compiler_script
+    sources = invoker.sources
+    inputs = compiler_sources
+    outputs = [
+      "$target_gen_dir/{{source_name_part}}.cc",
+      "$target_gen_dir/{{source_name_part}}.h",
+    ]
+    args = [
+      "{{source}}",
+      "--root=" + rebase_path("//", root_build_dir),
+      "--destdir=" + rebase_path(root_gen_dir, root_build_dir),
+      "--namespace=$root_namespace",
+      "--generator=cpp",
+      "--include-rules=$schema_include_rules",
+    ]
+  }
+
+  # Compute the contents of the library/source set.
+  lib_sources = invoker.sources + get_target_outputs(":$schema_generator_name")
+  lib_public_deps = [ ":$schema_generator_name" ]
+  lib_deps = [ "//tools/json_schema_compiler:generated_api_util" ]
+  lib_extra_configs = [ "//build/config/compiler:no_size_t_to_int_warning" ]
+  if (defined(invoker.configs)) {
+    lib_extra_configs += invoker.configs
+  }
+
+  if (defined(invoker.deps)) {
+    lib_deps += invoker.deps
+  }
+
+  static_library(target_name) {
+    sources = lib_sources
+    deps = lib_deps
+    public_deps = lib_public_deps
+    configs += lib_extra_configs
+    public_configs = [ ":$generated_config_name" ]
+
+    if (defined(invoker.visibility)) {
+      visibility = invoker.visibility
+    }
+  }
+}
diff --git a/tools/json_schema_compiler/test/BUILD.gn b/tools/json_schema_compiler/test/BUILD.gn
index 9c6bec7..88d762d 100644
--- a/tools/json_schema_compiler/test/BUILD.gn
+++ b/tools/json_schema_compiler/test/BUILD.gn
@@ -9,7 +9,7 @@
 
 assert(enable_extensions)
 
-json_schema_api("api") {
+generated_types("generated_types") {
   visibility = [ ":*" ]
 
   sources = [
@@ -34,7 +34,6 @@
     "simple_api.json",
   ]
 
-  schemas = true
   root_namespace = "test::api::%(namespace)s"
 
   deps = [
@@ -79,7 +78,7 @@
   ]
 
   deps = [
-    ":api",
+    ":generated_types",
     "//base",
     "//testing/gtest",
   ]
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index 0fd7a60..f4f9380e 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -90,7 +90,7 @@
     'chromium.chromiumos': {
       'Linux ChromiumOS Full': 'chromeos_with_codecs_release_bot',
 
-      'chromeos-amd64-generic-rel': 'cros_chrome_sdk',
+      'chromeos-amd64-generic-rel': 'cros_chrome_sdk_headless_ozone',
       'chromeos-daisy-rel': 'cros_chrome_sdk',
       'linux-chromeos-rel': 'chromeos_with_codecs_release_bot',
       'linux-chromeos-dbg': 'chromeos_with_codecs_debug_bot',
@@ -100,14 +100,10 @@
       'CFI Linux CF': 'cfi_full_cfi_icall_cfi_diag_recover_release_static',
       'CFI Linux ToT': 'clang_tot_cfi_full_cfi_icall_cfi_diag_thin_lto_release_static_dcheck_always_on',
       'CFI Linux (icall)': 'cfi_full_diag_icall_release_static_dcheck_always_on',
-      'CrWinAsan': 'asan_clang_fuzzer_static_v8_heap_x86_release',
-      'CrWinAsan(dll)': 'asan_clang_shared_v8_heap_x86_release',
-      'CrWinAsanCov': 'asan_clang_edge_fuzzer_static_v8_heap_x86_release',
+      'CrWinAsan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release_tot',
+      'CrWinAsan(dll)': 'asan_clang_shared_v8_heap_minimal_symbols_release_tot',
+      'CrWinAsanCov': 'asan_clang_edge_fuzzer_static_v8_heap_minimal_symbols_release_tot',
 
-      'CrWinClangLLD': 'clang_tot_official_static_no_lld_x86',
-      'CrWinClangLLD64': 'clang_tot_shared_release_no_lld_dcheck',
-      'CrWinClngLLD64dbg': 'clang_tot_full_symbols_shared_debug_no_lld',
-      'CrWinClngLLDdbg': 'clang_tot_full_symbols_shared_debug_no_lld_x86',
       'linux-win_cross-rel': 'clang_tot_win_release_cross',
       'ToTAndroid': 'android_clang_tot_release_minimal_symbols',
       'ToTAndroid64': 'android_clang_tot_release_arm64',
@@ -127,7 +123,7 @@
       'ToTMac': 'clang_tot_minimal_symbols_shared_release',
       'ToTMacCoverage': 'clang_tot_coverage_minimal_symbols_shared_release',
       'ToTMac (dbg)': 'clang_tot_shared_debug',
-      'ToTMacASan': 'asan_disable_nacl_clang_tot_static_release',
+      'ToTMacASan': 'asan_disable_nacl_clang_tot_minimal_symbols_static_release',
       'ToTWin': 'clang_tot_official_minimal_symbols_static_release_x86',
       'ToTWin(dbg)': 'clang_tot_shared_debug_x86',
       'ToTWin(dll)': 'clang_tot_minimal_symbols_shared_release_x86_dcheck',
@@ -215,7 +211,7 @@
       'VR Linux': 'vr_release_bot',
       'linux-tcmalloc-rel': 'tcmalloc_release_bot',
       'Win 10 Fast Ring': 'release_trybot',
-      'Windows deterministic': 'release_bot_x86_minimal_symbols',
+      'Windows deterministic': 'release_bot_x86_no_symbols',
       'Windows Clang deterministic': 'clang_release_bot_minimal_symbols_x86',
       'win-annotator-rel': 'release_bot',
     },
@@ -356,7 +352,8 @@
       'Linux ChromiumOS MSan Builder': 'chromeos_msan_release_bot',
       'Linux MSan Builder': 'msan_release_bot',
       'Linux TSan Builder': 'tsan_disable_nacl_release_bot',
-      'Mac ASan 64 Builder': 'asan_disable_nacl_release_bot_dcheck_always_on',
+      'Mac ASan 64 Builder': 'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on',
+      'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release',
     },
 
     'chromium.perf': {
@@ -366,8 +363,12 @@
       'Android arm64 Compile Perf': 'official_goma_minimal_symbols_android_arm64',
       'Linux Builder Perf': 'official_goma_perf',
       'Mac Builder Perf': 'official_goma',
+      # TODO(crbug.com/828472): Remove 'Win Builder Perf'
       'Win Builder Perf': 'official_goma_x86',
+      'win32-builder-perf': 'official_goma_x86',
+      # TODO(crbug.com/828466): Remove 'Win x64 Builder Perf'
       'Win x64 Builder Perf': 'official_goma',
+      'win64-builder-perf': 'official_goma',
     },
 
     'chromium.perf.fyi': {
@@ -556,7 +557,7 @@
     },
 
     'tryserver.chromium.chromiumos': {
-      'chromeos-amd64-generic-rel': 'cros_chrome_sdk',
+      'chromeos-amd64-generic-rel': 'cros_chrome_sdk_headless_ozone',
       'chromeos-daisy-rel': 'cros_chrome_sdk',
       'linux-chromeos-rel': 'chromeos_with_codecs_release_trybot',
       'linux-chromeos-compile-dbg': 'chromeos_with_codecs_debug_bot',
@@ -910,24 +911,28 @@
       'android_without_codecs', 'release_bot', 'minimal_symbols', 'strip_debug_info',
     ],
 
-    'asan_clang_edge_fuzzer_static_v8_heap_x86_release': [
-      'asan', 'clang_tot', 'edge', 'fuzzer', 'static', 'v8_heap', 'release', 'x64',
+    'asan_clang_edge_fuzzer_static_v8_heap_minimal_symbols_release_tot': [
+      'asan', 'clang_tot', 'edge', 'fuzzer', 'static', 'v8_heap', 'minimal_symbols', 'release',
     ],
 
-    'asan_clang_shared_v8_heap_x86_release': [
-      'asan', 'clang_tot', 'shared', 'v8_heap', 'release', 'x64',
+    'asan_clang_shared_v8_heap_minimal_symbols_release_tot': [
+      'asan', 'clang_tot', 'shared', 'v8_heap', 'minimal_symbols', 'release',
     ],
 
-    'asan_clang_fuzzer_static_v8_heap_x86_release': [
-      'asan', 'clang_tot', 'fuzzer', 'static', 'v8_heap', 'release', 'x64',
+    'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release': [
+      'asan', 'fuzzer', 'static', 'v8_heap', 'minimal_symbols', 'release',
+    ],
+
+    'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release_tot': [
+      'asan', 'clang_tot', 'fuzzer', 'static', 'v8_heap', 'minimal_symbols', 'release',
     ],
 
     'asan_dcheck_disable_nacl_release_bot': [
       'asan', 'dcheck_always_on', 'disable_nacl', 'release_bot',
     ],
 
-    'asan_disable_nacl_clang_tot_static_release': [
-      'asan', 'disable_nacl', 'clang_tot', 'static', 'release',
+    'asan_disable_nacl_clang_tot_minimal_symbols_static_release': [
+      'asan', 'disable_nacl', 'clang_tot', 'minimal_symbols', 'static', 'release',
     ],
 
     'asan_disable_nacl_edge_fuzzer_v8_heap_chrome_with_codecs_release_bot': [
@@ -954,8 +959,8 @@
       'asan', 'edge', 'v8_heap', 'debug_bot', 'hybrid',
     ],
 
-    'asan_disable_nacl_release_bot_dcheck_always_on': [
-      'asan', 'disable_nacl', 'release_bot', 'dcheck_always_on',
+    'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on': [
+      'asan', 'minimal_symbols', 'disable_nacl', 'release_bot', 'dcheck_always_on',
     ],
 
     'asan_fuzzer_v8_heap_chrome_with_codecs_release_bot_x86': [
@@ -1078,26 +1083,10 @@
       'clang_tot', 'shared', 'debug',
     ],
 
-    'clang_tot_full_symbols_shared_debug_no_lld': [
-      'clang_tot', 'full_symbols', 'shared', 'debug', 'no_lld',
-    ],
-
-    'clang_tot_full_symbols_shared_debug_no_lld_x86': [
-      'clang_tot', 'full_symbols', 'shared', 'debug', 'no_lld', 'x86',
-    ],
-
     'clang_tot_shared_debug_x86': [
       'clang_tot', 'shared', 'debug', 'x86',
     ],
 
-    'clang_tot_shared_release_no_lld_dcheck': [
-      'clang_tot', 'minimal_symbols', 'shared', 'release', 'no_lld', 'dcheck_always_on',
-    ],
-
-    'clang_tot_official_static_no_lld_x86': [
-      'clang_tot', 'minimal_symbols', 'official', 'static', 'release', 'no_lld', 'x86',
-    ],
-
     'clang_tot_minimal_symbols_shared_release': [
       'clang_tot', 'minimal_symbols', 'shared', 'release',
     ],
@@ -1170,6 +1159,10 @@
       'cros_chrome_sdk',
     ],
 
+    'cros_chrome_sdk_headless_ozone': [
+      'cros_chrome_sdk', 'ozone_platform_headless',
+    ],
+
     'cros_chrome_sdk_headless_ozone_dcheck_always_on': [
       'cros_chrome_sdk', 'ozone_platform_headless', 'dcheck_always_on',
     ],
@@ -1257,11 +1250,11 @@
     ],
 
     'gpu_fyi_tests_release_trybot_asan': [
-      'gpu_fyi_tests', 'release_trybot', 'asan', 'disable_nacl',
+      'gpu_fyi_tests', 'release_trybot', 'asan', 'minimal_symbols', 'disable_nacl',
     ],
 
     'gpu_fyi_tests_release_trybot_tsan': [
-      'gpu_fyi_tests', 'release_trybot', 'tsan', 'disable_nacl',
+      'gpu_fyi_tests', 'release_trybot', 'tsan', 'minimal_symbols', 'disable_nacl',
     ],
 
     'gpu_fyi_tests_release_trybot_x86': [
@@ -1514,6 +1507,8 @@
     'release_bot_minimal_symbols': [ 'release_bot', 'minimal_symbols' ],
     'release_bot_x86_minimal_symbols': [ 'release_bot', 'x86', 'minimal_symbols' ],
 
+    'release_bot_x86_no_symbols': [ 'release_bot', 'x86', 'no_symbols' ],
+
     'release_bot_minimal_symbols_enable_archive_compression': [
       'release_bot', 'minimal_symbols', 'enable_archive_compression'
     ],
@@ -2058,10 +2053,6 @@
       'gn_args': 'is_ubsan_vptr=true',
     },
 
-    'no_lld': {
-      'gn_args': 'use_lld=false',
-    },
-
     # TODO(crbug.com/869348): Remove this if we set this by default or don't use
     # this feature.
     'use_dummy_lastchange': {
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 61d2c1c..7ac944cc 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -2079,6 +2079,15 @@
   </description>
 </action>
 
+<action name="Arc.SmartTextSelection.Request">
+  <owner>jorgegil@google.com</owner>
+  <description>
+    Recorded when a request to the ARC++ container to generate Smart Text
+    Selection actions is made. This happens when the user opens the Context Menu
+    via a right-click.
+  </description>
+</action>
+
 <action name="AutoDetectChange">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 3847654d..06645d8 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -1876,6 +1876,18 @@
   <int value="7" label="UNKNOWN_PREF"/>
 </enum>
 
+<enum name="AsyncDNSRcode">
+  <summary>
+    https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6
+  </summary>
+  <int value="0" label="NoError">No Error</int>
+  <int value="1" label="FormErr">Format Error</int>
+  <int value="2" label="ServFail">Server Failure</int>
+  <int value="3" label="NXDomain">Non-Existent Domain</int>
+  <int value="4" label="NotImp">Not Implemented</int>
+  <int value="5" label="Refused">Query Refused</int>
+</enum>
+
 <enum name="AsyncDNSResolveStatus">
   <int value="0" label="DNS_SUCCESS">Succeeded with async DNS.</int>
   <int value="1" label="PROC_SUCCESS">
@@ -13958,6 +13970,7 @@
   <int value="461" label="UrlKeyedAnonymizedDataCollectionEnabled"/>
   <int value="462" label="NetworkFileSharesAllowed"/>
   <int value="463" label="DeviceLocalAccountManagedSessionEnabled"/>
+  <int value="464" label="WebRtcEventLogCollectionAllowed"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
@@ -19531,6 +19544,8 @@
   <int value="2521"
       label="DocumentLevelPassiveDefaultEventListenerPreventedWheel"/>
   <int value="2522" label="ShapeDetectionAPI"/>
+  <int value="2523" label="V8SourceBuffer_ChangeType_Method"/>
+  <int value="2524" label="PPAPIWebSocket"/>
 </enum>
 
 <enum name="FeedbackSource">
@@ -27769,6 +27784,7 @@
   <int value="-1767470652" label="out-of-process-pdf"/>
   <int value="-1758468685" label="DownloadHomeV2:disabled"/>
   <int value="-1755301960" label="ClearOldBrowsingData:enabled"/>
+  <int value="-1753458842" label="OfflinePagesLivePageSharing:disabled"/>
   <int value="-1751928267" label="disable-icon-ntp"/>
   <int value="-1749176684" label="PauseBackgroundTabs:disabled"/>
   <int value="-1746767834" label="ssl-interstitial-v2-gray"/>
@@ -28148,7 +28164,6 @@
   <int value="-1039555838" label="GamepadExtensions:enabled"/>
   <int value="-1034344165" label="V8NoTurbo:disabled"/>
   <int value="-1033738911" label="enable-mac-views-dialogs"/>
-  <int value="-1032031735" label="SuggestedTextTouchBar:enabled"/>
   <int value="-1031350684" label="PdfIsolation:disabled"/>
   <int value="-1029920490" label="IdleTimeSpellChecking:enabled"/>
   <int value="-1028733699" label="MacViewsWebUIDialogs:disabled"/>
@@ -28497,6 +28512,7 @@
   <int value="-314605926" label="protect-sync-credential-on-reauth:enabled"/>
   <int value="-311148335" label="v8-pac-mojo-out-of-process"/>
   <int value="-310908854" label="new-wallpaper-picker"/>
+  <int value="-304951461" label="TextSuggestionsTouchBar:enabled"/>
   <int value="-300018686" label="disable-cloud-import"/>
   <int value="-299841473" label="top-document-isolation:enabled"/>
   <int value="-297716805"
@@ -29004,7 +29020,6 @@
       label="enable-fullscreen-handwriting-virtual-keyboard:enabled"/>
   <int value="773743944" label="show-android-files-in-files-app"/>
   <int value="773919225" label="disable-office-editing-component-extension"/>
-  <int value="774079453" label="SuggestedTextTouchBar:disabled"/>
   <int value="777667507" label="DesktopPWAsLinkCapturing:enabled"/>
   <int value="779086132" label="enable-data-reduction-proxy-alt"/>
   <int value="779849093" label="OfflinePagesCTSuppressNotifications:disabled"/>
@@ -29188,6 +29203,7 @@
   <int value="1155923106" label="NTPOfflinePages:enabled"/>
   <int value="1163255347" label="ash-enable-touch-view-touch-feedback"/>
   <int value="1166169237" label="disable-delay-agnostic-aec"/>
+  <int value="1166897718" label="TextSuggestionsTouchBar:disabled"/>
   <int value="1167613030" label="enable-permission-action-reporting"/>
   <int value="1169418814" label="ManualFallbacksFilling:enabled"/>
   <int value="1174088940" label="enable-wasm"/>
@@ -29205,6 +29221,7 @@
   <int value="1194496204" label="NewWallpaperPicker:enabled"/>
   <int value="1196644408" label="performance-monitor-gathering"/>
   <int value="1196834473" label="disable-smart-virtual-keyboard"/>
+  <int value="1198839129" label="OfflinePagesLivePageSharing:enabled"/>
   <int value="1201441984"
       label="new-password-form-parsing-for-saving:disabled"/>
   <int value="1205849612" label="enable-sync-synced-notifications"/>
@@ -34605,6 +34622,51 @@
   <int value="7" label="Transport-layer default"/>
 </enum>
 
+<enum name="NTPBackgroundCustomizationAvailability">
+  <int value="0" label="Background customization available"/>
+  <int value="1" label="Background customization feature unavailable"/>
+  <int value="2" label="Background customization unavailable due to theme"/>
+  <int value="3"
+      label="Background customization unavailable due to search provider"/>
+</enum>
+
+<enum name="NTPCustomizeAction">
+  <int value="0" label="'Chrome backgrounds' menu item clicked"/>
+  <int value="1" label="'Upload an image' menu item clicked"/>
+  <int value="2" label="'Restore default background' menu item clicked"/>
+  <int value="3" label="Attribution link on a customized background clicked"/>
+  <int value="4" label="Add shortcut' link clicked."/>
+  <int value="5" label="Edit shortcut' link clicked."/>
+  <int value="6" label="Restore default shortcuts' menu item clicked."/>
+</enum>
+
+<enum name="NTPCustomizeChromeBackgroundAction">
+  <int value="0"
+      label="Collection selected in the 'Chrome backgrounds' dialog"/>
+  <int value="1" label="Image selected in the 'Chrome backgrounds' dialog"/>
+  <int value="2" label="'Cancel' clicked in the 'Chrome backgrounds' dialog"/>
+  <int value="3" label="'Done' clicked in the 'Chrome backgrounds' dialog"/>
+</enum>
+
+<enum name="NTPCustomizedFeatures">
+  <int value="0" label="Background customized"/>
+  <int value="1" label="Shortcut customized"/>
+</enum>
+
+<enum name="NTPCustomizeLocalImageBackgroundAction">
+  <int value="0" label="'Cancel' clicked in the 'Upload an image' dialog"/>
+  <int value="1" label="'Done' clicked in the 'Upload an image' dialog"/>
+</enum>
+
+<enum name="NTPCustomizeShortcutAction">
+  <int value="0" label="Remove' clicked in the 'Edit shortcut' dialog"/>
+  <int value="1" label="Cancel' clicked in the 'Edit shortcut' dialog"/>
+  <int value="2" label="Done' clicked in the 'Edit shortcut' dialog"/>
+  <int value="3" label="'Undo' clicked in the message pop-up"/>
+  <int value="4"
+      label="'Restore default shortcuts' clicked in the message pop-up"/>
+</enum>
+
 <enum name="NtpFollowAction">
   <int value="0" label="PAGE_TRANSITION_LINK"/>
   <int value="1" label="PAGE_TRANSITION_TYPED"/>
@@ -34677,6 +34739,13 @@
   <int value="3" label="Interactive request - quota exceeded"/>
 </enum>
 
+<enum name="NTPShortcutCustomizationAvailability">
+  <int value="0" label="Shortcut customization available"/>
+  <int value="1" label="Shortcut customization feature unavailable"/>
+  <int value="2"
+      label="Shortcut customization unavailable due to search provider"/>
+</enum>
+
 <enum name="NtpSnippetsFetchResult">
   <int value="0" label="Success"/>
   <int value="1" label="Empty hosts - deprecated"/>
@@ -37496,6 +37565,8 @@
   <int value="1" label="Read failed"/>
   <int value="2" label="Duplcate tags"/>
   <int value="3" label="Server failed"/>
+  <int value="4" label="Cleanup failed"/>
+  <int value="5" label="Decryption failed"/>
 </enum>
 
 <enum name="PaymentRequestAbortReason">
@@ -38473,6 +38544,23 @@
   <int value="4" label="More than two ports exist"/>
 </enum>
 
+<enum name="PowerMLDimImminentAction">
+  <int value="0" label="ModelIgnored">
+    Dim occurred naturally following a screen dim imminent.
+  </int>
+  <int value="1" label="ModelDim">
+    Dim occurred following model instruction.
+  </int>
+  <int value="2" label="ModelNoDim">
+    Dim deferred following model instruction.
+  </int>
+</enum>
+
+<enum name="PowerMLFinalResult">
+  <int value="0" label="Reactivation">User reactivated after dim.</int>
+  <int value="1" label="Off">System was suspended after dim.</int>
+</enum>
+
 <enum name="PowerMLPreviousEventLoggingResult">
   <int value="0" label="Success">Previous event was logged successfully.</int>
   <int value="1" label="Error">Previous event was not logged successfully.</int>
@@ -38493,6 +38581,35 @@
   </int>
 </enum>
 
+<enum name="PowerMLSmartDimModelResult">
+  <int value="0" label="Success">
+    Inactivity score was calculated successfully.
+  </int>
+  <int value="1" label="Preprocessor initialization failed">
+    The ExamplePreprocessorConfig could not be loaded or parsed.
+  </int>
+  <int value="2" label="Preprocessor other error">
+    The ExamplePreprocessor returned an error other than, or in addition to, the
+    kNoFeatureIndexFound error.
+  </int>
+  <int value="3" label="Other internal error">
+    Other error unrelated to preprocessor. This signals a bug in the feature
+    generation process.
+  </int>
+</enum>
+
+<enum name="PowerMLSmartDimParameterResult">
+  <int value="0" label="Success">
+    Threshold parameter was defined and parsed correctly.
+  </int>
+  <int value="1" label="Undefined error">
+    Threshold parameter was undefined.
+  </int>
+  <int value="2" label="Parsing error">
+    Threshold parameter was not parsed correctly from string to double.
+  </int>
+</enum>
+
 <enum name="PowerSupplyType">
   <summary>
     The type of power supply connected to a Chrome OS system, as reported by the
@@ -42810,6 +42927,28 @@
   <int value="6" label="META_DATA_SENDER_ERROR"/>
 </enum>
 
+<enum name="ServiceWorkerMainResourceRequestDestination">
+  <summary>
+    Describes whether a main resource request went to service worker or network
+    or errored.
+  </summary>
+  <int value="0" label="kServiceWorker"/>
+  <int value="1" label="kNetworkBecauseNoActiveVersion"/>
+  <int value="2" label="kNetworkBecauseNoActiveVersionAfterContinuing"/>
+  <int value="3" label="kNetworkBecauseNoContext"/>
+  <int value="4" label="kNetworkBecauseNoFetchEventHandler"/>
+  <int value="5" label="kNetworkBecauseNoProvider"/>
+  <int value="6" label="kNetworkBecauseNoProviderAfterContinuing"/>
+  <int value="7" label="kNetworkBecauseNoRegistration"/>
+  <int value="8" label="kNetworkBecauseNotAllowed"/>
+  <int value="9" label="kNetworkBecauseNotSecure"/>
+  <int value="10" label="kErrorNoActiveWorkerFromDelegate"/>
+  <int value="11" label="kErrorRequestBodyFailed"/>
+  <int value="12" label="kAbortedWhileDispatchingFetchEvent"/>
+  <int value="13" label="kAbortedWithoutDispatchingFetchEvent"/>
+  <int value="14" label="kJobWasCancelled"/>
+</enum>
+
 <enum name="ServiceWorkerMetrics.EventType">
   <int value="0" label="ACTIVATE"/>
   <int value="1" label="INSTALL"/>
@@ -43572,8 +43711,8 @@
 <enum name="SigninRefreshTokenRevocationRequestProgress">
   <int value="0" label="Request Created"/>
   <int value="1" label="Request Started"/>
-  <int value="2" label="Request Succeeded"/>
-  <int value="3" label="Request Failed"/>
+  <int value="2" label="Request Failed"/>
+  <int value="3" label="Request Succeeded"/>
 </enum>
 
 <enum name="SigninRequestHeaderOperation">
@@ -47578,6 +47717,16 @@
   <int value="3" label="More options: Make no changes was selected"/>
 </enum>
 
+<enum name="UnifiedConsentBumpSuppressReason">
+  <int value="0" label="None (consent bump was shown)"/>
+  <int value="1" label="User wasn't signed in"/>
+  <int value="2" label="User wasn't syncing everything"/>
+  <int value="3" label="On-by-default privacy setting was off"/>
+  <int value="4" label="User opted into Unity in settings"/>
+  <int value="5" label="User signed out"/>
+  <int value="6" label="Sync was paused"/>
+</enum>
+
 <enum name="UniformityTrialGroupNotActive">
   <int value="0" label="Invalid"/>
   <int value="1" label="Group not reported"/>
@@ -48309,6 +48458,10 @@
     Blink did not request a code cache because it has a script resource without
     a cache handler
   </int>
+  <int value="20" label="kHitIsolateCacheWhenStreamingSource">
+    Blink parsed and compiled the script as it was streamed, but we then hit
+    V8's isolate's compilation cache and did not require the streamed result.
+  </int>
 </enum>
 
 <enum name="V8CodeCacheRejectReason">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 5728704f..a525dec 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -5437,6 +5437,22 @@
   </summary>
 </histogram>
 
+<histogram name="AsyncDNS.Rcode" enum="AsyncDNSRcode">
+  <owner>robpercival@chromium.org</owner>
+  <summary>
+    The DNS response rcode
+    (https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6).
+    Logged when a DnsTransaction finishes an attempt at a DNS record lookup. It
+    may make multiple attempts - the rcode of each attempt will be logged. No
+    logging will occur for attempts that do not obtain a response from a DNS
+    server.
+
+    Only DNS record lookups performed by the internal DNS resolver
+    (&quot;AsyncDNS&quot;) will have their rcode logged. Lookups performed by
+    the system resolver will not have their rcode logged.
+  </summary>
+</histogram>
+
 <histogram name="AsyncDNS.ResolveError" enum="NetErrorCodes">
   <obsolete>
     Deprecated as of 9/2017. Replaced by Net.DNS.DnsTaskError.
@@ -8441,7 +8457,25 @@
 <histogram name="Blink.Compositing.UpdateTime" units="microseconds">
   <owner>paint-dev@chromium.org</owner>
   <summary>
-    Time spent updating compositing in the Blink document lifecycle.
+    Time spent updating compositing in the Blink document lifecycle. This is the
+    legacy compositing approach. BlinkGenPropertyTrees launches part of the new
+    compositing approach and will use both this and
+    Blink.CompositingCommit.UpdateTime.
+
+    Note: As of M70, this histogram has stopped recording metrics on machines
+    with low-resolution clocks.
+  </summary>
+</histogram>
+
+<histogram name="Blink.CompositingCommit.UpdateTime" units="microseconds">
+  <owner>paint-dev@chromium.org</owner>
+  <summary>
+    Time spent updating and pushing layers at the end of the paint step in the
+    Blink document lifecycle. This is the new compositing approach in slimming
+    paint V2 and is largely implemented by PaintArtifactCompositor.
+    BlinkGenPropertyTrees is an incremental launch of part of the new
+    compositing approach and will use both this and
+    Blink.Compositing.UpdateTime.
 
     Note: As of M70, this histogram has stopped recording metrics on machines
     with low-resolution clocks.
@@ -8760,6 +8794,9 @@
 
 <histogram base="true" name="Blink.ResourceLoadScheduler.DecodedBytes"
     units="bytes">
+  <obsolete>
+    Deprecated as of 8/2018.
+  </obsolete>
 <!-- Name completed by histogram_suffixes name="ResourceLoadScheduler.FrameType" -->
 
   <owner>toyoshim@chromium.org</owner>
@@ -8844,6 +8881,9 @@
 
 <histogram base="true" name="Blink.ResourceLoadScheduler.TrafficBytes"
     units="bytes">
+  <obsolete>
+    Deprecated as of 8/2018.
+  </obsolete>
 <!-- Name completed by histogram_suffixes name="ResourceLoadScheduler.FrameType" -->
 
   <owner>toyoshim@chromium.org</owner>
@@ -16811,6 +16851,9 @@
 </histogram>
 
 <histogram name="DataReductionProxy.UserViewedSavingsPercent" units="%">
+  <obsolete>
+    Deprecated March 2018. Percent no longer displayed.
+  </obsolete>
   <owner>tbansal@chromium.org</owner>
   <summary>
     The percentage of data savings displayed to users. Computed over the last 30
@@ -16819,9 +16862,6 @@
 </histogram>
 
 <histogram name="DataReductionProxy.UserViewedSavingsSize" units="KB">
-  <obsolete>
-    Deprecated March 2018. Percent no longer displayed.
-  </obsolete>
   <owner>tbansal@chromium.org</owner>
   <summary>
     The total data saved displayed to the user. Computed over the last 30 days.
@@ -33500,6 +33540,15 @@
   </summary>
 </histogram>
 
+<histogram name="GPU.SurfaceOwner.AImageReader.AcquireImageResult"
+    enum="MediaStatus" expires_after="2018-11-25">
+  <owner>vikassoni@chromium.org</owner>
+  <summary>
+    Counts the error code which is returned when AImageReader api call
+    acquireLatestImageAsync fails.
+  </summary>
+</histogram>
+
 <histogram name="GPU.SwiftShaderLifetimeEvents" enum="GPUProcessLifetimeEvent">
   <obsolete>
     Deprecated 05/2018. Moved to GPU.ProcessLifetimeEvents.SwiftShader.
@@ -45895,7 +45944,7 @@
 
 <histogram name="Mobile.SystemNotification.ChannelBlocked"
     enum="SystemNotificationType">
-  <owner>awdf@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     Android: Represents the number of system notifications by type that we
     attempted to show but were blocked, due to their notification channel being
@@ -45983,6 +46032,16 @@
   </summary>
 </histogram>
 
+<histogram name="MobileDownload.Location.Dialog.DirectoryType"
+    enum="DownloadLocationDirectoryType">
+  <owner>xingliu@chromium.org</owner>
+  <summary>
+    Records the directory type when the user selects the download directory
+    through download location dialog. May be recorded even when the user didn't
+    download anything.
+  </summary>
+</histogram>
+
 <histogram name="MobileDownload.Location.Dialog.Result"
     enum="DownloadLocationDialogResult">
   <owner>xingliu@chromium.org</owner>
@@ -46001,14 +46060,19 @@
   </summary>
 </histogram>
 
+<histogram name="MobileDownload.Location.Download.DirectoryType"
+    enum="DownloadLocationDirectoryType">
+  <owner>xingliu@chromium.org</owner>
+  <summary>Records the directory type when download is completed.</summary>
+</histogram>
+
 <histogram name="MobileDownload.Location.Setting.DirectoryType"
     enum="DownloadLocationDirectoryType">
   <owner>xingliu@chromium.org</owner>
   <summary>
     Records the directory type when the user selects the download directory
-    through download location dialog or selects the download directory in
-    download preference. May be recorded even when the user didn't download
-    anything.
+    through download preference. May be recorded even when the user didn't
+    download anything.
   </summary>
 </histogram>
 
@@ -49096,6 +49160,9 @@
 </histogram>
 
 <histogram name="Net.AsyncRevalidation.ReadError" enum="NetErrorCodes">
+  <obsolete>
+    Removed in March 2017. See https://crbug.com/700568.
+  </obsolete>
   <owner>ricea@chromium.org</owner>
   <summary>
     Counts of error codes received while reading the body of an async
@@ -49105,6 +49172,9 @@
 </histogram>
 
 <histogram name="Net.AsyncRevalidation.ResponseError" enum="NetErrorCodes">
+  <obsolete>
+    Removed in March 2017. See https://crbug.com/700568.
+  </obsolete>
   <owner>ricea@chromium.org</owner>
   <summary>
     Counts of error codes received while performing an async revalidation before
@@ -49114,6 +49184,9 @@
 </histogram>
 
 <histogram name="Net.AsyncRevalidation.Result" enum="AsyncRevalidationResult">
+  <obsolete>
+    Removed in March 2017. See https://crbug.com/700568.
+  </obsolete>
   <owner>ricea@chromium.org</owner>
   <summary>
     The result of an async revalidation resulting from application of the
@@ -60790,6 +60863,80 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.CustomizationAvailability.Backgrounds"
+    enum="NTPBackgroundCustomizationAvailability" expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    The availability of New Tab Page background customization features on
+    Desktop, based on feature flags or other configuration settings; logged per
+    NTP load.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.CustomizationAvailability.Shortcuts"
+    enum="NTPShortcutCustomizationAvailability" expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    The availability of New Tab Page shortcut customization features on Desktop,
+    based on feature flags or other configuration settings; logged per NTP load.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.CustomizeAction" enum="NTPCustomizeAction"
+    expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    Customization actions performed by the user on the New Tab Page; logged as
+    each interaction occurs. This may indicate popularity of a particular
+    customization type.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.CustomizeChromeBackgroundAction"
+    enum="NTPCustomizeChromeBackgroundAction" expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    Captures the actions performed when configuring a 'Chrome background' image
+    on the New Tab Page. Since most actions are sequential, this may indicate
+    steps in the configuration process where users drop off.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.Customized" enum="NTPCustomizedFeatures"
+    expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    The New Tab Page features that have been customized by the user; logged per
+    NTP load.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.CustomizeLocalImageBackgroundAction"
+    enum="NTPCustomizeLocalImageBackgroundAction" expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    Captures the actions performed when uploading a local image as the
+    background on the New Tab Page. Since most actions are sequential, this may
+    indicate steps in the configuration process where users drop off.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.CustomizeShortcutAction"
+    enum="NTPCustomizeShortcutAction" expires_after="M74">
+  <owner>ramyan@chromium.org</owner>
+  <owner>yyushkina@chromium.org</owner>
+  <summary>
+    Captures the actions performed when configuring shortcuts on the New Tab
+    Page.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.DefaultPageType" enum="NtpPaneType">
   <obsolete>
     Deprecated 2016-02.
@@ -62066,7 +62213,7 @@
 </histogram>
 
 <histogram name="Notifications.Android.JobStartDelay" units="ms">
-  <owner>awdf@chromium.org</owner>
+  <owner>peter@chromium.org</owner>
   <summary>
     Records the delay between scheduling a job with the JobScheduler (with a
     desired latency of 0ms, in response to a notification click) and receiving
@@ -76314,12 +76461,65 @@
   </summary>
 </histogram>
 
+<histogram name="PowerML.DimImminent.Action" enum="PowerMLDimImminentAction">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    What happens when UserActivityManager receives a screen dim imminent
+    notification. Only applicable to Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="PowerML.ModelDim.Result" enum="PowerMLFinalResult">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    What happens after screen is dimmed following model instruction. Only
+    applicable to Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="PowerML.ModelNoDim.Result" enum="PowerMLFinalResult">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    What happens after screen dim is deferred following model instruction. Only
+    applicable to Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="PowerML.NonModelDim.Result" enum="PowerMLFinalResult">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    What happens after screen is dimmed by powerd by ignoring the model
+    instruction. Only applicable to Chrome OS.
+  </summary>
+</histogram>
+
 <histogram name="PowerML.PreviousEventLogging.Result"
     enum="PowerMLPreviousEventLoggingResult">
   <owner>jiameng@chromium.org</owner>
   <summary>
     Status of logging previous idle event after a screen dim imminent signal is
-    received.
+    received. Only applicable to Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="PowerML.SmartDimModel.Result"
+    enum="PowerMLSmartDimModelResult">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    This is the status code returned by the model when calculating a user
+    inactivity score. If it is any value other than 0 (success), then some issue
+    has occurred in the score calculation, either because preprocess was not
+    loaded or parsed correctly, or the preprocessor failed to process a
+    RankerExample. Only applicable to Chrome OS.
+  </summary>
+</histogram>
+
+<histogram name="PowerML.SmartDimParameter.Result"
+    enum="PowerMLSmartDimParameterResult">
+  <owner>jiameng@chromium.org</owner>
+  <summary>
+    The result of parsing the dim threshold parameter value. Only applicable to
+    Chrome OS.
   </summary>
 </histogram>
 
@@ -91116,6 +91316,23 @@
   </summary>
 </histogram>
 
+<histogram name="ServiceWorker.MainResourceRequestDestination"
+    enum="ServiceWorkerMainResourceRequestDestination"
+    expires_after="2018-12-01">
+  <owner>falken@chromium.org, worker-dev@chromium.org</owner>
+  <summary>
+    Describes whether a main resource request (i.e., a request for a main frame,
+    subframe, or shared worker) was routed to service worker or network and why.
+    The purpose is to debug why ServicifiedServiceWorker has a lower count of
+    ServiceWorker.MainResource.FetchEvent.Status than the control:
+    https://crbug.com/866335.
+
+    Recorded for every main resource request that is seen by
+    ServiceWorkerControlleeRequestHandler (usually means all http(s) requests).
+    If redirects occur, it is recorded for each redirect.
+  </summary>
+</histogram>
+
 <histogram name="ServiceWorker.MessageEvent.Time" units="ms">
   <obsolete>
     Deprecated 2016-04 in favor of ServiceWorker.ExtendableMessageEvent.Time.
@@ -97269,6 +97486,17 @@
   </summary>
 </histogram>
 
+<histogram name="Stability.Android.StrongBindingOomRemainingStrongBindingCount">
+  <owner>boliu@chromium.org</owner>
+  <owner>ssid@chromium.org</owner>
+  <summary>
+    Record the count of strongly bound child services left when a child service
+    with strong binding is OOM killed by Android. Recorded when such a OOM kill
+    is detected by browser. Note this does not distinguish process type, and is
+    for example count both GPU and renderer process.
+  </summary>
+</histogram>
+
 <histogram name="Stability.BadMessageTerminated.Chrome"
     enum="BadMessageReasonChrome">
   <owner>nick@chromium.org</owner>
@@ -102539,6 +102767,9 @@
 </histogram>
 
 <histogram name="Tab.TabUnder.EngagementScore" units="engagement score">
+  <obsolete>
+    Deprecated August 2018
+  </obsolete>
   <owner>csharrison@chromium.org</owner>
   <summary>
     Measures the engagement score associated with the URL that is detected as
@@ -106723,7 +106954,7 @@
 </histogram>
 
 <histogram name="UnifiedConsent.ConsentBump.Action"
-    enum="UnifiedConsentBumpAction">
+    enum="UnifiedConsentBumpAction" expires_after="2019-08-01">
   <owner>tangltom@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
@@ -106731,14 +106962,13 @@
   </summary>
 </histogram>
 
-<histogram name="UnifiedConsent.Migration.SyncEverythingWasOn" enum="Boolean"
-    expires_after="2019-08-01">
+<histogram name="UnifiedConsent.ConsentBump.SuppressReason"
+    enum="UnifiedConsentBumpSuppressReason" expires_after="2019-08-01">
   <owner>tangltom@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <summary>
-    Indicator whether a sync user was syncing everything during the migration to
-    Unified Consent. The migration happens at startup and only once per profile.
-    If the user wasn't signed into Chrome, nothing is recorded.
+    The reason the consent bump isn't shown to the user. This is recorded at
+    startup during the migration to Unified Consent.
   </summary>
 </histogram>
 
@@ -113591,7 +113821,7 @@
   </summary>
 </histogram>
 
-<histogram name="WebRTC.PeerConnection.AddCandidate"
+<histogram name="WebRTC.PeerConnection.AddIceCandidate"
     enum="AddIceCandidateResult" expires_after="M72">
   <owner>hta@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index eb56b65b..ae27a34 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -515,6 +515,18 @@
       the event period.
     </summary>
   </metric>
+  <metric name="CompositingCommit.Average">
+    <summary>
+      The average time taken by the compositing commit at the end of the blink
+      lifecycle, in microseconds in the event period.
+    </summary>
+  </metric>
+  <metric name="CompositingCommit.WorstCase">
+    <summary>
+      The longest single time taken by the compositing commit at the end of the
+      blink lifecycle, in microseconds in the event period.
+    </summary>
+  </metric>
   <metric name="IntersectionObservation.Average">
     <summary>
       The average time taken to compute IntersectionObserver observations in
@@ -2344,8 +2356,6 @@
 </event>
 
 <event name="Notification">
-  <owner>yangsharon@google.com</owner>
-  <owner>awdf@chromium.org</owner>
   <owner>peter@chromium.org</owner>
   <summary>
     A notification event corresponds with the entire lifespan of a single
@@ -3167,12 +3177,25 @@
       blink::TaskType for the current task.
     </summary>
   </metric>
+  <metric name="ThreadType">
+    <summary>
+      blink::WebThreadType for the thread the current task was executed on.
+    </summary>
+  </metric>
   <metric name="UseCase">
     <summary>
       MainThreadSchedulerImpl's UseCase when this task was completed. See
       blink::scheduler::UseCase for the values of this enum.
     </summary>
   </metric>
+  <metric name="Version">
+    <summary>
+      The version of this metric, which is used to track the actual set of
+      values present across different builds and channels. Hardcoded into the
+      binary and incremented each time a new field is added or existing is
+      changed. Integer.
+    </summary>
+  </metric>
 </event>
 
 <event name="Pepper.Broker" singular="True">
@@ -4200,6 +4223,12 @@
       dim will be deferred.
     </summary>
   </metric>
+  <metric name="ModelResponse">
+    <summary>
+      Whether the model recommends the screen dim should be deferred (NO_DIM) or
+      allowed (DIM), or encountered an error (MODEL_ERROR).
+    </summary>
+  </metric>
   <metric name="MouseEventsInLastHour">
     <summary>
       The number of mouse events reported as user activity in the last hour.
@@ -4606,4 +4635,21 @@
   </metric>
 </event>
 
+<event name="WebRTC.AddressHarvesting">
+  <owner>hta@chromium.org</owner>
+  <summary>
+    Collects usage patterns that may indicate attempts to gather users' IP
+    addresses. A heuristic in the webrtc library tries to detect usages that may
+    indicate attempts to gather users' IP addresses rather than setting up
+    communication via WebRTC, and reports possible attempts.
+  </summary>
+  <metric name="UsagePattern">
+    <summary>
+      The usage pattern detected (an int encoding bit values). The bits are
+      defined in third_party/webrtc/pc/peerconnection.h, in the
+      &quot;PeerConnection::UsageEvent&quot; enum.
+    </summary>
+  </metric>
+</event>
+
 </ukm-configuration>
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py
index fadecb62..db76010 100644
--- a/tools/perf/benchmarks/system_health_smoke_test.py
+++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -178,7 +178,9 @@
     # Prefetch WPR archive needed by the stories set to avoid race condition
     # when feching them when tests are run in parallel.
     # See crbug.com/700426 for more details.
-    stories_set.wpr_archive_info.DownloadArchivesIfNeeded()
+    story_names = [s.name for s in stories_set if not s.is_local]
+    stories_set.wpr_archive_info.DownloadArchivesIfNeeded(
+        story_names=story_names)
 
     for story_to_smoke_test in stories_set.stories:
       suite.addTest(
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py
index 24d1247..2aa0b6d 100755
--- a/tools/perf/core/perf_data_generator.py
+++ b/tools/perf/core/perf_data_generator.py
@@ -282,32 +282,6 @@
         'device_os_flavor': 'google',
       },
     },
-    'Android One Perf': {
-      'tests': [
-        {
-          'isolate': 'performance_test_suite',
-          'num_shards': 16,
-          'extra_args': [
-              '--run-ref-build',
-              '--test-shard-map-filename=android_one_16_shard_map.json',
-              '--assert-gpu-compositing',
-          ],
-        },
-        {
-          'isolate': 'tracing_perftests',
-          'num_shards': 1,
-          'telemetry': False,
-        }
-      ],
-      'platform': 'android',
-      'dimension': {
-        'pool': 'chrome.tests.perf',
-        'os': 'Android',
-        'device_type': 'sprout',
-        'device_os': 'LMY47W',
-        'device_os_flavor': 'google',
-      },
-    },
     'Android Nexus5X WebView Perf': {
       'tests': [
         {
@@ -476,15 +450,16 @@
     },
     'mac-10_12_laptop_low_end-perf': {
       'tests': [
-        {
-          'isolate': 'performance_test_suite',
-          'num_shards': 26,
-          'extra_args': [
-              '--run-ref-build',
-              '--test-shard-map-filename=mac_1012_low_end_26_shard_map.json',
-              '--assert-gpu-compositing',
-          ],
-        },
+       # crbug.com/868675
+       # {
+       #   'isolate': 'performance_test_suite',
+       #   'num_shards': 26,
+       #   'extra_args': [
+       #       '--run-ref-build',
+       #       '--test-shard-map-filename=mac_1012_low_end_26_shard_map.json',
+       #       '--assert-gpu-compositing',
+       #   ],
+       # },
         {
           'isolate': 'load_library_perf_tests',
           'num_shards': 1,
@@ -545,15 +520,16 @@
     },
     'mac-10_13_laptop_high_end-perf': {
       'tests': [
-        {
-          'isolate': 'performance_test_suite',
-          'extra_args': [
-            '--run-ref-build',
-            '--test-shard-map-filename=mac_1013_high_end_26_shard_map.json',
-              '--assert-gpu-compositing',
-          ],
-          'num_shards': 26
-        },
+       # crbug.com/868675
+       # {
+       #   'isolate': 'performance_test_suite',
+       #   'extra_args': [
+       #     '--run-ref-build',
+       #     '--test-shard-map-filename=mac_1013_high_end_26_shard_map.json',
+       #       '--assert-gpu-compositing',
+       #   ],
+       #   'num_shards': 26
+       # },
         {
           'isolate': 'net_perftests',
           'num_shards': 1,
diff --git a/tools/perf/core/retrieve_story_timing.py b/tools/perf/core/retrieve_story_timing.py
index 2f92f64..0d51b5a 100755
--- a/tools/perf/core/retrieve_story_timing.py
+++ b/tools/perf/core/retrieve_story_timing.py
@@ -4,6 +4,7 @@
 # found in the LICENSE file.
 
 import argparse
+import collections
 import json
 import subprocess
 import sys
@@ -25,7 +26,7 @@
 """
 
 
-QUERY_LAST_RUNS = """
+QUERY_STORY_AVG_RUNTIME = """
 SELECT
   name,
   ROUND(AVG(time)) AS duration,
@@ -53,6 +54,34 @@
   name
 """
 
+QUERY_STORY_TOTAL_RUNTIME = """
+SELECT
+  name,
+  ROUND(AVG(time)) AS duration,
+FROM (
+  SELECT
+    run.name AS name,
+    start_time,
+    SUM(run.times) AS time
+  FROM
+    [test-results-hrd:events.test_results]
+  WHERE
+    buildbot_info.builder_name IN ({configuration_names})
+    AND run.time IS NOT NULL
+    AND run.time != 0
+    AND run.is_unexpected IS FALSE
+    AND DATEDIFF(CURRENT_DATE(), DATE(start_time)) < {num_last_days}
+  GROUP BY
+    name,
+    start_time
+  ORDER BY
+    start_time DESC)
+GROUP BY
+  name
+ORDER BY
+  name
+"""
+
 
 def _run_query(query):
   args = ["bq", "query", "--format=json", "--max_rows=100000", query]
@@ -73,10 +102,40 @@
 
 
 def FetchAverageStortyTimingData(configurations, num_last_days):
-  return _run_query(QUERY_LAST_RUNS.format(
+  return _run_query(QUERY_STORY_AVG_RUNTIME.format(
       configuration_names=configurations, num_last_days=num_last_days))
 
 
+def FetchBenchmarkRuntime(configurations, num_last_days):
+  test_total_runtime =  _run_query(QUERY_STORY_TOTAL_RUNTIME.format(
+      configuration_names=configurations, num_last_days=num_last_days))
+  benchmarks_data = collections.OrderedDict()
+  total_runtime = 0
+  total_num_stories = 0
+  for item in test_total_runtime:
+    duration = item['duration']
+    test_name = item['name']
+    benchmark_name, _ = test_name.split('/', 1)
+    if not benchmark_name in benchmarks_data:
+      benchmarks_data[benchmark_name] = {
+          'num_stories': 0,
+          'total_runtime_in_seconds': 0,
+      }
+    benchmarks_data[benchmark_name]['num_stories'] += 1
+    total_num_stories += 1
+    benchmarks_data[benchmark_name]['total_runtime_in_seconds'] += (
+        float(duration))
+    total_runtime += float(duration)
+  benchmarks_data['All benchmarks'] = {
+      'total_runtime_in_seconds': total_runtime,
+      'num_stories': total_num_stories
+  }
+  return benchmarks_data
+
+
+_FETCH_BENCHMARK_RUNTIME = 'fetch-benchmark-runtime'
+_FETCH_STORY_RUNTIME = 'fetch-story-runtime'
+
 def main(args):
   """
     To run this script, you need to be able to run bigquery in your terminal.
@@ -92,8 +151,10 @@
   """
   parser = argparse.ArgumentParser(
       description='Retrieve story timing from bigquery.')
+  parser.add_argument('action',
+      choices=[_FETCH_BENCHMARK_RUNTIME, _FETCH_STORY_RUNTIME])
   parser.add_argument(
-      '--output-file', action='store', required=True,
+      '--output-file', '-o', action='store', required=True,
       help='The filename to send the bigquery results to.')
   parser.add_argument(
       '--configurations', '-c', action='append', required=True,
@@ -104,11 +165,15 @@
   opts = parser.parse_args(args)
 
   configurations = str(opts.configurations).strip('[]')
-  if opts.build_number:
-    data = FetchStoryTimingDataForSingleBuild(configurations,
-        opts.build_number)
+
+  if opts.action == _FETCH_BENCHMARK_RUNTIME:
+    data = FetchBenchmarkRuntime(configurations, num_last_days=5)
   else:
-    data = FetchAverageStortyTimingData(configurations, num_last_days=5)
+    if opts.build_number:
+      data = FetchStoryTimingDataForSingleBuild(configurations,
+          opts.build_number)
+    else:
+      data = FetchAverageStortyTimingData(configurations, num_last_days=5)
 
   with open(opts.output_file, 'w') as output_file:
     json.dump(data, output_file, indent = 4, separators=(',', ': '))
diff --git a/tools/perf/core/sharding_map_generator.py b/tools/perf/core/sharding_map_generator.py
index eef5263..9808bb8 100644
--- a/tools/perf/core/sharding_map_generator.py
+++ b/tools/perf/core/sharding_map_generator.py
@@ -10,7 +10,7 @@
 {
   "0": {
     "benchmarks": [
-      "battor.steady_state": {},
+      "power.desktop": {},
       "rendering.mobile": {
         "begin": 0,
         "end": 104
diff --git a/tools/perf/expectations.config b/tools/perf/expectations.config
index ed024bb..9d2cca14 100644
--- a/tools/perf/expectations.config
+++ b/tools/perf/expectations.config
@@ -7,14 +7,12 @@
 # tags: ChromeOS Android Desktop Nexus_5 Nexus_5X Nexus_6P
 # tags: Nexus_7 Mac_10.11 Mac_10.12 Nexus6_Webview Nexus5X_Webview
 
-# Benchmark: battor.steady_state
-crbug.com/505990 [ All ] battor.steady_state/http://abcnews.go.com/ [ Skip ]
-
 # Benchmark: blink_perf.bindings
 crbug.com/764868 [ Android_One ] blink_perf.bindings/structured-clone-long-string-deserialize.html [ Skip ]
 crbug.com/764868 [ Android_One ] blink_perf.bindings/structured-clone-json-serialize.html [ Skip ]
 crbug.com/764868 [ Android_One ] blink_perf.bindings/structured-clone-long-string-serialize.html [ Skip ]
 crbug.com/764868 [ Android_One ] blink_perf.bindings/structured-clone-json-deserialize.html [ Skip ]
+crbug.com/764868 [ Android_One ] blink_perf.bindings/worker-structured-clone-json-serialize.html [ Skip ]
 
 # Benchmark: blink_perf.canvas
 crbug.com/593973 [ Android_Svelte ] blink_perf.canvas/* [ Skip ]
@@ -114,6 +112,7 @@
 crbug.com/859597 [ Nexus_5X ] loading.mobile/Youtube_3g [ Skip ]
 crbug.com/859597 [ Nexus5X_Webview ] loading.mobile/GoogleBrazil_3g [ Skip ]
 crbug.com/867103 [ Nexus5X_Webview ] loading.mobile/FlipBoard_warm_3g [ Skip ]
+crbug.com/871421 [ Android_One ] loading.mobile/Dramaq_3g [ Skip ]
 
 # Benchmark: memory.long_running_idle_gmail_tbmv2
 crbug.com/611167 [ Android_Svelte ] memory.long_running_idle_gmail_tbmv2/* [ Skip ]
@@ -234,6 +233,7 @@
 crbug.com/869118 [ Linux ] system_health.memory_desktop/long_running:tools:gmail-background [ Skip ]
 crbug.com/836447 [ ChromeOS ] system_health.memory_desktop/multitab:misc:typical24 [ Skip ]
 crbug.com/799734 [ Win ] system_health.memory_desktop/browse:media:tumblr [ Skip ]
+crbug.com/870852 [ Win ] system_health.memory_desktop/browse:media:pinterest [ Skip ]
 
 # Benchmark: system_health.memory_mobile
 crbug.com/787001 [ Android_Webview ] system_health.memory_mobile/load:media:soundcloud [ Skip ]
diff --git a/tools/perf/fetch_benchmark_deps.py b/tools/perf/fetch_benchmark_deps.py
index 465e6d4..66eebbfa 100755
--- a/tools/perf/fetch_benchmark_deps.py
+++ b/tools/perf/fetch_benchmark_deps.py
@@ -35,8 +35,8 @@
     return
 
   # Download WPR files.
-  if any(not story.is_local for story in story_set):
-    story_set.wpr_archive_info.DownloadArchivesIfNeeded()
+  story_names = [s.name for s in story_set if not s.is_local]
+  story_set.wpr_archive_info.DownloadArchivesIfNeeded(story_names=story_names)
 
 
 def _EnumerateDependencies(story_set):
diff --git a/tools/run-swarmed.py b/tools/run-swarmed.py
index a55df65c..ef7097e 100755
--- a/tools/run-swarmed.py
+++ b/tools/run-swarmed.py
@@ -11,7 +11,7 @@
 
 To use, run in a new shell (it blocks until all Swarming jobs complete):
 
-  tools/fuchsia/run-swarmed.py -t content_unittests --out-dir=out/fuch
+  tools/run-swarmed.py -t content_unittests --out-dir=out/fuch
 
 The logs of the runs will be stored in results/ (or specify a results directory
 with --results=some_dir). You can then do something like `grep -L SUCCESS
@@ -62,7 +62,8 @@
     trigger_args += [ '-d', 'os', 'Windows' ]
   trigger_args += [
       '--',
-      '--test-launcher-summary-output=${ISOLATED_OUTDIR}/output.json']
+      '--test-launcher-summary-output=${ISOLATED_OUTDIR}/output.json',
+      '--system-log-file=${ISOLATED_OUTDIR}/system_log']
   if gtest_filter:
     trigger_args.append('--gtest_filter=' + gtest_filter)
   elif args.target_os == 'fuchsia':
diff --git a/tools/traffic_annotation/bin/README.md b/tools/traffic_annotation/bin/README.md
index dd619334..e50b2885 100644
--- a/tools/traffic_annotation/bin/README.md
+++ b/tools/traffic_annotation/bin/README.md
@@ -73,5 +73,5 @@
 The following two lines will be updated by the above script, and the modified
 README should be committed along with the updated .sha1 checksums.
 
-CLANG_REVISION = '336424'
-LASTCHANGE=410d3d75c58860d371551c79045f35b7b277a183-refs/heads/master@{#574126}
+CLANG_REVISION = '338452'
+LASTCHANGE=d8fb3e8fd6e0b637be8af0180d96527541e6b69e-refs/heads/master@{#581194}
diff --git a/tools/traffic_annotation/bin/linux64/traffic_annotation_auditor.sha1 b/tools/traffic_annotation/bin/linux64/traffic_annotation_auditor.sha1
index 580b439..8a2b22ea 100644
--- a/tools/traffic_annotation/bin/linux64/traffic_annotation_auditor.sha1
+++ b/tools/traffic_annotation/bin/linux64/traffic_annotation_auditor.sha1
@@ -1 +1 @@
-171bcdfa3a8354d517eaad35da26eb6750392c13
\ No newline at end of file
+d47388b3f429e16c8a4aa2a515894cd29aef6f8f
\ No newline at end of file
diff --git a/tools/traffic_annotation/bin/win32/traffic_annotation_auditor.exe.sha1 b/tools/traffic_annotation/bin/win32/traffic_annotation_auditor.exe.sha1
index 61f6b557..8da88a2 100644
--- a/tools/traffic_annotation/bin/win32/traffic_annotation_auditor.exe.sha1
+++ b/tools/traffic_annotation/bin/win32/traffic_annotation_auditor.exe.sha1
@@ -1 +1 @@
-613a095e0c4c09228939da65fa9c72186af54545
\ No newline at end of file
+3183ab75a1945d54e1d09c60e4770036b032a684
\ No newline at end of file
diff --git a/tools/v8_context_snapshot/v8_context_snapshot_generator.cc b/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
index 75c2e08..8cbc6bee 100644
--- a/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
+++ b/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
@@ -7,7 +7,7 @@
 #include "base/files/file_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "gin/v8_initializer.h"
 #include "mojo/core/embedder/embedder.h"
@@ -21,22 +21,9 @@
 
 constexpr char kPredictableFlag[] = "--predictable";
 
-class SnapshotThread : public blink::WebThread {
- public:
-  bool IsCurrentThread() const override { return true; }
-  blink::ThreadScheduler* Scheduler() const override { return nullptr; }
-  scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() const override {
-    return base::ThreadTaskRunnerHandle::Get();
-  }
-};
-
 class SnapshotPlatform final : public blink::Platform {
  public:
   bool IsTakingV8ContextSnapshot() override { return true; }
-  blink::WebThread* CurrentThread() override {
-    static SnapshotThread dummy_thread;
-    return &dummy_thread;
-  }
 };
 
 }  // namespace
@@ -65,7 +52,7 @@
   // Take a snapshot.
   SnapshotPlatform platform;
   service_manager::BinderRegistry empty_registry;
-  blink::Initialize(&platform, &empty_registry, platform.CurrentThread());
+  blink::CreateMainThreadAndInitialize(&platform, &empty_registry);
   v8::StartupData blob = blink::WebV8ContextSnapshot::TakeSnapshot();
 
   // Save the snapshot as a file. Filename is given in a command line option.
diff --git a/ui/accessibility/platform/atk_util_auralinux_gtk2.cc b/ui/accessibility/platform/atk_util_auralinux_gtk2.cc
index d4a84cd..5bcccd9c 100644
--- a/ui/accessibility/platform/atk_util_auralinux_gtk2.cc
+++ b/ui/accessibility/platform/atk_util_auralinux_gtk2.cc
@@ -10,7 +10,7 @@
 #include "base/logging.h"
 #include "base/strings/string_split.h"
 #include "base/strings/string_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/accessibility/platform/atk_util_auralinux.h"
 
 typedef void (*GnomeAccessibilityModuleInitFunc)();
diff --git a/ui/android/java/res/values-v17/styles.xml b/ui/android/java/res/values-v17/styles.xml
index 2216725..67540bf 100644
--- a/ui/android/java/res/values-v17/styles.xml
+++ b/ui/android/java/res/values-v17/styles.xml
@@ -18,33 +18,27 @@
     <style name="ButtonCompatBorderlessOverlay">
         <item name="android:buttonStyle">@style/ButtonCompatBorderless</item>
     </style>
-    <!-- TODO(https://crbug.com/856244): Remove textAllCaps and textSize from button style and move
-         it to button textAppearance styles, and figure out why the feed library styles overrides
-         styles here. -->
     <style name="ButtonCompatBase">
         <item name="android:minWidth">88dp</item>
         <item name="android:minHeight">36dp</item>
-        <item name="android:textSize">14sp</item>
         <item name="android:paddingStart">20dp</item>
         <item name="android:paddingEnd">20dp</item>
         <item name="android:paddingTop">5dp</item>
         <item name="android:paddingBottom">5dp</item>
-        <item name="android:textAllCaps">true</item>
         <item name="android:focusable">true</item>
         <item name="android:clickable">true</item>
         <item name="android:gravity">center_vertical|center_horizontal</item>
     </style>
-    <!-- TODO(https://crbug.com/856244): Remove textStyle from button style and move it to button
-         textAppearance styles. -->
     <style name="ButtonCompat" parent="ButtonCompatBase">
         <item name="android:background">@drawable/button_compat_shape</item>
-        <item name="android:textStyle">bold</item>
     </style>
     <style name="ButtonCompatBorderless" parent="ButtonCompat">
         <item name="android:background">?android:attr/selectableItemBackground</item>
     </style>
 
     <!-- Used by Chrome and Content -->
+    <!-- TODO(huayinz): Update prefixes for text appearance styles in ui/android. -->
+    <style name="TextAppearance" parent="android:TextAppearance" tools:ignore="UnusedResources" />
     <style name="RobotoMediumStyle">
         <item name="android:fontFamily">sans-serif</item>
         <item name="android:textStyle">bold</item>
@@ -107,6 +101,7 @@
     <style name="BlackButtonText" parent="RobotoMediumStyle" tools:ignore="UnusedResources">
         <item name="android:textColor">@color/black_alpha_54</item>
         <item name="android:textSize">@dimen/text_size_medium</item>
+        <item name="android:textAllCaps">true</item>
     </style>
     <style name="BlackLink" tools:ignore="UnusedResources">
         <item name="android:textColor">@color/black_alpha_54</item>
@@ -156,10 +151,12 @@
     <style name="BlueButtonText1" parent="RobotoMediumStyle" tools:ignore="UnusedResources">
         <item name="android:textColor">@color/modern_blue_300</item>
         <item name="android:textSize">@dimen/text_size_medium</item>
+        <item name="android:textAllCaps">true</item>
     </style>
     <style name="BlueButtonText2" parent="RobotoMediumStyle" tools:ignore="UnusedResources">
         <item name="android:textColor">@color/modern_blue_600</item>
         <item name="android:textSize">@dimen/text_size_medium</item>
+        <item name="android:textAllCaps">true</item>
     </style>
     <style name="BlueLink1" tools:ignore="UnusedResources">
         <item name="android:textColor">@color/modern_blue_600</item>
diff --git a/ui/android/java/res/values-v21/styles.xml b/ui/android/java/res/values-v21/styles.xml
index 9f8f371..b8f1de04 100644
--- a/ui/android/java/res/values-v21/styles.xml
+++ b/ui/android/java/res/values-v21/styles.xml
@@ -4,11 +4,8 @@
      found in the LICENSE file. -->
 <resources xmlns:tools="http://schemas.android.com/tools">
     <!-- Buttons -->
-    <!-- TODO(https://crbug.com/856244): Remove fontFamily from button style and move
-         it to button textAppearance styles. -->
     <style name="ButtonCompat" parent="ButtonCompatBase">
         <item name="android:background">@drawable/button_compat</item>
-        <item name="android:fontFamily">sans-serif-medium</item>
     </style>
     <style name="ButtonCompatBorderless" parent="ButtonCompat">
         <item name="android:background">@drawable/button_borderless_compat</item>
diff --git a/ui/aura/demo/demo_main.cc b/ui/aura/demo/demo_main.cc
index a2cd379f..ce82f5b 100644
--- a/ui/aura/demo/demo_main.cc
+++ b/ui/aura/demo/demo_main.cc
@@ -13,7 +13,7 @@
 #include "base/power_monitor/power_monitor.h"
 #include "base/power_monitor/power_monitor_device_source.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "build/build_config.h"
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
diff --git a/ui/aura/mus/drag_drop_controller_mus_unittest.cc b/ui/aura/mus/drag_drop_controller_mus_unittest.cc
index 90c6767..753d7c9d 100644
--- a/ui/aura/mus/drag_drop_controller_mus_unittest.cc
+++ b/ui/aura/mus/drag_drop_controller_mus_unittest.cc
@@ -8,7 +8,7 @@
 
 #include "base/callback_forward.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/aura/client/drag_drop_client_observer.h"
 #include "ui/aura/client/drag_drop_delegate.h"
diff --git a/ui/aura/mus/window_tree_client.cc b/ui/aura/mus/window_tree_client.cc
index 2a287cb..9786d36 100644
--- a/ui/aura/mus/window_tree_client.cc
+++ b/ui/aura/mus/window_tree_client.cc
@@ -1511,10 +1511,11 @@
 void WindowTreeClient::OnDisplaysChanged(
     std::vector<ui::mojom::WsDisplayPtr> ws_displays,
     int64_t primary_display_id,
-    int64_t internal_display_id) {
+    int64_t internal_display_id,
+    int64_t display_id_for_new_windows) {
   got_initial_displays_ = true;
   delegate_->OnDisplaysChanged(std::move(ws_displays), primary_display_id,
-                               internal_display_id);
+                               internal_display_id, display_id_for_new_windows);
 }
 
 void WindowTreeClient::RequestClose(ui::Id window_id) {
diff --git a/ui/aura/mus/window_tree_client.h b/ui/aura/mus/window_tree_client.h
index 816164e..147cea9 100644
--- a/ui/aura/mus/window_tree_client.h
+++ b/ui/aura/mus/window_tree_client.h
@@ -438,7 +438,8 @@
   // ui::mojom::ScreenProviderObserver:
   void OnDisplaysChanged(std::vector<ui::mojom::WsDisplayPtr> ws_displays,
                          int64_t primary_display_id,
-                         int64_t internal_display_id) override;
+                         int64_t internal_display_id,
+                         int64_t display_id_for_new_windows) override;
 
   // Overriden from WindowTreeHostMusDelegate:
   void OnWindowTreeHostBoundsWillChange(
diff --git a/ui/aura/mus/window_tree_client_delegate.h b/ui/aura/mus/window_tree_client_delegate.h
index fa88b1f..d1746b6 100644
--- a/ui/aura/mus/window_tree_client_delegate.h
+++ b/ui/aura/mus/window_tree_client_delegate.h
@@ -70,7 +70,8 @@
   virtual void OnDisplaysChanged(
       std::vector<ui::mojom::WsDisplayPtr> ws_displays,
       int64_t primary_display_id,
-      int64_t internal_display_id) {}
+      int64_t internal_display_id,
+      int64_t display_id_for_new_windows) {}
 
  protected:
   virtual ~WindowTreeClientDelegate() {}
diff --git a/ui/base/material_design/OWNERS b/ui/base/material_design/OWNERS
new file mode 100644
index 0000000..645c186
--- /dev/null
+++ b/ui/base/material_design/OWNERS
@@ -0,0 +1,2 @@
+kylixrd@chromium.org
+robliao@chromium.org
diff --git a/ui/base/material_design/material_design_controller.cc b/ui/base/material_design/material_design_controller.cc
index c698b28..2ef51d7 100644
--- a/ui/base/material_design/material_design_controller.cc
+++ b/ui/base/material_design/material_design_controller.cc
@@ -121,18 +121,23 @@
       base::FeatureList::IsEnabled(features::kExperimentalUi);
 #endif
 
-  if (force_material_refresh ||
-      switch_value == switches::kTopChromeMDMaterialRefresh) {
+  if (switch_value == switches::kTopChromeMDMaterialRefresh) {
     SetMode(MATERIAL_REFRESH);
+  } else if (switch_value ==
+             switches::kTopChromeMDMaterialRefreshTouchOptimized) {
+    SetMode(MATERIAL_TOUCH_REFRESH);
+  } else if (force_material_refresh) {
+    bool has_touchscreen = false;
+#if defined(OS_CHROMEOS)
+    has_touchscreen = HasTouchscreen();
+#endif
+    SetMode(has_touchscreen ? MATERIAL_TOUCH_REFRESH : MATERIAL_REFRESH);
   } else if (switch_value == switches::kTopChromeMDMaterial) {
     SetMode(MATERIAL_NORMAL);
   } else if (switch_value == switches::kTopChromeMDMaterialHybrid) {
     SetMode(MATERIAL_HYBRID);
   } else if (switch_value == switches::kTopChromeMDMaterialTouchOptimized) {
     SetMode(MATERIAL_TOUCH_OPTIMIZED);
-  } else if (switch_value ==
-             switches::kTopChromeMDMaterialRefreshTouchOptimized) {
-    SetMode(MATERIAL_TOUCH_REFRESH);
   } else if (switch_value == switches::kTopChromeMDMaterialAuto) {
 #if defined(OS_WIN)
     // TODO(girard): add support for switching between modes when
@@ -172,8 +177,7 @@
 
 // static
 bool MaterialDesignController::IsSecondaryUiMaterial() {
-  return base::FeatureList::IsEnabled(features::kSecondaryUiMd) ||
-         IsRefreshUi();
+  return true;
 }
 
 // static
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc
index fa21564e..c7b4721 100644
--- a/ui/base/ui_base_features.cc
+++ b/ui/base/ui_base_features.cc
@@ -46,11 +46,6 @@
 const base::Feature kExperimentalUi{"ExperimentalUi",
                                     base::FEATURE_DISABLED_BY_DEFAULT};
 
-// Applies the material design mode to elements throughout Chrome (not just top
-// Chrome).
-const base::Feature kSecondaryUiMd = {"SecondaryUiMd",
-                                      base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Allows system keyboard event capture when |features::kKeyboardLockApi| is on.
 const base::Feature kSystemKeyboardLock{"SystemKeyboardLock",
                                         base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h
index 67d8a93c..b377efb2 100644
--- a/ui/base/ui_base_features.h
+++ b/ui/base/ui_base_features.h
@@ -21,7 +21,6 @@
 UI_BASE_EXPORT extern const base::Feature kEnableVirtualKeyboardMdUi;
 UI_BASE_EXPORT extern const base::Feature kEnableVirtualKeyboardUkm;
 UI_BASE_EXPORT extern const base::Feature kExperimentalUi;
-UI_BASE_EXPORT extern const base::Feature kSecondaryUiMd;
 UI_BASE_EXPORT extern const base::Feature kSystemKeyboardLock;
 UI_BASE_EXPORT extern const base::Feature kTouchableAppContextMenu;
 UI_BASE_EXPORT extern const base::Feature kNotificationIndicator;
diff --git a/ui/chromeos/search_box/search_box_view_base.cc b/ui/chromeos/search_box/search_box_view_base.cc
index 9634b12..bef78f2 100644
--- a/ui/chromeos/search_box/search_box_view_base.cc
+++ b/ui/chromeos/search_box/search_box_view_base.cc
@@ -293,12 +293,6 @@
   return gfx::Size(kSearchBoxPreferredWidth, kSearchBoxPreferredHeight);
 }
 
-bool SearchBoxViewBase::OnMouseWheel(const ui::MouseWheelEvent& event) {
-  if (contents_view_)
-    return contents_view_->OnMouseWheel(event);
-  return false;
-}
-
 void SearchBoxViewBase::OnEnabledChanged() {
   search_box_->SetEnabled(enabled());
   if (close_button_)
diff --git a/ui/chromeos/search_box/search_box_view_base.h b/ui/chromeos/search_box/search_box_view_base.h
index 91f89e4..1e34d4ea 100644
--- a/ui/chromeos/search_box/search_box_view_base.h
+++ b/ui/chromeos/search_box/search_box_view_base.h
@@ -70,10 +70,6 @@
   views::ImageButton* close_button();
   views::Textfield* search_box() { return search_box_; }
 
-  void set_contents_view(views::View* contents_view) {
-    contents_view_ = contents_view;
-  }
-
   // Swaps the google icon with the back button.
   void ShowBackOrGoogleIcon(bool show_back_button);
 
@@ -88,7 +84,6 @@
 
   // Overridden from views::View:
   gfx::Size CalculatePreferredSize() const override;
-  bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
   void OnEnabledChanged() override;
   const char* GetClassName() const override;
   void OnGestureEvent(ui::GestureEvent* event) override;
@@ -152,8 +147,6 @@
 
   views::BoxLayout* box_layout() { return box_layout_; }
 
-  views::View* contents_view() { return contents_view_; }
-
   void set_is_tablet_mode(bool is_tablet_mode) {
     is_tablet_mode_ = is_tablet_mode;
   }
@@ -205,7 +198,6 @@
   SearchBoxImageButton* close_button_ = nullptr;
   views::Textfield* search_box_;
   views::View* search_box_right_space_ = nullptr;
-  views::View* contents_view_ = nullptr;
 
   // Owned by |content_container_|. It is deleted when the view is deleted.
   views::BoxLayout* box_layout_ = nullptr;
diff --git a/ui/display/screen.cc b/ui/display/screen.cc
index 59dec1c..94d025a 100644
--- a/ui/display/screen.cc
+++ b/ui/display/screen.cc
@@ -38,6 +38,10 @@
   return GetDisplayNearestWindow(GetWindowForView(view));
 }
 
+Display Screen::GetDisplayForNewWindows() const {
+  return GetPrimaryDisplay();
+}
+
 gfx::Rect Screen::ScreenToDIPRectInWindow(gfx::NativeView view,
                                           const gfx::Rect& screen_rect) const {
   float scale = GetDisplayNearestView(view).device_scale_factor();
diff --git a/ui/display/screen.h b/ui/display/screen.h
index b49a3ff4d..c4c6f14 100644
--- a/ui/display/screen.h
+++ b/ui/display/screen.h
@@ -74,6 +74,10 @@
   // Returns the primary display.
   virtual Display GetPrimaryDisplay() const = 0;
 
+  // Returns a suggested display to use when creating a new window. On most
+  // platforms just returns the primary display.
+  virtual Display GetDisplayForNewWindows() const;
+
   // Adds/Removes display observers.
   virtual void AddObserver(DisplayObserver* observer) = 0;
   virtual void RemoveObserver(DisplayObserver* observer) = 0;
diff --git a/ui/display/screen_unittest.cc b/ui/display/screen_unittest.cc
index 7f7d4ef..6acc4801 100644
--- a/ui/display/screen_unittest.cc
+++ b/ui/display/screen_unittest.cc
@@ -58,4 +58,12 @@
   EXPECT_EQ(DEFAULT_DISPLAY_HEIGHT, display.size().height());
 }
 
+TEST_F(ScreenTest, GetDisplayForNewWindows) {
+  Screen* screen = Screen::GetScreen();
+
+  // Display for new windows defaults to the primary display.
+  EXPECT_EQ(screen->GetPrimaryDisplay().id(),
+            screen->GetDisplayForNewWindows().id());
+}
+
 }  // namespace display
diff --git a/ui/display/win/color_profile_reader.cc b/ui/display/win/color_profile_reader.cc
index 4f51ab31..b2d0639 100644
--- a/ui/display/win/color_profile_reader.cc
+++ b/ui/display/win/color_profile_reader.cc
@@ -8,7 +8,7 @@
 #include <windows.h>
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/display/win/display_info.h"
 #include "ui/gfx/icc_profile.h"
 
diff --git a/ui/events/ozone/device/device_manager_manual.cc b/ui/events/ozone/device/device_manager_manual.cc
index 9931f340..7cee681 100644
--- a/ui/events/ozone/device/device_manager_manual.cc
+++ b/ui/events/ozone/device/device_manager_manual.cc
@@ -9,7 +9,7 @@
 #include "base/files/file_enumerator.h"
 #include "base/location.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/events/ozone/device/device_event.h"
 #include "ui/events/ozone/device/device_event_observer.h"
 
diff --git a/ui/events/ozone/evdev/libgestures_glue/gesture_feedback.cc b/ui/events/ozone/evdev/libgestures_glue/gesture_feedback.cc
index 163b30600..434b5d3 100644
--- a/ui/events/ozone/evdev/libgestures_glue/gesture_feedback.cc
+++ b/ui/events/ozone/evdev/libgestures_glue/gesture_feedback.cc
@@ -15,7 +15,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/events/ozone/evdev/libgestures_glue/gesture_property_provider.h"
 
 namespace ui {
diff --git a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
index 4d8956c..afeec925 100644
--- a/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
+++ b/ui/events/ozone/layout/xkb/xkb_keyboard_layout_engine.cc
@@ -15,7 +15,7 @@
 #include "base/macros.h"
 #include "base/memory/free_deleter.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "build/build_config.h"
diff --git a/ui/events/platform/x11/x11_hotplug_event_handler.cc b/ui/events/platform/x11/x11_hotplug_event_handler.cc
index e8878a9..e8edd738 100644
--- a/ui/events/platform/x11/x11_hotplug_event_handler.cc
+++ b/ui/events/platform/x11/x11_hotplug_event_handler.cc
@@ -20,7 +20,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_util.h"
 #include "base/sys_info.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/events/devices/device_data_manager.h"
 #include "ui/events/devices/device_hotplug_event_observer.h"
diff --git a/ui/file_manager/file_manager/foreground/js/directory_model.js b/ui/file_manager/file_manager/foreground/js/directory_model.js
index c49b169a..8c073fc 100644
--- a/ui/file_manager/file_manager/foreground/js/directory_model.js
+++ b/ui/file_manager/file_manager/foreground/js/directory_model.js
@@ -563,10 +563,13 @@
   }
   this.metadataModel_.notifyEntriesRemoved(removedUrls);
 
-  // Retrieve metadata information for the new directory.
-  this.metadataModel_.get(
-      [this.currentDirContents_.getDirectoryEntry()],
-      constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES);
+  // Retrieve metadata information for the newly selected directory.
+  const currentEntry = this.currentDirContents_.getDirectoryEntry();
+  if (currentEntry && !util.isFakeEntry(assert(currentEntry))) {
+    this.metadataModel_.get(
+        [currentEntry],
+        constants.LIST_CONTAINER_METADATA_PREFETCH_PROPERTY_NAMES);
+  }
 
   // Clear the table, and start scanning.
   cr.dispatchSimpleEvent(this, 'scan-started');
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index 606f4d1..0b7f4e3 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -977,27 +977,68 @@
 };
 
 /**
- * Sets the hidden state of the given item depending on whether the user has any
- * Team Drives.
+ * Creates Team Drives root if there is any team drive, if there is no team
+ * drive, then it removes the root.
  *
  * Since we don't currently support any functionality with just the grand root
- * (e.g. you can't create a new team drive from the root yet), hide the grand
- * root unless the user has at least one Team Drive. If there is at least one
- * Team Drive, show it.
+ * (e.g. you can't create a new team drive from the root yet), remove/don't
+ * create the grand root so it can't be reached via keyboard.
+ * If there is at least one Team Drive, add/show the Team Drives trand root.
  *
- * @param {!DirectoryItem} teamDrivesGrandRootItem The item to show if there is
- *     at least one Team Drive, or hide if not.
+ * @return {!Promise<SubDirectoryItem>} Resolved with Team Drive Grand Root
+ * SubDirectoryItem instance, or undefined when it shouldn't exist.
  * @private
  */
-DriveVolumeItem.prototype.setHiddenForTeamDrivesGrandRoot_ = function(
-    teamDrivesGrandRootItem) {
-  var teamDriveEntry = this.volumeInfo_.teamDriveDisplayRoot;
-  if (!teamDriveEntry)
-    return;
-  var reader = teamDriveEntry.createReader();
-  reader.readEntries(function(results) {
-    metrics.recordSmallCount('TeamDrivesCount', results.length);
-    teamDrivesGrandRootItem.hidden = results.length == 0;
+DriveVolumeItem.prototype.createTeamDrivesGrandRoot_ = function() {
+  return new Promise(resolve => {
+    const teamDriveGrandRoot = this.volumeInfo_.teamDriveDisplayRoot;
+    if (!teamDriveGrandRoot) {
+      // Team Drive is disabled.
+      resolve();
+      return;
+    }
+
+    let index;
+    for (var i = 0; i < this.items.length; i++) {
+      const entry = this.items[i] && this.items[i].entry;
+      if (entry && util.isSameEntry(entry, teamDriveGrandRoot)) {
+        index = i;
+        break;
+      }
+    }
+
+    const reader = teamDriveGrandRoot.createReader();
+    reader.readEntries(results => {
+      metrics.recordSmallCount('TeamDrivesCount', results.length);
+      // Only create grand root if there is at least 1 child/result.
+      if (results.length) {
+        if (index) {
+          this.items[index].hidden = false;
+          resolve(this.items[index]);
+          return;
+        }
+
+        // Create if it doesn't exist yet.
+        const label = util.getEntryLabel(
+                          this.parentTree_.volumeManager_.getLocationInfo(
+                              teamDriveGrandRoot),
+                          teamDriveGrandRoot) ||
+            '';
+        const item = new SubDirectoryItem(
+            label, teamDriveGrandRoot, this, this.parentTree_);
+        this.addAt(item, 1);
+        item.updateSubDirectories(false);
+        resolve(item);
+        return;
+      } else {
+        // When there is no team drive, the grand root should be removed.
+        if (index && this.items[index].parentItem) {
+          this.items[index].parentItem.remove(this.items[index]);
+        }
+        resolve();
+        return;
+      }
+    });
   });
 };
 
@@ -1032,21 +1073,19 @@
   }
 
   for (var i = 0; i < entries.length; i++) {
-    var item = new SubDirectoryItem(
-        util.getEntryLabel(
-            this.parentTree_.volumeManager_.getLocationInfo(entries[i]),
-            entries[i]) ||
-            '',
-        entries[i], this, this.parentTree_);
-
-    // Hide the team drives root in case we have no team drives.
-    if (entries[i] === teamDrivesDisplayRoot) {
-      item.hidden = true;
-      this.setHiddenForTeamDrivesGrandRoot_(item);
+    // Only create the team drives root if there is at least 1 team drive.
+    const entry = entries[i];
+    if (entry === teamDrivesDisplayRoot) {
+      this.createTeamDrivesGrandRoot_();
+    } else {
+      const label =
+          util.getEntryLabel(
+              this.parentTree_.volumeManager_.getLocationInfo(entry), entry) ||
+          '';
+      const item = new SubDirectoryItem(label, entry, this, this.parentTree_);
+      this.add(item);
+      item.updateSubDirectories(false);
     }
-
-    this.add(item);
-    item.updateSubDirectories(false);
   }
   // When My files is disabled Drive should be expanded by default.
   // TODO(crbug.com/850348): Remove this once flag is removed.
@@ -1065,11 +1104,18 @@
 DriveVolumeItem.prototype.updateItemByEntry = function(changedDirectoryEntry) {
   // The first item is My Drive, and the second item is Team Drives.
   // Keep in sync with |fixedEntries| in |updateSubDirectories|.
-  var index = util.isTeamDriveEntry(changedDirectoryEntry) ? 1 : 0;
-  this.items[index].updateItemByEntry(changedDirectoryEntry);
-  if (util.isTeamDrivesGrandRoot(changedDirectoryEntry) &&
-      this.volumeInfo_.teamDriveDisplayRoot) {
-    this.setHiddenForTeamDrivesGrandRoot_(this.items[index]);
+  const isTeamDriveChild = util.isTeamDriveEntry(changedDirectoryEntry);
+  const index = isTeamDriveChild ? 1 : 0;
+
+  // If Team Drive grand root has been removed and we receive an update for an
+  // team drive, we need to create the Team Drive grand root.
+  if (isTeamDriveChild) {
+    this.createTeamDrivesGrandRoot_().then(teamDriveGranRootItem => {
+      if (teamDriveGranRootItem)
+        this.items[index].updateItemByEntry(changedDirectoryEntry);
+    });
+  } else {
+    this.items[index].updateItemByEntry(changedDirectoryEntry);
   }
 };
 
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html
index 7d314cc..2cd9bc5 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.html
@@ -29,6 +29,7 @@
   <script src="../mock_directory_model.js"></script>
   <script src="../mock_navigation_list_model.js"></script>
   <script src="../navigation_list_model.js"></script>
+  <script src="../constants.js"></script>
   <script src="directory_tree.js"></script>
 
   <script src="directory_tree_unittest.js"></script>
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js
index bd7a817..d0ce73a1 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree_unittest.js
@@ -124,7 +124,7 @@
  *
  * Google Drive
  * - My Drive
- * - Team Drives
+ * - Team Drives (only if there is a child team drive).
  * - Shared with me
  * - Offline
  * Downloads
@@ -194,8 +194,7 @@
 
 /**
  * Test case for creating tree with empty Team Drives.
- * Team Drives subtree should be hidden when the user don't have access to any
- * Team Drive.
+ * The Team Drives subtree should be removed if the user has no team drives.
  *
  * @param {!function(boolean)} callback A callback function which is called with
  *     test result.
@@ -238,21 +237,19 @@
 
   reportPromise(
       waitUntil(function() {
-        // Root entries under Drive volume is generated, plus Team Drives.
+        // Root entries under Drive volume is generated, Team Drives isn't
+        // included because it has no child.
         // See testCreateDirectoryTreeWithTeamDrive for detail.
-        return driveItem.items.length == 4;
+        return driveItem.items.length == 3;
       }).then(function() {
         var teamDrivesItemFound = false;
         for (var i = 0; i < driveItem.items.length; i++) {
           if (driveItem.items[i].label == str('DRIVE_TEAM_DRIVES_LABEL')) {
-            assertEquals(
-                true, driveItem.items[i].hidden,
-                'Team Drives node should not be shown');
             teamDrivesItemFound = true;
             break;
           }
         }
-        assertTrue(teamDrivesItemFound, 'Team Drives node should be generated');
+        assertFalse(teamDrivesItemFound, 'Team Drives should NOT be generated');
       }),
       callback);
 }
@@ -403,7 +400,7 @@
 
   reportPromise(
       waitUntil(() => {
-        return driveItem.items.length == 4;
+        return driveItem.items.length == 3;
       })
           .then(() => {
             window.webkitResolveLocalFileSystemURLEntries
@@ -434,7 +431,7 @@
 
 /**
  * Test removing the last team drive for a user.
- * Team Drives subtree should be hidden after the change notification is
+ * Team Drives subtree should be removed after the change notification is
  * delivered.
  *
  * @param {!function(boolean)} callback A callback function which is called with
@@ -501,14 +498,15 @@
             }
           })
           .then(() => {
+            // Wait team drive grand root to appear.
             return waitUntil(() => {
               for (var i = 0; i < driveItem.items.length; i++) {
                 if (driveItem.items[i].label ==
                     str('DRIVE_TEAM_DRIVES_LABEL')) {
-                  return driveItem.items[i].hidden;
+                  return false;
                 }
               }
-              return false;
+              return true;
             });
           }),
       callback);
diff --git a/ui/gfx/win/rendering_window_manager.cc b/ui/gfx/win/rendering_window_manager.cc
index 6bf5813..314c26cd 100644
--- a/ui/gfx/win/rendering_window_manager.cc
+++ b/ui/gfx/win/rendering_window_manager.cc
@@ -6,8 +6,8 @@
 
 #include "base/callback.h"
 #include "base/memory/singleton.h"
-#include "base/task/post_task_forward.h"
-#include "base/task/task_traits_forward.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
 
 namespace gfx {
 
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn
index cb026a3..df106bc 100644
--- a/ui/gl/BUILD.gn
+++ b/ui/gl/BUILD.gn
@@ -12,8 +12,8 @@
 
 declare_args() {
   enable_swiftshader =
-      (is_win || (is_linux && use_x11) || (is_mac && use_egl) || is_chromeos) &&
-      (target_cpu == "x86" || target_cpu == "x64")
+      (is_win || (is_linux && !is_chromecast) || (is_mac && use_egl) ||
+       is_chromeos) && (target_cpu == "x86" || target_cpu == "x64")
 }
 
 use_glx = use_x11 || ozone_platform_x11
diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc
index 466a321..37d5d8d 100644
--- a/ui/gl/gl_context.cc
+++ b/ui/gl/gl_context.cc
@@ -194,6 +194,8 @@
 }
 
 void GLContext::BackpressureFenceWait(uint64_t fence) {}
+
+void GLContext::FlushForDriverCrashWorkaround() {}
 #endif
 
 bool GLContext::HasExtension(const char* name) {
diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h
index 7c58ad62..b747c54 100644
--- a/ui/gl/gl_context.h
+++ b/ui/gl/gl_context.h
@@ -162,12 +162,11 @@
   virtual bool WasAllocatedUsingRobustnessExtension();
 
   // Make this context current when used for context virtualization.
-  virtual bool MakeVirtuallyCurrent(GLContext* virtual_context,
-                                    GLSurface* surface);
+  bool MakeVirtuallyCurrent(GLContext* virtual_context, GLSurface* surface);
 
   // Notify this context that |virtual_context|, that was using us, is
   // being released or destroyed.
-  virtual void OnReleaseVirtuallyCurrent(GLContext* virtual_context);
+  void OnReleaseVirtuallyCurrent(GLContext* virtual_context);
 
   // Returns the GL version string. The context must be current.
   virtual std::string GetGLVersion();
@@ -203,6 +202,9 @@
   virtual uint64_t BackpressureFenceCreate();
   // Perform a client-side wait on a previously-created fence.
   virtual void BackpressureFenceWait(uint64_t fence);
+  // Flush the underlying context to avoid crashes due to driver bugs on macOS.
+  // https://crbug.com/863817
+  virtual void FlushForDriverCrashWorkaround();
 #endif
 
  protected:
diff --git a/ui/gl/gl_context_cgl.cc b/ui/gl/gl_context_cgl.cc
index 32216b2f..a563920e 100644
--- a/ui/gl/gl_context_cgl.cc
+++ b/ui/gl/gl_context_cgl.cc
@@ -214,33 +214,6 @@
   return true;
 }
 
-void GLContextCGL::OnReleaseVirtuallyCurrent(GLContext* virtual_context) {
-  TRACE_EVENT0("gpu", "GLContextCGL::OnReleaseVirtuallyCurrent");
-  // Flush before switching contexts, to avoid driver crashes.
-  // https://crbug.com/863817
-  if (IsCurrent(nullptr))
-    glFlush();
-  GLContext::OnReleaseVirtuallyCurrent(virtual_context);
-}
-
-bool GLContextCGL::MakeVirtuallyCurrent(GLContext* virtual_context,
-                                        GLSurface* surface) {
-  TRACE_EVENT0("gpu", "GLContextCGL::MakeVirtuallyCurrent");
-  // Flush before restoring the new context's state, to avoid driver crashes.
-  // https://crbug.com/863817
-  if (IsCurrent(nullptr))
-    glFlush();
-
-  // Restore the state of the new context.
-  if (!GLContext::MakeVirtuallyCurrent(virtual_context, surface))
-    return false;
-
-  // Flush after having restored this context's state, to avoid driver crashes.
-  // https://crbug.com/863817
-  glFlush();
-  return true;
-}
-
 YUVToRGBConverter* GLContextCGL::GetYUVToRGBConverter(
     const gfx::ColorSpace& color_space) {
   std::unique_ptr<YUVToRGBConverter>& yuv_to_rgb_converter =
@@ -256,6 +229,10 @@
 uint64_t GLContextCGL::BackpressureFenceCreate() {
   TRACE_EVENT0("gpu", "GLContextCGL::BackpressureFenceCreate");
 
+  // This flush will trigger a crash if FlushForDriverCrashWorkaround is not
+  // called sufficiently frequently.
+  glFlush();
+
   if (gl::GLFence::IsSupported()) {
     next_backpressure_fence_ += 1;
     backpressure_fences_[next_backpressure_fence_] = GLFence::Create();
@@ -310,6 +287,12 @@
     backpressure_fences_.erase(backpressure_fences_.begin());
 }
 
+void GLContextCGL::FlushForDriverCrashWorkaround() {
+  if (!context_ || CGLGetCurrentContext() != context_)
+    return;
+  glFlush();
+}
+
 bool GLContextCGL::MakeCurrent(GLSurface* surface) {
   DCHECK(context_);
 
diff --git a/ui/gl/gl_context_cgl.h b/ui/gl/gl_context_cgl.h
index 3d2e7c2..c0aa656a 100644
--- a/ui/gl/gl_context_cgl.h
+++ b/ui/gl/gl_context_cgl.h
@@ -34,13 +34,11 @@
   void* GetHandle() override;
   void SetSafeToForceGpuSwitch() override;
   bool ForceGpuSwitchIfNeeded() override;
-  void OnReleaseVirtuallyCurrent(GLContext* virtual_context) override;
-  bool MakeVirtuallyCurrent(GLContext* virtual_context,
-                            GLSurface* surface) override;
   YUVToRGBConverter* GetYUVToRGBConverter(
       const gfx::ColorSpace& color_space) override;
   uint64_t BackpressureFenceCreate() override;
   void BackpressureFenceWait(uint64_t fence) override;
+  void FlushForDriverCrashWorkaround() override;
 
  protected:
   ~GLContextCGL() override;
diff --git a/ui/gl/gl_surface.cc b/ui/gl/gl_surface.cc
index ccfbc02..5f983987 100644
--- a/ui/gl/gl_surface.cc
+++ b/ui/gl/gl_surface.cc
@@ -235,15 +235,14 @@
   NOTREACHED();
 }
 
-void GLSurface::SetUsePlaneGpuFences() {
-  // It's fine for GLSurface derived classes to ignore the fences
-  // and synchronize using other methods.
-}
-
 int GLSurface::GetBufferCount() const {
   return 2;
 }
 
+bool GLSurface::SupportsPlaneGpuFences() const {
+  return false;
+}
+
 GLSurface* GLSurface::GetCurrent() {
   return current_surface_.Pointer()->Get();
 }
@@ -486,14 +485,14 @@
   return surface_->SetEnableSwapTimestamps();
 }
 
-void GLSurfaceAdapter::SetUsePlaneGpuFences() {
-  surface_->SetUsePlaneGpuFences();
-}
-
 int GLSurfaceAdapter::GetBufferCount() const {
   return surface_->GetBufferCount();
 }
 
+bool GLSurfaceAdapter::SupportsPlaneGpuFences() const {
+  return surface_->SupportsPlaneGpuFences();
+}
+
 GLSurfaceAdapter::~GLSurfaceAdapter() {}
 
 scoped_refptr<GLSurface> InitializeGLSurfaceWithFormat(
diff --git a/ui/gl/gl_surface.h b/ui/gl/gl_surface.h
index 682070d1..317fb9d8 100644
--- a/ui/gl/gl_surface.h
+++ b/ui/gl/gl_surface.h
@@ -291,9 +291,7 @@
   virtual bool SupportsSwapTimestamps() const;
   virtual void SetEnableSwapTimestamps();
 
-  // Tells the surface to use the provided plane GPU fences when swapping
-  // buffers.
-  virtual void SetUsePlaneGpuFences();
+  virtual bool SupportsPlaneGpuFences() const;
 
   // Returns the number of buffers the surface uses in the swap chain. For
   // example, most surfaces are double-buffered, so this would return 2. For
@@ -393,7 +391,7 @@
   void SetRelyOnImplicitSync() override;
   bool SupportsSwapTimestamps() const override;
   void SetEnableSwapTimestamps() override;
-  void SetUsePlaneGpuFences() override;
+  bool SupportsPlaneGpuFences() const override;
   int GetBufferCount() const override;
 
   GLSurface* surface() const { return surface_.get(); }
diff --git a/ui/gl/gl_utils.cc b/ui/gl/gl_utils.cc
index 22089b9..50d1952c 100644
--- a/ui/gl/gl_utils.cc
+++ b/ui/gl/gl_utils.cc
@@ -6,6 +6,7 @@
 
 #include "ui/gl/gl_utils.h"
 
+#include "base/logging.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gl/gl_bindings.h"
 
@@ -16,4 +17,13 @@
     return GL_COLOR_SPACE_SCRGB_LINEAR_CHROMIUM;
   return GL_COLOR_SPACE_UNSPECIFIED_CHROMIUM;
 }
+
+// Used by chrome://gpucrash and gpu_benchmarking_extension's
+// CrashForTesting.
+void Crash() {
+  DVLOG(1) << "GPU: Simulating GPU crash";
+  // Good bye, cruel world.
+  volatile int* it_s_the_end_of_the_world_as_we_know_it = nullptr;
+  *it_s_the_end_of_the_world_as_we_know_it = 0xdead;
+}
 }
diff --git a/ui/gl/gl_utils.h b/ui/gl/gl_utils.h
index cfca2046f..f5bfb28 100644
--- a/ui/gl/gl_utils.h
+++ b/ui/gl/gl_utils.h
@@ -15,6 +15,7 @@
 
 namespace gl {
 GL_EXPORT int GetGLColorSpace(const gfx::ColorSpace& color_space);
+GL_EXPORT void Crash();
 }  // namespace gl
 
 #endif  // UI_GL_GL_UTILS_H_
diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc
index 4ad88a7..76fac948 100644
--- a/ui/keyboard/keyboard_controller.cc
+++ b/ui/keyboard/keyboard_controller.cc
@@ -96,6 +96,12 @@
           // HideKeyboard can be called at anytime for example on shutdown.
           {keyboard::KeyboardControllerState::SHOWN,
            keyboard::KeyboardControllerState::HIDDEN},
+
+          // Return to INITIAL when keyboard is disabled.
+          {keyboard::KeyboardControllerState::LOADING_EXTENSION,
+           keyboard::KeyboardControllerState::INITIAL},
+          {keyboard::KeyboardControllerState::HIDDEN,
+           keyboard::KeyboardControllerState::INITIAL},
       };
   return kAllowedStateTransition.count(std::make_pair(from, to)) == 1;
 };
@@ -204,6 +210,11 @@
   if (parent_container_)
     DeactivateKeyboard();
 
+  // Return to the INITIAL state to ensure that transitions entering a state
+  // is equal to transitions leaving the state.
+  if (state_ != KeyboardControllerState::INITIAL)
+    ChangeState(KeyboardControllerState::INITIAL);
+
   // TODO(https://crbug.com/731537): Move KeyboardController members into a
   // subobject so we can just put this code into the subobject destructor.
   queued_display_change_.reset();
diff --git a/ui/message_center/BUILD.gn b/ui/message_center/BUILD.gn
index efd33007..1799333 100644
--- a/ui/message_center/BUILD.gn
+++ b/ui/message_center/BUILD.gn
@@ -70,6 +70,9 @@
       "cocoa/popup_collection.mm",
       "cocoa/popup_controller.h",
       "cocoa/popup_controller.mm",
+      "lock_screen/empty_lock_screen_controller.cc",
+      "lock_screen/empty_lock_screen_controller.h",
+      "lock_screen/lock_screen_controller.h",
       "message_center.cc",
       "message_center.h",
       "message_center_export.h",
@@ -194,6 +197,8 @@
       "cocoa/notification_controller_unittest.mm",
       "cocoa/popup_collection_unittest.mm",
       "cocoa/popup_controller_unittest.mm",
+      "lock_screen/fake_lock_screen_controller.cc",
+      "lock_screen/fake_lock_screen_controller.h",
       "message_center_impl_unittest.cc",
       "notification_list_unittest.cc",
       "public/cpp/notification_delegate_unittest.cc",
diff --git a/ui/message_center/lock_screen/empty_lock_screen_controller.cc b/ui/message_center/lock_screen/empty_lock_screen_controller.cc
new file mode 100644
index 0000000..e362dbcc
--- /dev/null
+++ b/ui/message_center/lock_screen/empty_lock_screen_controller.cc
@@ -0,0 +1,19 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/message_center/lock_screen/empty_lock_screen_controller.h"
+
+namespace message_center {
+
+void EmptyLockScreenController::DismissLockScreenThenExecute(
+    base::OnceClosure pending_callback,
+    base::OnceClosure cancel_callback) {
+  std::move(pending_callback).Run();
+}
+
+bool EmptyLockScreenController::IsScreenLocked() const {
+  return false;
+}
+
+}  // namespace message_center
diff --git a/ui/message_center/lock_screen/empty_lock_screen_controller.h b/ui/message_center/lock_screen/empty_lock_screen_controller.h
new file mode 100644
index 0000000..ba91261
--- /dev/null
+++ b/ui/message_center/lock_screen/empty_lock_screen_controller.h
@@ -0,0 +1,27 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_MESSAGE_CENTER_LOCK_SCREEN_EMPTY_LOCK_SCREEN_CONTROLLER_H_
+#define UI_MESSAGE_CENTER_LOCK_SCREEN_EMPTY_LOCK_SCREEN_CONTROLLER_H_
+
+#include "ui/message_center/lock_screen/lock_screen_controller.h"
+
+namespace message_center {
+
+class EmptyLockScreenController : public LockScreenController {
+ public:
+  EmptyLockScreenController() = default;
+  ~EmptyLockScreenController() override = default;
+
+  void DismissLockScreenThenExecute(base::OnceClosure pending_callback,
+                                    base::OnceClosure cancal_callback) override;
+  bool IsScreenLocked() const override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(EmptyLockScreenController);
+};
+
+}  // namespace message_center
+
+#endif  // UI_MESSAGE_CENTER_LOCK_SCREEN_EMPTY_LOCK_SCREEN_CONTROLLER_H_
diff --git a/ui/message_center/lock_screen/fake_lock_screen_controller.cc b/ui/message_center/lock_screen/fake_lock_screen_controller.cc
new file mode 100644
index 0000000..e236fa8
--- /dev/null
+++ b/ui/message_center/lock_screen/fake_lock_screen_controller.cc
@@ -0,0 +1,55 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/message_center/lock_screen/fake_lock_screen_controller.h"
+
+namespace message_center {
+
+FakeLockScreenController::FakeLockScreenController() = default;
+FakeLockScreenController::~FakeLockScreenController() = default;
+
+void FakeLockScreenController::DismissLockScreenThenExecute(
+    base::OnceClosure pending_callback,
+    base::OnceClosure cancel_callback) {
+  DCHECK(pending_callback) << "pending_callback must not be null";
+
+  if (!is_screen_locked_) {
+    DCHECK(!pending_callback_);
+    DCHECK(!cancel_callback_);
+
+    if (pending_callback)
+      std::move(pending_callback).Run();
+  } else {
+    pending_callback_ = std::move(pending_callback);
+    cancel_callback_ = std::move(cancel_callback);
+  }
+}
+
+bool FakeLockScreenController::HasPendingCallback() {
+  return !pending_callback_.is_null();
+}
+
+void FakeLockScreenController::SimulateUnlock() {
+  DCHECK(is_screen_locked_);
+
+  is_screen_locked_ = false;
+
+  if (pending_callback_)
+    std::move(pending_callback_).Run();
+  std::move(cancel_callback_).Reset();
+}
+
+void FakeLockScreenController::CancelClick() {
+  DCHECK(is_screen_locked_);
+
+  pending_callback_.Reset();
+  if (cancel_callback_)
+    std::move(cancel_callback_).Run();
+}
+
+bool FakeLockScreenController::IsScreenLocked() const {
+  return is_screen_locked_;
+}
+
+}  // namespace message_center
diff --git a/ui/message_center/lock_screen/fake_lock_screen_controller.h b/ui/message_center/lock_screen/fake_lock_screen_controller.h
new file mode 100644
index 0000000..4bc68b5
--- /dev/null
+++ b/ui/message_center/lock_screen/fake_lock_screen_controller.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_MESSAGE_CENTER_LOCK_SCREEN_FAKE_LOCK_SCREEN_CONTROLLER_H_
+#define UI_MESSAGE_CENTER_LOCK_SCREEN_FAKE_LOCK_SCREEN_CONTROLLER_H_
+
+#include "ui/message_center/lock_screen/lock_screen_controller.h"
+
+namespace message_center {
+
+class FakeLockScreenController : public LockScreenController {
+ public:
+  FakeLockScreenController();
+  ~FakeLockScreenController() override;
+
+  void DismissLockScreenThenExecute(base::OnceClosure pending_callback,
+                                    base::OnceClosure cancal_callback) override;
+  bool IsScreenLocked() const override;
+
+  // Methods for tests:
+  void set_is_screen_locked(bool locked) { is_screen_locked_ = locked; }
+  bool HasPendingCallback();
+  void SimulateUnlock();
+  void CancelClick();
+
+ private:
+  bool is_screen_locked_ = false;
+  base::OnceClosure pending_callback_;
+  base::OnceClosure cancel_callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(FakeLockScreenController);
+};
+
+}  // namespace message_center
+
+#endif  // UI_MESSAGE_CENTER_LOCK_SCREEN_FAkE_LOCK_SCREEN_CONTROLLER_H_
diff --git a/ui/message_center/lock_screen/lock_screen_controller.h b/ui/message_center/lock_screen/lock_screen_controller.h
new file mode 100644
index 0000000..e8154ed
--- /dev/null
+++ b/ui/message_center/lock_screen/lock_screen_controller.h
@@ -0,0 +1,37 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_MESSAGE_CENTER_LOCK_SCREEN_LOCK_SCREEN_CONTROLLER_H_
+#define UI_MESSAGE_CENTER_LOCK_SCREEN_LOCK_SCREEN_CONTROLLER_H_
+
+#include "base/callback.h"
+#include "base/callback_forward.h"
+#include "ui/message_center/message_center_export.h"
+
+namespace message_center {
+
+// This class is CONTROLLERd the lock-screen related behavior from
+// MessageCenterImpl.
+class MESSAGE_CENTER_EXPORT LockScreenController {
+ public:
+  virtual ~LockScreenController() = default;
+
+  // Processes a closure which runs after the device is unlocked. If the device
+  // is locked, the pending closure is run just after the device is unlocked.
+  // If it's not locked at the time, the pending callback is run immidiately.
+  // If the pending callback is cancelled without being run for some reason,
+  // the cancel callback is run. In other words, onlt one of the pending or
+  // cancel callback must be run. The cancel callback may be run even when the
+  // device is locked.
+  virtual void DismissLockScreenThenExecute(
+      base::OnceClosure pending_callback,
+      base::OnceClosure cancel_callback) = 0;
+
+  // Returns the status of the device lock. True if locked, false otherwise.
+  virtual bool IsScreenLocked() const = 0;
+};
+
+}  // namespace message_center
+
+#endif  // UI_MESSAGE_CENTER_LOCK_SCREEN_LOCK_SCREEN_CONTROLLER_H_
diff --git a/ui/message_center/message_center.cc b/ui/message_center/message_center.cc
index 1e6e6e1..61cbaa12 100644
--- a/ui/message_center/message_center.cc
+++ b/ui/message_center/message_center.cc
@@ -4,6 +4,7 @@
 
 #include "ui/message_center/message_center.h"
 
+#include "ui/message_center/lock_screen/empty_lock_screen_controller.h"
 #include "ui/message_center/message_center_impl.h"
 
 namespace message_center {
@@ -16,8 +17,15 @@
 
 // static
 void MessageCenter::Initialize() {
+  Initialize(std::make_unique<EmptyLockScreenController>());
+}
+
+// static
+void MessageCenter::Initialize(
+    std::unique_ptr<LockScreenController> lock_screen_controller) {
   DCHECK(!g_message_center);
-  g_message_center = new MessageCenterImpl();
+  DCHECK(lock_screen_controller);
+  g_message_center = new MessageCenterImpl(std::move(lock_screen_controller));
 }
 
 // static
diff --git a/ui/message_center/message_center.h b/ui/message_center/message_center.h
index 99e2b64..d0a0397d 100644
--- a/ui/message_center/message_center.h
+++ b/ui/message_center/message_center.h
@@ -39,6 +39,7 @@
 class MessagePopupCollectionTest;
 }
 
+class LockScreenController;
 class MessageCenterObserver;
 class MessageCenterImplTest;
 class NotificationBlocker;
@@ -52,8 +53,10 @@
     NON_PINNED,
   };
 
-  // Creates the global message center object.
+  // Creates the global message center object with default LockScreenController.
   static void Initialize();
+  // Creates the global message center object with custom LockScreenController.
+  static void Initialize(std::unique_ptr<LockScreenController> controller);
 
   // Returns the global message center object. Returns null if Initialize is
   // not called.
diff --git a/ui/message_center/message_center_impl.cc b/ui/message_center/message_center_impl.cc
index ac1015eb..c6f7e14a 100644
--- a/ui/message_center/message_center_impl.cc
+++ b/ui/message_center/message_center_impl.cc
@@ -16,6 +16,7 @@
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "build/build_config.h"
+#include "ui/message_center/lock_screen/lock_screen_controller.h"
 #include "ui/message_center/message_center_types.h"
 #include "ui/message_center/notification_blocker.h"
 #include "ui/message_center/notification_list.h"
@@ -29,8 +30,10 @@
 ////////////////////////////////////////////////////////////////////////////////
 // MessageCenterImpl
 
-MessageCenterImpl::MessageCenterImpl()
+MessageCenterImpl::MessageCenterImpl(
+    std::unique_ptr<LockScreenController> lock_screen_controller)
     : MessageCenter(),
+      lock_screen_controller_(std::move(lock_screen_controller)),
       popup_timers_controller_(std::make_unique<PopupTimersController>(this)),
       stats_collector_(this) {
   notification_list_.reset(new NotificationList(this));
@@ -318,14 +321,11 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (FindVisibleNotificationById(id) == NULL)
     return;
-  if (HasMessageCenterView() && HasPopupNotifications())
-    MarkSinglePopupAsShown(id, true);
-  scoped_refptr<NotificationDelegate> delegate =
-      notification_list_->GetNotificationDelegate(id);
-  for (auto& observer : observer_list_)
-    observer.OnNotificationClicked(id, base::nullopt, base::nullopt);
-  if (delegate)
-    delegate->Click(base::nullopt, base::nullopt);
+
+  lock_screen_controller_->DismissLockScreenThenExecute(
+      base::BindOnce(&MessageCenterImpl::ClickOnNotificationUnlocked,
+                     base::Unretained(this), id, base::nullopt, base::nullopt),
+      base::OnceClosure());
 }
 
 void MessageCenterImpl::ClickOnNotificationButton(const std::string& id,
@@ -333,14 +333,11 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (!FindVisibleNotificationById(id))
     return;
-  if (HasMessageCenterView() && HasPopupNotifications())
-    MarkSinglePopupAsShown(id, true);
-  scoped_refptr<NotificationDelegate> delegate =
-      notification_list_->GetNotificationDelegate(id);
-  for (auto& observer : observer_list_)
-    observer.OnNotificationClicked(id, button_index, base::nullopt);
-  if (delegate)
-    delegate->Click(button_index, base::nullopt);
+
+  lock_screen_controller_->DismissLockScreenThenExecute(
+      base::BindOnce(&MessageCenterImpl::ClickOnNotificationUnlocked,
+                     base::Unretained(this), id, button_index, base::nullopt),
+      base::OnceClosure());
 }
 
 void MessageCenterImpl::ClickOnNotificationButtonWithReply(
@@ -350,12 +347,33 @@
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   if (!FindVisibleNotificationById(id))
     return;
+
+  lock_screen_controller_->DismissLockScreenThenExecute(
+      base::BindOnce(&MessageCenterImpl::ClickOnNotificationUnlocked,
+                     base::Unretained(this), id, button_index, reply),
+      base::OnceClosure());
+}
+
+void MessageCenterImpl::ClickOnNotificationUnlocked(
+    const std::string& id,
+    const base::Optional<int>& button_index,
+    const base::Optional<base::string16>& reply) {
+  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
+
+  // This method must be called under unlocked screen.
+  DCHECK(!lock_screen_controller_->IsScreenLocked());
+
+  // Ensure the notificaiton is still visible.
+  if (FindVisibleNotificationById(id) == NULL)
+    return;
+
   if (HasMessageCenterView() && HasPopupNotifications())
     MarkSinglePopupAsShown(id, true);
-  scoped_refptr<NotificationDelegate> delegate =
-      notification_list_->GetNotificationDelegate(id);
   for (auto& observer : observer_list_)
     observer.OnNotificationClicked(id, button_index, reply);
+
+  scoped_refptr<NotificationDelegate> delegate =
+      notification_list_->GetNotificationDelegate(id);
   if (delegate)
     delegate->Click(button_index, reply);
 }
diff --git a/ui/message_center/message_center_impl.h b/ui/message_center/message_center_impl.h
index 97e6fa1..84e7c31 100644
--- a/ui/message_center/message_center_impl.h
+++ b/ui/message_center/message_center_impl.h
@@ -11,6 +11,7 @@
 #include <string>
 #include <vector>
 
+#include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
@@ -26,12 +27,14 @@
 
 namespace message_center {
 
+class LockScreenController;
+
 // The default implementation of MessageCenter.
-class MESSAGE_CENTER_EXPORT MessageCenterImpl
-    : public MessageCenter,
-      public NotificationBlocker::Observer {
+class MessageCenterImpl : public MessageCenter,
+                          public NotificationBlocker::Observer {
  public:
-  MessageCenterImpl();
+  explicit MessageCenterImpl(
+      std::unique_ptr<LockScreenController> lock_screen_controller);
   ~MessageCenterImpl() override;
 
   // MessageCenter overrides:
@@ -87,12 +90,25 @@
   // NotificationBlocker::Observer overrides:
   void OnBlockingStateChanged(NotificationBlocker* blocker) override;
 
+  LockScreenController* lock_screen_controller() {
+    return lock_screen_controller_.get();
+  }
+  const LockScreenController* lock_screen_controller() const {
+    return lock_screen_controller_.get();
+  }
+
  protected:
   void DisableTimersForTest() override;
 
  private:
   THREAD_CHECKER(thread_checker_);
 
+  void ClickOnNotificationUnlocked(const std::string& id,
+                                   const base::Optional<int>& button_index,
+                                   const base::Optional<base::string16>& reply);
+
+  const std::unique_ptr<LockScreenController> lock_screen_controller_;
+
   std::unique_ptr<NotificationList> notification_list_;
   NotificationList::Notifications visible_notifications_;
   base::ObserverList<MessageCenterObserver> observer_list_;
diff --git a/ui/message_center/message_center_impl_unittest.cc b/ui/message_center/message_center_impl_unittest.cc
index b0a37eb..430c2ce 100644
--- a/ui/message_center/message_center_impl_unittest.cc
+++ b/ui/message_center/message_center_impl_unittest.cc
@@ -22,6 +22,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/message_center/lock_screen/fake_lock_screen_controller.h"
 #include "ui/message_center/message_center.h"
 #include "ui/message_center/message_center_types.h"
 #include "ui/message_center/notification_blocker.h"
@@ -114,8 +115,14 @@
   void Click(const base::Optional<int>& button_index,
              const base::Optional<base::string16>& reply) override {
     if (button_index) {
-      log_ += "ButtonClick_";
-      log_ += base::IntToString(*button_index) + "_";
+      if (!reply) {
+        log_ += "ButtonClick_";
+        log_ += base::IntToString(*button_index) + "_";
+      } else {
+        log_ += "ReplyButtonClick_";
+        log_ += base::IntToString(*button_index) + "_";
+        log_ += base::UTF16ToUTF8(*reply) + "_";
+      }
     } else {
       log_ += "Click_";
     }
@@ -139,7 +146,7 @@
   MessageCenterImplTest() {}
 
   void SetUp() override {
-    MessageCenter::Initialize();
+    MessageCenter::Initialize(std::make_unique<FakeLockScreenController>());
     message_center_ = MessageCenter::Get();
     loop_.reset(new base::MessageLoop);
     run_loop_.reset(new base::RunLoop());
@@ -196,6 +203,16 @@
         base::MakeRefCounted<TestDelegate>());
   }
 
+  TestDelegate* GetDelegate(const std::string& id) const {
+    Notification* n = message_center()->FindVisibleNotificationById(id);
+    return n ? static_cast<TestDelegate*>(n->delegate()) : nullptr;
+  }
+
+  FakeLockScreenController* lock_screen_controller() const {
+    return static_cast<FakeLockScreenController*>(
+        message_center_impl()->lock_screen_controller());
+  }
+
  private:
   MessageCenter* message_center_;
   std::unique_ptr<base::MessageLoop> loop_;
@@ -988,5 +1005,152 @@
   EXPECT_EQ("update-n", observer.log("n"));
 }
 
+TEST_F(MessageCenterImplTest, Click) {
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotification(id);
+
+  EXPECT_EQ("Click_", GetDelegate(id)->log());
+}
+
+TEST_F(MessageCenterImplTest, ButtonClick) {
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotificationButton(id, 1);
+
+  EXPECT_EQ("ButtonClick_1_", GetDelegate(id)->log());
+}
+
+TEST_F(MessageCenterImplTest, ButtonClickWithReply) {
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotificationButtonWithReply(
+      id, 1, base::UTF8ToUTF16("REPLYTEXT"));
+
+  EXPECT_EQ("ReplyButtonClick_1_REPLYTEXT_", GetDelegate(id)->log());
+}
+
+TEST_F(MessageCenterImplTest, Unlock) {
+  lock_screen_controller()->set_is_screen_locked(true);
+
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->SimulateUnlock();
+
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_FALSE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->set_is_screen_locked(true);
+
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->SimulateUnlock();
+
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_FALSE(lock_screen_controller()->IsScreenLocked());
+}
+
+TEST_F(MessageCenterImplTest, ClickOnLockScreen) {
+  lock_screen_controller()->set_is_screen_locked(true);
+
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotification(id);
+
+  EXPECT_EQ("", GetDelegate(id)->log());
+  EXPECT_TRUE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->SimulateUnlock();
+
+  EXPECT_EQ("Click_", GetDelegate(id)->log());
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_FALSE(lock_screen_controller()->IsScreenLocked());
+}
+
+TEST_F(MessageCenterImplTest, ClickAndCancelOnLockScreen) {
+  lock_screen_controller()->set_is_screen_locked(true);
+
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotification(id);
+
+  EXPECT_EQ("", GetDelegate(id)->log());
+  EXPECT_TRUE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->CancelClick();
+
+  EXPECT_EQ("", GetDelegate(id)->log());
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->SimulateUnlock();
+
+  EXPECT_EQ("", GetDelegate(id)->log());
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_FALSE(lock_screen_controller()->IsScreenLocked());
+}
+
+TEST_F(MessageCenterImplTest, ButtonClickOnLockScreen) {
+  lock_screen_controller()->set_is_screen_locked(true);
+
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotificationButton(id, 1);
+
+  EXPECT_EQ("", GetDelegate(id)->log());
+  EXPECT_TRUE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->SimulateUnlock();
+
+  EXPECT_EQ("ButtonClick_1_", GetDelegate(id)->log());
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_FALSE(lock_screen_controller()->IsScreenLocked());
+}
+
+TEST_F(MessageCenterImplTest, ButtonClickWithReplyOnLockScreen) {
+  lock_screen_controller()->set_is_screen_locked(true);
+
+  TestAddObserver observer(message_center());
+  std::string id("n");
+
+  std::unique_ptr<Notification> notification = CreateSimpleNotification(id);
+  message_center()->AddNotification(std::move(notification));
+  message_center()->ClickOnNotificationButtonWithReply(
+      id, 1, base::UTF8ToUTF16("REPLYTEXT"));
+
+  EXPECT_EQ("", GetDelegate(id)->log());
+  EXPECT_TRUE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_TRUE(lock_screen_controller()->IsScreenLocked());
+
+  lock_screen_controller()->SimulateUnlock();
+
+  EXPECT_EQ("ReplyButtonClick_1_REPLYTEXT_", GetDelegate(id)->log());
+  EXPECT_FALSE(lock_screen_controller()->HasPendingCallback());
+  EXPECT_FALSE(lock_screen_controller()->IsScreenLocked());
+}
+
 }  // namespace internal
 }  // namespace message_center
diff --git a/ui/ozone/demo/ozone_demo.cc b/ui/ozone/demo/ozone_demo.cc
index d3999dfa..11379e5 100644
--- a/ui/ozone/demo/ozone_demo.cc
+++ b/ui/ozone/demo/ozone_demo.cc
@@ -9,7 +9,7 @@
 #include "base/debug/stack_trace.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "components/tracing/common/trace_to_console.h"
diff --git a/ui/ozone/demo/skia/skia_demo.cc b/ui/ozone/demo/skia/skia_demo.cc
index a9682cc..2eee7b2 100644
--- a/ui/ozone/demo/skia/skia_demo.cc
+++ b/ui/ozone/demo/skia/skia_demo.cc
@@ -9,7 +9,7 @@
 #include "base/debug/stack_trace.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
-#include "base/task/task_scheduler/task_scheduler_forward.h"
+#include "base/task/task_scheduler/task_scheduler.h"
 #include "base/trace_event/trace_event.h"
 #include "components/tracing/common/trace_to_console.h"
 #include "components/tracing/common/tracing_switches.h"
diff --git a/ui/ozone/demo/surfaceless_gl_renderer.cc b/ui/ozone/demo/surfaceless_gl_renderer.cc
index 94794ba..06c7f39 100644
--- a/ui/ozone/demo/surfaceless_gl_renderer.cc
+++ b/ui/ozone/demo/surfaceless_gl_renderer.cc
@@ -184,11 +184,7 @@
 
   disable_primary_plane_ = command_line->HasSwitch("disable-primary-plane");
 
-  use_gpu_fences_ = command_line->HasSwitch("use-gpu-fences");
-  // The GLSurface needs to be prepared to accept plane fences,
-  // otherwise any fences sent to it will be ignored.
-  if (use_gpu_fences_)
-    surface_->SetUsePlaneGpuFences();
+  use_gpu_fences_ = surface_->SupportsPlaneGpuFences();
 
   // Schedule the initial render.
   PostRenderFrameTask(gfx::SwapResult::SWAP_ACK, nullptr);
diff --git a/ui/ozone/platform/drm/gpu/drm_device.cc b/ui/ozone/platform/drm/gpu/drm_device.cc
index f380a97..5b737f6d 100644
--- a/ui/ozone/platform/drm/gpu/drm_device.cc
+++ b/ui/ozone/platform/drm/gpu/drm_device.cc
@@ -258,10 +258,10 @@
   }
 
   // Use atomic only if kernel allows it.
-  if (SetCapability(DRM_CLIENT_CAP_ATOMIC, 1))
+  is_atomic_ = SetCapability(DRM_CLIENT_CAP_ATOMIC, 1);
+  if (is_atomic_)
     plane_manager_.reset(new HardwareDisplayPlaneManagerAtomic());
-
-  if (!plane_manager_)
+  else
     plane_manager_.reset(new HardwareDisplayPlaneManagerLegacy());
   if (!plane_manager_->Initialize(this)) {
     LOG(ERROR) << "Failed to initialize the plane manager for "
diff --git a/ui/ozone/platform/drm/gpu/drm_device.h b/ui/ozone/platform/drm/gpu/drm_device.h
index 2d229ee..1e3cfcef 100644
--- a/ui/ozone/platform/drm/gpu/drm_device.h
+++ b/ui/ozone/platform/drm/gpu/drm_device.h
@@ -78,6 +78,8 @@
 
   bool is_primary_device() const { return is_primary_device_; }
 
+  bool is_atomic() const { return is_atomic_; }
+
   bool allow_addfb2_modifiers() const { return allow_addfb2_modifiers_; }
 
   // Open device.
@@ -273,7 +275,9 @@
 
   bool is_primary_device_;
 
-  bool allow_addfb2_modifiers_;
+  bool is_atomic_ = false;
+
+  bool allow_addfb2_modifiers_ = false;
 
   std::unique_ptr<GbmDevice> gbm_;
 
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc
index a90f3c4..4291a31c9 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -318,6 +318,13 @@
     window->GetVSyncParameters(callback);
 }
 
+void DrmThread::IsDeviceAtomic(gfx::AcceleratedWidget widget, bool* is_atomic) {
+  scoped_refptr<ui::DrmDevice> drm_device =
+      device_manager_->GetDrmDevice(widget);
+
+  *is_atomic = drm_device->is_atomic();
+}
+
 void DrmThread::CreateWindow(gfx::AcceleratedWidget widget) {
   std::unique_ptr<DrmWindow> window(
       new DrmWindow(widget, device_manager_.get(), screen_manager_.get()));
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.h b/ui/ozone/platform/drm/gpu/drm_thread.h
index ff964b8..b1c954eb 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.h
+++ b/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -95,6 +95,8 @@
       gfx::AcceleratedWidget widget,
       const gfx::VSyncProvider::UpdateVSyncCallback& callback);
 
+  void IsDeviceAtomic(gfx::AcceleratedWidget widget, bool* is_atomic);
+
   // ozone::mojom::DrmDevice
   void StartDrmDevice(StartDrmDeviceCallback callback) override;
   void CreateWindow(gfx::AcceleratedWidget widget) override;
diff --git a/ui/ozone/platform/drm/gpu/drm_window_proxy.cc b/ui/ozone/platform/drm/gpu/drm_window_proxy.cc
index a72300c..bde6d1dda 100644
--- a/ui/ozone/platform/drm/gpu/drm_window_proxy.cc
+++ b/ui/ozone/platform/drm/gpu/drm_window_proxy.cc
@@ -6,6 +6,8 @@
 
 #include "ui/gfx/gpu_fence.h"
 #include "ui/gfx/presentation_feedback.h"
+#include "ui/ozone/platform/drm/gpu/drm_device.h"
+#include "ui/ozone/platform/drm/gpu/drm_device_manager.h"
 #include "ui/ozone/platform/drm/gpu/drm_framebuffer.h"
 #include "ui/ozone/platform/drm/gpu/drm_overlay_plane.h"
 #include "ui/ozone/platform/drm/gpu/drm_thread.h"
@@ -40,4 +42,13 @@
                                 CreateSafeCallback(callback)));
 }
 
+bool DrmWindowProxy::SupportsGpuFences() const {
+  bool is_atomic = false;
+  PostSyncTask(
+      drm_thread_->task_runner(),
+      base::BindOnce(&DrmThread::IsDeviceAtomic, base::Unretained(drm_thread_),
+                     widget_, &is_atomic));
+  return is_atomic;
+}
+
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/drm_window_proxy.h b/ui/ozone/platform/drm/gpu/drm_window_proxy.h
index cceeab7..080561f8 100644
--- a/ui/ozone/platform/drm/gpu/drm_window_proxy.h
+++ b/ui/ozone/platform/drm/gpu/drm_window_proxy.h
@@ -31,6 +31,8 @@
   void GetVSyncParameters(
       const gfx::VSyncProvider::UpdateVSyncCallback& callback);
 
+  bool SupportsGpuFences() const;
+
  private:
   gfx::AcceleratedWidget widget_;
 
diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
index 68fb2ade..fdd70fd 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/logging.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/trace_event/trace_event.h"
 #include "ui/gfx/gpu_fence.h"
 #include "ui/gfx/presentation_feedback.h"
@@ -42,6 +42,7 @@
           HasEGLExtension("EGL_ARM_implicit_external_sync")),
       weak_factory_(this) {
   surface_factory_->RegisterSurface(window_->widget(), this);
+  supports_plane_gpu_fences_ = window_->SupportsGpuFences();
   unsubmitted_frames_.push_back(std::make_unique<PendingFrame>());
 }
 
@@ -99,6 +100,10 @@
   return true;
 }
 
+bool GbmSurfaceless::SupportsPlaneGpuFences() const {
+  return supports_plane_gpu_fences_;
+}
+
 gfx::SwapResult GbmSurfaceless::PostSubBuffer(
     int x,
     int y,
@@ -133,7 +138,7 @@
   unsubmitted_frames_.push_back(std::make_unique<PendingFrame>());
 
   // TODO(dcastagna): Remove the following workaround once we get explicit sync
-  // on Intel.
+  // on all Intel boards, currently we don't have it on legacy KMS.
   // We can not rely on implicit sync on external devices (crbug.com/692508).
   // NOTE: When on internal devices, |is_on_external_drm_device_| is set to true
   // by default conservatively, and it is correctly computed after the first
@@ -141,7 +146,8 @@
   // GbmSurfaceless::SubmitFrame.
   // This means |is_on_external_drm_device_| could be incorrectly set to true
   // the first time we're testing it.
-  if (!use_egl_fence_sync_ && !is_on_external_drm_device_) {
+  if (supports_plane_gpu_fences_ ||
+      (!use_egl_fence_sync_ && !is_on_external_drm_device_)) {
     frame->ready = true;
     SubmitFrame();
     return;
@@ -206,10 +212,6 @@
   use_egl_fence_sync_ = false;
 }
 
-void GbmSurfaceless::SetUsePlaneGpuFences() {
-  use_egl_fence_sync_ = false;
-}
-
 GbmSurfaceless::~GbmSurfaceless() {
   Destroy();  // The EGL surface must be destroyed before SurfaceOzone.
   surface_factory_->UnregisterSurface(window_->widget());
diff --git a/ui/ozone/platform/drm/gpu/gbm_surfaceless.h b/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
index 81feca4..31ba0d3 100644
--- a/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
+++ b/ui/ozone/platform/drm/gpu/gbm_surfaceless.h
@@ -49,6 +49,7 @@
   bool SupportsPresentationCallback() override;
   bool SupportsAsyncSwap() override;
   bool SupportsPostSubBuffer() override;
+  bool SupportsPlaneGpuFences() const override;
   gfx::SwapResult PostSubBuffer(int x,
                                 int y,
                                 int width,
@@ -66,7 +67,6 @@
       const PresentationCallback& presentation_callback) override;
   EGLConfig GetConfig() override;
   void SetRelyOnImplicitSync() override;
-  void SetUsePlaneGpuFences() override;
 
  protected:
   ~GbmSurfaceless() override;
@@ -109,7 +109,9 @@
   std::unique_ptr<PendingFrame> submitted_frame_;
   bool has_implicit_external_sync_;
   bool last_swap_buffers_result_ = true;
+  bool supports_plane_gpu_fences_ = false;
   bool use_egl_fence_sync_ = true;
+
   // Conservatively assume we begin on a device that requires
   // explicit synchronization.
   bool is_on_external_drm_device_ = true;
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
index 5f2cd71..492d220 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
@@ -9,7 +9,7 @@
 
 #include "base/bind.h"
 #include "base/posix/eintr_wrapper.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/gfx/gpu_fence.h"
 #include "ui/gfx/presentation_feedback.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
diff --git a/ui/ozone/platform/drm/host/drm_display_host_manager.cc b/ui/ozone/platform/drm/host/drm_display_host_manager.cc
index eaaf4f8..2ceac01 100644
--- a/ui/ozone/platform/drm/host/drm_display_host_manager.cc
+++ b/ui/ozone/platform/drm/host/drm_display_host_manager.cc
@@ -13,7 +13,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/strings/stringprintf.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_restrictions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/display/types/display_snapshot.h"
diff --git a/ui/ozone/platform/headless/gl_surface_osmesa_png.cc b/ui/ozone/platform/headless/gl_surface_osmesa_png.cc
index a664f2e..911fc8c 100644
--- a/ui/ozone/platform/headless/gl_surface_osmesa_png.cc
+++ b/ui/ozone/platform/headless/gl_surface_osmesa_png.cc
@@ -7,7 +7,7 @@
 #include <vector>
 
 #include "base/files/file_util.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "ui/gfx/codec/png_codec.h"
 
diff --git a/ui/ozone/platform/headless/headless_surface_factory.cc b/ui/ozone/platform/headless/headless_surface_factory.cc
index fa94950..6108464 100644
--- a/ui/ozone/platform/headless/headless_surface_factory.cc
+++ b/ui/ozone/platform/headless/headless_surface_factory.cc
@@ -9,7 +9,7 @@
 #include "base/location.h"
 #include "base/macros.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkSurface.h"
diff --git a/ui/ozone/platform/magma/magma_surface_factory.cc b/ui/ozone/platform/magma/magma_surface_factory.cc
index 291dde7b..ff01acd 100644
--- a/ui/ozone/platform/magma/magma_surface_factory.cc
+++ b/ui/ozone/platform/magma/magma_surface_factory.cc
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/skia_util.h"
diff --git a/ui/ozone/platform/windows/windows_surface_factory.cc b/ui/ozone/platform/windows/windows_surface_factory.cc
index 11d54e0..11700e9 100644
--- a/ui/ozone/platform/windows/windows_surface_factory.cc
+++ b/ui/ozone/platform/windows/windows_surface_factory.cc
@@ -10,7 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "build/build_config.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/skia_util.h"
diff --git a/ui/snapshot/screenshot_grabber.cc b/ui/snapshot/screenshot_grabber.cc
index 34d1108..73b56dd 100644
--- a/ui/snapshot/screenshot_grabber.cc
+++ b/ui/snapshot/screenshot_grabber.cc
@@ -16,7 +16,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/single_thread_task_runner.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "base/task_runner.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/time.h"
diff --git a/ui/snapshot/snapshot.cc b/ui/snapshot/snapshot.cc
index 6022f261..1c4af953 100644
--- a/ui/snapshot/snapshot.cc
+++ b/ui/snapshot/snapshot.cc
@@ -8,7 +8,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/codec/png_codec.h"
 #include "ui/gfx/image/image.h"
diff --git a/ui/snapshot/snapshot_async.cc b/ui/snapshot/snapshot_async.cc
index f6e5421..814a749 100644
--- a/ui/snapshot/snapshot_async.cc
+++ b/ui/snapshot/snapshot_async.cc
@@ -6,7 +6,7 @@
 
 #include "base/location.h"
 #include "base/numerics/safe_conversions.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "skia/ext/image_operations.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/gfx/image/image.h"
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index 235e8c3..f7c6fb2 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -83,18 +83,8 @@
     "bubble/info_bubble.h",
     "bubble/tooltip_icon.h",
     "button_drag_utils.h",
-    "cocoa/bridged_content_view.h",
     "cocoa/bridged_native_widget.h",
-    "cocoa/bridged_native_widget_owner.h",
-    "cocoa/cocoa_mouse_capture.h",
-    "cocoa/cocoa_mouse_capture_delegate.h",
-    "cocoa/cocoa_window_move_loop.h",
-    "cocoa/drag_drop_client_mac.h",
     "cocoa/native_widget_mac_nswindow.h",
-    "cocoa/tooltip_manager_mac.h",
-    "cocoa/views_nswindow_delegate.h",
-    "cocoa/views_scrollbar_bridge.h",
-    "cocoa/widget_owner_nswindow_adapter.h",
     "cocoa/window_touch_bar_delegate.h",
     "color_chooser/color_chooser_listener.h",
     "color_chooser/color_chooser_view.h",
@@ -257,9 +247,9 @@
     "window/native_frame_view.h",
     "window/non_client_view.h",
     "window/window_button_order_provider.h",
+    "window/window_resize_utils.h",
     "window/window_resources.h",
     "window/window_shape.h",
-    "window/window_resize_utils.h",
     "word_lookup_client.h",
   ]
 
@@ -289,17 +279,8 @@
     "bubble/info_bubble.cc",
     "bubble/tooltip_icon.cc",
     "button_drag_utils.cc",
-    "cocoa/bridged_content_view.mm",
-    "cocoa/bridged_content_view_touch_bar.mm",
     "cocoa/bridged_native_widget.mm",
-    "cocoa/cocoa_mouse_capture.mm",
-    "cocoa/cocoa_window_move_loop.mm",
-    "cocoa/drag_drop_client_mac.mm",
     "cocoa/native_widget_mac_nswindow.mm",
-    "cocoa/tooltip_manager_mac.mm",
-    "cocoa/views_nswindow_delegate.mm",
-    "cocoa/views_scrollbar_bridge.mm",
-    "cocoa/widget_owner_nswindow_adapter.mm",
     "color_chooser/color_chooser_view.cc",
     "controls/animated_icon_view.cc",
     "controls/button/blue_button.cc",
@@ -444,12 +425,34 @@
     "window/window_shape.cc",
   ]
 
-  # Internal sources. If a header in this list is used by another target under
-  # //ui/views:* the header can be listed again in that target's sources. See
-  # http://crbug/com/732993 for a possible build system feature to avoid the
-  # repetition. TODO(tapted): Move more headers from public into this list with
-  # the implementation file.
+  # Other targets in this file (e.g. tests) get access to the internal headers.
+  friend = [ ":*" ]
+
+  # Internal sources. TODO(https://crbug.com/871123): Move more headers from
+  # public into this list, along with the implementation file.
   sources += [
+    "cocoa/bridged_content_view.h",
+    "cocoa/bridged_content_view.mm",
+    "cocoa/bridged_content_view_touch_bar.mm",
+    "cocoa/bridged_native_widget_host.h",
+    "cocoa/bridged_native_widget_host_impl.h",
+    "cocoa/bridged_native_widget_host_impl.mm",
+    "cocoa/bridged_native_widget_owner.h",
+    "cocoa/cocoa_mouse_capture.h",
+    "cocoa/cocoa_mouse_capture.mm",
+    "cocoa/cocoa_mouse_capture_delegate.h",
+    "cocoa/cocoa_window_move_loop.h",
+    "cocoa/cocoa_window_move_loop.mm",
+    "cocoa/drag_drop_client_mac.h",
+    "cocoa/drag_drop_client_mac.mm",
+    "cocoa/tooltip_manager_mac.h",
+    "cocoa/tooltip_manager_mac.mm",
+    "cocoa/views_nswindow_delegate.h",
+    "cocoa/views_nswindow_delegate.mm",
+    "cocoa/views_scrollbar_bridge.h",
+    "cocoa/views_scrollbar_bridge.mm",
+    "cocoa/widget_owner_nswindow_adapter.h",
+    "cocoa/widget_owner_nswindow_adapter.mm",
     "controls/button/label_button_label.cc",
     "controls/button/label_button_label.h",
   ]
@@ -919,16 +922,6 @@
 source_set("views_unittests_sources") {
   testonly = true
 
-  # Headers used in tests that appear in :views private sources list. Permits
-  # this target to act as a "friend" of :views. The build system doesn't
-  # currently have a way to represent this. See http://crbug.com/732993.
-  public = [
-    "controls/button/label_button_label.h",
-  ]
-  if (has_native_accessibility) {
-    public += [ "accessibility/view_ax_platform_node_delegate.h" ]
-  }
-
   sources = [
     "accessible_pane_view_unittest.cc",
     "animation/bounds_animator_unittest.cc",
@@ -1052,8 +1045,6 @@
   ]
 
   if (is_win) {
-    public += [ "accessibility/view_ax_platform_node_delegate_win.h" ]
-
     public_deps += [
       "//build/win:default_exe_manifest",
       "//third_party/iaccessible2",
diff --git a/ui/views/cocoa/bridged_native_widget_host.h b/ui/views/cocoa/bridged_native_widget_host.h
new file mode 100644
index 0000000..084d58c
--- /dev/null
+++ b/ui/views/cocoa/bridged_native_widget_host.h
@@ -0,0 +1,21 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_H_
+#define UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_H_
+
+#include "ui/views/views_export.h"
+
+namespace views {
+
+// The interface through which the app shim (BridgedNativeWidgetImpl)
+// communicates with the browser process (BridgedNativeWidgetHostImpl).
+class VIEWS_EXPORT BridgedNativeWidgetHost {
+ public:
+  virtual ~BridgedNativeWidgetHost() = default;
+};
+
+}  // namespace views
+
+#endif  // UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_H_
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.h b/ui/views/cocoa/bridged_native_widget_host_impl.h
new file mode 100644
index 0000000..85777048
--- /dev/null
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.h
@@ -0,0 +1,45 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_IMPL_H_
+#define UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_IMPL_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "ui/views/cocoa/bridged_native_widget_host.h"
+#include "ui/views/views_export.h"
+
+namespace views {
+
+class BridgedNativeWidget;
+class NativeWidgetMac;
+
+// The portion of NativeWidgetMac that lives in the browser process. This
+// communicates to the BridgedNativeWidget, which interacts with the Cocoa
+// APIs, and which may live in an app shim process.
+class VIEWS_EXPORT BridgedNativeWidgetHostImpl
+    : public BridgedNativeWidgetHost {
+ public:
+  // Creates one side of the bridge. |parent| must not be NULL.
+  explicit BridgedNativeWidgetHostImpl(NativeWidgetMac* parent);
+  ~BridgedNativeWidgetHostImpl() override;
+
+  // Provide direct access to the BridgedNativeWidget that this is hosting.
+  // TODO(ccameron): Remove all accesses to this member, and replace them
+  // with methods that may be sent across processes.
+  BridgedNativeWidget* bridge() const { return bridge_.get(); }
+
+ private:
+  // TODO(ccameron): Rather than instantiate a BridgedNativeWidget here,
+  // we will instantiate a mojo BridgedNativeWidget interface to a Cocoa
+  // instance that may be in another process.
+  std::unique_ptr<BridgedNativeWidget> bridge_;
+
+  DISALLOW_COPY_AND_ASSIGN(BridgedNativeWidgetHostImpl);
+};
+
+}  // namespace views
+
+#endif  // UI_VIEWS_COCOA_BRIDGED_NATIVE_WIDGET_HOST_IMPL_H_
diff --git a/ui/views/cocoa/bridged_native_widget_host_impl.mm b/ui/views/cocoa/bridged_native_widget_host_impl.mm
new file mode 100644
index 0000000..46841d8
--- /dev/null
+++ b/ui/views/cocoa/bridged_native_widget_host_impl.mm
@@ -0,0 +1,17 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/cocoa/bridged_native_widget_host_impl.h"
+
+#include "ui/views/cocoa/bridged_native_widget.h"
+
+namespace views {
+
+BridgedNativeWidgetHostImpl::BridgedNativeWidgetHostImpl(
+    NativeWidgetMac* parent)
+    : bridge_(new BridgedNativeWidget(parent)) {}
+
+BridgedNativeWidgetHostImpl::~BridgedNativeWidgetHostImpl() {}
+
+}  // namespace views
diff --git a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
index f02e1b9..53c32814 100644
--- a/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
+++ b/ui/views/cocoa/bridged_native_widget_interactive_uitest.mm
@@ -15,6 +15,7 @@
 #include "ui/base/test/ui_controls.h"
 #import "ui/base/test/windowed_nsnotification_observer.h"
 #import "ui/events/test/cocoa_test_event_utils.h"
+#include "ui/views/cocoa/bridged_native_widget_host_impl.h"
 #include "ui/views/test/views_interactive_ui_test_base.h"
 #include "ui/views/test/widget_test.h"
 #include "ui/views/widget/native_widget_mac.h"
@@ -256,7 +257,7 @@
   HitTestNativeWidgetMac(internal::NativeWidgetDelegate* delegate,
                          NativeFrameView* native_frame_view)
       : NativeWidgetMac(delegate), native_frame_view_(native_frame_view) {
-    NativeWidgetMac::bridge_.reset(new BridgedNativeWidget(this));
+    bridge_host_ = std::make_unique<BridgedNativeWidgetHostImpl>(this);
   }
 
   // internal::NativeWidgetPrivate:
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm
index f25287d5..5eaa3e8 100644
--- a/ui/views/cocoa/bridged_native_widget_unittest.mm
+++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -288,9 +288,7 @@
  public:
   explicit MockNativeWidgetMac(internal::NativeWidgetDelegate* delegate)
       : NativeWidgetMac(delegate) {}
-
-  // Expose a reference, so that it can be reset() independently.
-  std::unique_ptr<BridgedNativeWidget>& bridge() { return bridge_; }
+  using NativeWidgetMac::bridge;
 
   // internal::NativeWidgetPrivate:
   void InitNativeWidget(const Widget::InitParams& params) override {
@@ -301,7 +299,7 @@
     delegate()->OnNativeWidgetCreated(true);
 
     // To allow events to dispatch to a view, it needs a way to get focus.
-    bridge_->SetFocusManager(GetWidget()->GetFocusManager());
+    bridge()->SetFocusManager(GetWidget()->GetFocusManager());
   }
 
   void ReorderNativeViews() override {
@@ -324,9 +322,7 @@
   explicit BridgedNativeWidgetTestBase(SkipInitialization tag)
       : native_widget_mac_(nullptr) {}
 
-  std::unique_ptr<BridgedNativeWidget>& bridge() {
-    return native_widget_mac_->bridge();
-  }
+  BridgedNativeWidget* bridge() { return native_widget_mac_->bridge(); }
 
   // Overridden from testing::Test:
   void SetUp() override {
diff --git a/ui/views/controls/menu/menu_config.h b/ui/views/controls/menu/menu_config.h
index df02a97..5bf8f034 100644
--- a/ui/views/controls/menu/menu_config.h
+++ b/ui/views/controls/menu/menu_config.h
@@ -38,7 +38,9 @@
   // Color for the arrow to scroll bookmarks.
   SkColor arrow_color;
 
-  // Menu border sizes.
+  // Menu border sizes. The vertical border size does not apply to menus with
+  // rounded corners - those menus always use the corner radius as the vertical
+  // border size.
   int menu_vertical_border_size;
   int menu_horizontal_border_size;
 
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index 8988c21c..ee2852fe 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -2052,7 +2052,10 @@
     const int right_of_parent =
         item_loc.x() + item->width() - submenu_horizontal_inset;
 
-    menu_bounds.set_y(item_loc.y() - menu_config.menu_vertical_border_size);
+    int border_size = menu_config.CornerRadiusForMenu(this);
+    if (!border_size)
+      border_size = menu_config.menu_vertical_border_size;
+    menu_bounds.set_y(item_loc.y() - border_size);
 
     // Assume the menu can be placed in the preferred location.
     menu_bounds.set_x(create_on_right ? right_of_parent : left_of_parent);
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc
index 16a1bef..ecbd5d7 100644
--- a/ui/views/controls/menu/menu_scroll_view_container.cc
+++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -286,7 +286,9 @@
                     ? kBorderPaddingDueToRoundedCorners
                     : 0;
 
-  const int vertical_inset = menu_config.menu_vertical_border_size + padding;
+  const int vertical_inset =
+      (corner_radius ? corner_radius : menu_config.menu_vertical_border_size) +
+      padding;
   const int horizontal_inset =
       menu_config.menu_horizontal_border_size + padding;
 
diff --git a/ui/views/focus/focus_manager_unittest.cc b/ui/views/focus/focus_manager_unittest.cc
index 5e7c7a6..f87b8c4f 100644
--- a/ui/views/focus/focus_manager_unittest.cc
+++ b/ui/views/focus/focus_manager_unittest.cc
@@ -69,7 +69,7 @@
 
 // Tests that the appropriate Focus related methods are called when a View
 // gets/loses focus.
-TEST_F(FocusManagerTest, ViewFocusCallbacks) {
+TEST_F(FocusManagerTest, DISABLED_ViewFocusCallbacks) {
   std::vector<FocusTestEvent> event_list;
   const int kView1ID = 1;
   const int kView2ID = 2;
diff --git a/ui/views/mus/mus_client.cc b/ui/views/mus/mus_client.cc
index 19b816d..a493643 100644
--- a/ui/views/mus/mus_client.cc
+++ b/ui/views/mus/mus_client.cc
@@ -372,9 +372,10 @@
 void MusClient::OnDisplaysChanged(
     std::vector<ui::mojom::WsDisplayPtr> ws_displays,
     int64_t primary_display_id,
-    int64_t internal_display_id) {
+    int64_t internal_display_id,
+    int64_t display_id_for_new_windows) {
   screen_->OnDisplaysChanged(std::move(ws_displays), primary_display_id,
-                             internal_display_id);
+                             internal_display_id, display_id_for_new_windows);
 }
 
 void MusClient::OnWindowManagerFrameValuesChanged() {
diff --git a/ui/views/mus/mus_client.h b/ui/views/mus/mus_client.h
index e8742c19..068bce1 100644
--- a/ui/views/mus/mus_client.h
+++ b/ui/views/mus/mus_client.h
@@ -168,7 +168,8 @@
   aura::PropertyConverter* GetPropertyConverter() override;
   void OnDisplaysChanged(std::vector<ui::mojom::WsDisplayPtr> ws_displays,
                          int64_t primary_display_id,
-                         int64_t internal_display_id) override;
+                         int64_t internal_display_id,
+                         int64_t display_id_for_new_windows) override;
 
   // ScreenMusDelegate:
   void OnWindowManagerFrameValuesChanged() override;
diff --git a/ui/views/mus/screen_mus.cc b/ui/views/mus/screen_mus.cc
index e05c1087..2c500aa 100644
--- a/ui/views/mus/screen_mus.cc
+++ b/ui/views/mus/screen_mus.cc
@@ -47,7 +47,8 @@
 void ScreenMus::OnDisplaysChanged(
     std::vector<ui::mojom::WsDisplayPtr> ws_displays,
     int64_t primary_display_id,
-    int64_t internal_display_id) {
+    int64_t internal_display_id,
+    int64_t display_id_for_new_windows) {
   const bool primary_changed = primary_display_id != GetPrimaryDisplay().id();
   int64_t handled_display_id = display::kInvalidDisplayId;
   const WindowManagerFrameValues initial_frame_values =
@@ -102,6 +103,9 @@
       initial_frame_values != WindowManagerFrameValues::instance()) {
     delegate_->OnWindowManagerFrameValuesChanged();
   }
+
+  // GetDisplayForNewWindows() can handle ids that are not in the list.
+  display_id_for_new_windows_ = display_id_for_new_windows;
 }
 
 display::Display ScreenMus::GetDisplayNearestWindow(
@@ -126,4 +130,13 @@
   return delegate_->GetWindowAtScreenPoint(point);
 }
 
+display::Display ScreenMus::GetDisplayForNewWindows() const {
+  display::Display display;
+  if (GetDisplayWithDisplayId(display_id_for_new_windows_, &display))
+    return display;
+
+  // Fallback to primary display.
+  return GetPrimaryDisplay();
+}
+
 }  // namespace views
diff --git a/ui/views/mus/screen_mus.h b/ui/views/mus/screen_mus.h
index c3a650d..34aaa02 100644
--- a/ui/views/mus/screen_mus.h
+++ b/ui/views/mus/screen_mus.h
@@ -24,10 +24,8 @@
   // ui::mojom::ScreenProviderObserver:
   void OnDisplaysChanged(std::vector<ui::mojom::WsDisplayPtr> ws_displays,
                          int64_t primary_display_id,
-                         int64_t internal_display_id) override;
-
- private:
-  friend class ScreenMusTestApi;
+                         int64_t internal_display_id,
+                         int64_t display_id_for_new_windows) override;
 
   // display::Screen:
   display::Display GetDisplayNearestWindow(
@@ -35,8 +33,11 @@
   gfx::Point GetCursorScreenPoint() override;
   bool IsWindowUnderCursor(gfx::NativeWindow window) override;
   aura::Window* GetWindowAtScreenPoint(const gfx::Point& point) override;
+  display::Display GetDisplayForNewWindows() const override;
 
+ private:
   ScreenMusDelegate* delegate_;
+  int64_t display_id_for_new_windows_ = display::kInvalidDisplayId;
 
   DISALLOW_COPY_AND_ASSIGN(ScreenMus);
 };
diff --git a/ui/views/mus/screen_mus_unittest.cc b/ui/views/mus/screen_mus_unittest.cc
index 6a5e875..e3e2e2c 100644
--- a/ui/views/mus/screen_mus_unittest.cc
+++ b/ui/views/mus/screen_mus_unittest.cc
@@ -6,28 +6,12 @@
 
 #include "base/command_line.h"
 #include "base/test/scoped_task_environment.h"
+#include "testing/gtest/include/gtest/gtest.h"
 #include "ui/display/display_switches.h"
 #include "ui/display/screen.h"
 #include "ui/views/test/scoped_views_test_helper.h"
-#include "ui/views/test/views_test_base.h"
 
 namespace views {
-
-class ScreenMusTestApi {
- public:
-  static void CallOnDisplaysChanged(
-      ScreenMus* screen,
-      std::vector<ui::mojom::WsDisplayPtr> ws_displays,
-      int64_t primary_display_id,
-      int64_t internal_display_id) {
-    screen->OnDisplaysChanged(std::move(ws_displays), primary_display_id,
-                              internal_display_id);
-  }
-
- private:
-  DISALLOW_IMPLICIT_CONSTRUCTORS(ScreenMusTestApi);
-};
-
 namespace {
 
 std::vector<ui::mojom::WsDisplayPtr> ConvertDisplayToWsDisplays(
@@ -43,9 +27,10 @@
   return results;
 }
 
-TEST(ScreenMusTest, ConsistentDisplayInHighDPI) {
+TEST(ScreenMusScaleFactorTest, ConsistentDisplayInHighDPI) {
   base::test::ScopedTaskEnvironment task_environment(
       base::test::ScopedTaskEnvironment::MainThreadType::UI);
+  // Must be set before |test_helper| is constructed.
   base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
       switches::kForceDeviceScaleFactor, "2");
   ScopedViewsTestHelper test_helper;
@@ -58,10 +43,20 @@
   }
 }
 
-TEST(ScreenMusTest, PrimaryChangedToExisting) {
-  base::test::ScopedTaskEnvironment task_environment(
-      base::test::ScopedTaskEnvironment::MainThreadType::UI);
-  ScopedViewsTestHelper test_helper;
+class ScreenMusTest : public testing::Test {
+ public:
+  ScreenMusTest() = default;
+  ~ScreenMusTest() override = default;
+
+ private:
+  base::test::ScopedTaskEnvironment task_environment_{
+      base::test::ScopedTaskEnvironment::MainThreadType::UI};
+  ScopedViewsTestHelper test_helper_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScreenMusTest);
+};
+
+TEST_F(ScreenMusTest, PrimaryChangedToExisting) {
   ScreenMus* screen = static_cast<ScreenMus*>(display::Screen::GetScreen());
   std::vector<display::Display> displays = screen->GetAllDisplays();
   ASSERT_FALSE(displays.empty());
@@ -69,17 +64,14 @@
   // Convert to a single display with a different primary id.
   displays.resize(1);
   displays[0].set_id(displays[0].id() + 1);
-  ScreenMusTestApi::CallOnDisplaysChanged(
-      screen, ConvertDisplayToWsDisplays(displays), displays[0].id(), 0);
+  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays),
+                            displays[0].id(), 0, 0);
   ASSERT_EQ(1u, screen->GetAllDisplays().size());
   EXPECT_EQ(displays[0].id(), screen->GetAllDisplays()[0].id());
   EXPECT_EQ(displays[0].id(), screen->GetPrimaryDisplay().id());
 }
 
-TEST(ScreenMusTest, AddAndUpdate) {
-  base::test::ScopedTaskEnvironment task_environment(
-      base::test::ScopedTaskEnvironment::MainThreadType::UI);
-  ScopedViewsTestHelper test_helper;
+TEST_F(ScreenMusTest, AddAndUpdate) {
   ScreenMus* screen = static_cast<ScreenMus*>(display::Screen::GetScreen());
   std::vector<display::Display> displays = screen->GetAllDisplays();
   ASSERT_FALSE(displays.empty());
@@ -91,8 +83,8 @@
   displays[0].set_bounds(new_bounds);
   displays.push_back(displays[0]);
   displays[1].set_id(displays[0].id() + 1);
-  ScreenMusTestApi::CallOnDisplaysChanged(
-      screen, ConvertDisplayToWsDisplays(displays), displays[1].id(), 0);
+  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays),
+                            displays[1].id(), 0, 0);
   ASSERT_EQ(2u, screen->GetAllDisplays().size());
   ASSERT_TRUE(screen->display_list().FindDisplayById(displays[0].id()) !=
               screen->display_list().displays().end());
@@ -105,5 +97,31 @@
   EXPECT_EQ(displays[1].id(), screen->GetPrimaryDisplay().id());
 }
 
+TEST_F(ScreenMusTest, SetDisplayForNewWindows) {
+  ScreenMus* screen = static_cast<ScreenMus*>(display::Screen::GetScreen());
+
+  // Set up 2 displays with display 1 as the display for new windows.
+  constexpr int64_t kDisplayId1 = 111;
+  constexpr int64_t kDisplayId2 = 222;
+  std::vector<display::Display> displays = {display::Display(kDisplayId1),
+                                            display::Display(kDisplayId2)};
+  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays), kDisplayId1,
+                            kDisplayId1,
+                            kDisplayId1 /* display_id_for_new_windows */);
+  EXPECT_EQ(kDisplayId1, screen->GetDisplayForNewWindows().id());
+
+  // Set display 2 as the display for new windows.
+  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays), kDisplayId1,
+                            kDisplayId1,
+                            kDisplayId2 /* display_id_for_new_windows */);
+  EXPECT_EQ(kDisplayId2, screen->GetDisplayForNewWindows().id());
+
+  // Set a bad display as the display for new windows. ScreenMus should fall
+  // back to the primary display.
+  screen->OnDisplaysChanged(ConvertDisplayToWsDisplays(displays), kDisplayId1,
+                            kDisplayId1, 666 /* display_id_for_new_windows */);
+  EXPECT_EQ(kDisplayId1, screen->GetDisplayForNewWindows().id());
+}
+
 }  // namespace
 }  // namespace views
diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h
index d515251a..b02975c 100644
--- a/ui/views/widget/native_widget_mac.h
+++ b/ui/views/widget/native_widget_mac.h
@@ -22,6 +22,7 @@
 }
 
 class BridgedNativeWidget;
+class BridgedNativeWidgetHostImpl;
 
 class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate {
  public:
@@ -152,13 +153,14 @@
   virtual void OnWindowDestroying(NSWindow* window) {}
 
   internal::NativeWidgetDelegate* delegate() { return delegate_; }
+  BridgedNativeWidget* bridge() const;
 
  private:
   friend class test::MockNativeWidgetMac;
   friend class test::HitTestNativeWidgetMac;
 
   internal::NativeWidgetDelegate* delegate_;
-  std::unique_ptr<BridgedNativeWidget> bridge_;
+  std::unique_ptr<BridgedNativeWidgetHostImpl> bridge_host_;
 
   Widget::InitParams::Ownership ownership_;
 
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm
index 3cf9af6..904047d4 100644
--- a/ui/views/widget/native_widget_mac.mm
+++ b/ui/views/widget/native_widget_mac.mm
@@ -25,6 +25,7 @@
 #include "ui/native_theme/native_theme_mac.h"
 #import "ui/views/cocoa/bridged_content_view.h"
 #import "ui/views/cocoa/bridged_native_widget.h"
+#import "ui/views/cocoa/bridged_native_widget_host_impl.h"
 #include "ui/views/cocoa/cocoa_mouse_capture.h"
 #import "ui/views/cocoa/drag_drop_client_mac.h"
 #import "ui/views/cocoa/native_widget_mac_nswindow.h"
@@ -75,9 +76,8 @@
 
 NativeWidgetMac::NativeWidgetMac(internal::NativeWidgetDelegate* delegate)
     : delegate_(delegate),
-      bridge_(new BridgedNativeWidget(this)),
-      ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) {
-}
+      bridge_host_(new BridgedNativeWidgetHostImpl(this)),
+      ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) {}
 
 NativeWidgetMac::~NativeWidgetMac() {
   if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
@@ -93,13 +93,13 @@
   if ([window_delegate respondsToSelector:@selector(nativeWidgetMac)]) {
     ViewsNSWindowDelegate* delegate =
         base::mac::ObjCCastStrict<ViewsNSWindowDelegate>(window_delegate);
-    return [delegate nativeWidgetMac]->bridge_.get();
+    return [delegate nativeWidgetMac]->bridge();
   }
   return nullptr;  // Not created by NativeWidgetMac.
 }
 
 bool NativeWidgetMac::IsWindowModalSheet() const {
-  return bridge_ && bridge_->parent() &&
+  return bridge() && bridge()->parent() &&
          GetWidget()->widget_delegate()->GetModalType() ==
              ui::MODAL_TYPE_WINDOW;
 }
@@ -110,8 +110,8 @@
 }
 
 void NativeWidgetMac::WindowDestroyed() {
-  DCHECK(bridge_);
-  bridge_.reset();
+  DCHECK(bridge());
+  bridge_host_.reset();
   delegate_->OnNativeWidgetDestroyed();
   if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET)
     delete this;
@@ -131,7 +131,7 @@
   name_ = params.name;
   base::scoped_nsobject<NSWindow> window([CreateNSWindow(params) retain]);
   [window setReleasedWhenClosed:NO];  // Owned by scoped_nsobject.
-  bridge_->Init(window, params);
+  bridge()->Init(window, params);
 
   // Only set always-on-top here if it is true since setting it may affect how
   // the window is treated by Expose.
@@ -141,21 +141,21 @@
   delegate_->OnNativeWidgetCreated(true);
 
   DCHECK(GetWidget()->GetRootView());
-  bridge_->SetRootView(GetWidget()->GetRootView());
+  bridge()->SetRootView(GetWidget()->GetRootView());
   if (auto* focus_manager = GetWidget()->GetFocusManager()) {
-    [window makeFirstResponder:bridge_->ns_view()];
-    bridge_->SetFocusManager(focus_manager);
+    [window makeFirstResponder:bridge()->ns_view()];
+    bridge()->SetFocusManager(focus_manager);
   }
 
   // "Infer" must be handled by ViewsDelegate::OnBeforeWidgetInit().
   DCHECK_NE(Widget::InitParams::INFER_OPACITY, params.opacity);
   bool translucent = params.opacity == Widget::InitParams::TRANSLUCENT_WINDOW;
-  bridge_->CreateLayer(params.layer_type, translucent);
+  bridge()->CreateLayer(params.layer_type, translucent);
 }
 
 void NativeWidgetMac::OnWidgetInitDone() {
   OnSizeConstraintsChanged();
-  bridge_->OnWidgetInitDone();
+  bridge()->OnWidgetInitDone();
 }
 
 NonClientFrameView* NativeWidgetMac::CreateNonClientFrameView() {
@@ -193,7 +193,7 @@
 }
 
 gfx::NativeWindow NativeWidgetMac::GetNativeWindow() const {
-  return bridge_ ? bridge_->ns_window() : nil;
+  return bridge() ? bridge()->ns_window() : nil;
 }
 
 Widget* NativeWidgetMac::GetTopLevelWidget() {
@@ -202,60 +202,60 @@
 }
 
 const ui::Compositor* NativeWidgetMac::GetCompositor() const {
-  return bridge_ && bridge_->layer() ? bridge_->layer()->GetCompositor()
-                                     : nullptr;
+  return bridge() && bridge()->layer() ? bridge()->layer()->GetCompositor()
+                                       : nullptr;
 }
 
 const ui::Layer* NativeWidgetMac::GetLayer() const {
-  return bridge_ ? bridge_->layer() : nullptr;
+  return bridge() ? bridge()->layer() : nullptr;
 }
 
 void NativeWidgetMac::ReorderNativeViews() {
-  if (bridge_)
-    bridge_->ReorderChildViews();
+  if (bridge())
+    bridge()->ReorderChildViews();
 }
 
 void NativeWidgetMac::ViewRemoved(View* view) {
-  DragDropClientMac* client = bridge_ ? bridge_->drag_drop_client() : nullptr;
+  DragDropClientMac* client = bridge() ? bridge()->drag_drop_client() : nullptr;
   if (client)
     client->drop_helper()->ResetTargetViewIfEquals(view);
 }
 
 void NativeWidgetMac::SetNativeWindowProperty(const char* name, void* value) {
-  if (bridge_)
-    bridge_->SetNativeWindowProperty(name, value);
+  if (bridge())
+    bridge()->SetNativeWindowProperty(name, value);
 }
 
 void* NativeWidgetMac::GetNativeWindowProperty(const char* name) const {
-  if (bridge_)
-    return bridge_->GetNativeWindowProperty(name);
+  if (bridge())
+    return bridge()->GetNativeWindowProperty(name);
 
   return nullptr;
 }
 
 TooltipManager* NativeWidgetMac::GetTooltipManager() const {
-  if (bridge_)
-    return bridge_->tooltip_manager();
+  if (bridge())
+    return bridge()->tooltip_manager();
 
   return nullptr;
 }
 
 void NativeWidgetMac::SetCapture() {
-  if (bridge_ && !bridge_->HasCapture())
-    bridge_->AcquireCapture();
+  if (bridge() && !bridge()->HasCapture())
+    bridge()->AcquireCapture();
 }
 
 void NativeWidgetMac::ReleaseCapture() {
-  if (bridge_)
-    bridge_->ReleaseCapture();
+  if (bridge())
+    bridge()->ReleaseCapture();
 }
 
 bool NativeWidgetMac::HasCapture() const {
-  return bridge_ && bridge_->HasCapture();
+  return bridge() && bridge()->HasCapture();
 }
 
 ui::InputMethod* NativeWidgetMac::GetInputMethod() {
-  return bridge_ ? bridge_->GetInputMethod() : nullptr;
+  return bridge() ? bridge()->GetInputMethod() : nullptr;
 }
 
 void NativeWidgetMac::CenterWindow(const gfx::Size& size) {
@@ -307,7 +307,7 @@
   // A peculiarity of the constrained window framework is that it permits a
   // dialog of MODAL_TYPE_WINDOW to have a null parent window; falling back to
   // a non-modal window in this case.
-  DCHECK(bridge_->parent() || modal_type == ui::MODAL_TYPE_WINDOW);
+  DCHECK(bridge()->parent() || modal_type == ui::MODAL_TYPE_WINDOW);
 
   // Everything happens upon show.
 }
@@ -323,7 +323,7 @@
 }
 
 gfx::Rect NativeWidgetMac::GetRestoredBounds() const {
-  return bridge_ ? bridge_->GetRestoredBounds() : gfx::Rect();
+  return bridge() ? bridge()->GetRestoredBounds() : gfx::Rect();
 }
 
 std::string NativeWidgetMac::GetWorkspace() const {
@@ -331,18 +331,18 @@
 }
 
 void NativeWidgetMac::SetBounds(const gfx::Rect& bounds) {
-  if (bridge_)
-    bridge_->SetBounds(bounds);
+  if (bridge())
+    bridge()->SetBounds(bounds);
 }
 
 void NativeWidgetMac::SetBoundsConstrained(const gfx::Rect& bounds) {
-  if (!bridge_)
+  if (!bridge())
     return;
 
   gfx::Rect new_bounds(bounds);
   NativeWidgetPrivate* ancestor =
-      bridge_ && bridge_->parent()
-          ? GetNativeWidgetForNativeWindow(bridge_->parent()->GetNSWindow())
+      bridge() && bridge()->parent()
+          ? GetNativeWidgetForNativeWindow(bridge()->parent()->GetNSWindow())
           : nullptr;
   if (!ancestor) {
     new_bounds = ConstrainBoundsToDisplayWorkArea(new_bounds);
@@ -373,7 +373,7 @@
 }
 
 void NativeWidgetMac::Close() {
-  if (!bridge_)
+  if (!bridge())
     return;
 
   // Keep |window| on the stack so that the ObjectiveC block below can capture
@@ -395,13 +395,13 @@
   }
 
   // For other modal types, animate the close.
-  if (bridge_->ShouldRunCustomAnimationFor(Widget::ANIMATE_HIDE)) {
+  if (bridge()->ShouldRunCustomAnimationFor(Widget::ANIMATE_HIDE)) {
     [ViewsNSWindowCloseAnimator closeWindowWithAnimation:window];
     return;
   }
 
   // Clear the view early to suppress repaints.
-  bridge_->SetRootView(nullptr);
+  bridge()->SetRootView(nullptr);
 
   // Widget::Close() ensures [Non]ClientView::CanClose() returns true, so there
   // is no need to call the NSWindow or its delegate's -windowShouldClose:
@@ -420,7 +420,7 @@
 }
 
 void NativeWidgetMac::CloseNow() {
-  if (!bridge_)
+  if (!bridge())
     return;
 
   // NSWindows must be retained until -[NSWindow close] returns.
@@ -438,10 +438,10 @@
 }
 
 void NativeWidgetMac::Hide() {
-  if (!bridge_)
+  if (!bridge())
     return;
 
-  bridge_->SetVisibilityState(BridgedNativeWidget::HIDE_WINDOW);
+  bridge()->SetVisibilityState(BridgedNativeWidget::HIDE_WINDOW);
 }
 
 void NativeWidgetMac::ShowMaximizedWithBounds(
@@ -450,7 +450,7 @@
 }
 
 void NativeWidgetMac::ShowWithWindowState(ui::WindowShowState state) {
-  if (!bridge_)
+  if (!bridge())
     return;
 
   switch (state) {
@@ -467,9 +467,10 @@
       NOTREACHED();
       break;
   }
-  bridge_->SetVisibilityState(state == ui::SHOW_STATE_INACTIVE
-      ? BridgedNativeWidget::SHOW_INACTIVE
-      : BridgedNativeWidget::SHOW_AND_ACTIVATE_WINDOW);
+  bridge()->SetVisibilityState(
+      state == ui::SHOW_STATE_INACTIVE
+          ? BridgedNativeWidget::SHOW_INACTIVE
+          : BridgedNativeWidget::SHOW_AND_ACTIVATE_WINDOW);
 
   // Ignore the SetInitialFocus() result. BridgedContentView should get
   // firstResponder status regardless.
@@ -477,14 +478,14 @@
 }
 
 bool NativeWidgetMac::IsVisible() const {
-  return bridge_ && bridge_->window_visible();
+  return bridge() && bridge()->window_visible();
 }
 
 void NativeWidgetMac::Activate() {
-  if (!bridge_)
+  if (!bridge())
     return;
 
-  bridge_->SetVisibilityState(BridgedNativeWidget::SHOW_AND_ACTIVATE_WINDOW);
+  bridge()->SetVisibilityState(BridgedNativeWidget::SHOW_AND_ACTIVATE_WINDOW);
 }
 
 void NativeWidgetMac::Deactivate() {
@@ -541,14 +542,14 @@
 }
 
 void NativeWidgetMac::SetFullscreen(bool fullscreen) {
-  if (!bridge_ || fullscreen == IsFullscreen())
+  if (!bridge() || fullscreen == IsFullscreen())
     return;
 
-  bridge_->ToggleDesiredFullscreenState();
+  bridge()->ToggleDesiredFullscreenState();
 }
 
 bool NativeWidgetMac::IsFullscreen() const {
-  return bridge_ && bridge_->target_fullscreen_state();
+  return bridge() && bridge()->target_fullscreen_state();
 }
 
 void NativeWidgetMac::SetOpacity(float opacity) {
@@ -569,7 +570,7 @@
                                    const gfx::Point& location,
                                    int operation,
                                    ui::DragDropTypes::DragEventSource source) {
-  bridge_->drag_drop_client()->StartDragAndDrop(view, data, operation, source);
+  bridge()->drag_drop_client()->StartDragAndDrop(view, data, operation, source);
 }
 
 void NativeWidgetMac::SchedulePaintInRect(const gfx::Rect& rect) {
@@ -582,13 +583,13 @@
   target_rect.origin.y =
       NSHeight(client_rect) - target_rect.origin.y - NSHeight(target_rect);
   [GetNativeView() setNeedsDisplayInRect:target_rect];
-  if (bridge_ && bridge_->layer())
-    bridge_->layer()->SchedulePaint(rect);
+  if (bridge() && bridge()->layer())
+    bridge()->layer()->SchedulePaint(rect);
 }
 
 void NativeWidgetMac::SetCursor(gfx::NativeCursor cursor) {
-  if (bridge_)
-    bridge_->SetCursor(cursor);
+  if (bridge())
+    bridge()->SetCursor(cursor);
 }
 
 bool NativeWidgetMac::IsMouseEventsEnabled() const {
@@ -613,20 +614,20 @@
     const gfx::Vector2d& drag_offset,
     Widget::MoveLoopSource source,
     Widget::MoveLoopEscapeBehavior escape_behavior) {
-  if (!bridge_)
+  if (!bridge())
     return Widget::MOVE_LOOP_CANCELED;
 
-  return bridge_->RunMoveLoop(drag_offset);
+  return bridge()->RunMoveLoop(drag_offset);
 }
 
 void NativeWidgetMac::EndMoveLoop() {
-  if (bridge_)
-    bridge_->EndMoveLoop();
+  if (bridge())
+    bridge()->EndMoveLoop();
 }
 
 void NativeWidgetMac::SetVisibilityChangedAnimationsEnabled(bool value) {
-  if (bridge_)
-    bridge_->SetAnimationEnabled(value);
+  if (bridge())
+    bridge()->SetAnimationEnabled(value);
 }
 
 void NativeWidgetMac::SetVisibilityAnimationDuration(
@@ -636,8 +637,8 @@
 
 void NativeWidgetMac::SetVisibilityAnimationTransition(
     Widget::VisibilityTransition transition) {
-  if (bridge_)
-    bridge_->set_transitions_to_animate(transition);
+  if (bridge())
+    bridge()->set_transitions_to_animate(transition);
 }
 
 bool NativeWidgetMac::IsTranslucentWindowOpacitySupported() const {
@@ -645,7 +646,7 @@
 }
 
 void NativeWidgetMac::OnSizeConstraintsChanged() {
-  bridge_->OnSizeConstraintsChanged();
+  bridge()->OnSizeConstraintsChanged();
 }
 
 void NativeWidgetMac::RepostNativeEvent(gfx::NativeEvent native_event) {
@@ -668,6 +669,10 @@
                     defer:NO] autorelease];
 }
 
+BridgedNativeWidget* NativeWidgetMac::bridge() const {
+  return bridge_host_ ? bridge_host_->bridge() : nullptr;
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // Widget, public:
 
diff --git a/ui/views/win/windows_session_change_observer.cc b/ui/views/win/windows_session_change_observer.cc
index 5c35d34..750f140e 100644
--- a/ui/views/win/windows_session_change_observer.cc
+++ b/ui/views/win/windows_session_change_observer.cc
@@ -15,7 +15,7 @@
 #include "base/macros.h"
 #include "base/memory/singleton.h"
 #include "base/observer_list.h"
-#include "base/task/post_task_forward.h"
+#include "base/task/post_task.h"
 #include "ui/gfx/win/singleton_hwnd.h"
 #include "ui/gfx/win/singleton_hwnd_observer.h"
 #include "ui/views/views_delegate.h"
diff --git a/ui/webui/resources/cr_elements/shared_vars_css.html b/ui/webui/resources/cr_elements/shared_vars_css.html
index 6a1ef0446..b98339dc 100644
--- a/ui/webui/resources/cr_elements/shared_vars_css.html
+++ b/ui/webui/resources/cr_elements/shared_vars_css.html
@@ -146,6 +146,7 @@
       color: var(--google-grey-refresh-700);
       display: block;
       font-size: var(--cr-form-field-label-font-size);
+      font-weight: 500;
       letter-spacing: 0.4px;
       line-height: var(--cr-form-field-label-font-size);
       margin-bottom: 8px;
diff --git a/url/gurl.cc b/url/gurl.cc
index 8ec6902..3d63d2a 100644
--- a/url/gurl.cc
+++ b/url/gurl.cc
@@ -19,8 +19,6 @@
 
 namespace {
 
-static base::LazyInstance<std::string>::Leaky empty_string =
-    LAZY_INSTANCE_INITIALIZER;
 static base::LazyInstance<GURL>::Leaky empty_gurl = LAZY_INSTANCE_INITIALIZER;
 
 }  // namespace
@@ -166,7 +164,7 @@
     return spec_;
 
   DCHECK(false) << "Trying to get the spec of an invalid URL!";
-  return empty_string.Get();
+  return base::EmptyString();
 }
 
 bool GURL::operator<(const GURL& other) const {